reshaped 3.6.0-canary.3 → 3.6.0-canary.5
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/CHANGELOG.md +3 -0
- package/dist/bundle.css +1 -1
- package/dist/bundle.d.ts +1 -0
- package/dist/bundle.js +5 -5
- package/dist/cjs/cli/theming/index.d.ts +3 -3
- package/dist/cjs/cli/theming/index.js +2 -2
- package/dist/cjs/cli/theming/tailwind.d.ts +2 -3
- package/dist/cjs/themes/_generator/definitions/slate.js +1 -1
- package/dist/cjs/themes/_generator/tokens/color/color.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/color/color.transforms.js +29 -7
- package/dist/cjs/themes/_generator/tokens/color/color.types.d.ts +28 -3
- package/dist/cjs/themes/_generator/tokens/color/utilities/a11y.d.ts +20 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/a11y.js +64 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/convert.d.ts +11 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/convert.js +33 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/generateColors.d.ts +4 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/generateColors.js +152 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/generateMetaColors.d.ts +4 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/generateMetaColors.js +68 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/tests/a11y.test.js +38 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/tests/convert.test.d.ts +1 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/tests/convert.test.js +48 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/tests/generateColors.test.d.ts +1 -0
- package/dist/cjs/themes/_generator/tokens/color/utilities/tests/generateColors.test.js +21 -0
- package/dist/{themes/_generator/utilities → cjs/themes/_generator/tokens}/css.d.ts +1 -1
- package/dist/cjs/themes/_generator/tokens/duration/duration.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/duration/duration.transforms.js +2 -2
- package/dist/cjs/themes/_generator/tokens/easing/easing.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/easing/easing.transforms.js +2 -2
- package/dist/cjs/themes/_generator/tokens/font/font.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/font/font.transforms.js +3 -3
- package/dist/cjs/themes/_generator/tokens/fontFamily/fontFamily.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/fontFamily/fontFamily.transforms.js +2 -2
- package/dist/cjs/themes/_generator/tokens/fontWeight/fontWeight.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/fontWeight/fontWeight.transforms.js +2 -2
- package/dist/cjs/themes/_generator/tokens/radius/radius.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/radius/radius.transforms.js +2 -2
- package/dist/cjs/themes/_generator/tokens/shadow/shadow.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/shadow/shadow.transforms.js +4 -4
- package/dist/cjs/themes/_generator/tokens/types.d.ts +19 -17
- package/dist/cjs/themes/_generator/tokens/unit/unit.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/unit/unit.transforms.js +2 -2
- package/dist/cjs/themes/_generator/tokens/unit/utilities/generate.d.ts +5 -0
- package/dist/cjs/themes/_generator/{utilities/generateUnits.js → tokens/unit/utilities/generate.js} +5 -4
- package/dist/cjs/themes/_generator/tokens/viewport/viewport.transforms.d.ts +2 -2
- package/dist/cjs/themes/_generator/tokens/viewport/viewport.transforms.js +2 -2
- package/dist/cjs/themes/_generator/transform.d.ts +3 -2
- package/dist/cjs/themes/_generator/transform.js +39 -11
- package/dist/cjs/themes/_generator/types.d.ts +4 -8
- package/dist/cjs/themes/_generator/utilities/mergeDefinitions.d.ts +1 -3
- package/dist/cjs/themes/_generator/utilities/mergeDefinitions.js +6 -4
- package/dist/cjs/themes/figma/theme.css +1 -1
- package/dist/cjs/themes/fragments/twitter/theme.css +1 -1
- package/dist/cjs/themes/index.d.ts +4 -11
- package/dist/cjs/themes/index.js +2 -5
- package/dist/cjs/themes/reshaped/theme.css +1 -1
- package/dist/cjs/themes/slate/theme.css +1 -1
- package/dist/cjs/types/config.d.ts +11 -7
- package/dist/cli/theming/index.d.ts +3 -3
- package/dist/cli/theming/index.js +2 -2
- package/dist/cli/theming/tailwind.d.ts +2 -3
- package/dist/components/Avatar/Avatar.module.css +1 -1
- package/dist/components/FormControl/FormControl.context.d.ts +1 -1
- package/dist/components/Reshaped/Reshaped.js +2 -2
- package/dist/components/Reshaped/Reshaped.types.d.ts +1 -0
- package/dist/components/Reshaped/tests/Reshaped.stories.d.ts +1 -0
- package/dist/components/Reshaped/tests/Reshaped.stories.js +20 -0
- package/dist/components/Theme/GlobalColorMode.js +6 -11
- package/dist/components/Theme/Theme.types.d.ts +1 -0
- package/dist/components/Theme/index.d.ts +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/tests/ThemesPlayground.d.ts +2 -0
- package/dist/tests/ThemesPlayground.js +90 -0
- package/dist/tests/themes.stories.d.ts +16 -0
- package/dist/{themes/_generator/tests → tests}/themes.stories.js +74 -15
- package/dist/themes/_generator/definitions/slate.js +1 -1
- package/dist/themes/_generator/tokens/color/color.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/color/color.transforms.js +29 -7
- package/dist/themes/_generator/tokens/color/color.types.d.ts +28 -3
- package/dist/themes/_generator/tokens/color/utilities/a11y.d.ts +20 -0
- package/dist/themes/_generator/tokens/color/utilities/a11y.js +58 -0
- package/dist/themes/_generator/tokens/color/utilities/convert.d.ts +11 -0
- package/dist/themes/_generator/tokens/color/utilities/convert.js +27 -0
- package/dist/themes/_generator/tokens/color/utilities/generateColors.d.ts +4 -0
- package/dist/themes/_generator/tokens/color/utilities/generateColors.js +150 -0
- package/dist/themes/_generator/tokens/color/utilities/generateMetaColors.d.ts +4 -0
- package/dist/themes/_generator/tokens/color/utilities/generateMetaColors.js +66 -0
- package/dist/{cjs/themes/_generator/utilities → themes/_generator/tokens}/css.d.ts +1 -1
- package/dist/themes/_generator/tokens/duration/duration.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/duration/duration.transforms.js +2 -2
- package/dist/themes/_generator/tokens/easing/easing.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/easing/easing.transforms.js +2 -2
- package/dist/themes/_generator/tokens/font/font.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/font/font.transforms.js +3 -3
- package/dist/themes/_generator/tokens/fontFamily/fontFamily.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/fontFamily/fontFamily.transforms.js +2 -2
- package/dist/themes/_generator/tokens/fontWeight/fontWeight.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/fontWeight/fontWeight.transforms.js +2 -2
- package/dist/themes/_generator/tokens/radius/radius.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/radius/radius.transforms.js +2 -2
- package/dist/themes/_generator/tokens/shadow/shadow.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/shadow/shadow.transforms.js +4 -4
- package/dist/themes/_generator/tokens/types.d.ts +19 -17
- package/dist/themes/_generator/tokens/unit/unit.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/unit/unit.transforms.js +2 -2
- package/dist/themes/_generator/tokens/unit/utilities/generate.d.ts +5 -0
- package/dist/themes/_generator/{utilities/generateUnits.js → tokens/unit/utilities/generate.js} +4 -5
- package/dist/themes/_generator/tokens/viewport/viewport.transforms.d.ts +2 -2
- package/dist/themes/_generator/tokens/viewport/viewport.transforms.js +2 -2
- package/dist/themes/_generator/transform.d.ts +3 -2
- package/dist/themes/_generator/transform.js +39 -11
- package/dist/themes/_generator/types.d.ts +4 -8
- package/dist/themes/_generator/utilities/mergeDefinitions.d.ts +1 -3
- package/dist/themes/_generator/utilities/mergeDefinitions.js +6 -4
- package/dist/themes/figma/theme.css +1 -1
- package/dist/themes/fragments/twitter/theme.css +1 -1
- package/dist/themes/index.d.ts +4 -11
- package/dist/themes/index.js +1 -4
- package/dist/themes/reshaped/theme.css +1 -1
- package/dist/themes/slate/theme.css +1 -1
- package/dist/types/config.d.ts +11 -7
- package/dist/types/global.d.ts +3 -0
- package/package.json +11 -11
- package/dist/cjs/themes/_generator/utilities/color.d.ts +0 -105
- package/dist/cjs/themes/_generator/utilities/color.js +0 -409
- package/dist/cjs/themes/_generator/utilities/generateBackgroundColors.d.ts +0 -4
- package/dist/cjs/themes/_generator/utilities/generateBackgroundColors.js +0 -59
- package/dist/cjs/themes/_generator/utilities/generateColors.d.ts +0 -11
- package/dist/cjs/themes/_generator/utilities/generateColors.js +0 -178
- package/dist/cjs/themes/_generator/utilities/generateUnits.d.ts +0 -4
- package/dist/cjs/themes/_generator/utilities/mergeDeep.d.ts +0 -5
- package/dist/cjs/themes/_generator/utilities/mergeDeep.js +0 -24
- package/dist/cjs/themes/_generator/utilities/resolveTokenReference.d.ts +0 -3
- package/dist/cjs/themes/_generator/utilities/resolveTokenReference.js +0 -18
- package/dist/cjs/themes/_generator/utilities/tests/color.test.js +0 -81
- package/dist/themes/_generator/tests/themes.stories.d.ts +0 -16
- package/dist/themes/_generator/utilities/color.d.ts +0 -105
- package/dist/themes/_generator/utilities/color.js +0 -377
- package/dist/themes/_generator/utilities/generateBackgroundColors.d.ts +0 -4
- package/dist/themes/_generator/utilities/generateBackgroundColors.js +0 -57
- package/dist/themes/_generator/utilities/generateColors.d.ts +0 -11
- package/dist/themes/_generator/utilities/generateColors.js +0 -176
- package/dist/themes/_generator/utilities/generateUnits.d.ts +0 -4
- package/dist/themes/_generator/utilities/mergeDeep.d.ts +0 -5
- package/dist/themes/_generator/utilities/mergeDeep.js +0 -22
- package/dist/themes/_generator/utilities/resolveTokenReference.d.ts +0 -3
- package/dist/themes/_generator/utilities/resolveTokenReference.js +0 -16
- /package/dist/cjs/themes/_generator/{utilities/tests/color.test.d.ts → tokens/color/utilities/tests/a11y.test.d.ts} +0 -0
- /package/dist/cjs/themes/_generator/{utilities → tokens}/css.js +0 -0
- /package/dist/themes/_generator/{utilities → tokens}/css.js +0 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
import { type Oklch } from "culori/fn";
|
2
|
+
import type * as TColor from "../color.types";
|
3
|
+
export declare const hexToOklch: (hex: string) => Oklch;
|
4
|
+
export declare const oklchToRgb: (oklch: Oklch) => {
|
5
|
+
r: number;
|
6
|
+
g: number;
|
7
|
+
b: number;
|
8
|
+
mode: "rgb";
|
9
|
+
alpha?: number;
|
10
|
+
};
|
11
|
+
export declare const tokenToOklchToken: (token: TColor.Token) => TColor.InternalToken;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { useMode, modeOklch, formatHex, modeRgb } from "culori/fn";
|
2
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
3
|
+
const oklch = useMode(modeOklch);
|
4
|
+
// eslint-disable-next-line react-hooks/rules-of-hooks
|
5
|
+
const rgb = useMode(modeRgb);
|
6
|
+
export const hexToOklch = (hex) => {
|
7
|
+
const result = oklch(formatHex(hex));
|
8
|
+
if (!result)
|
9
|
+
throw new Error(`[Reshaped] Can't convert ${hex} to oklch`);
|
10
|
+
return result;
|
11
|
+
};
|
12
|
+
export const oklchToRgb = (oklch) => {
|
13
|
+
const value = rgb(oklch);
|
14
|
+
return {
|
15
|
+
...value,
|
16
|
+
r: Number(value.r.toFixed(4)),
|
17
|
+
g: Number(value.g.toFixed(4)),
|
18
|
+
b: Number(value.b.toFixed(4)),
|
19
|
+
};
|
20
|
+
};
|
21
|
+
export const tokenToOklchToken = (token) => {
|
22
|
+
const hexDarkFallback = token.hexDark ? hexToOklch(token.hexDark) : undefined;
|
23
|
+
return {
|
24
|
+
oklch: token.oklch ? { ...token.oklch, mode: "oklch" } : hexToOklch(token.hex),
|
25
|
+
oklchDark: token.oklchDark ? { ...token.oklchDark, mode: "oklch" } : hexDarkFallback,
|
26
|
+
};
|
27
|
+
};
|
@@ -0,0 +1,150 @@
|
|
1
|
+
import { hexToOklch, tokenToOklchToken } from "./convert.js";
|
2
|
+
const parseColor = (color) => {
|
3
|
+
const isString = typeof color === "string";
|
4
|
+
if (!isString && "oklch" in color && color.oklch) {
|
5
|
+
return {
|
6
|
+
light: color.oklch,
|
7
|
+
dark: color.oklchDark,
|
8
|
+
};
|
9
|
+
}
|
10
|
+
const hexLight = isString ? color : color.hex;
|
11
|
+
const hexDark = isString ? undefined : color.hexDark;
|
12
|
+
const light = hexToOklch(hexLight);
|
13
|
+
const dark = hexDark ? hexToOklch(hexDark) : undefined;
|
14
|
+
if (!light) {
|
15
|
+
throw new Error(`[Reshaped] Failed when parsing color: ${JSON.stringify(color)}`);
|
16
|
+
}
|
17
|
+
return { light, dark };
|
18
|
+
};
|
19
|
+
const getDarkModeColor = (lch) => {
|
20
|
+
const { l, c } = lch;
|
21
|
+
// Top boundary at which background colors are perceived as vibrant
|
22
|
+
const vibrancyThreshold = 0.25;
|
23
|
+
// A linear modifier of how gray a color is, gray = 1, vibrant = 0
|
24
|
+
const neutralFactor = Math.min(1, Math.max(0, (vibrancyThreshold - c) / vibrancyThreshold));
|
25
|
+
// Non-linear modification to make gray color inversion progress faster
|
26
|
+
const easedVibrancy = 1 - Math.pow(neutralFactor, 2);
|
27
|
+
const invertedL = 1 - l;
|
28
|
+
// Take plain inversion and increase it back by vibrancy modifier
|
29
|
+
// Vibrant colors should get back to almost the original value
|
30
|
+
// while non-briant colors should lean towards full inversion
|
31
|
+
// Example:
|
32
|
+
// Black should become white in dark mode
|
33
|
+
// Light gray should become dark gray
|
34
|
+
// Vibrant blue should stay vibrant blue
|
35
|
+
const darkL = invertedL + (l - invertedL) * easedVibrancy;
|
36
|
+
// Make sure dark mode value doesn't become too dark and is still visible on dark page background
|
37
|
+
const clampedDarkL = Math.max(0.36, darkL);
|
38
|
+
return { ...lch, c: c * 0.8, l: clampedDarkL };
|
39
|
+
};
|
40
|
+
const generateColorValues = (key, token) => {
|
41
|
+
const { light: bg, dark } = parseColor(token);
|
42
|
+
const capitalizedKey = key.charAt(0).toUpperCase() + key.slice(1);
|
43
|
+
const neutral = key === "neutral";
|
44
|
+
const warning = key === "warning";
|
45
|
+
const bgDark = dark || getDarkModeColor(bg);
|
46
|
+
const bgFaded = {
|
47
|
+
...bg,
|
48
|
+
l: 0.97,
|
49
|
+
c: neutral ? 0.005 : warning ? 0.04 : 0.02,
|
50
|
+
};
|
51
|
+
const bgFadedDark = {
|
52
|
+
...bgDark,
|
53
|
+
l: 0.25,
|
54
|
+
// For primary color with low chroma, we still have to make sure it stays low
|
55
|
+
c: neutral ? 0.01 : bgDark.c / 5,
|
56
|
+
};
|
57
|
+
const fg = neutral ? { ...bg, l: 0.2 } : { ...bg, l: 0.5 };
|
58
|
+
const fgDark = neutral ? { ...bgDark, l: 0.96 } : { ...bgDark, l: 0.75, c: bg.c * 0.85 };
|
59
|
+
const bd = neutral ? { ...bg, l: 0, alpha: 0.12 } : { ...bg, l: bg.l - 0.08 };
|
60
|
+
const bdDark = neutral ? { ...bgDark, l: 1, alpha: 0.16 } : { ...bgDark, l: bgDark.l + 0.08 };
|
61
|
+
const bdFaded = neutral
|
62
|
+
? { ...bgFaded, l: 0, alpha: 0.08 }
|
63
|
+
: { ...bgFaded, l: bgFaded.l - 0.05, c: bgFaded.c + 0.01 };
|
64
|
+
const bdFadedDark = neutral
|
65
|
+
? { ...bgFadedDark, l: 1, alpha: 0.08 }
|
66
|
+
: { ...bgFadedDark, l: bgFadedDark.l + 0.1 };
|
67
|
+
const output = {
|
68
|
+
[`background${capitalizedKey}`]: {
|
69
|
+
oklch: bg,
|
70
|
+
oklchDark: bgDark,
|
71
|
+
},
|
72
|
+
[`background${capitalizedKey}Faded`]: {
|
73
|
+
oklch: bgFaded,
|
74
|
+
oklchDark: bgFadedDark,
|
75
|
+
},
|
76
|
+
[`border${capitalizedKey}`]: {
|
77
|
+
oklch: bd,
|
78
|
+
oklchDark: bdDark,
|
79
|
+
},
|
80
|
+
[`border${capitalizedKey}Faded`]: {
|
81
|
+
oklch: bdFaded,
|
82
|
+
oklchDark: bdFadedDark,
|
83
|
+
},
|
84
|
+
[`foreground${capitalizedKey}`]: {
|
85
|
+
oklch: fg,
|
86
|
+
oklchDark: fgDark,
|
87
|
+
},
|
88
|
+
};
|
89
|
+
if (neutral) {
|
90
|
+
output[`foreground${capitalizedKey}Faded`] = {
|
91
|
+
oklch: { ...fg, l: fg.l + 0.25 },
|
92
|
+
oklchDark: { ...fgDark, l: fgDark.l - 0.15 },
|
93
|
+
};
|
94
|
+
output[`backgroundDisabled`] = {
|
95
|
+
oklch: { ...bg, l: 0.95, c: 0 },
|
96
|
+
oklchDark: { ...bgDark, l: 0.28, c: 0 },
|
97
|
+
};
|
98
|
+
output[`backgroundDisabledFaded`] = {
|
99
|
+
oklch: { ...bg, l: 0.98, c: 0 },
|
100
|
+
oklchDark: { ...bgDark, l: 0.23, c: 0 },
|
101
|
+
};
|
102
|
+
output[`borderDisabled`] = {
|
103
|
+
oklch: { ...bd, alpha: 0.06 },
|
104
|
+
oklchDark: { ...bgDark, l: 0.28, c: 0 },
|
105
|
+
};
|
106
|
+
output[`foregroundDisabled`] = {
|
107
|
+
oklch: { ...fg, l: 0.84, c: 0 },
|
108
|
+
oklchDark: { ...fgDark, l: 0.4, c: 0 },
|
109
|
+
};
|
110
|
+
output[`backgroundElevationBase`] = {
|
111
|
+
oklch: { ...bg, l: 1, c: 0 },
|
112
|
+
oklchDark: { ...bgDark, l: 0.2, c: 0 },
|
113
|
+
};
|
114
|
+
output[`backgroundElevationRaised`] = {
|
115
|
+
oklch: { ...bg, l: 1, c: 0 },
|
116
|
+
oklchDark: { ...bgDark, l: 0.21, c: 0 },
|
117
|
+
};
|
118
|
+
output[`backgroundElevationOverlay`] = {
|
119
|
+
oklch: { ...bg, l: 1, c: 0 },
|
120
|
+
oklchDark: { ...bgDark, l: 0.22, c: 0 },
|
121
|
+
};
|
122
|
+
output[`backgroundPage`] = {
|
123
|
+
oklch: { ...bg, l: 1, c: 0 },
|
124
|
+
oklchDark: { ...bgDark, l: 0.16, c: 0 },
|
125
|
+
};
|
126
|
+
output[`backgroundPageFaded`] = {
|
127
|
+
oklch: { ...bg, l: 0.97, c: 0 },
|
128
|
+
oklchDark: { ...bgDark, l: 0.18, c: 0 },
|
129
|
+
};
|
130
|
+
}
|
131
|
+
return output;
|
132
|
+
};
|
133
|
+
const getOklchToken = (color) => {
|
134
|
+
const token = typeof color === "string" ? { hex: color } : color;
|
135
|
+
return tokenToOklchToken(token);
|
136
|
+
};
|
137
|
+
const generateColors = (args = {}) => {
|
138
|
+
const { primary = { oklch: { l: 0.55, c: 0.24, h: 262.67 } }, critical = { oklch: { l: 0.59, c: 0.22, h: 26.97 } }, warning = { oklch: { l: 0.86, c: 0.18, h: 89.84 } }, positive = { oklch: { l: 0.53, c: 0.13, h: 153.78 } }, neutral = { oklch: { l: 0.92, c: 0.01, h: 262.67 } }, brand, } = args;
|
139
|
+
return {
|
140
|
+
...generateColorValues("primary", getOklchToken(primary)),
|
141
|
+
...generateColorValues("critical", getOklchToken(critical)),
|
142
|
+
...generateColorValues("warning", getOklchToken(warning)),
|
143
|
+
...generateColorValues("positive", getOklchToken(positive)),
|
144
|
+
...generateColorValues("neutral", getOklchToken(neutral)),
|
145
|
+
brand: getOklchToken(brand || primary),
|
146
|
+
white: getOklchToken("#ffffff"),
|
147
|
+
black: getOklchToken("#000000"),
|
148
|
+
};
|
149
|
+
};
|
150
|
+
export default generateColors;
|
@@ -0,0 +1,4 @@
|
|
1
|
+
import type * as T from "../../../types";
|
2
|
+
import { GeneratedThemeDefinition, PassedThemeDefinition } from "../../types";
|
3
|
+
declare const generateMetaColors: (definition: PassedThemeDefinition, themeOptions?: T.PublicOptions["themeOptions"]) => GeneratedThemeDefinition["color"] | undefined;
|
4
|
+
export default generateMetaColors;
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import { capitalize } from "../../../../../utilities/string.js";
|
2
|
+
import { bgWithDynamicForeground } from "../../../constants.js";
|
3
|
+
import { hexToOklch, oklchToRgb, tokenToOklchToken } from "./convert.js";
|
4
|
+
import { getOnColor } from "./a11y.js";
|
5
|
+
const whiteColor = hexToOklch("#ffffff");
|
6
|
+
const blackColor = hexToOklch("#000000");
|
7
|
+
const generateMetaColors = (definition, themeOptions = {}) => {
|
8
|
+
if (!definition.color)
|
9
|
+
return;
|
10
|
+
const { onColorValues = {}, colorContrastAlgorithm } = themeOptions;
|
11
|
+
const result = {};
|
12
|
+
Object.keys(definition.color).forEach((tokenName) => {
|
13
|
+
const bgToken = definition.color?.[tokenName];
|
14
|
+
const generatedForegroundName = `on${capitalize(tokenName)}`;
|
15
|
+
const generatedRGBName = `rgb${capitalize(tokenName)}`;
|
16
|
+
const generateOnColorsFor = [
|
17
|
+
...bgWithDynamicForeground,
|
18
|
+
...(themeOptions?.generateOnColorsFor || []),
|
19
|
+
];
|
20
|
+
const needsDynamicForeground = generateOnColorsFor.includes(tokenName) && !definition.color?.[generatedForegroundName];
|
21
|
+
const needsRGB = tokenName.startsWith("background") ||
|
22
|
+
tokenName.endsWith("black") ||
|
23
|
+
tokenName.endsWith("white");
|
24
|
+
if (!bgToken)
|
25
|
+
return;
|
26
|
+
const oklchBgToken = tokenToOklchToken(bgToken);
|
27
|
+
if (needsDynamicForeground) {
|
28
|
+
const overrideKeys = Object.keys(onColorValues);
|
29
|
+
const onColorKey = overrideKeys.find((key) => tokenName.toLowerCase().includes(key));
|
30
|
+
const onColor = onColorKey && onColorValues[onColorKey];
|
31
|
+
const lightColor = onColor && "hexLight" in onColor
|
32
|
+
? hexToOklch(onColor.hexLight)
|
33
|
+
: onColor?.oklchLight || whiteColor;
|
34
|
+
const darkColor = onColor && "hexDark" in onColor
|
35
|
+
? hexToOklch(onColor.hexDark)
|
36
|
+
: onColor?.oklchDark || blackColor;
|
37
|
+
const light = getOnColor({
|
38
|
+
bgColor: oklchBgToken.oklch,
|
39
|
+
lightColor: { ...lightColor, mode: "oklch" },
|
40
|
+
darkColor: { ...darkColor, mode: "oklch" },
|
41
|
+
algorithm: colorContrastAlgorithm,
|
42
|
+
});
|
43
|
+
const dark = oklchBgToken.oklchDark &&
|
44
|
+
getOnColor({
|
45
|
+
bgColor: oklchBgToken.oklchDark,
|
46
|
+
lightColor: { ...lightColor, mode: "oklch" },
|
47
|
+
darkColor: { ...darkColor, mode: "oklch" },
|
48
|
+
algorithm: colorContrastAlgorithm,
|
49
|
+
});
|
50
|
+
result[generatedForegroundName] = {
|
51
|
+
oklch: light,
|
52
|
+
oklchDark: dark,
|
53
|
+
};
|
54
|
+
}
|
55
|
+
if (needsRGB) {
|
56
|
+
const rgb = oklchToRgb(oklchBgToken.oklch);
|
57
|
+
const rgbDark = oklchBgToken.oklchDark && oklchToRgb(oklchBgToken.oklchDark);
|
58
|
+
result[generatedRGBName] = {
|
59
|
+
hex: `${rgb.r * 255}, ${rgb.g * 255}, ${rgb.b * 255}`,
|
60
|
+
hexDark: rgbDark && `${rgbDark.r * 255}, ${rgbDark.g * 255}, ${rgbDark.b * 255}`,
|
61
|
+
};
|
62
|
+
}
|
63
|
+
});
|
64
|
+
return result;
|
65
|
+
};
|
66
|
+
export default generateMetaColors;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type * as T from "
|
1
|
+
import type * as T from "./types";
|
2
2
|
export declare const getVariableName: (tokenName: string, tokenType?: string) => string;
|
3
3
|
export declare const createVariable: (token: T.TransformedToken) => string;
|
4
4
|
export declare const createMedia: (token: T.TransformedToken) => string;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const
|
1
|
+
const transformToken = (name, token) => [
|
2
2
|
{
|
3
3
|
name,
|
4
4
|
tokenType: "duration",
|
@@ -6,4 +6,4 @@ const transformedToken = (name, token) => [
|
|
6
6
|
value: `${token.ms}ms`,
|
7
7
|
},
|
8
8
|
];
|
9
|
-
export default
|
9
|
+
export default transformToken;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const
|
1
|
+
const transformToken = (name, token) => [
|
2
2
|
{
|
3
3
|
name,
|
4
4
|
tokenType: "easing",
|
@@ -6,4 +6,4 @@ const transformedToken = (name, token) => [
|
|
6
6
|
value: `cubic-bezier(${token.x1}, ${token.y1}, ${token.x2}, ${token.y2})`,
|
7
7
|
},
|
8
8
|
];
|
9
|
-
export default
|
9
|
+
export default transformToken;
|
@@ -1,6 +1,6 @@
|
|
1
|
-
import { getVariableName } from "
|
1
|
+
import { getVariableName } from "../css.js";
|
2
2
|
const BASE_REM_SIZE = 16;
|
3
|
-
const
|
3
|
+
const transformToken = (name, token) => {
|
4
4
|
const result = [];
|
5
5
|
result.push({
|
6
6
|
name,
|
@@ -38,4 +38,4 @@ const transformedToken = (name, token) => {
|
|
38
38
|
});
|
39
39
|
return result;
|
40
40
|
};
|
41
|
-
export default
|
41
|
+
export default transformToken;
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import type * as T from "./fontFamily.types";
|
2
2
|
import type { Transformer } from "../types";
|
3
|
-
declare const
|
4
|
-
export default
|
3
|
+
declare const transformToken: Transformer<T.Token>;
|
4
|
+
export default transformToken;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const
|
1
|
+
const transformToken = (name, token) => [
|
2
2
|
{
|
3
3
|
name,
|
4
4
|
tokenType: "fontFamily",
|
@@ -6,4 +6,4 @@ const transformedToken = (name, token) => [
|
|
6
6
|
value: `${token.family}`,
|
7
7
|
},
|
8
8
|
];
|
9
|
-
export default
|
9
|
+
export default transformToken;
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import type * as T from "./fontWeight.types";
|
2
2
|
import type { Transformer } from "../types";
|
3
|
-
declare const
|
4
|
-
export default
|
3
|
+
declare const transformToken: Transformer<T.Token>;
|
4
|
+
export default transformToken;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const
|
1
|
+
const transformToken = (name, token) => [
|
2
2
|
{
|
3
3
|
name,
|
4
4
|
tokenType: "fontWeight",
|
@@ -6,4 +6,4 @@ const transformedToken = (name, token) => [
|
|
6
6
|
value: token.weight.toString(),
|
7
7
|
},
|
8
8
|
];
|
9
|
-
export default
|
9
|
+
export default transformToken;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const
|
1
|
+
const transformToken = (name, token) => [
|
2
2
|
{
|
3
3
|
name,
|
4
4
|
tokenType: "radius",
|
@@ -6,4 +6,4 @@ const transformedToken = (name, token) => [
|
|
6
6
|
value: `${token.px}px`,
|
7
7
|
},
|
8
8
|
];
|
9
|
-
export default
|
9
|
+
export default transformToken;
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import {
|
2
|
-
const
|
1
|
+
import { hexToOklch, oklchToRgb } from "../color/utilities/convert.js";
|
2
|
+
const transformToken = (name, token, theme) => [
|
3
3
|
{
|
4
4
|
name,
|
5
5
|
tokenType: "shadow",
|
@@ -9,7 +9,7 @@ const transformedToken = (name, token, theme) => [
|
|
9
9
|
const blur = ` ${value.blurRadius || 0}px`;
|
10
10
|
const spread = ` ${value.spreadRadius || 0}px`;
|
11
11
|
const colorRef = theme.color[value.colorToken];
|
12
|
-
const rgb =
|
12
|
+
const rgb = oklchToRgb(hexToOklch(colorRef?.hex || "#000000"));
|
13
13
|
const rgbString = `${rgb.r}, ${rgb.g}, ${rgb.b}`;
|
14
14
|
const color = `rgba(${rgbString}, ${value.opacity || 1})`;
|
15
15
|
return `${value.offsetX}px ${value.offsetY}px${blur}${spread} ${color}`;
|
@@ -17,4 +17,4 @@ const transformedToken = (name, token, theme) => [
|
|
17
17
|
.join(", "),
|
18
18
|
},
|
19
19
|
];
|
20
|
-
export default
|
20
|
+
export default transformToken;
|
@@ -8,11 +8,14 @@ import type * as TShadow from "./shadow/shadow.types";
|
|
8
8
|
import type * as TUnit from "./unit/unit.types";
|
9
9
|
import type * as TRadius from "./radius/radius.types";
|
10
10
|
import type * as TViewport from "./viewport/viewport.types";
|
11
|
+
import { PartialDeep } from "../types";
|
11
12
|
export type TokenType = "fontFamily" | "fontWeight" | "unit" | "radius" | "viewport" | "font" | "color" | "duration" | "easing" | "shadow";
|
12
|
-
export type ColorHue = "primary" | "positive" | "critical" | "neutral";
|
13
13
|
type TokenSet<Name extends string, Token> = Record<Name, Token> & {
|
14
14
|
[tokenName: string]: Token;
|
15
15
|
};
|
16
|
+
/**
|
17
|
+
* Internal theme definition with all required tokens
|
18
|
+
*/
|
16
19
|
export type ThemeDefinition = {
|
17
20
|
unit: TokenSet<TUnit.Name, TUnit.Token>;
|
18
21
|
radius: TokenSet<TRadius.Name, TRadius.Token>;
|
@@ -25,22 +28,21 @@ export type ThemeDefinition = {
|
|
25
28
|
shadow: TokenSet<TShadow.Name, TShadow.Token>;
|
26
29
|
viewport: Record<Exclude<TViewport.Name, "s">, TViewport.Token>;
|
27
30
|
};
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
color?: Partial<ThemeDefinition["color"]>;
|
35
|
-
duration?: Partial<ThemeDefinition["duration"]>;
|
36
|
-
easing?: Partial<ThemeDefinition["easing"]>;
|
37
|
-
shadow?: Partial<ThemeDefinition["shadow"]>;
|
38
|
-
viewport?: Partial<ThemeDefinition["viewport"]>;
|
31
|
+
/**
|
32
|
+
* Externally configured theme which might override just some of the tokens
|
33
|
+
* but also might include custom "on" colors
|
34
|
+
*/
|
35
|
+
export type PassedThemeDefinition = Omit<PartialDeep<ThemeDefinition>, "color"> & {
|
36
|
+
color?: Partial<TokenSet<TColor.Name | TColor.GeneratedOnName, TColor.Token>>;
|
39
37
|
};
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
/**
|
39
|
+
* Theme generation output which includes all generated tokens
|
40
|
+
* but might not include some of the tokens when used for theme fragments
|
41
|
+
*/
|
42
|
+
export type GeneratedThemeDefinition = Omit<PassedThemeDefinition, "color" | "unit" | "viewport"> & {
|
43
|
+
color: Partial<TokenSet<TColor.GeneratedOnName | TColor.GeneratedRGBName | TColor.Name, TColor.Token>>;
|
44
|
+
unit: Partial<TokenSet<TUnit.GeneratedName | TUnit.Name, TUnit.Token>>;
|
45
|
+
viewport: Partial<TokenSet<TViewport.Name, TViewport.Token | TViewport.SToken>>;
|
44
46
|
};
|
45
47
|
export type TransformedToken = {
|
46
48
|
name: string;
|
@@ -51,5 +53,5 @@ export type TransformedToken = {
|
|
51
53
|
private?: boolean;
|
52
54
|
viewport?: string;
|
53
55
|
};
|
54
|
-
export type Transformer<Token> = (name: string, token: Token, theme:
|
56
|
+
export type Transformer<Token> = (name: string, token: Token, theme: GeneratedThemeDefinition) => TransformedToken[];
|
55
57
|
export {};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const
|
1
|
+
const transformToken = (name, token) => [
|
2
2
|
{
|
3
3
|
name,
|
4
4
|
tokenType: "unit",
|
@@ -6,4 +6,4 @@ const transformedToken = (name, token) => [
|
|
6
6
|
value: `${token.px}px`,
|
7
7
|
},
|
8
8
|
];
|
9
|
-
export default
|
9
|
+
export default transformToken;
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import type { PassedThemeDefinition } from "../../types";
|
2
|
+
import type { GeneratedName as GeneratedUnitName } from "../unit.types";
|
3
|
+
export declare const generateUnits: (definition: PassedThemeDefinition) => Partial<Partial<Record<"base" | GeneratedUnitName, import("../unit.types").Token> & {
|
4
|
+
[tokenName: string]: import("../unit.types").Token;
|
5
|
+
}>> | undefined;
|
package/dist/themes/_generator/{utilities/generateUnits.js → tokens/unit/utilities/generate.js}
RENAMED
@@ -1,13 +1,12 @@
|
|
1
|
-
const generateUnits = (definition) => {
|
1
|
+
export const generateUnits = (definition) => {
|
2
|
+
const result = {};
|
2
3
|
const baseValue = definition.unit?.base?.px;
|
3
4
|
// If base value hasn't changed, we don't need to regenerate tokens
|
4
5
|
if (!baseValue)
|
5
6
|
return;
|
6
7
|
for (let i = 1; i <= 10; i += 1) {
|
7
8
|
const generatedName = `x${i}`;
|
8
|
-
|
9
|
-
px: baseValue * i,
|
10
|
-
};
|
9
|
+
result[generatedName] = { px: baseValue * i };
|
11
10
|
}
|
11
|
+
return result;
|
12
12
|
};
|
13
|
-
export default generateUnits;
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import type * as T from "./viewport.types";
|
2
2
|
import type { Transformer } from "../types";
|
3
|
-
declare const
|
4
|
-
export default
|
3
|
+
declare const transformToken: Transformer<T.Token | T.SToken>;
|
4
|
+
export default transformToken;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
const
|
1
|
+
const transformToken = (name, token) => {
|
2
2
|
const value = [];
|
3
3
|
if (token.minPx)
|
4
4
|
value.push(`(min-width: ${token.minPx}px)`);
|
@@ -22,4 +22,4 @@ const transformedToken = (name, token) => {
|
|
22
22
|
}
|
23
23
|
return result;
|
24
24
|
};
|
25
|
-
export default
|
25
|
+
export default transformToken;
|
@@ -1,7 +1,8 @@
|
|
1
1
|
import type * as T from "./types";
|
2
|
-
import type {
|
3
|
-
declare const transform: (name: string, definition:
|
2
|
+
import type { PassedThemeDefinition, GeneratedThemeDefinition } from "./tokens/types";
|
3
|
+
declare const transform: (name: string, definition: PassedThemeDefinition, options: T.PrivateOptions) => {
|
4
4
|
variables: string;
|
5
5
|
media: string | undefined;
|
6
|
+
theme: GeneratedThemeDefinition;
|
6
7
|
};
|
7
8
|
export default transform;
|
@@ -1,25 +1,52 @@
|
|
1
1
|
import * as transforms from "./tokens/transforms.js";
|
2
|
-
import { variablesTemplate, mediaTemplate } from "./
|
3
|
-
import
|
4
|
-
import
|
2
|
+
import { variablesTemplate, mediaTemplate } from "./tokens/css.js";
|
3
|
+
import { generateUnits } from "./tokens/unit/utilities/generate.js";
|
4
|
+
import generateMetaColors from "./tokens/color/utilities/generateMetaColors.js";
|
5
|
+
import { formatHex } from "culori/fn";
|
5
6
|
const transform = (name, definition, options) => {
|
6
7
|
const { isFragment, themeOptions } = options;
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
const generatedUnits = isFragment ? {} : generateUnits(definition);
|
9
|
+
const generatedViewports = definition.viewport?.m?.minPx
|
10
|
+
? { s: { maxPx: definition.viewport.m.minPx - 1 } }
|
11
|
+
: {};
|
12
|
+
const generatedMetaColors = generateMetaColors(definition, themeOptions);
|
13
|
+
const generatedColors = Object.entries({
|
14
|
+
...definition.color,
|
15
|
+
...generatedMetaColors,
|
16
|
+
}).reduce((res, [key, token]) => {
|
17
|
+
const next = { ...token };
|
18
|
+
if (!token)
|
19
|
+
return res;
|
20
|
+
if (!token.hex && token.oklch) {
|
21
|
+
next.hex = formatHex({ ...token.oklch, mode: "oklch" });
|
22
|
+
}
|
23
|
+
if (!token.hexDark && token.oklchDark) {
|
24
|
+
next.hexDark = formatHex({ ...token.oklchDark, mode: "oklch" });
|
25
|
+
}
|
26
|
+
return { ...res, [key]: next };
|
27
|
+
}, {});
|
28
|
+
const theme = {
|
29
|
+
...definition,
|
30
|
+
color: generatedColors,
|
31
|
+
unit: {
|
32
|
+
...definition.unit,
|
33
|
+
...generatedUnits,
|
34
|
+
},
|
35
|
+
viewport: {
|
36
|
+
...definition.viewport,
|
37
|
+
...generatedViewports,
|
38
|
+
},
|
39
|
+
};
|
13
40
|
const transformedStorage = {
|
14
41
|
variable: [],
|
15
42
|
media: [],
|
16
43
|
};
|
17
|
-
Object.entries(
|
44
|
+
Object.entries(theme).forEach(([tokenType, tokenValues]) => {
|
18
45
|
if (!tokenValues)
|
19
46
|
return;
|
20
47
|
const transform = transforms.css[tokenType];
|
21
48
|
Object.entries(tokenValues).forEach(([tokenName, token]) => {
|
22
|
-
const transformedTokens = transform(tokenName, token,
|
49
|
+
const transformedTokens = transform(tokenName, token, theme);
|
23
50
|
transformedTokens.forEach((transformedToken) => {
|
24
51
|
transformedStorage[transformedToken.type].push(transformedToken);
|
25
52
|
});
|
@@ -28,6 +55,7 @@ const transform = (name, definition, options) => {
|
|
28
55
|
return {
|
29
56
|
variables: variablesTemplate(name, transformedStorage.variable),
|
30
57
|
media: !isFragment ? mediaTemplate(transformedStorage.media) : undefined,
|
58
|
+
theme,
|
31
59
|
};
|
32
60
|
};
|
33
61
|
export default transform;
|