@compa11y/react 0.1.0 → 0.1.3

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 (76) hide show
  1. package/README.md +487 -5
  2. package/dist/chunk-36S2JYVF.cjs +1 -0
  3. package/dist/chunk-AJ7JSWUT.cjs +1 -0
  4. package/dist/chunk-DDFEION3.cjs +1 -0
  5. package/dist/chunk-DWU3PTJO.cjs +1 -0
  6. package/dist/chunk-FD4F6ONU.cjs +1 -0
  7. package/dist/chunk-FOVHQAY5.cjs +1 -0
  8. package/dist/chunk-GITBIGD4.js +1 -0
  9. package/dist/chunk-HEA4NAOM.js +1 -0
  10. package/dist/chunk-IZ7LLPPV.js +1 -0
  11. package/dist/chunk-JS3UD7KS.cjs +1 -0
  12. package/dist/chunk-MAR6RBHF.cjs +1 -0
  13. package/dist/chunk-MD4AVTLT.js +1 -0
  14. package/dist/chunk-SB6ASQ36.js +1 -0
  15. package/dist/chunk-VMM4K2K4.js +1 -0
  16. package/dist/chunk-XEJXACWE.js +1 -0
  17. package/dist/chunk-ZB3SYGHE.js +1 -0
  18. package/dist/components/combobox/index.cjs +1 -31
  19. package/dist/components/combobox/index.js +1 -6
  20. package/dist/components/dialog/index.cjs +1 -46
  21. package/dist/components/dialog/index.js +1 -5
  22. package/dist/components/menu/index.cjs +1 -46
  23. package/dist/components/menu/index.js +1 -5
  24. package/dist/components/tabs/index.cjs +1 -35
  25. package/dist/components/tabs/index.js +1 -6
  26. package/dist/components/toast/index.cjs +1 -24
  27. package/dist/components/toast/index.js +1 -3
  28. package/dist/index.cjs +1 -702
  29. package/dist/index.d.cts +760 -3
  30. package/dist/index.d.ts +760 -3
  31. package/dist/index.js +1 -430
  32. package/package.json +44 -3
  33. package/dist/chunk-2S4C6FGA.js +0 -380
  34. package/dist/chunk-2S4C6FGA.js.map +0 -1
  35. package/dist/chunk-52J4Z3QD.cjs +0 -45
  36. package/dist/chunk-52J4Z3QD.cjs.map +0 -1
  37. package/dist/chunk-C7QK2I7H.js +0 -373
  38. package/dist/chunk-C7QK2I7H.js.map +0 -1
  39. package/dist/chunk-D2UMS62N.cjs +0 -245
  40. package/dist/chunk-D2UMS62N.cjs.map +0 -1
  41. package/dist/chunk-E265U2RK.js +0 -234
  42. package/dist/chunk-E265U2RK.js.map +0 -1
  43. package/dist/chunk-E4XJRXWM.js +0 -215
  44. package/dist/chunk-E4XJRXWM.js.map +0 -1
  45. package/dist/chunk-GDLOJH6K.cjs +0 -110
  46. package/dist/chunk-GDLOJH6K.cjs.map +0 -1
  47. package/dist/chunk-IR46CNNY.cjs +0 -329
  48. package/dist/chunk-IR46CNNY.cjs.map +0 -1
  49. package/dist/chunk-JXYOE7SH.js +0 -103
  50. package/dist/chunk-JXYOE7SH.js.map +0 -1
  51. package/dist/chunk-O3YYQZ5O.js +0 -317
  52. package/dist/chunk-O3YYQZ5O.js.map +0 -1
  53. package/dist/chunk-OIVTOU4Z.cjs +0 -386
  54. package/dist/chunk-OIVTOU4Z.cjs.map +0 -1
  55. package/dist/chunk-OND5B7UG.js +0 -85
  56. package/dist/chunk-OND5B7UG.js.map +0 -1
  57. package/dist/chunk-R4FR6M6I.cjs +0 -383
  58. package/dist/chunk-R4FR6M6I.cjs.map +0 -1
  59. package/dist/chunk-RBDQCIS7.cjs +0 -89
  60. package/dist/chunk-RBDQCIS7.cjs.map +0 -1
  61. package/dist/chunk-SOBS7MIH.cjs +0 -220
  62. package/dist/chunk-SOBS7MIH.cjs.map +0 -1
  63. package/dist/chunk-WURPAE3R.js +0 -41
  64. package/dist/chunk-WURPAE3R.js.map +0 -1
  65. package/dist/components/combobox/index.cjs.map +0 -1
  66. package/dist/components/combobox/index.js.map +0 -1
  67. package/dist/components/dialog/index.cjs.map +0 -1
  68. package/dist/components/dialog/index.js.map +0 -1
  69. package/dist/components/menu/index.cjs.map +0 -1
  70. package/dist/components/menu/index.js.map +0 -1
  71. package/dist/components/tabs/index.cjs.map +0 -1
  72. package/dist/components/tabs/index.js.map +0 -1
  73. package/dist/components/toast/index.cjs.map +0 -1
  74. package/dist/components/toast/index.js.map +0 -1
  75. package/dist/index.cjs.map +0 -1
  76. package/dist/index.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,430 +1 @@
