@xanui/core 1.3.12 → 1.3.13

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 (99) hide show
  1. package/AppRoot/AppRootProvider.cjs.map +1 -1
  2. package/AppRoot/AppRootProvider.js.map +1 -1
  3. package/AppRoot/Renderar.cjs.map +1 -1
  4. package/AppRoot/Renderar.js.map +1 -1
  5. package/AppRoot/index.cjs +2 -2
  6. package/AppRoot/index.cjs.map +1 -1
  7. package/AppRoot/index.js +2 -2
  8. package/AppRoot/index.js.map +1 -1
  9. package/Document/index.cjs.map +1 -1
  10. package/Document/index.js.map +1 -1
  11. package/Iframe/index.cjs.map +1 -1
  12. package/Iframe/index.js.map +1 -1
  13. package/Portal/index.cjs.map +1 -1
  14. package/Portal/index.js.map +1 -1
  15. package/Tag/ServerStyleTag.cjs.map +1 -1
  16. package/Tag/ServerStyleTag.js.map +1 -1
  17. package/Tag/cssPropList.cjs.map +1 -1
  18. package/Tag/cssPropList.js.map +1 -1
  19. package/Tag/index.cjs.map +1 -1
  20. package/Tag/index.js.map +1 -1
  21. package/Tag/useTagProps.cjs.map +1 -1
  22. package/Tag/useTagProps.js.map +1 -1
  23. package/Transition/index.cjs.map +1 -1
  24. package/Transition/index.js.map +1 -1
  25. package/Transition/variants.cjs.map +1 -1
  26. package/Transition/variants.js.map +1 -1
  27. package/animate/easing.cjs.map +1 -1
  28. package/animate/easing.js.map +1 -1
  29. package/animate/index.cjs.map +1 -1
  30. package/animate/index.js.map +1 -1
  31. package/breakpoint/BreakpointProvider.cjs.map +1 -1
  32. package/breakpoint/BreakpointProvider.js.map +1 -1
  33. package/breakpoint/useBreakpoint.cjs.map +1 -1
  34. package/breakpoint/useBreakpoint.js.map +1 -1
  35. package/breakpoint/useBreakpointProps.cjs.map +1 -1
  36. package/breakpoint/useBreakpointProps.js.map +1 -1
  37. package/cookie.cjs.map +1 -1
  38. package/cookie.js.map +1 -1
  39. package/css/CSSCacheProvider.cjs.map +1 -1
  40. package/css/CSSCacheProvider.js.map +1 -1
  41. package/css/aliases.cjs.map +1 -1
  42. package/css/aliases.js.map +1 -1
  43. package/css/getProps.cjs +1 -1
  44. package/css/getProps.cjs.map +1 -1
  45. package/css/getProps.js +1 -1
  46. package/css/getProps.js.map +1 -1
  47. package/css/getValue.cjs +7 -7
  48. package/css/getValue.cjs.map +1 -1
  49. package/css/getValue.js +7 -7
  50. package/css/getValue.js.map +1 -1
  51. package/css/index.cjs.map +1 -1
  52. package/css/index.js.map +1 -1
  53. package/hooks/useColorTemplate.cjs +10 -10
  54. package/hooks/useColorTemplate.cjs.map +1 -1
  55. package/hooks/useColorTemplate.js +10 -10
  56. package/hooks/useColorTemplate.js.map +1 -1
  57. package/hooks/useInView.cjs +32 -0
  58. package/hooks/useInView.cjs.map +1 -0
  59. package/hooks/useInView.d.ts +15 -0
  60. package/hooks/useInView.js +30 -0
  61. package/hooks/useInView.js.map +1 -0
  62. package/hooks/useInterface.cjs.map +1 -1
  63. package/hooks/useInterface.js.map +1 -1
  64. package/hooks/useMergeRefs.cjs.map +1 -1
  65. package/hooks/useMergeRefs.js.map +1 -1
  66. package/hooks/useTransition.cjs.map +1 -1
  67. package/hooks/useTransition.js.map +1 -1
  68. package/hooks/useTransitionGroup.cjs.map +1 -1
  69. package/hooks/useTransitionGroup.js.map +1 -1
  70. package/index.cjs +2 -0
  71. package/index.cjs.map +1 -1
  72. package/index.d.ts +1 -0
  73. package/index.js +1 -0
  74. package/index.js.map +1 -1
  75. package/package.json +1 -1
  76. package/readme.md +109 -109
  77. package/theme/ThemeCssVars.cjs +4 -4
  78. package/theme/ThemeCssVars.cjs.map +1 -1
  79. package/theme/ThemeCssVars.js +4 -4
  80. package/theme/ThemeCssVars.js.map +1 -1
  81. package/theme/ThemeDefaultOptions.cjs +2 -2
  82. package/theme/ThemeDefaultOptions.cjs.map +1 -1
  83. package/theme/ThemeDefaultOptions.js +2 -2
  84. package/theme/ThemeDefaultOptions.js.map +1 -1
  85. package/theme/ThemeProvider.cjs +4 -4
  86. package/theme/ThemeProvider.cjs.map +1 -1
  87. package/theme/ThemeProvider.js +4 -4
  88. package/theme/ThemeProvider.js.map +1 -1
  89. package/theme/core.cjs +4 -4
  90. package/theme/core.cjs.map +1 -1
  91. package/theme/core.js +4 -4
  92. package/theme/core.js.map +1 -1
  93. package/theme/index.cjs.map +1 -1
  94. package/theme/index.js.map +1 -1
  95. package/theme/oklch.cjs +89 -89
  96. package/theme/oklch.cjs.map +1 -1
  97. package/theme/oklch.js +89 -89
  98. package/theme/oklch.js.map +1 -1
  99. package/theme/types.d.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"core.cjs","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;;;;;"}
