@xanui/core 1.3.8 → 1.3.10

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 (74) hide show
  1. package/AppRoot/index.cjs +5 -4
  2. package/AppRoot/index.cjs.map +1 -1
  3. package/AppRoot/index.d.ts +2 -1
  4. package/AppRoot/index.js +5 -4
  5. package/AppRoot/index.js.map +1 -1
  6. package/Iframe/index.cjs +1 -0
  7. package/Iframe/index.cjs.map +1 -1
  8. package/Iframe/index.js +1 -0
  9. package/Iframe/index.js.map +1 -1
  10. package/Tag/types.d.ts +1 -1
  11. package/Tag/useTagProps.cjs +5 -1
  12. package/Tag/useTagProps.cjs.map +1 -1
  13. package/Tag/useTagProps.js +5 -1
  14. package/Tag/useTagProps.js.map +1 -1
  15. package/Transition/index.cjs +1 -1
  16. package/Transition/index.cjs.map +1 -1
  17. package/Transition/index.d.ts +7 -2
  18. package/Transition/index.js +1 -1
  19. package/Transition/index.js.map +1 -1
  20. package/css/getProps.cjs +5 -8
  21. package/css/getProps.cjs.map +1 -1
  22. package/css/getProps.js +5 -8
  23. package/css/getProps.js.map +1 -1
  24. package/css/getValue.cjs +12 -10
  25. package/css/getValue.cjs.map +1 -1
  26. package/css/getValue.js +12 -10
  27. package/css/getValue.js.map +1 -1
  28. package/css/index.cjs +0 -32
  29. package/css/index.cjs.map +1 -1
  30. package/css/index.d.ts +1 -4
  31. package/css/index.js +1 -30
  32. package/css/index.js.map +1 -1
  33. package/hooks/useColorTemplate.cjs +28 -31
  34. package/hooks/useColorTemplate.cjs.map +1 -1
  35. package/hooks/useColorTemplate.d.ts +8 -6
  36. package/hooks/useColorTemplate.js +28 -31
  37. package/hooks/useColorTemplate.js.map +1 -1
  38. package/hooks/useInterface.cjs +1 -0
  39. package/hooks/useInterface.cjs.map +1 -1
  40. package/hooks/useInterface.d.ts +1 -3
  41. package/hooks/useInterface.js +1 -0
  42. package/hooks/useInterface.js.map +1 -1
  43. package/index.cjs +0 -3
  44. package/index.cjs.map +1 -1
  45. package/index.d.ts +3 -3
  46. package/index.js +1 -1
  47. package/package.json +1 -1
  48. package/readme.md +2 -2
  49. package/theme/ThemeCssVars.cjs +36 -147
  50. package/theme/ThemeCssVars.cjs.map +1 -1
  51. package/theme/ThemeCssVars.js +36 -147
  52. package/theme/ThemeCssVars.js.map +1 -1
  53. package/theme/ThemeDefaultOptions.cjs +20 -86
  54. package/theme/ThemeDefaultOptions.cjs.map +1 -1
  55. package/theme/ThemeDefaultOptions.js +20 -86
  56. package/theme/ThemeDefaultOptions.js.map +1 -1
  57. package/theme/ThemeProvider.cjs +7 -8
  58. package/theme/ThemeProvider.cjs.map +1 -1
  59. package/theme/ThemeProvider.d.ts +6 -1
  60. package/theme/ThemeProvider.js +7 -8
  61. package/theme/ThemeProvider.js.map +1 -1
  62. package/theme/core.cjs +14 -9
  63. package/theme/core.cjs.map +1 -1
  64. package/theme/core.js +15 -10
  65. package/theme/core.js.map +1 -1
  66. package/theme/index.cjs +3 -0
  67. package/theme/index.cjs.map +1 -1
  68. package/theme/index.js +1 -0
  69. package/theme/index.js.map +1 -1
  70. package/theme/oklch.cjs +246 -0
  71. package/theme/oklch.cjs.map +1 -0
  72. package/theme/oklch.js +241 -0
  73. package/theme/oklch.js.map +1 -0
  74. package/theme/types.d.ts +26 -72
package/theme/core.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import React__default, { useContext } from 'react';
3
- import { breakpoints, alpha } from '../css/index.js';
3
+ import { breakpoints } from '../css/index.js';
4
4
  import { darkThemeOptions, lightThemeOptions } from './ThemeDefaultOptions.js';
5
+ import { createPalette } from './oklch.js';
5
6
 
