@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.mjs"}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Avatar/Avatar.tsx","../../../src/elements/Avatar/AvatarGroup.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Avatar/Avatar.types.ts"],"names":["cn","inputs","twMerge","clsx","getInitials","name","parts","firstPart","lastPart","first","last","avatarOuterVariants","cva","avatarVisualVariants","Avatar","memo","forwardRef","src","alt","size","shape","status","onPress","className","id","dataTestId","ariaLabel","ariaLabelledBy","ariaDescribedBy","_groupIndex","ref","loadingState","setLoadingState","useState","handleImageLoad","useCallback","handleImageError","initials","isInteractive","computedAriaLabel","groupBrightness","visualContent","jsxs","jsx","AriaButton","OVERLAP_CLASS_BY_SIZE","avatarOverflowVariants","avatarGroupVariants","AvatarGroup","max","children","childArray","Children","totalCount","visibleCount","overflowCount","isGroupInteractive","overlapClass","child","isValidElement","visibleAvatars","index","childProps","zIndex","individualOnPress","cloneElement","overflowIndicator","groupContent","Fragment","BaseComponentPropsSchema","z","AvatarSizeSchema","AvatarShapeSchema","AvatarStatusSchema","AVATAR_OVERLAP_BY_SIZE","AvatarPropsSchema","AvatarGroupPropsSchema"],"mappings":"uTAcO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAA8B,CAClD,OAAOC,OAAAA,CAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCkBA,SAASG,EAAAA,CAAYC,CAAAA,CAAkC,CACrD,GAAI,CAACA,CAAAA,EAAQ,CAACA,CAAAA,CAAK,IAAA,EAAK,CAAG,OAAO,EAAA,CAElC,IAAMC,CAAAA,CAAQD,CAAAA,CAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CACrD,GAAIC,CAAAA,CAAM,MAAA,GAAW,CAAA,CAAG,OAAO,EAAA,CAE/B,IAAMC,CAAAA,CAAYD,CAAAA,CAAM,CAAC,CAAA,CACzB,GAAIA,CAAAA,CAAM,MAAA,GAAW,CAAA,CACnB,OAAOC,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CAAI,EAAA,CAIzD,IAAMC,CAAAA,CAAWF,CAAAA,CAAMA,CAAAA,CAAM,MAAA,CAAS,CAAC,CAAA,CACjCG,CAAAA,CAAQF,CAAAA,CAAYA,CAAAA,CAAU,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CAAI,EAAA,CACxDG,CAAAA,CAAOF,CAAAA,CAAWA,CAAAA,CAAS,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,CAAI,EAAA,CAC3D,OAAOC,CAAAA,CAAQC,CACjB,CAOO,IAAMC,CAAAA,CAAsBC,GAAAA,CACjC,kDAAA,CACA,CACE,QAAA,CAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,2BAAA,CACJ,OAAA,CAAS,2BAAA,CACT,EAAA,CAAI,2BACN,CAAA,CACA,WAAA,CAAa,CACX,IAAA,CAAM,CACJ,gBAAA,CACA,4BAAA,CACA,sBAAA,CACA,kCAAA,CACA,6BAAA,CACA,oDAAA,CACA,kCAAA,CACA,0BAAA,CACA,sBAAA,CACA,6BACF,CAAA,CACA,KAAA,CAAO,EACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,IAAA,CAAM,SAAA,CACN,WAAA,CAAa,KACf,CACF,CACF,CAAA,CAMaC,CAAAA,CAAuBD,GAAAA,CAClC,CACE,kDAAA,CACA,iBAAA,CACA,+BAAA,CACA,iCAAA,CACA,aAAA,CACA,aACF,CAAA,CACA,CACE,QAAA,CAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,iBAAA,CACJ,OAAA,CAAS,mBAAA,CACT,EAAA,CAAI,qBACN,CAAA,CACA,KAAA,CAAO,CACL,MAAA,CAAQ,cAAA,CACR,OAAA,CAAS,YACX,CAAA,CACA,MAAA,CAAQ,CACN,MAAA,CAAQ,gDAAA,CACR,OAAA,CAAS,iDAAA,CACT,IAAA,CAAM,8CAAA,CACN,IAAA,CAAM,8CACR,CACF,CAAA,CACA,eAAA,CAAiB,CACf,IAAA,CAAM,SAAA,CACN,KAAA,CAAO,QACT,CACF,CACF,CAAA,CAUME,CAAAA,CAASC,IAAAA,CACbC,UAAAA,CACE,CACE,CACE,GAAA,CAAAC,CAAAA,CACA,GAAA,CAAAC,CAAAA,CACA,IAAA,CAAAb,EACA,IAAA,CAAAc,CAAAA,CAAO,SAAA,CACP,KAAA,CAAAC,CAAAA,CAAQ,QAAA,CACR,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,EAAA,CAAAC,CAAAA,CACA,aAAA,CAAeC,CAAAA,CACf,YAAA,CAAcC,CAAAA,CACd,iBAAA,CAAmBC,CAAAA,CACnB,kBAAA,CAAoBC,CAAAA,CACpB,WAAA,CAAAC,CACF,CAAA,CACAC,CAAAA,GACiB,CAEjB,GAAM,CAACC,CAAAA,CAAcC,CAAe,CAAA,CAAIC,SACtChB,CAAAA,CAAM,SAAA,CAAY,OACpB,CAAA,CAEMiB,CAAAA,CAAkBC,WAAAA,CAAY,IAAM,CACxCH,CAAAA,CAAgB,QAAQ,EAC1B,CAAA,CAAG,EAAE,CAAA,CAECI,CAAAA,CAAmBD,WAAAA,CAAY,IAAM,CACzCH,CAAAA,CAAgB,OAAO,EACzB,CAAA,CAAG,EAAE,CAAA,CAECK,CAAAA,CAAWjC,EAAAA,CAAYC,CAAI,CAAA,CAC3BiC,CAAAA,CAAgB,CAAA,CAAQhB,CAAAA,CAGxBiB,CAAAA,CACJb,CAAAA,GACCY,CAAAA,EAAiBjB,CAAAA,CAAS,CAAA,EAAGH,CAAG,CAAA,EAAA,EAAKG,CAAM,CAAA,CAAA,CAAK,MAAA,CAAA,CAI7CmB,CAAAA,CACJX,CAAAA,GAAgB,MAAA,CAAY,CAAA,CAAIA,CAAAA,CAAc,GAAA,CAAO,MAAA,CAGjDY,CAAAA,CACJC,IAAAA,CAAC,KAAA,CAAA,CACC,aAAA,CAAY,eAAA,CACZ,SAAA,CAAW1C,CAAAA,CAAGa,CAAAA,CAAqB,CAAE,IAAA,CAAAM,CAAAA,CAAM,KAAA,CAAAC,CAAAA,CAAO,MAAA,CAAAC,CAAO,CAAC,CAAC,CAAA,CAC3D,KAAA,CAAOmB,CAAAA,GAAoB,MAAA,CAAY,CAAE,MAAA,CAAQ,CAAA,WAAA,EAAcA,CAAe,CAAA,CAAA,CAAI,CAAA,CAAI,MAAA,CAKrF,QAAA,CAAA,CAAAT,CAAAA,GAAiB,SAAA,EAChBY,GAAAA,CAAC,KAAA,CAAA,CACC,aAAA,CAAY,iBAAA,CACZ,SAAA,CAAW3C,CAAAA,CACT,8DAAA,CACAoB,CAAAA,GAAU,QAAA,CAAW,cAAA,CAAiB,YACxC,CAAA,CACA,aAAA,CAAY,MAAA,CACd,CAAA,CAIDH,CAAAA,EAAOc,IAAiB,OAAA,EAEvBY,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK1B,CAAAA,CACL,GAAA,CAAKqB,CAAAA,CAAgB,EAAA,CAAKpB,CAAAA,CAC1B,MAAA,CAAQgB,CAAAA,CACR,OAAA,CAASE,CAAAA,CACT,SAAA,CAAWpC,CAAAA,CACT,4BAAA,CACA+B,CAAAA,GAAiB,SAAA,EAAa,WAChC,CAAA,CACF,CAAA,CAIDA,CAAAA,GAAiB,OAAA,EAAWM,CAAAA,EAC3BM,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAA,CAAY,MAAA,CAAQ,QAAA,CAAAN,CAAAA,CAAS,CAAA,CAAA,CAEvC,CAAA,CAIF,OAAIC,CAAAA,CAEAK,GAAAA,CAACC,MAAAA,CAAA,CACC,GAAA,CAAKd,CAAAA,CACL,EAAA,CAAIN,CAAAA,CACJ,aAAA,CAAaC,CAAAA,EAAc,cAAA,CAC3B,YAAA,CAAYc,CAAAA,EAAqBrB,CAAAA,CACjC,iBAAA,CAAiBS,CAAAA,CACjB,kBAAA,CAAkBC,CAAAA,CAClB,OAAA,CAASN,CAAAA,CACT,SAAA,CAAWtB,CAAAA,CACTW,CAAAA,CAAoB,CAAE,IAAA,CAAAQ,CAAAA,CAAM,WAAA,CAAa,IAAK,CAAC,CAAA,CAC/CI,CACF,CAAA,CAEC,QAAA,CAAAkB,CAAAA,CACH,CAAA,CAMFE,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKb,CAAAA,CACL,EAAA,CAAIN,CAAAA,CACJ,aAAA,CAAaC,CAAAA,EAAc,cAAA,CAC3B,YAAA,CAAYC,CAAAA,CACZ,iBAAA,CAAiBC,CAAAA,CACjB,kBAAA,CAAkBC,CAAAA,CAClB,SAAA,CAAW5B,CAAAA,CACTW,CAAAA,CAAoB,CAAE,IAAA,CAAAQ,CAAAA,CAAM,WAAA,CAAa,KAAM,CAAC,CAAA,CAChDI,CACF,CAAA,CAEC,QAAA,CAAAkB,CAAAA,CACH,CAEJ,CACF,CACF,EAEA3B,CAAAA,CAAO,WAAA,CAAc,QAAA,CCxOrB,IAAM+B,EAAAA,CAAoD,CACxD,EAAA,CAAI,OAAA,CACJ,OAAA,CAAS,OAAA,CACT,EAAA,CAAI,OACN,CAAA,CAKMC,CAAAA,CAAyBlC,GAAAA,CAC7B,CACE,kDAAA,CACA,uBAAA,CACA,oCAAA,CACA,eAAA,CACA,aAAA,CACA,0CACF,CAAA,CACA,CACE,QAAA,CAAU,CACR,IAAA,CAAM,CACJ,EAAA,CAAI,iBAAA,CACJ,OAAA,CAAS,mBAAA,CACT,EAAA,CAAI,qBACN,EACA,KAAA,CAAO,CACL,MAAA,CAAQ,cAAA,CACR,OAAA,CAAS,YACX,CACF,CAAA,CACA,eAAA,CAAiB,CACf,IAAA,CAAM,SAAA,CACN,KAAA,CAAO,QACT,CACF,CACF,CAAA,CAKMmC,CAAAA,CAAsBnC,GAAAA,CAAI,0BAAA,CAA4B,CAC1D,QAAA,CAAU,CACR,WAAA,CAAa,CACX,IAAA,CAAM,CACJ,gBAAA,CACA,4BAAA,CACA,sBAAA,CACA,kCAAA,CACA,6BAAA,CACA,oDACF,CAAA,CACA,KAAA,CAAO,EACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,WAAA,CAAa,KACf,CACF,CAAC,CAAA,CAMKoC,CAAAA,CAAcjC,IAAAA,CAClBC,UAAAA,CACE,CACE,CACE,GAAA,CAAAiC,CAAAA,CAAM,CAAA,CACN,KAAA,CAAA7B,CAAAA,CAAQ,QAAA,CACR,IAAA,CAAAD,CAAAA,CAAO,SAAA,CACP,OAAA,CAAAG,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,QAAA,CAAA2B,EACA,EAAA,CAAA1B,CAAAA,CACA,aAAA,CAAeC,CAAAA,CACf,YAAA,CAAcC,CAAAA,CACd,iBAAA,CAAmBC,CAAAA,CACnB,kBAAA,CAAoBC,CACtB,CAAA,CACAE,CAAAA,GACiB,CACjB,IAAMqB,CAAAA,CAAaC,QAAAA,CAAS,OAAA,CAAQF,CAAQ,CAAA,CACtCG,CAAAA,CAAaF,CAAAA,CAAW,MAAA,CACxBG,CAAAA,CAAe,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAYJ,CAAG,CAAA,CACvCM,CAAAA,CAAgBF,CAAAA,CAAaC,CAAAA,CAE7BE,CAAAA,CAAqB,EAAQlC,CAAAA,CAC7BmC,CAAAA,CAAeZ,EAAAA,CAAsB1B,CAAI,CAAA,CAI3C,OAAA,CAAQ,GAAA,CAAI,QAAA,GAAa,YAAA,EAAgBqC,CAAAA,EAC3CJ,QAAAA,CAAS,OAAA,CAAQF,CAAAA,CAAWQ,CAAAA,EAAU,CAElCC,cAAAA,CAAeD,CAAK,CAAA,EACnBA,CAAAA,CAAM,KAAA,CAAgC,OAAA,EAEvC,OAAA,CAAQ,IAAA,CACN,0KAEF,EAEJ,CAAC,CAAA,CAIH,IAAME,CAAAA,CAAiBT,CAAAA,CAAW,KAAA,CAAM,CAAA,CAAGG,CAAY,CAAA,CAAE,GAAA,CAAI,CAACI,CAAAA,CAAOG,CAAAA,GAAU,CAC7E,GAAI,CAACF,cAAAA,CAAeD,CAAK,CAAA,CAAG,OAAO,IAAA,CAGnC,IAAMI,CAAAA,CAAaJ,CAAAA,CAAM,KAAA,CAQnBK,CAAAA,CAAST,CAAAA,CAAeO,CAAAA,CAIxBG,CAAAA,CAAoBR,CAAAA,CACtB,MAAA,CACAM,CAAAA,CAAW,OAAA,CAEf,OACEnB,GAAAA,CAAC,KAAA,CAAA,CAEC,aAAA,CAAY,mBAAA,CACZ,SAAA,CAAW3C,CAAAA,CACT,UAAA,CAEA,0CAAA,CACAoB,CAAAA,GAAU,QAAA,CAAW,cAAA,CAAiB,YAAA,CAEtCyC,CAAAA,CAAQ,CAAA,EAAKJ,CAAAA,CAGb,CAACD,CAAAA,EAAsB,CACrB,kCAAA,CACA,0BAAA,CACA,sBAAA,CACA,gCAAA,CACA,wBACF,CACF,CAAA,CACA,KAAA,CAAO,CAAE,MAAA,CAAAO,CAAO,CAAA,CAEf,QAAA,CAAAE,YAAAA,CAAaP,CAAAA,CAAuB,CACnC,IAAA,CAAAvC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAEA,QAAS4C,CAAAA,CAET,WAAA,CAAaH,CAAAA,CAEb,SAAA,CAAW7D,CAAAA,CACT8D,CAAAA,CAAW,SAAA,CAEX,mBACF,CACF,CAA+B,CAAA,CAAA,CAlC1BD,CAmCP,CAEJ,CAAC,CAAA,CAGKK,CAAAA,CACJX,CAAAA,CAAgB,CAAA,CACdb,IAAAA,CAAC,KAAA,CAAA,CACC,aAAA,CAAY,iBAAA,CACZ,SAAA,CAAW1C,CAAAA,CACT8C,CAAAA,CAAuB,CAAE,IAAA,CAAA3B,CAAAA,CAAM,KAAA,CAAAC,CAAM,CAAC,CAAA,CACtCqC,CACF,CAAA,CACA,KAAA,CAAO,CAAE,MAAA,CAAQ,CAAE,CAAA,CACnB,aAAA,CAAY,MAAA,CACb,QAAA,CAAA,CAAA,GAAA,CACGF,CAAAA,CAAAA,CACJ,CAAA,CACE,IAAA,CAGAhB,CAAAA,CACJb,CAAAA,EACA,CAAA,EAAG2B,CAAU,CAAA,CAAA,EAAIA,CAAAA,GAAe,CAAA,CAAI,QAAA,CAAW,SAAS,CAAA,CAAA,CAGpDc,CAAAA,CACJzB,IAAAA,CAAA0B,QAAAA,CAAA,CACG,QAAA,CAAA,CAAAR,CAAAA,CACAM,CAAAA,CAAAA,CACH,CAAA,CAKF,OAAIV,CAAAA,CAEAb,IAACC,MAAAA,CAAA,CACC,GAAA,CAAKd,CAAAA,CACL,EAAA,CAAIN,CAAAA,CACJ,aAAA,CAAaC,CAAAA,CACb,YAAA,CAAYc,CAAAA,CACZ,iBAAA,CAAiBZ,CAAAA,CACjB,kBAAA,CAAkBC,CAAAA,CAClB,OAAA,CAASN,CAAAA,CACT,SAAA,CAAWtB,CAAAA,CAAG+C,CAAAA,CAAoB,CAAE,WAAA,CAAa,IAAK,CAAC,CAAA,CAAGxB,CAAS,CAAA,CAElE,QAAA,CAAA4C,CAAAA,CACH,CAAA,CAMFxB,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAKb,CAAAA,CACL,EAAA,CAAIN,CAAAA,CACJ,aAAA,CAAaC,CAAAA,CACb,IAAA,CAAK,OAAA,CACL,YAAA,CAAYc,CAAAA,CACZ,iBAAA,CAAiBZ,CAAAA,CACjB,kBAAA,CAAkBC,CAAAA,CAClB,SAAA,CAAW5B,CAAAA,CAAG+C,CAAAA,CAAoB,CAAE,WAAA,CAAa,KAAM,CAAC,CAAA,CAAGxB,CAAS,CAAA,CAEnE,QAAA,CAAA4C,CAAAA,CACH,CAEJ,CACF,CACF,EAEAnB,CAAAA,CAAY,WAAA,CAAc,aAAA,CCpQnB,IAAMqB,CAAAA,CAA2BC,CAAAA,CAAE,MAAA,CAAO,CAE/C,SAAA,CAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAG/B,QAAA,CAAUA,CAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS,CAC3B,EAAA,CAAIA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAGxB,YAAA,CAAcA,CAAAA,CAAE,QAAO,CAAE,QAAA,EAAS,CAClC,iBAAA,CAAmBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CACvC,kBAAA,CAAoBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CACxC,WAAA,CAAaA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,CAAO,QAAA,CAAU,WAAW,CAAC,CAAA,CAAE,QAAA,EAAS,CAC7D,aAAA,CAAeA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS,CAGpC,cAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAC5B,CAAC,CAAA,CCXM,IAAMC,CAAAA,CAAmBD,CAAAA,CAAE,IAAA,CAAK,CAAC,IAAA,CAAM,SAAA,CAAW,IAAI,CAAC,CAAA,CAQjDE,CAAAA,CAAoBF,CAAAA,CAAE,IAAA,CAAK,CAAC,QAAA,CAAU,SAAS,CAAC,CAAA,CAYhDG,CAAAA,CAAqBH,CAAAA,CAAE,IAAA,CAAK,CAAC,QAAA,CAAU,SAAA,CAAW,MAAA,CAAQ,MAAM,CAAC,CAAA,CAOjEI,EAAAA,CAAqD,CAChE,EAAA,CAAI,CAAA,CACJ,OAAA,CAAS,EAAA,CACT,EAAA,CAAI,EACN,CAAA,CAUaC,EAAAA,CAAoBN,CAAAA,CAAyB,MAAA,CAAO,CAE/D,GAAA,CAAKC,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,CAMzB,GAAA,CAAKA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAA,CAAG,mCAAmC,CAAA,CAQ1D,IAAA,CAAMA,CAAAA,CAAE,QAAO,CAAE,QAAA,EAAS,CAG1B,IAAA,CAAMC,CAAAA,CAAiB,QAAA,EAAS,CAAE,OAAA,CAAQ,SAAS,CAAA,CAGnD,KAAA,CAAOC,CAAAA,CAAkB,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,CAAA,CAGpD,MAAA,CAAQC,CAAAA,CAAmB,QAAA,EAAS,CAOpC,OAAA,CAASH,CAAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EACxB,CAAC,CAAA,CAoBYM,EAAAA,CAAyBP,CAAAA,CAAyB,MAAA,CAAO,CAKpE,GAAA,CAAKC,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,CAAC,CAAA,CAMrD,KAAA,CAAOE,CAAAA,CAAkB,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,CAAA,CAOpD,IAAA,CAAMD,CAAAA,CAAiB,QAAA,EAAS,CAAE,OAAA,CAAQ,SAAS,CAAA,CAOnD,OAAA,CAASD,CAAAA,CAAE,QAAA,EAAS,CAAE,QAAA,EACxB,CAAC","file":"index.mjs","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","'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","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","import { z } from 'zod';\nimport type { PressEvent } from 'react-aria-components';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * Avatar size schema\n *\n * Size mappings (visual | touch target | overlap):\n * - sm: 32px | 44x44px | 8px\n * - default: 44px | 44x44px | 12px\n * - lg: 48px | 48x48px | 16px\n *\n * @see plan.md Clarification 6 (Overlap Scale)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 44x44px touch targets)\n */\nexport const AvatarSizeSchema = z.enum(['sm', 'default', 'lg']);\nexport type AvatarSize = z.infer<typeof AvatarSizeSchema>;\n\n/**\n * Avatar shape schema\n * - circle: Fully rounded (rounded-full)\n * - rounded: Rounded corners (rounded-lg)\n */\nexport const AvatarShapeSchema = z.enum(['circle', 'rounded']);\nexport type AvatarShape = z.infer<typeof AvatarShapeSchema>;\n\n/**\n * Avatar status schema for ring indicators\n *\n * Status ring colors:\n * - online: green (#22c55e)\n * - offline: gray (#6b7280)\n * - busy: red (#ef4444)\n * - away: yellow (#eab308)\n */\nexport const AvatarStatusSchema = z.enum(['online', 'offline', 'busy', 'away']);\nexport type AvatarStatus = z.infer<typeof AvatarStatusSchema>;\n\n/**\n * Overlap values by size (in pixels)\n * @see plan.md Clarification 6 (Overlap Scale)\n */\nexport const AVATAR_OVERLAP_BY_SIZE: Record<AvatarSize, number> = {\n sm: 8,\n default: 12,\n lg: 16,\n};\n\n/**\n * Avatar props schema extending BaseComponentProps\n *\n * @see React Aria Button: https://react-aria.adobe.com/Button\n * @see ShadCN Avatar: https://ui.shadcn.com/docs/components/avatar\n * @see plan.md Phase 1 (Type System)\n * @see constitution.md Principle IV (Accessibility First)\n */\nexport const AvatarPropsSchema = BaseComponentPropsSchema.extend({\n /** Image source URL */\n src: z.string().optional(),\n\n /**\n * Alt text for the avatar image (required for accessibility)\n * When actionable, this is used for the aria-label\n */\n alt: z.string().min(1, 'alt is required for accessibility'),\n\n /**\n * Name used to generate initials fallback\n * - \"Jane Doe\" → \"JD\"\n * - \"Jane\" → \"J\"\n * - \"Jane Marie Doe\" → \"JD\" (first and last)\n */\n name: z.string().optional(),\n\n /** Visual size variant (touch target always 44x44px min for sm/default) */\n size: AvatarSizeSchema.optional().default('default'),\n\n /** Shape variant */\n shape: AvatarShapeSchema.optional().default('circle'),\n\n /** Status ring indicator */\n status: AvatarStatusSchema.optional(),\n\n /**\n * Click handler for actionable avatar\n * When provided, renders as Button with 3-layer architecture\n * @see plan.md Clarification 2 (mutually exclusive with group onPress)\n */\n onPress: z.function().optional(),\n});\n\nexport type AvatarProps = Omit<z.infer<typeof AvatarPropsSchema>, 'onPress'> & {\n /** Click handler for actionable avatar */\n onPress?: (e: PressEvent) => void;\n /**\n * Internal: Position index within AvatarGroup (0-indexed)\n * Used to progressively darken backgrounds in groups\n * @internal Set by AvatarGroup, do not use directly\n */\n _groupIndex?: number;\n};\n\n/**\n * Avatar group props schema extending BaseComponentProps\n *\n * @see plan.md Clarification 1 (Group Border)\n * @see plan.md Clarification 5 (Stack Order - first on top)\n * @see plan.md Clarification 7 (Border Scope - groups only)\n */\nexport const AvatarGroupPropsSchema = BaseComponentPropsSchema.extend({\n /**\n * Maximum avatars to display before overflow (+X indicator)\n * Default: 3\n */\n max: z.number().int().positive().optional().default(3),\n\n /**\n * Shape inherited by all child avatars\n * Individual avatar shape props are ignored in groups\n */\n shape: AvatarShapeSchema.optional().default('circle'),\n\n /**\n * Size inherited by all child avatars\n * Individual avatar size props are ignored in groups\n * Also determines overlap spacing (sm: 8px, default: 12px, lg: 16px)\n */\n size: AvatarSizeSchema.optional().default('default'),\n\n /**\n * Click handler for the entire group\n * When provided, individual avatar onPress handlers are ignored\n * @see plan.md Clarification 2 (Mutually exclusive)\n */\n onPress: z.function().optional(),\n});\n\nexport type AvatarGroupProps = Omit<z.infer<typeof AvatarGroupPropsSchema>, 'onPress'> & {\n /** Click handler for the entire group */\n onPress?: (e: PressEvent) => void;\n};\n\n/**\n * Internal loading state for avatar images\n * @see plan.md Clarification 4 (Loading State)\n */\nexport type AvatarLoadingState = 'loading' | 'loaded' | 'error';\n"]}
|
|
@@ -1,43 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var chunkNGJVCFTM_js = require('../../chunk-NGJVCFTM.js');
|
|
4
|
-
require('../../chunk-B5Q4UPL6.js');
|
|
5
|
-
require('../../chunk-VIREG536.js');
|
|
6
|
-
require('../../chunk-T4COXKQ3.js');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Object.defineProperty(exports, "Badge", {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
get: function () { return chunkNGJVCFTM_js.Badge; }
|
|
13
|
-
});
|
|
14
|
-
Object.defineProperty(exports, "BadgeIconPositionSchema", {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function () { return chunkNGJVCFTM_js.BadgeIconPositionSchema; }
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(exports, "BadgePropsSchema", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () { return chunkNGJVCFTM_js.BadgePropsSchema; }
|
|
21
|
-
});
|
|
22
|
-
Object.defineProperty(exports, "BadgeSizeSchema", {
|
|
23
|
-
enumerable: true,
|
|
24
|
-
get: function () { return chunkNGJVCFTM_js.BadgeSizeSchema; }
|
|
25
|
-
});
|
|
26
|
-
Object.defineProperty(exports, "BadgeVariantSchema", {
|
|
27
|
-
enumerable: true,
|
|
28
|
-
get: function () { return chunkNGJVCFTM_js.BadgeVariantSchema; }
|
|
29
|
-
});
|
|
30
|
-
Object.defineProperty(exports, "badgeOuterVariants", {
|
|
31
|
-
enumerable: true,
|
|
32
|
-
get: function () { return chunkNGJVCFTM_js.badgeOuterVariants; }
|
|
33
|
-
});
|
|
34
|
-
Object.defineProperty(exports, "badgeVariants", {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
get: function () { return chunkNGJVCFTM_js.badgeVariants; }
|
|
37
|
-
});
|
|
38
|
-
Object.defineProperty(exports, "badgeVisualVariants", {
|
|
39
|
-
enumerable: true,
|
|
40
|
-
get: function () { return chunkNGJVCFTM_js.badgeVisualVariants; }
|
|
41
|
-
});
|
|
42
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';var react=require('react'),reactAriaComponents=require('react-aria-components'),classVarianceAuthority=require('class-variance-authority'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function c(...i){return tailwindMerge.twMerge(clsx.clsx(i))}var p="data-[pressed]:scale-[0.97]";var l="data-[hovered]:shadow-md";var n="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",s="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var N=classVarianceAuthority.cva(["relative inline-flex items-center 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-[var(--page-background)]","disabled:pointer-events-none","disabled:opacity-50"],{variants:{},defaultVariants:{}}),m=classVarianceAuthority.cva(["inline-flex items-center justify-center","gap-1","rounded-full","font-medium","whitespace-nowrap","transition-colors"],{variants:{variant:{primary:["bg-[var(--primary-action)]","text-[var(--primary-action-foreground)]","hover:bg-[var(--primary-action)]/90","data-[pressed]:bg-[var(--primary-action)]/80"],accent:["bg-[var(--accent-background)]","text-[var(--accent-foreground)]","hover:bg-[var(--accent-background)]/90","data-[pressed]:bg-[var(--accent-background)]/80"],destructive:["bg-[var(--destructive-background)]","text-[var(--destructive-foreground)]","hover:bg-[var(--destructive-background)]/90","data-[pressed]:bg-[var(--destructive-background)]/80"],content:["bg-[var(--accent-background)]","text-[var(--accent-foreground)]","hover:bg-[var(--accent-background)]/90","data-[pressed]:bg-[var(--accent-background)]/80"]},size:{sm:"h-5 px-2 text-xs",default:"h-6 px-2.5 text-xs",lg:"h-7 px-3 text-sm"}},defaultVariants:{variant:"primary",size:"default"}}),M=m,U={sm:"[&_svg]:h-2.5 [&_svg]:w-2.5",default:"[&_svg]:h-3 [&_svg]:w-3",lg:"[&_svg]:h-3.5 [&_svg]:w-3.5"},C=react.memo(react.forwardRef(({className:i,variant:A="primary",size:g="default",children:r,icon:o,iconPosition:f="start",count:d,onPress:v,isDisabled:z,id:b,"aria-label":S,"aria-labelledby":h,"aria-describedby":x,"data-testid":B,...E},y)=>{let P=c(m({variant:A,size:g}),U[g],i),L=[!!o,d!==void 0,!!r].filter(Boolean).length>1,T=()=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[o&&f==="start"&&jsxRuntime.jsx("span",{className:"shrink-0","aria-hidden":"true",children:o}),r&&(L?jsxRuntime.jsx("span",{children:r}):r),d!==void 0&&jsxRuntime.jsx("span",{className:"font-mono tabular-nums",children:d}),o&&f==="end"&&jsxRuntime.jsx("span",{className:"shrink-0","aria-hidden":"true",children:o})]});return v?jsxRuntime.jsx(reactAriaComponents.Button,{ref:y,isDisabled:z,onPress:v,className:N(),id:b,"aria-label":S,"aria-labelledby":h,"aria-describedby":x,"data-testid":B,...E,children:k=>jsxRuntime.jsx("span",{className:c(P,p,l,n,s),"data-pressed":k.isPressed||void 0,children:T()})}):jsxRuntime.jsx("span",{ref:y,className:P,id:b,"aria-label":S,"aria-labelledby":h,"aria-describedby":x,"data-testid":B,...E,children:T()})}));C.displayName="Badge";var V=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var H=zod.z.enum(["primary","accent","destructive","content"]),I=zod.z.enum(["sm","default","lg"]),O=zod.z.enum(["start","end"]),q=V.extend({children:zod.z.string().optional(),icon:zod.z.custom().optional(),iconPosition:O.optional().default("start"),count:zod.z.union([zod.z.number(),zod.z.string()]).optional(),variant:H.optional().default("primary"),size:I.optional().default("default"),onPress:zod.z.function().optional(),isDisabled:zod.z.boolean().optional()});exports.Badge=C;exports.BadgeIconPositionSchema=O;exports.BadgePropsSchema=q;exports.BadgeSizeSchema=I;exports.BadgeVariantSchema=H;exports.badgeOuterVariants=N;exports.badgeVariants=M;exports.badgeVisualVariants=m;//# sourceMappingURL=index.js.map
|
|
43
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -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/Badge/Badge.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Badge/Badge.types.ts"],"names":["cn","inputs","twMerge","clsx","PRESSED_STYLES","HOVER_STYLES","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","badgeOuterVariants","cva","badgeVisualVariants","badgeVariants","iconSizeClasses","Badge","memo","forwardRef","className","variant","size","children","icon","iconPosition","count","onPress","isDisabled","id","ariaLabel","ariaLabelledby","ariaDescribedby","dataTestId","props","ref","visualClasses","multipleElements","renderContent","jsxs","Fragment","jsx","AriaButton","renderProps","BaseComponentPropsSchema","z","BadgeVariantSchema","BadgeSizeSchema","BadgeIconPositionSchema","BadgePropsSchema"],"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","\"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","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","import { z } from 'zod';\nimport { type ReactNode } from 'react';\nimport { type PressEvent } from 'react-aria-components';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * Badge Component Types\n *\n * Defines the props schema and TypeScript types for the Badge component.\n * Extends BaseComponentPropsSchema for consistent accessibility and styling APIs.\n *\n * @see badge-prd.md for full requirements\n * @see WCAG 2.2 AAA compliance requirements\n */\n\n// Variant schema - semantic color variants\nexport const BadgeVariantSchema = z.enum([\n 'primary', // Default brand color for general labels\n 'accent', // Highlighted/featured content\n 'destructive', // Errors, warnings, critical states\n 'content', // Neutral/informational content\n]);\n\n// Size schema - visual size variants\nexport const BadgeSizeSchema = z.enum([\n 'sm', // 20px height\n 'default', // 24px height\n 'lg', // 28px height\n]);\n\n// Icon position schema\nexport const BadgeIconPositionSchema = z.enum([\n 'start', // Icon before text (default)\n 'end', // Icon after text (useful for dismiss/close)\n]);\n\n// Main props schema extending base component props\nexport const BadgePropsSchema = BaseComponentPropsSchema.extend({\n // Content - override children to be string only for badges\n children: z.string().optional(),\n icon: z.custom<ReactNode>().optional(),\n iconPosition: BadgeIconPositionSchema.optional().default('start'),\n count: z.union([z.number(), z.string()]).optional(),\n\n // Variants\n variant: BadgeVariantSchema.optional().default('primary'),\n size: BadgeSizeSchema.optional().default('default'),\n\n // Interaction - makes badge actionable when provided\n onPress: z.function().optional(), // React Aria PressEvent handler\n isDisabled: z.boolean().optional(),\n});\n\n// TypeScript types inferred from schemas\nexport type BadgeVariant = z.infer<typeof BadgeVariantSchema>;\nexport type BadgeSize = z.infer<typeof BadgeSizeSchema>;\nexport type BadgeIconPosition = z.infer<typeof BadgeIconPositionSchema>;\n\n// Base props from Zod schema (excluding onPress which needs proper typing)\ntype BadgePropsBase = Omit<z.infer<typeof BadgePropsSchema>, 'onPress'>;\n\n/**\n * Badge component props interface\n * Uses Zod schema inference for most props, but properly types onPress\n * to match React Aria's PressEvent handler signature\n */\nexport interface BadgeProps extends BadgePropsBase {\n /** Press handler - makes badge actionable when provided */\n onPress?: (e: PressEvent) => void;\n}\n"]}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
3
|
-
import '../../chunk-E2KQFV3O.mjs';
|
|
4
|
-
import '../../chunk-5SVLJN2C.mjs';
|
|
5
|
-
//# sourceMappingURL=index.mjs.map
|
|
1
|
+
"use client";
|
|
2
|
+
import {memo,forwardRef}from'react';import {Button}from'react-aria-components';import {cva}from'class-variance-authority';import {clsx}from'clsx';import {twMerge}from'tailwind-merge';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {z}from'zod';function c(...i){return twMerge(clsx(i))}var p="data-[pressed]:scale-[0.97]";var l="data-[hovered]:shadow-md";var n="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",s="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var N=cva(["relative inline-flex items-center 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-[var(--page-background)]","disabled:pointer-events-none","disabled:opacity-50"],{variants:{},defaultVariants:{}}),m=cva(["inline-flex items-center justify-center","gap-1","rounded-full","font-medium","whitespace-nowrap","transition-colors"],{variants:{variant:{primary:["bg-[var(--primary-action)]","text-[var(--primary-action-foreground)]","hover:bg-[var(--primary-action)]/90","data-[pressed]:bg-[var(--primary-action)]/80"],accent:["bg-[var(--accent-background)]","text-[var(--accent-foreground)]","hover:bg-[var(--accent-background)]/90","data-[pressed]:bg-[var(--accent-background)]/80"],destructive:["bg-[var(--destructive-background)]","text-[var(--destructive-foreground)]","hover:bg-[var(--destructive-background)]/90","data-[pressed]:bg-[var(--destructive-background)]/80"],content:["bg-[var(--accent-background)]","text-[var(--accent-foreground)]","hover:bg-[var(--accent-background)]/90","data-[pressed]:bg-[var(--accent-background)]/80"]},size:{sm:"h-5 px-2 text-xs",default:"h-6 px-2.5 text-xs",lg:"h-7 px-3 text-sm"}},defaultVariants:{variant:"primary",size:"default"}}),M=m,U={sm:"[&_svg]:h-2.5 [&_svg]:w-2.5",default:"[&_svg]:h-3 [&_svg]:w-3",lg:"[&_svg]:h-3.5 [&_svg]:w-3.5"},C=memo(forwardRef(({className:i,variant:A="primary",size:g="default",children:r,icon:o,iconPosition:f="start",count:d,onPress:v,isDisabled:z,id:b,"aria-label":S,"aria-labelledby":h,"aria-describedby":x,"data-testid":B,...E},y)=>{let P=c(m({variant:A,size:g}),U[g],i),L=[!!o,d!==void 0,!!r].filter(Boolean).length>1,T=()=>jsxs(Fragment,{children:[o&&f==="start"&&jsx("span",{className:"shrink-0","aria-hidden":"true",children:o}),r&&(L?jsx("span",{children:r}):r),d!==void 0&&jsx("span",{className:"font-mono tabular-nums",children:d}),o&&f==="end"&&jsx("span",{className:"shrink-0","aria-hidden":"true",children:o})]});return v?jsx(Button,{ref:y,isDisabled:z,onPress:v,className:N(),id:b,"aria-label":S,"aria-labelledby":h,"aria-describedby":x,"data-testid":B,...E,children:k=>jsx("span",{className:c(P,p,l,n,s),"data-pressed":k.isPressed||void 0,children:T()})}):jsx("span",{ref:y,className:P,id:b,"aria-label":S,"aria-labelledby":h,"aria-describedby":x,"data-testid":B,...E,children:T()})}));C.displayName="Badge";var V=z.object({className:z.string().optional(),children:z.any().optional(),id:z.string().optional(),"aria-label":z.string().optional(),"aria-labelledby":z.string().optional(),"aria-describedby":z.string().optional(),"aria-live":z.enum(["off","polite","assertive"]).optional(),"aria-hidden":z.boolean().optional(),"data-testid":z.string().optional()});var H=z.enum(["primary","accent","destructive","content"]),I=z.enum(["sm","default","lg"]),O=z.enum(["start","end"]),q=V.extend({children:z.string().optional(),icon:z.custom().optional(),iconPosition:O.optional().default("start"),count:z.union([z.number(),z.string()]).optional(),variant:H.optional().default("primary"),size:I.optional().default("default"),onPress:z.function().optional(),isDisabled:z.boolean().optional()});export{C as Badge,O as BadgeIconPositionSchema,q as BadgePropsSchema,I as BadgeSizeSchema,H as BadgeVariantSchema,N as badgeOuterVariants,M as badgeVariants,m as badgeVisualVariants};//# sourceMappingURL=index.mjs.map
|
|
6
3
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/styles/interaction-states.ts","../../../src/elements/Badge/Badge.tsx","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Badge/Badge.types.ts"],"names":["cn","inputs","twMerge","clsx","PRESSED_STYLES","HOVER_STYLES","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","badgeOuterVariants","cva","badgeVisualVariants","badgeVariants","iconSizeClasses","Badge","memo","forwardRef","className","variant","size","children","icon","iconPosition","count","onPress","isDisabled","id","ariaLabel","ariaLabelledby","ariaDescribedby","dataTestId","props","ref","visualClasses","multipleElements","renderContent","jsxs","Fragment","jsx","AriaButton","renderProps","BaseComponentPropsSchema","z","BadgeVariantSchema","BadgeSizeSchema","BadgeIconPositionSchema","BadgePropsSchema"],"mappings":"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","file":"index.mjs","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","\"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","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","import { z } from 'zod';\nimport { type ReactNode } from 'react';\nimport { type PressEvent } from 'react-aria-components';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\n\n/**\n * Badge Component Types\n *\n * Defines the props schema and TypeScript types for the Badge component.\n * Extends BaseComponentPropsSchema for consistent accessibility and styling APIs.\n *\n * @see badge-prd.md for full requirements\n * @see WCAG 2.2 AAA compliance requirements\n */\n\n// Variant schema - semantic color variants\nexport const BadgeVariantSchema = z.enum([\n 'primary', // Default brand color for general labels\n 'accent', // Highlighted/featured content\n 'destructive', // Errors, warnings, critical states\n 'content', // Neutral/informational content\n]);\n\n// Size schema - visual size variants\nexport const BadgeSizeSchema = z.enum([\n 'sm', // 20px height\n 'default', // 24px height\n 'lg', // 28px height\n]);\n\n// Icon position schema\nexport const BadgeIconPositionSchema = z.enum([\n 'start', // Icon before text (default)\n 'end', // Icon after text (useful for dismiss/close)\n]);\n\n// Main props schema extending base component props\nexport const BadgePropsSchema = BaseComponentPropsSchema.extend({\n // Content - override children to be string only for badges\n children: z.string().optional(),\n icon: z.custom<ReactNode>().optional(),\n iconPosition: BadgeIconPositionSchema.optional().default('start'),\n count: z.union([z.number(), z.string()]).optional(),\n\n // Variants\n variant: BadgeVariantSchema.optional().default('primary'),\n size: BadgeSizeSchema.optional().default('default'),\n\n // Interaction - makes badge actionable when provided\n onPress: z.function().optional(), // React Aria PressEvent handler\n isDisabled: z.boolean().optional(),\n});\n\n// TypeScript types inferred from schemas\nexport type BadgeVariant = z.infer<typeof BadgeVariantSchema>;\nexport type BadgeSize = z.infer<typeof BadgeSizeSchema>;\nexport type BadgeIconPosition = z.infer<typeof BadgeIconPositionSchema>;\n\n// Base props from Zod schema (excluding onPress which needs proper typing)\ntype BadgePropsBase = Omit<z.infer<typeof BadgePropsSchema>, 'onPress'>;\n\n/**\n * Badge component props interface\n * Uses Zod schema inference for most props, but properly types onPress\n * to match React Aria's PressEvent handler signature\n */\nexport interface BadgeProps extends BadgePropsBase {\n /** Press handler - makes badge actionable when provided */\n onPress?: (e: PressEvent) => void;\n}\n"]}
|
|
@@ -1,54 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var chunkHQVRMR6N_js = require('../../chunk-HQVRMR6N.js');
|
|
4
|
-
require('../../chunk-GD5GHTMA.js');
|
|
5
|
-
require('../../chunk-3YOY2VJ6.js');
|
|
6
|
-
require('../../chunk-Y3GT7ETK.js');
|
|
7
|
-
require('../../chunk-B5Q4UPL6.js');
|
|
8
|
-
require('../../chunk-VIREG536.js');
|
|
9
|
-
require('../../chunk-T4COXKQ3.js');
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Object.defineProperty(exports, "BreadcrumbItemDataSchema", {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
get: function () { return chunkHQVRMR6N_js.BreadcrumbItemDataSchema; }
|
|
16
|
-
});
|
|
17
|
-
Object.defineProperty(exports, "Breadcrumbs", {
|
|
18
|
-
enumerable: true,
|
|
19
|
-
get: function () { return chunkHQVRMR6N_js.Breadcrumbs; }
|
|
20
|
-
});
|
|
21
|
-
Object.defineProperty(exports, "BreadcrumbsPropsSchema", {
|
|
22
|
-
enumerable: true,
|
|
23
|
-
get: function () { return chunkHQVRMR6N_js.BreadcrumbsPropsSchema; }
|
|
24
|
-
});
|
|
25
|
-
Object.defineProperty(exports, "SeparatorTypeSchema", {
|
|
26
|
-
enumerable: true,
|
|
27
|
-
get: function () { return chunkHQVRMR6N_js.SeparatorTypeSchema; }
|
|
28
|
-
});
|
|
29
|
-
Object.defineProperty(exports, "breadcrumbItemVariants", {
|
|
30
|
-
enumerable: true,
|
|
31
|
-
get: function () { return chunkHQVRMR6N_js.breadcrumbItemVariants; }
|
|
32
|
-
});
|
|
33
|
-
Object.defineProperty(exports, "breadcrumbLinkVariants", {
|
|
34
|
-
enumerable: true,
|
|
35
|
-
get: function () { return chunkHQVRMR6N_js.breadcrumbLinkVariants; }
|
|
36
|
-
});
|
|
37
|
-
Object.defineProperty(exports, "breadcrumbListVariants", {
|
|
38
|
-
enumerable: true,
|
|
39
|
-
get: function () { return chunkHQVRMR6N_js.breadcrumbListVariants; }
|
|
40
|
-
});
|
|
41
|
-
Object.defineProperty(exports, "breadcrumbsVariants", {
|
|
42
|
-
enumerable: true,
|
|
43
|
-
get: function () { return chunkHQVRMR6N_js.breadcrumbsVariants; }
|
|
44
|
-
});
|
|
45
|
-
Object.defineProperty(exports, "ellipsisButtonVariants", {
|
|
46
|
-
enumerable: true,
|
|
47
|
-
get: function () { return chunkHQVRMR6N_js.ellipsisButtonVariants; }
|
|
48
|
-
});
|
|
49
|
-
Object.defineProperty(exports, "separatorVariants", {
|
|
50
|
-
enumerable: true,
|
|
51
|
-
get: function () { return chunkHQVRMR6N_js.separatorVariants; }
|
|
52
|
-
});
|
|
53
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';var zod=require('zod'),react=require('react'),classVarianceAuthority=require('class-variance-authority'),lucideReact=require('lucide-react'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),reactAriaComponents=require('react-aria-components'),jsxRuntime=require('react/jsx-runtime');var se=zod.z.object({className:zod.z.string().optional(),children:zod.z.any().optional(),id:zod.z.string().optional(),"aria-label":zod.z.string().optional(),"aria-labelledby":zod.z.string().optional(),"aria-describedby":zod.z.string().optional(),"aria-live":zod.z.enum(["off","polite","assertive"]).optional(),"aria-hidden":zod.z.boolean().optional(),"data-testid":zod.z.string().optional()});var pe=zod.z.object({id:zod.z.union([zod.z.string(),zod.z.number()]),label:zod.z.string(),href:zod.z.string().optional(),icon:zod.z.custom().optional(),isDisabled:zod.z.boolean().optional().default(false)}),le=zod.z.union([zod.z.literal("chevron"),zod.z.literal("slash"),zod.z.custom()]),ke=se.extend({items:zod.z.array(pe),separator:le.optional().default("chevron"),maxItems:zod.z.number().int().positive().optional().default(4),itemsBeforeCollapse:zod.z.number().int().nonnegative().optional().default(1),itemsAfterCollapse:zod.z.number().int().positive().optional().default(2),linkComponent:zod.z.custom().optional(),isDisabled:zod.z.boolean().optional().default(false)});function c(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var H=classVarianceAuthority.cva("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",{variants:{variant:{default:""}},defaultVariants:{variant:"default"}}),C=classVarianceAuthority.cva("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",{variants:{variant:{default:""}},defaultVariants:{variant:"default"}});function $(e){if(typeof e=="function"||typeof e=="object")return e?.displayName}var fe=react.forwardRef(({defaultOpen:e=false,isOpen:t,onOpenChange:o,children:a},n)=>{if(process.env.NODE_ENV!=="production"){let s=react.Children.toArray(a),p=s.some(u=>react.isValidElement(u)&&(u.type===k||$(u.type)==="DropdownTrigger")),v=s.some(u=>react.isValidElement(u)&&(u.type===P||$(u.type)==="DropdownMenu"));if(!p||!v)throw new Error("Dropdown requires exactly one Dropdown.Trigger and one Dropdown.Menu as children")}return jsxRuntime.jsx(reactAriaComponents.MenuTrigger,{defaultOpen:e,isOpen:t,onOpenChange:o,children:a})});fe.displayName="Dropdown";var k=react.forwardRef(({children:e,...t},o)=>react.isValidElement(e)?react.cloneElement(e,{...t,slot:"trigger"}):jsxRuntime.jsx(reactAriaComponents.Button,{ref:o,...t,children:e}));k.displayName="DropdownTrigger";var P=react.forwardRef(({align:e="start",side:t="bottom",className:o,children:a,...n},s)=>{let p=`${t} ${e}`;return jsxRuntime.jsx(reactAriaComponents.Popover,{placement:p,className:"entering:animate-in exiting:animate-out",children:jsxRuntime.jsx(reactAriaComponents.Menu,{className:c(H({variant:"default"}),o),...n,children:a})})});P.displayName="DropdownMenu";var F=react.forwardRef(({children:e,onAction:t,isDisabled:o=false,shortcut:a,icon:n,iconRight:s,className:p,"aria-label":v,...u},y)=>{let h=react.Children.toArray(e),l=f=>react.isValidElement(f)&&(f.type===P||$(f.type)==="DropdownMenu"),d=h.some(l),g=h.filter(f=>!l(f)),D=h.find(l);return d&&D?jsxRuntime.jsxs(reactAriaComponents.SubmenuTrigger,{children:[jsxRuntime.jsxs(reactAriaComponents.MenuItem,{"aria-label":v,className:c(C({variant:"default"}),p),...u,children:[n&&jsxRuntime.jsx("span",{className:"mr-2",children:n}),jsxRuntime.jsx("span",{className:"flex-1",children:g}),jsxRuntime.jsx(lucideReact.ChevronRight,{className:"ml-auto h-4 w-4","aria-hidden":"true"})]}),D]}):jsxRuntime.jsxs(reactAriaComponents.MenuItem,{onAction:t,isDisabled:o,"aria-label":v,className:c(C({variant:"default"}),p),...u,children:[n&&jsxRuntime.jsx("span",{className:"mr-2",children:n}),jsxRuntime.jsx("span",{className:"flex-1",children:e}),s&&jsxRuntime.jsx("span",{className:"ml-auto",children:s}),a&&jsxRuntime.jsx("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",children:a})]})});F.displayName="DropdownItem";var Y=react.memo(react.forwardRef(({className:e,...t},o)=>jsxRuntime.jsx(reactAriaComponents.Separator,{className:c("-mx-1 my-1 h-px bg-[var(--accent-background)]",e),...t})));Y.displayName="DropdownSeparator";var W=react.memo(react.forwardRef(({children:e,className:t,...o},a)=>jsxRuntime.jsx(reactAriaComponents.Header,{className:c("px-2 py-1.5 text-sm font-semibold text-[var(--menu-muted)]",t),...o,children:e})));W.displayName="DropdownLabel";var S=Object.assign(fe,{Trigger:k,Menu:P,Item:F,Separator:Y,Label:W});var j=classVarianceAuthority.cva("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",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),U=classVarianceAuthority.cva("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",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] data-[pressed]:bg-[var(--primary-action)]/80",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] shadow-md hover:bg-[var(--destructive-background)]/90 data-[pressed]:bg-[var(--destructive-background)]/80",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)] data-[pressed]:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] shadow-md hover:bg-[var(--secondary)]/80 data-[pressed]:bg-[var(--secondary)]/70",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)] data-[pressed]:bg-[var(--accent)]",link:"text-[var(--text-link)] underline-offset-4 hover:underline data-[pressed]:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-8",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] !shadow-md hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var q="data-[pressed]:scale-[0.97]";var Z="data-[hovered]:shadow-md";var L="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",M="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground";var he=react.createContext(null);he.displayName="ButtonGroupContext";function ye(){return react.useContext(he)}var De=react.createContext(null);De.displayName="ButtonGroupItemContext";function we(){return react.useContext(De)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var Se=classVarianceAuthority.cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});classVarianceAuthority.cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var A=react.memo(react.forwardRef(({className:e,buttonVisualClassName:t,variant:o,size:a,visualSize:n,fullWidth:s,loading:p=false,loadingText:v="Loading...",shortcut:u,children:y,isDisabled:h,paywall:l=false,paywallRedirect:d,paywallDescription:g,onPress:D,...f},Ie)=>{let ae=react.useId(),V=ye(),oe=we(),Pe=o??V?.variant??"default",Te=a??V?.size,Ce=h??V?.isDisabled??false,ne=V?.orientation==="vertical",ie=s||ne,Ee=oe?Se({orientation:V?.orientation??"horizontal",position:oe.position}):"",z=n??Te??"default";return process.env.NODE_ENV!=="production"&&(z==="dot"||z==="icon")&&!f["aria-label"]&&!y&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsxRuntime.jsx(reactAriaComponents.Button,{ref:Ie,isDisabled:Ce||p||void 0,"aria-disabled":l?true:void 0,"aria-describedby":l?ae:void 0,onPress:I=>{if(l){d&&window.open(d,"_blank","noopener,noreferrer");return}D?.(I);},className:c(j({fullWidth:ie,inVerticalGroup:ne}),e),...f,children:I=>jsxRuntime.jsxs("span",{className:c(U({variant:Pe,visualSize:z,paywall:l,fullWidth:ie}),Ee,t,q,Z,L,M),"data-pressed":I.isPressed||void 0,children:[p&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"sr-only","aria-live":"polite",children:v})]}),!p&&y,l&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),l&&jsxRuntime.jsxs("span",{id:ae,className:"sr-only",children:["Premium feature: ",g||"Upgrade required to access this feature"]}),I.isFocusVisible&&u&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:u}),I.isPressed&&jsxRuntime.jsx("span",{className:"absolute inset-0 rounded-[inherit] bg-current opacity-10 motion-safe:animate-in motion-safe:zoom-in-95","aria-hidden":"true"})]})})}));A.displayName="Button";var te=classVarianceAuthority.cva("flex items-center flex-wrap",{variants:{},defaultVariants:{}}),re=classVarianceAuthority.cva("flex flex-wrap items-center gap-1 break-words text-sm text-[var(--menu-muted)]",{variants:{},defaultVariants:{}}),T=classVarianceAuthority.cva("inline-flex items-center gap-1",{variants:{},defaultVariants:{}}),G=classVarianceAuthority.cva("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",{variants:{state:{default:["text-[var(--menu-muted)]","hover:text-[var(--content-foreground)]","hover:underline underline-offset-4"].join(" "),current:"text-[var(--content-foreground)] font-medium pointer-events-none",disabled:"text-[var(--menu-muted)] opacity-50 cursor-not-allowed pointer-events-none"}},defaultVariants:{state:"default"}}),R=classVarianceAuthority.cva("text-[var(--menu-muted)]",{variants:{type:{chevron:"[&>svg]:h-4 [&>svg]:w-4",slash:"mx-2",custom:""}},defaultVariants:{type:"chevron"}}),Ne=classVarianceAuthority.cva("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)]",{variants:{},defaultVariants:{}});function Be(e,t){return e===t-1}function tt(e,t,o,a){if(e.length<=t||o+a>=e.length)return null;let n=e.slice(0,o),s=e.slice(-a),p=e.slice(o,e.length-a);return {before:n,collapsed:p,after:s}}function _({separator:e}){return e==="chevron"?jsxRuntime.jsx("li",{role:"presentation","aria-hidden":"true",className:R({type:"chevron"}),children:jsxRuntime.jsx(lucideReact.ChevronRight,{})}):e==="slash"?jsxRuntime.jsx("li",{role:"presentation","aria-hidden":"true",className:R({type:"slash"}),children:"/"}):jsxRuntime.jsx("li",{role:"presentation","aria-hidden":"true",className:R({type:"custom"}),children:e})}function ee({item:e,isCurrent:t,linkComponent:o="a",isGroupDisabled:a}){let n=a||e.isDisabled,s=t?"current":n?"disabled":"default";return t?jsxRuntime.jsxs("span",{className:G({state:"current"}),"aria-current":"page",children:[e.icon&&jsxRuntime.jsx("span",{"aria-hidden":"true",children:e.icon}),e.label]}):e.href?jsxRuntime.jsxs(o,{href:e.href,className:G({state:s}),"aria-disabled":n||void 0,children:[e.icon&&jsxRuntime.jsx("span",{"aria-hidden":"true",children:e.icon}),e.label]}):jsxRuntime.jsxs("span",{className:G({state:n?"disabled":"default"}),"aria-disabled":n||void 0,children:[e.icon&&jsxRuntime.jsx("span",{"aria-hidden":"true",children:e.icon}),e.label]})}function rt({items:e,linkComponent:t="a",isGroupDisabled:o}){return jsxRuntime.jsxs(S,{defaultOpen:false,children:[jsxRuntime.jsx(S.Trigger,{children:jsxRuntime.jsx(A,{variant:"ghost",size:"icon",className:Ne(),"aria-label":"More breadcrumbs",children:jsxRuntime.jsx(lucideReact.MoreHorizontal,{className:"h-4 w-4"})})}),jsxRuntime.jsx(S.Menu,{align:"start",side:"bottom",children:e.map(a=>jsxRuntime.jsx(S.Item,{isDisabled:o||a.isDisabled,children:jsxRuntime.jsxs(t,{href:a.href,className:"flex flex-1 items-center gap-2",children:[a.icon&&jsxRuntime.jsx("span",{"aria-hidden":"true",children:a.icon}),a.label]})},a.id))})]})}var Ve=react.forwardRef(({items:e,separator:t="chevron",maxItems:o=4,itemsBeforeCollapse:a=1,itemsAfterCollapse:n=2,linkComponent:s,isDisabled:p,className:v,"aria-label":u="Breadcrumb",...y},h)=>{if(!e||e.length===0)return null;let l=tt(e,o,a,n);return l?jsxRuntime.jsx("nav",{ref:h,"aria-label":u,className:c(te(),v),...y,children:jsxRuntime.jsxs("ol",{className:re(),children:[l.before.map(d=>jsxRuntime.jsxs(react.Fragment,{children:[jsxRuntime.jsx("li",{className:T(),children:jsxRuntime.jsx(ee,{item:d,isCurrent:false,linkComponent:s,isGroupDisabled:p})}),jsxRuntime.jsx(_,{separator:t})]},d.id)),jsxRuntime.jsx("li",{className:T(),children:jsxRuntime.jsx(rt,{items:l.collapsed,linkComponent:s,isGroupDisabled:p})}),jsxRuntime.jsx(_,{separator:t}),l.after.map((d,g)=>{let D=g===l.after.length-1,f=e.length-l.after.length+g;return jsxRuntime.jsxs(react.Fragment,{children:[jsxRuntime.jsx("li",{className:T(),children:jsxRuntime.jsx(ee,{item:d,isCurrent:Be(f,e.length),linkComponent:s,isGroupDisabled:p})}),!D&&jsxRuntime.jsx(_,{separator:t})]},d.id)})]})}):jsxRuntime.jsx("nav",{ref:h,"aria-label":u,className:c(te(),v),...y,children:jsxRuntime.jsx("ol",{className:re(),children:e.map((d,g)=>jsxRuntime.jsxs(react.Fragment,{children:[jsxRuntime.jsx("li",{className:T(),children:jsxRuntime.jsx(ee,{item:d,isCurrent:Be(g,e.length),linkComponent:s,isGroupDisabled:p})}),g<e.length-1&&jsxRuntime.jsx(_,{separator:t})]},d.id))})})});Ve.displayName="Breadcrumbs";exports.BreadcrumbItemDataSchema=pe;exports.Breadcrumbs=Ve;exports.BreadcrumbsPropsSchema=ke;exports.SeparatorTypeSchema=le;exports.breadcrumbItemVariants=T;exports.breadcrumbLinkVariants=G;exports.breadcrumbListVariants=re;exports.breadcrumbsVariants=te;exports.ellipsisButtonVariants=Ne;exports.separatorVariants=R;//# sourceMappingURL=index.js.map
|
|
54
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Breadcrumbs/Breadcrumbs.types.ts","../../../src/utils/cn.ts","../../../src/elements/Dropdown/Dropdown.styles.ts","../../../src/elements/Dropdown/Dropdown.tsx","../../../src/elements/Button/Button.styles.ts","../../../src/styles/interaction-states.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/elements/Breadcrumbs/Breadcrumbs.tsx"],"names":["BaseComponentPropsSchema","z","BreadcrumbItemDataSchema","SeparatorTypeSchema","BreadcrumbsPropsSchema","cn","inputs","twMerge","clsx","menuVariants","cva","menuItemVariants","getDisplayName","type","DropdownRoot","forwardRef","defaultOpen","isOpen","onOpenChange","children","_ref","childArray","Children","hasTrigger","child","isValidElement","DropdownTrigger","hasMenu","DropdownMenu","jsx","AriaMenuTrigger","props","ref","cloneElement","AriaButton","align","side","className","placement","AriaPopover","AriaMenu","DropdownItem","onAction","isDisabled","shortcut","icon","iconRight","ariaLabel","isDropdownMenu","hasSubmenu","contentChildren","submenu","jsxs","AriaSubmenuTrigger","AriaMenuItem","ChevronRight","DropdownSeparator","memo","AriaSeparator","DropdownLabel","AriaHeader","Dropdown","buttonOuterVariants","buttonVisualVariants","PRESSED_STYLES","HOVER_STYLES","HIGH_CONTRAST_HOVER","HIGH_CONTRAST_PRESSED","ButtonGroupContext","createContext","useButtonGroupContext","useContext","ButtonGroupItemContext","useButtonGroupItemContext","buttonGroupItemVariants","Button","buttonVisualClassName","variant","size","visualSize","fullWidth","loading","loadingText","paywall","paywallRedirect","paywallDescription","onPress","paywallDescriptionId","useId","groupContext","itemContext","effectiveVariant","effectiveSize","effectiveIsDisabled","isInVerticalGroup","effectiveFullWidth","positionClassName","effectiveVisualSize","e","renderProps","Fragment","Loader2","Zap","breadcrumbsVariants","breadcrumbListVariants","breadcrumbItemVariants","breadcrumbLinkVariants","separatorVariants","ellipsisButtonVariants","isCurrentPage","index","total","getCollapsedItems","items","maxItems","itemsBeforeCollapse","itemsAfterCollapse","before","after","collapsed","BreadcrumbSeparator","separator","BreadcrumbLink","item","isCurrent","LinkComponent","isGroupDisabled","state","BreadcrumbEllipsis","MoreHorizontal","Breadcrumbs","linkComponent","collapsedData","isLast","globalIndex"],"mappings":"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","file":"index.js","sourcesContent":["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","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, ElementType } from 'react';\n\n/**\n * Breadcrumb Item Data Schema\n * Represents a single item in the breadcrumb trail\n *\n * @see breadcrumbs-prd.md FR-001 (Render Breadcrumbs from Items Array)\n * @see breadcrumbs-prd.md FR-007 (Icon Support)\n * @see plan.md Decision 1 (Array-Based API)\n */\nexport const BreadcrumbItemDataSchema = z.object({\n /** Unique identifier for the breadcrumb item */\n id: z.union([z.string(), z.number()]),\n\n /** Display text for the breadcrumb (required - no icon-only items) */\n label: z.string(),\n\n /** Link URL - omit for non-navigable items */\n href: z.string().optional(),\n\n /** Optional leading icon (ReactNode) */\n icon: z.custom<ReactNode>().optional(),\n\n /** Disable this specific breadcrumb link */\n isDisabled: z.boolean().optional().default(false),\n});\n\nexport type BreadcrumbItemData = z.infer<typeof BreadcrumbItemDataSchema>;\n\n/**\n * Separator Type Schema\n * Controls the visual separator between breadcrumb items\n *\n * @see breadcrumbs-prd.md FR-003 (Configurable Separators)\n * @see plan.md Decision 3 (Configurable Separators)\n */\nexport const SeparatorTypeSchema = z.union([\n z.literal('chevron'),\n z.literal('slash'),\n z.custom<ReactNode>(),\n]);\n\nexport type SeparatorType = z.infer<typeof SeparatorTypeSchema>;\n\n/**\n * Breadcrumbs Props Schema\n * Main component props for the Breadcrumbs component\n *\n * @see breadcrumbs-prd.md FR-001 to FR-011 (All Functional Requirements)\n * @see plan.md (All Design Decisions)\n * @see constitution.md Principle IV (Accessibility First)\n */\nexport const BreadcrumbsPropsSchema = BaseComponentPropsSchema.extend({\n /**\n * Array of breadcrumb items to render\n * @see FR-001 (Render Breadcrumbs from Items Array)\n */\n items: z.array(BreadcrumbItemDataSchema),\n\n /**\n * Separator style between items\n * @default 'chevron'\n * @see FR-003 (Configurable Separators)\n */\n separator: SeparatorTypeSchema.optional().default('chevron'),\n\n /**\n * Maximum items to show before collapsing\n * @default 4\n * @see FR-004 (Ellipsis Collapse for Overflow)\n */\n maxItems: z.number().int().positive().optional().default(4),\n\n /**\n * Number of items to show before ellipsis\n * @default 1\n * @see FR-004 (Ellipsis Collapse for Overflow)\n */\n itemsBeforeCollapse: z.number().int().nonnegative().optional().default(1),\n\n /**\n * Number of items to show after ellipsis\n * @default 2\n * @see FR-004 (Ellipsis Collapse for Overflow)\n */\n itemsAfterCollapse: z.number().int().positive().optional().default(2),\n\n /**\n * Custom link component for framework integration (Next.js Link, React Router Link, etc.)\n * @default 'a'\n * @see FR-005 (Polymorphic Link Component)\n */\n linkComponent: z.custom<ElementType>().optional(),\n\n /**\n * Disable all breadcrumb links\n * @default false\n * @see FR-006 (Disabled States)\n */\n isDisabled: z.boolean().optional().default(false),\n});\n\nexport type BreadcrumbsProps = z.infer<typeof BreadcrumbsPropsSchema>;\n\n/**\n * Internal collapsed items structure\n * Used by ellipsis collapse logic\n *\n * @see FR-004 (Ellipsis Collapse for Overflow)\n * @see plan.md Decision 4 (Ellipsis Collapse)\n */\nexport interface CollapsedItems {\n /** Items shown before the ellipsis */\n before: BreadcrumbItemData[];\n /** Items hidden in the dropdown */\n collapsed: BreadcrumbItemData[];\n /** Items shown after the ellipsis */\n after: BreadcrumbItemData[];\n}\n\n/**\n * Internal BreadcrumbLink component props\n * Used by the internal link rendering component\n */\nexport interface BreadcrumbLinkInternalProps {\n item: BreadcrumbItemData;\n isCurrent: boolean;\n linkComponent?: ElementType;\n isGroupDisabled?: boolean;\n}\n\n/**\n * Internal BreadcrumbEllipsis component props\n * Used by the ellipsis dropdown component\n */\nexport interface BreadcrumbEllipsisInternalProps {\n items: BreadcrumbItemData[];\n linkComponent?: ElementType;\n isGroupDisabled?: boolean;\n}\n\n/**\n * Internal BreadcrumbSeparator component props\n * Used by the separator rendering component\n */\nexport interface BreadcrumbSeparatorInternalProps {\n separator: SeparatorType;\n}\n\n/**\n * CVA state type for breadcrumb link variants\n */\nexport type BreadcrumbLinkState = 'default' | 'current' | 'disabled';\n\n/**\n * CVA separator type for separator variants\n */\nexport type SeparatorVariantType = 'chevron' | 'slash' | 'custom';\n","/**\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","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","\"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 } 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","/**\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","\"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","\"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"]}
|