1
+ {"version":3,"file":"core.cjs","sources":["../../src/theme/core.ts"],"sourcesContent":["\"use client\"\r\nimport React, { useContext } from \"react\"\r\nimport { ObjectType, ThemeOptions, ThemeOptionInput } from \"./types\"\r\nimport { breakpoints } from \"../css\"\r\nimport { darkThemeOptions, lightThemeOptions } from \"./ThemeDefaultOptions\"\r\nimport { createPalette } from \"./oklch\"\r\n\r\nexport const mergeObject = (a: ObjectType, b: ObjectType) => {\r\n a = { ...a }\r\n b = { ...b }\r\n for (const key in b) {\r\n const v = (b as any)[key]\r\n if (typeof v === 'object' && !Array.isArray(v) && !React.isValidElement(v)) {\r\n a[key] = mergeObject(a[key], b[key])\r\n } else {\r\n a[key] = v\r\n }\r\n }\r\n return a\r\n}\r\n\r\n\r\nexport const createTheme = (options: ThemeOptionInput): ThemeOptions => {\r\n let mode = options?.mode ?? \"light\"\r\n const defaultOptions = mode === 'dark' ? darkThemeOptions : lightThemeOptions\r\n\r\n for (let key in options?.colors) {\r\n const color = (options as any)?.colors[key] as any\r\n if (typeof color === \"string\") {\r\n (options as any).colors[key] = createPalette(color)\r\n } else {\r\n const main = color.base\r\n if (main) {\r\n const pallate = createPalette(main);\r\n (options as any).colors[key] = {\r\n ...pallate,\r\n ...(options as any).colors[key],\r\n main: pallate.base\r\n }\r\n }\r\n }\r\n }\r\n\r\n let theme: any = mergeObject(defaultOptions, {\r\n name: mode === \"dark\" ? \"default-elevated\" : \"default-surface\",\r\n ...options,\r\n breakpoints: breakpoints\r\n })\r\n\r\n return theme as ThemeOptions\r\n}\r\n\r\nexport type ThemeCntextProps = {\r\n theme: ThemeOptions,\r\n onChange: (theme: ThemeOptions) => void\r\n}\r\n\r\nexport const ThemeContex = React.createContext<ThemeCntextProps>({\r\n theme: createTheme({\r\n name: \"default-surface\"\r\n }),\r\n onChange(theme) { },\r\n})\r\n\r\nexport const useTheme = () => {\r\n const ctx = useContext(ThemeContex)\r\n const theme = ctx.theme\r\n theme.change = (theme: ThemeOptionInput) => ctx.onChange(createTheme(theme))\r\n return theme\r\n}\r\n\r\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/core.js CHANGED
@@ -28,19 +28,19 @@ const createTheme = (options) => {
28
28
  options.colors[key] = createPalette(color);
29
29
  }
30
30
  else {
31
- const main = color.main;
31
+ const main = color.base;
32
32
  if (main) {
33
33
  const pallate = createPalette(main);
34
- options.colors[key] = Object.assign(Object.assign(Object.assign({}, pallate), options.colors[key]), { main: pallate.main });
34
+ options.colors[key] = Object.assign(Object.assign(Object.assign({}, pallate), options.colors[key]), { main: pallate.base });
35
35
  }
36
36
  }
37
37
  }
38
- let theme = mergeObject(defaultOptions, Object.assign(Object.assign({ name: mode === "dark" ? "default-dark" : "default-light" }, options), { breakpoints: breakpoints }));
38
+ let theme = mergeObject(defaultOptions, Object.assign(Object.assign({ name: mode === "dark" ? "default-elevated" : "default-surface" }, options), { breakpoints: breakpoints }));
39
39
  return theme;
40
40
  };