6
7
  const mergeObject = (a, b) => {
7
8
  a = Object.assign({}, a);
@@ -21,16 +22,20 @@ const createTheme = (options) => {
21
22
  var _a;
22
23
  let mode = (_a = options === null || options === void 0 ? void 0 : options.mode) !== null && _a !== void 0 ? _a : "light";
23
24
  const defaultOptions = mode === 'dark' ? darkThemeOptions : lightThemeOptions;
24
- let theme = mergeObject(defaultOptions, Object.assign(Object.assign({ name: mode === "dark" ? "default-dark" : "default-light" }, options), { breakpoints: breakpoints }));
25
- // add alpha colors
26
- for (let color in theme.colors) {
27
- const c = theme.colors[color];
28
- const is_common = color === 'divider' || color === 'background' || color === 'text';
29
- c.soft = {
30
- primary: is_common ? alpha(c.primary, 0.60) : alpha(c.primary, 0.08),
31
- secondary: is_common ? alpha(c.primary, 0.90) : alpha(c.primary, 0.12)
32
- };
25
+ for (let key in options === null || options === void 0 ? void 0 : options.colors) {
26
+ const color = options === null || options === void 0 ? void 0 : options.colors[key];
27
+ if (typeof color === "string") {
28
+ options.colors[key] = createPalette(color);
29
+ }
30
+ else {
31
+ const main = color.main;
32
+ if (main) {
33
+ const pallate = createPalette(main);
34
+ options.colors[key] = Object.assign(Object.assign(Object.assign({}, pallate), options.colors[key]), { main: pallate.main });
35
+ }
36
+ }
33
37
  }
38
+ let theme = mergeObject(defaultOptions, Object.assign(Object.assign({ name: mode === "dark" ? "default-dark" : "default-light" }, options), { breakpoints: breakpoints }));
34
39
  return theme;
35
40
  };
36
41
  const ThemeContex = React__default.createContext({
package/theme/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sources":["../../src/theme/core.ts"],"sourcesContent":["\"use client\"\nimport React, { useContext } from \"react\"\nimport { ObjectType, ThemeOptions, ThemeOptionInput, ThemeOptionsColor } from \"./types\"\nimport { alpha, breakpoints } from \"../css\"\nimport { darkThemeOptions, lightThemeOptions } from \"./ThemeDefaultOptions\"\n\nexport const mergeObject = (a: ObjectType, b: ObjectType) => {\n a = { ...a }\n b = { ...b }\n for (const key in b) {\n const v = (b as any)[key]\n if (typeof v === 'object' && !Array.isArray(v) && !React.isValidElement(v)) {\n a[key] = mergeObject(a[key], b[key])\n } else {\n a[key] = v\n }\n }\n return a\n}\n\n\nexport const createTheme = (options: ThemeOptionInput): ThemeOptions => {\n let mode = options?.mode ?? \"light\"\n const defaultOptions = mode === 'dark' ? darkThemeOptions : lightThemeOptions\n\n let theme: any = mergeObject(defaultOptions, {\n name: mode === \"dark\" ? \"default-dark\" : \"default-light\",\n ...options,\n breakpoints: breakpoints\n })\n\n // add alpha colors\n for (let color in theme.colors) {\n const c = theme.colors[color] as ThemeOptionsColor\n const is_common = color === 'divider' || color === 'background' || color === 'text'\n c.soft = {\n primary: is_common ? alpha(c.primary, 0.60) : alpha(c.primary, 0.08),\n secondary: is_common ? alpha(c.primary, 0.90) : alpha(c.primary, 0.12)\n }\n }\n\n return theme as ThemeOptions\n}\n\nexport type ThemeCntextProps = {\n theme: ThemeOptions,\n onChange: (theme: ThemeOptions) => void\n}\n\nexport const ThemeContex = React.createContext<ThemeCntextProps>({\n theme: createTheme({\n name: \"default-light\"\n }),\n onChange(theme) { },\n})\n\nexport const useTheme = () => {\n const ctx = useContext(ThemeContex)\n const theme = ctx.theme\n theme.change = (theme: ThemeOptionInput) => ctx.onChange(createTheme(theme))\n return theme\n}\n\n"],"names":[],"mappings":";;;;;;;;AASG;AACG;;AAEG;;;AAEA;;;AAGN;AACH;AAGO;;AACJ;AACA;;;AASA;;AAEG;;;;;;AAOH;AACH;AAOO;;AAED;;;AAGL;AAEM;AACJ;AACA;AACA;AACA;AACH;;"}
1
+ {"version":3,"file":"core.js","sources":["../../src/theme/core.ts"],"sourcesContent":["\"use client\"\nimport React, { useContext } from \"react\"\nimport { ObjectType, ThemeOptions, ThemeOptionInput } from \"./types\"\nimport { breakpoints } from \"../css\"\nimport { darkThemeOptions, lightThemeOptions } from \"./ThemeDefaultOptions\"\nimport { createPalette } from \"./oklch\"\n\nexport const mergeObject = (a: ObjectType, b: ObjectType) => {\n a = { ...a }\n b = { ...b }\n for (const key in b) {\n const v = (b as any)[key]\n if (typeof v === 'object' && !Array.isArray(v) && !React.isValidElement(v)) {\n a[key] = mergeObject(a[key], b[key])\n } else {\n a[key] = v\n }\n }\n return a\n}\n\n\nexport const createTheme = (options: ThemeOptionInput): ThemeOptions => {\n let mode = options?.mode ?? \"light\"\n const defaultOptions = mode === 'dark' ? darkThemeOptions : lightThemeOptions\n\n for (let key in options?.colors) {\n const color = (options as any)?.colors[key] as any\n if (typeof color === \"string\") {\n (options as any).colors[key] = createPalette(color)\n } else {\n const main = color.main\n if (main) {\n const pallate = createPalette(main);\n (options as any).colors[key] = {\n ...pallate,\n ...(options as any).colors[key],\n main: pallate.main\n }\n }\n }\n }\n\n let theme: any = mergeObject(defaultOptions, {\n name: mode === \"dark\" ? \"default-dark\" : \"default-light\",\n ...options,\n breakpoints: breakpoints\n })\n\n return theme as ThemeOptions\n}\n\nexport type ThemeCntextProps = {\n theme: ThemeOptions,\n onChange: (theme: ThemeOptions) => void\n}\n\nexport const ThemeContex = React.createContext<ThemeCntextProps>({\n theme: createTheme({\n name: \"default-light\"\n }),\n onChange(theme) { },\n})\n\nexport const useTheme = () => {\n const ctx = useContext(ThemeContex)\n const theme = ctx.theme\n theme.change = (theme: ThemeOptionInput) => ctx.onChange(createTheme(theme))\n return theme\n}\n\n"],"names":[],"mappings":";;;;;;;;;AAUG;AACG;;AAEG;;;AAEA;;;AAGN;AACH;AAGO;;AACJ;AACA;;AAGG;AACA;;;;AAGG;;AAEG;;;;;;AAgBT;AACH;AAOO;;AAED;;;AAGL;AAEM;AACJ;AACA;AACA;AACA;AACH;;"}
package/theme/index.cjs CHANGED
@@ -9,11 +9,14 @@ var core = require('./core.cjs');
9
9
  require('../css/getValue.cjs');
10
10
  require('oncss');
11
11
  require('../Document/index.cjs');
12
+ var ThemeDefaultOptions = require('./ThemeDefaultOptions.cjs');
12
13
  require('../css/CSSCacheProvider.cjs');
13
14
 
14
15
  const themeRootClass = (theme) => `.xui-${theme}-theme-root`;
15
16
 
16
17
  exports.createTheme = core.createTheme;
17
18
  exports.useTheme = core.useTheme;
19
+ exports.darkThemeOptions = ThemeDefaultOptions.darkThemeOptions;
20
+ exports.lightThemeOptions = ThemeDefaultOptions.lightThemeOptions;
18
21
  exports.themeRootClass = themeRootClass;
19
22
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/theme/index.tsx"],"sourcesContent":["\"use client\"\nimport ThemeProvider from './ThemeProvider'\nimport { useTheme, createTheme } from './core'\nimport { lightThemeOptions, darkThemeOptions } from './ThemeDefaultOptions'\nexport type { ThemeProviderProps } from './ThemeProvider'\n\nexport const themeRootClass = (theme: string) => `.xui-${theme}-theme-root`\n\nexport {\n ThemeProvider,\n createTheme,\n useTheme,\n lightThemeOptions,\n darkThemeOptions\n}\n\n"],"names":[],"mappings":";;;;;;;;;;;;;AAMO;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/theme/index.tsx"],"sourcesContent":["\"use client\"\nimport ThemeProvider from './ThemeProvider'\nimport { useTheme, createTheme } from './core'\nimport { lightThemeOptions, darkThemeOptions } from './ThemeDefaultOptions'\nexport type { ThemeProviderProps } from './ThemeProvider'\n\nexport const themeRootClass = (theme: string) => `.xui-${theme}-theme-root`\n\nexport {\n ThemeProvider,\n createTheme,\n useTheme,\n lightThemeOptions,\n darkThemeOptions\n}\n\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAMO;;;;;;"}
package/theme/index.js CHANGED
@@ -7,6 +7,7 @@ export { createTheme, useTheme } from './core.js';
7
7
  import '../css/getValue.js';
