@salesmind-ai/design-system 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/AppearancePanel-UT57J69V.d.cts +51 -0
  2. package/dist/AppearancePanel-UT57J69V.d.ts +51 -0
  3. package/dist/AppearanceProvider-C36a8-eb.d.cts +45 -0
  4. package/dist/AppearanceProvider-C36a8-eb.d.ts +45 -0
  5. package/dist/Breadcrumb-RX-B_gDV.d.cts +44 -0
  6. package/dist/Breadcrumb-RX-B_gDV.d.ts +44 -0
  7. package/dist/ExportMenu-A2TLFiVv.d.cts +311 -0
  8. package/dist/ExportMenu-C8qck5AT.d.ts +311 -0
  9. package/dist/SectionShell-BfBw5q0Y.d.cts +18 -0
  10. package/dist/SectionShell-BfBw5q0Y.d.ts +18 -0
  11. package/dist/Select-BdZmK0Lt.d.cts +66 -0
  12. package/dist/Select-BdZmK0Lt.d.ts +66 -0
  13. package/dist/admin/index.cjs +2941 -0
  14. package/dist/admin/index.cjs.map +1 -0
  15. package/dist/admin/index.css +4145 -0
  16. package/dist/admin/index.css.map +1 -0
  17. package/dist/admin/index.d.cts +491 -0
  18. package/dist/admin/index.d.ts +491 -0
  19. package/dist/admin/index.js +2918 -0
  20. package/dist/admin/index.js.map +1 -0
  21. package/dist/{audit-CiyPkxk1.d.cts → audit-BS2fn7M4.d.ts} +2 -51
  22. package/dist/{audit-CiyPkxk1.d.ts → audit-DwCmg32J.d.cts} +2 -51
  23. package/dist/blog/index.cjs +1074 -0
  24. package/dist/blog/index.cjs.map +1 -0
  25. package/dist/blog/index.css +1422 -0
  26. package/dist/blog/index.css.map +1 -0
  27. package/dist/blog/index.d.cts +233 -0
  28. package/dist/blog/index.d.ts +233 -0
  29. package/dist/blog/index.js +1056 -0
  30. package/dist/blog/index.js.map +1 -0
  31. package/dist/chart-types-BGVVO-zl.d.cts +208 -0
  32. package/dist/chart-types-BGVVO-zl.d.ts +208 -0
  33. package/dist/charts/index.cjs +2698 -0
  34. package/dist/charts/index.cjs.map +1 -0
  35. package/dist/charts/index.css +1167 -0
  36. package/dist/charts/index.css.map +1 -0
  37. package/dist/charts/index.d.cts +453 -0
  38. package/dist/charts/index.d.ts +453 -0
  39. package/dist/charts/index.js +2682 -0
  40. package/dist/charts/index.js.map +1 -0
  41. package/dist/core/index.cjs +526 -395
  42. package/dist/core/index.cjs.map +1 -1
  43. package/dist/core/index.css +294 -0
  44. package/dist/core/index.css.map +1 -1
  45. package/dist/core/index.d.cts +7 -982
  46. package/dist/core/index.d.ts +7 -982
  47. package/dist/core/index.js +476 -351
  48. package/dist/core/index.js.map +1 -1
  49. package/dist/i18n/index.cjs +585 -0
  50. package/dist/i18n/index.cjs.map +1 -0
  51. package/dist/i18n/index.d.cts +855 -0
  52. package/dist/i18n/index.d.ts +855 -0
  53. package/dist/i18n/index.js +547 -0
  54. package/dist/i18n/index.js.map +1 -0
  55. package/dist/index.d.cts +22 -1290
  56. package/dist/index.d.ts +22 -1290
  57. package/dist/marketing/index.cjs +2144 -3023
  58. package/dist/marketing/index.cjs.map +1 -1
  59. package/dist/marketing/index.css +3729 -4824
  60. package/dist/marketing/index.css.map +1 -1
  61. package/dist/marketing/index.d.cts +1351 -4
  62. package/dist/marketing/index.d.ts +1351 -4
  63. package/dist/marketing/index.js +2190 -3054
  64. package/dist/marketing/index.js.map +1 -1
  65. package/dist/motion/index.cjs +1230 -0
  66. package/dist/motion/index.cjs.map +1 -0
  67. package/dist/motion/index.css +699 -0
  68. package/dist/motion/index.css.map +1 -0
  69. package/dist/motion/index.d.cts +68 -0
  70. package/dist/motion/index.d.ts +68 -0
  71. package/dist/motion/index.js +1218 -0
  72. package/dist/motion/index.js.map +1 -0
  73. package/dist/nav/index.cjs +1533 -0
  74. package/dist/nav/index.cjs.map +1 -0
  75. package/dist/nav/index.css +1984 -0
  76. package/dist/nav/index.css.map +1 -0
  77. package/dist/nav/index.d.cts +279 -0
  78. package/dist/nav/index.d.ts +279 -0
  79. package/dist/nav/index.js +1501 -0
  80. package/dist/nav/index.js.map +1 -0
  81. package/dist/report/index.cjs +26 -1649
  82. package/dist/report/index.cjs.map +1 -1
  83. package/dist/report/index.css +0 -963
  84. package/dist/report/index.css.map +1 -1
  85. package/dist/report/index.d.cts +4 -2
  86. package/dist/report/index.d.ts +4 -2
  87. package/dist/report/index.js +27 -1640
  88. package/dist/report/index.js.map +1 -1
  89. package/dist/sections/index.cjs +385 -0
  90. package/dist/sections/index.cjs.map +1 -0
  91. package/dist/sections/index.css +818 -0
  92. package/dist/sections/index.css.map +1 -0
  93. package/dist/sections/index.d.cts +69 -0
  94. package/dist/sections/index.d.ts +69 -0
  95. package/dist/sections/index.js +374 -0
  96. package/dist/sections/index.js.map +1 -0
  97. package/dist/social-proof/index.cjs +1254 -0
  98. package/dist/social-proof/index.cjs.map +1 -0
  99. package/dist/social-proof/index.css +1416 -0
  100. package/dist/social-proof/index.css.map +1 -0
  101. package/dist/social-proof/index.d.cts +258 -0
  102. package/dist/social-proof/index.d.ts +258 -0
  103. package/dist/social-proof/index.js +1237 -0
  104. package/dist/social-proof/index.js.map +1 -0
  105. package/dist/theme/index.cjs +573 -0
  106. package/dist/theme/index.cjs.map +1 -0
  107. package/dist/theme/index.css +464 -0
  108. package/dist/theme/index.css.map +1 -0
  109. package/dist/theme/index.d.cts +48 -0
  110. package/dist/theme/index.d.ts +48 -0
  111. package/dist/theme/index.js +558 -0
  112. package/dist/theme/index.js.map +1 -0
  113. package/dist/types-DAlgDGzw.d.cts +52 -0
  114. package/dist/types-DAlgDGzw.d.ts +52 -0
  115. package/dist/web/index.d.cts +3 -2
  116. package/dist/web/index.d.ts +3 -2
  117. package/package.json +68 -9
  118. package/dist/ExportMenu-hEe5MhLq.d.cts +0 -1027
  119. package/dist/ExportMenu-hEe5MhLq.d.ts +0 -1027
  120. package/dist/index-B64suAAc.d.cts +0 -1498
  121. package/dist/index-B64suAAc.d.ts +0 -1498
