@tribepad/themis 1.0.0 → 1.0.2
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/elements/Accordion/index.js +2 -77
- package/dist/elements/Accordion/index.js.map +1 -1
- package/dist/elements/Accordion/index.mjs +2 -4
- package/dist/elements/Accordion/index.mjs.map +1 -1
- package/dist/elements/AlertDialog/AlertDialog.d.ts +43 -0
- package/dist/elements/AlertDialog/AlertDialog.d.ts.map +1 -0
- package/dist/elements/AlertDialog/AlertDialog.styles.d.ts +15 -0
- package/dist/elements/AlertDialog/AlertDialog.styles.d.ts.map +1 -0
- package/dist/elements/AlertDialog/AlertDialog.types.d.ts +72 -0
- package/dist/elements/AlertDialog/AlertDialog.types.d.ts.map +1 -0
- package/dist/elements/AlertDialog/index.d.ts +25 -0
- package/dist/elements/AlertDialog/index.d.ts.map +1 -0
- package/dist/elements/AlertDialog/index.js +3 -0
- package/dist/elements/AlertDialog/index.js.map +1 -0
- package/dist/elements/AlertDialog/index.mjs +3 -0
- package/dist/elements/AlertDialog/index.mjs.map +1 -0
- package/dist/elements/Avatar/index.js +2 -53
- package/dist/elements/Avatar/index.js.map +1 -1
- package/dist/elements/Avatar/index.mjs +2 -4
- package/dist/elements/Avatar/index.mjs.map +1 -1
- package/dist/elements/Badge/index.js +2 -42
- package/dist/elements/Badge/index.js.map +1 -1
- package/dist/elements/Badge/index.mjs +2 -5
- package/dist/elements/Badge/index.mjs.map +1 -1
- package/dist/elements/Breadcrumbs/index.js +2 -53
- package/dist/elements/Breadcrumbs/index.js.map +1 -1
- package/dist/elements/Breadcrumbs/index.mjs +2 -8
- package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
- package/dist/elements/Button/Button.d.ts +26 -81
- package/dist/elements/Button/Button.d.ts.map +1 -1
- package/dist/elements/Button/Button.styles.d.ts +35 -0
- package/dist/elements/Button/Button.styles.d.ts.map +1 -0
- package/dist/elements/Button/Button.types.d.ts +20 -8
- package/dist/elements/Button/Button.types.d.ts.map +1 -1
- package/dist/elements/Button/index.js +2 -26
- package/dist/elements/Button/index.js.map +1 -1
- package/dist/elements/Button/index.mjs +2 -5
- package/dist/elements/Button/index.mjs.map +1 -1
- package/dist/elements/ButtonGroup/index.js +2 -65
- package/dist/elements/ButtonGroup/index.js.map +1 -1
- package/dist/elements/ButtonGroup/index.mjs +2 -4
- package/dist/elements/ButtonGroup/index.mjs.map +1 -1
- package/dist/elements/Card/Card.d.ts.map +1 -1
- package/dist/elements/Card/index.js +2 -84
- package/dist/elements/Card/index.js.map +1 -1
- package/dist/elements/Card/index.mjs +2 -7
- package/dist/elements/Card/index.mjs.map +1 -1
- package/dist/elements/Carousel/Carousel.d.ts +1 -11
- package/dist/elements/Carousel/Carousel.d.ts.map +1 -1
- package/dist/elements/Carousel/LazyCarousel.d.ts +1 -1
- package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -1
- package/dist/elements/Carousel/index.js +2 -22
- package/dist/elements/Carousel/index.js.map +1 -1
- package/dist/elements/Carousel/index.mjs +2 -9
- package/dist/elements/Carousel/index.mjs.map +1 -1
- package/dist/elements/Chart/ChartContext.d.ts.map +1 -1
- package/dist/elements/Chart/index.js +2 -46
- package/dist/elements/Chart/index.js.map +1 -1
- package/dist/elements/Chart/index.mjs +2 -5
- package/dist/elements/Chart/index.mjs.map +1 -1
- package/dist/elements/Checkbox/index.js +2 -46
- package/dist/elements/Checkbox/index.js.map +1 -1
- package/dist/elements/Checkbox/index.mjs +2 -5
- package/dist/elements/Checkbox/index.mjs.map +1 -1
- package/dist/elements/CheckboxGroup/index.js +2 -70
- package/dist/elements/CheckboxGroup/index.js.map +1 -1
- package/dist/elements/CheckboxGroup/index.mjs +2 -5
- package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
- package/dist/elements/Combobox/Combobox.d.ts +56 -0
- package/dist/elements/Combobox/Combobox.d.ts.map +1 -0
- package/dist/elements/Combobox/Combobox.styles.d.ts +29 -0
- package/dist/elements/Combobox/Combobox.styles.d.ts.map +1 -0
- package/dist/elements/Combobox/Combobox.types.d.ts +67 -0
- package/dist/elements/Combobox/Combobox.types.d.ts.map +1 -0
- package/dist/elements/Combobox/index.d.ts +20 -0
- package/dist/elements/Combobox/index.d.ts.map +1 -0
- package/dist/elements/Combobox/index.js +3 -0
- package/dist/elements/Combobox/index.js.map +1 -0
- package/dist/elements/Combobox/index.mjs +3 -0
- package/dist/elements/Combobox/index.mjs.map +1 -0
- package/dist/elements/DatePicker/DatePicker.d.ts +1 -1
- package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/elements/DatePicker/index.js +2 -122
- package/dist/elements/DatePicker/index.js.map +1 -1
- package/dist/elements/DatePicker/index.mjs +2 -5
- package/dist/elements/DatePicker/index.mjs.map +1 -1
- package/dist/elements/Dropdown/Dropdown.d.ts +7 -15
- package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/elements/Dropdown/Dropdown.styles.d.ts +22 -0
- package/dist/elements/Dropdown/Dropdown.styles.d.ts.map +1 -0
- package/dist/elements/Dropdown/index.d.ts +1 -0
- package/dist/elements/Dropdown/index.d.ts.map +1 -1
- package/dist/elements/Dropdown/index.js +2 -40
- package/dist/elements/Dropdown/index.js.map +1 -1
- package/dist/elements/Dropdown/index.mjs +2 -3
- package/dist/elements/Dropdown/index.mjs.map +1 -1
- package/dist/elements/FileField/index.js +2 -137
- package/dist/elements/FileField/index.js.map +1 -1
- package/dist/elements/FileField/index.mjs +2 -8
- package/dist/elements/FileField/index.mjs.map +1 -1
- package/dist/elements/FormLayout/index.js +2 -16
- package/dist/elements/FormLayout/index.js.map +1 -1
- package/dist/elements/FormLayout/index.mjs +2 -3
- package/dist/elements/FormLayout/index.mjs.map +1 -1
- package/dist/elements/Modal/Modal.d.ts +9 -14
- package/dist/elements/Modal/Modal.d.ts.map +1 -1
- package/dist/elements/Modal/Modal.styles.d.ts +29 -0
- package/dist/elements/Modal/Modal.styles.d.ts.map +1 -0
- package/dist/elements/Modal/index.d.ts +1 -0
- package/dist/elements/Modal/index.d.ts.map +1 -1
- package/dist/elements/Modal/index.js +2 -51
- package/dist/elements/Modal/index.js.map +1 -1
- package/dist/elements/Modal/index.mjs +2 -2
- package/dist/elements/Modal/index.mjs.map +1 -1
- package/dist/elements/NumberField/index.js +2 -56
- package/dist/elements/NumberField/index.js.map +1 -1
- package/dist/elements/NumberField/index.mjs +2 -7
- package/dist/elements/NumberField/index.mjs.map +1 -1
- package/dist/elements/OTPInput/OTPInput.d.ts.map +1 -1
- package/dist/elements/OTPInput/index.js +2 -12
- package/dist/elements/OTPInput/index.js.map +1 -1
- package/dist/elements/OTPInput/index.mjs +2 -3
- package/dist/elements/OTPInput/index.mjs.map +1 -1
- package/dist/elements/Pagination/Pagination.d.ts +45 -0
- package/dist/elements/Pagination/Pagination.d.ts.map +1 -0
- package/dist/elements/Pagination/Pagination.styles.d.ts +10 -0
- package/dist/elements/Pagination/Pagination.styles.d.ts.map +1 -0
- package/dist/elements/Pagination/Pagination.types.d.ts +55 -0
- package/dist/elements/Pagination/Pagination.types.d.ts.map +1 -0
- package/dist/elements/Pagination/index.d.ts +21 -0
- package/dist/elements/Pagination/index.d.ts.map +1 -0
- package/dist/elements/Pagination/index.js +3 -0
- package/dist/elements/Pagination/index.js.map +1 -0
- package/dist/elements/Pagination/index.mjs +3 -0
- package/dist/elements/Pagination/index.mjs.map +1 -0
- package/dist/elements/Panel/index.js +2 -32
- package/dist/elements/Panel/index.js.map +1 -1
- package/dist/elements/Panel/index.mjs +2 -3
- package/dist/elements/Panel/index.mjs.map +1 -1
- package/dist/elements/PasswordField/PasswordField.d.ts +27 -0
- package/dist/elements/PasswordField/PasswordField.d.ts.map +1 -0
- package/dist/elements/PasswordField/PasswordField.styles.d.ts +32 -0
- package/dist/elements/PasswordField/PasswordField.styles.d.ts.map +1 -0
- package/dist/elements/PasswordField/PasswordField.types.d.ts +100 -0
- package/dist/elements/PasswordField/PasswordField.types.d.ts.map +1 -0
- package/dist/elements/PasswordField/index.css +2 -0
- package/dist/elements/PasswordField/index.css.map +1 -0
- package/dist/elements/PasswordField/index.d.ts +20 -0
- package/dist/elements/PasswordField/index.d.ts.map +1 -0
- package/dist/elements/PasswordField/index.js +3 -0
- package/dist/elements/PasswordField/index.js.map +1 -0
- package/dist/elements/PasswordField/index.mjs +3 -0
- package/dist/elements/PasswordField/index.mjs.map +1 -0
- package/dist/elements/Progress/index.js +2 -29
- package/dist/elements/Progress/index.js.map +1 -1
- package/dist/elements/Progress/index.mjs +2 -4
- package/dist/elements/Progress/index.mjs.map +1 -1
- package/dist/elements/RadioGroup/index.js +2 -46
- package/dist/elements/RadioGroup/index.js.map +1 -1
- package/dist/elements/RadioGroup/index.mjs +2 -5
- package/dist/elements/RadioGroup/index.mjs.map +1 -1
- package/dist/elements/Resizable/components/ResizableHandle.d.ts +0 -8
- package/dist/elements/Resizable/components/ResizableHandle.d.ts.map +1 -1
- package/dist/elements/Resizable/components/ResizablePanel.d.ts +0 -8
- package/dist/elements/Resizable/components/ResizablePanel.d.ts.map +1 -1
- package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts +0 -8
- package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts.map +1 -1
- package/dist/elements/Resizable/components/ResizablePopover.d.ts +0 -8
- package/dist/elements/Resizable/components/ResizablePopover.d.ts.map +1 -1
- package/dist/elements/Resizable/index.js +2 -64
- package/dist/elements/Resizable/index.js.map +1 -1
- package/dist/elements/Resizable/index.mjs +2 -7
- package/dist/elements/Resizable/index.mjs.map +1 -1
- package/dist/elements/SearchField/SearchField.d.ts +27 -0
- package/dist/elements/SearchField/SearchField.d.ts.map +1 -0
- package/dist/elements/SearchField/SearchField.styles.d.ts +32 -0
- package/dist/elements/SearchField/SearchField.styles.d.ts.map +1 -0
- package/dist/elements/SearchField/SearchField.types.d.ts +45 -0
- package/dist/elements/SearchField/SearchField.types.d.ts.map +1 -0
- package/dist/elements/SearchField/index.css +2 -0
- package/dist/elements/SearchField/index.css.map +1 -0
- package/dist/elements/SearchField/index.d.ts +21 -0
- package/dist/elements/SearchField/index.d.ts.map +1 -0
- package/dist/elements/SearchField/index.js +3 -0
- package/dist/elements/SearchField/index.js.map +1 -0
- package/dist/elements/SearchField/index.mjs +3 -0
- package/dist/elements/SearchField/index.mjs.map +1 -0
- package/dist/elements/Select/Select.d.ts +19 -48
- package/dist/elements/Select/Select.d.ts.map +1 -1
- package/dist/elements/Select/Select.styles.d.ts +55 -0
- package/dist/elements/Select/Select.styles.d.ts.map +1 -0
- package/dist/elements/Select/index.js +2 -32
- package/dist/elements/Select/index.js.map +1 -1
- package/dist/elements/Select/index.mjs +2 -3
- package/dist/elements/Select/index.mjs.map +1 -1
- package/dist/elements/Skeleton/index.js +2 -21
- package/dist/elements/Skeleton/index.js.map +1 -1
- package/dist/elements/Skeleton/index.mjs +2 -4
- package/dist/elements/Skeleton/index.mjs.map +1 -1
- package/dist/elements/Switch/index.js +2 -48
- package/dist/elements/Switch/index.js.map +1 -1
- package/dist/elements/Switch/index.mjs +2 -30
- package/dist/elements/Switch/index.mjs.map +1 -1
- package/dist/elements/Table/Table.d.ts +3 -24
- package/dist/elements/Table/Table.d.ts.map +1 -1
- package/dist/elements/Table/Table.styles.d.ts +24 -0
- package/dist/elements/Table/Table.styles.d.ts.map +1 -0
- package/dist/elements/Table/index.js +2 -75
- package/dist/elements/Table/index.js.map +1 -1
- package/dist/elements/Table/index.mjs +2 -6
- package/dist/elements/Table/index.mjs.map +1 -1
- package/dist/elements/Tabs/index.js +2 -73
- package/dist/elements/Tabs/index.js.map +1 -1
- package/dist/elements/Tabs/index.mjs +2 -4
- package/dist/elements/Tabs/index.mjs.map +1 -1
- package/dist/elements/TextField/TextField.d.ts +6 -42
- package/dist/elements/TextField/TextField.d.ts.map +1 -1
- package/dist/elements/TextField/TextField.hooks.d.ts +63 -0
- package/dist/elements/TextField/TextField.hooks.d.ts.map +1 -0
- package/dist/elements/TextField/TextField.icons.d.ts +19 -0
- package/dist/elements/TextField/TextField.icons.d.ts.map +1 -0
- package/dist/elements/TextField/TextField.styles.d.ts +37 -0
- package/dist/elements/TextField/TextField.styles.d.ts.map +1 -0
- package/dist/elements/TextField/TextField.types.d.ts +3 -0
- package/dist/elements/TextField/TextField.types.d.ts.map +1 -1
- package/dist/elements/TextField/index.css +1 -22
- package/dist/elements/TextField/index.css.map +1 -1
- package/dist/elements/TextField/index.js +2 -259
- package/dist/elements/TextField/index.js.map +1 -1
- package/dist/elements/TextField/index.mjs +2 -206
- package/dist/elements/TextField/index.mjs.map +1 -1
- package/dist/elements/TimeField/index.js +2 -44
- package/dist/elements/TimeField/index.js.map +1 -1
- package/dist/elements/TimeField/index.mjs +2 -3
- package/dist/elements/TimeField/index.mjs.map +1 -1
- package/dist/elements/Toast/Toast.d.ts +0 -22
- package/dist/elements/Toast/Toast.d.ts.map +1 -1
- package/dist/elements/Toast/index.js +2 -59
- package/dist/elements/Toast/index.js.map +1 -1
- package/dist/elements/Toast/index.mjs +2 -6
- package/dist/elements/Toast/index.mjs.map +1 -1
- package/dist/elements/Tooltip/index.js +2 -58
- package/dist/elements/Tooltip/index.js.map +1 -1
- package/dist/elements/Tooltip/index.mjs +2 -5
- package/dist/elements/Tooltip/index.mjs.map +1 -1
- package/dist/elements/index.css +1 -22
- package/dist/elements/index.css.map +1 -1
- package/dist/elements/index.d.ts +13 -1
- package/dist/elements/index.d.ts.map +1 -1
- package/dist/elements/index.js +2 -838
- package/dist/elements/index.js.map +1 -1
- package/dist/elements/index.mjs +2 -41
- package/dist/elements/index.mjs.map +1 -1
- package/dist/index.css +1 -22
- package/dist/index.css.map +1 -1
- package/dist/index.js +3 -864
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -43
- package/dist/index.mjs.map +1 -1
- package/dist/schemas/index.js +2 -28
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/index.mjs +2 -3
- package/dist/schemas/index.mjs.map +1 -1
- package/dist/styles/defaults.css +151 -0
- package/dist/styles/index.js +1 -152
- package/dist/styles/index.js.map +1 -1
- package/dist/styles/index.mjs +1 -3
- package/dist/styles/index.mjs.map +1 -1
- package/dist/utils/index.js +1 -12
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +1 -3
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +9 -7
- package/src/elements/Accordion/Accordion.stories.tsx +1 -1
- package/src/elements/AlertDialog/AlertDialog.stories.tsx +124 -0
- package/src/elements/Avatar/Avatar.stories.tsx +1 -1
- package/src/elements/Badge/Badge.stories.tsx +1 -1
- package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +1 -1
- package/src/elements/Button/Button.stories.tsx +1 -1
- package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +1 -1
- package/src/elements/Card/Card.stories.tsx +1 -1
- package/src/elements/Carousel/Carousel.stories.tsx +1 -1
- package/src/elements/Chart/Chart.stories.tsx +1 -1
- package/src/elements/Checkbox/Checkbox.stories.tsx +1 -1
- package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +1 -1
- package/src/elements/Combobox/Combobox.stories.tsx +133 -0
- package/src/elements/DatePicker/DatePicker.stories.tsx +1 -1
- package/src/elements/Dropdown/Dropdown.stories.tsx +1 -1
- package/src/elements/FileField/FileField.stories.tsx +1 -1
- package/src/elements/FileField/FileProgress.stories.tsx +1 -1
- package/src/elements/FormLayout/FormLayout.stories.tsx +1 -1
- package/src/elements/Modal/Modal.stories.tsx +1 -1
- package/src/elements/NumberField/NumberField.stories.tsx +1 -1
- package/src/elements/OTPInput/OTPInput.stories.tsx +1 -1
- package/src/elements/Pagination/Pagination.stories.tsx +203 -0
- package/src/elements/Panel/Panel.stories.tsx +1 -1
- package/src/elements/PasswordField/PasswordField.stories.tsx +167 -0
- package/src/elements/Progress/Progress.stories.tsx +1 -1
- package/src/elements/RadioGroup/RadioGroup.stories.tsx +1 -1
- package/src/elements/Resizable/Resizable.stories.tsx +1 -1
- package/src/elements/SearchField/SearchField.stories.tsx +146 -0
- package/src/elements/Select/Select.stories.tsx +1 -1
- package/src/elements/Skeleton/Skeleton.stories.tsx +1 -1
- package/src/elements/Switch/Switch.stories.tsx +1 -1
- package/src/elements/Table/Table.stories.tsx +1 -1
- package/src/elements/Tabs/Tabs.stories.tsx +1 -1
- package/src/elements/TextField/TextField.stories.tsx +1 -1
- package/src/elements/TimeField/TimeField.stories.tsx +1 -1
- package/src/elements/Toast/Toast.stories.tsx +1 -1
- package/src/elements/Tooltip/Tooltip.stories.tsx +1 -1
- package/dist/Carousel-NTZX5TOW.js +0 -16
- package/dist/Carousel-NTZX5TOW.js.map +0 -1
- package/dist/Carousel-YH3DOQJU.mjs +0 -7
- package/dist/Carousel-YH3DOQJU.mjs.map +0 -1
- package/dist/chunk-2HIUTHMU.mjs +0 -234
- package/dist/chunk-2HIUTHMU.mjs.map +0 -1
- package/dist/chunk-34GTFTDO.js +0 -431
- package/dist/chunk-34GTFTDO.js.map +0 -1
- package/dist/chunk-3H7ASYR7.js +0 -250
- package/dist/chunk-3H7ASYR7.js.map +0 -1
- package/dist/chunk-3IEN7JOP.js +0 -316
- package/dist/chunk-3IEN7JOP.js.map +0 -1
- package/dist/chunk-3JHN4GAL.js +0 -326
- package/dist/chunk-3JHN4GAL.js.map +0 -1
- package/dist/chunk-3MJPASQU.js +0 -232
- package/dist/chunk-3MJPASQU.js.map +0 -1
- package/dist/chunk-3XD2JUL3.js +0 -572
- package/dist/chunk-3XD2JUL3.js.map +0 -1
- package/dist/chunk-3YOY2VJ6.js +0 -189
- package/dist/chunk-3YOY2VJ6.js.map +0 -1
- package/dist/chunk-4DU5JSXB.js +0 -408
- package/dist/chunk-4DU5JSXB.js.map +0 -1
- package/dist/chunk-4E4E2GSS.js +0 -352
- package/dist/chunk-4E4E2GSS.js.map +0 -1
- package/dist/chunk-4NHAP4AN.mjs +0 -3
- package/dist/chunk-4NHAP4AN.mjs.map +0 -1
- package/dist/chunk-4S33J5NY.mjs +0 -415
- package/dist/chunk-4S33J5NY.mjs.map +0 -1
- package/dist/chunk-5SMGRT3G.mjs +0 -354
- package/dist/chunk-5SMGRT3G.mjs.map +0 -1
- package/dist/chunk-5SVLJN2C.mjs +0 -22
- package/dist/chunk-5SVLJN2C.mjs.map +0 -1
- package/dist/chunk-66WTU4EB.mjs +0 -299
- package/dist/chunk-66WTU4EB.mjs.map +0 -1
- package/dist/chunk-6S25NMOT.mjs +0 -335
- package/dist/chunk-6S25NMOT.mjs.map +0 -1
- package/dist/chunk-6SP7UB3D.js +0 -4
- package/dist/chunk-6SP7UB3D.js.map +0 -1
- package/dist/chunk-6TYWWQHM.mjs +0 -565
- package/dist/chunk-6TYWWQHM.mjs.map +0 -1
- package/dist/chunk-A3YUJA6W.mjs +0 -384
- package/dist/chunk-A3YUJA6W.mjs.map +0 -1
- package/dist/chunk-A6KEDVUR.js +0 -61
- package/dist/chunk-A6KEDVUR.js.map +0 -1
- package/dist/chunk-A77RUEWL.js +0 -730
- package/dist/chunk-A77RUEWL.js.map +0 -1
- package/dist/chunk-AA4IKMPE.mjs +0 -3
- package/dist/chunk-AA4IKMPE.mjs.map +0 -1
- package/dist/chunk-AKIA6GW6.mjs +0 -163
- package/dist/chunk-AKIA6GW6.mjs.map +0 -1
- package/dist/chunk-AL6P275L.mjs +0 -435
- package/dist/chunk-AL6P275L.mjs.map +0 -1
- package/dist/chunk-AZ3RJYTB.js +0 -37
- package/dist/chunk-AZ3RJYTB.js.map +0 -1
- package/dist/chunk-B5Q4UPL6.js +0 -32
- package/dist/chunk-B5Q4UPL6.js.map +0 -1
- package/dist/chunk-B6DHPMDP.mjs +0 -335
- package/dist/chunk-B6DHPMDP.mjs.map +0 -1
- package/dist/chunk-BDXKKMBZ.mjs +0 -184
- package/dist/chunk-BDXKKMBZ.mjs.map +0 -1
- package/dist/chunk-BL6E2DLZ.mjs +0 -52
- package/dist/chunk-BL6E2DLZ.mjs.map +0 -1
- package/dist/chunk-CGFDS4XS.mjs +0 -121
- package/dist/chunk-CGFDS4XS.mjs.map +0 -1
- package/dist/chunk-CJIW5TKI.js +0 -139
- package/dist/chunk-CJIW5TKI.js.map +0 -1
- package/dist/chunk-CKNISJOQ.js +0 -314
- package/dist/chunk-CKNISJOQ.js.map +0 -1
- package/dist/chunk-D6CBOECS.mjs +0 -1757
- package/dist/chunk-D6CBOECS.mjs.map +0 -1
- package/dist/chunk-DDWEVC2S.js +0 -166
- package/dist/chunk-DDWEVC2S.js.map +0 -1
- package/dist/chunk-DZ556D2F.mjs +0 -176
- package/dist/chunk-DZ556D2F.mjs.map +0 -1
- package/dist/chunk-E2KQFV3O.mjs +0 -10
- package/dist/chunk-E2KQFV3O.mjs.map +0 -1
- package/dist/chunk-EMMLADSC.js +0 -126
- package/dist/chunk-EMMLADSC.js.map +0 -1
- package/dist/chunk-EP4WOI5D.mjs +0 -926
- package/dist/chunk-EP4WOI5D.mjs.map +0 -1
- package/dist/chunk-FJRXLJC2.mjs +0 -160
- package/dist/chunk-FJRXLJC2.mjs.map +0 -1
- package/dist/chunk-FKQI434R.js +0 -345
- package/dist/chunk-FKQI434R.js.map +0 -1
- package/dist/chunk-FPKEAJRZ.mjs +0 -100
- package/dist/chunk-FPKEAJRZ.mjs.map +0 -1
- package/dist/chunk-FWQYB22U.js +0 -183
- package/dist/chunk-FWQYB22U.js.map +0 -1
- package/dist/chunk-GD5GHTMA.js +0 -189
- package/dist/chunk-GD5GHTMA.js.map +0 -1
- package/dist/chunk-GE5XTSDZ.js +0 -447
- package/dist/chunk-GE5XTSDZ.js.map +0 -1
- package/dist/chunk-GVE47ZAX.mjs +0 -32
- package/dist/chunk-GVE47ZAX.mjs.map +0 -1
- package/dist/chunk-HK46BT5U.mjs +0 -18
- package/dist/chunk-HK46BT5U.mjs.map +0 -1
- package/dist/chunk-HQVRMR6N.js +0 -365
- package/dist/chunk-HQVRMR6N.js.map +0 -1
- package/dist/chunk-HSGBJPJO.mjs +0 -398
- package/dist/chunk-HSGBJPJO.mjs.map +0 -1
- package/dist/chunk-I3AUTOMZ.mjs +0 -125
- package/dist/chunk-I3AUTOMZ.mjs.map +0 -1
- package/dist/chunk-IEI5LD5C.mjs +0 -1161
- package/dist/chunk-IEI5LD5C.mjs.map +0 -1
- package/dist/chunk-IIPTC2X7.mjs +0 -118
- package/dist/chunk-IIPTC2X7.mjs.map +0 -1
- package/dist/chunk-J7TLHF2Q.js +0 -4
- package/dist/chunk-J7TLHF2Q.js.map +0 -1
- package/dist/chunk-JJOWXFXQ.mjs +0 -765
- package/dist/chunk-JJOWXFXQ.mjs.map +0 -1
- package/dist/chunk-JPTSS2OA.mjs +0 -3
- package/dist/chunk-JPTSS2OA.mjs.map +0 -1
- package/dist/chunk-KFXXRLTP.js +0 -396
- package/dist/chunk-KFXXRLTP.js.map +0 -1
- package/dist/chunk-KPRRBSG6.mjs +0 -272
- package/dist/chunk-KPRRBSG6.mjs.map +0 -1
- package/dist/chunk-NFSBGRDB.mjs +0 -57
- package/dist/chunk-NFSBGRDB.mjs.map +0 -1
- package/dist/chunk-NGJVCFTM.js +0 -219
- package/dist/chunk-NGJVCFTM.js.map +0 -1
- package/dist/chunk-NSQ6MZJ6.mjs +0 -728
- package/dist/chunk-NSQ6MZJ6.mjs.map +0 -1
- package/dist/chunk-NYQYHT76.mjs +0 -296
- package/dist/chunk-NYQYHT76.mjs.map +0 -1
- package/dist/chunk-OLJJGI5B.js +0 -1193
- package/dist/chunk-OLJJGI5B.js.map +0 -1
- package/dist/chunk-Q3572X2J.js +0 -292
- package/dist/chunk-Q3572X2J.js.map +0 -1
- package/dist/chunk-QH7N7D4I.mjs +0 -210
- package/dist/chunk-QH7N7D4I.mjs.map +0 -1
- package/dist/chunk-R7XUIV25.js +0 -466
- package/dist/chunk-R7XUIV25.js.map +0 -1
- package/dist/chunk-RFFO4KPM.js +0 -135
- package/dist/chunk-RFFO4KPM.js.map +0 -1
- package/dist/chunk-RFX7QKA7.mjs +0 -180
- package/dist/chunk-RFX7QKA7.mjs.map +0 -1
- package/dist/chunk-SN5LFAP3.js +0 -940
- package/dist/chunk-SN5LFAP3.js.map +0 -1
- package/dist/chunk-T4COXKQ3.js +0 -24
- package/dist/chunk-T4COXKQ3.js.map +0 -1
- package/dist/chunk-TS54QM27.js +0 -125
- package/dist/chunk-TS54QM27.js.map +0 -1
- package/dist/chunk-UE2S4PCX.mjs +0 -220
- package/dist/chunk-UE2S4PCX.mjs.map +0 -1
- package/dist/chunk-UTW3QX2A.mjs +0 -282
- package/dist/chunk-UTW3QX2A.mjs.map +0 -1
- package/dist/chunk-V74LGMAE.js +0 -1767
- package/dist/chunk-V74LGMAE.js.map +0 -1
- package/dist/chunk-VIREG536.js +0 -12
- package/dist/chunk-VIREG536.js.map +0 -1
- package/dist/chunk-VY7M7346.js +0 -4
- package/dist/chunk-VY7M7346.js.map +0 -1
- package/dist/chunk-W3TJOO7H.mjs +0 -319
- package/dist/chunk-W3TJOO7H.mjs.map +0 -1
- package/dist/chunk-WIUOB36M.js +0 -54
- package/dist/chunk-WIUOB36M.js.map +0 -1
- package/dist/chunk-WJGLM4CY.js +0 -291
- package/dist/chunk-WJGLM4CY.js.map +0 -1
- package/dist/chunk-WNURH5OO.mjs +0 -453
- package/dist/chunk-WNURH5OO.mjs.map +0 -1
- package/dist/chunk-X25TNRSD.mjs +0 -364
- package/dist/chunk-X25TNRSD.mjs.map +0 -1
- package/dist/chunk-Y3GT7ETK.js +0 -108
- package/dist/chunk-Y3GT7ETK.js.map +0 -1
- package/dist/chunk-Z4FRNOF6.mjs +0 -115
- package/dist/chunk-Z4FRNOF6.mjs.map +0 -1
- package/dist/chunk-ZMYLD3BN.js +0 -166
- package/dist/chunk-ZMYLD3BN.js.map +0 -1
- package/dist/chunk-ZP2KV6EX.js +0 -815
- package/dist/chunk-ZP2KV6EX.js.map +0 -1
- package/dist/chunk-ZVKXFELU.js +0 -366
- package/dist/chunk-ZVKXFELU.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/styles/interaction-states.ts","../../src/elements/Button/Button.styles.ts","../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../src/elements/Button/Button.tsx","../../src/elements/Button/index.ts","../../src/elements/Carousel/Carousel.tsx","../../src/elements/Accordion/Accordion.tsx","../../src/schemas/BaseComponentProps.ts","../../src/elements/Avatar/Avatar.tsx","../../src/elements/Avatar/AvatarGroup.tsx","../../src/elements/Badge/Badge.tsx","../../src/elements/Breadcrumbs/Breadcrumbs.tsx","../../src/elements/Dropdown/Dropdown.tsx","../../src/elements/Dropdown/Dropdown.styles.ts","../../src/elements/index.ts","../../src/elements/ButtonGroup/ButtonGroup.tsx","../../src/elements/ButtonGroup/ButtonGroup.utils.ts","../../src/elements/ButtonGroup/index.ts","../../src/elements/ButtonGroup/ButtonGroup.types.ts","../../src/elements/Card/Card.tsx","../../src/elements/Card/Card.types.ts","../../src/elements/Carousel/index.ts","../../src/elements/Skeleton/Skeleton.tsx","../../src/elements/Carousel/LazyCarousel.tsx","../../src/elements/Checkbox/Checkbox.tsx","../../src/elements/CheckboxGroup/CheckboxGroup.types.ts","../../src/elements/CheckboxGroup/CheckboxGroup.tsx","../../src/elements/Chart/Chart.tsx","../../src/elements/Chart/chart.variants.ts","../../src/elements/Chart/chart.constants.ts","../../src/elements/Chart/useChartDimensions.ts","../../src/elements/Chart/useRovingTabIndex.ts","../../src/elements/Chart/ChartContext.tsx","../../src/elements/Chart/ChartGrid.tsx","../../src/elements/Chart/ChartAxis.tsx","../../src/elements/Chart/ChartDataPoint.tsx","../../src/elements/Chart/ChartBarSeries.tsx","../../src/elements/Chart/ChartLineSeries.tsx","../../src/elements/Chart/ChartSVG.tsx","../../src/elements/Tooltip/Tooltip.tsx","../../src/elements/Chart/ChartTooltip.tsx","../../src/elements/Chart/ChartLegend.tsx","../../src/elements/Chart/ChartAnnouncer.tsx","../../src/elements/Chart/ChartDataTable.tsx","../../src/elements/Chart/useChartKeyboard.ts","../../src/elements/Chart/Chart.types.ts","../../src/elements/DatePicker/DatePicker.tsx","../../src/styles/shared-variants.ts","../../src/elements/DatePicker/DatePicker.variants.ts","../../src/elements/DatePicker/DateRangePicker.tsx","../../src/elements/DatePicker/DateField.tsx","../../src/elements/DatePicker/Calendar.tsx","../../src/elements/FileField/FileField.tsx","../../src/elements/FileField/FileField.variants.ts","../../src/elements/FileField/utils.ts","../../src/elements/FileField/FilePreview.tsx","../../src/elements/FileField/useFilePreview.ts","../../src/elements/FileField/FileProgress.tsx","../../src/elements/FileField/FileProgress.variants.ts","../../src/elements/FileField/FileField.types.ts","../../src/elements/FormLayout/FormLayout.tsx","../../src/elements/Modal/Modal.tsx","../../src/elements/Modal/Modal.styles.ts","../../src/elements/NumberField/NumberField.tsx","../../src/elements/NumberField/NumberField.types.ts","../../src/elements/NumberField/NumberField.variants.ts","../../src/elements/OTPInput/OTPInput.tsx","../../src/elements/OTPInput/hooks/useOTPKeyboard.ts","../../src/elements/OTPInput/hooks/useOTPInput.ts","../../src/elements/OTPInput/components/OTPDigit.tsx","../../src/elements/OTPInput/OTPInput.styles.ts","../../src/elements/Progress/Progress.tsx","../../src/elements/Progress/Progress.types.ts","../../src/elements/RadioGroup/RadioGroup.tsx","../../src/elements/RadioGroup/RadioGroup.types.ts","../../src/elements/Panel/Panel.tsx","../../src/elements/Resizable/components/ResizablePanelGroup.tsx","../../src/elements/Resizable/hooks/useResizableContext.ts","../../src/elements/Resizable/components/ResizablePanel.tsx","../../src/elements/Resizable/Resizable.types.ts","../../src/elements/Resizable/components/ResizableHandle.tsx","../../src/elements/Resizable/hooks/useResizable.ts","../../src/elements/Resizable/components/ResizablePopover.tsx","../../src/elements/Select/Select.styles.ts","../../src/elements/Select/Select.tsx","../../src/elements/Switch/Switch.tsx","../../src/elements/Table/Table.tsx","../../src/elements/Table/Table.styles.ts","../../src/elements/Tabs/Tabs.tsx","../../src/elements/TextField/TextField.tsx","../../src/elements/TextField/TextField.icons.tsx","../../src/elements/TextField/TextField.styles.ts","../../src/elements/TextField/TextField.hooks.ts","../../src/elements/TimeField/TimeField.tsx","../../src/elements/TimeField/TimeField.types.ts","../../src/elements/Toast/Toast.tsx","../../src/elements/Toast/Toast.types.ts","../../src/elements/Toast/ToastProvider.tsx","../../src/elements/Toast/Toaster.tsx","../../src/elements/AlertDialog/AlertDialog.tsx","../../src/elements/AlertDialog/AlertDialog.styles.ts","../../src/elements/Combobox/Combobox.tsx","../../src/elements/Combobox/Combobox.styles.ts","../../src/elements/Pagination/Pagination.tsx","../../src/elements/Pagination/Pagination.styles.ts","../../src/elements/SearchField/SearchField.tsx","../../src/elements/SearchField/SearchField.styles.ts","../../src/elements/PasswordField/PasswordField.tsx","../../src/elements/PasswordField/PasswordField.styles.ts"],"names":["cn","inputs","twMerge","clsx","init_cn","__esmMin","FOCUS_STYLES","PRESSED_STYLES","HOVER_STYLES","HIGH_CONTRAST_FOCUS","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","DISABLED_STYLES","DEFAULT_INTERACTIONS","init_interaction_states","buttonOuterVariants","buttonVisualVariants","init_Button_styles","cva","useButtonGroupContext","useContext","ButtonGroupContext","useButtonGroupItemContext","ButtonGroupItemContext","init_ButtonGroupContext","createContext","buttonGroupVariants","buttonGroupItemVariants","buttonGroupSeparatorVariants","init_ButtonGroup_variants","Button","init_Button","memo","forwardRef","className","buttonVisualClassName","variant","size","visualSize","fullWidth","loading","loadingText","shortcut","children","isDisabled","paywall","paywallRedirect","paywallDescription","onPress","props","ref","paywallDescriptionId","useId","groupContext","itemContext","effectiveVariant","effectiveSize","effectiveIsDisabled","isInVerticalGroup","effectiveFullWidth","positionClassName","effectiveVisualSize","jsx","AriaButton","e","renderProps","jsxs","Fragment","Loader2","Zap","Carousel_exports","__export","Carousel","buildManifest","durations","cumulative","duration","index","start","safeDuration","MIN_ITEM_DURATION_MS","getCurrentItemIndex","manifest","elapsed","totalDuration","normalizedElapsed","m","shouldUsePerItemTiming","itemsLength","itemDurations","autoRotateInterval","TIMER_CHECK_INTERVAL_MS","init_Carousel","items","defaultIndex","controlledIndex","onIndexChange","controlledIsPaused","onPauseChange","collapsible","defaultMinimized","controlledIsMinimized","onMinimizeChange","minimizedLabel","label","slideLabel","showNavigation","showPlayPause","respectReducedMotion","slideClassName","navigationClassName","ariaLabel","ariaLabelledBy","controlledElapsedTime","onElapsedTimeChange","isControlled","isPauseControlled","isMinimizedControlled","isElapsedTimeControlled","internalIndex","setInternalIndex","useState","internalIsPaused","setInternalIsPaused","internalIsMinimized","setInternalIsMinimized","_internalElapsedTime","setInternalElapsedTime","wasPlayingBeforeMinimize","useRef","currentIndex","isPaused","isMinimized","usePerItemTiming","useMemo","goToSlide","useCallback","newElapsed","togglePause","newPauseState","toggleMinimize","newMinimizedState","useEffect","currentIndexRef","interval","prevElapsed","newIndex","nextIndex","currentSlideLabel","ChevronUpIcon","_","ChevronDownIcon","PlayIcon","PauseIcon","Activity","ReactActivity","mode","AccordionContext","accordionVariants","accordionItemVariants","accordionTriggerVariants","accordionChevronVariants","accordionContentVariants","accordionContentInnerVariants","getHeadingLevel","level","getFirstAccordionItemId","childArray","Children","child","isValidElement","childProps","AccordionRoot","type","expandedKeys","defaultExpandedKeys","onExpandedChange","disabledKeys","allowsMultipleExpanded","effectiveDefaultExpandedKeys","firstItemId","contextValue","DisclosureGroup","AccordionItemComponent","id","isDisabledProp","isDisabledFromKeys","Disclosure","composeRenderProps","AccordionTriggerComponent","headingLevel","icon","hideIcon","isExpanded","DisclosureStateContext","Heading","ChevronDown","AccordionContentInner","preserveState","AccordionContentComponent","DisclosurePanel","Accordion","AccordionItem","AccordionTrigger","AccordionContent","BaseComponentPropsSchema","z","getInitials","name","parts","firstPart","lastPart","first","last","avatarOuterVariants","avatarVisualVariants","Avatar","src","alt","shape","status","dataTestId","ariaDescribedBy","_groupIndex","loadingState","setLoadingState","handleImageLoad","handleImageError","initials","isInteractive","computedAriaLabel","groupBrightness","visualContent","OVERLAP_CLASS_BY_SIZE","avatarOverflowVariants","avatarGroupVariants","AvatarGroup","max","totalCount","visibleCount","overflowCount","isGroupInteractive","overlapClass","visibleAvatars","zIndex","individualOnPress","cloneElement","overflowIndicator","groupContent","badgeOuterVariants","badgeVisualVariants","badgeVariants","iconSizeClasses","Badge","iconPosition","count","ariaLabelledby","ariaDescribedby","visualClasses","multipleElements","renderContent","menuVariants","menuItemVariants","getDisplayName","DropdownRoot","defaultOpen","isOpen","onOpenChange","_ref","hasTrigger","DropdownTrigger","hasMenu","DropdownMenu","AriaMenuTrigger","align","side","placement","AriaPopover","AriaMenu","DropdownItem","onAction","iconRight","isDropdownMenu","hasSubmenu","contentChildren","submenu","AriaSubmenuTrigger","AriaMenuItem","ChevronRight","DropdownSeparator","AriaSeparator","DropdownLabel","AriaHeader","Dropdown","breadcrumbsVariants","breadcrumbListVariants","breadcrumbItemVariants","breadcrumbLinkVariants","separatorVariants","ellipsisButtonVariants","isCurrentPage","total","getCollapsedItems","maxItems","itemsBeforeCollapse","itemsAfterCollapse","before","after","collapsed","BreadcrumbSeparator","separator","BreadcrumbLink","item","isCurrent","LinkComponent","isGroupDisabled","state","BreadcrumbEllipsis","MoreHorizontal","Breadcrumbs","linkComponent","collapsedData","isLast","globalIndex","isButtonElement","getPosition","ButtonGroup","orientation","buttonChildren","totalButtons","groupContextValue","wrappedChildren","buttonIndex","position","Toolbar","ButtonGroupSeparator","ButtonGroupPropsSchema","ButtonGroupSeparatorPropsSchema","FlipButtonPositionSchema","FlipButtonLabelSchema","FlipButtonIconSchema","flipButtonPositionVariants","Card","flippable","backContent","controlledFlipped","defaultFlipped","onFlipChange","flipButtonPosition","flipButtonLabel","flipButtonIcon","flipDuration","rest","internalFlipped","setInternalFlipped","flipped","handleFlip","newState","showLabel","hideLabel","defaultIcon","RotateCcw","frontIcon","backIcon","FlipButton","CardHeader","CardTitle","Comp","CardDescription","CardContent","CardFooter","CardAction","skeletonVariants","Skeleton","lazy","mod","CarouselSkeleton","LazyCarousel","minWidth","isVisible","setIsVisible","hasLoaded","setHasLoaded","isClient","setIsClient","checkViewport","visible","Suspense","checkboxContainerVariants","checkboxIndicatorVariants","checkmarkVariants","CheckmarkIcon","MinusIcon","Checkbox","isSelected","defaultSelected","isReadOnly","isIndeterminate","isInvalid","isRequired","onChange","onFocusChange","value","description","selectedIcon","slot","computedIsDisabled","computedIsReadOnly","computedIsIndeterminate","renderIcon","isChecked","isIndet","iconClassName","dataSelected","dataIndeterminate","iconElement","AriaCheckbox","CheckboxGroupVariantSchema","CheckboxGroupSizeSchema","CheckboxGroupOrientationSchema","CheckboxGroupPropsSchema","CheckboxGroupContext","checkboxGroupVariants","checkboxItemVariants","TimesIcon","CheckboxLabel","CheckboxDescription","CheckboxComponent","groupDisabled","effectiveDisabled","renderSelectedIcon","dedupeWithWarning","values","componentName","uniqueValues","CheckboxGroup","errorMessage","defaultValue","restProps","generatedId","checkboxGroupId","labelId","descriptionId","errorId","describedByParts","computedAriaDescribedBy","dedupedValue","dedupedDefaultValue","AriaCheckboxGroup","Label","Text","FieldError","chartVariants","dataPointVariants","legendVariants","CHART_PADDING","MIN_CHART_WIDTH","MIN_CHART_HEIGHT","BAR_GROUP_PADDING","BAR_PADDING","MIN_BAR_WIDTH","BAR_RADIUS","LINE_STROKE_WIDTH","POINT_RADIUS","LINE_PATTERNS","GRID_COLOR","GRID_STROKE_WIDTH","GRID_STROKE_OPACITY","AXIS_COLOR","AXIS_STROKE_WIDTH","AXIS_TICK_SIZE","AXIS_LABEL_FONT_SIZE","MIN_TOUCH_TARGET","FOCUS_RING_OFFSET","FOCUS_RING_WIDTH","DEFAULT_SERIES_COLORS","niceNum","range","round","exponent","fraction","niceFraction","calculateYAxisTicks","minValue","maxValue","tickCount","tickSpacing","niceMin","niceMax","ticks","tick","calculateBarLayout","plotWidth","labelCount","seriesCount","plotX","groupWidth","availableWidth","barWidth","labelIdx","seriesIdx","groupCenter","totalBarsWidth","useChartDimensions","containerRef","dimensions","setDimensions","container","updateDimensions","width","constrainedWidth","height","plotArea","observer","entries","entry","useRovingTabIndex2D","options","rows","cols","initialRow","initialCol","wrap","focusedRow","setFocusedRow","focusedCol","setFocusedCol","getColCount","row","notifyFocusChange","col","moveRight","currentCol","maxCol","newCol","moveLeft","moveDown","currentRow","newRow","newMaxCol","constrainedCol","moveUp","moveToStart","moveToEnd","setFocus","constrainedRow","getTabIndex","ChartContext","useChartContext","context","getAllLabels","data","labelSet","series","point","calculateScales","startAtZero","allLabels","dataMin","dataMax","yMin","yTicks","yMax","adjustedYMin","xScale","labelIndex","step","yRange","normalized","ChartProvider","title","xAxisLabel","yAxisLabel","showTooltip","showGrid","showLegend","announceTrends","trendUpFormat","trendDownFormat","reducedMotion","onPointFocusProp","onPointSelectProp","selectedPoint","setSelectedPoint","announcement","setAnnouncement","isTooltipVisible","setIsTooltipVisible","tooltipPoint","setTooltipPoint","currentTrend","setCurrentTrend","currentTrendDirection","setCurrentTrendDirection","scales","s","formatTrendText","percent","isUp","getTrendInfo","seriesIndex","pointIndex","currentPoint","previousPoint","change","roving","trendInfo","seriesInfo","formattedValue","formatValue","announcementTrend","numberFormatter","locale","calculateTrendForPoint","getSeriesColor","getPointCoordinates","selectPoint","seriesData","pointData","clearSelection","announce","message","showTooltipAt","trendResult","hideTooltip","ChartGrid","yScale","y","ChartAxis","plotY","plotHeight","x","ChartDataPoint","color","tabIndex","onFocus","onBlur","onHover","onHoverEnd","onKeyDown","isFocusVisible","focusProps","useFocusRing","hitAreaSize","hitX","hitY","handleFocus","event","handleBlur","handleMouseEnter","_event","handleMouseLeave","ChartBarSeries","totalSeries","onPointFocus","onPointBlur","onPointHover","onPointHoverEnd","_xScale","getBarX","baselineY","barX","barY","barHeight","finalBarY","accessibleLabel","ChartLineSeries","pattern","points","p","a","b","pathD","i","strokeDasharray","ChartSVG","titleId","descId","tooltipContentVariants","tooltipArrowVariants","placementToSide","basePlacement","TooltipRoot","delay","closeDelay","trigger","AriaTooltipTrigger","TooltipTriggerComponent","TooltipContentComponent","sideOffset","alignOffset","shouldFlip","showArrow","arrowSize","AriaTooltip","actualSide","OverlayArrow","TooltipArrowComponent","Tooltip","TooltipTrigger","TooltipContent","TooltipArrow","TOOLTIP_GAP","ChartTooltip","seriesName","chartWidth","chartHeight","trend","trendDirection","tooltipRef","setPosition","setSide","tooltipRect","tooltipWidth","tooltipHeight","left","top","newSide","ChartLegend","ChartAnnouncer","VisuallyHidden","ChartDataTable","isSingleSeries","useChartKeyboard","onSelect","onClear","disabled","ChartInner","chartId","ctx","handlePointFocus","handlePointBlur","handlePointHover","handlePointHoverEnd","tooltipPosition","tooltipSeries","tooltipPointData","shouldShowLegend","ChartComponent","onPointSelect","node","Chart","DataPointSchema","LinePatternSchema","DataSeriesSchema","ChartTypeSchema","ChartVariantSchema","ChartPropsSchema","FOCUS_WITHIN_RING","FOCUS_VISIBLE_RING","FOCUS_RING","FOCUS_HIGHLIGHT","DISABLED_STANDARD","DISABLED_DATA_ATTR","TEXT_SIZE_SMALL_SCALE","TEXT_SIZE_MEDIUM_SCALE","TOUCH_TARGET_MIN","FIELD_HEIGHTS","ERROR_MESSAGE_BASE","SUCCESS_MESSAGE_BASE","DESCRIPTION_BASE","LABEL_BASE","POPOVER_ANIMATION_IN","POPOVER_ANIMATION_OUT","REDUCED_MOTION","TRANSITION_COLORS","TRANSITION_FAST","HOVER_ACCENT","combineStyles","styles","dateFieldVariants","dateSegmentVariants","calendarCellVariants","calendarHeaderVariants","calendarNavButtonVariants","calendarGridVariants","calendarGridHeaderCellVariants","datePickerPopoverVariants","datePickerTriggerVariants","datePickerDescriptionVariants","datePickerErrorVariants","datePickerLabelVariants","DatePickerContext","DatePicker","AriaDatePicker","AriaLabel","AriaGroup","AriaDateInput","segment","AriaDateSegment","CalendarIcon","AriaText","AriaFieldError","AriaDialog","AriaCalendar","ChevronLeft","AriaHeading","AriaCalendarGrid","AriaCalendarGridHeader","day","AriaCalendarHeaderCell","AriaCalendarGridBody","date","AriaCalendarCell","DateRangePicker","startName","endName","AriaDateRangePicker","AriaRangeCalendar","DateField","AriaDateField","Calendar","fileFieldContainerVariants","fileFieldDropZoneVariants","fileFieldTriggerVariants","fileFieldListVariants","fileFieldListHeaderVariants","fileFieldItemVariants","fileFieldRemoveButtonVariants","fileFieldErrorVariants","fileFieldSuccessVariants","fileFieldDescriptionVariants","fileFieldLabelVariants","formatFileSize","bytes","k","sizes","truncateFileName","maxLength","lastDotIndex","ext","base","availableLength","isFileTypeAccepted","file","acceptedTypes","category","getFileIcon","deduplicateFiles","existing","incoming","result","existingIndex","f","formatAcceptedTypes","RESIZE_THRESHOLD","isImageFile","createResizedPreview","maxDimension","resolve","reject","img","objectUrl","scale","canvas","blob","generatePreview","useFilePreview","enabled","maxBytes","preview","setPreview","isLoading","setIsLoading","error","setError","isImage","isActive","err","prev","FilePreview","renderPreview","sizeStyles","iconType","IconComponent","getIconForType","iconSize","ImageIcon","VideoIcon","AudioLines","FileIcon","fileProgressVariants","fileProgressTrackVariants","fileProgressBarVariants","fileProgressHeaderVariants","fileProgressErrorVariants","fileProgressRetryVariants","getStatusText","progress","FileProgress","onRetry","statusText","ProgressBar","percentage","valueText","FileField","acceptedFileTypes","allowsMultiple","maxFileSize","maxFiles","successMessage","triggerText","isValid","validate","showPreviews","previewSize","maxPreviewBytes","showProgress","uploadProgress","uploadStatus","uploadErrors","_ariaLabel","_ariaLabelledBy","fieldId","isDragOver","setIsDragOver","internalError","setInternalError","dragCounterRef","displayError","hasError","describedBy","validateFiles","files","existingFiles","validFiles","errors","processFiles","fileList","newFiles","valid","customError","finalFiles","handleSelect","handleRemove","fileToRemove","handleClearAll","handleDragEnter","handleDragOver","handleDragLeave","handleDrop","getIconComponent","acceptString","FileTrigger","Upload","effectivePreviewSize","fileStatus","fileProgress","fileError","showProgressForFile","X","FileFieldPropsSchema","formLayoutBodyVariants","Tag","FormLayout","requiredNote","columns","density","_fieldErrors","autoHideSuccess","autoHideDuration","actions","headingId","finalHeadingId","finalAriaLabelledby","showSuccess","setShowSuccess","timer","AlertCircle","CheckCircle2","modalContentVariants","modalOverlayVariants","ModalContext","ModalRoot","role","ModalTrigger","hasContent","ModalContent","triggerChild","contentChild","triggerElement","unwrappedTrigger","unwrappedContent","AriaDialogTrigger","animation","animationDuration","isDismissable","isKeyboardDismissDisabled","showClose","overlayClasses","modalClasses","mergedModalClasses","AriaModalOverlay","AriaModal","close","ModalOverlay","_props","ModalHeader","ModalTitle","as","ModalDescription","ModalFooter","ModalClose","OverlayTriggerStateContext","childElement","handlePress","existingOnPress","Modal","DEFAULT_MAX_VALUE","DEFAULT_MIN_VALUE","NEGATIVE_MIN_VALUE","NumberFieldPropsSchema","numberFieldVariants","numberFieldInputVariants","numberFieldStepperVariants","numberFieldLabelVariants","numberFieldDescriptionVariants","numberFieldErrorVariants","NumberField","stepperLayout","allowNegative","incrementAriaLabel","decrementAriaLabel","effectiveMinValue","effectiveMaxValue","showSteppers","isStackedLayout","AriaNumberField","Minus","AriaInput","Plus","useOTPKeyboard","length","focusedIndex","setFocusedIndex","readOnly","handleArrowLeft","handleArrowRight","handleBackspace","digits","handleDelete","handleHome","handleEnd","useOTPInput","controlledValue","onComplete","controlledError","internalValue","setInternalValue","completedRef","debounceTimerRef","currentValue","currentError","runValidation","numericPattern","cleanValue","alphanumericPattern","char","updateValue","newValue","validationError","isComplete","handleChange","inputValue","newChar","valueArray","handlePaste","pastedText","validChars","firstEmptyIndex","clear","emptyValue","setValue","paddedValue","validateCurrent","handleKeyDown","otpDigitVariants","otpContainerVariants","otpDigitGroupVariants","otpErrorVariants","otpDescriptionVariants","OTPDigitComponent","focused","masked","isFilled","computedState","displayValue","OTPDigit","OTPInput","mask","digitClassName","inputMode","inputRef","useImperativeHandle","getDigitState","handleFocusEvent","handleBlurEvent","handleDigitClick","handleDigitKeyDown","baseId","digit","progressTrackVariants","progressIndicatorVariants","progressContainerVariants","Progress","showValueLabel","valueLabel","formatOptions","labelPosition","shouldShowValueLabel","AriaProgressBar","ProgressPropsSchema","RadioGroupContext","radioGroupVariants","radioItemVariants","radioIndicatorVariants","radioInnerDotVariants","RadioLabel","RadioDescription","RadioComponent","AriaRadio","Radio","RadioGroup","radioGroupId","AriaRadioGroup","RadioGroupVariantSchema","RadioGroupSizeSchema","RadioGroupOrientationSchema","RadioGroupPropsSchema","RadioPropsSchema","panelContentVariants","panelHeaderVariants","panelBodyVariants","panelFooterVariants","panelCloseButtonVariants","PanelContext","usePanelContext","useMediaQuery","query","matches","setMatches","media","listener","PanelRoot","controlledIsOpen","onClose","mobileBreakpoint","uncontrolledIsOpen","setUncontrolledIsOpen","triggerRef","uniqueId","panelId","isMobile","setIsOpen","open","handleClose","PanelTrigger","asChild","setRef","element","BuiltInCloseButton","PanelContent","PanelHeader","PanelTitle","PanelDescription","PanelBody","PanelFooter","PanelClose","Panel","ResizableContext","useResizableContext","useResizableProvider","direction","groupLabel","controlledSizes","onSizesChange","internalSizes","setInternalSizes","panels","setPanels","liveRegionRef","announceTimeoutRef","sizesInitializedRef","setSizes","newSizes","registerPanel","info","newPanels","unregisterPanel","panelCount","equalSize","liveRegion","ResizablePanelGroup","DEFAULT_MIN_SIZE","DEFAULT_MAX_SIZE","LONG_PRESS_THRESHOLD","ResizePresetSchema","resizableHandleVariants","resizableGripVariants","ResizablePanel","_defaultSize","minSize","maxSize","onCollapse","onExpand","onResize","internalRef","panelIndex","setPanelIndex","prevSizeRef","isRegisteredRef","registeredIndexRef","panel","allPanels","foundIndex","currentSize","wasCollapsed","isCollapsed","clampSize","min","calculateNewSizes","leftIndex","rightIndex","delta","leftPanel","rightPanel","leftSize","rightSize","newLeftSize","newRightSize","leftMin","leftMax","rightMin","rightMax","useResizable","leftPanelIndex","rightPanelIndex","onOpenPopover","isDragging","setIsDragging","dragStartRef","longPressTimerRef","pointerDownTimeRef","wasLongPressRef","panelsRef","sizesRef","setSizesRef","handlePointerMoveRef","handlePointerUpRef","getContainerSize","pixelsToPercent","pixels","containerSize","onPointerMove","onPointerUp","handlePointerMove","percentDelta","handlePointerUp","newSize","handlePointerDown","moveHandler","upHandler","ResizablePopover","presets","originalSizes","setOriginalSizes","wasOpenRef","handleLeftChange","newLeft","newRight","handleRightChange","handlePreset","preset","handleCancel","DialogTrigger","Popover","Dialog","ResizableHandle","withHandle","handleRef","handleIndex","setHandleIndex","handle","handles","h","isPopoverOpen","setIsPopoverOpen","handlePopoverSizesChange","GripIcon","GripVertical","GripHorizontal","leftPanelInfo","rightPanelInfo","selectTriggerVariants","selectItemVariants","selectPopoverVariants","selectSectionVariants","selectErrorVariants","SelectBase","ariaSelectProps","triggerContent","emptyStateMessage","childCount","AriaSelect","validationErrors","ListBox","ListBoxItem","SelectRoot","placeholder","validationBehavior","key","SelectValue","MultiSelectRoot","_selectionMode","valueToLabelMap","map","processChildren","nodes","SelectItem","itemValue","itemChildren","v","keys","textValue","selectionMode","itemDisabled","CheckSquare","Check","SelectSection","ListBoxSection","SelectHeader","Header","Select","MultiSelect","switchOuterVariants","switchTrackVariants","switchThumbVariants","Switch","AriaSwitch","_classNameProps","tableContainerVariants","tableVariants","tableHeaderVariants","tableFooterVariants","tableCaptionVariants","columnVariants","rowVariants","cellVariants","TableContext","Table","stickyHeader","selectionBehavior","disallowEmptySelection","disabledBehavior","selectedKeys","defaultSelectedKeys","onSelectionChange","sortDescriptor","onSortChange","onRowAction","AriaTable","TableHeaderInner","allowsDragging","useTableOptions","AriaTableHeader","AriaColumn","Collection","TableHeader","TableBodyInner","renderEmptyState","AriaTableBody","TableBody","TableFooter","TableCaption","Column","isRowHeader","allowsSorting","maxWidth","canSort","sortDirection","ChevronUp","RowInner","href","rowVariant","selectedClasses","unselectedClasses","selectionCellClasses","AriaRow","AriaCell","Row","Cell","_colSpan","tabListVariants","tabVariants","tabPanelVariants","TabsRoot","selectedKey","defaultSelectedKey","keyboardActivation","AriaTabs","TabListComponent","AriaTabList","TabComponent","target","rel","download","AriaTab","TabPanelComponent","shouldForceMount","forceMount","AriaTabPanel","content","Tabs","TabList","Tab","TabPanel","EyeIcon","EyeOffIcon","inputVariants","labelVariants","descriptionVariants","errorMessageVariants","successMessageVariants","useExpandOnFocus","expandOnFocus","collapsedWidth","userOnFocus","userOnBlur","isFocused","setIsFocused","inputWidth","useCopyPasteProtection","disableCopyPaste","isShaking","setIsShaking","screenReaderMessage","setScreenReaderMessage","usePasswordToggle","showPasswordToggle","showPassword","setShowPassword","handlePasswordToggle","actualType","TextFieldLabel","TextFieldInput","TextFieldDescription","TextFieldError","CircleAlert","TextFieldSuccess","TextField","autoComplete","patternDescription","prefix","suffix","prefixSize","suffixSize","isIconHidden","onSubmit","isSearch","searchValue","setSearchValue","isControlledSearch","currentSearchValue","handleSearchChange","handleSearchClear","handleSearchKeyDown","inputState","labelState","combinedDescription","actualPrefix","Search","inputPadding","basePadding","prefixWidth","suffixWidth","actualSuffix","hasInteractiveSuffix","AriaTextField","timeFieldVariants","timeSegmentVariants","timeFieldLabelVariants","timeFieldDescriptionVariants","timeFieldErrorVariants","TimeField","AriaTimeField","toastVariants","toasterVariants","CloseButton","internalQueue","ToastQueue","totalActiveToasts","toastCountListeners","incrementTotalToasts","fn","decrementTotalToasts","getTotalActiveToasts","subscribeToTotalCount","toastQueue","toast","getInternalQueue","enforceMinTimeout","timeout","applyToastDefaults","validated","dismissReason","ToastItem","forwardedRef","toastProps","contentProps","useToast","touchStart","setTouchStart","translateX","setTranslateX","SWIPE_THRESHOLD","handleTouchStart","touch","handleTouchMove","diff","handleTouchEnd","handleCloseClick","accessibleName","DismissReasonSchema","ToastVariantSchema","ToasterPositionSchema","ToastOptionsSchema","ToastProviderPropsSchema","ToasterPropsSchema","ToastContext","ToastProvider","maxVisibleToasts","queue","StackedToastIndicator","queuedCount","stackLayers","Toaster","internalQueueRef","useAriaToastQueue","useSyncExternalStore","regionProps","useToastRegion","alertDialogContentVariants","AlertDialog","cancelLabel","cancelIcon","actionLabel","actionIcon","actionVariant","comboboxVariants","comboboxLabelVariants","comboboxInputVariants","comboboxTriggerWrapperVariants","comboboxButtonVariants","comboboxPopoverVariants","comboboxListBoxVariants","comboboxItemVariants","comboboxSectionVariants","comboboxSectionHeaderVariants","comboboxDescriptionVariants","comboboxErrorVariants","Combobox","allowsCustomValue","menuTrigger","defaultInputValue","onInputChange","AriaComboBox","ChevronsUpDown","AriaListBox","ComboboxItem","computedTextValue","AriaListBoxItem","ComboboxSection","header","AriaListBoxSection","paginationNavVariants","paginationEllipsisVariants","paginationInfoVariants","generatePageNumbers","currentPage","totalPages","siblingCount","totalPageNumbers","leftSiblingIndex","rightSiblingIndex","showLeftEllipsis","showRightEllipsis","leftRange","pages","rightRange","getButtonVariant","paginationVariant","getButtonVisualSize","Pagination","page","onPageChange","showFirstLast","showPrevNext","labels","resolvedLabels","handlePageChange","newPage","isFirstPage","isLastPage","ChevronsLeft","pageItem","ChevronsRight","SearchField","searchFieldVariants","searchFieldLabelVariants","searchFieldDescriptionVariants","searchFieldErrorVariants","PasswordField","hasToggle","passwordFieldVariants","passwordFieldLabelVariants","passwordFieldDescriptionVariants","passwordFieldErrorVariants"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Global Interaction State Styles\n *\n * Consistent interaction patterns across all Themis components.\n * These styles ensure WCAG 2.2 AAA compliance and predictable UX.\n *\n * @see spec.md FR-010 (Visible focus ring for keyboard navigation)\n * @see spec.md FR-031 (Pressed state feedback)\n * @see spec.md FR-012 (High contrast mode support)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\n/**\n * Focus state styles (FR-010)\n * Visible focus ring for keyboard navigation - WCAG 2.2 Level AAA\n *\n * Components can override by extending these styles:\n * @example\n * cn(FOCUS_STYLES, \"ring-4\") // Increases ring width to 4px\n */\nexport const FOCUS_STYLES = \"data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2\";\n\n/**\n * Pressed/Active state styles (FR-031)\n * Visual feedback for press interactions\n *\n * Components can override the scale amount:\n * @example\n * cn(PRESSED_STYLES_BASE, \"data-[pressed]:scale-[0.95]\") // More pronounced scale\n */\nexport const PRESSED_STYLES = \"data-[pressed]:scale-[0.97]\";\n\n/**\n * Base pressed styles without scale (for components that need different feedback)\n */\nexport const PRESSED_STYLES_BASE = \"data-[pressed]:transition-transform data-[pressed]:duration-100\";\n\n/**\n * Hover state styles\n * Elevation change on hover for better affordance\n *\n * Components can override shadow depth:\n * @example\n * cn(HOVER_STYLES_BASE, \"data-[hovered]:shadow-lg\") // Larger shadow\n */\nexport const HOVER_STYLES = \"data-[hovered]:shadow-md\";\n\n/**\n * Base hover styles without shadow (for components that use different hover effects)\n */\nexport const HOVER_STYLES_BASE = \"data-[hovered]:transition-shadow data-[hovered]:duration-200\";\n\n/**\n * High contrast mode focus (FR-012)\n * Enhanced outlines for users requiring high contrast\n *\n * Uses 'hc:' prefix for prefers-contrast: more media query\n */\nexport const HIGH_CONTRAST_FOCUS = \"hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground\";\n\n/**\n * High contrast mode hover (FR-012)\n * Enhanced outlines for hover in high contrast mode\n */\nexport const HIGH_CONTRAST_HOVER = \"hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground\";\n\n/**\n * High contrast mode pressed state\n * Enhanced outlines for pressed state in high contrast mode\n */\nexport const HIGH_CONTRAST_PRESSED = \"hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground\";\n\n/**\n * Combined high contrast styles\n * Use this for components that need all high contrast interaction states\n */\nexport const HIGH_CONTRAST_INTERACTIONS = `${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Disabled state styles\n * Consistent disabled appearance across all components\n */\nexport const DISABLED_STYLES = \"disabled:pointer-events-none disabled:opacity-50\";\n\n/**\n * Default interaction bundle\n * Most common combination for interactive components\n *\n * Includes: focus ring, pressed scale, hover shadow, high contrast enhancements\n *\n * @example\n * <button className={cn(DEFAULT_INTERACTIONS, \"bg-primary\")}>Click</button>\n */\nexport const DEFAULT_INTERACTIONS = `${FOCUS_STYLES} ${PRESSED_STYLES} ${HOVER_STYLES} ${HIGH_CONTRAST_FOCUS} ${HIGH_CONTRAST_HOVER} ${HIGH_CONTRAST_PRESSED}`;\n\n/**\n * Subtle interaction bundle\n * For components that need less pronounced feedback\n *\n * Includes: focus ring and high contrast, but no hover shadow or pressed scale\n */\nexport const SUBTLE_INTERACTIONS = `${FOCUS_STYLES} ${HIGH_CONTRAST_FOCUS}`;\n\n/**\n * Non-interactive element styles\n * For elements that should indicate they are not interactive\n */\nexport const NON_INTERACTIVE = \"cursor-default select-none\";\n","import { cva } from 'class-variance-authority';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Handles WCAG 2.2 AAA touch target requirement\n * Always transparent, centers the visual button inside\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n *\n * In vertical ButtonGroups, uses items-stretch so the visual layer (Layer 2)\n * can fill the full touch target height, eliminating gaps between buttons.\n */\nexport const buttonOuterVariants = cva(\n \"inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n inVerticalGroup: {\n true: \"items-stretch\",\n false: \"items-center\",\n },\n },\n defaultVariants: {\n fullWidth: false,\n inVerticalGroup: false,\n },\n }\n);\n\n/**\n * Layer 2: Visual button appearance (adjustable size)\n * Provides the visual appearance with configurable size\n * Can be smaller than touch target for use cases like carousel dots\n * NOTE: NO focus-visible styles here - focus ring is on Layer 1\n */\nexport const buttonVisualVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer\",\n {\n variants: {\n variant: {\n default:\n \"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80\",\n destructive:\n \"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80\",\n outline:\n \"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]\",\n secondary:\n \"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70\",\n ghost:\n \"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]\",\n link: \"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]\",\n },\n fullWidth: {\n true: \"w-full\",\n false: \"\",\n },\n visualSize: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3 text-xs\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n dot: \"h-5 w-5 rounded-full p-0 min-h-0 min-w-0\",\n },\n paywall: {\n true: \"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n visualSize: \"default\",\n paywall: false,\n },\n }\n);\n\n/**\n * @deprecated Use buttonVisualVariants instead. This alias is kept for backward compatibility.\n */\nexport const buttonVariants = buttonVisualVariants;\n","\"use client\";\n\nimport { createContext, useContext } from 'react';\nimport type {\n ButtonGroupContextValue,\n ButtonGroupItemContextValue,\n} from './ButtonGroup.types';\n\n/**\n * ButtonGroup Context System (Two-Level)\n *\n * Provides a two-level context pattern for ButtonGroup:\n *\n * 1. ButtonGroupContext (group-level):\n * - Provides: orientation, variant, size, isDisabled\n * - Consumed by: Button (for prop inheritance), Separator (for orientation)\n *\n * 2. ButtonGroupItemContext (item-level):\n * - Provides: position ('first' | 'middle' | 'last' | 'only')\n * - Consumed by: Button (for border-radius styling)\n *\n * Both contexts return null when not in a provider, allowing Button\n * to work standalone without any group context.\n *\n * @see plan.md for architecture details\n * @see ButtonGroup.tsx for Provider implementation\n */\n\n// =============================================================================\n// Group-Level Context\n// =============================================================================\n\n/**\n * Context for group-level props (orientation, variant, size, isDisabled)\n * Default value is null to indicate \"not in a group\"\n */\nconst ButtonGroupContext = createContext<ButtonGroupContextValue | null>(null);\n\nButtonGroupContext.displayName = 'ButtonGroupContext';\n\n/**\n * Hook to access group-level context\n * @returns ButtonGroupContextValue if inside a ButtonGroup, null otherwise\n */\nexport function useButtonGroupContext(): ButtonGroupContextValue | null {\n return useContext(ButtonGroupContext);\n}\n\n// =============================================================================\n// Item-Level Context\n// =============================================================================\n\n/**\n * Context for per-button position information\n * Default value is null to indicate \"not wrapped with position context\"\n */\nconst ButtonGroupItemContext =\n createContext<ButtonGroupItemContextValue | null>(null);\n\nButtonGroupItemContext.displayName = 'ButtonGroupItemContext';\n\n/**\n * Hook to access item-level context (position)\n * @returns ButtonGroupItemContextValue if wrapped with position context, null otherwise\n */\nexport function useButtonGroupItemContext(): ButtonGroupItemContextValue | null {\n return useContext(ButtonGroupItemContext);\n}\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ButtonGroupContext, ButtonGroupItemContext };\n","import { cva } from 'class-variance-authority';\n\n/**\n * ButtonGroup CVA Variants\n *\n * Defines Class Variance Authority (CVA) variants for:\n * - ButtonGroup container (orientation-based layout)\n * - ButtonGroupItem (position-based border-radius)\n * - ButtonGroupSeparator (orientation-based styling)\n *\n * @see plan.md Phase 1: Design & Contracts - CVA Variants\n * @see constitution.md Principle V (Component Quality Standards)\n */\n\n// =============================================================================\n// Container Variants\n// =============================================================================\n\n/**\n * ButtonGroup container variants\n * Controls the layout direction based on orientation\n * Uses gap-0 to ensure buttons are connected (share borders)\n */\nexport const buttonGroupVariants = cva('inline-flex items-center gap-0', {\n variants: {\n orientation: {\n horizontal: 'flex-row',\n vertical: 'flex-col w-full',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// =============================================================================\n// Item Position Variants\n// =============================================================================\n\n/**\n * ButtonGroupItem position variants\n * Applied to Button's visual layer (Layer 2) for position-aware border-radius\n *\n * Compound variants handle both orientation and position combinations:\n * - Horizontal: left/right borders and radii\n * - Vertical: top/bottom borders and radii\n */\nexport const buttonGroupItemVariants = cva('', {\n variants: {\n orientation: {\n // min-w-[44px] ensures visual layer fills touch target width (for icon buttons)\n horizontal: 'min-w-[44px]',\n // flex (overrides inline-flex) + min-h-[44px] makes visual layer fill touch target,\n // eliminating gaps between stacked buttons in vertical orientation\n vertical: 'flex min-h-[44px]',\n },\n position: {\n first: '',\n middle: '',\n last: '',\n only: '', // Single button - no modifications needed\n },\n },\n compoundVariants: [\n // ==========================================================================\n // Horizontal Orientation\n // ==========================================================================\n {\n orientation: 'horizontal',\n position: 'first',\n className: 'rounded-r-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'middle',\n className: 'rounded-none border-r-0',\n },\n {\n orientation: 'horizontal',\n position: 'last',\n className: 'rounded-l-none',\n },\n // ==========================================================================\n // Vertical Orientation\n // Note: w-full is handled by Button's effectiveFullWidth for both layers\n // ==========================================================================\n {\n orientation: 'vertical',\n position: 'first',\n className: 'rounded-b-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'middle',\n className: 'rounded-none border-b-0',\n },\n {\n orientation: 'vertical',\n position: 'last',\n className: 'rounded-t-none',\n },\n ],\n defaultVariants: {\n orientation: 'horizontal',\n position: 'only',\n },\n});\n\n// =============================================================================\n// Separator Variants\n// =============================================================================\n\n/**\n * ButtonGroupSeparator variants\n * Orientation-aware visual divider between button groups\n */\nexport const buttonGroupSeparatorVariants = cva('bg-[var(--border)]', {\n variants: {\n orientation: {\n horizontal: 'w-px h-6 mx-1',\n vertical: 'h-px w-full my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","\"use client\";\n\n/**\n * Button Component - 3-Layer Architecture\n * Accessible button with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant, transparent)\n * - Layer 2: Visual Button (configurable size, colors, borders)\n * - Layer 3: Content & Effects (text, icons, ripple, loading spinner)\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useId } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { Loader2, Zap } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { ButtonProps } from './Button.types';\nimport { buttonOuterVariants, buttonVisualVariants, buttonVariants } from './Button.styles';\nimport { PRESSED_STYLES, HOVER_STYLES, HIGH_CONTRAST_HOVER, HIGH_CONTRAST_PRESSED } from '../../styles/interaction-states';\nimport {\n useButtonGroupContext,\n useButtonGroupItemContext,\n} from '../ButtonGroup/ButtonGroupContext';\nimport { buttonGroupItemVariants } from '../ButtonGroup/ButtonGroup.variants';\n\n/**\n * Button Component - 3-Layer Architecture\n * Fully accessible button with React Aria and themed styling\n *\n * Layer 1: Touch Target (AriaButton) - 44x44px WCAG AAA compliant\n * Layer 2: Visual Button (span) - configurable appearance\n * Layer 3: Content (children) - text, icons, effects\n */\nconst Button = memo(forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n buttonVisualClassName,\n variant,\n size,\n visualSize,\n fullWidth,\n loading = false,\n loadingText = \"Loading...\",\n shortcut,\n children,\n isDisabled,\n paywall = false,\n paywallRedirect,\n paywallDescription,\n onPress,\n ...props\n },\n ref\n ) => {\n const paywallDescriptionId = useId();\n\n // ==========================================================================\n // ButtonGroup Context Integration\n // ==========================================================================\n\n // Consume group-level context (variant, size, isDisabled, orientation)\n const groupContext = useButtonGroupContext();\n\n // Consume item-level context (position for border-radius styling)\n const itemContext = useButtonGroupItemContext();\n\n // Merge context values with props (props take precedence)\n const effectiveVariant = variant ?? groupContext?.variant ?? 'default';\n const effectiveSize = size ?? groupContext?.size;\n const effectiveIsDisabled = isDisabled ?? groupContext?.isDisabled ?? false;\n\n // In vertical groups, buttons should be full width automatically\n const isInVerticalGroup = groupContext?.orientation === 'vertical';\n const effectiveFullWidth = fullWidth || isInVerticalGroup;\n\n // Position styling for ButtonGroup (only applied when in a group)\n const positionClassName = itemContext\n ? buttonGroupItemVariants({\n orientation: groupContext?.orientation ?? 'horizontal',\n position: itemContext.position,\n })\n : '';\n\n // Default visualSize to size for backward compatibility\n const effectiveVisualSize = visualSize ?? effectiveSize ?? 'default';\n\n // AAA Accessibility: Warn in dev/test if icon/dot variant lacks accessible name\n if (process.env.NODE_ENV !== 'production') {\n if (\n (effectiveVisualSize === 'dot' || effectiveVisualSize === 'icon') &&\n !props['aria-label'] &&\n !children\n ) {\n console.warn(\n '[Button] visualSize=\"dot\" or \"icon\" requires aria-label when no visible text is provided (WCAG 1.1.1)'\n );\n }\n }\n\n /**\n * Handle button press - intercepts action when paywalled\n * If paywalled with redirect URL, opens in new tab\n * Otherwise, calls the normal onPress handler\n */\n const handlePress = (e: Parameters<NonNullable<AriaButtonProps['onPress']>>[0]): void => {\n if (paywall) {\n if (paywallRedirect) {\n window.open(paywallRedirect, '_blank', 'noopener,noreferrer');\n }\n // Don't call onPress when paywalled\n return;\n }\n onPress?.(e);\n };\n\n // Only set isDisabled when we have a reason to disable\n // Otherwise, let slot system control disabled state (e.g., in NumberField)\n const computedIsDisabled = effectiveIsDisabled || loading || undefined;\n\n return (\n <AriaButton\n ref={ref}\n isDisabled={computedIsDisabled}\n aria-disabled={paywall ? true : undefined}\n aria-describedby={paywall ? paywallDescriptionId : undefined}\n onPress={handlePress}\n className={cn(buttonOuterVariants({ fullWidth: effectiveFullWidth, inVerticalGroup: isInVerticalGroup }), className)}\n {...props}\n >\n {(renderProps) => (\n /* Layer 2: Visual Button */\n <span\n className={cn(\n buttonVisualVariants({\n variant: effectiveVariant,\n visualSize: effectiveVisualSize,\n paywall,\n fullWidth: effectiveFullWidth,\n }),\n // Position styling from ButtonGroup context (border-radius adjustments)\n positionClassName,\n buttonVisualClassName,\n // Layer 2 interaction styles (no focus - focus ring is on Layer 1)\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED\n )}\n data-pressed={renderProps.isPressed || undefined}\n >\n {/* Layer 3: Content & Effects */}\n\n {/* FR-033: Loading spinner with screen reader announcement */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {loading && (\n <>\n <Loader2 className=\"motion-safe:animate-spin\" aria-hidden=\"true\" />\n <span className=\"sr-only\" aria-live=\"polite\">\n {loadingText}\n </span>\n </>\n )}\n\n {/* Hide children during loading */}\n {!loading && children}\n\n {/* Paywall: Lightning bolt icon */}\n {paywall && (\n <Zap\n data-testid=\"zap-icon\"\n aria-hidden=\"true\"\n className=\"ml-1\"\n />\n )}\n\n {/* Paywall: Screen reader description */}\n {paywall && (\n <span id={paywallDescriptionId} className=\"sr-only\">\n Premium feature: {paywallDescription || \"Upgrade required to access this feature\"}\n </span>\n )}\n\n {/* FR-034: Keyboard shortcut display on focus */}\n {renderProps.isFocusVisible && shortcut && (\n <kbd className=\"ml-auto hidden text-xs opacity-60 lg:inline\">\n {shortcut}\n </kbd>\n )}\n\n {/* Touch/press ripple effect - FR-031: Pressed state feedback */}\n {/* Uses motion-safe: for WCAG 2.3.3 AAA (Animation from Interactions) */}\n {renderProps.isPressed && (\n <span\n className=\"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n )}\n </AriaButton>\n );\n }\n));\n\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants, buttonOuterVariants, buttonVisualVariants };\nexport type { ButtonProps } from './Button.types';\n","/**\n * Button Component Exports\n * Barrel export for Button component and utilities\n *\n * 3-Layer Architecture (v0.9.0):\n * - buttonOuterVariants: Layer 1 - Touch target (44x44px)\n * - buttonVisualVariants: Layer 2 - Visual appearance\n * - buttonVariants: Deprecated alias for buttonVisualVariants\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-038 (Tree-shakeable exports)\n */\n\nexport {\n Button,\n buttonOuterVariants,\n buttonVisualVariants,\n /** @deprecated Use buttonVisualVariants instead */\n buttonVariants,\n} from './Button';\nexport type { ButtonProps } from './Button';\n","'use client';\n\n/**\n * Carousel Component\n * Accessible carousel for displaying rotating content with React Node support\n *\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\n\nimport { memo, useState, useEffect, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport { Button } from '../Button';\nimport { PauseIcon, PlayIcon, ChevronUpIcon, ChevronDownIcon } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { CarouselProps, ItemManifest } from './Carousel.types';\n\n/**\n * Minimum duration for any item in milliseconds.\n * Prevents disorienting rapid transitions and allows screen readers time to announce.\n */\nconst MIN_ITEM_DURATION_MS = 1000;\n\n/**\n * Timer check interval in milliseconds.\n * Used for per-item timing mode to check if item should transition.\n */\nconst TIMER_CHECK_INTERVAL_MS = 1000;\n\n/**\n * Builds a manifest mapping cumulative time thresholds to item indices.\n * @param durations - Array of durations in milliseconds for each item\n * @returns Array of ItemManifest entries with startTime and endTime\n */\nfunction buildManifest(durations: number[]): ItemManifest[] {\n let cumulative = 0;\n return durations.map((duration, index) => {\n const start = cumulative;\n // Enforce minimum duration\n const safeDuration = Math.max(duration, MIN_ITEM_DURATION_MS);\n cumulative += safeDuration;\n return { index, startTime: start, endTime: cumulative };\n });\n}\n\n/**\n * Gets the item index that should be displayed for a given elapsed time.\n * @param manifest - Array of ItemManifest entries\n * @param elapsed - Current elapsed time in milliseconds\n * @returns The index of the item that should be displayed\n */\nfunction getCurrentItemIndex(manifest: ItemManifest[], elapsed: number): number {\n if (manifest.length === 0) return 0;\n\n const totalDuration = manifest[manifest.length - 1]?.endTime ?? 0;\n if (totalDuration === 0) return 0;\n\n // Normalize elapsed time to handle wraparound\n const normalizedElapsed = elapsed % totalDuration;\n\n const item = manifest.find(\n (m) => normalizedElapsed >= m.startTime && normalizedElapsed < m.endTime\n );\n return item?.index ?? 0;\n}\n\n/**\n * Validates whether per-item timing should be used.\n * @param itemsLength - Number of items in the carousel\n * @param itemDurations - Optional array of durations\n * @param autoRotateInterval - The autoRotateInterval setting\n * @returns true if per-item timing should be used\n */\nfunction shouldUsePerItemTiming(\n itemsLength: number,\n itemDurations: number[] | undefined,\n autoRotateInterval: number\n): boolean {\n // Disabled if autoRotateInterval is 0\n if (autoRotateInterval === 0) return false;\n\n // Must have itemDurations array\n if (!itemDurations || itemDurations.length === 0) return false;\n\n // Array length must match items length\n if (itemDurations.length !== itemsLength) {\n console.warn(\n 'Carousel: itemDurations length does not match items length. ' +\n 'Falling back to autoRotateInterval.'\n );\n return false;\n }\n\n return true;\n}\n\nexport const Carousel = memo(function Carousel({\n items,\n autoRotateInterval = 5000,\n defaultIndex = 0,\n currentIndex: controlledIndex,\n onIndexChange,\n isPaused: controlledIsPaused,\n onPauseChange,\n collapsible = false,\n defaultMinimized = false,\n isMinimized: controlledIsMinimized,\n onMinimizeChange,\n minimizedLabel = 'Carousel (minimized)',\n label = 'Carousel',\n slideLabel,\n showNavigation = true,\n showPlayPause = true,\n respectReducedMotion = true,\n className,\n slideClassName,\n navigationClassName,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n // Per-item timing props\n itemDurations,\n elapsedTime: controlledElapsedTime,\n onElapsedTimeChange,\n ...props\n}: CarouselProps): ReactNode {\n // Determine if component is controlled or uncontrolled\n const isControlled = controlledIndex !== undefined;\n const isPauseControlled = controlledIsPaused !== undefined;\n const isMinimizedControlled = controlledIsMinimized !== undefined;\n const isElapsedTimeControlled = controlledElapsedTime !== undefined;\n\n // Internal state for uncontrolled mode\n const [internalIndex, setInternalIndex] = useState(defaultIndex);\n const [internalIsPaused, setInternalIsPaused] = useState(false);\n const [internalIsMinimized, setInternalIsMinimized] = useState(defaultMinimized);\n\n // Calculate initial elapsed time based on defaultIndex if itemDurations is provided\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_internalElapsedTime, setInternalElapsedTime] = useState(() => {\n if (!itemDurations || itemDurations.length === 0) return 0;\n if (itemDurations.length !== items.length) return 0;\n if (defaultIndex === 0) return 0;\n\n // Build manifest to find the startTime for the default index\n const tempManifest = buildManifest(itemDurations);\n return tempManifest[defaultIndex]?.startTime ?? 0;\n });\n\n // Ref to track if carousel was playing before minimize\n const wasPlayingBeforeMinimize = useRef(false);\n\n // Use controlled value if provided, otherwise use internal state\n const currentIndex = isControlled ? controlledIndex : internalIndex;\n const isPaused = isPauseControlled ? controlledIsPaused : internalIsPaused;\n const isMinimized = isMinimizedControlled\n ? controlledIsMinimized\n : internalIsMinimized;\n // Determine if per-item timing should be used\n const usePerItemTiming = useMemo(\n () => shouldUsePerItemTiming(items.length, itemDurations, autoRotateInterval),\n [items.length, itemDurations, autoRotateInterval]\n );\n\n // Build the manifest for per-item timing (memoized)\n const manifest = useMemo(() => {\n if (!usePerItemTiming || !itemDurations) return [];\n return buildManifest(itemDurations);\n }, [usePerItemTiming, itemDurations]);\n\n // Calculate total duration (memoized)\n const totalDuration = useMemo(() => {\n if (manifest.length === 0) return 0;\n return manifest[manifest.length - 1]?.endTime ?? 0;\n }, [manifest]);\n\n // Navigation handler\n const goToSlide = useCallback(\n (index: number) => {\n if (isControlled) {\n onIndexChange?.(index);\n } else {\n setInternalIndex(index);\n }\n\n // For per-item timing, jump elapsed time to item's startTime\n if (usePerItemTiming && manifest[index]) {\n const newElapsed = manifest[index].startTime;\n if (!isElapsedTimeControlled) {\n setInternalElapsedTime(newElapsed);\n }\n onElapsedTimeChange?.(newElapsed);\n }\n\n // Pause when user manually navigates\n if (isPauseControlled) {\n onPauseChange?.(true);\n } else {\n setInternalIsPaused(true);\n }\n },\n [\n isControlled,\n isPauseControlled,\n isElapsedTimeControlled,\n onIndexChange,\n onPauseChange,\n onElapsedTimeChange,\n usePerItemTiming,\n manifest,\n ]\n );\n\n // Pause toggle handler\n const togglePause = useCallback(() => {\n const newPauseState = !isPaused;\n\n if (isPauseControlled) {\n onPauseChange?.(newPauseState);\n } else {\n setInternalIsPaused(newPauseState);\n }\n }, [isPaused, isPauseControlled, onPauseChange]);\n\n // Minimize toggle handler\n const toggleMinimize = useCallback(() => {\n const newMinimizedState = !isMinimized;\n\n if (newMinimizedState) {\n // Minimizing - track if we were playing\n wasPlayingBeforeMinimize.current = !isPaused;\n } else {\n // Expanding - resume if we were playing before\n if (wasPlayingBeforeMinimize.current && isPaused) {\n if (isPauseControlled) {\n onPauseChange?.(false);\n } else {\n setInternalIsPaused(false);\n }\n }\n wasPlayingBeforeMinimize.current = false;\n }\n\n if (isMinimizedControlled) {\n onMinimizeChange?.(newMinimizedState);\n } else {\n setInternalIsMinimized(newMinimizedState);\n }\n }, [isMinimized, isMinimizedControlled, onMinimizeChange, isPaused, isPauseControlled, onPauseChange]);\n\n // Reduced motion preference check effect\n useEffect(() => {\n // Check if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Respect user's motion preferences\n if (respectReducedMotion) {\n // Check if matchMedia is available (not available in all test environments)\n if (typeof window !== 'undefined' && window.matchMedia) {\n const prefersReducedMotion = window.matchMedia(\n '(prefers-reduced-motion: reduce)'\n ).matches;\n\n if (prefersReducedMotion) {\n if (isPauseControlled) {\n onPauseChange?.(true);\n } else {\n setInternalIsPaused(true);\n }\n }\n }\n }\n }, [autoRotateInterval, respectReducedMotion, isPauseControlled, onPauseChange]);\n\n // Ref to track current index for the interval callback\n const currentIndexRef = useRef(currentIndex);\n currentIndexRef.current = currentIndex;\n\n // Per-item timing effect (uncontrolled elapsed time)\n useEffect(() => {\n // Skip if not using per-item timing\n if (!usePerItemTiming) return;\n\n // Don't run if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Don't run if paused or minimized\n if (isPaused || isMinimized) return;\n\n // Don't run if elapsed time is controlled externally\n if (isElapsedTimeControlled) return;\n\n // Set up 1-second interval for timer ticks\n const interval = setInterval(() => {\n // Use functional update to get the latest elapsed time\n setInternalElapsedTime((prevElapsed) => {\n // Calculate new elapsed time\n let newElapsed = prevElapsed + TIMER_CHECK_INTERVAL_MS;\n\n // Handle wraparound\n if (totalDuration > 0 && newElapsed >= totalDuration) {\n newElapsed = 0;\n }\n\n // Fire callback (using the new elapsed value)\n onElapsedTimeChange?.(newElapsed);\n\n // Calculate current item from manifest\n const newIndex = getCurrentItemIndex(manifest, newElapsed);\n\n // Update index if changed (using ref for latest value)\n if (newIndex !== currentIndexRef.current) {\n if (isControlled) {\n onIndexChange?.(newIndex);\n } else {\n setInternalIndex(newIndex);\n }\n }\n\n return newElapsed;\n });\n }, TIMER_CHECK_INTERVAL_MS);\n\n return () => clearInterval(interval);\n }, [\n usePerItemTiming,\n autoRotateInterval,\n isPaused,\n isMinimized,\n isElapsedTimeControlled,\n totalDuration,\n manifest,\n isControlled,\n onIndexChange,\n onElapsedTimeChange,\n ]);\n\n // Standard auto-rotation effect (fallback when not using per-item timing)\n useEffect(() => {\n // Skip if using per-item timing\n if (usePerItemTiming) return;\n\n // Check if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Don't auto-rotate if paused or minimized\n if (isPaused || isMinimized) return;\n\n const interval = setInterval(() => {\n const nextIndex = (currentIndex + 1) % items.length;\n\n if (isControlled) {\n onIndexChange?.(nextIndex);\n } else {\n setInternalIndex(nextIndex);\n }\n }, autoRotateInterval);\n\n return () => clearInterval(interval);\n }, [\n usePerItemTiming,\n autoRotateInterval,\n currentIndex,\n isPaused,\n isMinimized,\n items.length,\n isControlled,\n onIndexChange,\n ]);\n\n // Effect to sync controlled elapsedTime to displayed index\n useEffect(() => {\n if (!usePerItemTiming || !isElapsedTimeControlled) return;\n\n const newIndex = getCurrentItemIndex(manifest, controlledElapsedTime);\n if (newIndex !== currentIndex) {\n if (isControlled) {\n onIndexChange?.(newIndex);\n } else {\n setInternalIndex(newIndex);\n }\n }\n }, [\n usePerItemTiming,\n isElapsedTimeControlled,\n controlledElapsedTime,\n manifest,\n currentIndex,\n isControlled,\n onIndexChange,\n ]);\n\n // Generate slide label\n const currentSlideLabel = slideLabel\n ? slideLabel(currentIndex, items.length)\n : `Slide ${currentIndex + 1} of ${items.length}`;\n\n return (\n <div\n className={cn(\n 'flex flex-col mb-4 transition-all duration-300',\n !isMinimized && 'space-y-4',\n className\n )}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={isMinimized ? minimizedLabel : ariaLabel || label}\n aria-labelledby={ariaLabelledBy}\n {...props}\n >\n {/* Minimized State */}\n {isMinimized && collapsible ? (\n <div\n className={cn(\n 'bg-[var(--primary)] rounded-lg px-4 py-2 shadow-md',\n 'flex items-center justify-between gap-4'\n )}\n >\n <span className=\"text-[var(--primary-foreground)] text-sm\">\n {minimizedLabel} - {currentSlideLabel}\n </span>\n <Button\n variant=\"outline\"\n visualSize=\"icon\"\n onPress={toggleMinimize}\n aria-label=\"Expand carousel\"\n aria-expanded={false}\n >\n <ChevronUpIcon className=\"w-5 h-5\" />\n </Button>\n </div>\n ) : (\n <>\n {/* Current Slide */}\n <div\n key={currentIndex}\n className={cn(\n 'bg-[var(--primary)] rounded-lg p-4 overflow-hidden shadow-md',\n 'slide-in-animation',\n slideClassName\n )}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={currentSlideLabel}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n <div className=\"text-[var(--primary-foreground)] min-h-[2rem] flex items-center\">\n {items[currentIndex]}\n </div>\n </div>\n\n {/* Controls Container */}\n <div className=\"flex items-center justify-between gap-4\">\n {/* Navigation Dots */}\n {showNavigation && (\n <div\n className={cn('flex items-center', navigationClassName)}\n role=\"group\"\n aria-label=\"Slide navigation\"\n >\n {items.map((_, index) => (\n <Button\n key={index}\n variant={index === currentIndex ? 'default' : 'outline'}\n visualSize=\"dot\"\n onPress={() => goToSlide(index)}\n aria-label={`Go to slide ${index + 1}`}\n aria-current={index === currentIndex ? true : undefined}\n />\n ))}\n </div>\n )}\n\n {/* Right Controls Group */}\n <div className=\"flex items-center gap-2\">\n {/* Minimize Button */}\n {collapsible && (\n <Button\n variant=\"default\"\n visualSize=\"icon\"\n onPress={toggleMinimize}\n aria-label=\"Minimize carousel\"\n aria-expanded={true}\n >\n <ChevronDownIcon className=\"w-5 h-5\" />\n </Button>\n )}\n \n {/* Play/Pause Button */}\n {showPlayPause && autoRotateInterval > 0 && (\n <Button\n variant=\"default\"\n visualSize=\"icon\"\n onPress={togglePause}\n aria-label={isPaused ? 'Play carousel' : 'Pause carousel'}\n >\n {isPaused ? (\n <PlayIcon className=\"w-5 h-5\" />\n ) : (\n <PauseIcon className=\"w-5 h-5\" />\n )}\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n );\n});\n\nCarousel.displayName = 'Carousel';\n","'use client';\n\n/**\n * Accordion Component - Implementation\n *\n * Accessible accordion/disclosure group component combining React Aria primitives with CVA styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria DisclosureGroup for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for consistent styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Single/Multiple expansion modes\n * - Controlled and uncontrolled state management\n * - Configurable heading levels for document structure\n * - Custom icon support\n *\n * @see accordion-prd.md (Full requirements)\n * @see Accordion.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type ReactElement,\n useMemo,\n useContext,\n createContext,\n Children,\n isValidElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n return <div data-activity-mode={mode}>{children}</div>;\n};\n\nimport {\n DisclosureGroup,\n Disclosure,\n DisclosurePanel,\n Heading,\n Button,\n composeRenderProps,\n DisclosureStateContext,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n HeadingLevel,\n} from './Accordion.types';\n\n// ============================================================================\n// Context for disabledKeys\n// ============================================================================\n\n/**\n * Context to pass disabledKeys from Accordion to AccordionItem\n * Since DisclosureGroup doesn't support disabledKeys directly, we handle it via context\n */\ninterface AccordionContextValue {\n disabledKeys?: (string | number)[];\n}\n\nconst AccordionContext = createContext<AccordionContextValue>({});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Accordion root CVA variants\n *\n * @see accordion-prd.md FR-001 (Accordion Root)\n */\nexport const accordionVariants = cva('w-full', {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * AccordionItem CVA variants\n *\n * @see accordion-prd.md FR-002 (AccordionItem)\n * @see accordion-prd.md DS-001 (Visual Design - borders)\n */\nexport const accordionItemVariants = cva(\n [\n 'border-b border-[var(--border)]',\n // Last item has no border (handled by last:border-b-0)\n 'last:border-b-0',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionTrigger CVA variants\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger)\n * @see accordion-prd.md AR-006 (Touch Target Size - 44x44px)\n * @see accordion-prd.md DS-002 (Typography)\n */\nexport const accordionTriggerVariants = cva(\n [\n // Layout\n 'flex flex-1 items-center justify-between py-4 font-medium w-full',\n // Text styling\n 'text-sm text-[var(--content-foreground)]',\n // Hover state\n 'hover:underline',\n // Focus visible ring (WCAG 2.4.13)\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--content-background)]',\n // WCAG 2.2 AAA: 44px minimum touch target\n 'min-h-[44px]',\n // Disabled state\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n // Transition for smooth interactions\n 'transition-all',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Chevron icon CVA variants\n *\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionChevronVariants = cva(\n [\n 'h-4 w-4 shrink-0',\n 'text-[var(--menu-muted)]',\n // Smooth rotation transition\n 'transition-transform duration-200 ease-out',\n // Reduced motion support\n 'motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n isExpanded: {\n true: 'rotate-180',\n false: 'rotate-0',\n },\n },\n defaultVariants: {\n isExpanded: false,\n },\n }\n);\n\n/**\n * AccordionContent CVA variants\n *\n * @see accordion-prd.md FR-004 (AccordionContent)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n */\nexport const accordionContentVariants = cva(\n [\n 'overflow-hidden',\n 'text-sm text-[var(--menu-muted)]',\n ].join(' '),\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * AccordionContent inner wrapper CVA variants\n */\nexport const accordionContentInnerVariants = cva('pb-4 pt-0', {\n variants: {},\n defaultVariants: {},\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert heading level string to number for React Aria Heading\n */\nfunction getHeadingLevel(level: HeadingLevel): 1 | 2 | 3 | 4 | 5 | 6 {\n const levelMap: Record<HeadingLevel, 1 | 2 | 3 | 4 | 5 | 6> = {\n h1: 1,\n h2: 2,\n h3: 3,\n h4: 4,\n h5: 5,\n h6: 6,\n };\n return levelMap[level];\n}\n\n/**\n * Get the first AccordionItem id from children\n * Used for auto-expanding first item when collapsible={false}\n */\nfunction getFirstAccordionItemId(children: ReactNode): AriaKey | undefined {\n const childArray = Children.toArray(children);\n for (const child of childArray) {\n if (isValidElement(child)) {\n const childProps = child.props as Record<string, unknown>;\n if (childProps && typeof childProps === 'object' && 'id' in childProps) {\n return childProps.id as AriaKey;\n }\n }\n }\n return undefined;\n}\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Accordion Root Component\n *\n * Container for accordion items. Manages expansion state and provides\n * context to child components.\n *\n * @see accordion-prd.md FR-001 (Accordion Root Component)\n * @see accordion-prd.md FR-005 (Single Expansion Mode)\n * @see accordion-prd.md FR-006 (Multiple Expansion Mode)\n * @see accordion-prd.md FR-007 (Controlled Mode)\n * @see accordion-prd.md FR-008 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled single mode\n * <Accordion type=\"single\" collapsible>\n * <AccordionItem id=\"item-1\">\n * <AccordionTrigger>Section 1</AccordionTrigger>\n * <AccordionContent>Content 1</AccordionContent>\n * </AccordionItem>\n * </Accordion>\n *\n * @example\n * // Controlled multiple mode\n * <Accordion\n * type=\"multiple\"\n * expandedKeys={expandedKeys}\n * onExpandedChange={setExpandedKeys}\n * >\n * ...\n * </Accordion>\n */\nfunction AccordionRoot({\n type = 'single',\n collapsible = false,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled = false,\n disabledKeys,\n className,\n children,\n ...props\n}: AccordionProps) {\n // Map type prop to React Aria's allowsMultipleExpanded\n const allowsMultipleExpanded = type === 'multiple';\n\n // Auto-expand first item when collapsible={false} and no default provided\n // This ensures one item is always expanded in non-collapsible single mode\n const effectiveDefaultExpandedKeys = useMemo(() => {\n if (!collapsible && type === 'single' && !defaultExpandedKeys && !expandedKeys) {\n const firstItemId = getFirstAccordionItemId(children);\n return firstItemId ? [firstItemId] : undefined;\n }\n return defaultExpandedKeys;\n }, [collapsible, type, defaultExpandedKeys, expandedKeys, children]);\n\n // Context value for passing disabledKeys to AccordionItem\n const contextValue = useMemo(\n () => ({ disabledKeys }),\n [disabledKeys]\n );\n\n return (\n <AccordionContext.Provider value={contextValue}>\n <DisclosureGroup\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys as Set<AriaKey> | undefined}\n defaultExpandedKeys={effectiveDefaultExpandedKeys as Iterable<AriaKey> | undefined}\n onExpandedChange={onExpandedChange as ((keys: Set<AriaKey>) => void) | undefined}\n isDisabled={isDisabled}\n className={cn(accordionVariants(), className)}\n {...props}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n );\n}\n\nAccordionRoot.displayName = 'Accordion';\n\n/**\n * AccordionItem Component\n *\n * Wrapper for each expandable disclosure section.\n *\n * @see accordion-prd.md FR-002 (AccordionItem Component)\n *\n * @example\n * <AccordionItem id=\"faq-1\" isDisabled={!isAuthenticated}>\n * <AccordionTrigger>Members-only FAQ</AccordionTrigger>\n * <AccordionContent>This content is for members only.</AccordionContent>\n * </AccordionItem>\n */\nfunction AccordionItemComponent({\n id,\n isDisabled: isDisabledProp,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n // Check if this item is in the disabledKeys array\n const { disabledKeys } = useContext(AccordionContext);\n const isDisabledFromKeys = disabledKeys?.includes(id as string | number) ?? false;\n const isDisabled = isDisabledProp || isDisabledFromKeys;\n\n return (\n <Disclosure\n id={id}\n isDisabled={isDisabled}\n className={composeRenderProps(className, (className) =>\n cn(accordionItemVariants(), className)\n )}\n {...props}\n >\n {children}\n </Disclosure>\n );\n}\n\nAccordionItemComponent.displayName = 'AccordionItem';\n\n/**\n * AccordionTrigger Component\n *\n * Clickable button that toggles accordion content visibility.\n * Wrapped in a Heading for proper document structure.\n *\n * @see accordion-prd.md FR-003 (AccordionTrigger Component)\n * @see accordion-prd.md AR-002 (ARIA Attributes)\n * @see accordion-prd.md AR-003 (Keyboard Navigation)\n *\n * @example\n * // Default with chevron\n * <AccordionTrigger>Is it accessible?</AccordionTrigger>\n *\n * @example\n * // Custom heading level\n * <AccordionTrigger as=\"h2\">Important Section</AccordionTrigger>\n *\n * @example\n * // Custom icon\n * <AccordionTrigger icon={<PlusIcon className=\"h-4 w-4\" />}>\n * Click to expand\n * </AccordionTrigger>\n */\nfunction AccordionTriggerComponent({\n as: headingLevel = 'h3',\n icon,\n hideIcon = false,\n className,\n children,\n ...props\n}: AccordionTriggerProps) {\n // Access disclosure state from context\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n return (\n <Heading level={getHeadingLevel(headingLevel)}>\n <Button\n slot=\"trigger\"\n className={composeRenderProps(className, (className) =>\n cn(accordionTriggerVariants(), className)\n )}\n {...props}\n >\n <span className=\"flex-1 text-left\">{children}</span>\n {!hideIcon && (\n icon ?? (\n <ChevronDown\n aria-hidden=\"true\"\n className={cn(accordionChevronVariants({ isExpanded }))}\n />\n )\n )}\n </Button>\n </Heading>\n );\n}\n\nAccordionTriggerComponent.displayName = 'AccordionTrigger';\n\n/**\n * AccordionContent Component\n *\n * Expandable container for accordion content.\n * Supports animated height transitions and React Activity state preservation.\n *\n * @see accordion-prd.md FR-004 (AccordionContent Component)\n * @see accordion-prd.md FR-010 (Animated Transitions)\n *\n * @example\n * // Standard content\n * <AccordionContent>\n * Yes. It adheres to the WAI-ARIA design pattern.\n * </AccordionContent>\n *\n * @example\n * // With state preservation\n * <AccordionContent preserveState>\n * <form>\n * <input name=\"email\" />\n * </form>\n * </AccordionContent>\n */\n/**\n * Inner component for AccordionContent with state preservation\n * Uses DisclosureStateContext to get isExpanded state\n */\nfunction AccordionContentInner({\n preserveState,\n children,\n}: {\n preserveState: boolean;\n children: ReactNode;\n}) {\n const state = useContext(DisclosureStateContext);\n const isExpanded = state?.isExpanded ?? false;\n\n if (preserveState) {\n return (\n <Activity mode={isExpanded ? 'visible' : 'hidden'}>\n <div className={accordionContentInnerVariants()}>{children}</div>\n </Activity>\n );\n }\n\n return <div className={accordionContentInnerVariants()}>{children}</div>;\n}\n\nfunction AccordionContentComponent({\n preserveState = false,\n className,\n children,\n ...props\n}: AccordionContentProps) {\n return (\n <DisclosurePanel\n className={composeRenderProps(className, (className) =>\n cn(accordionContentVariants(), 'animate-accordion', className)\n )}\n {...props}\n >\n <AccordionContentInner preserveState={preserveState}>\n {children}\n </AccordionContentInner>\n </DisclosurePanel>\n );\n}\n\nAccordionContentComponent.displayName = 'AccordionContent';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Accordion follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '...'\n */\nexport const Accordion = AccordionRoot;\nexport const AccordionItem = AccordionItemComponent;\nexport const AccordionTrigger = AccordionTriggerComponent;\nexport const AccordionContent = AccordionContentComponent;\n\n// Re-export types for convenience\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n};\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","'use client';\n\n/**\n * Avatar Component - 3-Layer Architecture\n * Accessible avatar with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant)\n * - Layer 2: Visual Avatar (configurable size, shape, status ring)\n * - Layer 3: Content (image, initials, skeleton shimmer)\n *\n * @see plan.md for implementation details\n * @see avatar-prd.md for requirements\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useState, useCallback, type ReactElement } from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n AvatarProps,\n AvatarSize,\n AvatarShape,\n AvatarStatus,\n AvatarLoadingState,\n} from './Avatar.types';\n\n/**\n * Extract initials from a name\n * - \"Jane Doe\" → \"JD\"\n * - \"Jane\" → \"J\"\n * - \"Jane Marie Doe\" → \"JD\" (first and last)\n */\nfunction getInitials(name: string | undefined): string {\n if (!name || !name.trim()) return '';\n\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '';\n\n const firstPart = parts[0];\n if (parts.length === 1) {\n return firstPart ? firstPart.charAt(0).toUpperCase() : '';\n }\n\n // First and last initials (max 2 characters)\n const lastPart = parts[parts.length - 1];\n const first = firstPart ? firstPart.charAt(0).toUpperCase() : '';\n const last = lastPart ? lastPart.charAt(0).toUpperCase() : '';\n return first + last;\n}\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Handles WCAG 2.2 AAA touch target requirement\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n */\nexport const avatarOuterVariants = cva(\n 'relative inline-flex items-center justify-center',\n {\n variants: {\n size: {\n sm: 'min-h-[44px] min-w-[44px]',\n default: 'min-h-[44px] min-w-[44px]',\n lg: 'min-h-[48px] min-w-[48px]',\n },\n interactive: {\n true: [\n 'cursor-pointer',\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--page-background)]',\n 'motion-safe:transition-transform',\n 'motion-safe:duration-150',\n 'motion-safe:ease-out',\n 'motion-safe:hover:scale-105',\n ],\n false: '',\n },\n },\n defaultVariants: {\n size: 'default',\n interactive: false,\n },\n }\n);\n\n/**\n * Layer 2: Visual avatar appearance\n * Provides the visual appearance with configurable size, shape, and status ring\n */\nexport const avatarVisualVariants = cva(\n [\n 'relative inline-flex items-center justify-center',\n 'overflow-hidden',\n 'bg-[var(--accent-background)]',\n 'text-[var(--accent-foreground)]',\n 'font-medium',\n 'select-none',\n ],\n {\n variants: {\n size: {\n sm: 'h-8 w-8 text-xs',\n default: 'h-11 w-11 text-sm',\n lg: 'h-12 w-12 text-base',\n },\n shape: {\n circle: 'rounded-full',\n rounded: 'rounded-lg',\n },\n status: {\n online: 'ring-[3px] ring-[var(--status-online,#22c55e)]',\n offline: 'ring-[3px] ring-[var(--status-offline,#6b7280)]',\n busy: 'ring-[3px] ring-[var(--status-busy,#ef4444)]',\n away: 'ring-[3px] ring-[var(--status-away,#eab308)]',\n },\n },\n defaultVariants: {\n size: 'default',\n shape: 'circle',\n },\n }\n);\n\n/**\n * Avatar Component - 3-Layer Architecture\n * Displays user avatar with image or initials fallback\n *\n * Layer 1: Touch Target - 44x44px WCAG AAA compliant\n * Layer 2: Visual Avatar - configurable appearance\n * Layer 3: Content - image, initials, or loading skeleton\n */\nconst Avatar = memo(\n forwardRef<HTMLDivElement, AvatarProps>(\n (\n {\n src,\n alt,\n name,\n size = 'default',\n shape = 'circle',\n status,\n onPress,\n className,\n id,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n _groupIndex,\n },\n ref\n ): ReactElement => {\n // Loading state machine: loading → loaded | error\n const [loadingState, setLoadingState] = useState<AvatarLoadingState>(\n src ? 'loading' : 'error'\n );\n\n const handleImageLoad = useCallback(() => {\n setLoadingState('loaded');\n }, []);\n\n const handleImageError = useCallback(() => {\n setLoadingState('error');\n }, []);\n\n const initials = getInitials(name);\n const isInteractive = Boolean(onPress);\n\n // Build aria-label for actionable avatars with status\n const computedAriaLabel =\n ariaLabel ||\n (isInteractive && status ? `${alt}, ${status}` : undefined);\n\n // Calculate brightness for group darkening effect\n // First avatar (index 0) = 100%, each subsequent gets 5% darker\n const groupBrightness =\n _groupIndex !== undefined ? 1 - _groupIndex * 0.05 : undefined;\n\n // Common visual layer content\n const visualContent = (\n <div\n data-testid=\"avatar-visual\"\n className={cn(avatarVisualVariants({ size, shape, status }))}\n style={groupBrightness !== undefined ? { filter: `brightness(${groupBrightness})` } : undefined}\n >\n {/* Layer 3: Content */}\n\n {/* Skeleton shimmer while loading */}\n {loadingState === 'loading' && (\n <div\n data-testid=\"avatar-skeleton\"\n className={cn(\n 'absolute inset-0 animate-pulse bg-[var(--accent-background)]',\n shape === 'circle' ? 'rounded-full' : 'rounded-lg'\n )}\n aria-hidden=\"true\"\n />\n )}\n\n {/* Image (hidden during loading, removed on error) */}\n {src && loadingState !== 'error' && (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- onLoad/onError are lifecycle events, not interactions\n <img\n src={src}\n alt={isInteractive ? '' : alt}\n onLoad={handleImageLoad}\n onError={handleImageError}\n className={cn(\n 'h-full w-full object-cover',\n loadingState === 'loading' && 'invisible'\n )}\n />\n )}\n\n {/* Initials fallback (shown when no src or on error) */}\n {loadingState === 'error' && initials && (\n <span aria-hidden=\"true\">{initials}</span>\n )}\n </div>\n );\n\n // Render as button if interactive\n if (isInteractive) {\n return (\n <AriaButton\n ref={ref as React.Ref<HTMLButtonElement>}\n id={id}\n data-testid={dataTestId || 'avatar-outer'}\n aria-label={computedAriaLabel || alt}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n onPress={onPress}\n className={cn(\n avatarOuterVariants({ size, interactive: true }),\n className\n )}\n >\n {visualContent}\n </AriaButton>\n );\n }\n\n // Render as non-interactive div\n return (\n <div\n ref={ref}\n id={id}\n data-testid={dataTestId || 'avatar-outer'}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n className={cn(\n avatarOuterVariants({ size, interactive: false }),\n className\n )}\n >\n {visualContent}\n </div>\n );\n }\n )\n);\n\nAvatar.displayName = 'Avatar';\n\nexport { Avatar };\nexport type { AvatarProps, AvatarSize, AvatarShape, AvatarStatus };\n","'use client';\n\n/**\n * AvatarGroup Component\n * Displays multiple avatars with overlap, overflow indicator, and optional actionability\n *\n * Features:\n * - Overlapping display with configurable overlap\n * - Overflow indicator (+X) when exceeding max\n * - 2px border for visual separation\n * - First avatar on top (highest z-index)\n * - Mutually exclusive actions (group OR individual, not both)\n * - Shape/size inheritance to children\n *\n * @see plan.md Clarifications 1, 2, 5, 6, 7\n * @see avatar-prd.md US-5, US-7\n */\n\nimport {\n forwardRef,\n memo,\n Children,\n isValidElement,\n cloneElement,\n type ReactElement,\n} from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type { AvatarGroupProps, AvatarSize, AvatarShape } from './Avatar.types';\n\n/**\n * Overlap class by size (proportional)\n * sm: 8px (-ml-2), default: 12px (-ml-3), lg: 16px (-ml-4)\n */\nconst OVERLAP_CLASS_BY_SIZE: Record<AvatarSize, string> = {\n sm: '-ml-2',\n default: '-ml-3',\n lg: '-ml-4',\n};\n\n/**\n * Overflow indicator variants (the +X badge)\n */\nconst avatarOverflowVariants = cva(\n [\n 'relative inline-flex items-center justify-center',\n 'bg-[var(--secondary)]',\n 'text-[var(--secondary-foreground)]',\n 'font-semibold',\n 'select-none',\n 'border-2 border-[var(--page-background)]',\n ],\n {\n variants: {\n size: {\n sm: 'h-8 w-8 text-xs',\n default: 'h-11 w-11 text-sm',\n lg: 'h-12 w-12 text-base',\n },\n shape: {\n circle: 'rounded-full',\n rounded: 'rounded-lg',\n },\n },\n defaultVariants: {\n size: 'default',\n shape: 'circle',\n },\n }\n);\n\n/**\n * Group outer variants\n */\nconst avatarGroupVariants = cva('inline-flex items-center', {\n variants: {\n interactive: {\n true: [\n 'cursor-pointer',\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--page-background)]',\n ],\n false: '',\n },\n },\n defaultVariants: {\n interactive: false,\n },\n});\n\n/**\n * AvatarGroup Component\n * Groups multiple Avatar components with overlap and overflow handling\n */\nconst AvatarGroup = memo(\n forwardRef<HTMLDivElement, AvatarGroupProps>(\n (\n {\n max = 3,\n shape = 'circle',\n size = 'default',\n onPress,\n className,\n children,\n id,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n },\n ref\n ): ReactElement => {\n const childArray = Children.toArray(children);\n const totalCount = childArray.length;\n const visibleCount = Math.min(totalCount, max);\n const overflowCount = totalCount - visibleCount;\n\n const isGroupInteractive = Boolean(onPress);\n const overlapClass = OVERLAP_CLASS_BY_SIZE[size];\n\n // Warn about mutually exclusive actions (Clarification 2)\n // Uses !== 'production' to work in both development and test modes\n if (process.env.NODE_ENV !== 'production' && isGroupInteractive) {\n Children.forEach(children, (child) => {\n if (\n isValidElement(child) &&\n (child.props as { onPress?: unknown }).onPress\n ) {\n console.warn(\n '[AvatarGroup] onPress on individual avatars is ignored when AvatarGroup has onPress. ' +\n 'Actions are mutually exclusive - use group onPress OR individual onPress, not both.'\n );\n }\n });\n }\n\n // Build visible avatars with proper styling\n const visibleAvatars = childArray.slice(0, visibleCount).map((child, index) => {\n if (!isValidElement(child)) return null;\n\n // Clone child with inherited props and group styling\n const childProps = child.props as {\n size?: AvatarSize;\n shape?: AvatarShape;\n onPress?: unknown;\n className?: string;\n };\n\n // First avatar has highest z-index (Clarification 5)\n const zIndex = visibleCount - index;\n\n // Determine if individual avatar is interactive\n // If group has onPress, individual onPress is ignored\n const individualOnPress = isGroupInteractive\n ? undefined\n : childProps.onPress;\n\n return (\n <div\n key={index}\n data-testid=\"avatar-group-item\"\n className={cn(\n 'relative',\n // 2px border for visual separation (Clarification 1 & 7)\n 'border-2 border-[var(--page-background)]',\n shape === 'circle' ? 'rounded-full' : 'rounded-lg',\n // Overlap negative margin (except first)\n index > 0 && overlapClass,\n // Hover lift animation when group is NOT actionable\n // Individual avatars get lift effect regardless of their own onPress\n !isGroupInteractive && [\n 'motion-safe:transition-transform',\n 'motion-safe:duration-150',\n 'motion-safe:ease-out',\n 'motion-safe:hover:scale-[1.15]',\n 'motion-safe:hover:z-10',\n ]\n )}\n style={{ zIndex }}\n >\n {cloneElement(child as ReactElement, {\n size,\n shape,\n // Individual onPress is ignored if group has onPress\n onPress: individualOnPress,\n // Pass group index for progressive darkening\n _groupIndex: index,\n // Remove outer wrapper styling since we handle it\n className: cn(\n childProps.className,\n // Remove min dimensions since group item handles touch target\n '!min-h-0 !min-w-0'\n ),\n } as Partial<typeof childProps>)}\n </div>\n );\n });\n\n // Overflow indicator (+X)\n const overflowIndicator =\n overflowCount > 0 ? (\n <div\n data-testid=\"avatar-overflow\"\n className={cn(\n avatarOverflowVariants({ size, shape }),\n overlapClass\n )}\n style={{ zIndex: 0 }}\n aria-hidden=\"true\"\n >\n +{overflowCount}\n </div>\n ) : null;\n\n // Auto-generate aria-label if not provided\n const computedAriaLabel =\n ariaLabel ||\n `${totalCount} ${totalCount === 1 ? 'member' : 'members'}`;\n\n // Group content\n const groupContent = (\n <>\n {visibleAvatars}\n {overflowIndicator}\n </>\n );\n\n // Render as button if group is interactive\n // Button inherently has role=\"button\", aria-label provides group context\n if (isGroupInteractive) {\n return (\n <AriaButton\n ref={ref as React.Ref<HTMLButtonElement>}\n id={id}\n data-testid={dataTestId}\n aria-label={computedAriaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n onPress={onPress}\n className={cn(avatarGroupVariants({ interactive: true }), className)}\n >\n {groupContent}\n </AriaButton>\n );\n }\n\n // Render as non-interactive div with role=\"group\"\n return (\n <div\n ref={ref}\n id={id}\n data-testid={dataTestId}\n role=\"group\"\n aria-label={computedAriaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n className={cn(avatarGroupVariants({ interactive: false }), className)}\n >\n {groupContent}\n </div>\n );\n }\n )\n);\n\nAvatarGroup.displayName = 'AvatarGroup';\n\nexport { AvatarGroup, avatarOverflowVariants };\nexport type { AvatarGroupProps };\n","\"use client\";\n\n/**\n * Badge Component - 2-Layer Architecture for Actionable Badges\n * Accessible badge with React Aria primitives and CVA styling\n *\n * Architecture:\n * - Static badges: Single span element\n * - Actionable badges (with onPress):\n * - Layer 1: Touch Target (44x44px WCAG AAA compliant, transparent)\n * - Layer 2: Visual Badge (compact size, colors)\n *\n * @see plan.md for architecture details\n * @see badge-prd.md for requirements\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, type ReactElement } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport {\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED,\n} from '../../styles/interaction-states';\nimport type { BadgeProps } from './Badge.types';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * Only used for actionable badges (with onPress)\n * Handles WCAG 2.2 AAA touch target requirement\n * IMPORTANT: Focus ring stays on Layer 1 for AAA compliance (2.4.13)\n */\nexport const badgeOuterVariants = cva(\n [\n 'relative inline-flex items-center justify-center',\n 'min-h-[44px] min-w-[44px]',\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n 'focus-visible:ring-offset-[var(--page-background)]',\n 'disabled:pointer-events-none',\n 'disabled:opacity-50',\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Layer 2: Visual Badge appearance\n * Used for all badges (both static and actionable)\n * Provides the visual appearance with configurable size and variant\n * NOTE: NO focus-visible styles here - focus ring is on Layer 1\n */\nexport const badgeVisualVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'gap-1',\n 'rounded-full',\n 'font-medium',\n 'whitespace-nowrap',\n 'transition-colors',\n ],\n {\n variants: {\n variant: {\n primary: [\n 'bg-[var(--primary-action)]',\n 'text-[var(--primary-action-foreground)]',\n 'hover:bg-[var(--primary-action)]/90',\n 'data-[pressed]:bg-[var(--primary-action)]/80',\n ],\n accent: [\n 'bg-[var(--accent-background)]',\n 'text-[var(--accent-foreground)]',\n 'hover:bg-[var(--accent-background)]/90',\n 'data-[pressed]:bg-[var(--accent-background)]/80',\n ],\n destructive: [\n 'bg-[var(--destructive-background)]',\n 'text-[var(--destructive-foreground)]',\n 'hover:bg-[var(--destructive-background)]/90',\n 'data-[pressed]:bg-[var(--destructive-background)]/80',\n ],\n content: [\n 'bg-[var(--accent-background)]',\n 'text-[var(--accent-foreground)]',\n 'hover:bg-[var(--accent-background)]/90',\n 'data-[pressed]:bg-[var(--accent-background)]/80',\n ],\n },\n size: {\n sm: 'h-5 px-2 text-xs',\n default: 'h-6 px-2.5 text-xs',\n lg: 'h-7 px-3 text-sm',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'default',\n },\n }\n);\n\n/**\n * @deprecated Use badgeVisualVariants instead. This alias is kept for backward compatibility.\n */\nexport const badgeVariants = badgeVisualVariants;\n\n// Icon size classes mapped to badge sizes\n// Sizes are proportional to badge height: sm=20px, default=24px, lg=28px\nconst iconSizeClasses: Record<NonNullable<BadgeProps['size']>, string> = {\n sm: '[&_svg]:h-2.5 [&_svg]:w-2.5', // 10px icons for 20px badge\n default: '[&_svg]:h-3 [&_svg]:w-3', // 12px icons for 24px badge\n lg: '[&_svg]:h-3.5 [&_svg]:w-3.5', // 14px icons for 28px badge\n};\n\n/**\n * Badge Component - Accessible badge for labels, tags, and status indicators\n *\n * Features:\n * - WCAG 2.2 AAA compliant (7:1 contrast, 44x44px touch targets for actionable)\n * - 4 semantic variants (primary, accent, destructive, content)\n * - 3 sizes (sm, default, lg)\n * - Icon support with configurable position\n * - Count display (number or string)\n * - Static badges (span) vs actionable badges (button)\n */\nconst Badge = memo(\n forwardRef<HTMLButtonElement | HTMLSpanElement, BadgeProps>(\n (\n {\n className,\n variant = 'primary',\n size = 'default',\n children,\n icon,\n iconPosition = 'start',\n count,\n onPress,\n isDisabled,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ): ReactElement => {\n // Visual classes for the badge appearance\n const visualClasses = cn(\n badgeVisualVariants({ variant, size }),\n iconSizeClasses[size],\n className\n );\n\n // Check if we have multiple content elements (need gap styling)\n const hasIcon = !!icon;\n const hasCount = count !== undefined;\n const hasChildren = !!children;\n const multipleElements =\n [hasIcon, hasCount, hasChildren].filter(Boolean).length > 1;\n\n // Content rendering: icon + children + count (all can display together)\n // Only wrap children in span when there are multiple elements (for gap)\n const renderContent = (): ReactElement => (\n <>\n {icon && iconPosition === 'start' && (\n <span className=\"shrink-0\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {children && (multipleElements ? <span>{children}</span> : children)}\n {count !== undefined && (\n <span className=\"font-mono tabular-nums\">{count}</span>\n )}\n {icon && iconPosition === 'end' && (\n <span className=\"shrink-0\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n </>\n );\n\n // Actionable badge (with onPress) - uses 2-layer architecture\n if (onPress) {\n return (\n <AriaButton\n ref={ref as React.Ref<HTMLButtonElement>}\n isDisabled={isDisabled}\n onPress={onPress}\n className={badgeOuterVariants()}\n id={id}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid={dataTestId}\n {...(props as Omit<AriaButtonProps, 'className'>)}\n >\n {(renderProps) => (\n <span\n className={cn(\n visualClasses,\n // Interaction styles for visual feedback\n PRESSED_STYLES,\n HOVER_STYLES,\n HIGH_CONTRAST_HOVER,\n HIGH_CONTRAST_PRESSED\n )}\n data-pressed={renderProps.isPressed || undefined}\n >\n {renderContent()}\n </span>\n )}\n </AriaButton>\n );\n }\n\n // Static badge - simple span element\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={visualClasses}\n id={id}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid={dataTestId}\n {...props}\n >\n {renderContent()}\n </span>\n );\n }\n )\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge };\n","\"use client\";\n\n/**\n * Breadcrumbs Component\n * Accessible breadcrumb navigation with array-based API and ellipsis collapse\n *\n * @see breadcrumbs-prd.md FR-001 to FR-011 (Breadcrumbs Component Requirements)\n * @see breadcrumbs-prd.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see breadcrumbs-prd.md FR-008 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, Fragment, type ElementType, type ReactNode } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { ChevronRight, MoreHorizontal } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Dropdown } from '../Dropdown';\nimport { Button } from '../Button';\nimport type {\n BreadcrumbsProps,\n BreadcrumbItemData,\n SeparatorType,\n CollapsedItems,\n BreadcrumbLinkState,\n} from './Breadcrumbs.types';\n\n// ============================================================================\n// CVA Variants (Task 3.1)\n// ============================================================================\n\n/**\n * Root container styling\n * @see plan.md CVA Variants Structure - breadcrumbsVariants\n */\nexport const breadcrumbsVariants = cva(\"flex items-center flex-wrap\", {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * Ordered list styling\n * @see plan.md CVA Variants Structure - breadcrumbListVariants\n */\nexport const breadcrumbListVariants = cva(\n \"flex flex-wrap items-center gap-1 break-words text-sm text-[var(--menu-muted)]\",\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Individual list item styling\n * @see plan.md CVA Variants Structure - breadcrumbItemVariants\n */\nexport const breadcrumbItemVariants = cva(\"inline-flex items-center gap-1\", {\n variants: {},\n defaultVariants: {},\n});\n\n/**\n * Link/span styling based on state\n * @see plan.md CVA Variants Structure - breadcrumbLinkVariants\n * @see FR-008 (44x44px minimum touch targets)\n */\nexport const breadcrumbLinkVariants = cva(\n \"inline-flex items-center gap-2 min-h-[44px] px-2 rounded-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2\",\n {\n variants: {\n state: {\n default: [\n \"text-[var(--menu-muted)]\",\n \"hover:text-[var(--content-foreground)]\",\n \"hover:underline underline-offset-4\",\n ].join(\" \"),\n current: \"text-[var(--content-foreground)] font-medium pointer-events-none\",\n disabled:\n \"text-[var(--menu-muted)] opacity-50 cursor-not-allowed pointer-events-none\",\n },\n },\n defaultVariants: {\n state: \"default\",\n },\n }\n);\n\n/**\n * Separator styling\n * @see plan.md CVA Variants Structure - separatorVariants\n */\nexport const separatorVariants = cva(\"text-[var(--menu-muted)]\", {\n variants: {\n type: {\n chevron: \"[&>svg]:h-4 [&>svg]:w-4\",\n slash: \"mx-2\",\n custom: \"\",\n },\n },\n defaultVariants: {\n type: \"chevron\",\n },\n});\n\n/**\n * Ellipsis button styling\n * @see plan.md CVA Variants Structure - ellipsisButtonVariants\n * @see FR-008 (44x44px minimum touch targets)\n */\nexport const ellipsisButtonVariants = cva(\n \"inline-flex items-center justify-center min-h-[44px] min-w-[44px] rounded-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 hover:bg-[var(--accent)]\",\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n// ============================================================================\n// Helper Functions (Task 3.4)\n// ============================================================================\n\n/**\n * Determine if an item is the current page\n * Only the last item is considered current page\n *\n * @see plan.md Clarification: Current Page Detection - Only last item\n */\nfunction isCurrentPage(index: number, total: number): boolean {\n return index === total - 1;\n}\n\n/**\n * Calculate collapsed items for ellipsis dropdown\n *\n * @see FR-004 (Ellipsis Collapse for Overflow)\n * @see plan.md Clarification: Collapse Edge Case - No collapse if before + after >= total\n */\nfunction getCollapsedItems(\n items: BreadcrumbItemData[],\n maxItems: number,\n itemsBeforeCollapse: number,\n itemsAfterCollapse: number\n): CollapsedItems | null {\n // No collapse if items fit within maxItems\n if (items.length <= maxItems) {\n return null;\n }\n\n // Edge case: no collapse if before + after covers all items\n if (itemsBeforeCollapse + itemsAfterCollapse >= items.length) {\n return null;\n }\n\n const before = items.slice(0, itemsBeforeCollapse);\n const after = items.slice(-itemsAfterCollapse);\n const collapsed = items.slice(itemsBeforeCollapse, items.length - itemsAfterCollapse);\n\n return { before, collapsed, after };\n}\n\n// ============================================================================\n// Internal Components (Tasks 3.2, 3.3)\n// ============================================================================\n\n/**\n * BreadcrumbSeparator - Internal component for rendering separators\n *\n * @see FR-003 (Configurable Separators)\n * @see plan.md Task 3.2\n */\ninterface BreadcrumbSeparatorProps {\n separator: SeparatorType;\n}\n\nfunction BreadcrumbSeparator({ separator }: BreadcrumbSeparatorProps): ReactNode {\n if (separator === 'chevron') {\n return (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={separatorVariants({ type: 'chevron' })}\n >\n <ChevronRight />\n </li>\n );\n }\n\n if (separator === 'slash') {\n return (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={separatorVariants({ type: 'slash' })}\n >\n /\n </li>\n );\n }\n\n // Custom ReactNode separator\n return (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={separatorVariants({ type: 'custom' })}\n >\n {separator}\n </li>\n );\n}\n\n/**\n * BreadcrumbLink - Internal component for rendering individual breadcrumb links\n *\n * @see FR-001 (Render Breadcrumbs from Items Array)\n * @see FR-002 (Auto-Detect Current Page)\n * @see FR-005 (Polymorphic Link Component)\n * @see plan.md Task 3.3\n */\ninterface BreadcrumbLinkProps {\n item: BreadcrumbItemData;\n isCurrent: boolean;\n linkComponent?: ElementType;\n isGroupDisabled?: boolean;\n}\n\nfunction BreadcrumbLink({\n item,\n isCurrent,\n linkComponent: LinkComponent = 'a',\n isGroupDisabled,\n}: BreadcrumbLinkProps): ReactNode {\n const isDisabled = isGroupDisabled || item.isDisabled;\n const state: BreadcrumbLinkState = isCurrent\n ? 'current'\n : isDisabled\n ? 'disabled'\n : 'default';\n\n // Render current page as span with aria-current\n if (isCurrent) {\n return (\n <span\n className={breadcrumbLinkVariants({ state: 'current' })}\n aria-current=\"page\"\n >\n {item.icon && <span aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </span>\n );\n }\n\n // Render non-navigable item (no href) as span without aria-current\n if (!item.href) {\n return (\n <span\n className={breadcrumbLinkVariants({ state: isDisabled ? 'disabled' : 'default' })}\n aria-disabled={isDisabled || undefined}\n >\n {item.icon && <span aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </span>\n );\n }\n\n // Render link - navigation handled by linkComponent\n return (\n <LinkComponent\n href={item.href}\n className={breadcrumbLinkVariants({ state })}\n aria-disabled={isDisabled || undefined}\n >\n {item.icon && <span aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </LinkComponent>\n );\n}\n\n/**\n * BreadcrumbEllipsis - Internal component for collapsed items dropdown\n *\n * @see FR-004 (Ellipsis Collapse for Overflow)\n * @see plan.md Task 4.2 - Uses Themis Dropdown with nested LinkComponent\n */\ninterface BreadcrumbEllipsisProps {\n items: BreadcrumbItemData[];\n linkComponent?: ElementType;\n isGroupDisabled?: boolean;\n}\n\nfunction BreadcrumbEllipsis({\n items,\n linkComponent: LinkComponent = 'a',\n isGroupDisabled,\n}: BreadcrumbEllipsisProps): ReactNode {\n return (\n <Dropdown defaultOpen={false}>\n <Dropdown.Trigger>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={ellipsisButtonVariants()}\n aria-label=\"More breadcrumbs\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </Dropdown.Trigger>\n <Dropdown.Menu align=\"start\" side=\"bottom\">\n {items.map((item) => (\n <Dropdown.Item\n key={item.id}\n isDisabled={isGroupDisabled || item.isDisabled}\n >\n {/* Nest LinkComponent inside Item (ShadCN pattern) */}\n <LinkComponent\n href={item.href}\n className=\"flex flex-1 items-center gap-2\"\n >\n {item.icon && <span aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </LinkComponent>\n </Dropdown.Item>\n ))}\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n\n// ============================================================================\n// Main Component (Tasks 3.5, 3.6)\n// ============================================================================\n\n/**\n * Breadcrumbs Component\n *\n * Accessible breadcrumb navigation with array-based API and ellipsis collapse.\n * Supports polymorphic link components for framework integration.\n *\n * @example\n * ```tsx\n * <Breadcrumbs\n * items={[\n * { id: 'home', label: 'Home', href: '/' },\n * { id: 'products', label: 'Products', href: '/products' },\n * { id: 'current', label: 'Product Details' }\n * ]}\n * />\n * ```\n *\n * @see breadcrumbs-prd.md FR-001 to FR-011 (All Functional Requirements)\n */\nconst Breadcrumbs = forwardRef<HTMLElement, BreadcrumbsProps>(\n (\n {\n items,\n separator = 'chevron',\n maxItems = 4,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 2,\n linkComponent,\n isDisabled,\n className,\n 'aria-label': ariaLabel = 'Breadcrumb',\n ...props\n },\n ref\n ) => {\n // Handle empty items - render nothing\n if (!items || items.length === 0) {\n return null;\n }\n\n // Calculate if we need to collapse\n const collapsedData = getCollapsedItems(\n items,\n maxItems,\n itemsBeforeCollapse,\n itemsAfterCollapse\n );\n\n // Render without collapse\n if (!collapsedData) {\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={cn(breadcrumbsVariants(), className)}\n {...props}\n >\n <ol className={breadcrumbListVariants()}>\n {items.map((item, index) => (\n <Fragment key={item.id}>\n <li className={breadcrumbItemVariants()}>\n <BreadcrumbLink\n item={item}\n isCurrent={isCurrentPage(index, items.length)}\n linkComponent={linkComponent}\n isGroupDisabled={isDisabled}\n />\n </li>\n {index < items.length - 1 && (\n <BreadcrumbSeparator separator={separator} />\n )}\n </Fragment>\n ))}\n </ol>\n </nav>\n );\n }\n\n // Render with collapse\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={cn(breadcrumbsVariants(), className)}\n {...props}\n >\n <ol className={breadcrumbListVariants()}>\n {/* Items before ellipsis */}\n {collapsedData.before.map((item) => (\n <Fragment key={item.id}>\n <li className={breadcrumbItemVariants()}>\n <BreadcrumbLink\n item={item}\n isCurrent={false}\n linkComponent={linkComponent}\n isGroupDisabled={isDisabled}\n />\n </li>\n <BreadcrumbSeparator separator={separator} />\n </Fragment>\n ))}\n\n {/* Ellipsis dropdown */}\n <li className={breadcrumbItemVariants()}>\n <BreadcrumbEllipsis\n items={collapsedData.collapsed}\n linkComponent={linkComponent}\n isGroupDisabled={isDisabled}\n />\n </li>\n <BreadcrumbSeparator separator={separator} />\n\n {/* Items after ellipsis */}\n {collapsedData.after.map((item, index) => {\n const isLast = index === collapsedData.after.length - 1;\n const globalIndex =\n items.length - collapsedData.after.length + index;\n return (\n <Fragment key={item.id}>\n <li className={breadcrumbItemVariants()}>\n <BreadcrumbLink\n item={item}\n isCurrent={isCurrentPage(globalIndex, items.length)}\n linkComponent={linkComponent}\n isGroupDisabled={isDisabled}\n />\n </li>\n {!isLast && <BreadcrumbSeparator separator={separator} />}\n </Fragment>\n );\n })}\n </ol>\n </nav>\n );\n }\n);\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n\nexport { Breadcrumbs };\n","\"use client\";\n\n/**\n * Dropdown Menu Component\n * Accessible dropdown menu with React Aria primitives, nested submenus, and CVA styling\n *\n * @see spec.md FR-001 to FR-054 (Dropdown Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, Children, isValidElement, type ReactNode, type ReactElement, cloneElement, type ComponentType } from 'react';\nimport type { Placement } from 'react-aria';\nimport {\n MenuTrigger as AriaMenuTrigger,\n SubmenuTrigger as AriaSubmenuTrigger,\n Button as AriaButton,\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n Separator as AriaSeparator,\n Header as AriaHeader,\n Popover as AriaPopover,\n} from 'react-aria-components';\nimport { ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { menuVariants, menuItemVariants } from './Dropdown.styles';\nimport type {\n DropdownProps,\n DropdownTriggerProps,\n DropdownMenuProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n DropdownLabelProps,\n} from './Dropdown.types';\n\n/**\n * Type-safe helper to get displayName from a component type.\n */\nfunction getDisplayName(type: unknown): string | undefined {\n if (typeof type === 'function' || typeof type === 'object') {\n return (type as ComponentType)?.displayName;\n }\n return undefined;\n}\n\n/**\n * Dropdown Root Component\n * Manages open/close state and coordinates Trigger and Menu children\n *\n * @see spec.md FR-001 to FR-007\n */\ninterface InternalDropdownProps extends DropdownProps {\n children: ReactNode;\n}\n\nconst DropdownRoot = forwardRef<HTMLDivElement, InternalDropdownProps>(\n ({ defaultOpen = false, isOpen, onOpenChange, children }, _ref) => {\n // Validate children structure in development only\n if (process.env.NODE_ENV !== 'production') {\n const childArray = Children.toArray(children);\n const hasTrigger = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === DropdownTrigger || getDisplayName(child.type) === 'DropdownTrigger')\n );\n const hasMenu = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === DropdownMenu || getDisplayName(child.type) === 'DropdownMenu')\n );\n\n if (!hasTrigger || !hasMenu) {\n throw new Error(\n 'Dropdown requires exactly one Dropdown.Trigger and one Dropdown.Menu as children'\n );\n }\n }\n\n return (\n <AriaMenuTrigger defaultOpen={defaultOpen} isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </AriaMenuTrigger>\n );\n }\n);\n\nDropdownRoot.displayName = 'Dropdown';\n\n/**\n * Dropdown.Trigger Component\n * Wraps trigger element (typically Button) with proper ARIA attributes\n *\n * @see spec.md FR-008 to FR-012\n */\nconst DropdownTrigger = forwardRef<HTMLButtonElement, DropdownTriggerProps>(\n ({ children, ...props }, ref) => {\n // Clone child and add ref if it's a single React element\n if (isValidElement(children)) {\n return cloneElement(children as ReactElement<Record<string, unknown>>, {\n ...props,\n slot: 'trigger',\n });\n }\n\n // Fallback: wrap in AriaButton if not a React element\n return (\n <AriaButton ref={ref} {...props}>\n {children}\n </AriaButton>\n );\n }\n);\n\nDropdownTrigger.displayName = 'DropdownTrigger';\n\n/**\n * Dropdown.Menu Component\n * Renders menu with positioning, collision detection, and focus management\n *\n * @see spec.md FR-014 to FR-024\n */\nconst DropdownMenu = forwardRef<HTMLDivElement, DropdownMenuProps>(\n ({ align = 'start', side = 'bottom', className, children, ...props }, _ref) => {\n // Map align to React Aria placement\n const placement = `${side} ${align}` as Placement;\n\n return (\n <AriaPopover placement={placement} className=\"entering:animate-in exiting:animate-out\">\n <AriaMenu\n className={cn(menuVariants({ variant: 'default' }), className)}\n {...props}\n >\n {children}\n </AriaMenu>\n </AriaPopover>\n );\n }\n);\n\nDropdownMenu.displayName = 'DropdownMenu';\n\n/**\n * Dropdown.Item Component\n * Menu item with action callbacks, disabled state, shortcuts, icons, and nested submenu support\n *\n * @see spec.md FR-025 to FR-034\n */\nconst DropdownItem = forwardRef<HTMLDivElement, DropdownItemProps>(\n (\n {\n children,\n onAction,\n isDisabled = false,\n shortcut,\n icon,\n iconRight,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n _ref\n ) => {\n // Check if this item contains a nested submenu\n const childArray = Children.toArray(children);\n const isDropdownMenu = (child: unknown): boolean =>\n isValidElement(child) &&\n (child.type === DropdownMenu || getDisplayName(child.type) === 'DropdownMenu');\n\n const hasSubmenu = childArray.some(isDropdownMenu);\n\n // Filter children to separate submenu from content\n const contentChildren = childArray.filter((child) => !isDropdownMenu(child));\n\n const submenu = childArray.find(isDropdownMenu);\n\n if (hasSubmenu && submenu) {\n // Render as submenu trigger using React Aria's SubmenuTrigger\n return (\n <AriaSubmenuTrigger>\n <AriaMenuItem\n aria-label={ariaLabel}\n className={cn(menuItemVariants({ variant: 'default' }), className)}\n {...props}\n >\n {icon && <span className=\"mr-2\">{icon}</span>}\n <span className=\"flex-1\">{contentChildren}</span>\n <ChevronRight className=\"ml-auto h-4 w-4\" aria-hidden=\"true\" />\n </AriaMenuItem>\n {submenu as ReactElement}\n </AriaSubmenuTrigger>\n );\n }\n\n // Regular menu item\n return (\n <AriaMenuItem\n onAction={onAction}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n className={cn(menuItemVariants({ variant: 'default' }), className)}\n {...props}\n >\n {icon && <span className=\"mr-2\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n {iconRight && <span className=\"ml-auto\">{iconRight}</span>}\n {shortcut && (\n <kbd className=\"ml-auto pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-[var(--border)] bg-[var(--accent-background)] px-1.5 font-mono text-[10px] font-medium text-[var(--menu-muted)] opacity-100\">\n {shortcut}\n </kbd>\n )}\n </AriaMenuItem>\n );\n }\n);\n\nDropdownItem.displayName = 'DropdownItem';\n\n/**\n * Dropdown.Separator Component\n * Non-focusable visual divider\n *\n * @see spec.md FR-043 to FR-045\n */\nconst DropdownSeparator = memo(forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, _ref) => {\n return (\n <AriaSeparator\n className={cn(\n '-mx-1 my-1 h-px bg-[var(--accent-background)]',\n className\n )}\n {...props}\n />\n );\n }\n));\n\nDropdownSeparator.displayName = 'DropdownSeparator';\n\n/**\n * Dropdown.Label Component\n * Non-interactive section header\n *\n * @see spec.md FR-046 to FR-048\n */\nconst DropdownLabel = memo(forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ children, className, ...props }, _ref) => {\n return (\n <AriaHeader\n className={cn(\n 'px-2 py-1.5 text-sm font-semibold text-[var(--menu-muted)]',\n className\n )}\n {...props}\n >\n {children}\n </AriaHeader>\n );\n }\n));\n\nDropdownLabel.displayName = 'DropdownLabel';\n\n/**\n * Export compound component via Object.assign for backwards compatibility.\n * Enables `<Dropdown.Trigger>`, `<Dropdown.Menu>`, etc.\n *\n * @deprecated v2 — Remove Object.assign pattern in favour of direct named exports\n * (DropdownTrigger, DropdownMenu, DropdownItem, DropdownSeparator, DropdownLabel)\n * for better tree-shaking. See named exports below.\n */\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n Separator: DropdownSeparator,\n Label: DropdownLabel,\n});\n\n// Export individual components for flexibility\nexport { DropdownTrigger, DropdownMenu, DropdownItem, DropdownSeparator, DropdownLabel };\n\n// Export variant functions for external use\nexport { menuVariants, menuItemVariants };\n\n// Export types\nexport type {\n DropdownProps,\n DropdownTriggerProps,\n DropdownMenuProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n DropdownLabelProps,\n};\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * Menu variant styles using CVA\n * @see spec.md FR-040 (CVA for variant styling - single \"default\" variant for v1)\n */\nexport const menuVariants = cva(\n // Base styles - semantic tokens with fallbacks\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-[var(--menu-border)] bg-[var(--menu-background)] text-[var(--menu-foreground)] shadow-md data-[entering]:animate-in data-[exiting]:animate-out data-[entering]:fade-in-0 data-[exiting]:fade-out-0 data-[entering]:zoom-in-95 data-[exiting]:zoom-out-95 p-1\",\n {\n variants: {\n variant: {\n default: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\n/**\n * Menu Item variant styles using CVA\n * @see spec.md FR-041 (CVA for item states: hover, focus, active, disabled)\n */\nexport const menuItemVariants = cva(\n // Base styles - FR-014: 44x44px minimum touch targets\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 min-h-[44px] data-[focused]:bg-[var(--menu-accent)] data-[focused]:text-[var(--menu-accent-foreground)] data-[pressed]:bg-[var(--menu-accent)] [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\n/**\n * Type exports for variant props\n * Allows TypeScript inference of variant combinations\n */\nexport type MenuVariantProps = VariantProps<typeof menuVariants>;\nexport type MenuItemVariantProps = VariantProps<typeof menuItemVariants>;\n","export {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n accordionVariants,\n accordionItemVariants,\n accordionTriggerVariants,\n accordionChevronVariants,\n accordionContentVariants,\n accordionContentInnerVariants,\n} from './Accordion';\nexport type {\n AccordionProps,\n AccordionItemProps,\n AccordionTriggerProps,\n AccordionContentProps,\n} from './Accordion';\nexport {\n Avatar,\n AvatarGroup,\n avatarOuterVariants,\n avatarVisualVariants,\n avatarOverflowVariants,\n} from './Avatar';\nexport {\n Badge,\n badgeOuterVariants,\n badgeVisualVariants,\n badgeVariants,\n} from './Badge';\nexport {\n Breadcrumbs,\n breadcrumbsVariants,\n breadcrumbListVariants,\n breadcrumbItemVariants,\n breadcrumbLinkVariants,\n separatorVariants,\n ellipsisButtonVariants,\n} from './Breadcrumbs';\nexport { Button } from './Button/Button';\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n useButtonGroupContext,\n useButtonGroupItemContext,\n ButtonGroupPropsSchema,\n ButtonGroupSeparatorPropsSchema,\n buttonGroupVariants,\n buttonGroupItemVariants,\n buttonGroupSeparatorVariants,\n} from './ButtonGroup';\nexport type {\n ButtonGroupProps,\n ButtonGroupSeparatorProps,\n ButtonGroupOrientation,\n ButtonGroupVariant,\n ButtonGroupSize,\n} from './ButtonGroup';\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n CardAction,\n flipButtonPositionVariants,\n} from './Card';\nexport { Carousel, LazyCarousel } from './Carousel';\nexport {\n Checkbox,\n checkboxContainerVariants,\n checkboxIndicatorVariants,\n checkmarkVariants as checkboxCheckmarkVariants,\n CheckmarkIcon as CheckboxCheckmarkIcon,\n MinusIcon as CheckboxMinusIcon,\n} from './Checkbox';\nexport type { CheckboxProps, CheckboxSize, CheckboxVariant } from './Checkbox';\nexport {\n CheckboxGroup,\n Checkbox as CheckboxGroupCheckbox,\n checkboxGroupVariants,\n checkboxItemVariants,\n checkboxIndicatorVariants as checkboxGroupIndicatorVariants,\n checkmarkVariants as checkboxGroupCheckmarkVariants,\n CheckmarkIcon as CheckboxGroupCheckmarkIcon,\n TimesIcon as CheckboxGroupTimesIcon,\n CheckboxGroupPropsSchema,\n} from './CheckboxGroup';\nexport type {\n CheckboxGroupProps,\n CheckboxGroupVariant,\n CheckboxGroupSize,\n CheckboxGroupOrientation,\n} from './CheckboxGroup';\nexport {\n Chart,\n chartVariants,\n dataPointVariants,\n ChartPropsSchema,\n DataPointSchema,\n DataSeriesSchema,\n ChartTypeSchema,\n ChartVariantSchema,\n LinePatternSchema,\n} from './Chart';\nexport type {\n ChartProps,\n DataPoint,\n DataSeries,\n ChartType,\n ChartVariant,\n LinePattern,\n ChartState,\n ChartDimensions,\n ScaleInfo,\n ChartContextValue,\n} from './Chart';\nexport {\n DatePicker,\n DateRangePicker,\n DateField,\n Calendar,\n dateFieldVariants,\n dateSegmentVariants,\n calendarCellVariants,\n calendarHeaderVariants,\n calendarNavButtonVariants,\n calendarGridVariants,\n calendarGridHeaderCellVariants,\n datePickerPopoverVariants,\n datePickerTriggerVariants,\n datePickerDescriptionVariants,\n datePickerErrorVariants,\n datePickerLabelVariants,\n parseDate,\n parseDateTime,\n parseZonedDateTime,\n today,\n now,\n getLocalTimeZone,\n isWeekend,\n} from './DatePicker';\nexport {\n Dropdown,\n DropdownTrigger,\n DropdownMenu,\n DropdownItem,\n DropdownSeparator,\n DropdownLabel,\n menuVariants,\n menuItemVariants,\n} from './Dropdown';\nexport type {\n DropdownProps,\n DropdownTriggerProps,\n DropdownMenuProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n DropdownLabelProps,\n DropdownMenuAlign,\n DropdownMenuSide,\n MenuVariantProps,\n MenuItemVariantProps,\n} from './Dropdown';\nexport {\n FileField,\n FilePreview,\n useFilePreview,\n FileFieldPropsSchema,\n formatFileSize,\n truncateFileName,\n isFileTypeAccepted,\n getFileIcon,\n deduplicateFiles,\n formatAcceptedTypes,\n fileFieldContainerVariants,\n fileFieldDropZoneVariants,\n fileFieldTriggerVariants,\n fileFieldItemVariants,\n fileFieldErrorVariants,\n} from './FileField';\nexport type {\n FileFieldProps,\n FileFieldSize,\n ValidationResult,\n} from './FileField';\nexport { FormLayout } from './FormLayout/FormLayout';\nexport { Modal } from './Modal/Modal';\nexport {\n NumberField,\n NumberFieldPropsSchema,\n numberFieldVariants,\n numberFieldInputVariants,\n numberFieldStepperVariants,\n numberFieldLabelVariants,\n numberFieldDescriptionVariants,\n numberFieldErrorVariants,\n} from './NumberField';\nexport type {\n NumberFieldProps,\n NumberFieldSize,\n StepperLayout,\n} from './NumberField';\nexport { OTPInput } from './OTPInput/OTPInput';\nexport {\n Progress,\n progressTrackVariants,\n progressIndicatorVariants,\n progressContainerVariants,\n ProgressPropsSchema,\n} from './Progress';\nexport type {\n ProgressProps,\n ProgressVariant,\n ProgressSize,\n ProgressLabelPosition,\n ProgressComponentProps,\n} from './Progress';\nexport {\n RadioGroup,\n Radio,\n RadioGroupPropsSchema,\n RadioPropsSchema,\n} from './RadioGroup';\nexport type {\n RadioGroupProps,\n RadioProps,\n RadioGroupVariant,\n RadioGroupSize,\n RadioGroupOrientation,\n} from './RadioGroup';\nexport {\n Panel,\n panelContentVariants,\n panelHeaderVariants,\n panelBodyVariants,\n panelFooterVariants,\n panelCloseButtonVariants,\n} from './Panel';\nexport {\n ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n resizableHandleVariants,\n resizableGripVariants,\n useResizableContext,\n DEFAULT_MIN_SIZE,\n DEFAULT_MAX_SIZE,\n LONG_PRESS_THRESHOLD,\n} from './Resizable';\nexport { Select, MultiSelect } from './Select';\nexport { Skeleton } from './Skeleton/Skeleton';\nexport { Switch } from './Switch/Switch';\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableCaption,\n Column,\n Row,\n Cell,\n tableVariants,\n tableContainerVariants,\n tableHeaderVariants,\n tableFooterVariants,\n tableCaptionVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n} from './Table';\nexport {\n Tabs,\n TabList,\n Tab,\n TabPanel,\n tabListVariants,\n tabVariants,\n tabPanelVariants,\n} from './Tabs';\nexport { TextField } from './TextField/TextField';\nexport {\n TimeField,\n Time,\n parseTime,\n timeFieldVariants,\n timeSegmentVariants,\n timeFieldLabelVariants,\n timeFieldDescriptionVariants,\n timeFieldErrorVariants,\n} from './TimeField';\nexport {\n toast,\n toastQueue,\n toastVariants,\n toasterVariants,\n ToastProvider,\n Toaster,\n ToastOptionsSchema,\n ToasterPropsSchema,\n ToastProviderPropsSchema,\n ToastVariantSchema,\n ToasterPositionSchema,\n DismissReasonSchema,\n} from './Toast';\nexport type {\n ToastOptions,\n ToastContent,\n ToasterProps,\n ToastProviderProps,\n ToastVariant,\n ToasterPosition,\n DismissReason,\n} from './Toast';\nexport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipArrow,\n tooltipContentVariants,\n tooltipArrowVariants,\n} from './Tooltip';\nexport {\n AlertDialog,\n alertDialogContentVariants,\n} from './AlertDialog';\nexport type {\n AlertDialogProps,\n AlertDialogVariant,\n AlertDialogSize,\n} from './AlertDialog';\nexport { Combobox, ComboboxItem, ComboboxSection } from './Combobox';\nexport type {\n ComboboxProps,\n ComboboxItemProps,\n ComboboxSectionProps,\n ComboboxSize,\n} from './Combobox';\nexport {\n comboboxVariants,\n comboboxLabelVariants,\n comboboxInputVariants,\n comboboxTriggerWrapperVariants,\n comboboxButtonVariants,\n comboboxPopoverVariants,\n comboboxListBoxVariants,\n comboboxItemVariants,\n comboboxSectionVariants,\n comboboxSectionHeaderVariants,\n comboboxDescriptionVariants,\n comboboxErrorVariants,\n} from './Combobox';\nexport {\n Pagination,\n paginationNavVariants,\n paginationEllipsisVariants,\n paginationInfoVariants,\n} from './Pagination';\nexport type {\n PaginationProps,\n PaginationSize,\n PaginationVariant,\n} from './Pagination';\nexport {\n SearchField,\n searchFieldVariants,\n searchFieldLabelVariants,\n searchFieldDescriptionVariants,\n searchFieldErrorVariants,\n} from './SearchField';\nexport type { SearchFieldProps, SearchFieldSize } from './SearchField';\nexport {\n PasswordField,\n passwordFieldVariants,\n passwordFieldLabelVariants,\n passwordFieldDescriptionVariants,\n passwordFieldErrorVariants,\n} from './PasswordField';\nexport type { PasswordFieldProps, PasswordFieldSize } from './PasswordField';","\"use client\";\n\n/**\n * ButtonGroup Component\n *\n * A container that groups related Themis Button components with:\n * - Consistent styling (connected borders, position-aware radii)\n * - Accessible keyboard navigation (React Aria Toolbar)\n * - WCAG 2.2 AAA compliance\n *\n * @see plan.md for architecture details\n * @see buttongroup-prd.md for requirements\n */\n\nimport { forwardRef, Children, type ReactElement } from 'react';\nimport { Toolbar } from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport {\n ButtonGroupContext,\n ButtonGroupItemContext,\n useButtonGroupContext,\n} from './ButtonGroupContext';\nimport { buttonGroupVariants, buttonGroupSeparatorVariants } from './ButtonGroup.variants';\nimport { isButtonElement, getPosition } from './ButtonGroup.utils';\nimport type { ButtonGroupProps, ButtonGroupSeparatorProps } from './ButtonGroup.types';\n\n// =============================================================================\n// ButtonGroup Component\n// =============================================================================\n\n/**\n * ButtonGroup - Groups related buttons with connected styling and keyboard navigation\n *\n * Uses React Aria's Toolbar for:\n * - Roving tabindex (single tab stop)\n * - Arrow key navigation\n * - Home/End key support\n * - RTL support\n *\n * @example\n * ```tsx\n * <ButtonGroup aria-label=\"Text formatting\">\n * <Button variant=\"outline\">Bold</Button>\n * <Button variant=\"outline\">Italic</Button>\n * <Button variant=\"outline\">Underline</Button>\n * </ButtonGroup>\n * ```\n */\nconst ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(\n (\n {\n orientation = 'horizontal',\n variant,\n size,\n isDisabled,\n className,\n children,\n ...props\n },\n ref\n ): ReactElement => {\n // Convert children to array for enumeration\n const childArray = Children.toArray(children);\n\n // Filter to get only Button elements for position calculation\n const buttonChildren = childArray.filter(isButtonElement);\n const totalButtons = buttonChildren.length;\n\n // Create context value for group-level props\n const groupContextValue = {\n orientation,\n variant,\n size,\n isDisabled,\n };\n\n // Wrap each child with appropriate context\n const wrappedChildren = childArray.map((child, index) => {\n // If it's a Button, wrap with item context for position\n if (isButtonElement(child)) {\n const buttonIndex = buttonChildren.indexOf(child);\n const position = getPosition(buttonIndex, totalButtons);\n\n return (\n <ButtonGroupItemContext.Provider\n key={index}\n value={{ position }}\n >\n {child}\n </ButtonGroupItemContext.Provider>\n );\n }\n\n // Non-Button children (Separators, etc.) pass through without item context\n return child;\n });\n\n return (\n <Toolbar\n ref={ref}\n orientation={orientation}\n aria-label={props['aria-label']}\n aria-labelledby={props['aria-labelledby']}\n className={cn(buttonGroupVariants({ orientation }), className)}\n >\n <ButtonGroupContext.Provider value={groupContextValue}>\n {wrappedChildren}\n </ButtonGroupContext.Provider>\n </Toolbar>\n );\n }\n);\n\nButtonGroup.displayName = 'ButtonGroup';\n\n// =============================================================================\n// ButtonGroupSeparator Component\n// =============================================================================\n\n/**\n * ButtonGroupSeparator - Visual divider between button groups\n *\n * Renders a decorative separator that:\n * - Adapts to orientation (vertical line for horizontal, horizontal for vertical)\n * - Is hidden from screen readers (aria-hidden)\n * - Is excluded from keyboard navigation\n *\n * @example\n * ```tsx\n * <ButtonGroup aria-label=\"Editor actions\">\n * <Button>Undo</Button>\n * <Button>Redo</Button>\n * <ButtonGroupSeparator />\n * <Button>Cut</Button>\n * <Button>Copy</Button>\n * </ButtonGroup>\n * ```\n */\nconst ButtonGroupSeparator = forwardRef<HTMLDivElement, ButtonGroupSeparatorProps>(\n ({ className, ...props }, ref): ReactElement => {\n const groupContext = useButtonGroupContext();\n const orientation = groupContext?.orientation ?? 'horizontal';\n\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-hidden=\"true\"\n className={cn(\n buttonGroupSeparatorVariants({ orientation }),\n className\n )}\n {...props}\n />\n );\n }\n);\n\nButtonGroupSeparator.displayName = 'ButtonGroupSeparator';\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport { ButtonGroup, ButtonGroupSeparator };\n","import { isValidElement, type ReactNode, type ComponentType } from 'react';\nimport type { ButtonPosition } from './ButtonGroup.types';\n\n/**\n * ButtonGroup Utility Functions\n *\n * Provides helper functions for:\n * - Child element detection (Button vs Separator vs other)\n * - Position calculation for border-radius styling\n *\n * @see plan.md Decision 6: Non-Button Child Handling\n */\n\n// =============================================================================\n// Child Detection Functions\n// =============================================================================\n\n/**\n * Checks if a React child is a Themis Button component\n * Uses displayName for reliable detection across module boundaries\n *\n * @param child - React child element to check\n * @returns true if the child is a Button component\n */\nexport const isButtonElement = (child: ReactNode): boolean => {\n if (!isValidElement(child)) return false;\n\n const componentType = child.type as ComponentType;\n return componentType?.displayName === 'Button';\n};\n\n/**\n * Checks if a React child is a ButtonGroupSeparator component\n * Uses displayName for reliable detection across module boundaries\n *\n * @param child - React child element to check\n * @returns true if the child is a ButtonGroupSeparator component\n */\nexport const isSeparatorElement = (child: ReactNode): boolean => {\n if (!isValidElement(child)) return false;\n\n const componentType = child.type as ComponentType;\n return componentType?.displayName === 'ButtonGroupSeparator';\n};\n\n// =============================================================================\n// Position Calculation\n// =============================================================================\n\n/**\n * Calculates the position of a button within a group\n * Used for applying position-aware border-radius styling\n *\n * @param index - Zero-based index of the button\n * @param total - Total number of buttons in the group\n * @returns Position enum: 'only' | 'first' | 'last' | 'middle'\n *\n * @example\n * getPosition(0, 1) // 'only' - single button\n * getPosition(0, 3) // 'first'\n * getPosition(1, 3) // 'middle'\n * getPosition(2, 3) // 'last'\n */\nexport const getPosition = (index: number, total: number): ButtonPosition => {\n if (total === 1) return 'only';\n if (index === 0) return 'first';\n if (index === total - 1) return 'last';\n return 'middle';\n};\n\n/**\n * Filters an array of React children to only include Button elements\n * Non-Button children (Separators, custom elements) are excluded\n *\n * @param children - Array of React children\n * @returns Array containing only Button elements\n */\nexport const filterButtonChildren = (children: ReactNode[]): ReactNode[] => {\n return children.filter(isButtonElement);\n};\n\n/**\n * Gets the index of a button within the filtered button array\n * Used when the child array contains non-Button elements (Separators, etc.)\n *\n * @param child - The button element to find\n * @param buttonChildren - Array of only Button elements\n * @returns Index of the button, or -1 if not found\n */\nexport const getButtonIndex = (\n child: ReactNode,\n buttonChildren: ReactNode[]\n): number => {\n return buttonChildren.indexOf(child);\n};\n","/**\n * ButtonGroup Component - Public API\n *\n * Exports all public members of the ButtonGroup component:\n * - Components: ButtonGroup, ButtonGroupSeparator\n * - Context Hooks: useButtonGroupContext, useButtonGroupItemContext\n * - Types: ButtonGroupProps, ButtonGroupContextValue, etc.\n * - Schemas: ButtonGroupPropsSchema\n * - CVA Variants: for custom composition\n * - Utilities: for advanced customization\n *\n * @example\n * ```tsx\n * import { ButtonGroup, ButtonGroupSeparator } from '@tribepad/themis/elements/ButtonGroup';\n * import { Button } from '@tribepad/themis/elements/Button';\n *\n * function Toolbar() {\n * return (\n * <ButtonGroup aria-label=\"Text formatting\">\n * <Button variant=\"outline\">Bold</Button>\n * <Button variant=\"outline\">Italic</Button>\n * <ButtonGroupSeparator />\n * <Button variant=\"outline\">Link</Button>\n * </ButtonGroup>\n * );\n * }\n * ```\n */\n\n// =============================================================================\n// Components\n// =============================================================================\n\nexport { ButtonGroup, ButtonGroupSeparator } from './ButtonGroup';\n\n// =============================================================================\n// Context Hooks\n// =============================================================================\n\nexport {\n useButtonGroupContext,\n useButtonGroupItemContext,\n} from './ButtonGroupContext';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type {\n ButtonGroupProps,\n ButtonGroupSeparatorProps,\n ButtonGroupContextValue,\n ButtonGroupItemContextValue,\n ButtonGroupOrientation,\n ButtonGroupVariant,\n ButtonGroupSize,\n ButtonPosition,\n} from './ButtonGroup.types';\n\n// =============================================================================\n// Schemas\n// =============================================================================\n\nexport {\n ButtonGroupPropsSchema,\n ButtonGroupSeparatorPropsSchema,\n} from './ButtonGroup.types';\n\n// =============================================================================\n// CVA Variants (for composition/customization)\n// =============================================================================\n\nexport {\n buttonGroupVariants,\n buttonGroupItemVariants,\n buttonGroupSeparatorVariants,\n} from './ButtonGroup.variants';\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport {\n isButtonElement,\n isSeparatorElement,\n getPosition,\n filterButtonChildren,\n getButtonIndex,\n} from './ButtonGroup.utils';\n","import { z } from 'zod';\nimport type { ReactNode } from 'react';\n\n/**\n * ButtonGroup Component Types\n *\n * Defines Zod schemas and TypeScript types for the ButtonGroup component.\n * Uses a two-level context pattern:\n * - ButtonGroupContext: Group-level props (orientation, variant, size, isDisabled)\n * - ButtonGroupItemContext: Per-button position information\n *\n * @see plan.md for architecture details\n * @see constitution.md Principle II (Type Safety First)\n */\n\n// =============================================================================\n// Core Types\n// =============================================================================\n\n/**\n * Orientation of the button group\n */\nexport type ButtonGroupOrientation = 'horizontal' | 'vertical';\n\n/**\n * Position of a button within the group\n * Used for position-aware border-radius styling\n */\nexport type ButtonPosition = 'first' | 'middle' | 'last' | 'only';\n\n/**\n * Button variants (matches Themis Button variants, excluding 'link')\n * Link variant is excluded as it doesn't make sense in a grouped context\n */\nexport type ButtonGroupVariant =\n | 'default'\n | 'destructive'\n | 'outline'\n | 'secondary'\n | 'ghost';\n\n/**\n * Button sizes (matches Themis Button sizes)\n */\nexport type ButtonGroupSize = 'sm' | 'default' | 'lg' | 'icon';\n\n// =============================================================================\n// Zod Schemas\n// =============================================================================\n\n/**\n * ButtonGroup props schema\n * Validates all props for the ButtonGroup container component\n */\nexport const ButtonGroupPropsSchema = z.object({\n /** Orientation of the button group layout */\n orientation: z\n .enum(['horizontal', 'vertical'])\n .optional()\n .default('horizontal'),\n\n /** Default variant for all child buttons (can be overridden per-button) */\n variant: z\n .enum(['default', 'destructive', 'outline', 'secondary', 'ghost'])\n .optional(),\n\n /** Default size for all child buttons (can be overridden per-button) */\n size: z.enum(['sm', 'default', 'lg', 'icon']).optional(),\n\n /** Disable all buttons in the group */\n isDisabled: z.boolean().optional(),\n\n /** Accessible label for the toolbar (recommended) */\n 'aria-label': z.string().optional(),\n\n /** ID of element that labels the toolbar */\n 'aria-labelledby': z.string().optional(),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n\n /** Child elements (Buttons, Separators, etc.) */\n children: z.custom<ReactNode>(),\n});\n\n/**\n * ButtonGroupSeparator props schema\n * Validates props for the visual separator between button groups\n */\nexport const ButtonGroupSeparatorPropsSchema = z.object({\n /** Additional CSS classes */\n className: z.string().optional(),\n /** Test ID for testing */\n 'data-testid': z.string().optional(),\n});\n\n// =============================================================================\n// TypeScript Types (inferred from schemas)\n// =============================================================================\n\n/**\n * Props for the ButtonGroup container component\n */\nexport type ButtonGroupProps = z.infer<typeof ButtonGroupPropsSchema>;\n\n/**\n * Props for the ButtonGroupSeparator component\n */\nexport type ButtonGroupSeparatorProps = z.infer<\n typeof ButtonGroupSeparatorPropsSchema\n>;\n\n// =============================================================================\n// Context Types\n// =============================================================================\n\n/**\n * Group-level context value\n * Provides inherited props to all child buttons\n */\nexport interface ButtonGroupContextValue {\n /** Orientation of the group (affects keyboard navigation and styling) */\n orientation: ButtonGroupOrientation;\n /** Default variant for buttons (can be overridden) */\n variant?: ButtonGroupVariant;\n /** Default size for buttons (can be overridden) */\n size?: ButtonGroupSize;\n /** Whether all buttons in the group are disabled */\n isDisabled?: boolean;\n}\n\n/**\n * Item-level context value\n * Provides position information to each button for border-radius styling\n */\nexport interface ButtonGroupItemContextValue {\n /** Position of this button in the group */\n position: ButtonPosition;\n}\n","'use client';\n\n/**\n * Card Component (TDD Stub)\n *\n * This is a minimal stub to allow tests to run during the RED phase.\n * Full implementation will be added in the GREEN phase.\n *\n * @see card-prd.md (Product Requirements)\n * @see plan.md (Implementation Plan)\n */\n\nimport { forwardRef, useState, useCallback, type HTMLAttributes, type ReactNode } from 'react';\nimport { RotateCcw } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport {\n flipButtonPositionVariants,\n type CardProps,\n type CardHeaderProps,\n type CardTitleProps,\n type CardDescriptionProps,\n type CardContentProps,\n type CardFooterProps,\n type CardActionProps,\n} from './Card.types';\n\n// ============================================================================\n// Card (Root Component)\n// ============================================================================\n\nexport const Card = forwardRef<HTMLElement, CardProps & HTMLAttributes<HTMLElement>>(\n (props, ref) => {\n const {\n children,\n className,\n flippable = false,\n backContent,\n isFlipped: controlledFlipped,\n defaultFlipped = false,\n onFlipChange,\n flipButtonPosition = 'top-right',\n flipButtonLabel,\n flipButtonIcon,\n flipDuration = 600,\n ...rest\n } = props;\n\n // Controlled/uncontrolled state\n const [internalFlipped, setInternalFlipped] = useState(defaultFlipped);\n const isControlled = controlledFlipped !== undefined;\n const flipped = isControlled ? controlledFlipped : internalFlipped;\n\n const handleFlip = useCallback(() => {\n const newState = !flipped;\n if (!isControlled) {\n setInternalFlipped(newState);\n }\n onFlipChange?.(newState);\n }, [flipped, isControlled, onFlipChange]);\n\n // Non-flippable card\n if (!flippable) {\n return (\n <article\n ref={ref}\n className={cn(\n 'rounded-lg border border-[var(--border)] bg-[var(--content-background)] text-[var(--content-foreground)] shadow-sm',\n className\n )}\n {...rest}\n >\n {children}\n </article>\n );\n }\n\n // Flippable card\n const showLabel = flipButtonLabel?.show ?? 'Show more details';\n const hideLabel = flipButtonLabel?.hide ?? 'Show less details';\n\n // Default icon\n const defaultIcon = <RotateCcw className=\"h-5 w-5\" aria-hidden=\"true\" />;\n // Custom icons (back defaults to front if not specified)\n const frontIcon = flipButtonIcon?.front ?? defaultIcon;\n const backIcon = flipButtonIcon?.back ?? flipButtonIcon?.front ?? defaultIcon;\n\n // Flip button component - rendered on both front and back\n const FlipButton = ({ label, icon }: { label: string; icon: ReactNode }) => (\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n aria-hidden={true}\n excludeFromTabOrder\n onPress={handleFlip}\n className={flipButtonPositionVariants({ position: flipButtonPosition })}\n aria-label={label}\n >\n {icon}\n </Button>\n );\n\n return (\n <article\n ref={ref}\n className={cn('relative', className)}\n style={{ perspective: '1000px' }}\n {...rest}\n >\n {/* Flipper container - handles 3D transform */}\n <div\n className={cn(\n 'relative transition-transform',\n 'motion-reduce:transition-none'\n )}\n style={{\n transformStyle: 'preserve-3d',\n transitionDuration: `${flipDuration}ms`,\n transform: flipped ? 'rotateY(180deg)' : 'rotateY(0deg)',\n }}\n data-flipped={flipped}\n >\n {/* Front side */}\n <div\n className=\"relative rounded-lg border border-[var(--border)] bg-[var(--content-background)] text-[var(--content-foreground)] shadow-sm\"\n style={{ backfaceVisibility: 'hidden' }}\n data-side=\"front\"\n >\n {children}\n <FlipButton label={showLabel} icon={frontIcon} />\n </div>\n\n {/* Back side - scrollable if content overflows */}\n <div\n className=\"absolute inset-0 overflow-y-auto rounded-lg border border-[var(--border)] bg-[var(--content-background)] text-[var(--content-foreground)] shadow-sm\"\n style={{\n backfaceVisibility: 'hidden',\n transform: 'rotateY(180deg)',\n }}\n data-side=\"back\"\n >\n {backContent}\n <FlipButton label={hideLabel} icon={backIcon} />\n </div>\n </div>\n </article>\n );\n }\n);\n\nCard.displayName = 'Card';\n\n// ============================================================================\n// CardHeader\n// ============================================================================\n\nexport const CardHeader = forwardRef<HTMLElement, CardHeaderProps & HTMLAttributes<HTMLElement>>(\n ({ className, children, ...props }, ref) => (\n <header\n ref={ref}\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n >\n {children}\n </header>\n )\n);\n\nCardHeader.displayName = 'CardHeader';\n\n// ============================================================================\n// CardTitle\n// ============================================================================\n\nexport const CardTitle = forwardRef<HTMLHeadingElement, CardTitleProps & HTMLAttributes<HTMLHeadingElement>>(\n ({ className, as: Comp = 'h3', children, ...props }, ref) => (\n <Comp\n ref={ref}\n className={cn('text-2xl font-semibold leading-none tracking-tight', className)}\n {...props}\n >\n {children}\n </Comp>\n )\n);\n\nCardTitle.displayName = 'CardTitle';\n\n// ============================================================================\n// CardDescription\n// ============================================================================\n\nexport const CardDescription = forwardRef<HTMLParagraphElement, CardDescriptionProps & HTMLAttributes<HTMLParagraphElement>>(\n ({ className, children, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-sm text-[var(--content-foreground-muted)]', className)}\n {...props}\n >\n {children}\n </p>\n )\n);\n\nCardDescription.displayName = 'CardDescription';\n\n// ============================================================================\n// CardContent\n// ============================================================================\n\nexport const CardContent = forwardRef<HTMLDivElement, CardContentProps & HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props}>\n {children}\n </div>\n )\n);\n\nCardContent.displayName = 'CardContent';\n\n// ============================================================================\n// CardFooter\n// ============================================================================\n\nexport const CardFooter = forwardRef<HTMLElement, CardFooterProps & HTMLAttributes<HTMLElement>>(\n ({ className, children, ...props }, ref) => (\n <footer\n ref={ref}\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n >\n {children}\n </footer>\n )\n);\n\nCardFooter.displayName = 'CardFooter';\n\n// ============================================================================\n// CardAction\n// ============================================================================\n\nexport const CardAction = forwardRef<HTMLDivElement, CardActionProps & HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('ml-auto', className)}\n {...props}\n >\n {children}\n </div>\n )\n);\n\nCardAction.displayName = 'CardAction';\n","import { z } from 'zod';\nimport { cva } from 'class-variance-authority';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode } from 'react';\n\n/**\n * Flip button position variants\n * Controls where the flip button appears on the card\n *\n * @see card-prd.md US-5 (Flip Button Position)\n */\nexport const FlipButtonPositionSchema = z.enum([\n 'top-right',\n 'top-left',\n 'bottom-right',\n 'bottom-left',\n]);\nexport type FlipButtonPosition = z.infer<typeof FlipButtonPositionSchema>;\n\n/**\n * Flip button label configuration\n * Custom labels for the flip button title attribute\n *\n * @see card-prd.md US-6 (Custom Labels)\n */\nexport const FlipButtonLabelSchema = z.object({\n show: z.string().optional(),\n hide: z.string().optional(),\n});\nexport type FlipButtonLabel = z.infer<typeof FlipButtonLabelSchema>;\n\n/**\n * Flip button icon configuration\n * Custom icons for the front and back flip buttons\n */\nexport const FlipButtonIconSchema = z.object({\n /** Icon to show on front side button (default: RotateCcw) */\n front: z.custom<ReactNode>().optional(),\n /** Icon to show on back side button (default: same as front or RotateCcw) */\n back: z.custom<ReactNode>().optional(),\n});\nexport type FlipButtonIcon = z.infer<typeof FlipButtonIconSchema>;\n\n/**\n * Card root component props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n * @see card-prd.md US-2 (Flippable Card)\n * @see card-prd.md US-3 (Controlled/Uncontrolled State)\n */\nexport const CardPropsSchema = BaseComponentPropsSchema.extend({\n // Flip functionality\n /** Enable flip animation feature */\n flippable: z.boolean().optional().default(false),\n\n /** Content to display on the back side of the card */\n backContent: z.custom<ReactNode>().optional(),\n\n /** Controlled mode: current flip state */\n isFlipped: z.boolean().optional(),\n\n /** Uncontrolled mode: initial flip state */\n defaultFlipped: z.boolean().optional().default(false),\n\n /** Callback fired when flip state changes */\n onFlipChange: z.custom<(isFlipped: boolean) => void>().optional(),\n\n // Flip button configuration\n /** Position of the flip button on the card */\n flipButtonPosition: FlipButtonPositionSchema.optional().default('top-right'),\n\n /** Custom labels for the flip button title attribute */\n flipButtonLabel: FlipButtonLabelSchema.optional(),\n\n /** Custom icons for the flip button (default: RotateCcw) */\n flipButtonIcon: FlipButtonIconSchema.optional(),\n\n /** Duration of flip animation in milliseconds */\n flipDuration: z.number().optional().default(600),\n});\n\nexport type CardProps = z.infer<typeof CardPropsSchema>;\n\n/**\n * CardHeader props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardHeaderPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardHeaderProps = z.infer<typeof CardHeaderPropsSchema>;\n\n/**\n * CardTitle props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardTitlePropsSchema = BaseComponentPropsSchema.extend({\n /** Heading level (h1-h6) - defaults to h3 */\n as: z.enum(['h1', 'h2', 'h3', 'h4', 'h5', 'h6']).optional().default('h3'),\n\n children: z.custom<ReactNode>(),\n});\n\nexport type CardTitleProps = z.infer<typeof CardTitlePropsSchema>;\n\n/**\n * CardDescription props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardDescriptionPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardDescriptionProps = z.infer<typeof CardDescriptionPropsSchema>;\n\n/**\n * CardContent props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardContentPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardContentProps = z.infer<typeof CardContentPropsSchema>;\n\n/**\n * CardFooter props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardFooterPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardFooterProps = z.infer<typeof CardFooterPropsSchema>;\n\n/**\n * CardAction props schema\n *\n * @see card-prd.md US-1 (Basic Card Container)\n */\nexport const CardActionPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport type CardActionProps = z.infer<typeof CardActionPropsSchema>;\n\n/**\n * CVA variants for flip button positioning\n *\n * Provides consistent positioning classes for the flip button\n * based on the flipButtonPosition prop.\n *\n * Buttons are rendered INSIDE both front and back sides so they\n * flip along with the card content for a more natural feel.\n *\n * @see card-prd.md US-5 (Flip Button Position)\n */\nexport const flipButtonPositionVariants = cva(\n [\n 'absolute z-10 min-h-[44px] min-w-[44px] p-2',\n 'flex items-center justify-center',\n 'rounded-full bg-[var(--accent-background)]',\n 'text-[var(--primary-action)] hover:text-[var(--primary-action-hover)]',\n 'transition-colors duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]',\n ],\n {\n variants: {\n position: {\n 'top-right': 'top-2 right-2',\n 'top-left': 'top-2 left-2',\n 'bottom-right': 'bottom-2 right-2',\n 'bottom-left': 'bottom-2 left-2',\n },\n },\n defaultVariants: {\n position: 'top-right',\n },\n }\n);\n","export { Carousel } from './Carousel';\nexport { LazyCarousel } from './LazyCarousel';\nexport type { CarouselProps } from './Carousel.types';\nexport type { LazyCarouselProps } from './LazyCarousel';\n","\"use client\";\n\n/**\n * Skeleton Component\n * Loading placeholder with pulse animation and theme-aware styling\n *\n * @see ShadCN Skeleton: https://ui.shadcn.com/docs/components/skeleton\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see tasks.md Phase 2 (Green Phase - Implementation)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n/**\n * Skeleton variant styles using CVA\n * @see tasks.md Phase 2.2 (CVA Variant Definitions)\n */\nconst skeletonVariants = cva(\n // Base styles - pulse animation and theme-aware background\n \"animate-pulse bg-[var(--accent-background)] relative\",\n {\n variants: {\n // Shape variants\n variant: {\n rectangle: \"rounded-md\", // Default: 0.375rem border radius\n circle: \"rounded-full\", // Circular shape (for avatars, icons)\n text: \"rounded-sm h-4\", // Text line placeholder (1rem height, 0.125rem radius)\n },\n },\n defaultVariants: {\n variant: \"rectangle\",\n },\n }\n);\n\nexport interface SkeletonProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof skeletonVariants> {\n variant?: 'rectangle' | 'circle' | 'text';\n className?: string;\n}\n\n/**\n * Skeleton Component\n * Non-interactive loading placeholder with pulse animation\n *\n * @see tasks.md Phase 2.4 (Component Implementation)\n */\nconst Skeleton = memo(\n forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n className={cn(skeletonVariants({ variant }), className)}\n {...props}\n >\n {/* Screen reader text for accessibility */}\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n }\n )\n);\n\nSkeleton.displayName = \"Skeleton\";\n\nexport { Skeleton, skeletonVariants };\n","'use client';\n\n/**\n * Lazy-loaded Carousel Component\n *\n * Only loads the Carousel component when:\n * 1. The viewport is large enough (configurable breakpoint)\n * 2. The component is mounted on the client\n *\n * Uses React Activity to preserve carousel state (current index, pause state,\n * elapsed time) when viewport resizes below breakpoint and back.\n *\n * This reduces initial bundle size for mobile users and improves TTI.\n *\n * @example\n * ```tsx\n * // Only loads on lg screens (1024px+)\n * <LazyCarousel items={items} label=\"Features\" />\n *\n * // Custom breakpoint\n * <LazyCarousel items={items} label=\"Features\" minWidth={768} />\n *\n * // Disable state preservation (unmount on resize)\n * <LazyCarousel items={items} label=\"Features\" preserveState={false} />\n * ```\n */\n\nimport { useState, useEffect, type ReactElement, type ComponentProps, Suspense, lazy, Activity } from 'react';\nimport { Skeleton } from '../Skeleton';\n\n// Lazy load the Carousel component\nconst Carousel = lazy(() =>\n import('./Carousel').then(mod => ({ default: mod.Carousel }))\n);\n\ntype CarouselProps = ComponentProps<typeof Carousel>;\n\nexport interface LazyCarouselProps extends CarouselProps {\n /** Minimum viewport width to load the carousel (default: 1024 for lg breakpoint) */\n minWidth?: number;\n /** Whether to preserve carousel state when hidden (default: true) */\n preserveState?: boolean;\n}\n\n/**\n * Carousel loading skeleton\n */\nfunction CarouselSkeleton(): ReactElement {\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <Skeleton className=\"h-8 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <div className=\"flex gap-2 mt-4\">\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n </div>\n </div>\n );\n}\n\n/**\n * LazyCarousel - Only loads on screens meeting minimum width\n *\n * Use this instead of Carousel when the carousel is only visible\n * on larger screens (e.g., hidden on mobile with `hidden lg:block`).\n *\n * State preservation: When the viewport shrinks below minWidth and then\n * expands again, the carousel will resume from where it left off (same\n * slide, same pause state) instead of resetting to the beginning.\n */\nexport function LazyCarousel({\n minWidth = 1024,\n preserveState = true,\n ...props\n}: LazyCarouselProps): ReactElement | null {\n const [isVisible, setIsVisible] = useState(false);\n const [hasLoaded, setHasLoaded] = useState(false);\n const [isClient, setIsClient] = useState(false);\n\n useEffect(() => {\n setIsClient(true);\n\n // Check if viewport is large enough\n const checkViewport = (): void => {\n const visible = window.innerWidth >= minWidth;\n setIsVisible(visible);\n if (visible) {\n setHasLoaded(true);\n }\n };\n\n checkViewport();\n\n // Listen for resize events\n window.addEventListener('resize', checkViewport);\n return () => window.removeEventListener('resize', checkViewport);\n }, [minWidth]);\n\n // Don't render anything on server\n if (!isClient) {\n return null;\n }\n\n // If never loaded and not visible, don't load\n if (!hasLoaded && !isVisible) {\n return null;\n }\n\n // Use Activity to preserve state when hidden (viewport too small)\n // This allows the carousel to resume from where it left off when\n // the viewport expands again\n return (\n <Activity mode={preserveState && !isVisible ? 'hidden' : 'visible'}>\n <Suspense fallback={<CarouselSkeleton />}>\n <Carousel {...props} />\n </Suspense>\n </Activity>\n );\n}\n","\"use client\";\n\n/**\n * Checkbox Component\n * Standalone accessible checkbox with React Aria primitives and CVA styling\n *\n * Key Features:\n * - Standalone checkbox (not requiring CheckboxGroup)\n * - 44px+ touch targets (WCAG 2.2 AAA)\n * - 2 variants: default, destructive\n * - 3 sizes: sm, default, lg\n * - Indeterminate state support\n * - Spring animation for checkmark\n * - RTL support\n * - Works with React Aria slot system (for Table integration)\n *\n * @see React Aria Checkbox: https://react-spectrum.adobe.com/react-aria/Checkbox.html\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport {\n forwardRef,\n cloneElement,\n isValidElement,\n type ReactNode,\n type ReactElement,\n} from 'react';\nimport { Checkbox as AriaCheckbox } from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { FOCUS_STYLES, HIGH_CONTRAST_FOCUS } from '../../styles/interaction-states';\nimport type { CheckboxProps } from './Checkbox.types';\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Checkbox container variants\n * Controls the overall checkbox layout with touch target\n */\nconst checkboxContainerVariants = cva(\n [\n \"group inline-flex items-center gap-2 cursor-pointer\",\n \"transition-colors duration-200\",\n \"rtl:flex-row-reverse\",\n FOCUS_STYLES,\n HIGH_CONTRAST_FOCUS,\n ].join(\" \"),\n {\n variants: {\n size: {\n sm: \"min-h-[44px] text-sm\",\n default: \"min-h-[44px] text-sm\",\n lg: \"min-h-[48px] text-base\",\n },\n isDisabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n },\n defaultVariants: {\n size: \"default\",\n isDisabled: false,\n },\n }\n);\n\n/**\n * Checkbox indicator (the box) variants\n */\nconst checkboxIndicatorVariants = cva(\n \"flex-shrink-0 rounded-sm border-2 flex items-center justify-center transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--primary)]\",\n \"data-[selected]:bg-[var(--primary)]\",\n \"data-[indeterminate]:border-[var(--primary)]\",\n \"data-[indeterminate]:bg-[var(--primary)]\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--destructive)]\",\n \"data-[selected]:bg-[var(--destructive)]\",\n \"data-[indeterminate]:border-[var(--destructive)]\",\n \"data-[indeterminate]:bg-[var(--destructive)]\",\n ].join(\" \"),\n },\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n isInvalid: {\n true: \"border-[var(--destructive)]\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n isInvalid: false,\n },\n }\n);\n\n/**\n * Checkmark icon variants with spring animation\n */\nconst checkmarkVariants = cva(\n [\n \"transition-transform duration-200\",\n \"[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]\",\n \"motion-reduce:transition-none\",\n \"scale-0 data-[selected]:scale-100 data-[indeterminate]:scale-100\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: \"text-[var(--primary-foreground)]\",\n destructive: \"text-[var(--destructive-foreground)]\",\n },\n size: {\n sm: \"h-3 w-3\",\n default: \"h-3.5 w-3.5\",\n lg: \"h-4 w-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n// ============================================================================\n// Icon Components\n// ============================================================================\n\n/**\n * Checkmark SVG icon\n */\nfunction CheckmarkIcon({ className, ...props }: { className?: string; 'data-selected'?: boolean; 'data-indeterminate'?: boolean }): ReactNode {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * Minus (indeterminate) SVG icon\n */\nfunction MinusIcon({ className, ...props }: { className?: string; 'data-selected'?: boolean; 'data-indeterminate'?: boolean }): ReactNode {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Checkbox Component\n// ============================================================================\n\n/**\n * Standalone Checkbox component\n * Accessible checkbox that can be used independently or within Table\n */\nconst Checkbox = forwardRef<HTMLLabelElement, CheckboxProps>(\n (\n {\n isSelected,\n defaultSelected,\n isDisabled,\n isReadOnly,\n isIndeterminate,\n isInvalid = false,\n isRequired = false,\n onChange,\n onFocusChange,\n value,\n name,\n size = 'default',\n variant = 'default',\n label,\n description,\n selectedIcon,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n slot,\n },\n ref\n ) => {\n // Only set these props when explicitly true to allow slot system to control them\n // (e.g., Table's selection slot injects isIndeterminate for partial selection)\n const computedIsDisabled = isDisabled || undefined;\n const computedIsReadOnly = isReadOnly || undefined;\n const computedIsIndeterminate = isIndeterminate || undefined;\n // Render the icon based on state\n const renderIcon = (isChecked: boolean, isIndet: boolean) => {\n const iconClassName = cn(checkmarkVariants({ variant, size }));\n const dataSelected = isChecked || undefined;\n const dataIndeterminate = isIndet || undefined;\n\n // For indeterminate state, always show minus\n if (isIndet) {\n return (\n <MinusIcon\n className={iconClassName}\n data-selected={dataSelected}\n data-indeterminate={dataIndeterminate}\n />\n );\n }\n\n // Custom icon support\n if (selectedIcon && isChecked) {\n if (isValidElement(selectedIcon)) {\n const iconElement = selectedIcon as ReactElement<{ className?: string; 'data-selected'?: boolean }>;\n return cloneElement(iconElement, {\n className: cn(iconClassName, iconElement.props.className),\n 'data-selected': dataSelected,\n });\n }\n return <span className={iconClassName} data-selected={dataSelected}>{selectedIcon}</span>;\n }\n\n // Default checkmark\n return (\n <CheckmarkIcon\n className={iconClassName}\n data-selected={dataSelected}\n data-indeterminate={dataIndeterminate}\n />\n );\n };\n\n return (\n <AriaCheckbox\n ref={ref}\n id={id}\n isSelected={isSelected}\n defaultSelected={defaultSelected}\n isDisabled={computedIsDisabled}\n isReadOnly={computedIsReadOnly}\n isIndeterminate={computedIsIndeterminate}\n isInvalid={isInvalid}\n isRequired={isRequired}\n onChange={onChange}\n onFocusChange={onFocusChange}\n value={value}\n name={name}\n slot={slot}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid={dataTestId}\n className={(renderProps) =>\n cn(\n checkboxContainerVariants({\n size,\n isDisabled: renderProps.isDisabled,\n }),\n className\n )\n }\n >\n {(renderProps) => (\n <>\n {/* Checkbox indicator (the box) */}\n <div\n className={checkboxIndicatorVariants({\n variant,\n size,\n isInvalid: renderProps.isInvalid,\n })}\n data-selected={renderProps.isSelected || undefined}\n data-indeterminate={renderProps.isIndeterminate || undefined}\n >\n {renderIcon(renderProps.isSelected, renderProps.isIndeterminate)}\n </div>\n\n {/* Label and description */}\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <span className=\"font-medium text-[var(--content-foreground)]\">\n {label}\n </span>\n )}\n {description && (\n <span className=\"text-sm text-[var(--menu-muted)]\">\n {description}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaCheckbox>\n );\n }\n);\n\nCheckbox.displayName = \"Checkbox\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n Checkbox,\n checkboxContainerVariants,\n checkboxIndicatorVariants,\n checkmarkVariants,\n CheckmarkIcon,\n MinusIcon,\n};\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode } from 'react';\nimport type {\n CheckboxGroupProps as AriaCheckboxGroupProps,\n CheckboxProps as AriaCheckboxProps,\n} from 'react-aria-components';\n\n/**\n * CheckboxGroup variant schema\n * Only 2 variants: default and destructive (matching RadioGroup)\n *\n * @see checkboxgroup-prd.md US-2 (Style Variants)\n */\nexport const CheckboxGroupVariantSchema = z.enum(['default', 'destructive']);\nexport type CheckboxGroupVariant = z.infer<typeof CheckboxGroupVariantSchema>;\n\n/**\n * CheckboxGroup size schema\n * All sizes maintain 44px minimum height for WCAG 2.2 AAA compliance\n *\n * @see checkboxgroup-prd.md US-3 (Size Variants)\n * @see constitution.md Principle IV (Accessibility First)\n */\nexport const CheckboxGroupSizeSchema = z.enum(['sm', 'default', 'lg']);\nexport type CheckboxGroupSize = z.infer<typeof CheckboxGroupSizeSchema>;\n\n/**\n * CheckboxGroup orientation schema\n *\n * @see checkboxgroup-prd.md US-5 (Orientation Support)\n */\nexport const CheckboxGroupOrientationSchema = z.enum(['vertical', 'horizontal']);\nexport type CheckboxGroupOrientation = z.infer<typeof CheckboxGroupOrientationSchema>;\n\n/**\n * CheckboxGroup root component props schema\n *\n * Key difference from RadioGroup: value is string[] (multi-select)\n *\n * @see checkboxgroup-prd.md US-1 (Basic Multi-Selection)\n * @see checkboxgroup-prd.md US-4 (Labels, Descriptions, Errors)\n * @see checkboxgroup-prd.md US-6 (Validation States)\n */\nexport const CheckboxGroupPropsSchema = BaseComponentPropsSchema.extend({\n // Display props (US-4)\n label: z.string().optional(),\n description: z.string().optional(),\n errorMessage: z.string().optional(),\n\n // Selection props (US-1) - array for multi-select (key difference from RadioGroup)\n value: z.array(z.string()).optional(),\n defaultValue: z.array(z.string()).optional(),\n\n // State props (US-6)\n isDisabled: z.boolean().optional().default(false),\n isReadOnly: z.boolean().optional().default(false),\n isRequired: z.boolean().optional().default(false),\n isInvalid: z.boolean().optional().default(false),\n\n // Layout props (US-5)\n orientation: CheckboxGroupOrientationSchema.optional().default('vertical'),\n\n // Variant props (US-2, US-3)\n variant: CheckboxGroupVariantSchema.optional().default('default'),\n size: CheckboxGroupSizeSchema.optional().default('default'),\n\n // Form props (US-6)\n name: z.string().optional(),\n\n // Event handlers\n onChange: z.custom<(value: string[]) => void>().optional(),\n onFocusChange: z.custom<(isFocused: boolean) => void>().optional(),\n\n // Children (Checkbox components)\n children: z.custom<ReactNode>(),\n});\n\nexport type CheckboxGroupProps = z.infer<typeof CheckboxGroupPropsSchema> &\n Omit<AriaCheckboxGroupProps, keyof z.infer<typeof CheckboxGroupPropsSchema>>;\n\n/**\n * Checkbox item component props schema\n *\n * @see checkboxgroup-prd.md US-1 (Basic Multi-Selection)\n * @see checkboxgroup-prd.md US-7 (Rich Content Support)\n */\nexport const CheckboxPropsSchema = BaseComponentPropsSchema.extend({\n // Item value (required)\n value: z.string(),\n\n // Disabled state (individual item)\n isDisabled: z.boolean().optional().default(false),\n\n // Item content - accepts any ReactNode for flexible children\n children: z.custom<ReactNode>(),\n\n // Optional className for custom styling\n className: z.string().optional(),\n\n // Custom icon to display when selected (defaults to checkmark)\n // Useful for destructive variants where an X icon may be more appropriate\n selectedIcon: z.custom<ReactNode>().optional(),\n});\n\nexport type CheckboxProps = z.infer<typeof CheckboxPropsSchema> &\n Omit<AriaCheckboxProps, keyof z.infer<typeof CheckboxPropsSchema>>;\n\n/**\n * Checkbox.Label sub-component props schema\n * Helper component for styled label within Checkbox item\n *\n * @see checkboxgroup-prd.md US-7 (Rich Content Support)\n */\nexport const CheckboxLabelPropsSchema = z.object({\n // Label content\n children: z.custom<ReactNode>(),\n\n // Optional className for custom styling\n className: z.string().optional(),\n});\n\nexport type CheckboxLabelProps = z.infer<typeof CheckboxLabelPropsSchema>;\n\n/**\n * Checkbox.Description sub-component props schema\n * Helper component for styled description within Checkbox item (muted text)\n *\n * @see checkboxgroup-prd.md US-7 (Rich Content Support)\n */\nexport const CheckboxDescriptionPropsSchema = z.object({\n // Description content\n children: z.custom<ReactNode>(),\n\n // Optional className for custom styling\n className: z.string().optional(),\n});\n\nexport type CheckboxDescriptionProps = z.infer<typeof CheckboxDescriptionPropsSchema>;\n\n/**\n * CVA variant configuration types\n * Used for class-variance-authority integration\n */\nexport type CheckboxGroupVariantType = CheckboxGroupVariant;\nexport type CheckboxGroupSizeType = CheckboxGroupSize;\nexport type CheckboxGroupOrientationType = CheckboxGroupOrientation;\n","\"use client\";\n\n/**\n * CheckboxGroup Component\n * Accessible multi-selection checkbox group with React Aria primitives and CVA styling\n *\n * Key Features:\n * - Bordered container design with explicit 44px+ touch targets\n * - 2 variants: default, destructive (no outline per clarification)\n * - 3 sizes: sm (44px), default (48px), lg (56px)\n * - Tab moves focus between checkboxes, Space toggles (standard checkbox behavior)\n * - Error styling on ALL items (cognitive accessibility)\n * - Spring animation for checkmark indicator\n * - RTL support (indicator auto-flips)\n * - Checkbox.Label and Checkbox.Description sub-components\n * - value: string[] for multi-select (key difference from RadioGroup)\n *\n * @see checkboxgroup-prd.md (Product Requirements)\n * @see plan.md (12 Key Clarifications)\n * @see React Aria CheckboxGroup: https://react-spectrum.adobe.com/react-aria/CheckboxGroup.html\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport {\n forwardRef,\n createContext,\n useContext,\n useId,\n cloneElement,\n isValidElement,\n type ReactNode,\n type ForwardedRef,\n type ReactElement,\n} from 'react';\nimport {\n CheckboxGroup as AriaCheckboxGroup,\n Checkbox as AriaCheckbox,\n Label,\n Text,\n FieldError,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { FOCUS_STYLES, HIGH_CONTRAST_FOCUS } from '../../styles/interaction-states';\nimport type {\n CheckboxGroupProps,\n CheckboxProps,\n CheckboxLabelProps,\n CheckboxDescriptionProps,\n CheckboxGroupVariant,\n CheckboxGroupSize,\n} from './CheckboxGroup.types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * CheckboxGroup context value\n * Includes isDisabled and isReadOnly per clarification (plan.md #10)\n */\ninterface CheckboxGroupContextValue {\n variant: CheckboxGroupVariant;\n size: CheckboxGroupSize;\n isInvalid: boolean;\n isDisabled: boolean;\n isReadOnly: boolean;\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue>({\n variant: 'default',\n size: 'default',\n isInvalid: false,\n isDisabled: false,\n isReadOnly: false,\n});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * CheckboxGroup container variants\n * Controls orientation and spacing (gap-2 = 8px per clarification)\n */\nconst checkboxGroupVariants = cva(\n // Base: flex container\n \"flex\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col gap-2\",\n horizontal: \"flex-row flex-wrap gap-2\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n);\n\n/**\n * Checkbox item bordered container variants\n * Bordered container design with explicit touch targets\n * All sizes maintain 44px minimum height (WCAG 2.2 AAA)\n * All sizes use rounded-md (6px) per clarification\n */\nconst checkboxItemVariants = cva(\n // Base: bordered container with flex layout, RTL support\n [\n \"flex items-center gap-3 rounded-md border cursor-pointer\",\n \"transition-colors duration-200\",\n \"rtl:flex-row-reverse\", // RTL: indicator flips to right\n // Focus ring on entire container\n FOCUS_STYLES,\n HIGH_CONTRAST_FOCUS,\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[hovered]:bg-[var(--accent)]/10\",\n \"data-[selected]:border-[var(--primary)]\",\n \"data-[selected]:bg-[var(--primary)]/10\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[hovered]:bg-[var(--destructive)]/10\",\n \"data-[selected]:border-[var(--destructive)]\",\n \"data-[selected]:bg-[var(--destructive)]/10\",\n ].join(\" \"),\n },\n size: {\n sm: \"min-h-[44px] py-2 px-3 text-sm\",\n default: \"min-h-[48px] py-3 px-4 text-sm\",\n lg: \"min-h-[56px] py-4 px-5 text-base\",\n },\n isDisabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n isReadOnly: {\n // Subtle visual cue per clarification\n true: \"cursor-default\",\n false: \"\",\n },\n isInvalid: {\n // Error: ALL items get destructive border (cognitive accessibility)\n true: \"border-[var(--destructive)]\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n isDisabled: false,\n isReadOnly: false,\n isInvalid: false,\n },\n }\n);\n\n/**\n * Square indicator (checkbox box) variants\n * Uses rounded-sm (2px) for square appearance (unlike RadioGroup's circle)\n */\nconst checkboxIndicatorVariants = cva(\n // Base: square with border, flex-shrink-0 to prevent squishing\n \"flex-shrink-0 rounded-sm border-2 flex items-center justify-center transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--primary)]\",\n \"data-[selected]:bg-[var(--primary)]\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--destructive)]\",\n \"data-[selected]:bg-[var(--destructive)]\",\n ].join(\" \"),\n },\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n/**\n * Checkmark SVG variants\n * Spring animation: cubic-bezier(0.34, 1.56, 0.64, 1) with slight overshoot\n */\nconst checkmarkVariants = cva(\n // Base: centered checkmark with spring animation\n [\n \"transition-transform duration-200\",\n // Spring animation with overshoot\n \"[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]\",\n // Respect reduced motion preference\n \"motion-reduce:transition-none\",\n // Scale from 0 to 1 on selection\n \"scale-0 data-[selected]:scale-100\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: \"text-[var(--primary-foreground)]\",\n destructive: \"text-[var(--destructive-foreground)]\",\n },\n size: {\n sm: \"h-3 w-3\",\n default: \"h-3.5 w-3.5\",\n lg: \"h-4 w-4\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n// ============================================================================\n// Icon Components\n// ============================================================================\n\n/**\n * Checkmark SVG icon (default)\n * Used inside the checkbox indicator when selected\n */\nfunction CheckmarkIcon({ className, ...props }: { className?: string; 'data-selected'?: boolean }): ReactNode {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\n/**\n * Times (X) SVG icon\n * Alternative icon for destructive or exclusion selections\n * @example <Checkbox value=\"exclude\" selectedIcon={<TimesIcon />}>Exclude this item</Checkbox>\n */\nfunction TimesIcon({ className, ...props }: { className?: string; 'data-selected'?: boolean }): ReactNode {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={3}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n {...props}\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\n/**\n * Checkbox.Label - Styled label for checkbox item content\n */\nfunction CheckboxLabel({ children, className }: CheckboxLabelProps): ReactNode {\n return (\n <span className={cn(\"font-medium text-[var(--content-foreground)]\", className)}>\n {children}\n </span>\n );\n}\n\nCheckboxLabel.displayName = \"Checkbox.Label\";\n\n/**\n * Checkbox.Description - Styled description for checkbox item content (muted)\n */\nfunction CheckboxDescription({ children, className }: CheckboxDescriptionProps): ReactNode {\n return (\n <span className={cn(\"text-sm text-[var(--menu-muted)]\", className)}>\n {children}\n </span>\n );\n}\n\nCheckboxDescription.displayName = \"Checkbox.Description\";\n\n// ============================================================================\n// Checkbox Component\n// ============================================================================\n\n/**\n * Checkbox item component with bordered container design\n */\nfunction CheckboxComponent({ value, isDisabled, children, className, selectedIcon }: CheckboxProps): ReactNode {\n const { variant, size, isInvalid, isDisabled: groupDisabled, isReadOnly } = useContext(CheckboxGroupContext);\n\n // Individual isDisabled OR group isDisabled\n const effectiveDisabled = isDisabled || groupDisabled;\n\n // Render the selected icon - use custom icon if provided, otherwise default CheckmarkIcon\n const renderSelectedIcon = (isSelected: boolean) => {\n const iconClassName = cn(checkmarkVariants({ variant, size }));\n const dataSelected = isSelected || undefined;\n\n if (selectedIcon) {\n // Clone the custom icon element to add our styling classes\n if (isValidElement(selectedIcon)) {\n const iconElement = selectedIcon as ReactElement<{ className?: string; 'data-selected'?: boolean }>;\n return cloneElement(iconElement, {\n className: cn(iconClassName, iconElement.props.className),\n 'data-selected': dataSelected,\n });\n }\n // If it's not a valid element (e.g., just text), wrap it\n return <span className={iconClassName} data-selected={dataSelected}>{selectedIcon}</span>;\n }\n\n // Default: CheckmarkIcon\n return (\n <CheckmarkIcon\n className={iconClassName}\n data-selected={dataSelected}\n />\n );\n };\n\n return (\n <AriaCheckbox\n value={value}\n isDisabled={effectiveDisabled}\n className={(renderProps) =>\n cn(\n checkboxItemVariants({\n variant,\n size,\n isDisabled: renderProps.isDisabled,\n isReadOnly,\n isInvalid,\n }),\n className\n )\n }\n >\n {(renderProps) => (\n <>\n {/* Square indicator */}\n <div\n className={checkboxIndicatorVariants({ variant, size })}\n data-selected={renderProps.isSelected || undefined}\n >\n {/* Icon with spring animation */}\n {renderSelectedIcon(renderProps.isSelected)}\n </div>\n\n {/* Children content (flexible - text, icons, complex layouts) */}\n <div className=\"flex-1 flex flex-col\">\n {children}\n </div>\n </>\n )}\n </AriaCheckbox>\n );\n}\n\n// Attach sub-components\nconst Checkbox = Object.assign(CheckboxComponent, {\n Label: CheckboxLabel,\n Description: CheckboxDescription,\n}) as typeof CheckboxComponent & {\n Label: typeof CheckboxLabel;\n Description: typeof CheckboxDescription;\n displayName: string;\n};\n\nCheckbox.displayName = \"Checkbox\";\n\n// ============================================================================\n// Duplicate Value Warning\n// ============================================================================\n\n/**\n * Deduplicates array and warns in development mode\n * Per clarification: dedupe internally + console.warn in development\n */\nfunction dedupeWithWarning(values: string[] | undefined, componentName: string): string[] | undefined {\n if (!values) return values;\n\n const uniqueValues = [...new Set(values)];\n\n if (process.env.NODE_ENV !== 'production' && uniqueValues.length !== values.length) {\n console.warn(\n `[${componentName}] Received duplicate values in value/defaultValue prop. ` +\n `Original: [${values.join(', ')}], Deduplicated: [${uniqueValues.join(', ')}]. ` +\n `Duplicate values are automatically removed.`\n );\n }\n\n return uniqueValues;\n}\n\n// ============================================================================\n// CheckboxGroup Component\n// ============================================================================\n\n/**\n * CheckboxGroup root component\n * Accessible multi-selection control with bordered container design\n */\nconst CheckboxGroup = forwardRef<HTMLDivElement, CheckboxGroupProps>(\n function CheckboxGroup(props: CheckboxGroupProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n // Display props\n label,\n description,\n errorMessage,\n // Selection props (string[] for multi-select)\n value,\n defaultValue,\n // State props\n isDisabled = false,\n isReadOnly = false,\n isRequired = false,\n isInvalid = false,\n // Layout props\n orientation = 'vertical',\n // Variant props\n variant = 'default',\n size = 'default',\n // Form props\n name,\n // Event handlers\n onChange,\n onFocusChange,\n // Standard props\n className,\n children,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n ...restProps\n } = props;\n\n // Generate unique IDs for accessibility\n const generatedId = useId();\n const checkboxGroupId = id ?? generatedId;\n const labelId = `${checkboxGroupId}-label`;\n const descriptionId = `${checkboxGroupId}-description`;\n const errorId = `${checkboxGroupId}-error`;\n\n // Build aria-describedby from description and error\n const describedByParts: string[] = [];\n if (ariaDescribedby) describedByParts.push(ariaDescribedby);\n if (description) describedByParts.push(descriptionId);\n if (isInvalid && errorMessage) describedByParts.push(errorId);\n const computedAriaDescribedBy = describedByParts.length > 0\n ? describedByParts.join(' ')\n : undefined;\n\n // Dedupe values with warning in development\n const dedupedValue = dedupeWithWarning(value, 'CheckboxGroup');\n const dedupedDefaultValue = dedupeWithWarning(defaultValue, 'CheckboxGroup');\n\n return (\n <CheckboxGroupContext.Provider value={{ variant, size, isInvalid, isDisabled, isReadOnly }}>\n <AriaCheckboxGroup\n ref={ref}\n id={checkboxGroupId}\n name={name}\n value={dedupedValue}\n defaultValue={dedupedDefaultValue}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n isInvalid={isInvalid}\n onChange={onChange}\n onFocusChange={onFocusChange}\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : ariaLabelledby}\n aria-describedby={computedAriaDescribedBy}\n aria-orientation={orientation}\n aria-required={isRequired || undefined}\n aria-invalid={isInvalid || undefined}\n data-testid={dataTestId}\n className={cn(\"flex flex-col gap-1.5\", className)}\n {...restProps}\n >\n {/* Label with optional required asterisk */}\n {label && (\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive)]\" aria-hidden=\"true\">\n *\n </span>\n )}\n </Label>\n )}\n\n {/* Description */}\n {description && (\n <Text\n id={descriptionId}\n slot=\"description\"\n className=\"text-sm text-[var(--menu-muted)]\"\n >\n {description}\n </Text>\n )}\n\n {/* Checkbox items container with orientation */}\n <div className={checkboxGroupVariants({ orientation })}>\n {children}\n </div>\n\n {/* Error message with role=\"alert\" for screen reader announcements */}\n {isInvalid && errorMessage && (\n <FieldError\n id={errorId}\n className=\"text-sm text-[var(--destructive)]\"\n >\n <span role=\"alert\">{errorMessage}</span>\n </FieldError>\n )}\n </AriaCheckboxGroup>\n </CheckboxGroupContext.Provider>\n );\n }\n);\n\nCheckboxGroup.displayName = \"CheckboxGroup\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n CheckboxGroup,\n Checkbox,\n checkboxGroupVariants,\n checkboxItemVariants,\n checkboxIndicatorVariants,\n checkmarkVariants,\n // Icon exports for custom selectedIcon usage\n CheckmarkIcon,\n TimesIcon,\n};\n","'use client';\n\n/**\n * Chart Component\n *\n * Accessible, keyboard-interactive chart component supporting bar and line types.\n * Features 2D keyboard navigation, screen reader announcements, and WCAG 2.2 AAA compliance.\n *\n * @see chart-prd.md (Product Requirements)\n * @see plan.md (Implementation Plan)\n */\n\nimport {\n forwardRef,\n memo,\n useRef,\n useCallback,\n useMemo,\n useId,\n type ReactElement,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport { chartVariants } from './chart.variants';\nimport { ChartProvider, useChartContext } from './ChartContext';\nimport { ChartSVG } from './ChartSVG';\nimport { ChartTooltip } from './ChartTooltip';\nimport { ChartLegend } from './ChartLegend';\nimport { ChartAnnouncer } from './ChartAnnouncer';\nimport { ChartDataTable } from './ChartDataTable';\nimport { useChartKeyboard } from './useChartKeyboard';\nimport { useRovingTabIndex2D } from './useRovingTabIndex';\nimport type { ChartProps } from './Chart.types';\n\n// ============================================================================\n// Inner Chart Component (has access to context)\n// ============================================================================\n\ninterface ChartInnerProps {\n chartId: string;\n}\n\nfunction ChartInner({ chartId }: ChartInnerProps): ReactElement {\n const ctx = useChartContext();\n const {\n data,\n type,\n title,\n xAxisLabel,\n yAxisLabel,\n showTooltip,\n showGrid,\n showLegend,\n dimensions,\n scales,\n announcement,\n isTooltipVisible,\n tooltipPoint,\n currentTrend,\n currentTrendDirection,\n selectedPoint,\n getTabIndex,\n formatValue,\n getSeriesColor,\n getPointCoordinates,\n setFocus,\n selectPoint,\n clearSelection,\n showTooltipAt,\n hideTooltip,\n } = ctx;\n\n const titleId = `${chartId}-title`;\n const descId = `${chartId}-desc`;\n\n // Roving tabindex for keyboard navigation\n const roving = useRovingTabIndex2D({\n rows: data.length,\n cols: (row) => data[row]?.data.length || 0,\n onFocusChange: (seriesIndex, pointIndex) => {\n setFocus(seriesIndex, pointIndex);\n },\n });\n\n // Keyboard handler\n const { onKeyDown } = useChartKeyboard({\n roving,\n onSelect: () => {\n selectPoint(roving.focusedRow, roving.focusedCol);\n },\n onClear: () => {\n clearSelection();\n },\n });\n\n // Point focus handler\n const handlePointFocus = useCallback(\n (seriesIndex: number, pointIndex: number): void => {\n roving.setFocus(seriesIndex, pointIndex);\n showTooltipAt(seriesIndex, pointIndex);\n },\n [roving, showTooltipAt]\n );\n\n // Point blur handler\n const handlePointBlur = useCallback((): void => {\n // Don't hide tooltip immediately - let it stay visible during keyboard nav\n }, []);\n\n // Point hover handler\n const handlePointHover = useCallback(\n (seriesIndex: number, pointIndex: number): void => {\n showTooltipAt(seriesIndex, pointIndex);\n },\n [showTooltipAt]\n );\n\n // Point hover end handler\n const handlePointHoverEnd = useCallback((): void => {\n hideTooltip();\n }, [hideTooltip]);\n\n // Memoized tooltip position to prevent recalculation on every render\n const tooltipPosition = useMemo((): { x: number; y: number } => {\n if (!tooltipPoint) return { x: 0, y: 0 };\n const coords = getPointCoordinates(tooltipPoint.series, tooltipPoint.point);\n return coords || { x: 0, y: 0 };\n }, [tooltipPoint, getPointCoordinates]);\n\n // Memoized tooltip data derivations\n const tooltipSeries = useMemo(\n () => (tooltipPoint ? data[tooltipPoint.series] : null),\n [tooltipPoint, data]\n );\n const tooltipPointData = useMemo(\n () => (tooltipPoint ? tooltipSeries?.data[tooltipPoint.point] : null),\n [tooltipPoint, tooltipSeries]\n );\n\n // Memoized legend visibility check\n const shouldShowLegend = useMemo(\n () => showLegend ?? data.length > 1,\n [showLegend, data.length]\n );\n\n return (\n <>\n {/* Screen reader announcer */}\n <ChartAnnouncer announcement={announcement} />\n\n {/* Chart container with proper stacking context */}\n <div className=\"relative\">\n {/* Main SVG chart - z-0 base layer */}\n <div className=\"relative z-0\">\n <ChartSVG\n type={type}\n data={data}\n dimensions={dimensions}\n scales={scales}\n titleId={titleId}\n descId={descId}\n showGrid={showGrid}\n xAxisLabel={xAxisLabel}\n yAxisLabel={yAxisLabel}\n getSeriesColor={getSeriesColor}\n getTabIndex={getTabIndex}\n selectedPoint={selectedPoint}\n formatValue={formatValue}\n onKeyDown={onKeyDown}\n onPointFocus={handlePointFocus}\n onPointBlur={handlePointBlur}\n onPointHover={handlePointHover}\n onPointHoverEnd={handlePointHoverEnd}\n />\n </div>\n\n {/* Tooltip - z-50 above chart */}\n {showTooltip && tooltipPointData && tooltipSeries && (\n <ChartTooltip\n visible={isTooltipVisible}\n x={tooltipPosition.x}\n y={tooltipPosition.y}\n seriesName={tooltipSeries.name}\n label={tooltipPointData.label}\n value={formatValue(tooltipPointData.value)}\n chartWidth={dimensions.width}\n chartHeight={dimensions.height}\n trend={currentTrend}\n trendDirection={currentTrendDirection}\n />\n )}\n </div>\n\n {/* Legend */}\n <ChartLegend\n data={data}\n visible={shouldShowLegend}\n type={type}\n getSeriesColor={getSeriesColor}\n />\n\n {/* Hidden data table for screen readers */}\n <ChartDataTable\n data={data}\n title={title}\n xAxisLabel={xAxisLabel}\n yAxisLabel={yAxisLabel}\n formatValue={formatValue}\n allLabels={scales.allLabels}\n />\n </>\n );\n}\n\n// ============================================================================\n// Main Chart Component\n// ============================================================================\n\nconst ChartComponent = forwardRef<HTMLElement, ChartProps>(\n (\n {\n data,\n type,\n title,\n description,\n xAxisLabel,\n yAxisLabel,\n variant = 'default',\n className,\n showTooltip = true,\n showGrid = true,\n showLegend,\n announceTrends = false,\n trendUpFormat = 'up {percent}% from previous',\n trendDownFormat = 'down {percent}% from previous',\n startAtZero = true,\n reducedMotion,\n onPointFocus,\n onPointSelect,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n ...rest\n },\n ref\n ): ReactElement => {\n // Container ref for dimensions\n const containerRef = useRef<HTMLElement>(null);\n\n // Generate unique IDs for accessibility (stable across SSR/hydration)\n const generatedId = useId();\n const chartId = id || `chart-${generatedId}`;\n const titleId = `${chartId}-title`;\n const descId = `${chartId}-desc`;\n\n // Determine if legend should be shown\n const shouldShowLegend = showLegend ?? data.length > 1;\n\n return (\n <figure\n ref={(node) => {\n // Handle both refs\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n (containerRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n id={chartId}\n role=\"figure\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby || titleId}\n aria-describedby={ariaDescribedby || descId}\n data-testid={dataTestId}\n className={cn(chartVariants({ variant }), 'p-4', className)}\n {...rest}\n >\n <figcaption className=\"sr-only\">\n <span id={titleId}>{title}</span>\n <span id={descId}>{description}</span>\n </figcaption>\n\n <ChartProvider\n containerRef={containerRef}\n data={data}\n type={type}\n title={title}\n description={description}\n xAxisLabel={xAxisLabel}\n yAxisLabel={yAxisLabel}\n showTooltip={showTooltip}\n showGrid={showGrid}\n showLegend={shouldShowLegend}\n announceTrends={announceTrends}\n trendUpFormat={trendUpFormat}\n trendDownFormat={trendDownFormat}\n startAtZero={startAtZero}\n reducedMotion={reducedMotion}\n onPointFocus={onPointFocus}\n onPointSelect={onPointSelect}\n >\n <ChartInner chartId={chartId} />\n </ChartProvider>\n </figure>\n );\n }\n);\n\nChartComponent.displayName = 'Chart';\n\n/**\n * Memoized Chart component for performance\n */\nexport const Chart = memo(ChartComponent);\nChart.displayName = 'Chart';\n","/**\n * Chart Component CVA Variants\n *\n * Defines class-variance-authority variants for chart styling.\n * Implements responsive, theme-aware styling via CSS variables.\n *\n * @see plan.md CVA Variants section\n * @see chart-prd.md FR-013 (Theme Integration)\n */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// ============================================================================\n// Chart Container Variants\n// ============================================================================\n\n/**\n * Chart container variants\n * Applies to the outer figure element\n */\nexport const chartVariants = cva(\n // Base classes\n 'relative w-full overflow-hidden rounded-lg border',\n {\n variants: {\n variant: {\n default: 'border-[var(--border)] bg-[var(--content-background)]',\n muted: 'border-[var(--accent-background)] bg-[var(--accent-background)]/50',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport type ChartVariants = VariantProps<typeof chartVariants>;\n\n// ============================================================================\n// Data Point Variants\n// ============================================================================\n\n/**\n * Data point variants\n * Applies to individual bar rects or line circles\n * Note: Fill/stroke colors are applied dynamically via getSeriesColor\n */\nexport const dataPointVariants = cva(\n // Base classes\n 'cursor-pointer focus-visible:outline-none',\n {\n variants: {\n type: {\n bar: '', // Fill color set dynamically per series\n line: 'stroke-2', // Stroke color set dynamically per series\n },\n state: {\n default: '',\n focused: '', // Focus ring provides visual feedback, no scale needed for data points\n selected: 'opacity-80',\n },\n },\n defaultVariants: {\n type: 'bar',\n state: 'default',\n },\n }\n);\n\nexport type DataPointVariants = VariantProps<typeof dataPointVariants>;\n\n// ============================================================================\n// Focus Ring Variants\n// ============================================================================\n\n/**\n * Focus ring variants for keyboard navigation\n * Applied to SVG elements that receive keyboard focus\n */\nexport const focusRingVariants = cva(\n // Base classes\n 'pointer-events-none',\n {\n variants: {\n visible: {\n true: 'opacity-100',\n false: 'opacity-0',\n },\n },\n defaultVariants: {\n visible: false,\n },\n }\n);\n\nexport type FocusRingVariants = VariantProps<typeof focusRingVariants>;\n\n// ============================================================================\n// Legend Variants\n// ============================================================================\n\n/**\n * Legend variants\n * Applied to the legend container below the chart\n */\nexport const legendVariants = cva(\n // Base classes - horizontal flex layout below chart\n 'flex flex-wrap items-center justify-center gap-4 px-4 py-2',\n {\n variants: {\n visible: {\n true: '',\n false: 'hidden',\n },\n },\n defaultVariants: {\n visible: true,\n },\n }\n);\n\nexport type LegendVariants = VariantProps<typeof legendVariants>;\n\n/*\n * High Contrast Mode Support\n *\n * These styles are applied via CSS when forced-colors is active.\n * Add to a global CSS file or component styles:\n *\n * @media (forced-colors: active) {\n * .chart-data-point {\n * forced-color-adjust: none;\n * stroke: CanvasText;\n * stroke-width: 2px;\n * }\n * .chart-bar {\n * fill: Highlight;\n * stroke: CanvasText;\n * }\n * .chart-line {\n * stroke: LinkText;\n * }\n * .chart-focus-ring {\n * stroke: Highlight;\n * stroke-width: 3px;\n * }\n * }\n */\n","/**\n * Chart Component Constants\n *\n * Defines constants and defaults for chart dimensions, styling, and algorithms.\n * All values follow WCAG 2.2 AAA guidelines where applicable.\n *\n * @see plan.md Constants & Defaults section\n */\n\n// ============================================================================\n// Aspect Ratio & Dimensions\n// ============================================================================\n\n/**\n * Chart aspect ratio (16:9 landscape)\n * Height = width * CHART_ASPECT_RATIO\n */\nexport const CHART_ASPECT_RATIO = 9 / 16; // 0.5625\n\n/**\n * Padding around the plot area (in pixels)\n * Provides space for axes, labels, and legend\n */\nexport const CHART_PADDING = {\n top: 20, // Space for title overflow\n right: 20, // Space for y-axis label\n bottom: 60, // Space for x-axis labels + legend\n left: 60, // Space for y-axis labels\n} as const;\n\n/**\n * Minimum chart dimensions to ensure readability\n */\nexport const MIN_CHART_WIDTH = 300;\nexport const MIN_CHART_HEIGHT = 169; // 300 * 9/16\n\n// ============================================================================\n// Bar Chart Constants\n// ============================================================================\n\n/**\n * Bar layout constants for grouped bar charts\n */\nexport const BAR_GROUP_PADDING = 0.2; // 20% of group width as gap between groups\nexport const BAR_PADDING = 0.1; // 10% of bar width as gap between bars in group\nexport const MIN_BAR_WIDTH = 20; // Minimum bar width in pixels\nexport const BAR_RADIUS = 4; // Border radius for bar tops\n\n// ============================================================================\n// Line Chart Constants\n// ============================================================================\n\n/**\n * Line rendering constants\n */\nexport const LINE_STROKE_WIDTH = 2;\nexport const POINT_RADIUS = 6;\nexport const POINT_HOVER_RADIUS = 8;\n\n/**\n * Stroke dash arrays for line patterns (accessibility feature)\n * Different patterns help distinguish series for colorblind users\n */\nexport const LINE_PATTERNS = {\n solid: 'none',\n dashed: '8 4', // 8px dash, 4px gap\n dotted: '2 4', // 2px dot, 4px gap\n} as const;\n\n// ============================================================================\n// Grid & Axis Constants\n// ============================================================================\n\n/**\n * Grid line constants\n */\nexport const GRID_LINE_COUNT = 5; // Number of horizontal grid lines\nexport const GRID_COLOR = 'var(--border)'; // With 70% opacity via stroke-opacity\nexport const GRID_STROKE_WIDTH = 1;\nexport const GRID_STROKE_OPACITY = 0.7;\n\n/**\n * Axis constants\n */\nexport const AXIS_COLOR = 'var(--border)';\nexport const AXIS_STROKE_WIDTH = 1;\nexport const AXIS_TICK_SIZE = 6;\nexport const AXIS_LABEL_FONT_SIZE = 12;\n\n// ============================================================================\n// Accessibility Constants\n// ============================================================================\n\n/**\n * Touch target constants (WCAG 2.2 AAA: minimum 44x44px)\n */\nexport const MIN_TOUCH_TARGET = 44;\nexport const FOCUS_RING_OFFSET = 4; // Gap between element and focus ring\nexport const FOCUS_RING_WIDTH = 2;\n\n// ============================================================================\n// Series Colors\n// ============================================================================\n\n/**\n * Default series colors using CSS variables with fallbacks\n * Maps to --chart-1 through --chart-5 if defined, otherwise uses accessible defaults\n */\nexport const DEFAULT_SERIES_COLORS = [\n 'var(--chart-1, hsl(221 83% 53%))', // Series 0 - Blue\n 'var(--chart-2, hsl(142 71% 45%))', // Series 1 - Green\n 'var(--chart-3, hsl(38 92% 50%))', // Series 2 - Orange\n 'var(--chart-4, hsl(262 83% 58%))', // Series 3 - Purple\n 'var(--chart-5, hsl(0 84% 60%))', // Series 4 - Red\n] as const;\n\n// ============================================================================\n// Y-Axis Nice Numbers Algorithm\n// ============================================================================\n\n/**\n * Calculate nice round numbers for axis labels\n * Based on \"Nice Numbers for Graph Labels\" algorithm by Paul Heckbert\n *\n * @param range - The data range (max - min)\n * @param round - Whether to round to nearest nice number\n * @returns A nice round number suitable for axis ticks\n */\nexport function niceNum(range: number, round: boolean): number {\n const exponent = Math.floor(Math.log10(range));\n const fraction = range / Math.pow(10, exponent);\n let niceFraction: number;\n\n if (round) {\n if (fraction < 1.5) niceFraction = 1;\n else if (fraction < 3) niceFraction = 2;\n else if (fraction < 7) niceFraction = 5;\n else niceFraction = 10;\n } else {\n if (fraction <= 1) niceFraction = 1;\n else if (fraction <= 2) niceFraction = 2;\n else if (fraction <= 5) niceFraction = 5;\n else niceFraction = 10;\n }\n\n return niceFraction * Math.pow(10, exponent);\n}\n\n/**\n * Calculate nice tick values for Y-axis\n *\n * @param minValue - Minimum data value\n * @param maxValue - Maximum data value\n * @param tickCount - Target number of ticks (default: 5)\n * @returns Array of nice tick values\n */\nexport function calculateYAxisTicks(\n minValue: number,\n maxValue: number,\n tickCount = 5\n): number[] {\n // Handle edge case where min equals max\n if (minValue === maxValue) {\n if (minValue === 0) {\n return [0, 25, 50, 75, 100];\n }\n // Add padding around the single value\n minValue = minValue * 0.9;\n maxValue = maxValue * 1.1;\n }\n\n const range = niceNum(maxValue - minValue, false);\n const tickSpacing = niceNum(range / (tickCount - 1), true);\n const niceMin = Math.floor(minValue / tickSpacing) * tickSpacing;\n const niceMax = Math.ceil(maxValue / tickSpacing) * tickSpacing;\n\n const ticks: number[] = [];\n for (let tick = niceMin; tick <= niceMax; tick += tickSpacing) {\n ticks.push(tick);\n }\n\n return ticks;\n}\n\n/**\n * Calculate bar layout for grouped bar charts\n *\n * @param plotWidth - Available width for the plot area\n * @param labelCount - Number of labels (x-axis categories)\n * @param seriesCount - Number of series (bars per group)\n * @param plotX - X offset of the plot area (default: 0)\n * @returns Bar layout calculations\n */\nexport function calculateBarLayout(\n plotWidth: number,\n labelCount: number,\n seriesCount: number,\n plotX = 0\n): {\n barWidth: number;\n groupWidth: number;\n getBarX: (labelIdx: number, seriesIdx: number) => number;\n} {\n // Total width per group (one group per label)\n const groupWidth = plotWidth / labelCount;\n\n // Width available for bars after group padding\n const availableWidth = groupWidth * (1 - BAR_GROUP_PADDING);\n\n // Width per bar after bar padding\n const barWidth = Math.max(\n MIN_BAR_WIDTH,\n (availableWidth / seriesCount) * (1 - BAR_PADDING)\n );\n\n // Calculate X position for a specific bar (centered within group)\n const getBarX = (labelIdx: number, seriesIdx: number): number => {\n // Center of the group for this label\n const groupCenter = plotX + groupWidth * labelIdx + groupWidth / 2;\n\n // Total width of all bars in the group (with padding between them)\n const totalBarsWidth = seriesCount * barWidth + (seriesCount - 1) * (BAR_PADDING * barWidth);\n\n // Start position of the first bar (centered in group)\n const barsStart = groupCenter - totalBarsWidth / 2;\n\n // Position for this specific bar\n return barsStart + seriesIdx * (barWidth + BAR_PADDING * barWidth);\n };\n\n return { barWidth, groupWidth, getBarX };\n}\n","'use client';\n\n/**\n * useChartDimensions Hook\n *\n * Responsive container sizing using ResizeObserver.\n * Maintains 16:9 aspect ratio and calculates plot area dimensions.\n *\n * @see plan.md Implementation Details - Responsive Container Sizing\n */\n\nimport { useState, useEffect, type RefObject } from 'react';\nimport type { ChartDimensions } from './Chart.types';\nimport {\n CHART_ASPECT_RATIO,\n CHART_PADDING,\n MIN_CHART_WIDTH,\n MIN_CHART_HEIGHT,\n} from './chart.constants';\n\n/**\n * Hook for responsive chart dimensions\n *\n * @param containerRef - Ref to the chart container element\n * @returns ChartDimensions object with width, height, padding, and plotArea\n */\nexport function useChartDimensions(\n containerRef: RefObject<HTMLElement | null>\n): ChartDimensions {\n const [dimensions, setDimensions] = useState<ChartDimensions>({\n width: MIN_CHART_WIDTH,\n height: MIN_CHART_HEIGHT,\n padding: CHART_PADDING,\n plotArea: {\n x: CHART_PADDING.left,\n y: CHART_PADDING.top,\n width: MIN_CHART_WIDTH - CHART_PADDING.left - CHART_PADDING.right,\n height: MIN_CHART_HEIGHT - CHART_PADDING.top - CHART_PADDING.bottom,\n },\n });\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const updateDimensions = (width: number): void => {\n // Enforce minimum width\n const constrainedWidth = Math.max(width, MIN_CHART_WIDTH);\n // Calculate height from aspect ratio\n const height = Math.max(\n constrainedWidth * CHART_ASPECT_RATIO,\n MIN_CHART_HEIGHT\n );\n\n // Calculate plot area (inner dimensions excluding padding)\n const plotArea = {\n x: CHART_PADDING.left,\n y: CHART_PADDING.top,\n width: constrainedWidth - CHART_PADDING.left - CHART_PADDING.right,\n height: height - CHART_PADDING.top - CHART_PADDING.bottom,\n };\n\n setDimensions({\n width: constrainedWidth,\n height,\n padding: CHART_PADDING,\n plotArea,\n });\n };\n\n // Create ResizeObserver to track container width changes\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n\n // Use contentRect.width for the actual content width\n updateDimensions(entry.contentRect.width);\n });\n\n // Initial measurement\n updateDimensions(container.getBoundingClientRect().width);\n\n // Start observing\n observer.observe(container);\n\n // Cleanup\n return () => {\n observer.disconnect();\n };\n }, [containerRef]);\n\n return dimensions;\n}\n","'use client';\n\n/**\n * useRovingTabIndex Hook\n *\n * 2D roving tabindex pattern for keyboard navigation in grid-like widgets.\n * Supports navigation between series (rows) and points (columns).\n *\n * @see plan.md Decision 2: Keyboard Navigation Pattern\n * @see https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#kbd_roving_tabindex\n */\n\nimport { useState, useCallback, useMemo } from 'react';\n\nexport interface RovingTabIndexState {\n /** Currently focused row (series index) */\n focusedRow: number;\n /** Currently focused column (point index) */\n focusedCol: number;\n}\n\nexport interface RovingTabIndexActions {\n /** Move focus right (next point) */\n moveRight: () => void;\n /** Move focus left (previous point) */\n moveLeft: () => void;\n /** Move focus down (next series) */\n moveDown: () => void;\n /** Move focus up (previous series) */\n moveUp: () => void;\n /** Move to first point in current series */\n moveToStart: () => void;\n /** Move to last point in current series */\n moveToEnd: () => void;\n /** Set focus to specific position */\n setFocus: (row: number, col: number) => void;\n /** Get tabIndex for a specific cell */\n getTabIndex: (row: number, col: number) => 0 | -1;\n}\n\nexport interface UseRovingTabIndex2DOptions {\n /** Number of rows (series count) */\n rows: number;\n /** Number of columns (points per series) - can vary per row */\n cols: number | ((row: number) => number);\n /** Initial focused row */\n initialRow?: number;\n /** Initial focused column */\n initialCol?: number;\n /** Wrap at boundaries */\n wrap?: boolean;\n /** Callback when focus changes */\n onFocusChange?: (row: number, col: number) => void;\n}\n\n/**\n * Hook for 2D roving tabindex navigation\n *\n * @param options - Configuration options\n * @returns State and actions for managing 2D focus\n */\nexport function useRovingTabIndex2D(\n options: UseRovingTabIndex2DOptions\n): RovingTabIndexState & RovingTabIndexActions {\n const {\n rows,\n cols,\n initialRow = 0,\n initialCol = 0,\n wrap = false,\n onFocusChange,\n } = options;\n\n const [focusedRow, setFocusedRow] = useState(initialRow);\n const [focusedCol, setFocusedCol] = useState(initialCol);\n\n // Get column count for a specific row\n const getColCount = useCallback(\n (row: number): number => {\n return typeof cols === 'function' ? cols(row) : cols;\n },\n [cols]\n );\n\n // Notify on focus change\n const notifyFocusChange = useCallback(\n (row: number, col: number): void => {\n onFocusChange?.(row, col);\n },\n [onFocusChange]\n );\n\n // Move right (next column)\n const moveRight = useCallback((): void => {\n setFocusedCol((currentCol) => {\n const maxCol = getColCount(focusedRow) - 1;\n let newCol = currentCol + 1;\n\n if (newCol > maxCol) {\n newCol = wrap ? 0 : maxCol;\n }\n\n if (newCol !== currentCol) {\n notifyFocusChange(focusedRow, newCol);\n }\n return newCol;\n });\n }, [focusedRow, getColCount, wrap, notifyFocusChange]);\n\n // Move left (previous column)\n const moveLeft = useCallback((): void => {\n setFocusedCol((currentCol) => {\n let newCol = currentCol - 1;\n const maxCol = getColCount(focusedRow) - 1;\n\n if (newCol < 0) {\n newCol = wrap ? maxCol : 0;\n }\n\n if (newCol !== currentCol) {\n notifyFocusChange(focusedRow, newCol);\n }\n return newCol;\n });\n }, [focusedRow, getColCount, wrap, notifyFocusChange]);\n\n // Move down (next row)\n const moveDown = useCallback((): void => {\n setFocusedRow((currentRow) => {\n let newRow = currentRow + 1;\n\n if (newRow >= rows) {\n newRow = wrap ? 0 : rows - 1;\n }\n\n if (newRow !== currentRow) {\n // Constrain column to new row's bounds\n const newMaxCol = getColCount(newRow) - 1;\n setFocusedCol((col) => {\n const constrainedCol = Math.min(col, newMaxCol);\n notifyFocusChange(newRow, constrainedCol);\n return constrainedCol;\n });\n }\n return newRow;\n });\n }, [rows, getColCount, wrap, notifyFocusChange]);\n\n // Move up (previous row)\n const moveUp = useCallback((): void => {\n setFocusedRow((currentRow) => {\n let newRow = currentRow - 1;\n\n if (newRow < 0) {\n newRow = wrap ? rows - 1 : 0;\n }\n\n if (newRow !== currentRow) {\n // Constrain column to new row's bounds\n const newMaxCol = getColCount(newRow) - 1;\n setFocusedCol((col) => {\n const constrainedCol = Math.min(col, newMaxCol);\n notifyFocusChange(newRow, constrainedCol);\n return constrainedCol;\n });\n }\n return newRow;\n });\n }, [rows, getColCount, wrap, notifyFocusChange]);\n\n // Move to first column\n const moveToStart = useCallback((): void => {\n setFocusedCol(0);\n notifyFocusChange(focusedRow, 0);\n }, [focusedRow, notifyFocusChange]);\n\n // Move to last column\n const moveToEnd = useCallback((): void => {\n const maxCol = getColCount(focusedRow) - 1;\n setFocusedCol(maxCol);\n notifyFocusChange(focusedRow, maxCol);\n }, [focusedRow, getColCount, notifyFocusChange]);\n\n // Set focus to specific position\n const setFocus = useCallback(\n (row: number, col: number): void => {\n const constrainedRow = Math.max(0, Math.min(row, rows - 1));\n const maxCol = getColCount(constrainedRow) - 1;\n const constrainedCol = Math.max(0, Math.min(col, maxCol));\n\n setFocusedRow(constrainedRow);\n setFocusedCol(constrainedCol);\n notifyFocusChange(constrainedRow, constrainedCol);\n },\n [rows, getColCount, notifyFocusChange]\n );\n\n // Get tabIndex for a specific cell\n const getTabIndex = useCallback(\n (row: number, col: number): 0 | -1 => {\n return row === focusedRow && col === focusedCol ? 0 : -1;\n },\n [focusedRow, focusedCol]\n );\n\n return useMemo(\n () => ({\n focusedRow,\n focusedCol,\n moveRight,\n moveLeft,\n moveDown,\n moveUp,\n moveToStart,\n moveToEnd,\n setFocus,\n getTabIndex,\n }),\n [\n focusedRow,\n focusedCol,\n moveRight,\n moveLeft,\n moveDown,\n moveUp,\n moveToStart,\n moveToEnd,\n setFocus,\n getTabIndex,\n ]\n );\n}\n","'use client';\n\n/**\n * Chart Context\n *\n * React context for sharing chart state between components.\n * Manages focus, selection, tooltips, dimensions, and scales.\n *\n * @see plan.md Context API section\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport type {\n ChartContextValue,\n DataSeries,\n ChartType,\n ChartDimensions,\n ScaleInfo,\n} from './Chart.types';\nimport { useChartDimensions } from './useChartDimensions';\nimport { useRovingTabIndex2D } from './useRovingTabIndex';\nimport {\n DEFAULT_SERIES_COLORS,\n calculateYAxisTicks,\n} from './chart.constants';\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst ChartContext = createContext<ChartContextValue | null>(null);\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access chart context\n * @throws Error if used outside ChartProvider\n */\nexport function useChartContext(): ChartContextValue {\n const context = useContext(ChartContext);\n if (!context) {\n throw new Error('useChartContext must be used within a ChartProvider');\n }\n return context;\n}\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\nexport interface ChartProviderProps {\n children: ReactNode;\n containerRef: RefObject<HTMLElement | null>;\n data: DataSeries[];\n type: ChartType;\n title: string;\n description: string;\n xAxisLabel: string;\n yAxisLabel: string;\n showTooltip: boolean;\n showGrid: boolean;\n showLegend: boolean;\n announceTrends: boolean;\n /** ICU format string for upward trend (use {percent} placeholder) */\n trendUpFormat: string;\n /** ICU format string for downward trend (use {percent} placeholder) */\n trendDownFormat: string;\n startAtZero: boolean;\n /** Whether to reduce/disable animations for accessibility */\n reducedMotion?: boolean;\n onPointFocus?: (\n point: { label: string; value: number },\n seriesIndex: number,\n pointIndex: number\n ) => void;\n onPointSelect?: (\n point: { label: string; value: number },\n seriesIndex: number,\n pointIndex: number\n ) => void;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Calculate union of all labels across series\n */\nfunction getAllLabels(data: DataSeries[]): string[] {\n const labelSet = new Set<string>();\n data.forEach((series) => {\n series.data.forEach((point) => {\n labelSet.add(point.label);\n });\n });\n return Array.from(labelSet);\n}\n\n/**\n * Calculate scales from data and dimensions\n */\nfunction calculateScales(\n data: DataSeries[],\n dimensions: ChartDimensions,\n startAtZero: boolean\n): ScaleInfo {\n const allLabels = getAllLabels(data);\n const { plotArea } = dimensions;\n\n // Find min/max values across all series\n let dataMin = Infinity;\n let dataMax = -Infinity;\n\n data.forEach((series) => {\n series.data.forEach((point) => {\n dataMin = Math.min(dataMin, point.value);\n dataMax = Math.max(dataMax, point.value);\n });\n });\n\n // Handle edge case of no data\n if (!isFinite(dataMin) || !isFinite(dataMax)) {\n dataMin = 0;\n dataMax = 100;\n }\n\n // Apply startAtZero\n const yMin = startAtZero ? Math.min(0, dataMin) : dataMin;\n\n // Calculate nice tick values\n const yTicks = calculateYAxisTicks(yMin, dataMax);\n const yMax = yTicks[yTicks.length - 1] || dataMax;\n const adjustedYMin = yTicks[0] || yMin;\n\n // X scale: distribute labels evenly across plot width\n const xScale = (labelIndex: number): number => {\n if (allLabels.length <= 1) return plotArea.x + plotArea.width / 2;\n const step = plotArea.width / (allLabels.length);\n return plotArea.x + step * labelIndex + step / 2;\n };\n\n // Y scale: map values to plot height (inverted: higher values = lower y)\n const yRange = yMax - adjustedYMin || 1;\n const yScale = (value: number): number => {\n const normalized = (value - adjustedYMin) / yRange;\n return plotArea.y + plotArea.height * (1 - normalized);\n };\n\n return {\n allLabels,\n xScale,\n yScale,\n yMin: adjustedYMin,\n yMax,\n yTicks,\n };\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\nexport function ChartProvider({\n children,\n containerRef,\n data,\n type,\n title,\n description,\n xAxisLabel,\n yAxisLabel,\n showTooltip,\n showGrid,\n showLegend,\n announceTrends,\n trendUpFormat,\n trendDownFormat,\n startAtZero,\n reducedMotion = true,\n onPointFocus: onPointFocusProp,\n onPointSelect: onPointSelectProp,\n}: ChartProviderProps): ReactElement {\n // State\n const [selectedPoint, setSelectedPoint] = useState<{\n series: number;\n point: number;\n } | null>(null);\n const [announcement, setAnnouncement] = useState('');\n const [isTooltipVisible, setIsTooltipVisible] = useState(false);\n const [tooltipPoint, setTooltipPoint] = useState<{\n series: number;\n point: number;\n } | null>(null);\n const [currentTrend, setCurrentTrend] = useState<string | null>(null);\n const [currentTrendDirection, setCurrentTrendDirection] = useState<\n 'up' | 'down' | null\n >(null);\n\n // Get dimensions from container\n const dimensions = useChartDimensions(containerRef);\n\n // Calculate scales\n const scales = useMemo(\n () => calculateScales(data, dimensions, startAtZero),\n [data, dimensions, startAtZero]\n );\n\n // Max points per series - available for future roving tabindex\n void useMemo(\n () => Math.max(...data.map((s) => s.data.length)),\n [data]\n );\n\n // Helper to format trend text using ICU format string\n const formatTrendText = useCallback(\n (percent: number, isUp: boolean): string => {\n const format = isUp ? trendUpFormat : trendDownFormat;\n return format.replace('{percent}', String(percent));\n },\n [trendUpFormat, trendDownFormat]\n );\n\n // Helper to calculate trend info - defined before roving hook\n // Returns both text and direction for setting state\n const getTrendInfo = (\n seriesIndex: number,\n pointIndex: number\n ): { text: string; direction: 'up' | 'down' } | null => {\n if (!announceTrends || pointIndex <= 0) return null;\n\n const series = data[seriesIndex];\n if (!series) return null;\n\n const currentPoint = series.data[pointIndex];\n const previousPoint = series.data[pointIndex - 1];\n\n if (!currentPoint || !previousPoint || previousPoint.value === 0) {\n return null;\n }\n\n const change =\n ((currentPoint.value - previousPoint.value) /\n Math.abs(previousPoint.value)) *\n 100;\n const isUp = change >= 0;\n const percent = Math.abs(Math.round(change));\n return {\n text: formatTrendText(percent, isUp),\n direction: isUp ? 'up' : 'down',\n };\n };\n\n // Roving tabindex for 2D navigation\n const roving = useRovingTabIndex2D({\n rows: data.length,\n cols: (row) => data[row]?.data.length || 0,\n onFocusChange: (seriesIndex, pointIndex) => {\n const series = data[seriesIndex];\n const point = series?.data[pointIndex];\n if (!series || !point) return;\n\n // Calculate trend for this specific point\n const trendInfo = getTrendInfo(seriesIndex, pointIndex);\n\n // Store trend for tooltip display\n setCurrentTrend(trendInfo?.text ?? null);\n setCurrentTrendDirection(trendInfo?.direction ?? null);\n\n // Build announcement (include trend with comma prefix for screen reader)\n const position = `${pointIndex + 1} of ${series.data.length}`;\n const seriesInfo = data.length > 1 ? `${series.name}: ` : '';\n const formattedValue = formatValue(point.value);\n const announcementTrend = trendInfo ? `, ${trendInfo.text}` : '';\n\n setAnnouncement(\n `${seriesInfo}${point.label}, ${formattedValue}${announcementTrend}. ${position}.`\n );\n\n // Show tooltip\n if (showTooltip) {\n setIsTooltipVisible(true);\n setTooltipPoint({ series: seriesIndex, point: pointIndex });\n }\n\n // Call external callback\n onPointFocusProp?.(point, seriesIndex, pointIndex);\n },\n });\n\n // Cache Intl.NumberFormat to avoid re-creating on every call\n const numberFormatter = useMemo(() => {\n const locale =\n typeof navigator !== 'undefined' ? navigator.language : 'en-US';\n return new Intl.NumberFormat(locale);\n }, []);\n\n // Format value using cached formatter\n const formatValue = useCallback((value: number): string => {\n return numberFormatter.format(value);\n }, [numberFormatter]);\n\n // Calculate trend for a specific point - returns text and direction\n const calculateTrendForPoint = useCallback(\n (\n seriesIndex: number,\n pointIndex: number\n ): { text: string; direction: 'up' | 'down' } | null => {\n if (!announceTrends) return null;\n if (pointIndex <= 0) return null; // No previous point to compare\n\n const series = data[seriesIndex];\n if (!series) return null;\n\n const currentPoint = series.data[pointIndex];\n const previousPoint = series.data[pointIndex - 1];\n\n if (!currentPoint || !previousPoint || previousPoint.value === 0) {\n return null;\n }\n\n const change =\n ((currentPoint.value - previousPoint.value) /\n Math.abs(previousPoint.value)) *\n 100;\n const isUp = change >= 0;\n const percent = Math.abs(Math.round(change));\n return {\n text: formatTrendText(percent, isUp),\n direction: isUp ? 'up' : 'down',\n };\n },\n [data, announceTrends, formatTrendText]\n );\n\n // Get series color\n const getSeriesColor = useCallback((seriesIndex: number): string => {\n return DEFAULT_SERIES_COLORS[seriesIndex % DEFAULT_SERIES_COLORS.length] ?? 'var(--chart-1)';\n }, []);\n\n // Get point coordinates\n const getPointCoordinates = useCallback(\n (seriesIndex: number, pointIndex: number): { x: number; y: number } | null => {\n const series = data[seriesIndex];\n const point = series?.data[pointIndex];\n if (!series || !point) return null;\n\n const labelIndex = scales.allLabels.indexOf(point.label);\n if (labelIndex === -1) return null;\n\n return {\n x: scales.xScale(labelIndex),\n y: scales.yScale(point.value),\n };\n },\n [data, scales]\n );\n\n // Actions\n const setFocus = useCallback(\n (series: number, point: number): void => {\n roving.setFocus(series, point);\n },\n [roving]\n );\n\n const selectPoint = useCallback(\n (series: number, point: number): void => {\n setSelectedPoint({ series, point });\n const seriesData = data[series];\n const pointData = seriesData?.data[point];\n if (seriesData && pointData) {\n onPointSelectProp?.(pointData, series, point);\n }\n },\n [data, onPointSelectProp]\n );\n\n const clearSelection = useCallback((): void => {\n setSelectedPoint(null);\n }, []);\n\n const announce = useCallback((message: string): void => {\n setAnnouncement(message);\n }, []);\n\n const showTooltipAt = useCallback(\n (series: number, point: number): void => {\n if (showTooltip) {\n setIsTooltipVisible(true);\n setTooltipPoint({ series, point });\n // Calculate and set trend for this specific point\n const trendResult = calculateTrendForPoint(series, point);\n setCurrentTrend(trendResult?.text ?? null);\n setCurrentTrendDirection(trendResult?.direction ?? null);\n }\n },\n [showTooltip, calculateTrendForPoint]\n );\n\n const hideTooltip = useCallback((): void => {\n setIsTooltipVisible(false);\n setTooltipPoint(null);\n }, []);\n\n // Context value\n const value = useMemo<ChartContextValue>(\n () => ({\n // State\n focusedSeries: roving.focusedRow,\n focusedPoint: roving.focusedCol,\n selectedPoint,\n announcement,\n isTooltipVisible,\n tooltipPoint,\n currentTrend,\n currentTrendDirection,\n\n // Computed\n dimensions,\n scales,\n\n // Props passthrough\n data,\n type,\n title,\n description,\n xAxisLabel,\n yAxisLabel,\n showTooltip,\n showGrid,\n showLegend,\n announceTrends,\n trendUpFormat,\n trendDownFormat,\n startAtZero,\n reducedMotion,\n\n // Actions\n setFocus,\n selectPoint,\n clearSelection,\n announce,\n showTooltipAt,\n hideTooltip,\n\n // Helpers\n getTabIndex: roving.getTabIndex,\n formatValue,\n getSeriesColor,\n getPointCoordinates,\n }),\n [\n roving.focusedRow,\n roving.focusedCol,\n roving.getTabIndex,\n selectedPoint,\n announcement,\n isTooltipVisible,\n tooltipPoint,\n currentTrend,\n currentTrendDirection,\n dimensions,\n scales,\n data,\n type,\n title,\n description,\n xAxisLabel,\n yAxisLabel,\n showTooltip,\n showGrid,\n showLegend,\n announceTrends,\n trendUpFormat,\n trendDownFormat,\n startAtZero,\n reducedMotion,\n setFocus,\n selectPoint,\n clearSelection,\n announce,\n showTooltipAt,\n hideTooltip,\n formatValue,\n getSeriesColor,\n getPointCoordinates,\n ]\n );\n\n return (\n <ChartContext.Provider value={value}>{children}</ChartContext.Provider>\n );\n}\n","'use client';\n\n/**\n * ChartGrid Component\n *\n * Renders optional grid lines behind the chart data.\n * Uses horizontal lines aligned with Y-axis ticks.\n *\n * @see plan.md ChartGrid section\n */\n\nimport { type ReactElement } from 'react';\nimport {\n GRID_COLOR,\n GRID_STROKE_WIDTH,\n GRID_STROKE_OPACITY,\n} from './chart.constants';\n\nexport interface ChartGridProps {\n /** Y-axis tick values for grid line positions */\n yTicks: number[];\n /** Y-scale function to convert values to coordinates */\n yScale: (value: number) => number;\n /** Plot area x position */\n plotX: number;\n /** Plot area width */\n plotWidth: number;\n /** Whether to show grid lines */\n visible: boolean;\n}\n\n/**\n * ChartGrid - Optional background grid lines\n *\n * Renders horizontal grid lines aligned with Y-axis ticks.\n * Uses low opacity for subtle visual guidance.\n */\nexport function ChartGrid({\n yTicks,\n yScale,\n plotX,\n plotWidth,\n visible,\n}: ChartGridProps): ReactElement | null {\n if (!visible) {\n return null;\n }\n\n return (\n <g className=\"chart-grid\" aria-hidden=\"true\" data-testid=\"chart-grid\">\n {yTicks.map((tick) => {\n const y = yScale(tick);\n return (\n <line\n key={tick}\n x1={plotX}\n y1={y}\n x2={plotX + plotWidth}\n y2={y}\n stroke={GRID_COLOR}\n strokeWidth={GRID_STROKE_WIDTH}\n strokeOpacity={GRID_STROKE_OPACITY}\n />\n );\n })}\n </g>\n );\n}\n\nChartGrid.displayName = 'ChartGrid';\n","'use client';\n\n/**\n * ChartAxis Component\n *\n * Renders X and Y axes with labels and tick marks.\n *\n * @see plan.md ChartAxis section\n */\n\nimport { type ReactElement } from 'react';\nimport {\n AXIS_COLOR,\n AXIS_STROKE_WIDTH,\n AXIS_TICK_SIZE,\n AXIS_LABEL_FONT_SIZE,\n} from './chart.constants';\n\nexport interface ChartAxisProps {\n /** All labels for X-axis */\n allLabels: string[];\n /** Y-axis tick values */\n yTicks: number[];\n /** X-scale function */\n xScale: (labelIndex: number) => number;\n /** Y-scale function */\n yScale: (value: number) => number;\n /** Plot area dimensions */\n plotArea: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n /** X-axis label text */\n xAxisLabel: string;\n /** Y-axis label text */\n yAxisLabel: string;\n /** Value formatter for Y-axis ticks */\n formatValue: (value: number) => string;\n}\n\n/**\n * ChartAxis - X and Y axes rendering\n *\n * Renders axis lines, tick marks, tick labels, and axis titles.\n * Uses semantic tokens for theme-aware styling.\n */\nexport function ChartAxis({\n allLabels,\n yTicks,\n xScale,\n yScale,\n plotArea,\n xAxisLabel,\n yAxisLabel,\n formatValue,\n}: ChartAxisProps): ReactElement {\n const { x: plotX, y: plotY, width: plotWidth, height: plotHeight } = plotArea;\n\n return (\n <g className=\"chart-axis\" aria-hidden=\"true\" data-testid=\"chart-axis\">\n {/* X-axis line */}\n <line\n x1={plotX}\n y1={plotY + plotHeight}\n x2={plotX + plotWidth}\n y2={plotY + plotHeight}\n stroke={AXIS_COLOR}\n strokeWidth={AXIS_STROKE_WIDTH}\n />\n\n {/* Y-axis line */}\n <line\n x1={plotX}\n y1={plotY}\n x2={plotX}\n y2={plotY + plotHeight}\n stroke={AXIS_COLOR}\n strokeWidth={AXIS_STROKE_WIDTH}\n />\n\n {/* X-axis tick marks and labels */}\n {allLabels.map((label, index) => {\n const x = xScale(index);\n const y = plotY + plotHeight;\n\n return (\n <g key={label}>\n {/* Tick mark */}\n <line\n x1={x}\n y1={y}\n x2={x}\n y2={y + AXIS_TICK_SIZE}\n stroke={AXIS_COLOR}\n strokeWidth={AXIS_STROKE_WIDTH}\n />\n {/* Label */}\n <text\n x={x}\n y={y + AXIS_TICK_SIZE + AXIS_LABEL_FONT_SIZE}\n textAnchor=\"middle\"\n fontSize={AXIS_LABEL_FONT_SIZE}\n fill=\"currentColor\"\n className=\"text-[var(--content-foreground)]\"\n >\n {label}\n </text>\n </g>\n );\n })}\n\n {/* Y-axis tick marks and labels */}\n {yTicks.map((tick) => {\n const x = plotX;\n const y = yScale(tick);\n\n return (\n <g key={tick}>\n {/* Tick mark */}\n <line\n x1={x - AXIS_TICK_SIZE}\n y1={y}\n x2={x}\n y2={y}\n stroke={AXIS_COLOR}\n strokeWidth={AXIS_STROKE_WIDTH}\n />\n {/* Label */}\n <text\n x={x - AXIS_TICK_SIZE - 4}\n y={y}\n textAnchor=\"end\"\n dominantBaseline=\"middle\"\n fontSize={AXIS_LABEL_FONT_SIZE}\n fill=\"currentColor\"\n className=\"text-[var(--content-foreground)]\"\n >\n {formatValue(tick)}\n </text>\n </g>\n );\n })}\n\n {/* X-axis title */}\n <text\n x={plotX + plotWidth / 2}\n y={plotY + plotHeight + 45}\n textAnchor=\"middle\"\n fontSize={AXIS_LABEL_FONT_SIZE}\n fill=\"currentColor\"\n className=\"text-[var(--content-foreground)] font-medium\"\n >\n {xAxisLabel}\n </text>\n\n {/* Y-axis title (rotated) */}\n <text\n x={15}\n y={plotY + plotHeight / 2}\n textAnchor=\"middle\"\n fontSize={AXIS_LABEL_FONT_SIZE}\n fill=\"currentColor\"\n className=\"text-[var(--content-foreground)] font-medium\"\n transform={`rotate(-90, 15, ${plotY + plotHeight / 2})`}\n >\n {yAxisLabel}\n </text>\n </g>\n );\n}\n\nChartAxis.displayName = 'ChartAxis';\n","'use client';\n\n/**\n * ChartDataPoint Component\n *\n * Focusable data point with keyboard navigation support.\n * Includes invisible hit area for touch targets (44x44px minimum).\n *\n * @see plan.md Implementation Details - Touch Target Pattern\n */\n\nimport {\n type ReactElement,\n type KeyboardEvent,\n type FocusEvent,\n type MouseEvent,\n useRef,\n useEffect,\n} from 'react';\nimport { useFocusRing } from 'react-aria';\nimport { dataPointVariants } from './chart.variants';\nimport {\n MIN_TOUCH_TARGET,\n FOCUS_RING_OFFSET,\n FOCUS_RING_WIDTH,\n BAR_RADIUS,\n POINT_RADIUS,\n} from './chart.constants';\n\nexport interface ChartDataPointProps {\n /** Type of data point (bar or circle) */\n type: 'bar' | 'line';\n /** X coordinate */\n x: number;\n /** Y coordinate */\n y: number;\n /** Width (for bars) */\n width?: number;\n /** Height (for bars) */\n height?: number;\n /** Fill/stroke color */\n color: string;\n /** Series index */\n seriesIndex: number;\n /** Point index within series */\n pointIndex: number;\n /** tabIndex for roving focus */\n tabIndex: 0 | -1;\n /** Accessible label */\n label: string;\n /** Whether this point is selected */\n isSelected?: boolean;\n /** Callback on focus */\n onFocus?: (seriesIndex: number, pointIndex: number) => void;\n /** Callback on blur */\n onBlur?: () => void;\n /** Callback on hover */\n onHover?: (seriesIndex: number, pointIndex: number) => void;\n /** Callback on hover end */\n onHoverEnd?: () => void;\n /** Callback on keydown */\n onKeyDown?: (event: KeyboardEvent) => void;\n}\n\n/**\n * ChartDataPoint - Focusable data point element\n *\n * Renders either a bar (rect) or circle with:\n * - Invisible hit area for 44x44px touch targets\n * - Focus ring on keyboard focus\n * - Keyboard and mouse event handling\n */\nexport function ChartDataPoint({\n type,\n x,\n y,\n width = POINT_RADIUS * 2,\n height = POINT_RADIUS * 2,\n color,\n seriesIndex,\n pointIndex,\n tabIndex,\n label,\n isSelected = false,\n onFocus,\n onBlur,\n onHover,\n onHoverEnd,\n onKeyDown,\n}: ChartDataPointProps): ReactElement {\n const ref = useRef<SVGGElement>(null);\n const { isFocusVisible, focusProps } = useFocusRing();\n\n // Auto-focus when tabIndex becomes 0\n useEffect(() => {\n if (tabIndex === 0 && ref.current) {\n // Check if focus should move to this element\n const activeElement = document.activeElement;\n const isChartFocused =\n activeElement?.closest('[role=\"graphics-document\"]') !== null;\n if (isChartFocused) {\n ref.current.focus();\n }\n }\n }, [tabIndex]);\n\n // Calculate hit area dimensions (minimum 44x44px)\n const hitAreaSize = Math.max(MIN_TOUCH_TARGET, width, height);\n const hitX = type === 'bar' ? x - (hitAreaSize - width) / 2 : x - hitAreaSize / 2;\n const hitY = type === 'bar' ? y - (hitAreaSize - height) / 2 : y - hitAreaSize / 2;\n\n // Handle focus\n const handleFocus = (event: FocusEvent<SVGGElement>): void => {\n focusProps.onFocus?.(event);\n onFocus?.(seriesIndex, pointIndex);\n };\n\n // Handle blur\n const handleBlur = (event: FocusEvent<SVGGElement>): void => {\n focusProps.onBlur?.(event);\n onBlur?.();\n };\n\n // Handle mouse enter\n const handleMouseEnter = (_event: MouseEvent<SVGGElement>): void => {\n onHover?.(seriesIndex, pointIndex);\n };\n\n // Handle mouse leave\n const handleMouseLeave = (_event: MouseEvent<SVGGElement>): void => {\n onHoverEnd?.();\n };\n\n // Determine state for variants\n const state = isSelected ? 'selected' : isFocusVisible ? 'focused' : 'default';\n\n return (\n <g\n ref={ref}\n role=\"listitem\"\n tabIndex={tabIndex}\n aria-label={label}\n className={dataPointVariants({ type, state })}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onKeyDown={onKeyDown}\n data-testid={`chart-point-${seriesIndex}-${pointIndex}`}\n >\n {/* Invisible hit area for touch/click */}\n <rect\n x={hitX}\n y={hitY}\n width={hitAreaSize}\n height={hitAreaSize}\n fill=\"transparent\"\n className=\"cursor-pointer\"\n />\n\n {/* Visual element */}\n {type === 'bar' ? (\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n rx={BAR_RADIUS}\n ry={BAR_RADIUS}\n fill={color}\n className=\"chart-bar\"\n />\n ) : (\n <circle\n cx={x}\n cy={y}\n r={POINT_RADIUS}\n fill={color}\n className=\"chart-point\"\n />\n )}\n\n {/* Focus ring (only when keyboard focused) */}\n {isFocusVisible && (\n type === 'bar' ? (\n <rect\n x={x - FOCUS_RING_OFFSET}\n y={y - FOCUS_RING_OFFSET}\n width={width + FOCUS_RING_OFFSET * 2}\n height={height + FOCUS_RING_OFFSET * 2}\n rx={BAR_RADIUS + FOCUS_RING_OFFSET}\n ry={BAR_RADIUS + FOCUS_RING_OFFSET}\n fill=\"none\"\n stroke=\"var(--ring)\"\n strokeWidth={FOCUS_RING_WIDTH}\n className=\"chart-focus-ring\"\n />\n ) : (\n <circle\n cx={x}\n cy={y}\n r={POINT_RADIUS + FOCUS_RING_OFFSET}\n fill=\"none\"\n stroke=\"var(--ring)\"\n strokeWidth={FOCUS_RING_WIDTH}\n className=\"chart-focus-ring\"\n />\n )\n )}\n </g>\n );\n}\n\nChartDataPoint.displayName = 'ChartDataPoint';\n","'use client';\n\n/**\n * ChartBarSeries Component\n *\n * Renders a series of bars for bar charts.\n * Handles multi-series grouped bar layout.\n *\n * @see plan.md ChartBarSeries section\n */\n\nimport { type ReactElement, type KeyboardEvent } from 'react';\nimport { ChartDataPoint } from './ChartDataPoint';\nimport type { DataSeries, ScaleInfo, ChartDimensions } from './Chart.types';\nimport { calculateBarLayout } from './chart.constants';\n\nexport interface ChartBarSeriesProps {\n /** Series data */\n series: DataSeries;\n /** Series index */\n seriesIndex: number;\n /** Total number of series */\n totalSeries: number;\n /** Chart dimensions */\n dimensions: ChartDimensions;\n /** Scale information */\n scales: ScaleInfo;\n /** Series color */\n color: string;\n /** Get tabIndex for a point */\n getTabIndex: (seriesIndex: number, pointIndex: number) => 0 | -1;\n /** Selected point */\n selectedPoint: { series: number; point: number } | null;\n /** Callback on point focus */\n onPointFocus?: (seriesIndex: number, pointIndex: number) => void;\n /** Callback on point blur */\n onPointBlur?: () => void;\n /** Callback on point hover */\n onPointHover?: (seriesIndex: number, pointIndex: number) => void;\n /** Callback on point hover end */\n onPointHoverEnd?: () => void;\n /** Callback on keydown */\n onKeyDown?: (event: KeyboardEvent) => void;\n /** Value formatter */\n formatValue: (value: number) => string;\n}\n\n/**\n * ChartBarSeries - Bar chart series rendering\n *\n * Renders bars for each data point in the series.\n * Handles grouped bar layout for multi-series charts.\n */\nexport function ChartBarSeries({\n series,\n seriesIndex,\n totalSeries,\n dimensions,\n scales,\n color,\n getTabIndex,\n selectedPoint,\n onPointFocus,\n onPointBlur,\n onPointHover,\n onPointHoverEnd,\n onKeyDown,\n formatValue,\n}: ChartBarSeriesProps): ReactElement {\n const { plotArea } = dimensions;\n const { allLabels, xScale: _xScale, yScale, yMin } = scales;\n\n // Calculate bar layout (pass plotArea.x for correct positioning)\n const { barWidth, getBarX } = calculateBarLayout(\n plotArea.width,\n allLabels.length,\n totalSeries,\n plotArea.x\n );\n\n // Y position of the baseline (where bars start)\n const baselineY = yScale(Math.max(0, yMin));\n\n return (\n <g\n className=\"chart-bar-series\"\n role=\"list\"\n aria-label={`${series.name} series`}\n data-testid={`chart-series-${seriesIndex}`}\n >\n {series.data.map((point, pointIndex) => {\n // Find the label index in allLabels for correct positioning\n const labelIndex = allLabels.indexOf(point.label);\n if (labelIndex === -1) return null; // Skip if label not found\n\n // Calculate bar position\n const barX = getBarX(labelIndex, seriesIndex);\n const barY = yScale(point.value);\n const barHeight = Math.abs(baselineY - barY);\n\n // For negative values, bar extends downward from baseline\n const finalBarY = point.value >= 0 ? barY : baselineY;\n\n // Check if this point is selected\n const isSelected =\n selectedPoint?.series === seriesIndex &&\n selectedPoint?.point === pointIndex;\n\n // Create accessible label\n const accessibleLabel = `${series.name}: ${point.label}, ${formatValue(point.value)}`;\n\n return (\n <ChartDataPoint\n key={`${point.label}-${pointIndex}`}\n type=\"bar\"\n x={barX}\n y={finalBarY}\n width={barWidth}\n height={barHeight}\n color={color}\n seriesIndex={seriesIndex}\n pointIndex={pointIndex}\n tabIndex={getTabIndex(seriesIndex, pointIndex)}\n label={accessibleLabel}\n isSelected={isSelected}\n onFocus={onPointFocus}\n onBlur={onPointBlur}\n onHover={onPointHover}\n onHoverEnd={onPointHoverEnd}\n onKeyDown={onKeyDown}\n />\n );\n })}\n </g>\n );\n}\n\nChartBarSeries.displayName = 'ChartBarSeries';\n","'use client';\n\n/**\n * ChartLineSeries Component\n *\n * Renders a series of connected line with data points.\n * Supports solid, dashed, and dotted line patterns.\n *\n * @see plan.md ChartLineSeries section\n */\n\nimport { type ReactElement, type KeyboardEvent, useMemo } from 'react';\nimport { ChartDataPoint } from './ChartDataPoint';\nimport type { DataSeries, ScaleInfo, LinePattern } from './Chart.types';\nimport { LINE_STROKE_WIDTH, LINE_PATTERNS } from './chart.constants';\n\nexport interface ChartLineSeriesProps {\n /** Series data */\n series: DataSeries;\n /** Series index */\n seriesIndex: number;\n /** Scale information */\n scales: ScaleInfo;\n /** Series color */\n color: string;\n /** Line pattern */\n pattern: LinePattern;\n /** Get tabIndex for a point */\n getTabIndex: (seriesIndex: number, pointIndex: number) => 0 | -1;\n /** Selected point */\n selectedPoint: { series: number; point: number } | null;\n /** Callback on point focus */\n onPointFocus?: (seriesIndex: number, pointIndex: number) => void;\n /** Callback on point blur */\n onPointBlur?: () => void;\n /** Callback on point hover */\n onPointHover?: (seriesIndex: number, pointIndex: number) => void;\n /** Callback on point hover end */\n onPointHoverEnd?: () => void;\n /** Callback on keydown */\n onKeyDown?: (event: KeyboardEvent) => void;\n /** Value formatter */\n formatValue: (value: number) => string;\n}\n\n/**\n * ChartLineSeries - Line chart series rendering\n *\n * Renders a path connecting all data points with circles at each point.\n * Supports different line patterns for accessibility.\n */\nexport function ChartLineSeries({\n series,\n seriesIndex,\n scales,\n color,\n pattern,\n getTabIndex,\n selectedPoint,\n onPointFocus,\n onPointBlur,\n onPointHover,\n onPointHoverEnd,\n onKeyDown,\n formatValue,\n}: ChartLineSeriesProps): ReactElement {\n const { allLabels, xScale, yScale } = scales;\n\n // Calculate point coordinates\n const points = useMemo(() => {\n return series.data\n .map((point, pointIndex) => {\n const labelIndex = allLabels.indexOf(point.label);\n if (labelIndex === -1) return null;\n\n return {\n x: xScale(labelIndex),\n y: yScale(point.value),\n point,\n pointIndex,\n labelIndex,\n };\n })\n .filter((p): p is NonNullable<typeof p> => p !== null)\n .sort((a, b) => a.labelIndex - b.labelIndex); // Sort by x position\n }, [series.data, allLabels, xScale, yScale]);\n\n // Generate SVG path\n const pathD = useMemo(() => {\n if (points.length === 0) return '';\n\n return points\n .map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`)\n .join(' ');\n }, [points]);\n\n // Get stroke-dasharray for pattern\n const strokeDasharray =\n LINE_PATTERNS[pattern] === 'none' ? undefined : LINE_PATTERNS[pattern];\n\n return (\n <g\n className=\"chart-line-series\"\n role=\"list\"\n aria-label={`${series.name} series`}\n data-testid={`chart-series-${seriesIndex}`}\n >\n {/* Line path (behind points) */}\n <path\n d={pathD}\n fill=\"none\"\n stroke={color}\n strokeWidth={LINE_STROKE_WIDTH}\n strokeDasharray={strokeDasharray}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"chart-line\"\n aria-hidden=\"true\"\n />\n\n {/* Data points */}\n {points.map(({ x, y, point, pointIndex }) => {\n // Check if this point is selected\n const isSelected =\n selectedPoint?.series === seriesIndex &&\n selectedPoint?.point === pointIndex;\n\n // Create accessible label\n const accessibleLabel = `${series.name}: ${point.label}, ${formatValue(point.value)}`;\n\n return (\n <ChartDataPoint\n key={`${point.label}-${pointIndex}`}\n type=\"line\"\n x={x}\n y={y}\n color={color}\n seriesIndex={seriesIndex}\n pointIndex={pointIndex}\n tabIndex={getTabIndex(seriesIndex, pointIndex)}\n label={accessibleLabel}\n isSelected={isSelected}\n onFocus={onPointFocus}\n onBlur={onPointBlur}\n onHover={onPointHover}\n onHoverEnd={onPointHoverEnd}\n onKeyDown={onKeyDown}\n />\n );\n })}\n </g>\n );\n}\n\nChartLineSeries.displayName = 'ChartLineSeries';\n","'use client';\n\n/**\n * ChartSVG Component\n *\n * Main SVG container with keyboard handling and accessibility attributes.\n * Composes grid, axes, and series components.\n *\n * @see plan.md ChartSVG section\n */\n\nimport { type ReactElement, type KeyboardEvent } from 'react';\nimport { ChartGrid } from './ChartGrid';\nimport { ChartAxis } from './ChartAxis';\nimport { ChartBarSeries } from './ChartBarSeries';\nimport { ChartLineSeries } from './ChartLineSeries';\nimport type {\n DataSeries,\n ChartType,\n ChartDimensions,\n ScaleInfo,\n LinePattern,\n} from './Chart.types';\n\nexport interface ChartSVGProps {\n /** Chart type */\n type: ChartType;\n /** Chart data series */\n data: DataSeries[];\n /** Chart dimensions */\n dimensions: ChartDimensions;\n /** Scale information */\n scales: ScaleInfo;\n /** Title ID for aria-labelledby */\n titleId: string;\n /** Description ID for aria-describedby */\n descId: string;\n /** Show grid lines */\n showGrid: boolean;\n /** X-axis label */\n xAxisLabel: string;\n /** Y-axis label */\n yAxisLabel: string;\n /** Get series color */\n getSeriesColor: (seriesIndex: number) => string;\n /** Get tabIndex for a point */\n getTabIndex: (seriesIndex: number, pointIndex: number) => 0 | -1;\n /** Selected point */\n selectedPoint: { series: number; point: number } | null;\n /** Value formatter */\n formatValue: (value: number) => string;\n /** Keyboard event handler */\n onKeyDown: (event: KeyboardEvent) => void;\n /** Point focus handler */\n onPointFocus: (seriesIndex: number, pointIndex: number) => void;\n /** Point blur handler */\n onPointBlur: () => void;\n /** Point hover handler */\n onPointHover: (seriesIndex: number, pointIndex: number) => void;\n /** Point hover end handler */\n onPointHoverEnd: () => void;\n}\n\n/**\n * ChartSVG - Main SVG container\n *\n * Sets up the SVG with proper accessibility attributes and\n * composes the grid, axes, and data series.\n */\nexport function ChartSVG({\n type,\n data,\n dimensions,\n scales,\n titleId,\n descId,\n showGrid,\n xAxisLabel,\n yAxisLabel,\n getSeriesColor,\n getTabIndex,\n selectedPoint,\n formatValue,\n onKeyDown,\n onPointFocus,\n onPointBlur,\n onPointHover,\n onPointHoverEnd,\n}: ChartSVGProps): ReactElement {\n const { width, height, plotArea } = dimensions;\n const { allLabels, xScale, yScale, yTicks } = scales;\n\n return (\n <svg\n role=\"graphics-document\"\n aria-roledescription={`${type} chart`}\n aria-labelledby={titleId}\n aria-describedby={descId}\n viewBox={`0 0 ${width} ${height}`}\n className=\"h-full w-full\"\n style={{ maxHeight: height }}\n data-testid=\"chart-svg\"\n >\n {/* Grid lines (behind everything) */}\n <ChartGrid\n yTicks={yTicks}\n yScale={yScale}\n plotX={plotArea.x}\n plotWidth={plotArea.width}\n visible={showGrid}\n />\n\n {/* Axes */}\n <ChartAxis\n allLabels={allLabels}\n yTicks={yTicks}\n xScale={xScale}\n yScale={yScale}\n plotArea={plotArea}\n xAxisLabel={xAxisLabel}\n yAxisLabel={yAxisLabel}\n formatValue={formatValue}\n />\n\n {/* Data series */}\n {data.map((series, seriesIndex) => {\n const color = series.color || getSeriesColor(seriesIndex);\n const pattern: LinePattern = series.pattern || 'solid';\n\n if (type === 'bar') {\n return (\n <ChartBarSeries\n key={series.name}\n series={series}\n seriesIndex={seriesIndex}\n totalSeries={data.length}\n dimensions={dimensions}\n scales={scales}\n color={color}\n getTabIndex={getTabIndex}\n selectedPoint={selectedPoint}\n onPointFocus={onPointFocus}\n onPointBlur={onPointBlur}\n onPointHover={onPointHover}\n onPointHoverEnd={onPointHoverEnd}\n onKeyDown={onKeyDown}\n formatValue={formatValue}\n />\n );\n }\n\n return (\n <ChartLineSeries\n key={series.name}\n series={series}\n seriesIndex={seriesIndex}\n scales={scales}\n color={color}\n pattern={pattern}\n getTabIndex={getTabIndex}\n selectedPoint={selectedPoint}\n onPointFocus={onPointFocus}\n onPointBlur={onPointBlur}\n onPointHover={onPointHover}\n onPointHoverEnd={onPointHoverEnd}\n onKeyDown={onKeyDown}\n formatValue={formatValue}\n />\n );\n })}\n </svg>\n );\n}\n\nChartSVG.displayName = 'ChartSVG';\n","\"use client\";\n\n/**\n * Tooltip Component - Implementation\n *\n * Accessible tooltip component combining React Aria primitives with ShadCN styling.\n * Follows Themis library patterns with compound component structure.\n *\n * @see plan.md (Implementation plan)\n * @see Tooltip.types.ts (Zod schemas)\n * @see tooltip-prd.md (Full requirements)\n */\n\nimport { type ReactElement } from 'react';\nimport {\n TooltipTrigger as AriaTooltipTrigger,\n Tooltip as AriaTooltip,\n OverlayArrow,\n composeRenderProps,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n TooltipProps,\n TooltipTriggerProps,\n TooltipContentProps,\n TooltipArrowProps,\n TooltipSide,\n} from './Tooltip.types';\n\n/**\n * CVA Variants for TooltipContent\n *\n * Placement-based animations and high-contrast inverted colors.\n *\n * @see plan.md (CVA Variant Structure)\n * @see tooltip-prd.md US-2 (Configurable Placement)\n */\nexport const tooltipContentVariants = cva(\n // Base styles\n [\n \"z-50 overflow-hidden rounded-md px-3 py-1.5 text-sm shadow-md\",\n // Inverted colors for high contrast (7:1 ratio)\n \"bg-[var(--content-foreground)] text-[var(--content-background)]\",\n // Entry animation base\n \"animate-in fade-in-0\",\n // Exit animation\n \"data-[exiting]:animate-out data-[exiting]:fade-out-0\",\n ],\n {\n variants: {\n side: {\n top: [\n \"motion-safe:slide-in-from-bottom-2\",\n \"data-[exiting]:motion-safe:slide-out-to-bottom-2\",\n ],\n bottom: [\n \"motion-safe:slide-in-from-top-2\",\n \"data-[exiting]:motion-safe:slide-out-to-top-2\",\n ],\n left: [\n \"motion-safe:slide-in-from-right-2\",\n \"data-[exiting]:motion-safe:slide-out-to-right-2\",\n ],\n right: [\n \"motion-safe:slide-in-from-left-2\",\n \"data-[exiting]:motion-safe:slide-out-to-left-2\",\n ],\n },\n },\n defaultVariants: {\n side: \"top\",\n },\n }\n);\n\n/**\n * CVA Variants for TooltipArrow\n *\n * Rotation based on placement for correct arrow pointing direction.\n *\n * @see tooltip-prd.md US-2 (Arrow Indicator)\n */\nexport const tooltipArrowVariants = cva(\n // Base arrow styles\n \"fill-[var(--content-foreground)]\",\n {\n variants: {\n side: {\n top: \"rotate-180\",\n bottom: \"rotate-0\",\n left: \"rotate-90\",\n right: \"-rotate-90\",\n },\n },\n defaultVariants: {\n side: \"top\",\n },\n }\n);\n\n/**\n * Map React Aria placement to our side prop\n * React Aria uses placement prop with values like 'top', 'bottom', etc.\n * PlacementAxis can be 'top' | 'bottom' | 'left' | 'right' | null\n */\nfunction placementToSide(placement: string | null | undefined): TooltipSide {\n if (!placement) return 'top';\n // Extract the base placement (e.g., 'top start' -> 'top')\n const basePlacement = placement.split(' ')[0];\n if (basePlacement === 'top' || basePlacement === 'bottom' ||\n basePlacement === 'left' || basePlacement === 'right') {\n return basePlacement;\n }\n return 'top';\n}\n\n/**\n * Tooltip Root Component\n *\n * Manages tooltip open/close state, delays, and trigger behavior.\n * Wraps React Aria's TooltipTrigger with delay configuration.\n *\n * @see tooltip-prd.md US-1 (Basic Usage)\n * @see tooltip-prd.md US-3 (Delay Configuration)\n * @see tooltip-prd.md US-7 (Controlled State)\n */\nfunction TooltipRoot({\n children,\n delay = 700,\n closeDelay = 300,\n trigger = 'hover',\n isOpen,\n defaultOpen = false,\n onOpenChange,\n isDisabled = false,\n}: TooltipProps): ReactElement {\n // React Aria doesn't have a direct trigger mode prop\n // 'focus' mode is achieved by setting delay to a very high value\n // and relying on focus to trigger immediately\n const effectiveDelay = trigger === 'focus' ? 99999999 : delay;\n\n return (\n <AriaTooltipTrigger\n delay={effectiveDelay}\n closeDelay={closeDelay}\n isOpen={isOpen}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n isDisabled={isDisabled}\n >\n {children}\n </AriaTooltipTrigger>\n );\n}\n\nTooltipRoot.displayName = 'Tooltip';\n\n/**\n * TooltipTrigger Component\n *\n * Wrapper for the element that triggers the tooltip.\n * The child element must be focusable (or wrapped with Focusable).\n *\n * React Aria's TooltipTrigger automatically applies:\n * - aria-describedby linking to tooltip\n * - Hover and focus event handlers\n *\n * @see tooltip-prd.md US-5 (Non-Button Triggers)\n */\nfunction TooltipTriggerComponent({\n children,\n}: TooltipTriggerProps): ReactElement {\n // React Aria's TooltipTrigger expects the trigger element as a direct child\n // We pass through the child element directly\n return children as ReactElement;\n}\n\nTooltipTriggerComponent.displayName = 'TooltipTrigger';\n\n/**\n * TooltipContent Component\n *\n * The actual tooltip overlay that appears.\n * Supports placement, offset, and optional arrow.\n *\n * @see tooltip-prd.md US-2 (Placement and Arrow)\n * @see tooltip-prd.md Technical Implementation Details\n */\nfunction TooltipContentComponent({\n children,\n side = 'top',\n sideOffset = 4,\n alignOffset = 0,\n shouldFlip = true,\n showArrow = false,\n arrowSize = 8,\n className,\n ...restProps\n}: TooltipContentProps & { 'data-testid'?: string }): ReactElement {\n return (\n <AriaTooltip\n placement={side}\n offset={sideOffset}\n crossOffset={alignOffset}\n shouldFlip={shouldFlip}\n {...restProps}\n className={composeRenderProps(className, (className, renderProps) => {\n // Get actual placement from render props for animation direction\n const actualSide = placementToSide(renderProps.placement);\n return cn(\n tooltipContentVariants({ side: actualSide }),\n className\n );\n })}\n >\n {(renderProps) => {\n const actualSide = placementToSide(renderProps.placement);\n return (\n <>\n {showArrow && (\n <OverlayArrow>\n <svg\n width={arrowSize}\n height={arrowSize}\n viewBox=\"0 0 8 8\"\n className={tooltipArrowVariants({ side: actualSide })}\n data-testid=\"tooltip-arrow\"\n >\n <path d=\"M0 0 L4 4 L8 0\" />\n </svg>\n </OverlayArrow>\n )}\n {children}\n </>\n );\n }}\n </AriaTooltip>\n );\n}\n\nTooltipContentComponent.displayName = 'TooltipContent';\n\n/**\n * TooltipArrow Component\n *\n * Optional arrow component for custom arrow rendering.\n * Automatically positioned based on tooltip placement.\n *\n * Note: This is an alternative to using showArrow prop on TooltipContent.\n * Use this when you need custom arrow styling or rendering.\n *\n * @see tooltip-prd.md US-2 (Arrow Indicator)\n */\nfunction TooltipArrowComponent({\n size = 8,\n className,\n 'data-testid': dataTestId = 'tooltip-arrow',\n ...restProps\n}: TooltipArrowProps & { 'data-testid'?: string }): ReactElement {\n // This component is designed to be used inside TooltipContent\n // The actual positioning is handled by OverlayArrow from React Aria\n return (\n <OverlayArrow>\n {({ placement }) => {\n const side = placementToSide(placement);\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 8 8\"\n className={cn(tooltipArrowVariants({ side }), className)}\n data-testid={dataTestId}\n {...restProps}\n >\n <path d=\"M0 0 L4 4 L8 0\" />\n </svg>\n );\n }}\n </OverlayArrow>\n );\n}\n\nTooltipArrowComponent.displayName = 'TooltipArrow';\n\n/**\n * Export all components\n *\n * Following Themis pattern - export individual components\n * No Object.assign compound pattern for Tooltip since React Aria\n * expects specific component hierarchy.\n */\nexport const Tooltip = TooltipRoot;\nexport const TooltipTrigger = TooltipTriggerComponent;\nexport const TooltipContent = TooltipContentComponent;\nexport const TooltipArrow = TooltipArrowComponent;\n","'use client';\n\n/**\n * ChartTooltip Component\n *\n * Floating tooltip that appears on focus/hover.\n * Reuses styling from Themis Tooltip component for consistency.\n * Positioned above the data point with boundary handling.\n *\n * @see plan.md Decision 4: Tooltip Behavior\n * @see plan.md Decision 14: Tooltip Positioning\n */\n\nimport { type ReactElement, useRef, useEffect, useState } from 'react';\nimport { tooltipContentVariants } from '../Tooltip/Tooltip';\n\nexport interface ChartTooltipProps {\n /** Whether the tooltip is visible */\n visible: boolean;\n /** Point X coordinate */\n x: number;\n /** Point Y coordinate */\n y: number;\n /** Series name */\n seriesName: string;\n /** Point label */\n label: string;\n /** Formatted value */\n value: string;\n /** Chart width for boundary checks */\n chartWidth: number;\n /** Chart height for boundary checks */\n chartHeight: number;\n /** Optional trend text (e.g., \"up 15% from previous\") */\n trend?: string | null;\n /** Trend direction for icon display */\n trendDirection?: 'up' | 'down' | null;\n}\n\nconst TOOLTIP_GAP = 8;\n\n/**\n * ChartTooltip - Focus/hover tooltip\n *\n * Shows data point information on keyboard focus and mouse hover.\n * Uses Themis Tooltip styling for visual consistency.\n * Positions above the point by default, flips below if near top edge.\n */\nexport function ChartTooltip({\n visible,\n x,\n y,\n seriesName,\n label,\n value,\n chartWidth,\n chartHeight,\n trend,\n trendDirection,\n}: ChartTooltipProps): ReactElement | null {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ left: 0, top: 0 });\n const [side, setSide] = useState<'top' | 'bottom'>('top');\n\n // Suppress unused variable warning\n void chartHeight;\n\n useEffect(() => {\n if (!visible || !tooltipRef.current) return;\n\n const tooltip = tooltipRef.current;\n const tooltipRect = tooltip.getBoundingClientRect();\n const tooltipWidth = tooltipRect.width || 120;\n const tooltipHeight = tooltipRect.height || 50;\n\n // Calculate position (centered above point)\n let left = x - tooltipWidth / 2;\n let top = y - tooltipHeight - TOOLTIP_GAP;\n let newSide: 'top' | 'bottom' = 'top';\n\n // Boundary checks\n // Flip below if near top\n if (top < 0) {\n top = y + TOOLTIP_GAP + 16; // 16px offset for focus ring\n newSide = 'bottom';\n }\n\n // Clamp left edge\n if (left < 0) {\n left = 0;\n }\n\n // Clamp right edge\n if (left + tooltipWidth > chartWidth) {\n left = chartWidth - tooltipWidth;\n }\n\n setPosition({ left, top });\n setSide(newSide);\n }, [visible, x, y, chartWidth]);\n\n if (!visible) {\n return null;\n }\n\n return (\n <div\n ref={tooltipRef}\n aria-hidden=\"true\"\n className={tooltipContentVariants({ side })}\n style={{\n position: 'absolute',\n left: position.left,\n top: position.top,\n pointerEvents: 'none',\n }}\n data-testid=\"chart-tooltip\"\n >\n <div className=\"font-medium\">{seriesName}</div>\n <div className=\"opacity-80\">\n {label}: <span className=\"font-semibold\">{value}</span>\n </div>\n {trend && (\n <div className=\"text-xs opacity-70 mt-1 flex items-center gap-1\">\n {trendDirection === 'up' ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-green-500\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 17a.75.75 0 01-.75-.75V5.612L5.29 9.77a.75.75 0 01-1.08-1.04l5.25-5.5a.75.75 0 011.08 0l5.25 5.5a.75.75 0 11-1.08 1.04l-3.96-4.158V16.25A.75.75 0 0110 17z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : trendDirection === 'down' ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-red-500\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 3a.75.75 0 01.75.75v10.638l3.96-4.158a.75.75 0 111.08 1.04l-5.25 5.5a.75.75 0 01-1.08 0l-5.25-5.5a.75.75 0 111.08-1.04l3.96 4.158V3.75A.75.75 0 0110 3z\"\n clipRule=\"evenodd\"\n />\n </svg>\n ) : null}\n <span>{trend}</span>\n </div>\n )}\n </div>\n );\n}\n\nChartTooltip.displayName = 'ChartTooltip';\n","'use client';\n\n/**\n * ChartLegend Component\n *\n * Series legend displayed below the chart.\n * Shows color swatches and series names.\n *\n * @see plan.md Decision 9: ChartLegend Export (internal only)\n * @see plan.md Decision 12: Legend Position (below chart)\n */\n\nimport { type ReactElement } from 'react';\nimport type { DataSeries, LinePattern } from './Chart.types';\nimport { legendVariants } from './chart.variants';\nimport { LINE_PATTERNS } from './chart.constants';\n\nexport interface ChartLegendProps {\n /** Chart data series */\n data: DataSeries[];\n /** Whether the legend is visible */\n visible: boolean;\n /** Chart type (affects pattern display) */\n type: 'bar' | 'line';\n /** Function to get series color */\n getSeriesColor: (seriesIndex: number) => string;\n}\n\n/**\n * ChartLegend - Series legend (internal component)\n *\n * Displays legend items below the chart with color swatches.\n * For line charts, also shows line pattern indicators.\n */\nexport function ChartLegend({\n data,\n visible,\n type,\n getSeriesColor,\n}: ChartLegendProps): ReactElement | null {\n if (!visible) {\n return null;\n }\n\n return (\n <div\n className={legendVariants({ visible })}\n role=\"list\"\n aria-label=\"Chart legend\"\n data-testid=\"chart-legend\"\n >\n {data.map((series, index) => {\n const color = series.color || getSeriesColor(index);\n const pattern = series.pattern || 'solid';\n\n return (\n <div\n key={series.name}\n role=\"listitem\"\n className=\"flex items-center gap-2\"\n >\n {/* Color swatch */}\n {type === 'bar' ? (\n <div\n className=\"h-3 w-3 rounded-sm\"\n style={{ backgroundColor: color }}\n data-testid={`legend-color-${index}`}\n aria-hidden=\"true\"\n />\n ) : (\n <svg\n width=\"24\"\n height=\"12\"\n aria-hidden=\"true\"\n data-testid={`legend-color-${index}`}\n >\n <line\n x1=\"0\"\n y1=\"6\"\n x2=\"24\"\n y2=\"6\"\n stroke={color}\n strokeWidth=\"2\"\n strokeDasharray={\n LINE_PATTERNS[pattern as LinePattern] === 'none'\n ? undefined\n : LINE_PATTERNS[pattern as LinePattern]\n }\n />\n </svg>\n )}\n\n {/* Series name */}\n <span className=\"text-sm text-[var(--content-foreground)]\">\n {series.name}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n\nChartLegend.displayName = 'ChartLegend';\n","'use client';\n\n/**\n * ChartAnnouncer Component\n *\n * aria-live region for screen reader announcements.\n * Provides polite announcements for focus changes and data values.\n *\n * @see plan.md Decision 3: Screen Reader Announcements\n */\n\nimport { type ReactElement } from 'react';\nimport { VisuallyHidden } from 'react-aria';\n\nexport interface ChartAnnouncerProps {\n /** Current announcement text */\n announcement: string;\n}\n\n/**\n * ChartAnnouncer - aria-live region for screen reader announcements\n *\n * Uses polite mode to avoid interrupting current speech.\n * Atomic ensures the entire region is announced when changed.\n */\nexport function ChartAnnouncer({\n announcement,\n}: ChartAnnouncerProps): ReactElement {\n return (\n <VisuallyHidden>\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n data-testid=\"chart-announcer\"\n >\n {announcement}\n </div>\n </VisuallyHidden>\n );\n}\n\nChartAnnouncer.displayName = 'ChartAnnouncer';\n","'use client';\n\n/**\n * ChartDataTable Component\n *\n * Hidden accessible data table as fallback for screen readers.\n * Provides full data access in a familiar table format.\n *\n * @see plan.md ChartDataTable section\n */\n\nimport { type ReactElement } from 'react';\nimport { VisuallyHidden } from 'react-aria';\nimport type { DataSeries } from './Chart.types';\n\nexport interface ChartDataTableProps {\n /** Chart data series */\n data: DataSeries[];\n /** Chart title for table caption */\n title: string;\n /** X-axis label (used as first column header) */\n xAxisLabel: string;\n /** Y-axis label (used for value columns) */\n yAxisLabel: string;\n /** Value formatter function */\n formatValue: (value: number) => string;\n /** All labels across series (for consistent rows) */\n allLabels: string[];\n}\n\n/**\n * ChartDataTable - Hidden accessible data table\n *\n * Renders chart data in a table format accessible to screen readers.\n * The table is visually hidden but fully accessible.\n */\nexport function ChartDataTable({\n data,\n title,\n xAxisLabel,\n yAxisLabel,\n formatValue,\n allLabels,\n}: ChartDataTableProps): ReactElement {\n // For single series, show simple two-column table\n // For multi-series, show label + one column per series\n const isSingleSeries = data.length === 1;\n\n return (\n <VisuallyHidden>\n <table data-testid=\"chart-data-table\">\n <caption>{title} data table</caption>\n <thead>\n <tr>\n <th scope=\"col\">{xAxisLabel}</th>\n {isSingleSeries ? (\n <th scope=\"col\">{yAxisLabel}</th>\n ) : (\n data.map((series) => (\n <th key={series.name} scope=\"col\">\n {series.name} ({yAxisLabel})\n </th>\n ))\n )}\n </tr>\n </thead>\n <tbody>\n {allLabels.map((label) => (\n <tr key={label}>\n <th scope=\"row\">{label}</th>\n {data.map((series) => {\n const point = series.data.find((p) => p.label === label);\n return (\n <td key={series.name}>\n {point ? formatValue(point.value) : '—'}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </VisuallyHidden>\n );\n}\n\nChartDataTable.displayName = 'ChartDataTable';\n","'use client';\n\n/**\n * useChartKeyboard Hook\n *\n * Keyboard event handling for chart navigation and selection.\n * Integrates with roving tabindex for 2D navigation.\n *\n * @see plan.md Decision 2: Keyboard Navigation Pattern\n */\n\nimport { useCallback, type KeyboardEvent } from 'react';\nimport type { RovingTabIndexActions } from './useRovingTabIndex';\n\nexport interface UseChartKeyboardOptions {\n /** Roving tabindex actions */\n roving: RovingTabIndexActions;\n /** Callback when a point is selected (Enter/Space) */\n onSelect?: () => void;\n /** Callback when selection is cleared (Escape) */\n onClear?: () => void;\n /** Whether the chart is disabled */\n disabled?: boolean;\n}\n\nexport interface ChartKeyboardProps {\n /** Keyboard event handler to spread on the chart element */\n onKeyDown: (event: KeyboardEvent) => void;\n}\n\n/**\n * Hook for chart keyboard event handling\n *\n * Supported keys:\n * - ArrowRight: Move to next point\n * - ArrowLeft: Move to previous point\n * - ArrowDown: Move to next series\n * - ArrowUp: Move to previous series\n * - Home: Move to first point in series\n * - End: Move to last point in series\n * - Enter/Space: Select current point\n * - Escape: Clear selection\n *\n * @param options - Configuration options\n * @returns Keyboard props to spread on the chart element\n */\nexport function useChartKeyboard(\n options: UseChartKeyboardOptions\n): ChartKeyboardProps {\n const { roving, onSelect, onClear, disabled = false } = options;\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent): void => {\n if (disabled) return;\n\n // Handle navigation and selection keys\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n roving.moveRight();\n break;\n\n case 'ArrowLeft':\n event.preventDefault();\n roving.moveLeft();\n break;\n\n case 'ArrowDown':\n event.preventDefault();\n roving.moveDown();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n roving.moveUp();\n break;\n\n case 'Home':\n event.preventDefault();\n roving.moveToStart();\n break;\n\n case 'End':\n event.preventDefault();\n roving.moveToEnd();\n break;\n\n case 'Enter':\n case ' ':\n event.preventDefault();\n onSelect?.();\n break;\n\n case 'Escape':\n event.preventDefault();\n onClear?.();\n break;\n\n default:\n // Let other keys propagate\n break;\n }\n },\n [roving, onSelect, onClear, disabled]\n );\n\n return { onKeyDown };\n}\n","/**\n * Chart Component Types and Schemas\n *\n * Defines Zod schemas and TypeScript types for the Chart component.\n * Implements data validation, props schema, and internal state types.\n *\n * @see chart-prd.md (Product Requirements)\n * @see plan.md (Implementation Plan)\n */\n\nimport { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n// ============================================================================\n// Data Point Schema\n// ============================================================================\n\n/**\n * Schema for individual data point in a chart series\n */\nexport const DataPointSchema = z.object({\n /** X-axis label (e.g., \"January\", \"Q1 2024\") */\n label: z.string().min(1, 'Label is required'),\n /** Y-axis value */\n value: z.number(),\n /** Extended description for screen readers */\n description: z.string().optional(),\n});\n\nexport type DataPoint = z.infer<typeof DataPointSchema>;\n\n// ============================================================================\n// Data Series Schema\n// ============================================================================\n\n/**\n * Line pattern options for line charts (accessibility feature)\n */\nexport const LinePatternSchema = z.enum(['solid', 'dashed', 'dotted']);\nexport type LinePattern = z.infer<typeof LinePatternSchema>;\n\n/**\n * Schema for a data series (one line or set of bars)\n */\nexport const DataSeriesSchema = z.object({\n /** Series name for legend and announcements */\n name: z.string().min(1, 'Series name is required'),\n /** CSS color (defaults to --chart-1 through --chart-5) */\n color: z.string().optional(),\n /** Line pattern for accessibility (defaults to solid) */\n pattern: LinePatternSchema.optional().default('solid'),\n /** Data points in this series */\n data: z.array(DataPointSchema).min(1, 'At least one data point required'),\n});\n\nexport type DataSeries = z.infer<typeof DataSeriesSchema>;\n\n// ============================================================================\n// Chart Type Schema\n// ============================================================================\n\n/**\n * Supported chart types\n */\nexport const ChartTypeSchema = z.enum(['bar', 'line']);\nexport type ChartType = z.infer<typeof ChartTypeSchema>;\n\n// ============================================================================\n// Chart Variant Schema\n// ============================================================================\n\n/**\n * Visual variants for the chart container\n */\nexport const ChartVariantSchema = z.enum(['default', 'muted']);\nexport type ChartVariant = z.infer<typeof ChartVariantSchema>;\n\n// ============================================================================\n// Callback Types\n// ============================================================================\n\n/**\n * Callback for when a data point receives focus\n */\nexport type ChartPointFocusCallback = (\n point: { label: string; value: number },\n seriesIndex: number,\n pointIndex: number\n) => void;\n\n/**\n * Callback for when a data point is selected (Enter/Space)\n */\nexport type ChartPointSelectCallback = (\n point: { label: string; value: number },\n seriesIndex: number,\n pointIndex: number\n) => void;\n\n// ============================================================================\n// Chart Props Schema\n// ============================================================================\n\n/**\n * Main Chart component props schema\n * Maximum 5 series allowed (Decision 11)\n * Note: Callbacks use z.unknown() since Zod can't validate function signatures at runtime\n */\nexport const ChartPropsSchema = BaseComponentPropsSchema.extend({\n // Required props\n /** Chart data - maximum 5 series (Decision 11) */\n data: z\n .array(DataSeriesSchema)\n .min(1, 'At least one data series required')\n .max(5, 'Maximum 5 series allowed'),\n /** Chart type: bar or line */\n type: ChartTypeSchema,\n /** Chart title (displayed and used for accessibility) */\n title: z.string().min(1, 'Title is required'),\n /** Chart description (displayed and used for accessibility) */\n description: z.string().min(1, 'Description is required'),\n /** X-axis label */\n xAxisLabel: z.string().min(1, 'X-axis label is required'),\n /** Y-axis label */\n yAxisLabel: z.string().min(1, 'Y-axis label is required'),\n\n // Optional - Styling\n /** Visual variant */\n variant: ChartVariantSchema.optional().default('default'),\n\n // Optional - Features\n /** Show tooltip on focus/hover (default: true) */\n showTooltip: z.boolean().optional().default(true),\n /** Show grid lines (default: true) */\n showGrid: z.boolean().optional().default(true),\n /** Show legend (auto: shown when >1 series) */\n showLegend: z.boolean().optional(),\n /** Announce trend percentages (default: false) */\n announceTrends: z.boolean().optional().default(false),\n /** ICU format string for upward trend (use {percent} placeholder) */\n trendUpFormat: z.string().optional().default('up {percent}% from previous'),\n /** ICU format string for downward trend (use {percent} placeholder) */\n trendDownFormat: z.string().optional().default('down {percent}% from previous'),\n /** Y-axis starts at zero (default: true) - Decision 6 */\n startAtZero: z.boolean().optional().default(true),\n\n // Optional - Accessibility\n /** Override reduced motion preference */\n reducedMotion: z.boolean().optional(),\n\n // Optional - Events (use z.unknown() since Zod can't validate function types at runtime)\n /** Called when a data point receives focus */\n onPointFocus: z.unknown().optional(),\n /** Called when a data point is selected (Enter/Space) */\n onPointSelect: z.unknown().optional(),\n});\n\n/**\n * Zod-inferred props type (base)\n */\ntype ChartPropsBase = z.infer<typeof ChartPropsSchema>;\n\n/**\n * Chart component props with proper callback types\n */\nexport type ChartProps = Omit<ChartPropsBase, 'onPointFocus' | 'onPointSelect'> & {\n onPointFocus?: ChartPointFocusCallback;\n onPointSelect?: ChartPointSelectCallback;\n};\n\n// ============================================================================\n// Internal State Types\n// ============================================================================\n\n/**\n * Chart focus/selection state\n */\nexport interface ChartState {\n /** Currently focused series index */\n focusedSeries: number;\n /** Currently focused point index within series */\n focusedPoint: number;\n /** Selected point (if any) */\n selectedPoint: { series: number; point: number } | null;\n /** Whether tooltip is visible */\n isTooltipVisible: boolean;\n /** Current screen reader announcement */\n announcement: string;\n}\n\n/**\n * Chart dimension calculations\n */\nexport interface ChartDimensions {\n /** Total chart width */\n width: number;\n /** Total chart height */\n height: number;\n /** Padding around plot area */\n padding: {\n top: number;\n right: number;\n bottom: number;\n left: number;\n };\n /** Inner plot area dimensions */\n plotArea: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n}\n\n/**\n * Scale information for rendering\n */\nexport interface ScaleInfo {\n /** Union of all series labels for label matching (Decision 7) */\n allLabels: string[];\n /** Convert label index to X coordinate */\n xScale: (labelIndex: number) => number;\n /** Convert value to Y coordinate */\n yScale: (value: number) => number;\n /** Minimum Y value (0 if startAtZero) */\n yMin: number;\n /** Maximum Y value (nice number) */\n yMax: number;\n /** Nice tick values for Y axis */\n yTicks: number[];\n}\n\n/**\n * Chart context value shared between components\n */\nexport interface ChartContextValue {\n // State\n focusedSeries: number;\n focusedPoint: number;\n selectedPoint: { series: number; point: number } | null;\n announcement: string;\n isTooltipVisible: boolean;\n tooltipPoint: { series: number; point: number } | null;\n /** Current trend text for tooltip display (e.g., \"up 15% from previous\") */\n currentTrend: string | null;\n /** Current trend direction for tooltip icon display */\n currentTrendDirection: 'up' | 'down' | null;\n\n // Computed\n dimensions: ChartDimensions;\n scales: ScaleInfo;\n\n // Props passthrough\n data: DataSeries[];\n type: ChartType;\n title: string;\n description: string;\n xAxisLabel: string;\n yAxisLabel: string;\n showTooltip: boolean;\n showGrid: boolean;\n showLegend: boolean;\n announceTrends: boolean;\n trendUpFormat: string;\n trendDownFormat: string;\n startAtZero: boolean;\n /** Whether to reduce/disable animations for accessibility */\n reducedMotion: boolean;\n\n // Actions\n setFocus: (series: number, point: number) => void;\n selectPoint: (series: number, point: number) => void;\n clearSelection: () => void;\n announce: (message: string) => void;\n showTooltipAt: (series: number, point: number) => void;\n hideTooltip: () => void;\n\n // Helpers\n getTabIndex: (series: number, point: number) => 0 | -1;\n formatValue: (value: number) => string;\n getSeriesColor: (seriesIndex: number) => string;\n getPointCoordinates: (\n series: number,\n point: number\n ) => { x: number; y: number } | null;\n}\n","'use client';\n\n/**\n * DatePicker Component\n *\n * A fully accessible date picker combining keyboard-editable date segments\n * with a calendar popover for visual selection.\n *\n * Features:\n * - WCAG 2.2 AAA compliant (7:1 contrast, 44x44px touch targets)\n * - Keyboard-editable date segments with spinbutton behavior\n * - Calendar popover with month/year navigation\n * - Time selection with configurable granularity\n * - Internationalization and timezone support\n *\n * @see {@link ../../docs/prd/datepicker-prd.md} for requirements\n */\n\nimport { createContext, forwardRef, memo, useMemo, type ReactElement } from 'react';\nimport {\n DatePicker as AriaDatePicker,\n DateInput as AriaDateInput,\n DateSegment as AriaDateSegment,\n Button as AriaButton,\n Calendar as AriaCalendar,\n CalendarGrid as AriaCalendarGrid,\n CalendarCell as AriaCalendarCell,\n CalendarGridHeader as AriaCalendarGridHeader,\n CalendarHeaderCell as AriaCalendarHeaderCell,\n CalendarGridBody as AriaCalendarGridBody,\n Heading as AriaHeading,\n Popover as AriaPopover,\n Dialog as AriaDialog,\n Label as AriaLabel,\n Text as AriaText,\n Group as AriaGroup,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { Calendar as CalendarIcon, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { DatePickerProps, DatePickerContextValue } from './DatePicker.types';\nimport {\n dateFieldVariants,\n dateSegmentVariants,\n calendarCellVariants,\n calendarHeaderVariants,\n calendarNavButtonVariants,\n calendarGridVariants,\n calendarGridHeaderCellVariants,\n datePickerPopoverVariants,\n datePickerTriggerVariants,\n datePickerDescriptionVariants,\n datePickerErrorVariants,\n datePickerLabelVariants,\n} from './DatePicker.variants';\n\n// =============================================================================\n// Context\n// =============================================================================\n\nconst DatePickerContext = createContext<DatePickerContextValue>({\n size: 'default',\n});\n\n// Export for potential future use in compound components\nexport { DatePickerContext };\n\n// =============================================================================\n// DatePicker Component\n// =============================================================================\n\n/**\n * DatePicker component for selecting dates with keyboard input and calendar popup.\n *\n * @example\n * ```tsx\n * <DatePicker\n * label=\"Event Date\"\n * description=\"When will the event take place?\"\n * />\n * ```\n */\nexport const DatePicker = memo(forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n label,\n description,\n errorMessage,\n size = 'default',\n className,\n placement = 'bottom',\n ...props\n },\n ref\n ): ReactElement => {\n // Memoize context value to prevent unnecessary re-renders of consumers\n const contextValue = useMemo<DatePickerContextValue>(\n () => ({\n size,\n isInvalid: props.isInvalid,\n isDisabled: props.isDisabled,\n }),\n [size, props.isInvalid, props.isDisabled]\n );\n\n return (\n <DatePickerContext.Provider value={contextValue}>\n <AriaDatePicker\n ref={ref}\n className={cn('group flex flex-col gap-1', className)}\n {...props}\n >\n {/* Label */}\n <AriaLabel\n className={cn(datePickerLabelVariants({ size }))}\n data-required={props.isRequired || undefined}\n >\n {label}\n </AriaLabel>\n\n {/* Date Field Group */}\n <AriaGroup\n className={cn(\n dateFieldVariants({\n size,\n isInvalid: props.isInvalid,\n })\n )}\n >\n <AriaDateInput className=\"flex flex-1 items-center\">\n {(segment) => (\n <AriaDateSegment\n segment={segment}\n className={cn(dateSegmentVariants({ size }))}\n />\n )}\n </AriaDateInput>\n\n {/* Calendar Trigger Button */}\n <AriaButton\n className={cn(datePickerTriggerVariants({ size }))}\n aria-label=\"Open calendar\"\n >\n <CalendarIcon className=\"h-4 w-4\" />\n </AriaButton>\n </AriaGroup>\n\n {/* Description */}\n {description && (\n <AriaText\n slot=\"description\"\n className={cn(datePickerDescriptionVariants({ size }))}\n >\n {description}\n </AriaText>\n )}\n\n {/* Error Message */}\n <AriaFieldError className={cn(datePickerErrorVariants({ size }))}>\n {errorMessage}\n </AriaFieldError>\n\n {/* Calendar Popover */}\n <AriaPopover\n placement={placement}\n className={cn(datePickerPopoverVariants({ size }))}\n >\n <AriaDialog className=\"outline-none\">\n <AriaCalendar className=\"w-full\">\n {/* Calendar Header - use div instead of header to avoid landmark a11y issues */}\n <div className={cn(calendarHeaderVariants({ size }))}>\n <AriaButton\n slot=\"previous\"\n className={cn(calendarNavButtonVariants({ size }))}\n aria-label=\"Previous month\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </AriaButton>\n\n <AriaHeading className=\"flex-1 text-center font-semibold\" />\n\n <AriaButton\n slot=\"next\"\n className={cn(calendarNavButtonVariants({ size }))}\n aria-label=\"Next month\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </AriaButton>\n </div>\n\n {/* Calendar Grid */}\n <AriaCalendarGrid className={cn(calendarGridVariants({ size }))}>\n <AriaCalendarGridHeader>\n {(day) => (\n <AriaCalendarHeaderCell\n className={cn(calendarGridHeaderCellVariants({ size }))}\n >\n {day}\n </AriaCalendarHeaderCell>\n )}\n </AriaCalendarGridHeader>\n <AriaCalendarGridBody>\n {(date) => (\n <AriaCalendarCell\n date={date}\n className={cn(calendarCellVariants({ size }))}\n />\n )}\n </AriaCalendarGridBody>\n </AriaCalendarGrid>\n </AriaCalendar>\n </AriaDialog>\n </AriaPopover>\n </AriaDatePicker>\n </DatePickerContext.Provider>\n );\n }\n));\n\nDatePicker.displayName = 'DatePicker';\n","/**\n * Shared CVA Variant Utilities\n *\n * Common patterns extracted from component variants for consistency and reduced bundle size.\n * Use these constants in CVA definitions to ensure consistent styling across Themis.\n *\n * @see interaction-states.ts for interaction-specific styles (focus, hover, pressed)\n */\n\n// =============================================================================\n// Focus Ring Patterns\n// =============================================================================\n\n/**\n * Focus-within ring (for container elements with focusable children)\n * Use when the container should show focus when any child is focused\n */\nexport const FOCUS_WITHIN_RING = [\n 'focus-within:outline-none',\n 'focus-within:ring-2',\n 'focus-within:ring-[var(--ring)]',\n 'focus-within:ring-offset-2',\n] as const;\n\n/**\n * Focus-visible ring (for directly focusable elements)\n * Use for buttons, inputs, and other interactive elements\n */\nexport const FOCUS_VISIBLE_RING = [\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n] as const;\n\n/**\n * Standard focus ring (for elements using :focus pseudo-class)\n * Prefer focus-visible when possible for better UX\n */\nexport const FOCUS_RING = [\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-[var(--ring)]',\n] as const;\n\n/**\n * Focus with background change (for segments, cells, menu items)\n */\nexport const FOCUS_HIGHLIGHT = [\n 'focus:outline-none',\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Disabled State Patterns\n// =============================================================================\n\n/**\n * Standard disabled state using disabled attribute\n */\nexport const DISABLED_STANDARD = [\n 'disabled:pointer-events-none',\n 'disabled:opacity-50',\n] as const;\n\n/**\n * Disabled state using data attribute (React Aria pattern)\n */\nexport const DISABLED_DATA_ATTR = [\n 'data-[disabled]:pointer-events-none',\n 'data-[disabled]:opacity-50',\n 'data-[disabled]:cursor-not-allowed',\n] as const;\n\n// =============================================================================\n// Size-Based Text Variants\n// =============================================================================\n\n/**\n * Small text size scale (xs -> sm -> base)\n */\nexport const TEXT_SIZE_SMALL_SCALE = {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n} as const;\n\n/**\n * Medium text size scale (sm -> base -> lg)\n */\nexport const TEXT_SIZE_MEDIUM_SCALE = {\n sm: 'text-sm',\n default: 'text-base',\n lg: 'text-lg',\n} as const;\n\n// =============================================================================\n// Touch Target Utilities\n// =============================================================================\n\n/**\n * WCAG 2.2 AAA minimum touch target (44x44px)\n */\nexport const TOUCH_TARGET_MIN = [\n 'min-h-[44px]',\n 'min-w-[44px]',\n] as const;\n\n/**\n * Common button/cell sizes with touch target compliance\n */\nexport const INTERACTIVE_SIZES = {\n sm: 'h-9 w-9', // 36px - desktop only, NOT AAA compliant\n default: 'h-11 w-11', // 44px - AAA compliant\n lg: 'h-14 w-14', // 56px - AAA compliant, enhanced\n} as const;\n\n/**\n * Height-only sizes for fields and inputs\n */\nexport const FIELD_HEIGHTS = {\n sm: 'h-9', // 36px\n default: 'h-11', // 44px\n lg: 'h-14', // 56px\n} as const;\n\n// =============================================================================\n// Message/Feedback Patterns\n// =============================================================================\n\n/**\n * Error message styling\n */\nexport const ERROR_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--destructive)]',\n] as const;\n\n/**\n * Success message styling\n */\nexport const SUCCESS_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--success)]',\n] as const;\n\n/**\n * Description/helper text styling\n */\nexport const DESCRIPTION_BASE = [\n 'text-[var(--menu-muted)]',\n] as const;\n\n/**\n * Label base styling\n */\nexport const LABEL_BASE = [\n 'font-medium',\n 'text-[var(--content-foreground)]',\n] as const;\n\n/**\n * Required indicator pattern\n */\nexport const REQUIRED_INDICATOR = \"after:content-['*'] after:ml-0.5 after:text-[var(--destructive)]\";\n\n// =============================================================================\n// Animation Patterns\n// =============================================================================\n\n/**\n * Popover/dropdown entry animation\n */\nexport const POPOVER_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n] as const;\n\n/**\n * Popover/dropdown exit animation\n */\nexport const POPOVER_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n] as const;\n\n/**\n * Reduced motion support (WCAG 2.2)\n */\nexport const REDUCED_MOTION = [\n 'motion-reduce:transition-none',\n 'motion-reduce:animate-none',\n] as const;\n\n/**\n * Standard transition for colors\n */\nexport const TRANSITION_COLORS = [\n 'transition-colors',\n 'duration-200',\n] as const;\n\n/**\n * Fast transition for interactions\n */\nexport const TRANSITION_FAST = [\n 'transition-colors',\n 'duration-150',\n] as const;\n\n// =============================================================================\n// Hover State Patterns\n// =============================================================================\n\n/**\n * Accent background on hover (for interactive items)\n */\nexport const HOVER_ACCENT = [\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Combines multiple style arrays into a flat array for CVA base styles\n */\nexport function combineStyles(...styles: (readonly string[] | string)[]): string[] {\n return styles.flatMap(s => Array.isArray(s) ? [...s] : [s]);\n}\n","/**\n * DatePicker CVA Variants\n * Uses shared utilities from styles/ for consistency and reduced bundle size.\n */\n\nimport { cva } from 'class-variance-authority';\nimport {\n FOCUS_WITHIN_RING,\n FOCUS_RING,\n FOCUS_HIGHLIGHT,\n DISABLED_DATA_ATTR,\n DISABLED_STANDARD,\n TEXT_SIZE_SMALL_SCALE,\n TEXT_SIZE_MEDIUM_SCALE,\n ERROR_MESSAGE_BASE,\n DESCRIPTION_BASE,\n LABEL_BASE,\n POPOVER_ANIMATION_IN,\n POPOVER_ANIMATION_OUT,\n REDUCED_MOTION,\n TRANSITION_FAST,\n HOVER_ACCENT,\n FIELD_HEIGHTS,\n combineStyles,\n} from '../../styles';\n\n// ============================================================================\n// Date Field Variants\n// ============================================================================\n\nexport const dateFieldVariants = cva(\n combineStyles(\n 'flex items-center rounded-md border',\n 'bg-[var(--content-background)] text-[var(--content-foreground)]',\n 'transition-colors duration-200',\n FOCUS_WITHIN_RING,\n DISABLED_DATA_ATTR\n ),\n {\n variants: {\n size: {\n sm: `${FIELD_HEIGHTS.sm} px-3 text-sm gap-0.5`,\n default: `${FIELD_HEIGHTS.default} px-4 text-base gap-1`,\n lg: `${FIELD_HEIGHTS.lg} px-5 text-lg gap-1.5`,\n },\n isInvalid: {\n true: 'border-[var(--destructive)] focus-within:ring-[var(--destructive)]',\n false: 'border-[var(--input)] hover:border-[var(--input)]/80',\n },\n },\n defaultVariants: {\n size: 'default',\n isInvalid: false,\n },\n }\n);\n\n// ============================================================================\n// Date Segment Variants\n// ============================================================================\n\nexport const dateSegmentVariants = cva(\n combineStyles(\n 'tabular-nums rounded px-0.5',\n FOCUS_HIGHLIGHT,\n 'data-[placeholder]:text-[var(--menu-muted)]',\n 'data-[type=literal]:text-[var(--menu-muted)]'\n ),\n {\n variants: {\n size: TEXT_SIZE_MEDIUM_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Calendar Cell Variants\n// ============================================================================\n\nexport const calendarCellVariants = cva(\n combineStyles(\n 'flex items-center justify-center rounded-md cursor-pointer',\n TRANSITION_FAST,\n HOVER_ACCENT,\n FOCUS_RING,\n // Selected state\n 'data-[selected]:bg-[var(--primary)] data-[selected]:text-[var(--primary-foreground)]',\n 'data-[selected]:hover:bg-[var(--primary)]/90 data-[selected]:font-semibold',\n // Today indicator\n 'data-[today]:border data-[today]:border-[var(--primary)]',\n // Range selection\n 'data-[selection-start]:rounded-l-md data-[selection-start]:rounded-r-none',\n 'data-[selection-end]:rounded-r-md data-[selection-end]:rounded-l-none',\n 'data-[selected]:data-[selection-start]:rounded-l-md',\n 'data-[selected]:data-[selection-end]:rounded-r-md',\n // Unavailable/outside/disabled states\n 'data-[unavailable]:text-[var(--menu-muted)] data-[unavailable]:pointer-events-none data-[unavailable]:opacity-50 data-[unavailable]:line-through',\n 'data-[outside-month]:text-[var(--menu-muted)] data-[outside-month]:opacity-50',\n 'data-[disabled]:text-[var(--menu-muted)] data-[disabled]:pointer-events-none data-[disabled]:opacity-50'\n ),\n {\n variants: {\n size: {\n sm: 'h-9 w-9 text-sm',\n default: 'h-11 w-11 text-base',\n lg: 'h-14 w-14 text-lg',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Calendar Header Variants\n// ============================================================================\n\nexport const calendarHeaderVariants = cva(\n 'flex items-center justify-between px-1 pb-4',\n {\n variants: {\n size: TEXT_SIZE_MEDIUM_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Calendar Navigation Button Variants\n// ============================================================================\n\nexport const calendarNavButtonVariants = cva(\n combineStyles(\n 'inline-flex items-center justify-center rounded-md text-[var(--menu-muted)]',\n TRANSITION_FAST,\n HOVER_ACCENT,\n FOCUS_RING,\n DISABLED_STANDARD\n ),\n {\n variants: {\n size: {\n sm: 'h-7 w-7',\n default: 'h-9 w-9',\n lg: 'h-11 w-11',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Calendar Grid Variants\n// ============================================================================\n\nexport const calendarGridVariants = cva(\n 'w-full border-collapse',\n {\n variants: {\n size: TEXT_SIZE_MEDIUM_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Calendar Grid Header Cell Variants\n// ============================================================================\n\nexport const calendarGridHeaderCellVariants = cva(\n 'text-center font-medium text-[var(--menu-muted)] pb-2',\n {\n variants: {\n size: {\n sm: 'text-xs w-9',\n default: 'text-sm w-11',\n lg: 'text-base w-14',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Popover Variants\n// ============================================================================\n\nexport const datePickerPopoverVariants = cva(\n combineStyles(\n 'z-50 rounded-md border p-3 shadow-md outline-none',\n 'bg-[var(--menu-background)] text-[var(--menu-foreground)]',\n POPOVER_ANIMATION_IN,\n POPOVER_ANIMATION_OUT,\n REDUCED_MOTION\n ),\n {\n variants: {\n size: {\n sm: 'w-[260px]',\n default: 'w-[320px]',\n lg: 'w-[380px]',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Trigger Button Variants\n// ============================================================================\n\nexport const datePickerTriggerVariants = cva(\n combineStyles(\n 'inline-flex items-center justify-center rounded-md text-[var(--menu-muted)]',\n TRANSITION_FAST,\n HOVER_ACCENT,\n FOCUS_RING,\n DISABLED_DATA_ATTR\n ),\n {\n variants: {\n size: {\n sm: 'h-7 w-7',\n default: 'h-9 w-9',\n lg: 'h-11 w-11',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Description and Error Variants\n// ============================================================================\n\nexport const datePickerDescriptionVariants = cva(\n combineStyles(DESCRIPTION_BASE, 'mt-1'),\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const datePickerErrorVariants = cva(\n combineStyles(ERROR_MESSAGE_BASE, 'mt-1'),\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Label Variants\n// ============================================================================\n\nexport const datePickerLabelVariants = cva(\n combineStyles(\n LABEL_BASE,\n 'block mb-1.5',\n 'data-[required]:after:content-[\"*\"] data-[required]:after:ml-0.5 data-[required]:after:text-[var(--destructive)]'\n ),\n {\n variants: {\n size: {\n sm: 'text-sm',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n","'use client';\n\n/**\n * DateRangePicker Component\n *\n * A date range picker for selecting start and end dates with a shared calendar.\n *\n * Features:\n * - Start and end date fields with range separator\n * - RangeCalendar with highlighted selection\n * - Validates end date is after start date\n * - WCAG 2.2 AAA compliant\n *\n * @see {@link ../../docs/prd/datepicker-prd.md} for requirements\n */\n\nimport { forwardRef, type ReactElement } from 'react';\nimport {\n DateRangePicker as AriaDateRangePicker,\n DateInput as AriaDateInput,\n DateSegment as AriaDateSegment,\n Button as AriaButton,\n RangeCalendar as AriaRangeCalendar,\n CalendarGrid as AriaCalendarGrid,\n CalendarCell as AriaCalendarCell,\n CalendarGridHeader as AriaCalendarGridHeader,\n CalendarHeaderCell as AriaCalendarHeaderCell,\n CalendarGridBody as AriaCalendarGridBody,\n Heading as AriaHeading,\n Popover as AriaPopover,\n Dialog as AriaDialog,\n Label as AriaLabel,\n Text as AriaText,\n Group as AriaGroup,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { Calendar as CalendarIcon, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { DateRangePickerProps } from './DatePicker.types';\nimport {\n dateFieldVariants,\n dateSegmentVariants,\n calendarCellVariants,\n calendarHeaderVariants,\n calendarNavButtonVariants,\n calendarGridVariants,\n calendarGridHeaderCellVariants,\n datePickerPopoverVariants,\n datePickerTriggerVariants,\n datePickerDescriptionVariants,\n datePickerErrorVariants,\n datePickerLabelVariants,\n} from './DatePicker.variants';\n\n// =============================================================================\n// DateRangePicker Component\n// =============================================================================\n\n/**\n * DateRangePicker component for selecting date ranges.\n *\n * @example\n * ```tsx\n * <DateRangePicker\n * label=\"Stay Duration\"\n * description=\"Select check-in and check-out dates\"\n * />\n * ```\n */\nexport const DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(\n (\n {\n label,\n description,\n errorMessage,\n size = 'default',\n className,\n placement = 'bottom',\n startName,\n endName,\n ...props\n },\n ref\n ): ReactElement => {\n return (\n <AriaDateRangePicker\n ref={ref}\n className={cn('group flex flex-col gap-1', className)}\n startName={startName}\n endName={endName}\n {...props}\n >\n {/* Label */}\n <AriaLabel\n className={cn(datePickerLabelVariants({ size }))}\n data-required={props.isRequired || undefined}\n >\n {label}\n </AriaLabel>\n\n {/* Date Range Field Group */}\n <AriaGroup\n className={cn(\n dateFieldVariants({\n size,\n isInvalid: props.isInvalid,\n })\n )}\n >\n {/* Start Date Input */}\n <AriaDateInput slot=\"start\" className=\"flex items-center\">\n {(segment) => (\n <AriaDateSegment\n segment={segment}\n className={cn(dateSegmentVariants({ size }))}\n />\n )}\n </AriaDateInput>\n\n {/* Range Separator */}\n <span\n aria-hidden=\"true\"\n className=\"px-2 text-[var(--menu-muted)]\"\n >\n –\n </span>\n\n {/* End Date Input */}\n <AriaDateInput slot=\"end\" className=\"flex items-center\">\n {(segment) => (\n <AriaDateSegment\n segment={segment}\n className={cn(dateSegmentVariants({ size }))}\n />\n )}\n </AriaDateInput>\n\n {/* Calendar Trigger Button */}\n <AriaButton\n className={cn(datePickerTriggerVariants({ size }))}\n aria-label=\"Open calendar\"\n >\n <CalendarIcon className=\"h-4 w-4\" />\n </AriaButton>\n </AriaGroup>\n\n {/* Description */}\n {description && (\n <AriaText\n slot=\"description\"\n className={cn(datePickerDescriptionVariants({ size }))}\n >\n {description}\n </AriaText>\n )}\n\n {/* Error Message */}\n <AriaFieldError className={cn(datePickerErrorVariants({ size }))}>\n {errorMessage}\n </AriaFieldError>\n\n {/* Range Calendar Popover */}\n <AriaPopover\n placement={placement}\n className={cn(datePickerPopoverVariants({ size }))}\n >\n <AriaDialog className=\"outline-none\">\n <AriaRangeCalendar className=\"w-full\">\n {/* Calendar Header - use div instead of header to avoid landmark a11y issues */}\n <div className={cn(calendarHeaderVariants({ size }))}>\n <AriaButton\n slot=\"previous\"\n className={cn(calendarNavButtonVariants({ size }))}\n aria-label=\"Previous month\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </AriaButton>\n\n <AriaHeading className=\"flex-1 text-center font-semibold\" />\n\n <AriaButton\n slot=\"next\"\n className={cn(calendarNavButtonVariants({ size }))}\n aria-label=\"Next month\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </AriaButton>\n </div>\n\n {/* Calendar Grid */}\n <AriaCalendarGrid className={cn(calendarGridVariants({ size }))}>\n <AriaCalendarGridHeader>\n {(day) => (\n <AriaCalendarHeaderCell\n className={cn(calendarGridHeaderCellVariants({ size }))}\n >\n {day}\n </AriaCalendarHeaderCell>\n )}\n </AriaCalendarGridHeader>\n <AriaCalendarGridBody>\n {(date) => (\n <AriaCalendarCell\n date={date}\n className={cn(calendarCellVariants({ size }))}\n />\n )}\n </AriaCalendarGridBody>\n </AriaCalendarGrid>\n </AriaRangeCalendar>\n </AriaDialog>\n </AriaPopover>\n </AriaDateRangePicker>\n );\n }\n);\n\nDateRangePicker.displayName = 'DateRangePicker';\n","'use client';\n\n/**\n * DateField Component\n *\n * A standalone keyboard-editable date field without calendar popover.\n * Useful for dense forms where a full DatePicker is not needed.\n *\n * Features:\n * - Keyboard-editable date segments with spinbutton behavior\n * - Full keyboard navigation (Tab, Arrow keys, number typing)\n * - Time selection with configurable granularity\n * - WCAG 2.2 AAA compliant\n *\n * @see {@link ../../docs/prd/datepicker-prd.md} for requirements\n */\n\nimport { forwardRef, type ReactElement } from 'react';\nimport {\n DateField as AriaDateField,\n DateInput as AriaDateInput,\n DateSegment as AriaDateSegment,\n Label as AriaLabel,\n Text as AriaText,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport type { DateFieldProps } from './DatePicker.types';\nimport {\n dateFieldVariants,\n dateSegmentVariants,\n datePickerDescriptionVariants,\n datePickerErrorVariants,\n datePickerLabelVariants,\n} from './DatePicker.variants';\n\n// =============================================================================\n// DateField Component\n// =============================================================================\n\n/**\n * DateField component for keyboard-editable date input.\n *\n * @example\n * ```tsx\n * <DateField\n * label=\"Birth Date\"\n * description=\"Enter your date of birth\"\n * />\n * ```\n */\nexport const DateField = forwardRef<HTMLDivElement, DateFieldProps>(\n (\n {\n label,\n description,\n errorMessage,\n size = 'default',\n className,\n ...props\n },\n ref\n ): ReactElement => {\n return (\n <AriaDateField\n ref={ref}\n className={cn('group flex flex-col gap-1', className)}\n {...props}\n >\n {/* Label */}\n <AriaLabel\n className={cn(datePickerLabelVariants({ size }))}\n data-required={props.isRequired || undefined}\n >\n {label}\n </AriaLabel>\n\n {/* Date Input */}\n <AriaDateInput\n className={cn(\n dateFieldVariants({\n size,\n isInvalid: props.isInvalid,\n }),\n 'w-fit'\n )}\n >\n {(segment) => (\n <AriaDateSegment\n segment={segment}\n className={cn(dateSegmentVariants({ size }))}\n />\n )}\n </AriaDateInput>\n\n {/* Description */}\n {description && (\n <AriaText\n slot=\"description\"\n className={cn(datePickerDescriptionVariants({ size }))}\n >\n {description}\n </AriaText>\n )}\n\n {/* Error Message */}\n <AriaFieldError className={cn(datePickerErrorVariants({ size }))}>\n {errorMessage}\n </AriaFieldError>\n </AriaDateField>\n );\n }\n);\n\nDateField.displayName = 'DateField';\n","'use client';\n\n/**\n * Calendar Component\n *\n * A standalone calendar grid for inline date selection.\n * Useful when the calendar should always be visible (not in a popover).\n *\n * Features:\n * - Full keyboard navigation (Arrow keys, Page Up/Down, Home/End)\n * - Month/year navigation\n * - Date constraints (min/max, unavailable dates)\n * - WCAG 2.2 AAA compliant (7:1 contrast, 44x44px touch targets)\n *\n * @see {@link ../../docs/prd/datepicker-prd.md} for requirements\n */\n\nimport { forwardRef, type ReactElement } from 'react';\nimport {\n Calendar as AriaCalendar,\n CalendarGrid as AriaCalendarGrid,\n CalendarCell as AriaCalendarCell,\n CalendarGridHeader as AriaCalendarGridHeader,\n CalendarHeaderCell as AriaCalendarHeaderCell,\n CalendarGridBody as AriaCalendarGridBody,\n Heading as AriaHeading,\n Button as AriaButton,\n} from 'react-aria-components';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { CalendarProps } from './DatePicker.types';\nimport {\n calendarCellVariants,\n calendarHeaderVariants,\n calendarNavButtonVariants,\n calendarGridVariants,\n calendarGridHeaderCellVariants,\n} from './DatePicker.variants';\n\n// =============================================================================\n// Calendar Component\n// =============================================================================\n\n/**\n * Calendar component for inline date selection.\n *\n * @example\n * ```tsx\n * <Calendar\n * value={selectedDate}\n * onChange={setSelectedDate}\n * minValue={today(getLocalTimeZone())}\n * />\n * ```\n */\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(\n ({ size = 'default', className, ...props }, ref): ReactElement => {\n return (\n <AriaCalendar\n ref={ref}\n className={cn('w-fit', className)}\n {...props}\n >\n {/* Calendar Header - use div instead of header to avoid landmark a11y issues */}\n <div className={cn(calendarHeaderVariants({ size }))}>\n <AriaButton\n slot=\"previous\"\n className={cn(calendarNavButtonVariants({ size }))}\n aria-label=\"Previous month\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </AriaButton>\n\n <AriaHeading className=\"flex-1 text-center font-semibold\" />\n\n <AriaButton\n slot=\"next\"\n className={cn(calendarNavButtonVariants({ size }))}\n aria-label=\"Next month\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </AriaButton>\n </div>\n\n {/* Calendar Grid */}\n <AriaCalendarGrid className={cn(calendarGridVariants({ size }))}>\n <AriaCalendarGridHeader>\n {(day) => (\n <AriaCalendarHeaderCell\n className={cn(calendarGridHeaderCellVariants({ size }))}\n >\n {day}\n </AriaCalendarHeaderCell>\n )}\n </AriaCalendarGridHeader>\n <AriaCalendarGridBody>\n {(date) => (\n <AriaCalendarCell\n date={date}\n className={cn(calendarCellVariants({ size }))}\n />\n )}\n </AriaCalendarGridBody>\n </AriaCalendarGrid>\n </AriaCalendar>\n );\n }\n);\n\nCalendar.displayName = 'Calendar';\n","\"use client\";\n\n/**\n * FileField Component - Accessible file selection input\n *\n * Built with React Aria FileTrigger primitive and custom drag-and-drop\n * WCAG 2.2 AAA compliant (7:1 contrast, 44x44px touch targets)\n *\n * @see plan.md for architecture details\n * @see filefield-prd.md for requirements\n */\n\nimport {\n forwardRef,\n useId,\n useState,\n useCallback,\n useRef,\n type DragEvent,\n} from 'react';\nimport { FileTrigger } from 'react-aria-components';\nimport { Button } from '../Button';\nimport { Upload, X, FileIcon, ImageIcon, VideoIcon, AudioLines } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { FileFieldProps, ValidationResult } from './FileField.types';\nimport {\n fileFieldContainerVariants,\n fileFieldDropZoneVariants,\n fileFieldTriggerVariants,\n fileFieldListVariants,\n fileFieldListHeaderVariants,\n fileFieldItemVariants,\n fileFieldRemoveButtonVariants,\n fileFieldErrorVariants,\n fileFieldSuccessVariants,\n fileFieldDescriptionVariants,\n fileFieldLabelVariants,\n} from './FileField.variants';\nimport {\n formatFileSize,\n truncateFileName,\n isFileTypeAccepted,\n getFileIcon,\n deduplicateFiles,\n} from './utils';\nimport { FilePreview } from './FilePreview';\nimport { FileProgress } from './FileProgress';\n\n/**\n * FileField Component\n *\n * Accessible file selection input with drag-and-drop support\n */\nconst FileField = forwardRef<HTMLDivElement, FileFieldProps>(\n function FileField(\n {\n // Required\n label,\n\n // File selection\n acceptedFileTypes,\n allowsMultiple = false,\n\n // Constraints\n maxFileSize,\n maxFiles,\n\n // Display\n description,\n errorMessage,\n successMessage,\n triggerText,\n\n // States\n isRequired,\n isDisabled,\n isInvalid,\n isValid,\n\n // Variants\n size = 'default',\n\n // Form integration\n name,\n id,\n className,\n\n // Value (controlled)\n value = [],\n\n // Events\n onChange,\n validate,\n\n // Phase 1: Image Previews\n showPreviews = false,\n previewSize = 64,\n maxPreviewBytes = 10 * 1024 * 1024,\n renderPreview,\n\n // Phase 1: Upload Progress (will be used later)\n showProgress = false,\n uploadProgress,\n uploadStatus,\n uploadErrors,\n onRetry,\n\n // Standard\n 'data-testid': dataTestId,\n 'aria-label': _ariaLabel,\n 'aria-labelledby': _ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) {\n // Generate unique IDs\n const generatedId = useId();\n const fieldId = id ?? generatedId;\n const labelId = `${fieldId}-label`;\n const descriptionId = `${fieldId}-description`;\n const errorId = `${fieldId}-error`;\n\n // Internal state\n const [isDragOver, setIsDragOver] = useState(false);\n const [internalError, setInternalError] = useState<string | null>(null);\n const dragCounterRef = useRef(0);\n\n // Determine which error to show (external takes precedence)\n const displayError = errorMessage ?? internalError;\n const hasError = isInvalid || !!displayError;\n\n // Build aria-describedby\n const describedByParts: string[] = [];\n if (ariaDescribedBy) describedByParts.push(ariaDescribedBy);\n if (description) describedByParts.push(descriptionId);\n if (displayError) describedByParts.push(errorId);\n const describedBy = describedByParts.length > 0 ? describedByParts.join(' ') : undefined;\n\n /**\n * Validate files against constraints\n */\n const validateFiles = useCallback(\n (files: File[], existingFiles: File[] = []): ValidationResult => {\n const validFiles: File[] = [];\n const errors: string[] = [];\n\n for (const file of files) {\n // Check file type\n if (acceptedFileTypes && !isFileTypeAccepted(file, acceptedFileTypes)) {\n errors.push(`\"${file.name}\" has an invalid file type`);\n continue;\n }\n\n // Check file size\n if (maxFileSize && file.size > maxFileSize) {\n errors.push(\n `\"${file.name}\" exceeds the maximum size of ${formatFileSize(maxFileSize)}`\n );\n continue;\n }\n\n validFiles.push(file);\n }\n\n // Check total count (after deduplication with existing files)\n if (maxFiles && allowsMultiple) {\n const combined = deduplicateFiles(existingFiles, validFiles);\n if (combined.length > maxFiles) {\n errors.push(`Maximum ${maxFiles} files allowed`);\n return { valid: [], errors };\n }\n }\n\n return { valid: validFiles, errors };\n },\n [acceptedFileTypes, maxFileSize, maxFiles, allowsMultiple]\n );\n\n /**\n * Process selected/dropped files\n */\n const processFiles = useCallback(\n (fileList: FileList | null) => {\n if (!fileList || fileList.length === 0) return;\n\n // Clear internal error on new attempt\n setInternalError(null);\n\n const newFiles = Array.from(fileList);\n\n // Validate files\n const existingFiles = allowsMultiple ? value : [];\n const { valid, errors } = validateFiles(newFiles, existingFiles);\n\n if (errors.length > 0) {\n setInternalError(errors[0] ?? 'Invalid file');\n return;\n }\n\n // Run custom validation if provided\n if (validate && valid.length > 0) {\n const customError = validate(\n allowsMultiple ? deduplicateFiles(existingFiles, valid) : valid\n );\n if (customError) {\n setInternalError(customError);\n return;\n }\n }\n\n // Calculate final file list\n let finalFiles: File[];\n if (allowsMultiple) {\n finalFiles = deduplicateFiles(existingFiles, valid);\n } else {\n finalFiles = valid.slice(0, 1);\n }\n\n onChange?.(finalFiles);\n },\n [allowsMultiple, value, validateFiles, validate, onChange]\n );\n\n /**\n * Handle FileTrigger selection\n */\n const handleSelect = useCallback(\n (fileList: FileList | null) => {\n processFiles(fileList);\n },\n [processFiles]\n );\n\n /**\n * Handle file removal\n */\n const handleRemove = useCallback(\n (fileToRemove: File) => {\n const newFiles = value.filter((f) => f !== fileToRemove);\n onChange?.(newFiles);\n },\n [value, onChange]\n );\n\n /**\n * Handle clear all\n */\n const handleClearAll = useCallback(() => {\n onChange?.([]);\n }, [onChange]);\n\n // Drag and drop handlers\n const handleDragEnter = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (isDisabled) return;\n\n dragCounterRef.current++;\n setIsDragOver(true);\n },\n [isDisabled]\n );\n\n const handleDragOver = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n },\n []\n );\n\n const handleDragLeave = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragOver(false);\n }\n },\n []\n );\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragCounterRef.current = 0;\n setIsDragOver(false);\n\n if (isDisabled) return;\n\n const files = e.dataTransfer?.files;\n processFiles(files ?? null);\n },\n [isDisabled, processFiles]\n );\n\n /**\n * Get icon component for file type\n */\n const getIconComponent = (file: File) => {\n const iconType = getFileIcon(file);\n switch (iconType) {\n case 'image':\n return ImageIcon;\n case 'video':\n return VideoIcon;\n case 'audio':\n return AudioLines;\n default:\n return FileIcon;\n }\n };\n\n // Build accept string for file input\n const acceptString = acceptedFileTypes?.join(',');\n\n return (\n <div\n ref={ref}\n id={fieldId}\n className={cn(fileFieldContainerVariants({ size }), className)}\n data-testid={dataTestId ?? 'file-field'}\n {...props}\n >\n {/* Label */}\n <label\n id={labelId}\n className={fileFieldLabelVariants({ size, isRequired })}\n >\n {label}\n </label>\n\n {/* Drop Zone */}\n <div\n role=\"group\"\n data-testid={`${dataTestId ?? 'file-field'}-dropzone`}\n className={cn(\n 'drop-zone', // Added for test selectors\n fileFieldDropZoneVariants({\n size,\n isDragOver,\n isInvalid: hasError,\n isDisabled,\n })\n )}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n aria-disabled={isDisabled || undefined}\n >\n <FileTrigger\n acceptedFileTypes={acceptedFileTypes}\n allowsMultiple={allowsMultiple}\n onSelect={handleSelect}\n >\n <Button\n variant=\"outline\"\n isDisabled={isDisabled}\n buttonVisualClassName={fileFieldTriggerVariants({ size })}\n >\n <Upload className=\"h-4 w-4\" aria-hidden=\"true\" />\n {isDragOver\n ? 'Drop files here'\n : triggerText ?? (allowsMultiple ? 'Choose files' : 'Choose file')}\n </Button>\n </FileTrigger>\n\n {/* Hidden file input for name attribute */}\n {name && (\n <input\n type=\"file\"\n name={name}\n accept={acceptString}\n multiple={allowsMultiple}\n disabled={isDisabled}\n className=\"sr-only\"\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {/* Description */}\n {description && (\n <p\n id={descriptionId}\n className={fileFieldDescriptionVariants({ size })}\n >\n {description}\n </p>\n )}\n\n {/* File List */}\n {value.length > 0 && (\n <div className={fileFieldListVariants({ size })}>\n {/* List Header with Clear All */}\n {value.length >= 2 && (\n <div className={fileFieldListHeaderVariants({ size })}>\n <span className=\"text-[var(--menu-muted)]\">\n {value.length} files selected\n </span>\n <Button\n variant=\"link\"\n visualSize=\"sm\"\n onPress={handleClearAll}\n buttonVisualClassName={cn(\n 'text-[var(--menu-muted)] hover:text-[var(--destructive)]',\n 'underline-offset-4 hover:underline'\n )}\n aria-label=\"Clear all files\"\n >\n Clear all\n </Button>\n </div>\n )}\n\n {/* File Items */}\n <ul className=\"space-y-2\">\n {value.map((file, index) => {\n const IconComponent = getIconComponent(file);\n // Calculate preview size based on field size variant\n const effectivePreviewSize =\n size === 'sm' ? Math.min(previewSize, 40) :\n size === 'lg' ? Math.min(previewSize, 80) :\n Math.min(previewSize, 48);\n\n // Check if we should show progress for this file\n const fileStatus = uploadStatus?.[index];\n const fileProgress = uploadProgress?.[index] ?? 0;\n const fileError = uploadErrors?.get(index);\n const showProgressForFile = showProgress && fileStatus !== undefined;\n\n return (\n <li\n key={`${file.name}-${index}`}\n className={showProgressForFile ? 'p-3' : fileFieldItemVariants({ size })}\n >\n {showProgressForFile ? (\n <FileProgress\n file={file}\n progress={fileProgress}\n status={fileStatus}\n error={fileError}\n onRetry={onRetry ? () => onRetry(index) : undefined}\n size={size}\n />\n ) : (\n <>\n <div className=\"flex items-center gap-2 min-w-0\">\n {showPreviews ? (\n <FilePreview\n file={file}\n size={effectivePreviewSize}\n maxBytes={maxPreviewBytes}\n renderPreview={renderPreview}\n className=\"flex-shrink-0\"\n />\n ) : (\n <IconComponent\n className=\"h-4 w-4 flex-shrink-0 text-[var(--menu-muted)]\"\n aria-hidden=\"true\"\n />\n )}\n <span className=\"truncate\" title={file.name}>\n {truncateFileName(file.name, 30)}\n </span>\n <span className=\"text-[var(--menu-muted)] flex-shrink-0\">\n {formatFileSize(file.size)}\n </span>\n </div>\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n onPress={() => handleRemove(file)}\n buttonVisualClassName={fileFieldRemoveButtonVariants({ size })}\n aria-label={`Remove ${file.name}`}\n isDisabled={isDisabled}\n >\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n )}\n\n {/* Error Message */}\n {displayError && (\n <p\n id={errorId}\n role=\"alert\"\n className={fileFieldErrorVariants({ size })}\n >\n {displayError}\n </p>\n )}\n\n {/* Success Message */}\n {!displayError && isValid && successMessage && (\n <p className={fileFieldSuccessVariants({ size })}>\n {successMessage}\n </p>\n )}\n </div>\n );\n }\n);\n\nFileField.displayName = 'FileField';\n\nexport { FileField };\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport {\n FOCUS_WITHIN_RING,\n FOCUS_VISIBLE_RING,\n DISABLED_STANDARD,\n TEXT_SIZE_SMALL_SCALE,\n TEXT_SIZE_MEDIUM_SCALE,\n TOUCH_TARGET_MIN,\n ERROR_MESSAGE_BASE,\n SUCCESS_MESSAGE_BASE,\n DESCRIPTION_BASE,\n LABEL_BASE,\n TRANSITION_COLORS,\n combineStyles,\n} from '../../styles';\n\n/**\n * FileField CVA Variants\n * Uses shared utilities from styles/ for consistency and reduced bundle size.\n */\n\nexport const fileFieldContainerVariants = cva(\n 'flex flex-col gap-1.5 w-full',\n {\n variants: {\n size: TEXT_SIZE_MEDIUM_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldDropZoneVariants = cva(\n combineStyles(\n 'flex flex-col items-center justify-center rounded-md border-2 border-dashed',\n 'bg-[var(--content-background)] text-[var(--content-foreground)]',\n TRANSITION_COLORS,\n FOCUS_WITHIN_RING\n ),\n {\n variants: {\n size: {\n sm: 'min-h-[100px] p-4 gap-2',\n default: 'min-h-[140px] p-6 gap-3',\n lg: 'min-h-[180px] p-8 gap-4',\n },\n isDragOver: {\n true: 'border-[var(--primary)] bg-[var(--primary)]/5',\n false: 'border-[var(--input)] hover:border-[var(--primary)]/50',\n },\n isInvalid: {\n true: 'border-[var(--destructive)] bg-[var(--destructive)]/5',\n false: '',\n },\n isDisabled: {\n true: 'opacity-50 cursor-not-allowed pointer-events-none',\n false: 'cursor-pointer',\n },\n },\n compoundVariants: [\n {\n isInvalid: true,\n isDragOver: true,\n className: 'border-[var(--destructive)] bg-[var(--destructive)]/5',\n },\n ],\n defaultVariants: {\n size: 'default',\n isDragOver: false,\n isInvalid: false,\n isDisabled: false,\n },\n }\n);\n\nexport const fileFieldTriggerVariants = cva(\n combineStyles(\n 'inline-flex items-center justify-center gap-2 rounded-md font-medium',\n TRANSITION_COLORS,\n TOUCH_TARGET_MIN,\n FOCUS_VISIBLE_RING,\n DISABLED_STANDARD\n ),\n {\n variants: {\n size: {\n sm: 'px-3 py-2 text-xs',\n default: 'px-4 py-2 text-sm',\n lg: 'px-6 py-3 text-base',\n },\n variant: {\n default: 'bg-[var(--primary)] text-[var(--primary-foreground)] hover:bg-[var(--primary)]/90',\n outline: 'border border-[var(--input)] bg-transparent hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]',\n },\n },\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n }\n);\n\nexport const fileFieldListVariants = cva(\n 'flex flex-col gap-2 mt-3',\n {\n variants: {\n size: {\n sm: 'gap-1.5',\n default: 'gap-2',\n lg: 'gap-3',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldListHeaderVariants = cva(\n 'flex items-center justify-between mb-1',\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldItemVariants = cva(\n 'flex items-center justify-between gap-3 bg-[var(--accent-background)] rounded-md border border-[var(--border)]',\n {\n variants: {\n size: {\n sm: 'px-2 py-1.5 text-xs',\n default: 'px-3 py-2 text-sm',\n lg: 'px-4 py-3 text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldRemoveButtonVariants = cva(\n combineStyles(\n 'inline-flex items-center justify-center rounded-full',\n TOUCH_TARGET_MIN,\n '-mr-2 -my-1', // Negative margin for visual sizing\n 'text-[var(--menu-muted)] hover:text-[var(--destructive)] hover:bg-[var(--destructive)]/10',\n 'transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]'\n ),\n {\n variants: {\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldErrorVariants = cva(\n combineStyles(ERROR_MESSAGE_BASE, 'font-medium'),\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldSuccessVariants = cva(\n combineStyles(SUCCESS_MESSAGE_BASE, 'font-medium'),\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldDescriptionVariants = cva(\n DESCRIPTION_BASE,\n {\n variants: {\n size: TEXT_SIZE_SMALL_SCALE,\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport const fileFieldLabelVariants = cva(\n LABEL_BASE,\n {\n variants: {\n size: TEXT_SIZE_MEDIUM_SCALE,\n isRequired: {\n true: \"after:content-['*'] after:ml-0.5 after:text-[var(--destructive)]\",\n false: '',\n },\n },\n defaultVariants: {\n size: 'default',\n isRequired: false,\n },\n }\n);\n\n// Export variant prop types for consumers\nexport type FileFieldContainerVariants = VariantProps<\n typeof fileFieldContainerVariants\n>;\nexport type FileFieldDropZoneVariants = VariantProps<\n typeof fileFieldDropZoneVariants\n>;\nexport type FileFieldTriggerVariants = VariantProps<\n typeof fileFieldTriggerVariants\n>;\nexport type FileFieldItemVariants = VariantProps<typeof fileFieldItemVariants>;\nexport type FileFieldErrorVariants = VariantProps<\n typeof fileFieldErrorVariants\n>;\n","/**\n * FileField Utility Functions\n *\n * Helper functions for file validation, formatting, and manipulation\n * @see plan.md Section 3: Helper Utilities\n */\n\n/**\n * Format file size in human-readable format\n *\n * @param bytes - File size in bytes\n * @returns Formatted string like \"1.5 MB\" or \"0 B\"\n *\n * @example\n * formatFileSize(0) // \"0 B\"\n * formatFileSize(1024) // \"1 KB\"\n * formatFileSize(1536) // \"1.5 KB\"\n * formatFileSize(1048576) // \"1 MB\"\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const size = parseFloat((bytes / Math.pow(k, i)).toFixed(1));\n\n // Remove trailing .0\n const formatted = size % 1 === 0 ? size.toFixed(0) : size.toFixed(1);\n\n return `${formatted} ${sizes[i]}`;\n}\n\n/**\n * Truncate filename with ellipsis, preserving extension\n *\n * @param name - Original filename\n * @param maxLength - Maximum total length (default: 30)\n * @returns Truncated filename like \"resume-2024-fi...pdf\"\n *\n * @example\n * truncateFileName(\"resume.pdf\", 30) // \"resume.pdf\"\n * truncateFileName(\"my-very-long-filename-here.pdf\", 20) // \"my-very-long...pdf\"\n */\nexport function truncateFileName(name: string, maxLength: number = 30): string {\n if (name.length <= maxLength) return name;\n\n const lastDotIndex = name.lastIndexOf('.');\n if (lastDotIndex === -1) {\n // No extension - just truncate\n return `${name.slice(0, maxLength - 3)}...`;\n }\n\n const ext = name.slice(lastDotIndex);\n const base = name.slice(0, lastDotIndex);\n\n // Ensure we have at least some characters of the base name\n const availableLength = maxLength - ext.length - 3; // 3 for \"...\"\n if (availableLength < 1) {\n return `...${ext}`;\n }\n\n const truncatedBase = base.slice(0, availableLength);\n return `${truncatedBase}...${ext}`;\n}\n\n/**\n * Check if a file type is accepted based on accepted types array\n *\n * Supports:\n * - MIME type patterns: \"image/*\", \"video/*\"\n * - Exact MIME types: \"application/pdf\"\n * - File extensions: \".pdf\", \".docx\"\n *\n * @param file - File to check\n * @param acceptedTypes - Array of accepted type patterns\n * @returns true if file type is accepted\n *\n * @example\n * isFileTypeAccepted(pdfFile, ['application/pdf']) // true\n * isFileTypeAccepted(jpgFile, ['image/*']) // true\n * isFileTypeAccepted(docFile, ['.doc', '.docx']) // true\n */\nexport function isFileTypeAccepted(\n file: File,\n acceptedTypes?: string[]\n): boolean {\n // If no restrictions, accept all\n if (!acceptedTypes || acceptedTypes.length === 0) return true;\n\n return acceptedTypes.some((type) => {\n // Handle MIME type patterns (e.g., \"image/*\")\n if (type.endsWith('/*')) {\n const category = type.slice(0, -2);\n return file.type.startsWith(`${category}/`);\n }\n\n // Handle exact MIME types (e.g., \"application/pdf\")\n if (type.includes('/')) {\n return file.type === type;\n }\n\n // Handle extensions (e.g., \".pdf\")\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n }\n\n return false;\n });\n}\n\n/**\n * Get appropriate icon type for a file based on MIME type\n *\n * @param file - File to check\n * @returns Icon type identifier\n *\n * @example\n * getFileIcon(imageFile) // \"image\"\n * getFileIcon(pdfFile) // \"file\"\n */\nexport function getFileIcon(\n file: File\n): 'file' | 'image' | 'video' | 'audio' {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n if (file.type.startsWith('audio/')) return 'audio';\n return 'file';\n}\n\n/**\n * Merge file arrays, replacing duplicates by filename\n *\n * Used for append behavior when selecting additional files.\n * Files with the same name are replaced with the newer version.\n *\n * @param existing - Currently selected files\n * @param incoming - Newly selected files to add\n * @returns Merged array with duplicates replaced\n *\n * @example\n * const existing = [file1, file2];\n * const incoming = [file2New, file3];\n * deduplicateFiles(existing, incoming) // [file1, file2New, file3]\n *\n * @see plan.md Decision 8: Duplicate File Handling\n */\nexport function deduplicateFiles(existing: File[], incoming: File[]): File[] {\n const result = [...existing];\n\n for (const file of incoming) {\n const existingIndex = result.findIndex((f) => f.name === file.name);\n if (existingIndex >= 0) {\n // Replace with new version\n result[existingIndex] = file;\n } else {\n result.push(file);\n }\n }\n\n return result;\n}\n\n/**\n * Convert human-readable file types to MIME type display\n * Used for showing accepted types in UI\n *\n * @param acceptedTypes - Array of accepted type patterns\n * @returns Human-readable string\n *\n * @example\n * formatAcceptedTypes(['image/*']) // \"images\"\n * formatAcceptedTypes(['.pdf', '.doc']) // \"PDF, DOC\"\n * formatAcceptedTypes(['application/pdf']) // \"PDF\"\n */\nexport function formatAcceptedTypes(acceptedTypes?: string[]): string {\n if (!acceptedTypes || acceptedTypes.length === 0) return 'any file';\n\n const formatted = acceptedTypes.map((type) => {\n // MIME type patterns\n if (type === 'image/*') return 'images';\n if (type === 'video/*') return 'videos';\n if (type === 'audio/*') return 'audio';\n\n // File extensions\n if (type.startsWith('.')) {\n return type.slice(1).toUpperCase();\n }\n\n // Exact MIME types - extract subtype\n if (type.includes('/')) {\n const parts = type.split('/');\n const subtype = parts[1] ?? type;\n return subtype.toUpperCase();\n }\n\n return type;\n });\n\n return formatted.join(', ');\n}\n\n// ============================================================================\n// Phase 1: Image Preview Utilities\n// ============================================================================\n\n/**\n * Threshold for image resizing (2MB)\n * Images larger than this will be resized before preview to reduce memory usage\n */\nexport const RESIZE_THRESHOLD = 2 * 1024 * 1024;\n\n/**\n * Check if a file is an image based on MIME type or extension\n *\n * @param file - File to check\n * @returns true if file is an image\n *\n * @example\n * isImageFile(jpgFile) // true\n * isImageFile(pdfFile) // false\n */\nexport function isImageFile(file: File): boolean {\n // Check MIME type first (most reliable)\n if (file.type.startsWith('image/')) {\n return true;\n }\n\n // Fallback to extension check for files with missing/incorrect MIME type\n const imageExtensions =\n /\\.(jpg|jpeg|png|gif|webp|svg|bmp|ico|avif|heic|heif|tiff|tif)$/i;\n return imageExtensions.test(file.name);\n}\n\n/**\n * Create a resized preview image using canvas\n * Used for large images (>2MB) to reduce memory usage\n *\n * @param file - Image file to resize\n * @param maxDimension - Maximum width or height (default: 200)\n * @returns Promise resolving to resized blob URL\n *\n * @example\n * const previewUrl = await createResizedPreview(largeImage, 200);\n * // Remember to call URL.revokeObjectURL(previewUrl) when done\n */\nexport async function createResizedPreview(\n file: File,\n maxDimension: number = 200\n): Promise<string> {\n return new Promise((resolve, reject) => {\n // Use window.Image for browser environment\n const img = new window.Image();\n const objectUrl = URL.createObjectURL(file);\n\n img.onload = () => {\n // Free original object URL immediately\n URL.revokeObjectURL(objectUrl);\n\n // Calculate scaled dimensions (maintain aspect ratio)\n const scale = Math.min(\n maxDimension / img.width,\n maxDimension / img.height,\n 1 // Don't upscale\n );\n const width = Math.round(img.width * scale);\n const height = Math.round(img.height * scale);\n\n // Draw to canvas at reduced size\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n reject(new Error('Canvas context unavailable'));\n return;\n }\n\n ctx.drawImage(img, 0, 0, width, height);\n\n // Convert to blob URL\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(URL.createObjectURL(blob));\n } else {\n reject(new Error('Failed to create blob'));\n }\n },\n 'image/jpeg',\n 0.8 // Quality for JPEG compression\n );\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl);\n reject(new Error('Failed to load image'));\n };\n\n img.src = objectUrl;\n });\n}\n\n/**\n * Generate a preview URL for a file\n * Automatically resizes large images (>2MB) to reduce memory usage\n *\n * @param file - Image file to preview\n * @param maxDimension - Maximum dimension for resized previews (default: 200)\n * @returns Promise resolving to preview blob URL\n *\n * @example\n * const previewUrl = await generatePreview(file, 100);\n * // Remember to call URL.revokeObjectURL(previewUrl) when done\n */\nexport async function generatePreview(\n file: File,\n maxDimension: number = 200\n): Promise<string> {\n if (file.size > RESIZE_THRESHOLD) {\n return createResizedPreview(file, maxDimension);\n }\n return URL.createObjectURL(file);\n}\n","\"use client\";\n\n/**\n * FilePreview Component\n *\n * Displays image thumbnail previews for files in the FileField list\n * @see future-plan.md for architecture details\n */\n\nimport { type ReactNode } from 'react';\nimport { FileIcon, ImageIcon, VideoIcon, AudioLines, Loader2 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useFilePreview } from './useFilePreview';\nimport { getFileIcon } from './utils';\n\nexport interface FilePreviewProps {\n /** File to preview */\n file: File;\n /** Preview size in pixels (width and height) */\n size?: number;\n /** Maximum file size for preview generation */\n maxBytes?: number;\n /** Custom renderer for non-image files */\n renderPreview?: (file: File) => ReactNode;\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * FilePreview Component\n *\n * Displays a thumbnail preview for image files, or an appropriate icon for other file types.\n * Includes loading and error states with accessible feedback.\n */\nexport function FilePreview({\n file,\n size = 64,\n maxBytes = 10 * 1024 * 1024,\n renderPreview,\n className,\n}: FilePreviewProps) {\n const { preview, isLoading, error, isImage } = useFilePreview(file, {\n enabled: true,\n maxBytes,\n maxDimension: size * 2, // Generate at 2x for retina displays\n });\n\n // Container size styles\n const sizeStyles = {\n width: size,\n height: size,\n minWidth: size,\n minHeight: size,\n };\n\n // If custom renderer provided and not an image, use it\n if (!isImage && renderPreview) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md overflow-hidden',\n 'bg-[var(--accent-background)]',\n className\n )}\n style={sizeStyles}\n >\n {renderPreview(file)}\n </div>\n );\n }\n\n // Loading state\n if (isLoading) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md overflow-hidden',\n 'bg-[var(--accent-background)]',\n className\n )}\n style={sizeStyles}\n aria-busy=\"true\"\n aria-label={`Loading preview for ${file.name}`}\n >\n <Loader2\n className=\"h-4 w-4 animate-spin text-[var(--menu-muted)]\"\n aria-hidden=\"true\"\n />\n </div>\n );\n }\n\n // Image preview\n if (isImage && preview && !error) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md overflow-hidden',\n 'bg-[var(--accent-background)]',\n className\n )}\n style={sizeStyles}\n >\n <img\n src={preview}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n );\n }\n\n // Error state or non-image file: show icon\n const iconType = getFileIcon(file);\n const IconComponent = getIconForType(iconType);\n\n // Calculate icon size (roughly 40% of container)\n const iconSize = Math.max(16, Math.floor(size * 0.4));\n\n return (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md overflow-hidden',\n 'bg-[var(--accent-background)]',\n className\n )}\n style={sizeStyles}\n aria-label={error ? `Preview unavailable for ${file.name}` : undefined}\n >\n <IconComponent\n className=\"text-[var(--menu-muted)]\"\n style={{ width: iconSize, height: iconSize }}\n aria-hidden=\"true\"\n />\n </div>\n );\n}\n\n/**\n * Get icon component for file type\n */\nfunction getIconForType(\n iconType: 'file' | 'image' | 'video' | 'audio'\n): typeof FileIcon {\n switch (iconType) {\n case 'image':\n return ImageIcon;\n case 'video':\n return VideoIcon;\n case 'audio':\n return AudioLines;\n default:\n return FileIcon;\n }\n}\n","/**\n * useFilePreview Hook\n *\n * Memory-efficient image preview generation with race condition protection\n * @see future-plan.md for architecture details\n */\n\nimport { useState, useEffect } from 'react';\nimport { isImageFile, generatePreview } from './utils';\n\nexport interface UseFilePreviewOptions {\n /** Whether preview generation is enabled */\n enabled?: boolean;\n /** Maximum file size for preview generation in bytes (default: 10MB) */\n maxBytes?: number;\n /** Maximum preview dimension in pixels (default: 200) */\n maxDimension?: number;\n}\n\nexport interface UseFilePreviewResult {\n /** Preview URL (blob URL) - remember to not revoke manually, hook handles cleanup */\n preview: string | null;\n /** Whether preview is currently being generated */\n isLoading: boolean;\n /** Error message if preview generation failed */\n error: string | null;\n /** Whether the file is an image */\n isImage: boolean;\n}\n\n/**\n * Hook for generating memory-efficient image previews\n *\n * Features:\n * - Uses URL.createObjectURL for better memory management\n * - Automatically resizes large images (>2MB) using canvas\n * - Race condition protection for rapid file changes\n * - Automatic cleanup of blob URLs on unmount/file change\n *\n * @param file - File to generate preview for\n * @param options - Preview configuration options\n * @returns Preview state including URL, loading, and error states\n *\n * @example\n * const { preview, isLoading, error, isImage } = useFilePreview(file, {\n * enabled: showPreviews,\n * maxBytes: 10 * 1024 * 1024,\n * maxDimension: 64\n * });\n */\nexport function useFilePreview(\n file: File,\n options: UseFilePreviewOptions = {}\n): UseFilePreviewResult {\n const { enabled = true, maxBytes = 10 * 1024 * 1024, maxDimension = 200 } = options;\n\n const [preview, setPreview] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isImage = isImageFile(file);\n\n useEffect(() => {\n // Skip if disabled or not an image\n if (!enabled || !isImage) {\n setPreview(null);\n setIsLoading(false);\n setError(null);\n return;\n }\n\n // Skip preview for files exceeding size limit\n if (file.size > maxBytes) {\n setPreview(null);\n setIsLoading(false);\n setError('File too large for preview');\n return;\n }\n\n // Track if effect is still active (prevents race conditions)\n let isActive = true;\n let objectUrl: string | null = null;\n\n const generatePreviewAsync = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Generate preview (may resize if file > RESIZE_THRESHOLD)\n objectUrl = await generatePreview(file, maxDimension);\n\n // Only update state if effect is still active\n if (isActive) {\n setPreview(objectUrl);\n setIsLoading(false);\n } else {\n // Cleanup if component unmounted or file changed\n URL.revokeObjectURL(objectUrl);\n }\n } catch (err) {\n if (isActive) {\n setError(err instanceof Error ? err.message : 'Failed to generate preview');\n setIsLoading(false);\n setPreview(null);\n }\n }\n };\n\n generatePreviewAsync();\n\n // Cleanup: mark inactive and revoke object URL\n return () => {\n isActive = false;\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n // Also revoke current preview if it exists\n setPreview((prev) => {\n if (prev) {\n URL.revokeObjectURL(prev);\n }\n return null;\n });\n };\n }, [file, enabled, maxBytes, maxDimension, isImage]);\n\n return { preview, isLoading, error, isImage };\n}\n","\"use client\";\n\n/**\n * FileProgress Component\n *\n * Accessible upload progress indicator using React Aria ProgressBar\n * WCAG 2.2 AAA compliant with shimmer animation for pending state\n *\n * @see future-plan.md Section 2: Upload Progress Indication\n * @see React Aria ProgressBar: https://react-aria.adobe.com/ProgressBar\n */\n\nimport { ProgressBar, Button } from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport { truncateFileName } from './utils';\nimport {\n fileProgressVariants,\n fileProgressTrackVariants,\n fileProgressBarVariants,\n fileProgressHeaderVariants,\n fileProgressErrorVariants,\n fileProgressRetryVariants,\n} from './FileProgress.variants';\n\n/**\n * Upload status for progress indication\n */\nexport type FileProgressStatus = 'pending' | 'uploading' | 'complete' | 'error';\n\n/**\n * FileProgress component props\n */\nexport interface FileProgressProps {\n /** File being uploaded */\n file: File;\n /** Progress percentage (0-100) */\n progress: number;\n /** Current upload status */\n status: FileProgressStatus;\n /** Error message when status is 'error' */\n error?: string;\n /** Callback when user clicks retry */\n onRetry?: () => void;\n /** Size variant */\n size?: 'sm' | 'default' | 'lg';\n /** Additional CSS classes */\n className?: string;\n}\n\n/**\n * Get status display text\n */\nfunction getStatusText(status: FileProgressStatus, progress: number): string {\n switch (status) {\n case 'pending':\n return 'Waiting...';\n case 'uploading':\n return `${progress}%`;\n case 'complete':\n return 'Complete';\n case 'error':\n return 'Failed';\n }\n}\n\n/**\n * FileProgress Component\n *\n * Displays upload progress for a single file with accessible progress bar,\n * status announcements, and retry functionality for failed uploads.\n */\nfunction FileProgress({\n file,\n progress,\n status,\n error,\n onRetry,\n size = 'default',\n className,\n}: FileProgressProps) {\n const isIndeterminate = status === 'pending';\n const errorId = `progress-error-${file.name.replace(/[^a-zA-Z0-9]/g, '-')}`;\n const statusText = getStatusText(status, progress);\n\n return (\n <div className={cn(fileProgressVariants({ size }), className)}>\n <ProgressBar\n aria-label={file.name}\n value={isIndeterminate ? undefined : progress}\n isIndeterminate={isIndeterminate}\n aria-describedby={status === 'error' && error ? errorId : undefined}\n >\n {({ percentage, valueText }) => (\n <>\n {/* Header: filename + status */}\n <div className={fileProgressHeaderVariants({ size })}>\n <span className=\"truncate\" title={file.name}>\n {truncateFileName(file.name, 30)}\n </span>\n <span className=\"text-[var(--menu-muted)] flex-shrink-0\">\n {status === 'error' ? 'Failed' : valueText ?? statusText}\n </span>\n </div>\n\n {/* Progress bar */}\n <div className={fileProgressTrackVariants({ size })}>\n <div\n className={fileProgressBarVariants({ status })}\n style={{\n width: isIndeterminate ? '100%' : `${percentage ?? 0}%`,\n }}\n />\n </div>\n </>\n )}\n </ProgressBar>\n\n {/* Error message and retry button */}\n {status === 'error' && error && (\n <div\n id={errorId}\n className={fileProgressErrorVariants({ size })}\n >\n <span>{error}</span>\n {onRetry && (\n <Button\n onPress={onRetry}\n className={fileProgressRetryVariants({ size })}\n >\n Retry\n </Button>\n )}\n </div>\n )}\n\n {/* Live region for screen reader announcements */}\n <div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n >\n {status === 'complete' && `${file.name} upload complete`}\n {status === 'error' && `${file.name} upload failed${error ? `: ${error}` : ''}`}\n </div>\n </div>\n );\n}\n\nFileProgress.displayName = 'FileProgress';\n\nexport { FileProgress };\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * FileProgress CVA Variants\n *\n * Type-safe variant definitions for upload progress component\n * Following Themis styling patterns with CSS variable references\n *\n * @see future-plan.md Section 2: Upload Progress Indication\n * @see constitution.md Principle IV: 7:1 contrast ratio\n */\n\n/**\n * Container variants for the FileProgress wrapper\n * Controls spacing and text sizing\n */\nexport const fileProgressVariants = cva(\n ['flex', 'flex-col', 'gap-1', 'w-full'],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Progress bar track variants (background)\n */\nexport const fileProgressTrackVariants = cva(\n ['rounded-full', 'bg-[var(--accent-background)]', 'overflow-hidden'],\n {\n variants: {\n size: {\n sm: 'h-1.5',\n default: 'h-2',\n lg: 'h-3',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Progress bar fill variants\n * Uses shimmer animation for pending (indeterminate) state\n *\n * WCAG 2.2 AAA: High contrast colors for all states\n */\nexport const fileProgressBarVariants = cva(\n ['h-full', 'rounded-full', 'transition-all', 'duration-300'],\n {\n variants: {\n status: {\n pending: [\n 'bg-gradient-to-r',\n 'from-[var(--menu-muted)]',\n 'via-[var(--accent-background)]',\n 'to-[var(--menu-muted)]',\n 'bg-[length:200%_100%]',\n 'animate-progress-shimmer',\n ],\n uploading: 'bg-[var(--primary)]',\n complete: 'bg-[var(--success)]',\n error: 'bg-[var(--destructive)]',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n }\n);\n\n/**\n * Header row variants (filename + status)\n */\nexport const fileProgressHeaderVariants = cva(\n ['flex', 'items-center', 'justify-between', 'gap-2'],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Error message variants\n */\nexport const fileProgressErrorVariants = cva(\n [\n 'flex',\n 'items-center',\n 'justify-between',\n 'gap-2',\n 'mt-1',\n 'text-[var(--destructive)]',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Retry button variants\n * 44x44px minimum touch target for WCAG 2.2 AAA\n */\nexport const fileProgressRetryVariants = cva(\n [\n 'underline',\n 'hover:no-underline',\n 'min-h-[44px]',\n 'min-w-[44px]',\n 'inline-flex',\n 'items-center',\n 'justify-center',\n // Negative margin to visually appear smaller while maintaining touch target\n '-mr-3',\n '-my-2',\n // Focus styling\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n 'rounded',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// Export variant prop types for consumers\nexport type FileProgressVariants = VariantProps<typeof fileProgressVariants>;\nexport type FileProgressBarVariants = VariantProps<typeof fileProgressBarVariants>;\nexport type FileProgressTrackVariants = VariantProps<typeof fileProgressTrackVariants>;\n","import type { ReactNode } from 'react';\nimport { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * FileField props schema extending BaseComponentProps\n *\n * @see filefield-prd.md for full requirements\n * @see plan.md for architectural decisions\n * @see React Aria FileTrigger: https://react-aria.adobe.com/FileTrigger\n */\nexport const FileFieldPropsSchema = BaseComponentPropsSchema.extend({\n // Required\n /** Label text for the file field (required for accessibility) */\n label: z.string(),\n\n // File selection\n /**\n * Array of accepted file types (MIME types or extensions)\n * @example ['application/pdf', 'image/*', '.docx']\n */\n acceptedFileTypes: z.array(z.string()).optional(),\n\n /** Allow selecting multiple files */\n allowsMultiple: z.boolean().default(false),\n\n // Constraints\n /** Maximum file size in bytes */\n maxFileSize: z.number().optional(),\n\n /** Maximum number of files (only applies when allowsMultiple is true) */\n maxFiles: z.number().optional(),\n\n // Display\n /** Description text shown below the drop zone */\n description: z.string().optional(),\n\n /** Error message from external validation */\n errorMessage: z.string().optional(),\n\n /** Success message when files are valid */\n successMessage: z.string().optional(),\n\n /** Custom text for the trigger button */\n triggerText: z.string().optional(),\n\n // States\n /** Mark field as required */\n isRequired: z.boolean().optional(),\n\n /** Disable the field */\n isDisabled: z.boolean().optional(),\n\n /** Show invalid state styling */\n isInvalid: z.boolean().optional(),\n\n /** Show valid state styling */\n isValid: z.boolean().optional(),\n\n // Variants\n /** Size variant */\n size: z.enum(['sm', 'default', 'lg']).default('default'),\n\n // Form integration\n /** Name attribute for form association */\n name: z.string().optional(),\n\n // === Phase 1: Image Previews ===\n /** Enable image thumbnail previews (default: false) */\n showPreviews: z.boolean().default(false),\n\n /** Maximum preview dimension in pixels (default: 64) */\n previewSize: z.number().min(16).max(256).default(64),\n\n /** Maximum file size for preview generation in bytes (default: 10MB) */\n maxPreviewBytes: z.number().default(10 * 1024 * 1024),\n\n // === Phase 1: Upload Progress ===\n /** Enable upload progress display (default: false) */\n showProgress: z.boolean().default(false),\n\n /** Progress values per file (0-100), indexed parallel to files array */\n uploadProgress: z.array(z.number().min(0).max(100)).optional(),\n\n /** Upload status per file, indexed parallel to files array */\n uploadStatus: z\n .array(z.enum(['pending', 'uploading', 'complete', 'error']))\n .optional(),\n})\n .refine(\n (data) => !(data.successMessage && data.errorMessage),\n {\n message:\n 'Cannot provide both successMessage and errorMessage. Use one based on validation state.',\n path: ['successMessage'],\n }\n )\n .refine(\n (data) => {\n // Development mode warning for conflicting validation states\n if (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV === 'development'\n ) {\n if (data.isValid && data.isInvalid) {\n console.error(\n '[FileField] Both isValid and isInvalid are true. isInvalid takes precedence.'\n );\n }\n }\n return true;\n }\n );\n\n/**\n * FileField component props type\n *\n * Includes Zod-validated props plus event handlers that can't be validated by Zod\n */\n/**\n * Upload status for progress indication\n */\nexport type UploadStatus = 'pending' | 'uploading' | 'complete' | 'error';\n\nexport type FileFieldProps = Omit<\n z.infer<typeof FileFieldPropsSchema>,\n 'children'\n> & {\n /** Controlled value - array of selected files */\n value?: File[];\n\n /** Callback when files change */\n onChange?: (files: File[]) => void;\n\n /**\n * Custom validation function\n * Called after internal validation (type, size, count)\n * Return a string to display as error, or undefined/null if valid\n */\n validate?: (files: File[]) => string | undefined | null;\n\n // === Phase 1: Image Previews ===\n /** Custom preview renderer for non-image files */\n renderPreview?: (file: File) => ReactNode;\n\n // === Phase 1: Upload Progress ===\n /** Error messages per file index */\n uploadErrors?: Map<number, string>;\n\n /** Callback when user requests retry for failed upload */\n onRetry?: (fileIndex: number) => void;\n};\n\n/**\n * File field size variants\n */\nexport type FileFieldSize = NonNullable<\n z.infer<typeof FileFieldPropsSchema>['size']\n>;\n\n/**\n * Internal drag state for drop zone styling\n */\nexport type DragState = 'idle' | 'drag-over' | 'drag-invalid';\n\n/**\n * Validation result from internal validation\n */\nexport interface ValidationResult {\n /** Files that passed validation */\n valid: File[];\n /** Error messages for files that failed */\n errors: string[];\n}\n","\"use client\";\n\n/**\n * FormLayout Component\n * Structural layout component for consistent form presentation\n *\n * @see FormLayout-plan.md (Component API Design)\n * @see FormLayout-design-decisions.md (Approved design specifications)\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { JSX, forwardRef, FC, useId, ReactNode, useState, useEffect } from 'react';\nimport { cva } from 'class-variance-authority';\nimport { AlertCircle, CheckCircle2 } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { FormLayoutProps, HeadingLevel } from './FormLayout.types';\n\n/**\n * Body variant styles using CVA\n * Controls column layout and field spacing (density)\n */\nconst formLayoutBodyVariants = cva(\n // Base styles - grid layout with responsive columns\n \"grid grid-cols-1 mt-6\",\n {\n variants: {\n // Column variants (responsive: mobile single, desktop optional double)\n columns: {\n 1: \"\", // Single column (no additional classes needed)\n 2: \"md:grid-cols-2\", // Double column on md breakpoint and up\n },\n // Density variants (controls gap between form fields)\n density: {\n default: \"gap-4\", // 16px gap\n compact: \"gap-2\", // 8px gap\n comfortable: \"gap-6\", // 24px gap\n },\n },\n defaultVariants: {\n columns: 1,\n density: \"default\",\n },\n }\n);\n\n/**\n * Polymorphic Heading Component\n * Renders h1-h6 based on headingLevel prop for proper document hierarchy\n */\ninterface HeadingProps {\n level: HeadingLevel;\n id: string;\n className?: string;\n children: ReactNode;\n}\n\nconst Heading: FC<HeadingProps> = ({ level, id, className, children }) => {\n const Tag = `h${level}` as keyof JSX.IntrinsicElements;\n\n return (\n <Tag id={id} className={className}>\n {children}\n </Tag>\n );\n};\n\n/**\n * FormLayout Component\n * Provides consistent form structure with header, body, and optional actions\n */\nexport const FormLayout = forwardRef<HTMLElement, FormLayoutProps>(\n (\n {\n title,\n requiredNote,\n description,\n columns = 1,\n headingLevel = 2,\n density = 'default',\n errorMessage,\n successMessage,\n fieldErrors: _fieldErrors,\n autoHideSuccess = false,\n autoHideDuration = 5000,\n className,\n children,\n actions,\n id,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n ...props\n },\n ref\n ) => {\n // Generate unique IDs for accessibility\n const headingId = useId();\n const finalHeadingId = id ? `${id}-title` : headingId;\n\n // Determine aria-labelledby (use prop if provided, otherwise point to heading)\n const finalAriaLabelledby = ariaLabelledby || finalHeadingId;\n\n // Auto-hide success message state\n const [showSuccess, setShowSuccess] = useState(true);\n\n // Auto-hide success message after duration\n useEffect(() => {\n // Reset show state when message changes (must come first!)\n setShowSuccess(true);\n\n // Set timeout to hide if autoHideSuccess is enabled\n if (successMessage && autoHideSuccess) {\n const timer = setTimeout(() => {\n setShowSuccess(false);\n }, autoHideDuration);\n\n return (): void => clearTimeout(timer);\n }\n }, [successMessage, autoHideSuccess, autoHideDuration]);\n\n return (\n <section\n ref={ref}\n id={id}\n data-testid={dataTestId}\n aria-label={ariaLabel}\n aria-labelledby={!ariaLabel ? finalAriaLabelledby : undefined}\n aria-describedby={ariaDescribedby}\n className={cn(\"form-layout w-full\", className)}\n {...props}\n >\n {/* Error Message Alert */}\n {errorMessage && (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n data-testid=\"form-layout-error\"\n className={cn(\n \"rounded-lg border px-4 py-3 mb-6 text-sm\",\n \"border-[var(--destructive-background)] bg-[var(--destructive-foreground)] text-[var(--destructive-background)]\",\n \"flex items-start gap-3\"\n )}\n >\n <AlertCircle className=\"h-5 w-5 flex-shrink-0 mt-0.5\" aria-hidden=\"true\" />\n <div className=\"flex-1\">\n <p className=\"font-medium\">Error</p>\n <p className=\"mt-1\">{errorMessage}</p>\n </div>\n </div>\n )}\n\n {/* Success Message Alert */}\n {successMessage && showSuccess && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"form-layout-success\"\n className={cn(\n \"rounded-lg border px-4 py-3 mb-6 text-sm\",\n \"border-success bg-success/10 text-success\",\n \"flex items-start gap-3\"\n )}\n >\n <CheckCircle2 className=\"h-5 w-5 flex-shrink-0 mt-0.5\" aria-hidden=\"true\" />\n <div className=\"flex-1\">\n <p className=\"font-medium\">Success</p>\n <p className=\"mt-1\">{successMessage}</p>\n </div>\n </div>\n )}\n\n {/* Header Section: Title → Description → Required Note */}\n <header className=\"form-layout-header mb-6\">\n {/* Title (configurable heading level) */}\n <Heading\n level={headingLevel}\n id={finalHeadingId}\n className=\"text-[var(--content-foreground)] font-semibold\"\n >\n {title}\n </Heading>\n\n {/* Description (optional) */}\n {description && (\n <p className=\"text-sm text-[var(--content-foreground)] leading-relaxed mt-2\">\n {description}\n </p>\n )}\n\n {/* Required Note (always visible) */}\n <p className=\"text-sm text-[var(--content-foreground)]\">\n {requiredNote}\n </p>\n </header>\n\n {/* Body Section: Form fields with configurable layout */}\n <div\n data-testid=\"form-layout-body\"\n className={cn(\n formLayoutBodyVariants({\n columns,\n density,\n })\n )}\n >\n {children}\n </div>\n\n {/* Actions Section: Optional footer for buttons */}\n {actions && (\n <div data-testid=\"form-layout-actions\" className=\"flex justify-between items-center mt-4 gap-2 max-md:flex-col max-md:w-full\">\n {actions}\n </div>\n )}\n </section>\n );\n }\n);\n\nFormLayout.displayName = \"FormLayout\";\n\nexport { formLayoutBodyVariants };\n","'use client';\n\n/**\n * Modal Component - Implementation\n *\n * Accessible modal dialog component combining React Aria primitives with ShadCN styling.\n * Follows Themis library patterns with compound component structure.\n *\n * @see PRD.md (Full requirements)\n * @see Modal.types.ts (Zod schemas)\n * @see RESEARCH.md (React Aria patterns)\n */\n\nimport {\n Children,\n isValidElement,\n cloneElement,\n useContext,\n createContext,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport {\n DialogTrigger as AriaDialogTrigger,\n Modal as AriaModal,\n ModalOverlay as AriaModalOverlay,\n Dialog as AriaDialog,\n Heading,\n Button as AriaButton,\n OverlayTriggerStateContext,\n} from 'react-aria-components';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { modalContentVariants, modalOverlayVariants } from './Modal.styles';\nimport type {\n ModalProps,\n ModalTriggerProps,\n ModalContentProps,\n ModalOverlayProps,\n ModalHeaderProps,\n ModalTitleProps,\n ModalDescriptionProps,\n ModalFooterProps,\n ModalCloseProps,\n} from './Modal.types';\n\n/**\n * Modal Context\n * Passes role prop from Modal root to Modal.Content\n */\ninterface ModalContextValue {\n role?: 'dialog' | 'alertdialog';\n}\n\nconst ModalContext = createContext<ModalContextValue | undefined>(undefined);\n\n/**\n * Modal Root Component\n *\n * Manages modal open/close state and validates required children structure.\n * Must contain exactly one Modal.Trigger and one Modal.Content.\n *\n * Unwraps compound component children and passes them to React Aria's DialogTrigger.\n *\n * @see PRD.md FR-001 (Modal Root Requirements)\n * @see PRD.md FR-012 (Controlled Mode)\n * @see PRD.md FR-013 (Uncontrolled Mode)\n */\nfunction ModalRoot({ children, defaultOpen, isOpen, onOpenChange, role = 'dialog' }: ModalProps): ReactElement {\n const childArray = Children.toArray(children);\n\n // Validate children structure in development only\n if (process.env.NODE_ENV !== 'production') {\n const hasTrigger = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === ModalTrigger ||\n (child.type as { displayName?: string }).displayName === 'ModalTrigger')\n );\n\n const hasContent = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === ModalContent ||\n (child.type as { displayName?: string }).displayName === 'ModalContent')\n );\n\n if (!hasTrigger || !hasContent) {\n throw new Error(\n 'Modal requires exactly one Modal.Trigger and one Modal.Content as children'\n );\n }\n }\n\n // Find trigger and content children\n const triggerChild = childArray.find(\n (child) =>\n isValidElement(child) &&\n (child.type === ModalTrigger ||\n (child.type as { displayName?: string }).displayName === 'ModalTrigger')\n );\n\n const contentChild = childArray.find(\n (child) =>\n isValidElement(child) &&\n (child.type === ModalContent ||\n (child.type as { displayName?: string }).displayName === 'ModalContent')\n );\n\n // Extract the actual children from Modal.Trigger and Modal.Content\n // React Aria's DialogTrigger expects direct Button and Modal children\n const triggerElement = triggerChild as ReactElement;\n const unwrappedTrigger = isValidElement(triggerElement)\n ? ((triggerElement.props as unknown as { children?: ReactNode }).children as ReactNode)\n : null;\n const unwrappedContent = contentChild as ReactElement;\n\n return (\n <ModalContext.Provider value={{ role }}>\n <AriaDialogTrigger\n defaultOpen={defaultOpen}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n >\n {unwrappedTrigger}\n {unwrappedContent}\n </AriaDialogTrigger>\n </ModalContext.Provider>\n );\n}\n\nModalRoot.displayName = 'Modal';\n\n/**\n * Modal.Trigger Component\n *\n * Wraps a single child element (typically Button) with modal trigger behavior.\n * Handles click events to open modal and manages ARIA attributes.\n *\n * React Aria's DialogTrigger (used in Modal root) automatically applies:\n * - aria-haspopup=\"dialog\"\n * - aria-expanded (true/false based on state)\n * - onClick handler to toggle modal\n *\n * @see PRD.md FR-002 (Trigger Requirements)\n * @see RESEARCH.md Section 2 (React Aria Integration)\n */\nfunction ModalTrigger({ children }: ModalTriggerProps): ReactElement {\n // React Aria's DialogTrigger (in Modal root) automatically adds ARIA attributes\n // to the first child component. We pass through the child element directly.\n return children as ReactElement;\n}\n\nModalTrigger.displayName = 'ModalTrigger';\n\n/**\n * Modal.Content Component\n *\n * Renders the modal content with overlay backdrop.\n * Uses React Aria's Modal and ModalOverlay for accessibility.\n * Applies CVA variants for size and animation.\n *\n * @see PRD.md FR-003 (Content Requirements)\n * @see PRD.md TR-001 (CVA Variant Styling)\n * @see RESEARCH.md Section 2 (React Aria Integration)\n */\nfunction ModalContent({\n children,\n size = 'md',\n animation = 'fade-zoom',\n animationDuration = 200,\n isDismissable = true,\n isKeyboardDismissDisabled = false,\n showClose = true,\n className,\n}: ModalContentProps): ReactElement {\n // Get role from context\n const context = useContext(ModalContext);\n const role = context?.role ?? 'dialog';\n\n // Generate overlay classes with animation variant\n const overlayClasses = modalOverlayVariants({ animation });\n\n // Generate modal classes with size and animation variants, merged with custom className\n const modalClasses = modalContentVariants({ size, animation });\n const mergedModalClasses = cn(modalClasses, className);\n\n return (\n <AriaModalOverlay\n isDismissable={isDismissable}\n isKeyboardDismissDisabled={isKeyboardDismissDisabled}\n className={overlayClasses}\n >\n <AriaModal\n className={mergedModalClasses}\n style={{\n transitionDuration: `${animationDuration}ms`,\n }}\n >\n <AriaDialog role={role} className=\"outline-none\">\n {({ close }) => (\n <>\n {showClose && (\n <AriaButton\n onPress={close}\n className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-[var(--content-background)] transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-[var(--ring)] focus:ring-offset-2 disabled:pointer-events-none min-h-[44px] min-w-[44px]\"\n aria-label=\"Close modal\"\n >\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </AriaButton>\n )}\n {children}\n </>\n )}\n </AriaDialog>\n </AriaModal>\n </AriaModalOverlay>\n );\n}\n\nModalContent.displayName = 'ModalContent';\n\n/**\n * Modal.Overlay Component (Placeholder - not exposed in public API)\n * Overlay is managed internally by Modal.Content via AriaModalOverlay\n */\nfunction ModalOverlay(_props: ModalOverlayProps): null {\n return null;\n}\n\nModalOverlay.displayName = 'ModalOverlay';\n\n/**\n * Modal.Header Component\n *\n * Container for modal header content (typically Title and Description).\n * Applies consistent spacing and layout.\n *\n * @see PRD.md FR-005 (Header Requirements)\n */\nfunction ModalHeader({ children, className }: ModalHeaderProps): ReactElement {\n return <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)}>{children}</div>;\n}\n\nModalHeader.displayName = 'ModalHeader';\n\n/**\n * Modal.Title Component\n *\n * Renders modal title using React Aria's Heading component.\n * Automatically links to modal via aria-labelledby.\n *\n * @see PRD.md FR-006 (Title Requirements)\n * @see PRD.md AR-002 (ARIA Attributes - auto-labelledby)\n */\nfunction ModalTitle({ children, as = 'h2', className }: ModalTitleProps): ReactElement {\n return (\n <Heading slot=\"title\" level={parseInt(as[1] ?? '2')} className={cn('text-lg font-semibold leading-none tracking-tight', className)}>\n {children}\n </Heading>\n );\n}\n\nModalTitle.displayName = 'ModalTitle';\n\n/**\n * Modal.Description Component\n *\n * Renders description text that automatically links to modal via aria-describedby.\n * Uses muted text color for visual hierarchy.\n *\n * @see PRD.md FR-007 (Description Requirements)\n * @see PRD.md AR-002 (ARIA Attributes - auto-describedby)\n */\nfunction ModalDescription({ children, className }: ModalDescriptionProps): ReactElement {\n return (\n <p slot=\"description\" className={cn('text-sm text-[var(--menu-muted)]', className)}>\n {children}\n </p>\n );\n}\n\nModalDescription.displayName = 'ModalDescription';\n\n/**\n * Modal.Footer Component\n *\n * Container for modal action buttons (Cancel, Confirm, etc.).\n * Aligns buttons to the right with consistent spacing.\n * Responsive: stacks vertically on mobile, horizontal on desktop.\n *\n * @see PRD.md FR-008 (Footer Requirements)\n * @see PRD.md DS-003 (Spacing - footer button gap)\n */\nfunction ModalFooter({ children, className }: ModalFooterProps): ReactElement {\n return <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end gap-2', className)}>{children}</div>;\n}\n\nModalFooter.displayName = 'ModalFooter';\n\n/**\n * Modal.Close Component\n *\n * Wraps a child element (typically Button) with modal close behavior.\n * Uses OverlayTriggerStateContext from React Aria to access close function.\n *\n * @see PRD.md FR-009 (Close Requirements)\n */\nfunction ModalClose({ children }: ModalCloseProps): ReactElement {\n // Access the overlay trigger state from React Aria context\n const state = useContext(OverlayTriggerStateContext);\n\n if (!state) {\n throw new Error('Modal.Close must be used inside Modal.Content');\n }\n\n // Clone the child element and add/merge the onPress handler to close the modal\n if (!isValidElement(children)) {\n throw new Error('Modal.Close requires a valid React element as a child');\n }\n\n // Cast to ReactElement after validation\n const childElement = children as ReactElement;\n\n const handlePress = (): void => {\n state.close();\n };\n\n // Merge with existing onPress if present\n const existingOnPress = (childElement.props as unknown as { onPress?: () => void })?.onPress;\n const mergedOnPress = existingOnPress\n ? (): void => {\n existingOnPress();\n handlePress();\n }\n : handlePress;\n\n // cloneElement with onPress override - use unknown for flexible typing\n return cloneElement(childElement, { onPress: mergedOnPress } as unknown as Partial<typeof childElement.props>);\n}\n\nModalClose.displayName = 'ModalClose';\n\n/**\n * Re-export CVA variants from Modal.styles.ts for backwards compatibility.\n * Consumers importing { modalContentVariants, modalOverlayVariants } from './Modal'\n * will continue to work.\n */\nexport { modalContentVariants, modalOverlayVariants } from './Modal.styles';\n\n/**\n * Compound Component Export\n *\n * Follows Themis library pattern using Object.assign() for compound components.\n * Enables usage like Modal.Trigger, Modal.Content, etc.\n *\n * @deprecated The Object.assign compound pattern will be removed in v2.\n * Use the direct named exports (ModalTrigger, ModalContent, etc.) instead.\n * This pattern is kept for backwards compatibility only.\n *\n * @see RESEARCH.md Section 1 (Compound Component Pattern)\n */\nexport const Modal = Object.assign(ModalRoot, {\n Trigger: ModalTrigger,\n Content: ModalContent,\n Overlay: ModalOverlay,\n Header: ModalHeader,\n Title: ModalTitle,\n Description: ModalDescription,\n Footer: ModalFooter,\n Close: ModalClose,\n});\n\n// Named exports for individual components\nexport {\n ModalRoot,\n ModalTrigger,\n ModalContent,\n ModalOverlay,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n ModalClose,\n};\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * CVA Variants for Modal.Content\n *\n * Size and animation variant definitions for the modal content container.\n * Uses CSS custom properties for all colours to support theming.\n *\n * @see Modal.types.ts (ModalSize, ModalAnimation)\n */\nexport const modalContentVariants = cva(\n [\n // Base styles\n 'relative',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'rounded-lg',\n 'shadow-lg',\n 'p-6',\n 'w-full',\n 'outline-none',\n // Responsive: full-width on mobile with padding, constrained on desktop\n 'mx-4',\n 'sm:mx-0',\n ],\n {\n variants: {\n size: {\n sm: 'max-w-sm', // 300px\n md: 'max-w-md', // 425px\n lg: 'max-w-lg', // 600px\n xl: 'max-w-2xl', // 800px\n full: 'max-w-full min-h-screen rounded-none', // Full screen\n },\n animation: {\n 'fade-zoom': 'animate-fadeIn', // Fade in with scale\n fade: 'animate-fadeIn', // Fade in only\n slide: 'animate-slideUp', // Slide up\n none: '', // No animation\n },\n },\n defaultVariants: {\n size: 'md',\n animation: 'fade-zoom',\n },\n }\n);\n\n/**\n * CVA Variants for Modal Overlay\n *\n * Animation variant definitions for the modal backdrop overlay.\n * Uses CSS custom properties for all colours to support theming.\n */\nexport const modalOverlayVariants = cva(\n [\n // Base overlay styles\n 'fixed',\n 'inset-0',\n 'z-50',\n 'flex',\n 'items-center',\n 'justify-center',\n 'bg-black/50',\n 'backdrop-blur-sm',\n ],\n {\n variants: {\n animation: {\n 'fade-zoom': 'animate-fadeIn',\n fade: 'animate-fadeIn',\n slide: 'animate-fadeIn',\n none: '',\n },\n },\n defaultVariants: {\n animation: 'fade-zoom',\n },\n }\n);\n\n/**\n * Type exports for variant props\n * Allows TypeScript inference of variant combinations\n */\nexport type ModalContentVariantProps = VariantProps<typeof modalContentVariants>;\nexport type ModalOverlayVariantProps = VariantProps<typeof modalOverlayVariants>;\n","'use client';\n\n/**\n * NumberField Component\n *\n * A fully accessible numeric input component built on React Aria's NumberField primitive.\n * Provides keyboard-editable input with optional increment/decrement stepper buttons.\n *\n * Features:\n * - WCAG 2.2 AAA compliant (44x44px touch targets, 7:1 contrast)\n * - Spinbutton ARIA semantics\n * - Locale-aware number formatting via Intl.NumberFormat\n * - Configurable min/max/step constraints\n * - Optional stepper buttons (sides, stacked, or hidden layouts)\n * - Scroll wheel support\n * - Form integration with hidden input\n * - Full keyboard navigation (Arrow, Page Up/Down, Home/End)\n * - Screen reader accessible\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { forwardRef, type ReactElement } from 'react';\nimport {\n NumberField as AriaNumberField,\n Group as AriaGroup,\n Input as AriaInput,\n Label as AriaLabel,\n Text as AriaText,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { Minus, Plus } from 'lucide-react';\nimport { Button } from '../Button';\nimport { cn } from '../../utils/cn';\nimport type { NumberFieldProps } from './NumberField.types';\nimport {\n DEFAULT_MAX_VALUE,\n DEFAULT_MIN_VALUE,\n NEGATIVE_MIN_VALUE,\n} from './NumberField.types';\nimport {\n numberFieldVariants,\n numberFieldInputVariants,\n numberFieldStepperVariants,\n numberFieldLabelVariants,\n numberFieldDescriptionVariants,\n numberFieldErrorVariants,\n} from './NumberField.variants';\n\n// =============================================================================\n// NumberField Component\n// =============================================================================\n\n/**\n * NumberField component for numeric input with optional stepper buttons.\n *\n * @example\n * ```tsx\n * import { NumberField } from '@tribepad/themis/elements/NumberField';\n *\n * // Basic usage\n * <NumberField label=\"Quantity\" />\n *\n * // With constraints\n * <NumberField\n * label=\"Quantity\"\n * minValue={1}\n * maxValue={100}\n * step={1}\n * defaultValue={5}\n * />\n *\n * // Currency formatting\n * <NumberField\n * label=\"Price\"\n * formatOptions={{ style: 'currency', currency: 'USD' }}\n * step={0.01}\n * defaultValue={9.99}\n * />\n *\n * // Allow negative numbers\n * <NumberField\n * label=\"Temperature\"\n * allowNegative\n * formatOptions={{ style: 'unit', unit: 'celsius' }}\n * />\n *\n * // Hidden steppers\n * <NumberField\n * label=\"Account Number\"\n * stepperLayout=\"hidden\"\n * />\n * ```\n */\nexport const NumberField = forwardRef<HTMLDivElement, NumberFieldProps>(\n (\n {\n // Display props\n label,\n description,\n errorMessage,\n // Variant props\n size = 'default',\n stepperLayout = 'sides',\n // Custom props\n allowNegative = false,\n incrementAriaLabel,\n decrementAriaLabel,\n // Constraint props (apply defaults)\n minValue,\n maxValue,\n // Standard props\n className,\n isInvalid,\n isRequired,\n isDisabled,\n isReadOnly,\n // All other props go to AriaNumberField\n ...props\n },\n ref\n ): ReactElement => {\n // Calculate effective min/max values\n const effectiveMinValue =\n minValue ?? (allowNegative ? NEGATIVE_MIN_VALUE : DEFAULT_MIN_VALUE);\n const effectiveMaxValue = maxValue ?? DEFAULT_MAX_VALUE;\n\n // Determine if steppers should be shown\n const showSteppers = stepperLayout !== 'hidden' && !isReadOnly;\n const isStackedLayout = stepperLayout === 'stacked';\n\n return (\n <AriaNumberField\n ref={ref}\n className={cn('group flex flex-col', className)}\n minValue={effectiveMinValue}\n maxValue={effectiveMaxValue}\n isInvalid={isInvalid}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n {...props}\n >\n {/* Label */}\n <AriaLabel\n className={cn(numberFieldLabelVariants({ size }))}\n data-required={isRequired || undefined}\n >\n {label}\n </AriaLabel>\n\n {/* Input Group */}\n <AriaGroup\n className={cn(\n numberFieldVariants({\n size,\n isInvalid: isInvalid ?? false,\n }),\n isStackedLayout && 'pr-0'\n )}\n >\n {/* Decrement Button (left side for sides layout) */}\n {showSteppers && !isStackedLayout && (\n <Button\n slot=\"decrement\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'left',\n })\n )}\n aria-label={decrementAriaLabel ?? 'Decrease value'}\n >\n <Minus className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n )}\n\n {/* Input */}\n <AriaInput\n className={cn(numberFieldInputVariants({ size }))}\n />\n\n {/* Stacked Layout Buttons */}\n {showSteppers && isStackedLayout && (\n <div className=\"flex flex-col h-full\">\n <Button\n slot=\"increment\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'top',\n })\n )}\n aria-label={incrementAriaLabel ?? 'Increase value'}\n >\n <Plus className=\"h-3 w-3\" aria-hidden=\"true\" />\n </Button>\n <Button\n slot=\"decrement\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'bottom',\n })\n )}\n aria-label={decrementAriaLabel ?? 'Decrease value'}\n >\n <Minus className=\"h-3 w-3\" aria-hidden=\"true\" />\n </Button>\n </div>\n )}\n\n {/* Increment Button (right side for sides layout) */}\n {showSteppers && !isStackedLayout && (\n <Button\n slot=\"increment\"\n variant=\"ghost\"\n className=\"!min-h-0 !min-w-0\"\n buttonVisualClassName={cn(\n numberFieldStepperVariants({\n size,\n position: 'right',\n })\n )}\n aria-label={incrementAriaLabel ?? 'Increase value'}\n >\n <Plus className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n )}\n </AriaGroup>\n\n {/* Description */}\n {description && (\n <AriaText\n slot=\"description\"\n className={cn(numberFieldDescriptionVariants({ size }))}\n >\n {description}\n </AriaText>\n )}\n\n {/* Error Message */}\n <AriaFieldError className={cn(numberFieldErrorVariants({ size }))}>\n {errorMessage}\n </AriaFieldError>\n </AriaNumberField>\n );\n }\n);\n\nNumberField.displayName = 'NumberField';\n","/**\n * NumberField Component Types\n *\n * Zod schemas and TypeScript types for the NumberField component.\n * CVA variants are in a separate file (NumberField.variants.ts) to separate\n * styling concerns from type definitions.\n *\n * Note: Zod schemas are used for contract tests and developer guardrails,\n * not runtime validation. This follows the established Themis pattern.\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { z } from 'zod';\nimport type {\n NumberFieldProps as AriaNumberFieldProps,\n ValidationResult,\n} from 'react-aria-components';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default maximum value (UINT32_MAX) to prevent overflow/Infinity.\n */\nexport const DEFAULT_MAX_VALUE = 4294967295;\n\n/**\n * Default minimum value for non-negative numbers.\n */\nexport const DEFAULT_MIN_VALUE = 0;\n\n/**\n * Minimum value when allowNegative is enabled (INT32_MIN + 1).\n */\nexport const NEGATIVE_MIN_VALUE = -2147483647;\n\n// ============================================================================\n// Size Variant Type\n// ============================================================================\n\n/**\n * Size variants for NumberField component.\n * - 'sm': Compact size (36px height) - touch targets via padding\n * - 'default': Standard size (40px height) - AAA compliant\n * - 'lg': Large size (48px height) - AAA compliant\n */\nexport type NumberFieldSize = 'sm' | 'default' | 'lg';\n\n// ============================================================================\n// Stepper Layout Type\n// ============================================================================\n\n/**\n * Layout options for stepper buttons.\n * - 'sides': Buttons on left (-) and right (+) of input (default)\n * - 'stacked': Buttons stacked vertically on right side\n * - 'hidden': No stepper buttons (keyboard/typing only)\n */\nexport type StepperLayout = 'sides' | 'stacked' | 'hidden';\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Zod schema for NumberField props validation.\n * Used for contract tests and developer guardrails, not runtime validation.\n */\nexport const NumberFieldPropsSchema = z.object({\n // Value props\n /** Current value (controlled mode) */\n value: z.number().nullable().optional(),\n /** Default value (uncontrolled mode) */\n defaultValue: z.number().optional(),\n\n // Constraint props\n /** Minimum allowed value (default: 0) */\n minValue: z.number().optional(),\n /** Maximum allowed value (default: 4294967295 / UINT32_MAX) */\n maxValue: z.number().optional(),\n /** Allow negative numbers (sets minValue to -2147483647 if not explicitly set) */\n allowNegative: z.boolean().optional(),\n /** Step increment for stepper buttons and arrow keys (default: 1) */\n step: z.number().positive().optional(),\n\n // Formatting props\n /** Intl.NumberFormat options for locale-aware formatting */\n formatOptions: z.custom<Intl.NumberFormatOptions>().optional(),\n\n // State props\n /** Whether the field is disabled */\n isDisabled: z.boolean().optional(),\n /** Whether the field is read-only */\n isReadOnly: z.boolean().optional(),\n /** Whether the field is required */\n isRequired: z.boolean().optional(),\n /** Whether the field is in an invalid state */\n isInvalid: z.boolean().optional(),\n /** Whether scroll wheel adjustment is disabled */\n isWheelDisabled: z.boolean().optional(),\n\n // Validation props\n /** Custom validation function that returns an error message or null */\n validate: z.function().optional(),\n /** Validation behavior: 'native' for HTML5 validation, 'aria' for ARIA-only */\n validationBehavior: z.enum(['native', 'aria']).default('native'),\n\n // Display props\n /** Field label (required for accessibility) */\n label: z.string(),\n /** Description text below the field */\n description: z.string().optional(),\n /** Error message string or render function */\n errorMessage: z.union([z.string(), z.function()]).optional(),\n\n // Stepper props\n /** Layout for stepper buttons */\n stepperLayout: z.enum(['sides', 'stacked', 'hidden']).default('sides'),\n /** Custom aria-label for increment button */\n incrementAriaLabel: z.string().optional(),\n /** Custom aria-label for decrement button */\n decrementAriaLabel: z.string().optional(),\n\n // Form props\n /** Name attribute for form submission */\n name: z.string().optional(),\n\n // Variant props\n /** Size variant */\n size: z.enum(['sm', 'default', 'lg']).default('default'),\n\n // Event props\n /** Called when the numeric value changes */\n onChange: z.function().optional(),\n /** Called when the field gains focus */\n onFocus: z.function().optional(),\n /** Called when the field loses focus */\n onBlur: z.function().optional(),\n /** Called when focus state changes */\n onFocusChange: z.function().optional(),\n\n // Standard props\n /** Additional CSS classes */\n className: z.string().optional(),\n /** Whether to auto-focus on mount */\n autoFocus: z.boolean().optional(),\n});\n\n// ============================================================================\n// TypeScript Types\n// ============================================================================\n\n/**\n * Custom props added to NumberField (not from React Aria).\n */\nexport interface ThemisNumberFieldCustomProps {\n /** Size variant: 'sm', 'default', or 'lg' */\n size?: NumberFieldSize;\n /** Field label (required for accessibility) */\n label: string;\n /** Description text below the field */\n description?: string;\n /** Error message when field is invalid */\n errorMessage?: string | ((validation: ValidationResult) => string);\n /** Layout for stepper buttons */\n stepperLayout?: StepperLayout;\n /** Custom aria-label for increment button */\n incrementAriaLabel?: string;\n /** Custom aria-label for decrement button */\n decrementAriaLabel?: string;\n /** Allow negative numbers (sets minValue to -2147483647 if not explicitly set) */\n allowNegative?: boolean;\n}\n\n/**\n * Props for the NumberField component.\n * Combines React Aria's NumberFieldProps with Themis-specific props.\n */\nexport type NumberFieldProps = Omit<AriaNumberFieldProps, 'children'> &\n ThemisNumberFieldCustomProps;\n","/**\n * NumberField Component CVA Variants\n *\n * Class Variance Authority (CVA) variant definitions for the NumberField component.\n * Separated from types to maintain clean separation of concerns.\n *\n * Styling uses semantic CSS tokens that map to ThemeProvider variables:\n * - --background: Input background color\n * - --foreground: Text color\n * - --input: Input border color (default state)\n * - --ring: Focus ring color\n * - --accent: Stepper button hover background\n * - --accent-foreground: Stepper button hover text\n * - --destructive: Error state border and text\n * - --muted-foreground: Placeholder/disabled text\n *\n * @see {@link ../../docs/prd/numberfield-prd.md} for full requirements\n */\n\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// ============================================================================\n// Container Variants\n// ============================================================================\n\n/**\n * Variants for the NumberField container (Group element).\n * Contains the input and stepper buttons.\n *\n * Size notes:\n * - sm (36px): Compact, touch targets achieved via padding\n * - default (40px): Standard size, AAA compliant touch targets\n * - lg (48px): Large size, enhanced touch targets\n */\nexport const numberFieldVariants = cva(\n [\n // Base styles\n 'inline-flex items-center rounded-md border',\n 'bg-[var(--content-background)] text-[var(--content-foreground)]',\n 'transition-colors duration-200',\n // Focus within\n 'focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-2',\n // Disabled\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-9 text-sm',\n default: 'h-10 text-base',\n lg: 'h-12 text-lg',\n },\n isInvalid: {\n true: 'border-[var(--destructive)] focus-within:ring-[var(--destructive)]',\n false: 'border-[var(--input)] hover:border-[var(--input)]/80',\n },\n },\n defaultVariants: {\n size: 'default',\n isInvalid: false,\n },\n }\n);\n\n// ============================================================================\n// Input Variants\n// ============================================================================\n\n/**\n * Variants for the numeric input element.\n * Hides native spinners and centers text.\n */\nexport const numberFieldInputVariants = cva(\n [\n // Base styles\n 'flex-1 bg-transparent text-center tabular-nums',\n 'min-w-0', // Allow shrinking\n // Focus\n 'focus:outline-none',\n // Hide native spinners\n '[appearance:textfield]',\n '[&::-webkit-outer-spin-button]:appearance-none',\n '[&::-webkit-inner-spin-button]:appearance-none',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 text-sm',\n default: 'px-3 text-base',\n lg: 'px-4 text-lg',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Stepper Button Variants\n// ============================================================================\n\n/**\n * Variants for the stepper buttons (increment/decrement).\n * Supports different positions for sides and stacked layouts.\n *\n * Touch target strategy:\n * - Visual button size varies with component size\n * - 44x44px minimum touch target achieved via padding/hit area\n */\nexport const numberFieldStepperVariants = cva(\n [\n // Base styles\n 'flex items-center justify-center',\n 'transition-colors duration-150',\n 'select-none',\n // Hover\n 'hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]',\n // Focus\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-inset',\n // Active (pressed)\n 'active:bg-[var(--accent)]/80',\n // Disabled\n 'disabled:pointer-events-none disabled:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'min-w-8 min-h-8 text-sm',\n default: 'min-w-10 min-h-10 text-base',\n lg: 'min-w-12 min-h-12 text-lg',\n },\n position: {\n left: 'rounded-l-md border-r border-[var(--input)]',\n right: 'rounded-r-md border-l border-[var(--input)]',\n top: 'rounded-tr-md border-b border-l border-[var(--input)] h-1/2',\n bottom: 'rounded-br-md border-l border-[var(--input)] h-1/2',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Label Variants\n// ============================================================================\n\n/**\n * Variants for the NumberField label.\n */\nexport const numberFieldLabelVariants = cva(\n [\n 'block font-medium text-[var(--content-foreground)]',\n 'mb-1.5',\n // Required indicator\n 'data-[required]:after:content-[\"*\"] data-[required]:after:ml-0.5',\n 'data-[required]:after:text-[var(--destructive)]',\n ],\n {\n variants: {\n size: {\n sm: 'text-sm',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Description Variants\n// ============================================================================\n\n/**\n * Variants for the description text below the field.\n */\nexport const numberFieldDescriptionVariants = cva(\n [\n 'text-[var(--menu-muted)]',\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Error Variants\n// ============================================================================\n\n/**\n * Variants for the error message display.\n */\nexport const numberFieldErrorVariants = cva(\n [\n 'flex items-center gap-1',\n 'text-[var(--destructive)]',\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Variant Types (from CVA)\n// ============================================================================\n\n/**\n * Variant props for numberFieldVariants CVA function.\n */\nexport type NumberFieldVariantProps = VariantProps<typeof numberFieldVariants>;\n\n/**\n * Variant props for numberFieldInputVariants CVA function.\n */\nexport type NumberFieldInputVariantProps = VariantProps<typeof numberFieldInputVariants>;\n\n/**\n * Variant props for numberFieldStepperVariants CVA function.\n */\nexport type NumberFieldStepperVariantProps = VariantProps<typeof numberFieldStepperVariants>;\n","'use client';\n\nimport { forwardRef, useId, useImperativeHandle, useRef, type FocusEvent, type KeyboardEvent } from 'react';\nimport { cn } from '../../utils/cn';\nimport { type OTPInputProps, type OTPInputRef } from './OTPInput.types';\nimport { useOTPInput } from './hooks/useOTPInput';\nimport { OTPDigit } from './components/OTPDigit';\nimport {\n otpContainerVariants,\n otpDigitGroupVariants,\n otpErrorVariants,\n otpDescriptionVariants,\n} from './OTPInput.styles';\n\n/**\n * OTPInput Component\n *\n * A fully accessible, WCAG 2.2 AAA-compliant OTP (One-Time Password) input component.\n *\n * Key Features:\n * - Single hidden input for screen readers (not multiple separate inputs)\n * - Visual digit boxes for optimal UX\n * - WCAG 2.2 AAA compliant (7:1 contrast, 44x44px touch targets)\n * - Auto-advance on digit entry\n * - Paste support with validation\n * - Controlled and uncontrolled modes\n * - Custom validation\n * - React Hook Form compatible\n *\n * Accessibility:\n * - Single tab stop (entire OTP is one field)\n * - Proper ARIA attributes (label, describedby, invalid, errormessage)\n * - Screen reader announcements for digit count and errors\n * - Visible focus indicators (7:1 contrast)\n * - Keyboard navigation (arrows, home, end, backspace, delete)\n *\n * @example Basic usage\n * ```tsx\n * <OTPInput\n * label=\"Enter verification code\"\n * length={6}\n * onChange={(value) => console.log(value)}\n * onComplete={(code) => console.log('Complete:', code)}\n * />\n * ```\n *\n * @example Controlled mode with validation\n * ```tsx\n * const [otp, setOtp] = useState('');\n * const [error, setError] = useState('');\n *\n * <OTPInput\n * label=\"Enter 6-digit code sent to your email\"\n * value={otp}\n * onChange={setOtp}\n * error={error}\n * validate={(value) => {\n * if (value === '000000') return 'Invalid code';\n * return null;\n * }}\n * />\n * ```\n *\n * @example With ref API\n * ```tsx\n * const otpRef = useRef<OTPInputRef>(null);\n *\n * <OTPInput\n * ref={otpRef}\n * label=\"Enter verification code\"\n * />\n *\n * // Programmatic control\n * otpRef.current?.clear();\n * otpRef.current?.setValue('123456');\n * ```\n */\nexport const OTPInput = forwardRef<OTPInputRef, OTPInputProps>((props, ref) => {\n // Validate serializable props with Zod schema (skip function validation)\n // Functions are type-checked by TypeScript, not runtime-validated\n const {\n label,\n description,\n size = 'md',\n disabled = false,\n readOnly = false,\n mask = false,\n showSuccess = false,\n className,\n digitClassName,\n onFocus,\n onBlur,\n inputMode = 'numeric',\n length = 6,\n } = props;\n\n // Main logic hook\n const {\n value,\n focusedIndex,\n error,\n isComplete,\n handleChange,\n handleKeyDown,\n handlePaste,\n setFocusedIndex,\n clear,\n setValue,\n validate,\n } = useOTPInput(props);\n\n // Ref to the hidden input element\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Expose imperative API via ref\n useImperativeHandle(ref, (): OTPInputRef => ({\n focus: (): void => inputRef.current?.focus(),\n blur: (): void => inputRef.current?.blur(),\n clear,\n setValue,\n getValue: (): string => value.replace(/_/g, ''),\n isComplete: (): boolean => isComplete,\n validate,\n getElement: (): HTMLInputElement | null => inputRef.current,\n }));\n\n // Split value into individual digits\n const digits = value.split('');\n\n // Determine state for digit styling\n const getDigitState = (index: number): 'default' | 'focus' | 'filled' | 'error' | 'success' | 'disabled' => {\n if (disabled) return 'disabled';\n if (error) return 'error';\n if (showSuccess && isComplete && !error) return 'success';\n if (index === focusedIndex) return 'focus';\n if (digits[index] !== '_') return 'filled';\n return 'default';\n };\n\n // Handle focus events\n const handleFocusEvent = (e: FocusEvent<HTMLInputElement>): void => {\n onFocus?.(e);\n };\n\n const handleBlurEvent = (e: FocusEvent<HTMLInputElement>): void => {\n onBlur?.(e);\n };\n\n // Handle click/keyboard on digit boxes (focus hidden input)\n const handleDigitClick = (index: number): void => {\n if (disabled || readOnly) return;\n setFocusedIndex(index);\n inputRef.current?.focus();\n };\n\n const handleDigitKeyDown = (e: KeyboardEvent, index: number): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleDigitClick(index);\n }\n };\n\n // Generate stable IDs for ARIA (SSR-safe)\n const baseId = useId();\n const descriptionId = description ? `${baseId}-description` : undefined;\n const errorId = error ? `${baseId}-error` : undefined;\n\n return (\n <div className={cn(otpContainerVariants({ size }), className)}>\n {/* Hidden accessible input */}\n <input\n ref={inputRef}\n type=\"text\"\n inputMode={inputMode}\n value={value.replace(/_/g, '')}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onFocus={handleFocusEvent}\n onBlur={handleBlurEvent}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={label}\n aria-describedby={[descriptionId, errorId].filter(Boolean).join(' ')}\n aria-invalid={!!error}\n aria-errormessage={errorId}\n className=\"sr-only\"\n autoComplete=\"one-time-code\"\n maxLength={length}\n />\n\n {/* Visual digit display */}\n <div\n className={cn(otpDigitGroupVariants({ size }))}\n role=\"presentation\"\n aria-hidden=\"true\"\n >\n {digits.map((digit, index) => (\n <div\n key={index}\n onClick={() => handleDigitClick(index)}\n onKeyDown={(e) => handleDigitKeyDown(e, index)}\n role=\"button\"\n tabIndex={-1}\n className=\"cursor-text\"\n >\n <OTPDigit\n value={digit}\n focused={index === focusedIndex}\n size={size}\n state={getDigitState(index)}\n masked={mask}\n className={digitClassName}\n index={index}\n />\n </div>\n ))}\n </div>\n\n {/* Description text */}\n {description && (\n <p id={descriptionId} className={otpDescriptionVariants()}>\n {description}\n </p>\n )}\n\n {/* Error message */}\n {error && (\n <p\n id={errorId}\n className={otpErrorVariants()}\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {error}\n </p>\n )}\n\n {/* Screen reader live region for digit count */}\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n >\n {!isComplete && !error && (\n <>\n {value.replace(/_/g, '').length} of {length} digits entered\n </>\n )}\n {isComplete && !error && <>Verification code complete</>}\n </div>\n </div>\n );\n});\n\nOTPInput.displayName = 'OTPInput';\n","import { useCallback, type KeyboardEvent } from 'react';\n\n/**\n * Options for useOTPKeyboard hook\n */\nexport interface UseOTPKeyboardOptions {\n /**\n * Current OTP value (string with underscores for empty)\n */\n value: string;\n\n /**\n * Total number of digits\n */\n length: number;\n\n /**\n * Currently focused digit index\n */\n focusedIndex: number;\n\n /**\n * Callback to update OTP value\n */\n onChange: (value: string) => void;\n\n /**\n * Callback to update focused index\n */\n setFocusedIndex: (index: number) => void;\n\n /**\n * Whether the input is disabled\n */\n disabled?: boolean;\n\n /**\n * Whether the input is read-only\n */\n readOnly?: boolean;\n}\n\n/**\n * Return type for useOTPKeyboard hook\n */\nexport interface UseOTPKeyboardReturn {\n /**\n * Keyboard event handler\n */\n handleKeyDown: (e: KeyboardEvent<HTMLInputElement>) => void;\n}\n\n/**\n * useOTPKeyboard Hook\n *\n * Handles keyboard navigation for OTP input:\n * - Arrow Left/Right: Navigate between digits\n * - Backspace: Delete current digit and move left\n * - Delete: Clear current digit\n * - Home: Move to first digit\n * - End: Move to last digit\n * - Ctrl/Cmd+A: Select all (native browser behavior)\n *\n * @param options Configuration options\n * @returns Keyboard event handler\n */\nexport function useOTPKeyboard(options: UseOTPKeyboardOptions): UseOTPKeyboardReturn {\n const {\n value,\n length,\n focusedIndex,\n onChange,\n setFocusedIndex,\n disabled = false,\n readOnly = false,\n } = options;\n\n /**\n * Handle Arrow Left - Move to previous digit\n */\n const handleArrowLeft = useCallback((): void => {\n if (focusedIndex > 0) {\n setFocusedIndex(focusedIndex - 1);\n }\n }, [focusedIndex, setFocusedIndex]);\n\n /**\n * Handle Arrow Right - Move to next digit\n */\n const handleArrowRight = useCallback((): void => {\n if (focusedIndex < length - 1) {\n setFocusedIndex(focusedIndex + 1);\n }\n }, [focusedIndex, length, setFocusedIndex]);\n\n /**\n * Handle Backspace - Delete current digit and move left\n */\n const handleBackspace = useCallback((): void => {\n if (readOnly) return;\n\n const digits = value.split('');\n const currentDigit = digits[focusedIndex];\n\n // If current digit is empty, move to previous digit\n if (currentDigit === '_') {\n if (focusedIndex > 0) {\n // Move left and clear that digit\n const newIndex = focusedIndex - 1;\n digits[newIndex] = '_';\n onChange(digits.join(''));\n setFocusedIndex(newIndex);\n }\n } else {\n // Clear current digit\n digits[focusedIndex] = '_';\n onChange(digits.join(''));\n // Move to previous digit if not at start\n if (focusedIndex > 0) {\n setFocusedIndex(focusedIndex - 1);\n }\n }\n }, [value, focusedIndex, readOnly, onChange, setFocusedIndex]);\n\n /**\n * Handle Delete - Clear current digit (stay in place)\n */\n const handleDelete = useCallback((): void => {\n if (readOnly) return;\n\n const digits = value.split('');\n digits[focusedIndex] = '_';\n onChange(digits.join(''));\n // Stay on current digit (don't move)\n }, [value, focusedIndex, readOnly, onChange]);\n\n /**\n * Handle Home - Move to first digit\n */\n const handleHome = useCallback((): void => {\n setFocusedIndex(0);\n }, [setFocusedIndex]);\n\n /**\n * Handle End - Move to last digit\n */\n const handleEnd = useCallback((): void => {\n setFocusedIndex(length - 1);\n }, [length, setFocusedIndex]);\n\n /**\n * Main keyboard event handler\n */\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>): void => {\n if (disabled) return;\n\n // Handle different key presses\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n handleArrowLeft();\n break;\n\n case 'ArrowRight':\n e.preventDefault();\n handleArrowRight();\n break;\n\n case 'Backspace':\n e.preventDefault();\n handleBackspace();\n break;\n\n case 'Delete':\n e.preventDefault();\n handleDelete();\n break;\n\n case 'Home':\n e.preventDefault();\n handleHome();\n break;\n\n case 'End':\n e.preventDefault();\n handleEnd();\n break;\n\n // Ctrl/Cmd+A (Select All) - Allow native behavior\n case 'a':\n case 'A':\n if (e.ctrlKey || e.metaKey) {\n // Let browser handle select all natively\n // The hidden input will select its entire value\n return;\n }\n break;\n\n // Prevent Enter from submitting the form\n // Form submission should be handled by onComplete callback when all digits are filled\n case 'Enter':\n e.preventDefault();\n break;\n\n // Allow digits and other printable characters\n // (handled by onChange in useOTPInput)\n default:\n // Don't prevent default for normal character input\n break;\n }\n },\n [\n disabled,\n handleArrowLeft,\n handleArrowRight,\n handleBackspace,\n handleDelete,\n handleHome,\n handleEnd,\n ]\n );\n\n return {\n handleKeyDown,\n };\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef, type ChangeEvent, type KeyboardEvent, type ClipboardEvent } from 'react';\nimport type { OTPInputProps } from '../OTPInput.types';\nimport { useOTPKeyboard } from './useOTPKeyboard';\n\n/**\n * Return type for useOTPInput hook\n */\nexport interface UseOTPInputReturn {\n value: string;\n focusedIndex: number;\n error: string | null;\n isComplete: boolean;\n handleChange: (e: ChangeEvent<HTMLInputElement>) => void;\n handleKeyDown: (e: KeyboardEvent<HTMLInputElement>) => void;\n handlePaste: (e: ClipboardEvent<HTMLInputElement>) => void;\n setFocusedIndex: (index: number) => void;\n clear: () => void;\n setValue: (value: string) => void;\n validate: () => string | null;\n}\n\n/**\n * useOTPInput Hook\n *\n * Core logic hook for OTP input management.\n * Handles state, validation, and user interactions.\n *\n * Features:\n * - Controlled and uncontrolled modes\n * - Auto-advance on digit entry\n * - Custom validation support\n * - Error state management\n * - Focus management\n *\n * @param props OTPInput component props\n * @returns State and handlers for OTP input\n */\nexport function useOTPInput(props: OTPInputProps): UseOTPInputReturn {\n const {\n value: controlledValue,\n defaultValue = '',\n length = 6,\n type = 'numeric',\n pattern,\n onChange,\n onComplete,\n validate,\n error: controlledError,\n disabled = false,\n readOnly = false,\n } = props;\n\n // Determine if component is controlled\n const isControlled = controlledValue !== undefined;\n\n // Internal state (used in uncontrolled mode)\n const [internalValue, setInternalValue] = useState<string>(() => {\n // Initialize with defaultValue padded to length with underscores\n return (defaultValue || '').padEnd(length, '_');\n });\n\n const [internalError, setInternalError] = useState<string | null>(null);\n const [focusedIndex, setFocusedIndex] = useState<number>(0);\n\n // Track if onComplete has been called for current value\n const completedRef = useRef<string | null>(null);\n \n // Debounce timer for onComplete callback\n const debounceTimerRef = useRef<NodeJS.Timeout | null>(null);\n\n // Current value (controlled or uncontrolled)\n const currentValue = isControlled ? controlledValue || ''.padEnd(length, '_') : internalValue;\n\n // Current error (controlled or uncontrolled)\n const currentError = controlledError !== undefined ? controlledError : internalError;\n\n // Validation function\n const runValidation = useCallback(\n (value: string): string | null => {\n // Don't validate empty or partial input\n const filledLength = value.replace(/_/g, '').length;\n if (filledLength < length) {\n return null;\n }\n\n // Run custom validation if provided\n if (validate) {\n return validate(value);\n }\n\n // Built-in validation based on type\n if (type === 'numeric') {\n const numericPattern = /^\\d+$/;\n const cleanValue = value.replace(/_/g, '');\n if (!numericPattern.test(cleanValue)) {\n return 'Code must contain only digits';\n }\n } else if (type === 'alphanumeric') {\n const alphanumericPattern = /^[A-Za-z0-9]+$/;\n const cleanValue = value.replace(/_/g, '');\n if (!alphanumericPattern.test(cleanValue)) {\n return 'Code must contain only letters and numbers';\n }\n } else if (type === 'custom' && pattern) {\n const cleanValue = value.replace(/_/g, '');\n for (const char of cleanValue) {\n if (!pattern.test(char)) {\n return 'Invalid character in code';\n }\n }\n }\n\n return null;\n },\n [length, type, pattern, validate]\n );\n\n // Update value (handles both controlled and uncontrolled)\n const updateValue = useCallback(\n (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n\n // Run validation\n const validationError = runValidation(newValue);\n if (!isControlled) {\n setInternalError(validationError);\n }\n\n // Check if complete\n const filledLength = newValue.replace(/_/g, '').length;\n const isComplete = filledLength === length;\n\n // Trigger onComplete if:\n // 1. All digits filled\n // 2. No validation errors\n // 3. Haven't already called onComplete for this value\n if (isComplete && !validationError && completedRef.current !== newValue) {\n completedRef.current = newValue;\n \n // Debounce onComplete callback by 200ms\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n debounceTimerRef.current = setTimeout(() => {\n onComplete?.(newValue.replace(/_/g, ''));\n }, 200);\n }\n\n // Reset completion tracking if value changes after completion\n if (!isComplete && completedRef.current) {\n completedRef.current = null;\n }\n },\n [isControlled, length, onChange, onComplete, runValidation]\n );\n\n // Handle digit entry\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>): void => {\n if (disabled) return;\n\n const inputValue = e.target.value;\n const newChar = inputValue[inputValue.length - 1] || '';\n\n // Validate character based on type\n let isValid = false;\n if (type === 'numeric') {\n isValid = /^\\d$/.test(newChar);\n } else if (type === 'alphanumeric') {\n isValid = /^[A-Za-z0-9]$/.test(newChar);\n } else if (type === 'custom' && pattern) {\n isValid = pattern.test(newChar);\n } else {\n isValid = true; // Default: accept any character\n }\n\n if (!isValid) {\n // Reject invalid character\n return;\n }\n\n // Update value at focused index\n const valueArray = currentValue.split('');\n valueArray[focusedIndex] = newChar;\n const newValue = valueArray.join('');\n\n updateValue(newValue);\n\n // Auto-advance to next digit if not at end\n if (focusedIndex < length - 1) {\n setFocusedIndex(focusedIndex + 1);\n }\n },\n [disabled, type, pattern, currentValue, focusedIndex, length, updateValue]\n );\n\n // Handle paste\n const handlePaste = useCallback(\n async (e: ClipboardEvent<HTMLInputElement>): Promise<void> => {\n if (disabled || readOnly) return;\n\n e.preventDefault();\n\n // Get pasted text\n const pastedText = e.clipboardData.getData('text/plain').trim();\n if (!pastedText) return;\n\n // Call onPaste callback if provided\n if (props.onPaste) {\n const shouldProceed = await props.onPaste(pastedText);\n if (shouldProceed === false) return;\n }\n\n // Validate pasted content character by character\n let validChars = '';\n for (const char of pastedText) {\n if (validChars.length >= length) break;\n\n let isValid = false;\n if (type === 'numeric') {\n isValid = /^\\d$/.test(char);\n } else if (type === 'alphanumeric') {\n isValid = /^[A-Za-z0-9]$/.test(char);\n } else if (type === 'custom' && pattern) {\n isValid = pattern.test(char);\n } else {\n isValid = true;\n }\n\n if (isValid) {\n validChars += char;\n }\n }\n\n // Pad with underscores to fill length\n const newValue = validChars.padEnd(length, '_');\n updateValue(newValue);\n\n // Move focus to first empty position or end\n const firstEmptyIndex = newValue.indexOf('_');\n setFocusedIndex(firstEmptyIndex === -1 ? length - 1 : firstEmptyIndex);\n },\n [disabled, readOnly, props, length, type, pattern, updateValue]\n );\n\n // Clear all digits\n const clear = useCallback((): void => {\n const emptyValue = ''.padEnd(length, '_');\n updateValue(emptyValue);\n setFocusedIndex(0);\n if (!isControlled) {\n setInternalError(null);\n }\n completedRef.current = null;\n }, [length, updateValue, isControlled]);\n\n // Set value programmatically\n const setValue = useCallback(\n (newValue: string): void => {\n // Pad or truncate to length\n const paddedValue = newValue.padEnd(length, '_').slice(0, length);\n updateValue(paddedValue);\n\n // Move focus to last filled digit or first empty\n const firstEmptyIndex = paddedValue.indexOf('_');\n setFocusedIndex(firstEmptyIndex === -1 ? length - 1 : firstEmptyIndex);\n },\n [length, updateValue]\n );\n\n // Validate current value\n const validateCurrent = useCallback((): string | null => {\n return runValidation(currentValue);\n }, [currentValue, runValidation]);\n\n // Check if complete\n const isComplete = currentValue.replace(/_/g, '').length === length;\n\n // Keyboard navigation hook\n const { handleKeyDown } = useOTPKeyboard({\n value: currentValue,\n length,\n focusedIndex,\n onChange: updateValue,\n setFocusedIndex,\n disabled,\n readOnly,\n });\n\n // Sync controlled value changes\n useEffect(() => {\n if (isControlled && controlledValue !== undefined) {\n // Update focused index when controlled value changes\n const firstEmptyIndex = controlledValue.indexOf('_');\n if (firstEmptyIndex !== -1) {\n setFocusedIndex(firstEmptyIndex);\n }\n }\n }, [isControlled, controlledValue]);\n\n // Cleanup debounce timer on unmount\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n return {\n value: currentValue,\n focusedIndex,\n error: currentError,\n isComplete,\n handleChange,\n handleKeyDown,\n handlePaste,\n setFocusedIndex,\n clear,\n setValue,\n validate: validateCurrent,\n };\n}\n","import { memo, type ReactElement } from 'react';\nimport { cn } from '../../../utils/cn';\nimport { otpDigitVariants, type OTPDigitVariantProps } from '../OTPInput.styles';\n\n/**\n * Props for the OTPDigit component\n */\nexport interface OTPDigitProps {\n /**\n * Single character value or underscore for empty\n * @example \"1\" | \"A\" | \"_\"\n */\n value: string;\n\n /**\n * Whether this digit is currently focused\n * Determines visual focus indicator display\n */\n focused: boolean;\n\n /**\n * Size variant\n * @default 'md'\n */\n size?: OTPDigitVariantProps['size'];\n\n /**\n * State variant\n * Determines visual styling (default, focus, error, success, disabled)\n */\n state?: OTPDigitVariantProps['state'];\n\n /**\n * Mask the digit (show as bullet point)\n * Useful for sensitive codes\n * @default false\n */\n masked?: boolean;\n\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * Index of this digit (for debugging)\n */\n index?: number;\n}\n\n/**\n * OTPDigit Component\n *\n * Displays a single digit of the OTP input with visual styling.\n * This is a presentational component - it does not handle input logic.\n *\n * Features:\n * - Memoized for performance (prevents unnecessary re-renders)\n * - WCAG AAA compliant (7:1 contrast, 44x44px touch targets)\n * - Supports masking for sensitive codes\n * - Visual focus indicators\n * - State-based styling (error, success, disabled)\n *\n * @example\n * ```tsx\n * <OTPDigit\n * value=\"5\"\n * focused={true}\n * size=\"md\"\n * state=\"focus\"\n * />\n * ```\n */\nconst OTPDigitComponent = ({\n value,\n focused,\n size = 'md',\n state = 'default',\n masked = false,\n className,\n index,\n}: OTPDigitProps): ReactElement => {\n // Determine if digit is filled\n const isFilled = value !== '_' && value !== '';\n\n // Determine state based on props\n const computedState = focused && !state ? 'focus' : isFilled && state === 'default' ? 'filled' : state;\n\n // Display value (masked or actual)\n const displayValue = masked && isFilled ? '•' : value === '_' ? '' : value;\n\n return (\n <div\n className={cn(\n otpDigitVariants({ size, state: computedState }),\n className\n )}\n role=\"presentation\"\n aria-hidden=\"true\"\n data-focused={focused}\n data-filled={isFilled}\n data-index={index}\n >\n {displayValue || (\n <span className=\"text-[var(--menu-muted)] opacity-40\">\n •\n </span>\n )}\n </div>\n );\n};\n\n/**\n * Memoized OTPDigit Component\n *\n * Prevents re-renders when other digits change.\n * Only re-renders when its own props change.\n *\n * Performance optimization for components with 6-10 digits.\n */\nexport const OTPDigit = memo(OTPDigitComponent);\n\nOTPDigit.displayName = 'OTPDigit';\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * OTP Digit Box Variants\n *\n * Styling for individual digit display boxes using ShadCN CSS variables.\n * Ensures WCAG 2.2 AAA compliance (7:1 contrast, 44x44px touch targets).\n *\n * CSS Variables used (from ShadCN):\n * - --background: Base background color\n * - --foreground: Text color\n * - --border: Border color\n * - --primary: Primary brand color (focus state)\n * - --ring: Focus ring color\n * - --destructive: Error state color\n * - --destructive-foreground: Error text color\n * - --success: Success state color (if available)\n * - --muted: Muted background color\n * - --muted-foreground: Placeholder/disabled text color\n */\nexport const otpDigitVariants = cva(\n // Base styles - Applied to all variants\n [\n 'inline-flex',\n 'items-center',\n 'justify-center',\n 'rounded-md',\n 'border-2',\n 'font-semibold',\n 'transition-all',\n 'duration-200',\n 'ease-in-out',\n 'select-none',\n 'tabindex-[-1]', // Not tabbable (hidden input handles focus)\n ],\n {\n variants: {\n /**\n * Size Variants\n * All sizes meet WCAG AAA touch target minimum (44x44px)\n */\n size: {\n /**\n * Small: 40×40px base + 4px padding = 44×44px touch target\n * Font: 16px (base size)\n * Use case: Compact layouts, mobile optimization\n */\n sm: [\n 'h-10', // 40px\n 'w-10', // 40px\n 'text-base', // 16px\n 'p-1', // 4px padding for touch target\n ],\n\n /**\n * Medium (default): 48×56px\n * Font: 20px (comfortable reading size)\n * Use case: Standard desktop/mobile layouts\n */\n md: [\n 'h-14', // 56px\n 'w-10 sm:w-12 md:w-14', // 48px\n 'text-xl', // 20px\n ],\n\n /**\n * Large: 56×64px\n * Font: 24px (large reading size)\n * Use case: Accessibility focus, high-visibility needs\n */\n lg: [\n 'h-16', // 64px\n 'w-10 sm:w-12 md:w-16', // 56px\n 'text-2xl', // 24px\n ],\n },\n\n /**\n * State Variants\n * All states meet WCAG AAA contrast (7:1 minimum)\n */\n state: {\n /**\n * Default: Standard input appearance\n * Border: --border\n * Background: --background\n * Text: --foreground\n */\n default: [\n 'border-[var(--input)]',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'hover:border-[var(--input-hover)]',\n ],\n\n /**\n * Focus: Active digit being edited\n * Border: --primary\n * Ring: --ring (2px, 2px offset)\n * Contrast: 7:1 minimum\n */\n focus: [\n 'border-[var(--input)]',\n 'ring-2',\n 'ring-[var(--primary)]',\n 'ring-offset-2',\n 'ring-offset-background',\n 'outline-none',\n ],\n\n /**\n * Filled: Digit has been entered\n * Border: --primary with 50% opacity\n * Text: Bold weight for emphasis\n */\n filled: [\n 'border-[var(--primary)]',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'font-bold',\n ],\n\n /**\n * Error: Validation failed\n * Border: --destructive\n * Background: --destructive with 10% opacity\n * Text: --destructive-foreground\n * Animation: Shake on error\n */\n error: [\n 'border-[var(--destructive)]',\n 'bg-[var(--content-background)]',\n 'text-[var(--destructive-foreground)]',\n 'animate-shake',\n ],\n\n /**\n * Success: Validation passed (optional)\n * Border: Green (or --success if available)\n * Background: Green with 10% opacity\n * May include checkmark icon\n */\n success: [\n 'border-green-600',\n 'bg-green-50',\n 'text-green-900',\n 'dark:border-green-500',\n 'dark:bg-green-900/20',\n 'dark:text-green-100',\n ],\n\n /**\n * Disabled: Input not interactive\n * Border: --border with 50% opacity\n * Background: --muted with 50% opacity\n * Text: --muted-foreground\n * Cursor: not-allowed\n * Opacity: 60%\n * Contrast: 4.5:1 minimum (AA standard for disabled)\n */\n disabled: [\n 'border-[var(--accent-background)]',\n 'bg-[var(--accent-background)]',\n 'text-[var(--menu-muted)]',\n 'cursor-not-allowed',\n 'opacity-60',\n 'hover:border-[var(--accent-background)]', // Prevent hover effect\n ],\n },\n },\n defaultVariants: {\n size: 'md',\n state: 'default',\n },\n }\n);\n\n/**\n * OTP Container Variants\n *\n * Styling for the main container that holds all digit boxes\n */\nexport const otpContainerVariants = cva(\n [\n 'inline-flex',\n 'flex-col',\n 'gap-2',\n ],\n {\n variants: {\n /**\n * Container size variants\n * Affects spacing and layout\n */\n size: {\n sm: ['gap-1.5'],\n md: ['gap-2'],\n lg: ['gap-3'],\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n/**\n * OTP Digit Group Variants\n *\n * Styling for the row of digit boxes\n */\nexport const otpDigitGroupVariants = cva(\n [\n 'flex',\n 'items-center',\n ],\n {\n variants: {\n /**\n * Gap between digits\n */\n size: {\n sm: ['gap-1.5'], // 6px\n md: ['gap-2'], // 8px\n lg: ['gap-3'], // 12px\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\n/**\n * OTP Error Message Variants\n *\n * Styling for error messages displayed below input\n */\nexport const otpErrorVariants = cva([\n 'text-sm',\n 'font-medium',\n 'text-[var(--destructive)]',\n 'mt-1.5',\n 'text-center',\n]);\n\n/**\n * OTP Description Variants\n *\n * Styling for description/help text\n */\nexport const otpDescriptionVariants = cva([\n 'text-sm',\n 'text-[var(--menu-muted)]',\n 'mt-1',\n]);\n\n/**\n * Type export for variant props\n * Allows TypeScript inference of variant combinations\n */\nexport type OTPDigitVariantProps = VariantProps<typeof otpDigitVariants>;\nexport type OTPContainerVariantProps = VariantProps<typeof otpContainerVariants>;\nexport type OTPDigitGroupVariantProps = VariantProps<typeof otpDigitGroupVariants>;\n\n/**\n * Animation: Shake effect for errors\n *\n * Add this to tailwind.config.ts animations:\n *\n * ```ts\n * module.exports = {\n * theme: {\n * extend: {\n * keyframes: {\n * shake: {\n * '0%, 100%': { transform: 'translateX(0)' },\n * '25%': { transform: 'translateX(-8px)' },\n * '75%': { transform: 'translateX(8px)' },\n * },\n * },\n * animation: {\n * shake: 'shake 200ms ease-in-out',\n * },\n * },\n * },\n * };\n * ```\n */\n","\"use client\";\n\n/**\n * Progress Component\n * Accessible progress bar with React Aria primitives and CVA styling\n *\n * @see React Aria ProgressBar: https://react-aria.adobe.com/ProgressBar\n * @see ShadCN Progress: https://ui.shadcn.com/docs/components/progress\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, useId } from 'react';\nimport { ProgressBar as AriaProgressBar } from 'react-aria-components';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type { ProgressProps } from './Progress.types';\n\n/**\n * Progress track variants (the background container)\n * Controls size/height of the progress bar\n */\nconst progressTrackVariants = cva(\n // Base styles - track container\n 'relative w-full overflow-hidden rounded-full bg-[var(--accent-background)]',\n {\n variants: {\n size: {\n sm: 'h-1', // 4px\n default: 'h-2', // 8px\n lg: 'h-3', // 12px\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Progress indicator variants (the filled portion)\n * Controls color and animation based on variant and state\n */\nconst progressIndicatorVariants = cva(\n // Base styles - indicator with smooth transition\n 'h-full rounded-full transition-all duration-300 ease-out',\n {\n variants: {\n variant: {\n default: 'bg-[var(--primary)]',\n success: 'bg-[var(--success,hsl(142,76%,36%))]',\n warning: 'bg-[var(--warning,hsl(38,92%,50%))]',\n destructive: 'bg-[var(--destructive)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\n/**\n * Progress container variants (wrapper with label positioning)\n */\nconst progressContainerVariants = cva('flex w-full gap-2', {\n variants: {\n labelPosition: {\n top: 'flex-col',\n side: 'flex-row items-center',\n },\n },\n defaultVariants: {\n labelPosition: 'top',\n },\n});\n\nexport interface ProgressComponentProps\n extends Omit<ProgressProps, 'children' | 'size' | 'variant'>,\n VariantProps<typeof progressTrackVariants>,\n VariantProps<typeof progressIndicatorVariants> {\n /** Size variant controlling track height */\n size?: 'sm' | 'default' | 'lg';\n /** Color variant for semantic meaning */\n variant?: 'default' | 'success' | 'warning' | 'destructive';\n}\n\n/**\n * Progress Component\n * Displays determinate or indeterminate progress indicators\n *\n * Features:\n * - WCAG 2.2 AAA compliant (7:1 contrast ratio)\n * - Determinate and indeterminate modes\n * - Custom value formatting via Intl.NumberFormat\n * - 3 size variants (sm, default, lg)\n * - 4 color variants (default, success, warning, destructive)\n * - Label support with flexible positioning\n * - Theme-aware styling via semantic CSS tokens\n */\nconst Progress = memo(\n forwardRef<HTMLDivElement, ProgressComponentProps>(\n (\n {\n value,\n minValue = 0,\n maxValue = 100,\n isIndeterminate = false,\n label,\n showValueLabel = true,\n valueLabel,\n formatOptions,\n labelPosition = 'top',\n variant = 'default',\n size = 'default',\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) => {\n const labelId = useId();\n\n // Determine if we should show the value label\n const shouldShowValueLabel = showValueLabel && !isIndeterminate;\n\n return (\n <AriaProgressBar\n ref={ref}\n value={isIndeterminate ? undefined : value}\n minValue={minValue}\n maxValue={maxValue}\n isIndeterminate={isIndeterminate}\n formatOptions={formatOptions ?? { style: 'percent' }}\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n className={cn(progressContainerVariants({ labelPosition }), className)}\n {...props}\n >\n {({ percentage, valueText }) => (\n <>\n {/* Label row with optional value display */}\n {(label || shouldShowValueLabel) && (\n <div className=\"flex justify-between text-sm\">\n {label && (\n <span\n id={labelId}\n className=\"font-medium text-[var(--content-foreground)]\"\n >\n {label}\n </span>\n )}\n {shouldShowValueLabel && (\n <span\n aria-hidden=\"true\"\n className=\"text-[var(--menu-muted)]\"\n >\n {valueLabel ?? valueText}\n </span>\n )}\n </div>\n )}\n\n {/* Progress track and indicator */}\n <div className={progressTrackVariants({ size })}>\n <div\n className={cn(\n progressIndicatorVariants({ variant }),\n isIndeterminate && 'motion-safe:animate-pulse'\n )}\n style={{\n width: isIndeterminate ? '100%' : `${percentage ?? 0}%`,\n }}\n />\n </div>\n </>\n )}\n </AriaProgressBar>\n );\n }\n )\n);\n\nProgress.displayName = 'Progress';\n\nexport {\n Progress,\n progressTrackVariants,\n progressIndicatorVariants,\n progressContainerVariants,\n};\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * Progress props schema extending BaseComponentProps\n *\n * @see React Aria ProgressBar: https://react-aria.adobe.com/ProgressBar\n * @see ShadCN Progress: https://ui.shadcn.com/docs/components/progress\n * @see tasks.md Phase 1.1 (Type System)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see constitution.md Principle IV (Accessibility First)\n */\nexport const ProgressPropsSchema = BaseComponentPropsSchema.extend({\n // Value props\n /** Current progress value (0-100 by default) */\n value: z.number().optional(),\n /** Minimum value (default: 0) */\n minValue: z.number().optional().default(0),\n /** Maximum value (default: 100) */\n maxValue: z.number().optional().default(100),\n /** When true, shows indeterminate animation (unknown progress) */\n isIndeterminate: z.boolean().optional(),\n\n // Label props\n /** Label text displayed above or beside the progress bar */\n label: z.string().optional(),\n /** Show/hide the value label (default: true) */\n showValueLabel: z.boolean().optional().default(true),\n /** Custom value label text (overrides formatted value) */\n valueLabel: z.string().optional(),\n /** Label position relative to progress bar */\n labelPosition: z.enum(['top', 'side']).optional().default('top'),\n\n // Note: formatOptions is Intl.NumberFormatOptions which can't be validated by Zod\n // It's handled in the TypeScript interface instead\n\n // Variants\n /** Color variant for semantic meaning */\n variant: z\n .enum(['default', 'success', 'warning', 'destructive'])\n .optional()\n .default('default'),\n /** Size variant controlling track height */\n size: z.enum(['sm', 'default', 'lg']).optional().default('default'),\n});\n\nexport type ProgressProps = z.infer<typeof ProgressPropsSchema> & {\n /** Number format options for value display (default: { style: 'percent' }) */\n formatOptions?: Intl.NumberFormatOptions;\n};\n\n/**\n * Progress variant type for CVA\n */\nexport type ProgressVariant = NonNullable<ProgressProps['variant']>;\n\n/**\n * Progress size type for CVA\n */\nexport type ProgressSize = NonNullable<ProgressProps['size']>;\n\n/**\n * Progress label position type\n */\nexport type ProgressLabelPosition = NonNullable<ProgressProps['labelPosition']>;\n","\"use client\";\n\n/**\n * RadioGroup Component\n * Accessible single-selection radio group with React Aria primitives and CVA styling\n *\n * Key Features:\n * - Bordered container design with explicit 44px+ touch targets\n * - 2 variants: default, destructive (no outline per clarification)\n * - 3 sizes: sm (44px), default (48px), lg (56px)\n * - Arrow keys move focus AND select (WAI-ARIA standard selection-follows-focus)\n * - Error styling on ALL items (cognitive accessibility)\n * - Spring animation for selection indicator\n * - RTL support (indicator auto-flips)\n * - Radio.Label and Radio.Description sub-components\n *\n * @see radiogroup-prd.md (Product Requirements)\n * @see plan.md (11 Key Clarifications)\n * @see React Aria RadioGroup: https://react-spectrum.adobe.com/react-aria/RadioGroup.html\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport {\n forwardRef,\n createContext,\n useContext,\n useId,\n type ReactNode,\n type ForwardedRef,\n} from 'react';\nimport {\n RadioGroup as AriaRadioGroup,\n Radio as AriaRadio,\n Label,\n Text,\n FieldError,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { FOCUS_STYLES, HIGH_CONTRAST_FOCUS } from '../../styles/interaction-states';\nimport type {\n RadioGroupProps,\n RadioProps,\n RadioLabelProps,\n RadioDescriptionProps,\n RadioGroupVariant,\n RadioGroupSize,\n} from './RadioGroup.types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface RadioGroupContextValue {\n variant: RadioGroupVariant;\n size: RadioGroupSize;\n isInvalid: boolean;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue>({\n variant: 'default',\n size: 'default',\n isInvalid: false,\n});\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * RadioGroup container variants\n * Controls orientation and spacing (gap-2 = 8px per clarification)\n */\nconst radioGroupVariants = cva(\n // Base: flex container\n \"flex\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col gap-2\",\n horizontal: \"flex-row flex-wrap gap-2\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n);\n\n/**\n * Radio item bordered container variants\n * Bordered container design with explicit touch targets\n * All sizes maintain 44px minimum height (WCAG 2.2 AAA)\n * All sizes use rounded-md (6px) per clarification\n */\nconst radioItemVariants = cva(\n // Base: bordered container with flex layout, RTL support\n [\n \"flex items-center gap-3 rounded-md border cursor-pointer\",\n \"transition-colors duration-200\",\n \"rtl:flex-row-reverse\", // RTL: indicator flips to right\n // Focus ring on entire container\n FOCUS_STYLES,\n HIGH_CONTRAST_FOCUS,\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[hovered]:bg-[var(--accent)]/10\",\n \"data-[selected]:border-[var(--primary)]\",\n \"data-[selected]:bg-[var(--primary)]/10\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[hovered]:bg-[var(--destructive)]/10\",\n \"data-[selected]:border-[var(--destructive)]\",\n \"data-[selected]:bg-[var(--destructive)]/10\",\n ].join(\" \"),\n },\n size: {\n sm: \"min-h-[44px] py-2 px-3 text-sm\",\n default: \"min-h-[48px] py-3 px-4 text-sm\",\n lg: \"min-h-[56px] py-4 px-5 text-base\",\n },\n isDisabled: {\n true: \"opacity-50 cursor-not-allowed\",\n false: \"\",\n },\n isInvalid: {\n // Error: ALL items get destructive border (cognitive accessibility)\n true: \"border-[var(--destructive)]\",\n false: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n isDisabled: false,\n isInvalid: false,\n },\n }\n);\n\n/**\n * Circle indicator (outer ring) variants\n */\nconst radioIndicatorVariants = cva(\n // Base: circle with border, flex-shrink-0 to prevent squishing\n \"flex-shrink-0 rounded-full border-2 flex items-center justify-center transition-colors duration-200\",\n {\n variants: {\n variant: {\n default: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--primary)]\",\n ].join(\" \"),\n destructive: [\n \"border-[var(--border)]\",\n \"data-[selected]:border-[var(--destructive)]\",\n ].join(\" \"),\n },\n size: {\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n/**\n * Inner dot variants (appears when selected)\n * Spring animation: cubic-bezier(0.34, 1.56, 0.64, 1) with slight overshoot\n */\nconst radioInnerDotVariants = cva(\n // Base: centered dot with spring animation\n [\n \"rounded-full transition-transform duration-200\",\n // Spring animation with overshoot\n \"[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]\",\n // Respect reduced motion preference\n \"motion-reduce:transition-none\",\n // Scale from 0 to 1 on selection\n \"scale-0 data-[selected]:scale-100\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: \"bg-[var(--primary)]\",\n destructive: \"bg-[var(--destructive)]\",\n },\n size: {\n sm: \"h-2 w-2\",\n default: \"h-2.5 w-2.5\",\n lg: \"h-3 w-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n// ============================================================================\n// Sub-components\n// ============================================================================\n\n/**\n * Radio.Label - Styled label for radio item content\n */\nfunction RadioLabel({ children, className }: RadioLabelProps): ReactNode {\n return (\n <span className={cn(\"font-medium text-[var(--content-foreground)]\", className)}>\n {children}\n </span>\n );\n}\n\nRadioLabel.displayName = \"Radio.Label\";\n\n/**\n * Radio.Description - Styled description for radio item content (muted)\n */\nfunction RadioDescription({ children, className }: RadioDescriptionProps): ReactNode {\n return (\n <span className={cn(\"text-sm text-[var(--menu-muted)]\", className)}>\n {children}\n </span>\n );\n}\n\nRadioDescription.displayName = \"Radio.Description\";\n\n// ============================================================================\n// Radio Component\n// ============================================================================\n\n/**\n * Radio item component with bordered container design\n */\nfunction RadioComponent({ value, isDisabled, children, className }: RadioProps): ReactNode {\n const { variant, size, isInvalid } = useContext(RadioGroupContext);\n\n return (\n <AriaRadio\n value={value}\n isDisabled={isDisabled}\n className={(renderProps) =>\n cn(\n radioItemVariants({\n variant,\n size,\n isDisabled: renderProps.isDisabled,\n isInvalid,\n }),\n className\n )\n }\n >\n {(renderProps) => (\n <>\n {/* Circle indicator */}\n <div\n className={radioIndicatorVariants({ variant, size })}\n data-selected={renderProps.isSelected || undefined}\n >\n {/* Inner dot with spring animation */}\n <div\n className={radioInnerDotVariants({ variant, size })}\n data-selected={renderProps.isSelected || undefined}\n />\n </div>\n\n {/* Children content (flexible - text, icons, complex layouts) */}\n <div className=\"flex-1 flex flex-col\">\n {children}\n </div>\n </>\n )}\n </AriaRadio>\n );\n}\n\n// Attach sub-components\nconst Radio = Object.assign(RadioComponent, {\n Label: RadioLabel,\n Description: RadioDescription,\n}) as typeof RadioComponent & {\n Label: typeof RadioLabel;\n Description: typeof RadioDescription;\n displayName: string;\n};\n\nRadio.displayName = \"Radio\";\n\n// ============================================================================\n// RadioGroup Component\n// ============================================================================\n\n/**\n * RadioGroup root component\n * Accessible single-selection control with bordered container design\n */\nconst RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n function RadioGroup(props: RadioGroupProps, ref: ForwardedRef<HTMLDivElement>) {\n const {\n // Display props\n label,\n description,\n errorMessage,\n // Selection props\n value,\n defaultValue,\n // State props\n isDisabled = false,\n isReadOnly = false,\n isRequired = false,\n isInvalid = false,\n // Layout props\n orientation = 'vertical',\n // Variant props\n variant = 'default',\n size = 'default',\n // Form props\n name,\n // Event handlers\n onChange,\n onFocusChange,\n // Standard props\n className,\n children,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n 'aria-describedby': ariaDescribedby,\n 'data-testid': dataTestId,\n ...restProps\n } = props;\n\n // Generate unique IDs for accessibility\n const generatedId = useId();\n const radioGroupId = id ?? generatedId;\n const labelId = `${radioGroupId}-label`;\n const descriptionId = `${radioGroupId}-description`;\n const errorId = `${radioGroupId}-error`;\n\n // Build aria-describedby from description and error\n const describedByParts: string[] = [];\n if (ariaDescribedby) describedByParts.push(ariaDescribedby);\n if (description) describedByParts.push(descriptionId);\n if (isInvalid && errorMessage) describedByParts.push(errorId);\n const computedAriaDescribedBy = describedByParts.length > 0\n ? describedByParts.join(' ')\n : undefined;\n\n return (\n <RadioGroupContext.Provider value={{ variant, size, isInvalid }}>\n <AriaRadioGroup\n ref={ref}\n id={radioGroupId}\n name={name}\n value={value ?? undefined}\n defaultValue={defaultValue ?? undefined}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n isInvalid={isInvalid}\n orientation={orientation}\n onChange={onChange}\n onFocusChange={onFocusChange}\n aria-label={ariaLabel}\n aria-labelledby={label ? labelId : ariaLabelledby}\n aria-describedby={computedAriaDescribedBy}\n data-testid={dataTestId}\n data-orientation={orientation}\n className={cn(\"flex flex-col gap-1.5\", className)}\n {...restProps}\n >\n {/* Label with optional required asterisk */}\n {label && (\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive)]\" aria-hidden=\"true\">\n *\n </span>\n )}\n </Label>\n )}\n\n {/* Description */}\n {description && (\n <Text\n id={descriptionId}\n slot=\"description\"\n className=\"text-sm text-[var(--menu-muted)]\"\n >\n {description}\n </Text>\n )}\n\n {/* Radio items container with orientation */}\n <div className={radioGroupVariants({ orientation })}>\n {children}\n </div>\n\n {/* Error message with role=\"alert\" for screen reader announcements */}\n {isInvalid && errorMessage && (\n <FieldError\n id={errorId}\n className=\"text-sm text-[var(--destructive)]\"\n >\n <span role=\"alert\">{errorMessage}</span>\n </FieldError>\n )}\n </AriaRadioGroup>\n </RadioGroupContext.Provider>\n );\n }\n);\n\nRadioGroup.displayName = \"RadioGroup\";\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n RadioGroup,\n Radio,\n radioGroupVariants,\n radioItemVariants,\n radioIndicatorVariants,\n radioInnerDotVariants,\n};\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode } from 'react';\nimport type {\n RadioGroupProps as AriaRadioGroupProps,\n RadioProps as AriaRadioProps,\n} from 'react-aria-components';\n\n/**\n * RadioGroup variant schema\n * Only 2 variants: default and destructive (no outline per clarification)\n *\n * @see radiogroup-prd.md US-2 (Style Variants)\n * @see plan.md Decision 9 (2 variants only)\n */\nexport const RadioGroupVariantSchema = z.enum(['default', 'destructive']);\nexport type RadioGroupVariant = z.infer<typeof RadioGroupVariantSchema>;\n\n/**\n * RadioGroup size schema\n * All sizes maintain 44px minimum height for WCAG 2.2 AAA compliance\n *\n * @see radiogroup-prd.md US-3 (Size Variants)\n * @see constitution.md Principle IV (Accessibility First)\n */\nexport const RadioGroupSizeSchema = z.enum(['sm', 'default', 'lg']);\nexport type RadioGroupSize = z.infer<typeof RadioGroupSizeSchema>;\n\n/**\n * RadioGroup orientation schema\n *\n * @see radiogroup-prd.md US-5 (Orientation Support)\n */\nexport const RadioGroupOrientationSchema = z.enum(['vertical', 'horizontal']);\nexport type RadioGroupOrientation = z.infer<typeof RadioGroupOrientationSchema>;\n\n/**\n * RadioGroup root component props schema\n *\n * @see radiogroup-prd.md US-1 (Basic Single Selection)\n * @see radiogroup-prd.md US-4 (Labels, Descriptions, Errors)\n * @see radiogroup-prd.md US-6 (Validation States)\n * @see plan.md (All design decisions from clarification session)\n */\nexport const RadioGroupPropsSchema = BaseComponentPropsSchema.extend({\n // Display props (US-4)\n label: z.string().optional(),\n description: z.string().optional(),\n errorMessage: z.string().optional(),\n\n // Selection props (US-1) - nullable for no initial selection\n value: z.string().nullable().optional(),\n defaultValue: z.string().nullable().optional(),\n\n // State props (US-6)\n isDisabled: z.boolean().optional().default(false),\n isReadOnly: z.boolean().optional().default(false),\n isRequired: z.boolean().optional().default(false),\n isInvalid: z.boolean().optional().default(false),\n\n // Layout props (US-5)\n orientation: RadioGroupOrientationSchema.optional().default('vertical'),\n\n // Variant props (US-2, US-3) - 2 variants only\n variant: RadioGroupVariantSchema.optional().default('default'),\n size: RadioGroupSizeSchema.optional().default('default'),\n\n // Form props (US-6)\n name: z.string().optional(),\n\n // Event handlers\n onChange: z.custom<(value: string) => void>().optional(),\n onFocusChange: z.custom<(isFocused: boolean) => void>().optional(),\n\n // Children (Radio components)\n children: z.custom<ReactNode>(),\n});\n\nexport type RadioGroupProps = z.infer<typeof RadioGroupPropsSchema> &\n Omit<AriaRadioGroupProps, keyof z.infer<typeof RadioGroupPropsSchema>>;\n\n/**\n * Radio item component props schema\n *\n * @see radiogroup-prd.md US-1 (Basic Single Selection)\n * @see radiogroup-prd.md US-7 (Rich Content Support)\n */\nexport const RadioPropsSchema = BaseComponentPropsSchema.extend({\n // Item value (required)\n value: z.string(),\n\n // Disabled state (individual item)\n isDisabled: z.boolean().optional().default(false),\n\n // Item content - accepts any ReactNode for flexible children\n children: z.custom<ReactNode>(),\n\n // Optional className for custom styling\n className: z.string().optional(),\n});\n\nexport type RadioProps = z.infer<typeof RadioPropsSchema> &\n Omit<AriaRadioProps, keyof z.infer<typeof RadioPropsSchema>>;\n\n/**\n * Radio.Label sub-component props schema\n * Helper component for styled label within Radio item\n *\n * @see radiogroup-prd.md US-7 (Rich Content Support)\n * @see plan.md Decision 1 (Sub-components)\n */\nexport const RadioLabelPropsSchema = z.object({\n // Label content\n children: z.custom<ReactNode>(),\n\n // Optional className for custom styling\n className: z.string().optional(),\n});\n\nexport type RadioLabelProps = z.infer<typeof RadioLabelPropsSchema>;\n\n/**\n * Radio.Description sub-component props schema\n * Helper component for styled description within Radio item (muted text)\n *\n * @see radiogroup-prd.md US-7 (Rich Content Support)\n * @see plan.md Decision 1 (Sub-components)\n */\nexport const RadioDescriptionPropsSchema = z.object({\n // Description content\n children: z.custom<ReactNode>(),\n\n // Optional className for custom styling\n className: z.string().optional(),\n});\n\nexport type RadioDescriptionProps = z.infer<typeof RadioDescriptionPropsSchema>;\n\n/**\n * CVA variant configuration types\n * Used for class-variance-authority integration\n */\nexport type RadioGroupVariantType = RadioGroupVariant;\nexport type RadioGroupSizeType = RadioGroupSize;\nexport type RadioGroupOrientationType = RadioGroupOrientation;\n","\"use client\";\n\n/**\n * Panel Component - Accessible Non-Modal Sidebar\n * Disclosure pattern + Complementary region for WCAG 2.2 AAA\n *\n * @see plan.md for architecture details\n * @see panel-prd.md for requirements\n * @see ADR 0007 for accessibility decisions\n */\n\nimport {\n type ReactElement,\n type MutableRefObject,\n createContext,\n useContext,\n useState,\n useId,\n useRef,\n useCallback,\n useEffect,\n cloneElement,\n isValidElement,\n} from \"react\";\nimport {\n Button as AriaButton,\n Modal as AriaModal,\n ModalOverlay as AriaModalOverlay,\n Dialog as AriaDialog,\n} from \"react-aria-components\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport type {\n PanelProps,\n PanelTriggerProps,\n PanelContentProps,\n PanelHeaderProps,\n PanelTitleProps,\n PanelDescriptionProps,\n PanelBodyProps,\n PanelFooterProps,\n PanelCloseProps,\n PanelPosition,\n PanelWidth,\n} from \"./Panel.types\";\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Panel content variants\n * Controls position-based styling and width\n */\nexport const panelContentVariants = cva(\n [\n \"flex flex-col h-full\",\n \"bg-[var(--content-background)] text-[var(--content-foreground)]\",\n \"shadow-lg\",\n ],\n {\n variants: {\n position: {\n right: \"border-l border-[var(--border)]\",\n left: \"border-r border-[var(--border)]\",\n },\n width: {\n sm: \"w-[300px]\",\n md: \"w-[400px]\",\n lg: \"w-[500px]\",\n xl: \"w-[600px]\",\n auto: \"w-auto\",\n },\n },\n defaultVariants: {\n position: \"right\",\n width: \"md\",\n },\n }\n);\n\n/**\n * Panel header variants\n */\nexport const panelHeaderVariants = cva([\n \"flex items-start justify-between\",\n \"px-4 py-4\",\n \"border-b border-[var(--border)]\",\n]);\n\n/**\n * Panel body variants\n */\nexport const panelBodyVariants = cva([\"flex-1 overflow-y-auto\", \"px-4 py-4\"]);\n\n/**\n * Panel footer variants\n */\nexport const panelFooterVariants = cva([\n \"flex items-center justify-end gap-2\",\n \"px-4 py-4\",\n \"border-t border-[var(--border)]\",\n]);\n\n/**\n * Close button variants\n */\nexport const panelCloseButtonVariants = cva([\n \"inline-flex items-center justify-center rounded-md\",\n \"min-h-[44px] min-w-[44px]\",\n \"text-[var(--menu-muted)]\",\n \"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]\",\n \"focus-visible:outline-none focus-visible:ring-2\",\n \"focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2\",\n // No transition - instant state changes (v1)\n]);\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface PanelContextValue {\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n panelId: string;\n titleId: string;\n triggerRef: MutableRefObject<HTMLElement | null>;\n position: PanelPosition;\n width: PanelWidth;\n mobileBreakpoint: number;\n isMobile: boolean;\n handleClose: () => void;\n}\n\nconst PanelContext = createContext<PanelContextValue | null>(null);\n\nfunction usePanelContext(): PanelContextValue {\n const context = useContext(PanelContext);\n if (!context) {\n throw new Error(\"Panel compound components must be used within a Panel\");\n }\n return context;\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * SSR-safe media query hook\n * Defaults to false on server (desktop mode)\n */\nfunction useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(() => {\n // Default to false on server (desktop mode)\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(query).matches;\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const media = window.matchMedia(query);\n // Sync state after mount (handles SSR mismatch)\n if (media.matches !== matches) {\n setMatches(media.matches);\n }\n const listener = (e: MediaQueryListEvent) => setMatches(e.matches);\n media.addEventListener(\"change\", listener);\n return () => media.removeEventListener(\"change\", listener);\n }, [query, matches]);\n\n return matches;\n}\n\n// ============================================================================\n// Panel Root\n// ============================================================================\n\nfunction PanelRoot({\n children,\n isOpen: controlledIsOpen,\n defaultOpen = false,\n onOpenChange,\n onClose,\n position = \"right\",\n width = \"md\",\n mobileBreakpoint = 768,\n}: PanelProps): ReactElement {\n // State management (controlled/uncontrolled)\n const [uncontrolledIsOpen, setUncontrolledIsOpen] = useState(defaultOpen);\n const isControlled = controlledIsOpen !== undefined;\n const isOpen = isControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n // Refs\n const triggerRef = useRef<HTMLElement | null>(null);\n\n // IDs for ARIA\n const uniqueId = useId();\n const panelId = `panel-${uniqueId}`;\n const titleId = `panel-title-${uniqueId}`;\n\n // Responsive detection\n const isMobile = useMediaQuery(`(max-width: ${mobileBreakpoint - 1}px)`);\n\n // State setter\n const setIsOpen = useCallback(\n (open: boolean) => {\n if (!isControlled) {\n setUncontrolledIsOpen(open);\n }\n onOpenChange?.(open);\n },\n [isControlled, onOpenChange]\n );\n\n // Close handler with focus restoration\n const handleClose = useCallback(() => {\n setIsOpen(false);\n onClose?.();\n // Return focus to trigger if it still exists in DOM\n if (triggerRef.current) {\n window.requestAnimationFrame(() => {\n triggerRef.current?.focus();\n });\n }\n }, [setIsOpen, onClose]);\n\n // Escape key handler (desktop only - mobile handled by React Aria)\n useEffect(() => {\n if (!isOpen || isMobile) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n handleClose();\n }\n };\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [isOpen, isMobile, handleClose]);\n\n const contextValue: PanelContextValue = {\n isOpen,\n setIsOpen,\n panelId,\n titleId,\n triggerRef,\n position,\n width,\n mobileBreakpoint,\n isMobile,\n handleClose,\n };\n\n return (\n <PanelContext.Provider value={contextValue}>\n {children}\n </PanelContext.Provider>\n );\n}\nPanelRoot.displayName = \"Panel\";\n\n// ============================================================================\n// Panel.Trigger\n// ============================================================================\n\nfunction PanelTrigger({\n children,\n asChild = true,\n}: PanelTriggerProps): ReactElement | null {\n const { isOpen, setIsOpen, panelId, triggerRef } = usePanelContext();\n\n // Capture ref via callback ref pattern\n const setRef = useCallback(\n (element: HTMLElement | null) => {\n triggerRef.current = element;\n },\n [triggerRef]\n );\n\n const handlePress = useCallback(() => {\n setIsOpen(!isOpen);\n }, [setIsOpen, isOpen]);\n\n // If asChild, clone the child element and add props\n if (asChild && isValidElement(children)) {\n const childProps = children.props as unknown as {\n onPress?: () => void;\n onClick?: () => void;\n };\n return cloneElement(children, {\n ref: setRef,\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? panelId : undefined,\n \"data-testid\": \"panel-trigger\",\n onPress: handlePress,\n onClick: childProps.onClick\n ? () => {\n childProps.onClick?.();\n handlePress();\n }\n : handlePress,\n } as unknown as Record<string, unknown>);\n }\n\n // Fallback: wrap in AriaButton\n return (\n <AriaButton\n ref={setRef}\n aria-expanded={isOpen}\n aria-controls={isOpen ? panelId : undefined}\n onPress={handlePress}\n data-testid=\"panel-trigger\"\n >\n {children}\n </AriaButton>\n );\n}\nPanelTrigger.displayName = \"PanelTrigger\";\n\n// ============================================================================\n// Built-in Close Button\n// ============================================================================\n\nfunction BuiltInCloseButton(): ReactElement {\n const { handleClose } = usePanelContext();\n\n return (\n <AriaButton\n aria-label=\"Close panel\"\n data-testid=\"panel-close\"\n onPress={handleClose}\n className={panelCloseButtonVariants()}\n >\n <X className=\"h-5 w-5\" />\n </AriaButton>\n );\n}\n\n// ============================================================================\n// Panel.Content\n// ============================================================================\n\nfunction PanelContent({\n children,\n showClose = true,\n className,\n}: PanelContentProps): ReactElement | null {\n const { isOpen, isMobile, panelId, titleId, position, width, handleClose } =\n usePanelContext();\n\n if (!isOpen) return null;\n\n // Mobile: Use React Aria Modal primitives\n if (isMobile) {\n return (\n <AriaModalOverlay\n isDismissable\n isOpen={isOpen}\n onOpenChange={(open) => !open && handleClose()}\n className=\"fixed inset-0 z-50 bg-black/50\"\n >\n <AriaModal className=\"fixed inset-0 z-50 flex items-center justify-center p-4\">\n <AriaDialog\n aria-labelledby={titleId}\n className={cn(\n \"w-full max-w-lg rounded-lg bg-[var(--content-background)] shadow-lg outline-none\",\n \"flex max-h-[90vh] flex-col\",\n className\n )}\n >\n {showClose && (\n <div className=\"absolute right-2 top-2\">\n <BuiltInCloseButton />\n </div>\n )}\n {children}\n </AriaDialog>\n </AriaModal>\n </AriaModalOverlay>\n );\n }\n\n // Desktop: Render aside in-place\n return (\n <aside\n id={panelId}\n aria-labelledby={titleId}\n data-testid=\"panel-content\"\n className={cn(panelContentVariants({ position, width }), className)}\n >\n {children}\n {showClose && (\n <div className=\"absolute right-2 top-2\">\n <BuiltInCloseButton />\n </div>\n )}\n </aside>\n );\n}\nPanelContent.displayName = \"PanelContent\";\n\n// ============================================================================\n// Panel.Header\n// ============================================================================\n\nfunction PanelHeader({\n children,\n className,\n}: PanelHeaderProps): ReactElement | null {\n // Note: We use a <header> element but DON'T add role=\"banner\"\n // because banner landmarks should not be contained in other landmarks (like aside)\n // The header element still provides structural meaning for the panel\n return (\n <header className={cn(panelHeaderVariants(), className)}>\n <div className=\"flex flex-col gap-1\">{children}</div>\n </header>\n );\n}\nPanelHeader.displayName = \"PanelHeader\";\n\n// ============================================================================\n// Panel.Title\n// ============================================================================\n\nfunction PanelTitle({\n children,\n as: Tag = \"h2\",\n className,\n}: PanelTitleProps): ReactElement | null {\n const { titleId } = usePanelContext();\n\n return (\n <Tag\n id={titleId}\n // aria-live=\"polite\" announces title changes to screen readers\n // This is important for master-detail patterns where panel content\n // updates when selecting different items (e.g., candidate profiles)\n aria-live=\"polite\"\n className={cn(\n \"text-lg font-semibold text-[var(--content-foreground)]\",\n className\n )}\n >\n {children}\n </Tag>\n );\n}\nPanelTitle.displayName = \"PanelTitle\";\n\n// ============================================================================\n// Panel.Description\n// ============================================================================\n\nfunction PanelDescription({\n children,\n className,\n}: PanelDescriptionProps): ReactElement | null {\n return (\n <p className={cn(\"text-sm text-[var(--menu-muted)]\", className)}>\n {children}\n </p>\n );\n}\nPanelDescription.displayName = \"PanelDescription\";\n\n// ============================================================================\n// Panel.Body\n// ============================================================================\n\nfunction PanelBody({ children, className }: PanelBodyProps): ReactElement | null {\n return <div className={cn(panelBodyVariants(), className)}>{children}</div>;\n}\nPanelBody.displayName = \"PanelBody\";\n\n// ============================================================================\n// Panel.Footer\n// ============================================================================\n\nfunction PanelFooter({\n children,\n className,\n}: PanelFooterProps): ReactElement | null {\n // Note: We use a <footer> element but DON'T add role=\"contentinfo\"\n // because contentinfo landmarks should not be contained in other landmarks (like aside)\n // The footer element still provides structural meaning for the panel\n return (\n <footer className={cn(panelFooterVariants(), className)}>\n {children}\n </footer>\n );\n}\nPanelFooter.displayName = \"PanelFooter\";\n\n// ============================================================================\n// Panel.Close\n// ============================================================================\n\nfunction PanelClose({ children }: PanelCloseProps): ReactElement | null {\n const { handleClose } = usePanelContext();\n\n if (!isValidElement(children)) {\n return null;\n }\n\n // Clone the child and add onPress/onClick handler\n const childProps = children.props as unknown as {\n onPress?: () => void;\n onClick?: () => void;\n };\n\n return cloneElement(children, {\n onPress: () => {\n childProps.onPress?.();\n handleClose();\n },\n onClick: () => {\n childProps.onClick?.();\n handleClose();\n },\n } as unknown as Record<string, unknown>);\n}\nPanelClose.displayName = \"PanelClose\";\n\n// ============================================================================\n// Compound Component Export\n// ============================================================================\n\n/**\n * Panel Component\n *\n * Accessible non-modal sidebar panel using the disclosure pattern with\n * a complementary region for WCAG 2.2 AAA compliance.\n *\n * @example\n * ```tsx\n * <Panel>\n * <Panel.Trigger>\n * <Button>Open Panel</Button>\n * </Panel.Trigger>\n * <Panel.Content>\n * <Panel.Header>\n * <Panel.Title>Panel Title</Panel.Title>\n * <Panel.Description>Optional description</Panel.Description>\n * </Panel.Header>\n * <Panel.Body>\n * Panel content here\n * </Panel.Body>\n * <Panel.Footer>\n * <Button>Action</Button>\n * </Panel.Footer>\n * </Panel.Content>\n * </Panel>\n * ```\n */\nexport const Panel = Object.assign(PanelRoot, {\n Trigger: PanelTrigger,\n Content: PanelContent,\n Header: PanelHeader,\n Title: PanelTitle,\n Description: PanelDescription,\n Body: PanelBody,\n Footer: PanelFooter,\n Close: PanelClose,\n});\n\n// Named exports for individual components\nexport {\n PanelRoot,\n PanelTrigger,\n PanelContent,\n PanelHeader,\n PanelTitle,\n PanelDescription,\n PanelBody,\n PanelFooter,\n PanelClose,\n};\n\n// Export CVA variant types for customization\nexport type PanelContentVariants = VariantProps<typeof panelContentVariants>;\n","'use client';\n\n/**\n * ResizablePanelGroup Component\n *\n * Container component for resizable panel layouts.\n * Provides context for child panels and handles.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { forwardRef, useImperativeHandle, type ReactElement } from 'react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizablePanelGroupProps } from '../Resizable.types';\nimport {\n ResizableContext,\n useResizableProvider,\n} from '../hooks/useResizableContext';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePanelGroup - Container for resizable panels.\n *\n * Provides context for child ResizablePanel and ResizableHandle components.\n * Supports both controlled and uncontrolled modes.\n *\n * @example\n * ```tsx\n * <ResizablePanelGroup direction=\"horizontal\" groupLabel=\"Main layout\">\n * <ResizablePanel name=\"Sidebar\">Content</ResizablePanel>\n * <ResizableHandle />\n * <ResizablePanel name=\"Main\">Content</ResizablePanel>\n * </ResizablePanelGroup>\n * ```\n */\nexport const ResizablePanelGroup = forwardRef<\n HTMLDivElement | null,\n ResizablePanelGroupProps\n>(function ResizablePanelGroup(\n { direction, groupLabel, sizes, onSizesChange, className, children },\n ref\n): ReactElement {\n // Create context value with controlled/uncontrolled handling\n const contextValue = useResizableProvider({\n direction,\n groupLabel,\n sizes,\n onSizesChange,\n });\n\n // Expose containerRef to parent via forwarded ref\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(\n ref,\n () => contextValue.containerRef.current,\n [contextValue.containerRef]\n );\n\n return (\n <ResizableContext.Provider value={contextValue}>\n <div\n ref={contextValue.containerRef}\n role=\"group\"\n aria-label={`${groupLabel}, ${direction}`}\n data-direction={direction}\n className={cn(\n 'flex h-full w-full',\n direction === 'horizontal' ? 'flex-row' : 'flex-col',\n className\n )}\n >\n {children}\n </div>\n </ResizableContext.Provider>\n );\n});\n\nResizablePanelGroup.displayName = 'ResizablePanelGroup';\n","/**\n * Resizable Context Hook\n *\n * Provides context for ResizablePanelGroup compound components.\n * Manages panel sizes, registration, and screen reader announcements.\n */\n\nimport {\n createContext,\n useContext,\n useRef,\n useState,\n useCallback,\n useEffect,\n type ReactNode,\n} from 'react';\nimport type { ResizableContextValue, PanelInfo } from '../Resizable.types';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Context for Resizable compound components.\n * Must be used within a ResizablePanelGroup.\n */\nexport const ResizableContext = createContext<ResizableContextValue | null>(\n null\n);\n\nResizableContext.displayName = 'ResizableContext';\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook to access ResizableContext.\n * Throws an error if used outside of ResizablePanelGroup.\n *\n * @returns ResizableContextValue\n * @throws Error if used outside ResizablePanelGroup\n */\nexport function useResizableContext(): ResizableContextValue {\n const context = useContext(ResizableContext);\n\n if (!context) {\n throw new Error(\n 'useResizableContext must be used within a ResizablePanelGroup. ' +\n 'Make sure ResizablePanel and ResizableHandle are children of ResizablePanelGroup.'\n );\n }\n\n return context;\n}\n\n// ============================================================================\n// Provider Props\n// ============================================================================\n\ninterface ResizableProviderProps {\n direction: 'horizontal' | 'vertical';\n groupLabel: string;\n sizes?: number[];\n defaultSizes?: number[];\n onSizesChange?: (sizes: number[]) => void;\n children: ReactNode;\n}\n\n// ============================================================================\n// Provider Hook\n// ============================================================================\n\n/**\n * Hook to create ResizableContext value for the provider.\n * Handles both controlled and uncontrolled modes.\n */\nexport function useResizableProvider({\n direction,\n groupLabel,\n sizes: controlledSizes,\n onSizesChange,\n}: Omit<ResizableProviderProps, 'children'>): ResizableContextValue {\n // Internal state for uncontrolled mode\n const [internalSizes, setInternalSizes] = useState<number[]>([]);\n\n // Panel registration\n const [panels, setPanels] = useState<PanelInfo[]>([]);\n\n // Container ref for size calculations\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Live region ref for announcements\n const liveRegionRef = useRef<HTMLDivElement | null>(null);\n const announceTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Track if sizes have been initialized\n const sizesInitializedRef = useRef(false);\n\n // Determine if controlled\n const isControlled = controlledSizes !== undefined;\n const sizes = isControlled ? controlledSizes : internalSizes;\n\n /**\n * Update sizes - handles both controlled and uncontrolled modes.\n */\n const setSizes = useCallback(\n (newSizes: number[]) => {\n if (isControlled) {\n onSizesChange?.(newSizes);\n } else {\n setInternalSizes(newSizes);\n }\n },\n [isControlled, onSizesChange]\n );\n\n /**\n * Register a panel with the group.\n */\n const registerPanel = useCallback((index: number, info: PanelInfo) => {\n setPanels((prev) => {\n const newPanels = [...prev];\n newPanels[index] = info;\n return newPanels;\n });\n }, []);\n\n /**\n * Unregister a panel from the group.\n */\n const unregisterPanel = useCallback((index: number) => {\n setPanels((prev) => {\n const newPanels = [...prev];\n delete newPanels[index];\n return newPanels.filter(Boolean);\n });\n }, []);\n\n // Initialize sizes when panels are registered (uncontrolled mode only)\n useEffect(() => {\n // Skip if controlled or already initialized\n if (isControlled || sizesInitializedRef.current) return;\n\n // Get registered panel count\n const registeredPanels = panels.filter(Boolean);\n const panelCount = registeredPanels.length;\n\n // Wait until we have at least 2 panels (common case: panel + panel with handle between)\n if (panelCount < 2) return;\n\n // Check if sizes need initialization\n const needsInit = sizes.length < panelCount || sizes.some((s) => s === undefined);\n\n if (needsInit) {\n // Initialize with equal distribution using defaultSize from each panel if available\n const newSizes: number[] = [];\n const equalSize = 100 / panelCount;\n\n for (let i = 0; i < panelCount; i++) {\n newSizes[i] = equalSize;\n }\n\n sizesInitializedRef.current = true;\n setInternalSizes(newSizes);\n }\n }, [panels, sizes, isControlled]);\n\n // Cleanup live region on unmount\n useEffect(() => {\n return () => {\n if (announceTimeoutRef.current) {\n clearTimeout(announceTimeoutRef.current);\n }\n if (liveRegionRef.current) {\n document.body.removeChild(liveRegionRef.current);\n liveRegionRef.current = null;\n }\n };\n }, []);\n\n /**\n * Announce a message to screen readers via live region.\n */\n const announce = useCallback((message: string) => {\n // Create live region if it doesn't exist\n if (!liveRegionRef.current) {\n const liveRegion = document.createElement('div');\n liveRegion.setAttribute('aria-live', 'polite');\n liveRegion.setAttribute('aria-atomic', 'true');\n liveRegion.className = 'sr-only';\n liveRegion.style.cssText =\n 'position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;';\n document.body.appendChild(liveRegion);\n liveRegionRef.current = liveRegion;\n }\n\n // Update live region content\n liveRegionRef.current.textContent = message;\n\n // Clear previous timeout if any\n if (announceTimeoutRef.current) {\n clearTimeout(announceTimeoutRef.current);\n }\n\n // Clear after announcement\n announceTimeoutRef.current = setTimeout(() => {\n if (liveRegionRef.current) {\n liveRegionRef.current.textContent = '';\n }\n }, 1000);\n }, []);\n\n return {\n direction,\n groupLabel,\n sizes,\n setSizes,\n panels,\n registerPanel,\n unregisterPanel,\n announce,\n containerRef,\n };\n}\n","'use client';\n\n/**\n * ResizablePanel Component\n *\n * Individual panel within a ResizablePanelGroup.\n * Registers with context and applies size from group state.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type ReactElement,\n} from 'react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizablePanelProps } from '../Resizable.types';\nimport { DEFAULT_MIN_SIZE, DEFAULT_MAX_SIZE } from '../Resizable.types';\nimport { useResizableContext } from '../hooks/useResizableContext';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePanel - Individual panel in a resizable layout.\n *\n * Must be used within a ResizablePanelGroup.\n * Registers itself with context for size management.\n *\n * @example\n * ```tsx\n * <ResizablePanel name=\"Sidebar\" defaultSize={25} minSize={15} maxSize={40}>\n * <SidebarContent />\n * </ResizablePanel>\n * ```\n */\nexport const ResizablePanel = forwardRef<HTMLDivElement, ResizablePanelProps>(\n function ResizablePanel(\n {\n name,\n defaultSize: _defaultSize,\n minSize = DEFAULT_MIN_SIZE,\n maxSize = DEFAULT_MAX_SIZE,\n collapsible = false,\n onCollapse,\n onExpand,\n onResize,\n className,\n children,\n },\n ref\n ): ReactElement {\n const { sizes, registerPanel, unregisterPanel, containerRef } =\n useResizableContext();\n\n // Internal ref for DOM element\n const internalRef = useRef<HTMLDivElement>(null);\n\n // Track panel index based on DOM order (use state to trigger re-renders)\n const [panelIndex, setPanelIndex] = useState<number>(-1);\n const prevSizeRef = useRef<number | null>(null);\n const isRegisteredRef = useRef(false);\n const registeredIndexRef = useRef<number>(-1);\n\n // Calculate panel index from DOM position (useEffect runs after refs are set)\n useEffect(() => {\n const panel = internalRef.current;\n const container = containerRef.current;\n if (!panel || !container) return;\n\n // Count panels before this one in the DOM\n const allPanels = container.querySelectorAll('[data-resizable-panel]');\n let foundIndex = -1;\n for (let i = 0; i < allPanels.length; i++) {\n if (allPanels[i] === panel) {\n foundIndex = i;\n break;\n }\n }\n\n if (foundIndex === -1) return;\n\n // Update index state (triggers re-render)\n if (panelIndex !== foundIndex) {\n setPanelIndex(foundIndex);\n }\n\n // Register/update panel info\n if (!isRegisteredRef.current) {\n isRegisteredRef.current = true;\n registeredIndexRef.current = foundIndex;\n registerPanel(foundIndex, {\n name,\n minSize,\n maxSize,\n collapsible,\n });\n }\n\n return () => {\n if (isRegisteredRef.current) {\n unregisterPanel(registeredIndexRef.current);\n isRegisteredRef.current = false;\n }\n };\n }, [containerRef, registerPanel, unregisterPanel, name, minSize, maxSize, collapsible, panelIndex]);\n\n // Get current size for this panel\n const currentSize = panelIndex >= 0 ? sizes[panelIndex] ?? 50 : 50;\n\n // Handle collapse/expand callbacks\n useEffect(() => {\n if (prevSizeRef.current === null) {\n prevSizeRef.current = currentSize;\n return;\n }\n\n const wasCollapsed = prevSizeRef.current === 0;\n const isCollapsed = currentSize === 0;\n\n if (!wasCollapsed && isCollapsed && onCollapse) {\n onCollapse();\n } else if (wasCollapsed && !isCollapsed && onExpand) {\n onExpand();\n }\n\n if (onResize && prevSizeRef.current !== currentSize) {\n onResize(currentSize);\n }\n\n prevSizeRef.current = currentSize;\n }, [currentSize, onCollapse, onExpand, onResize]);\n\n return (\n <div\n ref={(node) => {\n // Update internal ref\n (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n // Forward to external ref if provided\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n }}\n role=\"region\"\n aria-label={name}\n data-resizable-panel=\"\"\n data-panel-name={name}\n data-panel-index={panelIndex}\n data-collapsed={currentSize === 0}\n style={{\n flexBasis: `${currentSize}%`,\n flexGrow: 0,\n flexShrink: 0,\n overflow: 'hidden',\n }}\n className={cn('relative', className)}\n >\n {children}\n </div>\n );\n }\n);\n\nResizablePanel.displayName = 'ResizablePanel';\n","/**\n * Resizable Component Types\n *\n * Zod schemas and TypeScript types for the Resizable compound component.\n * Provides accessible, keyboard-navigable resizable panel layouts.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { z } from 'zod';\nimport { type ReactNode } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default minimum panel size (percentage).\n */\nexport const DEFAULT_MIN_SIZE = 10;\n\n/**\n * Default maximum panel size (percentage).\n */\nexport const DEFAULT_MAX_SIZE = 90;\n\n/**\n * Long-press threshold for touch devices (ms).\n * Tap (< threshold) opens popover, long-press (>= threshold) enables drag.\n */\nexport const LONG_PRESS_THRESHOLD = 300;\n\n// ============================================================================\n// Preset Type\n// ============================================================================\n\n/**\n * Size preset for quick adjustment via popover.\n */\nexport interface ResizePreset {\n /** Display label for the preset button */\n label: string;\n /** Size percentages for each panel (must sum to 100) */\n sizes: number[];\n}\n\n/**\n * Zod schema for ResizePreset validation.\n */\nexport const ResizePresetSchema = z.object({\n label: z.string().min(1),\n sizes: z.array(z.number().min(0).max(100)),\n});\n\n// ============================================================================\n// ResizablePanelGroup Props\n// ============================================================================\n\n/**\n * Zod schema for ResizablePanelGroup props.\n */\nexport const ResizablePanelGroupPropsSchema = z.object({\n /** Layout direction */\n direction: z.enum(['horizontal', 'vertical']),\n\n /** REQUIRED: Label for screen reader identification of this group */\n groupLabel: z.string().min(1),\n\n /** Controlled mode: current sizes as percentages */\n sizes: z.array(z.number().min(0).max(100)).optional(),\n\n /** Callback when sizes change */\n onSizesChange: z.function().optional(),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n\n /** Panel children */\n children: z.custom<ReactNode>(),\n});\n\n/**\n * Props for ResizablePanelGroup component.\n */\nexport interface ResizablePanelGroupProps {\n /** Layout direction: 'horizontal' or 'vertical' */\n direction: 'horizontal' | 'vertical';\n\n /** REQUIRED: Label for screen reader identification (e.g., \"Main layout\") */\n groupLabel: string;\n\n /** Controlled mode: current sizes as percentages (must sum to 100) */\n sizes?: number[];\n\n /** Callback when sizes change */\n onSizesChange?: (sizes: number[]) => void;\n\n /** Additional CSS classes */\n className?: string;\n\n /** Panel and Handle children */\n children: ReactNode;\n}\n\n// ============================================================================\n// ResizablePanel Props\n// ============================================================================\n\n/**\n * Zod schema for ResizablePanel props.\n */\nexport const ResizablePanelPropsSchema = z.object({\n /** REQUIRED: Name for screen reader identification */\n name: z.string().min(1),\n\n /** Default size as percentage (auto-distributes equally if omitted) */\n defaultSize: z.number().min(0).max(100).optional(),\n\n /** Minimum size as percentage */\n minSize: z.number().min(0).max(100).optional().default(DEFAULT_MIN_SIZE),\n\n /** Maximum size as percentage */\n maxSize: z.number().min(0).max(100).optional().default(DEFAULT_MAX_SIZE),\n\n /** Whether panel can collapse to 0% */\n collapsible: z.boolean().optional().default(false),\n\n /** Callback when panel collapses */\n onCollapse: z.function().optional(),\n\n /** Callback when panel expands from collapsed */\n onExpand: z.function().optional(),\n\n /** Callback when panel resizes */\n onResize: z.function().optional(),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n\n /** Panel content */\n children: z.custom<ReactNode>(),\n});\n\n/**\n * Props for ResizablePanel component.\n */\nexport interface ResizablePanelProps {\n /** REQUIRED: Name for screen reader identification (e.g., \"Sidebar\") */\n name: string;\n\n /** Default size as percentage (0-100). Auto-distributes equally if omitted. */\n defaultSize?: number;\n\n /** Minimum size as percentage (default: 10) */\n minSize?: number;\n\n /** Maximum size as percentage (default: 90) */\n maxSize?: number;\n\n /** Whether panel can collapse to 0% */\n collapsible?: boolean;\n\n /** Callback when panel collapses to 0% */\n onCollapse?: () => void;\n\n /** Callback when panel expands from collapsed state */\n onExpand?: () => void;\n\n /** Callback when panel size changes */\n onResize?: (size: number) => void;\n\n /** Additional CSS classes */\n className?: string;\n\n /** Panel content */\n children: ReactNode;\n}\n\n// ============================================================================\n// ResizableHandle Props\n// ============================================================================\n\n/**\n * Zod schema for ResizableHandle props.\n */\nexport const ResizableHandlePropsSchema = z.object({\n /** Whether to show the visual grip indicator */\n withHandle: z.boolean().optional().default(true),\n\n /** Size presets for quick adjustment */\n presets: z.array(ResizePresetSchema).optional(),\n\n /** Whether the handle is disabled */\n disabled: z.boolean().optional().default(false),\n\n /** Additional CSS classes */\n className: z.string().optional(),\n});\n\n/**\n * Props for ResizableHandle component.\n */\nexport interface ResizableHandleProps {\n /** Whether to show the visual grip indicator (default: true) */\n withHandle?: boolean;\n\n /** Size presets for quick adjustment via popover */\n presets?: ResizePreset[];\n\n /** Whether the handle is disabled */\n disabled?: boolean;\n\n /** Additional CSS classes */\n className?: string;\n}\n\n// ============================================================================\n// Context Types\n// ============================================================================\n\n/**\n * Panel registration info stored in context.\n */\nexport interface PanelInfo {\n name: string;\n minSize: number;\n maxSize: number;\n collapsible: boolean;\n}\n\n/**\n * Context value for ResizablePanelGroup.\n */\nexport interface ResizableContextValue {\n /** Layout direction */\n direction: 'horizontal' | 'vertical';\n\n /** Group label for screen reader announcements */\n groupLabel: string;\n\n /** Current panel sizes as percentages */\n sizes: number[];\n\n /** Update panel sizes */\n setSizes: (sizes: number[]) => void;\n\n /** Registered panel info */\n panels: PanelInfo[];\n\n /** Register a panel with the group */\n registerPanel: (index: number, info: PanelInfo) => void;\n\n /** Unregister a panel */\n unregisterPanel: (index: number) => void;\n\n /** Announce a message to screen readers */\n announce: (message: string) => void;\n\n /** Reference to the container element */\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * CVA variants for ResizableHandle styling.\n * Ensures 44x44px touch target for WCAG 2.2 AAA compliance.\n */\nexport const resizableHandleVariants = cva(\n [\n // Base styles - 44px touch target\n 'relative flex items-center justify-center',\n 'shrink-0',\n 'bg-transparent',\n 'transition-colors duration-150',\n // Focus styles\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n // Touch target padding for accessibility\n 'touch-none select-none',\n ],\n {\n variants: {\n direction: {\n horizontal: [\n 'w-3 min-w-[12px]',\n 'cursor-col-resize',\n 'hover:bg-[var(--accent)]/50',\n // Ensure 44px touch target via padding\n 'before:absolute before:inset-y-0 before:-inset-x-4',\n 'before:min-w-[44px]',\n ],\n vertical: [\n 'h-3 min-h-[12px]',\n 'cursor-row-resize',\n 'hover:bg-[var(--accent)]/50',\n // Ensure 44px touch target via padding\n 'before:absolute before:inset-x-0 before:-inset-y-4',\n 'before:min-h-[44px]',\n ],\n },\n disabled: {\n true: 'cursor-not-allowed opacity-50 pointer-events-none',\n false: '',\n },\n isDragging: {\n true: 'bg-[var(--accent)]',\n false: '',\n },\n },\n defaultVariants: {\n direction: 'horizontal',\n disabled: false,\n isDragging: false,\n },\n }\n);\n\n/**\n * CVA variants for the grip indicator inside the handle.\n */\nexport const resizableGripVariants = cva(\n [\n 'flex items-center justify-center',\n 'rounded-full',\n 'bg-[var(--border)]',\n 'text-[var(--menu-muted)]',\n ],\n {\n variants: {\n direction: {\n horizontal: 'h-8 w-1',\n vertical: 'h-1 w-8',\n },\n },\n defaultVariants: {\n direction: 'horizontal',\n },\n }\n);\n\n/**\n * Type for resizableHandleVariants props.\n */\nexport type ResizableHandleVariantProps = VariantProps<\n typeof resizableHandleVariants\n>;\n","'use client';\n\n/**\n * ResizableHandle Component\n *\n * Draggable handle between resizable panels.\n * Provides keyboard navigation, ARIA slider semantics, and precision popover.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useRef,\n useEffect,\n useState,\n useCallback,\n type ReactElement,\n} from 'react';\nimport { GripVertical, GripHorizontal } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizableHandleProps } from '../Resizable.types';\nimport {\n resizableHandleVariants,\n resizableGripVariants,\n DEFAULT_MIN_SIZE,\n DEFAULT_MAX_SIZE,\n} from '../Resizable.types';\nimport { useResizableContext } from '../hooks/useResizableContext';\nimport { useResizable } from '../hooks/useResizable';\nimport { ResizablePopover } from './ResizablePopover';\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizableHandle - Draggable handle between panels.\n *\n * Must be used within a ResizablePanelGroup, between ResizablePanels.\n * Provides drag, keyboard, and popover controls for resizing.\n *\n * @example\n * ```tsx\n * <ResizableHandle\n * presets={[\n * { label: 'Equal', sizes: [50, 50] },\n * { label: 'Focus Left', sizes: [70, 30] },\n * ]}\n * />\n * ```\n */\nexport const ResizableHandle = forwardRef<HTMLDivElement, ResizableHandleProps>(\n function ResizableHandle(\n { withHandle = true, presets, disabled = false, className },\n ref\n ): ReactElement {\n const {\n direction,\n groupLabel,\n sizes,\n setSizes,\n panels,\n announce,\n containerRef,\n } = useResizableContext();\n\n // Track handle index based on DOM position\n const internalRef = useRef<HTMLDivElement>(null);\n const handleRef = (ref as React.RefObject<HTMLDivElement>) || internalRef;\n const [handleIndex, setHandleIndex] = useState(0);\n\n // Calculate handle index based on DOM position\n useEffect(() => {\n const handle = handleRef.current;\n const container = containerRef.current;\n if (!handle || !container) return;\n\n // Count handles before this one\n const handles = container.querySelectorAll('[role=\"slider\"]');\n let index = 0;\n handles.forEach((h, i) => {\n if (h === handle) {\n index = i;\n }\n });\n setHandleIndex(index);\n }, [containerRef, handleRef]);\n\n // Handle controls panels at handleIndex and handleIndex + 1\n const leftPanelIndex = handleIndex;\n const rightPanelIndex = handleIndex + 1;\n\n // Get adjacent panel info\n const leftPanel = panels[leftPanelIndex];\n const rightPanel = panels[rightPanelIndex];\n\n // Get current sizes for adjacent panels\n const leftSize = sizes[leftPanelIndex] ?? 50;\n const rightSize = sizes[rightPanelIndex] ?? 50;\n\n // Popover state\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n\n // Handle size changes from popover\n const handlePopoverSizesChange = useCallback(\n (newLeftSize: number, newRightSize: number) => {\n const newSizes = [...sizes];\n newSizes[leftPanelIndex] = newLeftSize;\n newSizes[rightPanelIndex] = newRightSize;\n setSizes(newSizes);\n },\n [sizes, setSizes, leftPanelIndex, rightPanelIndex]\n );\n\n // Use resize hook for drag/keyboard handling\n const { isDragging, handlePointerDown, handleKeyDown } = useResizable({\n direction,\n sizes,\n setSizes,\n panels,\n containerRef,\n leftPanelIndex,\n rightPanelIndex,\n disabled,\n announce,\n groupLabel,\n onOpenPopover: () => setIsPopoverOpen(true),\n });\n\n // Build aria-label with panel names and group context\n const ariaLabel =\n leftPanel && rightPanel\n ? `Resize handle between ${leftPanel.name} and ${rightPanel.name} in ${groupLabel}`\n : `Resize handle in ${groupLabel}`;\n\n // Select grip icon based on direction\n const GripIcon = direction === 'horizontal' ? GripVertical : GripHorizontal;\n\n // Default panel info for popover when panels not registered yet\n const leftPanelInfo = leftPanel ?? {\n name: 'Panel 1',\n minSize: DEFAULT_MIN_SIZE,\n maxSize: DEFAULT_MAX_SIZE,\n collapsible: false,\n };\n const rightPanelInfo = rightPanel ?? {\n name: 'Panel 2',\n minSize: DEFAULT_MIN_SIZE,\n maxSize: DEFAULT_MAX_SIZE,\n collapsible: false,\n };\n\n return (\n <>\n <div\n ref={handleRef}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={ariaLabel}\n aria-valuenow={Math.round(leftSize)}\n aria-valuemin={leftPanel?.collapsible ? 0 : (leftPanel?.minSize ?? 0)}\n aria-valuemax={leftPanel?.maxSize ?? 100}\n aria-orientation={direction}\n aria-disabled={disabled}\n data-direction={direction}\n data-dragging={isDragging}\n data-disabled={disabled}\n onPointerDown={handlePointerDown}\n onKeyDown={handleKeyDown}\n className={cn(\n resizableHandleVariants({\n direction,\n disabled,\n isDragging,\n }),\n className\n )}\n >\n {withHandle && (\n <div\n className={cn(resizableGripVariants({ direction }))}\n aria-hidden=\"true\"\n >\n <GripIcon className=\"h-4 w-4\" />\n </div>\n )}\n </div>\n\n {/* Precision Control Popover */}\n <ResizablePopover\n isOpen={isPopoverOpen}\n onOpenChange={setIsPopoverOpen}\n groupLabel={groupLabel}\n leftPanel={leftPanelInfo}\n rightPanel={rightPanelInfo}\n leftSize={leftSize}\n rightSize={rightSize}\n onSizesChange={handlePopoverSizesChange}\n presets={presets}\n triggerRef={handleRef}\n direction={direction}\n />\n </>\n );\n }\n);\n\nResizableHandle.displayName = 'ResizableHandle';\n\n// Re-export presets prop type for consumers\nexport type { ResizePreset } from '../Resizable.types';\n","/**\n * useResizable Hook\n *\n * Core resize logic for handling drag interactions.\n * Manages pointer events, calculates size changes, and enforces constraints.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport { useCallback, useRef, useState, useEffect } from 'react';\nimport type { PanelInfo } from '../Resizable.types';\nimport { LONG_PRESS_THRESHOLD } from '../Resizable.types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface UseResizableOptions {\n /** Layout direction */\n direction: 'horizontal' | 'vertical';\n /** Current panel sizes */\n sizes: number[];\n /** Update panel sizes */\n setSizes: (sizes: number[]) => void;\n /** Registered panel info */\n panels: PanelInfo[];\n /** Reference to container element for size calculations */\n containerRef: React.RefObject<HTMLDivElement | null>;\n /** Index of the left/top panel this handle controls */\n leftPanelIndex: number;\n /** Index of the right/bottom panel this handle controls */\n rightPanelIndex: number;\n /** Whether the handle is disabled */\n disabled?: boolean;\n /** Callback to announce size changes */\n announce?: (message: string) => void;\n /** Group label for announcements */\n groupLabel?: string;\n /** Callback when popover should open */\n onOpenPopover?: () => void;\n}\n\ninterface UseResizableReturn {\n /** Whether currently dragging */\n isDragging: boolean;\n /** Pointer down handler for drag start */\n handlePointerDown: (event: React.PointerEvent) => void;\n /** Keyboard handler for arrow key resizing */\n handleKeyDown: (event: React.KeyboardEvent) => void;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Clamp a size value within min/max bounds.\n */\nfunction clampSize(size: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, size));\n}\n\n/**\n * Calculate new sizes when adjusting by a delta.\n * Only affects adjacent panels - other panels remain unchanged.\n */\nfunction calculateNewSizes(\n sizes: number[],\n panels: PanelInfo[],\n leftIndex: number,\n rightIndex: number,\n delta: number\n): number[] {\n const newSizes = [...sizes];\n const leftPanel = panels[leftIndex];\n const rightPanel = panels[rightIndex];\n\n if (!leftPanel || !rightPanel) return sizes;\n\n // Current sizes\n const leftSize = sizes[leftIndex] ?? 50;\n const rightSize = sizes[rightIndex] ?? 50;\n\n // Calculate new sizes\n let newLeftSize = leftSize + delta;\n let newRightSize = rightSize - delta;\n\n // Apply constraints\n const leftMin = leftPanel.collapsible ? 0 : leftPanel.minSize;\n const leftMax = leftPanel.maxSize;\n const rightMin = rightPanel.collapsible ? 0 : rightPanel.minSize;\n const rightMax = rightPanel.maxSize;\n\n // Clamp left panel\n newLeftSize = clampSize(newLeftSize, leftMin, leftMax);\n\n // Adjust right panel to compensate\n newRightSize = leftSize + rightSize - newLeftSize;\n\n // Clamp right panel\n newRightSize = clampSize(newRightSize, rightMin, rightMax);\n\n // Re-adjust left panel if right was clamped\n newLeftSize = leftSize + rightSize - newRightSize;\n\n newSizes[leftIndex] = newLeftSize;\n newSizes[rightIndex] = newRightSize;\n\n return newSizes;\n}\n\n// ============================================================================\n// Hook\n// ============================================================================\n\n/**\n * Hook for managing resize interactions.\n *\n * @param options - Resize options\n * @returns Drag state and event handlers\n */\nexport function useResizable({\n direction,\n sizes,\n setSizes,\n panels,\n containerRef,\n leftPanelIndex,\n rightPanelIndex,\n disabled = false,\n announce,\n groupLabel,\n onOpenPopover,\n}: UseResizableOptions): UseResizableReturn {\n const [isDragging, setIsDragging] = useState(false);\n\n // Track drag start position and sizes\n const dragStartRef = useRef<{\n position: number;\n sizes: number[];\n containerSize: number;\n } | null>(null);\n\n // Track long press for touch interaction\n const longPressTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pointerDownTimeRef = useRef<number>(0);\n const wasLongPressRef = useRef<boolean>(false);\n\n // Store latest values in refs for stable event handlers\n const panelsRef = useRef(panels);\n const sizesRef = useRef(sizes);\n const setSizesRef = useRef(setSizes);\n\n // Refs for stable event listener references (prevents memory leaks)\n const handlePointerMoveRef = useRef<(e: PointerEvent) => void>(() => {});\n const handlePointerUpRef = useRef<() => void>(() => {});\n\n // Keep refs updated\n useEffect(() => {\n panelsRef.current = panels;\n sizesRef.current = sizes;\n setSizesRef.current = setSizes;\n }, [panels, sizes, setSizes]);\n\n /**\n * Get container size in the resize direction.\n */\n const getContainerSize = useCallback((): number => {\n const container = containerRef.current;\n if (!container) return 0;\n return direction === 'horizontal'\n ? container.offsetWidth\n : container.offsetHeight;\n }, [containerRef, direction]);\n\n /**\n * Convert pixel delta to percentage delta.\n */\n const pixelsToPercent = useCallback(\n (pixels: number): number => {\n const containerSize = getContainerSize();\n if (containerSize === 0) return 0;\n return (pixels / containerSize) * 100;\n },\n [getContainerSize]\n );\n\n // Stable wrapper functions for event listeners (prevent memory leaks)\n // These are created once and never change, using refs to call current handlers\n const onPointerMove = useCallback((e: PointerEvent) => {\n handlePointerMoveRef.current(e);\n }, []);\n\n const onPointerUp = useCallback(() => {\n handlePointerUpRef.current();\n }, []);\n\n /**\n * Handle pointer move during drag.\n * Uses refs to avoid stale closures and prevent listener removal on re-render.\n */\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n if (!dragStartRef.current || disabled) return;\n\n const position =\n direction === 'horizontal' ? event.clientX : event.clientY;\n const delta = position - dragStartRef.current.position;\n const percentDelta = pixelsToPercent(delta);\n\n const newSizes = calculateNewSizes(\n dragStartRef.current.sizes,\n panelsRef.current,\n leftPanelIndex,\n rightPanelIndex,\n percentDelta\n );\n\n setSizesRef.current(newSizes);\n },\n [\n direction,\n disabled,\n leftPanelIndex,\n pixelsToPercent,\n rightPanelIndex,\n ]\n );\n\n /**\n * Handle pointer up to end drag.\n * Uses refs to avoid stale closures.\n */\n const handlePointerUp = useCallback(() => {\n // Clear long press timer\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n\n // Check if this was a tap (not a long press or drag)\n const duration = Date.now() - pointerDownTimeRef.current;\n const wasTap = duration < LONG_PRESS_THRESHOLD && !wasLongPressRef.current;\n\n if (wasTap && onOpenPopover && !disabled) {\n onOpenPopover();\n }\n\n // End drag\n if (isDragging) {\n setIsDragging(false);\n\n // Announce final size\n const leftPanel = panelsRef.current[leftPanelIndex];\n const newSize = Math.round(sizesRef.current[leftPanelIndex] ?? 50);\n if (announce && leftPanel && groupLabel) {\n announce(\n `${leftPanel.name} in ${groupLabel} resized to ${newSize} percent`\n );\n }\n }\n\n dragStartRef.current = null;\n wasLongPressRef.current = false;\n\n // Remove document listeners (use stable wrappers to match what was added)\n document.removeEventListener('pointermove', onPointerMove);\n document.removeEventListener('pointerup', onPointerUp);\n document.removeEventListener('pointercancel', onPointerUp);\n\n // Reset cursor\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }, [\n announce,\n disabled,\n groupLabel,\n isDragging,\n leftPanelIndex,\n onOpenPopover,\n onPointerMove,\n onPointerUp,\n ]);\n\n // Keep handler refs updated so stable wrappers call the latest handlers\n useEffect(() => {\n handlePointerMoveRef.current = handlePointerMove;\n handlePointerUpRef.current = handlePointerUp;\n });\n\n /**\n * Handle pointer down to start drag.\n */\n const handlePointerDown = useCallback(\n (event: React.PointerEvent) => {\n if (disabled) return;\n\n // Prevent text selection during drag\n event.preventDefault();\n\n const position =\n direction === 'horizontal' ? event.clientX : event.clientY;\n pointerDownTimeRef.current = Date.now();\n wasLongPressRef.current = false;\n\n // Store initial state\n dragStartRef.current = {\n position,\n sizes: [...sizes],\n containerSize: getContainerSize(),\n };\n\n // Set up long press timer for touch\n longPressTimerRef.current = setTimeout(() => {\n wasLongPressRef.current = true;\n setIsDragging(true);\n\n // Set cursor during drag\n document.body.style.cursor =\n direction === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }, LONG_PRESS_THRESHOLD);\n\n // Add document listeners (use stable wrappers to prevent memory leaks)\n document.addEventListener('pointermove', onPointerMove);\n document.addEventListener('pointerup', onPointerUp);\n document.addEventListener('pointercancel', onPointerUp);\n\n // For mouse, start dragging immediately\n if (event.pointerType === 'mouse') {\n // Clear long press timer for mouse - drag starts immediately\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n longPressTimerRef.current = null;\n }\n wasLongPressRef.current = true;\n setIsDragging(true);\n document.body.style.cursor =\n direction === 'horizontal' ? 'col-resize' : 'row-resize';\n document.body.style.userSelect = 'none';\n }\n },\n [\n direction,\n disabled,\n getContainerSize,\n onPointerMove,\n onPointerUp,\n sizes,\n ]\n );\n\n /**\n * Handle keyboard navigation.\n */\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n const step = event.shiftKey ? 10 : 1;\n let delta = 0;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n delta = -step;\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n delta = step;\n break;\n case 'Home': {\n // Set to minimum\n const leftPanel = panels[leftPanelIndex];\n if (leftPanel) {\n const minSize = leftPanel.collapsible ? 0 : leftPanel.minSize;\n delta = minSize - (sizes[leftPanelIndex] ?? 50);\n }\n break;\n }\n case 'End': {\n // Set to maximum\n const leftPanel = panels[leftPanelIndex];\n if (leftPanel) {\n delta = leftPanel.maxSize - (sizes[leftPanelIndex] ?? 50);\n }\n break;\n }\n case 'Enter':\n case ' ':\n // Open popover\n event.preventDefault();\n onOpenPopover?.();\n return;\n default:\n return;\n }\n\n if (delta !== 0) {\n event.preventDefault();\n const newSizes = calculateNewSizes(\n sizes,\n panels,\n leftPanelIndex,\n rightPanelIndex,\n delta\n );\n setSizes(newSizes);\n\n // Announce the change\n const leftPanel = panels[leftPanelIndex];\n const newSize = Math.round(newSizes[leftPanelIndex] ?? 50);\n if (announce && leftPanel && groupLabel) {\n announce(\n `${leftPanel.name} in ${groupLabel} resized to ${newSize} percent`\n );\n }\n }\n },\n [\n announce,\n disabled,\n groupLabel,\n leftPanelIndex,\n onOpenPopover,\n panels,\n rightPanelIndex,\n setSizes,\n sizes,\n ]\n );\n\n // Cleanup on unmount only (empty deps = only runs on unmount)\n useEffect(() => {\n // Capture stable wrappers for cleanup\n const moveHandler = onPointerMove;\n const upHandler = onPointerUp;\n return () => {\n if (longPressTimerRef.current) {\n clearTimeout(longPressTimerRef.current);\n }\n // Use stable wrappers for cleanup\n document.removeEventListener('pointermove', moveHandler);\n document.removeEventListener('pointerup', upHandler);\n document.removeEventListener('pointercancel', upHandler);\n };\n }, [onPointerMove, onPointerUp]);\n\n return {\n isDragging,\n handlePointerDown,\n handleKeyDown,\n };\n}\n","'use client';\n\n/**\n * ResizablePopover Component\n *\n * Precision control popover for resizable panels.\n * Shows linked NumberFields and preset buttons for exact sizing.\n *\n * @see {@link ../../docs/prd/resizable-prd.md} for full requirements\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useEffect,\n useRef,\n type ReactElement,\n} from 'react';\nimport {\n DialogTrigger,\n Popover,\n Dialog,\n Button as AriaButton,\n} from 'react-aria-components';\nimport { X } from 'lucide-react';\nimport { cn } from '../../../utils/cn';\nimport type { ResizePreset, PanelInfo } from '../Resizable.types';\nimport { NumberField } from '../../NumberField/NumberField';\nimport { Button } from '../../Button/Button';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ResizablePopoverProps {\n /** Whether popover is open */\n isOpen: boolean;\n /** Callback when open state changes */\n onOpenChange: (isOpen: boolean) => void;\n /** Group label for the title */\n groupLabel: string;\n /** Left/top panel info */\n leftPanel: PanelInfo;\n /** Right/bottom panel info */\n rightPanel: PanelInfo;\n /** Left/top panel size (percentage) */\n leftSize: number;\n /** Right/bottom panel size (percentage) */\n rightSize: number;\n /** Callback when sizes change */\n onSizesChange: (leftSize: number, rightSize: number) => void;\n /** Size presets */\n presets?: ResizePreset[];\n /** The trigger element (handle) */\n triggerRef: React.RefObject<HTMLDivElement | null>;\n /** Direction for positioning */\n direction: 'horizontal' | 'vertical';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResizablePopover - Precision control for panel sizes.\n *\n * Features:\n * - Two linked NumberFields that sum to 100%\n * - Preset buttons for quick sizing\n * - Cancel reverts to original, Close keeps changes\n * - Live preview as values change\n */\nexport const ResizablePopover = forwardRef<HTMLDivElement, ResizablePopoverProps>(\n function ResizablePopover(\n {\n isOpen,\n onOpenChange,\n groupLabel,\n leftPanel,\n rightPanel,\n leftSize,\n rightSize,\n onSizesChange,\n presets,\n triggerRef,\n direction,\n },\n _ref\n ): ReactElement | null {\n // Store original sizes when popover opens (for cancel)\n const [originalSizes, setOriginalSizes] = useState({ left: leftSize, right: rightSize });\n\n // Capture original sizes only when popover transitions from closed to open\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (isOpen && !wasOpenRef.current) {\n setOriginalSizes({ left: leftSize, right: rightSize });\n }\n wasOpenRef.current = isOpen;\n }, [isOpen, leftSize, rightSize]);\n\n /**\n * Handle left panel size change.\n * Auto-adjusts right panel to sum to 100%.\n */\n const handleLeftChange = useCallback(\n (value: number | null) => {\n if (value === null) return;\n\n // Clamp to valid range\n const newLeft = Math.max(\n leftPanel.collapsible ? 0 : leftPanel.minSize,\n Math.min(leftPanel.maxSize, value)\n );\n\n // Calculate right size (remaining percentage)\n const newRight = 100 - newLeft;\n\n // Check right panel constraints\n const rightMin = rightPanel.collapsible ? 0 : rightPanel.minSize;\n const rightMax = rightPanel.maxSize;\n\n if (newRight < rightMin || newRight > rightMax) {\n // Can't make this change - right panel would be out of bounds\n return;\n }\n\n onSizesChange(newLeft, newRight);\n },\n [leftPanel, rightPanel, onSizesChange]\n );\n\n /**\n * Handle right panel size change.\n * Auto-adjusts left panel to sum to 100%.\n */\n const handleRightChange = useCallback(\n (value: number | null) => {\n if (value === null) return;\n\n // Clamp to valid range\n const newRight = Math.max(\n rightPanel.collapsible ? 0 : rightPanel.minSize,\n Math.min(rightPanel.maxSize, value)\n );\n\n // Calculate left size (remaining percentage)\n const newLeft = 100 - newRight;\n\n // Check left panel constraints\n const leftMin = leftPanel.collapsible ? 0 : leftPanel.minSize;\n const leftMax = leftPanel.maxSize;\n\n if (newLeft < leftMin || newLeft > leftMax) {\n // Can't make this change - left panel would be out of bounds\n return;\n }\n\n onSizesChange(newLeft, newRight);\n },\n [leftPanel, rightPanel, onSizesChange]\n );\n\n /**\n * Apply a preset.\n */\n const handlePreset = useCallback(\n (preset: ResizePreset) => {\n const leftSize = preset.sizes[0];\n const rightSize = preset.sizes[1];\n if (leftSize !== undefined && rightSize !== undefined) {\n onSizesChange(leftSize, rightSize);\n }\n },\n [onSizesChange]\n );\n\n /**\n * Handle cancel - revert to original sizes.\n */\n const handleCancel = useCallback(() => {\n onSizesChange(originalSizes.left, originalSizes.right);\n onOpenChange(false);\n }, [onSizesChange, onOpenChange, originalSizes]);\n\n /**\n * Handle close (X button or click outside) - keep changes.\n */\n const handleClose = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n if (!isOpen) return null;\n\n // Popover placement based on direction\n const placement = direction === 'horizontal' ? 'bottom' : 'right';\n\n return (\n <DialogTrigger isOpen={isOpen} onOpenChange={onOpenChange}>\n <AriaButton className=\"sr-only\">Open resize controls</AriaButton>\n <Popover\n triggerRef={triggerRef}\n placement={placement}\n offset={8}\n className={cn(\n 'w-72',\n 'rounded-lg border border-[var(--border)]',\n 'bg-[var(--popover)] text-[var(--popover-foreground)]',\n 'shadow-lg',\n 'outline-none',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[exiting]:animate-out data-[exiting]:fade-out-0 data-[exiting]:zoom-out-95'\n )}\n >\n <Dialog className=\"outline-none\">\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-[var(--border)] px-4 py-3\">\n <h3 className=\"text-sm font-medium\">Resize: {groupLabel}</h3>\n <AriaButton\n onPress={handleClose}\n className={cn(\n 'inline-flex items-center justify-center rounded-md',\n 'min-h-[44px] min-w-[44px]',\n 'text-[var(--menu-muted)]',\n 'hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2'\n )}\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4\" />\n </AriaButton>\n </div>\n\n {/* Content */}\n <div className=\"space-y-4 px-4 py-4\">\n {/* Left/Top Panel NumberField */}\n <div>\n <NumberField\n label={`${leftPanel.name} (%)`}\n value={Math.round(leftSize)}\n onChange={handleLeftChange}\n minValue={leftPanel.collapsible ? 0 : leftPanel.minSize}\n maxValue={leftPanel.maxSize}\n step={1}\n stepperLayout=\"sides\"\n />\n </div>\n\n {/* Right/Bottom Panel NumberField */}\n <div>\n <NumberField\n label={`${rightPanel.name} (%)`}\n value={Math.round(rightSize)}\n onChange={handleRightChange}\n minValue={rightPanel.collapsible ? 0 : rightPanel.minSize}\n maxValue={rightPanel.maxSize}\n step={1}\n stepperLayout=\"sides\"\n />\n </div>\n\n {/* Presets */}\n {presets && presets.length > 0 && (\n <div className=\"border-t border-[var(--border)] pt-4\">\n <div className=\"mb-2 text-xs font-medium text-[var(--menu-muted)]\">\n Presets\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {presets.map((preset, index) => (\n <Button\n key={index}\n variant=\"outline\"\n size=\"sm\"\n onPress={() => handlePreset(preset)}\n >\n {preset.label}\n </Button>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"flex justify-end border-t border-[var(--border)] px-4 py-3\">\n <Button variant=\"ghost\" size=\"sm\" onPress={handleCancel}>\n Cancel\n </Button>\n </div>\n </Dialog>\n </Popover>\n </DialogTrigger>\n );\n }\n);\n\nResizablePopover.displayName = 'ResizablePopover';\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * CVA Variants for Select Trigger Button\n *\n * Styles the trigger button that opens the select popover.\n * All sizes enforce 44px minimum touch targets for WCAG 2.2 AAA compliance.\n */\nexport const selectTriggerVariants = cva(\n [\n // Base styles\n 'flex',\n 'w-full',\n 'items-center',\n 'justify-between',\n 'rounded-md',\n 'border',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'transition-colors',\n 'duration-200',\n 'outline-none',\n // Focus ring (WCAG 2.2 AAA - 7:1 contrast)\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n // Hover state\n 'hover:bg-[var(--accent)]/10',\n // Disabled state\n 'disabled:cursor-not-allowed',\n 'disabled:opacity-50',\n // Loading state\n 'data-[loading=true]:cursor-wait',\n // Truncate text\n 'truncate',\n ],\n {\n variants: {\n size: {\n // All sizes use 44px minimum touch target for WCAG 2.2 AAA compliance\n // Visual height varies but touch area remains accessible\n sm: 'h-9 px-3 text-sm min-h-[44px]',\n default: 'h-11 px-4 text-base min-h-[44px]',\n lg: 'h-14 px-5 text-lg min-h-[44px]',\n },\n isInvalid: {\n true: 'border-[var(--destructive)]',\n false: 'border-[var(--input)] hover:border-[var(--input)]/80',\n },\n },\n defaultVariants: {\n size: 'default',\n isInvalid: false,\n },\n }\n);\n\n/**\n * CVA Variants for Select Items\n *\n * Styles individual selectable items within the listbox.\n * All sizes enforce 44px minimum touch targets for WCAG 2.2 AAA compliance.\n */\nexport const selectItemVariants = cva(\n [\n // Base styles\n 'relative',\n 'flex',\n 'w-full',\n 'cursor-pointer',\n 'select-none',\n 'items-center',\n 'rounded-sm',\n 'outline-none',\n 'transition-colors',\n // Padding for checkmark icon (left side)\n 'pl-8',\n 'pr-2',\n // Hover state\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n // Focus state\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n // Selected state\n 'data-[selected=true]:bg-[var(--accent)]',\n 'data-[selected=true]:text-[var(--accent-foreground)]',\n // Disabled state\n 'data-[disabled=true]:pointer-events-none',\n 'data-[disabled=true]:opacity-50',\n 'data-[disabled=true]:text-[var(--menu-muted)]',\n ],\n {\n variants: {\n size: {\n // All sizes use 44px minimum touch target for WCAG 2.2 AAA compliance\n sm: 'h-9 py-1.5 text-sm min-h-[44px]',\n default: 'h-11 py-2 text-base min-h-[44px]',\n lg: 'h-14 py-3 text-lg min-h-[44px]',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * CVA Variants for Select Popover\n *\n * Styles the popover container that holds the listbox.\n * Uses menu tokens to match Dropdown styling.\n */\nexport const selectPopoverVariants = cva(\n [\n // Base styles - use menu tokens to match Dropdown styling\n 'z-50',\n 'w-[--trigger-width]',\n 'rounded-md',\n 'border',\n 'border-[var(--menu-border)]',\n 'bg-[var(--menu-background)]',\n 'text-[var(--menu-foreground)]',\n 'shadow-md',\n 'outline-none',\n 'overflow-auto',\n // Animations\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n ],\n {\n variants: {\n size: {\n sm: 'max-h-[200px] p-1',\n default: 'max-h-[300px] p-1',\n lg: 'max-h-[400px] p-1',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * CVA Variants for Section Headers\n *\n * Styles the non-interactive section header labels within grouped selects.\n */\nexport const selectSectionVariants = cva(\n [\n 'px-2',\n 'py-1.5',\n 'text-xs',\n 'font-semibold',\n 'text-[var(--menu-muted)]',\n 'uppercase',\n 'tracking-wider',\n ],\n {\n variants: {\n size: {\n sm: 'px-2 py-1 text-[10px]',\n default: 'px-2 py-1.5 text-xs',\n lg: 'px-3 py-2 text-sm',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * CVA Variants for Error Messages\n *\n * Styles the error message displayed below the select trigger.\n */\nexport const selectErrorVariants = cva(\n [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-sm',\n 'font-medium',\n 'text-[var(--destructive)]',\n 'mt-1.5',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs mt-1',\n default: 'text-sm mt-1.5',\n lg: 'text-base mt-2',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Type exports for variant props.\n * Allows TypeScript inference of variant combinations.\n */\nexport type SelectTriggerVariantProps = VariantProps<typeof selectTriggerVariants>;\nexport type SelectItemVariantProps = VariantProps<typeof selectItemVariants>;\nexport type SelectPopoverVariantProps = VariantProps<typeof selectPopoverVariants>;\nexport type SelectSectionVariantProps = VariantProps<typeof selectSectionVariants>;\nexport type SelectErrorVariantProps = VariantProps<typeof selectErrorVariants>;\n","'use client';\n\n/**\n * Select Component - Implementation\n *\n * Accessible select/dropdown component combining React Aria primitives with ShadCN styling.\n * Follows Themis library patterns with compound component structure.\n *\n * Architecture:\n * - SelectBase: Internal component containing shared label, description, trigger, error, and listbox rendering.\n * - SelectRoot: Single selection wrapper (thin layer over SelectBase).\n * - MultiSelectRoot: Multiple selection wrapper with display value logic (thin layer over SelectBase).\n * - SelectItem, SelectSection, SelectHeader: Compound sub-components.\n *\n * @see select-prd.md (Full requirements)\n * @see Select.types.ts (Zod schemas)\n * @see Select.styles.ts (CVA variant definitions)\n * @see plan.md (Implementation plan)\n */\n\nimport {\n forwardRef,\n memo,\n Children,\n useId,\n useMemo,\n isValidElement,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {\n Select as AriaSelect,\n Label,\n Button,\n SelectValue,\n Popover,\n ListBox,\n ListBoxItem,\n ListBoxSection,\n Header,\n Text,\n FieldError,\n} from 'react-aria-components';\nimport { Check, CheckSquare, ChevronDown, Loader2, AlertCircle } from 'lucide-react';\nimport type {\n SelectProps,\n SelectItemProps,\n SelectSectionProps,\n SelectHeaderProps,\n SelectSize,\n} from './Select.types';\nimport {\n selectTriggerVariants,\n selectItemVariants,\n selectPopoverVariants,\n selectSectionVariants,\n selectErrorVariants,\n} from './Select.styles';\n\n// Re-export CVA variants so existing imports from './Select' continue to work\nexport {\n selectTriggerVariants,\n selectItemVariants,\n selectPopoverVariants,\n selectSectionVariants,\n selectErrorVariants,\n} from './Select.styles';\n\n/**\n * Internal props for SelectBase.\n * Extends the shared props with selection-mode-specific configuration.\n */\ninterface SelectBaseProps {\n /** The AriaSelect props to spread onto the root element */\n ariaSelectProps: Record<string, unknown>;\n /** Content to render inside the trigger button (SelectValue for single, span for multi) */\n triggerContent: ReactNode;\n /** Ref to forward to the trigger button */\n triggerRef: Ref<HTMLButtonElement>;\n /** Label text */\n label: string;\n /** Optional description text */\n description?: string;\n /** Whether the field is required */\n isRequired: boolean;\n /** Whether the field is disabled */\n isDisabled: boolean;\n /** Whether the field is in a loading state */\n isLoading: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Size variant */\n size: SelectSize;\n /** Empty state message override */\n emptyStateMessage?: string;\n /** Child count (pre-computed by parent) */\n childCount: number;\n /** Children to render in the listbox */\n children: ReactNode;\n}\n\n/**\n * SelectBase - Internal shared rendering component\n *\n * Contains the shared rendering logic for label, description, trigger button,\n * error message, and popover/listbox that both SelectRoot and MultiSelectRoot use.\n * This is not exported as part of the public API.\n */\nfunction SelectBase({\n ariaSelectProps,\n triggerContent,\n triggerRef,\n label,\n description,\n isRequired,\n isDisabled,\n isLoading,\n errorMessage,\n size,\n emptyStateMessage,\n childCount,\n children,\n}: SelectBaseProps): ReactElement {\n // Generate unique IDs for accessibility\n const labelId = useId();\n const descriptionId = useId();\n const errorId = useId();\n\n // Determine if invalid based on errorMessage\n const isInvalid = Boolean(errorMessage);\n\n return (\n <AriaSelect\n {...ariaSelectProps}\n isInvalid={isInvalid}\n >\n {/* Label */}\n <Label id={labelId} className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n {isRequired && <span className=\"text-[var(--destructive)] ml-1\">*</span>}\n </Label>\n\n {/* Description (if provided) */}\n {description && (\n <Text id={descriptionId} slot=\"description\" className=\"text-sm text-[var(--menu-muted)] mt-1\">\n {description}\n </Text>\n )}\n\n {/* Trigger Button */}\n <Button\n ref={triggerRef}\n className={selectTriggerVariants({ size, isInvalid })}\n aria-labelledby={labelId}\n aria-describedby={description ? descriptionId : errorMessage ? errorId : undefined}\n data-loading={isLoading}\n {...(isRequired && { 'aria-required': 'true' })}\n {...(isLoading && { 'aria-busy': 'true' })}\n {...((isDisabled || isLoading) && { 'aria-disabled': 'true' })}\n >\n {triggerContent}\n\n {/* Loading spinner or chevron icon */}\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin text-[var(--menu-muted)]\" aria-hidden=\"true\" />\n ) : (\n <ChevronDown className=\"h-4 w-4 text-[var(--menu-muted)]\" aria-hidden=\"true\" />\n )}\n </Button>\n\n {/* Error Message */}\n <FieldError id={errorId} className={selectErrorVariants({ size })}>\n {({ validationErrors }) => {\n // Display custom errorMessage if provided, otherwise show validation errors\n const displayError = errorMessage || validationErrors.join(' ');\n return displayError ? (\n <>\n <AlertCircle className=\"h-4 w-4\" aria-hidden=\"true\" />\n {displayError}\n </>\n ) : null;\n }}\n </FieldError>\n\n {/* Popover with ListBox */}\n <Popover className={selectPopoverVariants({ size })}>\n <ListBox className=\"outline-none\">\n {/* Loading skeleton (if loading and has children) */}\n {isLoading && childCount > 0 && (\n <>\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={`skeleton-${i}`}\n className=\"h-11 px-4 py-2\"\n >\n <div className=\"h-4 bg-[var(--accent-background)] rounded animate-pulse\" />\n </div>\n ))}\n </>\n )}\n\n {/* Items or empty state */}\n {!isLoading && (\n <>\n {children}\n {/* Empty state - render as disabled item so popover can open */}\n {childCount === 0 && (\n <ListBoxItem\n id=\"__empty__\"\n textValue=\"empty\"\n isDisabled\n className=\"py-6 text-center text-sm text-[var(--menu-muted)] cursor-default pointer-events-none\"\n >\n <span role=\"status\">\n {emptyStateMessage || 'No options available'}\n </span>\n </ListBoxItem>\n )}\n </>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n\n/**\n * Select Root Component (Single Selection Only)\n *\n * Main select component with controlled/uncontrolled modes for single selection.\n * For multiple selection, use MultiSelect component.\n * Delegates shared rendering to SelectBase.\n *\n * @see select-prd.md US-1 (Basic Single Selection)\n * @see plan.md Decision 28 (Ref forwarding to trigger button)\n */\nconst SelectRoot = forwardRef<HTMLButtonElement, Omit<SelectProps, 'selectionMode'>>(\n (\n {\n // Display props\n label,\n placeholder,\n description,\n\n // Selection props\n value,\n defaultValue,\n\n // State props\n isOpen,\n isDisabled = false,\n isRequired = false,\n disabledKeys,\n\n // Validation props\n validate,\n validationBehavior = 'aria',\n errorMessage,\n\n // Loading state\n isLoading = false,\n emptyStateMessage,\n\n // Form integration\n name,\n\n // Size variant\n size = 'default',\n\n // Event handlers\n onChange,\n onOpenChange,\n\n // Standard props\n className,\n children,\n ...props\n },\n ref\n ) => {\n // Warn if >1000 items (Decision 22: Large Item Count Handling)\n const childCount = Children.count(children);\n if (childCount > 1000) {\n console.warn(\n 'Select has >1000 items. Consider using Autocomplete component for better performance.'\n );\n }\n\n return (\n <SelectBase\n ariaSelectProps={{\n value: value as string,\n defaultValue: defaultValue as string,\n onChange: (key: unknown) => {\n if (onChange) {\n onChange(key as string);\n }\n },\n placeholder,\n disabledKeys,\n isOpen,\n onOpenChange,\n isDisabled: isDisabled || isLoading,\n isRequired,\n name,\n validate: validate as ((value: unknown) => true | string | null | undefined) | undefined,\n validationBehavior,\n className,\n ...props,\n }}\n triggerContent={<SelectValue className=\"flex-1 text-left truncate\" />}\n triggerRef={ref}\n label={label}\n description={description}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isLoading={isLoading}\n errorMessage={errorMessage}\n size={size}\n emptyStateMessage={emptyStateMessage}\n childCount={childCount}\n >\n {children}\n </SelectBase>\n );\n }\n);\n\nSelectRoot.displayName = 'Select';\n\n/**\n * MultiSelect Root Component (Multiple Selection)\n *\n * Select component for multiple selection. Uses different API from single Select.\n * Delegates shared rendering to SelectBase, adding multi-select display value logic.\n *\n * @see select-prd.md US-6 (Multiple Selection)\n * @see plan.md Decision 28 (Ref forwarding to trigger button)\n */\nconst MultiSelectRoot = forwardRef<HTMLButtonElement, SelectProps>(\n (\n {\n // Display props\n label,\n placeholder,\n description,\n\n // Selection props\n value,\n defaultValue,\n selectionMode: _selectionMode = 'multiple',\n\n // State props\n isOpen,\n isDisabled = false,\n isRequired = false,\n disabledKeys,\n\n // Validation props\n validate,\n validationBehavior = 'aria',\n errorMessage,\n\n // Loading state\n isLoading = false,\n emptyStateMessage,\n\n // Form integration\n name,\n\n // Size variant\n size = 'default',\n\n // Event handlers\n onChange,\n onOpenChange,\n\n // Standard props\n className,\n children,\n ...props\n },\n ref\n ) => {\n // Warn if >1000 items\n const childCount = Children.count(children);\n if (childCount > 1000) {\n console.warn(\n 'Select has >1000 items. Consider using Autocomplete component for better performance.'\n );\n }\n\n // Build value-to-label map for display (memoized to prevent recreation on every render)\n const valueToLabelMap = useMemo(() => {\n const map = new Map<string, string>();\n const processChildren = (nodes: ReactNode): void => {\n Children.forEach(nodes, (child) => {\n if (isValidElement(child)) {\n const element = child as ReactElement<{ value?: string; children?: ReactNode }>;\n if (element.type === SelectItem || element.props?.value) {\n const itemValue = element.props.value;\n const itemChildren = element.props.children;\n if (itemValue && typeof itemChildren === 'string') {\n map.set(itemValue, itemChildren);\n }\n }\n if (element.props?.children) {\n processChildren(element.props.children);\n }\n }\n });\n };\n processChildren(children);\n return map;\n }, [children]);\n\n // Multi-select display logic (Decision 5: Multi-select threshold)\n // Memoized to prevent recalculation on every render\n const displayValue = useMemo(() => {\n if (!value || !Array.isArray(value) || value.length === 0) {\n return placeholder || '';\n }\n\n if (value.length <= 2) {\n // Show item labels for 1-2 items\n const labels = value.map(v => valueToLabelMap.get(v as string) || v);\n return labels.join(', ');\n }\n\n // Show count for 3+ items\n return `${value.length} items selected`;\n }, [value, valueToLabelMap, placeholder]);\n\n return (\n <SelectBase\n ariaSelectProps={{\n value: value as string[],\n defaultValue: defaultValue as string[],\n onChange: (keys: unknown) => {\n if (onChange) {\n onChange(keys as string[]);\n }\n },\n selectionMode: 'multiple',\n disabledKeys,\n isOpen,\n onOpenChange,\n isDisabled: isDisabled || isLoading,\n isRequired,\n name,\n validate: validate as ((value: unknown) => true | string | null | undefined) | undefined,\n validationBehavior,\n className,\n ...props,\n }}\n triggerContent={\n <span className=\"flex-1 text-left truncate\">\n {displayValue}\n </span>\n }\n triggerRef={ref}\n label={label}\n description={description}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isLoading={isLoading}\n errorMessage={errorMessage}\n size={size}\n emptyStateMessage={emptyStateMessage}\n childCount={childCount}\n >\n {children}\n </SelectBase>\n );\n }\n);\n\nMultiSelectRoot.displayName = 'MultiSelect';\n\n/**\n * Select.Item Component\n *\n * Individual selectable item with checkmark icon.\n *\n * @see select-prd.md US-1 (Basic Single Selection)\n * @see plan.md Decision 6 (Left-side checkmark)\n * @see plan.md Decision 23 (textValue required for custom children)\n */\nconst SelectItem = memo(function SelectItem({ children, textValue, value, isDisabled = false, className, ...props }: SelectItemProps): ReactElement {\n // Validate textValue for custom children (Decision 23)\n if (!textValue && typeof children !== 'string') {\n const message = 'Select.Item with custom children requires textValue prop for accessibility';\n if (process.env.NODE_ENV === 'development') {\n throw new Error(message);\n } else {\n console.warn(message);\n }\n }\n\n return (\n <ListBoxItem\n id={value}\n textValue={textValue || (typeof children === 'string' ? children : undefined)}\n className={`${selectItemVariants({ size: 'default' })} ${className || ''}`}\n isDisabled={isDisabled}\n {...props}\n >\n {({ isSelected, selectionMode, isDisabled: itemDisabled }) => (\n <>\n {/* Checkmark icon (left side) - Decision 6 */}\n {selectionMode === 'multiple' ? (\n <CheckSquare\n className={`absolute left-2 h-4 w-4 ${isSelected ? 'visible' : 'invisible'}`}\n aria-hidden=\"true\"\n />\n ) : (\n isSelected && <Check className=\"absolute left-2 h-4 w-4\" aria-hidden=\"true\" />\n )}\n <span className={itemDisabled ? 'text-[var(--menu-muted)]' : ''}>\n {children}\n </span>\n </>\n )}\n </ListBoxItem>\n );\n});\n\nSelectItem.displayName = 'SelectItem';\n\n/**\n * Select.Section Component\n *\n * Groups related items with optional header.\n *\n * @see select-prd.md US-3 (Grouped Options with Sections)\n */\nfunction SelectSection({ children, className, ...props }: SelectSectionProps): ReactElement {\n return (\n <ListBoxSection className={`border-t border-[var(--border)] first:border-t-0 ${className || ''}`} {...props}>\n {children}\n </ListBoxSection>\n );\n}\n\nSelectSection.displayName = 'SelectSection';\n\n/**\n * Select.Header Component\n *\n * Section header with non-interactive label.\n *\n * @see select-prd.md US-3 (Grouped Options with Sections)\n */\nfunction SelectHeader({ children, className, ...props }: SelectHeaderProps): ReactElement {\n return (\n <Header className={`${selectSectionVariants({ size: 'default' })} ${className || ''}`} {...props}>\n {children}\n </Header>\n );\n}\n\nSelectHeader.displayName = 'SelectHeader';\n\n/**\n * Compound Component Exports\n *\n * Uses Object.assign() for compound components (e.g., Select.Item, Select.Section).\n * Named exports (SelectItem, SelectSection, SelectHeader) are also available below\n * for better tree-shaking. Prefer named exports in new code.\n *\n * @deprecated (v2) The Object.assign compound pattern will be removed in v2.\n * Migrate to named imports: `import { SelectItem, SelectSection, SelectHeader } from '...'`\n *\n * @see GUIDE.mdx (Compound component pattern)\n */\nexport const Select = Object.assign(SelectRoot, {\n Item: SelectItem,\n Section: SelectSection,\n Header: SelectHeader,\n});\n\nexport const MultiSelect = Object.assign(MultiSelectRoot, {\n Item: SelectItem,\n Section: SelectSection,\n Header: SelectHeader,\n});\n\n// Named exports for individual components (preferred for tree-shaking)\nexport { SelectRoot, MultiSelectRoot, SelectItem, SelectSection, SelectHeader };\n","\"use client\";\n\n/**\n * Switch Component\n * Accessible toggle switch with React Aria primitives and CVA styling\n *\n * @see React Aria Switch: https://react-spectrum.adobe.com/react-aria/Switch.html\n * @see ShadCN Switch: https://ui.shadcn.com/docs/components/switch\n * @see spec.md (WCAG 2.2 AAA - 7:1 contrast ratio, 44x44px touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo } from 'react';\nimport {\n Switch as AriaSwitch,\n type SwitchProps as AriaSwitchProps,\n} from 'react-aria-components';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { DEFAULT_INTERACTIONS } from '../../styles/interaction-states';\n\n/**\n * Layer 1: Transparent outer touch target (44x44px minimum)\n * This layer handles the WCAG 2.2 AAA touch target requirement\n * Always invisible, centers the visual switch inside\n */\nconst switchOuterVariants = cva(\n // Base styles - WCAG 2.2 AAA: 44x44px minimum touch target\n \"inline-flex shrink-0 cursor-pointer items-center justify-center min-h-[44px] min-w-[44px] disabled:cursor-not-allowed disabled:opacity-50 data-[readonly]:cursor-default\",\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Layer 2: Visual switch track/background (adjustable size)\n * This layer provides the visual appearance and size flexibility\n * Background color changes based on variant and selection state\n */\nconst switchTrackVariants = cva(\n // Base styles - visual track with transitions and focus states\n \"relative inline-flex shrink-0 items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n {\n variants: {\n variant: {\n // Default variant: Uses primary color when selected\n default:\n \"bg-[var(--input)] data-[selected]:bg-[var(--primary)]\",\n // Destructive variant: Uses destructive/error color when selected\n destructive:\n \"bg-[var(--input)] data-[selected]:bg-[var(--destructive)]\",\n },\n size: {\n // Small: h-5 w-9 (visual track size)\n sm: \"h-5 w-9\",\n // Default: h-6 w-11\n default: \"h-6 w-11\",\n // Large: h-7 w-14\n lg: \"h-7 w-14\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n/**\n * Layer 3: Switch thumb (sliding circle)\n * Inner visual element that slides horizontally when switch is selected\n * Positioned absolutely within the track (Layer 2)\n */\nconst switchThumbVariants = cva(\n // Base styles: rounded circle with shadow, translates when selected\n \"pointer-events-none absolute left-0.5 rounded-full bg-[var(--content-background)] shadow-lg ring-0 transition-transform data-[selected]:translate-x-full\",\n {\n variants: {\n size: {\n // Thumb is slightly smaller than track height for proper padding\n sm: \"h-4 w-4\",\n default: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n);\n\nexport interface SwitchProps\n extends Omit<AriaSwitchProps, 'className' | 'children'>,\n VariantProps<typeof switchTrackVariants> {\n variant?: 'default' | 'destructive';\n size?: 'sm' | 'default' | 'lg';\n label?: string;\n description?: string;\n className?: string;\n}\n\n/**\n * Switch Component\n * Fully accessible toggle switch with React Aria and themed styling\n */\nconst Switch = memo(forwardRef<HTMLLabelElement, SwitchProps>(\n (\n {\n className,\n variant,\n size,\n label,\n description,\n isDisabled,\n isReadOnly,\n ...props\n },\n ref\n ) => {\n return (\n <AriaSwitch\n ref={ref}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n className={(_classNameProps) =>\n cn(\n \"group inline-flex items-center gap-2\",\n isDisabled && \"cursor-not-allowed opacity-50\",\n className\n )\n }\n {...props}\n >\n {(renderProps) => (\n <>\n {/* Layer 1: Transparent outer touch target (44x44px WCAG compliant) */}\n <div\n className={cn(switchOuterVariants())}\n data-selected={renderProps.isSelected || undefined}\n data-readonly={isReadOnly || undefined}\n >\n {/* Layer 2: Visual switch track (adjustable size with variants) */}\n <div\n className={cn(\n switchTrackVariants({ variant, size }),\n DEFAULT_INTERACTIONS\n )}\n data-selected={renderProps.isSelected || undefined}\n >\n {/* Layer 3: Thumb (sliding circle, absolutely positioned) */}\n <div\n className={cn(switchThumbVariants({ size }))}\n data-selected={renderProps.isSelected || undefined}\n />\n </div>\n </div>\n\n {/* Optional label and description */}\n {(label || description) && (\n <div className=\"flex flex-col\">\n {label && (\n <span className=\"text-sm font-medium text-[var(--content-foreground)]\">\n {label}\n </span>\n )}\n {description && (\n <span className=\"text-xs text-[var(--menu-muted)]\">\n {description}\n </span>\n )}\n </div>\n )}\n </>\n )}\n </AriaSwitch>\n );\n }\n));\n\nSwitch.displayName = \"Switch\";\n\nexport { Switch, switchOuterVariants, switchTrackVariants, switchThumbVariants };\n","'use client';\n\n/**\n * Table Component - Accessible Data Table (v1)\n * ARIA grid pattern with React Aria primitives\n *\n * @see plan.md for architecture details\n * @see table-prd.md for requirements\n * @see WCAG 2.2 AAA compliance\n */\n\nimport {\n forwardRef,\n memo,\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n type ReactElement,\n type ForwardedRef,\n} from 'react';\nimport {\n Table as AriaTable,\n TableHeader as AriaTableHeader,\n TableBody as AriaTableBody,\n Column as AriaColumn,\n Row as AriaRow,\n Cell as AriaCell,\n Collection,\n useTableOptions,\n type TableHeaderProps as AriaTableHeaderProps,\n type TableBodyProps as AriaTableBodyProps,\n type RowProps as AriaRowProps,\n type CellProps as AriaCellProps,\n type Selection,\n type SortDescriptor,\n} from 'react-aria-components';\nimport { Checkbox } from '../Checkbox';\nimport { ChevronUp, ChevronDown } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n tableContainerVariants,\n tableVariants,\n tableHeaderVariants,\n tableFooterVariants,\n tableCaptionVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n} from './Table.styles';\nimport type {\n TableProps,\n TableHeaderProps,\n TableBodyProps,\n TableFooterProps,\n TableCaptionProps,\n ColumnProps,\n RowProps,\n CellProps,\n TableVariant,\n TableSize,\n} from './Table.types';\n\n// ============================================================================\n// Context for passing table-level props to children\n// ============================================================================\n\ninterface TableContextValue {\n variant: TableVariant;\n size: TableSize;\n selectionMode: 'none' | 'single' | 'multiple';\n stickyHeader: boolean;\n}\n\nconst TableContext = createContext<TableContextValue>({\n variant: 'default',\n size: 'default',\n selectionMode: 'none',\n stickyHeader: false,\n});\n\n// ============================================================================\n// Table Component\n// ============================================================================\n\nconst Table = forwardRef<HTMLTableElement, TableProps>(\n (\n {\n className,\n variant = 'default',\n size = 'default',\n stickyHeader = false,\n selectionMode = 'none',\n selectionBehavior = 'toggle',\n disallowEmptySelection = false,\n disabledBehavior = 'selection',\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n disabledKeys,\n sortDescriptor,\n onSortChange,\n onRowAction,\n children,\n ...props\n },\n ref\n ) => {\n // Warn when sm size is used with selection (touch targets < 44px)\n if (process.env.NODE_ENV !== 'production' && size === 'sm' && selectionMode !== 'none') {\n console.warn(\n '[Table] size=\"sm\" with selectionMode produces rows shorter than the 44px WCAG 2.2 AAA minimum touch target. ' +\n 'Use size=\"default\" or size=\"lg\" for accessible interactive tables.'\n );\n }\n\n const contextValue = useMemo(\n () => ({ variant, size, selectionMode, stickyHeader }),\n [variant, size, selectionMode, stickyHeader]\n );\n\n return (\n <TableContext.Provider value={contextValue}>\n <div\n className={cn(tableContainerVariants(), className)}\n data-testid=\"table-container\"\n >\n <AriaTable\n ref={ref}\n className={cn(tableVariants({ variant }))}\n selectionMode={selectionMode}\n selectionBehavior={selectionBehavior}\n disallowEmptySelection={disallowEmptySelection}\n disabledBehavior={disabledBehavior}\n selectedKeys={selectedKeys}\n defaultSelectedKeys={defaultSelectedKeys}\n onSelectionChange={onSelectionChange}\n disabledKeys={disabledKeys}\n sortDescriptor={sortDescriptor}\n onSortChange={onSortChange}\n onRowAction={onRowAction}\n data-testid=\"table\"\n data-variant={variant}\n data-size={size}\n {...props}\n >\n {children}\n </AriaTable>\n </div>\n </TableContext.Provider>\n );\n }\n);\n\nTable.displayName = 'Table';\n\n// ============================================================================\n// TableHeader Component\n// ============================================================================\n\nfunction TableHeaderInner<T extends object>(\n { className, children, columns, ...props }: TableHeaderProps<T>,\n ref: ForwardedRef<HTMLTableSectionElement>\n): ReactElement {\n const { size, selectionMode, stickyHeader } = useContext(TableContext);\n const { allowsDragging } = useTableOptions();\n\n return (\n <AriaTableHeader\n ref={ref}\n className={cn(tableHeaderVariants({ sticky: stickyHeader }), className)}\n data-testid=\"table-header\"\n {...(props as AriaTableHeaderProps<T>)}\n >\n {/* Selection checkbox column */}\n {selectionMode === 'multiple' && (\n <AriaColumn className={cn(columnVariants({ size }), 'w-12')}>\n <Checkbox slot=\"selection\" aria-label=\"Select all\" size={size} />\n </AriaColumn>\n )}\n {/* Drag handle column if dragging is allowed */}\n {allowsDragging && <AriaColumn />}\n {/* Render columns */}\n {columns ? (\n <Collection items={columns}>{children as (item: T) => ReactElement}</Collection>\n ) : (\n children\n )}\n </AriaTableHeader>\n );\n}\n\nconst TableHeader = forwardRef(TableHeaderInner) as <T extends object>(\n props: TableHeaderProps<T> & { ref?: ForwardedRef<HTMLTableSectionElement> }\n) => ReactElement;\n\n(TableHeader as { displayName?: string }).displayName = 'TableHeader';\n\n// ============================================================================\n// TableBody Component\n// ============================================================================\n\nfunction TableBodyInner<T extends object>(\n { className, children, items, renderEmptyState, ...props }: TableBodyProps<T>,\n ref: ForwardedRef<HTMLTableSectionElement>\n): ReactElement {\n return (\n <AriaTableBody\n ref={ref}\n className={cn(className)}\n items={items}\n renderEmptyState={\n renderEmptyState\n ? () => (\n <tr>\n <td colSpan={99} className=\"text-center p-8\">\n {renderEmptyState()}\n </td>\n </tr>\n )\n : undefined\n }\n data-testid=\"table-body\"\n {...(props as AriaTableBodyProps<T>)}\n >\n {children as AriaTableBodyProps<T>['children']}\n </AriaTableBody>\n );\n}\n\nconst TableBody = forwardRef(TableBodyInner) as <T extends object>(\n props: TableBodyProps<T> & { ref?: ForwardedRef<HTMLTableSectionElement> }\n) => ReactElement;\n\n(TableBody as { displayName?: string }).displayName = 'TableBody';\n\n// ============================================================================\n// TableFooter Component (Custom - not from React Aria)\n// ============================================================================\n\nconst TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <tfoot\n ref={ref}\n className={cn(tableFooterVariants(), className)}\n data-testid=\"table-footer\"\n {...props}\n >\n {children}\n </tfoot>\n );\n }\n);\n\nTableFooter.displayName = 'TableFooter';\n\n// ============================================================================\n// TableCaption Component (Custom - not from React Aria)\n// ============================================================================\n\nconst TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <caption\n ref={ref}\n className={cn(tableCaptionVariants(), className)}\n data-testid=\"table-caption\"\n {...props}\n >\n {children}\n </caption>\n );\n }\n);\n\nTableCaption.displayName = 'TableCaption';\n\n// ============================================================================\n// Column Component\n// ============================================================================\n\nconst Column = forwardRef<HTMLTableCellElement, ColumnProps>(\n (\n {\n className,\n children,\n isRowHeader = false,\n allowsSorting = false,\n align = 'start',\n width,\n minWidth,\n maxWidth,\n ...props\n },\n ref\n ) => {\n const { size } = useContext(TableContext);\n\n return (\n <AriaColumn\n ref={ref}\n isRowHeader={isRowHeader}\n allowsSorting={allowsSorting}\n width={width}\n minWidth={minWidth}\n maxWidth={maxWidth}\n className={cn(columnVariants({ allowsSorting, align, size }), className)}\n {...props}\n >\n {({ allowsSorting: canSort, sortDirection }) => (\n <div className=\"flex items-center gap-1\">\n <span>{children as ReactNode}</span>\n {canSort && sortDirection && (\n <span aria-hidden=\"true\" data-sort-direction={sortDirection}>\n {sortDirection === 'ascending' ? (\n <ChevronUp className=\"h-4 w-4\" />\n ) : (\n <ChevronDown className=\"h-4 w-4\" />\n )}\n </span>\n )}\n </div>\n )}\n </AriaColumn>\n );\n }\n);\n\n(Column as { displayName?: string }).displayName = 'Column';\n\n// ============================================================================\n// Row Component\n// ============================================================================\n\nfunction RowInner<T extends object>(\n { className, children, columns, href, isDisabled, ...props }: RowProps<T>,\n ref: ForwardedRef<HTMLTableRowElement>\n): ReactElement {\n const { variant, size, selectionMode } = useContext(TableContext);\n const { allowsDragging } = useTableOptions();\n\n // Pre-compute variant class strings to avoid CVA calls in render callback\n const rowVariant = variant === 'striped' ? 'striped' as const : 'default' as const;\n const selectedClasses = rowVariants({ isSelected: true, variant: rowVariant });\n const unselectedClasses = rowVariants({ isSelected: false, variant: rowVariant });\n const selectionCellClasses = cn(cellVariants({ size }), 'w-12');\n\n return (\n <AriaRow\n ref={ref}\n href={href}\n isDisabled={isDisabled}\n className={({ isSelected, isDisabled: disabled }) =>\n cn(\n isSelected ? selectedClasses : unselectedClasses,\n disabled && 'opacity-50',\n className\n )\n }\n data-testid=\"table-row\"\n {...(props as AriaRowProps<T>)}\n >\n {/* Selection checkbox cell */}\n {selectionMode === 'multiple' && (\n <AriaCell className={selectionCellClasses}>\n <Checkbox slot=\"selection\" aria-label=\"Select row\" size={size} />\n </AriaCell>\n )}\n {/* Drag handle cell if dragging is allowed */}\n {allowsDragging && (\n <AriaCell>\n {/* Placeholder for drag handle - v2 feature */}\n </AriaCell>\n )}\n {/* Render cells */}\n {columns ? (\n <Collection items={columns}>{children as (item: T) => ReactElement}</Collection>\n ) : (\n children\n )}\n </AriaRow>\n );\n}\n\nconst Row = forwardRef(RowInner) as <T extends object>(\n props: RowProps<T> & { ref?: ForwardedRef<HTMLTableRowElement> }\n) => ReactElement;\n\n(Row as { displayName?: string }).displayName = 'Row';\n\n// ============================================================================\n// Cell Component\n// ============================================================================\n\nconst Cell = memo(forwardRef<HTMLTableCellElement, CellProps>(\n ({ className, children, align = 'start', colSpan: _colSpan, ...props }, ref) => {\n const { size } = useContext(TableContext);\n\n return (\n <AriaCell\n ref={ref}\n className={cn(cellVariants({ align, size }), className)}\n {...(props as AriaCellProps)}\n >\n {children}\n </AriaCell>\n );\n }\n));\n\nCell.displayName = 'Cell';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableCaption,\n Column,\n Row,\n Cell,\n};\n\n// Re-export CVA variants (defined in Table.styles.ts)\nexport {\n tableContainerVariants,\n tableVariants,\n tableHeaderVariants,\n tableFooterVariants,\n tableCaptionVariants,\n columnVariants,\n rowVariants,\n cellVariants,\n};\n\n// Re-export types\nexport type { Selection, SortDescriptor };\n","import { cva } from 'class-variance-authority';\n\n// Table container variants (wrapper div)\nexport const tableContainerVariants = cva(['relative w-full overflow-auto']);\n\n// Table variants\nexport const tableVariants = cva(\n ['w-full caption-bottom text-sm', 'border-collapse'],\n {\n variants: {\n variant: {\n default: '',\n bordered: 'border border-[var(--border)] rounded-md',\n striped: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\n// Table header variants\nexport const tableHeaderVariants = cva(['[&_tr]:border-b'], {\n variants: {\n sticky: {\n true: 'sticky top-0 z-10 bg-[var(--content-background)]',\n false: '',\n },\n },\n defaultVariants: {\n sticky: false,\n },\n});\n\n// Table footer variants\nexport const tableFooterVariants = cva([\n 'border-t border-[var(--border)]',\n 'bg-[var(--accent-background)]/50',\n 'font-medium',\n '[&>tr]:last:border-b-0',\n]);\n\n// Table caption variants\nexport const tableCaptionVariants = cva([\n 'mt-4 text-sm text-[var(--menu-muted)]',\n]);\n\n// Column variants\nexport const columnVariants = cva(\n [\n 'h-12 px-4 text-left align-middle font-medium',\n 'text-[var(--menu-muted)]',\n '[&:has([role=checkbox])]:pr-0',\n 'select-none',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-inset',\n ],\n {\n variants: {\n allowsSorting: {\n true: 'cursor-pointer hover:bg-[var(--accent)]/50',\n false: '',\n },\n align: {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n },\n size: {\n sm: 'h-10 px-3 text-xs',\n default: 'h-12 px-4 text-sm',\n lg: 'h-14 px-5 text-base',\n },\n },\n defaultVariants: {\n allowsSorting: false,\n align: 'start',\n size: 'default',\n },\n }\n);\n\n// Row variants\nexport const rowVariants = cva(\n [\n 'border-b border-[var(--border)]',\n 'transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-inset',\n 'hover:bg-[var(--accent-background)]/50',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n ],\n {\n variants: {\n isSelected: {\n true: 'bg-[var(--accent)] data-[selected]:bg-[var(--accent)]',\n false: '',\n },\n variant: {\n default: '',\n striped: 'even:bg-[var(--accent-background)]/30',\n },\n },\n defaultVariants: {\n isSelected: false,\n variant: 'default',\n },\n }\n);\n\n// Cell variants\nexport const cellVariants = cva(\n ['p-4 align-middle', '[&:has([role=checkbox])]:pr-0'],\n {\n variants: {\n align: {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n },\n size: {\n sm: 'p-3 text-xs',\n default: 'p-4 text-sm',\n lg: 'p-5 text-base',\n },\n isRowHeader: {\n true: 'font-medium',\n false: '',\n },\n },\n defaultVariants: {\n align: 'start',\n size: 'default',\n isRowHeader: false,\n },\n }\n);\n","'use client';\n\n/**\n * Tabs Component - Implementation\n *\n * Accessible tabbed interface component combining React Aria primitives with ShadCN styling.\n * Follows Themis library patterns with compound component structure and direct named exports.\n *\n * Key Features:\n * - React Aria Tabs for full accessibility (WCAG 2.2 AAA)\n * - CVA variants for orientation styling\n * - React 19.2 Activity API for state preservation (preserveState prop)\n * - Dual keyboard activation modes (automatic/manual)\n * - Support for icons, badges, and link-based tabs\n *\n * @see tabs-prd.md (Full requirements)\n * @see Tabs.types.ts (Zod schemas)\n * @see plan.md (Implementation approach)\n */\n\n// React 19.2 Activity API - may not be available in all builds\n// Import conditionally to support environments where Activity is unavailable\nimport {\n Activity as ReactActivity,\n type ReactNode,\n type Key,\n type ReactElement,\n} from 'react';\n\n// Activity component with fallback for environments where it's not available\n// The fallback simply renders children directly - no state preservation when Activity unavailable\n// Note: ActivityFallback doesn't actually preserve state; it's just a pass-through\nconst Activity = ReactActivity ?? function ActivityFallback({\n children,\n mode,\n}: {\n children: ReactNode;\n mode: 'visible' | 'hidden';\n}): ReactElement {\n // When Activity is not available, just render children directly\n // mode is ignored in the fallback\n return <div data-activity-mode={mode}>{children}</div>;\n};\nimport {\n Tabs as AriaTabs,\n TabList as AriaTabList,\n Tab as AriaTab,\n TabPanel as AriaTabPanel,\n composeRenderProps,\n type Key as AriaKey,\n} from 'react-aria-components';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n TabsProps,\n TabListProps,\n TabProps,\n TabPanelProps,\n} from './Tabs.types';\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * TabList CVA variants\n *\n * @see PRD.md FR-002 (TabList Requirements)\n * @see PRD.md DS-001 (Design System - Layout)\n */\nexport const tabListVariants = cva(\n // Base styles\n [\n 'inline-flex items-center justify-center rounded-md p-1',\n 'bg-[var(--accent-background)] text-[var(--menu-muted)]',\n ],\n {\n variants: {\n orientation: {\n horizontal: 'h-10 flex-row gap-0',\n vertical: 'h-auto flex-col w-full gap-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n }\n);\n\n/**\n * Tab CVA variants\n *\n * @see PRD.md FR-003 (Tab Requirements)\n * @see PRD.md DS-002 (Design System - Tab Styling)\n * @see PRD.md AR-001 (Accessibility - 44×44px touch targets)\n */\nexport const tabVariants = cva(\n // Base styles\n [\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-sm',\n 'px-3 py-1.5 text-sm font-medium',\n 'ring-offset-[var(--content-background)] transition-all',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n // States via data attributes\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n 'data-[selected]:bg-[var(--content-background)] data-[selected]:text-[var(--content-foreground)]',\n 'data-[selected]:shadow-sm',\n // WCAG 2.2 AAA: 44×44px minimum touch target\n 'min-h-[44px]',\n ],\n {\n variants: {\n orientation: {\n horizontal: '',\n vertical: 'w-full justify-start',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n }\n);\n\n/**\n * TabPanel CVA variants\n *\n * @see PRD.md FR-004 (TabPanel Requirements)\n */\nexport const tabPanelVariants = cva(\n [\n 'mt-2 ring-offset-[var(--content-background)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2',\n ],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n// ============================================================================\n// Components\n// ============================================================================\n\n/**\n * Tabs Root Component\n *\n * Container for tabbed interface. Manages selection state and provides\n * context to child components.\n *\n * @see PRD.md FR-001 (Compound Component Pattern)\n * @see PRD.md FR-012 (Controlled Mode)\n * @see PRD.md FR-013 (Uncontrolled Mode)\n *\n * @example\n * // Uncontrolled\n * <Tabs defaultSelectedKey=\"tab1\">\n * <TabList aria-label=\"Navigation\">\n * <Tab id=\"tab1\">Tab 1</Tab>\n * <Tab id=\"tab2\">Tab 2</Tab>\n * </TabList>\n * <TabPanel id=\"tab1\">Content 1</TabPanel>\n * <TabPanel id=\"tab2\">Content 2</TabPanel>\n * </Tabs>\n *\n * @example\n * // Controlled\n * <Tabs selectedKey={selected} onSelectionChange={setSelected}>\n * ...\n * </Tabs>\n */\nfunction TabsRoot({\n children,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n orientation = 'horizontal',\n keyboardActivation = 'automatic',\n isDisabled = false,\n disabledKeys,\n className,\n ...props\n}: TabsProps) {\n return (\n <AriaTabs\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={onSelectionChange as (key: Key) => void}\n orientation={orientation}\n keyboardActivation={keyboardActivation}\n isDisabled={isDisabled}\n disabledKeys={disabledKeys as Iterable<AriaKey> | undefined}\n className={cn(className)}\n {...props}\n >\n {children}\n </AriaTabs>\n );\n}\n\nTabsRoot.displayName = 'Tabs';\n\n/**\n * TabList Component\n *\n * Container for tab buttons. Uses roving tabindex for keyboard navigation.\n * Receives orientation from parent Tabs via React Aria context.\n *\n * @see PRD.md FR-002 (TabList Requirements)\n * @see PRD.md AR-001 (ARIA Requirements)\n */\nfunction TabListComponent({\n children,\n className,\n ...props\n}: TabListProps) {\n return (\n <AriaTabList\n className={composeRenderProps(className, (className, renderProps) =>\n cn(\n tabListVariants({ orientation: renderProps.orientation }),\n className\n )\n )}\n {...props}\n >\n {children}\n </AriaTabList>\n );\n}\n\nTabListComponent.displayName = 'TabList';\n\n/**\n * Tab Component\n *\n * Individual tab button. Can render as button or anchor (when href provided).\n * Supports icons and badges as children.\n *\n * @see PRD.md FR-003 (Tab Requirements)\n * @see PRD.md FR-007 (Disabled States)\n * @see PRD.md FR-013 (Icon Support)\n * @see PRD.md FR-014 (Link-based Tabs)\n */\nfunction TabComponent({\n children,\n id,\n isDisabled = false,\n href,\n target,\n rel,\n download,\n className,\n ...props\n}: TabProps) {\n // Warn if icon-only tab without aria-label\n if (process.env.NODE_ENV !== 'production') {\n const hasTextContent =\n typeof children === 'string' ||\n (Array.isArray(children) &&\n children.some((child) => typeof child === 'string'));\n\n if (!hasTextContent && !props['aria-label']) {\n console.warn(\n 'Tabs: Icon-only tabs should have an aria-label for accessibility.'\n );\n }\n }\n\n return (\n <AriaTab\n id={id}\n isDisabled={isDisabled}\n href={href}\n target={target}\n rel={rel}\n download={download}\n className={composeRenderProps(className, (className) =>\n cn(tabVariants(), className)\n )}\n {...props}\n >\n {children}\n </AriaTab>\n );\n}\n\nTabComponent.displayName = 'Tab';\n\n/**\n * TabPanel Component\n *\n * Content panel associated with a tab. Only the selected panel is visible.\n * Supports preserveState for React Activity state preservation.\n *\n * @see PRD.md FR-004 (TabPanel Requirements)\n * @see PRD.md FR-015 (Force Mount Panels)\n * @see PRD.md FR-016 (React Activity State Preservation)\n *\n * @example\n * // Default behavior - content unmounts when hidden\n * <TabPanel id=\"tab1\">Content</TabPanel>\n *\n * @example\n * // Legacy force mount - keeps content in DOM\n * <TabPanel id=\"tab1\" shouldForceMount>Form with state</TabPanel>\n *\n * @example\n * // React Activity - preserves state with proper effect cleanup\n * <TabPanel id=\"tab1\" preserveState>\n * <FormWithDraft />\n * </TabPanel>\n */\nfunction TabPanelComponent({\n children,\n id,\n shouldForceMount = false,\n preserveState = false,\n className,\n ...props\n}: TabPanelProps) {\n // preserveState takes precedence - both enable force mounting\n const forceMount = preserveState || shouldForceMount;\n\n // If children is a render function (for dynamic content based on selection state),\n // we need to use the render props pattern\n if (typeof children === 'function') {\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {(renderProps) => {\n // React Aria TabPanelRenderProps includes: state, isInert\n // We derive isSelected from state - if state is undefined, panel is selected\n const isSelected = !renderProps.isInert;\n const content = (\n children as (renderProps: { isSelected: boolean }) => ReactNode\n )({ isSelected });\n\n if (preserveState) {\n return (\n <Activity mode={isSelected ? 'visible' : 'hidden'}>\n {content}\n </Activity>\n );\n }\n\n return content;\n }}\n </AriaTabPanel>\n );\n }\n\n // For static children (not a function), render directly\n // If preserveState is enabled, wrap in Activity\n if (preserveState) {\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {(renderProps) => {\n const isSelected = !renderProps.isInert;\n return (\n <Activity mode={isSelected ? 'visible' : 'hidden'}>\n {children}\n </Activity>\n );\n }}\n </AriaTabPanel>\n );\n }\n\n // Default: render static children directly\n return (\n <AriaTabPanel\n id={id}\n shouldForceMount={forceMount}\n className={composeRenderProps(className, (className) =>\n cn(tabPanelVariants(), className)\n )}\n {...props}\n >\n {children}\n </AriaTabPanel>\n );\n}\n\nTabPanelComponent.displayName = 'TabPanel';\n\n// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Direct named exports (not Object.assign compound pattern)\n *\n * Tabs follows React Aria's direct export pattern because:\n * - Simpler structure (only 4 components vs Dialog's 9)\n * - Better tree-shaking with named exports\n * - Clearer imports: import { Tabs, TabList, Tab, TabPanel } from '...'\n *\n * @see plan.md \"Why Direct Named Exports (Not Object.assign)?\"\n */\nexport const Tabs = TabsRoot;\nexport const TabList = TabListComponent;\nexport const Tab = TabComponent;\nexport const TabPanel = TabPanelComponent;\n\n// Re-export types for convenience\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps };\n","\"use client\";\n\n/**\n * TextField Component\n * Accessible text input with React Aria primitives and CVA styling\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see React Aria TextField: https://react-spectrum.adobe.com/react-aria/TextField.html\n * @see ShadCN Input: https://ui.shadcn.com/docs/components/input\n * @see ShadCN Label: https://ui.shadcn.com/docs/components/label\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport './TextField.css';\nimport { forwardRef, useId, useMemo, useState, useCallback } from 'react';\nimport {\n TextField as AriaTextField,\n Label as AriaLabel,\n Input as AriaInput,\n Text as AriaText,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport { DISABLED_STYLES } from '../../styles/interaction-states';\nimport type {\n TextFieldProps,\n TextFieldLabelProps,\n TextFieldInputProps,\n TextFieldDescriptionProps,\n TextFieldErrorProps,\n} from './TextField.types';\nimport { CircleAlert, Search, X } from 'lucide-react';\nimport { Button } from '../Button';\nimport { EyeIcon, EyeOffIcon } from './TextField.icons';\nimport {\n inputVariants,\n labelVariants,\n descriptionVariants,\n errorMessageVariants,\n successMessageVariants,\n} from './TextField.styles';\nimport { useExpandOnFocus, useCopyPasteProtection, usePasswordToggle } from './TextField.hooks';\n\n// Re-export CVA variants so existing imports from './TextField' continue to work\nexport {\n inputVariants,\n labelVariants,\n descriptionVariants,\n errorMessageVariants,\n successMessageVariants,\n};\n\n/**\n * TextFieldLabel Sub-component\n * Styled label with optional required indicator\n */\nexport const TextFieldLabel = forwardRef<HTMLLabelElement, TextFieldLabelProps>(\n ({ className, state = 'default', children, ...props }, ref) => {\n return (\n <AriaLabel\n ref={ref}\n className={cn(labelVariants({ state }), className)}\n {...props}\n >\n {children}\n </AriaLabel>\n );\n }\n);\n\nTextFieldLabel.displayName = \"TextFieldLabel\";\n\n/**\n * TextFieldInput Sub-component\n * Styled input with size and state variants\n */\nexport const TextFieldInput = forwardRef<HTMLInputElement, TextFieldInputProps>(\n ({ className, size = 'default', state = 'default', ...props }, ref) => {\n return (\n <AriaInput\n ref={ref}\n className={cn(inputVariants({ size, state }), DISABLED_STYLES, className)}\n {...props}\n />\n );\n }\n);\n\nTextFieldInput.displayName = \"TextFieldInput\";\n\n/**\n * TextFieldDescription Sub-component\n * Helper text displayed below the input\n */\nexport const TextFieldDescription = forwardRef<HTMLDivElement, TextFieldDescriptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaText\n ref={ref}\n slot=\"description\"\n className={cn(descriptionVariants(), className)}\n {...props}\n >\n {children}\n </AriaText>\n );\n }\n);\n\nTextFieldDescription.displayName = \"TextFieldDescription\";\n\n/**\n * TextFieldError Sub-component\n * Error message displayed when field is invalid\n * Note: We use AriaFieldError with explicit role=\"alert\" for screen reader announcements\n */\nexport const TextFieldError = forwardRef<HTMLDivElement, TextFieldErrorProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaFieldError\n ref={ref}\n {...props}\n className={cn(errorMessageVariants(), className)}\n >\n <span className=\"flex items-center gap-2\" role=\"alert\"><CircleAlert className=\"h-4 w-4\" />{children}</span>\n </AriaFieldError>\n );\n }\n);\n\nTextFieldError.displayName = \"TextFieldError\";\n\n/**\n * TextFieldSuccess Sub-component\n * Success message displayed when field is valid\n */\nexport const TextFieldSuccess = forwardRef<HTMLDivElement, TextFieldDescriptionProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <AriaText\n ref={ref}\n slot=\"description\"\n className={cn(successMessageVariants(), className)}\n {...props}\n >\n {children}\n </AriaText>\n );\n }\n);\n\nTextFieldSuccess.displayName = \"TextFieldSuccess\";\n\n/**\n * TextField Component\n * Fully accessible text input with React Aria and themed styling\n *\n * @example\n * <TextField\n * label=\"Email\"\n * description=\"We'll never share your email\"\n * isRequired\n * type=\"email\"\n * />\n */\nexport const TextField = forwardRef<HTMLDivElement, TextFieldProps>(\n (\n {\n className,\n size = 'default',\n label,\n description,\n errorMessage,\n successMessage,\n type = 'text',\n isRequired = false,\n isReadOnly = false,\n isDisabled = false,\n isInvalid = false,\n isValid = false,\n id,\n autoComplete,\n disableCopyPaste = false,\n pattern,\n patternDescription,\n expandOnFocus = false,\n collapsedWidth = '200px',\n prefix,\n suffix,\n prefixSize = 16,\n suffixSize = 16,\n showPasswordToggle,\n isIconHidden = false,\n onSubmit,\n onClear,\n value,\n defaultValue,\n onFocus: userOnFocus,\n onBlur: userOnBlur,\n ...props\n },\n ref\n ) => {\n // Generate unique IDs for error message linking\n const errorId = useId();\n const generatedId = useId();\n const fieldId = id || generatedId;\n\n // Custom hooks for behavioral logic\n const { handleFocus, handleBlur, inputWidth } = useExpandOnFocus({\n expandOnFocus,\n collapsedWidth,\n value,\n defaultValue,\n userOnFocus,\n userOnBlur,\n });\n\n const { isShaking, screenReaderMessage, handlePaste } = useCopyPasteProtection({\n disableCopyPaste,\n });\n\n const { showPassword, actualType, handlePasswordToggle } = usePasswordToggle({\n type,\n showPasswordToggle,\n });\n\n // ==========================================================================\n // Search functionality (type=\"search\")\n // ==========================================================================\n const isSearch = type === 'search';\n const [searchValue, setSearchValue] = useState(defaultValue ?? '');\n const isControlledSearch = value !== undefined;\n const currentSearchValue = isControlledSearch ? value : searchValue;\n\n const handleSearchChange = useCallback(\n (newValue: string) => {\n if (!isControlledSearch) {\n setSearchValue(newValue);\n }\n (props as { onChange?: (v: string) => void }).onChange?.(newValue);\n },\n [isControlledSearch, props]\n );\n\n const handleSearchClear = useCallback(() => {\n if (!isControlledSearch) {\n setSearchValue('');\n }\n (props as { onChange?: (v: string) => void }).onChange?.('');\n onClear?.();\n }, [isControlledSearch, props, onClear]);\n\n const handleSearchKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' && onSubmit) {\n onSubmit(currentSearchValue);\n }\n if (e.key === 'Escape' && currentSearchValue) {\n e.preventDefault();\n handleSearchClear();\n }\n },\n [currentSearchValue, onSubmit, handleSearchClear]\n );\n\n // Determine input state based on props\n const inputState = useMemo(() => {\n if (isDisabled) return 'disabled';\n if (isReadOnly) return 'readonly';\n if (isInvalid) return 'error';\n if (isValid) return 'success';\n return 'default';\n }, [isDisabled, isReadOnly, isInvalid, isValid]);\n\n // Determine label state\n const labelState = useMemo(() => {\n if (isDisabled) return 'disabled';\n if (isInvalid) return 'error';\n return 'default';\n }, [isDisabled, isInvalid]);\n\n // Combine description and patternDescription\n const combinedDescription = useMemo(() => {\n if (description && patternDescription) {\n return `${description} ${patternDescription}`;\n }\n return description || patternDescription;\n }, [description, patternDescription]);\n\n // Determine actual prefix (search icon auto-added for type=\"search\")\n const actualPrefix = useMemo(() => {\n if (isSearch && !isIconHidden && !prefix) {\n const iconSize = size === 'sm' ? 'h-3.5 w-3.5' : size === 'lg' ? 'h-5 w-5' : 'h-4 w-4';\n return <Search className={iconSize} />;\n }\n return prefix;\n }, [isSearch, isIconHidden, prefix, size]);\n\n // Calculate dynamic padding for prefix/suffix\n const inputPadding = useMemo(() => {\n const basePadding = { left: 12, right: 12 }; // Default px-3 = 12px\n\n if (actualPrefix) {\n const prefixWidth = typeof actualPrefix === 'string'\n ? actualPrefix.length * 8 + 16\n : prefixSize + 16;\n basePadding.left = prefixWidth;\n }\n\n if (type === 'password' && showPasswordToggle) {\n basePadding.right = 16 + 16;\n } else if (isSearch && currentSearchValue) {\n basePadding.right = 44; // Space for clear button\n } else if (suffix) {\n const suffixWidth = typeof suffix === 'string'\n ? suffix.length * 8 + 16\n : suffixSize + 16;\n basePadding.right = suffixWidth;\n }\n\n return basePadding;\n }, [actualPrefix, prefix, suffix, prefixSize, suffixSize, type, showPasswordToggle, isSearch, currentSearchValue]);\n\n // Determine actual suffix (password toggle / search clear / custom suffix)\n const actualSuffix = useMemo(() => {\n if (type === 'password' && showPasswordToggle) {\n return (\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n onPress={handlePasswordToggle}\n aria-label={showPassword ? 'Hide password' : 'Show password'}\n className=\"!min-h-0 !min-w-0 h-8 w-8\"\n >\n {showPassword ? <EyeOffIcon /> : <EyeIcon />}\n </Button>\n );\n }\n if (isSearch && currentSearchValue) {\n const iconSize = size === 'sm' ? 'h-3 w-3' : size === 'lg' ? 'h-5 w-5' : 'h-4 w-4';\n return (\n <Button\n variant=\"ghost\"\n visualSize=\"icon\"\n onPress={handleSearchClear}\n aria-label=\"Clear search\"\n className=\"!min-h-0 !min-w-0 h-8 w-8\"\n >\n <X className={iconSize} />\n </Button>\n );\n }\n return suffix;\n }, [type, showPasswordToggle, showPassword, suffix, handlePasswordToggle, isSearch, currentSearchValue, size, handleSearchClear]);\n\n // Whether the suffix is an interactive button (password toggle or search clear)\n const hasInteractiveSuffix = (type === 'password' && showPasswordToggle) || (isSearch && !!currentSearchValue);\n\n return (\n <AriaTextField\n ref={ref}\n className={cn(\"flex flex-col gap-1.5\", className)}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isDisabled={isDisabled}\n isInvalid={isInvalid}\n value={isSearch ? currentSearchValue : value}\n defaultValue={isSearch ? undefined : defaultValue}\n onChange={isSearch ? handleSearchChange : undefined}\n {...props}\n >\n {/* Label with required indicator */}\n {label && (\n <AriaLabel className={cn(labelVariants({ state: labelState }))}>\n {label}\n {isRequired && (\n <span className=\"ml-1 text-[var(--destructive-background)]\" aria-hidden=\"true\">\n <strong>*</strong>\n </span>\n )}\n </AriaLabel>\n )}\n\n {/* Description text (helper text) */}\n {combinedDescription && (\n <AriaText slot=\"description\" className={cn(descriptionVariants())}>\n {combinedDescription}\n </AriaText>\n )}\n\n {/* Input field with prefix/suffix */}\n <div\n className=\"relative flex items-center motion-safe:transition-all motion-safe:duration-200\"\n style={{\n width: inputWidth,\n }}\n >\n {/* Prefix */}\n {actualPrefix && (\n <div\n data-testid=\"textfield-prefix\"\n className=\"absolute left-3 flex items-center justify-center pointer-events-none text-[var(--content-foreground)]\"\n aria-hidden=\"true\"\n >\n {actualPrefix}\n </div>\n )}\n\n {/* Input */}\n <AriaInput\n type={actualType}\n id={fieldId}\n className={cn(\n inputVariants({ size, state: inputState }),\n DISABLED_STYLES,\n isShaking && 'shake'\n )}\n style={{\n width: '100%',\n paddingLeft: `${inputPadding.left}px`,\n paddingRight: `${inputPadding.right}px`,\n }}\n autoComplete={autoComplete}\n pattern={pattern}\n onPaste={handlePaste}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={isSearch ? handleSearchKeyDown : undefined}\n aria-required={isRequired ? 'true' : undefined}\n aria-readonly={isReadOnly ? 'true' : undefined}\n aria-errormessage={isInvalid && errorMessage ? errorId : undefined}\n />\n\n {/* Suffix */}\n {actualSuffix && (\n <div\n data-testid=\"textfield-suffix\"\n className={cn(\n \"absolute right-3 flex items-center justify-center text-[var(--content-foreground)]\",\n hasInteractiveSuffix ? \"\" : \"pointer-events-none\"\n )}\n aria-hidden={hasInteractiveSuffix ? undefined : \"true\"}\n >\n {actualSuffix}\n </div>\n )}\n </div>\n\n {/* Success message (shown when valid) */}\n {isValid && successMessage && !isInvalid && (\n <AriaText slot=\"description\" className={cn(successMessageVariants())}>\n {successMessage}\n </AriaText>\n )}\n\n {/* Error message (shown when invalid) - takes precedence over success */}\n {isInvalid && errorMessage && (\n <TextFieldError id={errorId}>\n {errorMessage}\n </TextFieldError>\n )}\n\n {/* Screen reader announcement for paste prevention */}\n {screenReaderMessage && (\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {screenReaderMessage}\n </div>\n )}\n </AriaTextField>\n );\n }\n);\n\nTextField.displayName = \"TextField\";\n\nexport { inputVariants as textFieldInputVariants, labelVariants as textFieldLabelVariants };\n","/**\n * TextField Icon Components\n * SVG icons for password toggle functionality\n *\n * Extracted from TextField.tsx to keep the main component file focused.\n * These are module-level components to avoid re-creating on every render.\n */\n\nimport type { ReactElement } from 'react';\n\n/**\n * Eye icon for \"show password\" state\n * Rendered when the password is currently hidden\n */\nexport const EyeIcon = (): ReactElement => (\n <svg\n data-testid=\"password-toggle-icon-show\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M1 8s3-5 7-5 7 5 7 5-3 5-7 5-7-5-7-5z\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </svg>\n);\n\n/**\n * Eye-off icon for \"hide password\" state\n * Rendered when the password is currently visible\n */\nexport const EyeOffIcon = (): ReactElement => (\n <svg\n data-testid=\"password-toggle-icon-hide\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10.5 5.5l-5 5\" />\n <path d=\"M1 8s3-5 7-5c1.5 0 2.8.6 4 1.5M15 8s-1.5 2.5-4 4\" />\n <path d=\"M3 13l2-2m7-7l2-2\" />\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\n </svg>\n);\n","/**\n * TextField CVA Variant Styles\n * Extracted from TextField.tsx for separation of concerns\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements - WCAG 2.2 AAA)\n * @see React Aria TextField: https://react-spectrum.adobe.com/react-aria/TextField.html\n * @see ShadCN Input: https://ui.shadcn.com/docs/components/input\n * @see ShadCN Label: https://ui.shadcn.com/docs/components/label\n */\n\nimport { cva } from 'class-variance-authority';\n\n/**\n * Input variant styles using CVA\n * Adapts ShadCN Input styling with Themis semantic tokens\n */\nexport const inputVariants = cva(\n // Base styles - FR-014: Proper input styling with focus states\n \"flex w-full rounded-md border bg-[var(--content-background)] shadow-xs px-3 py-2 text-sm ring-offset-[var(--content-background)] file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-[var(--content-foreground)] placeholder:text-[var(--menu-muted)] transition-all duration-200\",\n {\n variants: {\n // Size variants (matching Button sizes)\n size: {\n sm: \"h-9 text-xs px-2 py-1\",\n default: \"h-10 px-3 py-2\",\n lg: \"h-11 px-4 py-3 text-base\"\n },\n // State variants\n state: {\n default: \"border-[var(--input-border)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2\",\n error: \"border-[var(--destructive-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--destructive-background)] focus-visible:ring-offset-2\",\n success: \"border-[var(--success-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--success-ring)] focus-visible:ring-offset-2\",\n disabled: \"cursor-not-allowed opacity-50\",\n readonly: \"cursor-default bg-[var(--content-background)] opacity-70\"\n }\n },\n defaultVariants: {\n size: \"default\",\n state: \"default\"\n }\n }\n);\n\n/**\n * Label variant styles using CVA\n * Adapts ShadCN Label styling with Themis semantic tokens\n */\nexport const labelVariants = cva(\n // Base styles - FR-009: WCAG 2.2 AAA compliance\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n {\n variants: {\n state: {\n default: \"text-[var(--content-foreground)]\",\n error: \"text-[var(--destructive-foreground)]\",\n disabled: \"opacity-50 cursor-not-allowed\"\n }\n },\n defaultVariants: {\n state: \"default\"\n }\n }\n);\n\n/**\n * Description text variant styles\n */\nexport const descriptionVariants = cva(\n \"text-sm text-[var(--content-foreground)]\"\n);\n\n/**\n * Error message variant styles\n */\nexport const errorMessageVariants = cva(\n \"text-sm text-[var(--destructive-foreground)] font-medium mt-1.5\"\n);\n\n/**\n * Success message variant styles\n */\nexport const successMessageVariants = cva(\n \"text-sm text-[var(--success-foreground)] font-medium mt-1.5\"\n);\n","/**\n * TextField Custom Hooks\n * Extracted from TextField.tsx for separation of concerns\n *\n * These hooks encapsulate the behavioral logic for:\n * - Expand on focus\n * - Copy/paste protection\n * - Password visibility toggle\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { FocusEvent, ClipboardEvent } from 'react';\n\n/**\n * Hook: useExpandOnFocus\n * Manages the expand-on-focus behavior where an input starts narrow\n * and expands to full width when focused or when it has a value.\n *\n * @param expandOnFocus - Whether expand-on-focus is enabled\n * @param collapsedWidth - CSS width when collapsed (e.g., '200px')\n * @param value - Controlled value (if any)\n * @param defaultValue - Default value (if any)\n * @param userOnFocus - User-provided onFocus handler to call through\n * @param userOnBlur - User-provided onBlur handler to call through\n */\nexport function useExpandOnFocus({\n expandOnFocus,\n collapsedWidth,\n value,\n defaultValue,\n userOnFocus,\n userOnBlur,\n}: {\n expandOnFocus: boolean;\n collapsedWidth: string;\n value: string | undefined;\n defaultValue: string | undefined;\n userOnFocus: ((e: FocusEvent<HTMLInputElement>) => void) | undefined;\n userOnBlur: ((e: FocusEvent<HTMLInputElement>) => void) | undefined;\n}) {\n const [isFocused, setIsFocused] = useState(false);\n\n const handleFocus = useCallback((e: FocusEvent<HTMLInputElement>) => {\n if (expandOnFocus) {\n setIsFocused(true);\n }\n userOnFocus?.(e);\n }, [expandOnFocus, userOnFocus]);\n\n const handleBlur = useCallback((e: FocusEvent<HTMLInputElement>) => {\n if (expandOnFocus) {\n const isEmpty = e.target.value === '';\n if (isEmpty) {\n setIsFocused(false);\n }\n }\n userOnBlur?.(e);\n }, [expandOnFocus, userOnBlur]);\n\n const inputWidth = useMemo(() => {\n if (!expandOnFocus) return undefined;\n\n const hasValue = value !== undefined ? value !== '' : defaultValue !== undefined && defaultValue !== '';\n\n if (isFocused || hasValue) {\n return '100%';\n }\n\n return collapsedWidth;\n }, [expandOnFocus, isFocused, value, defaultValue, collapsedWidth]);\n\n return { handleFocus, handleBlur, inputWidth };\n}\n\n/**\n * Hook: useCopyPasteProtection\n * Manages copy/paste prevention with shake animation and screen reader announcements.\n *\n * @param disableCopyPaste - Whether copy/paste should be disabled\n */\nexport function useCopyPasteProtection({\n disableCopyPaste,\n}: {\n disableCopyPaste: boolean;\n}) {\n const [isShaking, setIsShaking] = useState(false);\n const [screenReaderMessage, setScreenReaderMessage] = useState('');\n\n // Development mode warning for disableCopyPaste\n useEffect(() => {\n if (disableCopyPaste && typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n console.warn(\n '[TextField] Copy/paste prevention should only be used for security-critical fields like password confirmation. ' +\n 'This feature can break assistive technology workflows and password managers.'\n );\n }\n }, [disableCopyPaste]);\n\n const handlePaste = useCallback((e: ClipboardEvent<HTMLInputElement>) => {\n if (disableCopyPaste) {\n e.preventDefault();\n\n // Trigger shake animation\n setIsShaking(true);\n\n // Announce to screen readers\n setScreenReaderMessage('Pasting is not allowed in this field. Please type your entry.');\n\n // Remove shake animation and clear message after 400ms\n setTimeout(() => {\n setIsShaking(false);\n setScreenReaderMessage('');\n }, 400);\n }\n }, [disableCopyPaste]);\n\n return { isShaking, screenReaderMessage, handlePaste };\n}\n\n/**\n * Hook: usePasswordToggle\n * Manages password show/hide toggle state and determines the actual input type.\n *\n * @param type - The input type ('text', 'email', 'password', etc.)\n * @param showPasswordToggle - Whether the toggle button should be shown\n */\nexport function usePasswordToggle({\n type,\n showPasswordToggle,\n}: {\n type: string;\n showPasswordToggle: boolean | undefined;\n}) {\n const [showPassword, setShowPassword] = useState(false);\n\n const handlePasswordToggle = useCallback(() => {\n setShowPassword(prev => !prev);\n }, []);\n\n const actualType = useMemo(() => {\n if (type === 'password' && showPasswordToggle && showPassword) {\n return 'text';\n }\n return type;\n }, [type, showPasswordToggle, showPassword]);\n\n return { showPassword, actualType, handlePasswordToggle };\n}\n","'use client';\n\n/**\n * TimeField Component\n *\n * A fully accessible time input component built on React Aria's TimeField primitive.\n * Provides keyboard-editable time segments for entering hours, minutes, and seconds.\n *\n * Features:\n * - WCAG 2.2 AAA compliant (default/lg sizes) / AA compliant (sm size)\n * - Configurable granularity (hour, minute, second)\n * - 12-hour and 24-hour format support\n * - Step increment support\n * - Min/max constraints with validation\n * - Form integration with hidden input\n * - Full keyboard navigation\n * - Screen reader accessible\n *\n * @see {@link ../../docs/prd/timefield-prd.md} for full requirements\n */\n\nimport { forwardRef, type ReactElement } from 'react';\nimport {\n TimeField as AriaTimeField,\n DateInput as AriaDateInput,\n DateSegment as AriaDateSegment,\n Label as AriaLabel,\n Text as AriaText,\n FieldError as AriaFieldError,\n} from 'react-aria-components';\nimport { cn } from '../../utils/cn';\nimport type { TimeFieldProps } from './TimeField.types';\nimport {\n timeFieldVariants,\n timeSegmentVariants,\n timeFieldLabelVariants,\n timeFieldDescriptionVariants,\n timeFieldErrorVariants,\n} from './TimeField.types';\n\n// =============================================================================\n// TimeField Component\n// =============================================================================\n\n/**\n * TimeField component for time input with keyboard-editable segments.\n *\n * @example\n * ```tsx\n * import { TimeField, Time } from '@tribepad/themis/elements/TimeField';\n *\n * // Basic usage\n * <TimeField label=\"Meeting Time\" />\n *\n * // With default value\n * <TimeField\n * label=\"Start Time\"\n * defaultValue={new Time(14, 30)}\n * />\n *\n * // 12-hour format with step\n * <TimeField\n * label=\"Appointment\"\n * hourCycle={12}\n * step={15}\n * />\n *\n * // With validation\n * <TimeField\n * label=\"Office Hours\"\n * minValue={new Time(9, 0)}\n * maxValue={new Time(17, 0)}\n * errorMessage=\"Please select a time within office hours\"\n * />\n * ```\n */\nexport const TimeField = forwardRef<HTMLDivElement, TimeFieldProps>(\n (\n {\n // Display props\n label,\n description,\n errorMessage,\n // Variant props\n size = 'default',\n // Standard props\n className,\n // All other props go to AriaTimeField\n ...props\n },\n ref\n ): ReactElement => {\n return (\n <AriaTimeField\n ref={ref}\n className={cn('group flex flex-col gap-1', className)}\n {...props}\n >\n {/* Label */}\n {label && (\n <AriaLabel\n className={cn(timeFieldLabelVariants({ size }))}\n data-required={props.isRequired || undefined}\n >\n {label}\n </AriaLabel>\n )}\n\n {/* Time Input */}\n <AriaDateInput\n className={cn(\n timeFieldVariants({\n size,\n isInvalid: props.isInvalid,\n }),\n 'w-fit'\n )}\n >\n {(segment) => (\n <AriaDateSegment\n segment={segment}\n className={cn(timeSegmentVariants({ size }))}\n />\n )}\n </AriaDateInput>\n\n {/* Description */}\n {description && (\n <AriaText\n slot=\"description\"\n className={cn(timeFieldDescriptionVariants({ size }))}\n >\n {description}\n </AriaText>\n )}\n\n {/* Error Message */}\n <AriaFieldError className={cn(timeFieldErrorVariants({ size }))}>\n {errorMessage}\n </AriaFieldError>\n </AriaTimeField>\n );\n }\n);\n\nTimeField.displayName = 'TimeField';\n","/**\n * TimeField Component Types\n *\n * Zod schemas and TypeScript types for the TimeField component.\n * Includes CVA variant definitions for styling.\n *\n * Note: Zod schemas are used for contract tests and developer guardrails,\n * not runtime validation. This follows the established Themis pattern.\n *\n * @see {@link ../../docs/prd/timefield-prd.md} for full requirements\n */\n\nimport { z } from 'zod';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport type {\n TimeFieldProps as AriaTimeFieldProps,\n TimeValue,\n} from 'react-aria-components';\n\n// ============================================================================\n// Time Value Types (re-exported for convenience)\n// ============================================================================\n\n/**\n * Union type for all time values supported by the TimeField.\n * - Time: Time only (no date, no timezone)\n * - CalendarDateTime: Date and time (no timezone)\n * - ZonedDateTime: Date, time, and timezone\n */\nexport type { TimeValue } from 'react-aria-components';\n\n// ============================================================================\n// Granularity Type\n// ============================================================================\n\n/**\n * Controls which time segments are displayed.\n * - 'hour': Hour only (+ AM/PM in 12-hour mode)\n * - 'minute': Hour + minute (default)\n * - 'second': Hour + minute + second\n *\n * Note: Millisecond granularity is intentionally excluded - no common UI use case.\n */\nexport type TimeGranularity = 'hour' | 'minute' | 'second';\n\n// ============================================================================\n// Size Variant Type\n// ============================================================================\n\n/**\n * Size variants for TimeField component.\n * - 'sm': Compact size (36px height) - AA compliant only, not AAA\n * - 'default': Standard size (44px height) - AAA compliant\n * - 'lg': Large size (56px height) - AAA compliant\n */\nexport type TimeFieldSize = 'sm' | 'default' | 'lg';\n\n// ============================================================================\n// Hour Cycle Type\n// ============================================================================\n\n/**\n * Hour cycle format.\n * - 12: 12-hour format with AM/PM\n * - 24: 24-hour format\n */\nexport type HourCycle = 12 | 24;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Zod schema for TimeField props validation.\n * Used for contract tests and developer guardrails, not runtime validation.\n */\nexport const TimeFieldPropsSchema = z.object({\n // Value props\n value: z.custom<TimeValue>().optional(),\n defaultValue: z.custom<TimeValue>().optional(),\n placeholderValue: z.custom<TimeValue>().optional(),\n\n // Granularity props\n granularity: z.enum(['hour', 'minute', 'second']).default('minute'),\n hourCycle: z.union([z.literal(12), z.literal(24)]).optional(),\n hideTimeZone: z.boolean().optional(),\n shouldForceLeadingZeros: z.boolean().optional(),\n\n // Constraint props\n minValue: z.custom<TimeValue>().optional(),\n maxValue: z.custom<TimeValue>().optional(),\n\n // State props\n isDisabled: z.boolean().optional(),\n isReadOnly: z.boolean().optional(),\n isRequired: z.boolean().optional(),\n isInvalid: z.boolean().optional(),\n\n // Validation props\n /** Custom validation function that returns an error message or null */\n validate: z.function().optional(),\n validationBehavior: z.enum(['native', 'aria']).default('native'),\n\n // Display props\n label: z.string(),\n description: z.string().optional(),\n /** Error message string or render function */\n errorMessage: z.union([z.string(), z.function()]).optional(),\n\n // Form props\n name: z.string().optional(),\n\n // Variant props\n size: z.enum(['sm', 'default', 'lg']).default('default'),\n\n // Event props\n /** Called when the time value changes */\n onChange: z.function().optional(),\n /** Called when the field gains focus */\n onFocus: z.function().optional(),\n /** Called when the field loses focus */\n onBlur: z.function().optional(),\n /** Called when focus state changes */\n onFocusChange: z.function().optional(),\n\n // Standard props\n className: z.string().optional(),\n autoFocus: z.boolean().optional(),\n});\n\n// ============================================================================\n// TypeScript Types\n// ============================================================================\n\n/**\n * Custom props added to TimeField (not from React Aria).\n */\nexport interface ThemisTimeFieldCustomProps {\n /** Size variant: 'sm', 'default', or 'lg' */\n size?: TimeFieldSize;\n /** Field label */\n label?: string;\n /** Description text below the field */\n description?: string;\n /** Error message when field is invalid */\n errorMessage?: string;\n}\n\n/**\n * Props for the TimeField component.\n * Uses React Aria's TimeFieldProps directly to ensure correct function types.\n */\nexport type TimeFieldProps = AriaTimeFieldProps<TimeValue> &\n ThemisTimeFieldCustomProps;\n\n// ============================================================================\n// CVA Variants\n// ============================================================================\n\n/**\n * Variants for the TimeField input container.\n * Applies to the DateInput element wrapping time segments.\n *\n * Size notes:\n * - sm (36px): Desktop-only, AA compliant only (not AAA touch target)\n * - default (44px): AAA compliant, recommended for most use cases\n * - lg (56px): AAA compliant, enhanced touch targets\n */\nexport const timeFieldVariants = cva(\n [\n // Base styles\n 'inline-flex items-center rounded-md border',\n 'bg-[var(--content-background)] text-[var(--content-foreground)]',\n 'transition-colors duration-200',\n // Focus within\n 'focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-2',\n // Disabled\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-9 px-3 text-sm gap-0.5', // 36px - AA only\n default: 'h-11 px-4 text-base gap-1', // 44px - AAA\n lg: 'h-14 px-5 text-lg gap-1.5', // 56px - AAA\n },\n isInvalid: {\n true: 'border-[var(--destructive)] focus-within:ring-[var(--destructive)]',\n false: 'border-[var(--input)] hover:border-[var(--input)]/80',\n },\n },\n defaultVariants: {\n size: 'default',\n isInvalid: false,\n },\n }\n);\n\n/**\n * Variants for individual time segment elements.\n * Each segment (hour, minute, second, dayPeriod) uses these styles.\n */\nexport const timeSegmentVariants = cva(\n [\n // Base styles\n 'tabular-nums rounded px-0.5',\n // Focus\n 'focus:outline-none focus:bg-[var(--accent)] focus:text-[var(--accent-foreground)]',\n // Placeholder\n 'data-[placeholder]:text-[var(--menu-muted)]',\n // Literal segments (colons, spaces)\n 'data-[type=literal]:text-[var(--menu-muted)]',\n // Disabled\n 'data-[disabled]:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'text-sm min-w-[1.5ch]',\n default: 'text-base min-w-[2ch]',\n lg: 'text-lg min-w-[2ch]',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Variants for the TimeField label.\n */\nexport const timeFieldLabelVariants = cva(\n [\n 'block font-medium text-[var(--content-foreground)]',\n 'mb-1.5',\n // Required indicator\n 'data-[required]:after:content-[\"*\"] data-[required]:after:ml-0.5',\n 'data-[required]:after:text-[var(--destructive)]',\n ],\n {\n variants: {\n size: {\n sm: 'text-sm',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Variants for the description text below the field.\n */\nexport const timeFieldDescriptionVariants = cva(\n [\n 'text-[var(--menu-muted)]',\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n/**\n * Variants for the error message display.\n */\nexport const timeFieldErrorVariants = cva(\n [\n 'flex items-center gap-1',\n 'text-[var(--destructive)]',\n 'mt-1',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\n// ============================================================================\n// Variant Types (from CVA)\n// ============================================================================\n\n/**\n * Variant props for timeFieldVariants CVA function.\n */\nexport type TimeFieldVariantProps = VariantProps<typeof timeFieldVariants>;\n\n/**\n * Variant props for timeSegmentVariants CVA function.\n */\nexport type TimeSegmentVariantProps = VariantProps<typeof timeSegmentVariants>;\n","'use client';\n\n/**\n * Toast Component - Accessible notification system\n * Built with React Aria toast primitives and CVA styling\n *\n * @see toast-prd.md - Product Requirements Document\n * @see plan.md - Implementation Plan\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport {\n forwardRef,\n memo,\n useRef,\n useState,\n useCallback,\n type TouchEvent as ReactTouchEvent,\n} from 'react';\nimport { useToast } from 'react-aria';\nimport { ToastQueue, type QueuedToast, type ToastState as AriaToastState } from 'react-stately';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport type {\n ToastVariant,\n ToastContent,\n ToastState,\n DismissReason,\n ToastConfig,\n} from './Toast.types';\n\n// =============================================================================\n// CVA Variants\n// =============================================================================\n\n/**\n * Toast container variants with theme-aligned styling\n * Fixed 356px width for consistent appearance across all toasts\n */\nexport const toastVariants = cva(\n [\n // Fixed width for consistent appearance\n 'pointer-events-auto relative flex w-[356px] items-center justify-between',\n 'space-x-4 overflow-hidden rounded-lg border p-4 pr-12 shadow-lg',\n // Animations with reduced-motion support\n 'transition-all duration-300',\n 'motion-reduce:transition-none motion-reduce:animate-none',\n 'data-[entering]:animate-in data-[entering]:slide-in-from-left',\n 'data-[exiting]:animate-out data-[exiting]:slide-out-to-right-full',\n 'data-[exiting]:fade-out-80',\n // Touch interaction for swipe\n 'touch-pan-y',\n ],\n {\n variants: {\n variant: {\n default: [\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'border-[var(--border)]',\n ],\n primary: [\n 'bg-[var(--primary)]',\n 'text-[var(--primary-foreground)]',\n 'border-[var(--primary)]',\n ],\n destructive: [\n 'bg-[var(--destructive-background)]',\n 'text-[var(--destructive-foreground)]',\n 'border-[var(--destructive-background)]',\n ],\n accent: [\n 'bg-[var(--accent-background)]',\n 'text-[var(--accent-foreground)]',\n 'border-[var(--accent-background)]',\n ],\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\n/**\n * Toaster position variants for the toast region container\n */\nexport const toasterVariants = cva(\n [\n 'fixed z-50 flex flex-col gap-2 p-4',\n 'pointer-events-none',\n 'max-h-screen overflow-hidden',\n ],\n {\n variants: {\n position: {\n 'top-left': 'top-0 left-0 items-start',\n 'top-center': 'top-0 left-1/2 -translate-x-1/2 items-center',\n 'top-right': 'top-0 right-0 items-end',\n 'bottom-left': 'bottom-0 left-0 items-start',\n 'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2 items-center',\n 'bottom-right': 'bottom-0 right-0 items-end',\n },\n },\n defaultVariants: {\n position: 'bottom-right',\n },\n }\n);\n\n// =============================================================================\n// Close Button Component\n// =============================================================================\n\ninterface CloseButtonProps {\n variant?: ToastVariant;\n className?: string;\n onPress?: () => void;\n}\n\n/**\n * Close button component with 44x44px touch target\n * WCAG 2.2 AAA compliant touch target size\n */\nconst CloseButton = memo(\n forwardRef<HTMLButtonElement, CloseButtonProps>(\n ({ variant = 'default', className, onPress}, ref) => {\n // Variant-aware hover styles using theme tokens\n const hoverStyles =\n variant === 'default'\n ? 'hover:bg-[var(--accent-background)]/20'\n : 'hover:bg-[var(--page-background)]/20';\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n visualSize=\"icon\"\n onPress={onPress}\n className={cn(\n 'absolute right-2 top-2',\n hoverStyles,\n className\n )}\n aria-label=\"Dismiss notification\"\n >\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n );\n }\n )\n);\n\nCloseButton.displayName = 'CloseButton';\n\n// =============================================================================\n// Global Toast Queue\n// =============================================================================\n\n/**\n * Internal toast queue instance\n */\nconst internalQueue = new ToastQueue<ToastState>({\n maxVisibleToasts: 3,\n});\n\n/**\n * Track total active toasts (visible + queued)\n * React Stately doesn't expose queued toasts, so we track manually\n */\nlet totalActiveToasts = 0;\nconst toastCountListeners = new Set<() => void>();\n\nfunction incrementTotalToasts(): void {\n totalActiveToasts++;\n toastCountListeners.forEach((fn) => fn());\n}\n\nfunction decrementTotalToasts(): void {\n totalActiveToasts = Math.max(0, totalActiveToasts - 1);\n toastCountListeners.forEach((fn) => fn());\n}\n\n/**\n * Get the total number of active toasts (visible + queued)\n */\nexport function getTotalActiveToasts(): number {\n return totalActiveToasts;\n}\n\n/**\n * Subscribe to total toast count changes\n */\nexport function subscribeToTotalCount(fn: () => void): () => void {\n toastCountListeners.add(fn);\n return () => toastCountListeners.delete(fn);\n}\n\n/**\n * Enhanced toast queue API with additional methods\n * Provides closeAll, pauseAll, resumeAll on top of base ToastQueue\n */\nexport const toastQueue = {\n /**\n * Add a toast to the queue\n */\n add: (content: ToastState, options?: { timeout?: number; onClose?: () => void }) =>\n internalQueue.add(content, options),\n\n /**\n * Close a specific toast by key\n */\n close: (key: string) => {\n internalQueue.close(key);\n },\n\n /**\n * Close all toasts (visible and queued)\n */\n closeAll: () => {\n // Close all visible toasts\n internalQueue.visibleToasts.forEach((toast) => {\n internalQueue.close(toast.key);\n });\n },\n\n /**\n * Pause all toast timers\n */\n pauseAll: () => {\n internalQueue.pauseAll();\n },\n\n /**\n * Resume all toast timers\n */\n resumeAll: () => {\n internalQueue.resumeAll();\n },\n\n /**\n * Get the visible toasts\n */\n get visibleToasts() {\n return internalQueue.visibleToasts;\n },\n\n /**\n * Subscribe to queue changes\n */\n subscribe: (fn: () => void) => internalQueue.subscribe(fn),\n\n /**\n * Get total active toasts (visible + queued)\n */\n get totalCount() {\n return totalActiveToasts;\n },\n};\n\n/**\n * Get the internal queue for use in components\n */\nexport function getInternalQueue(): ToastQueue<ToastState> {\n return internalQueue;\n}\n\n// =============================================================================\n// Toast Function (Programmatic API)\n// =============================================================================\n\n/**\n * Enforce minimum timeout of 5000ms for accessibility\n * WCAG 2.2 timing guidelines require sufficient time for reading\n * Timeout of 0 bypasses this (persistent toast)\n */\nfunction enforceMinTimeout(timeout: number): number {\n if (timeout === 0) return 0; // Persistent toast\n return Math.max(timeout, 5000);\n}\n\n/**\n * Add a toast notification programmatically\n *\n * @param content - Content to display (string or ReactNode)\n * @param options - Toast configuration options\n * @returns Unique key for the created toast\n *\n * @example\n * ```tsx\n * // Simple string\n * toast(\"Message saved!\");\n *\n * // With variant\n * toast(\"Error occurred\", { variant: \"destructive\" });\n *\n * // With callback\n * toast(\"Action completed\", {\n * variant: \"primary\",\n * onClose: (key, reason) => console.log(`Closed: ${reason}`)\n * });\n * ```\n */\n/**\n * Apply defaults to toast options without Zod runtime overhead.\n */\nfunction applyToastDefaults(options: ToastConfig = {}): { variant: ToastVariant; timeout: number; onClose?: (key: string, reason: DismissReason) => void } {\n return {\n variant: options.variant ?? 'default',\n timeout: options.timeout ?? 5000,\n onClose: options.onClose,\n };\n}\n\nexport function toast(content: ToastContent, options?: ToastConfig): string {\n // Apply defaults (TypeScript handles validation at compile time)\n const validated = applyToastDefaults(options);\n\n // Enforce minimum timeout for accessibility\n const timeout = enforceMinTimeout(validated.timeout);\n\n // Track dismissal reason for callback\n const dismissReason: DismissReason = 'timeout';\n\n // Increment total toast count\n incrementTotalToasts();\n\n const key = toastQueue.add(\n {\n key: '', // Will be set by queue\n content,\n variant: validated.variant,\n timeout,\n onClose: validated.onClose,\n },\n {\n timeout,\n onClose: () => {\n // Decrement total toast count\n decrementTotalToasts();\n\n // Fire the user's onClose callback with reason\n if (validated.onClose) {\n validated.onClose(key, dismissReason);\n }\n },\n }\n );\n\n return key;\n}\n\n// =============================================================================\n// Toast Item Component\n// =============================================================================\n\nexport interface ToastItemProps {\n /** Toast from the queue */\n toast: QueuedToast<ToastState>;\n /** Toast state for managing dismissal */\n state: AriaToastState<ToastState>;\n}\n\n/**\n * Individual toast notification component\n * Uses React Aria useToast hook for accessibility\n */\nexport const ToastItem = memo(\n forwardRef<HTMLDivElement, ToastItemProps>(({ toast, state }, forwardedRef) => {\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef as React.RefObject<HTMLDivElement>) || internalRef;\n\n // React Aria toast hook for accessibility\n const { toastProps, contentProps } = useToast(\n { toast },\n state,\n ref\n );\n\n // Swipe-to-dismiss state\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [translateX, setTranslateX] = useState(0);\n\n const SWIPE_THRESHOLD = 50; // Minimum swipe distance to dismiss\n\n const handleTouchStart = useCallback((e: ReactTouchEvent) => {\n const touch = e.touches[0];\n if (touch) {\n setTouchStart(touch.clientX);\n }\n }, []);\n\n const handleTouchMove = useCallback(\n (e: ReactTouchEvent) => {\n if (touchStart === null) return;\n const touch = e.touches[0];\n if (!touch) return;\n const diff = touch.clientX - touchStart;\n // Only allow right swipe (positive diff)\n if (diff > 0) {\n setTranslateX(diff);\n }\n },\n [touchStart]\n );\n\n const handleTouchEnd = useCallback(() => {\n if (translateX > SWIPE_THRESHOLD) {\n // Dismiss the toast\n state.close(toast.key);\n }\n // Reset swipe state\n setTranslateX(0);\n setTouchStart(null);\n }, [translateX, state, toast.key]);\n\n const handleCloseClick = useCallback(() => {\n state.close(toast.key);\n }, [state, toast.key]);\n\n const { content } = toast;\n const variant = content.variant ?? 'default';\n\n // Generate accessible name for the toast\n const accessibleName = typeof content.content === 'string'\n ? content.content\n : 'Notification';\n\n return (\n <div\n {...toastProps}\n ref={ref}\n className={cn(toastVariants({ variant }))}\n aria-label={accessibleName}\n style={{\n transform: translateX > 0 ? `translateX(${translateX}px)` : undefined,\n opacity: translateX > 0 ? 1 - translateX / 200 : undefined,\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n {/* Toast content */}\n <div {...contentProps} className=\"flex-1 min-w-0\">\n {typeof content.content === 'string' ? (\n <p className=\"text-sm font-medium\">{content.content}</p>\n ) : (\n content.content\n )}\n </div>\n\n {/* Close button */}\n <CloseButton\n variant={variant}\n onPress={handleCloseClick}\n />\n </div>\n );\n })\n);\n\nToastItem.displayName = 'ToastItem';\n\n// =============================================================================\n// Export Types\n// =============================================================================\n\nexport type { VariantProps };\n","import { z } from 'zod';\nimport type { ReactNode } from 'react';\n\n/**\n * Toast Component Type Definitions\n *\n * @see toast-prd.md - Product Requirements Document\n * @see plan.md - Implementation Plan\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\n// =============================================================================\n// Enums and Primitives\n// =============================================================================\n\n/**\n * Reason why a toast was dismissed\n * - 'timeout': Auto-dismissed after timeout period\n * - 'user': User clicked close button or swiped to dismiss\n * - 'programmatic': Closed via toastQueue.close() or toastQueue.closeAll()\n */\nexport const DismissReasonSchema = z.enum(['timeout', 'user', 'programmatic']);\nexport type DismissReason = z.infer<typeof DismissReasonSchema>;\n\n/**\n * Toast visual variants matching the Themis theme system\n * Each variant maps to specific theme tokens for background/foreground colors\n *\n * @see toast-prd.md Variant Token Mapping table\n */\nexport const ToastVariantSchema = z.enum([\n 'default',\n 'primary',\n 'destructive',\n 'accent',\n]);\nexport type ToastVariant = z.infer<typeof ToastVariantSchema>;\n\n/**\n * Toast region positioning options\n * Toasts appear in a fixed position on the viewport\n */\nexport const ToasterPositionSchema = z.enum([\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right',\n]);\nexport type ToasterPosition = z.infer<typeof ToasterPositionSchema>;\n\n// =============================================================================\n// Toast Options Schema\n// =============================================================================\n\n/**\n * Options for creating a toast notification\n *\n * @example\n * ```tsx\n * toast(\"Message\", {\n * variant: \"primary\",\n * timeout: 8000,\n * onClose: (key, reason) => console.log(`Toast ${key} closed: ${reason}`)\n * });\n * ```\n */\nexport const ToastOptionsSchema = z.object({\n /**\n * Visual variant determining background and foreground colors\n * @default 'default'\n */\n variant: ToastVariantSchema.default('default'),\n\n /**\n * Auto-dismiss timeout in milliseconds\n * - Values 1-4999ms are clamped to 5000ms (WCAG 2.2 timing requirement)\n * - Set to 0 for persistent toasts (no auto-dismiss)\n * @default 5000\n */\n timeout: z.number().min(0).default(5000),\n\n /**\n * Callback fired when toast is dismissed\n * @param key - Unique identifier of the toast\n * @param reason - Why the toast was dismissed ('timeout' | 'user' | 'programmatic')\n */\n onClose: z.function().optional(),\n});\n\n/**\n * Inferred type from Zod schema\n * Note: onClose is typed as generic function in Zod, but we override with proper signature below\n */\ntype ToastOptionsBase = z.infer<typeof ToastOptionsSchema>;\n\n/**\n * Toast options with properly typed onClose callback\n */\nexport type ToastOptions = Omit<ToastOptionsBase, 'onClose'> & {\n /**\n * Callback fired when toast is dismissed\n * @param key - Unique identifier of the toast\n * @param reason - Why the toast was dismissed\n */\n onClose?: (key: string, reason: DismissReason) => void;\n};\n\n// =============================================================================\n// Provider Props Schema\n// =============================================================================\n\n/**\n * Props for the ToastProvider component\n * Wraps the application to provide toast queue context\n *\n * @example\n * ```tsx\n * <ToastProvider maxVisibleToasts={3}>\n * <App />\n * <Toaster position=\"bottom-right\" />\n * </ToastProvider>\n * ```\n */\nexport const ToastProviderPropsSchema = z.object({\n /**\n * Maximum number of toasts visible at once\n * Additional toasts are queued and shown as others dismiss\n * @default 3\n */\n maxVisibleToasts: z.number().min(1).default(3),\n});\n\nexport type ToastProviderProps = z.infer<typeof ToastProviderPropsSchema> & {\n /** Child components that can trigger toasts */\n children: ReactNode;\n};\n\n// =============================================================================\n// Toaster Props Schema\n// =============================================================================\n\n/**\n * Props for the Toaster component (toast region container)\n * Renders the toast region with positioning and accessibility attributes\n *\n * @example\n * ```tsx\n * <Toaster\n * position=\"bottom-right\"\n * aria-label=\"Notifications\"\n * className=\"custom-toast-region\"\n * />\n * ```\n */\nexport const ToasterPropsSchema = z.object({\n /**\n * Position of the toast region on screen\n * @default 'bottom-right'\n */\n position: ToasterPositionSchema.default('bottom-right'),\n\n /**\n * Accessible label for the toast region landmark\n * Used by screen readers to identify the notification area\n * @default 'Notifications'\n */\n 'aria-label': z.string().default('Notifications'),\n\n /**\n * Additional CSS classes for the toast region\n */\n className: z.string().optional(),\n});\n\nexport type ToasterProps = z.infer<typeof ToasterPropsSchema>;\n\n// =============================================================================\n// Internal Types (not exported from index.ts)\n// =============================================================================\n\n/**\n * Internal toast state stored in the queue\n * Contains all information needed to render and manage a toast\n */\nexport interface ToastState {\n /** Unique identifier for the toast */\n key: string;\n\n /** Content to render inside the toast (ReactNode or string) */\n content: ReactNode;\n\n /** Visual variant for styling */\n variant: ToastVariant;\n\n /** Auto-dismiss timeout in milliseconds (0 = persistent) */\n timeout: number;\n\n /** Callback fired when toast is dismissed */\n onClose?: (key: string, reason: DismissReason) => void;\n}\n\n/**\n * Toast content type - fully customizable by developer\n * Can be a simple string or complex ReactNode with custom layout\n */\nexport type ToastContent = ReactNode;\n\n/**\n * Props for the internal ToastItem component\n */\nexport interface ToastItemProps {\n /** Toast state from the queue */\n toast: {\n key: string;\n content: ToastState;\n animation: 'entering' | 'queued' | 'exiting';\n priority: number;\n };\n\n /** Toast queue state for managing dismissal */\n state: {\n close: (key: string) => void;\n };\n}\n\n// =============================================================================\n// Toast Queue API Types\n// =============================================================================\n\n/**\n * Public API for the toast queue\n * Allows programmatic control of toasts from anywhere in the app\n */\nexport interface ToastQueueAPI {\n /**\n * Add a new toast to the queue\n * @param content - Content to display in the toast\n * @param options - Toast configuration options\n * @returns Unique key for the created toast\n */\n add: (content: ToastContent, options?: Partial<ToastOptions>) => string;\n\n /**\n * Close a specific toast by key\n * @param key - Unique identifier of the toast to close\n */\n close: (key: string) => void;\n\n /**\n * Close all toasts (visible and queued)\n */\n closeAll: () => void;\n\n /**\n * Pause all toast timers\n * Useful when user is interacting with the toast region\n */\n pauseAll: () => void;\n\n /**\n * Resume all paused toast timers\n */\n resumeAll: () => void;\n}\n\n// =============================================================================\n// Utility Types\n// =============================================================================\n\n/**\n * Configuration for the toast() function\n * Partial version of ToastOptions for convenience\n */\nexport type ToastConfig = Partial<ToastOptions>;\n\n/**\n * Return type of the toast() function\n */\nexport type ToastKey = string;\n","'use client';\n\n/**\n * ToastProvider Component\n * Provides toast queue context for the application\n *\n * @see toast-prd.md - Product Requirements Document\n * @see plan.md - Implementation Plan\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport { ToastQueue } from 'react-stately';\nimport type { ToastState, ToastProviderProps } from './Toast.types';\nimport { ToastProviderPropsSchema } from './Toast.types';\nimport { getInternalQueue } from './Toast';\n\n// =============================================================================\n// Context\n// =============================================================================\n\n/**\n * Context for the toast queue\n * Allows child components to access the toast queue state\n */\nexport const ToastContext = createContext<ToastQueue<ToastState> | null>(null);\n\n/**\n * Hook to access the toast queue from context\n * @returns The toast queue instance\n * @throws Error if used outside ToastProvider\n */\nexport function useToastQueue(): ToastQueue<ToastState> {\n const context = useContext(ToastContext);\n if (!context) {\n throw new Error('useToastQueue must be used within a ToastProvider');\n }\n return context;\n}\n\n// =============================================================================\n// Provider Component\n// =============================================================================\n\n/**\n * ToastProvider - Wraps application to provide toast functionality\n *\n * @example\n * ```tsx\n * <ToastProvider maxVisibleToasts={3}>\n * <App />\n * <Toaster position=\"bottom-right\" />\n * </ToastProvider>\n * ```\n */\nexport function ToastProvider({\n children,\n maxVisibleToasts = 3,\n}: ToastProviderProps): ReactNode {\n // Validate props with Zod schema (throws on invalid input)\n ToastProviderPropsSchema.parse({ maxVisibleToasts });\n\n // Create queue with configured maxVisibleToasts\n // Note: We use the global toastQueue for now for simplicity\n // In a more complex setup, we could create a new queue per provider\n const queue = useMemo(() => {\n // Get the internal queue instance\n // Note: maxVisibleToasts is set on the global queue, not per-provider\n return getInternalQueue();\n }, []);\n\n return (\n <ToastContext.Provider value={queue}>{children}</ToastContext.Provider>\n );\n}\n\nToastProvider.displayName = 'ToastProvider';\n","'use client';\n\n/**\n * Toaster Component - Toast region container\n * Renders visible toasts with positioning and accessibility attributes\n *\n * @see toast-prd.md - Product Requirements Document\n * @see plan.md - Implementation Plan\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)\n */\n\nimport { forwardRef, useRef, memo, useCallback, useSyncExternalStore, type ReactElement } from 'react';\nimport { useToastRegion } from 'react-aria';\nimport { useToastQueue as useAriaToastQueue } from 'react-stately';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { toasterVariants, getInternalQueue, ToastItem, getTotalActiveToasts, subscribeToTotalCount } from './Toast';\nimport type { ToasterProps } from './Toast.types';\nimport { ToasterPropsSchema } from './Toast.types';\n\n// =============================================================================\n// Stacked Toast Visual Effect\n// =============================================================================\n\ninterface StackedToastIndicatorProps {\n queuedCount: number;\n}\n\n/**\n * Visual stacking effect showing ghost toasts behind visible ones\n * Creates depth perception for queued notifications\n */\nfunction StackedToastIndicator({ queuedCount }: StackedToastIndicatorProps): ReactElement | null {\n if (queuedCount <= 0) return null;\n\n // Show up to 2 visual stack layers\n const stackLayers = Math.min(queuedCount, 2);\n\n return (\n <div className=\"relative w-[356px] pointer-events-none\" aria-hidden=\"true\">\n {/* Stack layer 1 (closest to visible toasts) */}\n <div\n className={cn(\n 'absolute left-1/2 -translate-x-1/2 w-[340px] h-4 rounded-lg shadow-lg',\n 'bg-[var(--content-background)] border border-[var(--border)]',\n 'opacity-60',\n 'transition-all duration-200'\n )}\n style={{ top: 0 }}\n />\n\n {/* Stack layer 2 (further back, if 2+ queued) */}\n {stackLayers >= 2 && (\n <div\n className={cn(\n 'absolute left-1/2 -translate-x-1/2 w-[324px] h-2 rounded-b-lg shadow-lg',\n 'bg-[var(--content-background)] border border-t-0 border-[var(--border)]',\n 'opacity-40',\n 'transition-all duration-200'\n )}\n style={{ top: 14 }}\n />\n )}\n\n {/* Spacer to account for stack height */}\n <div className=\"h-4\" />\n\n {/* Text indicator */}\n <div\n className=\"text-sm text-[var(--content-foreground)] opacity-70 text-center py-2 pointer-events-auto\"\n aria-live=\"polite\"\n >\n +{queuedCount} more notification{queuedCount > 1 ? 's' : ''}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Toaster Component\n// =============================================================================\n\n/**\n * Toaster - Toast region container\n * Renders the toast notification area with proper ARIA attributes\n *\n * @example\n * ```tsx\n * <ToastProvider>\n * <App />\n * <Toaster position=\"bottom-right\" aria-label=\"Notifications\" />\n * </ToastProvider>\n * ```\n */\nexport const Toaster = memo(\n forwardRef<HTMLDivElement, ToasterProps>((props, forwardedRef) => {\n // Validate props with Zod schema\n const validated = ToasterPropsSchema.parse(props);\n const {\n position = 'bottom-right',\n 'aria-label': ariaLabel = 'Notifications',\n className,\n } = validated;\n\n const internalRef = useRef<HTMLDivElement>(null);\n const ref = (forwardedRef as React.RefObject<HTMLDivElement>) || internalRef;\n\n // Use the global toast queue state\n const internalQueueRef = getInternalQueue();\n const state = useAriaToastQueue(internalQueueRef);\n\n // Subscribe to total toast count (includes queued toasts)\n const totalCount = useSyncExternalStore(\n subscribeToTotalCount,\n getTotalActiveToasts,\n getTotalActiveToasts\n );\n\n // React Aria toast region hook for accessibility\n const { regionProps } = useToastRegion(\n { 'aria-label': ariaLabel },\n state,\n ref\n );\n\n // Calculate queued toast count for collapsed stack indicator\n // totalCount = all toasts (visible + queued), visibleToasts.length = currently shown\n const queuedCount = Math.max(0, totalCount - state.visibleToasts.length);\n\n // Handle \"Clear All\" button click\n const handleClearAll = useCallback(() => {\n // Close all visible toasts\n state.visibleToasts.forEach((toast) => {\n state.close(toast.key);\n });\n }, [state]);\n\n // Don't render if no toasts\n if (state.visibleToasts.length === 0) {\n return null;\n }\n\n return (\n <div\n {...regionProps}\n ref={ref}\n className={cn(toasterVariants({ position }), className)}\n >\n {/* Toast list */}\n {state.visibleToasts.map((toast) => (\n <ToastItem key={toast.key} toast={toast} state={state} />\n ))}\n\n {/* Visual stacking effect with ghost toasts */}\n <StackedToastIndicator queuedCount={queuedCount} />\n\n {/* \"Clear All\" button (when 2+ toasts visible) */}\n {state.visibleToasts.length >= 2 && (\n <Button\n variant=\"secondary\"\n visualSize=\"sm\"\n onPress={handleClearAll}\n aria-label=\"Clear all notifications\"\n className=\"mt-2 pointer-events-auto\"\n >\n Clear All\n </Button>\n )}\n </div>\n );\n })\n);\n\nToaster.displayName = 'Toaster';\n","'use client';\n\n/**\n * AlertDialog Component\n *\n * A strict confirmation dialog for destructive or important actions.\n * Thin wrapper around the Modal component with role=\"alertdialog\".\n *\n * Unlike Modal (which is a flexible compound component), AlertDialog has a\n * fixed structure: title, optional description, optional children, and a\n * footer with cancel + action buttons. The footer is not customizable —\n * only the button labels, icons, and variants are configurable via props.\n *\n * Key differences from Modal:\n * - No backdrop dismiss (isDismissable: false)\n * - No Escape key dismiss (isKeyboardDismissDisabled: true)\n * - No close (X) button\n * - Fixed footer layout (cancel + action)\n * - Flat prop API instead of compound components\n *\n * WCAG 2.2 AAA compliant:\n * - role=\"alertdialog\" for screen reader announcements\n * - Focus trapped within dialog\n * - aria-labelledby linked to title\n * - aria-describedby linked to description\n * - All buttons use Themis Button (three-layer architecture, 44x44px touch targets)\n *\n * @example\n * ```tsx\n * <AlertDialog\n * trigger={<Button variant=\"destructive\">Delete</Button>}\n * title=\"Delete Account?\"\n * description=\"This action cannot be undone.\"\n * actionLabel=\"Delete Account\"\n * onAction={handleDelete}\n * />\n * ```\n */\n\nimport { type ReactElement } from 'react';\nimport {\n Modal,\n ModalTrigger,\n ModalContent,\n ModalHeader,\n ModalTitle,\n ModalDescription,\n ModalFooter,\n ModalClose,\n} from '../Modal/Modal';\nimport { Button } from '../Button/Button';\nimport type { AlertDialogProps } from './AlertDialog.types';\nimport { alertDialogContentVariants } from './AlertDialog.styles';\n\nexport function AlertDialog({\n trigger,\n isOpen,\n defaultOpen = false,\n onOpenChange,\n title,\n description,\n children,\n variant = 'default',\n size = 'md',\n cancelLabel = 'Cancel',\n cancelIcon,\n actionLabel,\n actionIcon,\n actionVariant = 'destructive',\n onAction,\n className,\n}: AlertDialogProps): ReactElement {\n // Map AlertDialog sizes to Modal sizes (AlertDialog uses sm/md/lg, Modal uses sm/md/lg/xl/full)\n const modalSize = size;\n\n return (\n <Modal\n role=\"alertdialog\"\n isOpen={isOpen}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n >\n <ModalTrigger>\n {trigger}\n </ModalTrigger>\n <ModalContent\n size={modalSize}\n isDismissable={false}\n isKeyboardDismissDisabled={true}\n showClose={false}\n animation=\"fade-zoom\"\n animationDuration={200}\n className={alertDialogContentVariants({ variant }) + (className ? ` ${className}` : '')}\n >\n <ModalHeader>\n <ModalTitle as=\"h2\">{title}</ModalTitle>\n {description && <ModalDescription>{description}</ModalDescription>}\n </ModalHeader>\n\n {children}\n\n <ModalFooter>\n <ModalClose>\n <Button variant=\"secondary\">\n {cancelIcon && <span className=\"mr-2\" aria-hidden=\"true\">{cancelIcon}</span>}\n {cancelLabel}\n </Button>\n </ModalClose>\n <ModalClose>\n <Button variant={actionVariant} onPress={onAction}>\n {actionIcon && <span className=\"mr-2\" aria-hidden=\"true\">{actionIcon}</span>}\n {actionLabel}\n </Button>\n </ModalClose>\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n\nAlertDialog.displayName = 'AlertDialog';\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * CVA Variants for AlertDialog content panel\n *\n * Only defines the destructive border variant. Base styling comes from\n * the underlying Modal component.\n */\nexport const alertDialogContentVariants = cva(\n 'border border-[var(--border)]',\n {\n variants: {\n variant: {\n default: '',\n destructive: 'border-[var(--destructive-background)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\n/**\n * Type exports for variant props\n */\nexport type AlertDialogContentVariantProps = VariantProps<typeof alertDialogContentVariants>;\n","'use client';\n\nimport { forwardRef, type ReactElement } from 'react';\nimport {\n ComboBox as AriaComboBox,\n Label as AriaLabel,\n Input as AriaInput,\n Button as AriaButton,\n Popover as AriaPopover,\n ListBox as AriaListBox,\n ListBoxItem as AriaListBoxItem,\n ListBoxSection as AriaListBoxSection,\n Header as AriaHeader,\n Text as AriaText,\n} from 'react-aria-components';\nimport { ChevronsUpDown, Check } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type {\n ComboboxProps,\n ComboboxItemProps,\n ComboboxSectionProps,\n} from './Combobox.types';\nimport {\n comboboxVariants,\n comboboxLabelVariants,\n comboboxInputVariants,\n comboboxTriggerWrapperVariants,\n comboboxButtonVariants,\n comboboxPopoverVariants,\n comboboxListBoxVariants,\n comboboxItemVariants,\n comboboxSectionVariants,\n comboboxSectionHeaderVariants,\n comboboxDescriptionVariants,\n comboboxErrorVariants,\n} from './Combobox.styles';\n\n// ============================================================================\n// Combobox\n// ============================================================================\n\n/**\n * Combobox Component\n *\n * A filterable select/autocomplete component built on React Aria's ComboBox.\n * Supports type-to-filter, keyboard navigation, and optional custom values.\n *\n * @example\n * ```tsx\n * <Combobox label=\"Framework\">\n * <ComboboxItem id=\"react\">React</ComboboxItem>\n * <ComboboxItem id=\"vue\">Vue</ComboboxItem>\n * <ComboboxItem id=\"angular\">Angular</ComboboxItem>\n * </Combobox>\n * ```\n */\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(\n (\n {\n className,\n size = 'default',\n label,\n description,\n errorMessage,\n isRequired,\n isDisabled,\n isReadOnly,\n placeholder,\n name,\n allowsCustomValue = false,\n menuTrigger = 'input',\n defaultInputValue,\n inputValue,\n defaultSelectedKey,\n selectedKey,\n onInputChange,\n onSelectionChange,\n children,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ): ReactElement => {\n // Warn if no accessible label\n if (process.env.NODE_ENV !== 'production') {\n if (!label && !ariaLabel && !ariaLabelledBy) {\n console.warn(\n '[Combobox] Either label, aria-label, or aria-labelledby is required for accessibility (WCAG 1.1.1)'\n );\n }\n }\n\n return (\n <AriaComboBox\n ref={ref}\n className={cn(comboboxVariants({ size }), className)}\n isRequired={isRequired}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n name={name}\n allowsCustomValue={allowsCustomValue}\n menuTrigger={menuTrigger}\n defaultInputValue={defaultInputValue}\n inputValue={inputValue}\n defaultSelectedKey={defaultSelectedKey}\n selectedKey={selectedKey}\n onInputChange={onInputChange}\n onSelectionChange={onSelectionChange}\n aria-label={!label ? ariaLabel : undefined}\n aria-labelledby={ariaLabelledBy}\n data-testid={dataTestId}\n {...props}\n >\n {label && (\n <AriaLabel className={comboboxLabelVariants({ size })}>\n {label}\n {isRequired && (\n <span className=\"text-[var(--destructive-background)] ml-1\" aria-hidden=\"true\">\n *\n </span>\n )}\n </AriaLabel>\n )}\n\n <div className={comboboxTriggerWrapperVariants({ size })}>\n <AriaInput\n className={comboboxInputVariants({ size })}\n placeholder={placeholder}\n />\n <AriaButton className={comboboxButtonVariants({ size })}>\n <ChevronsUpDown className=\"h-full w-full\" aria-hidden=\"true\" />\n </AriaButton>\n </div>\n\n {description && !errorMessage && (\n <AriaText slot=\"description\" className={comboboxDescriptionVariants({ size })}>\n {description}\n </AriaText>\n )}\n\n {errorMessage && (\n <AriaText slot=\"errorMessage\" className={comboboxErrorVariants({ size })}>\n {errorMessage}\n </AriaText>\n )}\n\n <AriaPopover className={comboboxPopoverVariants()}>\n <AriaListBox className={comboboxListBoxVariants()}>\n {children}\n </AriaListBox>\n </AriaPopover>\n </AriaComboBox>\n );\n }\n);\n\nCombobox.displayName = 'Combobox';\n\n// ============================================================================\n// ComboboxItem\n// ============================================================================\n\nexport function ComboboxItem({\n children,\n className,\n textValue,\n ...props\n}: ComboboxItemProps): ReactElement {\n // Compute textValue from string children if not explicitly provided\n const computedTextValue = textValue || (typeof children === 'string' ? children : undefined);\n\n return (\n <AriaListBoxItem\n className={cn(comboboxItemVariants({ size: 'default' }), className)}\n textValue={computedTextValue}\n {...props}\n >\n {({ isSelected }) => (\n <>\n <span className=\"flex-1\">{children}</span>\n {isSelected && (\n <Check className=\"h-4 w-4 shrink-0 text-[var(--primary)]\" aria-hidden=\"true\" />\n )}\n </>\n )}\n </AriaListBoxItem>\n );\n}\n\nComboboxItem.displayName = 'ComboboxItem';\n\n// ============================================================================\n// ComboboxSection\n// ============================================================================\n\nexport function ComboboxSection({\n header,\n children,\n className,\n}: ComboboxSectionProps): ReactElement {\n return (\n <AriaListBoxSection className={cn(comboboxSectionVariants(), className)}>\n {header && (\n <AriaHeader className={comboboxSectionHeaderVariants()}>\n {header}\n </AriaHeader>\n )}\n {children}\n </AriaListBoxSection>\n );\n}\n\nComboboxSection.displayName = 'ComboboxSection';\n","import { cva } from 'class-variance-authority';\n\nexport const comboboxVariants = cva(\n 'group flex flex-col gap-1.5 w-full',\n {\n variants: {\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const comboboxLabelVariants = cva(\n 'text-[var(--text-primary)] font-medium',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const comboboxInputVariants = cva(\n [\n 'flex-1 bg-transparent outline-none',\n 'placeholder:text-[var(--muted-foreground)]',\n 'disabled:cursor-not-allowed',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const comboboxTriggerWrapperVariants = cva(\n [\n 'flex items-center w-full rounded-md border',\n 'bg-[var(--input-background)] text-[var(--content-foreground)]',\n 'border-[var(--input-border)]',\n 'transition-colors duration-[var(--transition-fast)]',\n 'focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-[var(--ring-offset)]',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n 'data-[invalid]:border-[var(--destructive-background)]',\n ],\n {\n variants: {\n size: {\n sm: 'h-8 px-2 gap-1 min-h-[44px]',\n default: 'h-10 px-3 gap-2 min-h-[44px]',\n lg: 'h-12 px-4 gap-2 min-h-[44px]',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const comboboxButtonVariants = cva(\n [\n 'flex items-center justify-center shrink-0',\n 'text-[var(--muted-foreground)]',\n 'hover:text-[var(--text-primary)]',\n 'transition-colors',\n 'focus:outline-none',\n ],\n {\n variants: {\n size: {\n sm: 'h-4 w-4 min-h-[44px] min-w-[44px]',\n default: 'h-5 w-5 min-h-[44px] min-w-[44px]',\n lg: 'h-6 w-6 min-h-[44px] min-w-[44px]',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const comboboxPopoverVariants = cva(\n [\n 'w-[var(--trigger-width)] overflow-auto',\n 'rounded-md border border-[var(--border)]',\n 'bg-[var(--content-background)] text-[var(--content-foreground)]',\n 'shadow-md',\n 'data-[entering]:motion-safe:animate-in data-[entering]:motion-safe:fade-in-0',\n 'data-[exiting]:motion-safe:animate-out data-[exiting]:motion-safe:fade-out-0',\n ]\n);\n\nexport const comboboxListBoxVariants = cva(\n 'p-1 outline-none max-h-[300px] overflow-auto'\n);\n\nexport const comboboxItemVariants = cva(\n [\n 'flex items-center gap-2 w-full rounded-sm px-2 py-1.5',\n 'text-[var(--content-foreground)]',\n 'cursor-pointer outline-none',\n 'data-[focused]:bg-[var(--accent-background)] data-[focused]:text-[var(--accent-foreground)]',\n 'data-[selected]:font-medium',\n 'data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed',\n ],\n {\n variants: {\n size: {\n sm: 'text-xs min-h-[44px]',\n default: 'text-sm min-h-[44px]',\n lg: 'text-base min-h-[44px]',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const comboboxSectionVariants = cva('pt-1');\n\nexport const comboboxSectionHeaderVariants = cva(\n 'px-2 py-1.5 text-xs font-semibold text-[var(--muted-foreground)]'\n);\n\nexport const comboboxDescriptionVariants = cva(\n 'text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-xs',\n lg: 'text-sm',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const comboboxErrorVariants = cva(\n 'text-[var(--destructive-background)]',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-xs',\n lg: 'text-sm',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n","'use client';\n\nimport { forwardRef, useMemo, useCallback, type ReactElement } from 'react';\nimport { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button/Button';\nimport type { ButtonProps } from '../Button/Button.types';\nimport type { PaginationProps, PaginationVariant } from './Pagination.types';\nimport {\n paginationNavVariants,\n paginationEllipsisVariants,\n} from './Pagination.styles';\n\n/**\n * Generate page numbers array with ellipsis\n * Returns array like: [1, '...', 4, 5, 6, '...', 10]\n */\nfunction generatePageNumbers(\n currentPage: number,\n totalPages: number,\n siblingCount: number\n): (number | 'ellipsis-start' | 'ellipsis-end')[] {\n // Total page numbers to show (first + last + current + siblings + 2 ellipses)\n const totalPageNumbers = siblingCount * 2 + 5;\n\n // If total pages is less than the numbers we want to show, show all\n if (totalPages <= totalPageNumbers) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\n\n const showLeftEllipsis = leftSiblingIndex > 2;\n const showRightEllipsis = rightSiblingIndex < totalPages - 1;\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const leftRange = siblingCount * 2 + 3;\n const pages: (number | 'ellipsis-start' | 'ellipsis-end')[] = Array.from(\n { length: leftRange },\n (_, i) => i + 1\n );\n pages.push('ellipsis-end');\n pages.push(totalPages);\n return pages;\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const rightRange = siblingCount * 2 + 3;\n const pages: (number | 'ellipsis-start' | 'ellipsis-end')[] = [1, 'ellipsis-start'];\n for (let i = totalPages - rightRange + 1; i <= totalPages; i++) {\n pages.push(i);\n }\n return pages;\n }\n\n // Both ellipses\n const pages: (number | 'ellipsis-start' | 'ellipsis-end')[] = [1, 'ellipsis-start'];\n for (let i = leftSiblingIndex; i <= rightSiblingIndex; i++) {\n pages.push(i);\n }\n pages.push('ellipsis-end');\n pages.push(totalPages);\n return pages;\n}\n\n/**\n * Map Pagination variant to Button variant for inactive buttons\n */\nfunction getButtonVariant(paginationVariant: PaginationVariant, isActive: boolean): ButtonProps['variant'] {\n if (isActive) return 'default';\n if (paginationVariant === 'outline') return 'outline';\n return 'ghost';\n}\n\n/**\n * Map Pagination size to Button visualSize\n */\nfunction getButtonVisualSize(size: 'sm' | 'default' | 'lg'): ButtonProps['visualSize'] {\n if (size === 'sm') return 'sm';\n if (size === 'lg') return 'lg';\n return 'default';\n}\n\n/**\n * Pagination Component\n *\n * Navigation for paginated content with page numbers, prev/next,\n * and first/last buttons. Uses the Themis Button component for\n * three-layer architecture and WCAG 2.2 AAA 44x44px touch targets.\n *\n * @example\n * ```tsx\n * <Pagination\n * page={currentPage}\n * totalPages={10}\n * onPageChange={setCurrentPage}\n * />\n * ```\n */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n (\n {\n page,\n totalPages,\n onPageChange,\n size = 'default',\n variant = 'default',\n siblingCount = 1,\n showFirstLast = true,\n showPrevNext = true,\n isDisabled = false,\n labels,\n className,\n 'aria-label': ariaLabel,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ): ReactElement => {\n const resolvedLabels = {\n previous: labels?.previous ?? 'Previous',\n next: labels?.next ?? 'Next',\n first: labels?.first ?? 'First page',\n last: labels?.last ?? 'Last page',\n page: labels?.page ?? 'Page',\n of: labels?.of ?? 'of',\n };\n\n const pages = useMemo(\n () => generatePageNumbers(page, totalPages, siblingCount),\n [page, totalPages, siblingCount]\n );\n\n const handlePageChange = useCallback(\n (newPage: number) => {\n if (newPage >= 1 && newPage <= totalPages && newPage !== page) {\n onPageChange(newPage);\n }\n },\n [page, totalPages, onPageChange]\n );\n\n const isFirstPage = page === 1;\n const isLastPage = page === totalPages;\n const visualSize = getButtonVisualSize(size);\n\n return (\n <nav\n ref={ref as React.Ref<HTMLElement>}\n aria-label={ariaLabel ?? 'Pagination'}\n className={cn(paginationNavVariants({ size }), className)}\n data-testid={dataTestId}\n {...props}\n >\n {/* First Page Button */}\n {showFirstLast && (\n <Button\n variant={getButtonVariant(variant, false)}\n visualSize=\"icon\"\n isDisabled={isDisabled || isFirstPage}\n aria-label={resolvedLabels.first}\n onPress={() => handlePageChange(1)}\n >\n <ChevronsLeft aria-hidden=\"true\" />\n </Button>\n )}\n\n {/* Previous Button */}\n {showPrevNext && (\n <Button\n variant={getButtonVariant(variant, false)}\n visualSize=\"icon\"\n isDisabled={isDisabled || isFirstPage}\n aria-label={resolvedLabels.previous}\n onPress={() => handlePageChange(page - 1)}\n >\n <ChevronLeft aria-hidden=\"true\" />\n </Button>\n )}\n\n {/* Page Numbers */}\n {pages.map((pageItem) => {\n if (pageItem === 'ellipsis-start' || pageItem === 'ellipsis-end') {\n return (\n <span\n key={pageItem}\n className={paginationEllipsisVariants({ size })}\n aria-hidden=\"true\"\n >\n ...\n </span>\n );\n }\n\n const isActive = pageItem === page;\n return (\n <Button\n key={pageItem}\n variant={getButtonVariant(variant, isActive)}\n visualSize={visualSize}\n isDisabled={isDisabled || isActive}\n aria-label={`${resolvedLabels.page} ${pageItem}`}\n aria-current={isActive ? 'page' : undefined}\n onPress={() => handlePageChange(pageItem)}\n >\n {pageItem}\n </Button>\n );\n })}\n\n {/* Next Button */}\n {showPrevNext && (\n <Button\n variant={getButtonVariant(variant, false)}\n visualSize=\"icon\"\n isDisabled={isDisabled || isLastPage}\n aria-label={resolvedLabels.next}\n onPress={() => handlePageChange(page + 1)}\n >\n <ChevronRight aria-hidden=\"true\" />\n </Button>\n )}\n\n {/* Last Page Button */}\n {showFirstLast && (\n <Button\n variant={getButtonVariant(variant, false)}\n visualSize=\"icon\"\n isDisabled={isDisabled || isLastPage}\n aria-label={resolvedLabels.last}\n onPress={() => handlePageChange(totalPages)}\n >\n <ChevronsRight aria-hidden=\"true\" />\n </Button>\n )}\n\n {/* Screen reader announcement for page context */}\n <span className=\"sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {resolvedLabels.page} {page} {resolvedLabels.of} {totalPages}\n </span>\n </nav>\n );\n }\n);\n\nPagination.displayName = 'Pagination';\n","import { cva } from 'class-variance-authority';\n\nexport const paginationNavVariants = cva(\n 'flex items-center justify-center',\n {\n variants: {\n size: {\n sm: 'gap-0.5',\n default: 'gap-1',\n lg: 'gap-1.5',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const paginationEllipsisVariants = cva(\n 'inline-flex items-center justify-center text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'h-8 w-8 text-xs',\n default: 'h-10 w-10 text-sm',\n lg: 'h-12 w-12 text-base',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\nexport const paginationInfoVariants = cva(\n 'text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n","'use client';\n\n/**\n * SearchField Component\n *\n * A specialized search input built on the Themis TextField component.\n * Delegates all rendering and behavior to TextField with type=\"search\",\n * which provides search icon, clear button (Themis Button), and keyboard support.\n *\n * WCAG 2.2 AAA compliant:\n * - 44x44px touch targets on all interactive elements (via Themis Button)\n * - Clear button uses Themis Button three-layer architecture\n * - Escape key clears input\n * - Enter key submits search\n * - role=\"searchbox\" via type=\"search\"\n *\n * @example\n * ```tsx\n * <SearchField\n * label=\"Search\"\n * placeholder=\"Search items...\"\n * onSubmit={(value) => console.log('Search:', value)}\n * />\n * ```\n */\n\nimport { forwardRef } from 'react';\nimport { TextField } from '../TextField/TextField';\nimport type { SearchFieldProps } from './SearchField.types';\n\nexport const SearchField = forwardRef<HTMLDivElement, SearchFieldProps>(\n (\n {\n label,\n description,\n errorMessage,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...props\n },\n ref\n ) => {\n // Warn if no accessible label is provided\n if (process.env.NODE_ENV !== 'production') {\n if (!label && !ariaLabel && !ariaLabelledBy) {\n console.warn(\n '[SearchField] Either label, aria-label, or aria-labelledby is required for accessibility (WCAG 1.1.1)'\n );\n }\n }\n\n return (\n <TextField\n ref={ref}\n type=\"search\"\n label={label}\n description={errorMessage ? undefined : description}\n errorMessage={errorMessage}\n isInvalid={!!errorMessage}\n aria-label={!label ? ariaLabel : undefined}\n aria-labelledby={ariaLabelledBy}\n {...props}\n />\n );\n }\n);\n\nSearchField.displayName = 'SearchField';\n","/**\n * SearchField CVA Variant Styles\n *\n * Note: Most styling is delegated to the underlying TextField component.\n * These variants are kept for consumers who need direct access to\n * SearchField-specific style tokens.\n */\n\nimport { cva } from 'class-variance-authority';\n\n/**\n * Root wrapper variant styles\n */\nexport const searchFieldVariants = cva(\n 'group flex flex-col gap-1.5 w-full',\n {\n variants: {\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\n/**\n * Label variant styles\n */\nexport const searchFieldLabelVariants = cva(\n 'text-[var(--text-primary)] font-medium',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\n/**\n * Description text variant styles\n */\nexport const searchFieldDescriptionVariants = cva(\n 'text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-xs',\n lg: 'text-sm',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\n/**\n * Error message variant styles\n */\nexport const searchFieldErrorVariants = cva(\n 'text-[var(--destructive-background)]',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-xs',\n lg: 'text-sm',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n","'use client';\n\n/**\n * PasswordField Component\n *\n * A specialized password input built on the Themis TextField component.\n * Delegates all rendering and behavior to TextField with type=\"password\",\n * which provides show/hide toggle (Themis Button) and password-specific defaults.\n *\n * WCAG 2.2 AAA compliant:\n * - 44x44px touch targets on toggle button (via Themis Button)\n * - Toggle button uses Themis Button three-layer architecture\n * - aria-label on toggle button updates with state\n * - autoComplete defaults to 'current-password' for password manager support\n *\n * @example\n * ```tsx\n * <PasswordField\n * label=\"Password\"\n * placeholder=\"Enter your password\"\n * isRequired\n * />\n * ```\n */\n\nimport { forwardRef } from 'react';\nimport { TextField } from '../TextField/TextField';\nimport type { PasswordFieldProps } from './PasswordField.types';\n\nexport const PasswordField = forwardRef<HTMLDivElement, PasswordFieldProps>(\n (\n {\n label,\n description,\n errorMessage,\n successMessage,\n hasToggle = true,\n autoComplete = 'current-password',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...props\n },\n ref\n ) => {\n // Warn if no accessible label is provided\n if (process.env.NODE_ENV !== 'production') {\n if (!label && !ariaLabel && !ariaLabelledBy) {\n console.warn(\n '[PasswordField] Either label, aria-label, or aria-labelledby is required for accessibility (WCAG 1.1.1)'\n );\n }\n }\n\n const isInvalid = !!errorMessage;\n\n return (\n <TextField\n ref={ref}\n type=\"password\"\n showPasswordToggle={hasToggle}\n autoComplete={autoComplete}\n label={label}\n description={isInvalid ? undefined : description}\n errorMessage={errorMessage}\n successMessage={isInvalid ? undefined : successMessage}\n isInvalid={isInvalid}\n isValid={!!successMessage && !isInvalid}\n aria-label={!label ? ariaLabel : undefined}\n aria-labelledby={ariaLabelledBy}\n {...props}\n />\n );\n }\n);\n\nPasswordField.displayName = 'PasswordField';\n","/**\n * PasswordField CVA Variant Styles\n *\n * Note: Most styling is delegated to the underlying TextField component.\n * These variants are kept for consumers who need direct access to\n * PasswordField-specific style tokens.\n */\n\nimport { cva } from 'class-variance-authority';\n\n/**\n * Root wrapper variant styles\n */\nexport const passwordFieldVariants = cva(\n 'group flex flex-col gap-1.5 w-full',\n {\n variants: {\n size: {\n sm: '',\n default: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\n/**\n * Label variant styles\n */\nexport const passwordFieldLabelVariants = cva(\n 'text-[var(--text-primary)] font-medium',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\n/**\n * Description text variant styles\n */\nexport const passwordFieldDescriptionVariants = cva(\n 'text-[var(--muted-foreground)]',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-xs',\n lg: 'text-sm',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n\n/**\n * Error message variant styles\n */\nexport const passwordFieldErrorVariants = cva(\n 'text-[var(--destructive-background)]',\n {\n variants: {\n size: {\n sm: 'text-xs',\n default: 'text-xs',\n lg: 'text-sm',\n },\n },\n defaultVariants: { size: 'default' },\n }\n);\n"]}
|