@xanui/core 1.3.7 → 1.3.9

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 (116) 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 +6 -5
  6. package/AppRoot/index.cjs.map +1 -1
  7. package/AppRoot/index.d.ts +2 -1
  8. package/AppRoot/index.js +6 -5
  9. package/AppRoot/index.js.map +1 -1
  10. package/Document/index.cjs.map +1 -1
  11. package/Document/index.js.map +1 -1
  12. package/Iframe/index.cjs +1 -0
  13. package/Iframe/index.cjs.map +1 -1
  14. package/Iframe/index.js +1 -0
  15. package/Iframe/index.js.map +1 -1
  16. package/Portal/index.cjs.map +1 -1
  17. package/Portal/index.js.map +1 -1
  18. package/Tag/ServerStyleTag.cjs.map +1 -1
  19. package/Tag/ServerStyleTag.js.map +1 -1
  20. package/Tag/cssPropList.cjs.map +1 -1
  21. package/Tag/cssPropList.js.map +1 -1
  22. package/Tag/index.cjs +2 -2
  23. package/Tag/index.cjs.map +1 -1
  24. package/Tag/index.js +2 -2
  25. package/Tag/index.js.map +1 -1
  26. package/Tag/types.d.ts +3 -2
  27. package/Tag/useTagProps.cjs +23 -4
  28. package/Tag/useTagProps.cjs.map +1 -1
  29. package/Tag/useTagProps.d.ts +1 -0
  30. package/Tag/useTagProps.js +23 -4
  31. package/Tag/useTagProps.js.map +1 -1
  32. package/Transition/index.cjs +1 -1
  33. package/Transition/index.cjs.map +1 -1
  34. package/Transition/index.d.ts +7 -2
  35. package/Transition/index.js +1 -1
  36. package/Transition/index.js.map +1 -1
  37. package/Transition/variants.cjs.map +1 -1
  38. package/Transition/variants.js.map +1 -1
  39. package/animate/easing.cjs.map +1 -1
  40. package/animate/easing.js.map +1 -1
  41. package/animate/index.cjs.map +1 -1
  42. package/animate/index.js.map +1 -1
  43. package/breakpoint/BreakpointProvider.cjs.map +1 -1
  44. package/breakpoint/BreakpointProvider.js.map +1 -1
  45. package/breakpoint/useBreakpoint.cjs.map +1 -1
  46. package/breakpoint/useBreakpoint.js.map +1 -1
  47. package/breakpoint/useBreakpointProps.cjs.map +1 -1
  48. package/breakpoint/useBreakpointProps.js.map +1 -1
  49. package/cookie.cjs.map +1 -1
  50. package/cookie.js.map +1 -1
  51. package/css/CSSCacheProvider.cjs.map +1 -1
  52. package/css/CSSCacheProvider.js.map +1 -1
  53. package/css/aliases.cjs.map +1 -1
  54. package/css/aliases.js.map +1 -1
  55. package/css/getProps.cjs +9 -6
  56. package/css/getProps.cjs.map +1 -1
  57. package/css/getProps.js +9 -6
  58. package/css/getProps.js.map +1 -1
  59. package/css/getValue.cjs +11 -10
  60. package/css/getValue.cjs.map +1 -1
  61. package/css/getValue.js +11 -10
  62. package/css/getValue.js.map +1 -1
  63. package/css/index.cjs +0 -32
  64. package/css/index.cjs.map +1 -1
  65. package/css/index.d.ts +1 -4
  66. package/css/index.js +1 -30
  67. package/css/index.js.map +1 -1
  68. package/hooks/useColorTemplate.cjs +26 -29
  69. package/hooks/useColorTemplate.cjs.map +1 -1
  70. package/hooks/useColorTemplate.d.ts +8 -6
  71. package/hooks/useColorTemplate.js +26 -29
  72. package/hooks/useColorTemplate.js.map +1 -1
  73. package/hooks/useInterface.cjs +1 -0
  74. package/hooks/useInterface.cjs.map +1 -1
  75. package/hooks/useInterface.d.ts +1 -3
  76. package/hooks/useInterface.js +1 -0
  77. package/hooks/useInterface.js.map +1 -1
  78. package/hooks/useMergeRefs.cjs.map +1 -1
  79. package/hooks/useMergeRefs.js.map +1 -1
  80. package/hooks/useTransition.cjs.map +1 -1
  81. package/hooks/useTransition.js.map +1 -1
  82. package/hooks/useTransitionGroup.cjs.map +1 -1
  83. package/hooks/useTransitionGroup.js.map +1 -1
  84. package/index.cjs +0 -3
  85. package/index.cjs.map +1 -1
  86. package/index.d.ts +3 -3
  87. package/index.js +1 -1
  88. package/package.json +1 -1
  89. package/readme.md +109 -109
  90. package/theme/ThemeCssVars.cjs +39 -3
  91. package/theme/ThemeCssVars.cjs.map +1 -1
  92. package/theme/ThemeCssVars.js +39 -3
  93. package/theme/ThemeCssVars.js.map +1 -1
  94. package/theme/ThemeDefaultOptions.cjs +20 -86
  95. package/theme/ThemeDefaultOptions.cjs.map +1 -1
  96. package/theme/ThemeDefaultOptions.js +20 -86
  97. package/theme/ThemeDefaultOptions.js.map +1 -1
  98. package/theme/ThemeProvider.cjs +4 -3
  99. package/theme/ThemeProvider.cjs.map +1 -1
  100. package/theme/ThemeProvider.d.ts +3 -3
  101. package/theme/ThemeProvider.js +5 -4
  102. package/theme/ThemeProvider.js.map +1 -1
  103. package/theme/core.cjs +22 -13
  104. package/theme/core.cjs.map +1 -1
  105. package/theme/core.d.ts +1 -1
  106. package/theme/core.js +24 -15
  107. package/theme/core.js.map +1 -1
  108. package/theme/index.cjs +3 -0
  109. package/theme/index.cjs.map +1 -1
  110. package/theme/index.js +1 -0
  111. package/theme/index.js.map +1 -1
  112. package/theme/oklch.cjs +249 -0
  113. package/theme/oklch.cjs.map +1 -0
  114. package/theme/oklch.js +246 -0
  115. package/theme/oklch.js.map +1 -0
  116. package/theme/types.d.ts +28 -70
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.cjs","sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\r\nimport * as React from \"react\"\r\nimport { ThemeOptions } from \"./types\"\r\nimport Tag from \"../Tag\"\r\nimport { TagComponentType, TagProps } from \"../Tag/types\"\r\nimport { ThemeContex } from \"./core\"\r\nimport ThemeCssVars from \"./ThemeCssVars\"\r\nimport { css } from \"../css\"\r\nimport ServerStyleTag from \"../Tag/ServerStyleTag\"\r\nimport { useDocument } from \"../Document\";\r\nimport { themeRootClass } from \".\";\r\nimport { useCSSCacheId } from \"../css/CSSCacheProvider\";\r\n\r\nexport type ThemeProviderProps<T extends TagComponentType = 'div'> = TagProps<T> & {\r\n theme: ThemeOptions;\r\n onThemeChange?: (theme: ThemeOptions) => void\r\n isRoot?: boolean;\r\n noScrollbarCss?: boolean;\r\n}\r\n\r\nconst ThemeProvider = <T extends TagComponentType = 'div'>({ children, theme, onThemeChange, isRoot, noScrollbarCss, ...props }: ThemeProviderProps<T>) => {\r\n const doc = useDocument()\r\n const cacheId = useCSSCacheId()\r\n\r\n const themeGlobalStyle: any = React.useMemo(() => {\r\n const root_cls = `.xui-${theme.name}-theme-root`\r\n let gkeys = Object.keys(theme.globalStyle || {})\r\n let gstyles: any = {}\r\n gkeys.forEach((key) => {\r\n gstyles[`${root_cls} ${key}`] = theme.globalStyle[key as any]\r\n })\r\n\r\n return css({\r\n \"@global\": {\r\n ...gstyles,\r\n [root_cls]: ThemeCssVars(theme)\r\n }\r\n }, {\r\n injectStyle: typeof window !== 'undefined',\r\n container: doc?.document,\r\n cacheId\r\n })\r\n }, [theme, doc])\r\n\r\n const resetCss = React.useMemo(() => {\r\n if (!isRoot) return\r\n return css({\r\n \"@global\": {\r\n \"*\": {\r\n m: 0,\r\n p: 0,\r\n outline: \"none\",\r\n boxSizing: \"border-box\",\r\n verticalAlign: \"baseline\",\r\n },\r\n \"html, body\": {\r\n height: \"100%\",\r\n \"-webkit-font-smoothing\": \"antialiased\",\r\n \"-moz-osx-font-smoothing\": \"grayscale\",\r\n } as any,\r\n \"img, picture, video, canvas, svg\": {\r\n maxWidth: \"100%\",\r\n display: \"block\"\r\n },\r\n \"input, button, textarea, select\": {\r\n font: \"inherit\"\r\n },\r\n \"table\": {\r\n borderCollapse: \"collapse\",\r\n borderSpacing: 0,\r\n },\r\n \"ol, ul\": {\r\n listStyle: \"none\",\r\n padding: 0,\r\n margin: 0,\r\n },\r\n \"a\": {\r\n display: \"inline-block\",\r\n color: \"inherit\",\r\n textDecoration: \"none\",\r\n cursor: \"pointer\",\r\n \"&:hover\": {\r\n textDecoration: \"underline\"\r\n }\r\n },\r\n \"p, h1, h2, h3, h4, h5, h6\": {\r\n overflowWrap: \"break-word\",\r\n },\r\n }\r\n }, {\r\n injectStyle: typeof window !== 'undefined',\r\n container: doc?.document,\r\n cacheId\r\n })\r\n }, [])\r\n\r\n const scrollbarCss: any = React.useMemo(() => {\r\n if (noScrollbarCss) return;\r\n const cls = (cls: string) => `${themeRootClass(theme.name)} ${cls}`\r\n let thumbSize = 6\r\n let thumbColor = \"var(--color-text-secondary)\"\r\n let trackColor = \"transparent\"\r\n\r\n return css({\r\n \"@global\": {\r\n [cls('*::-webkit-scrollbar')]: {\r\n width: thumbSize,\r\n height: thumbSize,\r\n },\r\n [cls(\"*::-webkit-scrollbar-thumb\")]: {\r\n backgroundColor: thumbColor,\r\n borderRadius: \"6px\",\r\n opacity: 0.6,\r\n },\r\n [cls(\"*::-webkit-scrollbar-thumb:hover\")]: {\r\n backgroundColor: thumbColor,\r\n opacity: 0.0,\r\n },\r\n [cls(\"*::-webkit-scrollbar-track\")]: {\r\n backgroundColor: trackColor,\r\n borderRadius: \"6px\",\r\n },\r\n }\r\n }, {\r\n injectStyle: typeof window !== 'undefined',\r\n container: doc?.document,\r\n cacheId\r\n }) as any\r\n }, [noScrollbarCss, theme])\r\n\r\n return (\r\n <ThemeContex.Provider\r\n value={{\r\n theme,\r\n onChange: (t) => {\r\n onThemeChange && onThemeChange(t)\r\n }\r\n }}\r\n >\r\n {\r\n isRoot && <>\r\n <ServerStyleTag factory={resetCss as any} />\r\n {\r\n !noScrollbarCss && <ServerStyleTag factory={scrollbarCss} />\r\n }\r\n </>\r\n }\r\n <ServerStyleTag factory={themeGlobalStyle} />\r\n <Tag\r\n minHeight=\"100%\"\r\n bgcolor=\"background.primary\"\r\n color=\"text.primary\"\r\n fontSize=\"text\"\r\n fontWeight=\"text\"\r\n lineHeight=\"text\"\r\n fontFamily={`system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif`}\r\n {...props}\r\n sxr={{\r\n \"& a\": {\r\n color: \"brand.primary\",\r\n },\r\n }}\r\n baseClass={`${theme.name}-theme-root`}\r\n direction={theme.rtl ? \"rtl\" : \"ltr\"}\r\n >\r\n {children}\r\n </Tag>\r\n </ThemeContex.Provider>\r\n )\r\n}\r\n\r\nexport default ThemeProvider"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA;AAA2D;AACxD;AACA;AAEA;AACG;AACA;;AAEA;AACG;AACH;AAEA;;;AAMG;AACA;;AAEF;AACJ;AAEA;AACG;;AACA;AACG;AACG;AACG;AACA;AACA;AACA;AACA;AACF;AACD;AACG;AACA;AACA;AACK;AACR;AACG;AACA;AACF;AACD;AACG;AACF;AACD;AACG;AACA;AACF;AACD;AACG;AACA;AACA;AACF;AACD;AACG;AACA;AACA;AACA;AACA;AACG;AACF;AACH;AACD;AACG;AACF;AACH;;AAED;AACA;;AAEF;;AAGJ;AACG;;AACA;;;;AAKA;AACG;AACG;AACG;AACA;AACF;AACD;AACG;AACA;AACA;AACF;AACD;AACG;AACA;AACF;AACD;AACG;AACA;AACF;AACH;;AAED;AACA;;AAEF;AACJ;AAEA;;AAIS;AACG;;AAEL;AAqBK;AACG;AACF;;AAShB;;"}
1
+ {"version":3,"file":"ThemeProvider.cjs","sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\nimport * as React from \"react\"\nimport { ThemeOptionInput, ThemeOptions } from \"./types\"\nimport Tag from \"../Tag\"\nimport { TagComponentType, TagProps } from \"../Tag/types\"\nimport { createTheme, ThemeContex } from \"./core\"\nimport ThemeCssVars from \"./ThemeCssVars\"\nimport { css } from \"../css\"\nimport ServerStyleTag from \"../Tag/ServerStyleTag\"\nimport { useDocument } from \"../Document\";\nimport { themeRootClass } from \".\";\nimport { useCSSCacheId } from \"../css/CSSCacheProvider\";\n\nexport type ThemeProviderProps<T extends TagComponentType = 'div'> = TagProps<T> & {\n theme: ThemeOptionInput;\n onThemeChange?: (theme: ThemeOptions) => void\n isRoot?: boolean;\n noScrollbarCss?: boolean;\n}\n\nconst ThemeProvider = <T extends TagComponentType = 'div'>({ children, theme: THEME, onThemeChange, isRoot, noScrollbarCss, ...props }: ThemeProviderProps<T>) => {\n const doc = useDocument()\n const cacheId = useCSSCacheId()\n\n const theme = React.useMemo(() => createTheme(THEME), [THEME])\n\n const themeGlobalStyle: any = React.useMemo(() => {\n const root_cls = `.xui-${theme.name}-theme-root`\n let gkeys = Object.keys(theme.globalStyle || {})\n let gstyles: any = {}\n gkeys.forEach((key) => {\n gstyles[`${root_cls} ${key}`] = theme.globalStyle[key as any]\n })\n\n return css({\n \"@global\": {\n ...gstyles,\n [root_cls]: ThemeCssVars(theme)\n }\n }, {\n injectStyle: typeof window !== 'undefined',\n container: doc?.document,\n cacheId\n })\n }, [theme, doc])\n\n const resetCss = React.useMemo(() => {\n if (!isRoot) return\n return css({\n \"@global\": {\n \"*\": {\n m: 0,\n p: 0,\n outline: \"none\",\n boxSizing: \"border-box\",\n verticalAlign: \"baseline\",\n },\n \"html, body\": {\n height: \"100%\",\n \"-webkit-font-smoothing\": \"antialiased\",\n \"-moz-osx-font-smoothing\": \"grayscale\",\n } as any,\n \"img, picture, video, canvas, svg\": {\n maxWidth: \"100%\",\n display: \"block\"\n },\n \"input, button, textarea, select\": {\n font: \"inherit\"\n },\n \"table\": {\n borderCollapse: \"collapse\",\n borderSpacing: 0,\n },\n \"ol, ul\": {\n listStyle: \"none\",\n padding: 0,\n margin: 0,\n },\n \"a\": {\n display: \"inline-block\",\n color: \"inherit\",\n textDecoration: \"none\",\n cursor: \"pointer\",\n \"&:hover\": {\n textDecoration: \"underline\"\n }\n },\n \"p, h1, h2, h3, h4, h5, h6\": {\n overflowWrap: \"break-word\",\n },\n }\n }, {\n injectStyle: typeof window !== 'undefined',\n container: doc?.document,\n cacheId\n })\n }, [])\n\n const scrollbarCss: any = React.useMemo(() => {\n if (noScrollbarCss) return;\n const cls = (cls: string) => `${themeRootClass(theme.name)} ${cls}`\n let thumbSize = 6\n let thumbColor = \"var(--color-text-secondary)\"\n let trackColor = \"transparent\"\n\n return css({\n \"@global\": {\n [cls('*::-webkit-scrollbar')]: {\n width: thumbSize,\n height: thumbSize,\n },\n [cls(\"*::-webkit-scrollbar-thumb\")]: {\n backgroundColor: thumbColor,\n borderRadius: \"6px\",\n opacity: 0.6,\n },\n [cls(\"*::-webkit-scrollbar-thumb:hover\")]: {\n backgroundColor: thumbColor,\n opacity: 0.0,\n },\n [cls(\"*::-webkit-scrollbar-track\")]: {\n backgroundColor: trackColor,\n borderRadius: \"6px\",\n },\n }\n }, {\n injectStyle: typeof window !== 'undefined',\n container: doc?.document,\n cacheId\n }) as any\n }, [noScrollbarCss, theme])\n\n return (\n <ThemeContex.Provider\n value={{\n theme,\n onChange: (t) => {\n onThemeChange && onThemeChange(t)\n }\n }}\n >\n {\n isRoot && <>\n <ServerStyleTag factory={resetCss as any} />\n {\n !noScrollbarCss && <ServerStyleTag factory={scrollbarCss} />\n }\n </>\n }\n <ServerStyleTag factory={themeGlobalStyle} />\n <Tag\n minHeight=\"100%\"\n bgcolor=\"surface.main\"\n color=\"surface.contrast\"\n fontSize=\"text\"\n fontWeight=\"text\"\n lineHeight=\"text\"\n fontFamily={`system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif`}\n {...props}\n sxr={{\n \"& a\": {\n color: \"primary.main\",\n },\n }}\n baseClass={`${theme.name}-theme-root`}\n direction={theme.rtl ? \"rtl\" : \"ltr\"}\n >\n {children}\n </Tag>\n </ThemeContex.Provider>\n )\n}\n\nexport default ThemeProvider"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA;AAA2D;AACxD;AACA;AAEA;AAEA;AACG;AACA;;AAEA;AACG;AACH;AAEA;;;AAMG;AACA;;AAEF;AACJ;AAEA;AACG;;AACA;AACG;AACG;AACG;AACA;AACA;AACA;AACA;AACF;AACD;AACG;AACA;AACA;AACK;AACR;AACG;AACA;AACF;AACD;AACG;AACF;AACD;AACG;AACA;AACF;AACD;AACG;AACA;AACA;AACF;AACD;AACG;AACA;AACA;AACA;AACA;AACG;AACF;AACH;AACD;AACG;AACF;AACH;;AAED;AACA;;AAEF;;AAGJ;AACG;;AACA;;;;AAKA;AACG;AACG;AACG;AACA;AACF;AACD;AACG;AACA;AACA;AACF;AACD;AACG;AACA;AACF;AACD;AACG;AACA;AACF;AACH;;AAED;AACA;;AAEF;AACJ;AAEA;;AAIS;AACG;;AAEL;AAqBK;AACG;AACF;;AAShB;;"}
@@ -1,14 +1,14 @@
1
1
  import * as React from 'react';
2
- import { ThemeOptions } from './types.js';
2
+ import { ThemeOptionInput, ThemeOptions } from './types.js';
3
3
  import { TagComponentType, TagProps } from '../Tag/types.js';
4
4
 
5
5
  type ThemeProviderProps<T extends TagComponentType = 'div'> = TagProps<T> & {
6
- theme: ThemeOptions;
6
+ theme: ThemeOptionInput;
7
7
  onThemeChange?: (theme: ThemeOptions) => void;
8
8
  isRoot?: boolean;
9
9
  noScrollbarCss?: boolean;
10
10
  };
11
- declare const ThemeProvider: <T extends TagComponentType = "div">({ children, theme, onThemeChange, isRoot, noScrollbarCss, ...props }: ThemeProviderProps<T>) => React.JSX.Element;
11
+ declare const ThemeProvider: <T extends TagComponentType = "div">({ children, theme: THEME, onThemeChange, isRoot, noScrollbarCss, ...props }: ThemeProviderProps<T>) => React.JSX.Element;
12
12
 
13
13
  export { ThemeProvider as default };
14
14
  export type { ThemeProviderProps };
@@ -3,7 +3,7 @@ import { __rest } from 'tslib';
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
4
  import * as React from 'react';
5
5
  import Tag from '../Tag/index.js';
6
- import { ThemeContex } from './core.js';
6
+ import { createTheme, ThemeContex } from './core.js';
7
7
  import ThemeCssVars from './ThemeCssVars.js';
8
8
  import { css } from '../css/index.js';
9
9
  import ServerStyleTag from '../Tag/ServerStyleTag.js';
@@ -12,9 +12,10 @@ import { themeRootClass } from './index.js';
12
12
  import { useCSSCacheId } from '../css/CSSCacheProvider.js';
13
13
 
14
14
  const ThemeProvider = (_a) => {
15
- var { children, theme, onThemeChange, isRoot, noScrollbarCss } = _a, props = __rest(_a, ["children", "theme", "onThemeChange", "isRoot", "noScrollbarCss"]);
15
+ var { children, theme: THEME, onThemeChange, isRoot, noScrollbarCss } = _a, props = __rest(_a, ["children", "theme", "onThemeChange", "isRoot", "noScrollbarCss"]);
16
16
  const doc = useDocument();
17
17
  const cacheId = useCSSCacheId();
18
+ const theme = React.useMemo(() => createTheme(THEME), [THEME]);
18
19
  const themeGlobalStyle = React.useMemo(() => {
19
20
  const root_cls = `.xui-${theme.name}-theme-root`;
20
21
  let gkeys = Object.keys(theme.globalStyle || {});
@@ -120,9 +121,9 @@ const ThemeProvider = (_a) => {
120
121
  onChange: (t) => {
121
122
  onThemeChange && onThemeChange(t);
122
123
  }
123
- }, children: [isRoot && jsxs(Fragment, { children: [jsx(ServerStyleTag, { factory: resetCss }), !noScrollbarCss && jsx(ServerStyleTag, { factory: scrollbarCss })] }), jsx(ServerStyleTag, { factory: themeGlobalStyle }), jsx(Tag, Object.assign({ minHeight: "100%", bgcolor: "background.primary", color: "text.primary", fontSize: "text", fontWeight: "text", lineHeight: "text", fontFamily: `system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif` }, props, { sxr: {
124
+ }, children: [isRoot && jsxs(Fragment, { children: [jsx(ServerStyleTag, { factory: resetCss }), !noScrollbarCss && jsx(ServerStyleTag, { factory: scrollbarCss })] }), jsx(ServerStyleTag, { factory: themeGlobalStyle }), jsx(Tag, Object.assign({ minHeight: "100%", bgcolor: "surface.main", color: "surface.contrast", fontSize: "text", fontWeight: "text", lineHeight: "text", fontFamily: `system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif` }, props, { sxr: {
124
125
  "& a": {
125
- color: "brand.primary",
126
+ color: "primary.main",
126
127
  },
127
128
  }, baseClass: `${theme.name}-theme-root`, direction: theme.rtl ? "rtl" : "ltr", children: children }))] }));
128
129
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.js","sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\r\nimport * as React from \"react\"\r\nimport { ThemeOptions } from \"./types\"\r\nimport Tag from \"../Tag\"\r\nimport { TagComponentType, TagProps } from \"../Tag/types\"\r\nimport { ThemeContex } from \"./core\"\r\nimport ThemeCssVars from \"./ThemeCssVars\"\r\nimport { css } from \"../css\"\r\nimport ServerStyleTag from \"../Tag/ServerStyleTag\"\r\nimport { useDocument } from \"../Document\";\r\nimport { themeRootClass } from \".\";\r\nimport { useCSSCacheId } from \"../css/CSSCacheProvider\";\r\n\r\nexport type ThemeProviderProps<T extends TagComponentType = 'div'> = TagProps<T> & {\r\n theme: ThemeOptions;\r\n onThemeChange?: (theme: ThemeOptions) => void\r\n isRoot?: boolean;\r\n noScrollbarCss?: boolean;\r\n}\r\n\r\nconst ThemeProvider = <T extends TagComponentType = 'div'>({ children, theme, onThemeChange, isRoot, noScrollbarCss, ...props }: ThemeProviderProps<T>) => {\r\n const doc = useDocument()\r\n const cacheId = useCSSCacheId()\r\n\r\n const themeGlobalStyle: any = React.useMemo(() => {\r\n const root_cls = `.xui-${theme.name}-theme-root`\r\n let gkeys = Object.keys(theme.globalStyle || {})\r\n let gstyles: any = {}\r\n gkeys.forEach((key) => {\r\n gstyles[`${root_cls} ${key}`] = theme.globalStyle[key as any]\r\n })\r\n\r\n return css({\r\n \"@global\": {\r\n ...gstyles,\r\n [root_cls]: ThemeCssVars(theme)\r\n }\r\n }, {\r\n injectStyle: typeof window !== 'undefined',\r\n container: doc?.document,\r\n cacheId\r\n })\r\n }, [theme, doc])\r\n\r\n const resetCss = React.useMemo(() => {\r\n if (!isRoot) return\r\n return css({\r\n \"@global\": {\r\n \"*\": {\r\n m: 0,\r\n p: 0,\r\n outline: \"none\",\r\n boxSizing: \"border-box\",\r\n verticalAlign: \"baseline\",\r\n },\r\n \"html, body\": {\r\n height: \"100%\",\r\n \"-webkit-font-smoothing\": \"antialiased\",\r\n \"-moz-osx-font-smoothing\": \"grayscale\",\r\n } as any,\r\n \"img, picture, video, canvas, svg\": {\r\n maxWidth: \"100%\",\r\n display: \"block\"\r\n },\r\n \"input, button, textarea, select\": {\r\n font: \"inherit\"\r\n },\r\n \"table\": {\r\n borderCollapse: \"collapse\",\r\n borderSpacing: 0,\r\n },\r\n \"ol, ul\": {\r\n listStyle: \"none\",\r\n padding: 0,\r\n margin: 0,\r\n },\r\n \"a\": {\r\n display: \"inline-block\",\r\n color: \"inherit\",\r\n textDecoration: \"none\",\r\n cursor: \"pointer\",\r\n \"&:hover\": {\r\n textDecoration: \"underline\"\r\n }\r\n },\r\n \"p, h1, h2, h3, h4, h5, h6\": {\r\n overflowWrap: \"break-word\",\r\n },\r\n }\r\n }, {\r\n injectStyle: typeof window !== 'undefined',\r\n container: doc?.document,\r\n cacheId\r\n })\r\n }, [])\r\n\r\n const scrollbarCss: any = React.useMemo(() => {\r\n if (noScrollbarCss) return;\r\n const cls = (cls: string) => `${themeRootClass(theme.name)} ${cls}`\r\n let thumbSize = 6\r\n let thumbColor = \"var(--color-text-secondary)\"\r\n let trackColor = \"transparent\"\r\n\r\n return css({\r\n \"@global\": {\r\n [cls('*::-webkit-scrollbar')]: {\r\n width: thumbSize,\r\n height: thumbSize,\r\n },\r\n [cls(\"*::-webkit-scrollbar-thumb\")]: {\r\n backgroundColor: thumbColor,\r\n borderRadius: \"6px\",\r\n opacity: 0.6,\r\n },\r\n [cls(\"*::-webkit-scrollbar-thumb:hover\")]: {\r\n backgroundColor: thumbColor,\r\n opacity: 0.0,\r\n },\r\n [cls(\"*::-webkit-scrollbar-track\")]: {\r\n backgroundColor: trackColor,\r\n borderRadius: \"6px\",\r\n },\r\n }\r\n }, {\r\n injectStyle: typeof window !== 'undefined',\r\n container: doc?.document,\r\n cacheId\r\n }) as any\r\n }, [noScrollbarCss, theme])\r\n\r\n return (\r\n <ThemeContex.Provider\r\n value={{\r\n theme,\r\n onChange: (t) => {\r\n onThemeChange && onThemeChange(t)\r\n }\r\n }}\r\n >\r\n {\r\n isRoot && <>\r\n <ServerStyleTag factory={resetCss as any} />\r\n {\r\n !noScrollbarCss && <ServerStyleTag factory={scrollbarCss} />\r\n }\r\n </>\r\n }\r\n <ServerStyleTag factory={themeGlobalStyle} />\r\n <Tag\r\n minHeight=\"100%\"\r\n bgcolor=\"background.primary\"\r\n color=\"text.primary\"\r\n fontSize=\"text\"\r\n fontWeight=\"text\"\r\n lineHeight=\"text\"\r\n fontFamily={`system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif`}\r\n {...props}\r\n sxr={{\r\n \"& a\": {\r\n color: \"brand.primary\",\r\n },\r\n }}\r\n baseClass={`${theme.name}-theme-root`}\r\n direction={theme.rtl ? \"rtl\" : \"ltr\"}\r\n >\r\n {children}\r\n </Tag>\r\n </ThemeContex.Provider>\r\n )\r\n}\r\n\r\nexport default ThemeProvider"],"names":[],"mappings":";;;;;;;;;;;;;AAoBA;AAA2D;AACxD;AACA;AAEA;AACG;AACA;;AAEA;AACG;AACH;AAEA;;;AAMG;AACA;;AAEF;AACJ;AAEA;AACG;;AACA;AACG;AACG;AACG;AACA;AACA;AACA;AACA;AACF;AACD;AACG;AACA;AACA;AACK;AACR;AACG;AACA;AACF;AACD;AACG;AACF;AACD;AACG;AACA;AACF;AACD;AACG;AACA;AACA;AACF;AACD;AACG;AACA;AACA;AACA;AACA;AACG;AACF;AACH;AACD;AACG;AACF;AACH;;AAED;AACA;;AAEF;;AAGJ;AACG;;AACA;;;;AAKA;AACG;AACG;AACG;AACA;AACF;AACD;AACG;AACA;AACA;AACF;AACD;AACG;AACA;AACF;AACD;AACG;AACA;AACF;AACH;;AAED;AACA;;AAEF;AACJ;AAEA;;AAIS;AACG;;AAEL;AAqBK;AACG;AACF;;AAShB;;"}
1
+ {"version":3,"file":"ThemeProvider.js","sources":["../../src/theme/ThemeProvider.tsx"],"sourcesContent":["\"use client\";\nimport * as React from \"react\"\nimport { ThemeOptionInput, ThemeOptions } from \"./types\"\nimport Tag from \"../Tag\"\nimport { TagComponentType, TagProps } from \"../Tag/types\"\nimport { createTheme, ThemeContex } from \"./core\"\nimport ThemeCssVars from \"./ThemeCssVars\"\nimport { css } from \"../css\"\nimport ServerStyleTag from \"../Tag/ServerStyleTag\"\nimport { useDocument } from \"../Document\";\nimport { themeRootClass } from \".\";\nimport { useCSSCacheId } from \"../css/CSSCacheProvider\";\n\nexport type ThemeProviderProps<T extends TagComponentType = 'div'> = TagProps<T> & {\n theme: ThemeOptionInput;\n onThemeChange?: (theme: ThemeOptions) => void\n isRoot?: boolean;\n noScrollbarCss?: boolean;\n}\n\nconst ThemeProvider = <T extends TagComponentType = 'div'>({ children, theme: THEME, onThemeChange, isRoot, noScrollbarCss, ...props }: ThemeProviderProps<T>) => {\n const doc = useDocument()\n const cacheId = useCSSCacheId()\n\n const theme = React.useMemo(() => createTheme(THEME), [THEME])\n\n const themeGlobalStyle: any = React.useMemo(() => {\n const root_cls = `.xui-${theme.name}-theme-root`\n let gkeys = Object.keys(theme.globalStyle || {})\n let gstyles: any = {}\n gkeys.forEach((key) => {\n gstyles[`${root_cls} ${key}`] = theme.globalStyle[key as any]\n })\n\n return css({\n \"@global\": {\n ...gstyles,\n [root_cls]: ThemeCssVars(theme)\n }\n }, {\n injectStyle: typeof window !== 'undefined',\n container: doc?.document,\n cacheId\n })\n }, [theme, doc])\n\n const resetCss = React.useMemo(() => {\n if (!isRoot) return\n return css({\n \"@global\": {\n \"*\": {\n m: 0,\n p: 0,\n outline: \"none\",\n boxSizing: \"border-box\",\n verticalAlign: \"baseline\",\n },\n \"html, body\": {\n height: \"100%\",\n \"-webkit-font-smoothing\": \"antialiased\",\n \"-moz-osx-font-smoothing\": \"grayscale\",\n } as any,\n \"img, picture, video, canvas, svg\": {\n maxWidth: \"100%\",\n display: \"block\"\n },\n \"input, button, textarea, select\": {\n font: \"inherit\"\n },\n \"table\": {\n borderCollapse: \"collapse\",\n borderSpacing: 0,\n },\n \"ol, ul\": {\n listStyle: \"none\",\n padding: 0,\n margin: 0,\n },\n \"a\": {\n display: \"inline-block\",\n color: \"inherit\",\n textDecoration: \"none\",\n cursor: \"pointer\",\n \"&:hover\": {\n textDecoration: \"underline\"\n }\n },\n \"p, h1, h2, h3, h4, h5, h6\": {\n overflowWrap: \"break-word\",\n },\n }\n }, {\n injectStyle: typeof window !== 'undefined',\n container: doc?.document,\n cacheId\n })\n }, [])\n\n const scrollbarCss: any = React.useMemo(() => {\n if (noScrollbarCss) return;\n const cls = (cls: string) => `${themeRootClass(theme.name)} ${cls}`\n let thumbSize = 6\n let thumbColor = \"var(--color-text-secondary)\"\n let trackColor = \"transparent\"\n\n return css({\n \"@global\": {\n [cls('*::-webkit-scrollbar')]: {\n width: thumbSize,\n height: thumbSize,\n },\n [cls(\"*::-webkit-scrollbar-thumb\")]: {\n backgroundColor: thumbColor,\n borderRadius: \"6px\",\n opacity: 0.6,\n },\n [cls(\"*::-webkit-scrollbar-thumb:hover\")]: {\n backgroundColor: thumbColor,\n opacity: 0.0,\n },\n [cls(\"*::-webkit-scrollbar-track\")]: {\n backgroundColor: trackColor,\n borderRadius: \"6px\",\n },\n }\n }, {\n injectStyle: typeof window !== 'undefined',\n container: doc?.document,\n cacheId\n }) as any\n }, [noScrollbarCss, theme])\n\n return (\n <ThemeContex.Provider\n value={{\n theme,\n onChange: (t) => {\n onThemeChange && onThemeChange(t)\n }\n }}\n >\n {\n isRoot && <>\n <ServerStyleTag factory={resetCss as any} />\n {\n !noScrollbarCss && <ServerStyleTag factory={scrollbarCss} />\n }\n </>\n }\n <ServerStyleTag factory={themeGlobalStyle} />\n <Tag\n minHeight=\"100%\"\n bgcolor=\"surface.main\"\n color=\"surface.contrast\"\n fontSize=\"text\"\n fontWeight=\"text\"\n lineHeight=\"text\"\n fontFamily={`system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif`}\n {...props}\n sxr={{\n \"& a\": {\n color: \"primary.main\",\n },\n }}\n baseClass={`${theme.name}-theme-root`}\n direction={theme.rtl ? \"rtl\" : \"ltr\"}\n >\n {children}\n </Tag>\n </ThemeContex.Provider>\n )\n}\n\nexport default ThemeProvider"],"names":[],"mappings":";;;;;;;;;;;;;AAoBA;AAA2D;AACxD;AACA;AAEA;AAEA;AACG;AACA;;AAEA;AACG;AACH;AAEA;;;AAMG;AACA;;AAEF;AACJ;AAEA;AACG;;AACA;AACG;AACG;AACG;AACA;AACA;AACA;AACA;AACF;AACD;AACG;AACA;AACA;AACK;AACR;AACG;AACA;AACF;AACD;AACG;AACF;AACD;AACG;AACA;AACF;AACD;AACG;AACA;AACA;AACF;AACD;AACG;AACA;AACA;AACA;AACA;AACG;AACF;AACH;AACD;AACG;AACF;AACH;;AAED;AACA;;AAEF;;AAGJ;AACG;;AACA;;;;AAKA;AACG;AACG;AACG;AACA;AACF;AACD;AACG;AACA;AACA;AACF;AACD;AACG;AACA;AACF;AACD;AACG;AACA;AACF;AACH;;AAED;AACA;;AAEF;AACJ;AAEA;;AAIS;AACG;;AAEL;AAqBK;AACG;AACF;;AAShB;;"}
package/theme/core.cjs CHANGED
@@ -4,6 +4,7 @@
4
4
  var React = require('react');
5
5
  var index = require('../css/index.cjs');
6
6
  var ThemeDefaultOptions = require('./ThemeDefaultOptions.cjs');
7
+ var oklch = require('./oklch.cjs');
7
8
 
8
9
  const mergeObject = (a, b) => {
9
10
  a = Object.assign({}, a);
@@ -19,28 +20,36 @@ const mergeObject = (a, b) => {
19
20
  }
20
21
  return a;
21
22
  };
22
- const createTheme = (name, options, mode = "light") => {
23
- const defaultOptions = mode === 'light' ? ThemeDefaultOptions.lightThemeOptions : ThemeDefaultOptions.darkThemeOptions;
24
- let theme = mergeObject(defaultOptions, Object.assign(Object.assign({}, options), { name, breakpoints: index.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 ? index.alpha(c.primary, 0.60) : index.alpha(c.primary, 0.08),
31
- secondary: is_common ? index.alpha(c.primary, 0.90) : index.alpha(c.primary, 0.12)
32
- };
23
+ const createTheme = (options) => {
24
+ var _a;
25
+ let mode = (_a = options === null || options === void 0 ? void 0 : options.mode) !== null && _a !== void 0 ? _a : "light";
26
+ const defaultOptions = mode === 'dark' ? ThemeDefaultOptions.darkThemeOptions : ThemeDefaultOptions.lightThemeOptions;
27
+ for (let key in options === null || options === void 0 ? void 0 : options.colors) {
28
+ const color = options === null || options === void 0 ? void 0 : options.colors[key];
29
+ if (typeof color === "string") {
30
+ options.colors[key] = oklch.createPalette(color);
31
+ }
32
+ else {
33
+ const main = color.main;
34
+ if (main) {
35
+ const pallate = oklch.createPalette(main);
36
+ options.colors[key] = Object.assign(Object.assign(Object.assign({}, pallate), options.colors[key]), { main: pallate.main });
37
+ }
38
+ }
33
39
  }
40
+ let theme = mergeObject(defaultOptions, Object.assign(Object.assign({ name: mode === "dark" ? "default-dark" : "default-light" }, options), { breakpoints: index.breakpoints }));
34
41
  return theme;
35
42
  };
36
43
  const ThemeContex = React.createContext({
37
- theme: createTheme("light", {}),
44
+ theme: createTheme({
45
+ name: "default-light"
46
+ }),
38
47
  onChange(theme) { },
39
48
  });
40
49
  const useTheme = () => {
41
50
  const ctx = React.useContext(ThemeContex);
42
51
  const theme = ctx.theme;
43
- theme.change = (theme) => ctx.onChange(theme);
52
+ theme.change = (theme) => ctx.onChange(createTheme(theme));
44
53
  return theme;
45
54
  };
46
55
 
@@ -1 +1 @@
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, ThemeOptionsColor } from \"./types\"\r\nimport { alpha, breakpoints } from \"../css\"\r\nimport { darkThemeOptions, lightThemeOptions } from \"./ThemeDefaultOptions\"\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 = (name: string, options: ThemeOptionInput, mode: \"light\" | \"dark\" = \"light\"): ThemeOptions => {\r\n const defaultOptions = mode === 'light' ? lightThemeOptions : darkThemeOptions\r\n let theme: any = mergeObject(defaultOptions, {\r\n ...options,\r\n name,\r\n breakpoints: breakpoints\r\n })\r\n\r\n // add alpha colors\r\n for (let color in theme.colors) {\r\n const c = theme.colors[color] as ThemeOptionsColor\r\n const is_common = color === 'divider' || color === 'background' || color === 'text'\r\n c.soft = {\r\n primary: is_common ? alpha(c.primary, 0.60) : alpha(c.primary, 0.08),\r\n secondary: is_common ? alpha(c.primary, 0.90) : alpha(c.primary, 0.12)\r\n }\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(\"light\", {}),\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: ThemeOptions) => ctx.onChange(theme)\r\n return theme\r\n}\r\n\r\n"],"names":[],"mappings":";;;;;;;;;;AASG;AACG;;AAEG;;;AAEA;;;AAGN;AACH;AAGO;AACJ;AACA;;AAOA;;AAEG;;;;;;AAOH;AACH;AAOO;AACJ;;AAEF;AAEM;AACJ;AACA;AACA;AACA;AACH;;;;;"}
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;;;;;"}
package/theme/core.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ThemeOptionInput, ThemeOptions } from './types.js';
2
2
 
3
- declare const createTheme: (name: string, options: ThemeOptionInput, mode?: "light" | "dark") => ThemeOptions;
3
+ declare const createTheme: (options: ThemeOptionInput) => ThemeOptions;
4
4
  declare const useTheme: () => ThemeOptions;
5
5
 
6
6
  export { createTheme, useTheme };
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';
4
- import { lightThemeOptions, darkThemeOptions } from './ThemeDefaultOptions.js';
3
+ import { breakpoints } from '../css/index.js';
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);
@@ -17,28 +18,36 @@ const mergeObject = (a, b) => {
17
18
  }
18
19
  return a;
19
20
  };
