@maz-ui/themes 4.9.2 → 5.0.0-beta.0

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 (61) hide show
  1. package/README.md +33 -24
  2. package/dist/build/index.d.ts +0 -8
  3. package/dist/build/index.d.ts.map +1 -1
  4. package/dist/build/index.js +1 -1
  5. package/dist/composables/index.d.ts +2 -0
  6. package/dist/composables/index.d.ts.map +1 -0
  7. package/dist/composables/useTheme.d.ts +1 -1
  8. package/dist/composables/useTheme.d.ts.map +1 -1
  9. package/dist/composables/useTheme.js +1 -1
  10. package/dist/define-preset.d.ts +2 -5
  11. package/dist/define-preset.d.ts.map +1 -1
  12. package/dist/index.js +1 -1
  13. package/dist/plugin.d.ts +2 -17
  14. package/dist/plugin.d.ts.map +1 -1
  15. package/dist/presets/_defaults.d.ts +33 -0
  16. package/dist/presets/_defaults.d.ts.map +1 -0
  17. package/dist/presets/_defaults.js +1 -0
  18. package/dist/presets/index.d.ts +1 -0
  19. package/dist/presets/index.d.ts.map +1 -1
  20. package/dist/presets/index.js +1 -1
  21. package/dist/presets/mazUi.d.ts.map +1 -1
  22. package/dist/presets/mazUi.js +1 -1
  23. package/dist/presets/nova.d.ts +3 -0
  24. package/dist/presets/nova.d.ts.map +1 -0
  25. package/dist/presets/nova.js +1 -0
  26. package/dist/presets/obsidian.d.ts.map +1 -1
  27. package/dist/presets/obsidian.js +1 -1
  28. package/dist/presets/ocean.d.ts.map +1 -1
  29. package/dist/presets/ocean.js +1 -1
  30. package/dist/presets/pristine.d.ts.map +1 -1
  31. package/dist/presets/pristine.js +1 -1
  32. package/dist/types/index.d.ts +166 -30
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/utils/color-parser.d.ts +31 -0
  35. package/dist/utils/color-parser.d.ts.map +1 -0
  36. package/dist/utils/color-parser.js +1 -0
  37. package/dist/utils/color-utils.d.ts +26 -2
  38. package/dist/utils/color-utils.d.ts.map +1 -1
  39. package/dist/utils/color-utils.js +1 -1
  40. package/dist/utils/cookie-storage.d.ts +6 -0
  41. package/dist/utils/cookie-storage.d.ts.map +1 -1
  42. package/dist/utils/cookie-storage.js +1 -1
  43. package/dist/utils/css-generator.d.ts +1 -9
  44. package/dist/utils/css-generator.d.ts.map +1 -1
  45. package/dist/utils/css-generator.js +4 -4
  46. package/dist/utils/get-preset.d.ts.map +1 -1
  47. package/dist/utils/get-preset.js +1 -1
  48. package/dist/utils/index.d.ts +1 -0
  49. package/dist/utils/index.d.ts.map +1 -1
  50. package/dist/utils/index.js +1 -1
  51. package/dist/utils/inject-theme-css.d.ts.map +1 -1
  52. package/dist/utils/inject-theme-css.js +1 -1
  53. package/dist/utils/no-transition.d.ts +1 -1
  54. package/dist/utils/no-transition.d.ts.map +1 -1
  55. package/dist/utils/no-transition.js +2 -2
  56. package/dist/utils/preset-merger.d.ts.map +1 -1
  57. package/dist/utils/preset-merger.js +1 -1
  58. package/dist/utils/setup-theme.d.ts +2 -11
  59. package/dist/utils/setup-theme.d.ts.map +1 -1
  60. package/dist/utils/setup-theme.js +1 -1
  61. package/package.json +12 -2
@@ -1,34 +1,142 @@
1
+ /**
2
+ * @deprecated Use {@link CSSColor}. The raw HSL form is still accepted at runtime
3
+ * (auto-wrapped in `hsl()`), but prefer a complete CSS color value in new code.
4
+ */
1
5
  export type HSL = `${number} ${number}% ${number}%`;
6
+ /**
7
+ * Any valid CSS color value. Accepts complete forms (`hsl(210 100% 56%)`,
8
+ * `oklch(0.7 0.15 30)`, `rgb(255 0 0)`, `#ff0000`) and the legacy raw form
9
+ * `"210 100% 56%"` for backwards compatibility with v4 presets.
10
+ */
11
+ export type CSSColor = string;
2
12
  export type SizeUnit = `${number}${'rem' | 'px' | 'em' | 'vw' | 'vh' | 'vmin' | 'vmax' | '%'}`;
13
+ export type Duration = `${number}${'ms' | 's'}`;
3
14
  export interface ThemeColors {
4
- 'background': HSL;
5
- 'foreground': HSL;
6
- 'primary': HSL;
7
- 'primary-foreground': HSL;
8
- 'secondary': HSL;
9
- 'secondary-foreground': HSL;
10
- 'accent': HSL;
11
- 'accent-foreground': HSL;
12
- 'info': HSL;
13
- 'info-foreground': HSL;
14
- 'contrast': HSL;
15
- 'contrast-foreground': HSL;
16
- 'destructive': HSL;
17
- 'destructive-foreground': HSL;
18
- 'success': HSL;
19
- 'success-foreground': HSL;
20
- 'warning': HSL;
21
- 'warning-foreground': HSL;
22
- 'overlay': HSL;
23
- 'muted': HSL;
24
- 'border': HSL;
25
- 'shadow': HSL;
15
+ 'surface': CSSColor;
16
+ 'foreground': CSSColor;
17
+ 'primary': CSSColor;
18
+ 'primary-foreground': CSSColor;
19
+ 'secondary': CSSColor;
20
+ 'secondary-foreground': CSSColor;
21
+ 'accent': CSSColor;
22
+ 'accent-foreground': CSSColor;
23
+ 'info': CSSColor;
24
+ 'info-foreground': CSSColor;
25
+ 'contrast': CSSColor;
26
+ 'contrast-foreground': CSSColor;
27
+ 'destructive': CSSColor;
28
+ 'destructive-foreground': CSSColor;
29
+ 'success': CSSColor;
30
+ 'success-foreground': CSSColor;
31
+ 'warning': CSSColor;
32
+ 'warning-foreground': CSSColor;
33
+ 'overlay': CSSColor;
34
+ 'muted': CSSColor;
35
+ 'divider': CSSColor;
36
+ 'shadow': CSSColor;
26
37
  }
