@hanzogui/themes 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/cjs/componentThemeDefinitions.cjs +124 -0
- package/dist/cjs/componentThemeDefinitions.native.js +127 -0
- package/dist/cjs/componentThemeDefinitions.native.js.map +1 -0
- package/dist/cjs/generated-new.cjs +2021 -0
- package/dist/cjs/generated-new.native.js +2040 -0
- package/dist/cjs/generated-new.native.js.map +1 -0
- package/dist/cjs/generated-v3.cjs +1099 -0
- package/dist/cjs/generated-v3.native.js +1118 -0
- package/dist/cjs/generated-v3.native.js.map +1 -0
- package/dist/cjs/generated-v4-gui.cjs +933 -0
- package/dist/cjs/generated-v4-gui.native.js +952 -0
- package/dist/cjs/generated-v4-gui.native.js.map +1 -0
- package/dist/cjs/generated-v4.cjs +391 -0
- package/dist/cjs/generated-v4.native.js +410 -0
- package/dist/cjs/generated-v4.native.js.map +1 -0
- package/dist/cjs/generated-v5-subtle.cjs +549 -0
- package/dist/cjs/generated-v5-subtle.native.js +568 -0
- package/dist/cjs/generated-v5-subtle.native.js.map +1 -0
- package/dist/cjs/generated-v5.cjs +549 -0
- package/dist/cjs/generated-v5.native.js +568 -0
- package/dist/cjs/generated-v5.native.js.map +1 -0
- package/dist/cjs/helpers.cjs +34 -0
- package/dist/cjs/helpers.native.js +39 -0
- package/dist/cjs/helpers.native.js.map +1 -0
- package/dist/cjs/index.cjs +25 -0
- package/dist/cjs/index.native.js +28 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/opacify.cjs +96 -0
- package/dist/cjs/opacify.native.js +106 -0
- package/dist/cjs/opacify.native.js.map +1 -0
- package/dist/cjs/palettes.cjs +52 -0
- package/dist/cjs/palettes.native.js +63 -0
- package/dist/cjs/palettes.native.js.map +1 -0
- package/dist/cjs/shadows.cjs +43 -0
- package/dist/cjs/shadows.native.js +46 -0
- package/dist/cjs/shadows.native.js.map +1 -0
- package/dist/cjs/subtleChildrenThemes.cjs +65 -0
- package/dist/cjs/subtleChildrenThemes.native.js +74 -0
- package/dist/cjs/subtleChildrenThemes.native.js.map +1 -0
- package/dist/cjs/templates.cjs +118 -0
- package/dist/cjs/templates.native.js +121 -0
- package/dist/cjs/templates.native.js.map +1 -0
- package/dist/cjs/themes-new.cjs +86 -0
- package/dist/cjs/themes-new.native.js +88 -0
- package/dist/cjs/themes-new.native.js.map +1 -0
- package/dist/cjs/themes-old.cjs +284 -0
- package/dist/cjs/themes-old.native.js +303 -0
- package/dist/cjs/themes-old.native.js.map +1 -0
- package/dist/cjs/themes.cjs +26 -0
- package/dist/cjs/themes.native.js +29 -0
- package/dist/cjs/themes.native.js.map +1 -0
- package/dist/cjs/tokens.cjs +155 -0
- package/dist/cjs/tokens.native.js +167 -0
- package/dist/cjs/tokens.native.js.map +1 -0
- package/dist/cjs/utils.cjs +40 -0
- package/dist/cjs/utils.native.js +46 -0
- package/dist/cjs/utils.native.js.map +1 -0
- package/dist/cjs/v3-themes.cjs +472 -0
- package/dist/cjs/v3-themes.native.js +487 -0
- package/dist/cjs/v3-themes.native.js.map +1 -0
- package/dist/cjs/v3-tokens.cjs +99 -0
- package/dist/cjs/v3-tokens.native.js +108 -0
- package/dist/cjs/v3-tokens.native.js.map +1 -0
- package/dist/cjs/v3.cjs +52 -0
- package/dist/cjs/v3.native.js +55 -0
- package/dist/cjs/v3.native.js.map +1 -0
- package/dist/cjs/v4-default.cjs +167 -0
- package/dist/cjs/v4-default.native.js +170 -0
- package/dist/cjs/v4-default.native.js.map +1 -0
- package/dist/cjs/v4-gui.cjs +235 -0
- package/dist/cjs/v4-gui.native.js +243 -0
- package/dist/cjs/v4-gui.native.js.map +1 -0
- package/dist/cjs/v4-tokens.cjs +99 -0
- package/dist/cjs/v4-tokens.native.js +108 -0
- package/dist/cjs/v4-tokens.native.js.map +1 -0
- package/dist/cjs/v4.cjs +32 -0
- package/dist/cjs/v4.native.js +35 -0
- package/dist/cjs/v4.native.js.map +1 -0
- package/dist/cjs/v5-subtle.cjs +34 -0
- package/dist/cjs/v5-subtle.native.js +37 -0
- package/dist/cjs/v5-subtle.native.js.map +1 -0
- package/dist/cjs/v5-templates.cjs +110 -0
- package/dist/cjs/v5-templates.native.js +126 -0
- package/dist/cjs/v5-templates.native.js.map +1 -0
- package/dist/cjs/v5-themes-subtle.cjs +37 -0
- package/dist/cjs/v5-themes-subtle.native.js +40 -0
- package/dist/cjs/v5-themes-subtle.native.js.map +1 -0
- package/dist/cjs/v5-themes.cjs +400 -0
- package/dist/cjs/v5-themes.native.js +445 -0
- package/dist/cjs/v5-themes.native.js.map +1 -0
- package/dist/cjs/v5-tokens.cjs +99 -0
- package/dist/cjs/v5-tokens.native.js +108 -0
- package/dist/cjs/v5-tokens.native.js.map +1 -0
- package/dist/cjs/v5.cjs +34 -0
- package/dist/cjs/v5.native.js +37 -0
- package/dist/cjs/v5.native.js.map +1 -0
- package/dist/esm/componentThemeDefinitions.mjs +100 -0
- package/dist/esm/componentThemeDefinitions.mjs.map +1 -0
- package/dist/esm/componentThemeDefinitions.native.js +100 -0
- package/dist/esm/componentThemeDefinitions.native.js.map +1 -0
- package/dist/esm/generated-new.mjs +1997 -0
- package/dist/esm/generated-new.mjs.map +1 -0
- package/dist/esm/generated-new.native.js +2013 -0
- package/dist/esm/generated-new.native.js.map +1 -0
- package/dist/esm/generated-v3.mjs +1075 -0
- package/dist/esm/generated-v3.mjs.map +1 -0
- package/dist/esm/generated-v3.native.js +1091 -0
- package/dist/esm/generated-v3.native.js.map +1 -0
- package/dist/esm/generated-v4-gui.mjs +909 -0
- package/dist/esm/generated-v4-gui.mjs.map +1 -0
- package/dist/esm/generated-v4-gui.native.js +925 -0
- package/dist/esm/generated-v4-gui.native.js.map +1 -0
- package/dist/esm/generated-v4.mjs +367 -0
- package/dist/esm/generated-v4.mjs.map +1 -0
- package/dist/esm/generated-v4.native.js +383 -0
- package/dist/esm/generated-v4.native.js.map +1 -0
- package/dist/esm/generated-v5-subtle.mjs +525 -0
- package/dist/esm/generated-v5-subtle.mjs.map +1 -0
- package/dist/esm/generated-v5-subtle.native.js +541 -0
- package/dist/esm/generated-v5-subtle.native.js.map +1 -0
- package/dist/esm/generated-v5.mjs +525 -0
- package/dist/esm/generated-v5.mjs.map +1 -0
- package/dist/esm/generated-v5.native.js +541 -0
- package/dist/esm/generated-v5.native.js.map +1 -0
- package/dist/esm/helpers.mjs +9 -0
- package/dist/esm/helpers.mjs.map +1 -0
- package/dist/esm/helpers.native.js +11 -0
- package/dist/esm/helpers.native.js.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/index.mjs +9 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +9 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/opacify.mjs +72 -0
- package/dist/esm/opacify.mjs.map +1 -0
- package/dist/esm/opacify.native.js +79 -0
- package/dist/esm/opacify.native.js.map +1 -0
- package/dist/esm/palettes.mjs +29 -0
- package/dist/esm/palettes.mjs.map +1 -0
- package/dist/esm/palettes.native.js +37 -0
- package/dist/esm/palettes.native.js.map +1 -0
- package/dist/esm/shadows.mjs +20 -0
- package/dist/esm/shadows.mjs.map +1 -0
- package/dist/esm/shadows.native.js +20 -0
- package/dist/esm/shadows.native.js.map +1 -0
- package/dist/esm/subtleChildrenThemes.mjs +41 -0
- package/dist/esm/subtleChildrenThemes.mjs.map +1 -0
- package/dist/esm/subtleChildrenThemes.native.js +47 -0
- package/dist/esm/subtleChildrenThemes.native.js.map +1 -0
- package/dist/esm/templates.mjs +94 -0
- package/dist/esm/templates.mjs.map +1 -0
- package/dist/esm/templates.native.js +94 -0
- package/dist/esm/templates.native.js.map +1 -0
- package/dist/esm/themes-new.mjs +63 -0
- package/dist/esm/themes-new.mjs.map +1 -0
- package/dist/esm/themes-new.native.js +62 -0
- package/dist/esm/themes-new.native.js.map +1 -0
- package/dist/esm/themes-old.mjs +261 -0
- package/dist/esm/themes-old.mjs.map +1 -0
- package/dist/esm/themes-old.native.js +277 -0
- package/dist/esm/themes-old.native.js.map +1 -0
- package/dist/esm/themes.mjs +3 -0
- package/dist/esm/themes.mjs.map +1 -0
- package/dist/esm/themes.native.js +3 -0
- package/dist/esm/themes.native.js.map +1 -0
- package/dist/esm/tokens.mjs +124 -0
- package/dist/esm/tokens.mjs.map +1 -0
- package/dist/esm/tokens.native.js +133 -0
- package/dist/esm/tokens.native.js.map +1 -0
- package/dist/esm/utils.mjs +14 -0
- package/dist/esm/utils.mjs.map +1 -0
- package/dist/esm/utils.native.js +17 -0
- package/dist/esm/utils.native.js.map +1 -0
- package/dist/esm/v3-themes.mjs +444 -0
- package/dist/esm/v3-themes.mjs.map +1 -0
- package/dist/esm/v3-themes.native.js +456 -0
- package/dist/esm/v3-themes.native.js.map +1 -0
- package/dist/esm/v3-tokens.mjs +70 -0
- package/dist/esm/v3-tokens.mjs.map +1 -0
- package/dist/esm/v3-tokens.native.js +76 -0
- package/dist/esm/v3-tokens.native.js.map +1 -0
- package/dist/esm/v3.mjs +12 -0
- package/dist/esm/v3.mjs.map +1 -0
- package/dist/esm/v3.native.js +12 -0
- package/dist/esm/v3.native.js.map +1 -0
- package/dist/esm/v4-default.mjs +133 -0
- package/dist/esm/v4-default.mjs.map +1 -0
- package/dist/esm/v4-default.native.js +133 -0
- package/dist/esm/v4-default.native.js.map +1 -0
- package/dist/esm/v4-gui.mjs +201 -0
- package/dist/esm/v4-gui.mjs.map +1 -0
- package/dist/esm/v4-gui.native.js +206 -0
- package/dist/esm/v4-gui.native.js.map +1 -0
- package/dist/esm/v4-tokens.mjs +70 -0
- package/dist/esm/v4-tokens.mjs.map +1 -0
- package/dist/esm/v4-tokens.native.js +76 -0
- package/dist/esm/v4-tokens.native.js.map +1 -0
- package/dist/esm/v4.mjs +6 -0
- package/dist/esm/v4.mjs.map +1 -0
- package/dist/esm/v4.native.js +6 -0
- package/dist/esm/v4.native.js.map +1 -0
- package/dist/esm/v5-subtle.mjs +7 -0
- package/dist/esm/v5-subtle.mjs.map +1 -0
- package/dist/esm/v5-subtle.native.js +7 -0
- package/dist/esm/v5-subtle.native.js.map +1 -0
- package/dist/esm/v5-templates.mjs +87 -0
- package/dist/esm/v5-templates.mjs.map +1 -0
- package/dist/esm/v5-templates.native.js +100 -0
- package/dist/esm/v5-templates.native.js.map +1 -0
- package/dist/esm/v5-themes-subtle.mjs +13 -0
- package/dist/esm/v5-themes-subtle.mjs.map +1 -0
- package/dist/esm/v5-themes-subtle.native.js +13 -0
- package/dist/esm/v5-themes-subtle.native.js.map +1 -0
- package/dist/esm/v5-themes.mjs +361 -0
- package/dist/esm/v5-themes.mjs.map +1 -0
- package/dist/esm/v5-themes.native.js +403 -0
- package/dist/esm/v5-themes.native.js.map +1 -0
- package/dist/esm/v5-tokens.mjs +70 -0
- package/dist/esm/v5-tokens.mjs.map +1 -0
- package/dist/esm/v5-tokens.native.js +76 -0
- package/dist/esm/v5-tokens.native.js.map +1 -0
- package/dist/esm/v5.mjs +7 -0
- package/dist/esm/v5.mjs.map +1 -0
- package/dist/esm/v5.native.js +7 -0
- package/dist/esm/v5.native.js.map +1 -0
- package/package.json +95 -0
- package/src/componentThemeDefinitions.tsx +129 -0
- package/src/generated-new.ts +2571 -0
- package/src/generated-v3.ts +1826 -0
- package/src/generated-v4-gui.ts +2200 -0
- package/src/generated-v4.ts +1004 -0
- package/src/generated-v5-subtle.ts +2170 -0
- package/src/generated-v5.ts +2188 -0
- package/src/helpers.ts +44 -0
- package/src/index.tsx +8 -0
- package/src/opacify.ts +125 -0
- package/src/palettes.tsx +91 -0
- package/src/shadows.tsx +19 -0
- package/src/subtleChildrenThemes.ts +54 -0
- package/src/templates.tsx +104 -0
- package/src/themes-new.ts +74 -0
- package/src/themes-old.tsx +378 -0
- package/src/themes.tsx +1 -0
- package/src/tokens.tsx +199 -0
- package/src/utils.ts +51 -0
- package/src/v3-themes.ts +650 -0
- package/src/v3-tokens.ts +103 -0
- package/src/v3.tsx +12 -0
- package/src/v4-default.ts +191 -0
- package/src/v4-gui.ts +287 -0
- package/src/v4-tokens.ts +105 -0
- package/src/v4.tsx +4 -0
- package/src/v5-subtle.tsx +11 -0
- package/src/v5-templates.ts +126 -0
- package/src/v5-themes-subtle.ts +18 -0
- package/src/v5-themes.ts +626 -0
- package/src/v5-tokens.ts +107 -0
- package/src/v5.tsx +11 -0
- package/tests/v5-themes.test.ts +215 -0
- package/tsconfig.json +43 -0
- package/types/componentThemeDefinitions.d.ts +771 -0
- package/types/generated-new.d.ts +135 -0
- package/types/generated-v3.d.ts +144 -0
- package/types/generated-v4-gui.d.ts +190 -0
- package/types/generated-v4.d.ts +137 -0
- package/types/generated-v5-subtle.d.ts +244 -0
- package/types/generated-v5.d.ts +244 -0
- package/types/helpers.d.ts +24 -0
- package/types/index.d.ts +9 -0
- package/types/opacify.d.ts +9 -0
- package/types/palettes.d.ts +21 -0
- package/types/shadows.d.ts +15 -0
- package/types/subtleChildrenThemes.d.ts +305 -0
- package/types/templates.d.ts +155 -0
- package/types/themes-new.d.ts +42243 -0
- package/types/themes-old.d.ts +51411 -0
- package/types/themes.d.ts +2 -0
- package/types/tokens.d.ts +1308 -0
- package/types/utils.d.ts +21 -0
- package/types/v3-themes.d.ts +16304 -0
- package/types/v3-tokens.d.ts +184 -0
- package/types/v3.d.ts +11 -0
- package/types/v4-default.d.ts +274 -0
- package/types/v4-gui.d.ts +195 -0
- package/types/v4-tokens.d.ts +184 -0
- package/types/v4.d.ts +5 -0
- package/types/v5-subtle.d.ts +8 -0
- package/types/v5-templates.d.ts +42 -0
- package/types/v5-themes-subtle.d.ts +250 -0
- package/types/v5-themes.d.ts +752 -0
- package/types/v5-tokens.d.ts +185 -0
- package/types/v5.d.ts +8 -0
- package/v3/index.cjs +2 -0
- package/v3/index.js +2 -0
- package/v3/index.native.cjs +2 -0
- package/v3/index.native.js +2 -0
- package/v3-themes/index.cjs +2 -0
- package/v3-themes/index.js +2 -0
- package/v3-themes/index.native.cjs +2 -0
- package/v3-themes/index.native.js +2 -0
- package/v3-themes.cjs +1 -0
- package/v3-themes.d.ts +1 -0
- package/v3.cjs +1 -0
- package/v3.d.ts +1 -0
- package/v4/index.cjs +2 -0
- package/v4/index.js +2 -0
- package/v4/index.native.cjs +2 -0
- package/v4/index.native.js +2 -0
- package/v4.cjs +1 -0
- package/v4.d.ts +1 -0
- package/v5/index.cjs +2 -0
- package/v5/index.js +2 -0
- package/v5/index.native.cjs +2 -0
- package/v5/index.native.js +2 -0
- package/v5-subtle/index.cjs +2 -0
- package/v5-subtle/index.js +2 -0
- package/v5-subtle/index.native.cjs +2 -0
- package/v5-subtle/index.native.js +2 -0
- package/v5-subtle.cjs +1 -0
- package/v5-subtle.d.ts +1 -0
- package/v5.cjs +1 -0
- package/v5.d.ts +1 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
import type { MaskOptions } from '@hanzogui/create-theme'
|
|
2
|
+
import {
|
|
3
|
+
addChildren,
|
|
4
|
+
applyMask,
|
|
5
|
+
createStrengthenMask,
|
|
6
|
+
createTheme,
|
|
7
|
+
createWeakenMask,
|
|
8
|
+
skipMask,
|
|
9
|
+
} from '@hanzogui/create-theme'
|
|
10
|
+
|
|
11
|
+
import { colorTokens, darkColors, lightColors } from './tokens'
|
|
12
|
+
|
|
13
|
+
type ColorName = keyof typeof colorTokens.dark
|
|
14
|
+
|
|
15
|
+
const lightTransparent = 'rgba(255,255,255,0)'
|
|
16
|
+
const darkTransparent = 'rgba(10,10,10,0)'
|
|
17
|
+
|
|
18
|
+
// background => foreground
|
|
19
|
+
const palettes = {
|
|
20
|
+
dark: [
|
|
21
|
+
darkTransparent,
|
|
22
|
+
'#050505',
|
|
23
|
+
'#151515',
|
|
24
|
+
'#191919',
|
|
25
|
+
'#232323',
|
|
26
|
+
'#282828',
|
|
27
|
+
'#323232',
|
|
28
|
+
'#424242',
|
|
29
|
+
'#494949',
|
|
30
|
+
'#545454',
|
|
31
|
+
'#626262',
|
|
32
|
+
'#a5a5a5',
|
|
33
|
+
'#fff',
|
|
34
|
+
lightTransparent,
|
|
35
|
+
],
|
|
36
|
+
light: [
|
|
37
|
+
lightTransparent,
|
|
38
|
+
'#fff',
|
|
39
|
+
'#f9f9f9',
|
|
40
|
+
'hsl(0, 0%, 97.3%)',
|
|
41
|
+
'hsl(0, 0%, 95.1%)',
|
|
42
|
+
'hsl(0, 0%, 94.0%)',
|
|
43
|
+
'hsl(0, 0%, 92.0%)',
|
|
44
|
+
'hsl(0, 0%, 89.5%)',
|
|
45
|
+
'hsl(0, 0%, 81.0%)',
|
|
46
|
+
'hsl(0, 0%, 56.1%)',
|
|
47
|
+
'hsl(0, 0%, 50.3%)',
|
|
48
|
+
'hsl(0, 0%, 42.5%)',
|
|
49
|
+
'hsl(0, 0%, 9.0%)',
|
|
50
|
+
darkTransparent,
|
|
51
|
+
],
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const templateColors = {
|
|
55
|
+
color1: 1,
|
|
56
|
+
color2: 2,
|
|
57
|
+
color3: 3,
|
|
58
|
+
color4: 4,
|
|
59
|
+
color5: 5,
|
|
60
|
+
color6: 6,
|
|
61
|
+
color7: 7,
|
|
62
|
+
color8: 8,
|
|
63
|
+
color9: 9,
|
|
64
|
+
color10: 10,
|
|
65
|
+
color11: 11,
|
|
66
|
+
color12: 12,
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const templateShadows = {
|
|
70
|
+
shadowColor: 1,
|
|
71
|
+
shadowColorHover: 1,
|
|
72
|
+
shadowColorPress: 2,
|
|
73
|
+
shadowColorFocus: 2,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// we can use subset of our template as a "override" so it doesn't get adjusted with masks
|
|
77
|
+
// we want to skip over templateColor + templateShadows
|
|
78
|
+
const toSkip = {
|
|
79
|
+
...templateShadows,
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const override = Object.fromEntries(Object.entries(toSkip).map(([k]) => [k, 0]))
|
|
83
|
+
const overrideShadows = Object.fromEntries(
|
|
84
|
+
Object.entries(templateShadows).map(([k]) => [k, 0])
|
|
85
|
+
)
|
|
86
|
+
const overrideWithColors = {
|
|
87
|
+
...override,
|
|
88
|
+
color: 0,
|
|
89
|
+
colorHover: 0,
|
|
90
|
+
colorFocus: 0,
|
|
91
|
+
colorPress: 0,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// templates use the palette and specify index
|
|
95
|
+
// negative goes backwards from end so -1 is the last item
|
|
96
|
+
const template = {
|
|
97
|
+
...templateColors,
|
|
98
|
+
...toSkip,
|
|
99
|
+
// the background, color, etc keys here work like generics - they make it so you
|
|
100
|
+
// can publish components for others to use without mandating a specific color scale
|
|
101
|
+
// the @hanzogui/button Button component looks for `$background`, so you set the
|
|
102
|
+
// dark_red_Button theme to have a stronger background than the dark_red theme.
|
|
103
|
+
background: 2,
|
|
104
|
+
backgroundHover: 3,
|
|
105
|
+
backgroundPress: 4,
|
|
106
|
+
backgroundFocus: 5,
|
|
107
|
+
backgroundStrong: 1,
|
|
108
|
+
backgroundTransparent: 0,
|
|
109
|
+
color: -1,
|
|
110
|
+
colorHover: -2,
|
|
111
|
+
colorPress: -1,
|
|
112
|
+
colorFocus: -2,
|
|
113
|
+
colorTransparent: -0,
|
|
114
|
+
borderColor: 4,
|
|
115
|
+
borderColorHover: 5,
|
|
116
|
+
borderColorPress: 3,
|
|
117
|
+
borderColorFocus: 4,
|
|
118
|
+
placeholderColor: -4,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const lightShadowColor = 'rgba(0,0,0,0.02)'
|
|
122
|
+
const lightShadowColorStrong = 'rgba(0,0,0,0.066)'
|
|
123
|
+
const darkShadowColor = 'rgba(0,0,0,0.2)'
|
|
124
|
+
const darkShadowColorStrong = 'rgba(0,0,0,0.3)'
|
|
125
|
+
|
|
126
|
+
const lightShadows = {
|
|
127
|
+
shadowColor: lightShadowColorStrong,
|
|
128
|
+
shadowColorHover: lightShadowColorStrong,
|
|
129
|
+
shadowColorPress: lightShadowColor,
|
|
130
|
+
shadowColorFocus: lightShadowColor,
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const darkShadows = {
|
|
134
|
+
shadowColor: darkShadowColorStrong,
|
|
135
|
+
shadowColorHover: darkShadowColorStrong,
|
|
136
|
+
shadowColorPress: darkShadowColor,
|
|
137
|
+
shadowColorFocus: darkShadowColor,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const lightTemplate = {
|
|
141
|
+
...template,
|
|
142
|
+
|
|
143
|
+
background: 2,
|
|
144
|
+
backgroundHover: 3,
|
|
145
|
+
backgroundPress: 4,
|
|
146
|
+
|
|
147
|
+
// our light color palette is... a bit unique
|
|
148
|
+
borderColor: 6,
|
|
149
|
+
borderColorHover: 7,
|
|
150
|
+
borderColorFocus: 5,
|
|
151
|
+
borderColorPress: 6,
|
|
152
|
+
...lightShadows,
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const darkTemplate = { ...template, ...darkShadows }
|
|
156
|
+
|
|
157
|
+
const light = createTheme(palettes.light, lightTemplate)
|
|
158
|
+
const dark = createTheme(palettes.dark, darkTemplate)
|
|
159
|
+
|
|
160
|
+
type SubTheme = typeof light
|
|
161
|
+
|
|
162
|
+
const baseThemes: {
|
|
163
|
+
light: SubTheme
|
|
164
|
+
dark: SubTheme
|
|
165
|
+
} = {
|
|
166
|
+
light,
|
|
167
|
+
dark,
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const masks = {
|
|
171
|
+
skip: skipMask,
|
|
172
|
+
weaker: createWeakenMask(),
|
|
173
|
+
stronger: createStrengthenMask(),
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// default mask options for most uses
|
|
177
|
+
const maskOptions: MaskOptions = {
|
|
178
|
+
override,
|
|
179
|
+
skip: toSkip,
|
|
180
|
+
// avoids the transparent ends
|
|
181
|
+
max: palettes.light.length - 2,
|
|
182
|
+
min: 1,
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const transparent = (hsl: string, opacity = 0) =>
|
|
186
|
+
hsl.replace(`%)`, `%, ${opacity})`).replace(`hsl(`, `hsla(`)
|
|
187
|
+
|
|
188
|
+
// setup colorThemes and their inverses
|
|
189
|
+
const [lightColorThemes, darkColorThemes] = [colorTokens.light, colorTokens.dark].map(
|
|
190
|
+
(colorSet, i) => {
|
|
191
|
+
const isLight = i === 0
|
|
192
|
+
const theme = baseThemes[isLight ? 'light' : 'dark']
|
|
193
|
+
|
|
194
|
+
return Object.fromEntries(
|
|
195
|
+
Object.keys(colorSet).map((color) => {
|
|
196
|
+
const colorPalette = Object.values(colorSet[color]) as string[]
|
|
197
|
+
// were re-ordering these
|
|
198
|
+
const [head, tail] = [
|
|
199
|
+
colorPalette.slice(0, 6),
|
|
200
|
+
colorPalette.slice(colorPalette.length - 5),
|
|
201
|
+
]
|
|
202
|
+
// add our transparent colors first/last
|
|
203
|
+
// and make sure the last (foreground) color is white/black rather than colorful
|
|
204
|
+
// this is mostly for consistency with the older theme-base
|
|
205
|
+
const palette = [
|
|
206
|
+
transparent(colorPalette[0]),
|
|
207
|
+
...head,
|
|
208
|
+
...tail,
|
|
209
|
+
theme.color,
|
|
210
|
+
transparent(colorPalette[colorPalette.length - 1]),
|
|
211
|
+
]
|
|
212
|
+
|
|
213
|
+
const colorTheme = createTheme(
|
|
214
|
+
palette,
|
|
215
|
+
isLight
|
|
216
|
+
? {
|
|
217
|
+
...lightTemplate,
|
|
218
|
+
// light color themes are a bit less sensitive
|
|
219
|
+
borderColor: 4,
|
|
220
|
+
borderColorHover: 5,
|
|
221
|
+
borderColorFocus: 4,
|
|
222
|
+
borderColorPress: 4,
|
|
223
|
+
}
|
|
224
|
+
: darkTemplate
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
return [color, colorTheme]
|
|
228
|
+
})
|
|
229
|
+
) as Record<ColorName, SubTheme>
|
|
230
|
+
}
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
const allThemes = addChildren(baseThemes, (name, theme) => {
|
|
234
|
+
const isLight = name === 'light'
|
|
235
|
+
const inverseName = isLight ? 'dark' : 'light'
|
|
236
|
+
const inverseTheme = baseThemes[inverseName]
|
|
237
|
+
const colorThemes = isLight ? lightColorThemes : darkColorThemes
|
|
238
|
+
const inverseColorThemes = isLight ? darkColorThemes : lightColorThemes
|
|
239
|
+
|
|
240
|
+
const allColorThemes = addChildren(colorThemes, (colorName, colorTheme) => {
|
|
241
|
+
const inverse = inverseColorThemes[colorName]
|
|
242
|
+
return {
|
|
243
|
+
...getAltThemes({
|
|
244
|
+
theme: colorTheme,
|
|
245
|
+
inverse,
|
|
246
|
+
isLight,
|
|
247
|
+
}),
|
|
248
|
+
...getComponentThemes(colorTheme, inverse, isLight),
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
const baseSubThemes = {
|
|
253
|
+
...getAltThemes({ theme, inverse: inverseTheme, isLight }),
|
|
254
|
+
...getComponentThemes(theme, inverseTheme, isLight),
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return {
|
|
258
|
+
...baseSubThemes,
|
|
259
|
+
...allColorThemes,
|
|
260
|
+
}
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
function getAltThemes({
|
|
264
|
+
theme,
|
|
265
|
+
inverse,
|
|
266
|
+
isLight,
|
|
267
|
+
activeTheme,
|
|
268
|
+
}: {
|
|
269
|
+
theme: SubTheme
|
|
270
|
+
inverse: SubTheme
|
|
271
|
+
isLight: boolean
|
|
272
|
+
activeTheme?: SubTheme
|
|
273
|
+
}) {
|
|
274
|
+
const maskOptionsAlt = {
|
|
275
|
+
...maskOptions,
|
|
276
|
+
override: overrideShadows,
|
|
277
|
+
}
|
|
278
|
+
const alt1 = applyMask(theme, masks.weaker, maskOptionsAlt)
|
|
279
|
+
const alt2 = applyMask(alt1, masks.weaker, maskOptionsAlt)
|
|
280
|
+
|
|
281
|
+
const active =
|
|
282
|
+
activeTheme ??
|
|
283
|
+
(process.env.ACTIVE_THEME_INVERSE
|
|
284
|
+
? inverse
|
|
285
|
+
: (() => {
|
|
286
|
+
return applyMask(theme, masks.weaker, {
|
|
287
|
+
...maskOptions,
|
|
288
|
+
strength: 3,
|
|
289
|
+
skip: {
|
|
290
|
+
...maskOptions.skip,
|
|
291
|
+
color: 1,
|
|
292
|
+
},
|
|
293
|
+
})
|
|
294
|
+
})())
|
|
295
|
+
|
|
296
|
+
return addChildren({ alt1, alt2, active }, (_, subTheme) => {
|
|
297
|
+
return getComponentThemes(subTheme, subTheme === inverse ? theme : inverse, isLight)
|
|
298
|
+
})
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function getComponentThemes(theme: SubTheme, inverse: SubTheme, isLight: boolean) {
|
|
302
|
+
const componentMaskOptions: MaskOptions = {
|
|
303
|
+
...maskOptions,
|
|
304
|
+
override: overrideWithColors,
|
|
305
|
+
skip: {
|
|
306
|
+
...maskOptions.skip,
|
|
307
|
+
// skip colors too just for component sub themes
|
|
308
|
+
...templateColors,
|
|
309
|
+
},
|
|
310
|
+
}
|
|
311
|
+
const weaker1 = applyMask(theme, masks.weaker, componentMaskOptions)
|
|
312
|
+
const base = applyMask(weaker1, masks.stronger, componentMaskOptions)
|
|
313
|
+
const weaker2 = applyMask(weaker1, masks.weaker, componentMaskOptions)
|
|
314
|
+
const stronger1 = applyMask(theme, masks.stronger, componentMaskOptions)
|
|
315
|
+
const inverse1 = applyMask(inverse, masks.weaker, componentMaskOptions)
|
|
316
|
+
const inverse2 = applyMask(inverse1, masks.weaker, componentMaskOptions)
|
|
317
|
+
const strongerBorderLighterBackground: SubTheme = isLight
|
|
318
|
+
? {
|
|
319
|
+
...stronger1,
|
|
320
|
+
borderColor: weaker1.borderColor,
|
|
321
|
+
borderColorHover: weaker1.borderColorHover,
|
|
322
|
+
borderColorPress: weaker1.borderColorPress,
|
|
323
|
+
borderColorFocus: weaker1.borderColorFocus,
|
|
324
|
+
}
|
|
325
|
+
: {
|
|
326
|
+
...applyMask(theme, masks.skip, componentMaskOptions),
|
|
327
|
+
borderColor: weaker1.borderColor,
|
|
328
|
+
borderColorHover: weaker1.borderColorHover,
|
|
329
|
+
borderColorPress: weaker1.borderColorPress,
|
|
330
|
+
borderColorFocus: weaker1.borderColorFocus,
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const overlayTheme = {
|
|
334
|
+
background: isLight ? 'rgba(0,0,0,0.5)' : 'rgba(0,0,0,0.9)',
|
|
335
|
+
} as SubTheme
|
|
336
|
+
|
|
337
|
+
const weaker2WithoutBorder = {
|
|
338
|
+
...weaker2,
|
|
339
|
+
borderColor: 'transparent',
|
|
340
|
+
borderColorHover: 'transparent',
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
ListItem: isLight ? stronger1 : base,
|
|
345
|
+
Card: weaker1,
|
|
346
|
+
Button: weaker2WithoutBorder,
|
|
347
|
+
Checkbox: weaker2,
|
|
348
|
+
DrawerFrame: weaker1,
|
|
349
|
+
SliderTrack: stronger1,
|
|
350
|
+
SliderTrackActive: weaker2,
|
|
351
|
+
SliderThumb: inverse1,
|
|
352
|
+
Progress: weaker1,
|
|
353
|
+
ProgressIndicator: inverse,
|
|
354
|
+
Switch: weaker2,
|
|
355
|
+
SwitchThumb: inverse2,
|
|
356
|
+
TooltipArrow: weaker1,
|
|
357
|
+
TooltipContent: weaker2,
|
|
358
|
+
Input: strongerBorderLighterBackground,
|
|
359
|
+
TextArea: strongerBorderLighterBackground,
|
|
360
|
+
Tooltip: inverse1,
|
|
361
|
+
// make overlays always dark
|
|
362
|
+
SheetOverlay: overlayTheme,
|
|
363
|
+
DialogOverlay: overlayTheme,
|
|
364
|
+
ModalOverlay: overlayTheme,
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
export const themes = {
|
|
369
|
+
...allThemes,
|
|
370
|
+
// bring back the full type, the rest use a subset to avoid clogging up ts,
|
|
371
|
+
// hanzo-gui will be smart and use the top level themes as the type for useTheme() etc
|
|
372
|
+
light: createTheme(palettes.light, lightTemplate, { nonInheritedValues: lightColors }),
|
|
373
|
+
dark: createTheme(palettes.dark, darkTemplate, { nonInheritedValues: darkColors }),
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// if (process.env.NODE_ENV === 'development') {
|
|
377
|
+
// console.log(JSON.stringify(themes).length)
|
|
378
|
+
// }
|
package/src/themes.tsx
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { themes } from './generated-new'
|
package/src/tokens.tsx
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import {
|
|
2
|
+
blue,
|
|
3
|
+
blueDark,
|
|
4
|
+
gray,
|
|
5
|
+
grayDark,
|
|
6
|
+
green,
|
|
7
|
+
greenDark,
|
|
8
|
+
orange,
|
|
9
|
+
orangeDark,
|
|
10
|
+
pink,
|
|
11
|
+
pinkDark,
|
|
12
|
+
purple,
|
|
13
|
+
purpleDark,
|
|
14
|
+
red,
|
|
15
|
+
redDark,
|
|
16
|
+
yellow,
|
|
17
|
+
yellowDark,
|
|
18
|
+
} from '@hanzogui/colors/legacy'
|
|
19
|
+
import type { Variable } from '@hanzogui/web'
|
|
20
|
+
import { createTokens } from '@hanzogui/web'
|
|
21
|
+
|
|
22
|
+
// should roughly map to button/input etc height at each level
|
|
23
|
+
// fonts should match that height/lineHeight at each stop
|
|
24
|
+
// so these are really non-linear on purpose
|
|
25
|
+
// why?
|
|
26
|
+
// - at sizes <1, used for fine grained things (borders, smallest paddingY)
|
|
27
|
+
// - so smallest padY should be roughly 1-4px so it can join with lineHeight
|
|
28
|
+
// - at sizes >=1, have to consider "pressability" (jumps up)
|
|
29
|
+
// - after that it should go upwards somewhat naturally
|
|
30
|
+
// - H1 / headings top out at 10 naturally, so after 10 we can go upwards faster
|
|
31
|
+
// but also one more wrinkle...
|
|
32
|
+
// space is used in conjunction with size
|
|
33
|
+
// i'm setting space to generally just a fixed fraction of size (~1/3-2/3 still fine tuning)
|
|
34
|
+
export const size = {
|
|
35
|
+
$0: 0,
|
|
36
|
+
'$0.25': 2,
|
|
37
|
+
'$0.5': 4,
|
|
38
|
+
'$0.75': 8,
|
|
39
|
+
$1: 20,
|
|
40
|
+
'$1.5': 24,
|
|
41
|
+
$2: 28,
|
|
42
|
+
'$2.5': 32,
|
|
43
|
+
$3: 36,
|
|
44
|
+
'$3.5': 40,
|
|
45
|
+
$4: 44,
|
|
46
|
+
$true: 44,
|
|
47
|
+
'$4.5': 48,
|
|
48
|
+
$5: 52,
|
|
49
|
+
$6: 64,
|
|
50
|
+
$7: 74,
|
|
51
|
+
$8: 84,
|
|
52
|
+
$9: 94,
|
|
53
|
+
$10: 104,
|
|
54
|
+
$11: 124,
|
|
55
|
+
$12: 144,
|
|
56
|
+
$13: 164,
|
|
57
|
+
$14: 184,
|
|
58
|
+
$15: 204,
|
|
59
|
+
$16: 224,
|
|
60
|
+
$17: 224,
|
|
61
|
+
$18: 244,
|
|
62
|
+
$19: 264,
|
|
63
|
+
$20: 284,
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
type SizeKeysIn = keyof typeof size
|
|
67
|
+
type Sizes = {
|
|
68
|
+
[Key in SizeKeysIn extends `$${infer Key}` ? Key : SizeKeysIn]: number
|
|
69
|
+
}
|
|
70
|
+
type SizeKeys = `${keyof Sizes extends `${infer K}` ? K : never}`
|
|
71
|
+
|
|
72
|
+
const spaces = Object.entries(size).map(([k, v]) => {
|
|
73
|
+
return [k, sizeToSpace(v)] as const
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
// a bit odd but keeping backward compat for values >8 while fixing below
|
|
77
|
+
function sizeToSpace(v: number) {
|
|
78
|
+
if (v === 0) return 0
|
|
79
|
+
if (v === 2) return 0.5
|
|
80
|
+
if (v === 4) return 1
|
|
81
|
+
if (v === 8) return 1.5
|
|
82
|
+
if (v <= 16) return Math.round(v * 0.333)
|
|
83
|
+
return Math.floor(v * 0.7 - 12)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const spacesNegative = spaces.slice(1).map(([k, v]) => [`-${k.slice(1)}`, -v])
|
|
87
|
+
|
|
88
|
+
type SizeKeysWithNegatives =
|
|
89
|
+
| Exclude<`-${SizeKeys extends `$${infer Key}` ? Key : SizeKeys}`, '-0'>
|
|
90
|
+
| SizeKeys
|
|
91
|
+
|
|
92
|
+
type SizeKeysWithNegativesString = `$${SizeKeysWithNegatives}`
|
|
93
|
+
|
|
94
|
+
export const space: {
|
|
95
|
+
[Key in SizeKeysWithNegativesString]: Key extends keyof Sizes ? Sizes[Key] : number
|
|
96
|
+
} = {
|
|
97
|
+
...Object.fromEntries(spaces),
|
|
98
|
+
...Object.fromEntries(spacesNegative),
|
|
99
|
+
} as any
|
|
100
|
+
|
|
101
|
+
export const zIndex = {
|
|
102
|
+
0: 0,
|
|
103
|
+
1: 100,
|
|
104
|
+
2: 200,
|
|
105
|
+
3: 300,
|
|
106
|
+
4: 400,
|
|
107
|
+
5: 500,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export const colorTokens = {
|
|
111
|
+
light: {
|
|
112
|
+
blue: blue,
|
|
113
|
+
gray: gray,
|
|
114
|
+
green: green,
|
|
115
|
+
orange: orange,
|
|
116
|
+
pink: pink,
|
|
117
|
+
purple: purple,
|
|
118
|
+
red: red,
|
|
119
|
+
yellow: yellow,
|
|
120
|
+
},
|
|
121
|
+
dark: {
|
|
122
|
+
blue: blueDark,
|
|
123
|
+
gray: grayDark,
|
|
124
|
+
green: greenDark,
|
|
125
|
+
orange: orangeDark,
|
|
126
|
+
pink: pinkDark,
|
|
127
|
+
purple: purpleDark,
|
|
128
|
+
red: redDark,
|
|
129
|
+
yellow: yellowDark,
|
|
130
|
+
},
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export const darkColors = {
|
|
134
|
+
...colorTokens.dark.blue,
|
|
135
|
+
...colorTokens.dark.gray,
|
|
136
|
+
...colorTokens.dark.green,
|
|
137
|
+
...colorTokens.dark.orange,
|
|
138
|
+
...colorTokens.dark.pink,
|
|
139
|
+
...colorTokens.dark.purple,
|
|
140
|
+
...colorTokens.dark.red,
|
|
141
|
+
...colorTokens.dark.yellow,
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export const lightColors = {
|
|
145
|
+
...colorTokens.light.blue,
|
|
146
|
+
...colorTokens.light.gray,
|
|
147
|
+
...colorTokens.light.green,
|
|
148
|
+
...colorTokens.light.orange,
|
|
149
|
+
...colorTokens.light.pink,
|
|
150
|
+
...colorTokens.light.purple,
|
|
151
|
+
...colorTokens.light.red,
|
|
152
|
+
...colorTokens.light.yellow,
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export const color = {
|
|
156
|
+
...postfixObjKeys(lightColors, 'Light'),
|
|
157
|
+
...postfixObjKeys(darkColors, 'Dark'),
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function postfixObjKeys<
|
|
161
|
+
A extends { [key: string]: Variable<string> | string },
|
|
162
|
+
B extends string,
|
|
163
|
+
>(
|
|
164
|
+
obj: A,
|
|
165
|
+
postfix: B
|
|
166
|
+
): {
|
|
167
|
+
[Key in `${keyof A extends string ? keyof A : never}${B}`]: Variable<string> | string
|
|
168
|
+
} {
|
|
169
|
+
return Object.fromEntries(
|
|
170
|
+
Object.entries(obj).map(([k, v]) => [`${k}${postfix}`, v])
|
|
171
|
+
) as any
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export const radius = {
|
|
175
|
+
0: 0,
|
|
176
|
+
1: 3,
|
|
177
|
+
2: 5,
|
|
178
|
+
3: 7,
|
|
179
|
+
4: 9,
|
|
180
|
+
true: 9,
|
|
181
|
+
5: 10,
|
|
182
|
+
6: 16,
|
|
183
|
+
7: 19,
|
|
184
|
+
8: 22,
|
|
185
|
+
9: 26,
|
|
186
|
+
10: 34,
|
|
187
|
+
11: 42,
|
|
188
|
+
12: 50,
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export const tokens = createTokens({
|
|
192
|
+
color,
|
|
193
|
+
radius,
|
|
194
|
+
zIndex,
|
|
195
|
+
space,
|
|
196
|
+
size,
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
export type hello = 'asdad'
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export function postfixObjKeys<A extends { [key: string]: string }, B extends string>(
|
|
2
|
+
obj: A,
|
|
3
|
+
postfix: B
|
|
4
|
+
): {
|
|
5
|
+
[Key in `${keyof A extends string ? keyof A : never}${B}`]: string
|
|
6
|
+
} {
|
|
7
|
+
return Object.fromEntries(
|
|
8
|
+
Object.entries(obj).map(([k, v]) => [`${k}${postfix}`, v])
|
|
9
|
+
) as any
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// a bit odd but keeping backward compat for values >8 while fixing below
|
|
13
|
+
export function sizeToSpace(v: number) {
|
|
14
|
+
if (v === 0) return 0
|
|
15
|
+
if (v === 2) return 0.5
|
|
16
|
+
if (v === 4) return 1
|
|
17
|
+
if (v === 8) return 1.5
|
|
18
|
+
if (v <= 16) return Math.round(v * 0.333)
|
|
19
|
+
return Math.floor(v * 0.7 - 12)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function objectFromEntries<ARR_T extends EntriesType>(
|
|
23
|
+
arr: ARR_T
|
|
24
|
+
): EntriesToObject<ARR_T> {
|
|
25
|
+
return Object.fromEntries(arr) as EntriesToObject<ARR_T>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type EntriesType =
|
|
29
|
+
| [PropertyKey, unknown][]
|
|
30
|
+
| ReadonlyArray<readonly [PropertyKey, unknown]>
|
|
31
|
+
|
|
32
|
+
export type DeepWritable<OBJ_T> = { -readonly [P in keyof OBJ_T]: DeepWritable<OBJ_T[P]> }
|
|
33
|
+
export type UnionToIntersection<UNION_T> = // From https://stackoverflow.com/a/50375286
|
|
34
|
+
(UNION_T extends any ? (k: UNION_T) => void : never) extends (k: infer I) => void
|
|
35
|
+
? I
|
|
36
|
+
: never
|
|
37
|
+
|
|
38
|
+
export type UnionObjectFromArrayOfPairs<ARR_T extends EntriesType> =
|
|
39
|
+
DeepWritable<ARR_T> extends (infer R)[]
|
|
40
|
+
? R extends [infer key, infer val]
|
|
41
|
+
? { [prop in key & PropertyKey]: val }
|
|
42
|
+
: never
|
|
43
|
+
: never
|
|
44
|
+
export type MergeIntersectingObjects<ObjT> = { [key in keyof ObjT]: ObjT[key] }
|
|
45
|
+
export type EntriesToObject<ARR_T extends EntriesType> = MergeIntersectingObjects<
|
|
46
|
+
UnionToIntersection<UnionObjectFromArrayOfPairs<ARR_T>>
|
|
47
|
+
>
|
|
48
|
+
|
|
49
|
+
export function objectKeys<O extends object>(obj: O) {
|
|
50
|
+
return Object.keys(obj) as Array<keyof O>
|
|
51
|
+
}
|