8
8
  import 'oncss';
9
9
  import '../Document/index.js';
10
+ export { darkThemeOptions, lightThemeOptions } from './ThemeDefaultOptions.js';
10
11
  import '../css/CSSCacheProvider.js';
11
12
 
12
13
  const themeRootClass = (theme) => `.xui-${theme}-theme-root`;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/theme/index.tsx"],"sourcesContent":["\"use client\"\nimport ThemeProvider from './ThemeProvider'\nimport { useTheme, createTheme } from './core'\nimport { lightThemeOptions, darkThemeOptions } from './ThemeDefaultOptions'\nexport type { ThemeProviderProps } from './ThemeProvider'\n\nexport const themeRootClass = (theme: string) => `.xui-${theme}-theme-root`\n\nexport {\n ThemeProvider,\n createTheme,\n useTheme,\n lightThemeOptions,\n darkThemeOptions\n}\n\n"],"names":[],"mappings":";;;;;;;;;;;AAMO;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/theme/index.tsx"],"sourcesContent":["\"use client\"\nimport ThemeProvider from './ThemeProvider'\nimport { useTheme, createTheme } from './core'\nimport { lightThemeOptions, darkThemeOptions } from './ThemeDefaultOptions'\nexport type { ThemeProviderProps } from './ThemeProvider'\n\nexport const themeRootClass = (theme: string) => `.xui-${theme}-theme-root`\n\nexport {\n ThemeProvider,\n createTheme,\n useTheme,\n lightThemeOptions,\n darkThemeOptions\n}\n\n"],"names":[],"mappings":";;;;;;;;;;;;AAMO;;"}