20
- const createTheme = (name, options, mode = "light") => {
21
- const defaultOptions = mode === 'light' ? lightThemeOptions : darkThemeOptions;
22
- let theme = mergeObject(defaultOptions, Object.assign(Object.assign({}, options), { name, breakpoints: breakpoints }));
23
- // add alpha colors
24
- for (let color in theme.colors) {
25
- const c = theme.colors[color];
26
- const is_common = color === 'divider' || color === 'background' || color === 'text';
27
- c.soft = {
28
- primary: is_common ? alpha(c.primary, 0.60) : alpha(c.primary, 0.08),
29
- secondary: is_common ? alpha(c.primary, 0.90) : alpha(c.primary, 0.12)
30
- };
21
+ const createTheme = (options) => {
22
+ var _a;
23
+ let mode = (_a = options === null || options === void 0 ? void 0 : options.mode) !== null && _a !== void 0 ? _a : "light";
24
+ const defaultOptions = mode === 'dark' ? darkThemeOptions : lightThemeOptions;
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
+ }
31
37
  }
38
+ let theme = mergeObject(defaultOptions, Object.assign(Object.assign({ name: mode === "dark" ? "default-dark" : "default-light" }, options), { breakpoints: breakpoints }));
32
39
  return theme;
33
40
  };
