reshaped 3.6.0-canary.4 → 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.
Files changed (137) hide show
  1. package/dist/cjs/cli/theming/index.d.ts +3 -3
  2. package/dist/cjs/cli/theming/index.js +2 -2
  3. package/dist/cjs/cli/theming/tailwind.d.ts +2 -3
  4. package/dist/cjs/themes/_generator/definitions/slate.js +1 -1
  5. package/dist/cjs/themes/_generator/tokens/color/color.transforms.d.ts +2 -2
  6. package/dist/cjs/themes/_generator/tokens/color/color.transforms.js +29 -7
  7. package/dist/cjs/themes/_generator/tokens/color/color.types.d.ts +28 -3
  8. package/dist/cjs/themes/_generator/tokens/color/utilities/a11y.d.ts +20 -0
  9. package/dist/cjs/themes/_generator/tokens/color/utilities/a11y.js +64 -0
  10. package/dist/cjs/themes/_generator/tokens/color/utilities/convert.d.ts +11 -0
  11. package/dist/cjs/themes/_generator/tokens/color/utilities/convert.js +33 -0
  12. package/dist/cjs/themes/_generator/tokens/color/utilities/generateColors.d.ts +4 -0
  13. package/dist/cjs/themes/_generator/tokens/color/utilities/generateColors.js +152 -0
  14. package/dist/cjs/themes/_generator/tokens/color/utilities/generateMetaColors.d.ts +4 -0
  15. package/dist/cjs/themes/_generator/tokens/color/utilities/generateMetaColors.js +68 -0
  16. package/dist/cjs/themes/_generator/tokens/color/utilities/tests/a11y.test.js +38 -0
  17. package/dist/cjs/themes/_generator/tokens/color/utilities/tests/convert.test.d.ts +1 -0
  18. package/dist/cjs/themes/_generator/tokens/color/utilities/tests/convert.test.js +48 -0
  19. package/dist/cjs/themes/_generator/tokens/color/utilities/tests/generateColors.test.d.ts +1 -0
  20. package/dist/cjs/themes/_generator/tokens/color/utilities/tests/generateColors.test.js +21 -0
  21. package/dist/{themes/_generator/utilities → cjs/themes/_generator/tokens}/css.d.ts +1 -1
  22. package/dist/cjs/themes/_generator/tokens/duration/duration.transforms.d.ts +2 -2
  23. package/dist/cjs/themes/_generator/tokens/duration/duration.transforms.js +2 -2
  24. package/dist/cjs/themes/_generator/tokens/easing/easing.transforms.d.ts +2 -2
  25. package/dist/cjs/themes/_generator/tokens/easing/easing.transforms.js +2 -2
  26. package/dist/cjs/themes/_generator/tokens/font/font.transforms.d.ts +2 -2
  27. package/dist/cjs/themes/_generator/tokens/font/font.transforms.js +3 -3
  28. package/dist/cjs/themes/_generator/tokens/fontFamily/fontFamily.transforms.d.ts +2 -2
  29. package/dist/cjs/themes/_generator/tokens/fontFamily/fontFamily.transforms.js +2 -2
  30. package/dist/cjs/themes/_generator/tokens/fontWeight/fontWeight.transforms.d.ts +2 -2
  31. package/dist/cjs/themes/_generator/tokens/fontWeight/fontWeight.transforms.js +2 -2
  32. package/dist/cjs/themes/_generator/tokens/radius/radius.transforms.d.ts +2 -2
  33. package/dist/cjs/themes/_generator/tokens/radius/radius.transforms.js +2 -2
  34. package/dist/cjs/themes/_generator/tokens/shadow/shadow.transforms.d.ts +2 -2
  35. package/dist/cjs/themes/_generator/tokens/shadow/shadow.transforms.js +4 -4
  36. package/dist/cjs/themes/_generator/tokens/types.d.ts +19 -17
  37. package/dist/cjs/themes/_generator/tokens/unit/unit.transforms.d.ts +2 -2
  38. package/dist/cjs/themes/_generator/tokens/unit/unit.transforms.js +2 -2
  39. package/dist/cjs/themes/_generator/tokens/unit/utilities/generate.d.ts +5 -0
  40. package/dist/cjs/themes/_generator/{utilities/generateUnits.js → tokens/unit/utilities/generate.js} +5 -4
  41. package/dist/cjs/themes/_generator/tokens/viewport/viewport.transforms.d.ts +2 -2
  42. package/dist/cjs/themes/_generator/tokens/viewport/viewport.transforms.js +2 -2
  43. package/dist/cjs/themes/_generator/transform.d.ts +3 -2
  44. package/dist/cjs/themes/_generator/transform.js +39 -11
  45. package/dist/cjs/themes/_generator/types.d.ts +4 -8
  46. package/dist/cjs/themes/_generator/utilities/mergeDefinitions.d.ts +1 -3
  47. package/dist/cjs/themes/_generator/utilities/mergeDefinitions.js +6 -4
  48. package/dist/cjs/themes/figma/theme.css +1 -1
  49. package/dist/cjs/themes/fragments/twitter/theme.css +1 -1
  50. package/dist/cjs/themes/index.d.ts +4 -11
  51. package/dist/cjs/themes/index.js +2 -5
  52. package/dist/cjs/themes/reshaped/theme.css +1 -1
  53. package/dist/cjs/themes/slate/theme.css +1 -1
  54. package/dist/cjs/types/config.d.ts +11 -7
  55. package/dist/cli/theming/index.d.ts +3 -3
  56. package/dist/cli/theming/index.js +2 -2
  57. package/dist/cli/theming/tailwind.d.ts +2 -3
  58. package/dist/components/FormControl/FormControl.context.d.ts +1 -1
  59. package/dist/tests/ThemesPlayground.d.ts +2 -0
  60. package/dist/tests/ThemesPlayground.js +90 -0
  61. package/dist/tests/themes.stories.d.ts +16 -0
  62. package/dist/{themes/_generator/tests → tests}/themes.stories.js +74 -15
  63. package/dist/themes/_generator/definitions/slate.js +1 -1
  64. package/dist/themes/_generator/tokens/color/color.transforms.d.ts +2 -2
  65. package/dist/themes/_generator/tokens/color/color.transforms.js +29 -7
  66. package/dist/themes/_generator/tokens/color/color.types.d.ts +28 -3
  67. package/dist/themes/_generator/tokens/color/utilities/a11y.d.ts +20 -0
  68. package/dist/themes/_generator/tokens/color/utilities/a11y.js +58 -0
  69. package/dist/themes/_generator/tokens/color/utilities/convert.d.ts +11 -0
  70. package/dist/themes/_generator/tokens/color/utilities/convert.js +27 -0
  71. package/dist/themes/_generator/tokens/color/utilities/generateColors.d.ts +4 -0
  72. package/dist/themes/_generator/tokens/color/utilities/generateColors.js +150 -0
  73. package/dist/themes/_generator/tokens/color/utilities/generateMetaColors.d.ts +4 -0
  74. package/dist/themes/_generator/tokens/color/utilities/generateMetaColors.js +66 -0
  75. package/dist/{cjs/themes/_generator/utilities → themes/_generator/tokens}/css.d.ts +1 -1
  76. package/dist/themes/_generator/tokens/duration/duration.transforms.d.ts +2 -2
  77. package/dist/themes/_generator/tokens/duration/duration.transforms.js +2 -2
  78. package/dist/themes/_generator/tokens/easing/easing.transforms.d.ts +2 -2
  79. package/dist/themes/_generator/tokens/easing/easing.transforms.js +2 -2
  80. package/dist/themes/_generator/tokens/font/font.transforms.d.ts +2 -2
  81. package/dist/themes/_generator/tokens/font/font.transforms.js +3 -3
  82. package/dist/themes/_generator/tokens/fontFamily/fontFamily.transforms.d.ts +2 -2
  83. package/dist/themes/_generator/tokens/fontFamily/fontFamily.transforms.js +2 -2
  84. package/dist/themes/_generator/tokens/fontWeight/fontWeight.transforms.d.ts +2 -2
  85. package/dist/themes/_generator/tokens/fontWeight/fontWeight.transforms.js +2 -2
  86. package/dist/themes/_generator/tokens/radius/radius.transforms.d.ts +2 -2
  87. package/dist/themes/_generator/tokens/radius/radius.transforms.js +2 -2
  88. package/dist/themes/_generator/tokens/shadow/shadow.transforms.d.ts +2 -2
  89. package/dist/themes/_generator/tokens/shadow/shadow.transforms.js +4 -4
  90. package/dist/themes/_generator/tokens/types.d.ts +19 -17
  91. package/dist/themes/_generator/tokens/unit/unit.transforms.d.ts +2 -2
  92. package/dist/themes/_generator/tokens/unit/unit.transforms.js +2 -2
  93. package/dist/themes/_generator/tokens/unit/utilities/generate.d.ts +5 -0
  94. package/dist/themes/_generator/{utilities/generateUnits.js → tokens/unit/utilities/generate.js} +4 -5
  95. package/dist/themes/_generator/tokens/viewport/viewport.transforms.d.ts +2 -2
  96. package/dist/themes/_generator/tokens/viewport/viewport.transforms.js +2 -2
  97. package/dist/themes/_generator/transform.d.ts +3 -2
  98. package/dist/themes/_generator/transform.js +39 -11
  99. package/dist/themes/_generator/types.d.ts +4 -8
  100. package/dist/themes/_generator/utilities/mergeDefinitions.d.ts +1 -3
  101. package/dist/themes/_generator/utilities/mergeDefinitions.js +6 -4
  102. package/dist/themes/figma/theme.css +1 -1
  103. package/dist/themes/fragments/twitter/theme.css +1 -1
  104. package/dist/themes/index.d.ts +4 -11
  105. package/dist/themes/index.js +1 -4
  106. package/dist/themes/reshaped/theme.css +1 -1
  107. package/dist/themes/slate/theme.css +1 -1
  108. package/dist/types/config.d.ts +11 -7
  109. package/dist/types/global.d.ts +3 -0
  110. package/package.json +11 -11
  111. package/dist/cjs/themes/_generator/utilities/color.d.ts +0 -105
  112. package/dist/cjs/themes/_generator/utilities/color.js +0 -409
  113. package/dist/cjs/themes/_generator/utilities/generateBackgroundColors.d.ts +0 -4
  114. package/dist/cjs/themes/_generator/utilities/generateBackgroundColors.js +0 -59
  115. package/dist/cjs/themes/_generator/utilities/generateColors.d.ts +0 -11
  116. package/dist/cjs/themes/_generator/utilities/generateColors.js +0 -178
  117. package/dist/cjs/themes/_generator/utilities/generateUnits.d.ts +0 -4
  118. package/dist/cjs/themes/_generator/utilities/mergeDeep.d.ts +0 -5
  119. package/dist/cjs/themes/_generator/utilities/mergeDeep.js +0 -24
  120. package/dist/cjs/themes/_generator/utilities/resolveTokenReference.d.ts +0 -3
  121. package/dist/cjs/themes/_generator/utilities/resolveTokenReference.js +0 -18
  122. package/dist/cjs/themes/_generator/utilities/tests/color.test.js +0 -81
  123. package/dist/themes/_generator/tests/themes.stories.d.ts +0 -16
  124. package/dist/themes/_generator/utilities/color.d.ts +0 -105
  125. package/dist/themes/_generator/utilities/color.js +0 -377
  126. package/dist/themes/_generator/utilities/generateBackgroundColors.d.ts +0 -4
  127. package/dist/themes/_generator/utilities/generateBackgroundColors.js +0 -57
  128. package/dist/themes/_generator/utilities/generateColors.d.ts +0 -11
  129. package/dist/themes/_generator/utilities/generateColors.js +0 -176
  130. package/dist/themes/_generator/utilities/generateUnits.d.ts +0 -4
  131. package/dist/themes/_generator/utilities/mergeDeep.d.ts +0 -5
  132. package/dist/themes/_generator/utilities/mergeDeep.js +0 -22
  133. package/dist/themes/_generator/utilities/resolveTokenReference.d.ts +0 -3
  134. package/dist/themes/_generator/utilities/resolveTokenReference.js +0 -16
  135. /package/dist/cjs/themes/_generator/{utilities/tests/color.test.d.ts → tokens/color/utilities/tests/a11y.test.d.ts} +0 -0
  136. /package/dist/cjs/themes/_generator/{utilities → tokens}/css.js +0 -0
  137. /package/dist/themes/_generator/{utilities → tokens}/css.js +0 -0
