@fayz-ai/ui 0.8.4 → 0.8.5

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 (78) hide show
  1. package/dist/ChartWidgetInner-GDE5PBTR.js +46 -0
  2. package/dist/ChartWidgetInner-GDE5PBTR.js.map +1 -0
  3. package/dist/{chunk-VVQ45ZDZ.js → chunk-KV3MHB6N.js} +85 -179
  4. package/dist/chunk-KV3MHB6N.js.map +1 -0
  5. package/dist/{chunk-M34ACV5E.js → chunk-OUPJDGKE.js} +6 -41
  6. package/dist/chunk-OUPJDGKE.js.map +1 -0
  7. package/dist/chunk-PVIB724L.js +161 -0
  8. package/dist/chunk-PVIB724L.js.map +1 -0
  9. package/dist/{chunk-DYMBFHD7.js → chunk-VDAYIQX4.js} +202 -3
  10. package/dist/chunk-VDAYIQX4.js.map +1 -0
  11. package/dist/{chunk-R4LPSXTT.js → chunk-YLQGUJAQ.js} +18 -6
  12. package/dist/chunk-YLQGUJAQ.js.map +1 -0
  13. package/dist/dashboard/ChartWidget.d.ts.map +1 -1
  14. package/dist/dashboard/ChartWidgetInner.d.ts +11 -0
  15. package/dist/dashboard/ChartWidgetInner.d.ts.map +1 -0
  16. package/dist/dashboard/index.js +2 -1
  17. package/dist/icons.d.ts +8 -0
  18. package/dist/icons.d.ts.map +1 -0
  19. package/dist/icons.js +3 -0
  20. package/dist/icons.js.map +1 -0
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +5 -5
  24. package/dist/layout/Sidebar.d.ts +1 -2
  25. package/dist/layout/Sidebar.d.ts.map +1 -1
  26. package/dist/layout/index.js +2 -1
  27. package/dist/preset.cjs +201 -11
  28. package/dist/preset.cjs.map +1 -1
  29. package/dist/preset.js +201 -1
  30. package/dist/preset.js.map +1 -1
  31. package/dist/primitives/date-picker.d.ts +7 -1
  32. package/dist/primitives/date-picker.d.ts.map +1 -1
  33. package/dist/primitives/index.js +1 -1
  34. package/dist/tailwind.cjs +199 -2
  35. package/dist/tailwind.cjs.map +1 -1
  36. package/dist/tailwind.js +198 -1
  37. package/dist/tailwind.js.map +1 -1
  38. package/dist/theme/index.js +1 -2
  39. package/package.json +24 -22
  40. package/src/dashboard/ChartWidget.tsx +8 -65
  41. package/src/dashboard/ChartWidgetInner.tsx +83 -0
  42. package/src/dashboard/icon.ts +2 -2
  43. package/src/icons.ts +66 -0
  44. package/src/index.ts +4 -0
  45. package/src/layout/Sidebar.tsx +4 -110
  46. package/src/primitives/date-picker.tsx +30 -4
  47. package/dist/chunk-2P7T6QQK.cjs +0 -206
  48. package/dist/chunk-2P7T6QQK.cjs.map +0 -1
  49. package/dist/chunk-7ZQQZD4Q.cjs +0 -1823
  50. package/dist/chunk-7ZQQZD4Q.cjs.map +0 -1
  51. package/dist/chunk-B3BTZDTA.cjs +0 -1701
  52. package/dist/chunk-B3BTZDTA.cjs.map +0 -1
  53. package/dist/chunk-DYMBFHD7.js.map +0 -1
  54. package/dist/chunk-H6OULCHF.cjs +0 -81
  55. package/dist/chunk-H6OULCHF.cjs.map +0 -1
  56. package/dist/chunk-IWBXYV4U.js +0 -203
  57. package/dist/chunk-IWBXYV4U.js.map +0 -1
  58. package/dist/chunk-M34ACV5E.js.map +0 -1
  59. package/dist/chunk-MUGRP5DD.cjs +0 -701
  60. package/dist/chunk-MUGRP5DD.cjs.map +0 -1
  61. package/dist/chunk-NZV47HWO.cjs +0 -380
  62. package/dist/chunk-NZV47HWO.cjs.map +0 -1
  63. package/dist/chunk-OW73RZOU.cjs +0 -313
  64. package/dist/chunk-OW73RZOU.cjs.map +0 -1
  65. package/dist/chunk-R4LPSXTT.js.map +0 -1
  66. package/dist/chunk-R4SQ2GVD.cjs +0 -475
  67. package/dist/chunk-R4SQ2GVD.cjs.map +0 -1
  68. package/dist/chunk-VVQ45ZDZ.js.map +0 -1
  69. package/dist/dashboard/index.cjs +0 -106
  70. package/dist/dashboard/index.cjs.map +0 -1
  71. package/dist/index.cjs +0 -650
  72. package/dist/index.cjs.map +0 -1
  73. package/dist/layout/index.cjs +0 -98
  74. package/dist/layout/index.cjs.map +0 -1
  75. package/dist/primitives/index.cjs +0 -363
  76. package/dist/primitives/index.cjs.map +0 -1
  77. package/dist/theme/index.cjs +0 -41
  78. package/dist/theme/index.cjs.map +0 -1