34
41
  const ThemeContex = React__default.createContext({
35
- theme: createTheme("light", {}),
42
+ theme: createTheme({
43
+ name: "default-light"
44
+ }),
36
45
  onChange(theme) { },
37
46
  });
38
47
  const useTheme = () => {
39
48
  const ctx = useContext(ThemeContex);
40
49
  const theme = ctx.theme;
41
- theme.change = (theme) => ctx.onChange(theme);
50
+ theme.change = (theme) => ctx.onChange(createTheme(theme));
42
51
  return theme;
43
52
  };
44
53
 
package/theme/core.js.map CHANGED
@@ -1 +1 @@
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, ThemeOptionsColor } from \"./types\"\r\nimport { alpha, breakpoints } from \"../css\"\r\nimport { darkThemeOptions, lightThemeOptions } from \"./ThemeDefaultOptions\"\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 = (name: string, options: ThemeOptionInput, mode: \"light\" | \"dark\" = \"light\"): ThemeOptions => {\r\n const defaultOptions = mode === 'light' ? lightThemeOptions : darkThemeOptions\r\n let theme: any = mergeObject(defaultOptions, {\r\n ...options,\r\n name,\r\n breakpoints: breakpoints\r\n })\r\n\r\n // add alpha colors\r\n for (let color in theme.colors) {\r\n const c = theme.colors[color] as ThemeOptionsColor\r\n const is_common = color === 'divider' || color === 'background' || color === 'text'\r\n c.soft = {\r\n primary: is_common ? alpha(c.primary, 0.60) : alpha(c.primary, 0.08),\r\n secondary: is_common ? alpha(c.primary, 0.90) : alpha(c.primary, 0.12)\r\n }\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(\"light\", {}),\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: ThemeOptions) => ctx.onChange(theme)\r\n return theme\r\n}\r\n\r\n"],"names":[],"mappings":";;;;;;;;AASG;AACG;;AAEG;;;AAEA;;;AAGN;AACH;AAGO;AACJ;AACA;;AAOA;;AAEG;;;;;;AAOH;AACH;AAOO;AACJ;;AAEF;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\"\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
+ {"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\"\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
+ {"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,249 @@
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 createPalette(input) {
72
+ const base = toOKLCH(input);
73
+ const isTrueBlack = base.l < 0.2 && base.c < 0.02;
74
+ const isTrueWhite = base.l > 0.92 && base.c < 0.015;
75
+ const isDark = base.l < 0.75;
76
+ if (isTrueBlack) {
77
+ return {
78
+ main: formatOklch(base),
79
+ light: formatOklch({
80
+ l: clamp(base.l + (1 - base.l) * 0.10),
81
+ c: base.c * 0.85,
82
+ h: base.h,
83
+ }),
84
+ dark: formatOklch({
85
+ l: 0.04,
86
+ c: 0.005,
87
+ h: base.h,
88
+ }),
89
+ muted: formatOklch({
90
+ l: 0.72,
91
+ c: 0.01,
92
+ h: base.h,
93
+ }),
94
+ disabled: formatOklch({
95
+ l: 0.30,
96
+ c: 0,
97
+ h: base.h,
98
+ }),
99
+ contrast: formatOklch({
100
+ l: 0.98,
101
+ c: 0.01,
102
+ h: base.h,
103
+ }),
104
+ divider: formatOklch({
105
+ l: 0.30,
106
+ c: 0.002,
107
+ h: 0,
108
+ }),
109
+ ghost: formatOklch({
110
+ l: clamp(base.l + (1 - base.l) * 0.10),
111
+ c: base.c * 0.85,
112
+ h: base.h,
113
+ }, 0.6),
114
+ };
115
+ }
116
+ if (isTrueWhite) {
117
+ return {
118
+ main: formatOklch(base),
119
+ light: formatOklch({
120
+ l: 0.95,
121
+ c: 0,
122
+ h: base.h
123
+ }),
124
+ dark: formatOklch({
125
+ l: 0.86,
126
+ c: 0,
127
+ h: base.h,
128
+ }),
129
+ muted: formatOklch({
130
+ l: 0.55,
131
+ c: 0,
132
+ h: base.h,
133
+ }),
134
+ disabled: formatOklch({
135
+ l: 0.75,
136
+ c: 0,
137
+ h: base.h,
138
+ }),
139
+ contrast: formatOklch({
140
+ l: 0.15,
141
+ c: 0,
142
+ h: base.h,
143
+ }),
144
+ divider: formatOklch({
145
+ l: 0.85,
146
+ c: 0,
147
+ h: 0,
148
+ }),
149
+ ghost: formatOklch({
150
+ l: 0.85,
151
+ c: 0,
152
+ h: base.h
153
+ }, 0.2),
154
+ };
155
+ }
156
+ return {
157
+ main: formatOklch(base),
158
+ light: formatOklch({
159
+ l: clamp(base.l + 0.10),
160
+ c: clamp(base.c * 1.2),
161
+ h: base.h
162
+ }),
163
+ dark: formatOklch({
164
+ l: clamp(base.l - 0.06),
165
+ c: clamp(base.c * 1),
166
+ h: base.h
167
+ }),
168
+ muted: formatOklch({
169
+ l: clamp(base.l + (isDark ? 0.25 : -0.25)),
170
+ c: clamp(base.c * 0.22),
171
+ h: base.h
172
+ }),
173
+ disabled: formatOklch({
174
+ l: clamp(base.l + (isDark ? 0.01 : -0.01)),
175
+ c: clamp(base.c * 0.15),
176
+ h: base.h
177
+ }),
178
+ contrast: formatOklch({
179
+ l: isDark ? 0.97 : 0.11,
180
+ c: 0.01,
181
+ h: base.h
182
+ }),
183
+ divider: formatOklch({
184
+ l: clamp(base.l - 0.20),
185
+ c: clamp(base.c * 1.08),
186
+ h: base.h
187
+ }, .3),
188
+ ghost: formatOklch(base, isDark ? 0.1 : .22),
189
+ };
190
+ }
191
+ /* ---------------- PARSERS ---------------- */
192
+ function parseHex(hex) {
193
+ hex = hex.replace("#", "").trim();
194
+ if (hex.length === 3) {
195
+ hex = hex.split("").map(c => c + c).join("");
196
+ }
197
+ const num = parseInt(hex, 16);
198
+ return {
199
+ r: ((num >> 16) & 255) / 255,
200
+ g: ((num >> 8) & 255) / 255,
201
+ b: (num & 255) / 255,
202
+ };
203
+ }
204
+ function parseRgb(input) {
205
+ const values = input.match(/[\d.]+/g);
206
+ if (!values || values.length < 3) {
207
+ throw new Error("Invalid RGB format");
208
+ }
209
+ const [r, g, b] = values.map(Number);
210
+ return {
211
+ r: r / 255,
212
+ g: g / 255,
213
+ b: b / 255,
214
+ };
215
+ }
216
+ function parseHsl(input) {
217
+ const values = input.match(/[\d.]+/g);
218
+ if (!values || values.length < 3) {
219
+ throw new Error("Invalid HSL format");
220
+ }
221
+ let [h, s, l] = values.map(Number);
222
+ h /= 360;
223
+ s /= 100;
224
+ l /= 100;
225
+ const hue2rgb = (p, q, t) => {
226
+ if (t < 0)
227
+ t += 1;
228
+ if (t > 1)
229
+ t -= 1;
230
+ if (t < 1 / 6)
231
+ return p + (q - p) * 6 * t;
232
+ if (t < 1 / 2)
233
+ return q;
234
+ if (t < 2 / 3)
235
+ return p + (q - p) * (2 / 3 - t) * 6;
236
+ return p;
237
+ };
238
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
239
+ const p = 2 * l - q;
240
+ return {
241
+ r: hue2rgb(p, q, h + 1 / 3),
242
+ g: hue2rgb(p, q, h),
243
+ b: hue2rgb(p, q, h - 1 / 3),
244
+ };
245
+ }
246
+
247
+ exports.createPalette = createPalette;
248
+ exports.toOKLCH = toOKLCH;
249
+ //# 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 dark: string;\n contrast: string;\n muted: string;\n divider: string;\n disabled: 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\n\nexport function createPalette(input: string): ColorRole {\n const base = toOKLCH(input);\n const isTrueBlack = base.l < 0.2 && base.c < 0.02;\n const isTrueWhite = base.l > 0.92 && base.c < 0.015;\n const isDark = base.l < 0.75;\n\n if (isTrueBlack) {\n return {\n main: formatOklch(base),\n\n light: formatOklch({\n l: clamp(base.l + (1 - base.l) * 0.10),\n c: base.c * 0.85,\n h: base.h,\n }),\n\n dark: formatOklch({\n l: 0.04,\n c: 0.005,\n h: base.h,\n }),\n\n muted: formatOklch({\n l: 0.72,\n c: 0.01,\n h: base.h,\n }),\n\n disabled: formatOklch({\n l: 0.30,\n c: 0,\n h: base.h,\n }),\n\n contrast: formatOklch({\n l: 0.98,\n c: 0.01,\n h: base.h,\n }),\n\n divider: formatOklch({\n l: 0.30,\n c: 0.002,\n h: 0,\n }),\n\n ghost: formatOklch({\n l: clamp(base.l + (1 - base.l) * 0.10),\n c: base.c * 0.85,\n h: base.h,\n }, 0.6),\n\n };\n }\n\n if (isTrueWhite) {\n return {\n main: formatOklch(base),\n\n light: formatOklch({\n l: 0.95,\n c: 0,\n h: base.h\n }),\n\n dark: formatOklch({\n l: 0.86,\n c: 0,\n h: base.h,\n }),\n\n muted: formatOklch({\n l: 0.55,\n c: 0,\n h: base.h,\n }),\n\n disabled: formatOklch({\n l: 0.75,\n c: 0,\n h: base.h,\n }),\n\n contrast: formatOklch({\n l: 0.15,\n c: 0,\n h: base.h,\n }),\n\n divider: formatOklch({\n l: 0.85,\n c: 0,\n h: 0,\n }),\n\n ghost: formatOklch({\n l: 0.85,\n c: 0,\n h: base.h\n }, 0.2),\n };\n }\n\n\n return {\n main: formatOklch(base),\n\n light: formatOklch({\n l: clamp(base.l + 0.10),\n c: clamp(base.c * 1.2),\n h: base.h\n }),\n\n dark: formatOklch({\n l: clamp(base.l - 0.06),\n c: clamp(base.c * 1),\n h: base.h\n }),\n\n muted: formatOklch({\n l: clamp(base.l + (isDark ? 0.25 : -0.25)),\n c: clamp(base.c * 0.22),\n h: base.h\n }),\n\n disabled: formatOklch({\n l: clamp(base.l + (isDark ? 0.01 : -0.01)),\n c: clamp(base.c * 0.15),\n h: base.h\n }),\n\n contrast: formatOklch({\n l: isDark ? 0.97 : 0.11,\n c: 0.01,\n h: base.h\n }),\n\n divider: formatOklch({\n l: clamp(base.l - 0.20),\n c: clamp(base.c * 1.08),\n h: base.h\n }, .3),\n\n ghost: formatOklch(base, isDark ? 0.1 : .22),\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}"],"names":[],"mappings":"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"}