@tribepad/themis 1.0.0 → 1.0.1
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 +325 -66
- package/dist/elements/Accordion/index.js.map +1 -1
- package/dist/elements/Accordion/index.mjs +317 -3
- package/dist/elements/Accordion/index.mjs.map +1 -1
- package/dist/elements/Avatar/index.js +461 -45
- package/dist/elements/Avatar/index.js.map +1 -1
- package/dist/elements/Avatar/index.mjs +456 -3
- package/dist/elements/Avatar/index.mjs.map +1 -1
- package/dist/elements/Badge/index.js +238 -36
- package/dist/elements/Badge/index.js.map +1 -1
- package/dist/elements/Badge/index.mjs +234 -4
- package/dist/elements/Badge/index.mjs.map +1 -1
- package/dist/elements/Breadcrumbs/index.js +808 -39
- package/dist/elements/Breadcrumbs/index.js.map +1 -1
- package/dist/elements/Breadcrumbs/index.mjs +810 -7
- package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
- package/dist/elements/Button/index.js +282 -19
- package/dist/elements/Button/index.js.map +1 -1
- package/dist/elements/Button/index.mjs +283 -4
- package/dist/elements/Button/index.mjs.map +1 -1
- package/dist/elements/ButtonGroup/index.js +229 -56
- package/dist/elements/ButtonGroup/index.js.map +1 -1
- package/dist/elements/ButtonGroup/index.mjs +222 -3
- 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 +563 -67
- package/dist/elements/Card/index.js.map +1 -1
- package/dist/elements/Card/index.mjs +560 -6
- package/dist/elements/Card/index.mjs.map +1 -1
- package/dist/elements/Carousel/index.js +782 -14
- package/dist/elements/Carousel/index.js.map +1 -1
- package/dist/elements/Carousel/index.mjs +786 -8
- package/dist/elements/Carousel/index.mjs.map +1 -1
- package/dist/elements/Chart/index.js +1833 -36
- package/dist/elements/Chart/index.js.map +1 -1
- package/dist/elements/Chart/index.mjs +1832 -4
- package/dist/elements/Chart/index.mjs.map +1 -1
- package/dist/elements/Checkbox/index.js +310 -39
- package/dist/elements/Checkbox/index.js.map +1 -1
- package/dist/elements/Checkbox/index.mjs +306 -4
- package/dist/elements/Checkbox/index.mjs.map +1 -1
- package/dist/elements/CheckboxGroup/index.js +445 -59
- package/dist/elements/CheckboxGroup/index.js.map +1 -1
- package/dist/elements/CheckboxGroup/index.mjs +439 -4
- package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
- package/dist/elements/DatePicker/index.js +871 -89
- package/dist/elements/DatePicker/index.js.map +1 -1
- package/dist/elements/DatePicker/index.mjs +853 -4
- package/dist/elements/DatePicker/index.mjs.map +1 -1
- package/dist/elements/Dropdown/index.js +189 -35
- package/dist/elements/Dropdown/index.js.map +1 -1
- package/dist/elements/Dropdown/index.mjs +184 -2
- package/dist/elements/Dropdown/index.mjs.map +1 -1
- package/dist/elements/FileField/index.js +1532 -129
- package/dist/elements/FileField/index.js.map +1 -1
- package/dist/elements/FileField/index.mjs +1507 -7
- package/dist/elements/FileField/index.mjs.map +1 -1
- package/dist/elements/FormLayout/index.js +166 -11
- package/dist/elements/FormLayout/index.js.map +1 -1
- package/dist/elements/FormLayout/index.mjs +167 -2
- package/dist/elements/FormLayout/index.mjs.map +1 -1
- package/dist/elements/Modal/index.js +228 -46
- package/dist/elements/Modal/index.js.map +1 -1
- package/dist/elements/Modal/index.mjs +220 -1
- package/dist/elements/Modal/index.mjs.map +1 -1
- package/dist/elements/NumberField/index.js +659 -48
- package/dist/elements/NumberField/index.js.map +1 -1
- package/dist/elements/NumberField/index.mjs +654 -6
- package/dist/elements/NumberField/index.mjs.map +1 -1
- package/dist/elements/OTPInput/index.js +729 -6
- package/dist/elements/OTPInput/index.js.map +1 -1
- package/dist/elements/OTPInput/index.mjs +732 -2
- package/dist/elements/OTPInput/index.mjs.map +1 -1
- package/dist/elements/Panel/index.js +326 -27
- package/dist/elements/Panel/index.js.map +1 -1
- package/dist/elements/Panel/index.mjs +323 -2
- package/dist/elements/Panel/index.mjs.map +1 -1
- package/dist/elements/Progress/index.js +181 -22
- package/dist/elements/Progress/index.js.map +1 -1
- package/dist/elements/Progress/index.mjs +181 -3
- package/dist/elements/Progress/index.mjs.map +1 -1
- package/dist/elements/RadioGroup/index.js +358 -34
- package/dist/elements/RadioGroup/index.js.map +1 -1
- package/dist/elements/RadioGroup/index.mjs +359 -4
- 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 +1568 -51
- package/dist/elements/Resizable/index.js.map +1 -1
- package/dist/elements/Resizable/index.mjs +1566 -6
- package/dist/elements/Resizable/index.mjs.map +1 -1
- package/dist/elements/Select/index.js +580 -22
- package/dist/elements/Select/index.js.map +1 -1
- package/dist/elements/Select/index.mjs +582 -2
- package/dist/elements/Select/index.mjs.map +1 -1
- package/dist/elements/Skeleton/index.js +77 -15
- package/dist/elements/Skeleton/index.js.map +1 -1
- package/dist/elements/Skeleton/index.mjs +78 -3
- package/dist/elements/Skeleton/index.mjs.map +1 -1
- package/dist/elements/Switch/index.js +153 -21
- package/dist/elements/Switch/index.js.map +1 -1
- package/dist/elements/Switch/index.mjs +149 -5
- package/dist/elements/Switch/index.mjs.map +1 -1
- package/dist/elements/Table/index.js +589 -68
- package/dist/elements/Table/index.js.map +1 -1
- package/dist/elements/Table/index.mjs +578 -5
- package/dist/elements/Table/index.mjs.map +1 -1
- package/dist/elements/Tabs/index.js +328 -63
- package/dist/elements/Tabs/index.js.map +1 -1
- package/dist/elements/Tabs/index.mjs +320 -3
- package/dist/elements/Tabs/index.mjs.map +1 -1
- package/dist/elements/TextField/index.js +695 -51
- package/dist/elements/TextField/index.js.map +1 -1
- package/dist/elements/TextField/index.mjs +684 -7
- package/dist/elements/TextField/index.mjs.map +1 -1
- package/dist/elements/TimeField/index.js +244 -33
- package/dist/elements/TimeField/index.js.map +1 -1
- package/dist/elements/TimeField/index.mjs +238 -2
- package/dist/elements/TimeField/index.mjs.map +1 -1
- package/dist/elements/Toast/index.js +727 -48
- package/dist/elements/Toast/index.js.map +1 -1
- package/dist/elements/Toast/index.mjs +724 -5
- package/dist/elements/Toast/index.mjs.map +1 -1
- package/dist/elements/Tooltip/index.js +315 -49
- package/dist/elements/Tooltip/index.js.map +1 -1
- package/dist/elements/Tooltip/index.mjs +310 -4
- package/dist/elements/Tooltip/index.mjs.map +1 -1
- package/dist/elements/index.js +12417 -799
- package/dist/elements/index.js.map +1 -1
- package/dist/elements/index.mjs +12233 -40
- package/dist/elements/index.mjs.map +1 -1
- package/dist/index.js +12452 -825
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +12262 -42
- package/dist/index.mjs.map +1 -1
- package/dist/schemas/index.js +47 -21
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/index.mjs +47 -2
- package/dist/schemas/index.mjs.map +1 -1
- package/dist/styles/index.js +161 -147
- package/dist/styles/index.js.map +1 -1
- package/dist/styles/index.mjs +128 -2
- package/dist/styles/index.mjs.map +1 -1
- package/dist/utils/index.js +7 -7
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +9 -2
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +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/styles/interaction-states.ts","../../../src/elements/ButtonGroup/ButtonGroupContext.tsx","../../../src/elements/ButtonGroup/ButtonGroup.variants.ts","../../../src/elements/Button/Button.tsx","../../../src/elements/Button/index.ts","../../../src/elements/Carousel/Carousel.tsx","../../../src/elements/Carousel/index.ts","../../../src/elements/Skeleton/Skeleton.tsx","../../../src/elements/Carousel/LazyCarousel.tsx"],"names":["cva","AriaButton","init_Button","jsx","jsxs","Fragment","memo","forwardRef","Carousel","useState","useEffect"],"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\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, type ReactNode } from 'react';\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n} from 'react-aria-components';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Loader2, Zap } from 'lucide-react';\nimport { cn } from '../../utils/cn';\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 * 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 */\nconst 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 */\nconst 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 */\nconst buttonVariants = buttonVisualVariants;\n\nexport interface ButtonProps\n extends Omit<AriaButtonProps, 'className'>,\n VariantProps<typeof buttonVisualVariants> {\n as?: 'button' | 'a';\n loading?: boolean;\n loadingText?: string;\n shortcut?: string;\n className?: string;\n buttonVisualClassName?: string;\n children?: ReactNode;\n /** Enables paywall state - overrides variant styling and prevents normal action */\n paywall?: boolean;\n /** URL to open in new tab when paywalled button is clicked */\n paywallRedirect?: string;\n /** Description of the premium feature for tooltips and screen readers (max 200 chars) */\n paywallDescription?: string;\n /** Full width button */\n fullWidth?: boolean;\n /**\n * Visual size of the button (Layer 2)\n * Defaults to `size` for backward compatibility\n * Use independently for small visual buttons with large touch targets\n * @example <Button size=\"default\" visualSize=\"dot\" /> // 44px touch, 12px visual\n */\n visualSize?: 'sm' | 'default' | 'lg' | 'icon' | 'dot';\n /**\n * Size of the button - controls both touch target awareness and visual size\n * @deprecated For independent visual sizing, use visualSize prop instead\n */\n size?: 'sm' | 'default' | 'lg' | 'icon';\n}\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 };\n","/**\n * Button Component Exports\n * Barrel export for Button component and utilities\n *\n * 3-Layer Architecture (v0.9.0):\n * - buttonOuterVariants: Layer 1 - Touch target (44x44px)\n * - buttonVisualVariants: Layer 2 - Visual appearance\n * - buttonVariants: Deprecated alias for buttonVisualVariants\n *\n * @see 3layer-plan.md for architecture details\n * @see spec.md FR-029 to FR-037 (Button Component Requirements)\n * @see spec.md FR-038 (Tree-shakeable exports)\n */\n\nexport {\n Button,\n buttonOuterVariants,\n buttonVisualVariants,\n /** @deprecated Use buttonVisualVariants instead */\n buttonVariants,\n} from './Button';\nexport type { ButtonProps } from './Button';\n","'use client';\n\n/**\n * Carousel Component\n * Accessible carousel for displaying rotating content with React Node support\n *\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport { Button } from '../Button';\nimport { PauseIcon, PlayIcon, ChevronUpIcon, ChevronDownIcon } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport type { CarouselProps, ItemManifest } from './Carousel.types';\n\n/**\n * Minimum duration for any item in milliseconds.\n * Prevents disorienting rapid transitions and allows screen readers time to announce.\n */\nconst MIN_ITEM_DURATION_MS = 1000;\n\n/**\n * Timer check interval in milliseconds.\n * Used for per-item timing mode to check if item should transition.\n */\nconst TIMER_CHECK_INTERVAL_MS = 1000;\n\n/**\n * Builds a manifest mapping cumulative time thresholds to item indices.\n * @param durations - Array of durations in milliseconds for each item\n * @returns Array of ItemManifest entries with startTime and endTime\n */\nfunction buildManifest(durations: number[]): ItemManifest[] {\n let cumulative = 0;\n return durations.map((duration, index) => {\n const start = cumulative;\n // Enforce minimum duration\n const safeDuration = Math.max(duration, MIN_ITEM_DURATION_MS);\n cumulative += safeDuration;\n return { index, startTime: start, endTime: cumulative };\n });\n}\n\n/**\n * Gets the item index that should be displayed for a given elapsed time.\n * @param manifest - Array of ItemManifest entries\n * @param elapsed - Current elapsed time in milliseconds\n * @returns The index of the item that should be displayed\n */\nfunction getCurrentItemIndex(manifest: ItemManifest[], elapsed: number): number {\n if (manifest.length === 0) return 0;\n\n const totalDuration = manifest[manifest.length - 1]?.endTime ?? 0;\n if (totalDuration === 0) return 0;\n\n // Normalize elapsed time to handle wraparound\n const normalizedElapsed = elapsed % totalDuration;\n\n const item = manifest.find(\n (m) => normalizedElapsed >= m.startTime && normalizedElapsed < m.endTime\n );\n return item?.index ?? 0;\n}\n\n/**\n * Validates whether per-item timing should be used.\n * @param itemsLength - Number of items in the carousel\n * @param itemDurations - Optional array of durations\n * @param autoRotateInterval - The autoRotateInterval setting\n * @returns true if per-item timing should be used\n */\nfunction shouldUsePerItemTiming(\n itemsLength: number,\n itemDurations: number[] | undefined,\n autoRotateInterval: number\n): boolean {\n // Disabled if autoRotateInterval is 0\n if (autoRotateInterval === 0) return false;\n\n // Must have itemDurations array\n if (!itemDurations || itemDurations.length === 0) return false;\n\n // Array length must match items length\n if (itemDurations.length !== itemsLength) {\n console.warn(\n 'Carousel: itemDurations length does not match items length. ' +\n 'Falling back to autoRotateInterval.'\n );\n return false;\n }\n\n return true;\n}\n\nexport function Carousel({\n items,\n autoRotateInterval = 5000,\n defaultIndex = 0,\n currentIndex: controlledIndex,\n onIndexChange,\n isPaused: controlledIsPaused,\n onPauseChange,\n collapsible = false,\n defaultMinimized = false,\n isMinimized: controlledIsMinimized,\n onMinimizeChange,\n minimizedLabel = 'Carousel (minimized)',\n label = 'Carousel',\n slideLabel,\n showNavigation = true,\n showPlayPause = true,\n respectReducedMotion = true,\n className,\n slideClassName,\n navigationClassName,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n // Per-item timing props\n itemDurations,\n elapsedTime: controlledElapsedTime,\n onElapsedTimeChange,\n ...props\n}: CarouselProps): ReactNode {\n // Determine if component is controlled or uncontrolled\n const isControlled = controlledIndex !== undefined;\n const isPauseControlled = controlledIsPaused !== undefined;\n const isMinimizedControlled = controlledIsMinimized !== undefined;\n const isElapsedTimeControlled = controlledElapsedTime !== undefined;\n\n // Internal state for uncontrolled mode\n const [internalIndex, setInternalIndex] = useState(defaultIndex);\n const [internalIsPaused, setInternalIsPaused] = useState(false);\n const [internalIsMinimized, setInternalIsMinimized] = useState(defaultMinimized);\n\n // Calculate initial elapsed time based on defaultIndex if itemDurations is provided\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_internalElapsedTime, setInternalElapsedTime] = useState(() => {\n if (!itemDurations || itemDurations.length === 0) return 0;\n if (itemDurations.length !== items.length) return 0;\n if (defaultIndex === 0) return 0;\n\n // Build manifest to find the startTime for the default index\n const tempManifest = buildManifest(itemDurations);\n return tempManifest[defaultIndex]?.startTime ?? 0;\n });\n\n // Ref to track if carousel was playing before minimize\n const wasPlayingBeforeMinimize = useRef(false);\n\n // Use controlled value if provided, otherwise use internal state\n const currentIndex = isControlled ? controlledIndex : internalIndex;\n const isPaused = isPauseControlled ? controlledIsPaused : internalIsPaused;\n const isMinimized = isMinimizedControlled\n ? controlledIsMinimized\n : internalIsMinimized;\n // Determine if per-item timing should be used\n const usePerItemTiming = useMemo(\n () => shouldUsePerItemTiming(items.length, itemDurations, autoRotateInterval),\n [items.length, itemDurations, autoRotateInterval]\n );\n\n // Build the manifest for per-item timing (memoized)\n const manifest = useMemo(() => {\n if (!usePerItemTiming || !itemDurations) return [];\n return buildManifest(itemDurations);\n }, [usePerItemTiming, itemDurations]);\n\n // Calculate total duration (memoized)\n const totalDuration = useMemo(() => {\n if (manifest.length === 0) return 0;\n return manifest[manifest.length - 1]?.endTime ?? 0;\n }, [manifest]);\n\n // Navigation handler\n const goToSlide = useCallback(\n (index: number) => {\n if (isControlled) {\n onIndexChange?.(index);\n } else {\n setInternalIndex(index);\n }\n\n // For per-item timing, jump elapsed time to item's startTime\n if (usePerItemTiming && manifest[index]) {\n const newElapsed = manifest[index].startTime;\n if (!isElapsedTimeControlled) {\n setInternalElapsedTime(newElapsed);\n }\n onElapsedTimeChange?.(newElapsed);\n }\n\n // Pause when user manually navigates\n if (isPauseControlled) {\n onPauseChange?.(true);\n } else {\n setInternalIsPaused(true);\n }\n },\n [\n isControlled,\n isPauseControlled,\n isElapsedTimeControlled,\n onIndexChange,\n onPauseChange,\n onElapsedTimeChange,\n usePerItemTiming,\n manifest,\n ]\n );\n\n // Pause toggle handler\n const togglePause = useCallback(() => {\n const newPauseState = !isPaused;\n\n if (isPauseControlled) {\n onPauseChange?.(newPauseState);\n } else {\n setInternalIsPaused(newPauseState);\n }\n }, [isPaused, isPauseControlled, onPauseChange]);\n\n // Minimize toggle handler\n const toggleMinimize = useCallback(() => {\n const newMinimizedState = !isMinimized;\n\n if (newMinimizedState) {\n // Minimizing - track if we were playing\n wasPlayingBeforeMinimize.current = !isPaused;\n } else {\n // Expanding - resume if we were playing before\n if (wasPlayingBeforeMinimize.current && isPaused) {\n if (isPauseControlled) {\n onPauseChange?.(false);\n } else {\n setInternalIsPaused(false);\n }\n }\n wasPlayingBeforeMinimize.current = false;\n }\n\n if (isMinimizedControlled) {\n onMinimizeChange?.(newMinimizedState);\n } else {\n setInternalIsMinimized(newMinimizedState);\n }\n }, [isMinimized, isMinimizedControlled, onMinimizeChange, isPaused, isPauseControlled, onPauseChange]);\n\n // Reduced motion preference check effect\n useEffect(() => {\n // Check if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Respect user's motion preferences\n if (respectReducedMotion) {\n // Check if matchMedia is available (not available in all test environments)\n if (typeof window !== 'undefined' && window.matchMedia) {\n const prefersReducedMotion = window.matchMedia(\n '(prefers-reduced-motion: reduce)'\n ).matches;\n\n if (prefersReducedMotion) {\n if (isPauseControlled) {\n onPauseChange?.(true);\n } else {\n setInternalIsPaused(true);\n }\n }\n }\n }\n }, [autoRotateInterval, respectReducedMotion, isPauseControlled, onPauseChange]);\n\n // Ref to track current index for the interval callback\n const currentIndexRef = useRef(currentIndex);\n currentIndexRef.current = currentIndex;\n\n // Per-item timing effect (uncontrolled elapsed time)\n useEffect(() => {\n // Skip if not using per-item timing\n if (!usePerItemTiming) return;\n\n // Don't run if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Don't run if paused or minimized\n if (isPaused || isMinimized) return;\n\n // Don't run if elapsed time is controlled externally\n if (isElapsedTimeControlled) return;\n\n // Set up 1-second interval for timer ticks\n const interval = setInterval(() => {\n // Use functional update to get the latest elapsed time\n setInternalElapsedTime((prevElapsed) => {\n // Calculate new elapsed time\n let newElapsed = prevElapsed + TIMER_CHECK_INTERVAL_MS;\n\n // Handle wraparound\n if (totalDuration > 0 && newElapsed >= totalDuration) {\n newElapsed = 0;\n }\n\n // Fire callback (using the new elapsed value)\n onElapsedTimeChange?.(newElapsed);\n\n // Calculate current item from manifest\n const newIndex = getCurrentItemIndex(manifest, newElapsed);\n\n // Update index if changed (using ref for latest value)\n if (newIndex !== currentIndexRef.current) {\n if (isControlled) {\n onIndexChange?.(newIndex);\n } else {\n setInternalIndex(newIndex);\n }\n }\n\n return newElapsed;\n });\n }, TIMER_CHECK_INTERVAL_MS);\n\n return () => clearInterval(interval);\n }, [\n usePerItemTiming,\n autoRotateInterval,\n isPaused,\n isMinimized,\n isElapsedTimeControlled,\n totalDuration,\n manifest,\n isControlled,\n onIndexChange,\n onElapsedTimeChange,\n ]);\n\n // Standard auto-rotation effect (fallback when not using per-item timing)\n useEffect(() => {\n // Skip if using per-item timing\n if (usePerItemTiming) return;\n\n // Check if auto-rotation is disabled\n if (autoRotateInterval === 0) return;\n\n // Don't auto-rotate if paused or minimized\n if (isPaused || isMinimized) return;\n\n const interval = setInterval(() => {\n const nextIndex = (currentIndex + 1) % items.length;\n\n if (isControlled) {\n onIndexChange?.(nextIndex);\n } else {\n setInternalIndex(nextIndex);\n }\n }, autoRotateInterval);\n\n return () => clearInterval(interval);\n }, [\n usePerItemTiming,\n autoRotateInterval,\n currentIndex,\n isPaused,\n isMinimized,\n items.length,\n isControlled,\n onIndexChange,\n ]);\n\n // Effect to sync controlled elapsedTime to displayed index\n useEffect(() => {\n if (!usePerItemTiming || !isElapsedTimeControlled) return;\n\n const newIndex = getCurrentItemIndex(manifest, controlledElapsedTime);\n if (newIndex !== currentIndex) {\n if (isControlled) {\n onIndexChange?.(newIndex);\n } else {\n setInternalIndex(newIndex);\n }\n }\n }, [\n usePerItemTiming,\n isElapsedTimeControlled,\n controlledElapsedTime,\n manifest,\n currentIndex,\n isControlled,\n onIndexChange,\n ]);\n\n // Generate slide label\n const currentSlideLabel = slideLabel\n ? slideLabel(currentIndex, items.length)\n : `Slide ${currentIndex + 1} of ${items.length}`;\n\n return (\n <div\n className={cn(\n 'flex flex-col mb-4 transition-all duration-300',\n !isMinimized && 'space-y-4',\n className\n )}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label={isMinimized ? minimizedLabel : ariaLabel || label}\n aria-labelledby={ariaLabelledBy}\n {...props}\n >\n {/* Minimized State */}\n {isMinimized && collapsible ? (\n <div\n className={cn(\n 'bg-[var(--primary)] rounded-lg px-4 py-2 shadow-md',\n 'flex items-center justify-between gap-4'\n )}\n >\n <span className=\"text-[var(--primary-foreground)] text-sm\">\n {minimizedLabel} - {currentSlideLabel}\n </span>\n <Button\n variant=\"outline\"\n visualSize=\"icon\"\n onPress={toggleMinimize}\n aria-label=\"Expand carousel\"\n aria-expanded={false}\n >\n <ChevronUpIcon className=\"w-5 h-5\" />\n </Button>\n </div>\n ) : (\n <>\n {/* Current Slide */}\n <div\n key={currentIndex}\n className={cn(\n 'bg-[var(--primary)] rounded-lg p-4 overflow-hidden shadow-md',\n 'slide-in-animation',\n slideClassName\n )}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={currentSlideLabel}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n <div className=\"text-[var(--primary-foreground)] min-h-[2rem] flex items-center\">\n {items[currentIndex]}\n </div>\n </div>\n\n {/* Controls Container */}\n <div className=\"flex items-center justify-between gap-4\">\n {/* Navigation Dots */}\n {showNavigation && (\n <div\n className={cn('flex items-center', navigationClassName)}\n role=\"group\"\n aria-label=\"Slide navigation\"\n >\n {items.map((_, index) => (\n <Button\n key={index}\n variant={index === currentIndex ? 'default' : 'outline'}\n visualSize=\"dot\"\n onPress={() => goToSlide(index)}\n aria-label={`Go to slide ${index + 1}`}\n aria-current={index === currentIndex ? true : undefined}\n />\n ))}\n </div>\n )}\n\n {/* Right Controls Group */}\n <div className=\"flex items-center gap-2\">\n {/* Minimize Button */}\n {collapsible && (\n <Button\n variant=\"default\"\n visualSize=\"icon\"\n onPress={toggleMinimize}\n aria-label=\"Minimize carousel\"\n aria-expanded={true}\n >\n <ChevronDownIcon className=\"w-5 h-5\" />\n </Button>\n )}\n \n {/* Play/Pause Button */}\n {showPlayPause && autoRotateInterval > 0 && (\n <Button\n variant=\"default\"\n visualSize=\"icon\"\n onPress={togglePause}\n aria-label={isPaused ? 'Play carousel' : 'Pause carousel'}\n >\n {isPaused ? (\n <PlayIcon className=\"w-5 h-5\" />\n ) : (\n <PauseIcon className=\"w-5 h-5\" />\n )}\n </Button>\n )}\n </div>\n </div>\n </>\n )}\n </div>\n );\n}\n\nCarousel.displayName = 'Carousel';\n","export { Carousel } from './Carousel';\nexport { LazyCarousel } from './LazyCarousel';\nexport type { CarouselProps } from './Carousel.types';\nexport type { LazyCarouselProps } from './LazyCarousel';\n","\"use client\";\n\n/**\n * Skeleton Component\n * Loading placeholder with pulse animation and theme-aware styling\n *\n * @see ShadCN Skeleton: https://ui.shadcn.com/docs/components/skeleton\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see tasks.md Phase 2 (Green Phase - Implementation)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n/**\n * Skeleton variant styles using CVA\n * @see tasks.md Phase 2.2 (CVA Variant Definitions)\n */\nconst skeletonVariants = cva(\n // Base styles - pulse animation and theme-aware background\n \"animate-pulse bg-[var(--accent-background)] relative\",\n {\n variants: {\n // Shape variants\n variant: {\n rectangle: \"rounded-md\", // Default: 0.375rem border radius\n circle: \"rounded-full\", // Circular shape (for avatars, icons)\n text: \"rounded-sm h-4\", // Text line placeholder (1rem height, 0.125rem radius)\n },\n },\n defaultVariants: {\n variant: \"rectangle\",\n },\n }\n);\n\nexport interface SkeletonProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof skeletonVariants> {\n variant?: 'rectangle' | 'circle' | 'text';\n className?: string;\n}\n\n/**\n * Skeleton Component\n * Non-interactive loading placeholder with pulse animation\n *\n * @see tasks.md Phase 2.4 (Component Implementation)\n */\nconst Skeleton = memo(\n forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, variant, ...props }, ref) => {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n className={cn(skeletonVariants({ variant }), className)}\n {...props}\n >\n {/* Screen reader text for accessibility */}\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n }\n )\n);\n\nSkeleton.displayName = \"Skeleton\";\n\nexport { Skeleton, skeletonVariants };\n","'use client';\n\n/**\n * Lazy-loaded Carousel Component\n *\n * Only loads the Carousel component when:\n * 1. The viewport is large enough (configurable breakpoint)\n * 2. The component is mounted on the client\n *\n * Uses React Activity to preserve carousel state (current index, pause state,\n * elapsed time) when viewport resizes below breakpoint and back.\n *\n * This reduces initial bundle size for mobile users and improves TTI.\n *\n * @example\n * ```tsx\n * // Only loads on lg screens (1024px+)\n * <LazyCarousel items={items} label=\"Features\" />\n *\n * // Custom breakpoint\n * <LazyCarousel items={items} label=\"Features\" minWidth={768} />\n *\n * // Disable state preservation (unmount on resize)\n * <LazyCarousel items={items} label=\"Features\" preserveState={false} />\n * ```\n */\n\nimport { useState, useEffect, type ReactElement, type ComponentProps, Suspense, lazy, Activity } from 'react';\nimport { Skeleton } from '../Skeleton';\n\n// Lazy load the Carousel component\nconst Carousel = lazy(() =>\n import('./Carousel').then(mod => ({ default: mod.Carousel }))\n);\n\ntype CarouselProps = ComponentProps<typeof Carousel>;\n\nexport interface LazyCarouselProps extends CarouselProps {\n /** Minimum viewport width to load the carousel (default: 1024 for lg breakpoint) */\n minWidth?: number;\n /** Whether to preserve carousel state when hidden (default: true) */\n preserveState?: boolean;\n}\n\n/**\n * Carousel loading skeleton\n */\nfunction CarouselSkeleton(): ReactElement {\n return (\n <div className=\"flex flex-col gap-4 p-4\">\n <Skeleton className=\"h-8 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <div className=\"flex gap-2 mt-4\">\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n <Skeleton className=\"h-3 w-3 rounded-full\" />\n </div>\n </div>\n );\n}\n\n/**\n * LazyCarousel - Only loads on screens meeting minimum width\n *\n * Use this instead of Carousel when the carousel is only visible\n * on larger screens (e.g., hidden on mobile with `hidden lg:block`).\n *\n * State preservation: When the viewport shrinks below minWidth and then\n * expands again, the carousel will resume from where it left off (same\n * slide, same pause state) instead of resetting to the beginning.\n */\nexport function LazyCarousel({\n minWidth = 1024,\n preserveState = true,\n ...props\n}: LazyCarouselProps): ReactElement | null {\n const [isVisible, setIsVisible] = useState(false);\n const [hasLoaded, setHasLoaded] = useState(false);\n const [isClient, setIsClient] = useState(false);\n\n useEffect(() => {\n setIsClient(true);\n\n // Check if viewport is large enough\n const checkViewport = (): void => {\n const visible = window.innerWidth >= minWidth;\n setIsVisible(visible);\n if (visible) {\n setHasLoaded(true);\n }\n };\n\n checkViewport();\n\n // Listen for resize events\n window.addEventListener('resize', checkViewport);\n return () => window.removeEventListener('resize', checkViewport);\n }, [minWidth]);\n\n // Don't render anything on server\n if (!isClient) {\n return null;\n }\n\n // If never loaded and not visible, don't load\n if (!hasLoaded && !isVisible) {\n return null;\n }\n\n // Use Activity to preserve state when hidden (viewport too small)\n // This allows the carousel to resume from where it left off when\n // the viewport expands again\n return (\n <Activity mode={preserveState && !isVisible ? 'hidden' : 'visible'}>\n <Suspense fallback={<CarouselSkeleton />}>\n <Carousel {...props} />\n </Suspense>\n </Activity>\n );\n}\n"]}
|