1
- export { DialogCompound as Dialog, DialogActions, Dialog as DialogBase, DialogClose, DialogContent, DialogDescription, DialogTitle, DialogTrigger, useDialogContext, useFocusTrap, useFocusTrapControls } from './chunk-O3YYQZ5O.js';
2
- export { ActionMenuCompound as ActionMenu, ActionMenu as ActionMenuBase, ActionMenuContent, ActionMenuItem, ActionMenuLabel, ActionMenuSeparator, ActionMenuTrigger, useActionMenuContext } from './chunk-C7QK2I7H.js';
3
- export { Tab, TabList, TabPanel, TabsCompound as Tabs, Tabs as TabsBase, useTabsContext } from './chunk-E265U2RK.js';
4
- export { ToastProvider, ToastViewport, useToast, useToastHelpers } from './chunk-E4XJRXWM.js';
5
- export { ComboboxCompound as Combobox, Combobox as ComboboxBase, ComboboxInput, ComboboxListbox, ComboboxOption } from './chunk-2S4C6FGA.js';
6
- import { useAnnouncer } from './chunk-OND5B7UG.js';
7
- export { useAnnounceLoading, useAnnounceOnChange, useAnnouncer } from './chunk-OND5B7UG.js';
8
- import { useKeyboard } from './chunk-JXYOE7SH.js';
9
- export { useGridKeyboard, useKeyPressed, useKeyboard, useMenuKeyboard, useTabsKeyboard, useTypeAhead } from './chunk-JXYOE7SH.js';
10
- import { useId } from './chunk-WURPAE3R.js';
11
- export { useId, useIdScope, useIds } from './chunk-WURPAE3R.js';
12
- import { forwardRef, useState, useEffect, useCallback, useRef } from 'react';
13
- import { createComponentWarnings, initFocusVisible, isFocusVisible, focusWithVisibleRing } from '@compa11y/core';
14
- export { announce, announceAssertive, announceError, announcePolite, announceProgress, announceStatus, aria, buildAriaProps, checks, createComponentWarnings, hasAccessibleName, isAndroid, isBrowser, isIOS, isMac, mergeAriaIds, prefersDarkMode, prefersHighContrast, prefersReducedMotion, setWarningHandler, warn } from '@compa11y/core';
15
- import { jsxs, jsx } from 'react/jsx-runtime';
16
-
17
- function useFocusVisible() {
18
- const [isFocusVisible$1, setIsFocusVisible] = useState(false);
19
- useEffect(() => {
20
- const cleanup = initFocusVisible();
21
- return cleanup;
22
- }, []);
23
- const handleFocus = useCallback(() => {
24
- setIsFocusVisible(isFocusVisible());
25
- }, []);
26
- const handleBlur = useCallback(() => {
27
- setIsFocusVisible(false);
28
- }, []);
29
- return {
30
- isFocusVisible: isFocusVisible$1,
31
- focusProps: {
32
- onFocus: handleFocus,
33
- onBlur: handleBlur
34
- }
35
- };
36
- }
37
- function useFocusManager(options = {}) {
38
- const {
39
- autoFocus = false,
40
- restoreFocus = false,
41
- focusVisible = true
42
- } = options;
43
- const elementRef = useCallback(
44
- (node) => {
45
- if (node && autoFocus) {
46
- requestAnimationFrame(() => {
47
- if (focusVisible) {
48
- focusWithVisibleRing(node);
49
- } else {
50
- node.focus();
51
- }
52
- });
53
- }
54
- },
55
- [autoFocus, focusVisible]
56
- );
57
- useEffect(() => {
58
- if (!restoreFocus) return;
59
- const previousElement = document.activeElement;
60
- return () => {
61
- if (previousElement && previousElement.focus) {
62
- previousElement.focus();
63
- }
64
- };
65
- }, [restoreFocus]);
66
- return elementRef;
67
- }
68
- function useFocusControl() {
69
- const elementRef = useCallback((_node) => {
70
- }, []);
71
- const focus = useCallback((options) => {
72
- const element = elementRef;
73
- if (element.current) {
74
- if (options?.visible) {
75
- focusWithVisibleRing(element.current);
76
- } else {
77
- element.current.focus();
78
- }
79
- }
80
- }, []);
81
- return { ref: elementRef, focus };
82
- }
83
- function useFocusWithin() {
84
- const [hasFocus, setHasFocus] = useState(false);
85
- const containerRef = useCallback((_node) => {
86
- }, []);
87
- const handleFocusIn = useCallback(() => {
88
- setHasFocus(true);
89
- }, []);
90
- const handleFocusOut = useCallback((event) => {
91
- const container = event.currentTarget;
92
- const relatedTarget = event.relatedTarget;
93
- if (!relatedTarget || !container.contains(relatedTarget)) {
94
- setHasFocus(false);
95
- }
96
- }, []);
97
- return {
98
- ref: containerRef,
99
- hasFocus,
100
- focusWithinProps: {
101
- onFocus: handleFocusIn,
102
- onBlur: handleFocusOut
103
- }
104
- };
105
- }
106
- function useRovingTabindex(options) {
107
- const {
108
- itemCount,
109
- initialIndex = 0,
110
- wrap = true,
111
- orientation = "both",
112
- onChange
113
- } = options;
114
- const [activeIndex, setActiveIndex] = useState(initialIndex);
115
- const itemRefs = useRef([]);
116
- useEffect(() => {
117
- if (activeIndex >= itemCount) {
118
- setActiveIndex(Math.max(0, itemCount - 1));
119
- }
120
- }, [itemCount, activeIndex]);
121
- const moveTo = useCallback(
122
- (index) => {
123
- let newIndex = index;
124
- if (newIndex < 0) {
125
- newIndex = wrap ? itemCount - 1 : 0;
126
- } else if (newIndex >= itemCount) {
127
- newIndex = wrap ? 0 : itemCount - 1;
128
- }
129
- setActiveIndex(newIndex);
130
- onChange?.(newIndex);
131
- const element = itemRefs.current[newIndex];
132
- element?.focus();
133
- },
134
- [itemCount, wrap, onChange]
135
- );
136
- const handleKeyDown = useCallback(
137
- (event, index) => {
138
- let handled = false;
139
- switch (event.key) {
140
- case "ArrowRight":
141
- if (orientation === "horizontal" || orientation === "both") {
142
- moveTo(index + 1);
143
- handled = true;
144
- }
145
- break;
146
- case "ArrowLeft":
147
- if (orientation === "horizontal" || orientation === "both") {
148
- moveTo(index - 1);
149
- handled = true;
150
- }
151
- break;
152
- case "ArrowDown":
153
- if (orientation === "vertical" || orientation === "both") {
154
- moveTo(index + 1);
155
- handled = true;
156
- }
157
- break;
158
- case "ArrowUp":
159
- if (orientation === "vertical" || orientation === "both") {
160
- moveTo(index - 1);
161
- handled = true;
162
- }
163
- break;
164
- case "Home":
165
- moveTo(0);
166
- handled = true;
167
- break;
168
- case "End":
169
- moveTo(itemCount - 1);
170
- handled = true;
171
- break;
172
- }
173
- if (handled) {
174
- event.preventDefault();
175
- event.stopPropagation();
176
- }
177
- },
178
- [orientation, moveTo, itemCount]
179
- );
180
- const getItemProps = useCallback(
181
- (index) => ({
182
- ref: (el) => {
183
- itemRefs.current[index] = el;
184
- },
185
- tabIndex: index === activeIndex ? 0 : -1,
186
- onKeyDown: (event) => handleKeyDown(event, index),
187
- onFocus: () => {
188
- if (index !== activeIndex) {
189
- setActiveIndex(index);
190
- onChange?.(index);
191
- }
192
- }
193
- }),
194
- [activeIndex, handleKeyDown, onChange]
195
- );
196
- return {
197
- activeIndex,
198
- setActiveIndex: moveTo,
199
- getItemProps,
200
- first: () => moveTo(0),
201
- last: () => moveTo(itemCount - 1),
202
- next: () => moveTo(activeIndex + 1),
203
- previous: () => moveTo(activeIndex - 1)
204
- };
205
- }
206
- function useRovingTabindexMap(ids, options = {}) {
207
- const roving = useRovingTabindex({
208
- ...options,
209
- itemCount: ids.length
210
- });
211
- const getItemProps = useCallback(
212
- (id) => {
213
- const index = ids.indexOf(id);
214
- if (index === -1) {
215
- throw new Error(`Unknown item ID: ${id}`);
216
- }
217
- return roving.getItemProps(index);
218
- },
219
- [ids, roving]
220
- );
221
- const activeId = ids[roving.activeIndex];
222
- return {
223
- ...roving,
224
- activeId,
225
- getItemProps,
226
- setActiveId: (id) => {
227
- const index = ids.indexOf(id);
228
- if (index !== -1) {
229
- roving.setActiveIndex(index);
230
- }
231
- }
232
- };
233
- }
234
- var warnings = createComponentWarnings("Switch");
235
- var Switch = forwardRef(
236
- function Switch2({
237
- checked: controlledChecked,
238
- defaultChecked = false,
239
- onCheckedChange,
240
- label,
241
- disabled = false,
242
- unstyled = false,
243
- className,
244
- size = "md",
245
- "aria-label": ariaLabel,
246
- "aria-labelledby": ariaLabelledby,
247
- onClick,
248
- ...props
249
- }, ref) {
250
- const id = useId("switch");
251
- const labelId = `${id}-label`;
252
- const { announce: announce2 } = useAnnouncer();
253
- const [uncontrolledChecked, setUncontrolledChecked] = useState(defaultChecked);
254
- const isControlled = controlledChecked !== void 0;
255
- const checked = isControlled ? controlledChecked : uncontrolledChecked;
256
- useEffect(() => {
257
- if (!label && !ariaLabel && !ariaLabelledby) {
258
- warnings.warning(
259
- "Switch has no accessible label. Screen readers need this to identify the switch.",
260
- 'Add label="Description", aria-label="...", or aria-labelledby="..."'
261
- );
262
- }
263
- }, [label, ariaLabel, ariaLabelledby]);
264
- const toggleSwitch = useCallback(() => {
265
- if (disabled) return;
266
- const newChecked = !checked;
267
- if (!isControlled) {
268
- setUncontrolledChecked(newChecked);
269
- }
270
- onCheckedChange?.(newChecked);
271
- const labelText = label || ariaLabel || "Switch";
272
- announce2(`${labelText} ${newChecked ? "on" : "off"}`);
273
- }, [
274
- checked,
275
- disabled,
276
- isControlled,
277
- onCheckedChange,
278
- label,
279
- ariaLabel,
280
- announce2
281
- ]);
282
- const handleClick = useCallback(
283
- (event) => {
284
- onClick?.(event);
285
- if (!event.defaultPrevented) {
286
- toggleSwitch();
287
- }
288
- },
289
- [onClick, toggleSwitch]
290
- );
291
- const keyboardProps = useKeyboard(
292
- {
293
- " ": () => {
294
- toggleSwitch();
295
- },
296
- Enter: () => {
297
- toggleSwitch();
298
- }
299
- },
300
- { preventDefault: true }
301
- );
302
- const handleKeyDown = (event) => {
303
- props.onKeyDown?.(event);
304
- if (!event.defaultPrevented) {
305
- keyboardProps.onKeyDown(event);
306
- }
307
- };
308
- const computedAriaLabel = ariaLabel;
309
- const computedAriaLabelledby = ariaLabelledby || (label ? labelId : void 0);
310
- const wrapperStructuralStyles = {
311
- display: "inline-flex",
312
- alignItems: "center"
313
- };
314
- const sizes = {
315
- sm: { width: 32, height: 18, thumb: 14, translate: 14 },
316
- md: { width: 44, height: 24, thumb: 20, translate: 20 },
317
- lg: { width: 56, height: 30, thumb: 26, translate: 26 }
318
- };
319
- const sizeConfig = sizes[size];
320
- const trackStructuralStyles = {
321
- position: "relative",
322
- display: "inline-flex",
323
- alignItems: "center",
324
- flexShrink: 0,
325
- width: sizeConfig.width,
326
- height: sizeConfig.height,
327
- border: "none",
328
- padding: 2,
329
- cursor: disabled ? "not-allowed" : "pointer"
330
- };
331
- const trackVisualStyles = unstyled ? {} : {
332
- backgroundColor: checked ? "#0066cc" : "#d1d5db",
333
- borderRadius: sizeConfig.height / 2,
334
- transition: "background-color 0.2s ease",
335
- opacity: disabled ? 0.5 : 1
336
- };
337
- const thumbStructuralStyles = {
338
- position: "absolute",
339
- left: 2,
340
- width: sizeConfig.thumb,
341
- height: sizeConfig.thumb,
342
- pointerEvents: "none",
343
- transform: checked ? `translateX(${sizeConfig.translate}px)` : "translateX(0)"
344
- };
345
- const thumbVisualStyles = unstyled ? {} : {
346
- backgroundColor: "white",
347
- borderRadius: "50%",
348
- boxShadow: "0 1px 3px rgba(0, 0, 0, 0.2)",
349
- transition: "transform 0.2s ease"
350
- };
351
- const labelStyles = unstyled ? {
352
- marginLeft: 8,
353
- userSelect: "none",
354
- cursor: disabled ? "not-allowed" : "pointer"
355
- } : {
356
- marginLeft: 8,
357
- userSelect: "none",
358
- cursor: disabled ? "not-allowed" : "pointer",
359
- opacity: disabled ? 0.5 : 1
360
- };
361
- return /* @__PURE__ */ jsxs(
362
- "div",
363
- {
364
- style: wrapperStructuralStyles,
365
- "data-compa11y-switch-wrapper": true,
366
- "data-size": size,
367
- children: [
368
- /* @__PURE__ */ jsx(
369
- "button",
370
- {
371
- ref,
372
- type: "button",
373
- role: "switch",
374
- "aria-checked": checked,
375
- "aria-label": computedAriaLabel,
376
- "aria-labelledby": computedAriaLabelledby,
377
- disabled,
378
- onClick: handleClick,
379
- onKeyDown: handleKeyDown,
380
- className,
381
- style: { ...trackStructuralStyles, ...trackVisualStyles },
382
- tabIndex: disabled ? -1 : 0,
383
- "data-compa11y-switch": true,
384
- "data-checked": checked,
385
- "data-disabled": disabled || void 0,
386
- "data-size": size,
387
- ...props,
388
- onFocus: (e) => {
389
- if (!unstyled) {
390
- e.currentTarget.style.outline = "2px solid #0066cc";
391
- e.currentTarget.style.outlineOffset = "2px";
392
- }
393
- props.onFocus?.(e);
394
- },
395
- onBlur: (e) => {
396
- if (!unstyled) {
397
- e.currentTarget.style.outline = "none";
398
- }
399
- props.onBlur?.(e);
400
- },
401
- children: /* @__PURE__ */ jsx(
402
- "span",
403
- {
404
- style: { ...thumbStructuralStyles, ...thumbVisualStyles },
405
- "data-compa11y-switch-thumb": true,
406
- "aria-hidden": "true"
407
- }
408
- )
409
- }
410
- ),
411
- label && /* @__PURE__ */ jsx(
412
- "label",
413
- {
414
- id: labelId,
415
- onClick: disabled ? void 0 : () => toggleSwitch(),
416
- style: labelStyles,
417
- "data-compa11y-switch-label": true,
418
- children: label
419
- }
420
- )
421
- ]
422
- }
423
- );
424
- }
425
- );
426
- Switch.displayName = "Switch";
427
-
428
- export { Switch, useFocusControl, useFocusManager, useFocusVisible, useFocusWithin, useRovingTabindex, useRovingTabindexMap };
429
- //# sourceMappingURL=index.js.map
430
- //# sourceMappingURL=index.js.map
1
+ export{k as Dialog,j as DialogActions,d as DialogBase,h as DialogClose,i as DialogContent,g as DialogDescription,f as DialogTitle,e as DialogTrigger,c as useDialogContext,a as useFocusTrap,b as useFocusTrapControls}from'./chunk-ZB3SYGHE.js';export{i as ActionMenu,c as ActionMenuBase,e as ActionMenuContent,f as ActionMenuItem,h as ActionMenuLabel,g as ActionMenuSeparator,d as ActionMenuTrigger,a as useActionMenuContext}from'./chunk-GITBIGD4.js';export{d as Tab,c as TabList,e as TabPanel,f as Tabs,b as TabsBase,a as useTabsContext}from'./chunk-SB6ASQ36.js';export{b as ToastProvider,c as ToastViewport,a as useToast,d as useToastHelpers}from'./chunk-XEJXACWE.js';export{e as Combobox,a as ComboboxBase,b as ComboboxInput,c as ComboboxListbox,d as ComboboxOption}from'./chunk-HEA4NAOM.js';import {a}from'./chunk-MD4AVTLT.js';export{c as useAnnounceLoading,b as useAnnounceOnChange,a as useAnnouncer}from'./chunk-MD4AVTLT.js';import {e,a as a$1}from'./chunk-VMM4K2K4.js';export{d as useGridKeyboard,f as useKeyPressed,a as useKeyboard,b as useMenuKeyboard,c as useTabsKeyboard,e as useTypeAhead}from'./chunk-VMM4K2K4.js';import {a as a$2}from'./chunk-IZ7LLPPV.js';export{a as useId,c as useIdScope,b as useIds}from'./chunk-IZ7LLPPV.js';import {createContext,forwardRef,useCallback,useRef,useState,useEffect,useLayoutEffect,useMemo,useContext,Children}from'react';import {createComponentWarnings,initFocusVisible,isFocusVisible,focusWithVisibleRing}from'@compa11y/core';export{announce,announceAssertive,announceError,announcePolite,announceProgress,announceStatus,aria,buildAriaProps,checks,createComponentWarnings,hasAccessibleName,isAndroid,isBrowser,isIOS,isMac,mergeAriaIds,prefersDarkMode,prefersHighContrast,prefersReducedMotion,setWarningHandler,warn}from'@compa11y/core';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function te(){let[x,t]=useState(false);useEffect(()=>initFocusVisible(),[]);let c=useCallback(()=>{t(isFocusVisible());},[]),r=useCallback(()=>{t(false);},[]);return {isFocusVisible:x,focusProps:{onFocus:c,onBlur:r}}}function Ot(x={}){let{autoFocus:t=false,restoreFocus:c=false,focusVisible:r=true}=x,e=useCallback(n=>{n&&t&&requestAnimationFrame(()=>{r?focusWithVisibleRing(n):n.focus();});},[t,r]);return useEffect(()=>{if(!c)return;let n=document.activeElement;return ()=>{n&&n.focus&&n.focus();}},[c]),e}function At(){let x=useCallback(c=>{},[]),t=useCallback(c=>{let r=x;r.current&&(c?.visible?focusWithVisibleRing(r.current):r.current.focus());},[]);return {ref:x,focus:t}}function Vt(){let[x,t]=useState(false),c=useCallback(n=>{},[]),r=useCallback(()=>{t(true);},[]),e=useCallback(n=>{let i=n.currentTarget,l=n.relatedTarget;(!l||!i.contains(l))&&t(false);},[]);return {ref:c,hasFocus:x,focusWithinProps:{onFocus:r,onBlur:e}}}function Qe(x){let{itemCount:t,initialIndex:c=0,wrap:r=true,orientation:e="both",onChange:n}=x,[i,l]=useState(c),o=useRef([]);useEffect(()=>{i>=t&&l(Math.max(0,t-1));},[t,i]);let a=useCallback(b=>{let f=b;f<0?f=r?t-1:0:f>=t&&(f=r?0:t-1),l(f),n?.(f),o.current[f]?.focus();},[t,r,n]),p=useCallback((b,f)=>{let m=false;switch(b.key){case "ArrowRight":(e==="horizontal"||e==="both")&&(a(f+1),m=true);break;case "ArrowLeft":(e==="horizontal"||e==="both")&&(a(f-1),m=true);break;case "ArrowDown":(e==="vertical"||e==="both")&&(a(f+1),m=true);break;case "ArrowUp":(e==="vertical"||e==="both")&&(a(f-1),m=true);break;case "Home":a(0),m=true;break;case "End":a(t-1),m=true;break}m&&(b.preventDefault(),b.stopPropagation());},[e,a,t]),s=useCallback(b=>({ref:f=>{o.current[b]=f;},tabIndex:b===i?0:-1,onKeyDown:f=>p(f,b),onFocus:()=>{b!==i&&(l(b),n?.(b));}}),[i,p,n]);return {activeIndex:i,setActiveIndex:a,getItemProps:s,first:()=>a(0),last:()=>a(t-1),next:()=>a(i+1),previous:()=>a(i-1)}}function Nt(x,t={}){let c=Qe({...t,itemCount:x.length}),r=useCallback(n=>{let i=x.indexOf(n);if(i===-1)throw new Error(`Unknown item ID: ${n}`);return c.getItemProps(i)},[x,c]),e=x[c.activeIndex];return {...c,activeId:e,getItemProps:r,setActiveId:n=>{let i=x.indexOf(n);i!==-1&&c.setActiveIndex(i);}}}var nn=createComponentWarnings("Select"),Gt=createContext(null);function nt(){let x=useContext(Gt);if(!x)throw new Error("Select compound components must be used within a Select component");return x}function Dt(x,t,c){let r=x.length,e=t+c;e<0&&(e=r-1),e>=r&&(e=0);let n=e;for(;x[e]?.disabled;)if(e+=c,e<0&&(e=r-1),e>=r&&(e=0),e===n)return -1;return e}function Bt(x){return x.findIndex(t=>!t.disabled)}function zt(x){for(let t=x.length-1;t>=0;t--)if(!x[t]?.disabled)return t;return -1}function at({options:x,value:t,defaultValue:c,onValueChange:r,disabled:e=false,placeholder:n="Select an option...","aria-label":i,"aria-labelledby":l,children:o}){let[a,p]=useState(c??null),[s,b]=useState(false),[f,m]=useState(-1),u=useRef(null),T=t!==void 0?t:a,C=a$2("select-trigger"),S=a$2("select-listbox"),R=a$2("select-option"),d=useCallback(P=>{t===void 0&&p(P),r?.(P);},[t,r]),y=useCallback(P=>`${R}-${P}`,[R]),w=useCallback(P=>{d(P.value),b(false),m(-1),u.current?.focus();},[d]);useEffect(()=>{!i&&!l&&nn.warning("Select has no accessible label.","Add aria-label or aria-labelledby prop.");},[i,l]);let E={selectedValue:T,setSelectedValue:d,isOpen:s,setIsOpen:b,highlightedIndex:f,setHighlightedIndex:m,options:x,triggerId:C,listboxId:S,getOptionId:y,onSelect:w,triggerRef:u,placeholder:n,disabled:e};return jsx(Gt.Provider,{value:E,children:jsx("div",{"data-compa11y-select":true,"data-disabled":e||void 0,children:o})})}var rt=forwardRef(function({onKeyDown:t,onClick:c,onBlur:r,...e$1},n){let{selectedValue:i,isOpen:l,setIsOpen:o,highlightedIndex:a$2,setHighlightedIndex:p,options:s,triggerId:b,listboxId:f,getOptionId:m,onSelect:u,triggerRef:T,placeholder:C,disabled:S}=nt(),{announce:R}=a(),d=e(s.map(h=>h.label),h=>{let F=s.findIndex(H=>H.label===h&&!H.disabled);F>=0&&(l||o(true),p(F));},{disabled:S}),y=useCallback((h=false)=>{o(true);let F=s.findIndex(H=>H.value===i);F>=0?p(F):p(h?zt(s):Bt(s));},[s,i,o,p]),w=a$1({ArrowDown:()=>{if(!l)y();else {let h=Dt(s,a$2,1);h>=0&&p(h);}},ArrowUp:()=>{if(!l)y(true);else {let h=Dt(s,a$2,-1);h>=0&&p(h);}},Enter:()=>{if(l&&a$2>=0){let h=s[a$2];h&&!h.disabled&&(u(h),R(`${h.label} selected`));}else l||y();}," ":()=>{if(l&&a$2>=0){let h=s[a$2];h&&!h.disabled&&(u(h),R(`${h.label} selected`));}else l||y();},Escape:()=>{l&&(o(false),p(-1));},Home:()=>{l&&p(Bt(s));},End:()=>{l&&p(zt(s));},Tab:()=>(l&&(o(false),p(-1)),false)},{preventDefault:true,stopPropagation:false}),E=h=>{t?.(h),h.defaultPrevented||w.onKeyDown(h),h.defaultPrevented||d.onKeyDown(h);},P=h=>{c?.(h),!h.defaultPrevented&&!S&&(l?(o(false),p(-1)):y());},O=h=>{r?.(h),setTimeout(()=>{o(false),p(-1);},150);},N=l&&a$2>=0?m(a$2):void 0,A=s.find(h=>h.value===i),$=A?.label??C,g=useCallback(h=>{T.current=h,typeof n=="function"?n(h):n&&(n.current=h);},[n,T]);return jsxs("button",{ref:g,id:b,type:"button",role:"combobox","aria-expanded":l,"aria-controls":f,"aria-haspopup":"listbox","aria-activedescendant":N,disabled:S,onKeyDown:E,onClick:P,onBlur:O,"data-compa11y-select-trigger":true,"data-placeholder":!A||void 0,...e$1,children:[jsx("span",{"data-compa11y-select-value":true,children:$}),jsx("span",{"aria-hidden":"true","data-compa11y-select-chevron":true,children:"\u25BC"})]})}),it=forwardRef(function({children:t,style:c,...r},e){let{isOpen:n,options:i,listboxId:l,triggerId:o}=nt(),{announce:a$1}=a(),p=useRef(null),[s,b]=useState("bottom");useEffect(()=>{n&&a$1(`${i.length} option${i.length===1?"":"s"} available`);},[n,i.length,a$1]),useLayoutEffect(()=>{if(n&&p.current){let C=p.current.getBoundingClientRect(),R=window.innerHeight-C.top,d=C.top,y=Math.min(C.height,200);R<y+50&&d>R?b("top"):b("bottom");}},[n]);let f=T=>{T.preventDefault();},m=useCallback(T=>{p.current=T,typeof e=="function"?e(T):e&&(e.current=T);},[e]);return n?jsx("ul",{ref:m,id:l,role:"listbox","aria-labelledby":o,style:{...c,...s==="top"?{bottom:"100%",top:"auto",marginBottom:"4px",marginTop:0}:{}},onMouseDown:f,"data-compa11y-select-listbox":true,"data-position":s,...r,children:t??i.map((T,C)=>jsx(ke,{option:T,index:C},T.value))}):null}),ke=forwardRef(function({option:t,index:c,onClick:r,onMouseEnter:e,...n},i){let{selectedValue:l,highlightedIndex:o,setHighlightedIndex:a$1,getOptionId:p,onSelect:s}=nt(),{announce:b}=a(),f=useRef(null),m=l===t.value,u=o===c,T=p(c);useEffect(()=>{u&&f.current&&f.current.scrollIntoView({block:"nearest",behavior:"smooth"});},[u]);let C=d=>{r?.(d),!d.defaultPrevented&&!t.disabled&&(s(t),b(`${t.label} selected`));},S=d=>{e?.(d),t.disabled||a$1(c);},R=useCallback(d=>{f.current=d,typeof i=="function"?i(d):i&&(i.current=d);},[i]);return jsxs("li",{ref:R,id:T,role:"option","aria-selected":m,"aria-disabled":t.disabled,"data-highlighted":u,"data-selected":m,"data-disabled":t.disabled,onClick:C,onMouseEnter:S,"data-compa11y-select-option":true,...n,children:[jsx("span",{"data-compa11y-select-option-text":true,children:t.label}),m&&jsx("span",{"aria-hidden":"true","data-compa11y-select-check":true,children:"\u2713"})]})}),$t=Object.assign(at,{Trigger:rt,Listbox:it,Option:ke});var Wt=createComponentWarnings("Checkbox"),cn=()=>jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",style:{display:"block"},children:jsx("path",{d:"M2.5 6L5 8.5L9.5 3.5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),un=()=>jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",style:{display:"block"},children:jsx("path",{d:"M3 6H9",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),Ut=createContext(null);function ct(){return useContext(Ut)}var we=forwardRef(function({value:t,defaultValue:c=[],onValueChange:r,disabled:e=false,legend:n,error:i,orientation:l="vertical",name:o,unstyled:a=false,className:p="",children:s,"aria-label":b,"aria-labelledby":f},m){let u=a$2("checkbox-group"),T=o||u,C=a$2("checkbox-group-error"),[S,R]=useState(c),d=t!==void 0,y=d?t:S;useEffect(()=>{!n&&!b&&!f&&Wt.warning("CheckboxGroup has no accessible label. Screen readers need this to identify the group.",'Add legend="...", aria-label="...", or aria-labelledby="..."');},[n,b,f]);let w=useCallback((g,h)=>{let F=d?t:S,H=h?[...F,g]:F.filter(D=>D!==g);d||R(H),r?.(H);},[d,t,S,r]),E={name:T,value:y,disabled:e,unstyled:a,onCheckboxChange:w},P=!!i,O={border:"none",margin:0,padding:0,minWidth:0},N=a?{padding:0,marginBottom:"0.5rem"}:{padding:0,marginBottom:"0.5rem",fontWeight:600},A={display:"flex",flexDirection:l==="horizontal"?"row":"column",flexWrap:l==="horizontal"?"wrap":void 0,gap:"var(--compa11y-checkbox-group-gap, 0.75rem)"},$=a?{marginTop:"0.25rem"}:{color:"var(--compa11y-checkbox-group-error-color, #ef4444)",fontSize:"0.8125rem",marginTop:"0.25rem"};return jsx(Ut.Provider,{value:E,children:jsxs("fieldset",{ref:m,className:p,"aria-label":b,"aria-labelledby":f,"aria-describedby":P?C:void 0,disabled:e,"data-compa11y-checkbox-group":"","data-orientation":l,"data-disabled":e?"true":void 0,style:O,children:[n&&jsx("legend",{"data-compa11y-checkbox-group-legend":"",style:N,children:n}),jsx("div",{style:A,children:s}),P&&jsx("div",{id:C,role:"alert","data-compa11y-checkbox-group-error":"",style:$,children:i})]})})});we.displayName="CheckboxGroup";var He=forwardRef(function({checked:t,defaultChecked:c=false,onCheckedChange:r,indeterminate:e=false,label:n,hint:i,error:l,disabled:o=false,value:a$1,required:p=false,unstyled:s,className:b="",size:f="md",name:m,"aria-label":u,"aria-labelledby":T,"aria-describedby":C,onClick:S,onFocus:R,onBlur:d,...y},w){let E=ct(),P=a$2("checkbox"),O=`${P}-input`,N=`${P}-label`,A=`${P}-hint`,$=`${P}-error`,{announce:g}=a(),{isFocusVisible:h,focusProps:F}=te(),H=E!==null,D=H&&E.disabled||o,z=s??(H?E.unstyled:false),I=H?E.name:m,[U,q]=useState(c),W=H?E.value.includes(a$1||""):t!==void 0?t:U,K=useRef(null),V=useCallback(ce=>{K.current=ce,typeof w=="function"?w(ce):w&&(w.current=ce);},[w]);useEffect(()=>{K.current&&(K.current.indeterminate=e);},[e]),useEffect(()=>{!n&&!u&&!T&&Wt.warning("Checkbox has no accessible label. Screen readers need this to identify the checkbox.",'Add label="...", aria-label="...", or aria-labelledby="..."');},[n,u,T]);let j=useCallback(ce=>{let Le=ce.target.checked;H?E.onCheckboxChange(a$1||"",Le):(t===void 0&&q(Le),r?.(Le)),g(`${typeof n=="string"?n:u||"Checkbox"} ${Le?"checked":"unchecked"}`);},[H,E,a$1,t,r,n,u,g]),X=useCallback(ce=>{F.onFocus(),R?.(ce);},[F,R]),J=useCallback(ce=>{F.onBlur(),d?.(ce);},[F,d]),_=!!n,ee=!!i,oe=!!l,ne=[];C&&ne.push(C),ee&&ne.push(A),oe&&ne.push($);let v=ne.length?ne.join(" "):void 0,M={sm:{box:16},md:{box:20},lg:{box:24}}[f],L={display:"inline-flex",alignItems:"flex-start",gap:"0.5rem",cursor:D?"not-allowed":"pointer",userSelect:"none",...D&&!z?{opacity:.5}:{}},G={position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0},Re={position:"absolute",opacity:0,width:"100%",height:"100%",margin:0,cursor:"inherit",zIndex:1},xe=z?{}:{width:M.box,height:M.box,minWidth:24,minHeight:24,border:W||e?"var(--compa11y-checkbox-checked-border, 2px solid #0066cc)":"var(--compa11y-checkbox-border, 2px solid #666)",borderRadius:"var(--compa11y-checkbox-radius, 3px)",background:W||e?"var(--compa11y-checkbox-checked-bg, #0066cc)":"var(--compa11y-checkbox-bg, white)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,transition:"all 0.15s ease",pointerEvents:"none",color:"var(--compa11y-checkbox-check-color, white)",...h?{outline:"2px solid var(--compa11y-focus-color, #0066cc)",outlineOffset:"2px"}:{}},po={display:"flex",flexDirection:"column",gap:"0.125rem",paddingTop:"0.125rem"},bo=z?{cursor:"inherit"}:{cursor:"inherit",color:"var(--compa11y-checkbox-label-color, inherit)"},fo=z?{}:{color:"var(--compa11y-checkbox-hint-color, #666)",fontSize:"0.8125rem"},mo=z?{}:{color:"var(--compa11y-checkbox-error-color, #ef4444)",fontSize:"0.8125rem"};return jsxs("div",{className:b,"data-compa11y-checkbox":"","data-checked":W?"true":"false","data-indeterminate":e?"true":void 0,"data-disabled":D?"true":void 0,"data-size":f,style:L,children:[jsxs("div",{style:G,children:[jsx("input",{ref:V,type:"checkbox",id:O,name:I,value:a$1,checked:W,onChange:j,onClick:S,onFocus:X,onBlur:J,disabled:D,required:p,"aria-required":p||void 0,"aria-invalid":oe||void 0,"aria-label":!_&&!T?u:void 0,"aria-labelledby":T||(_?N:void 0),"aria-describedby":v,"aria-checked":e?"mixed":W,tabIndex:D?-1:0,style:Re,...y}),!z&&jsxs("div",{"data-compa11y-checkbox-indicator":"","aria-hidden":"true",style:xe,children:[W&&!e&&jsx(cn,{}),e&&jsx(un,{})]})]}),(_||ee||oe)&&jsxs("div",{style:po,children:[_&&jsxs("label",{htmlFor:O,id:N,"data-compa11y-checkbox-label":"",style:bo,children:[n,p&&jsx("span",{"aria-hidden":"true",style:{color:"var(--compa11y-checkbox-required-color, #ef4444)",marginLeft:"0.125rem"},children:"*"})]}),ee&&jsx("div",{id:A,"data-compa11y-checkbox-hint":"",style:fo,children:i}),oe&&jsx("div",{id:$,role:"alert","data-compa11y-checkbox-error":"",style:mo,children:l})]})]})});He.displayName="Checkbox";var Fe=forwardRef(function({children:t,className:c},r){return jsx("div",{ref:r,className:c,"data-compa11y-checkbox-indicator":"","aria-hidden":"true",children:t})});Fe.displayName="CheckboxIndicator";var qt=Object.assign(He,{Group:we,Indicator:Fe});var mn=createComponentWarnings("RadioGroup"),pt=createContext(null);function bt(){let x=useContext(pt);if(!x)throw new Error("[Compa11y RadioGroup]: Radio must be used within a RadioGroup.");return x}var Oe=forwardRef(function({value:t,defaultValue:c,onValueChange:r,disabled:e=false,discoverable:n=true,required:i=false,orientation:l="vertical",name:o,legend:a,hint:p,error:s,unstyled:b=false,className:f="",children:m,"aria-label":u,"aria-labelledby":T},C){let S=a$2("radiogroup"),R=o||S,d=a$2("radiogroup-hint"),y=a$2("radiogroup-error"),[w,E]=useState(c??null),P=t!==void 0,O=P?t:w,N=useRef(new Map);useEffect(()=>{!a&&!u&&!T&&mn.warning("RadioGroup has no accessible label. Screen readers need this to identify the group.",'Add legend="...", aria-label="...", or aria-labelledby="..."');},[a,u,T]);let A=useCallback(V=>{e||(P||E(V),r?.(V));},[e,P,r]),$=useCallback((V,j)=>{N.current.set(V,j);},[]),g=useCallback(V=>{N.current.delete(V);},[]),h=useCallback((V,j)=>{N.current.set(V,j);},[]),F=useCallback(()=>{let V=[];return N.current.forEach((j,X)=>{!j&&!e&&V.push(X);}),V},[e]),H=useRef(null),D=C||H,z=useCallback(V=>{let j=F();if(j.length===0)return;let X=O?j.indexOf(O):-1,J;switch(V){case "next":J=X<0?0:(X+1)%j.length;break;case "prev":J=X<0?j.length-1:(X-1+j.length)%j.length;break;case "first":J=0;break;case "last":J=j.length-1;break}let _=j[J];if(_!==void 0){A(_);let ee=typeof D=="object"&&D?D.current:null;ee&&ee.querySelector(`input[type="radio"][value="${CSS.escape(_)}"]`)?.focus();}},[F,O,A,D]),I=a$1({ArrowDown:()=>z("next"),ArrowRight:()=>z("next"),ArrowUp:()=>z("prev"),ArrowLeft:()=>z("prev"),Home:()=>z("first"),End:()=>z("last")},{preventDefault:true,stopPropagation:true,disabled:e}),U={name:R,value:O??null,disabled:e,discoverable:n,required:i,unstyled:b,orientation:l,onValueChange:A,registerRadio:$,unregisterRadio:g,updateRadioDisabled:h},q=[];p&&q.push(d),s&&q.push(y);let W=q.length>0?q.join(" "):void 0,K=jsxs(Fragment,{children:[jsx("div",{style:b?{display:"flex",flexDirection:l==="horizontal"?"row":"column"}:{display:"flex",flexDirection:l==="horizontal"?"row":"column",gap:"var(--compa11y-radio-gap, 0.75rem)"},children:m}),p&&jsx("div",{id:d,style:b?{}:{color:"var(--compa11y-radio-group-hint-color, #666)",fontSize:"0.8125rem",marginTop:"0.25rem"},children:p}),s&&jsx("div",{id:y,role:"alert",style:b?{}:{color:"var(--compa11y-radio-group-error-color, #ef4444)",fontSize:"0.8125rem",marginTop:"0.25rem"},children:s})]});return a?jsx(pt.Provider,{value:U,children:jsxs("fieldset",{ref:D,role:"radiogroup","aria-label":u,"aria-labelledby":T,"aria-orientation":l,"aria-required":i||void 0,"aria-disabled":e||void 0,"aria-invalid":s?true:void 0,"aria-describedby":W,className:`compa11y-radiogroup ${f}`.trim(),"data-compa11y-radiogroup":"","data-orientation":l,"data-disabled":e?"true":void 0,"data-error":s?"true":void 0,onKeyDown:I.onKeyDown,style:b?{border:"none",margin:0,padding:0,minWidth:0}:{border:"none",margin:0,padding:0,minWidth:0},children:[jsxs("legend",{style:b?{}:{padding:0,marginBottom:"var(--compa11y-radio-group-legend-gap, 0.5rem)",fontWeight:"var(--compa11y-radio-group-legend-weight, 600)",color:"var(--compa11y-radio-group-legend-color, inherit)",fontSize:"var(--compa11y-radio-group-legend-size, 1rem)"},children:[a,i&&!b&&jsxs("span",{"aria-hidden":"true",style:{color:"var(--compa11y-radio-group-required-color, #ef4444)",marginLeft:"0.125rem"},children:[" ","*"]})]}),K]})}):jsx(pt.Provider,{value:U,children:jsx("div",{ref:D,role:"radiogroup","aria-label":u,"aria-labelledby":T,"aria-orientation":l,"aria-required":i||void 0,"aria-disabled":e||void 0,"aria-invalid":s?true:void 0,"aria-describedby":W,className:`compa11y-radiogroup ${f}`.trim(),"data-compa11y-radiogroup":"","data-orientation":l,"data-disabled":e?"true":void 0,"data-error":s?"true":void 0,onKeyDown:I.onKeyDown,children:K})})});Oe.displayName="RadioGroup";var Ae=forwardRef(function({value:t,disabled:c=false,discoverable:r,label:e,hint:n,unstyled:i,className:l="",children:o,"aria-label":a$1},p){let s=bt(),b=a$2("radio"),f=a$2("radio-hint"),m=s.disabled||c,u=r??s.discoverable,T=i??s.unstyled,C=s.value===t,{announce:S}=a(),{isFocusVisible:R,focusProps:d}=te(),y=useRef(null),w=useCallback(I=>{y.current=I,typeof p=="function"?p(I):p&&(p.current=I);},[p]);useEffect(()=>(s.registerRadio(t,m),()=>s.unregisterRadio(t)),[t]),useEffect(()=>{s.updateRadioDisabled(t,m);},[m,t]);let E=useCallback(I=>{if(m){I.preventDefault();return}s.onValueChange(t),S(`${e||(typeof o=="string"?o:null)||t} selected`,{politeness:"polite"});},[m,s,t,e,o,S]),P=useCallback(I=>{m&&I.preventDefault();},[m]),O=useCallback(I=>{d.onFocus(),!C&&!m&&s.onValueChange(t);},[d,C,m,s,t]),N=useCallback(()=>{d.onBlur();},[d]),A=!!(o||e),$=o||e,g=`${b}-label`,h=!!n,F=(()=>{if(s.value!==null)return false;let I=Array.from(y.current?.closest('[role="radiogroup"]')?.querySelectorAll('input[type="radio"]')??[]);for(let U of I){let q=U;if(!q.disabled&&q.getAttribute("aria-disabled")!=="true")return q.value===t}return false})(),H=m&&!u?-1:C||s.value===null&&F?0:-1,D=m&&!u,z=h?f:void 0;return jsxs("label",{htmlFor:b,className:`compa11y-radio-wrapper ${l}`.trim(),"data-compa11y-radio":"","data-value":t,"data-checked":C?"true":"false","data-disabled":m?"true":void 0,style:T?{display:"inline-flex",alignItems:"flex-start",cursor:m?"not-allowed":"pointer",gap:"0.5rem"}:{display:"inline-flex",alignItems:"flex-start",gap:"var(--compa11y-radio-gap, 0.5rem)",cursor:m?"not-allowed":"pointer",userSelect:"none",opacity:m?.5:1},children:[jsxs("div",{style:{position:"relative",display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:[jsx("input",{ref:w,type:"radio",id:b,name:s.name,value:t,checked:C,onChange:E,onClick:P,onFocus:O,onBlur:N,disabled:D,tabIndex:H,"aria-disabled":m?"true":void 0,"aria-label":A?void 0:a$1,"aria-labelledby":A?g:void 0,"aria-describedby":z,required:s.required,className:"compa11y-radio-input",style:{position:"absolute",opacity:0,width:"var(--compa11y-radio-size, 1.25rem)",height:"var(--compa11y-radio-size, 1.25rem)",margin:0,cursor:m?"not-allowed":"pointer"}}),!T&&jsx("div",{className:"compa11y-radio-circle",style:{width:"var(--compa11y-radio-size, 1.25rem)",height:"var(--compa11y-radio-size, 1.25rem)",minWidth:"24px",minHeight:"24px",border:C?"var(--compa11y-radio-checked-border, 2px solid #0066cc)":"var(--compa11y-radio-border, 2px solid #666)",borderRadius:"50%",background:C?"var(--compa11y-radio-checked-bg, #0066cc)":"var(--compa11y-radio-bg, white)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0,transition:"all 0.15s ease",pointerEvents:"none",...R?{outline:"2px solid var(--compa11y-focus-color, #0066cc)",outlineOffset:"2px"}:{}},children:jsx("div",{"aria-hidden":"true",style:{width:"var(--compa11y-radio-dot-size, 0.5rem)",height:"var(--compa11y-radio-dot-size, 0.5rem)",borderRadius:"50%",background:"var(--compa11y-radio-dot-color, white)",opacity:C?1:0,transform:C?"scale(1)":"scale(0)",transition:"all 0.15s ease"}})})]}),(A||h)&&jsxs("div",{style:T?{}:{display:"flex",flexDirection:"column",gap:"0.125rem",paddingTop:"0.125rem"},children:[A&&jsx("span",{id:g,className:"compa11y-radio-label",style:T?{}:{color:"var(--compa11y-radio-label-color, inherit)",fontSize:"var(--compa11y-radio-label-size, 1rem)"},children:$}),h&&jsx("span",{id:f,className:"compa11y-radio-hint",style:T?{}:{color:"var(--compa11y-radio-hint-color, #666)",fontSize:"var(--compa11y-radio-hint-size, 0.8125rem)"},children:n})]})]})});Ae.displayName="Radio";var Yt=Object.assign(Oe,{Radio:Ae});var Tn=createComponentWarnings("Switch"),mt=forwardRef(function({checked:t,defaultChecked:c=false,onCheckedChange:r,label:e,disabled:n=false,unstyled:i=false,className:l,size:o="md","aria-label":a$3,"aria-labelledby":p,onClick:s,...b},f){let u=`${a$2("switch")}-label`,{announce:T}=a(),[C,S]=useState(c),R=t!==void 0,d=R?t:C;useEffect(()=>{!e&&!a$3&&!p&&Tn.warning("Switch has no accessible label. Screen readers need this to identify the switch.",'Add label="Description", aria-label="...", or aria-labelledby="..."');},[e,a$3,p]);let y=useCallback(()=>{if(n)return;let I=!d;R||S(I),r?.(I),T(`${e||a$3||"Switch"} ${I?"on":"off"}`);},[d,n,R,r,e,a$3,T]),w=useCallback(I=>{s?.(I),I.defaultPrevented||y();},[s,y]),E=a$1({" ":()=>{y();},Enter:()=>{y();}},{preventDefault:true}),P=I=>{b.onKeyDown?.(I),I.defaultPrevented||E.onKeyDown(I);},O=a$3,N=p||(e?u:void 0),A={display:"inline-flex",alignItems:"center"},g={sm:{width:32,height:18,thumb:14,translate:14},md:{width:44,height:24,thumb:20,translate:20},lg:{width:56,height:30,thumb:26,translate:26}}[o],h={position:"relative",display:"inline-flex",alignItems:"center",flexShrink:0,width:g.width,height:g.height,border:"none",padding:2,cursor:n?"not-allowed":"pointer"},F=i?{}:{backgroundColor:d?"#0066cc":"#d1d5db",borderRadius:g.height/2,transition:"background-color 0.2s ease",opacity:n?.5:1},H={position:"absolute",left:2,width:g.thumb,height:g.thumb,pointerEvents:"none",transform:d?`translateX(${g.translate}px)`:"translateX(0)"},D=i?{}:{backgroundColor:"white",borderRadius:"50%",boxShadow:"0 1px 3px rgba(0, 0, 0, 0.2)",transition:"transform 0.2s ease"},z=i?{marginLeft:8,userSelect:"none",cursor:n?"not-allowed":"pointer"}:{marginLeft:8,userSelect:"none",cursor:n?"not-allowed":"pointer",opacity:n?.5:1};return jsxs("div",{style:A,"data-compa11y-switch-wrapper":true,"data-size":o,children:[jsx("button",{ref:f,type:"button",role:"switch","aria-checked":d,"aria-label":O,"aria-labelledby":N,disabled:n,onClick:w,onKeyDown:P,className:l,style:{...h,...F},tabIndex:n?-1:0,"data-compa11y-switch":true,"data-checked":d,"data-disabled":n||void 0,"data-size":o,...b,onFocus:I=>{i||(I.currentTarget.style.outline="2px solid #0066cc",I.currentTarget.style.outlineOffset="2px"),b.onFocus?.(I);},onBlur:I=>{i||(I.currentTarget.style.outline="none"),b.onBlur?.(I);},children:jsx("span",{style:{...H,...D},"data-compa11y-switch-thumb":true,"aria-hidden":"true"})}),e&&jsx("label",{id:u,onClick:n?void 0:()=>y(),style:z,"data-compa11y-switch-label":true,children:e})]})});mt.displayName="Switch";var In=createComponentWarnings("Listbox"),Qt=createContext(null);function De(){let x=useContext(Qt);if(!x)throw new Error("[Compa11y Listbox]: Option/Group must be used within a Listbox.");return x}var eo=createContext({groupDisabled:false}),Be=forwardRef(function({value:t,defaultValue:c,onValueChange:r,multiple:e$1=false,disabled:n=false,discoverable:i=true,orientation:l="vertical",unstyled:o=false,className:a$3="",children:p,"aria-label":s,"aria-labelledby":b},f){let m=a$2("listbox"),{announce:u}=a(),[T,C]=useState(()=>c??(e$1?[]:"")),S=t!==void 0,R=S?t:T,d=useMemo(()=>e$1?new Set(Array.isArray(R)?R:[]):new Set(R?[String(R)]:[]),[R,e$1]),[y,w]=useState(null),E=useRef(new Map),[P,O]=useState(0),N=useCallback((v,k,M)=>{E.current.set(v,{disabled:k,label:M}),O(L=>L+1);},[]),A=useCallback(v=>{E.current.delete(v),O(k=>k+1);},[]),$=useCallback((v,k)=>{let M=E.current.get(v);M&&E.current.set(v,{...M,disabled:k});},[]),g=useMemo(()=>{let v=[];return E.current.forEach((k,M)=>{!k.disabled&&!n&&v.push(M);}),v},[P,n]);useEffect(()=>{!s&&!b&&In.warning("Listbox has no accessible label. Screen readers need this.",'Add aria-label="..." or aria-labelledby="..."');},[s,b]);let h=useCallback(v=>d.has(v),[d]),F=useCallback(v=>{if(n)return;let k=E.current.get(v);if(k?.disabled)return;let M,L=k?.label||v;if(e$1){let G=new Set(d);G.has(v)?(G.delete(v),u(`${L} deselected`,{politeness:"polite"})):(G.add(v),u(`${L} selected`,{politeness:"polite"})),M=Array.from(G);}else M=v,u(`${L} selected`,{politeness:"polite"});S||C(M),r?.(M);},[n,e$1,d,S,r,u]),H=useCallback(v=>{if(g.length===0)return;let k=y?g.indexOf(y):-1,M;switch(v){case "next":M=k<0?0:Math.min(k+1,g.length-1);break;case "prev":M=k<0?g.length-1:Math.max(k-1,0);break;case "first":M=0;break;case "last":M=g.length-1;break}let L=g[M];if(L!==void 0)if(w(L),e$1){let Re=E.current.get(L)?.label||L,xe=d.has(L);u(`${Re}${xe?", selected":""}`,{politeness:"polite"});}else {let Re=E.current.get(L)?.label||L,xe=L;S||C(xe),r?.(xe),u(`${Re} selected`,{politeness:"polite"});}},[g,y,e$1,S,r,u,d]),D=useCallback(()=>{y&&e$1&&F(y);},[y,e$1,F]),z=useCallback(()=>{if(!e$1||!y)return;let v=g.indexOf(y);if(v<0)return;let k=g.slice(0,v+1),M=new Set(d);k.forEach(G=>M.add(G));let L=Array.from(M);S||C(L),r?.(L),w(g[0]??null),u(`${k.length} items selected`,{politeness:"polite"});},[e$1,y,g,d,S,r,u]),I=useCallback(()=>{if(!e$1||!y)return;let v=g.indexOf(y);if(v<0)return;let k=g.slice(v),M=new Set(d);k.forEach(G=>M.add(G));let L=Array.from(M);S||C(L),r?.(L),w(g[g.length-1]??null),u(`${k.length} items selected`,{politeness:"polite"});},[e$1,y,g,d,S,r,u]),U=useCallback(()=>{if(!e$1)return;let v=g.every(M=>d.has(M)),k;v?(k=[],u("All deselected",{politeness:"polite"})):(k=[...g],u("All selected",{politeness:"polite"})),S||C(k),r?.(k);},[e$1,g,d,S,r,u]),q=useMemo(()=>{let v={ArrowDown:()=>H("next"),ArrowUp:()=>H("prev"),Home:()=>H("first"),End:()=>H("last")};return e$1&&(v[" "]=()=>D(),v["Shift+ArrowDown"]=()=>{H("next"),setTimeout(()=>D(),0);},v["Shift+ArrowUp"]=()=>{H("prev"),setTimeout(()=>D(),0);},v["Ctrl+Shift+Home"]=()=>z(),v["Ctrl+Shift+End"]=()=>I(),v["Ctrl+a"]=()=>U(),v["Meta+a"]=()=>U()),v},[e$1,H,D,z,I,U]),W=a$1(q,{preventDefault:true,stopPropagation:true,disabled:n}),K=useMemo(()=>Array.from(E.current.values()).map(v=>v.label),[P]),V=e(K,v=>{for(let[k,M]of E.current.entries())if(M.label===v&&!M.disabled){if(w(k),!e$1){let L=k;S||C(L),r?.(L),u(`${v} selected`,{politeness:"polite"});}break}},{disabled:n}),j=useCallback(v=>{W.onKeyDown(v),v.defaultPrevented||V.onKeyDown(v);},[W,V]),X=useCallback(()=>{if(!y){if(!e$1&&R&&typeof R=="string"){w(R);return}if(e$1&&Array.isArray(R)&&R.length>0){w(R[0]??null);return}g.length>0&&w(g[0]??null);}},[y,e$1,R,g]),J=useCallback(()=>{},[]),_=useRef(null);useEffect(()=>{y&&_.current&&_.current.querySelector(`[data-value="${CSS.escape(y)}"]`)?.scrollIntoView({block:"nearest"});},[y]);let ee=useMemo(()=>({multiple:e$1,disabled:n,discoverable:i,unstyled:o,orientation:l,selectedValues:d,focusedValue:y,onSelect:F,onFocusOption:w,registerOption:N,unregisterOption:A,updateOptionDisabled:$,isSelected:h,listboxId:m}),[e$1,n,i,o,l,d,y,F,N,A,$,h,m]),oe=useCallback(v=>{_.current=v,typeof f=="function"?f(v):f&&(f.current=v);},[f]),ne=y?`${m}-option-${y}`:void 0;return jsx(Qt.Provider,{value:ee,children:jsx("div",{ref:oe,role:"listbox","aria-label":s,"aria-labelledby":b,"aria-orientation":l,"aria-multiselectable":e$1||void 0,"aria-disabled":n||void 0,"aria-activedescendant":ne,tabIndex:n&&!i?-1:0,className:`compa11y-listbox ${a$3}`.trim(),"data-compa11y-listbox":"","data-orientation":l,"data-disabled":n?"true":void 0,"data-multiple":e$1?"true":void 0,onKeyDown:j,onFocus:X,onBlur:J,style:o?{}:{width:"var(--compa11y-listbox-width, 250px)",maxHeight:"var(--compa11y-listbox-max-height, 300px)",overflowY:"auto",border:"var(--compa11y-listbox-border, 1px solid #e0e0e0)",borderRadius:"var(--compa11y-listbox-radius, 4px)",background:"var(--compa11y-listbox-bg, white)",padding:"var(--compa11y-listbox-padding, 0.25rem 0)",...n?{opacity:"var(--compa11y-listbox-disabled-opacity, 0.5)",cursor:"not-allowed"}:{}},children:p})})});Be.displayName="Listbox";var ze=forwardRef(function({value:t,disabled:c=false,discoverable:r,unstyled:e,className:n="",children:i,"aria-label":l},o){let a=De(),{groupDisabled:p}=useContext(eo),s=a.disabled||p||c,b=e??a.unstyled,f=a.isSelected(t),m=a.focusedValue===t,u=`${a.listboxId}-option-${t}`,T=useRef(""),C=useRef(null),S=useCallback(d=>{C.current=d,typeof o=="function"?o(d):o&&(o.current=d);},[o]);useEffect(()=>{let d=typeof i=="string"?i:C.current?.textContent?.trim()||t;return T.current=d,a.registerOption(t,s,d),()=>a.unregisterOption(t)},[t]),useEffect(()=>{a.updateOptionDisabled(t,s);},[s,t]);let R=useCallback(d=>{if(s){d.preventDefault();return}a.onFocusOption(t),a.onSelect(t);},[s,a,t]);return jsxs("div",{ref:S,id:u,role:"option","aria-selected":f,"aria-disabled":s||void 0,"aria-label":l,className:`compa11y-listbox-option ${n}`.trim(),"data-compa11y-listbox-option":"","data-value":t,"data-selected":f?"true":"false","data-focused":m?"true":"false","data-disabled":s?"true":void 0,onClick:R,style:b?{cursor:s?"not-allowed":"pointer"}:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"var(--compa11y-listbox-option-padding, 0.5rem 0.75rem)",cursor:s?"not-allowed":"pointer",userSelect:"none",transition:"background 0.1s ease",background:m?f?"var(--compa11y-listbox-option-selected-hover-bg, #cce0ff)":"var(--compa11y-listbox-option-hover-bg, #f5f5f5)":f?"var(--compa11y-listbox-option-selected-bg, #e6f0ff)":"transparent",fontWeight:f?500:"normal",opacity:s?.5:1},children:[jsx("span",{style:{flex:1},children:i}),f&&!b&&jsx("span",{"aria-hidden":"true",style:{fontSize:"0.875rem",color:"var(--compa11y-listbox-check-color, #0066cc)",marginLeft:"0.5rem"},children:"\u2713"})]})});ze.displayName="ListboxOption";var Ge=forwardRef(function({label:t,disabled:c=false,unstyled:r,className:e="",children:n},i){let l=De(),o=r??l.unstyled,a=a$2("listbox-group"),p=useMemo(()=>({groupDisabled:l.disabled||c}),[l.disabled,c]);return jsx(eo.Provider,{value:p,children:jsxs("div",{ref:i,role:"group","aria-labelledby":a,"aria-disabled":c||void 0,className:`compa11y-listbox-group ${e}`.trim(),"data-compa11y-listbox-group":"","data-disabled":c?"true":void 0,style:o?{}:{opacity:c?.5:1},children:[jsx("div",{id:a,role:"presentation",style:o?{}:{padding:"var(--compa11y-listbox-group-label-padding, 0.5rem 0.75rem 0.25rem)",fontSize:"var(--compa11y-listbox-group-label-size, 0.75rem)",fontWeight:600,color:"var(--compa11y-listbox-group-label-color, #666)",textTransform:"uppercase",letterSpacing:"0.05em"},children:t}),n]})})});Ge.displayName="ListboxGroup";var to=Object.assign(Be,{Option:ze,Group:Ge});var ro=createContext(null);function Te(){let x=useContext(ro);if(!x)throw new Error("[Compa11y Input]: Input sub-components (Input.Label, Input.Field, etc.) must be used within <Input>.");return x}var $e=forwardRef(function({children:t,className:c},r){let e=Te();return jsxs("label",{ref:r,id:e.labelId,htmlFor:e.fieldId,"data-compa11y-input-label":"",className:c,style:e.unstyled?{}:{display:"block",color:e.disabled?"var(--compa11y-input-disabled-color, #999)":"var(--compa11y-input-label-color, inherit)",fontSize:"var(--compa11y-input-label-size, 0.875rem)",fontWeight:"var(--compa11y-input-label-weight, 500)"},children:[t,e.required&&jsx("span",{"data-compa11y-input-required":"","aria-hidden":"true",style:e.unstyled?{}:{color:"var(--compa11y-input-required-color, #ef4444)",marginLeft:"0.125rem"},children:"*"})]})});$e.displayName="InputLabel";var Ke=forwardRef(function({type:t="text",onFocus:c,onBlur:r,className:e,style:n,...i},l){let o=Te(),a=useRef(null),p=useCallback(u=>{a.current=u,typeof l=="function"?l(u):l&&(l.current=u);},[l]),s=useCallback(u=>{o.setValue(u.target.value);},[o.setValue]),b=useCallback(u=>{o.focusProps.onFocus(),c?.(u);},[o.focusProps,c]),f=useCallback(u=>{o.focusProps.onBlur(),r?.(u);},[o.focusProps,r]),m=[];return m.push(o.hintId),o.hasError&&m.push(o.errorId),jsx("input",{ref:p,id:o.fieldId,type:t,value:o.value,onChange:s,onFocus:b,onBlur:f,disabled:o.disabled,readOnly:o.readOnly,"aria-describedby":m.join(" ")||void 0,"aria-invalid":o.hasError?"true":void 0,"aria-required":o.required?"true":void 0,"data-compa11y-input-field":"",className:e,style:o.unstyled?n:{width:"100%",padding:"var(--compa11y-input-padding, 0.5rem 0.75rem)",border:o.hasError?"1px solid var(--compa11y-input-border-error, #ef4444)":"var(--compa11y-input-border, 1px solid #ccc)",borderRadius:"var(--compa11y-input-radius, 4px)",fontSize:"var(--compa11y-input-font-size, 0.875rem)",fontFamily:"inherit",background:o.disabled?"var(--compa11y-input-disabled-bg, #f5f5f5)":o.readOnly?"var(--compa11y-input-readonly-bg, #f9f9f9)":"var(--compa11y-input-bg, white)",color:"inherit",cursor:o.disabled?"not-allowed":void 0,opacity:o.disabled?"var(--compa11y-input-disabled-opacity, 0.7)":void 0,...o.isFocusVisible&&!o.disabled?{outline:o.hasError?"2px solid var(--compa11y-input-border-error, #ef4444)":"2px solid var(--compa11y-focus-color, #0066cc)",outlineOffset:"-1px",borderColor:o.hasError?"var(--compa11y-input-border-error, #ef4444)":"var(--compa11y-input-border-focus, #0066cc)"}:{},...n},...i})});Ke.displayName="InputField";var je=forwardRef(function({children:t,className:c},r){let e=Te();return jsx("div",{ref:r,id:e.hintId,"data-compa11y-input-hint":"",className:c,style:e.unstyled?{}:{color:"var(--compa11y-input-hint-color, #666)",fontSize:"var(--compa11y-input-hint-size, 0.8125rem)"},children:t})});je.displayName="InputHint";var We=forwardRef(function({children:t,className:c},r){let e=Te();return t?jsx("div",{ref:r,id:e.errorId,role:"alert","data-compa11y-input-error":"",className:c,style:e.unstyled?{}:{color:"var(--compa11y-input-error-color, #ef4444)",fontSize:"var(--compa11y-input-error-size, 0.8125rem)"},children:t}):null});We.displayName="InputError";var Ue=forwardRef(function({value:t,defaultValue:c="",onValueChange:r,type:e="text",label:n,hint:i,error:l,required:o=false,disabled:a=false,readOnly:p=false,"aria-label":s,"aria-labelledby":b,placeholder:f,name:m,autoComplete:u,maxLength:T,minLength:C,pattern:S,inputMode:R,id:d,unstyled:y=false,className:w,onFocus:E,onBlur:P,children:O},N){let A=a$2("input"),$=d||A,g=`${$}-field`,h=`${$}-label`,F=`${$}-hint`,H=`${$}-error`,[D,z]=useState(c),I=t!==void 0,U=I?t:D,q=useCallback(G=>{I||z(G),r?.(G);},[I,r]),{isFocusVisible:W,focusProps:K}=te();useEffect(()=>{process.env.NODE_ENV!=="production"&&!(Children.count(O)>0)&&!n&&!s&&!b&&console.warn("[Compa11y Input]: Input has no accessible label. Screen readers need this to identify the input. Use label prop, aria-label, or aria-labelledby.");},[O,n,s,b]);let V=!!l,j=Children.count(O)>0,X={fieldId:g,labelId:h,hintId:F,errorId:H,value:U,setValue:q,hasError:V,disabled:a,readOnly:p,required:o,isFocusVisible:W,focusProps:K,unstyled:y},J={"data-compa11y-input":"","data-error":V?"true":"false","data-disabled":a?"true":"false","data-required":o?"true":"false","data-readonly":p?"true":"false"},_=y?{}:{display:"flex",flexDirection:"column",gap:"0.25rem"};if(j)return jsx(ro.Provider,{value:X,children:jsx("div",{...J,className:w,style:_,children:O})});let ee=useRef(null),oe=useCallback(G=>{ee.current=G,typeof N=="function"?N(G):N&&(N.current=G);},[N]),ne=useCallback(G=>{q(G.target.value);},[q]),v=useCallback(G=>{K.onFocus(),E?.(G);},[K,E]),k=useCallback(G=>{K.onBlur(),P?.(G);},[K,P]),M=[];i&&M.push(F),V&&M.push(H);let L=M.length>0?M.join(" "):void 0;return jsxs("div",{...J,className:w,style:_,children:[n&&jsxs("label",{id:h,htmlFor:g,"data-compa11y-input-label":"",style:y?{}:{display:"block",color:a?"var(--compa11y-input-disabled-color, #999)":"var(--compa11y-input-label-color, inherit)",fontSize:"var(--compa11y-input-label-size, 0.875rem)",fontWeight:"var(--compa11y-input-label-weight, 500)"},children:[n,o&&jsx("span",{"data-compa11y-input-required":"","aria-hidden":"true",style:y?{}:{color:"var(--compa11y-input-required-color, #ef4444)",marginLeft:"0.125rem"},children:"*"})]}),jsx("input",{ref:oe,id:g,type:e,value:U,onChange:ne,onFocus:v,onBlur:k,disabled:a,readOnly:p,required:o,placeholder:f,name:m,autoComplete:u,maxLength:T,minLength:C,pattern:S,inputMode:R,"aria-label":n?void 0:s,"aria-labelledby":!n&&b?b:n?h:void 0,"aria-describedby":L,"aria-invalid":V?"true":void 0,"aria-required":o?"true":void 0,"data-compa11y-input-field":"",style:y?{}:{width:"100%",padding:"var(--compa11y-input-padding, 0.5rem 0.75rem)",border:V?"1px solid var(--compa11y-input-border-error, #ef4444)":"var(--compa11y-input-border, 1px solid #ccc)",borderRadius:"var(--compa11y-input-radius, 4px)",fontSize:"var(--compa11y-input-font-size, 0.875rem)",fontFamily:"inherit",background:a?"var(--compa11y-input-disabled-bg, #f5f5f5)":p?"var(--compa11y-input-readonly-bg, #f9f9f9)":"var(--compa11y-input-bg, white)",color:"inherit",cursor:a?"not-allowed":void 0,opacity:a?"var(--compa11y-input-disabled-opacity, 0.7)":void 0,...W&&!a?{outline:V?"2px solid var(--compa11y-input-border-error, #ef4444)":"2px solid var(--compa11y-focus-color, #0066cc)",outlineOffset:"-1px",borderColor:V?"var(--compa11y-input-border-error, #ef4444)":"var(--compa11y-input-border-focus, #0066cc)"}:{}}}),i&&jsx("div",{id:F,"data-compa11y-input-hint":"",style:y?{}:{color:"var(--compa11y-input-hint-color, #666)",fontSize:"var(--compa11y-input-hint-size, 0.8125rem)"},children:i}),V&&jsx("div",{id:H,role:"alert","data-compa11y-input-error":"",style:y?{}:{color:"var(--compa11y-input-error-color, #ef4444)",fontSize:"var(--compa11y-input-error-size, 0.8125rem)"},children:l})]})});Ue.displayName="Input";var io=Object.assign(Ue,{Label:$e,Field:Ke,Hint:je,Error:We});var Hn={primary:{background:"var(--compa11y-button-primary-bg, #0066cc)",color:"var(--compa11y-button-primary-color, white)",border:"var(--compa11y-button-primary-border, 1px solid #0066cc)"},secondary:{background:"var(--compa11y-button-secondary-bg, white)",color:"var(--compa11y-button-secondary-color, #333)",border:"var(--compa11y-button-secondary-border, 1px solid #ccc)"},danger:{background:"var(--compa11y-button-danger-bg, #ef4444)",color:"var(--compa11y-button-danger-color, white)",border:"var(--compa11y-button-danger-border, 1px solid #ef4444)"},outline:{background:"var(--compa11y-button-outline-bg, transparent)",color:"var(--compa11y-button-outline-color, #0066cc)",border:"var(--compa11y-button-outline-border, 1px solid #0066cc)"},ghost:{background:"var(--compa11y-button-ghost-bg, transparent)",color:"var(--compa11y-button-ghost-color, #333)",border:"var(--compa11y-button-ghost-border, 1px solid transparent)"}},Fn={sm:{padding:"var(--compa11y-button-padding-sm, 0.25rem 0.5rem)",fontSize:"var(--compa11y-button-font-size-sm, 0.75rem)"},md:{padding:"var(--compa11y-button-padding-md, 0.5rem 1rem)",fontSize:"var(--compa11y-button-font-size-md, 0.875rem)"},lg:{padding:"var(--compa11y-button-padding-lg, 0.75rem 1.5rem)",fontSize:"var(--compa11y-button-font-size-lg, 1rem)"}},ht=forwardRef(function({variant:t="secondary",size:c="md",type:r="button",disabled:e=false,discoverable:n=false,loading:i=false,unstyled:l=false,"aria-label":o,className:a,style:p,onClick:s,onFocus:b,onBlur:f,children:m,...u},T){let C=a$2("button"),S=useRef(null),R=useCallback(g=>{S.current=g,typeof T=="function"?T(g):T&&(T.current=g);},[T]),{isFocusVisible:d,focusProps:y}=te();useEffect(()=>{process.env.NODE_ENV!=="production"&&!m&&!o&&!u["aria-labelledby"]&&console.warn("[Compa11y Button]: Button has no accessible label. Screen readers need this to identify the button. Add text content, aria-label, or aria-labelledby.");},[m,o,u["aria-labelledby"]]);let w=e&&!n,E=e||i,P=useCallback(g=>{if(E){g.preventDefault();return}s?.(g);},[E,s]),O=useCallback(g=>{y.onFocus(),b?.(g);},[y,b]),N=useCallback(g=>{y.onBlur(),f?.(g);},[y,f]),A={"data-compa11y-button":"","data-variant":t,"data-size":c,"data-disabled":e?"true":"false","data-loading":i?"true":"false"},$=l?{}:{display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"0.5rem",borderRadius:"var(--compa11y-button-radius, 4px)",fontFamily:"inherit",fontWeight:"var(--compa11y-button-font-weight, 500)",lineHeight:"1.5",cursor:E?"not-allowed":"pointer",opacity:e?"var(--compa11y-button-disabled-opacity, 0.5)":void 0,transition:"background-color 0.15s ease, border-color 0.15s ease",...Hn[t],...Fn[c],...d&&!w?{outline:"2px solid var(--compa11y-focus-color, #0066cc)",outlineOffset:"2px"}:{}};return jsxs("button",{ref:R,id:C,type:r,disabled:w,tabIndex:e&&!n?void 0:0,"aria-disabled":E?"true":void 0,"aria-busy":i?"true":void 0,"aria-label":o,onClick:P,onFocus:O,onBlur:N,className:a,style:{...$,...p},...A,...u,children:[i&&jsx("span",{"data-compa11y-button-spinner":"","aria-hidden":"true",style:l?{}:{display:"inline-block",width:"1em",height:"1em",border:"2px solid currentColor",borderRightColor:"transparent",borderRadius:"50%",animation:"compa11y-spin 0.6s linear infinite"}}),m]})});ht.displayName="Button";var co=createContext(null);function Ce(){let x=useContext(co);if(!x)throw new Error("[Compa11y Textarea]: Textarea sub-components (Textarea.Label, Textarea.Field, etc.) must be used within <Textarea>.");return x}var _e=forwardRef(function({children:t,className:c},r){let e=Ce();return jsxs("label",{ref:r,id:e.labelId,htmlFor:e.fieldId,"data-compa11y-textarea-label":"",className:c,style:e.unstyled?{}:{display:"block",color:e.disabled?"var(--compa11y-textarea-disabled-color, #999)":"var(--compa11y-textarea-label-color, inherit)",fontSize:"var(--compa11y-textarea-label-size, 0.875rem)",fontWeight:"var(--compa11y-textarea-label-weight, 500)"},children:[t,e.required&&jsx("span",{"data-compa11y-textarea-required":"","aria-hidden":"true",style:e.unstyled?{}:{color:"var(--compa11y-textarea-required-color, #ef4444)",marginLeft:"0.125rem"},children:"*"})]})});_e.displayName="TextareaLabel";var Ye=forwardRef(function({onFocus:t,onBlur:c,className:r,style:e,rows:n,...i},l){let o=Ce(),a=useRef(null),p=useCallback(u=>{a.current=u,typeof l=="function"?l(u):l&&(l.current=u);},[l]),s=useCallback(u=>{o.setValue(u.target.value);},[o.setValue]),b=useCallback(u=>{o.focusProps.onFocus(),t?.(u);},[o.focusProps,t]),f=useCallback(u=>{o.focusProps.onBlur(),c?.(u);},[o.focusProps,c]),m=[];return m.push(o.hintId),o.hasError&&m.push(o.errorId),jsx("textarea",{ref:p,id:o.fieldId,rows:n??o.rows,value:o.value,onChange:s,onFocus:b,onBlur:f,disabled:o.disabled,readOnly:o.readOnly,"aria-describedby":m.join(" ")||void 0,"aria-invalid":o.hasError?"true":void 0,"aria-required":o.required?"true":void 0,"data-compa11y-textarea-field":"",className:r,style:o.unstyled?e:{width:"100%",padding:"var(--compa11y-textarea-padding, 0.5rem 0.75rem)",border:o.hasError?"1px solid var(--compa11y-textarea-border-error, #ef4444)":"var(--compa11y-textarea-border, 1px solid #ccc)",borderRadius:"var(--compa11y-textarea-radius, 4px)",fontSize:"var(--compa11y-textarea-font-size, 0.875rem)",fontFamily:"inherit",lineHeight:"1.5",resize:o.resize,background:o.disabled?"var(--compa11y-textarea-disabled-bg, #f5f5f5)":o.readOnly?"var(--compa11y-textarea-readonly-bg, #f9f9f9)":"var(--compa11y-textarea-bg, white)",color:"inherit",cursor:o.disabled?"not-allowed":void 0,opacity:o.disabled?"var(--compa11y-textarea-disabled-opacity, 0.7)":void 0,...o.isFocusVisible&&!o.disabled?{outline:o.hasError?"2px solid var(--compa11y-textarea-border-error, #ef4444)":"2px solid var(--compa11y-focus-color, #0066cc)",outlineOffset:"-1px",borderColor:o.hasError?"var(--compa11y-textarea-border-error, #ef4444)":"var(--compa11y-textarea-border-focus, #0066cc)"}:{},...e},...i})});Ye.displayName="TextareaField";var Xe=forwardRef(function({children:t,className:c},r){let e=Ce();return jsx("div",{ref:r,id:e.hintId,"data-compa11y-textarea-hint":"",className:c,style:e.unstyled?{}:{color:"var(--compa11y-textarea-hint-color, #666)",fontSize:"var(--compa11y-textarea-hint-size, 0.8125rem)"},children:t})});Xe.displayName="TextareaHint";var Je=forwardRef(function({children:t,className:c},r){let e=Ce();return t?jsx("div",{ref:r,id:e.errorId,role:"alert","data-compa11y-textarea-error":"",className:c,style:e.unstyled?{}:{color:"var(--compa11y-textarea-error-color, #ef4444)",fontSize:"var(--compa11y-textarea-error-size, 0.8125rem)"},children:t}):null});Je.displayName="TextareaError";var Ze=forwardRef(function({value:t,defaultValue:c="",onValueChange:r,rows:e=3,resize:n="vertical",label:i,hint:l,error:o,required:a=false,disabled:p=false,readOnly:s=false,"aria-label":b,"aria-labelledby":f,placeholder:m,name:u,autoComplete:T,maxLength:C,minLength:S,id:R,unstyled:d=false,className:y,onFocus:w,onBlur:E,children:P},O){let N=a$2("textarea"),A=R||N,$=`${A}-field`,g=`${A}-label`,h=`${A}-hint`,F=`${A}-error`,[H,D]=useState(c),z=t!==void 0,I=z?t:H,U=useCallback(L=>{z||D(L),r?.(L);},[z,r]),{isFocusVisible:q,focusProps:W}=te();useEffect(()=>{process.env.NODE_ENV!=="production"&&!(Children.count(P)>0)&&!i&&!b&&!f&&console.warn("[Compa11y Textarea]: Textarea has no accessible label. Screen readers need this to identify the textarea. Use label prop, aria-label, or aria-labelledby.");},[P,i,b,f]);let K=!!o,V=Children.count(P)>0,j={fieldId:$,labelId:g,hintId:h,errorId:F,value:I,setValue:U,hasError:K,disabled:p,readOnly:s,required:a,rows:e,resize:n,isFocusVisible:q,focusProps:W,unstyled:d},X={"data-compa11y-textarea":"","data-error":K?"true":"false","data-disabled":p?"true":"false","data-required":a?"true":"false","data-readonly":s?"true":"false"},J=d?{}:{display:"flex",flexDirection:"column",gap:"0.25rem"};if(V)return jsx(co.Provider,{value:j,children:jsx("div",{...X,className:y,style:J,children:P})});let _=useRef(null),ee=useCallback(L=>{_.current=L,typeof O=="function"?O(L):O&&(O.current=L);},[O]),oe=useCallback(L=>{U(L.target.value);},[U]),ne=useCallback(L=>{W.onFocus(),w?.(L);},[W,w]),v=useCallback(L=>{W.onBlur(),E?.(L);},[W,E]),k=[];l&&k.push(h),K&&k.push(F);let M=k.length>0?k.join(" "):void 0;return jsxs("div",{...X,className:y,style:J,children:[i&&jsxs("label",{id:g,htmlFor:$,"data-compa11y-textarea-label":"",style:d?{}:{display:"block",color:p?"var(--compa11y-textarea-disabled-color, #999)":"var(--compa11y-textarea-label-color, inherit)",fontSize:"var(--compa11y-textarea-label-size, 0.875rem)",fontWeight:"var(--compa11y-textarea-label-weight, 500)"},children:[i,a&&jsx("span",{"data-compa11y-textarea-required":"","aria-hidden":"true",style:d?{}:{color:"var(--compa11y-textarea-required-color, #ef4444)",marginLeft:"0.125rem"},children:"*"})]}),jsx("textarea",{ref:ee,id:$,rows:e,value:I,onChange:oe,onFocus:ne,onBlur:v,disabled:p,readOnly:s,required:a,placeholder:m,name:u,autoComplete:T,maxLength:C,minLength:S,"aria-label":i?void 0:b,"aria-labelledby":!i&&f?f:i?g:void 0,"aria-describedby":M,"aria-invalid":K?"true":void 0,"aria-required":a?"true":void 0,"data-compa11y-textarea-field":"",style:d?{}:{width:"100%",padding:"var(--compa11y-textarea-padding, 0.5rem 0.75rem)",border:K?"1px solid var(--compa11y-textarea-border-error, #ef4444)":"var(--compa11y-textarea-border, 1px solid #ccc)",borderRadius:"var(--compa11y-textarea-radius, 4px)",fontSize:"var(--compa11y-textarea-font-size, 0.875rem)",fontFamily:"inherit",lineHeight:"1.5",resize:n,background:p?"var(--compa11y-textarea-disabled-bg, #f5f5f5)":s?"var(--compa11y-textarea-readonly-bg, #f9f9f9)":"var(--compa11y-textarea-bg, white)",color:"inherit",cursor:p?"not-allowed":void 0,opacity:p?"var(--compa11y-textarea-disabled-opacity, 0.7)":void 0,...q&&!p?{outline:K?"2px solid var(--compa11y-textarea-border-error, #ef4444)":"2px solid var(--compa11y-focus-color, #0066cc)",outlineOffset:"-1px",borderColor:K?"var(--compa11y-textarea-border-error, #ef4444)":"var(--compa11y-textarea-border-focus, #0066cc)"}:{}}}),l&&jsx("div",{id:h,"data-compa11y-textarea-hint":"",style:d?{}:{color:"var(--compa11y-textarea-hint-color, #666)",fontSize:"var(--compa11y-textarea-hint-size, 0.8125rem)"},children:l}),K&&jsx("div",{id:F,role:"alert","data-compa11y-textarea-error":"",style:d?{}:{color:"var(--compa11y-textarea-error-color, #ef4444)",fontSize:"var(--compa11y-textarea-error-size, 0.8125rem)"},children:o})]})});Ze.displayName="Textarea";var uo=Object.assign(Ze,{Label:_e,Field:Ye,Hint:Xe,Error:Je});export{ht as Button,qt as Checkbox,He as CheckboxBase,we as CheckboxGroup,Fe as CheckboxIndicator,io as Input,Ue as InputBase,We as InputError,Ke as InputField,je as InputHint,$e as InputLabel,to as Listbox,Be as ListboxBase,Ge as ListboxGroup,ze as ListboxOption,Ae as Radio,Yt as RadioGroup,Oe as RadioGroupBase,$t as Select,at as SelectBase,it as SelectListbox,ke as SelectOptionItem,rt as SelectTrigger,mt as Switch,uo as Textarea,Ze as TextareaBase,Je as TextareaError,Ye as TextareaField,Xe as TextareaHint,_e as TextareaLabel,ct as useCheckboxGroupContext,At as useFocusControl,Ot as useFocusManager,te as useFocusVisible,Vt as useFocusWithin,Te as useInputContext,De as useListboxContext,bt as useRadioGroupContext,Qe as useRovingTabindex,Nt as useRovingTabindexMap,Ce as useTextareaContext};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@compa11y/react",
3
- "version": "0.1.0",
3
+ "version": "0.1.3",
4
4
  "description": "Accessible React components that just work",
5
5
  "author": "Ivan Trajkovski",
6
6
  "license": "MIT",
@@ -50,6 +50,41 @@
50
50
  "types": "./dist/components/combobox/index.d.ts",
51
51
  "import": "./dist/components/combobox/index.js",
52
52
  "require": "./dist/components/combobox/index.cjs"
53
+ },
54
+ "./checkbox": {
55
+ "types": "./dist/components/checkbox/index.d.ts",
56
+ "import": "./dist/components/checkbox/index.js",
57
+ "require": "./dist/components/checkbox/index.cjs"
58
+ },
59
+ "./select": {
60
+ "types": "./dist/components/select/index.d.ts",
61
+ "import": "./dist/components/select/index.js",
62
+ "require": "./dist/components/select/index.cjs"
63
+ },
64
+ "./input": {
65
+ "types": "./dist/components/input/index.d.ts",
66
+ "import": "./dist/components/input/index.js",
67
+ "require": "./dist/components/input/index.cjs"
68
+ },
69
+ "./textarea": {
70
+ "types": "./dist/components/textarea/index.d.ts",
71
+ "import": "./dist/components/textarea/index.js",
72
+ "require": "./dist/components/textarea/index.cjs"
73
+ },
74
+ "./button": {
75
+ "types": "./dist/components/button/index.d.ts",
76
+ "import": "./dist/components/button/index.js",
77
+ "require": "./dist/components/button/index.cjs"
78
+ },
79
+ "./radio-group": {
80
+ "types": "./dist/components/radio-group/index.d.ts",
81
+ "import": "./dist/components/radio-group/index.js",
82
+ "require": "./dist/components/radio-group/index.cjs"
83
+ },
84
+ "./listbox": {
85
+ "types": "./dist/components/listbox/index.d.ts",
86
+ "import": "./dist/components/listbox/index.js",
87
+ "require": "./dist/components/listbox/index.cjs"
53
88
  }
54
89
  },
55
90
  "files": [
@@ -58,7 +93,7 @@
58
93
  "LICENSE"
59
94
  ],
60
95
  "dependencies": {
61
- "@compa11y/core": "0.1.0"
96
+ "@compa11y/core": "0.1.3"
62
97
  },
63
98
  "peerDependencies": {
64
99
  "react": ">=18.0.0",
@@ -86,7 +121,13 @@
86
121
  "menu",
87
122
  "tabs",
88
123
  "wcag",
89
- "aria"
124
+ "aria",
125
+ "input",
126
+ "textarea",
127
+ "button",
128
+ "radio-group",
129
+ "listbox",
130
+ "form"
90
131
  ],
91
132
  "scripts": {
92
133
  "build": "tsup",