@@ -0,0 +1,573 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React2 = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var lucideReact = require('lucide-react');
7
+ var clsx2 = require('clsx');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var React2__default = /*#__PURE__*/_interopDefault(React2);
12
+ var clsx2__default = /*#__PURE__*/_interopDefault(clsx2);
13
+
14
+ // src/theme/AppearanceProvider.tsx
15
+ var STORAGE_KEY = "void-appearance-settings";
16
+ var DEFAULT_SETTINGS = {
17
+ theme: "dark",
18
+ brand: "default",
19
+ navPlacement: "left",
20
+ density: "comfortable",
21
+ radius: "playful",
22
+ customColor: "#f97316"
23
+ // Default orange as fallback
24
+ };
25
+ function hexToRgb(hex) {
26
+ const cleanHex = hex.replace(/^#/, "");
27
+ const r = parseInt(cleanHex.substring(0, 2), 16);
28
+ const g = parseInt(cleanHex.substring(2, 4), 16);
29
+ const b = parseInt(cleanHex.substring(4, 6), 16);
30
+ if (isNaN(r) || isNaN(g) || isNaN(b)) {
31
+ return "249, 115, 22";
32
+ }
33
+ return `${r}, ${g}, ${b}`;
34
+ }
35
+ function generateSecondaryColor(hex) {
36
+ const cleanHex = hex.replace(/^#/, "");
37
+ const r = parseInt(cleanHex.substring(0, 2), 16);
38
+ const g = parseInt(cleanHex.substring(2, 4), 16);
39
+ const b = parseInt(cleanHex.substring(4, 6), 16);
40
+ if (isNaN(r) || isNaN(g) || isNaN(b)) {
41
+ return "255, 208, 0";
42
+ }
43
+ const secondary = {
44
+ r: Math.min(255, g + 50),
45
+ g: Math.min(255, b + 100),
46
+ b: Math.min(255, r)
47
+ };
48
+ return `${secondary.r}, ${secondary.g}, ${secondary.b}`;
49
+ }
50
+ function loadSettings() {
51
+ if (typeof window === "undefined") return DEFAULT_SETTINGS;
52
+ try {
53
+ const stored = localStorage.getItem(STORAGE_KEY);
54
+ if (stored) {
55
+ const parsed = JSON.parse(stored);
56
+ return {
57
+ theme: parsed.theme || DEFAULT_SETTINGS.theme,
58
+ brand: parsed.brand || DEFAULT_SETTINGS.brand,
59
+ navPlacement: parsed.navPlacement || DEFAULT_SETTINGS.navPlacement,
60
+ density: parsed.density || DEFAULT_SETTINGS.density,
61
+ radius: parsed.radius || DEFAULT_SETTINGS.radius,
62
+ customColor: parsed.customColor || DEFAULT_SETTINGS.customColor
63
+ };
64
+ }
65
+ } catch {
66
+ }
67
+ return {
68
+ ...DEFAULT_SETTINGS,
69
+ theme: "dark"
70
+ };
71
+ }
72
+ function saveSettings(settings) {
73
+ if (typeof window === "undefined") return;
74
+ try {
75
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
76
+ } catch {
77
+ }
78
+ }
79
+ function applySettings(settings) {
80
+ if (typeof document === "undefined") return;
81
+ const root = document.documentElement;
82
+ root.setAttribute("data-theme", settings.theme);
83
+ root.setAttribute("data-brand", settings.brand);
84
+ root.setAttribute("data-nav", settings.navPlacement);
85
+ root.setAttribute("data-density", settings.density);
86
+ root.setAttribute("data-radius", settings.radius);
87
+ if (settings.brand === "custom") {
88
+ const primaryRgb = hexToRgb(settings.customColor);
89
+ const secondaryRgb = generateSecondaryColor(settings.customColor);
90
+ root.style.setProperty("--custom-accent-rgb", primaryRgb);
91
+ root.style.setProperty("--custom-accent2-rgb", secondaryRgb);
92
+ } else {
93
+ root.style.removeProperty("--custom-accent-rgb");
94
+ root.style.removeProperty("--custom-accent2-rgb");
95
+ }
96
+ }
97
+ function prefersReducedMotion() {
98
+ if (typeof window === "undefined") return false;
99
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
100
+ }
101
+ var AppearanceContext = React2.createContext(null);
102
+ function AppearanceProvider({
103
+ initialSettings,
104
+ disablePersistence = false,
105
+ children
106
+ }) {
107
+ const [settings, setSettings] = React2.useState(() => ({
108
+ ...DEFAULT_SETTINGS,
109
+ ...initialSettings
110
+ }));
111
+ const [hydrated, setHydrated] = React2.useState(false);
112
+ React2.useEffect(() => {
113
+ if (!disablePersistence) {
114
+ const loaded = loadSettings();
115
+ setSettings({
116
+ ...loaded,
117
+ // initialSettings still take priority over localStorage
118
+ ...initialSettings
119
+ });
120
+ }
121
+ setHydrated(true);
122
+ }, []);
123
+ React2.useEffect(() => {
124
+ applySettings(settings);
125
+ if (!disablePersistence && hydrated) {
126
+ saveSettings(settings);
127
+ }
128
+ }, [settings, disablePersistence, hydrated]);
129
+ React2.useEffect(() => {
130
+ if (typeof window === "undefined") return;
131
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: light)");
132
+ const handleChange = (e) => {
133
+ setSettings((prev) => {
134
+ if (prev.theme === "light-contrast" || prev.theme === "dark-contrast") {
135
+ return prev;
136
+ }
137
+ return {
138
+ ...prev,
139
+ theme: e.matches ? "light" : "dark"
140
+ };
141
+ });
142
+ };
143
+ mediaQuery.addEventListener("change", handleChange);
144
+ return () => mediaQuery.removeEventListener("change", handleChange);
145
+ }, []);
146
+ React2.useEffect(() => {
147
+ if (typeof window === "undefined") return;
148
+ const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
149
+ const handleChange = () => {
150
+ applySettings(settings);
151
+ };
152
+ mediaQuery.addEventListener("change", handleChange);
153
+ return () => mediaQuery.removeEventListener("change", handleChange);
154
+ }, [settings]);
155
+ const setTheme = React2.useCallback((theme) => {
156
+ setSettings((prev) => ({ ...prev, theme }));
157
+ }, []);
158
+ const setBrand = React2.useCallback((brand) => {
159
+ setSettings((prev) => ({ ...prev, brand }));
160
+ }, []);
161
+ const setNavPlacement = React2.useCallback((navPlacement) => {
162
+ setSettings((prev) => ({ ...prev, navPlacement }));
163
+ }, []);
164
+ const setDensity = React2.useCallback((density) => {
165
+ setSettings((prev) => ({ ...prev, density }));
166
+ }, []);
167
+ const setRadius = React2.useCallback((radius) => {
168
+ setSettings((prev) => ({ ...prev, radius }));
169
+ }, []);
170
+ const setCustomColor = React2.useCallback((customColor) => {
171
+ setSettings((prev) => ({ ...prev, customColor, brand: "custom" }));
172
+ }, []);
173
+ const setAppearance = React2.useCallback((partial) => {
174
+ setSettings((prev) => ({ ...prev, ...partial }));
175
+ }, []);
176
+ const resetToDefaults = React2.useCallback(() => {
177
+ setSettings(DEFAULT_SETTINGS);
178
+ }, []);
179
+ const contextValue = {
180
+ ...settings,
181
+ setTheme,
182
+ setBrand,
183
+ setNavPlacement,
184
+ setDensity,
185
+ setRadius,
186
+ setCustomColor,
187
+ setAppearance,
188
+ resetToDefaults
189
+ };
190
+ return /* @__PURE__ */ jsxRuntime.jsx(AppearanceContext.Provider, { value: contextValue, children });
191
+ }
192
+ function useAppearance() {
193
+ const context = React2.useContext(AppearanceContext);
194
+ if (!context) {
195
+ throw new Error("useAppearance must be used within an AppearanceProvider");
196
+ }
197
+ return context;
198
+ }
199
+ function initializeAppearance(settings) {
200
+ const loaded = loadSettings();
201
+ const merged = { ...loaded, ...settings };
202
+ applySettings(merged);
203
+ }
204
+ var ThemeSelector = ({ className, style }) => {
205
+ const { theme, setTheme } = useAppearance();
206
+ const handleThemeChange = (newTheme) => {
207
+ setTheme(newTheme);
208
+ };
209
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: clsx2__default.default("ds-theme-selector", className), style, role: "group", "aria-label": "Theme Selector", children: [
210
+ /* @__PURE__ */ jsxRuntime.jsxs(
211
+ "button",
212
+ {
213
+ type: "button",
214
+ className: clsx2__default.default("ds-theme-selector__btn", { "ds-theme-selector__btn--active": theme === "light" }),
215
+ onClick: () => handleThemeChange("light"),
216
+ "aria-pressed": theme === "light",
217
+ children: [
218
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sun, { className: "ds-theme-selector__icon" }),
219
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-theme-selector__label", children: "Light" })
220
+ ]
221
+ }
222
+ ),
223
+ /* @__PURE__ */ jsxRuntime.jsxs(
224
+ "button",
225
+ {
226
+ type: "button",
227
+ className: clsx2__default.default("ds-theme-selector__btn", { "ds-theme-selector__btn--active": theme === "light-contrast" }),
228
+ onClick: () => handleThemeChange("light-contrast"),
229
+ "aria-pressed": theme === "light-contrast",
230
+ children: [
231
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Sun, { className: "ds-theme-selector__icon" }),
232
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-theme-selector__label", children: "Light HC" })
233
+ ]
234
+ }
235
+ ),
236
+ /* @__PURE__ */ jsxRuntime.jsxs(
237
+ "button",
238
+ {
239
+ type: "button",
240
+ className: clsx2__default.default("ds-theme-selector__btn", { "ds-theme-selector__btn--active": theme === "dark" }),
241
+ onClick: () => handleThemeChange("dark"),
242
+ "aria-pressed": theme === "dark",
243
+ children: [
244
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Moon, { className: "ds-theme-selector__icon" }),
245
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-theme-selector__label", children: "Dark" })
246
+ ]
247
+ }
248
+ ),
249
+ /* @__PURE__ */ jsxRuntime.jsxs(
250
+ "button",
251
+ {
252
+ type: "button",
253
+ className: clsx2__default.default("ds-theme-selector__btn", { "ds-theme-selector__btn--active": theme === "dark-contrast" }),
254
+ onClick: () => handleThemeChange("dark-contrast"),
255
+ "aria-pressed": theme === "dark-contrast",
256
+ children: [
257
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Moon, { className: "ds-theme-selector__icon" }),
258
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-theme-selector__label", children: "Dark HC" })
259
+ ]
260
+ }
261
+ )
262
+ ] });
263
+ };
264
+ ThemeSelector.displayName = "ThemeSelector";
265
+ var AppearancePanel = React2__default.default.forwardRef(
266
+ ({ className, labels: l }, ref) => {
267
+ const {
268
+ theme,
269
+ brand,
270
+ navPlacement,
271
+ density,
272
+ radius,
273
+ customColor,
274
+ setTheme,
275
+ setBrand,
276
+ setNavPlacement,
277
+ setDensity,
278
+ setRadius,
279
+ setCustomColor,
280
+ resetToDefaults
281
+ } = useAppearance();
282
+ const colorPickerId = React2.useId();
283
+ const themeOptions = [
284
+ { value: "light", label: l?.themeLight ?? "Light" },
285
+ { value: "light-contrast", label: l?.themeLightContrast ?? "Light (High Contrast)" },
286
+ { value: "dark", label: l?.themeDark ?? "Dark" },
287
+ { value: "dark-contrast", label: l?.themeDarkContrast ?? "Dark (High Contrast)" }
288
+ ];
289
+ const brandOptions = [
290
+ { value: "default", label: l?.brandDefault ?? "Default", description: l?.brandDefaultDescription ?? "Warm Intelligence" },
291
+ { value: "salesmind", label: l?.brandSalesmind ?? "SalesMind", description: l?.brandSalesmindDescription ?? "Pink-red + Gold" },
292
+ { value: "custom", label: l?.brandCustom ?? "Custom", description: l?.brandCustomDescription ?? "Your color" }
293
+ ];
294
+ const navOptions = [
295
+ { value: "left", label: l?.navLeft ?? "Left Sidebar" },
296
+ { value: "right", label: l?.navRight ?? "Right Sidebar" },
297
+ { value: "bottom", label: l?.navBottom ?? "Bottom Tabs" }
298
+ ];
299
+ const densityOptions = [
300
+ { value: "comfortable", label: l?.densityComfortable ?? "Comfortable", description: l?.densityComfortableDescription ?? "Generous spacing" },
301
+ { value: "compact", label: l?.densityCompact ?? "Compact", description: l?.densityCompactDescription ?? "Higher density" }
302
+ ];
303
+ const radiusOptions = [
304
+ { value: "playful", label: l?.radiusPlayful ?? "Playful", description: l?.radiusPlayfulDescription ?? "Rounded corners" },
305
+ { value: "sharp", label: l?.radiusSharp ?? "Sharp", description: l?.radiusSharpDescription ?? "Technical feel" }
306
+ ];
307
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: clsx2__default.default("ds-appearance-panel", className), children: [
308
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "ds-appearance-panel__title", children: l?.title ?? "Appearance Settings" }),
309
+ /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "ds-appearance-panel__section", children: [
310
+ /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "ds-appearance-panel__legend", children: l?.themeHeading ?? "Theme" }),
311
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-appearance-panel__options", children: themeOptions.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
312
+ "label",
313
+ {
314
+ className: clsx2__default.default(
315
+ "ds-appearance-panel__option",
316
+ theme === option.value && "ds-appearance-panel__option--active"
317
+ ),
318
+ children: [
319
+ /* @__PURE__ */ jsxRuntime.jsx(
320
+ "input",
321
+ {
322
+ type: "radio",
323
+ name: "theme",
324
+ value: option.value,
325
+ checked: theme === option.value,
326
+ onChange: () => setTheme(option.value),
327
+ className: "ds-appearance-panel__radio"
328
+ }
329
+ ),
330
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__option-label", children: option.label })
331
+ ]
332
+ },
333
+ option.value
334
+ )) })
335
+ ] }),
336
+ /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "ds-appearance-panel__section", children: [
337
+ /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "ds-appearance-panel__legend", children: l?.brandHeading ?? "Brand" }),
338
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-appearance-panel__options", children: brandOptions.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
339
+ "label",
340
+ {
341
+ className: clsx2__default.default(
342
+ "ds-appearance-panel__option",
343
+ brand === option.value && "ds-appearance-panel__option--active"
344
+ ),
345
+ children: [
346
+ /* @__PURE__ */ jsxRuntime.jsx(
347
+ "input",
348
+ {
349
+ type: "radio",
350
+ name: "brand",
351
+ value: option.value,
352
+ checked: brand === option.value,
353
+ onChange: () => setBrand(option.value),
354
+ className: "ds-appearance-panel__radio"
355
+ }
356
+ ),
357
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-appearance-panel__option-content", children: [
358
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__option-label", children: option.label }),
359
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__option-description", children: option.description })
360
+ ] })
361
+ ]
362
+ },
363
+ option.value
364
+ )) }),
365
+ brand === "custom" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-appearance-panel__color-picker", children: [
366
+ /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: colorPickerId, className: "ds-appearance-panel__color-label", children: l?.accentColorLabel ?? "Accent Color" }),
367
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ds-appearance-panel__color-input-wrapper", children: [
368
+ /* @__PURE__ */ jsxRuntime.jsx(
369
+ "input",
370
+ {
371
+ type: "color",
372
+ id: colorPickerId,
373
+ value: customColor,
374
+ onChange: (e) => setCustomColor(e.target.value),
375
+ className: "ds-appearance-panel__color-input"
376
+ }
377
+ ),
378
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__color-value", children: customColor.toUpperCase() })
379
+ ] })
380
+ ] })
381
+ ] }),
382
+ /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "ds-appearance-panel__section", children: [
383
+ /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "ds-appearance-panel__legend", children: l?.densityHeading ?? "Density" }),
384
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-appearance-panel__options ds-appearance-panel__options--row", children: densityOptions.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
385
+ "label",
386
+ {
387
+ className: clsx2__default.default(
388
+ "ds-appearance-panel__option",
389
+ "ds-appearance-panel__option--toggle",
390
+ density === option.value && "ds-appearance-panel__option--active"
391
+ ),
392
+ children: [
393
+ /* @__PURE__ */ jsxRuntime.jsx(
394
+ "input",
395
+ {
396
+ type: "radio",
397
+ name: "density",
398
+ value: option.value,
399
+ checked: density === option.value,
400
+ onChange: () => setDensity(option.value),
401
+ className: "ds-appearance-panel__radio"
402
+ }
403
+ ),
404
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-appearance-panel__option-content", children: [
405
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__option-label", children: option.label }),
406
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__option-description", children: option.description })
407
+ ] })
408
+ ]
409
+ },
410
+ option.value
411
+ )) })
412
+ ] }),
413
+ /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "ds-appearance-panel__section", children: [
414
+ /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "ds-appearance-panel__legend", children: l?.geometryHeading ?? "Geometry" }),
415
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-appearance-panel__options ds-appearance-panel__options--row", children: radiusOptions.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
416
+ "label",
417
+ {
418
+ className: clsx2__default.default(
419
+ "ds-appearance-panel__option",
420
+ "ds-appearance-panel__option--toggle",
421
+ radius === option.value && "ds-appearance-panel__option--active"
422
+ ),
423
+ children: [
424
+ /* @__PURE__ */ jsxRuntime.jsx(
425
+ "input",
426
+ {
427
+ type: "radio",
428
+ name: "radius",
429
+ value: option.value,
430
+ checked: radius === option.value,
431
+ onChange: () => setRadius(option.value),
432
+ className: "ds-appearance-panel__radio"
433
+ }
434
+ ),
435
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ds-appearance-panel__option-content", children: [
436
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__option-label", children: option.label }),
437
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__option-description", children: option.description })
438
+ ] })
439
+ ]
440
+ },
441
+ option.value
442
+ )) })
443
+ ] }),
444
+ /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "ds-appearance-panel__section", children: [
445
+ /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "ds-appearance-panel__legend", children: l?.navHeading ?? "Navigation Layout" }),
446
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ds-appearance-panel__options", children: navOptions.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
447
+ "label",
448
+ {
449
+ className: clsx2__default.default(
450
+ "ds-appearance-panel__option",
451
+ navPlacement === option.value && "ds-appearance-panel__option--active"
452
+ ),
453
+ children: [
454
+ /* @__PURE__ */ jsxRuntime.jsx(
455
+ "input",
456
+ {
457
+ type: "radio",
458
+ name: "nav",
459
+ value: option.value,
460
+ checked: navPlacement === option.value,
461
+ onChange: () => setNavPlacement(option.value),
462
+ className: "ds-appearance-panel__radio"
463
+ }
464
+ ),
465
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ds-appearance-panel__option-label", children: option.label })
466
+ ]
467
+ },
468
+ option.value
469
+ )) })
470
+ ] }),
471
+ /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: resetToDefaults, className: "ds-appearance-panel__reset", children: l?.resetLabel ?? "Reset to Defaults" })
472
+ ] });
473
+ }
474
+ );
475
+ AppearancePanel.displayName = "AppearancePanel";
476
+ var BRAND_PRESETS = [
477
+ { value: "default", label: "Warm Intelligence", color: "#f97316" },
478
+ { value: "salesmind", label: "SalesMind", color: "#ff005a" }
479
+ ];
480
+ var ColorPicker = React2__default.default.forwardRef(
481
+ ({ className, style }, ref) => {
482
+ const { brand, setBrand, customColor, setCustomColor } = useAppearance();
483
+ return /* @__PURE__ */ jsxRuntime.jsxs(
484
+ "div",
485
+ {
486
+ ref,
487
+ className: clsx2__default.default("ds-color-picker", className),
488
+ style,
489
+ role: "group",
490
+ "aria-label": "Brand Color",
491
+ children: [
492
+ BRAND_PRESETS.map(({ value, label, color }) => /* @__PURE__ */ jsxRuntime.jsx(
493
+ "button",
494
+ {
495
+ type: "button",
496
+ className: clsx2__default.default("ds-color-picker__swatch", {
497
+ "ds-color-picker__swatch--active": brand === value
498
+ }),
499
+ onClick: () => setBrand(value),
500
+ "aria-label": `Switch to ${label} color scheme`,
501
+ "aria-pressed": brand === value,
502
+ title: label,
503
+ children: /* @__PURE__ */ jsxRuntime.jsx(
504
+ "span",
505
+ {
506
+ className: "ds-color-picker__dot",
507
+ style: { "--swatch-color": color }
508
+ }
509
+ )
510
+ },
511
+ value
512
+ )),
513
+ /* @__PURE__ */ jsxRuntime.jsxs(
514
+ "label",
515
+ {
516
+ className: clsx2__default.default("ds-color-picker__swatch", "ds-color-picker__swatch--custom", {
517
+ "ds-color-picker__swatch--active": brand === "custom"
518
+ }),
519
+ title: `Custom: ${customColor}`,
520
+ children: [
521
+ /* @__PURE__ */ jsxRuntime.jsx(
522
+ "span",
523
+ {
524
+ className: "ds-color-picker__dot",
525
+ style: { "--swatch-color": customColor }
526
+ }
527
+ ),
528
+ /* @__PURE__ */ jsxRuntime.jsx(
529
+ "input",
530
+ {
531
+ type: "color",
532
+ value: customColor,
533
+ onChange: (e) => setCustomColor(e.target.value),
534
+ className: "ds-color-picker__native-input",
535
+ "aria-label": "Pick a custom accent color"
536
+ }
537
+ )
538
+ ]
539
+ }
540
+ )
541
+ ]
542
+ }
543
+ );
544
+ }
545
+ );
546
+ ColorPicker.displayName = "ColorPicker";
547
+ var VoidBackground = React2__default.default.forwardRef(
548
+ ({ showGrid = true, showGrain = true, className, children }, ref) => {
549
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: clsx2__default.default("void", className), children: [
550
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "void__base", "aria-hidden": "true" }),
551
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "void__orbs", "aria-hidden": "true", children: [
552
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "void__orb void__orb--warm" }),
553
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "void__orb void__orb--purple" })
554
+ ] }),
555
+ showGrid && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "void__grid", "aria-hidden": "true" }),
556
+ showGrain && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "void__grain", "aria-hidden": "true" }),
557
+ children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "void__content", children })
558
+ ] });
559
+ }
560
+ );
561
+ VoidBackground.displayName = "VoidBackground";
562
+
563
+ exports.AppearancePanel = AppearancePanel;
564
+ exports.AppearanceProvider = AppearanceProvider;
565
+ exports.ColorPicker = ColorPicker;
566
+ exports.ThemeSelector = ThemeSelector;
567
+ exports.VoidBackground = VoidBackground;
568
+ exports.hexToRgb = hexToRgb;
569
+ exports.initializeAppearance = initializeAppearance;
570
+ exports.prefersReducedMotion = prefersReducedMotion;
571
+ exports.useAppearance = useAppearance;
572
+ //# sourceMappingURL=out.js.map
573
+ //# sourceMappingURL=index.cjs.map