41
41
  const ThemeContex = React__default.createContext({
42
42
  theme: createTheme({
43
- name: "default-light"
43
+ name: "default-surface"
44
44
  }),
45
45
  onChange(theme) { },
46
46
  });
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 } 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;;"}
1
+ {"version":3,"file":"core.js","sources":["../../src/theme/core.ts"],"sourcesContent":["\"use client\"\r\nimport React, { useContext } from \"react\"\r\nimport { ObjectType, ThemeOptions, ThemeOptionInput } from \"./types\"\r\nimport { breakpoints } from \"../css\"\r\nimport { darkThemeOptions, lightThemeOptions } from \"./ThemeDefaultOptions\"\r\nimport { createPalette } from \"./oklch\"\r\n\r\nexport const mergeObject = (a: ObjectType, b: ObjectType) => {\r\n a = { ...a }\r\n b = { ...b }\r\n for (const key in b) {\r\n const v = (b as any)[key]\r\n if (typeof v === 'object' && !Array.isArray(v) && !React.isValidElement(v)) {\r\n a[key] = mergeObject(a[key], b[key])\r\n } else {\r\n a[key] = v\r\n }\r\n }\r\n return a\r\n}\r\n\r\n\r\nexport const createTheme = (options: ThemeOptionInput): ThemeOptions => {\r\n let mode = options?.mode ?? \"light\"\r\n const defaultOptions = mode === 'dark' ? darkThemeOptions : lightThemeOptions\r\n\r\n for (let key in options?.colors) {\r\n const color = (options as any)?.colors[key] as any\r\n if (typeof color === \"string\") {\r\n (options as any).colors[key] = createPalette(color)\r\n } else {\r\n const main = color.base\r\n if (main) {\r\n const pallate = createPalette(main);\r\n (options as any).colors[key] = {\r\n ...pallate,\r\n ...(options as any).colors[key],\r\n main: pallate.base\r\n }\r\n }\r\n }\r\n }\r\n\r\n let theme: any = mergeObject(defaultOptions, {\r\n name: mode === \"dark\" ? \"default-elevated\" : \"default-surface\",\r\n ...options,\r\n breakpoints: breakpoints\r\n })\r\n\r\n return theme as ThemeOptions\r\n}\r\n\r\nexport type ThemeCntextProps = {\r\n theme: ThemeOptions,\r\n onChange: (theme: ThemeOptions) => void\r\n}\r\n\r\nexport const ThemeContex = React.createContext<ThemeCntextProps>({\r\n theme: createTheme({\r\n name: \"default-surface\"\r\n }),\r\n onChange(theme) { },\r\n})\r\n\r\nexport const useTheme = () => {\r\n const ctx = useContext(ThemeContex)\r\n const theme = ctx.theme\r\n theme.change = (theme: ThemeOptionInput) => ctx.onChange(createTheme(theme))\r\n return theme\r\n}\r\n\r\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;;"}
@@ -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\"\r\nimport ThemeProvider from './ThemeProvider'\r\nimport { useTheme, createTheme } from './core'\r\nimport { lightThemeOptions, darkThemeOptions } from './ThemeDefaultOptions'\r\nexport type { ThemeProviderProps } from './ThemeProvider'\r\n\r\nexport const themeRootClass = (theme: string) => `.xui-${theme}-theme-root`\r\n\r\nexport {\r\n ThemeProvider,\r\n createTheme,\r\n useTheme,\r\n lightThemeOptions,\r\n darkThemeOptions\r\n}\r\n\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAMO;;;;;;"}
@@ -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\"\r\nimport ThemeProvider from './ThemeProvider'\r\nimport { useTheme, createTheme } from './core'\r\nimport { lightThemeOptions, darkThemeOptions } from './ThemeDefaultOptions'\r\nexport type { ThemeProviderProps } from './ThemeProvider'\r\n\r\nexport const themeRootClass = (theme: string) => `.xui-${theme}-theme-root`\r\n\r\nexport {\r\n ThemeProvider,\r\n createTheme,\r\n useTheme,\r\n lightThemeOptions,\r\n darkThemeOptions\r\n}\r\n\r\n"],"names":[],"mappings":";;;;;;;;;;;;AAMO;;"}
package/theme/oklch.cjs CHANGED
@@ -68,119 +68,119 @@ function formatOklch(color, alpha = 1) {
68
68
  function clamp(v, min = 0, max = 1) {
69
69
  return Math.min(max, Math.max(min, v));
70
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,
71
+ const SCALE = {
72
+ subtle: 0.18,
73
+ surface: 0.09,
74
+ elevated: -0.1,
75
+ emphasis: -0.18
76
+ };
77
+ function shift(base, amount) {
78
+ return {
79
+ l: clamp(base.l + amount),
80
+ c: base.c,
80
81
  h: base.h
81
82
  };
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.3,
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");
83
+ }
84
+ function createDarkThemePalette(input) {
85
+ const raw = toOKLCH(input);
86
+ const base = {
87
+ l: clamp(raw.l, 0.05, 0.95),
88
+ c: Math.min(raw.c, 0.22),
89
+ h: raw.h,
90
+ };
91
+ base.c;
92
+ return {
93
+ base: formatOklch(base),
94
+ surface: formatOklch(shift(base, SCALE.surface)),
95
+ subtle: formatOklch(shift(base, SCALE.subtle)),
96
+ elevated: formatOklch(shift(base, SCALE.elevated)),
97
+ emphasis: formatOklch(shift(base, SCALE.emphasis)),
98
+ contrast: formatOklch({
99
+ l: 0.94,
100
+ c: 0.01,
101
+ h: base.h
102
+ }),
103
+ muted: formatOklch({
104
+ l: 0.72,
105
+ c: 0.015,
106
+ h: base.h
107
+ }),
108
+ divider: formatOklch({
109
+ l: 0.40,
110
+ c: 0,
111
+ h: 0
112
+ }),
113
+ ghost: formatOklch(shift(base, SCALE.emphasis), 0.14)
114
+ };
107
115
  }
108
116
  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(4)),
123
- lighter: formatOklch(step(3.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.80,
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");
117
+ const raw = toOKLCH(input);
118
+ const base = {
119
+ l: clamp(raw.l, 0.05, 0.95),
120
+ c: Math.min(raw.c, 0.22),
121
+ h: raw.h,
122
+ };
123
+ return {
124
+ base: formatOklch(base),
125
+ surface: formatOklch(shift(base, SCALE.surface)),
126
+ subtle: formatOklch(shift(base, SCALE.subtle)),
127
+ elevated: formatOklch(shift(base, SCALE.elevated)),
128
+ emphasis: formatOklch(shift(base, SCALE.emphasis)),
129
+ contrast: formatOklch({
130
+ l: 0.20,
131
+ c: 0,
132
+ h: 0
133
+ }),
134
+ muted: formatOklch({
135
+ l: 0.50,
136
+ c: 0.015,
137
+ h: base.h
138
+ }),
139
+ divider: formatOklch({
140
+ l: 0.88,
141
+ c: 0,
142
+ h: 0
143
+ }),
144
+ ghost: formatOklch(shift(base, SCALE.emphasis), 0.2)
145
+ };
145
146
  }
146
147
  function createPalette(input, mode = "light") {
147
148
  const base = toOKLCH(input);
148
149
  const isDark = mode === "dark";
149
150
  const isLightColor = base.l > 0.75;
150
151
  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
152
  const main = {
157
153
  l: base.l,
158
154
  c: safeC,
159
155
  h: base.h
160
156
  };
161
157
  const contrast = {
162
- l: !isLightColor ? 0.96 : 0.12,
158
+ l: isLightColor ? 0.1 : 0.95,
163
159
  c: 0.02,
164
160
  h: base.h
165
161
  };
166
162
  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),
163
+ base: formatOklch(main),
164
+ surface: formatOklch(shift(base, SCALE.surface)),
165
+ subtle: formatOklch(shift(base, SCALE.subtle)),
166
+ elevated: formatOklch(shift(base, SCALE.elevated)),
167
+ emphasis: formatOklch(shift(base, SCALE.emphasis)),
168
+ ghost: formatOklch({
169
+ l: base.l,
170
+ c: safeC * 0.45,
171
+ h: base.h
172
+ }, isDark ? 0.14 : 0.18),
173
173
  contrast: formatOklch(contrast),
174
174
  muted: formatOklch({
175
- l: clamp(contrast.l - (isDark ? 0.05 : 0.025)),
176
- c: clamp(contrast.c - 0.01),
177
- h: contrast.h
175
+ l: isDark ? 0.72 : 0.50,
176
+ c: 0.015,
177
+ h: base.h
178
178
  }),
179
179
  divider: formatOklch({
180
- l: clamp(contrast.l - (isDark ? 0.65 : 0.2)),
181
- c: clamp(contrast.c + (isDark ? 0 : .02)),
182
- h: contrast.h
183
- }),
180
+ l: clamp(main.l + (isDark ? -0.15 : 0.15)),
181
+ c: Math.min(main.c * 0.15, 0.02),
182
+ h: main.h
183
+ })
184
184
  };