@@ -0,0 +1,246 @@
1
+ 'use strict';
2
+
3
+ /* ---------------- PARSERS ---------------- */
4
+ function toOKLCH(input) {
5
+ if (input.startsWith("oklch")) {
6
+ const values = input.match(/[\d.]+/g);
7
+ if (!values || values.length < 3) {
8
+ throw new Error("Invalid OKLCH format");
9
+ }
10
+ let [l, c, h] = values.map(Number);
11
+ return {
12
+ l: l > 1 ? l / 100 : l,
13
+ c,
14
+ h,
15
+ };
16
+ }
17
+ const rgb = parseToRgb(input);
18
+ const lab = rgbToOklab(rgb.r, rgb.g, rgb.b);
19
+ return oklabToOklch(lab.L, lab.a, lab.b);
20
+ }
21
+ function parseToRgb(input) {
22
+ input = input.trim().toLowerCase();
23
+ if (input.startsWith("#"))
24
+ return parseHex(input);
25
+ if (input.startsWith("rgb"))
26
+ return parseRgb(input);
27
+ if (input.startsWith("hsl"))
28
+ return parseHsl(input);
29
+ throw new Error("Unsupported format");
30
+ }
31
+ /* ---------------- CORE MATH ---------------- */
32
+ function srgbToLinear(c) {
33
+ return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
34
+ }
35
+ function rgbToOklab(r, g, b) {
36
+ r = srgbToLinear(r);
37
+ g = srgbToLinear(g);
38
+ b = srgbToLinear(b);
39
+ const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;
40
+ const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;
41
+ const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;
42
+ const l_ = Math.cbrt(l);
43
+ const m_ = Math.cbrt(m);
44
+ const s_ = Math.cbrt(s);
45
+ return {
46
+ L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,
47
+ a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,
48
+ b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,
49
+ };
50
+ }
51
+ function oklabToOklch(L, a, b) {
52
+ const c = Math.sqrt(a * a + b * b);
53
+ let h = Math.atan2(b, a) * (180 / Math.PI);
54
+ if (h < 0)
55
+ h += 360;
56
+ return { l: L, c, h };
57
+ }
58
+ /* ---------------- FORMAT ---------------- */
59
+ function formatOklch(color, alpha = 1) {
60
+ const l = (color.l * 100).toFixed(2) + "%";
61
+ const c = color.c.toFixed(4);
62
+ const h = color.h.toFixed(2);
63
+ return alpha === 1
64
+ ? `oklch(${l} ${c} ${h})`
65
+ : `oklch(${l} ${c} ${h} / ${alpha})`;
66
+ }
67
+ /* ---------------- UTILS ---------------- */
68
+ function clamp(v, min = 0, max = 1) {
69
+ return Math.min(max, Math.max(min, v));
70
+ }
71
+ function createDarkThemePalette(input) {
72
+ const base = toOKLCH(input);
73
+ const isNeutral = base.c < 0.03;
74
+ const isDarkEnough = base.l < 0.2;
75
+ const isNearBlack = isNeutral && isDarkEnough;
76
+ const safeC = Math.min(base.c, 0.22);
77
+ const main = {
78
+ l: base.l,
79
+ c: safeC,
80
+ h: base.h
81
+ };
82
+ if (isNearBlack) {
83
+ const neutralHue = 0;
84
+ const safeC = Math.min(base.c, 0.25);
85
+ const step = (i) => {
86
+ const offset = (i - 3) * 0.09;
87
+ const l = clamp(base.l + offset);
88
+ return { l, c: safeC, h: base.h };
89
+ };
90
+ return {
91
+ main: formatOklch(main),
92
+ light: formatOklch(step(3.5)),
93
+ lighter: formatOklch(step(4.5)),
94
+ dark: formatOklch(step(2.5)),
95
+ darker: formatOklch(step(1.5)),
96
+ contrast: formatOklch({ l: 0.96, c: 0, h: neutralHue }),
97
+ muted: formatOklch({ l: 0.85, c: 0, h: neutralHue }),
98
+ divider: formatOklch({
99
+ l: 0.33,
100
+ c: 0,
101
+ h: 0
102
+ }),
103
+ ghost: formatOklch({ l: 0.96, c: 0, h: neutralHue }, 0.16)
104
+ };
105
+ }
106
+ return createPalette(input, "dark");
107
+ }
108
+ function createLightThemePalette(input) {
109
+ const base = toOKLCH(input);
110
+ const isNearWhite = base.l > 0.98 && base.c < 0.01;
111
+ const main = formatOklch(base);
112
+ if (isNearWhite) {
113
+ const neutralHue = 0;
114
+ const safeC = Math.min(base.c, 0.25);
115
+ const step = (i) => {
116
+ const offset = (i - 3) * 0.09;
117
+ const l = clamp(base.l - offset);
118
+ return { l, c: safeC, h: base.h };
119
+ };
120
+ return {
121
+ main,
122
+ light: formatOklch(step(3.5)),
123
+ lighter: formatOklch(step(4.5)),
124
+ dark: formatOklch(step(5.5)),
125
+ darker: formatOklch(step(6.5)),
126
+ contrast: formatOklch({
127
+ l: 0.12,
128
+ c: 0,
129
+ h: neutralHue
130
+ }),
131
+ muted: formatOklch({
132
+ l: 0.50,
133
+ c: 0,
134
+ h: neutralHue
135
+ }),
136
+ divider: formatOklch({
137
+ l: 0.75,
138
+ c: 0,
139
+ h: neutralHue
140
+ }),
141
+ ghost: formatOklch({ l: 0.12, c: 0, h: neutralHue }, 0.12)
142
+ };
143
+ }
144
+ return createPalette(input, "light");
145
+ }
146
+ function createPalette(input, mode = "light") {
147
+ const base = toOKLCH(input);
148
+ const isDark = mode === "dark";
149
+ const isLightColor = base.l > 0.75;
150
+ const safeC = Math.min(base.c, 0.25);
151
+ const step = (i) => {
152
+ const offset = (i - 3) * 0.09;
153
+ const l = isDark ? clamp(base.l + offset) : clamp(base.l - offset);
154
+ return { l, c: safeC, h: base.h };
155
+ };
156
+ const main = {
157
+ l: base.l,
158
+ c: safeC,
159
+ h: base.h
160
+ };
161
+ const contrast = {
162
+ l: !isLightColor ? 0.96 : 0.12,
163
+ c: 0.02,
164
+ h: base.h
165
+ };
166
+ return {
167
+ main: formatOklch(main),
168
+ light: formatOklch(step(isDark ? 4 : 2)),
169
+ lighter: formatOklch(step(isDark ? 5 : 1)),
170
+ dark: formatOklch(step(isDark ? 2 : 4)),
171
+ darker: formatOklch(step(isDark ? 1 : 5)),
172
+ ghost: formatOklch(main, isDark ? 0.12 : 0.18),
173
+ contrast: formatOklch(contrast),
174
+ muted: formatOklch({
175
+ l: clamp(contrast.l - (isDark ? 0.05 : 0.025)),
176
+ c: clamp(contrast.c - 0.01),
177
+ h: contrast.h
178
+ }),
179
+ divider: formatOklch({
180
+ l: clamp(contrast.l - (isDark ? 0.25 : 0.6)),
181
+ c: clamp(contrast.c + .05),
182
+ h: contrast.h
183
+ }),
184
+ };
185
+ }
186
+ /* ---------------- PARSERS ---------------- */
187
+ function parseHex(hex) {
188
+ hex = hex.replace("#", "").trim();
189
+ if (hex.length === 3) {
190
+ hex = hex.split("").map(c => c + c).join("");
191
+ }
192
+ const num = parseInt(hex, 16);
193
+ return {
194
+ r: ((num >> 16) & 255) / 255,
195
+ g: ((num >> 8) & 255) / 255,
196
+ b: (num & 255) / 255,
197
+ };
198
+ }
199
+ function parseRgb(input) {
200
+ const values = input.match(/[\d.]+/g);
201
+ if (!values || values.length < 3) {
202
+ throw new Error("Invalid RGB format");
203
+ }
204
+ const [r, g, b] = values.map(Number);
205
+ return {
206
+ r: r / 255,
207
+ g: g / 255,
208
+ b: b / 255,
209
+ };
210
+ }
211
+ function parseHsl(input) {
212
+ const values = input.match(/[\d.]+/g);
213
+ if (!values || values.length < 3) {
214
+ throw new Error("Invalid HSL format");
215
+ }
216
+ let [h, s, l] = values.map(Number);
217
+ h /= 360;
218
+ s /= 100;
219
+ l /= 100;
220
+ const hue2rgb = (p, q, t) => {
221
+ if (t < 0)
222
+ t += 1;
223
+ if (t > 1)
224
+ t -= 1;
225
+ if (t < 1 / 6)
226
+ return p + (q - p) * 6 * t;
227
+ if (t < 1 / 2)
228
+ return q;
229
+ if (t < 2 / 3)
230
+ return p + (q - p) * (2 / 3 - t) * 6;
231
+ return p;
232
+ };
233
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
234
+ const p = 2 * l - q;
235
+ return {
236
+ r: hue2rgb(p, q, h + 1 / 3),
237
+ g: hue2rgb(p, q, h),
238
+ b: hue2rgb(p, q, h - 1 / 3),
239
+ };
240
+ }
241
+
242
+ exports.createDarkThemePalette = createDarkThemePalette;
243
+ exports.createLightThemePalette = createLightThemePalette;
244
+ exports.createPalette = createPalette;
245
+ exports.toOKLCH = toOKLCH;
246
+ //# sourceMappingURL=oklch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oklch.cjs","sources":["../../src/theme/oklch.ts"],"sourcesContent":["type OKLCH = {\n l: number;\n c: number;\n h: number;\n};\n\ntype ColorRole = {\n main: string;\n light: string;\n lighter: string;\n dark: string;\n darker: string;\n contrast: string;\n muted: string;\n divider: string;\n ghost: string;\n};\n\n/* ---------------- PARSERS ---------------- */\n\nexport function toOKLCH(input: string): OKLCH {\n if (input.startsWith(\"oklch\")) {\n const values = input.match(/[\\d.]+/g);\n if (!values || values.length < 3) {\n throw new Error(\"Invalid OKLCH format\");\n }\n\n let [l, c, h] = values.map(Number);\n\n return {\n l: l > 1 ? l / 100 : l,\n c,\n h,\n };\n }\n\n const rgb = parseToRgb(input);\n const lab = rgbToOklab(rgb.r, rgb.g, rgb.b);\n return oklabToOklch(lab.L, lab.a, lab.b);\n}\n\nfunction parseToRgb(input: string) {\n input = input.trim().toLowerCase();\n\n if (input.startsWith(\"#\")) return parseHex(input);\n if (input.startsWith(\"rgb\")) return parseRgb(input);\n if (input.startsWith(\"hsl\")) return parseHsl(input);\n\n throw new Error(\"Unsupported format\");\n}\n\n/* ---------------- CORE MATH ---------------- */\n\nfunction srgbToLinear(c: number) {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\nfunction rgbToOklab(r: number, g: number, b: number) {\n r = srgbToLinear(r);\n g = srgbToLinear(g);\n b = srgbToLinear(b);\n\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n return {\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n };\n}\n\nfunction oklabToOklch(L: number, a: number, b: number): OKLCH {\n const c = Math.sqrt(a * a + b * b);\n let h = Math.atan2(b, a) * (180 / Math.PI);\n\n if (h < 0) h += 360;\n\n return { l: L, c, h };\n}\n\n/* ---------------- FORMAT ---------------- */\n\nfunction formatOklch(color: OKLCH, alpha = 1): string {\n const l = (color.l * 100).toFixed(2) + \"%\";\n const c = color.c.toFixed(4);\n const h = color.h.toFixed(2);\n\n return alpha === 1\n ? `oklch(${l} ${c} ${h})`\n : `oklch(${l} ${c} ${h} / ${alpha})`;\n}\n\n/* ---------------- UTILS ---------------- */\n\nfunction clamp(v: number, min = 0, max = 1) {\n return Math.min(max, Math.max(min, v));\n}\n\nexport function createDarkThemePalette(input: string): ColorRole {\n const base = toOKLCH(input);\n\n const isNeutral = base.c < 0.03;\n const isDarkEnough = base.l < 0.2;\n const isNearBlack = isNeutral && isDarkEnough;\n const safeC = Math.min(base.c, 0.22);\n\n const main: OKLCH = {\n l: base.l,\n c: safeC,\n h: base.h\n };\n\n if (isNearBlack) {\n const neutralHue = 0;\n const safeC = Math.min(base.c, 0.25);\n\n const step = (i: number): OKLCH => {\n const offset = (i - 3) * 0.09;\n const l = clamp(base.l + offset)\n return { l, c: safeC, h: base.h };\n };\n\n return {\n main: formatOklch(main),\n light: formatOklch(step(3.5)),\n lighter: formatOklch(step(4.5)),\n dark: formatOklch(step(2.5)),\n darker: formatOklch(step(1.5)),\n contrast: formatOklch({ l: 0.96, c: 0, h: neutralHue }),\n muted: formatOklch({ l: 0.85, c: 0, h: neutralHue }),\n divider: formatOklch({\n l: 0.33,\n c: 0,\n h: 0\n }),\n ghost: formatOklch({ l: 0.96, c: 0, h: neutralHue }, 0.16)\n };\n }\n\n return createPalette(input, \"dark\")\n}\n\nexport function createLightThemePalette(input: string): ColorRole {\n const base = toOKLCH(input);\n\n const isNearWhite = base.l > 0.98 && base.c < 0.01;\n const main = formatOklch(base);\n if (isNearWhite) {\n const neutralHue = 0;\n const safeC = Math.min(base.c, 0.25);\n\n const step = (i: number): OKLCH => {\n const offset = (i - 3) * 0.09;\n const l = clamp(base.l - offset);\n return { l, c: safeC, h: base.h };\n };\n\n return {\n main,\n light: formatOklch(step(3.5)),\n lighter: formatOklch(step(4.5)),\n dark: formatOklch(step(5.5)),\n darker: formatOklch(step(6.5)),\n contrast: formatOklch({\n l: 0.12,\n c: 0,\n h: neutralHue\n }),\n muted: formatOklch({\n l: 0.50,\n c: 0,\n h: neutralHue\n }),\n divider: formatOklch({\n l: 0.75,\n c: 0,\n h: neutralHue\n }),\n ghost: formatOklch(\n { l: 0.12, c: 0, h: neutralHue },\n 0.12\n )\n };\n }\n\n return createPalette(input, \"light\");\n}\n\nexport function createPalette(input: string, mode: \"light\" | \"dark\" = \"light\"): ColorRole {\n const base = toOKLCH(input);\n const isDark = mode === \"dark\";\n const isLightColor = base.l > 0.75;\n const safeC = Math.min(base.c, 0.25);\n\n const step = (i: number): OKLCH => {\n const offset = (i - 3) * 0.09;\n const l = isDark ? clamp(base.l + offset) : clamp(base.l - offset);\n return { l, c: safeC, h: base.h };\n };\n\n const main: OKLCH = {\n l: base.l,\n c: safeC,\n h: base.h\n };\n\n const contrast = {\n l: !isLightColor ? 0.96 : 0.12,\n c: 0.02,\n h: base.h\n }\n\n return {\n main: formatOklch(main),\n light: formatOklch(step(isDark ? 4 : 2)),\n lighter: formatOklch(step(isDark ? 5 : 1)),\n dark: formatOklch(step(isDark ? 2 : 4)),\n darker: formatOklch(step(isDark ? 1 : 5)),\n ghost: formatOklch(main, isDark ? 0.12 : 0.18),\n\n contrast: formatOklch(contrast),\n\n muted: formatOklch({\n l: clamp(contrast.l - (isDark ? 0.05 : 0.025)),\n c: clamp(contrast.c - 0.01),\n h: contrast.h\n }),\n\n divider: formatOklch({\n l: clamp(contrast.l - (isDark ? 0.25 : 0.6)),\n c: clamp(contrast.c + .05),\n h: contrast.h\n }),\n };\n}\n/* ---------------- PARSERS ---------------- */\n\nfunction parseHex(hex: string) {\n hex = hex.replace(\"#\", \"\").trim();\n\n if (hex.length === 3) {\n hex = hex.split(\"\").map(c => c + c).join(\"\");\n }\n\n const num = parseInt(hex, 16);\n\n return {\n r: ((num >> 16) & 255) / 255,\n g: ((num >> 8) & 255) / 255,\n b: (num & 255) / 255,\n };\n}\n\nfunction parseRgb(input: string) {\n const values = input.match(/[\\d.]+/g);\n if (!values || values.length < 3) {\n throw new Error(\"Invalid RGB format\");\n }\n\n const [r, g, b] = values.map(Number);\n\n return {\n r: r / 255,\n g: g / 255,\n b: b / 255,\n };\n}\n\nfunction parseHsl(input: string) {\n const values = input.match(/[\\d.]+/g);\n if (!values || values.length < 3) {\n throw new Error(\"Invalid HSL format\");\n }\n\n let [h, s, l] = values.map(Number);\n\n h /= 360;\n s /= 100;\n l /= 100;\n\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n return {\n r: hue2rgb(p, q, h + 1 / 3),\n g: hue2rgb(p, q, h),\n b: hue2rgb(p, q, h - 1 / 3),\n };\n}\n"],"names":[],"mappings":"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"}
package/theme/oklch.js ADDED
@@ -0,0 +1,241 @@
1
+ /* ---------------- PARSERS ---------------- */
2
+ function toOKLCH(input) {
3
+ if (input.startsWith("oklch")) {
4
+ const values = input.match(/[\d.]+/g);
5
+ if (!values || values.length < 3) {
6
+ throw new Error("Invalid OKLCH format");
7
+ }
8
+ let [l, c, h] = values.map(Number);
9
+ return {
10
+ l: l > 1 ? l / 100 : l,
11
+ c,
12
+ h,
13
+ };
14
+ }
15
+ const rgb = parseToRgb(input);
16
+ const lab = rgbToOklab(rgb.r, rgb.g, rgb.b);
17
+ return oklabToOklch(lab.L, lab.a, lab.b);
18
+ }
19
+ function parseToRgb(input) {
20
+ input = input.trim().toLowerCase();
21
+ if (input.startsWith("#"))
22
+ return parseHex(input);
23
+ if (input.startsWith("rgb"))
24
+ return parseRgb(input);
25
+ if (input.startsWith("hsl"))
26
+ return parseHsl(input);
27
+ throw new Error("Unsupported format");
28
+ }
29
+ /* ---------------- CORE MATH ---------------- */
30
+ function srgbToLinear(c) {
31
+ return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
32
+ }
33
+ function rgbToOklab(r, g, b) {
34
+ r = srgbToLinear(r);
35
+ g = srgbToLinear(g);
36
+ b = srgbToLinear(b);
37
+ const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;
38
+ const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;
39
+ const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;
40
+ const l_ = Math.cbrt(l);
41
+ const m_ = Math.cbrt(m);
42
+ const s_ = Math.cbrt(s);
43
+ return {
44
+ L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,
45
+ a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,
46
+ b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,
47
+ };
48
+ }
49
+ function oklabToOklch(L, a, b) {
50
+ const c = Math.sqrt(a * a + b * b);
51
+ let h = Math.atan2(b, a) * (180 / Math.PI);
52
+ if (h < 0)
53
+ h += 360;
54
+ return { l: L, c, h };
55
+ }
56
+ /* ---------------- FORMAT ---------------- */
57
+ function formatOklch(color, alpha = 1) {
58
+ const l = (color.l * 100).toFixed(2) + "%";
59
+ const c = color.c.toFixed(4);
60
+ const h = color.h.toFixed(2);
61
+ return alpha === 1
62
+ ? `oklch(${l} ${c} ${h})`
63
+ : `oklch(${l} ${c} ${h} / ${alpha})`;
64
+ }
65
+ /* ---------------- UTILS ---------------- */
66
+ function clamp(v, min = 0, max = 1) {
67
+ return Math.min(max, Math.max(min, v));
68
+ }
69
+ function createDarkThemePalette(input) {
70
+ const base = toOKLCH(input);
71
+ const isNeutral = base.c < 0.03;
72
+ const isDarkEnough = base.l < 0.2;
73
+ const isNearBlack = isNeutral && isDarkEnough;
74
+ const safeC = Math.min(base.c, 0.22);
75
+ const main = {
76
+ l: base.l,
77
+ c: safeC,
78
+ h: base.h
79
+ };
80
+ if (isNearBlack) {
81
+ const neutralHue = 0;
82
+ const safeC = Math.min(base.c, 0.25);
83
+ const step = (i) => {
84
+ const offset = (i - 3) * 0.09;
85
+ const l = clamp(base.l + offset);
86
+ return { l, c: safeC, h: base.h };
87
+ };
88
+ return {
89
+ main: formatOklch(main),
90
+ light: formatOklch(step(3.5)),
91
+ lighter: formatOklch(step(4.5)),
92
+ dark: formatOklch(step(2.5)),
93
+ darker: formatOklch(step(1.5)),
94
+ contrast: formatOklch({ l: 0.96, c: 0, h: neutralHue }),
95
+ muted: formatOklch({ l: 0.85, c: 0, h: neutralHue }),
96
+ divider: formatOklch({
97
+ l: 0.33,
98
+ c: 0,
99
+ h: 0
100
+ }),
101
+ ghost: formatOklch({ l: 0.96, c: 0, h: neutralHue }, 0.16)
102
+ };
103
+ }
104
+ return createPalette(input, "dark");
105
+ }
106
+ function createLightThemePalette(input) {
107
+ const base = toOKLCH(input);
108
+ const isNearWhite = base.l > 0.98 && base.c < 0.01;
109
+ const main = formatOklch(base);
110
+ if (isNearWhite) {
111
+ const neutralHue = 0;
112
+ const safeC = Math.min(base.c, 0.25);
113
+ const step = (i) => {
114
+ const offset = (i - 3) * 0.09;
115
+ const l = clamp(base.l - offset);
116
+ return { l, c: safeC, h: base.h };
117
+ };
118
+ return {
119
+ main,
120
+ light: formatOklch(step(3.5)),
121
+ lighter: formatOklch(step(4.5)),
122
+ dark: formatOklch(step(5.5)),
123
+ darker: formatOklch(step(6.5)),
124
+ contrast: formatOklch({
125
+ l: 0.12,
126
+ c: 0,
127
+ h: neutralHue
128
+ }),
129
+ muted: formatOklch({
130
+ l: 0.50,
131
+ c: 0,
132
+ h: neutralHue
133
+ }),
134
+ divider: formatOklch({
135
+ l: 0.75,
136
+ c: 0,
137
+ h: neutralHue
138
+ }),
139
+ ghost: formatOklch({ l: 0.12, c: 0, h: neutralHue }, 0.12)
140
+ };
141
+ }
142
+ return createPalette(input, "light");
143
+ }
144
+ function createPalette(input, mode = "light") {
145
+ const base = toOKLCH(input);
146
+ const isDark = mode === "dark";
147
+ const isLightColor = base.l > 0.75;
148
+ const safeC = Math.min(base.c, 0.25);
149
+ const step = (i) => {
150
+ const offset = (i - 3) * 0.09;
151
+ const l = isDark ? clamp(base.l + offset) : clamp(base.l - offset);
152
+ return { l, c: safeC, h: base.h };
153
+ };
154
+ const main = {
155
+ l: base.l,
156
+ c: safeC,
157
+ h: base.h
158
+ };
159
+ const contrast = {
160
+ l: !isLightColor ? 0.96 : 0.12,
161
+ c: 0.02,
162
+ h: base.h
163
+ };
164
+ return {
165
+ main: formatOklch(main),
166
+ light: formatOklch(step(isDark ? 4 : 2)),
167
+ lighter: formatOklch(step(isDark ? 5 : 1)),
168
+ dark: formatOklch(step(isDark ? 2 : 4)),
169
+ darker: formatOklch(step(isDark ? 1 : 5)),
170
+ ghost: formatOklch(main, isDark ? 0.12 : 0.18),
171
+ contrast: formatOklch(contrast),
172
+ muted: formatOklch({
173
+ l: clamp(contrast.l - (isDark ? 0.05 : 0.025)),
174
+ c: clamp(contrast.c - 0.01),
175
+ h: contrast.h
176
+ }),
177
+ divider: formatOklch({
178
+ l: clamp(contrast.l - (isDark ? 0.25 : 0.6)),
179
+ c: clamp(contrast.c + .05),
180
+ h: contrast.h
181
+ }),
182
+ };
183
+ }
184
+ /* ---------------- PARSERS ---------------- */
185
+ function parseHex(hex) {
186
+ hex = hex.replace("#", "").trim();
187
+ if (hex.length === 3) {
188
+ hex = hex.split("").map(c => c + c).join("");
189
+ }
190
+ const num = parseInt(hex, 16);
191
+ return {
192
+ r: ((num >> 16) & 255) / 255,
193
+ g: ((num >> 8) & 255) / 255,
194
+ b: (num & 255) / 255,
195
+ };
196
+ }
197
+ function parseRgb(input) {
198
+ const values = input.match(/[\d.]+/g);
199
+ if (!values || values.length < 3) {
200
+ throw new Error("Invalid RGB format");
201
+ }
202
+ const [r, g, b] = values.map(Number);
203
+ return {
204
+ r: r / 255,
205
+ g: g / 255,
206
+ b: b / 255,
207
+ };
208
+ }
209
+ function parseHsl(input) {
210
+ const values = input.match(/[\d.]+/g);
211
+ if (!values || values.length < 3) {
212
+ throw new Error("Invalid HSL format");
213
+ }
214
+ let [h, s, l] = values.map(Number);
215
+ h /= 360;
216
+ s /= 100;
217
+ l /= 100;
218
+ const hue2rgb = (p, q, t) => {
219
+ if (t < 0)
220
+ t += 1;
221
+ if (t > 1)
222
+ t -= 1;
223
+ if (t < 1 / 6)
224
+ return p + (q - p) * 6 * t;
225
+ if (t < 1 / 2)
226
+ return q;
227
+ if (t < 2 / 3)
228
+ return p + (q - p) * (2 / 3 - t) * 6;
229
+ return p;
230
+ };
231
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
232
+ const p = 2 * l - q;
233
+ return {
234
+ r: hue2rgb(p, q, h + 1 / 3),
235
+ g: hue2rgb(p, q, h),
236
+ b: hue2rgb(p, q, h - 1 / 3),
237
+ };
238
+ }
239
+
240
+ export { createDarkThemePalette, createLightThemePalette, createPalette, toOKLCH };
241
+ //# sourceMappingURL=oklch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oklch.js","sources":["../../src/theme/oklch.ts"],"sourcesContent":["type OKLCH = {\n l: number;\n c: number;\n h: number;\n};\n\ntype ColorRole = {\n main: string;\n light: string;\n lighter: string;\n dark: string;\n darker: string;\n contrast: string;\n muted: string;\n divider: string;\n ghost: string;\n};\n\n/* ---------------- PARSERS ---------------- */\n\nexport function toOKLCH(input: string): OKLCH {\n if (input.startsWith(\"oklch\")) {\n const values = input.match(/[\\d.]+/g);\n if (!values || values.length < 3) {\n throw new Error(\"Invalid OKLCH format\");\n }\n\n let [l, c, h] = values.map(Number);\n\n return {\n l: l > 1 ? l / 100 : l,\n c,\n h,\n };\n }\n\n const rgb = parseToRgb(input);\n const lab = rgbToOklab(rgb.r, rgb.g, rgb.b);\n return oklabToOklch(lab.L, lab.a, lab.b);\n}\n\nfunction parseToRgb(input: string) {\n input = input.trim().toLowerCase();\n\n if (input.startsWith(\"#\")) return parseHex(input);\n if (input.startsWith(\"rgb\")) return parseRgb(input);\n if (input.startsWith(\"hsl\")) return parseHsl(input);\n\n throw new Error(\"Unsupported format\");\n}\n\n/* ---------------- CORE MATH ---------------- */\n\nfunction srgbToLinear(c: number) {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\n\nfunction rgbToOklab(r: number, g: number, b: number) {\n r = srgbToLinear(r);\n g = srgbToLinear(g);\n b = srgbToLinear(b);\n\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n\n return {\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\n };\n}\n\nfunction oklabToOklch(L: number, a: number, b: number): OKLCH {\n const c = Math.sqrt(a * a + b * b);\n let h = Math.atan2(b, a) * (180 / Math.PI);\n\n if (h < 0) h += 360;\n\n return { l: L, c, h };\n}\n\n/* ---------------- FORMAT ---------------- */\n\nfunction formatOklch(color: OKLCH, alpha = 1): string {\n const l = (color.l * 100).toFixed(2) + \"%\";\n const c = color.c.toFixed(4);\n const h = color.h.toFixed(2);\n\n return alpha === 1\n ? `oklch(${l} ${c} ${h})`\n : `oklch(${l} ${c} ${h} / ${alpha})`;\n}\n\n/* ---------------- UTILS ---------------- */\n\nfunction clamp(v: number, min = 0, max = 1) {\n return Math.min(max, Math.max(min, v));\n}\n\nexport function createDarkThemePalette(input: string): ColorRole {\n const base = toOKLCH(input);\n\n const isNeutral = base.c < 0.03;\n const isDarkEnough = base.l < 0.2;\n const isNearBlack = isNeutral && isDarkEnough;\n const safeC = Math.min(base.c, 0.22);\n\n const main: OKLCH = {\n l: base.l,\n c: safeC,\n h: base.h\n };\n\n if (isNearBlack) {\n const neutralHue = 0;\n const safeC = Math.min(base.c, 0.25);\n\n const step = (i: number): OKLCH => {\n const offset = (i - 3) * 0.09;\n const l = clamp(base.l + offset)\n return { l, c: safeC, h: base.h };\n };\n\n return {\n main: formatOklch(main),\n light: formatOklch(step(3.5)),\n lighter: formatOklch(step(4.5)),\n dark: formatOklch(step(2.5)),\n darker: formatOklch(step(1.5)),\n contrast: formatOklch({ l: 0.96, c: 0, h: neutralHue }),\n muted: formatOklch({ l: 0.85, c: 0, h: neutralHue }),\n divider: formatOklch({\n l: 0.33,\n c: 0,\n h: 0\n }),\n ghost: formatOklch({ l: 0.96, c: 0, h: neutralHue }, 0.16)\n };\n }\n\n return createPalette(input, \"dark\")\n}\n\nexport function createLightThemePalette(input: string): ColorRole {\n const base = toOKLCH(input);\n\n const isNearWhite = base.l > 0.98 && base.c < 0.01;\n const main = formatOklch(base);\n if (isNearWhite) {\n const neutralHue = 0;\n const safeC = Math.min(base.c, 0.25);\n\n const step = (i: number): OKLCH => {\n const offset = (i - 3) * 0.09;\n const l = clamp(base.l - offset);\n return { l, c: safeC, h: base.h };\n };\n\n return {\n main,\n light: formatOklch(step(3.5)),\n lighter: formatOklch(step(4.5)),\n dark: formatOklch(step(5.5)),\n darker: formatOklch(step(6.5)),\n contrast: formatOklch({\n l: 0.12,\n c: 0,\n h: neutralHue\n }),\n muted: formatOklch({\n l: 0.50,\n c: 0,\n h: neutralHue\n }),\n divider: formatOklch({\n l: 0.75,\n c: 0,\n h: neutralHue\n }),\n ghost: formatOklch(\n { l: 0.12, c: 0, h: neutralHue },\n 0.12\n )\n };\n }\n\n return createPalette(input, \"light\");\n}\n\nexport function createPalette(input: string, mode: \"light\" | \"dark\" = \"light\"): ColorRole {\n const base = toOKLCH(input);\n const isDark = mode === \"dark\";\n const isLightColor = base.l > 0.75;\n const safeC = Math.min(base.c, 0.25);\n\n const step = (i: number): OKLCH => {\n const offset = (i - 3) * 0.09;\n const l = isDark ? clamp(base.l + offset) : clamp(base.l - offset);\n return { l, c: safeC, h: base.h };\n };\n\n const main: OKLCH = {\n l: base.l,\n c: safeC,\n h: base.h\n };\n\n const contrast = {\n l: !isLightColor ? 0.96 : 0.12,\n c: 0.02,\n h: base.h\n }\n\n return {\n main: formatOklch(main),\n light: formatOklch(step(isDark ? 4 : 2)),\n lighter: formatOklch(step(isDark ? 5 : 1)),\n dark: formatOklch(step(isDark ? 2 : 4)),\n darker: formatOklch(step(isDark ? 1 : 5)),\n ghost: formatOklch(main, isDark ? 0.12 : 0.18),\n\n contrast: formatOklch(contrast),\n\n muted: formatOklch({\n l: clamp(contrast.l - (isDark ? 0.05 : 0.025)),\n c: clamp(contrast.c - 0.01),\n h: contrast.h\n }),\n\n divider: formatOklch({\n l: clamp(contrast.l - (isDark ? 0.25 : 0.6)),\n c: clamp(contrast.c + .05),\n h: contrast.h\n }),\n };\n}\n/* ---------------- PARSERS ---------------- */\n\nfunction parseHex(hex: string) {\n hex = hex.replace(\"#\", \"\").trim();\n\n if (hex.length === 3) {\n hex = hex.split(\"\").map(c => c + c).join(\"\");\n }\n\n const num = parseInt(hex, 16);\n\n return {\n r: ((num >> 16) & 255) / 255,\n g: ((num >> 8) & 255) / 255,\n b: (num & 255) / 255,\n };\n}\n\nfunction parseRgb(input: string) {\n const values = input.match(/[\\d.]+/g);\n if (!values || values.length < 3) {\n throw new Error(\"Invalid RGB format\");\n }\n\n const [r, g, b] = values.map(Number);\n\n return {\n r: r / 255,\n g: g / 255,\n b: b / 255,\n };\n}\n\nfunction parseHsl(input: string) {\n const values = input.match(/[\\d.]+/g);\n if (!values || values.length < 3) {\n throw new Error(\"Invalid HSL format\");\n }\n\n let [h, s, l] = values.map(Number);\n\n h /= 360;\n s /= 100;\n l /= 100;\n\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n\n return {\n r: hue2rgb(p, q, h + 1 / 3),\n g: hue2rgb(p, q, h),\n b: hue2rgb(p, q, h - 1 / 3),\n };\n}\n"],"names":[],"mappings":"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"}