@@ -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 "../tokens/types";
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
1
  import type * as T from "./duration.types";
2
2
  import type { Transformer } from "../types";
3
- declare const transformedToken: Transformer<T.Token>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token>;
4
+ export default transformToken;
@@ -1,4 +1,4 @@
1
- const transformedToken = (name, token) => [
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 transformedToken;
9
+ export default transformToken;
@@ -1,4 +1,4 @@
1
1
  import type * as T from "./easing.types";
2
2
  import type { Transformer } from "../types";
3
- declare const transformedToken: Transformer<T.Token>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token>;
4
+ export default transformToken;
@@ -1,4 +1,4 @@
1
- const transformedToken = (name, token) => [
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 transformedToken;
9
+ export default transformToken;
@@ -1,4 +1,4 @@
1
1
  import type * as T from "./font.types";
2
2
  import type { Transformer } from "../types";
3
- declare const transformedToken: Transformer<T.Token>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token>;
4
+ export default transformToken;
@@ -1,6 +1,6 @@
1
- import { getVariableName } from "../../utilities/css.js";
1
+ import { getVariableName } from "../css.js";
2
2
  const BASE_REM_SIZE = 16;
3
- const transformedToken = (name, token) => {
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 transformedToken;
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 transformedToken: Transformer<T.Token>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token>;
4
+ export default transformToken;
@@ -1,4 +1,4 @@
1
- const transformedToken = (name, token) => [
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 transformedToken;
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 transformedToken: Transformer<T.Token>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token>;
4
+ export default transformToken;
@@ -1,4 +1,4 @@
1
- const transformedToken = (name, token) => [
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 transformedToken;
9
+ export default transformToken;
@@ -1,4 +1,4 @@
1
1
  import type * as T from "./radius.types";
2
2
  import type { Transformer } from "../types";
3
- declare const transformedToken: Transformer<T.Token>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token>;
4
+ export default transformToken;
@@ -1,4 +1,4 @@
1
- const transformedToken = (name, token) => [
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 transformedToken;
9
+ export default transformToken;
@@ -1,4 +1,4 @@
1
1
  import type { Transformer } from "../types";
2
2
  import type * as T from "./shadow.types";
3
- declare const transformedToken: Transformer<T.Token>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token>;
4
+ export default transformToken;
@@ -1,5 +1,5 @@
1
- import { hexToRgb } from "../../utilities/color.js";
2
- const transformedToken = (name, token, theme) => [
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 = hexToRgb(colorRef.hex);
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 transformedToken;
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
- export type PartialThemeDefinition = {
29
- unit?: Partial<ThemeDefinition["unit"]>;
30
- radius?: Partial<ThemeDefinition["radius"]>;
31
- fontFamily?: Partial<ThemeDefinition["fontFamily"]>;
32
- fontWeight?: Partial<ThemeDefinition["fontWeight"]>;
33
- font?: Partial<ThemeDefinition["font"]>;
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
- export type FullThemeDefinition = ThemeDefinition & {
41
- color: Record<TColor.GeneratedOnName | TColor.GeneratedRGBName | TColor.Name, TColor.Token>;
42
- unit: Record<TUnit.GeneratedName | TUnit.Name, TUnit.Token>;
43
- viewport: Record<TViewport.Name, TViewport.Token | TViewport.SToken>;
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: FullThemeDefinition) => TransformedToken[];
56
+ export type Transformer<Token> = (name: string, token: Token, theme: GeneratedThemeDefinition) => TransformedToken[];
55
57
  export {};
@@ -1,4 +1,4 @@
1
1
  import type * as T from "./unit.types";
2
2
  import type { Transformer } from "../types";
3
- declare const transformedToken: Transformer<T.Token>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token>;
4
+ export default transformToken;
@@ -1,4 +1,4 @@
1
- const transformedToken = (name, token) => [
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 transformedToken;
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;
@@ -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
- definition.unit[generatedName] = {
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 transformedToken: Transformer<T.Token | T.SToken>;
4
- export default transformedToken;
3
+ declare const transformToken: Transformer<T.Token | T.SToken>;
4
+ export default transformToken;
@@ -1,4 +1,4 @@
1
- const transformedToken = (name, token) => {
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 transformedToken;
25
+ export default transformToken;
@@ -1,7 +1,8 @@
1
1
  import type * as T from "./types";
2
- import type { FullThemeDefinition } from "./tokens/types";
3
- declare const transform: (name: string, definition: T.PartialDeep<FullThemeDefinition>, options: T.PrivateOptions) => {
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 "./utilities/css.js";
3
- import generateBackgroundColors from "./utilities/generateBackgroundColors.js";
4
- import generateUnits from "./utilities/generateUnits.js";
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
- generateBackgroundColors(definition, themeOptions);
8
- generateUnits(definition);
9
- // Generate s viewport
10
- if (definition.viewport?.m?.minPx) {
11
- definition.viewport.s = { maxPx: definition.viewport.m.minPx - 1 };
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(definition).forEach(([tokenType, tokenValues]) => {
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, definition);
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;
@@ -1,11 +1,8 @@
1
1
  import type { ReshapedConfig } from "../../types/config";
2
- export type Color = string | {
3
- hex: string;
4
- hexDark: string;
5
- };
6
- type Primitive = string | number | boolean;
7
- export type PartialDeep<T> = T extends Primitive ? Partial<T> : {
8
- [Key in keyof T]?: PartialDeep<T[Key]>;
2
+ export type PartialDeep<T> = {
3
+ [K in keyof T]?: {
4
+ [K2 in keyof T[K]]?: T[K][K2];
5
+ };
9
6
  };
10
7
  export type PublicOptions = {
11
8
  themeOptions?: ReshapedConfig["themeOptions"];
@@ -16,4 +13,3 @@ export type PrivateOptions = PublicOptions & {
16
13
  export type CLIOptions = PrivateOptions & {
17
14
  outputPath: string;
18
15
  };
19
- export {};
@@ -1,5 +1,3 @@
1
- type Obj = {
2
- [key: string]: unknown;
3
- };
1
+ type Obj = Record<string, unknown>;
4
2
  declare const mergeDefinitions: (originalDefinition: Obj, newDefinition: Obj, currentLevel?: number) => Obj;
5
3
  export default mergeDefinitions;
@@ -1,9 +1,11 @@
1
- // Level 1 is token types, level 2 is token values
2
- // { color: { foreground: {} } }
3
- // We don't merge token values
1
+ /**
2
+ * Stop at level 2 to not merge the token values, they should completely override the defaults
3
+ * Level 1 is token types
4
+ * Level 2 is token values
5
+ * Example: theme = { color: { foreground: {} } }
6
+ */
4
7
  const MAX_LEVEL = 2;
5
8
  const mergeDefinitions = (originalDefinition, newDefinition, currentLevel = 1) => {
6
- // Overwrite the token value
7
9
  if (currentLevel > MAX_LEVEL)
8
10
  return newDefinition;
9
11
  const mergedDefinition = { ...originalDefinition };