@david-richard/notify-ds 1.0.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.js ADDED
@@ -0,0 +1,1000 @@
1
+ 'use strict';
2
+
3
+ var React4 = require('react');
4
+ var reactSlot = require('@radix-ui/react-slot');
5
+ var classVarianceAuthority = require('class-variance-authority');
6
+ var clsx = require('clsx');
7
+ var tailwindMerge = require('tailwind-merge');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var React4__namespace = /*#__PURE__*/_interopNamespace(React4);
29
+
30
+ // components/button.tsx
31
+ function cn(...inputs) {
32
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
33
+ }
34
+ var buttonVariants = classVarianceAuthority.cva(
35
+ [
36
+ // base
37
+ "inline-flex items-center justify-center whitespace-nowrap select-none",
38
+ "rounded-[var(--button-radius)] font-medium font-[var(--font-family-secondary)]",
39
+ // Red Hat Text Medium per spec
40
+ "transition-colors duration-[var(--p-duration-fast)] ease-[var(--p-easing-standard)]",
41
+ "outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-ring)] focus-visible:ring-offset-2",
42
+ "disabled:pointer-events-none disabled:opacity-[var(--p-opacity-disabled)]",
43
+ // icon child sizing
44
+ "[&_svg]:shrink-0"
45
+ ],
46
+ {
47
+ variants: {
48
+ variant: {
49
+ primary: [
50
+ "bg-[var(--color-primary)] text-[var(--color-primary-foreground)]",
51
+ "hover:bg-[var(--color-primary-hover)] active:bg-[var(--color-primary-pressed)]",
52
+ "data-[state=inactive]:bg-[var(--color-inactive)] data-[state=inactive]:text-[var(--color-inactive-foreground)]"
53
+ ],
54
+ secondary: [
55
+ "bg-transparent text-[var(--color-secondary-foreground)]",
56
+ "border border-[var(--color-secondary-border)]",
57
+ "hover:bg-[var(--color-secondary-hover)] active:bg-[var(--color-secondary-pressed)]",
58
+ "data-[state=inactive]:text-[var(--color-inactive-foreground)] data-[state=inactive]:border-[var(--color-inactive-border)]"
59
+ ],
60
+ tertiary: [
61
+ "bg-transparent text-[var(--color-tertiary-foreground)]",
62
+ "hover:bg-[var(--color-tertiary-hover)]",
63
+ "data-[state=inactive]:text-[var(--color-inactive-foreground)]"
64
+ ],
65
+ link: [
66
+ "bg-transparent text-[var(--color-link-foreground)] underline underline-offset-4",
67
+ "hover:decoration-2",
68
+ "data-[state=inactive]:text-[var(--color-inactive-foreground)]"
69
+ ]
70
+ },
71
+ size: {
72
+ xsm: "h-[var(--button-xsm-h)] px-[var(--button-xsm-px)] gap-[var(--button-xsm-gap)] text-[length:var(--button-xsm-fs)] leading-[var(--button-xsm-lh)] [&_svg]:size-3",
73
+ sm: "h-[var(--button-sm-h)] px-[var(--button-sm-px)] gap-[var(--button-sm-gap)] text-[length:var(--button-sm-fs)] leading-[var(--button-sm-lh)] [&_svg]:size-[14px]",
74
+ md: "h-[var(--button-md-h)] px-[var(--button-md-px)] gap-[var(--button-md-gap)] text-[length:var(--button-md-fs)] leading-[var(--button-md-lh)] [&_svg]:size-4",
75
+ lg: "h-[var(--button-lg-h)] px-[var(--button-lg-px)] gap-[var(--button-lg-gap)] text-[length:var(--button-lg-fs)] leading-[var(--button-lg-lh)] [&_svg]:size-5"
76
+ },
77
+ iconOnly: {
78
+ true: "px-0 aspect-square rounded-[var(--button-icon-radius)]",
79
+ false: ""
80
+ }
81
+ },
82
+ compoundVariants: [
83
+ // Link variant has no horizontal padding — it's text-like.
84
+ { variant: "link", iconOnly: false, class: "px-0 h-auto" },
85
+ // Tertiary should hug its text vertically.
86
+ { variant: "tertiary", iconOnly: false, class: "" }
87
+ ],
88
+ defaultVariants: {
89
+ variant: "primary",
90
+ size: "md",
91
+ iconOnly: false
92
+ }
93
+ }
94
+ );
95
+ var Button = React4__namespace.forwardRef(
96
+ ({ className, variant, size, iconOnly, state = "active", asChild = false, ...props }, ref) => {
97
+ const Comp = asChild ? reactSlot.Slot : "button";
98
+ return /* @__PURE__ */ jsxRuntime.jsx(
99
+ Comp,
100
+ {
101
+ ref,
102
+ "data-state": state,
103
+ className: cn(buttonVariants({ variant, size, iconOnly }), className),
104
+ ...props
105
+ }
106
+ );
107
+ }
108
+ );
109
+ Button.displayName = "Button";
110
+ var IconButton = React4__namespace.forwardRef(
111
+ (props, ref) => /* @__PURE__ */ jsxRuntime.jsx(Button, { ref, iconOnly: true, ...props })
112
+ );
113
+ IconButton.displayName = "IconButton";
114
+ var pillVariants = classVarianceAuthority.cva(
115
+ [
116
+ "flex items-center gap-2",
117
+ "h-12 w-full rounded-full px-4",
118
+ "border-[1.5px] bg-[var(--color-input-bg,#fff)]",
119
+ "transition-colors duration-[120ms]"
120
+ ],
121
+ {
122
+ variants: {
123
+ state: {
124
+ normal: "border-[var(--color-input-border-default,#C9C9C9)]",
125
+ active: "border-[var(--color-input-border-active,#40CCF2)] ring-0",
126
+ filled: "border-[var(--color-input-border-default,#C9C9C9)]",
127
+ error: "border-[var(--color-input-border-error,#EF2149)]",
128
+ disabled: "border-[var(--color-input-border-default,#C9C9C9)] bg-[var(--color-input-bg-disabled,#F4F4F4)] cursor-not-allowed opacity-50",
129
+ readonly: "border-[var(--color-input-border-default,#C9C9C9)] bg-[var(--color-input-bg-disabled,#F4F4F4)]"
130
+ }
131
+ },
132
+ defaultVariants: { state: "normal" }
133
+ }
134
+ );
135
+ var InputField = React4__namespace.forwardRef(
136
+ ({
137
+ type = "default",
138
+ state: stateProp,
139
+ label,
140
+ required,
141
+ helperText,
142
+ errorMessage,
143
+ rightSlot,
144
+ className,
145
+ onFocus,
146
+ onBlur,
147
+ onChange,
148
+ value,
149
+ defaultValue,
150
+ disabled,
151
+ readOnly,
152
+ placeholder,
153
+ ...props
154
+ }, ref) => {
155
+ const [focused, setFocused] = React4__namespace.useState(false);
156
+ const [hasValue, setHasValue] = React4__namespace.useState(!!defaultValue || !!value);
157
+ const [showPassword, setShowPassword] = React4__namespace.useState(false);
158
+ const state = stateProp ?? (disabled ? "disabled" : readOnly ? "readonly" : errorMessage ? "error" : focused ? "active" : hasValue ? "filled" : "normal");
159
+ const nativeType = type === "password" ? showPassword ? "text" : "password" : type === "search" ? "search" : "text";
160
+ const handleFocus = (e) => {
161
+ setFocused(true);
162
+ onFocus?.(e);
163
+ };
164
+ const handleBlur = (e) => {
165
+ setFocused(false);
166
+ onBlur?.(e);
167
+ };
168
+ const handleChange = (e) => {
169
+ setHasValue(e.target.value.length > 0);
170
+ onChange?.(e);
171
+ };
172
+ const iconColor = state === "active" ? "text-[var(--color-input-icon-active,#40CCF2)]" : state === "error" ? "text-[var(--color-input-icon-error,#EF2149)]" : "text-[var(--color-input-icon-default,#B1B1B1)]";
173
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex w-full flex-col gap-1.5", className), children: [
174
+ label && /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-0.5 font-['Red_Hat_Text'] text-[18px] font-medium leading-tight text-[var(--color-text-primary,#000)]", children: [
175
+ label,
176
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[var(--color-brand-red,#EF2149)]", "aria-hidden": "true", children: " *" })
177
+ ] }),
178
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: pillVariants({ state }), children: [
179
+ type === "search" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("shrink-0", iconColor), "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(SearchIcon, {}) }),
180
+ /* @__PURE__ */ jsxRuntime.jsx(
181
+ "input",
182
+ {
183
+ ref,
184
+ type: nativeType,
185
+ disabled: disabled || state === "disabled",
186
+ readOnly: readOnly || state === "readonly",
187
+ placeholder,
188
+ value,
189
+ defaultValue,
190
+ onFocus: handleFocus,
191
+ onBlur: handleBlur,
192
+ onChange: handleChange,
193
+ className: cn(
194
+ "min-w-0 flex-1 bg-transparent outline-none",
195
+ "font-['Inter'] text-[16px] font-normal",
196
+ "text-[var(--color-input-text,#000)] placeholder:text-[var(--color-input-placeholder,#B1B1B1)]",
197
+ "disabled:cursor-not-allowed"
198
+ ),
199
+ "aria-invalid": state === "error" || void 0,
200
+ ...props
201
+ }
202
+ ),
203
+ rightSlot,
204
+ !rightSlot && type === "password" && /* @__PURE__ */ jsxRuntime.jsx(
205
+ "button",
206
+ {
207
+ type: "button",
208
+ tabIndex: -1,
209
+ onClick: () => setShowPassword((v) => !v),
210
+ className: cn("shrink-0 cursor-pointer", iconColor),
211
+ "aria-label": showPassword ? "Hide password" : "Show password",
212
+ children: showPassword ? /* @__PURE__ */ jsxRuntime.jsx(EyeOffIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(EyeIcon, {})
213
+ }
214
+ ),
215
+ !rightSlot && type === "search" && hasValue && !disabled && /* @__PURE__ */ jsxRuntime.jsx(
216
+ "button",
217
+ {
218
+ type: "button",
219
+ tabIndex: -1,
220
+ onClick: () => setHasValue(false),
221
+ className: cn("shrink-0 cursor-pointer", iconColor),
222
+ "aria-label": "Clear search",
223
+ children: /* @__PURE__ */ jsxRuntime.jsx(XCircleIcon, {})
224
+ }
225
+ ),
226
+ !rightSlot && state === "error" && type !== "password" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("shrink-0", iconColor), "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(InfoCircleIcon, {}) })
227
+ ] }),
228
+ (errorMessage || helperText) && /* @__PURE__ */ jsxRuntime.jsx(
229
+ "p",
230
+ {
231
+ className: cn(
232
+ "font-['Inter'] text-[12px] font-normal leading-tight px-1",
233
+ errorMessage ? "text-[var(--color-input-text-error,#EF2149)]" : "text-[var(--color-text-tertiary,#6B7280)]"
234
+ ),
235
+ children: errorMessage ?? helperText
236
+ }
237
+ )
238
+ ] });
239
+ }
240
+ );
241
+ InputField.displayName = "InputField";
242
+ function SearchIcon() {
243
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
244
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "7", cy: "7", r: "4.5" }),
245
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "10.5", y1: "10.5", x2: "14", y2: "14" })
246
+ ] });
247
+ }
248
+ function EyeIcon() {
249
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
250
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M1 8s2.5-5 7-5 7 5 7 5-2.5 5-7 5-7-5-7-5Z" }),
251
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "2" })
252
+ ] });
253
+ }
254
+ function EyeOffIcon() {
255
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
256
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2 2l12 12M6.5 6.5A2 2 0 0 0 9.5 9.5" }),
257
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M4.2 4.2C2.6 5.2 1 8 1 8s2.5 5 7 5c1.4 0 2.7-.4 3.8-1" }),
258
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9.8 3.2C12.2 4.2 15 8 15 8s-.7 1.4-1.8 2.6" })
259
+ ] });
260
+ }
261
+ function XCircleIcon() {
262
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
263
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6.5" }),
264
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "5.5", y1: "5.5", x2: "10.5", y2: "10.5" }),
265
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "10.5", y1: "5.5", x2: "5.5", y2: "10.5" })
266
+ ] });
267
+ }
268
+ function InfoCircleIcon() {
269
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [
270
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "8", r: "6.5" }),
271
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "8", y1: "7", x2: "8", y2: "11" }),
272
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "8", cy: "5", r: "0.5", fill: "currentColor", stroke: "none" })
273
+ ] });
274
+ }
275
+ var Checkbox = React4__namespace.forwardRef(
276
+ ({ label, indeterminate, helperText, disabled, checked, defaultChecked, className, onChange, ...props }, ref) => {
277
+ const internalRef = React4__namespace.useRef(null);
278
+ const resolvedRef = ref ?? internalRef;
279
+ const [isChecked, setIsChecked] = React4__namespace.useState(!!defaultChecked || !!checked);
280
+ const isControlled = checked !== void 0;
281
+ const currentChecked = isControlled ? !!checked : isChecked;
282
+ React4__namespace.useEffect(() => {
283
+ if (resolvedRef.current) {
284
+ resolvedRef.current.indeterminate = !!indeterminate;
285
+ }
286
+ }, [indeterminate, resolvedRef]);
287
+ const handleChange = (e) => {
288
+ if (!isControlled) setIsChecked(e.target.checked);
289
+ onChange?.(e);
290
+ };
291
+ const showCheck = !indeterminate && currentChecked;
292
+ const showDash = !!indeterminate;
293
+ return /* @__PURE__ */ jsxRuntime.jsxs(
294
+ "label",
295
+ {
296
+ className: cn(
297
+ "inline-flex items-center gap-2 cursor-pointer select-none",
298
+ disabled && "opacity-50 cursor-not-allowed",
299
+ className
300
+ ),
301
+ children: [
302
+ /* @__PURE__ */ jsxRuntime.jsx(
303
+ "input",
304
+ {
305
+ ref: resolvedRef,
306
+ type: "checkbox",
307
+ checked: isControlled ? checked : isChecked,
308
+ disabled,
309
+ onChange: handleChange,
310
+ className: "sr-only",
311
+ ...props
312
+ }
313
+ ),
314
+ /* @__PURE__ */ jsxRuntime.jsxs(
315
+ "span",
316
+ {
317
+ "aria-hidden": "true",
318
+ className: cn(
319
+ "flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[4px]",
320
+ "border-[1.5px] transition-colors duration-[120ms]",
321
+ showCheck || showDash ? "border-transparent bg-[var(--color-primary,#40CCF2)]" : "border-[var(--color-secondary-border,#339FB8)] bg-transparent"
322
+ ),
323
+ children: [
324
+ showCheck && /* @__PURE__ */ jsxRuntime.jsx(CheckIcon, {}),
325
+ showDash && /* @__PURE__ */ jsxRuntime.jsx(DashIcon, {})
326
+ ]
327
+ }
328
+ ),
329
+ (label || helperText) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex flex-col gap-0.5", children: [
330
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]", children: label }),
331
+ helperText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]", children: helperText })
332
+ ] })
333
+ ]
334
+ }
335
+ );
336
+ }
337
+ );
338
+ Checkbox.displayName = "Checkbox";
339
+ function CheckIcon() {
340
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "11", height: "8", viewBox: "0 0 11 8", fill: "none", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "1,4 4,7 10,1" }) });
341
+ }
342
+ function DashIcon() {
343
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "10", height: "2", viewBox: "0 0 10 2", fill: "none", stroke: "white", strokeWidth: "2", strokeLinecap: "round", children: /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "1", y1: "1", x2: "9", y2: "1" }) });
344
+ }
345
+ var Radio = React4__namespace.forwardRef(
346
+ ({ label, helperText, disabled, checked, defaultChecked, className, onChange, ...props }, ref) => {
347
+ const [isChecked, setIsChecked] = React4__namespace.useState(!!defaultChecked);
348
+ const isControlled = checked !== void 0;
349
+ const currentChecked = isControlled ? !!checked : isChecked;
350
+ const handleChange = (e) => {
351
+ if (!isControlled) setIsChecked(e.target.checked);
352
+ onChange?.(e);
353
+ };
354
+ return /* @__PURE__ */ jsxRuntime.jsxs(
355
+ "label",
356
+ {
357
+ className: cn(
358
+ "inline-flex items-center gap-2 cursor-pointer select-none",
359
+ disabled && "opacity-50 cursor-not-allowed",
360
+ className
361
+ ),
362
+ children: [
363
+ /* @__PURE__ */ jsxRuntime.jsx(
364
+ "input",
365
+ {
366
+ ref,
367
+ type: "radio",
368
+ checked: isControlled ? checked : isChecked,
369
+ disabled,
370
+ onChange: handleChange,
371
+ className: "sr-only",
372
+ ...props
373
+ }
374
+ ),
375
+ /* @__PURE__ */ jsxRuntime.jsx(
376
+ "span",
377
+ {
378
+ "aria-hidden": "true",
379
+ className: cn(
380
+ "flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-full",
381
+ "border-[1.5px] transition-colors duration-[120ms]",
382
+ currentChecked ? "border-transparent bg-[var(--color-primary,#40CCF2)]" : "border-[var(--color-secondary-border,#339FB8)] bg-transparent"
383
+ ),
384
+ children: currentChecked && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-[6px] w-[6px] rounded-full bg-white" })
385
+ }
386
+ ),
387
+ (label || helperText) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex flex-col gap-0.5", children: [
388
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]", children: label }),
389
+ helperText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]", children: helperText })
390
+ ] })
391
+ ]
392
+ }
393
+ );
394
+ }
395
+ );
396
+ Radio.displayName = "Radio";
397
+ function RadioGroup({
398
+ label,
399
+ name,
400
+ value,
401
+ onChange,
402
+ children,
403
+ className,
404
+ orientation = "vertical"
405
+ }) {
406
+ const cloned = React4__namespace.Children.map(children, (child) => {
407
+ if (!React4__namespace.isValidElement(child)) return child;
408
+ const el = child;
409
+ return React4__namespace.cloneElement(el, {
410
+ name,
411
+ checked: value !== void 0 ? el.props.value === value : void 0,
412
+ onChange: (e) => {
413
+ if (e.target.checked) onChange?.(e.target.value);
414
+ el.props.onChange?.(e);
415
+ }
416
+ });
417
+ });
418
+ return /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: cn("border-none p-0 m-0", className), children: [
419
+ label && /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "mb-2 font-['Red_Hat_Text'] text-[18px] font-medium text-[var(--color-text-primary,#000)]", children: label }),
420
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex gap-3", orientation === "vertical" ? "flex-col" : "flex-row flex-wrap"), children: cloned })
421
+ ] });
422
+ }
423
+ var Toggle = React4__namespace.forwardRef(
424
+ ({
425
+ checked,
426
+ defaultChecked = false,
427
+ disabled = false,
428
+ label,
429
+ labelPosition = "right",
430
+ helperText,
431
+ onChange,
432
+ className,
433
+ id: idProp
434
+ }, ref) => {
435
+ const generatedId = React4__namespace.useId();
436
+ const id = idProp ?? generatedId;
437
+ const [isOn, setIsOn] = React4__namespace.useState(defaultChecked);
438
+ const isControlled = checked !== void 0;
439
+ const currentOn = isControlled ? !!checked : isOn;
440
+ const handleClick = () => {
441
+ if (disabled) return;
442
+ const next = !currentOn;
443
+ if (!isControlled) setIsOn(next);
444
+ onChange?.(next);
445
+ };
446
+ const handleKeyDown = (e) => {
447
+ if (e.key === " " || e.key === "Enter") {
448
+ e.preventDefault();
449
+ handleClick();
450
+ }
451
+ };
452
+ const track = /* @__PURE__ */ jsxRuntime.jsx(
453
+ "button",
454
+ {
455
+ ref,
456
+ id,
457
+ role: "switch",
458
+ type: "button",
459
+ "aria-checked": currentOn,
460
+ disabled,
461
+ onClick: handleClick,
462
+ onKeyDown: handleKeyDown,
463
+ className: cn(
464
+ // track
465
+ "relative inline-flex h-[24px] w-[44px] shrink-0 cursor-pointer rounded-full",
466
+ "border-0 outline-none transition-colors duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)]",
467
+ "focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-2",
468
+ "disabled:cursor-not-allowed",
469
+ currentOn ? "bg-[var(--color-primary,#40CCF2)]" : "bg-[var(--color-inactive,#DEDEDE)]"
470
+ ),
471
+ children: /* @__PURE__ */ jsxRuntime.jsx(
472
+ "span",
473
+ {
474
+ "aria-hidden": "true",
475
+ className: cn(
476
+ "absolute top-[2px] h-[20px] w-[20px] rounded-full bg-white shadow-sm",
477
+ "transition-transform duration-[180ms] ease-[cubic-bezier(0.2,0,0,1)]",
478
+ currentOn ? "translate-x-[22px]" : "translate-x-[2px]"
479
+ )
480
+ }
481
+ )
482
+ }
483
+ );
484
+ if (!label && !helperText) {
485
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn(disabled && "opacity-50", className), children: track });
486
+ }
487
+ const labelContent = /* @__PURE__ */ jsxRuntime.jsxs(
488
+ "label",
489
+ {
490
+ htmlFor: id,
491
+ className: cn(
492
+ "flex flex-col gap-0.5 cursor-pointer",
493
+ disabled && "cursor-not-allowed"
494
+ ),
495
+ children: [
496
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-['Red_Hat_Text'] text-[14px] font-normal leading-tight text-[var(--color-text-primary,#000)]", children: label }),
497
+ helperText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-['Inter'] text-[12px] text-[var(--color-text-tertiary,#6B7280)]", children: helperText })
498
+ ]
499
+ }
500
+ );
501
+ return /* @__PURE__ */ jsxRuntime.jsxs(
502
+ "div",
503
+ {
504
+ className: cn(
505
+ "inline-flex items-center gap-2.5",
506
+ disabled && "opacity-50",
507
+ className
508
+ ),
509
+ children: [
510
+ labelPosition === "left" && labelContent,
511
+ track,
512
+ labelPosition === "right" && labelContent
513
+ ]
514
+ }
515
+ );
516
+ }
517
+ );
518
+ Toggle.displayName = "Toggle";
519
+ var selectorVariants = classVarianceAuthority.cva(
520
+ [
521
+ "inline-flex items-center gap-1.5 rounded-full select-none cursor-pointer",
522
+ "py-2 pl-3.5 pr-2.5",
523
+ "font-['Red_Hat_Text'] text-[14px] font-medium leading-tight",
524
+ "border-[1.5px] transition-colors duration-[120ms]",
525
+ "outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1",
526
+ "disabled:pointer-events-none disabled:opacity-50"
527
+ ],
528
+ {
529
+ variants: {
530
+ variant: {
531
+ primary: "",
532
+ secondary: ""
533
+ },
534
+ state: {
535
+ active: "",
536
+ inactive: "",
537
+ disabled: ""
538
+ }
539
+ },
540
+ compoundVariants: [
541
+ // Primary
542
+ {
543
+ variant: "primary",
544
+ state: "active",
545
+ class: "bg-[var(--color-primary,#40CCF2)] border-transparent text-[var(--color-text-primary,#000)]"
546
+ },
547
+ {
548
+ variant: "primary",
549
+ state: ["inactive", "disabled"],
550
+ class: "bg-[var(--color-inactive,#DEDEDE)] border-transparent text-[var(--color-text-primary,#000)]"
551
+ },
552
+ // Secondary
553
+ {
554
+ variant: "secondary",
555
+ state: "active",
556
+ class: "bg-transparent border-[var(--color-secondary-border,#339FB8)] text-[var(--color-secondary-foreground,#339FB8)]"
557
+ },
558
+ {
559
+ variant: "secondary",
560
+ state: ["inactive", "disabled"],
561
+ class: "bg-transparent border-[var(--color-border,#C9C9C9)] text-[var(--color-text-secondary,#6B7280)]"
562
+ }
563
+ ],
564
+ defaultVariants: {
565
+ variant: "primary",
566
+ state: "active"
567
+ }
568
+ }
569
+ );
570
+ var Selector = React4__namespace.forwardRef(
571
+ ({ label, variant = "primary", state = "active", open = false, icon, className, disabled, ...props }, ref) => {
572
+ const isDisabled = disabled || state === "disabled";
573
+ return /* @__PURE__ */ jsxRuntime.jsxs(
574
+ "button",
575
+ {
576
+ ref,
577
+ type: "button",
578
+ disabled: isDisabled,
579
+ "aria-expanded": open,
580
+ "aria-haspopup": "listbox",
581
+ className: cn(selectorVariants({ variant, state: isDisabled ? "disabled" : state }), className),
582
+ ...props,
583
+ children: [
584
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 [&_svg]:size-4", children: icon }),
585
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
586
+ /* @__PURE__ */ jsxRuntime.jsx(
587
+ ChevronDownIcon,
588
+ {
589
+ className: cn(
590
+ "shrink-0 transition-transform duration-[120ms]",
591
+ open && "rotate-180"
592
+ )
593
+ }
594
+ )
595
+ ]
596
+ }
597
+ );
598
+ }
599
+ );
600
+ Selector.displayName = "Selector";
601
+ function SelectorGroup({ children, className }) {
602
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-wrap items-center gap-2", className), children });
603
+ }
604
+ function ChevronDownIcon({ className }) {
605
+ return /* @__PURE__ */ jsxRuntime.jsx(
606
+ "svg",
607
+ {
608
+ width: "12",
609
+ height: "12",
610
+ viewBox: "0 0 12 12",
611
+ fill: "none",
612
+ stroke: "currentColor",
613
+ strokeWidth: "1.5",
614
+ strokeLinecap: "round",
615
+ strokeLinejoin: "round",
616
+ className,
617
+ children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "2,4 6,8 10,4" })
618
+ }
619
+ );
620
+ }
621
+ function TabBar({
622
+ tabs,
623
+ value,
624
+ defaultValue,
625
+ onValueChange,
626
+ className,
627
+ stretch = false
628
+ }) {
629
+ const [selected, setSelected] = React4__namespace.useState(defaultValue ?? tabs[0]);
630
+ const isControlled = value !== void 0;
631
+ const current = isControlled ? value : selected;
632
+ const handleSelect = (tab) => {
633
+ if (!isControlled) setSelected(tab);
634
+ onValueChange?.(tab);
635
+ };
636
+ return /* @__PURE__ */ jsxRuntime.jsx(
637
+ "div",
638
+ {
639
+ role: "tablist",
640
+ "aria-label": "Tabs",
641
+ className: cn(
642
+ "inline-flex items-center gap-1 rounded-full p-1",
643
+ "bg-[var(--color-inactive,#DEDEDE)]",
644
+ stretch && "w-full",
645
+ className
646
+ ),
647
+ children: tabs.map((tab) => {
648
+ const isSelected = tab === current;
649
+ return /* @__PURE__ */ jsxRuntime.jsx(
650
+ "button",
651
+ {
652
+ role: "tab",
653
+ type: "button",
654
+ "aria-selected": isSelected,
655
+ onClick: () => handleSelect(tab),
656
+ className: cn(
657
+ "rounded-full px-4 py-[7px] cursor-pointer select-none",
658
+ "font-['Inter'] text-[14px] font-medium leading-tight",
659
+ "outline-none transition-colors duration-[120ms]",
660
+ "focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1",
661
+ stretch && "flex-1 text-center",
662
+ isSelected ? "bg-[var(--color-foreground,#000)] text-white" : "bg-transparent text-[var(--color-text-primary,#000)] hover:bg-black/5"
663
+ ),
664
+ children: tab
665
+ },
666
+ tab
667
+ );
668
+ })
669
+ }
670
+ );
671
+ }
672
+ function TabPanels({ value, children, className }) {
673
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className, children: React4__namespace.Children.map(children, (child) => {
674
+ if (!React4__namespace.isValidElement(child)) return null;
675
+ const el = child;
676
+ return el.props.value === value ? el : null;
677
+ }) });
678
+ }
679
+ function TabPanel({ children, className }) {
680
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "tabpanel", className, children });
681
+ }
682
+ function segmentValue(s) {
683
+ return typeof s === "string" ? s : s.value;
684
+ }
685
+ function segmentLabel(s) {
686
+ return typeof s === "string" ? s : s.label;
687
+ }
688
+ function segmentIcon(s) {
689
+ return typeof s === "string" ? void 0 : s.icon;
690
+ }
691
+ function Switcher({
692
+ segments,
693
+ value,
694
+ defaultValue,
695
+ onValueChange,
696
+ className,
697
+ stretch = false
698
+ }) {
699
+ const [selected, setSelected] = React4__namespace.useState(
700
+ defaultValue ?? segmentValue(segments[0])
701
+ );
702
+ const isControlled = value !== void 0;
703
+ const current = isControlled ? value : selected;
704
+ const handleSelect = (val) => {
705
+ if (!isControlled) setSelected(val);
706
+ onValueChange?.(val);
707
+ };
708
+ return /* @__PURE__ */ jsxRuntime.jsx(
709
+ "div",
710
+ {
711
+ role: "group",
712
+ className: cn(
713
+ "inline-flex items-center gap-0.5 rounded-[8px] p-[3px]",
714
+ "bg-[var(--color-inactive,#DEDEDE)]",
715
+ stretch && "w-full",
716
+ className
717
+ ),
718
+ children: segments.map((seg) => {
719
+ const val = segmentValue(seg);
720
+ const label = segmentLabel(seg);
721
+ const icon = segmentIcon(seg);
722
+ const isSelected = val === current;
723
+ return /* @__PURE__ */ jsxRuntime.jsxs(
724
+ "button",
725
+ {
726
+ type: "button",
727
+ role: "radio",
728
+ "aria-checked": isSelected,
729
+ onClick: () => handleSelect(val),
730
+ className: cn(
731
+ "inline-flex items-center justify-center gap-1.5 rounded-[6px]",
732
+ "px-4 py-[7px] cursor-pointer select-none",
733
+ "font-['Inter'] text-[14px] font-medium leading-tight",
734
+ "outline-none transition-colors duration-[120ms]",
735
+ "focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1",
736
+ stretch && "flex-1",
737
+ isSelected ? "bg-[var(--color-foreground,#000)] text-white" : "bg-transparent text-[var(--color-text-secondary,#6B7280)] hover:text-[var(--color-text-primary,#000)]"
738
+ ),
739
+ children: [
740
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 [&_svg]:size-[14px]", children: icon }),
741
+ label
742
+ ]
743
+ },
744
+ val
745
+ );
746
+ })
747
+ }
748
+ );
749
+ }
750
+ function BottomNav({
751
+ items,
752
+ value,
753
+ defaultValue,
754
+ onValueChange,
755
+ className
756
+ }) {
757
+ const [selected, setSelected] = React4__namespace.useState(
758
+ defaultValue ?? items[0]?.value
759
+ );
760
+ const isControlled = value !== void 0;
761
+ const current = isControlled ? value : selected;
762
+ const handleSelect = (val) => {
763
+ if (!isControlled) setSelected(val);
764
+ onValueChange?.(val);
765
+ };
766
+ return /* @__PURE__ */ jsxRuntime.jsx(
767
+ "nav",
768
+ {
769
+ "aria-label": "Main navigation",
770
+ className: cn(
771
+ // Glass pill container
772
+ "flex items-center justify-between",
773
+ "w-full max-w-[360px] h-[72px] rounded-[60px]",
774
+ "px-3 py-2",
775
+ // Glass gradient
776
+ "bg-gradient-to-b from-[rgba(220,220,220,0.20)] to-[rgba(118,118,118,0.20)]",
777
+ "backdrop-blur-md",
778
+ // Shadow
779
+ "shadow-[0_4px_4px_rgba(0,0,0,0.14)]",
780
+ className
781
+ ),
782
+ children: items.map((item) => {
783
+ const isSelected = item.value === current;
784
+ return /* @__PURE__ */ jsxRuntime.jsx(
785
+ NavItemButton,
786
+ {
787
+ item,
788
+ isSelected,
789
+ onClick: () => handleSelect(item.value)
790
+ },
791
+ item.value
792
+ );
793
+ })
794
+ }
795
+ );
796
+ }
797
+ function NavItemButton({ item, isSelected, onClick }) {
798
+ return /* @__PURE__ */ jsxRuntime.jsxs(
799
+ "button",
800
+ {
801
+ type: "button",
802
+ onClick,
803
+ "aria-current": isSelected ? "page" : void 0,
804
+ className: cn(
805
+ "relative inline-flex flex-col items-center justify-center gap-[3px]",
806
+ "rounded-full py-2 px-4 cursor-pointer select-none",
807
+ "outline-none transition-colors duration-[120ms]",
808
+ "focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-1",
809
+ isSelected ? "bg-[var(--color-foreground,#000)] text-white" : "bg-transparent text-[var(--color-muted-foreground,#6B7280)]"
810
+ ),
811
+ children: [
812
+ item.badge && /* @__PURE__ */ jsxRuntime.jsx(
813
+ "span",
814
+ {
815
+ "aria-label": typeof item.badge === "number" ? `${item.badge} notifications` : "New notification",
816
+ className: cn(
817
+ "absolute right-2 top-2 flex items-center justify-center",
818
+ "rounded-full bg-[var(--color-destructive,#EF2149)] text-white",
819
+ typeof item.badge === "number" ? "h-4 min-w-4 px-1 font-['Inter'] text-[10px] font-semibold" : "h-2 w-2"
820
+ ),
821
+ children: typeof item.badge === "number" ? item.badge : null
822
+ }
823
+ ),
824
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "[&_svg]:size-5", "aria-hidden": "true", children: item.icon }),
825
+ /* @__PURE__ */ jsxRuntime.jsx(
826
+ "span",
827
+ {
828
+ className: cn(
829
+ "font-['Inter'] text-[10px] leading-tight",
830
+ isSelected ? "font-semibold" : "font-normal"
831
+ ),
832
+ children: item.label
833
+ }
834
+ )
835
+ ]
836
+ }
837
+ );
838
+ }
839
+ function BottomNavContainer({ children }) {
840
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed bottom-6 left-1/2 z-50 flex w-full max-w-[402px] -translate-x-1/2 items-center justify-center px-4", children });
841
+ }
842
+ var badgeVariants = classVarianceAuthority.cva(
843
+ [
844
+ "inline-flex items-center gap-1 rounded-full font-['Inter'] font-medium whitespace-nowrap",
845
+ "select-none leading-tight"
846
+ ],
847
+ {
848
+ variants: {
849
+ variant: {
850
+ default: "bg-[var(--color-inactive,#DEDEDE)] text-[var(--color-text-primary,#000)]",
851
+ success: "bg-[var(--color-success-soft,#B3F5D1)] text-[var(--color-success,#16A34A)]",
852
+ error: "bg-[var(--color-error-soft,#FFC9C9)] text-[var(--color-destructive,#EF2149)]",
853
+ warning: "bg-[var(--color-warning-soft,#FFF085)] text-[#92680E]",
854
+ alert: "bg-[var(--color-alert-soft,#EAC1C3)] text-[var(--color-alert,#FA6A0A)]",
855
+ info: "bg-[var(--color-info-soft,#BEDBFF)] text-[var(--color-info,#2F80ED)]",
856
+ neutral: "bg-transparent text-[var(--color-text-secondary,#6B7280)] border border-[var(--color-border,#C9C9C9)]",
857
+ // Brand accent fills — used for status tags in Kitchen Intelligence
858
+ brand: "bg-[var(--color-primary,#40CCF2)] text-[var(--color-text-primary,#000)]"
859
+ },
860
+ size: {
861
+ sm: "h-5 px-2 text-[11px]",
862
+ md: "h-6 px-2.5 text-[12px]"
863
+ }
864
+ },
865
+ defaultVariants: {
866
+ variant: "default",
867
+ size: "md"
868
+ }
869
+ }
870
+ );
871
+ function Badge({ variant, size, icon, children, className, ...props }) {
872
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn(badgeVariants({ variant, size }), className), ...props, children: [
873
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 [&_svg]:size-3", "aria-hidden": "true", children: icon }),
874
+ children
875
+ ] });
876
+ }
877
+ function TrendBadge({ value, decimals = 1, showArrow = true, ...props }) {
878
+ const variant = value > 0 ? "success" : value < 0 ? "error" : "neutral";
879
+ const formatted = `${value > 0 ? "+" : ""}${value.toFixed(decimals)}%`;
880
+ const arrow = showArrow ? value > 0 ? /* @__PURE__ */ jsxRuntime.jsx(ArrowUpIcon, {}) : value < 0 ? /* @__PURE__ */ jsxRuntime.jsx(ArrowDownIcon, {}) : null : null;
881
+ return /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant, icon: arrow, ...props, children: formatted });
882
+ }
883
+ function ArrowUpIcon() {
884
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "2,7 5,3 8,7" }) });
885
+ }
886
+ function ArrowDownIcon() {
887
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.jsx("polyline", { points: "2,3 5,7 8,3" }) });
888
+ }
889
+ function MetricTile({
890
+ label,
891
+ value,
892
+ trend,
893
+ trendLabel,
894
+ icon,
895
+ valueColor,
896
+ size = "md",
897
+ loading = false,
898
+ onClick,
899
+ className,
900
+ as: Tag = "div"
901
+ }) {
902
+ const valueSize = {
903
+ sm: "text-[18px]",
904
+ md: "text-[24px]",
905
+ lg: "text-[30px]"
906
+ }[size];
907
+ const padding = {
908
+ sm: "p-3",
909
+ md: "p-4",
910
+ lg: "p-5"
911
+ }[size];
912
+ return /* @__PURE__ */ jsxRuntime.jsxs(
913
+ Tag,
914
+ {
915
+ onClick,
916
+ role: onClick ? "button" : void 0,
917
+ tabIndex: onClick ? 0 : void 0,
918
+ onKeyDown: onClick ? (e) => {
919
+ if (e.key === "Enter" || e.key === " ") onClick();
920
+ } : void 0,
921
+ className: cn(
922
+ // Card shell
923
+ "flex flex-col gap-1 rounded-[16px] bg-white",
924
+ "shadow-[0_4px_4px_rgba(0,0,0,0.06)]",
925
+ padding,
926
+ // Interactive
927
+ onClick && "cursor-pointer outline-none hover:shadow-[0_4px_12px_rgba(0,0,0,0.10)] transition-shadow duration-[120ms]",
928
+ onClick && "focus-visible:ring-2 focus-visible:ring-[var(--color-ring,#40CCF2)] focus-visible:ring-offset-2",
929
+ // Loading
930
+ loading && "animate-pulse",
931
+ className
932
+ ),
933
+ children: [
934
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
935
+ /* @__PURE__ */ jsxRuntime.jsx(
936
+ "span",
937
+ {
938
+ className: cn(
939
+ "font-['Inter'] text-[12px] font-normal leading-tight",
940
+ "text-[var(--color-text-tertiary,#6B7280)]",
941
+ loading && "h-3 w-24 rounded bg-gray-200"
942
+ ),
943
+ children: !loading && label
944
+ }
945
+ ),
946
+ icon && !loading && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-[var(--color-text-tertiary,#6B7280)] [&_svg]:size-4", "aria-hidden": "true", children: icon })
947
+ ] }),
948
+ /* @__PURE__ */ jsxRuntime.jsx(
949
+ "span",
950
+ {
951
+ className: cn(
952
+ "font-['Inter'] font-semibold leading-tight tracking-tight",
953
+ valueSize,
954
+ loading && "mt-1 h-7 w-28 rounded bg-gray-200"
955
+ ),
956
+ style: valueColor && !loading ? { color: valueColor } : void 0,
957
+ children: !loading && value
958
+ }
959
+ ),
960
+ (trend !== void 0 || trendLabel) && !loading && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
961
+ trend !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(TrendBadge, { value: trend, size: "sm" }),
962
+ trendLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-['Inter'] text-[11px] text-[var(--color-text-tertiary,#6B7280)]", children: trendLabel })
963
+ ] }),
964
+ loading && trend !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 h-4 w-16 rounded bg-gray-200" })
965
+ ]
966
+ }
967
+ );
968
+ }
969
+ function MetricTileGrid({ cols = 2, children, className }) {
970
+ const colClass = {
971
+ 1: "grid-cols-1",
972
+ 2: "grid-cols-2",
973
+ 3: "grid-cols-3",
974
+ 4: "grid-cols-4"
975
+ }[cols];
976
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid gap-3", colClass, className), children });
977
+ }
978
+
979
+ exports.Badge = Badge;
980
+ exports.BottomNav = BottomNav;
981
+ exports.BottomNavContainer = BottomNavContainer;
982
+ exports.Button = Button;
983
+ exports.Checkbox = Checkbox;
984
+ exports.IconButton = IconButton;
985
+ exports.InputField = InputField;
986
+ exports.MetricTile = MetricTile;
987
+ exports.MetricTileGrid = MetricTileGrid;
988
+ exports.Radio = Radio;
989
+ exports.RadioGroup = RadioGroup;
990
+ exports.Selector = Selector;
991
+ exports.SelectorGroup = SelectorGroup;
992
+ exports.Switcher = Switcher;
993
+ exports.TabBar = TabBar;
994
+ exports.TabPanel = TabPanel;
995
+ exports.TabPanels = TabPanels;
996
+ exports.Toggle = Toggle;
997
+ exports.TrendBadge = TrendBadge;
998
+ exports.buttonVariants = buttonVariants;
999
+ //# sourceMappingURL=index.js.map
1000
+ //# sourceMappingURL=index.js.map