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

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 +42 -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 +179 -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,155 @@
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
+ /**
92
+ * Rounded scale keys. `md` is the anchor — every preset must declare it.
93
+ * The other keys can be left undefined and the CSS generator will emit
94
+ * a `calc(var(--maz-rounded-md) * <ratio>)` fallback so the whole scale
95
+ * tracks `md` automatically.
96
+ */
97
+ export type RoundedScaleKey = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
98
+ export interface ThemeScales {
99
+ /**
100
+ * Border-radius scale. Maps to Tailwind utilities `rounded-{key}` and is
101
+ * emitted as `--maz-rounded-{key}` (the name is decoupled from Tailwind's
102
+ * `--radius-*` to avoid prefix collisions in `prefix(maz)` setups).
103
+ * `full` is intentionally not included — Tailwind keeps `rounded-full`
104
+ * at 9999px regardless.
105
+ *
106
+ * Only `md` is required; missing keys are computed at CSS-generation time
107
+ * as `calc(var(--maz-rounded-md) * <DEFAULT_ROUNDED_RATIOS[key]>)`. Set
108
+ * any other key to override that key's fallback with a literal value.
109
+ */
110
+ rounded: {
111
+ md: SizeUnit;
112
+ } & Partial<Record<Exclude<RoundedScaleKey, 'md'>, SizeUnit>>;
113
+ /**
114
+ * Box-shadow scale. Maps to Tailwind utilities `shadow-{key}`. `elevation`
115
+ * is the maz-ui specific elevated-surface shadow used by MazCard,
116
+ * MazContainer, MazPopover, etc.
117
+ */
118
+ shadow: Record<'sm' | 'md' | 'lg' | 'xl' | 'elevation', string>;
119
+ }
120
+ /**
121
+ * Optional, per-mode background overrides for "container" surfaces — defaults
122
+ * to `var(--maz-surface)` light, `var(--maz-surface-400)` dark.
123
+ */
124
+ export interface ThemeComponentBg {
125
+ light?: CSSColor;
126
+ dark?: CSSColor;
127
+ }
128
+ /**
129
+ * Per-component theme overrides. Every entry is optional; omit a key and the
130
+ * component falls back to its existing surface tokens (= zero behaviour change).
131
+ */
132
+ export interface ThemeComponents {
133
+ btn?: {
134
+ /**
135
+ * Font-weight applied on `.m-btn`. Defaults to `'500'` (medium).
136
+ */
137
+ 'font-weight'?: string;
138
+ };
139
+ /**
140
+ * Background of "container" surfaces (Card, Container, Dialog, Popover,
141
+ * Dropdown menu panel, Drawer, BottomSheet, …).
142
+ */
143
+ container?: {
144
+ bg?: ThemeComponentBg;
145
+ };
146
+ /**
147
+ * Background of input controls (Input, Textarea, Select, Checkbox, Radio,
148
+ * Switch, InputCode, InputTags, DatePicker trigger, Dropzone surface, …).
149
+ */
150
+ input?: {
151
+ bg?: ThemeComponentBg;
152
+ };
32
153
  }
33
154
  export interface ThemePresetOverrides {
34
155
  /**
@@ -49,6 +170,19 @@ export interface ThemePresetOverrides {
49
170
  * @default undefined
50
171
  */
51
172
  foundation?: Partial<ThemeFoundation>;
173
+ /**
174
+ * Theme scales (rounded, shadow)
175
+ * @default undefined
176
+ */
177
+ scales?: {
178
+ rounded?: Partial<ThemeScales['rounded']>;
179
+ shadow?: Partial<ThemeScales['shadow']>;
180
+ };
181
+ /**
182
+ * Theme component-level overrides
183
+ * @default undefined
184
+ */
185
+ components?: ThemeComponents;
52
186
  }
53
187
  export interface ThemePreset {
54
188
  /**
@@ -60,12 +194,14 @@ export interface ThemePreset {
60
194
  dark: ThemeColors;
61
195
  };
62
196
  foundation: ThemeFoundation;
197
+ scales: ThemeScales;
198
+ components?: ThemeComponents;
63
199
  }
64
- export type ThemePresetName = 'mazUi' | 'ocean' | 'pristine' | 'obsidian' | 'maz-ui';
200
+ export type ThemePresetName = 'mazUi' | 'ocean' | 'pristine' | 'obsidian' | 'nova' | 'maz-ui';
65
201
  export type ColorMode = 'light' | 'dark' | 'auto';
66
202
  export type ThemeMode = 'light' | 'dark' | 'both';
67
203
  export type DarkModeStrategy = 'class' | 'media';
68
- export type Strategy = 'runtime' | 'buildtime' | 'hybrid';
204
+ export type Strategy = 'runtime' | 'buildtime';
69
205
  interface BaseThemeConfig {
70
206
  /**
71
207
  * CSS variables prefix
@@ -89,10 +225,10 @@ interface BaseThemeConfig {
89
225
  /**
90
226
  * CSS generation strategy
91
227
  * @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'
228
+ * - `runtime`: CSS generated and injected at runtime (recommended).
229
+ * - `buildtime`: CSS generated at build time and included in bundle
230
+ * nothing is injected at runtime.
231
+ * @default 'runtime'
96
232
  */
97
233
  strategy?: Strategy;
98
234
  /**
@@ -127,6 +263,15 @@ interface BaseThemeConfig {
127
263
  * @default 'both'
128
264
  */
129
265
  mode?: ThemeMode;
266
+ /**
267
+ * Persist the active preset name in the `maz-preset` cookie so the
268
+ * user's last-used theme is restored across reloads. The value is
269
+ * read at boot only when `preset` is not provided, and is written
270
+ * after every successful preset resolution and `updateTheme()` call.
271
+ * Set to `false` to opt out of any cookie read or write.
272
+ * @default true
273
+ */
274
+ persistPreset?: boolean;
130
275
  }
131
276
  export type ThemeConfig = (BaseThemeConfig & {
132
277
  strategy?: Exclude<Strategy, 'buildtime'>;
@@ -172,7 +317,7 @@ export interface ThemeState {
172
317
  /**
173
318
  * CSS generation strategy
174
319
  * @description The strategy used to generate CSS
175
- * @values 'runtime', 'buildtime', 'hybrid'
320
+ * @values 'runtime', 'buildtime'
176
321
  */
177
322
  strategy: Strategy;
178
323
  /**
@@ -186,6 +331,10 @@ export interface ThemeState {
186
331
  * @description The class added to the document root when dark mode is active
187
332
  */
188
333
  darkClass: string;
334
+ /**
335
+ * Whether the active preset name is persisted in the `maz-preset` cookie.
336
+ */
337
+ persistPreset: boolean;
189
338
  }
190
339
  export {};
191
340
  //# 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,EAAiD,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAMvH,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;AA+HD,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{DEFAULT_ROUNDED_RATIOS}from"../presets/_defaults.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`}var ROUNDED_KEYS=[`xs`,`sm`,`md`,`lg`,`xl`,`2xl`,`3xl`];function generateScaleVariables(scales,prefix){let lines=[];for(let key of ROUNDED_KEYS){let value=scales.rounded?.[key];value?lines.push(` --${prefix}-rounded-${key}: ${value};`):key!==`md`&&lines.push(` --${prefix}-rounded-${key}: calc(var(--${prefix}-rounded-md) * ${DEFAULT_ROUNDED_RATIOS[key]});`)}return 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};