27
38
  export interface ThemeFoundation {
28
39
  'base-font-size'?: SizeUnit;
29
- 'radius': SizeUnit;
30
40
  'border-width': SizeUnit;
41
+ /** Body / sans font stack. */
31
42
  'font-family'?: string;
43
+ /**
44
+ * Monospace font stack. Used by `MazInputCode`, `<code>`, `<kbd>`.
45
+ * Bridged into Tailwind's `--font-mono` token. Named `font-mono-stack`
46
+ * (not `font-mono`) to avoid the `prefix(maz)` self-cycle.
47
+ */
48
+ 'font-mono-stack'?: string;
49
+ /**
50
+ * Display / heading font stack. Defaults to the same value as `font-family`
51
+ * — no behavioural change unless the consumer overrides it. Bridged into
52
+ * Tailwind's `--font-display`. Named `font-display-stack` to avoid the
53
+ * `prefix(maz)` self-cycle.
54
+ */
55
+ 'font-display-stack'?: string;
56
+ /**
57
+ * Transition durations. Bridged into Tailwind's `--duration-fast`,
58
+ * `--duration-normal`, `--duration-slow`. Named `motion-*` (not
59
+ * `duration-*`) to avoid the `prefix(maz)` self-cycle.
60
+ */
61
+ 'motion-fast'?: Duration;
62
+ 'motion-normal'?: Duration;
63
+ 'motion-slow'?: Duration;
64
+ 'easing-out'?: string;
65
+ 'easing-in'?: string;
66
+ 'easing-in-out'?: string;
67
+ /**
68
+ * Opacity applied to disabled interactive elements (buttons, inputs, etc.).
69
+ * @default '0.5'
70
+ */
71
+ 'disabled-opacity'?: string;
72
+ /**
73
+ * Cursor applied to disabled interactive elements.
74
+ * @default 'not-allowed'
75
+ */
76
+ 'disabled-cursor'?: string;
77
+ /**
78
+ * Base spacing unit. Tailwind multiplies this for every `p-N`, `m-N`,
79
+ * `gap-N`, etc. Bridged into Tailwind's `--spacing` token.
80
+ * @default '0.25rem'
81
+ */
82
+ 'space'?: SizeUnit;
83
+ }
84
+ /**
85
+ * Rounded / shadow scales. Bridged into Tailwind v4 via `@theme inline` so the
86
+ * consumer's own utilities benefit too (e.g. `rounded-md`, `shadow-lg`).
87
+ *
88
+ * Single-value design tokens (`space`, `base-font-size`, `border-width`, …)
89
+ * live on `foundation` instead — only true multi-step scales belong here.
90
+ */
91
+ export interface ThemeScales {
92
+ /**
93
+ * Border-radius scale. Maps to Tailwind utilities `rounded-{key}` and is
94
+ * emitted as `--maz-rounded-{key}` (the name is decoupled from Tailwind's
95
+ * `--radius-*` to avoid prefix collisions in `prefix(maz)` setups).
96
+ * `full` is intentionally not included — Tailwind keeps `rounded-full`
97
+ * at 9999px regardless.
98
+ */
99
+ rounded: Record<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl', SizeUnit>;
100
+ /**
101
+ * Box-shadow scale. Maps to Tailwind utilities `shadow-{key}`. `elevation`
102
+ * is the maz-ui specific elevated-surface shadow used by MazCard,
103
+ * MazContainer, MazPopover, etc.
104
+ */
105
+ shadow: Record<'sm' | 'md' | 'lg' | 'xl' | 'elevation', string>;
106
+ }
107
+ /**
108
+ * Optional, per-mode background overrides for "container" surfaces — defaults
109
+ * to `var(--maz-surface)` light, `var(--maz-surface-400)` dark.
110
+ */
111
+ export interface ThemeComponentBg {
112
+ light?: CSSColor;
113
+ dark?: CSSColor;
114
+ }
115
+ /**
116
+ * Per-component theme overrides. Every entry is optional; omit a key and the
117
+ * component falls back to its existing surface tokens (= zero behaviour change).
118
+ */
119
+ export interface ThemeComponents {
120
+ btn?: {
121
+ /**
122
+ * Font-weight applied on `.m-btn`. Defaults to `'500'` (medium).
123
+ */
124
+ 'font-weight'?: string;
125
+ };
126
+ /**
127
+ * Background of "container" surfaces (Card, Container, Dialog, Popover,
128
+ * Dropdown menu panel, Drawer, BottomSheet, …).
129
+ */
130
+ container?: {
131
+ bg?: ThemeComponentBg;
132
+ };
133
+ /**
134
+ * Background of input controls (Input, Textarea, Select, Checkbox, Radio,
135
+ * Switch, InputCode, InputTags, DatePicker trigger, Dropzone surface, …).
136
+ */
137
+ input?: {
138
+ bg?: ThemeComponentBg;
139
+ };
32
140
  }
33
141
  export interface ThemePresetOverrides {
34
142
  /**
@@ -49,6 +157,19 @@ export interface ThemePresetOverrides {
49
157
  * @default undefined
50
158
  */
51
159
  foundation?: Partial<ThemeFoundation>;
160
+ /**
161
+ * Theme scales (rounded, shadow)
162
+ * @default undefined
163
+ */
164
+ scales?: {
165
+ rounded?: Partial<ThemeScales['rounded']>;
166
+ shadow?: Partial<ThemeScales['shadow']>;
167
+ };
168
+ /**
169
+ * Theme component-level overrides
170
+ * @default undefined
171
+ */
172
+ components?: ThemeComponents;
52
173
  }
53
174
  export interface ThemePreset {
54
175
  /**
@@ -60,12 +181,14 @@ export interface ThemePreset {
60
181
  dark: ThemeColors;
61
182
  };
62
183
  foundation: ThemeFoundation;
184
+ scales: ThemeScales;
185
+ components?: ThemeComponents;
63
186
  }
64
- export type ThemePresetName = 'mazUi' | 'ocean' | 'pristine' | 'obsidian' | 'maz-ui';
187
+ export type ThemePresetName = 'mazUi' | 'ocean' | 'pristine' | 'obsidian' | 'nova' | 'maz-ui';
65
188
  export type ColorMode = 'light' | 'dark' | 'auto';
66
189
  export type ThemeMode = 'light' | 'dark' | 'both';
67
190
  export type DarkModeStrategy = 'class' | 'media';
68
- export type Strategy = 'runtime' | 'buildtime' | 'hybrid';
191
+ export type Strategy = 'runtime' | 'buildtime';
69
192
  interface BaseThemeConfig {
70
193
  /**
71
194
  * CSS variables prefix
@@ -89,10 +212,10 @@ interface BaseThemeConfig {
89
212
  /**
90
213
  * CSS generation strategy
91
214
  * @description
92
- * - `runtime`: CSS generated (critical and full) injected immediately
93
- * - `buildtime`: CSS generated at build time and included in bundle
94
- * - `hybrid`: Critical CSS injected inline, full CSS loaded asynchronously (recommended)
95
- * @default 'hybrid'
215
+ * - `runtime`: CSS generated and injected at runtime (recommended).
216
+ * - `buildtime`: CSS generated at build time and included in bundle
217
+ * nothing is injected at runtime.
218
+ * @default 'runtime'
96
219
  */
97
220
  strategy?: Strategy;
98
221
  /**
@@ -127,6 +250,15 @@ interface BaseThemeConfig {
127
250
  * @default 'both'
128
251
  */
129
252
  mode?: ThemeMode;
253
+ /**
254
+ * Persist the active preset name in the `maz-preset` cookie so the
255
+ * user's last-used theme is restored across reloads. The value is
256
+ * read at boot only when `preset` is not provided, and is written
257
+ * after every successful preset resolution and `updateTheme()` call.
258
+ * Set to `false` to opt out of any cookie read or write.
259
+ * @default true
260
+ */
261
+ persistPreset?: boolean;
130
262
  }