@@ -1,475 +0,0 @@
1
- 'use strict';
2
-
3
- var React = require('react');
4
- var zustand = require('zustand');
5
-
6
- function _interopNamespace(e) {
7
- if (e && e.__esModule) return e;
8
- var n = Object.create(null);
9
- if (e) {
10
- Object.keys(e).forEach(function (k) {
11
- if (k !== 'default') {
12
- var d = Object.getOwnPropertyDescriptor(e, k);
13
- Object.defineProperty(n, k, d.get ? d : {
14
- enumerable: true,
15
- get: function () { return e[k]; }
16
- });
17
- }
18
- });
19
- }
20
- n.default = e;
21
- return Object.freeze(n);
22
- }
23
-
24
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
25
-
26
- // src/theme/index.ts
27
- var lightTheme = {
28
- name: "light",
29
- colors: {
30
- primary: "0 0% 18.8%",
31
- primaryForeground: "0 0% 100%",
32
- secondary: "0 0% 96.9%",
33
- secondaryForeground: "0 0% 18.8%",
34
- accent: "0 0% 94.5%",
35
- accentForeground: "0 0% 18.8%",
36
- background: "0 0% 94.5%",
37
- foreground: "0 0% 18.8%",
38
- card: "0 0% 100%",
39
- cardForeground: "0 0% 18.8%",
40
- muted: "0 0% 96.9%",
41
- mutedForeground: "0 0% 38%",
42
- border: "0 0% 89%",
43
- input: "0 0% 54.1%",
44
- ring: "214 100% 41.4%",
45
- popover: "0 0% 100%",
46
- popoverForeground: "0 0% 18.8%",
47
- destructive: "354 92% 41%",
48
- destructiveForeground: "0 0% 100%",
49
- success: "167 95% 25.1%",
50
- successForeground: "0 0% 100%",
51
- warning: "43 100% 50%",
52
- warningForeground: "0 0% 18.8%",
53
- sidebar: "0 0% 92.2%",
54
- sidebarForeground: "0 0% 18.8%",
55
- sidebarBorder: "0 0% 86.3%",
56
- sidebarAccent: "0 0% 100%",
57
- sidebarAccentForeground: "0 0% 18.8%",
58
- sidebarMuted: "0 0% 38%",
59
- content: "0 0% 94.5%"
60
- },
61
- perception: {
62
- buttonRadius: "0.5rem",
63
- cardRadius: "0.5rem",
64
- inputRadius: "0.5rem",
65
- modalRadius: "1rem",
66
- fontFamily: "Inter, ui-sans-serif, system-ui, -apple-system, sans-serif",
67
- fontFamilyMono: "JetBrains Mono, ui-monospace, SFMono-Regular, monospace",
68
- shadowSm: "0 1px 0 rgba(0, 0, 0, 0.05), 0 1px 3px 0 rgba(26, 26, 26, 0.06), 0 1px 2px -1px rgba(26, 26, 26, 0.06)",
69
- shadowMd: "0 1px 1px -1px rgba(26, 26, 26, 0.07), 0 4px 8px -2px rgba(26, 26, 26, 0.10)",
70
- shadowLg: "0 4px 12px -2px rgba(26, 26, 26, 0.15), 0 1px 3px rgba(26, 26, 26, 0.08)",
71
- shadowButton: "inset 0 -1px 0 rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.50), 0 1px 0 rgba(0,0,0,0.05)",
72
- shadowButtonPrimary: "inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.20), 0 1px 1.5px rgba(0,0,0,0.20)",
73
- shadowButtonInset: "inset 0 2px 1px -1px rgba(0,0,0,0.20), inset 0 0 0 1px rgba(0,0,0,0.05)",
74
- surfaceBackdropFilter: "none",
75
- buttonBackground: "hsl(var(--card))",
76
- buttonBackgroundHover: "hsl(var(--muted))",
77
- buttonBorder: "hsl(var(--border))",
78
- buttonPrimaryBackground: "hsl(var(--primary))",
79
- buttonPrimaryBackgroundHover: "hsl(var(--primary) / 0.9)",
80
- buttonPrimaryBorder: "hsl(var(--primary))",
81
- buttonBackdropFilter: "none"
82
- }
83
- };
84
- var darkTheme = {
85
- name: "dark",
86
- colors: {
87
- primary: "0 0% 100%",
88
- primaryForeground: "0 0% 10.2%",
89
- secondary: "0 0% 18.8%",
90
- secondaryForeground: "0 0% 89%",
91
- accent: "0 0% 22.7%",
92
- accentForeground: "0 0% 100%",
93
- background: "0 0% 10.2%",
94
- foreground: "0 0% 89%",
95
- card: "0 0% 14.9%",
96
- cardForeground: "0 0% 89%",
97
- muted: "0 0% 18.8%",
98
- mutedForeground: "0 0% 64.7%",
99
- border: "0 0% 22.7%",
100
- input: "0 0% 32.2%",
101
- ring: "217 100% 68.4%",
102
- popover: "0 0% 18.8%",
103
- popoverForeground: "0 0% 89%",
104
- destructive: "7 100% 44.9%",
105
- destructiveForeground: "0 0% 100%",
106
- success: "156 71% 42.5%",
107
- successForeground: "0 0% 0%",
108
- warning: "41 100% 65.1%",
109
- warningForeground: "0 0% 10.2%",
110
- sidebar: "0 0% 10.2%",
111
- sidebarForeground: "0 0% 89%",
112
- sidebarBorder: "0 0% 16.5%",
113
- sidebarAccent: "0 0% 18.8%",
114
- sidebarAccentForeground: "0 0% 100%",
115
- sidebarMuted: "0 0% 64.7%",
116
- content: "0 0% 10.2%"
117
- },
118
- perception: {
119
- buttonRadius: "0.5rem",
120
- cardRadius: "0.5rem",
121
- inputRadius: "0.5rem",
122
- modalRadius: "1rem",
123
- fontFamily: "Inter, ui-sans-serif, system-ui, -apple-system, sans-serif",
124
- fontFamilyMono: "JetBrains Mono, ui-monospace, SFMono-Regular, monospace",
125
- shadowSm: "0 1px 0 rgba(0, 0, 0, 0.4), 0 1px 3px 0 rgba(0, 0, 0, 0.35), 0 1px 2px -1px rgba(0, 0, 0, 0.35)",
126
- shadowMd: "0 1px 1px -1px rgba(0, 0, 0, 0.5), 0 4px 8px -2px rgba(0, 0, 0, 0.6)",
127
- shadowLg: "0 4px 12px -2px rgba(0, 0, 0, 0.6), 0 1px 3px rgba(0, 0, 0, 0.4)",
128
- shadowButton: "inset 0 -1px 0 rgba(0,0,0,0.40), inset 0 1px 0 rgba(255,255,255,0.08), 0 1px 0 rgba(0,0,0,0.30)",
129
- shadowButtonPrimary: "inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.40), 0 1px 1.5px rgba(0,0,0,0.40)",
130
- shadowButtonInset: "inset 0 2px 1px -1px rgba(0,0,0,0.50), inset 0 0 0 1px rgba(0,0,0,0.20)",
131
- surfaceBackdropFilter: "none",
132
- buttonBackground: "hsl(var(--card))",
133
- buttonBackgroundHover: "hsl(var(--muted))",
134
- buttonBorder: "hsl(var(--border))",
135
- buttonPrimaryBackground: "hsl(var(--primary))",
136
- buttonPrimaryBackgroundHover: "hsl(var(--primary) / 0.9)",
137
- buttonPrimaryBorder: "hsl(var(--primary))",
138
- buttonBackdropFilter: "none"
139
- }
140
- };
141
- var colorVarMap = {
142
- primary: "--primary",
143
- primaryForeground: "--primary-foreground",
144
- secondary: "--secondary",
145
- secondaryForeground: "--secondary-foreground",
146
- accent: "--accent",
147
- accentForeground: "--accent-foreground",
148
- background: "--background",
149
- foreground: "--foreground",
150
- card: "--card",
151
- cardForeground: "--card-foreground",
152
- muted: "--muted",
153
- mutedForeground: "--muted-foreground",
154
- border: "--border",
155
- input: "--input",
156
- ring: "--ring",
157
- popover: "--popover",
158
- popoverForeground: "--popover-foreground",
159
- destructive: "--destructive",
160
- destructiveForeground: "--destructive-foreground",
161
- success: "--success",
162
- successForeground: "--success-foreground",
163
- warning: "--warning",
164
- warningForeground: "--warning-foreground",
165
- sidebar: "--sidebar",
166
- sidebarForeground: "--sidebar-foreground",
167
- sidebarBorder: "--sidebar-border",
168
- sidebarAccent: "--sidebar-accent",
169
- sidebarAccentForeground: "--sidebar-accent-foreground",
170
- sidebarMuted: "--sidebar-muted",
171
- content: "--content"
172
- };
173
- var perceptionVarMap = {
174
- buttonRadius: "--button-radius",
175
- cardRadius: "--card-radius",
176
- inputRadius: "--input-radius",
177
- modalRadius: "--modal-radius",
178
- fontFamily: "--font-family",
179
- fontFamilyMono: "--font-family-mono",
180
- shadowSm: "--shadow-sm",
181
- shadowMd: "--shadow-md",
182
- shadowLg: "--shadow-lg",
183
- shadowButton: "--shadow-button",
184
- shadowButtonPrimary: "--shadow-button-primary",
185
- shadowButtonInset: "--shadow-button-inset",
186
- surfaceBackdropFilter: "--surface-backdrop-filter",
187
- modalBackground: "--modal-bg",
188
- modalBorder: "--modal-border",
189
- modalOverlayBackground: "--modal-overlay-bg",
190
- modalOverlayBackdropFilter: "--modal-overlay-backdrop-filter",
191
- modalShadow: "--modal-shadow",
192
- glassEdgeGradient: "--glass-edge-gradient",
193
- glassPrimaryEdgeGradient: "--glass-primary-edge-gradient",
194
- glassInnerHighlight: "--glass-inner-highlight",
195
- fieldBackground: "--field-bg",
196
- fieldBorder: "--field-border",
197
- fieldShadow: "--field-shadow",
198
- buttonBackground: "--button-bg",
199
- buttonBackgroundHover: "--button-hover-bg",
200
- buttonBorder: "--button-border",
201
- buttonPrimaryBackground: "--button-primary-bg",
202
- buttonPrimaryBackgroundHover: "--button-primary-hover-bg",
203
- buttonPrimaryBorder: "--button-primary-border",
204
- buttonBackdropFilter: "--button-backdrop-filter"
205
- };
206
- function applyTheme(theme, element) {
207
- const target = document.documentElement;
208
- for (const [key, cssVar] of Object.entries(colorVarMap)) {
209
- const value = theme.colors[key];
210
- if (value) {
211
- target.style.setProperty(cssVar, value);
212
- }
213
- }
214
- for (const [key, cssVar] of Object.entries(perceptionVarMap)) {
215
- const value = theme.perception[key];
216
- if (value) {
217
- target.style.setProperty(cssVar, value);
218
- }
219
- }
220
- }
221
- var STORAGE_KEY = "fayz-ui:theme-mode";
222
- function getSystemPreference() {
223
- if (typeof window === "undefined") return "light";
224
- return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
225
- }
226
- function getSavedMode() {
227
- if (typeof window === "undefined") return "light";
228
- const saved = localStorage.getItem(STORAGE_KEY);
229
- if (saved === "light" || saved === "dark" || saved === "system") return saved;
230
- return "light";
231
- }
232
- function resolveMode(mode) {
233
- return mode === "system" ? getSystemPreference() : mode;
234
- }
235
- function buildTheme(base, overrides) {
236
- if (!overrides) return base;
237
- const isDark = base.name === "dark";
238
- const colors = { ...base.colors };
239
- if (overrides.brand) {
240
- colors.primary = overrides.brand;
241
- colors.primaryForeground = "0 0% 100%";
242
- colors.ring = overrides.brand;
243
- const parts = overrides.brand.split(" ");
244
- if (parts.length >= 3) {
245
- const hue = (parseFloat(parts[0]) - 50 + 360) % 360;
246
- colors.accent = `${hue} ${parts[1]} ${parts[2]}`;
247
- colors.accentForeground = "0 0% 100%";
248
- }
249
- }
250
- const colorOverrides = isDark && overrides.darkColors ? overrides.darkColors : overrides.colors;
251
- if (colorOverrides) {
252
- for (const [key, value] of Object.entries(colorOverrides)) {
253
- if (value !== void 0) {
254
- colors[key] = value;
255
- }
256
- }
257
- }
258
- return {
259
- name: overrides.name ?? base.name,
260
- colors,
261
- perception: {
262
- ...base.perception,
263
- ...overrides.perception ?? {}
264
- }
265
- };
266
- }
267
- var STORE_KEY = "__fayz_ui_theme_store__";
268
- function createThemeStore() {
269
- if (typeof window !== "undefined" && window[STORE_KEY]) {
270
- return window[STORE_KEY];
271
- }
272
- const store = zustand.create((set, get) => ({
273
- mode: getSavedMode(),
274
- resolvedMode: "light",
275
- overrides: null,
276
- setMode: (mode) => {
277
- const resolved = resolveMode(mode);
278
- set({ mode, resolvedMode: resolved });
279
- if (typeof window !== "undefined") {
280
- localStorage.setItem(STORAGE_KEY, mode);
281
- }
282
- const { overrides } = get();
283
- const baseTheme = resolved === "dark" ? darkTheme : lightTheme;
284
- const theme = buildTheme(baseTheme, overrides);
285
- if (typeof document !== "undefined") {
286
- document.documentElement.classList.add("theme-transitioning");
287
- applyTheme(theme);
288
- document.documentElement.classList.toggle("dark", resolved === "dark");
289
- setTimeout(() => {
290
- document.documentElement.classList.remove("theme-transitioning");
291
- }, 450);
292
- } else {
293
- applyTheme(theme);
294
- }
295
- },
296
- setOverrides: (overrides) => {
297
- set({ overrides });
298
- const { resolvedMode } = get();
299
- const baseTheme = resolvedMode === "dark" ? darkTheme : lightTheme;
300
- const theme = buildTheme(baseTheme, overrides);
301
- applyTheme(theme);
302
- },
303
- // Legacy compat
304
- setCustomTheme: (_theme) => {
305
- },
306
- initialize: () => {
307
- const { mode, setMode } = get();
308
- setMode(mode);
309
- if (typeof window !== "undefined") {
310
- window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => {
311
- const current = get();
312
- if (current.mode === "system") {
313
- current.setMode("system");
314
- }
315
- });
316
- }
317
- }
318
- }));
319
- if (typeof window !== "undefined") {
320
- window[STORE_KEY] = store;
321
- }
322
- return store;
323
- }
324
- var useThemeStore = createThemeStore();
325
-
326
- // src/theme/presets.ts
327
- function mergeThemeOptions(base, overrides = {}) {
328
- return {
329
- ...base,
330
- ...overrides,
331
- colors: {
332
- ...base.colors ?? {},
333
- ...overrides.colors ?? {}
334
- },
335
- darkColors: {
336
- ...base.darkColors ?? {},
337
- ...overrides.darkColors ?? {}
338
- },
339
- perception: {
340
- ...base.perception ?? {},
341
- ...overrides.perception ?? {}
342
- }
343
- };
344
- }
345
- var fayzThemePresets = {
346
- classic_admin: {
347
- name: "classic_admin",
348
- colors: lightTheme.colors,
349
- darkColors: darkTheme.colors,
350
- perception: lightTheme.perception
351
- },
352
- liquid_glass: {
353
- name: "liquid_glass",
354
- colors: {
355
- background: "260 38% 96%",
356
- content: "260 36% 96.5%",
357
- card: "0 0% 100% / 0.84",
358
- popover: "0 0% 100% / 0.96",
359
- secondary: "260 34% 93% / 0.82",
360
- muted: "260 30% 91% / 0.78",
361
- border: "260 26% 76% / 0.58",
362
- input: "260 24% 68% / 0.62"
363
- },
364
- darkColors: {
365
- background: "260 28% 9%",
366
- content: "260 28% 10%",
367
- card: "260 24% 16% / 0.72",
368
- popover: "260 24% 14% / 0.9",
369
- secondary: "260 20% 22% / 0.72",
370
- muted: "260 18% 20% / 0.68",
371
- border: "260 20% 35% / 0.58",
372
- input: "260 20% 38% / 0.68"
373
- },
374
- perception: {
375
- buttonRadius: "9999px",
376
- cardRadius: "1.25rem",
377
- inputRadius: "1rem",
378
- modalRadius: "1.5rem",
379
- surfaceBackdropFilter: "blur(16px) saturate(1.24) brightness(1.03)",
380
- modalBackground: "linear-gradient(145deg, rgb(255 255 255 / 0.82), rgb(249 247 255 / 0.72) 48%, rgb(255 255 255 / 0.64))",
381
- modalBorder: "rgb(255 255 255 / 0.74)",
382
- modalOverlayBackground: "rgb(26 20 38 / 0.22)",
383
- modalOverlayBackdropFilter: "blur(5px) saturate(1.08)",
384
- modalShadow: "0 32px 82px -46px rgb(31 18 61 / 0.38), 0 1px 4px rgb(31 18 61 / 0.08), inset 0 1px 0 rgb(255 255 255 / 0.78), inset 0 0 0 1px rgb(255 255 255 / 0.28)",
385
- glassEdgeGradient: "linear-gradient(145deg, rgb(255 255 255 / 0.96) 0%, rgb(255 255 255 / 0.44) 24%, rgb(171 151 211 / 0.34) 48%, rgb(45 35 76 / 0.22) 62%, rgb(255 255 255 / 0.7) 100%)",
386
- glassPrimaryEdgeGradient: "linear-gradient(145deg, rgb(255 255 255 / 0.74) 0%, rgb(255 255 255 / 0.2) 28%, rgb(45 35 76 / 0.34) 58%, rgb(255 255 255 / 0.5) 100%)",
387
- glassInnerHighlight: "inset 0 1px 0 rgb(255 255 255 / 0.72), inset 1px 0 0 rgb(255 255 255 / 0.28), inset 0 -1px 0 rgb(45 35 76 / 0.1)",
388
- fieldBackground: "linear-gradient(135deg, rgb(255 255 255 / 0.9) 0%, rgb(250 248 255 / 0.82) 46%, rgb(242 238 252 / 0.74) 100%)",
389
- fieldBorder: "rgb(174 158 205 / 0.58)",
390
- fieldShadow: "inset 0 1px 0 rgb(255 255 255 / 0.8), inset 0 -1px 0 rgb(45 35 76 / 0.08), 0 12px 28px -24px rgb(31 18 61 / 0.28)",
391
- shadowSm: "0 10px 28px -20px rgb(31 18 61 / 0.34), inset 0 1px 0 rgb(255 255 255 / 0.54)",
392
- shadowMd: "0 22px 54px -32px rgb(31 18 61 / 0.42), inset 0 1px 0 rgb(255 255 255 / 0.58)",
393
- shadowLg: "0 34px 88px -42px rgb(31 18 61 / 0.48), inset 0 1px 0 rgb(255 255 255 / 0.62)",
394
- shadowButton: "inset 0 1px 0 rgb(255 255 255 / 0.82), inset 0 -1px 0 rgb(31 18 61 / 0.08), 0 14px 30px -18px rgb(31 18 61 / 0.56)",
395
- shadowButtonPrimary: "inset 0 1px 0 rgb(255 255 255 / 0.5), inset 0 -1px 0 rgb(31 18 61 / 0.26), 0 18px 36px -18px rgb(31 18 61 / 0.86)",
396
- shadowButtonInset: "inset 0 2px 4px rgb(31 18 61 / 0.22), inset 0 0 0 1px rgb(255 255 255 / 0.24)",
397
- buttonBackground: "linear-gradient(135deg, rgb(255 255 255 / 0.92) 0%, rgb(247 242 255 / 0.74) 48%, rgb(229 220 248 / 0.64) 100%)",
398
- buttonBackgroundHover: "linear-gradient(135deg, rgb(255 255 255 / 0.98) 0%, rgb(249 244 255 / 0.86) 46%, rgb(231 222 250 / 0.78) 100%)",
399
- buttonBorder: "rgb(194 178 221 / 0.86)",
400
- buttonPrimaryBackground: "linear-gradient(135deg, rgb(255 255 255 / 0.28) 0%, hsl(var(--primary) / 0.94) 36%, hsl(278 42% 58% / 0.88) 100%)",
401
- buttonPrimaryBackgroundHover: "linear-gradient(135deg, rgb(255 255 255 / 0.36) 0%, hsl(var(--primary) / 1) 34%, hsl(278 52% 62% / 0.94) 100%)",
402
- buttonPrimaryBorder: "rgb(255 255 255 / 0.38)",
403
- buttonBackdropFilter: "blur(18px) saturate(1.45)"
404
- }
405
- }
406
- };
407
- function createFayzTheme(preset = "classic_admin", overrides = {}) {
408
- return mergeThemeOptions(fayzThemePresets[preset] ?? fayzThemePresets.classic_admin, overrides);
409
- }
410
-
411
- // src/theme/index.ts
412
- function ThemeProvider({ children, overrides, defaultMode }) {
413
- const initialize = useThemeStore((s) => s.initialize);
414
- const setMode = useThemeStore((s) => s.setMode);
415
- const setOverrides = useThemeStore((s) => s.setOverrides);
416
- React__namespace.useEffect(() => {
417
- if (defaultMode) {
418
- setMode(defaultMode);
419
- }
420
- if (overrides !== void 0) {
421
- setOverrides(overrides);
422
- }
423
- initialize();
424
- }, []);
425
- return children;
426
- }
427
- function useTheme() {
428
- const mode = useThemeStore((s) => s.mode);
429
- const resolvedMode = useThemeStore((s) => s.resolvedMode);
430
- const overrides = useThemeStore((s) => s.overrides);
431
- const setMode = useThemeStore((s) => s.setMode);
432
- const setOverrides = useThemeStore((s) => s.setOverrides);
433
- return {
434
- mode,
435
- resolvedMode,
436
- isDark: resolvedMode === "dark",
437
- overrides,
438
- setMode,
439
- setOverrides
440
- };
441
- }
442
- function createTheme(overrides) {
443
- const colors = { ...lightTheme.colors, ...overrides.colors };
444
- if (overrides.brand) {
445
- const given = overrides.colors ?? {};
446
- if (given.primary == null) colors.primary = overrides.brand;
447
- if (given.primaryForeground == null) colors.primaryForeground = "0 0% 100%";
448
- if (given.ring == null) colors.ring = overrides.brand;
449
- const parts = overrides.brand.split(" ");
450
- if (parts.length >= 3) {
451
- const hue = (parseFloat(parts[0]) - 50 + 360) % 360;
452
- if (given.accent == null) colors.accent = `${hue} ${parts[1]} ${parts[2]}`;
453
- if (given.accentForeground == null) colors.accentForeground = "0 0% 100%";
454
- }
455
- }
456
- return {
457
- name: overrides.name ?? lightTheme.name,
458
- colors,
459
- perception: {
460
- ...lightTheme.perception,
461
- ...overrides.perception
462
- }
463
- };
464
- }
465
-
466
- exports.ThemeProvider = ThemeProvider;
467
- exports.createFayzTheme = createFayzTheme;
468
- exports.createTheme = createTheme;
469
- exports.darkTheme = darkTheme;
470
- exports.fayzThemePresets = fayzThemePresets;
471
- exports.lightTheme = lightTheme;
472
- exports.useTheme = useTheme;
473
- exports.useThemeStore = useThemeStore;
474
- //# sourceMappingURL=chunk-R4SQ2GVD.cjs.map
475
- //# sourceMappingURL=chunk-R4SQ2GVD.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/stores/theme.store.ts","../src/theme/presets.ts","../src/theme/index.ts"],"names":["create","React"],"mappings":"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","file":"chunk-R4SQ2GVD.cjs","sourcesContent":["import { create, type StoreApi, type UseBoundStore } from 'zustand'\n\n// ---------------------------------------------------------------------------\n// Theme token types\n// ---------------------------------------------------------------------------\n\nexport interface SemanticColors {\n primary: string\n primaryForeground: string\n secondary: string\n secondaryForeground: string\n accent: string\n accentForeground: string\n background: string\n foreground: string\n card: string\n cardForeground: string\n muted: string\n mutedForeground: string\n border: string\n input: string\n ring: string\n popover: string\n popoverForeground: string\n destructive: string\n destructiveForeground: string\n success: string\n successForeground: string\n warning: string\n warningForeground: string\n // Layout surface colors\n sidebar: string\n sidebarForeground: string\n sidebarBorder: string\n sidebarAccent: string\n sidebarAccentForeground: string\n sidebarMuted: string\n content: string\n}\n\nexport interface UIPerceptionTokens {\n buttonRadius: string\n cardRadius: string\n inputRadius: string\n modalRadius: string\n fontFamily: string\n fontFamilyMono: string\n shadowSm: string\n shadowMd: string\n shadowLg: string\n shadowButton?: string\n shadowButtonPrimary?: string\n shadowButtonInset?: string\n surfaceBackdropFilter?: string\n modalBackground?: string\n modalBorder?: string\n modalOverlayBackground?: string\n modalOverlayBackdropFilter?: string\n modalShadow?: string\n glassEdgeGradient?: string\n glassPrimaryEdgeGradient?: string\n glassInnerHighlight?: string\n fieldBackground?: string\n fieldBorder?: string\n fieldShadow?: string\n buttonBackground?: string\n buttonBackgroundHover?: string\n buttonBorder?: string\n buttonPrimaryBackground?: string\n buttonPrimaryBackgroundHover?: string\n buttonPrimaryBorder?: string\n buttonBackdropFilter?: string\n}\n\nexport interface ThemeTokens {\n name: string\n colors: SemanticColors\n perception: UIPerceptionTokens\n}\n\nexport interface CreateThemeOptions {\n name?: string\n colors?: Partial<SemanticColors>\n /** Dark mode color overrides — applied instead of `colors` when in dark mode */\n darkColors?: Partial<SemanticColors>\n perception?: Partial<UIPerceptionTokens>\n /** Shorthand: single HSL value that auto-derives primary, ring, and accent */\n brand?: string\n}\n\n// ---------------------------------------------------------------------------\n// Built-in themes\n// ---------------------------------------------------------------------------\n\nexport const lightTheme: ThemeTokens = {\n name: 'light',\n colors: {\n primary: '0 0% 18.8%',\n primaryForeground: '0 0% 100%',\n secondary: '0 0% 96.9%',\n secondaryForeground: '0 0% 18.8%',\n accent: '0 0% 94.5%',\n accentForeground: '0 0% 18.8%',\n background: '0 0% 94.5%',\n foreground: '0 0% 18.8%',\n card: '0 0% 100%',\n cardForeground: '0 0% 18.8%',\n muted: '0 0% 96.9%',\n mutedForeground: '0 0% 38%',\n border: '0 0% 89%',\n input: '0 0% 54.1%',\n ring: '214 100% 41.4%',\n popover: '0 0% 100%',\n popoverForeground: '0 0% 18.8%',\n destructive: '354 92% 41%',\n destructiveForeground: '0 0% 100%',\n success: '167 95% 25.1%',\n successForeground: '0 0% 100%',\n warning: '43 100% 50%',\n warningForeground: '0 0% 18.8%',\n sidebar: '0 0% 92.2%',\n sidebarForeground: '0 0% 18.8%',\n sidebarBorder: '0 0% 86.3%',\n sidebarAccent: '0 0% 100%',\n sidebarAccentForeground: '0 0% 18.8%',\n sidebarMuted: '0 0% 38%',\n content: '0 0% 94.5%',\n },\n perception: {\n buttonRadius: '0.5rem',\n cardRadius: '0.5rem',\n inputRadius: '0.5rem',\n modalRadius: '1rem',\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, sans-serif',\n fontFamilyMono: 'JetBrains Mono, ui-monospace, SFMono-Regular, monospace',\n shadowSm: '0 1px 0 rgba(0, 0, 0, 0.05), 0 1px 3px 0 rgba(26, 26, 26, 0.06), 0 1px 2px -1px rgba(26, 26, 26, 0.06)',\n shadowMd: '0 1px 1px -1px rgba(26, 26, 26, 0.07), 0 4px 8px -2px rgba(26, 26, 26, 0.10)',\n shadowLg: '0 4px 12px -2px rgba(26, 26, 26, 0.15), 0 1px 3px rgba(26, 26, 26, 0.08)',\n shadowButton:\n 'inset 0 -1px 0 rgba(0,0,0,0.10), inset 0 1px 0 rgba(255,255,255,0.50), 0 1px 0 rgba(0,0,0,0.05)',\n shadowButtonPrimary:\n 'inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.20), 0 1px 1.5px rgba(0,0,0,0.20)',\n shadowButtonInset:\n 'inset 0 2px 1px -1px rgba(0,0,0,0.20), inset 0 0 0 1px rgba(0,0,0,0.05)',\n surfaceBackdropFilter: 'none',\n buttonBackground: 'hsl(var(--card))',\n buttonBackgroundHover: 'hsl(var(--muted))',\n buttonBorder: 'hsl(var(--border))',\n buttonPrimaryBackground: 'hsl(var(--primary))',\n buttonPrimaryBackgroundHover: 'hsl(var(--primary) / 0.9)',\n buttonPrimaryBorder: 'hsl(var(--primary))',\n buttonBackdropFilter: 'none',\n },\n}\n\nexport const darkTheme: ThemeTokens = {\n name: 'dark',\n colors: {\n primary: '0 0% 100%',\n primaryForeground: '0 0% 10.2%',\n secondary: '0 0% 18.8%',\n secondaryForeground: '0 0% 89%',\n accent: '0 0% 22.7%',\n accentForeground: '0 0% 100%',\n background: '0 0% 10.2%',\n foreground: '0 0% 89%',\n card: '0 0% 14.9%',\n cardForeground: '0 0% 89%',\n muted: '0 0% 18.8%',\n mutedForeground: '0 0% 64.7%',\n border: '0 0% 22.7%',\n input: '0 0% 32.2%',\n ring: '217 100% 68.4%',\n popover: '0 0% 18.8%',\n popoverForeground: '0 0% 89%',\n destructive: '7 100% 44.9%',\n destructiveForeground: '0 0% 100%',\n success: '156 71% 42.5%',\n successForeground: '0 0% 0%',\n warning: '41 100% 65.1%',\n warningForeground: '0 0% 10.2%',\n sidebar: '0 0% 10.2%',\n sidebarForeground: '0 0% 89%',\n sidebarBorder: '0 0% 16.5%',\n sidebarAccent: '0 0% 18.8%',\n sidebarAccentForeground: '0 0% 100%',\n sidebarMuted: '0 0% 64.7%',\n content: '0 0% 10.2%',\n },\n perception: {\n buttonRadius: '0.5rem',\n cardRadius: '0.5rem',\n inputRadius: '0.5rem',\n modalRadius: '1rem',\n fontFamily: 'Inter, ui-sans-serif, system-ui, -apple-system, sans-serif',\n fontFamilyMono: 'JetBrains Mono, ui-monospace, SFMono-Regular, monospace',\n shadowSm: '0 1px 0 rgba(0, 0, 0, 0.4), 0 1px 3px 0 rgba(0, 0, 0, 0.35), 0 1px 2px -1px rgba(0, 0, 0, 0.35)',\n shadowMd: '0 1px 1px -1px rgba(0, 0, 0, 0.5), 0 4px 8px -2px rgba(0, 0, 0, 0.6)',\n shadowLg: '0 4px 12px -2px rgba(0, 0, 0, 0.6), 0 1px 3px rgba(0, 0, 0, 0.4)',\n shadowButton:\n 'inset 0 -1px 0 rgba(0,0,0,0.40), inset 0 1px 0 rgba(255,255,255,0.08), 0 1px 0 rgba(0,0,0,0.30)',\n shadowButtonPrimary:\n 'inset 0 -1px 0 rgba(0,0,0,0.20), inset 0 1px 0 rgba(255,255,255,0.40), 0 1px 1.5px rgba(0,0,0,0.40)',\n shadowButtonInset:\n 'inset 0 2px 1px -1px rgba(0,0,0,0.50), inset 0 0 0 1px rgba(0,0,0,0.20)',\n surfaceBackdropFilter: 'none',\n buttonBackground: 'hsl(var(--card))',\n buttonBackgroundHover: 'hsl(var(--muted))',\n buttonBorder: 'hsl(var(--border))',\n buttonPrimaryBackground: 'hsl(var(--primary))',\n buttonPrimaryBackgroundHover: 'hsl(var(--primary) / 0.9)',\n buttonPrimaryBorder: 'hsl(var(--primary))',\n buttonBackdropFilter: 'none',\n },\n}\n\n// ---------------------------------------------------------------------------\n// CSS variable maps\n// ---------------------------------------------------------------------------\n\nconst colorVarMap: Record<string, string> = {\n primary: '--primary',\n primaryForeground: '--primary-foreground',\n secondary: '--secondary',\n secondaryForeground: '--secondary-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n background: '--background',\n foreground: '--foreground',\n card: '--card',\n cardForeground: '--card-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n success: '--success',\n successForeground: '--success-foreground',\n warning: '--warning',\n warningForeground: '--warning-foreground',\n sidebar: '--sidebar',\n sidebarForeground: '--sidebar-foreground',\n sidebarBorder: '--sidebar-border',\n sidebarAccent: '--sidebar-accent',\n sidebarAccentForeground: '--sidebar-accent-foreground',\n sidebarMuted: '--sidebar-muted',\n content: '--content',\n}\n\nconst perceptionVarMap: Record<string, string> = {\n buttonRadius: '--button-radius',\n cardRadius: '--card-radius',\n inputRadius: '--input-radius',\n modalRadius: '--modal-radius',\n fontFamily: '--font-family',\n fontFamilyMono: '--font-family-mono',\n shadowSm: '--shadow-sm',\n shadowMd: '--shadow-md',\n shadowLg: '--shadow-lg',\n shadowButton: '--shadow-button',\n shadowButtonPrimary: '--shadow-button-primary',\n shadowButtonInset: '--shadow-button-inset',\n surfaceBackdropFilter: '--surface-backdrop-filter',\n modalBackground: '--modal-bg',\n modalBorder: '--modal-border',\n modalOverlayBackground: '--modal-overlay-bg',\n modalOverlayBackdropFilter: '--modal-overlay-backdrop-filter',\n modalShadow: '--modal-shadow',\n glassEdgeGradient: '--glass-edge-gradient',\n glassPrimaryEdgeGradient: '--glass-primary-edge-gradient',\n glassInnerHighlight: '--glass-inner-highlight',\n fieldBackground: '--field-bg',\n fieldBorder: '--field-border',\n fieldShadow: '--field-shadow',\n buttonBackground: '--button-bg',\n buttonBackgroundHover: '--button-hover-bg',\n buttonBorder: '--button-border',\n buttonPrimaryBackground: '--button-primary-bg',\n buttonPrimaryBackgroundHover: '--button-primary-hover-bg',\n buttonPrimaryBorder: '--button-primary-border',\n buttonBackdropFilter: '--button-backdrop-filter',\n}\n\nfunction applyTheme(theme: ThemeTokens, element?: HTMLElement): void {\n const target = element ?? document.documentElement\n\n for (const [key, cssVar] of Object.entries(colorVarMap)) {\n const value = theme.colors[key as keyof typeof theme.colors]\n if (value) {\n target.style.setProperty(cssVar, value)\n }\n }\n\n for (const [key, cssVar] of Object.entries(perceptionVarMap)) {\n const value = theme.perception[key as keyof typeof theme.perception]\n if (value) {\n target.style.setProperty(cssVar, value)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store\n// ---------------------------------------------------------------------------\n\ntype ThemeMode = 'light' | 'dark' | 'system'\n\nconst STORAGE_KEY = 'fayz-ui:theme-mode'\n\ninterface ThemeState {\n mode: ThemeMode\n resolvedMode: 'light' | 'dark'\n /** Only the user's partial overrides — NOT a full theme */\n overrides: CreateThemeOptions | null\n setMode: (mode: ThemeMode) => void\n setOverrides: (overrides: CreateThemeOptions | null) => void\n initialize: () => void\n // Keep old API name working\n setCustomTheme: (theme: ThemeTokens | null) => void\n}\n\nfunction getSystemPreference(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getSavedMode(): ThemeMode {\n if (typeof window === 'undefined') return 'light'\n const saved = localStorage.getItem(STORAGE_KEY)\n if (saved === 'light' || saved === 'dark' || saved === 'system') return saved\n return 'light'\n}\n\nfunction resolveMode(mode: ThemeMode): 'light' | 'dark' {\n return mode === 'system' ? getSystemPreference() : mode\n}\n\n/** Merge base theme (light or dark) with user's partial overrides */\nfunction buildTheme(base: ThemeTokens, overrides: CreateThemeOptions | null): ThemeTokens {\n if (!overrides) return base\n\n const isDark = base.name === 'dark'\n const colors = { ...base.colors }\n\n // Brand shorthand: derive primary, ring, accent from single HSL\n if (overrides.brand) {\n colors.primary = overrides.brand\n colors.primaryForeground = '0 0% 100%'\n colors.ring = overrides.brand\n const parts = overrides.brand.split(' ')\n if (parts.length >= 3) {\n const hue = (parseFloat(parts[0]) - 50 + 360) % 360\n colors.accent = `${hue} ${parts[1]} ${parts[2]}`\n colors.accentForeground = '0 0% 100%'\n }\n }\n\n // Apply explicit color overrides.\n const colorOverrides = isDark && overrides.darkColors\n ? overrides.darkColors\n : overrides.colors\n\n if (colorOverrides) {\n for (const [key, value] of Object.entries(colorOverrides)) {\n if (value !== undefined) {\n (colors as any)[key] = value\n }\n }\n }\n\n return {\n name: overrides.name ?? base.name,\n colors,\n perception: {\n ...base.perception,\n ...(overrides.perception ?? {}),\n },\n }\n}\n\nconst STORE_KEY = '__fayz_ui_theme_store__'\n\nfunction createThemeStore(): UseBoundStore<StoreApi<ThemeState>> {\n // Window-level singleton to survive linked-package dual-module loading\n if (typeof window !== 'undefined' && (window as any)[STORE_KEY]) {\n return (window as any)[STORE_KEY]\n }\n\n const store = create<ThemeState>((set, get) => ({\n mode: getSavedMode(),\n resolvedMode: 'light',\n overrides: null,\n\n setMode: (mode) => {\n const resolved = resolveMode(mode)\n set({ mode, resolvedMode: resolved })\n\n if (typeof window !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, mode)\n }\n\n const { overrides } = get()\n const baseTheme = resolved === 'dark' ? darkTheme : lightTheme\n const theme = buildTheme(baseTheme, overrides)\n\n if (typeof document !== 'undefined') {\n document.documentElement.classList.add('theme-transitioning')\n applyTheme(theme)\n document.documentElement.classList.toggle('dark', resolved === 'dark')\n setTimeout(() => {\n document.documentElement.classList.remove('theme-transitioning')\n }, 450)\n } else {\n applyTheme(theme)\n }\n },\n\n setOverrides: (overrides) => {\n set({ overrides })\n const { resolvedMode } = get()\n const baseTheme = resolvedMode === 'dark' ? darkTheme : lightTheme\n const theme = buildTheme(baseTheme, overrides)\n applyTheme(theme)\n },\n\n // Legacy compat\n setCustomTheme: (_theme) => {\n // Ignore — callers should use setOverrides now\n },\n\n initialize: () => {\n const { mode, setMode } = get()\n setMode(mode)\n\n if (typeof window !== 'undefined') {\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n const current = get()\n if (current.mode === 'system') {\n current.setMode('system')\n }\n })\n }\n },\n }))\n\n if (typeof window !== 'undefined') {\n (window as any)[STORE_KEY] = store\n }\n\n return store\n}\n\nexport const useThemeStore = createThemeStore()\n","import { darkTheme, lightTheme, type CreateThemeOptions } from '../stores/theme.store'\n\nexport type FayzThemePresetId = 'classic_admin' | 'liquid_glass'\n\nfunction mergeThemeOptions(base: CreateThemeOptions, overrides: CreateThemeOptions = {}): CreateThemeOptions {\n return {\n ...base,\n ...overrides,\n colors: {\n ...(base.colors ?? {}),\n ...(overrides.colors ?? {}),\n },\n darkColors: {\n ...(base.darkColors ?? {}),\n ...(overrides.darkColors ?? {}),\n },\n perception: {\n ...(base.perception ?? {}),\n ...(overrides.perception ?? {}),\n },\n }\n}\n\nexport const fayzThemePresets: Record<FayzThemePresetId, CreateThemeOptions> = {\n classic_admin: {\n name: 'classic_admin',\n colors: lightTheme.colors,\n darkColors: darkTheme.colors,\n perception: lightTheme.perception,\n },\n liquid_glass: {\n name: 'liquid_glass',\n colors: {\n background: '260 38% 96%',\n content: '260 36% 96.5%',\n card: '0 0% 100% / 0.84',\n popover: '0 0% 100% / 0.96',\n secondary: '260 34% 93% / 0.82',\n muted: '260 30% 91% / 0.78',\n border: '260 26% 76% / 0.58',\n input: '260 24% 68% / 0.62',\n },\n darkColors: {\n background: '260 28% 9%',\n content: '260 28% 10%',\n card: '260 24% 16% / 0.72',\n popover: '260 24% 14% / 0.9',\n secondary: '260 20% 22% / 0.72',\n muted: '260 18% 20% / 0.68',\n border: '260 20% 35% / 0.58',\n input: '260 20% 38% / 0.68',\n },\n perception: {\n buttonRadius: '9999px',\n cardRadius: '1.25rem',\n inputRadius: '1rem',\n modalRadius: '1.5rem',\n surfaceBackdropFilter: 'blur(16px) saturate(1.24) brightness(1.03)',\n modalBackground:\n 'linear-gradient(145deg, rgb(255 255 255 / 0.82), rgb(249 247 255 / 0.72) 48%, rgb(255 255 255 / 0.64))',\n modalBorder: 'rgb(255 255 255 / 0.74)',\n modalOverlayBackground: 'rgb(26 20 38 / 0.22)',\n modalOverlayBackdropFilter: 'blur(5px) saturate(1.08)',\n modalShadow:\n '0 32px 82px -46px rgb(31 18 61 / 0.38), 0 1px 4px rgb(31 18 61 / 0.08), inset 0 1px 0 rgb(255 255 255 / 0.78), inset 0 0 0 1px rgb(255 255 255 / 0.28)',\n glassEdgeGradient:\n 'linear-gradient(145deg, rgb(255 255 255 / 0.96) 0%, rgb(255 255 255 / 0.44) 24%, rgb(171 151 211 / 0.34) 48%, rgb(45 35 76 / 0.22) 62%, rgb(255 255 255 / 0.7) 100%)',\n glassPrimaryEdgeGradient:\n 'linear-gradient(145deg, rgb(255 255 255 / 0.74) 0%, rgb(255 255 255 / 0.2) 28%, rgb(45 35 76 / 0.34) 58%, rgb(255 255 255 / 0.5) 100%)',\n glassInnerHighlight:\n 'inset 0 1px 0 rgb(255 255 255 / 0.72), inset 1px 0 0 rgb(255 255 255 / 0.28), inset 0 -1px 0 rgb(45 35 76 / 0.1)',\n fieldBackground:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.9) 0%, rgb(250 248 255 / 0.82) 46%, rgb(242 238 252 / 0.74) 100%)',\n fieldBorder: 'rgb(174 158 205 / 0.58)',\n fieldShadow:\n 'inset 0 1px 0 rgb(255 255 255 / 0.8), inset 0 -1px 0 rgb(45 35 76 / 0.08), 0 12px 28px -24px rgb(31 18 61 / 0.28)',\n shadowSm: '0 10px 28px -20px rgb(31 18 61 / 0.34), inset 0 1px 0 rgb(255 255 255 / 0.54)',\n shadowMd: '0 22px 54px -32px rgb(31 18 61 / 0.42), inset 0 1px 0 rgb(255 255 255 / 0.58)',\n shadowLg: '0 34px 88px -42px rgb(31 18 61 / 0.48), inset 0 1px 0 rgb(255 255 255 / 0.62)',\n shadowButton:\n 'inset 0 1px 0 rgb(255 255 255 / 0.82), inset 0 -1px 0 rgb(31 18 61 / 0.08), 0 14px 30px -18px rgb(31 18 61 / 0.56)',\n shadowButtonPrimary:\n 'inset 0 1px 0 rgb(255 255 255 / 0.5), inset 0 -1px 0 rgb(31 18 61 / 0.26), 0 18px 36px -18px rgb(31 18 61 / 0.86)',\n shadowButtonInset:\n 'inset 0 2px 4px rgb(31 18 61 / 0.22), inset 0 0 0 1px rgb(255 255 255 / 0.24)',\n buttonBackground:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.92) 0%, rgb(247 242 255 / 0.74) 48%, rgb(229 220 248 / 0.64) 100%)',\n buttonBackgroundHover:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.98) 0%, rgb(249 244 255 / 0.86) 46%, rgb(231 222 250 / 0.78) 100%)',\n buttonBorder: 'rgb(194 178 221 / 0.86)',\n buttonPrimaryBackground:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.28) 0%, hsl(var(--primary) / 0.94) 36%, hsl(278 42% 58% / 0.88) 100%)',\n buttonPrimaryBackgroundHover:\n 'linear-gradient(135deg, rgb(255 255 255 / 0.36) 0%, hsl(var(--primary) / 1) 34%, hsl(278 52% 62% / 0.94) 100%)',\n buttonPrimaryBorder: 'rgb(255 255 255 / 0.38)',\n buttonBackdropFilter: 'blur(18px) saturate(1.45)',\n },\n },\n}\n\nexport function createFayzTheme(\n preset: FayzThemePresetId = 'classic_admin',\n overrides: CreateThemeOptions = {},\n): CreateThemeOptions {\n return mergeThemeOptions(fayzThemePresets[preset] ?? fayzThemePresets.classic_admin, overrides)\n}\n","import * as React from 'react'\nimport { useThemeStore, type CreateThemeOptions, type ThemeTokens, lightTheme, darkTheme } from '../stores/theme.store'\n\n// ---------------------------------------------------------------------------\n// ThemeProvider\n// ---------------------------------------------------------------------------\n\nexport interface ThemeProviderProps {\n children: React.ReactNode\n /** Initial theme overrides to apply on mount */\n overrides?: CreateThemeOptions | null\n /** Default mode. Defaults to 'light'. */\n defaultMode?: 'light' | 'dark' | 'system'\n}\n\nexport function ThemeProvider({ children, overrides, defaultMode }: ThemeProviderProps) {\n const initialize = useThemeStore((s) => s.initialize)\n const setMode = useThemeStore((s) => s.setMode)\n const setOverrides = useThemeStore((s) => s.setOverrides)\n\n React.useEffect(() => {\n if (defaultMode) {\n setMode(defaultMode)\n }\n if (overrides !== undefined) {\n setOverrides(overrides)\n }\n initialize()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return children as React.ReactElement\n}\n\n// ---------------------------------------------------------------------------\n// useTheme\n// ---------------------------------------------------------------------------\n\nexport function useTheme() {\n const mode = useThemeStore((s) => s.mode)\n const resolvedMode = useThemeStore((s) => s.resolvedMode)\n const overrides = useThemeStore((s) => s.overrides)\n const setMode = useThemeStore((s) => s.setMode)\n const setOverrides = useThemeStore((s) => s.setOverrides)\n\n return {\n mode,\n resolvedMode,\n isDark: resolvedMode === 'dark',\n overrides,\n setMode,\n setOverrides,\n }\n}\n\n// ---------------------------------------------------------------------------\n// createTheme — build a ThemeTokens object from partial overrides\n// ---------------------------------------------------------------------------\n\nexport function createTheme(overrides: CreateThemeOptions): ThemeTokens {\n const colors = { ...lightTheme.colors, ...overrides.colors }\n\n // Brand shorthand: auto-derive primary, ring, accent from single HSL.\n // Explicit `colors.*` overrides win — the shorthand is a default, not a\n // mandate, so an app can pin any one of these without dropping the rest.\n if (overrides.brand) {\n const given = overrides.colors ?? {}\n if (given.primary == null) colors.primary = overrides.brand\n if (given.primaryForeground == null) colors.primaryForeground = '0 0% 100%'\n if (given.ring == null) colors.ring = overrides.brand\n const parts = overrides.brand.split(' ')\n if (parts.length >= 3) {\n const hue = (parseFloat(parts[0]) - 50 + 360) % 360\n if (given.accent == null) colors.accent = `${hue} ${parts[1]} ${parts[2]}`\n if (given.accentForeground == null) colors.accentForeground = '0 0% 100%'\n }\n }\n\n return {\n name: overrides.name ?? lightTheme.name,\n colors,\n perception: {\n ...lightTheme.perception,\n ...overrides.perception,\n },\n }\n}\n\n// Re-export types for convenience\nexport type { CreateThemeOptions, ThemeTokens }\nexport { lightTheme, darkTheme }\nexport { fayzUiPreset } from './preset'\nexport { createFayzTheme, fayzThemePresets } from './presets'\nexport type { FayzThemePresetId } from './presets'\n"]}