@chellaa/react 0.2.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.
package/dist/index.mjs ADDED
@@ -0,0 +1,495 @@
1
+ import "./styles.css";
2
+ import * as React from 'react';
3
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
+
5
+ // src/theme/ThemeProvider.tsx
6
+ var ThemeContext = React.createContext(
7
+ void 0
8
+ );
9
+ var COLOR_SCHEME_QUERY = "(prefers-color-scheme: dark)";
10
+ function ThemeProvider({
11
+ children,
12
+ defaultTheme = "system",
13
+ storageKey = "chellaa-theme",
14
+ enableSystem = true,
15
+ tokens,
16
+ attribute = "data-theme"
17
+ }) {
18
+ const parentContext = React.useContext(ThemeContext);
19
+ const [theme, setThemeState] = React.useState(() => {
20
+ if (typeof window === "undefined") return defaultTheme;
21
+ try {
22
+ return localStorage.getItem(storageKey) || defaultTheme;
23
+ } catch {
24
+ return defaultTheme;
25
+ }
26
+ });
27
+ const [systemTheme, setSystemTheme] = React.useState(() => {
28
+ if (typeof window === "undefined" || !enableSystem || typeof window.matchMedia !== "function") {
29
+ return void 0;
30
+ }
31
+ return window.matchMedia(COLOR_SCHEME_QUERY).matches ? "dark" : "light";
32
+ });
33
+ const resolvedTheme = React.useMemo(() => {
34
+ if (theme === "system") {
35
+ return systemTheme ?? "light";
36
+ }
37
+ return theme === "dark" ? "dark" : "light";
38
+ }, [theme, systemTheme]);
39
+ React.useEffect(() => {
40
+ if (!enableSystem || typeof window === "undefined" || typeof window.matchMedia !== "function") {
41
+ return;
42
+ }
43
+ const mediaQuery = window.matchMedia(COLOR_SCHEME_QUERY);
44
+ const handleChange = (e) => {
45
+ setSystemTheme(e.matches ? "dark" : "light");
46
+ };
47
+ if (typeof mediaQuery.addEventListener === "function") {
48
+ mediaQuery.addEventListener("change", handleChange);
49
+ return () => mediaQuery.removeEventListener("change", handleChange);
50
+ } else if (typeof mediaQuery.addListener === "function") {
51
+ mediaQuery.addListener(handleChange);
52
+ return () => mediaQuery.removeListener(handleChange);
53
+ }
54
+ }, [enableSystem]);
55
+ React.useEffect(() => {
56
+ if (typeof document === "undefined") return;
57
+ if (!parentContext) {
58
+ const root = document.documentElement;
59
+ root.setAttribute(attribute, resolvedTheme);
60
+ if (tokens) {
61
+ for (const [key, value2] of Object.entries(tokens)) {
62
+ root.style.setProperty(key, value2);
63
+ }
64
+ }
65
+ }
66
+ }, [resolvedTheme, parentContext, attribute, tokens]);
67
+ const setTheme = React.useCallback(
68
+ (newTheme) => {
69
+ setThemeState(newTheme);
70
+ try {
71
+ localStorage.setItem(storageKey, newTheme);
72
+ } catch {
73
+ }
74
+ },
75
+ [storageKey]
76
+ );
77
+ const value = React.useMemo(
78
+ () => ({
79
+ theme,
80
+ setTheme,
81
+ resolvedTheme,
82
+ systemTheme
83
+ }),
84
+ [theme, setTheme, resolvedTheme, systemTheme]
85
+ );
86
+ if (parentContext) {
87
+ const styleObj = tokens ? tokens : void 0;
88
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children: /* @__PURE__ */ jsx(
89
+ "div",
90
+ {
91
+ ...{ [attribute]: resolvedTheme },
92
+ style: styleObj,
93
+ className: "cl-theme-scope",
94
+ children
95
+ }
96
+ ) });
97
+ }
98
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children });
99
+ }
100
+ function useTheme() {
101
+ const context = React.useContext(ThemeContext);
102
+ if (!context) {
103
+ throw new Error(
104
+ "useTheme must be used within a <ThemeProvider>. Wrap your application root in <ThemeProvider>."
105
+ );
106
+ }
107
+ return context;
108
+ }
109
+
110
+ // src/theme/createTheme.ts
111
+ function createTheme(config) {
112
+ const { name, tokens } = config;
113
+ const declarations = Object.entries(tokens).map(([property, value]) => ` ${property}: ${value};`).join("\n");
114
+ const cssText = `[data-theme="${name}"] {
115
+ ${declarations}
116
+ }`;
117
+ return {
118
+ name,
119
+ tokens,
120
+ cssText
121
+ };
122
+ }
123
+ function ThemeScript({
124
+ storageKey = "chellaa-theme",
125
+ defaultTheme = "system",
126
+ attribute = "data-theme",
127
+ nonce
128
+ }) {
129
+ const scriptContent = `(function() {
130
+ try {
131
+ var key = '${storageKey}';
132
+ var def = '${defaultTheme}';
133
+ var attr = '${attribute}';
134
+ var stored = localStorage.getItem(key);
135
+ var theme = stored || def;
136
+ var resolved = theme;
137
+ if (theme === 'system') {
138
+ resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
139
+ }
140
+ document.documentElement.setAttribute(attr, resolved);
141
+ } catch (e) {}
142
+ })();`;
143
+ return /* @__PURE__ */ jsx(
144
+ "script",
145
+ {
146
+ nonce,
147
+ dangerouslySetInnerHTML: { __html: scriptContent },
148
+ suppressHydrationWarning: true
149
+ }
150
+ );
151
+ }
152
+
153
+ // src/utils/classNames.ts
154
+ function classNames(...inputs) {
155
+ const classes = [];
156
+ for (const input of inputs) {
157
+ if (!input && input !== 0) continue;
158
+ if (typeof input === "string" || typeof input === "number") {
159
+ const trimmed = String(input).trim();
160
+ if (trimmed) classes.push(trimmed);
161
+ } else if (Array.isArray(input)) {
162
+ const nested = classNames(...input);
163
+ if (nested) classes.push(nested);
164
+ } else if (typeof input === "object") {
165
+ for (const [key, value] of Object.entries(input)) {
166
+ if (value && key.trim()) {
167
+ classes.push(key.trim());
168
+ }
169
+ }
170
+ }
171
+ }
172
+ return classes.join(" ");
173
+ }
174
+
175
+ // src/utils/composeEventHandlers.ts
176
+ function composeEventHandlers(originalHandler, ourHandler, {
177
+ checkForDefaultPrevented = true
178
+ } = {}) {
179
+ return function handleEvent(event) {
180
+ originalHandler?.(event);
181
+ if (!checkForDefaultPrevented || !event.defaultPrevented) {
182
+ ourHandler?.(event);
183
+ }
184
+ };
185
+ }
186
+ function setRef(ref, value) {
187
+ if (typeof ref === "function") {
188
+ ref(value);
189
+ } else if (ref !== null && ref !== void 0) {
190
+ ref.current = value;
191
+ }
192
+ }
193
+
194
+ // src/primitives/Slot.tsx
195
+ var Slot = React.forwardRef(
196
+ function Slot2(props, forwardedRef) {
197
+ const { children, ...slotProps } = props;
198
+ if (React.isValidElement(children)) {
199
+ return React.cloneElement(
200
+ children,
201
+ mergeProps(
202
+ slotProps,
203
+ children.props,
204
+ forwardedRef,
205
+ getElementRef(children)
206
+ )
207
+ );
208
+ }
209
+ if (React.Children.count(children) > 1) {
210
+ React.Children.only(null);
211
+ }
212
+ return null;
213
+ }
214
+ );
215
+ Slot.displayName = "Slot";
216
+ function getElementRef(element) {
217
+ const elementRef = element?.ref;
218
+ if (elementRef !== void 0) {
219
+ return elementRef;
220
+ }
221
+ return element.props?.ref;
222
+ }
223
+ function mergeProps(slotProps, childProps, slotRef, childRef) {
224
+ const overrideProps = { ...childProps };
225
+ for (const propName in slotProps) {
226
+ const slotPropValue = slotProps[propName];
227
+ const childPropValue = childProps[propName];
228
+ const isEventHandler = /^on[A-Z]/.test(propName);
229
+ if (isEventHandler) {
230
+ if (typeof slotPropValue === "function" && typeof childPropValue === "function") {
231
+ overrideProps[propName] = composeEventHandlers(
232
+ childPropValue,
233
+ slotPropValue
234
+ );
235
+ } else if (typeof slotPropValue === "function") {
236
+ overrideProps[propName] = slotPropValue;
237
+ }
238
+ } else if (propName === "className") {
239
+ overrideProps[propName] = classNames(
240
+ slotPropValue,
241
+ childPropValue
242
+ );
243
+ } else if (propName === "style") {
244
+ overrideProps[propName] = {
245
+ ...slotPropValue,
246
+ ...childPropValue
247
+ };
248
+ } else {
249
+ overrideProps[propName] = slotPropValue !== void 0 ? slotPropValue : childPropValue;
250
+ }
251
+ }
252
+ overrideProps.ref = (node) => {
253
+ setRef(childRef, node);
254
+ setRef(slotRef, node);
255
+ };
256
+ return overrideProps;
257
+ }
258
+ var ButtonGroupContext = React.createContext(void 0);
259
+ function useButtonGroupContext() {
260
+ return React.useContext(ButtonGroupContext);
261
+ }
262
+ function ButtonSpinner() {
263
+ return /* @__PURE__ */ jsxs(
264
+ "svg",
265
+ {
266
+ className: "cl-button__spinner",
267
+ viewBox: "0 0 24 24",
268
+ fill: "none",
269
+ xmlns: "http://www.w3.org/2000/svg",
270
+ "aria-hidden": "true",
271
+ children: [
272
+ /* @__PURE__ */ jsx(
273
+ "circle",
274
+ {
275
+ cx: "12",
276
+ cy: "12",
277
+ r: "9",
278
+ stroke: "currentColor",
279
+ strokeWidth: "2.5",
280
+ strokeOpacity: "0.25"
281
+ }
282
+ ),
283
+ /* @__PURE__ */ jsx(
284
+ "path",
285
+ {
286
+ d: "M12 3a9 9 0 0 1 9 9",
287
+ stroke: "currentColor",
288
+ strokeWidth: "2.5",
289
+ strokeLinecap: "round"
290
+ }
291
+ )
292
+ ]
293
+ }
294
+ );
295
+ }
296
+ var Button = React.forwardRef(
297
+ function Button2(props, forwardedRef) {
298
+ const {
299
+ asChild = false,
300
+ variant: variantProp,
301
+ size: sizeProp,
302
+ colorScheme: colorSchemeProp,
303
+ isLoading = false,
304
+ loadingText,
305
+ loadingPosition = "start",
306
+ isDisabled: isDisabledProp,
307
+ isFullWidth = false,
308
+ startIcon,
309
+ endIcon,
310
+ className,
311
+ children,
312
+ disabled: disabledProp,
313
+ type = "button",
314
+ onClick,
315
+ onKeyDown,
316
+ ...restProps
317
+ } = props;
318
+ const buttonGroup = useButtonGroupContext();
319
+ const variant = variantProp ?? buttonGroup?.variant ?? "solid";
320
+ const size = sizeProp ?? buttonGroup?.size ?? "md";
321
+ const colorScheme = colorSchemeProp ?? buttonGroup?.colorScheme ?? "primary";
322
+ const isDisabled = isDisabledProp ?? disabledProp ?? buttonGroup?.isDisabled ?? false;
323
+ const isEffectivelyDisabled = isDisabled || isLoading;
324
+ const handleClick = (event) => {
325
+ if (isEffectivelyDisabled) {
326
+ event.preventDefault();
327
+ event.stopPropagation();
328
+ return;
329
+ }
330
+ onClick?.(event);
331
+ };
332
+ const handleKeyDown = (event) => {
333
+ if (isEffectivelyDisabled) {
334
+ if (event.key === " " || event.key === "Enter") {
335
+ event.preventDefault();
336
+ event.stopPropagation();
337
+ return;
338
+ }
339
+ }
340
+ onKeyDown?.(event);
341
+ };
342
+ const buttonClassName = classNames(
343
+ "cl-button",
344
+ `cl-button--${variant}`,
345
+ `cl-button--${size}`,
346
+ `cl-button--${colorScheme}`,
347
+ isLoading && "cl-button--loading",
348
+ isDisabled && "cl-button--disabled",
349
+ isFullWidth && "cl-button--full-width",
350
+ className
351
+ );
352
+ const spinner = /* @__PURE__ */ jsx(ButtonSpinner, {});
353
+ if (asChild) {
354
+ return /* @__PURE__ */ jsx(
355
+ Slot,
356
+ {
357
+ ref: forwardedRef,
358
+ className: buttonClassName,
359
+ "aria-disabled": isEffectivelyDisabled ? true : void 0,
360
+ "aria-busy": isLoading ? true : void 0,
361
+ onClick: handleClick,
362
+ onKeyDown: handleKeyDown,
363
+ ...restProps,
364
+ children
365
+ }
366
+ );
367
+ }
368
+ const isCenterLoading = isLoading && loadingPosition === "center";
369
+ return /* @__PURE__ */ jsx(
370
+ "button",
371
+ {
372
+ ref: forwardedRef,
373
+ type,
374
+ disabled: isEffectivelyDisabled ? true : void 0,
375
+ "aria-disabled": isEffectivelyDisabled ? true : void 0,
376
+ "aria-busy": isLoading ? true : void 0,
377
+ className: buttonClassName,
378
+ onClick: handleClick,
379
+ onKeyDown: handleKeyDown,
380
+ ...restProps,
381
+ children: isCenterLoading ? /* @__PURE__ */ jsxs(Fragment, { children: [
382
+ /* @__PURE__ */ jsx("span", { className: "cl-button__spinner-wrapper--center", children: spinner }),
383
+ /* @__PURE__ */ jsxs("span", { className: "cl-button__content--hidden", children: [
384
+ startIcon && /* @__PURE__ */ jsx(
385
+ "span",
386
+ {
387
+ className: "cl-button__icon cl-button__icon--start",
388
+ "aria-hidden": "true",
389
+ children: startIcon
390
+ }
391
+ ),
392
+ children !== void 0 && /* @__PURE__ */ jsx("span", { className: "cl-button__label", children }),
393
+ endIcon && /* @__PURE__ */ jsx(
394
+ "span",
395
+ {
396
+ className: "cl-button__icon cl-button__icon--end",
397
+ "aria-hidden": "true",
398
+ children: endIcon
399
+ }
400
+ )
401
+ ] })
402
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
403
+ isLoading && loadingPosition === "start" && spinner,
404
+ !isLoading && startIcon && /* @__PURE__ */ jsx(
405
+ "span",
406
+ {
407
+ className: "cl-button__icon cl-button__icon--start",
408
+ "aria-hidden": "true",
409
+ children: startIcon
410
+ }
411
+ ),
412
+ isLoading && loadingText ? /* @__PURE__ */ jsx("span", { className: "cl-button__label", children: loadingText }) : children !== void 0 ? /* @__PURE__ */ jsx("span", { className: "cl-button__label", children }) : null,
413
+ isLoading && loadingPosition === "end" && spinner,
414
+ !isLoading && endIcon && /* @__PURE__ */ jsx(
415
+ "span",
416
+ {
417
+ className: "cl-button__icon cl-button__icon--end",
418
+ "aria-hidden": "true",
419
+ children: endIcon
420
+ }
421
+ )
422
+ ] })
423
+ }
424
+ );
425
+ }
426
+ );
427
+ Button.displayName = "Button";
428
+ var ButtonGroup = React.forwardRef(
429
+ function ButtonGroup2(props, forwardedRef) {
430
+ const {
431
+ asChild = false,
432
+ size,
433
+ variant,
434
+ colorScheme,
435
+ isDisabled,
436
+ isAttached = false,
437
+ orientation = "horizontal",
438
+ spacing,
439
+ className,
440
+ style,
441
+ children,
442
+ role: roleProp,
443
+ ...restProps
444
+ } = props;
445
+ const role = roleProp !== void 0 ? roleProp : asChild ? void 0 : "group";
446
+ const contextValue = React.useMemo(
447
+ () => ({
448
+ size,
449
+ variant,
450
+ colorScheme,
451
+ isDisabled
452
+ }),
453
+ [size, variant, colorScheme, isDisabled]
454
+ );
455
+ const groupClassName = classNames(
456
+ "cl-button-group",
457
+ `cl-button-group--${orientation}`,
458
+ isAttached && "cl-button-group--attached",
459
+ className
460
+ );
461
+ const groupStyle = {
462
+ ...style,
463
+ ...spacing !== void 0 && !isAttached ? { gap: typeof spacing === "number" ? `${spacing}px` : spacing } : {}
464
+ };
465
+ if (asChild) {
466
+ return /* @__PURE__ */ jsx(ButtonGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
467
+ Slot,
468
+ {
469
+ ref: forwardedRef,
470
+ role,
471
+ className: groupClassName,
472
+ style: groupStyle,
473
+ ...restProps,
474
+ children
475
+ }
476
+ ) });
477
+ }
478
+ return /* @__PURE__ */ jsx(ButtonGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
479
+ "div",
480
+ {
481
+ ref: forwardedRef,
482
+ role,
483
+ className: groupClassName,
484
+ style: groupStyle,
485
+ ...restProps,
486
+ children
487
+ }
488
+ ) });
489
+ }
490
+ );
491
+ ButtonGroup.displayName = "ButtonGroup";
492
+
493
+ export { Button, ButtonGroup, ButtonGroupContext, ThemeProvider, ThemeScript, createTheme, useButtonGroupContext, useTheme };
494
+ //# sourceMappingURL=index.mjs.map
495
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme/ThemeProvider.tsx","../src/theme/useTheme.ts","../src/theme/createTheme.ts","../src/theme/ThemeScript.tsx","../src/utils/classNames.ts","../src/utils/composeEventHandlers.ts","../src/hooks/useMergeRefs.ts","../src/primitives/Slot.tsx","../src/components/ButtonGroup/ButtonGroupContext.ts","../src/components/Button/Button.tsx","../src/components/ButtonGroup/ButtonGroup.tsx"],"names":["value","React2","jsx","React4","Slot","React5","React6","Button","React7","ButtonGroup"],"mappings":"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","file":"index.mjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\" | string;\n\nexport interface ThemeContextValue {\n theme: ThemeMode;\n setTheme: (theme: ThemeMode) => void;\n resolvedTheme: \"light\" | \"dark\";\n systemTheme: \"light\" | \"dark\" | undefined;\n}\n\nexport const ThemeContext = React.createContext<ThemeContextValue | undefined>(\n undefined,\n);\n\nexport interface ThemeProviderProps {\n children?: React.ReactNode;\n defaultTheme?: ThemeMode;\n storageKey?: string;\n enableSystem?: boolean;\n tokens?: Record<string, string>;\n attribute?: string;\n}\n\nconst COLOR_SCHEME_QUERY = \"(prefers-color-scheme: dark)\";\n\nexport function ThemeProvider({\n children,\n defaultTheme = \"system\",\n storageKey = \"chellaa-theme\",\n enableSystem = true,\n tokens,\n attribute = \"data-theme\",\n}: ThemeProviderProps) {\n // Check if we are inside a parent ThemeProvider (nested scope)\n const parentContext = React.useContext(ThemeContext);\n\n const [theme, setThemeState] = React.useState<ThemeMode>(() => {\n if (typeof window === \"undefined\") return defaultTheme;\n try {\n return (localStorage.getItem(storageKey) as ThemeMode) || defaultTheme;\n } catch {\n return defaultTheme;\n }\n });\n\n const [systemTheme, setSystemTheme] = React.useState<\n \"light\" | \"dark\" | undefined\n >(() => {\n if (\n typeof window === \"undefined\" ||\n !enableSystem ||\n typeof window.matchMedia !== \"function\"\n ) {\n return undefined;\n }\n return window.matchMedia(COLOR_SCHEME_QUERY).matches ? \"dark\" : \"light\";\n });\n\n // Calculate resolved theme\n const resolvedTheme: \"light\" | \"dark\" = React.useMemo(() => {\n if (theme === \"system\") {\n return systemTheme ?? \"light\";\n }\n return theme === \"dark\" ? \"dark\" : \"light\";\n }, [theme, systemTheme]);\n\n // Listen for OS system theme changes\n React.useEffect(() => {\n if (\n !enableSystem ||\n typeof window === \"undefined\" ||\n typeof window.matchMedia !== \"function\"\n ) {\n return;\n }\n\n const mediaQuery = window.matchMedia(COLOR_SCHEME_QUERY);\n const handleChange = (e: MediaQueryListEvent) => {\n setSystemTheme(e.matches ? \"dark\" : \"light\");\n };\n\n if (typeof mediaQuery.addEventListener === \"function\") {\n mediaQuery.addEventListener(\"change\", handleChange);\n return () => mediaQuery.removeEventListener(\"change\", handleChange);\n } else if (\n typeof (\n mediaQuery as {\n addListener?: (cb: (e: MediaQueryListEvent) => void) => void;\n }\n ).addListener === \"function\"\n ) {\n // Legacy Safari / older browser fallback\n (\n mediaQuery as {\n addListener: (cb: (e: MediaQueryListEvent) => void) => void;\n }\n ).addListener(handleChange);\n return () =>\n (\n mediaQuery as {\n removeListener: (cb: (e: MediaQueryListEvent) => void) => void;\n }\n ).removeListener(handleChange);\n }\n }, [enableSystem]);\n\n // Apply theme to DOM\n React.useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n // If root ThemeProvider, apply to documentElement\n if (!parentContext) {\n const root = document.documentElement;\n root.setAttribute(attribute, resolvedTheme);\n\n if (tokens) {\n for (const [key, value] of Object.entries(tokens)) {\n root.style.setProperty(key, value);\n }\n }\n }\n }, [resolvedTheme, parentContext, attribute, tokens]);\n\n const setTheme = React.useCallback(\n (newTheme: ThemeMode) => {\n setThemeState(newTheme);\n try {\n localStorage.setItem(storageKey, newTheme);\n } catch {\n // Ignore localStorage errors (e.g. private browsing mode)\n }\n },\n [storageKey],\n );\n\n const value = React.useMemo<ThemeContextValue>(\n () => ({\n theme,\n setTheme,\n resolvedTheme,\n systemTheme,\n }),\n [theme, setTheme, resolvedTheme, systemTheme],\n );\n\n // If this is a nested ThemeProvider, render a container element with the local theme attribute\n if (parentContext) {\n const styleObj = tokens\n ? (tokens as unknown as React.CSSProperties)\n : undefined;\n\n return (\n <ThemeContext.Provider value={value}>\n <div\n {...{ [attribute]: resolvedTheme }}\n style={styleObj}\n className=\"cl-theme-scope\"\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n }\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { ThemeContext, type ThemeContextValue } from \"./ThemeProvider\";\n\n/**\n * Accesses the active theme context, allowing components to read and update\n * the current theme mode (`light`, `dark`, `system`), resolved theme, and system preference.\n */\nexport function useTheme(): ThemeContextValue {\n const context = React.useContext(ThemeContext);\n\n if (!context) {\n throw new Error(\n \"useTheme must be used within a <ThemeProvider>. Wrap your application root in <ThemeProvider>.\",\n );\n }\n\n return context;\n}\n","export interface CustomThemeConfig {\n name: string;\n tokens: Record<string, string>;\n}\n\nexport interface CustomThemeResult {\n name: string;\n tokens: Record<string, string>;\n cssText: string;\n}\n\n/**\n * Creates a structured custom theme definition and compiles it to valid CSS custom property text.\n *\n * @example\n * const emeraldTheme = createTheme({\n * name: 'emerald',\n * tokens: {\n * '--cl-color-primary-base': '#059669',\n * '--cl-color-primary-hover': '#047857',\n * }\n * });\n */\nexport function createTheme(config: CustomThemeConfig): CustomThemeResult {\n const { name, tokens } = config;\n\n const declarations = Object.entries(tokens)\n .map(([property, value]) => ` ${property}: ${value};`)\n .join(\"\\n\");\n\n const cssText = `[data-theme=\"${name}\"] {\\n${declarations}\\n}`;\n\n return {\n name,\n tokens,\n cssText,\n };\n}\n","export interface ThemeScriptProps {\n storageKey?: string;\n defaultTheme?: string;\n attribute?: string;\n nonce?: string;\n}\n\n/**\n * Inline synchronous script that prevents theme flash (FOUC) during SSR page load.\n * Place inside the `<head>` of your application layout.\n */\nexport function ThemeScript({\n storageKey = \"chellaa-theme\",\n defaultTheme = \"system\",\n attribute = \"data-theme\",\n nonce,\n}: ThemeScriptProps) {\n const scriptContent = `(function() {\n try {\n var key = '${storageKey}';\n var def = '${defaultTheme}';\n var attr = '${attribute}';\n var stored = localStorage.getItem(key);\n var theme = stored || def;\n var resolved = theme;\n if (theme === 'system') {\n resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n document.documentElement.setAttribute(attr, resolved);\n } catch (e) {}\n})();`;\n\n return (\n <script\n nonce={nonce}\n dangerouslySetInnerHTML={{ __html: scriptContent }}\n suppressHydrationWarning\n />\n );\n}\n","export type ClassValue =\n | string\n | number\n | boolean\n | undefined\n | null\n | Record<string, boolean | number | undefined | null>\n | ClassValue[];\n\n/**\n * Combines multiple conditional class names into a clean space-delimited string.\n * Zero external runtime dependencies.\n *\n * @example\n * classNames('cl-button', isActive && 'cl-button--active', { 'cl-button--disabled': isDisabled });\n */\nexport function classNames(...inputs: ClassValue[]): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input && input !== 0) continue;\n\n if (typeof input === \"string\" || typeof input === \"number\") {\n const trimmed = String(input).trim();\n if (trimmed) classes.push(trimmed);\n } else if (Array.isArray(input)) {\n const nested = classNames(...input);\n if (nested) classes.push(nested);\n } else if (typeof input === \"object\") {\n for (const [key, value] of Object.entries(input)) {\n if (value && key.trim()) {\n classes.push(key.trim());\n }\n }\n }\n }\n\n return classes.join(\" \");\n}\n","/**\n * Composes an optional consumer event handler with an internal library event handler.\n * If the consumer handler calls event.preventDefault(), the internal handler is skipped,\n * preserving consumer control over event delegation.\n *\n * @param originalHandler Optional consumer-provided event handler\n * @param ourHandler Internal component event handler\n * @param options Configuration options\n */\nexport function composeEventHandlers<E extends { defaultPrevented: boolean }>(\n originalHandler?: ((event: E) => void) | undefined,\n ourHandler?: ((event: E) => void) | undefined,\n {\n checkForDefaultPrevented = true,\n }: { checkForDefaultPrevented?: boolean } = {},\n): (event: E) => void {\n return function handleEvent(event: E) {\n originalHandler?.(event);\n\n if (!checkForDefaultPrevented || !event.defaultPrevented) {\n ourHandler?.(event);\n }\n };\n}\n","import * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Assigns a value to a React ref (either RefCallback or MutableRefObject).\n */\nexport function setRef<T>(ref: PossibleRef<T>, value: T | null): void {\n if (typeof ref === \"function\") {\n ref(value);\n } else if (ref !== null && ref !== undefined) {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n}\n\n/**\n * Combines multiple React refs into a single RefCallback.\n * Handles both object refs and callback refs, with proper unmount cleanup.\n */\nexport function useMergeRefs<T>(\n ...refs: PossibleRef<T>[]\n): React.RefCallback<T> {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return React.useCallback((current: T | null) => {\n for (const ref of refs) {\n setRef(ref, current);\n }\n }, refs);\n}\n","import * as React from \"react\";\nimport { classNames } from \"../utils/classNames\";\nimport { composeEventHandlers } from \"../utils/composeEventHandlers\";\nimport { setRef } from \"../hooks/useMergeRefs\";\n\nexport interface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/**\n * Merges Slot props onto its immediate child element.\n * Preserves child identity, merges classNames, styles, ref forwarding, and event handlers.\n */\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(\n function Slot(props, forwardedRef) {\n const { children, ...slotProps } = props;\n\n if (React.isValidElement(children)) {\n return React.cloneElement(\n children,\n mergeProps(\n slotProps,\n children.props as Record<string, unknown>,\n forwardedRef,\n getElementRef(children),\n ),\n );\n }\n\n if (React.Children.count(children) > 1) {\n React.Children.only(null); // Will throw informative React.Children.only error\n }\n\n return null;\n },\n);\n\nSlot.displayName = \"Slot\";\n\n/**\n * Extracts a ref from a React element across React 18 and React 19.\n */\nfunction getElementRef(\n element: React.ReactElement,\n): React.Ref<HTMLElement> | undefined {\n // In React 18 and earlier, ref is a property on the element instance.\n // In React 19, ref is passed as a standard prop.\n // Checking element.ref first avoids the React 18 special-props warning.\n const elementRef = (element as unknown as { ref?: React.Ref<HTMLElement> })\n ?.ref;\n if (elementRef !== undefined) {\n return elementRef;\n }\n return (element.props as { ref?: React.Ref<HTMLElement> })?.ref;\n}\n\n/**\n * Merges slot parent props with child props.\n */\nfunction mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>,\n slotRef: React.Ref<HTMLElement>,\n childRef?: React.Ref<HTMLElement>,\n): Record<string, unknown> {\n const overrideProps: Record<string, unknown> = { ...childProps };\n\n for (const propName in slotProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n\n const isEventHandler = /^on[A-Z]/.test(propName);\n\n if (isEventHandler) {\n if (\n typeof slotPropValue === \"function\" &&\n typeof childPropValue === \"function\"\n ) {\n overrideProps[propName] = composeEventHandlers(\n childPropValue as (event: { defaultPrevented: boolean }) => void,\n slotPropValue as (event: { defaultPrevented: boolean }) => void,\n );\n } else if (typeof slotPropValue === \"function\") {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"className\") {\n overrideProps[propName] = classNames(\n slotPropValue as string | undefined,\n childPropValue as string | undefined,\n );\n } else if (propName === \"style\") {\n overrideProps[propName] = {\n ...(slotPropValue as React.CSSProperties | undefined),\n ...(childPropValue as React.CSSProperties | undefined),\n };\n } else {\n overrideProps[propName] =\n slotPropValue !== undefined ? slotPropValue : childPropValue;\n }\n }\n\n // Ref merging\n overrideProps.ref = (node: HTMLElement | null) => {\n setRef(childRef, node);\n setRef(slotRef, node);\n };\n\n return overrideProps;\n}\n","import * as React from \"react\";\nimport type { ButtonGroupContextValue } from \"./ButtonGroup.types\";\n\nexport const ButtonGroupContext = React.createContext<\n ButtonGroupContextValue | undefined\n>(undefined);\n\n/**\n * Hook to access parent ButtonGroup context if present.\n */\nexport function useButtonGroupContext(): ButtonGroupContextValue | undefined {\n return React.useContext(ButtonGroupContext);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"../../primitives/Slot\";\nimport { classNames } from \"../../utils/classNames\";\nimport { useButtonGroupContext } from \"../ButtonGroup/ButtonGroupContext\";\nimport type { ButtonProps } from \"./Button.types\";\n\n/**\n * Animated SVG spinner for loading states.\n */\nfunction ButtonSpinner() {\n return (\n <svg\n className=\"cl-button__spinner\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeOpacity=\"0.25\"\n />\n <path\n d=\"M12 3a9 9 0 0 1 9 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/**\n * Chellaa React Button component.\n *\n * Fundamental action primitive supporting 5 variants, 5 sizes, 7 color schemes,\n * loading states, icons, keyboard interaction, and polymorphic slot delegation via `asChild`.\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n function Button(props, forwardedRef) {\n const {\n asChild = false,\n variant: variantProp,\n size: sizeProp,\n colorScheme: colorSchemeProp,\n isLoading = false,\n loadingText,\n loadingPosition = \"start\",\n isDisabled: isDisabledProp,\n isFullWidth = false,\n startIcon,\n endIcon,\n className,\n children,\n disabled: disabledProp,\n type = \"button\",\n onClick,\n onKeyDown,\n ...restProps\n } = props;\n\n const buttonGroup = useButtonGroupContext();\n\n const variant = variantProp ?? buttonGroup?.variant ?? \"solid\";\n const size = sizeProp ?? buttonGroup?.size ?? \"md\";\n const colorScheme =\n colorSchemeProp ?? buttonGroup?.colorScheme ?? \"primary\";\n const isDisabled =\n isDisabledProp ?? disabledProp ?? buttonGroup?.isDisabled ?? false;\n const isEffectivelyDisabled = isDisabled || isLoading;\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (isEffectivelyDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n onClick?.(event);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n if (isEffectivelyDisabled) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n onKeyDown?.(event);\n };\n\n const buttonClassName = classNames(\n \"cl-button\",\n `cl-button--${variant}`,\n `cl-button--${size}`,\n `cl-button--${colorScheme}`,\n isLoading && \"cl-button--loading\",\n isDisabled && \"cl-button--disabled\",\n isFullWidth && \"cl-button--full-width\",\n className,\n );\n\n const spinner = <ButtonSpinner />;\n\n // When asChild is enabled, delegate root rendering to child via Slot\n if (asChild) {\n return (\n <Slot\n ref={forwardedRef as React.Ref<HTMLElement>}\n className={buttonClassName}\n aria-disabled={isEffectivelyDisabled ? true : undefined}\n aria-busy={isLoading ? true : undefined}\n onClick={\n handleClick as unknown as React.MouseEventHandler<HTMLElement>\n }\n onKeyDown={\n handleKeyDown as unknown as React.KeyboardEventHandler<HTMLElement>\n }\n {...restProps}\n >\n {children}\n </Slot>\n );\n }\n\n // Center loading state: keep button dimensions identical by visually hiding label\n const isCenterLoading = isLoading && loadingPosition === \"center\";\n\n return (\n <button\n ref={forwardedRef}\n type={type}\n disabled={isEffectivelyDisabled ? true : undefined}\n aria-disabled={isEffectivelyDisabled ? true : undefined}\n aria-busy={isLoading ? true : undefined}\n className={buttonClassName}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...restProps}\n >\n {isCenterLoading ? (\n <>\n <span className=\"cl-button__spinner-wrapper--center\">\n {spinner}\n </span>\n <span className=\"cl-button__content--hidden\">\n {startIcon && (\n <span\n className=\"cl-button__icon cl-button__icon--start\"\n aria-hidden=\"true\"\n >\n {startIcon}\n </span>\n )}\n {children !== undefined && (\n <span className=\"cl-button__label\">{children}</span>\n )}\n {endIcon && (\n <span\n className=\"cl-button__icon cl-button__icon--end\"\n aria-hidden=\"true\"\n >\n {endIcon}\n </span>\n )}\n </span>\n </>\n ) : (\n <>\n {isLoading && loadingPosition === \"start\" && spinner}\n {!isLoading && startIcon && (\n <span\n className=\"cl-button__icon cl-button__icon--start\"\n aria-hidden=\"true\"\n >\n {startIcon}\n </span>\n )}\n {isLoading && loadingText ? (\n <span className=\"cl-button__label\">{loadingText}</span>\n ) : children !== undefined ? (\n <span className=\"cl-button__label\">{children}</span>\n ) : null}\n {isLoading && loadingPosition === \"end\" && spinner}\n {!isLoading && endIcon && (\n <span\n className=\"cl-button__icon cl-button__icon--end\"\n aria-hidden=\"true\"\n >\n {endIcon}\n </span>\n )}\n </>\n )}\n </button>\n );\n },\n);\n\nButton.displayName = \"Button\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"../../primitives/Slot\";\nimport { classNames } from \"../../utils/classNames\";\nimport type {\n ButtonGroupContextValue,\n ButtonGroupProps,\n} from \"./ButtonGroup.types\";\nimport { ButtonGroupContext } from \"./ButtonGroupContext\";\n\n/**\n * Chellaa React ButtonGroup component.\n *\n * Container primitive for grouping related buttons with unified sizing,\n * visual variants, color schemes, disabled states, and attached border management.\n */\nexport const ButtonGroup = React.forwardRef<HTMLDivElement, ButtonGroupProps>(\n function ButtonGroup(props, forwardedRef) {\n const {\n asChild = false,\n size,\n variant,\n colorScheme,\n isDisabled,\n isAttached = false,\n orientation = \"horizontal\",\n spacing,\n className,\n style,\n children,\n role: roleProp,\n ...restProps\n } = props;\n\n const role =\n roleProp !== undefined ? roleProp : asChild ? undefined : \"group\";\n\n const contextValue = React.useMemo<ButtonGroupContextValue>(\n () => ({\n size,\n variant,\n colorScheme,\n isDisabled,\n }),\n [size, variant, colorScheme, isDisabled],\n );\n\n const groupClassName = classNames(\n \"cl-button-group\",\n `cl-button-group--${orientation}`,\n isAttached && \"cl-button-group--attached\",\n className,\n );\n\n const groupStyle: React.CSSProperties = {\n ...style,\n ...(spacing !== undefined && !isAttached\n ? { gap: typeof spacing === \"number\" ? `${spacing}px` : spacing }\n : {}),\n };\n\n if (asChild) {\n return (\n <ButtonGroupContext.Provider value={contextValue}>\n <Slot\n ref={forwardedRef as React.Ref<HTMLElement>}\n role={role}\n className={groupClassName}\n style={groupStyle}\n {...restProps}\n >\n {children}\n </Slot>\n </ButtonGroupContext.Provider>\n );\n }\n\n return (\n <ButtonGroupContext.Provider value={contextValue}>\n <div\n ref={forwardedRef}\n role={role}\n className={groupClassName}\n style={groupStyle}\n {...restProps}\n >\n {children}\n </div>\n </ButtonGroupContext.Provider>\n );\n },\n);\n\nButtonGroup.displayName = \"ButtonGroup\";\n"]}