131
263
  export type ThemeConfig = (BaseThemeConfig & {
132
264
  strategy?: Exclude<Strategy, 'buildtime'>;
@@ -172,7 +304,7 @@ export interface ThemeState {
172
304
  /**
173
305
  * CSS generation strategy
174
306
  * @description The strategy used to generate CSS
175
- * @values 'runtime', 'buildtime', 'hybrid'
307
+ * @values 'runtime', 'buildtime'
176
308
  */
177
309
  strategy: Strategy;
178
310
  /**
@@ -186,6 +318,10 @@ export interface ThemeState {
186
318
  * @description The class added to the document root when dark mode is active
187
319
  */
188
320
  darkClass: string;
321
+ /**
322
+ * Whether the active preset name is persisted in the `maz-preset` cookie.
323
+ */
324
+ persistPreset: boolean;
189
325
  }
190
326
  export {};
191
327
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface HSLChannels {
2
+ h: number;
3
+ s: number;
4
+ l: number;
5
+ }
6
+ export interface OklchChannels {
7
+ /** Lightness in [0, 1] */
8
+ l: number;
9
+ /** Chroma in [0, ~0.4] */
10
+ c: number;
11
+ /** Hue in degrees [0, 360) */
12
+ h: number;
13
+ }
14
+ export declare function parseColor(value: string): HSLChannels;
15
+ /**
16
+ * Parse any CSS color value and return its OKLCH channels.
17
+ *
18
+ * Accepts the same formats as `parseColor` plus native `oklch()` (parsed directly,
19
+ * no roundtrip through sRGB so wide-gamut chroma is preserved).
20
+ */
21
+ export declare function parseColorAsOklch(value: string): OklchChannels;
22
+ export declare function formatAsHSL(channels: HSLChannels): string;
23
+ export declare function formatAsOklch(channels: OklchChannels): string;
24
+ /**
25
+ * Convert any CSS color to a 6-digit `#rrggbb` hex string.
26
+ * Wide-gamut input is clipped to sRGB during conversion.
27
+ */
28
+ export declare function colorToHex(value: string): string;
29
+ export declare function isCompleteCSSColor(value: string): boolean;
30
+ export declare function normalizeColor(value: string): string;
31
+ //# sourceMappingURL=color-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-parser.d.ts","sourceRoot":"","sources":["../../src/utils/color-parser.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,0BAA0B;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,8BAA8B;IAC9B,CAAC,EAAE,MAAM,CAAA;CACV;AAcD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAqDrD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAmB9D;AAoJD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAM7D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOzD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD"}
@@ -0,0 +1 @@
1
+ var HEX_PATTERN=/^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;var LEGACY_PATTERN=/^(-?\d+\.\d+|-?\d+)\s+(\d+\.\d+|\d+)%\s+(\d+\.\d+|\d+)%$/;var HSL_FN_PATTERN=/^hsla?\(\s*(-?\d+\.\d+|-?\d+)(?:\s*,\s*|\s+)(\d+\.\d+|\d+)%?(?:\s*,\s*|\s+)(\d+\.\d+|\d+)%?(?:\s*[,/][^)]*)?\)$/i;var RGB_FN_PATTERN=/^rgba?\(\s*(\d+\.\d+|\d+)(?:\s*,\s*|\s+)(\d+\.\d+|\d+)(?:\s*,\s*|\s+)(\d+\.\d+|\d+)(?:\s*[,/][^)]*)?\)$/i;var OKLCH_PATTERN=/^oklch\(\s*(\d+\.\d+|\d+)(%?)\s+(\d+\.\d+|\d+)\s+(-?\d+\.\d+|-?\d+)(?:\s*\/[^)]*)?\)$/i;var COMPLETE_COLOR_PATTERN=/^(?:hsla?|rgba?|oklch|oklab|lab|lch|color)\s*\(/i;var HEX_COLOR_PATTERN=/^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;var CSS_VAR_PATTERN=/^var\(\s*--[\w-]+/i;function parseColor(value){let trimmed=value.trim();if(!trimmed)throw Error(`Invalid color: empty string`);let hslMatch=trimmed.match(HSL_FN_PATTERN);if(hslMatch)return{h:Number.parseFloat(hslMatch[1]),s:Number.parseFloat(hslMatch[2]),l:Number.parseFloat(hslMatch[3])};let rgbMatch=trimmed.match(RGB_FN_PATTERN);if(rgbMatch)return rgbToHsl(Number.parseFloat(rgbMatch[1]),Number.parseFloat(rgbMatch[2]),Number.parseFloat(rgbMatch[3]));let hexMatch=trimmed.match(HEX_PATTERN);if(hexMatch){let expanded=expandHex(hexMatch[1]);return rgbToHsl(Number.parseInt(expanded.slice(0,2),16),Number.parseInt(expanded.slice(2,4),16),Number.parseInt(expanded.slice(4,6),16))}let oklchMatch=trimmed.match(OKLCH_PATTERN);if(oklchMatch){let lRaw=Number.parseFloat(oklchMatch[1]);let{r,g,b}=oklchToRgb(oklchMatch[2]===`%`?lRaw/100:lRaw,Number.parseFloat(oklchMatch[3]),Number.parseFloat(oklchMatch[4]));return rgbToHsl(r,g,b)}let legacyMatch=trimmed.match(LEGACY_PATTERN);if(legacyMatch)return{h:Number.parseFloat(legacyMatch[1]),s:Number.parseFloat(legacyMatch[2]),l:Number.parseFloat(legacyMatch[3])};throw Error(`Invalid color format: ${value}`)}function parseColorAsOklch(value){let trimmed=value.trim();if(!trimmed)throw Error(`Invalid color: empty string`);let oklchMatch=trimmed.match(OKLCH_PATTERN);if(oklchMatch){let lRaw=Number.parseFloat(oklchMatch[1]);return{l:oklchMatch[2]===`%`?lRaw/100:lRaw,c:Number.parseFloat(oklchMatch[3]),h:Number.parseFloat(oklchMatch[4])}}let{h,s,l}=parseColor(trimmed);let{r,g,b}=hslToRgb(h,s,l);return rgbToOklch(r,g,b)}function expandHex(hex){return hex.length===3?hex.split(``).map(c=>c+c).join(``):hex.length===4?hex.slice(0,3).split(``).map(c=>c+c).join(``):hex.length===8?hex.slice(0,6):hex}function rgbToHsl(r,g,b){let rNorm=r/255;let gNorm=g/255;let bNorm=b/255;let max=Math.max(rNorm,gNorm,bNorm);let min=Math.min(rNorm,gNorm,bNorm);let l=(max+min)/2;let h=0;let s=0;if(max!==min){let d=max-min;s=l>.5?d/(2-max-min):d/(max+min),h=max===rNorm?((gNorm-bNorm)/d+(gNorm<bNorm?6:0))/6:max===gNorm?((bNorm-rNorm)/d+2)/6:((rNorm-gNorm)/d+4)/6}return{h:h*360,s:s*100,l:l*100}}function hslToRgb(h,s,l){let sNorm=Math.max(0,Math.min(100,s))/100;let lNorm=Math.max(0,Math.min(100,l))/100;let hNorm=(h%360+360)%360;let c=(1-Math.abs(2*lNorm-1))*sNorm;let x=c*(1-Math.abs(hNorm/60%2-1));let m=lNorm-c/2;let r1=0;let g1=0;let b1=0;return hNorm<60?(r1=c,g1=x):hNorm<120?(r1=x,g1=c):hNorm<180?(g1=c,b1=x):hNorm<240?(g1=x,b1=c):hNorm<300?(r1=x,b1=c):(r1=c,b1=x),{r:(r1+m)*255,g:(g1+m)*255,b:(b1+m)*255}}function sRGBToLinear(v){return v<=.04045?v/12.92:((v+.055)/1.055)**2.4}function linearToSRGB(v){return v<=.0031308?12.92*v:1.055*v**(1/2.4)-.055}function rgbToOklch(r,g,b){let rLin=sRGBToLinear(Math.max(0,Math.min(255,r))/255);let gLin=sRGBToLinear(Math.max(0,Math.min(255,g))/255);let bLin=sRGBToLinear(Math.max(0,Math.min(255,b))/255);let lLms=.4122214708*rLin+.5363325363*gLin+.0514459929*bLin;let mLms=.2119034982*rLin+.6806995451*gLin+.1073969566*bLin;let sLms=.0883024619*rLin+.2817188376*gLin+.6299787005*bLin;let lp=Math.cbrt(lLms);let mp=Math.cbrt(mLms);let sp=Math.cbrt(sLms);let L=.2104542553*lp+.793617785*mp-.0040720468*sp;let aLab=1.9779984951*lp-2.428592205*mp+.4505937099*sp;let bLab=.0259040371*lp+.7827717662*mp-.808675766*sp;let C=Math.sqrt(aLab*aLab+bLab*bLab);let H=Math.atan2(bLab,aLab)*180/Math.PI;return H<0&&(H+=360),{l:L,c:C,h:H}}function oklchToRgb(l,c,h){let hRad=h*Math.PI/180;let a=c*Math.cos(hRad);let bLab=c*Math.sin(hRad);let lp=l+.3963377774*a+.2158037573*bLab;let mp=l-.1055613458*a-.0638541728*bLab;let sp=l-.0894841775*a-1.291485548*bLab;let lc=lp**3;let mc=mp**3;let sc=sp**3;let rLinear=4.0767416621*lc-3.3077115913*mc+.2309699292*sc;let gLinear=-1.2684380046*lc+2.6097574011*mc-.3413193965*sc;let bLinear=-.0041960863*lc-.7034186147*mc+1.707614701*sc;return{r:Math.max(0,Math.min(1,linearToSRGB(rLinear)))*255,g:Math.max(0,Math.min(1,linearToSRGB(gLinear)))*255,b:Math.max(0,Math.min(1,linearToSRGB(bLinear)))*255}}function round1(n){return Math.round(n*10)/10}function roundTo(n,places){let factor=10**places;return Math.round(n*factor)/factor}function formatAsHSL(channels){return`hsl(${round1(channels.h)} ${round1(channels.s)}% ${round1(channels.l)}%)`}function formatAsOklch(channels){let l=roundTo(channels.l,4);let c=roundTo(channels.c,4);return`oklch(${l} ${c} ${c===0?0:roundTo(channels.h,2)})`}function colorToHex(value){let oklch=parseColorAsOklch(value);let{r,g,b}=oklchToRgb(oklch.l,oklch.c,oklch.h);let toHex=n=>{let v=Math.round(Math.max(0,Math.min(255,n))).toString(16);return v.length===1?`0${v}`:v};return`#${toHex(r)}${toHex(g)}${toHex(b)}`}function isCompleteCSSColor(value){let trimmed=value.trim();return COMPLETE_COLOR_PATTERN.test(trimmed)||HEX_COLOR_PATTERN.test(trimmed)||CSS_VAR_PATTERN.test(trimmed)}function normalizeColor(value){return isCompleteCSSColor(value)?value:formatAsHSL(parseColor(value))}export{colorToHex,formatAsHSL,formatAsOklch,isCompleteCSSColor,normalizeColor,parseColor,parseColorAsOklch};
@@ -1,11 +1,35 @@
1
1
  import { ColorScale } from '../types';
2
- export declare function parseHSL(hsl: string): {
2
+ /**
3
+ * @deprecated Prefer `parseColor` from `./color-parser` — it accepts any CSS color format
4
+ * (hsl(), rgb(), oklch(), #hex, or the legacy raw "H S% L%"). This alias is kept for
5
+ * internal backwards-compatibility during the v5 migration and may be removed in v6.
6
+ */
7
+ export declare function parseHSL(value: string): {
3
8
  h: number;
4
9
  s: number;
5
10
  l: number;
6
11
  };
7
- export declare function formatHSL(h: number, s: number, l: number): string;
12
+ /**
13
+ * Generate an 11-step color scale from a base color.
14
+ *
15
+ * The base color may be given in any CSS color format (`hsl()`, `rgb()`, `oklch()`, `#hex`,
16
+ * or the legacy raw `"H S% L%"`). Stepping happens in OKLch space (perceptually uniform),
17
+ * and the output is emitted as `oklch(L C H)` strings.
18
+ */
8
19
  export declare function generateColorScale(baseColor: string): ColorScale;
20
+ /**
21
+ * Return a black or white `oklch()` string suitable for text drawn on top of `baseColor`.
22
+ *
23
+ * The threshold (L=0.62) is calibrated for OKLch lightness — perceptually equivalent
24
+ * to a mid-gray, so colors above that get black text, below it white text.
25
+ */
9
26
  export declare function getContrastColor(baseColor: string): string;
27
+ /**
28
+ * Shift the lightness of a color by `adjustment`. The adjustment is given in
29
+ * OKLch L units (0..1) — e.g. `0.1` to lighten by 10% perceptual luminance.
30
+ *
31
+ * The input can be in any CSS color format; the output is always a complete
32
+ * `oklch()` string.
33
+ */
10
34
  export declare function adjustColorLightness(baseColor: string, adjustment: number): string;
11
35
  //# sourceMappingURL=color-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"color-utils.d.ts","sourceRoot":"","sources":["../../src/utils/color-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAUzE;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAKjE;AAkCD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAyChE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAIlF"}
1
+ {"version":3,"file":"color-utils.d.ts","sourceRoot":"","sources":["../../src/utils/color-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAG1C;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAE3E;AAuCD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAmBhE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAIlF"}
@@ -1 +1 @@
1
- function parseHSL(hsl){let match=hsl.match(/^(\d+(?:\.\d+)?)\s+(\d+(?:\.\d+)?)%\s+(\d+(?:\.\d+)?)%$/);if(!match)throw Error(`Invalid HSL format: ${hsl}`);return{h:Number.parseFloat(match[1]),s:Number.parseFloat(match[2]),l:Number.parseFloat(match[3])}}function formatHSL(h,s,l){return`${Math.round(h*10)/10} ${Math.round(s*10)/10}% ${Math.round(l*10)/10}%`}var LUMINOSITY_OFFSETS={50:37.5,100:30,200:22.5,300:15,400:7.5,500:0,600:-7.5,700:-15,800:-22.5,900:-30,950:-37.5};function calculateSaturationMultiplier(baseVariant,targetVariant,baseSaturation){if(targetVariant===baseVariant)return 1;let saturationFactor=Math.min(baseSaturation/100,1);let variantDiff=Math.abs(targetVariant-baseVariant);if(targetVariant<baseVariant){let reduction=variantDiff/500*.25*saturationFactor;return Math.max(.3,1-reduction)}else{let increase=variantDiff/400*.15*saturationFactor;return Math.min(1.3,1+increase)}}function generateColorScale(baseColor){let{h,s,l}=parseHSL(baseColor);let baseLuminosity=l;let variants=Object.keys(LUMINOSITY_OFFSETS).map(Number);let scale={};return variants.forEach(variant=>{if(variant===500)scale[variant]=formatHSL(h,s,l);else{let isUnderBase=variant<500;let isOverBase=variant>500;let luminosityOffset=LUMINOSITY_OFFSETS[variant];let targetLuminosity;targetLuminosity=isUnderBase&&l>=100?baseLuminosity:baseLuminosity+luminosityOffset,isOverBase&&l<=0&&(targetLuminosity=0),targetLuminosity=Math.min(100,Math.max(0,targetLuminosity));let saturationMultiplier=calculateSaturationMultiplier(500,variant,s);scale[variant]=formatHSL(h,Math.min(100,Math.max(5,s*saturationMultiplier)),targetLuminosity)}}),scale}function getContrastColor(baseColor){let{l}=parseHSL(baseColor);return l>50?`0 0% 0%`:`0 0% 100%`}function adjustColorLightness(baseColor,adjustment){let{h,s,l}=parseHSL(baseColor);return formatHSL(h,s,Math.max(0,Math.min(100,l+adjustment)))}export{adjustColorLightness,formatHSL,generateColorScale,getContrastColor,parseHSL};
1
+ import{formatAsOklch,parseColor,parseColorAsOklch}from"./color-parser.js";function parseHSL(value){return parseColor(value)}var LIGHTNESS_OFFSETS={50:.42,100:.35,200:.26,300:.17,400:.08,500:0,600:-.07,700:-.14,800:-.21,900:-.28,950:-.34};function clamp(n,min,max){return Math.max(min,Math.min(max,n))}function chromaFalloff(targetL){return targetL>=.96?Math.max(0,1-(targetL-.96)*12):targetL<=.18?Math.max(0,targetL/.18):1}function generateColorScale(baseColor){let base=parseColorAsOklch(baseColor);let scale={};let variants=Object.keys(LIGHTNESS_OFFSETS).map(Number);for(let variant of variants){if(variant===500){scale[variant]=formatAsOklch(base);continue}let offset=LIGHTNESS_OFFSETS[variant];let targetL=clamp(base.l+offset,0,1);scale[variant]=formatAsOklch({l:targetL,c:base.c*chromaFalloff(targetL),h:base.h})}return scale}function getContrastColor(baseColor){let{l}=parseColorAsOklch(baseColor);return l>.62?`oklch(0 0 0)`:`oklch(1 0 0)`}function adjustColorLightness(baseColor,adjustment){let{l,c,h}=parseColorAsOklch(baseColor);return formatAsOklch({l:clamp(l+adjustment,0,1),c,h})}export{adjustColorLightness,generateColorScale,getContrastColor,parseHSL};
@@ -1,3 +1,9 @@
1
1
  export declare function getCookie(key: string): string | null;
2
2
  export declare function setCookie(key: string, value: string): void;
3
+ /** Persisted preset name from `maz-preset` cookie, or `null`. */
4
+ export declare function getSavedPresetName(): string | null;
5
+ /** Write `name` to the `maz-preset` cookie, no-op if value already matches. */
6
+ export declare function saveResolvedPresetName(name: string): void;
7
+ /** Drop the `maz-preset` cookie (saved name no longer resolves). */
8
+ export declare function clearSavedPresetName(): void;
3
9
  //# sourceMappingURL=cookie-storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookie-storage.d.ts","sourceRoot":"","sources":["../../src/utils/cookie-storage.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQpD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAK1D"}
1
+ {"version":3,"file":"cookie-storage.d.ts","sourceRoot":"","sources":["../../src/utils/cookie-storage.ts"],"names":[],"mappings":"AAIA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQpD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAK1D;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAElD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzD;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
@@ -1 +1 @@
1
- import{isServer}from"@maz-ui/utils/helpers/isServer";function getCookie(key){if(isServer())return null;let cookie=document.cookie.split(`;`).find(c=>c.trim().startsWith(`${key}=`));return cookie?decodeURIComponent(cookie.split(`=`)[1]):null}function setCookie(key,value){isServer()||(document.cookie=`${key}=${encodeURIComponent(value)}; path=/; max-age=${3600*24*365}; SameSite=Lax`)}export{getCookie,setCookie};
1
+ import{isServer}from"@maz-ui/utils/helpers/isServer";var PRESET_COOKIE=`maz-preset`;function getCookie(key){if(isServer())return null;let cookie=document.cookie.split(`;`).find(c=>c.trim().startsWith(`${key}=`));return cookie?decodeURIComponent(cookie.split(`=`)[1]):null}function setCookie(key,value){isServer()||(document.cookie=`${key}=${encodeURIComponent(value)}; path=/; max-age=${3600*24*365}; SameSite=Lax`)}function getSavedPresetName(){return getCookie(PRESET_COOKIE)}function saveResolvedPresetName(name){!name||getCookie(PRESET_COOKIE)===name||setCookie(PRESET_COOKIE,name)}function clearSavedPresetName(){isServer()||(document.cookie=`${PRESET_COOKIE}=; path=/; max-age=0; SameSite=Lax`)}export{clearSavedPresetName,getCookie,getSavedPresetName,saveResolvedPresetName,setCookie};
@@ -1,19 +1,11 @@
1
- import { DarkModeStrategy, ThemeColors, ThemeFoundation, ThemeMode, ThemePreset } from '../types';
1
+ import { DarkModeStrategy, ThemeMode, ThemePreset } from '../types';
2
2
  export interface CSSOptions {
3
- /** Generate only critical CSS variables */
4
- onlyCritical?: boolean;
5
- /** Critical color variables to include (only used when onlyCritical is true) */
6
- criticalColors?: (keyof ThemeColors)[];
7
- /** Critical foundation variables to include (only used when onlyCritical is true) */
8
- criticalFoundation?: (keyof ThemeFoundation)[];
9
3
  /** Theme mode to generate */
10
4
  mode: ThemeMode;
11
5
  /** Dark mode selector: 'class' (.dark) | 'media' (@media) */
12
6
  darkSelectorStrategy: DarkModeStrategy;
13
7
  /** CSS variables prefix */
14
8
  prefix?: string;
15
- /** Include color scales (50-900) - only used when onlyCritical is false */
16
- includeColorScales?: boolean;
17
9
  /** Dark class name */
18
10
  darkClass: string;
19
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"css-generator.d.ts","sourceRoot":"","sources":["../../src/utils/css-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAItG,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,gFAAgF;IAChF,cAAc,CAAC,EAAE,CAAC,MAAM,WAAW,CAAC,EAAE,CAAA;IACtC,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,CAAC,MAAM,eAAe,CAAC,EAAE,CAAA;IAC9C,6BAA6B;IAC7B,IAAI,EAAE,SAAS,CAAA;IACf,6DAA6D;IAC7D,oBAAoB,EAAE,gBAAgB,CAAA;IACtC,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAmCD,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,UAKR,GACA,MAAM,CAwCR;AA0KD,eAAO,MAAM,MAAM,kBAAkB,CAAA;AAErC,wBAAgB,SAAS,CAAC,EAAE,oBAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CA+BxD;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAS3C"}
1
+ {"version":3,"file":"css-generator.d.ts","sourceRoot":"","sources":["../../src/utils/css-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAgC,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAKtG,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,IAAI,EAAE,SAAS,CAAA;IACf,6DAA6D;IAC7D,oBAAoB,EAAE,gBAAgB,CAAA;IACtC,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAID,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,UAIR,GACA,MAAM,CAwCR;AAuHD,eAAO,MAAM,MAAM,kBAAkB,CAAA;AAErC,wBAAgB,SAAS,CAAC,EAAE,oBAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CA2BxD;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAK3C"}
@@ -1,4 +1,4 @@
1
- import{generateColorScale}from"./color-utils.js";import{isServer}from"@maz-ui/utils/helpers/isServer";var DEFAULT_CRITICAL_COLORS=[`background`,`foreground`,`primary`,`primary-foreground`,`secondary`,`secondary-foreground`,`accent`,`accent-foreground`,`destructive`,`destructive-foreground`,`success`,`success-foreground`,`warning`,`warning-foreground`,`info`,`info-foreground`,`contrast`,`contrast-foreground`,`muted`,`shadow`,`border`];var DEFAULT_CRITICAL_FOUNDATION=[`radius`,`font-family`,`base-font-size`,`border-width`];var scaleColors=[`primary`,`secondary`,`accent`,`destructive`,`success`,`warning`,`info`,`contrast`,`background`,`foreground`,`border`,`muted`,`overlay`,`shadow`];function generateCSS(preset,options={onlyCritical:!1,mode:`both`,darkSelectorStrategy:`class`,darkClass:`dark`}){let{onlyCritical=!1,criticalColors=DEFAULT_CRITICAL_COLORS,criticalFoundation=DEFAULT_CRITICAL_FOUNDATION,mode,darkSelectorStrategy,prefix=`maz`,includeColorScales=!0,darkClass=`dark`}=options;let css=`@layer maz-ui-theme {
2
- `;return(mode===`light`||mode===`both`)&&(css+=generateLightThemeVariables(preset,{onlyCritical,criticalColors,criticalFoundation,prefix,includeColorScales})),(mode===`dark`||mode===`both`)&&(css+=generateDarkThemeVariables(preset,{onlyCritical,criticalColors,criticalFoundation,mode,darkSelectorStrategy,prefix,includeColorScales,darkClass})),css+=`}
3
- `,css}function generateLightThemeVariables(preset,options){let{onlyCritical,criticalColors,criticalFoundation,prefix,includeColorScales}=options;return generateVariablesBlock({selector:`:root`,colors:onlyCritical?extractCriticalVariables(preset.colors.light,criticalColors):preset.colors.light,foundation:onlyCritical?extractCriticalFoundation(preset.foundation,criticalFoundation):preset.foundation,prefix,includeScales:!onlyCritical&&includeColorScales,preset:onlyCritical?void 0:preset})}function generateDarkThemeVariables(preset,options){let{onlyCritical,criticalColors,criticalFoundation,mode,darkSelectorStrategy,prefix,includeColorScales,darkClass}=options;let darkColors=onlyCritical?extractCriticalVariables(preset.colors.dark,criticalColors):preset.colors.dark;let darkFoundation=getDarkFoundation(onlyCritical,mode,preset.foundation,criticalFoundation);return generateVariablesBlock({selector:darkSelectorStrategy===`media`?`:root`:`.${darkClass}`,mediaQuery:darkSelectorStrategy===`media`?`@media (prefers-color-scheme: dark)`:void 0,colors:darkColors,foundation:darkFoundation,prefix,includeScales:!onlyCritical&&includeColorScales,preset:onlyCritical?void 0:preset,isDark:!0})}function getDarkFoundation(onlyCritical,mode,foundation,criticalFoundation){return onlyCritical?extractCriticalFoundation(foundation,criticalFoundation):mode===`dark`?foundation:void 0}function extractCriticalVariables(colors,criticalKeys){return Object.fromEntries(criticalKeys.filter(key=>colors[key]).map(key=>[key,colors[key]]))}function extractCriticalFoundation(foundation,criticalKeys){return foundation?Object.fromEntries(criticalKeys.filter(key=>foundation[key]).map(key=>[key,foundation[key]])):{}}function generateVariablesBlock({selector,mediaQuery,colors,foundation,prefix,includeScales=!1,preset,isDark=!1}){let variables=[];if(colors&&Object.entries(colors).forEach(([key,value])=>{value&&variables.push(` --${prefix}-${key}: ${value};`)}),foundation&&Object.entries(foundation).forEach(([key,value])=>{value&&variables.push(` --${prefix}-${key}: ${value};`)}),includeScales&&preset){let colorScales=generateAllColorScales(isDark?preset.colors.dark:preset.colors.light,prefix);variables.push(...colorScales)}let content=variables.join(`
4
- `);return mediaQuery?`\n ${mediaQuery} {\n ${selector} {\n${content.replace(/^/gm,` `)}\n }\n }\n`:`\n ${selector} {\n${content}\n }\n`}function generateAllColorScales(colors,prefix){let colorScales=[];return scaleColors.forEach(colorName=>{let baseColor=colors[colorName];if(baseColor){let scale=generateColorScale(baseColor);Object.entries(scale).forEach(([scaleKey,scaleValue])=>{colorScales.push(` --${prefix}-${colorName}-${scaleKey}: ${scaleValue};`)})}}),colorScales}var CSS_ID=`maz-theme-css`;function injectCSS(id=CSS_ID,css){if(isServer())return;let styleElements=[...document.querySelectorAll(`#${id}`)];if(!styleElements||styleElements.length===0){let element=document.createElement(`style`);element.id=id,document.head.appendChild(element),element.textContent=css;return}if(styleElements.length===1){styleElements[0].textContent=css;return}let lastElement=styleElements.at(-1);if(styleElements.length>1){for(let i=0;i<styleElements.length-1;i++)styleElements[i].remove();lastElement&&(lastElement.textContent=css)}}function removeCSS(id=CSS_ID){if(isServer())return;let styleElements=document.querySelectorAll(`#${id}`);for(let styleElement of styleElements)styleElement&&styleElement.remove()}export{CSS_ID,generateCSS,injectCSS,removeCSS};
1
+ import{normalizeColor}from"./color-parser.js";import{generateColorScale}from"./color-utils.js";import{isServer}from"@maz-ui/utils/helpers/isServer";var scaleColors=[`primary`,`secondary`,`accent`,`destructive`,`success`,`warning`,`info`,`contrast`,`surface`,`foreground`,`divider`,`muted`,`overlay`,`shadow`];function generateCSS(preset,options={mode:`both`,darkSelectorStrategy:`class`,darkClass:`dark`}){let{mode,darkSelectorStrategy,prefix=`maz`,darkClass=`dark`}=options;let css=`@layer theme {
2
+ `;let rootSelector=`:root`;let darkClassSelector=`.${darkClass}`;return(mode===`light`||mode===`both`)&&(css+=generateVariablesBlock({selector:rootSelector,colors:preset.colors.light,foundation:preset.foundation,prefix,preset,mode:`light`})),(mode===`dark`||mode===`both`)&&(css+=generateVariablesBlock({selector:darkSelectorStrategy===`media`?rootSelector:darkClassSelector,mediaQuery:darkSelectorStrategy===`media`?`@media (prefers-color-scheme: dark)`:void 0,colors:preset.colors.dark,foundation:mode===`dark`?preset.foundation:void 0,prefix,preset,isDark:!0,mode:`dark`})),css+=`}
3
+ `,css}function generateVariablesBlock({selector,mediaQuery,colors,foundation,prefix,preset,isDark=!1,mode=`light`}){let variables=[];colors&&Object.entries(colors).forEach(([key,value])=>{value&&variables.push(` --${prefix}-${key}: ${normalizeColor(value)};`)}),foundation&&Object.entries(foundation).forEach(([key,value])=>{value&&variables.push(` --${prefix}-${key}: ${value};`)}),!isDark&&preset?.scales&&variables.push(...generateScaleVariables(preset.scales,prefix)),preset?.components&&variables.push(...generateComponentVariables(preset.components,mode,prefix)),preset&&variables.push(...generateAllColorScales(isDark?preset.colors.dark:preset.colors.light,prefix));let content=variables.join(`
4
+ `);return mediaQuery?`\n ${mediaQuery} {\n ${selector} {\n${content.replace(/^/gm,` `)}\n }\n }\n`:`\n ${selector} {\n${content}\n }\n`}function generateScaleVariables(scales,prefix){let lines=[];return Object.entries(scales.rounded??{}).forEach(([key,value])=>{value&&lines.push(` --${prefix}-rounded-${key}: ${value};`)}),Object.entries(scales.shadow??{}).forEach(([key,value])=>{value&&lines.push(` --${prefix}-shadow-style-${key}: ${value};`)}),lines}function generateComponentVariables(components,mode,prefix){let lines=[];components.btn?.[`font-weight`]&&lines.push(` --${prefix}-btn-font-weight: ${components.btn[`font-weight`]};`);let containerBg=components.container?.bg?.[mode];containerBg&&lines.push(` --${prefix}-container-bg: ${normalizeColor(containerBg)};`);let inputBg=components.input?.bg?.[mode];return inputBg&&lines.push(` --${prefix}-input-bg: ${normalizeColor(inputBg)};`),lines}function generateAllColorScales(colors,prefix){let colorScales=[];return scaleColors.forEach(colorName=>{let baseColor=colors[colorName];if(baseColor){let scale=generateColorScale(baseColor);Object.entries(scale).forEach(([scaleKey,scaleValue])=>{colorScales.push(` --${prefix}-${colorName}-${scaleKey}: ${scaleValue};`)})}}),colorScales}var CSS_ID=`maz-theme-css`;function injectCSS(id=CSS_ID,css){if(isServer())return;let styleElements=[...document.querySelectorAll(`#${id}`)];if(styleElements.length===0){let element=document.createElement(`style`);element.id=id,element.textContent=css,document.head.appendChild(element);return}if(styleElements.length===1){styleElements[0].textContent=css;return}let lastElement=styleElements.at(-1);for(let i=0;i<styleElements.length-1;i++)styleElements[i].remove();lastElement&&(lastElement.textContent=css)}function removeCSS(id=CSS_ID){isServer()||document.querySelectorAll(`#${id}`).forEach(el=>el.remove())}export{CSS_ID,generateCSS,injectCSS,removeCSS};
@@ -1 +1 @@
1
- {"version":3,"file":"get-preset.d.ts","sourceRoot":"","sources":["../../src/utils/get-preset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAElF,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,WAAW,GAAG,oBAAoB,GAAG,MAAM,IAAI,WAAW,CAEnH;AAED,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,WAAW,wBA0BrE"}
1
+ {"version":3,"file":"get-preset.d.ts","sourceRoot":"","sources":["../../src/utils/get-preset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAElF,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,WAAW,GAAG,oBAAoB,GAAG,MAAM,IAAI,WAAW,CAEnH;AAED,wBAAsB,SAAS,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,WAAW,wBA+BrE"}
@@ -1 +1 @@
1
- function isPresetObject(preset){return typeof preset==`object`&&!!preset&&!!preset.name}async function getPreset(preset){if(isPresetObject(preset))return preset;if(preset===`mazUi`||!preset||preset===`maz-ui`){let{mazUi}=await import(`../presets/mazUi.js`);return mazUi}if(preset===`ocean`){let{ocean}=await import(`../presets/ocean.js`);return ocean}if(preset===`pristine`){let{pristine}=await import(`../presets/pristine.js`);return pristine}if(preset===`obsidian`){let{obsidian}=await import(`../presets/obsidian.js`);return obsidian}throw TypeError(`[@maz-ui/themes] Preset ${preset} not found`)}export{getPreset,isPresetObject};
1
+ function isPresetObject(preset){return typeof preset==`object`&&!!preset&&!!preset.name}async function getPreset(preset){if(isPresetObject(preset))return preset;if(preset===`mazUi`||!preset||preset===`maz-ui`){let{mazUi}=await import(`../presets/mazUi.js`);return mazUi}if(preset===`ocean`){let{ocean}=await import(`../presets/ocean.js`);return ocean}if(preset===`pristine`){let{pristine}=await import(`../presets/pristine.js`);return pristine}if(preset===`obsidian`){let{obsidian}=await import(`../presets/obsidian.js`);return obsidian}if(preset===`nova`){let{nova}=await import(`../presets/nova.js`);return nova}throw TypeError(`[@maz-ui/themes] Preset ${preset} not found`)}export{getPreset,isPresetObject};
@@ -1,3 +1,4 @@
1
+ export * from './color-parser';
1
2
  export * from './color-utils';
2
3
  export * from './cookie-storage';
3
4
  export * from './css-generator';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,yBAAyB,CAAA"}
@@ -1 +1 @@
1
- import{adjustColorLightness,formatHSL,generateColorScale,getContrastColor,parseHSL}from"./color-utils.js";import{getCookie,setCookie}from"./cookie-storage.js";import{CSS_ID,generateCSS,injectCSS,removeCSS}from"./css-generator.js";import{getPreset,isPresetObject}from"./get-preset.js";import{injectThemeState}from"./inject.js";import{injectThemeCSS}from"./inject-theme-css.js";import{noTransition}from"./no-transition.js";import{deepMerge,mergePresets}from"./preset-merger.js";import{updateDocumentClass}from"./update-document-class.js";import{defaultOptions,setupTheme}from"./setup-theme.js";export{CSS_ID,adjustColorLightness,deepMerge,defaultOptions,formatHSL,generateCSS,generateColorScale,getContrastColor,getCookie,getPreset,injectCSS,injectThemeCSS,injectThemeState,isPresetObject,mergePresets,noTransition,parseHSL,removeCSS,setCookie,setupTheme,updateDocumentClass};
1
+ import{colorToHex,formatAsHSL,formatAsOklch,isCompleteCSSColor,normalizeColor,parseColor,parseColorAsOklch}from"./color-parser.js";import{adjustColorLightness,generateColorScale,getContrastColor,parseHSL}from"./color-utils.js";import{clearSavedPresetName,getCookie,getSavedPresetName,saveResolvedPresetName,setCookie}from"./cookie-storage.js";import{CSS_ID,generateCSS,injectCSS,removeCSS}from"./css-generator.js";import{getPreset,isPresetObject}from"./get-preset.js";import{injectThemeState}from"./inject.js";import{injectThemeCSS}from"./inject-theme-css.js";import{noTransition}from"./no-transition.js";import{deepMerge,mergePresets}from"./preset-merger.js";import{updateDocumentClass}from"./update-document-class.js";import{defaultOptions,setupTheme}from"./setup-theme.js";export{CSS_ID,adjustColorLightness,clearSavedPresetName,colorToHex,deepMerge,defaultOptions,formatAsHSL,formatAsOklch,generateCSS,generateColorScale,getContrastColor,getCookie,getPreset,getSavedPresetName,injectCSS,injectThemeCSS,injectThemeState,isCompleteCSSColor,isPresetObject,mergePresets,noTransition,normalizeColor,parseColor,parseColorAsOklch,parseHSL,removeCSS,saveResolvedPresetName,setCookie,setupTheme,updateDocumentClass};
@@ -1 +1 @@
1
- {"version":3,"file":"inject-theme-css.d.ts","sourceRoot":"","sources":["../../src/utils/inject-theme-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAK3C,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAuC/I"}
1
+ {"version":3,"file":"inject-theme-css.d.ts","sourceRoot":"","sources":["../../src/utils/inject-theme-css.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,wBAAgB,cAAc,CAC5B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAUxF"}
@@ -1 +1 @@
1
- import{CSS_ID,generateCSS,injectCSS}from"./css-generator.js";import{nextTick}from"vue";function injectThemeCSS(finalPreset,config){if(typeof document>`u`)return;let cssOptions={mode:config.mode,darkSelectorStrategy:config.darkModeStrategy,darkClass:config.darkClass};if(config.injectCriticalCSS&&injectCSS(CSS_ID,generateCSS(finalPreset,{...cssOptions,onlyCritical:!0})),!config.injectFullCSS)return;let fullCSS=generateCSS(finalPreset,cssOptions);config.strategy===`runtime`?injectCSS(CSS_ID,fullCSS):config.strategy===`hybrid`&&(typeof requestIdleCallback<`u`?requestIdleCallback(()=>{injectCSS(CSS_ID,fullCSS)},{timeout:100}):nextTick(()=>{injectCSS(CSS_ID,fullCSS)}))}export{injectThemeCSS};
1
+ import{CSS_ID,generateCSS,injectCSS}from"./css-generator.js";function injectThemeCSS(finalPreset,config){typeof document>`u`||config.strategy===`buildtime`||injectCSS(CSS_ID,generateCSS(finalPreset,{mode:config.mode,darkSelectorStrategy:config.darkModeStrategy,darkClass:config.darkClass}))}export{injectThemeCSS};
@@ -1,2 +1,2 @@
1
- export declare function noTransition(fn: () => void): void;
1
+ export declare function noTransition<T extends (...args: any[]) => any>(fn: T, ...args: Parameters<T>): ReturnType<T>;
2
2
  //# sourceMappingURL=no-transition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"no-transition.d.ts","sourceRoot":"","sources":["../../src/utils/no-transition.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,IAAI,QAmB1C"}
1
+ {"version":3,"file":"no-transition.d.ts","sourceRoot":"","sources":["../../src/utils/no-transition.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAC5D,EAAE,EAAE,CAAC,EACL,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GACrB,UAAU,CAAC,CAAC,CAAC,CAoBf"}
@@ -1,5 +1,5 @@
1
- import{isServer}from"@maz-ui/utils/helpers/isServer";function noTransition(fn){if(isServer()){fn();return}let style=document.createElement(`style`);style.textContent=`.no-transitions *,
1
+ import{isServer}from"@maz-ui/utils/helpers/isServer";function noTransition(fn,...args){if(isServer())return fn(...args);let style=document.createElement(`style`);return style.textContent=`.no-transitions *,
2
2
  .no-transitions *::before,
3
3
  .no-transitions *::after {
4
4
  transition-property: transform, opacity, scale, rotate, translate !important;
5
- }`,document.head.appendChild(style),document.documentElement.classList.add(`no-transitions`),fn(),setTimeout(()=>{document.documentElement.classList.remove(`no-transitions`),style.remove()},500)}export{noTransition};
5
+ }`,document.head.appendChild(style),document.documentElement.classList.add(`no-transitions`),setTimeout(()=>{document.documentElement.classList.remove(`no-transitions`),style.remove()},500),fn(...args)}export{noTransition};
@@ -1 +1 @@
1
- {"version":3,"file":"preset-merger.d.ts","sourceRoot":"","sources":["../../src/utils/preset-merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,WAAW,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE9E,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,GAAG,WAAW,CAY5F;AAYD,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAkB7B"}
1
+ {"version":3,"file":"preset-merger.d.ts","sourceRoot":"","sources":["../../src/utils/preset-merger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgC,WAAW,EAAE,oBAAoB,EAAe,MAAM,UAAU,CAAA;AAE5G,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,oBAAoB,GAAG,WAAW,CAc5F;AAqCD,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAkB7B"}
@@ -1 +1 @@
1
- function mergePresets(base,overrides){return{name:overrides.name||base.name,foundation:{...base.foundation,...overrides.foundation},colors:{light:mergeColors(base.colors.light,overrides.colors?.light),dark:mergeColors(base.colors.dark,overrides.colors?.dark)}}}function mergeColors(base,overrides){return overrides?{...base,...overrides}:base}function deepMerge(target,source){let result={...target};for(let key in source){let sourceValue=source[key];let targetValue=result[key];sourceValue!==void 0&&(isObject(sourceValue)&&isObject(targetValue)?result[key]=deepMerge(targetValue,sourceValue):result[key]=sourceValue)}return result}function isObject(value){return typeof value==`object`&&!!value&&!Array.isArray(value)}export{deepMerge,mergePresets};
1
+ function mergePresets(base,overrides){return{name:overrides.name||base.name,foundation:{...base.foundation,...overrides.foundation},scales:mergeScales(base.scales,overrides.scales),components:mergeComponents(base.components,overrides.components),colors:{light:mergeColors(base.colors.light,overrides.colors?.light),dark:mergeColors(base.colors.dark,overrides.colors?.dark)}}}function mergeScales(base,overrides){return overrides?{rounded:{...base.rounded,...overrides.rounded},shadow:{...base.shadow,...overrides.shadow}}:base}function mergeComponents(base,overrides){if(!(!base&&!overrides))return{btn:{...base?.btn,...overrides?.btn},container:{bg:{...base?.container?.bg,...overrides?.container?.bg}},input:{bg:{...base?.input?.bg,...overrides?.input?.bg}}}}function mergeColors(base,overrides){return overrides?{...base,...overrides}:base}function deepMerge(target,source){let result={...target};for(let key in source){let sourceValue=source[key];let targetValue=result[key];sourceValue!==void 0&&(isObject(sourceValue)&&isObject(targetValue)?result[key]=deepMerge(targetValue,sourceValue):result[key]=sourceValue)}return result}function isObject(value){return typeof value==`object`&&!!value&&!Array.isArray(value)}export{deepMerge,mergePresets};
@@ -2,27 +2,18 @@ import { Ref } from 'vue';
2
2
  import { MazUiThemeOptions } from '../plugin';
3
3
  import { ThemeState } from '../types';
4
4
  export declare const defaultOptions: {
5
- strategy: "hybrid";
5
+ strategy: "runtime";
6
6
  overrides: {};
7
7
  darkModeStrategy: "class";
8
8
  preset: undefined;
9
- injectCriticalCSS: true;
10
- injectFullCSS: true;
11
9
  mode: "both";
12
10
  darkClass: string;
13
11
  colorMode: "auto";
12
+ persistPreset: true;
14
13
  };
15
14
  export interface SetupThemeReturn {
16
15
  themeState: Ref<ThemeState>;
17
16
  cleanup: () => void;
18
17
  }
19
- /**
20
- * Sets up the theme state, CSS injection, and watchers without binding to a Vue app.
21
- * The caller is responsible for calling `app.provide()` and setting `app.config.globalProperties`.
22
- *
23
- * Always returns synchronously with a populated themeState ref.
24
- * When no preset object is provided, the default preset is resolved asynchronously
25
- * in the background and the themeState is updated reactively (causes FOUC).
26
- */
27
18
  export declare function setupTheme(options: MazUiThemeOptions): SetupThemeReturn;
28
19
  //# sourceMappingURL=setup-theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setup-theme.d.ts","sourceRoot":"","sources":["../../src/utils/setup-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,UAAU,CAAA;AAuEvD,eAAO,MAAM,cAAc;;;;;;;;;;CAUgE,CAAA;AAE3F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAsED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAWvE"}
1
+ {"version":3,"file":"setup-theme.d.ts","sourceRoot":"","sources":["../../src/utils/setup-theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAgC,UAAU,EAAE,MAAM,UAAU,CAAA;AAwExE,eAAO,MAAM,cAAc;;;;;;;;;CASgE,CAAA;AAE3F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AA4FD,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAsCvE"}
@@ -1 +1 @@
1
- import{getPreset}from"./get-preset.js";import{injectThemeCSS}from"./inject-theme-css.js";import{mergePresets}from"./preset-merger.js";import{getColorMode,getSavedColorMode,getSystemColorMode,saveResolvedColorMode}from"./get-color-mode.js";import{updateDocumentClass}from"./update-document-class.js";import{useMutationObserver}from"./use-mutation-observer.js";import{isServer}from"@maz-ui/utils/helpers/isServer";import{ref,watch}from"vue";function watchColorSchemeFromMedia(themeState){if(isServer())return()=>{};let mediaCleanup;if(themeState.value&&themeState.value.colorMode===`auto`){let mediaQuery=globalThis.matchMedia(`(prefers-color-scheme: dark)`);let updateFromMedia=()=>{if(themeState.value.colorMode===`auto`){let newColorMode=mediaQuery.matches?`dark`:`light`;updateDocumentClass(newColorMode===`dark`,themeState.value),themeState.value.isDark=newColorMode===`dark`,saveResolvedColorMode(newColorMode)}};mediaQuery.addEventListener(`change`,updateFromMedia),mediaCleanup=()=>mediaQuery.removeEventListener(`change`,updateFromMedia)}let stopWatch=watch(()=>themeState.value.colorMode,colorMode=>{let resolvedIsDark=colorMode===`auto`?getSystemColorMode()===`dark`:colorMode===`dark`;updateDocumentClass(resolvedIsDark,themeState.value),colorMode===`auto`&&saveResolvedColorMode(resolvedIsDark?`dark`:`light`)});return()=>{mediaCleanup?.(),stopWatch()}}function watchMutationClassOnHtmlElement(themeState){if(isServer())return()=>{};let{stop}=useMutationObserver(document.documentElement,()=>{if(isServer()||!themeState.value)return;let activeColorMode=document.documentElement.classList.contains(themeState.value.darkClass)?`dark`:`light`;themeState.value.isDark=activeColorMode===`dark`,themeState.value.colorMode!==activeColorMode&&themeState.value.colorMode!==`auto`&&(themeState.value.colorMode=activeColorMode)},{attributes:!0});return stop}var defaultOptions={strategy:`hybrid`,overrides:{},darkModeStrategy:`class`,preset:void 0,injectCriticalCSS:!0,injectFullCSS:!0,mode:`both`,darkClass:`dark`,colorMode:`auto`};function resolveConfig(options){return{...defaultOptions,...options,colorMode:getSavedColorMode()??options.colorMode??(options.mode===`dark`?`dark`:`auto`)}}function createThemeState(options,config){let isDark=config.colorMode===`auto`&&config.mode===`both`?getSystemColorMode()===`dark`||getColorMode(config.colorMode)===`dark`:getColorMode(config.colorMode)===`dark`||config.mode===`dark`;!isServer()&&config.colorMode===`auto`&&saveResolvedColorMode(isDark?`dark`:`light`);let themeState=ref({strategy:config.strategy,darkClass:config.darkClass,darkModeStrategy:config.darkModeStrategy,colorMode:config.colorMode,mode:config.mode,preset:void 0,isDark:options._isDark||isDark});return updateDocumentClass(themeState.value.isDark,themeState.value),themeState}function finalizeTheme(themeState,preset,config){let finalPreset=Object.keys(config.overrides).length>0&&preset?mergePresets(preset,config.overrides):preset;if(finalPreset&&(themeState.value.preset=finalPreset),config.strategy===`buildtime`||!finalPreset)return{themeState,cleanup:()=>{}};injectThemeCSS(finalPreset,config);let cleanupColorScheme=watchColorSchemeFromMedia(themeState);let cleanupMutation=watchMutationClassOnHtmlElement(themeState);return{themeState,cleanup:()=>{cleanupColorScheme(),cleanupMutation()}}}function setupTheme(options){let config=resolveConfig(options);let themeState=createThemeState(options,config);return config.preset&&typeof config.preset!=`string`||config.strategy===`buildtime`?finalizeTheme(themeState,config.preset,config):(getPreset(config.preset).then(preset=>finalizeTheme(themeState,preset,config)),{themeState,cleanup:()=>{}})}export{defaultOptions,setupTheme};
1
+ import{clearSavedPresetName,getSavedPresetName,saveResolvedPresetName}from"./cookie-storage.js";import{getPreset}from"./get-preset.js";import{injectThemeCSS}from"./inject-theme-css.js";import{mergePresets}from"./preset-merger.js";import{getColorMode,getSavedColorMode,getSystemColorMode,saveResolvedColorMode}from"./get-color-mode.js";import{updateDocumentClass}from"./update-document-class.js";import{useMutationObserver}from"./use-mutation-observer.js";import{isServer}from"@maz-ui/utils/helpers/isServer";import{ref,watch}from"vue";function watchColorSchemeFromMedia(themeState){if(isServer())return()=>{};let mediaCleanup;if(themeState.value&&themeState.value.colorMode===`auto`){let mediaQuery=globalThis.matchMedia(`(prefers-color-scheme: dark)`);let updateFromMedia=()=>{if(themeState.value.colorMode===`auto`){let newColorMode=mediaQuery.matches?`dark`:`light`;updateDocumentClass(newColorMode===`dark`,themeState.value),themeState.value.isDark=newColorMode===`dark`,saveResolvedColorMode(newColorMode)}};mediaQuery.addEventListener(`change`,updateFromMedia),mediaCleanup=()=>mediaQuery.removeEventListener(`change`,updateFromMedia)}let stopWatch=watch(()=>themeState.value.colorMode,colorMode=>{let resolvedIsDark=colorMode===`auto`?getSystemColorMode()===`dark`:colorMode===`dark`;updateDocumentClass(resolvedIsDark,themeState.value),colorMode===`auto`&&saveResolvedColorMode(resolvedIsDark?`dark`:`light`)});return()=>{mediaCleanup?.(),stopWatch()}}function watchMutationClassOnHtmlElement(themeState){if(isServer())return()=>{};let{stop}=useMutationObserver(document.documentElement,()=>{if(isServer()||!themeState.value)return;let activeColorMode=document.documentElement.classList.contains(themeState.value.darkClass)?`dark`:`light`;themeState.value.isDark=activeColorMode===`dark`,themeState.value.colorMode!==activeColorMode&&themeState.value.colorMode!==`auto`&&(themeState.value.colorMode=activeColorMode)},{attributes:!0});return stop}var defaultOptions={strategy:`runtime`,overrides:{},darkModeStrategy:`class`,preset:void 0,mode:`both`,darkClass:`dark`,colorMode:`auto`,persistPreset:!0};function resolveConfig(options){return{...defaultOptions,...options,colorMode:getSavedColorMode()??options.colorMode??(options.mode===`dark`?`dark`:`auto`)}}function createThemeState(options,config){let isDark=config.colorMode===`auto`&&config.mode===`both`?getSystemColorMode()===`dark`||getColorMode(config.colorMode)===`dark`:getColorMode(config.colorMode)===`dark`||config.mode===`dark`;!isServer()&&config.colorMode===`auto`&&saveResolvedColorMode(isDark?`dark`:`light`);let themeState=ref({strategy:config.strategy,darkClass:config.darkClass,darkModeStrategy:config.darkModeStrategy,colorMode:config.colorMode,mode:config.mode,preset:void 0,persistPreset:config.persistPreset,isDark:options._isDark||isDark});return updateDocumentClass(themeState.value.isDark,themeState.value),themeState}function finalizeTheme(themeState,preset,config){let finalPreset=Object.keys(config.overrides).length>0&&preset?mergePresets(preset,config.overrides):preset;if(finalPreset&&(themeState.value.preset=finalPreset,config.persistPreset&&saveResolvedPresetName(finalPreset.name)),config.strategy===`buildtime`||!finalPreset)return{themeState,cleanup:()=>{}};injectThemeCSS(finalPreset,config);let cleanupColorScheme=watchColorSchemeFromMedia(themeState);let cleanupMutation=watchMutationClassOnHtmlElement(themeState);return{themeState,cleanup:()=>{cleanupColorScheme(),cleanupMutation()}}}function swapPreset(themeState,preset,config){let final=Object.keys(config.overrides).length>0?mergePresets(preset,config.overrides):preset;themeState.value.preset=final,saveResolvedPresetName(final.name),injectThemeCSS(final,config)}function setupTheme(options){let config=resolveConfig(options);let themeState=createThemeState(options,config);let savedName=config.persistPreset?getSavedPresetName():null;let presetObject=config.preset&&typeof config.preset!=`string`?config.preset:null;if(presetObject||config.strategy===`buildtime`){let setup=finalizeTheme(themeState,presetObject??config.preset,config);return savedName&&config.strategy!==`buildtime`&&(!presetObject||savedName!==presetObject.name)&&getPreset(savedName).then(preset=>swapPreset(themeState,preset,config)).catch(()=>clearSavedPresetName()),setup}return(savedName?getPreset(savedName).catch(()=>(clearSavedPresetName(),getPreset(config.preset))):getPreset(config.preset)).catch(error=>{console.error(`[@maz-ui/themes] Failed to resolve preset`,error)}).then(preset=>finalizeTheme(themeState,preset,config)),{themeState,cleanup:()=>{}}}export{defaultOptions,setupTheme};