Skip to content

Commit 01b3de7

Browse files
change inverse handling
1 parent 1174063 commit 01b3de7

File tree

9 files changed

+74
-100
lines changed

9 files changed

+74
-100
lines changed

packages/core/engine/defaults.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { UmbraScheme, UmbraSettings } from './types'
1+
import { UmbraInput, UmbraSettings } from './types'
22

33
export const defaultSettings: UmbraSettings = {
44
readability: 10,
@@ -8,8 +8,9 @@ export const defaultSettings: UmbraSettings = {
88
tints: [5, 10, 10, 10, 15, 15, 25, 15, 15, 15, 15, 25]
99
}
1010

11-
export const defaultScheme: UmbraScheme = {
11+
export const defaultScheme: UmbraInput = {
1212
background: '#090233',
1313
foreground: '#ff5555',
14-
accents: ['#5200ff']
14+
accents: ['#5200ff'],
15+
settings: defaultSettings
1516
}

packages/core/engine/generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ function replaceAtIndex(array: (number | string)[], index: number, value: string
6060
function putAccentInRange(adjusted: UmbraAdjusted, accent: Accent | string, input: UmbraInput) {
6161
const isString = typeof accent === 'string'
6262
const color = isString ? accent : accent.color
63-
const insertion = input.settings.insertion
63+
const insertion = input.settings?.insertion
6464

6565
const fallback = rangeValues(adjusted, input.settings) || []
6666
const range = isString ? fallback : rangeValues(adjusted, accent) || fallback

packages/core/engine/index.ts

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { colord } from 'colord'
22
import { defaultSettings, defaultScheme } from './defaults'
3-
import type { UmbraScheme, UmbraSettings, UmbraInput, UmbraRange } from './types'
3+
import type { UmbraSettings, UmbraInput, UmbraRange } from './types'
44

55
import { format, Formater, UmbraOutputs, AttachProps } from './primitives/format'
66
import { inverse, isDark } from './primitives/scheme'
@@ -13,31 +13,23 @@ interface ApplyProps {
1313
formater?: Formater
1414
alias?: Alias | boolean
1515
}
16-
interface RootSettings extends UmbraSettings {
17-
inversed?: UmbraInput
18-
}
1916

20-
export function umbra(scheme = defaultScheme, settings?: RootSettings) {
21-
const input = umbraInput({ scheme, settings })
17+
export function umbra(scheme = defaultScheme, inversedScheme?: UmbraInput) {
18+
const input = umbraInput(scheme)
2219
const adjustment = umbraAdjust(input.settings, scheme)
23-
const output = umbraGenerate(input, adjustment)
24-
return umbraHydrate(input, output)
20+
return umbraHydrate({
21+
input,
22+
output: umbraGenerate(input, adjustment),
23+
inversed: umbraInput(inversedScheme)
24+
})
2525
}
2626

27-
function umbraInput({
28-
scheme = defaultScheme,
29-
settings
30-
}: {
31-
scheme?: UmbraScheme
32-
settings?: RootSettings
33-
}): UmbraInput {
34-
const { inversed, ...rest } = settings || {}
27+
function umbraInput(scheme = defaultScheme) {
3528
return {
36-
scheme,
37-
inversed: inversed,
29+
...scheme,
3830
settings: {
3931
...defaultSettings,
40-
...rest
32+
...scheme.settings
4133
}
4234
}
4335
}
@@ -70,28 +62,40 @@ export interface Umbra {
7062
inverse: () => Umbra
7163
}
7264

73-
export function umbraHydrate(input: UmbraInput, output: UmbraRange[]): Umbra {
65+
function getTarget(target?: string | HTMLElement | null) {
66+
const targetIsString = typeof target === 'string'
67+
const targetIsElement = target instanceof HTMLElement || target === null
68+
return target
69+
? {
70+
element: targetIsElement ? target : undefined,
71+
selector: targetIsString ? target : undefined
72+
}
73+
: undefined
74+
}
75+
76+
export function umbraHydrate({
77+
input,
78+
output,
79+
inversed
80+
}: {
81+
input: UmbraInput
82+
output: UmbraRange[]
83+
inversed?: UmbraInput
84+
}): Umbra {
7485
const apply = (target?: string | HTMLElement | null, props?: ApplyProps) => {
7586
const { alias, formater } = props || {}
76-
const targetIsString = typeof target === 'string'
77-
const targetIsElement = target instanceof HTMLElement || target === null
7887
return format({ output, formater, input }).attach({
7988
alias,
80-
target: target
81-
? {
82-
element: targetIsElement ? target : undefined,
83-
selector: targetIsString ? target : undefined
84-
}
85-
: undefined
89+
target: getTarget(target)
8690
})
8791
}
8892

8993
return {
9094
input,
9195
output,
92-
isDark: () => isDark(input.scheme),
96+
isDark: () => isDark(input),
9397
format: (formater?: Formater) => format({ output, formater, input }),
94-
inverse: () => umbra(inverse(input).scheme, input.settings),
98+
inverse: () => umbra(inverse(input, inversed), input),
9599
apply
96100
}
97101
}

packages/core/engine/primitives/scheme.ts

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
import { colord, Colord } from 'colord'
2-
import type { UmbraInput, UmbraScheme, UmbraAdjusted } from '../types'
2+
import type { UmbraInput, UmbraAdjusted } from '../types'
33
import { increaseContrastUntil, getReadability, getReadable, mostReadable } from './color'
44

55
function inverseValidator(theme: UmbraInput) {
6-
const fgDark = colord(theme.scheme.foreground).isDark()
7-
const bgDark = colord(theme.scheme.background).isDark()
6+
const fgDark = colord(theme.foreground).isDark()
7+
const bgDark = colord(theme.background).isDark()
88

9-
const background = colord(theme.scheme.background)
10-
const foreground = colord(theme.scheme.foreground)
9+
const background = colord(theme.background)
10+
const foreground = colord(theme.foreground)
1111
const readability = theme.settings?.readability
1212

13-
if (fgDark !== bgDark) return {}
13+
if (fgDark !== bgDark)
14+
return {
15+
background: theme.foreground,
16+
foreground: theme.background
17+
}
18+
1419
const fg = getReadable({ foreground, background, readability })
1520
if (fg.isDark() !== bgDark) {
1621
return {
1722
background: fg.toRgbString(),
18-
foreground: theme.scheme.background
23+
foreground: theme.background
1924
}
2025
}
2126

@@ -39,37 +44,19 @@ function inverseValidator(theme: UmbraInput) {
3944

4045
return {
4146
background: createInvertedFlippingReadability(),
42-
foreground: theme.scheme.foreground
43-
}
44-
}
45-
46-
function basicInverse(scheme: UmbraScheme): UmbraScheme {
47-
return {
48-
...scheme,
49-
background: scheme.foreground,
50-
foreground: scheme.background
47+
foreground: theme.foreground
5148
}
5249
}
5350

54-
function makeInverse(theme: UmbraInput): UmbraInput {
55-
const inversed = basicInverse(theme.scheme)
51+
export const inverse = (theme: UmbraInput, inversed?: UmbraInput) => {
52+
if (inversed) return inversed
5653
return {
57-
inversed: theme,
58-
settings: theme.settings,
59-
scheme: {
60-
...inversed,
61-
...inverseValidator(theme)
62-
}
54+
...theme,
55+
...inverseValidator(theme)
6356
}
6457
}
6558

66-
export const inverse = (theme: UmbraInput) => {
67-
const hasInverse = theme.hasOwnProperty('inverse')
68-
if (hasInverse) return theme.inversed as UmbraInput
69-
return makeInverse(theme)
70-
}
71-
72-
export const isDark = (theme: UmbraScheme) => {
59+
export const isDark = (theme: UmbraInput) => {
7360
return colord(theme.background).isDark()
7461
}
7562

packages/core/engine/primitives/utils.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@ function randomHex() {
1919

2020
export function randomScheme(randomSettings: RandomSettings = { amount: 1 }): UmbraInput {
2121
return {
22-
settings: { ...defaultSettings, ...randomSettings },
23-
scheme: {
24-
background: randomHex(),
25-
foreground: randomHex(),
26-
accents: Array.from({ length: randomSettings.amount }, () => randomHex())
27-
}
22+
background: randomHex(),
23+
foreground: randomHex(),
24+
accents: Array.from({ length: randomSettings.amount }, () => randomHex()),
25+
settings: { ...defaultSettings, ...randomSettings }
2826
}
2927
}
3028

packages/core/engine/types/index.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,11 @@ export interface Accent {
2727
readability?: number
2828
}
2929

30-
export interface UmbraScheme {
30+
export interface UmbraInput {
3131
background: string
3232
foreground: string
3333
accents: (Accent | string)[]
34-
}
35-
36-
export interface UmbraInput {
37-
scheme: UmbraScheme
38-
settings: UmbraSettings
39-
inversed?: UmbraInput
34+
settings?: UmbraSettings
4035
}
4136

4237
export interface UmbraAdjusted {

packages/core/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import { mostReadable, colorMix } from './engine/primitives/color'
1515
import type {
1616
UmbraOutput,
1717
UmbraSettings,
18-
UmbraScheme,
1918
UmbraInput,
2019
UmbraRange,
2120
FormatedRange
@@ -45,7 +44,6 @@ export {
4544
export type {
4645
Umbra,
4746
UmbraInput,
48-
UmbraScheme,
4947
UmbraSettings,
5048
UmbraOutput,
5149
UmbraOutputs,

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@umbrajs/core",
3-
"version": "0.0.4",
3+
"version": "0.0.44",
44
"description": "Umbra is a theme managment library that allows you to create semantic color themes that are easy to dynamically customize, change retroactively and scale progressively",
55
"author": "Samuel M. Bednarz<https://github.com/CarelessCourage>",
66
"repository": {

packages/playground/src/App.vue

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@ const brown = {
4141
color: '#87533e'
4242
}
4343
44-
const something = {
45-
shades: [5, 5, 5, 5, 15, 10, 10, 25, '#e5484d', 25, 25, 25]
46-
}
47-
4844
const accent = {
4945
color: '#ff0157'
5046
}
@@ -53,30 +49,25 @@ const accent3 = {
5349
color: '#e5484d'
5450
}
5551
56-
const theme = umbra({
52+
const theme2 = umbra({
5753
background: '#000000',
5854
foreground: '#ffffff',
59-
accents: [
60-
royal,
61-
accent,
62-
radixRed,
63-
radixYellow,
64-
radixBlue,
65-
accent3,
66-
radixRed,
67-
success,
68-
brown,
69-
something
70-
]
71-
}).apply('body', {
55+
accents: [royal, accent, radixRed, radixYellow, radixBlue, accent3, radixRed, success, brown]
56+
})
57+
58+
const theme = umbra({
59+
foreground: '#ffffff',
60+
background: '#000000',
61+
accents: ['#ff88ff']
62+
}).apply(undefined, {
7263
alias: true
7364
})
7465
7566
const t = ref(theme.input)
7667
const formated = ref(theme.formated)
7768
7869
function inverse() {
79-
const newTheme = umbra(t.value.scheme).inverse().apply('body')
70+
const newTheme = umbra(t.value).inverse().apply('body')
8071
t.value = newTheme.input
8172
}
8273

0 commit comments

Comments
 (0)