@maz-ui/themes 5.0.0-beta.6 → 5.0.0-beta.7
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.
- package/README.md +61 -16
- package/dist/build/index.d.ts +10 -17
- package/dist/build/index.d.ts.map +1 -1
- package/dist/build/index.js +1 -1
- package/dist/composables/useTheme.d.ts +10 -2
- package/dist/composables/useTheme.d.ts.map +1 -1
- package/dist/composables/useTheme.js +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/presets/_defaults.d.ts +4 -3
- package/dist/presets/_defaults.d.ts.map +1 -1
- package/dist/presets/_defaults.js +1 -1
- package/dist/types/index.d.ts +24 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/color-conversions.d.ts +29 -0
- package/dist/utils/color-conversions.d.ts.map +1 -0
- package/dist/utils/color-conversions.js +1 -0
- package/dist/utils/color-parser.d.ts +3 -27
- package/dist/utils/color-parser.d.ts.map +1 -1
- package/dist/utils/color-parser.js +1 -1
- package/dist/utils/color-scheme-meta.d.ts +15 -0
- package/dist/utils/color-scheme-meta.d.ts.map +1 -0
- package/dist/utils/color-scheme-meta.js +1 -0
- package/dist/utils/css-generator.d.ts +6 -6
- package/dist/utils/css-generator.d.ts.map +1 -1
- package/dist/utils/css-generator.js +2 -4
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/inject-theme-css.js +1 -1
- package/dist/utils/setup-theme.d.ts +9 -0
- package/dist/utils/setup-theme.d.ts.map +1 -1
- package/dist/utils/setup-theme.js +1 -1
- package/dist/utils/update-document-class.d.ts +2 -2
- package/dist/utils/update-document-class.d.ts.map +1 -1
- package/dist/utils/update-document-class.js +1 -1
- package/dist/utils/view-transition.d.ts +10 -0
- package/dist/utils/view-transition.d.ts.map +1 -0
- package/dist/utils/view-transition.js +1 -0
- package/package.json +1 -1
- package/dist/utils/color-utils.d.ts +0 -35
- package/dist/utils/color-utils.d.ts.map +0 -1
- package/dist/utils/color-utils.js +0 -1
package/README.md
CHANGED
|
@@ -4,9 +4,11 @@ High-performance and typed theme system for Maz-UI.
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- 🎨 **
|
|
8
|
-
- 🌓 **
|
|
9
|
-
-
|
|
7
|
+
- 🎨 **Native `light-dark()` + `color-scheme`** - Modern CSS theming with zero JS overhead for the light/dark switch
|
|
8
|
+
- 🌓 **Native dark mode** - `color-scheme` makes native form controls, scrollbars, and built-in widgets adapt automatically
|
|
9
|
+
- ✨ **View Transitions** - Optional full-page animated theme switch via `document.startViewTransition()`
|
|
10
|
+
- 🛡️ **Anti-FART** - `<meta name="color-scheme">` injected at boot to prevent any Flash of inAccurate coloR Theme
|
|
11
|
+
- 🚀 **Automatic generation** - Automatically generates color variants (50-950) via OKLCh relative color syntax
|
|
10
12
|
- ⚡ **Flexible strategies** - Runtime injection or build-time generation
|
|
11
13
|
- 🛡️ **Strict TypeScript** - Complete types for optimal DX
|
|
12
14
|
- 🎯 **Zero FOUC** - Pass the preset object so the full CSS renders synchronously on first paint
|
|
@@ -34,6 +36,10 @@ app.use(MazUiTheme, {
|
|
|
34
36
|
preset: mazUi,
|
|
35
37
|
strategy: 'runtime',
|
|
36
38
|
darkModeStrategy: 'class',
|
|
39
|
+
// Class added to <html> when dark mode is forced (default: 'dark')
|
|
40
|
+
darkClass: 'dark',
|
|
41
|
+
// Class added to <html> when light mode is forced (default: 'light')
|
|
42
|
+
lightClass: 'light',
|
|
37
43
|
// remember the active preset name across reloads (default: true)
|
|
38
44
|
persistPreset: true,
|
|
39
45
|
})
|
|
@@ -64,6 +70,41 @@ const { toggleDarkMode, isDark } = useTheme()
|
|
|
64
70
|
</template>
|
|
65
71
|
```
|
|
66
72
|
|
|
73
|
+
## Color modes and class toggling
|
|
74
|
+
|
|
75
|
+
`darkClass` and `lightClass` interact with `darkModeStrategy` to control how `<html>` is decorated.
|
|
76
|
+
|
|
77
|
+
### `darkModeStrategy: 'class'` (default)
|
|
78
|
+
|
|
79
|
+
- `setColorMode('dark')` → adds `darkClass` (default `.dark`) to `<html>` → CSS applies `color-scheme: only dark`.
|
|
80
|
+
- `setColorMode('light')` → adds `lightClass` (default `.light`) to `<html>` → CSS applies `color-scheme: only light`.
|
|
81
|
+
- `setColorMode('auto')` → removes both classes, leaving only `color-scheme: light dark` on `:root` so the browser follows the system `prefers-color-scheme`.
|
|
82
|
+
|
|
83
|
+
Forcing both classes (light/dark) on the root ensures the browser-native widgets (scrollbars, native `<select>`, date pickers, autofill backgrounds, …) match the explicit user choice rather than the OS preference.
|
|
84
|
+
|
|
85
|
+
### `darkModeStrategy: 'media'`
|
|
86
|
+
|
|
87
|
+
- No class is ever added to `<html>`.
|
|
88
|
+
- The browser always follows `prefers-color-scheme` via `color-scheme: light dark`.
|
|
89
|
+
- `setColorMode()` still updates the persisted cookie but does **not** force a visual override — system preference always wins.
|
|
90
|
+
|
|
91
|
+
## Animated theme switch (View Transitions)
|
|
92
|
+
|
|
93
|
+
For a full-page animated swap (rather than per-variable color tweens), pass `{ animate: true }` to `setColorMode` or `toggleDarkMode`:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { useTheme } from '@maz-ui/themes'
|
|
97
|
+
|
|
98
|
+
const { toggleDarkMode, setColorMode } = useTheme()
|
|
99
|
+
|
|
100
|
+
await toggleDarkMode({ animate: true })
|
|
101
|
+
await setColorMode('dark', { animate: true })
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- Wraps the switch in `document.startViewTransition()` so the browser captures a snapshot of the page before/after and crossfades between them.
|
|
105
|
+
- The helper is **lazy-imported** — when `animate` is not used, the View Transitions glue stays out of the boot bundle.
|
|
106
|
+
- **Graceful degradation:** in browsers that don't support the API (e.g., Firefox stable as of mid-2026), the change is applied immediately with no animation — no error thrown.
|
|
107
|
+
|
|
67
108
|
## Available presets
|
|
68
109
|
|
|
69
110
|
### Default
|
|
@@ -106,16 +147,16 @@ const myPreset = definePreset({
|
|
|
106
147
|
overrides: {
|
|
107
148
|
name: 'my-theme',
|
|
108
149
|
scales: {
|
|
109
|
-
|
|
150
|
+
rounded: { md: '0.75rem' },
|
|
110
151
|
},
|
|
111
152
|
colors: {
|
|
112
153
|
light: {
|
|
113
|
-
primary: '
|
|
114
|
-
secondary: '
|
|
154
|
+
primary: 'oklch(0.6 0.2 250)',
|
|
155
|
+
secondary: 'oklch(0.96 0.01 250)',
|
|
115
156
|
},
|
|
116
157
|
dark: {
|
|
117
|
-
primary: '
|
|
118
|
-
secondary: '
|
|
158
|
+
primary: 'oklch(0.7 0.2 250)',
|
|
159
|
+
secondary: 'oklch(0.2 0.01 250)',
|
|
119
160
|
},
|
|
120
161
|
},
|
|
121
162
|
},
|
|
@@ -133,12 +174,16 @@ const {
|
|
|
133
174
|
colorMode, // Ref<'light' | 'dark' | 'auto'>
|
|
134
175
|
isDark, // ComputedRef<boolean>
|
|
135
176
|
strategy, // ComputedRef<'runtime' | 'buildtime'>
|
|
136
|
-
updateTheme, // (preset: ThemePreset | ThemePresetName | ThemePresetOverrides) => void
|
|
137
|
-
setColorMode, // (mode: 'light' | 'dark' | 'auto') => void
|
|
138
|
-
toggleDarkMode, // () => void
|
|
177
|
+
updateTheme, // (preset: ThemePreset | ThemePresetName | ThemePresetOverrides) => Promise<void>
|
|
178
|
+
setColorMode, // (mode: 'light' | 'dark' | 'auto', options?: { animate?: boolean }) => Promise<void>
|
|
179
|
+
toggleDarkMode, // (options?: { animate?: boolean }) => Promise<void>
|
|
139
180
|
} = useTheme()
|
|
140
181
|
```
|
|
141
182
|
|
|
183
|
+
`setColorMode` and `toggleDarkMode` are **async** (`Promise<void>`). The promise resolves once the change — and the optional View Transition — has been applied. Callers can ignore the return value when no transition is needed.
|
|
184
|
+
|
|
185
|
+
The optional `{ animate?: boolean }` parameter enables the View Transitions API (see [Animated theme switch](#animated-theme-switch-view-transitions)).
|
|
186
|
+
|
|
142
187
|
## Strategies
|
|
143
188
|
|
|
144
189
|
### Runtime (recommended)
|
|
@@ -151,12 +196,12 @@ CSS generated at build-time and included in the bundle. Nothing is injected at r
|
|
|
151
196
|
|
|
152
197
|
## Generated CSS variables
|
|
153
198
|
|
|
154
|
-
The
|
|
199
|
+
The generator produces a modern, native CSS contract:
|
|
155
200
|
|
|
156
|
-
- Base
|
|
157
|
-
-
|
|
158
|
-
-
|
|
159
|
-
-
|
|
201
|
+
- **Base colors** are emitted as `light-dark(L, D)` when `mode: 'both'` — a single declaration that the browser resolves to the active scheme. Example: `--maz-primary: light-dark(oklch(0.6 0.2 250), oklch(0.7 0.2 250));`.
|
|
202
|
+
- **Scale palettes** `--maz-X-50` through `--maz-X-950` are derived from the base via OKLCh relative color syntax — `oklch(from var(--maz-X) clamp(0, calc(l ± offset), 1) calc(c * mult) h)`. Lightness offsets follow Tailwind v4's perceptual spread; chroma is preserved (and tapered near extremes) so derived shades stay vibrant rather than washed-out.
|
|
203
|
+
- **Color scheme** is declared on `:root` as `color-scheme: light dark`. With `darkModeStrategy: 'class'`, the generator also emits `.dark { color-scheme: only dark; }` and `.light { color-scheme: only light; }` so an explicit user choice overrides the system preference (and native widgets follow).
|
|
204
|
+
- **Design tokens** — `--maz-rounded-*`, `--maz-shadow-*`, `--maz-font-family`, motion durations, easings, etc. — are bridged into Tailwind v4 via `@theme inline`.
|
|
160
205
|
|
|
161
206
|
## Build-time
|
|
162
207
|
|
package/dist/build/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ThemePreset } from '../types';
|
|
2
|
-
|
|
3
|
-
preset: ThemePreset;
|
|
2
|
+
interface SharedOptions {
|
|
4
3
|
/** Theme mode to generate */
|
|
5
4
|
mode?: 'light' | 'dark' | 'both';
|
|
6
5
|
/** Dark mode selector: 'class' (.dark) | 'media' (@media) */
|
|
@@ -9,28 +8,22 @@ export interface BuildThemeOptions {
|
|
|
9
8
|
prefix?: string;
|
|
10
9
|
/** Dark class name */
|
|
11
10
|
darkClass?: string;
|
|
12
|
-
/**
|
|
13
|
-
|
|
11
|
+
/** Light class name (default 'light') */
|
|
12
|
+
lightClass?: string;
|
|
14
13
|
}
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
scaleColorVariables?: boolean;
|
|
21
|
-
}): Record<string, string>;
|
|
14
|
+
export interface BuildThemeOptions extends SharedOptions {
|
|
15
|
+
preset: ThemePreset;
|
|
16
|
+
}
|
|
17
|
+
export declare function buildThemeCSS({ preset, mode, darkSelector, prefix, darkClass, lightClass, }: BuildThemeOptions): string;
|
|
18
|
+
export declare function generateThemeBundle(presets: ThemePreset[], options?: SharedOptions): Record<string, string>;
|
|
22
19
|
export declare function createThemeStylesheet(css: string, options?: {
|
|
23
20
|
id?: string;
|
|
24
21
|
media?: string;
|
|
25
22
|
}): string;
|
|
26
|
-
export declare function buildSeparateThemeFiles(preset: ThemePreset, options?: {
|
|
27
|
-
prefix?: string;
|
|
28
|
-
darkSelector?: 'class' | 'media';
|
|
29
|
-
darkClass?: string;
|
|
30
|
-
scaleColorVariables?: boolean;
|
|
31
|
-
}): {
|
|
23
|
+
export declare function buildSeparateThemeFiles(preset: ThemePreset, options?: Omit<SharedOptions, 'mode'>): {
|
|
32
24
|
full: string;
|
|
33
25
|
lightOnly: string;
|
|
34
26
|
darkOnly: string;
|
|
35
27
|
};
|
|
28
|
+
export {};
|
|
36
29
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/build/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/build/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAG3C,UAAU,aAAa;IACrB,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;IAChC,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,IAAa,EACb,YAAsB,EACtB,MAAc,EACd,SAAkB,EAClB,UAAoB,GACrB,EAAE,iBAAiB,GAAG,MAAM,CAQ5B;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK/G;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAIxG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAM,GAAG;IACvG,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAMA"}
|
package/dist/build/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{generateCSS}from"../utils/css-generator.js";function buildThemeCSS(
|
|
1
|
+
import{generateCSS}from"../utils/css-generator.js";function buildThemeCSS({preset,mode=`both`,darkSelector=`class`,prefix=`maz`,darkClass=`dark`,lightClass=`light`}){return generateCSS(preset,{mode,darkSelectorStrategy:darkSelector,prefix,darkClass,lightClass})}function generateThemeBundle(presets,options={}){return presets.reduce((bundle,preset)=>(bundle[preset.name]=buildThemeCSS({preset,...options}),bundle),{})}function createThemeStylesheet(css,options={}){let{id=`maz-theme`,media}=options;return`<style id="${id}"${media?` media="${media}"`:``}>\n${css}\n</style>`}function buildSeparateThemeFiles(preset,options={}){return{full:buildThemeCSS({preset,mode:`both`,...options}),lightOnly:buildThemeCSS({preset,mode:`light`,...options}),darkOnly:buildThemeCSS({preset,mode:`dark`,...options})}}export{buildSeparateThemeFiles,buildThemeCSS,createThemeStylesheet,generateThemeBundle};
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { ColorMode, ThemePreset, ThemePresetName, ThemePresetOverrides } from '../types';
|
|
2
2
|
declare function updateTheme(preset: ThemePreset | ThemePresetOverrides | ThemePresetName): Promise<void>;
|
|
3
|
-
declare function setColorMode(colorMode: ColorMode
|
|
4
|
-
|
|
3
|
+
declare function setColorMode(colorMode: ColorMode, options?: {
|
|
4
|
+
animate?: boolean;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
declare function toggleDarkMode(options?: {
|
|
7
|
+
animate?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
5
9
|
export declare function useTheme(): {
|
|
6
10
|
/**
|
|
7
11
|
* Current theme preset
|
|
@@ -34,11 +38,15 @@ export declare function useTheme(): {
|
|
|
34
38
|
* Set the color mode
|
|
35
39
|
* @description Set the color mode - Can be 'auto', 'dark' or 'light'
|
|
36
40
|
* @param colorMode The new color mode
|
|
41
|
+
* @param options.animate When `true`, wrap the change in a View Transition for a smooth full-page animation. Lazy-imports the helper so unused code stays out of the boot bundle.
|
|
42
|
+
* @returns A `Promise<void>` that resolves once the change (and optional transition) is applied. Callers may ignore the return.
|
|
37
43
|
*/
|
|
38
44
|
setColorMode: typeof setColorMode;
|
|
39
45
|
/**
|
|
40
46
|
* Toggle the dark mode
|
|
41
47
|
* @description Toggle the dark mode
|
|
48
|
+
* @param options.animate When `true`, wrap the toggle in a View Transition.
|
|
49
|
+
* @returns A `Promise<void>` that resolves once the change (and optional transition) is applied.
|
|
42
50
|
*/
|
|
43
51
|
toggleDarkMode: typeof toggleDarkMode;
|
|
44
52
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/composables/useTheme.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAc,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"useTheme.d.ts","sourceRoot":"","sources":["../../src/composables/useTheme.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAc,MAAM,UAAU,CAAA;AA+BzG,iBAAe,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,oBAAoB,GAAG,eAAe,iBAgCtF;AAED,iBAAe,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBpG;AAED,iBAAS,cAAc,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAiCD,wBAAgB,QAAQ;IAkBpB;;OAEG;;IAEH;;OAEG;;IAEH;;;OAGG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;;;OAIG;wBACiB,WAAW,GAAG,oBAAoB,GAAG,eAAe,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC;IAGzG;;;;;;OAMG;;IAEH;;;;;OAKG;;IAEH;;;OAGG;;IAEH;;;OAGG;;IAEH;;OAEG;;EAGN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{saveResolvedPresetName,setCookie}from"../utils/cookie-storage.js";import{CSS_ID,generateCSS,injectCSS}from"../utils/css-generator.js";import{getPreset}from"../utils/get-preset.js";import{noTransition}from"../utils/no-transition.js";import{mergePresets}from"../utils/preset-merger.js";import{getSystemColorMode,saveResolvedColorMode}from"../utils/get-color-mode.js";import{isServer}from"@maz-ui/utils/helpers/isServer";import{computed,getCurrentInstance,inject,ref,watch}from"vue";var themeState=ref();var colorMode=computed({get:()=>themeState.value?.colorMode,set:mode=>setColorMode(mode)});var isDark=computed(()=>themeState.value?.isDark||!1);var strategy=computed(()=>themeState.value?.strategy);var mode=computed(()=>themeState.value?.mode);var darkModeStrategy=computed(()=>themeState.value?.darkModeStrategy);var preset=computed(()=>themeState.value?.preset);var presetName=computed(()=>preset.value?.name);async function updateTheme(preset){if(!themeState.value)return;let _preset=typeof preset==`string`?await getPreset(preset):preset;if(!_preset||!themeState.value.preset){console.error(`[@maz-ui/themes] No preset found
|
|
1
|
+
import{saveResolvedPresetName,setCookie}from"../utils/cookie-storage.js";import{CSS_ID,generateCSS,injectCSS}from"../utils/css-generator.js";import{getPreset}from"../utils/get-preset.js";import{noTransition}from"../utils/no-transition.js";import{mergePresets}from"../utils/preset-merger.js";import{getSystemColorMode,saveResolvedColorMode}from"../utils/get-color-mode.js";import{isServer}from"@maz-ui/utils/helpers/isServer";import{computed,getCurrentInstance,inject,ref,watch}from"vue";var themeState=ref();var colorMode=computed({get:()=>themeState.value?.colorMode,set:mode=>void setColorMode(mode)});var isDark=computed(()=>themeState.value?.isDark||!1);var strategy=computed(()=>themeState.value?.strategy);var mode=computed(()=>themeState.value?.mode);var darkModeStrategy=computed(()=>themeState.value?.darkModeStrategy);var preset=computed(()=>themeState.value?.preset);var presetName=computed(()=>preset.value?.name);async function updateTheme(preset){if(!themeState.value)return;let _preset=typeof preset==`string`?await getPreset(preset):preset;if(!_preset||!themeState.value.preset){console.error(`[@maz-ui/themes] No preset found — with buildtime strategy you must pass a full preset`);return}let newPreset=`name`in _preset&&_preset.name!==themeState.value.preset.name?_preset:mergePresets(themeState.value.preset,_preset);themeState.value.preset=newPreset,themeState.value.persistPreset&&saveResolvedPresetName(newPreset.name),themeState.value.strategy===`runtime`&&injectCSS(CSS_ID,generateCSS(newPreset,{mode:themeState.value.mode,darkSelectorStrategy:themeState.value.darkModeStrategy,prefix:`maz`,darkClass:themeState.value.darkClass,lightClass:themeState.value.lightClass}))}async function setColorMode(colorMode,options={}){if(!themeState.value)return;let apply=()=>{themeState.value.colorMode=colorMode,setCookie(`maz-color-mode`,colorMode),colorMode===`auto`&&saveResolvedColorMode(getSystemColorMode()===`dark`?`dark`:`light`)};if(options.animate){let{runViewTransition}=await import(`../utils/view-transition.js`);await runViewTransition(apply)}else apply()}function toggleDarkMode(options={}){return setColorMode(isDark.value?`light`:`dark`,options)}var stopInjectedWatch;function setThemeStateFromGlobalProperties(){themeState.value=void 0,stopInjectedWatch?.(),stopInjectedWatch=void 0;try{let injectedState=inject(`mazThemeState`,void 0);if(themeState.value=injectedState?.value,injectedState&&(stopInjectedWatch=watch(injectedState,newState=>{newState&&(themeState.value=newState)},{deep:!0})),!themeState.value)throw Error(`mazThemeState not found`)}catch{let instance=getCurrentInstance();instance?.appContext?.app?.config?.globalProperties&&(themeState.value=instance.appContext.app.config.globalProperties.$mazThemeState.value)}}function useTheme(){isServer()&&(themeState.value=void 0);try{if(themeState.value||setThemeStateFromGlobalProperties(),!themeState.value)throw Error(`[@maz-ui/themes] no theme state found`)}catch{throw Error(`[@maz-ui/themes] useTheme requires the MazUi/MazUiTheme plugin or a MazUiProvider wrapper`)}return{preset,presetName,colorMode,isDark,strategy,updateTheme(preset){return noTransition(updateTheme,preset)},setColorMode,toggleDarkMode,mode,darkModeStrategy,currentPreset:preset}}export{useTheme};
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export * from './define-preset';
|
|
|
4
4
|
export * from './plugin';
|
|
5
5
|
export * from './presets';
|
|
6
6
|
export * from './types';
|
|
7
|
-
export * from './utils/color-utils';
|
|
8
7
|
export * from './utils/css-generator';
|
|
9
8
|
export * from './utils/inject-theme-css';
|
|
10
9
|
export * from './utils/preset-merger';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{CSS_ID,generateCSS,injectCSS,removeCSS}from"./utils/css-generator.js";import{injectThemeCSS}from"./utils/inject-theme-css.js";import{deepMerge,mergePresets}from"./utils/preset-merger.js";import{defaultOptions,setupTheme}from"./utils/setup-theme.js";import{MazUiTheme}from"./plugin.js";import{definePreset}from"./define-preset.js";import{pristine}from"./presets/pristine.js";import{ocean}from"./presets/ocean.js";import{obsidian}from"./presets/obsidian.js";import{nova}from"./presets/nova.js";import{mazUi}from"./presets/mazUi.js";import{useTheme}from"./composables/useTheme.js";import{buildSeparateThemeFiles,buildThemeCSS,createThemeStylesheet,generateThemeBundle}from"./build/index.js";import"./presets/index.js";export{CSS_ID,MazUiTheme,buildSeparateThemeFiles,buildThemeCSS,createThemeStylesheet,deepMerge,defaultOptions,definePreset,generateCSS,generateThemeBundle,injectCSS,injectThemeCSS,mazUi,mergePresets,nova,obsidian,ocean,pristine,removeCSS,setupTheme,useTheme};
|
|
@@ -28,9 +28,10 @@ export declare const DEFAULT_FONT_MONO = "ui-monospace, SFMono-Regular, Menlo, M
|
|
|
28
28
|
*/
|
|
29
29
|
export declare const DEFAULT_CONTAINER_BG: ThemeComponentBg;
|
|
30
30
|
/**
|
|
31
|
-
* Per-mode default bg for inputs. Light uses the bare `surface`; dark
|
|
32
|
-
*
|
|
33
|
-
* same contrast pattern the
|
|
31
|
+
* Per-mode default bg for inputs. Light uses the bare `surface`; dark
|
|
32
|
+
* derives one tier above the page background via relative OKLCh syntax
|
|
33
|
+
* (mirrors SCALE_OFFSETS step -400: l+0.06) — same contrast pattern the
|
|
34
|
+
* v4 components shipped with. Self-contained, no Tailwind dependency.
|
|
34
35
|
*/
|
|
35
36
|
export declare const DEFAULT_INPUT_BG: ThemeComponentBg;
|
|
36
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_defaults.d.ts","sourceRoot":"","sources":["../../src/presets/_defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE/F;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAa,CAAA;AAE7E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,CAOjF,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,QAAQ,CAMhD,CAAA;AAED,eAAO,MAAM,wBAAwB,QAAQ,CAAA;AAC7C,eAAO,MAAM,uBAAuB,gBAAgB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,iBAAiB,uGAC0E,CAAA;AAExG;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAGlC,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"_defaults.d.ts","sourceRoot":"","sources":["../../src/presets/_defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE/F;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,eAAe,CAAC,OAAO,CAAC,CAAa,CAAA;AAE7E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,CAOjF,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,QAAQ,CAMhD,CAAA;AAED,eAAO,MAAM,wBAAwB,QAAQ,CAAA;AAC7C,eAAO,MAAM,uBAAuB,gBAAgB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,iBAAiB,uGAC0E,CAAA;AAExG;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAGlC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,gBAG9B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,QAAQ,CAAA;AAExD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAQ,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var DEFAULT_SPACE=`0.25rem`;var DEFAULT_ROUNDED_RATIOS={xs:.25,sm:.5,lg:1.5,xl:2,"2xl":3,"3xl":4};var DEFAULT_SHADOW={sm:`0 1px 2px 0 rgb(0 0 0 / 0.05)`,md:`0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)`,lg:`0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)`,xl:`0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)`,elevation:`0 4px 12px -2px rgb(0 0 0 / 0.08), 0 2px 4px -1px rgb(0 0 0 / 0.06)`};var DEFAULT_DISABLED_OPACITY=`0.5`;var DEFAULT_DISABLED_CURSOR=`not-allowed`;var DEFAULT_FONT_MONO=`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`;var DEFAULT_CONTAINER_BG={light:`var(--maz-surface)`,dark:`var(--maz-surface)`};var DEFAULT_INPUT_BG={light:`var(--maz-surface)`,dark:`var(--maz-surface
|
|
1
|
+
var DEFAULT_SPACE=`0.25rem`;var DEFAULT_ROUNDED_RATIOS={xs:.25,sm:.5,lg:1.5,xl:2,"2xl":3,"3xl":4};var DEFAULT_SHADOW={sm:`0 1px 2px 0 rgb(0 0 0 / 0.05)`,md:`0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)`,lg:`0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)`,xl:`0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)`,elevation:`0 4px 12px -2px rgb(0 0 0 / 0.08), 0 2px 4px -1px rgb(0 0 0 / 0.06)`};var DEFAULT_DISABLED_OPACITY=`0.5`;var DEFAULT_DISABLED_CURSOR=`not-allowed`;var DEFAULT_FONT_MONO=`ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`;var DEFAULT_CONTAINER_BG={light:`var(--maz-surface)`,dark:`var(--maz-surface)`};var DEFAULT_INPUT_BG={light:`var(--maz-surface)`,dark:`oklch(from var(--maz-surface) clamp(0, calc(l + 0.06), 1) c h)`};var DEFAULT_INPUT_TOP_LABEL_FONT_WEIGHT=`600`;var DEFAULT_BTN_FONT_WEIGHT=`500`;export{DEFAULT_BTN_FONT_WEIGHT,DEFAULT_CONTAINER_BG,DEFAULT_DISABLED_CURSOR,DEFAULT_DISABLED_OPACITY,DEFAULT_FONT_MONO,DEFAULT_INPUT_BG,DEFAULT_INPUT_TOP_LABEL_FONT_WEIGHT,DEFAULT_ROUNDED_RATIOS,DEFAULT_SHADOW,DEFAULT_SPACE};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -119,7 +119,8 @@ export interface ThemeScales {
|
|
|
119
119
|
}
|
|
120
120
|
/**
|
|
121
121
|
* Optional, per-mode background overrides for "container" surfaces — defaults
|
|
122
|
-
* to `var(--maz-surface)` light,
|
|
122
|
+
* to `var(--maz-surface)` light, and a relative-color-syntax tint derived
|
|
123
|
+
* from `--maz-surface` (one OKLCh lightness tier above) for dark.
|
|
123
124
|
*/
|
|
124
125
|
export interface ThemeComponentBg {
|
|
125
126
|
light?: CSSColor;
|
|
@@ -204,6 +205,15 @@ export interface ThemePreset {
|
|
|
204
205
|
export type ThemePresetName = 'mazUi' | 'ocean' | 'pristine' | 'obsidian' | 'nova' | 'maz-ui';
|
|
205
206
|
export type ColorMode = 'light' | 'dark' | 'auto';
|
|
206
207
|
export type ThemeMode = 'light' | 'dark' | 'both';
|
|
208
|
+
/**
|
|
209
|
+
* Dark mode strategy.
|
|
210
|
+
*
|
|
211
|
+
* - `'class'`: A `.dark` or `.light` class on `<html>` forces `color-scheme: only dark|only light`.
|
|
212
|
+
* `setColorMode()` adds/removes the class. With no class, `color-scheme: light dark` lets the
|
|
213
|
+
* browser follow the system preference.
|
|
214
|
+
* - `'media'`: Only `color-scheme: light dark` on `:root`. The browser follows `prefers-color-scheme`.
|
|
215
|
+
* `setColorMode()` updates the cookie but does NOT toggle any class — system preference always wins.
|
|
216
|
+
*/
|
|
207
217
|
export type DarkModeStrategy = 'class' | 'media';
|
|
208
218
|
export type Strategy = 'runtime' | 'buildtime';
|
|
209
219
|
interface BaseThemeConfig {
|
|
@@ -241,6 +251,14 @@ interface BaseThemeConfig {
|
|
|
241
251
|
* @default 'dark'
|
|
242
252
|
*/
|
|
243
253
|
darkClass?: string;
|
|
254
|
+
/**
|
|
255
|
+
* Light mode class
|
|
256
|
+
* @description Class added to the document root when light mode is explicitly forced.
|
|
257
|
+
* Mirror of `darkClass` — used when `colorMode === 'light'` to force `color-scheme: only light`,
|
|
258
|
+
* which prevents the browser from switching to dark via system preference.
|
|
259
|
+
* @default 'light'
|
|
260
|
+
*/
|
|
261
|
+
lightClass?: string;
|
|
244
262
|
/**
|
|
245
263
|
* Dark mode handling
|
|
246
264
|
* @description
|
|
@@ -335,6 +353,11 @@ export interface ThemeState {
|
|
|
335
353
|
* @description The class added to the document root when dark mode is active
|
|
336
354
|
*/
|
|
337
355
|
darkClass: string;
|
|
356
|
+
/**
|
|
357
|
+
* Light class
|
|
358
|
+
* @description The class added to the document root when light mode is explicitly forced.
|
|
359
|
+
*/
|
|
360
|
+
lightClass: string;
|
|
338
361
|
/**
|
|
339
362
|
* Whether the active preset name is persisted in the `maz-preset` cookie.
|
|
340
363
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,KAAK,MAAM,GAAG,CAAA;AAEnD;;;;GAIG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAA;AAE7B,MAAM,MAAM,QAAQ,GAAG,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,EAAE,CAAA;AAE9F,MAAM,MAAM,QAAQ,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,GAAG,EAAE,CAAA;AAE/C,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,QAAQ,CAAA;IACnB,YAAY,EAAE,QAAQ,CAAA;IACtB,SAAS,EAAE,QAAQ,CAAA;IACnB,oBAAoB,EAAE,QAAQ,CAAA;IAC9B,WAAW,EAAE,QAAQ,CAAA;IACrB,sBAAsB,EAAE,QAAQ,CAAA;IAChC,QAAQ,EAAE,QAAQ,CAAA;IAClB,mBAAmB,EAAE,QAAQ,CAAA;IAC7B,MAAM,EAAE,QAAQ,CAAA;IAChB,iBAAiB,EAAE,QAAQ,CAAA;IAC3B,UAAU,EAAE,QAAQ,CAAA;IACpB,qBAAqB,EAAE,QAAQ,CAAA;IAC/B,aAAa,EAAE,QAAQ,CAAA;IACvB,wBAAwB,EAAE,QAAQ,CAAA;IAClC,SAAS,EAAE,QAAQ,CAAA;IACnB,oBAAoB,EAAE,QAAQ,CAAA;IAC9B,SAAS,EAAE,QAAQ,CAAA;IACnB,oBAAoB,EAAE,QAAQ,CAAA;IAC9B,SAAS,EAAE,QAAQ,CAAA;IACnB,OAAO,EAAE,QAAQ,CAAA;IACjB,SAAS,EAAE,QAAQ,CAAA;IACnB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,QAAQ,CAAA;IAC3B,cAAc,EAAE,QAAQ,CAAA;IACxB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,QAAQ,CAAA;IACxB,eAAe,CAAC,EAAE,QAAQ,CAAA;IAC1B,aAAa,CAAC,EAAE,QAAQ,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAA;CACnB;AAED;;;;;;GAMG;AACH;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAA;AAE9E,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;OAUG;IACH,OAAO,EAAE;QAAE,EAAE,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;IACrF;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,WAAW,EAAE,MAAM,CAAC,CAAA;CAChE;AAED
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
//# sourceMappingURL=color-conversions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-conversions.d.ts","sourceRoot":"","sources":["../../src/utils/color-conversions.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;AAUD,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"}
|
|
@@ -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;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)}`}export{colorToHex,formatAsHSL,formatAsOklch,parseColor,parseColorAsOklch};
|
|
@@ -1,31 +1,7 @@
|
|
|
1
|
-
export
|
|
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;
|
|
1
|
+
export declare function isCompleteCSSColor(value: string): boolean;
|
|
24
2
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
3
|
+
* Normalize an authored color value. Already-complete CSS colors pass through
|
|
4
|
+
* unchanged; the legacy raw `"H S% L%"` form gets wrapped in `hsl(...)`.
|
|
27
5
|
*/
|
|
28
|
-
export declare function colorToHex(value: string): string;
|
|
29
|
-
export declare function isCompleteCSSColor(value: string): boolean;
|
|
30
6
|
export declare function normalizeColor(value: string): string;
|
|
31
7
|
//# sourceMappingURL=color-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-parser.d.ts","sourceRoot":"","sources":["../../src/utils/color-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"color-parser.d.ts","sourceRoot":"","sources":["../../src/utils/color-parser.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOzD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASpD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
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;var LEGACY_PATTERN=/^(-?\d+\.\d+|-?\d+)\s+(\d+\.\d+|\d+)%\s+(\d+\.\d+|\d+)%$/;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){if(isCompleteCSSColor(value))return value;let legacy=value.trim().match(LEGACY_PATTERN);if(legacy)return`hsl(${legacy[1]} ${legacy[2]}% ${legacy[3]}%)`;throw Error(`Invalid color format: ${value}`)}export{isCompleteCSSColor,normalizeColor};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ColorMode, ThemeMode } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve `<meta name="color-scheme" content>` so the browser applies the
|
|
4
|
+
* correct canvas before CSS loads (FART prevention).
|
|
5
|
+
*
|
|
6
|
+
* - mode='light' | 'dark' → that mode
|
|
7
|
+
* - mode='both' → matches colorMode ('auto' falls back to 'light dark')
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveColorSchemeContent(mode: ThemeMode, colorMode: ColorMode): string;
|
|
10
|
+
/**
|
|
11
|
+
* Inject (or update) `<meta name="color-scheme" content="...">` in the head.
|
|
12
|
+
* Safe to call multiple times — updates the existing tag when present.
|
|
13
|
+
*/
|
|
14
|
+
export declare function injectColorSchemeMeta(content: string): void;
|
|
15
|
+
//# sourceMappingURL=color-scheme-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-scheme-meta.d.ts","sourceRoot":"","sources":["../../src/utils/color-scheme-meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGpD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAIvF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAU3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{isServer}from"@maz-ui/utils/helpers/isServer";function resolveColorSchemeContent(mode,colorMode){return mode===`both`?colorMode===`auto`?`light dark`:colorMode:mode}function injectColorSchemeMeta(content){if(isServer())return;let meta=document.head.querySelector(`meta[name="color-scheme"]`);meta||(meta=document.createElement(`meta`),meta.setAttribute(`name`,`color-scheme`),document.head.appendChild(meta)),meta.setAttribute(`content`,content)}export{injectColorSchemeMeta,resolveColorSchemeContent};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ThemeMode, ThemePreset } from '../types';
|
|
2
2
|
export interface CSSOptions {
|
|
3
3
|
/** Theme mode to generate */
|
|
4
4
|
mode: ThemeMode;
|
|
5
|
-
/** Dark mode selector: 'class' (.dark) | 'media' (
|
|
6
|
-
darkSelectorStrategy:
|
|
5
|
+
/** Dark mode selector: 'class' (.dark/.light) | 'media' (system pref only) */
|
|
6
|
+
darkSelectorStrategy: 'class' | 'media';
|
|
7
7
|
/** CSS variables prefix */
|
|
8
8
|
prefix?: string;
|
|
9
9
|
/** Dark class name */
|
|
10
10
|
darkClass: string;
|
|
11
|
-
/**
|
|
12
|
-
|
|
11
|
+
/** Light class name (default 'light') */
|
|
12
|
+
lightClass?: string;
|
|
13
13
|
}
|
|
14
|
-
export declare function generateCSS(preset: ThemePreset, options
|
|
14
|
+
export declare function generateCSS(preset: ThemePreset, options: CSSOptions): string;
|
|
15
15
|
export declare const CSS_ID = "maz-theme-css";
|
|
16
16
|
export declare function injectCSS(id: string | undefined, css: string): void;
|
|
17
17
|
export declare function removeCSS(id?: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"css-generator.d.ts","sourceRoot":"","sources":["../../src/utils/css-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"css-generator.d.ts","sourceRoot":"","sources":["../../src/utils/css-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiD,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAKrG,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,IAAI,EAAE,SAAS,CAAA;IACf,8EAA8E;IAC9E,oBAAoB,EAAE,OAAO,GAAG,OAAO,CAAA;IACvC,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAID,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAuB5E;AAwFD,eAAO,MAAM,MAAM,kBAAkB,CAAA;AAErC,wBAAgB,SAAS,CAAC,EAAE,oBAAS,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAiBxD;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAI3C"}
|
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
import{normalizeColor}from"./color-parser.js";import{
|
|
2
|
-
|
|
3
|
-
`,css}function generateVariablesBlock({selector,mediaQuery,colors,foundation,prefix,preset,isDark=!1,scaleColorVariables=!0,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&&scaleColorVariables&&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];inputBg&&lines.push(` --${prefix}-input-bg: ${normalizeColor(inputBg)};`);let inputTopLabelFontWeight=components.input?.[`top-label-font-weight`];return inputTopLabelFontWeight&&lines.push(` --${prefix}-input-top-label-font-weight: ${inputTopLabelFontWeight};`),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
|
+
import{normalizeColor}from"./color-parser.js";import{DEFAULT_ROUNDED_RATIOS}from"../presets/_defaults.js";import{isServer}from"@maz-ui/utils/helpers/isServer";var ROUNDED_KEYS=[`xs`,`sm`,`md`,`lg`,`xl`,`2xl`,`3xl`];function generateCSS(preset,options){let prefix=options.prefix??`maz`;let lightClass=options.lightClass??`light`;let{mode}=options;let lines=[`@layer theme {`,` :root {`];let colorScheme=mode===`both`?`light dark`:`only ${mode}`;return lines.push(` color-scheme: ${colorScheme};`),appendFoundation(lines,preset.foundation,prefix),appendScales(lines,preset.scales,prefix),appendComponents(lines,preset,prefix,mode),appendColorVariables(lines,preset.colors,mode,prefix),lines.push(` }`),options.darkSelectorStrategy===`class`&&mode===`both`&&(lines.push(` .${options.darkClass} { color-scheme: only dark; }`),lines.push(` .${lightClass} { color-scheme: only light; }`)),lines.push(`}`),lines.join(`
|
|
2
|
+
`)}function appendColorVariables(lines,colors,mode,prefix){for(let[key,lightValue]of Object.entries(colors.light))if(lightValue)if(mode===`both`){let dark=colors.dark[key]??lightValue;lines.push(` --${prefix}-${key}: light-dark(${normalizeColor(lightValue)}, ${normalizeColor(dark)});`)}else lines.push(` --${prefix}-${key}: ${normalizeColor(mode===`dark`?colors.dark[key]??lightValue:lightValue)};`)}function appendFoundation(lines,foundation,prefix){if(foundation)for(let[key,value]of Object.entries(foundation))value&&lines.push(` --${prefix}-${key}: ${value};`)}function appendScales(lines,scales,prefix){if(scales){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]});`)}for(let[key,value]of Object.entries(scales.shadow??{}))value&&lines.push(` --${prefix}-shadow-style-${key}: ${value};`)}}function appendComponents(lines,preset,prefix,mode){let components=preset.components;if(!components)return;components.btn?.[`font-weight`]&&lines.push(` --${prefix}-btn-font-weight: ${components.btn[`font-weight`]};`);let emitBg=(componentKey,cssKey)=>{let bg=components[componentKey]?.bg;if(bg)if(mode===`both`){let fallback=bg.light??bg.dark;if(!fallback)return;let light=normalizeColor(bg.light??fallback);let dark=normalizeColor(bg.dark??fallback);let value=light===dark?light:`light-dark(${light}, ${dark})`;lines.push(` --${prefix}-${cssKey}: ${value};`)}else bg[mode]&&lines.push(` --${prefix}-${cssKey}: ${normalizeColor(bg[mode])};`)};emitBg(`container`,`container-bg`),emitBg(`input`,`input-bg`);let inputTopLabelFw=components.input?.[`top-label-font-weight`];inputTopLabelFw&&lines.push(` --${prefix}-input-top-label-font-weight: ${inputTopLabelFw};`)}var CSS_ID=`maz-theme-css`;function injectCSS(id=CSS_ID,css){if(isServer())return;let styleElements=document.querySelectorAll(`#${id}`);let target=styleElements[styleElements.length-1];for(let i=0;i<styleElements.length-1;i++)styleElements[i].remove();target||(target=document.createElement(`style`),target.id=id,document.head.appendChild(target)),target.textContent=css}function removeCSS(id=CSS_ID){isServer()||document.querySelectorAll(`#${id}`).forEach(el=>el.remove())}export{CSS_ID,generateCSS,injectCSS,removeCSS};
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{colorToHex,formatAsHSL,formatAsOklch,
|
|
1
|
+
import{colorToHex,formatAsHSL,formatAsOklch,parseColor,parseColorAsOklch}from"./color-conversions.js";import{isCompleteCSSColor,normalizeColor}from"./color-parser.js";import{injectColorSchemeMeta,resolveColorSchemeContent}from"./color-scheme-meta.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,clearSavedPresetName,colorToHex,deepMerge,defaultOptions,formatAsHSL,formatAsOklch,generateCSS,getCookie,getPreset,getSavedPresetName,injectCSS,injectColorSchemeMeta,injectThemeCSS,injectThemeState,isCompleteCSSColor,isPresetObject,mergePresets,noTransition,normalizeColor,parseColor,parseColorAsOklch,removeCSS,resolveColorSchemeContent,saveResolvedPresetName,setCookie,setupTheme,updateDocumentClass};
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,lightClass:config.lightClass}))}export{injectThemeCSS};
|
|
@@ -8,6 +8,7 @@ export declare const defaultOptions: {
|
|
|
8
8
|
preset: undefined;
|
|
9
9
|
mode: "both";
|
|
10
10
|
darkClass: string;
|
|
11
|
+
lightClass: string;
|
|
11
12
|
colorMode: "auto";
|
|
12
13
|
persistPreset: true;
|
|
13
14
|
};
|
|
@@ -15,5 +16,13 @@ export interface SetupThemeReturn {
|
|
|
15
16
|
themeState: Ref<ThemeState>;
|
|
16
17
|
cleanup: () => void;
|
|
17
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Sets up the theme state, CSS injection, and watchers without binding to a Vue app.
|
|
21
|
+
* Caller is responsible for `app.provide()` and `app.config.globalProperties`.
|
|
22
|
+
*
|
|
23
|
+
* Always returns synchronously with a populated themeState ref.
|
|
24
|
+
* Without a preset object, the default preset resolves asynchronously and
|
|
25
|
+
* themeState updates reactively (causes FOUC).
|
|
26
|
+
*/
|
|
18
27
|
export declare function setupTheme(options: MazUiThemeOptions): SetupThemeReturn;
|
|
19
28
|
//# 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,EAAgC,UAAU,EAAE,MAAM,UAAU,CAAA;
|
|
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;AAmExE,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;AAkFD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,gBAAgB,CAoCvE"}
|
|
@@ -1 +1 @@
|
|
|
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
|
|
1
|
+
import{injectColorSchemeMeta,resolveColorSchemeContent}from"./color-scheme-meta.js";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 noop(){}function watchColorSchemeFromMedia(themeState){if(isServer())return noop;let mediaCleanup;if(themeState.value?.colorMode===`auto`){let mediaQuery=globalThis.matchMedia(`(prefers-color-scheme: dark)`);let onChange=()=>{if(themeState.value.colorMode!==`auto`)return;let next=mediaQuery.matches?`dark`:`light`;updateDocumentClass(next,themeState.value),themeState.value.isDark=next===`dark`,saveResolvedColorMode(next)};mediaQuery.addEventListener(`change`,onChange),mediaCleanup=()=>mediaQuery.removeEventListener(`change`,onChange)}let stopWatch=watch(()=>themeState.value.colorMode,colorMode=>{let isDark=colorMode===`auto`?getSystemColorMode()===`dark`:colorMode===`dark`;updateDocumentClass(colorMode,themeState.value),injectColorSchemeMeta(resolveColorSchemeContent(themeState.value.mode,colorMode)),colorMode===`auto`&&saveResolvedColorMode(isDark?`dark`:`light`)});return()=>{mediaCleanup?.(),stopWatch()}}function watchMutationClassOnHtmlElement(themeState){return isServer()?noop:useMutationObserver(document.documentElement,()=>{if(isServer()||!themeState.value)return;let active=document.documentElement.classList.contains(themeState.value.darkClass)?`dark`:`light`;themeState.value.isDark=active===`dark`,themeState.value.colorMode!==active&&themeState.value.colorMode!==`auto`&&(themeState.value.colorMode=active)},{attributes:!0}).stop}var defaultOptions={strategy:`runtime`,overrides:{},darkModeStrategy:`class`,preset:void 0,mode:`both`,darkClass:`dark`,lightClass:`light`,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,lightClass:config.lightClass,darkModeStrategy:config.darkModeStrategy,colorMode:config.colorMode,mode:config.mode,preset:void 0,persistPreset:config.persistPreset,isDark:options._isDark||isDark});return updateDocumentClass(themeState.value.colorMode,themeState.value),themeState}function finalizeTheme(themeState,preset,config){let finalPreset=preset&&Object.keys(config.overrides).length>0?mergePresets(preset,config.overrides):preset;if(finalPreset&&(themeState.value.preset=finalPreset,config.persistPreset&&saveResolvedPresetName(finalPreset.name)),config.strategy===`buildtime`||!finalPreset)return{themeState,cleanup:noop};injectThemeCSS(finalPreset,config);let stopMedia=watchColorSchemeFromMedia(themeState);let stopMutation=watchMutationClassOnHtmlElement(themeState);return{themeState,cleanup:()=>{stopMedia(),stopMutation()}}}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);injectColorSchemeMeta(resolveColorSchemeContent(themeState.value.mode,themeState.value.colorMode));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:noop}}export{defaultOptions,setupTheme};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { ThemeState } from '../types';
|
|
2
|
-
export declare function updateDocumentClass(
|
|
1
|
+
import { ColorMode, ThemeState } from '../types';
|
|
2
|
+
export declare function updateDocumentClass(colorMode: ColorMode, state?: ThemeState): void;
|
|
3
3
|
//# sourceMappingURL=update-document-class.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-document-class.d.ts","sourceRoot":"","sources":["../../src/utils/update-document-class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"update-document-class.d.ts","sourceRoot":"","sources":["../../src/utils/update-document-class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAGrD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,CAalF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{noTransition}from"./no-transition.js";function updateDocumentClass(
|
|
1
|
+
import{noTransition}from"./no-transition.js";function updateDocumentClass(colorMode,state){typeof document>`u`||!state||state.darkModeStrategy===`media`||state.mode!==`both`||noTransition(()=>{let html=document.documentElement;html.classList.remove(state.darkClass,state.lightClass),colorMode===`dark`?html.classList.add(state.darkClass):colorMode===`light`&&html.classList.add(state.lightClass)})}export{updateDocumentClass};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrap a state-changing callback in a View Transition.
|
|
3
|
+
* Graceful degradation: if `document.startViewTransition` is not available
|
|
4
|
+
* (Firefox stable as of mid-2026), the callback runs synchronously.
|
|
5
|
+
*
|
|
6
|
+
* This module is intended to be lazy-imported so the bundle stays minimal
|
|
7
|
+
* when `{ animate: true }` is never used.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runViewTransition(callback: () => void): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=view-transition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-transition.d.ts","sourceRoot":"","sources":["../../src/utils/view-transition.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
async function runViewTransition(callback){if(typeof document>`u`){callback();return}let api=document.startViewTransition;if(typeof api!=`function`){callback();return}await api.call(document,callback).finished.catch(()=>{})}export{runViewTransition};
|
package/package.json
CHANGED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { ColorScale } from '../types';
|
|
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): {
|
|
8
|
-
h: number;
|
|
9
|
-
s: number;
|
|
10
|
-
l: number;
|
|
11
|
-
};
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
34
|
-
export declare function adjustColorLightness(baseColor: string, adjustment: number): string;
|
|
35
|
-
//# sourceMappingURL=color-utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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};
|