185
185
  }
186
186
  /* ---------------- PARSERS ---------------- */
@@ -1 +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.3,\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(4)),\n lighter: formatOklch(step(3.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.80,\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.65 : 0.2)),\n c: clamp(contrast.c + (isDark ? 0 : .02)),\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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"}
1
+ {"version":3,"file":"oklch.cjs","sources":["../../src/theme/oklch.ts"],"sourcesContent":["type OKLCH = {\r\n l: number;\r\n c: number;\r\n h: number;\r\n};\r\n\r\ntype ColorRole = {\r\n base: string;\r\n surface: string;\r\n subtle: string;\r\n elevated: string;\r\n emphasis: string;\r\n contrast: string;\r\n muted: string;\r\n ghost: string;\r\n divider: string;\r\n};\r\n\r\n/* ---------------- PARSERS ---------------- */\r\n\r\nexport function toOKLCH(input: string): OKLCH {\r\n if (input.startsWith(\"oklch\")) {\r\n const values = input.match(/[\\d.]+/g);\r\n if (!values || values.length < 3) {\r\n throw new Error(\"Invalid OKLCH format\");\r\n }\r\n\r\n let [l, c, h] = values.map(Number);\r\n\r\n return {\r\n l: l > 1 ? l / 100 : l,\r\n c,\r\n h,\r\n };\r\n }\r\n\r\n const rgb = parseToRgb(input);\r\n const lab = rgbToOklab(rgb.r, rgb.g, rgb.b);\r\n return oklabToOklch(lab.L, lab.a, lab.b);\r\n}\r\n\r\nfunction parseToRgb(input: string) {\r\n input = input.trim().toLowerCase();\r\n\r\n if (input.startsWith(\"#\")) return parseHex(input);\r\n if (input.startsWith(\"rgb\")) return parseRgb(input);\r\n if (input.startsWith(\"hsl\")) return parseHsl(input);\r\n\r\n throw new Error(\"Unsupported format\");\r\n}\r\n\r\n/* ---------------- CORE MATH ---------------- */\r\n\r\nfunction srgbToLinear(c: number) {\r\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\r\n}\r\n\r\nfunction rgbToOklab(r: number, g: number, b: number) {\r\n r = srgbToLinear(r);\r\n g = srgbToLinear(g);\r\n b = srgbToLinear(b);\r\n\r\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\r\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\r\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\r\n\r\n const l_ = Math.cbrt(l);\r\n const m_ = Math.cbrt(m);\r\n const s_ = Math.cbrt(s);\r\n\r\n return {\r\n L: 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\r\n a: 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\r\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_,\r\n };\r\n}\r\n\r\nfunction oklabToOklch(L: number, a: number, b: number): OKLCH {\r\n const c = Math.sqrt(a * a + b * b);\r\n let h = Math.atan2(b, a) * (180 / Math.PI);\r\n\r\n if (h < 0) h += 360;\r\n\r\n return { l: L, c, h };\r\n}\r\n\r\n/* ---------------- FORMAT ---------------- */\r\n\r\nfunction formatOklch(color: OKLCH, alpha = 1): string {\r\n const l = (color.l * 100).toFixed(2) + \"%\";\r\n const c = color.c.toFixed(4);\r\n const h = color.h.toFixed(2);\r\n\r\n return alpha === 1\r\n ? `oklch(${l} ${c} ${h})`\r\n : `oklch(${l} ${c} ${h} / ${alpha})`;\r\n}\r\n\r\n/* ---------------- UTILS ---------------- */\r\n\r\nfunction clamp(v: number, min = 0, max = 1) {\r\n return Math.min(max, Math.max(min, v));\r\n}\r\n\r\n\r\nconst SCALE = {\r\n subtle: 0.18,\r\n surface: 0.09,\r\n elevated: -0.10,\r\n emphasis: -0.18\r\n}\r\n\r\nfunction shift(base: OKLCH, amount: number): OKLCH {\r\n return {\r\n l: clamp(base.l + amount),\r\n c: base.c,\r\n h: base.h\r\n };\r\n}\r\n\r\n\r\nexport function createDarkThemePalette(input: string): ColorRole {\r\n const raw = toOKLCH(input);\r\n\r\n const base: OKLCH = {\r\n l: clamp(raw.l, 0.05, 0.95),\r\n c: Math.min(raw.c, 0.22),\r\n h: raw.h,\r\n };\r\n\r\n const safeC = base.c;\r\n\r\n return {\r\n base: formatOklch(base),\r\n\r\n surface: formatOklch(shift(base, SCALE.surface)),\r\n subtle: formatOklch(shift(base, SCALE.subtle)),\r\n\r\n elevated: formatOklch(shift(base, SCALE.elevated)),\r\n emphasis: formatOklch(shift(base, SCALE.emphasis)),\r\n\r\n contrast: formatOklch({\r\n l: 0.94,\r\n c: 0.01,\r\n h: base.h\r\n }),\r\n\r\n muted: formatOklch({\r\n l: 0.72,\r\n c: 0.015,\r\n h: base.h\r\n }),\r\n\r\n divider: formatOklch({\r\n l: 0.40,\r\n c: 0,\r\n h: 0\r\n }),\r\n\r\n ghost: formatOklch(shift(base, SCALE.emphasis), 0.14)\r\n };\r\n}\r\n\r\nexport function createLightThemePalette(input: string): ColorRole {\r\n const raw = toOKLCH(input);\r\n\r\n const base: OKLCH = {\r\n l: clamp(raw.l, 0.05, 0.95),\r\n c: Math.min(raw.c, 0.22),\r\n h: raw.h,\r\n };\r\n\r\n return {\r\n base: formatOklch(base),\r\n\r\n surface: formatOklch(shift(base, SCALE.surface)),\r\n subtle: formatOklch(shift(base, SCALE.subtle)),\r\n\r\n elevated: formatOklch(shift(base, SCALE.elevated)),\r\n emphasis: formatOklch(shift(base, SCALE.emphasis)),\r\n\r\n contrast: formatOklch({\r\n l: 0.20,\r\n c: 0,\r\n h: 0\r\n }),\r\n\r\n muted: formatOklch({\r\n l: 0.50,\r\n c: 0.015,\r\n h: base.h\r\n }),\r\n\r\n divider: formatOklch({\r\n l: 0.88,\r\n c: 0,\r\n h: 0\r\n }),\r\n\r\n ghost: formatOklch(shift(base, SCALE.emphasis), 0.2)\r\n };\r\n}\r\n\r\nexport function createPalette(input: string, mode: \"light\" | \"dark\" = \"light\"): ColorRole {\r\n const base = toOKLCH(input);\r\n const isDark = mode === \"dark\";\r\n const isLightColor = base.l > 0.75;\r\n const safeC = Math.min(base.c, 0.25);\r\n\r\n const main: OKLCH = {\r\n l: base.l,\r\n c: safeC,\r\n h: base.h\r\n };\r\n\r\n const contrast = {\r\n l: isLightColor ? 0.1 : 0.95,\r\n c: 0.02,\r\n h: base.h\r\n }\r\n\r\n return {\r\n\r\n base: formatOklch(main),\r\n\r\n surface: formatOklch(shift(base, SCALE.surface)),\r\n subtle: formatOklch(shift(base, SCALE.subtle)),\r\n\r\n elevated: formatOklch(shift(base, SCALE.elevated)),\r\n emphasis: formatOklch(shift(base, SCALE.emphasis)),\r\n\r\n ghost: formatOklch({\r\n l: base.l,\r\n c: safeC * 0.45,\r\n h: base.h\r\n }, isDark ? 0.14 : 0.18),\r\n\r\n contrast: formatOklch(contrast),\r\n\r\n muted: formatOklch({\r\n l: isDark ? 0.72 : 0.50,\r\n c: 0.015,\r\n h: base.h\r\n }),\r\n\r\n divider: formatOklch({\r\n l: clamp(main.l + (isDark ? -0.15 : 0.15)),\r\n c: Math.min(main.c * 0.15, 0.02),\r\n h: main.h\r\n })\r\n };\r\n}\r\n/* ---------------- PARSERS ---------------- */\r\n\r\nfunction parseHex(hex: string) {\r\n hex = hex.replace(\"#\", \"\").trim();\r\n\r\n if (hex.length === 3) {\r\n hex = hex.split(\"\").map(c => c + c).join(\"\");\r\n }\r\n\r\n const num = parseInt(hex, 16);\r\n\r\n return {\r\n r: ((num >> 16) & 255) / 255,\r\n g: ((num >> 8) & 255) / 255,\r\n b: (num & 255) / 255,\r\n };\r\n}\r\n\r\nfunction parseRgb(input: string) {\r\n const values = input.match(/[\\d.]+/g);\r\n if (!values || values.length < 3) {\r\n throw new Error(\"Invalid RGB format\");\r\n }\r\n\r\n const [r, g, b] = values.map(Number);\r\n\r\n return {\r\n r: r / 255,\r\n g: g / 255,\r\n b: b / 255,\r\n };\r\n}\r\n\r\nfunction parseHsl(input: string) {\r\n const values = input.match(/[\\d.]+/g);\r\n if (!values || values.length < 3) {\r\n throw new Error(\"Invalid HSL format\");\r\n }\r\n\r\n let [h, s, l] = values.map(Number);\r\n\r\n h /= 360;\r\n s /= 100;\r\n l /= 100;\r\n\r\n const hue2rgb = (p: number, q: number, t: number) => {\r\n if (t < 0) t += 1;\r\n if (t > 1) t -= 1;\r\n if (t < 1 / 6) return p + (q - p) * 6 * t;\r\n if (t < 1 / 2) return q;\r\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\r\n return p;\r\n };\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n\r\n return {\r\n r: hue2rgb(p, q, h + 1 / 3),\r\n g: hue2rgb(p, q, h),\r\n b: hue2rgb(p, q, h - 1 / 3),\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
package/theme/oklch.js CHANGED
@@ -66,119 +66,119 @@ function formatOklch(color, alpha = 1) {
66
66
  function clamp(v, min = 0, max = 1) {
67
67
  return Math.min(max, Math.max(min, v));
68
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,
69
+ const SCALE = {
70
+ subtle: 0.18,
71
+ surface: 0.09,
72
+ elevated: -0.1,
73
+ emphasis: -0.18
74
+ };
75
+ function shift(base, amount) {
76
+ return {
77
+ l: clamp(base.l + amount),
78
+ c: base.c,
78
79
  h: base.h
79
80
  };
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.3,
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");
81
+ }
82
+ function createDarkThemePalette(input) {
83
+ const raw = toOKLCH(input);
84
+ const base = {
85
+ l: clamp(raw.l, 0.05, 0.95),
86
+ c: Math.min(raw.c, 0.22),
87
+ h: raw.h,
88
+ };
89
+ base.c;
90
+ return {
91
+ base: formatOklch(base),
92
+ surface: formatOklch(shift(base, SCALE.surface)),
93
+ subtle: formatOklch(shift(base, SCALE.subtle)),
94
+ elevated: formatOklch(shift(base, SCALE.elevated)),
95
+ emphasis: formatOklch(shift(base, SCALE.emphasis)),
96
+ contrast: formatOklch({
97
+ l: 0.94,
98
+ c: 0.01,
99
+ h: base.h
100
+ }),
101
+ muted: formatOklch({
102
+ l: 0.72,
103
+ c: 0.015,
104
+ h: base.h
105
+ }),
106
+ divider: formatOklch({
107
+ l: 0.40,
108
+ c: 0,
109
+ h: 0
110
+ }),
111
+ ghost: formatOklch(shift(base, SCALE.emphasis), 0.14)
112
+ };
105
113
  }
106
114
  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(4)),
121
- lighter: formatOklch(step(3.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.80,
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");
115
+ const raw = toOKLCH(input);
116
+ const base = {
117
+ l: clamp(raw.l, 0.05, 0.95),
118
+ c: Math.min(raw.c, 0.22),
119
+ h: raw.h,
120
+ };
121
+ return {
122
+ base: formatOklch(base),
123
+ surface: formatOklch(shift(base, SCALE.surface)),
124
+ subtle: formatOklch(shift(base, SCALE.subtle)),
125
+ elevated: formatOklch(shift(base, SCALE.elevated)),
126
+ emphasis: formatOklch(shift(base, SCALE.emphasis)),
127
+ contrast: formatOklch({
128
+ l: 0.20,
129
+ c: 0,
130
+ h: 0
131
+ }),
132
+ muted: formatOklch({
133
+ l: 0.50,
134
+ c: 0.015,
135
+ h: base.h
136
+ }),
137
+ divider: formatOklch({
138
+ l: 0.88,
139
+ c: 0,
140
+ h: 0
141
+ }),
142
+ ghost: formatOklch(shift(base, SCALE.emphasis), 0.2)
143
+ };
143
144
  }
144
145
  function createPalette(input, mode = "light") {
145
146
  const base = toOKLCH(input);
146
147
  const isDark = mode === "dark";
147
148
  const isLightColor = base.l > 0.75;
148
149
  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
150
  const main = {
155
151
  l: base.l,
156
152
  c: safeC,
157
153
  h: base.h
158
154
  };
159
155
  const contrast = {
160
- l: !isLightColor ? 0.96 : 0.12,
156
+ l: isLightColor ? 0.1 : 0.95,
161
157
  c: 0.02,
162
158
  h: base.h
163
159
  };
164
160
  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),
161
+ base: formatOklch(main),
162
+ surface: formatOklch(shift(base, SCALE.surface)),
163
+ subtle: formatOklch(shift(base, SCALE.subtle)),
164
+ elevated: formatOklch(shift(base, SCALE.elevated)),
165
+ emphasis: formatOklch(shift(base, SCALE.emphasis)),
166
+ ghost: formatOklch({
167
+ l: base.l,
168
+ c: safeC * 0.45,
169
+ h: base.h
170
+ }, isDark ? 0.14 : 0.18),
171
171
  contrast: formatOklch(contrast),
172
172
  muted: formatOklch({
173
- l: clamp(contrast.l - (isDark ? 0.05 : 0.025)),
174
- c: clamp(contrast.c - 0.01),
175
- h: contrast.h
173
+ l: isDark ? 0.72 : 0.50,
174
+ c: 0.015,
175
+ h: base.h
176
176
  }),
177
177
  divider: formatOklch({
178
- l: clamp(contrast.l - (isDark ? 0.65 : 0.2)),
179
- c: clamp(contrast.c + (isDark ? 0 : .02)),
180
- h: contrast.h
181
- }),
178
+ l: clamp(main.l + (isDark ? -0.15 : 0.15)),
179
+ c: Math.min(main.c * 0.15, 0.02),
180
+ h: main.h
181
+ })
182
182
  };
183
183
  }
184
184
  /* ---------------- PARSERS ---------------- */