@tribepad/themis 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/LICENSE +21 -0
- package/README.md +114 -0
- package/dist/Carousel-NTZX5TOW.js +16 -0
- package/dist/Carousel-NTZX5TOW.js.map +1 -0
- package/dist/Carousel-YH3DOQJU.mjs +7 -0
- package/dist/Carousel-YH3DOQJU.mjs.map +1 -0
- package/dist/chunk-2HIUTHMU.mjs +234 -0
- package/dist/chunk-2HIUTHMU.mjs.map +1 -0
- package/dist/chunk-34GTFTDO.js +431 -0
- package/dist/chunk-34GTFTDO.js.map +1 -0
- package/dist/chunk-3H7ASYR7.js +250 -0
- package/dist/chunk-3H7ASYR7.js.map +1 -0
- package/dist/chunk-3IEN7JOP.js +316 -0
- package/dist/chunk-3IEN7JOP.js.map +1 -0
- package/dist/chunk-3JHN4GAL.js +326 -0
- package/dist/chunk-3JHN4GAL.js.map +1 -0
- package/dist/chunk-3MJPASQU.js +232 -0
- package/dist/chunk-3MJPASQU.js.map +1 -0
- package/dist/chunk-3XD2JUL3.js +572 -0
- package/dist/chunk-3XD2JUL3.js.map +1 -0
- package/dist/chunk-3YOY2VJ6.js +189 -0
- package/dist/chunk-3YOY2VJ6.js.map +1 -0
- package/dist/chunk-4DU5JSXB.js +408 -0
- package/dist/chunk-4DU5JSXB.js.map +1 -0
- package/dist/chunk-4E4E2GSS.js +352 -0
- package/dist/chunk-4E4E2GSS.js.map +1 -0
- package/dist/chunk-4NHAP4AN.mjs +3 -0
- package/dist/chunk-4NHAP4AN.mjs.map +1 -0
- package/dist/chunk-4S33J5NY.mjs +415 -0
- package/dist/chunk-4S33J5NY.mjs.map +1 -0
- package/dist/chunk-5SMGRT3G.mjs +354 -0
- package/dist/chunk-5SMGRT3G.mjs.map +1 -0
- package/dist/chunk-5SVLJN2C.mjs +22 -0
- package/dist/chunk-5SVLJN2C.mjs.map +1 -0
- package/dist/chunk-66WTU4EB.mjs +299 -0
- package/dist/chunk-66WTU4EB.mjs.map +1 -0
- package/dist/chunk-6S25NMOT.mjs +335 -0
- package/dist/chunk-6S25NMOT.mjs.map +1 -0
- package/dist/chunk-6SP7UB3D.js +4 -0
- package/dist/chunk-6SP7UB3D.js.map +1 -0
- package/dist/chunk-6TYWWQHM.mjs +565 -0
- package/dist/chunk-6TYWWQHM.mjs.map +1 -0
- package/dist/chunk-A3YUJA6W.mjs +384 -0
- package/dist/chunk-A3YUJA6W.mjs.map +1 -0
- package/dist/chunk-A6KEDVUR.js +61 -0
- package/dist/chunk-A6KEDVUR.js.map +1 -0
- package/dist/chunk-A77RUEWL.js +730 -0
- package/dist/chunk-A77RUEWL.js.map +1 -0
- package/dist/chunk-AA4IKMPE.mjs +3 -0
- package/dist/chunk-AA4IKMPE.mjs.map +1 -0
- package/dist/chunk-AKIA6GW6.mjs +163 -0
- package/dist/chunk-AKIA6GW6.mjs.map +1 -0
- package/dist/chunk-AL6P275L.mjs +435 -0
- package/dist/chunk-AL6P275L.mjs.map +1 -0
- package/dist/chunk-AZ3RJYTB.js +37 -0
- package/dist/chunk-AZ3RJYTB.js.map +1 -0
- package/dist/chunk-B5Q4UPL6.js +32 -0
- package/dist/chunk-B5Q4UPL6.js.map +1 -0
- package/dist/chunk-B6DHPMDP.mjs +335 -0
- package/dist/chunk-B6DHPMDP.mjs.map +1 -0
- package/dist/chunk-BDXKKMBZ.mjs +184 -0
- package/dist/chunk-BDXKKMBZ.mjs.map +1 -0
- package/dist/chunk-BL6E2DLZ.mjs +52 -0
- package/dist/chunk-BL6E2DLZ.mjs.map +1 -0
- package/dist/chunk-CGFDS4XS.mjs +121 -0
- package/dist/chunk-CGFDS4XS.mjs.map +1 -0
- package/dist/chunk-CJIW5TKI.js +139 -0
- package/dist/chunk-CJIW5TKI.js.map +1 -0
- package/dist/chunk-CKNISJOQ.js +314 -0
- package/dist/chunk-CKNISJOQ.js.map +1 -0
- package/dist/chunk-D6CBOECS.mjs +1757 -0
- package/dist/chunk-D6CBOECS.mjs.map +1 -0
- package/dist/chunk-DDWEVC2S.js +166 -0
- package/dist/chunk-DDWEVC2S.js.map +1 -0
- package/dist/chunk-DZ556D2F.mjs +176 -0
- package/dist/chunk-DZ556D2F.mjs.map +1 -0
- package/dist/chunk-E2KQFV3O.mjs +10 -0
- package/dist/chunk-E2KQFV3O.mjs.map +1 -0
- package/dist/chunk-EMMLADSC.js +126 -0
- package/dist/chunk-EMMLADSC.js.map +1 -0
- package/dist/chunk-EP4WOI5D.mjs +926 -0
- package/dist/chunk-EP4WOI5D.mjs.map +1 -0
- package/dist/chunk-FJRXLJC2.mjs +160 -0
- package/dist/chunk-FJRXLJC2.mjs.map +1 -0
- package/dist/chunk-FKQI434R.js +345 -0
- package/dist/chunk-FKQI434R.js.map +1 -0
- package/dist/chunk-FPKEAJRZ.mjs +100 -0
- package/dist/chunk-FPKEAJRZ.mjs.map +1 -0
- package/dist/chunk-FWQYB22U.js +183 -0
- package/dist/chunk-FWQYB22U.js.map +1 -0
- package/dist/chunk-GD5GHTMA.js +189 -0
- package/dist/chunk-GD5GHTMA.js.map +1 -0
- package/dist/chunk-GE5XTSDZ.js +447 -0
- package/dist/chunk-GE5XTSDZ.js.map +1 -0
- package/dist/chunk-GVE47ZAX.mjs +32 -0
- package/dist/chunk-GVE47ZAX.mjs.map +1 -0
- package/dist/chunk-HK46BT5U.mjs +18 -0
- package/dist/chunk-HK46BT5U.mjs.map +1 -0
- package/dist/chunk-HQVRMR6N.js +365 -0
- package/dist/chunk-HQVRMR6N.js.map +1 -0
- package/dist/chunk-HSGBJPJO.mjs +398 -0
- package/dist/chunk-HSGBJPJO.mjs.map +1 -0
- package/dist/chunk-I3AUTOMZ.mjs +125 -0
- package/dist/chunk-I3AUTOMZ.mjs.map +1 -0
- package/dist/chunk-IEI5LD5C.mjs +1161 -0
- package/dist/chunk-IEI5LD5C.mjs.map +1 -0
- package/dist/chunk-IIPTC2X7.mjs +118 -0
- package/dist/chunk-IIPTC2X7.mjs.map +1 -0
- package/dist/chunk-J7TLHF2Q.js +4 -0
- package/dist/chunk-J7TLHF2Q.js.map +1 -0
- package/dist/chunk-JJOWXFXQ.mjs +765 -0
- package/dist/chunk-JJOWXFXQ.mjs.map +1 -0
- package/dist/chunk-JPTSS2OA.mjs +3 -0
- package/dist/chunk-JPTSS2OA.mjs.map +1 -0
- package/dist/chunk-KFXXRLTP.js +396 -0
- package/dist/chunk-KFXXRLTP.js.map +1 -0
- package/dist/chunk-KPRRBSG6.mjs +272 -0
- package/dist/chunk-KPRRBSG6.mjs.map +1 -0
- package/dist/chunk-NFSBGRDB.mjs +57 -0
- package/dist/chunk-NFSBGRDB.mjs.map +1 -0
- package/dist/chunk-NGJVCFTM.js +219 -0
- package/dist/chunk-NGJVCFTM.js.map +1 -0
- package/dist/chunk-NSQ6MZJ6.mjs +728 -0
- package/dist/chunk-NSQ6MZJ6.mjs.map +1 -0
- package/dist/chunk-NYQYHT76.mjs +296 -0
- package/dist/chunk-NYQYHT76.mjs.map +1 -0
- package/dist/chunk-OLJJGI5B.js +1193 -0
- package/dist/chunk-OLJJGI5B.js.map +1 -0
- package/dist/chunk-Q3572X2J.js +292 -0
- package/dist/chunk-Q3572X2J.js.map +1 -0
- package/dist/chunk-QH7N7D4I.mjs +210 -0
- package/dist/chunk-QH7N7D4I.mjs.map +1 -0
- package/dist/chunk-R7XUIV25.js +466 -0
- package/dist/chunk-R7XUIV25.js.map +1 -0
- package/dist/chunk-RFFO4KPM.js +135 -0
- package/dist/chunk-RFFO4KPM.js.map +1 -0
- package/dist/chunk-RFX7QKA7.mjs +180 -0
- package/dist/chunk-RFX7QKA7.mjs.map +1 -0
- package/dist/chunk-SN5LFAP3.js +940 -0
- package/dist/chunk-SN5LFAP3.js.map +1 -0
- package/dist/chunk-T4COXKQ3.js +24 -0
- package/dist/chunk-T4COXKQ3.js.map +1 -0
- package/dist/chunk-TS54QM27.js +125 -0
- package/dist/chunk-TS54QM27.js.map +1 -0
- package/dist/chunk-UE2S4PCX.mjs +220 -0
- package/dist/chunk-UE2S4PCX.mjs.map +1 -0
- package/dist/chunk-UTW3QX2A.mjs +282 -0
- package/dist/chunk-UTW3QX2A.mjs.map +1 -0
- package/dist/chunk-V74LGMAE.js +1767 -0
- package/dist/chunk-V74LGMAE.js.map +1 -0
- package/dist/chunk-VIREG536.js +12 -0
- package/dist/chunk-VIREG536.js.map +1 -0
- package/dist/chunk-VY7M7346.js +4 -0
- package/dist/chunk-VY7M7346.js.map +1 -0
- package/dist/chunk-W3TJOO7H.mjs +319 -0
- package/dist/chunk-W3TJOO7H.mjs.map +1 -0
- package/dist/chunk-WIUOB36M.js +54 -0
- package/dist/chunk-WIUOB36M.js.map +1 -0
- package/dist/chunk-WJGLM4CY.js +291 -0
- package/dist/chunk-WJGLM4CY.js.map +1 -0
- package/dist/chunk-WNURH5OO.mjs +453 -0
- package/dist/chunk-WNURH5OO.mjs.map +1 -0
- package/dist/chunk-X25TNRSD.mjs +364 -0
- package/dist/chunk-X25TNRSD.mjs.map +1 -0
- package/dist/chunk-Y3GT7ETK.js +108 -0
- package/dist/chunk-Y3GT7ETK.js.map +1 -0
- package/dist/chunk-Z4FRNOF6.mjs +115 -0
- package/dist/chunk-Z4FRNOF6.mjs.map +1 -0
- package/dist/chunk-ZMYLD3BN.js +166 -0
- package/dist/chunk-ZMYLD3BN.js.map +1 -0
- package/dist/chunk-ZP2KV6EX.js +815 -0
- package/dist/chunk-ZP2KV6EX.js.map +1 -0
- package/dist/chunk-ZVKXFELU.js +366 -0
- package/dist/chunk-ZVKXFELU.js.map +1 -0
- package/dist/elements/Accordion/Accordion.d.ts +139 -0
- package/dist/elements/Accordion/Accordion.d.ts.map +1 -0
- package/dist/elements/Accordion/Accordion.types.d.ts +143 -0
- package/dist/elements/Accordion/Accordion.types.d.ts.map +1 -0
- package/dist/elements/Accordion/index.d.ts +13 -0
- package/dist/elements/Accordion/index.d.ts.map +1 -0
- package/dist/elements/Accordion/index.js +78 -0
- package/dist/elements/Accordion/index.js.map +1 -0
- package/dist/elements/Accordion/index.mjs +5 -0
- package/dist/elements/Accordion/index.mjs.map +1 -0
- package/dist/elements/Avatar/Avatar.d.ts +51 -0
- package/dist/elements/Avatar/Avatar.d.ts.map +1 -0
- package/dist/elements/Avatar/Avatar.types.d.ts +145 -0
- package/dist/elements/Avatar/Avatar.types.d.ts.map +1 -0
- package/dist/elements/Avatar/AvatarGroup.d.ts +32 -0
- package/dist/elements/Avatar/AvatarGroup.d.ts.map +1 -0
- package/dist/elements/Avatar/index.d.ts +11 -0
- package/dist/elements/Avatar/index.d.ts.map +1 -0
- package/dist/elements/Avatar/index.js +54 -0
- package/dist/elements/Avatar/index.js.map +1 -0
- package/dist/elements/Avatar/index.mjs +5 -0
- package/dist/elements/Avatar/index.mjs.map +1 -0
- package/dist/elements/Badge/Badge.d.ts +39 -0
- package/dist/elements/Badge/Badge.d.ts.map +1 -0
- package/dist/elements/Badge/Badge.types.d.ts +76 -0
- package/dist/elements/Badge/Badge.types.d.ts.map +1 -0
- package/dist/elements/Badge/index.d.ts +18 -0
- package/dist/elements/Badge/index.d.ts.map +1 -0
- package/dist/elements/Badge/index.js +43 -0
- package/dist/elements/Badge/index.js.map +1 -0
- package/dist/elements/Badge/index.mjs +6 -0
- package/dist/elements/Badge/index.mjs.map +1 -0
- package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts +91 -0
- package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts.map +1 -0
- package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts +114 -0
- package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -0
- package/dist/elements/Breadcrumbs/index.d.ts +14 -0
- package/dist/elements/Breadcrumbs/index.d.ts.map +1 -0
- package/dist/elements/Breadcrumbs/index.js +54 -0
- package/dist/elements/Breadcrumbs/index.js.map +1 -0
- package/dist/elements/Breadcrumbs/index.mjs +9 -0
- package/dist/elements/Breadcrumbs/index.mjs.map +1 -0
- package/dist/elements/Button/Button.d.ts +92 -0
- package/dist/elements/Button/Button.d.ts.map +1 -0
- package/dist/elements/Button/Button.types.d.ts +54 -0
- package/dist/elements/Button/Button.types.d.ts.map +1 -0
- package/dist/elements/Button/index.d.ts +18 -0
- package/dist/elements/Button/index.d.ts.map +1 -0
- package/dist/elements/Button/index.js +27 -0
- package/dist/elements/Button/index.js.map +1 -0
- package/dist/elements/Button/index.mjs +6 -0
- package/dist/elements/Button/index.mjs.map +1 -0
- package/dist/elements/ButtonGroup/ButtonGroup.d.ts +53 -0
- package/dist/elements/ButtonGroup/ButtonGroup.d.ts.map +1 -0
- package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts +98 -0
- package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts.map +1 -0
- package/dist/elements/ButtonGroup/ButtonGroup.utils.d.ts +60 -0
- package/dist/elements/ButtonGroup/ButtonGroup.utils.d.ts.map +1 -0
- package/dist/elements/ButtonGroup/ButtonGroup.variants.d.ts +39 -0
- package/dist/elements/ButtonGroup/ButtonGroup.variants.d.ts.map +1 -0
- package/dist/elements/ButtonGroup/ButtonGroupContext.d.ts +42 -0
- package/dist/elements/ButtonGroup/ButtonGroupContext.d.ts.map +1 -0
- package/dist/elements/ButtonGroup/index.d.ts +35 -0
- package/dist/elements/ButtonGroup/index.d.ts.map +1 -0
- package/dist/elements/ButtonGroup/index.js +66 -0
- package/dist/elements/ButtonGroup/index.js.map +1 -0
- package/dist/elements/ButtonGroup/index.mjs +5 -0
- package/dist/elements/ButtonGroup/index.mjs.map +1 -0
- package/dist/elements/Card/Card.d.ts +104 -0
- package/dist/elements/Card/Card.d.ts.map +1 -0
- package/dist/elements/Card/Card.types.d.ts +227 -0
- package/dist/elements/Card/Card.types.d.ts.map +1 -0
- package/dist/elements/Card/index.d.ts +38 -0
- package/dist/elements/Card/index.d.ts.map +1 -0
- package/dist/elements/Card/index.js +85 -0
- package/dist/elements/Card/index.js.map +1 -0
- package/dist/elements/Card/index.mjs +8 -0
- package/dist/elements/Card/index.mjs.map +1 -0
- package/dist/elements/Carousel/Carousel.d.ts +13 -0
- package/dist/elements/Carousel/Carousel.d.ts.map +1 -0
- package/dist/elements/Carousel/Carousel.types.d.ts +65 -0
- package/dist/elements/Carousel/Carousel.types.d.ts.map +1 -0
- package/dist/elements/Carousel/LazyCarousel.d.ts +46 -0
- package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -0
- package/dist/elements/Carousel/index.d.ts +5 -0
- package/dist/elements/Carousel/index.d.ts.map +1 -0
- package/dist/elements/Carousel/index.js +23 -0
- package/dist/elements/Carousel/index.js.map +1 -0
- package/dist/elements/Carousel/index.mjs +10 -0
- package/dist/elements/Carousel/index.mjs.map +1 -0
- package/dist/elements/Chart/Chart.d.ts +44 -0
- package/dist/elements/Chart/Chart.d.ts.map +1 -0
- package/dist/elements/Chart/Chart.types.d.ts +254 -0
- package/dist/elements/Chart/Chart.types.d.ts.map +1 -0
- package/dist/elements/Chart/ChartAnnouncer.d.ts +24 -0
- package/dist/elements/Chart/ChartAnnouncer.d.ts.map +1 -0
- package/dist/elements/Chart/ChartAxis.d.ts +42 -0
- package/dist/elements/Chart/ChartAxis.d.ts.map +1 -0
- package/dist/elements/Chart/ChartBarSeries.d.ts +54 -0
- package/dist/elements/Chart/ChartBarSeries.d.ts.map +1 -0
- package/dist/elements/Chart/ChartContext.d.ts +46 -0
- package/dist/elements/Chart/ChartContext.d.ts.map +1 -0
- package/dist/elements/Chart/ChartDataPoint.d.ts +56 -0
- package/dist/elements/Chart/ChartDataPoint.d.ts.map +1 -0
- package/dist/elements/Chart/ChartDataTable.d.ts +35 -0
- package/dist/elements/Chart/ChartDataTable.d.ts.map +1 -0
- package/dist/elements/Chart/ChartGrid.d.ts +32 -0
- package/dist/elements/Chart/ChartGrid.d.ts.map +1 -0
- package/dist/elements/Chart/ChartLegend.d.ts +32 -0
- package/dist/elements/Chart/ChartLegend.d.ts.map +1 -0
- package/dist/elements/Chart/ChartLineSeries.d.ts +52 -0
- package/dist/elements/Chart/ChartLineSeries.d.ts.map +1 -0
- package/dist/elements/Chart/ChartSVG.d.ts +62 -0
- package/dist/elements/Chart/ChartSVG.d.ts.map +1 -0
- package/dist/elements/Chart/ChartTooltip.d.ts +45 -0
- package/dist/elements/Chart/ChartTooltip.d.ts.map +1 -0
- package/dist/elements/Chart/chart.constants.d.ts +108 -0
- package/dist/elements/Chart/chart.constants.d.ts.map +1 -0
- package/dist/elements/Chart/chart.variants.d.ts +45 -0
- package/dist/elements/Chart/chart.variants.d.ts.map +1 -0
- package/dist/elements/Chart/index.d.ts +12 -0
- package/dist/elements/Chart/index.d.ts.map +1 -0
- package/dist/elements/Chart/index.js +47 -0
- package/dist/elements/Chart/index.js.map +1 -0
- package/dist/elements/Chart/index.mjs +6 -0
- package/dist/elements/Chart/index.mjs.map +1 -0
- package/dist/elements/Chart/useChartDimensions.d.ts +18 -0
- package/dist/elements/Chart/useChartDimensions.d.ts.map +1 -0
- package/dist/elements/Chart/useChartKeyboard.d.ts +42 -0
- package/dist/elements/Chart/useChartKeyboard.d.ts.map +1 -0
- package/dist/elements/Chart/useRovingTabIndex.d.ts +46 -0
- package/dist/elements/Chart/useRovingTabIndex.d.ts.map +1 -0
- package/dist/elements/Checkbox/Checkbox.d.ts +94 -0
- package/dist/elements/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/elements/Checkbox/Checkbox.types.d.ts +82 -0
- package/dist/elements/Checkbox/Checkbox.types.d.ts.map +1 -0
- package/dist/elements/Checkbox/index.d.ts +7 -0
- package/dist/elements/Checkbox/index.d.ts.map +1 -0
- package/dist/elements/Checkbox/index.js +47 -0
- package/dist/elements/Checkbox/index.js.map +1 -0
- package/dist/elements/Checkbox/index.mjs +6 -0
- package/dist/elements/Checkbox/index.mjs.map +1 -0
- package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts +130 -0
- package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts.map +1 -0
- package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts +142 -0
- package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts.map +1 -0
- package/dist/elements/CheckboxGroup/index.d.ts +10 -0
- package/dist/elements/CheckboxGroup/index.d.ts.map +1 -0
- package/dist/elements/CheckboxGroup/index.js +71 -0
- package/dist/elements/CheckboxGroup/index.js.map +1 -0
- package/dist/elements/CheckboxGroup/index.mjs +6 -0
- package/dist/elements/CheckboxGroup/index.mjs.map +1 -0
- package/dist/elements/DatePicker/Calendar.d.ts +16 -0
- package/dist/elements/DatePicker/Calendar.d.ts.map +1 -0
- package/dist/elements/DatePicker/DateField.d.ts +13 -0
- package/dist/elements/DatePicker/DateField.d.ts.map +1 -0
- package/dist/elements/DatePicker/DatePicker.d.ts +16 -0
- package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/elements/DatePicker/DatePicker.types.d.ts +390 -0
- package/dist/elements/DatePicker/DatePicker.types.d.ts.map +1 -0
- package/dist/elements/DatePicker/DatePicker.variants.d.ts +42 -0
- package/dist/elements/DatePicker/DatePicker.variants.d.ts.map +1 -0
- package/dist/elements/DatePicker/DateRangePicker.d.ts +13 -0
- package/dist/elements/DatePicker/DateRangePicker.d.ts.map +1 -0
- package/dist/elements/DatePicker/index.d.ts +14 -0
- package/dist/elements/DatePicker/index.d.ts.map +1 -0
- package/dist/elements/DatePicker/index.js +123 -0
- package/dist/elements/DatePicker/index.js.map +1 -0
- package/dist/elements/DatePicker/index.mjs +6 -0
- package/dist/elements/DatePicker/index.mjs.map +1 -0
- package/dist/elements/Dropdown/Dropdown.d.ts +197 -0
- package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -0
- package/dist/elements/Dropdown/Dropdown.types.d.ts +175 -0
- package/dist/elements/Dropdown/Dropdown.types.d.ts.map +1 -0
- package/dist/elements/Dropdown/index.d.ts +12 -0
- package/dist/elements/Dropdown/index.d.ts.map +1 -0
- package/dist/elements/Dropdown/index.js +41 -0
- package/dist/elements/Dropdown/index.js.map +1 -0
- package/dist/elements/Dropdown/index.mjs +4 -0
- package/dist/elements/Dropdown/index.mjs.map +1 -0
- package/dist/elements/FileField/FileField.d.ts +46 -0
- package/dist/elements/FileField/FileField.d.ts.map +1 -0
- package/dist/elements/FileField/FileField.types.d.ts +99 -0
- package/dist/elements/FileField/FileField.types.d.ts.map +1 -0
- package/dist/elements/FileField/FileField.variants.d.ts +49 -0
- package/dist/elements/FileField/FileField.variants.d.ts.map +1 -0
- package/dist/elements/FileField/FilePreview.d.ts +27 -0
- package/dist/elements/FileField/FilePreview.d.ts.map +1 -0
- package/dist/elements/FileField/FileProgress.d.ts +35 -0
- package/dist/elements/FileField/FileProgress.d.ts.map +1 -0
- package/dist/elements/FileField/FileProgress.variants.d.ts +55 -0
- package/dist/elements/FileField/FileProgress.variants.d.ts.map +1 -0
- package/dist/elements/FileField/index.d.ts +41 -0
- package/dist/elements/FileField/index.d.ts.map +1 -0
- package/dist/elements/FileField/index.js +138 -0
- package/dist/elements/FileField/index.js.map +1 -0
- package/dist/elements/FileField/index.mjs +9 -0
- package/dist/elements/FileField/index.mjs.map +1 -0
- package/dist/elements/FileField/useFilePreview.d.ts +46 -0
- package/dist/elements/FileField/useFilePreview.d.ts.map +1 -0
- package/dist/elements/FileField/utils.d.ts +134 -0
- package/dist/elements/FileField/utils.d.ts.map +1 -0
- package/dist/elements/FormLayout/FormLayout.d.ts +51 -0
- package/dist/elements/FormLayout/FormLayout.d.ts.map +1 -0
- package/dist/elements/FormLayout/FormLayout.types.d.ts +66 -0
- package/dist/elements/FormLayout/FormLayout.types.d.ts.map +1 -0
- package/dist/elements/FormLayout/index.d.ts +3 -0
- package/dist/elements/FormLayout/index.d.ts.map +1 -0
- package/dist/elements/FormLayout/index.js +17 -0
- package/dist/elements/FormLayout/index.js.map +1 -0
- package/dist/elements/FormLayout/index.mjs +4 -0
- package/dist/elements/FormLayout/index.mjs.map +1 -0
- package/dist/elements/Modal/Modal.d.ts +168 -0
- package/dist/elements/Modal/Modal.d.ts.map +1 -0
- package/dist/elements/Modal/Modal.types.d.ts +265 -0
- package/dist/elements/Modal/Modal.types.d.ts.map +1 -0
- package/dist/elements/Modal/index.d.ts +14 -0
- package/dist/elements/Modal/index.d.ts.map +1 -0
- package/dist/elements/Modal/index.js +52 -0
- package/dist/elements/Modal/index.js.map +1 -0
- package/dist/elements/Modal/index.mjs +3 -0
- package/dist/elements/Modal/index.mjs.map +1 -0
- package/dist/elements/NumberField/NumberField.d.ts +43 -0
- package/dist/elements/NumberField/NumberField.d.ts.map +1 -0
- package/dist/elements/NumberField/NumberField.types.d.ts +112 -0
- package/dist/elements/NumberField/NumberField.types.d.ts.map +1 -0
- package/dist/elements/NumberField/NumberField.variants.d.ts +82 -0
- package/dist/elements/NumberField/NumberField.variants.d.ts.map +1 -0
- package/dist/elements/NumberField/index.d.ts +25 -0
- package/dist/elements/NumberField/index.d.ts.map +1 -0
- package/dist/elements/NumberField/index.js +57 -0
- package/dist/elements/NumberField/index.js.map +1 -0
- package/dist/elements/NumberField/index.mjs +8 -0
- package/dist/elements/NumberField/index.mjs.map +1 -0
- package/dist/elements/OTPInput/OTPInput.d.ts +105 -0
- package/dist/elements/OTPInput/OTPInput.d.ts.map +1 -0
- package/dist/elements/OTPInput/OTPInput.styles.d.ts +83 -0
- package/dist/elements/OTPInput/OTPInput.styles.d.ts.map +1 -0
- package/dist/elements/OTPInput/OTPInput.types.d.ts +189 -0
- package/dist/elements/OTPInput/OTPInput.types.d.ts.map +1 -0
- package/dist/elements/OTPInput/components/OTPDigit.d.ts +51 -0
- package/dist/elements/OTPInput/components/OTPDigit.d.ts.map +1 -0
- package/dist/elements/OTPInput/hooks/useOTPInput.d.ts +36 -0
- package/dist/elements/OTPInput/hooks/useOTPInput.d.ts.map +1 -0
- package/dist/elements/OTPInput/hooks/useOTPKeyboard.d.ts +59 -0
- package/dist/elements/OTPInput/hooks/useOTPKeyboard.d.ts.map +1 -0
- package/dist/elements/OTPInput/index.d.ts +27 -0
- package/dist/elements/OTPInput/index.d.ts.map +1 -0
- package/dist/elements/OTPInput/index.js +13 -0
- package/dist/elements/OTPInput/index.js.map +1 -0
- package/dist/elements/OTPInput/index.mjs +4 -0
- package/dist/elements/OTPInput/index.mjs.map +1 -0
- package/dist/elements/Panel/Panel.d.ts +111 -0
- package/dist/elements/Panel/Panel.d.ts.map +1 -0
- package/dist/elements/Panel/Panel.types.d.ts +243 -0
- package/dist/elements/Panel/Panel.types.d.ts.map +1 -0
- package/dist/elements/Panel/index.d.ts +4 -0
- package/dist/elements/Panel/index.d.ts.map +1 -0
- package/dist/elements/Panel/index.js +33 -0
- package/dist/elements/Panel/index.js.map +1 -0
- package/dist/elements/Panel/index.mjs +4 -0
- package/dist/elements/Panel/index.mjs.map +1 -0
- package/dist/elements/Progress/Progress.d.ts +44 -0
- package/dist/elements/Progress/Progress.d.ts.map +1 -0
- package/dist/elements/Progress/Progress.types.d.ts +64 -0
- package/dist/elements/Progress/Progress.types.d.ts.map +1 -0
- package/dist/elements/Progress/index.d.ts +11 -0
- package/dist/elements/Progress/index.d.ts.map +1 -0
- package/dist/elements/Progress/index.js +30 -0
- package/dist/elements/Progress/index.js.map +1 -0
- package/dist/elements/Progress/index.mjs +5 -0
- package/dist/elements/Progress/index.mjs.map +1 -0
- package/dist/elements/RadioGroup/RadioGroup.d.ts +110 -0
- package/dist/elements/RadioGroup/RadioGroup.d.ts.map +1 -0
- package/dist/elements/RadioGroup/RadioGroup.types.d.ts +143 -0
- package/dist/elements/RadioGroup/RadioGroup.types.d.ts.map +1 -0
- package/dist/elements/RadioGroup/index.d.ts +10 -0
- package/dist/elements/RadioGroup/index.d.ts.map +1 -0
- package/dist/elements/RadioGroup/index.js +47 -0
- package/dist/elements/RadioGroup/index.js.map +1 -0
- package/dist/elements/RadioGroup/index.mjs +6 -0
- package/dist/elements/RadioGroup/index.mjs.map +1 -0
- package/dist/elements/Resizable/Resizable.types.d.ts +188 -0
- package/dist/elements/Resizable/Resizable.types.d.ts.map +1 -0
- package/dist/elements/Resizable/components/ResizableHandle.d.ts +28 -0
- package/dist/elements/Resizable/components/ResizableHandle.d.ts.map +1 -0
- package/dist/elements/Resizable/components/ResizablePanel.d.ts +24 -0
- package/dist/elements/Resizable/components/ResizablePanel.d.ts.map +1 -0
- package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts +26 -0
- package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts.map +1 -0
- package/dist/elements/Resizable/components/ResizablePopover.d.ts +45 -0
- package/dist/elements/Resizable/components/ResizablePopover.d.ts.map +1 -0
- package/dist/elements/Resizable/hooks/useResizable.d.ts +50 -0
- package/dist/elements/Resizable/hooks/useResizable.d.ts.map +1 -0
- package/dist/elements/Resizable/hooks/useResizableContext.d.ts +36 -0
- package/dist/elements/Resizable/hooks/useResizableContext.d.ts.map +1 -0
- package/dist/elements/Resizable/index.d.ts +37 -0
- package/dist/elements/Resizable/index.d.ts.map +1 -0
- package/dist/elements/Resizable/index.js +65 -0
- package/dist/elements/Resizable/index.js.map +1 -0
- package/dist/elements/Resizable/index.mjs +8 -0
- package/dist/elements/Resizable/index.mjs.map +1 -0
- package/dist/elements/Select/Select.d.ts +184 -0
- package/dist/elements/Select/Select.d.ts.map +1 -0
- package/dist/elements/Select/Select.types.d.ts +166 -0
- package/dist/elements/Select/Select.types.d.ts.map +1 -0
- package/dist/elements/Select/index.d.ts +35 -0
- package/dist/elements/Select/index.d.ts.map +1 -0
- package/dist/elements/Select/index.js +33 -0
- package/dist/elements/Select/index.js.map +1 -0
- package/dist/elements/Select/index.mjs +4 -0
- package/dist/elements/Select/index.mjs.map +1 -0
- package/dist/elements/Skeleton/Skeleton.d.ts +31 -0
- package/dist/elements/Skeleton/Skeleton.d.ts.map +1 -0
- package/dist/elements/Skeleton/Skeleton.types.d.ts +36 -0
- package/dist/elements/Skeleton/Skeleton.types.d.ts.map +1 -0
- package/dist/elements/Skeleton/index.d.ts +11 -0
- package/dist/elements/Skeleton/index.d.ts.map +1 -0
- package/dist/elements/Skeleton/index.js +22 -0
- package/dist/elements/Skeleton/index.js.map +1 -0
- package/dist/elements/Skeleton/index.mjs +5 -0
- package/dist/elements/Skeleton/index.mjs.map +1 -0
- package/dist/elements/Switch/Switch.d.ts +39 -0
- package/dist/elements/Switch/Switch.d.ts.map +1 -0
- package/dist/elements/Switch/Switch.types.d.ts +53 -0
- package/dist/elements/Switch/Switch.types.d.ts.map +1 -0
- package/dist/elements/Switch/index.d.ts +8 -0
- package/dist/elements/Switch/index.d.ts.map +1 -0
- package/dist/elements/Switch/index.js +49 -0
- package/dist/elements/Switch/index.js.map +1 -0
- package/dist/elements/Switch/index.mjs +31 -0
- package/dist/elements/Switch/index.mjs.map +1 -0
- package/dist/elements/Table/Table.d.ts +123 -0
- package/dist/elements/Table/Table.d.ts.map +1 -0
- package/dist/elements/Table/Table.types.d.ts +356 -0
- package/dist/elements/Table/Table.types.d.ts.map +1 -0
- package/dist/elements/Table/index.d.ts +5 -0
- package/dist/elements/Table/index.d.ts.map +1 -0
- package/dist/elements/Table/index.js +76 -0
- package/dist/elements/Table/index.js.map +1 -0
- package/dist/elements/Table/index.mjs +7 -0
- package/dist/elements/Table/index.mjs.map +1 -0
- package/dist/elements/Tabs/Tabs.d.ts +129 -0
- package/dist/elements/Tabs/Tabs.d.ts.map +1 -0
- package/dist/elements/Tabs/Tabs.types.d.ts +179 -0
- package/dist/elements/Tabs/Tabs.types.d.ts.map +1 -0
- package/dist/elements/Tabs/index.d.ts +12 -0
- package/dist/elements/Tabs/index.d.ts.map +1 -0
- package/dist/elements/Tabs/index.js +74 -0
- package/dist/elements/Tabs/index.js.map +1 -0
- package/dist/elements/Tabs/index.mjs +5 -0
- package/dist/elements/Tabs/index.mjs.map +1 -0
- package/dist/elements/TextField/TextField.d.ts +155 -0
- package/dist/elements/TextField/TextField.d.ts.map +1 -0
- package/dist/elements/TextField/TextField.types.d.ts +258 -0
- package/dist/elements/TextField/TextField.types.d.ts.map +1 -0
- package/dist/elements/TextField/index.css +23 -0
- package/dist/elements/TextField/index.css.map +1 -0
- package/dist/elements/TextField/index.d.ts +13 -0
- package/dist/elements/TextField/index.d.ts.map +1 -0
- package/dist/elements/TextField/index.js +260 -0
- package/dist/elements/TextField/index.js.map +1 -0
- package/dist/elements/TextField/index.mjs +207 -0
- package/dist/elements/TextField/index.mjs.map +1 -0
- package/dist/elements/TimeField/TimeField.d.ts +34 -0
- package/dist/elements/TimeField/TimeField.d.ts.map +1 -0
- package/dist/elements/TimeField/TimeField.types.d.ts +151 -0
- package/dist/elements/TimeField/TimeField.types.d.ts.map +1 -0
- package/dist/elements/TimeField/index.d.ts +24 -0
- package/dist/elements/TimeField/index.d.ts.map +1 -0
- package/dist/elements/TimeField/index.js +45 -0
- package/dist/elements/TimeField/index.js.map +1 -0
- package/dist/elements/TimeField/index.mjs +4 -0
- package/dist/elements/TimeField/index.mjs.map +1 -0
- package/dist/elements/Toast/Toast.d.ts +105 -0
- package/dist/elements/Toast/Toast.d.ts.map +1 -0
- package/dist/elements/Toast/Toast.types.d.ts +209 -0
- package/dist/elements/Toast/Toast.types.d.ts.map +1 -0
- package/dist/elements/Toast/ToastProvider.d.ts +37 -0
- package/dist/elements/Toast/ToastProvider.d.ts.map +1 -0
- package/dist/elements/Toast/Toaster.d.ts +18 -0
- package/dist/elements/Toast/Toaster.d.ts.map +1 -0
- package/dist/elements/Toast/index.d.ts +27 -0
- package/dist/elements/Toast/index.d.ts.map +1 -0
- package/dist/elements/Toast/index.js +60 -0
- package/dist/elements/Toast/index.js.map +1 -0
- package/dist/elements/Toast/index.mjs +7 -0
- package/dist/elements/Toast/index.mjs.map +1 -0
- package/dist/elements/Tooltip/Tooltip.d.ts +108 -0
- package/dist/elements/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/elements/Tooltip/Tooltip.types.d.ts +135 -0
- package/dist/elements/Tooltip/Tooltip.types.d.ts.map +1 -0
- package/dist/elements/Tooltip/index.d.ts +11 -0
- package/dist/elements/Tooltip/index.d.ts.map +1 -0
- package/dist/elements/Tooltip/index.js +59 -0
- package/dist/elements/Tooltip/index.js.map +1 -0
- package/dist/elements/Tooltip/index.mjs +6 -0
- package/dist/elements/Tooltip/index.mjs.map +1 -0
- package/dist/elements/index.css +23 -0
- package/dist/elements/index.css.map +1 -0
- package/dist/elements/index.d.ts +42 -0
- package/dist/elements/index.d.ts.map +1 -0
- package/dist/elements/index.js +839 -0
- package/dist/elements/index.js.map +1 -0
- package/dist/elements/index.mjs +42 -0
- package/dist/elements/index.mjs.map +1 -0
- package/dist/index.css +23 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +865 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +44 -0
- package/dist/index.mjs.map +1 -0
- package/dist/schemas/BaseComponentProps.d.ts +25 -0
- package/dist/schemas/BaseComponentProps.d.ts.map +1 -0
- package/dist/schemas/RegistryItem.d.ts +55 -0
- package/dist/schemas/RegistryItem.d.ts.map +1 -0
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +29 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/index.mjs +4 -0
- package/dist/schemas/index.mjs.map +1 -0
- package/dist/styles/defaults.css +174 -0
- package/dist/styles/index.d.ts +7 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +153 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/index.mjs +4 -0
- package/dist/styles/index.mjs.map +1 -0
- package/dist/styles/interaction-states.d.ts +96 -0
- package/dist/styles/interaction-states.d.ts.map +1 -0
- package/dist/styles/shared-variants.d.ts +120 -0
- package/dist/styles/shared-variants.d.ts.map +1 -0
- package/dist/styles/tokens.css +89 -0
- package/dist/utils/cn.d.ts +13 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +4 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +228 -0
- package/src/elements/Accordion/Accordion.stories.tsx +793 -0
- package/src/elements/Avatar/Avatar.stories.tsx +408 -0
- package/src/elements/Badge/Badge.stories.tsx +509 -0
- package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +623 -0
- package/src/elements/Button/Button.stories.tsx +670 -0
- package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +658 -0
- package/src/elements/Card/Card.stories.tsx +570 -0
- package/src/elements/Carousel/Carousel.stories.tsx +597 -0
- package/src/elements/Chart/Chart.stories.tsx +616 -0
- package/src/elements/Checkbox/Checkbox.stories.tsx +514 -0
- package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +1514 -0
- package/src/elements/DatePicker/DatePicker.stories.tsx +341 -0
- package/src/elements/Dropdown/Dropdown.stories.tsx +397 -0
- package/src/elements/FileField/FileField.stories.tsx +1021 -0
- package/src/elements/FileField/FileProgress.stories.tsx +359 -0
- package/src/elements/FormLayout/FormLayout.stories.tsx +637 -0
- package/src/elements/Modal/Modal.stories.tsx +640 -0
- package/src/elements/NumberField/NumberField.stories.tsx +678 -0
- package/src/elements/OTPInput/OTPInput.stories.tsx +404 -0
- package/src/elements/Panel/Panel.stories.tsx +769 -0
- package/src/elements/Progress/Progress.stories.tsx +668 -0
- package/src/elements/RadioGroup/RadioGroup.stories.tsx +1153 -0
- package/src/elements/Resizable/Resizable.stories.tsx +374 -0
- package/src/elements/Select/Select.stories.tsx +362 -0
- package/src/elements/Skeleton/Skeleton.stories.tsx +284 -0
- package/src/elements/Switch/Switch.stories.tsx +441 -0
- package/src/elements/Table/Table.stories.tsx +790 -0
- package/src/elements/Tabs/Tabs.stories.tsx +661 -0
- package/src/elements/TextField/TextField.stories.tsx +1878 -0
- package/src/elements/TimeField/TimeField.stories.tsx +671 -0
- package/src/elements/Toast/Toast.stories.tsx +971 -0
- package/src/elements/Tooltip/Tooltip.stories.tsx +748 -0
- package/tailwind.config.js +10 -0
- package/tailwind.config.v3.js +10 -0
|
@@ -0,0 +1,971 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Toast Component Stories
|
|
3
|
+
* Storybook stories for Toast component demonstrating all variants, positions, and features
|
|
4
|
+
*
|
|
5
|
+
* @see toast-prd.md - Product Requirements Document
|
|
6
|
+
* @see plan.md - Implementation Plan
|
|
7
|
+
* @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AAA)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { Meta, StoryObj } from '@storybook/nextjs';
|
|
11
|
+
import { useEffect, useState, type ReactElement } from 'react';
|
|
12
|
+
import { Bell, CheckCircle2, AlertTriangle, Info, Download, Trash2 } from 'lucide-react';
|
|
13
|
+
import { ToastProvider } from './ToastProvider';
|
|
14
|
+
import { Toaster } from './Toaster';
|
|
15
|
+
import { toast, toastQueue } from './Toast';
|
|
16
|
+
import { Button } from '../Button';
|
|
17
|
+
import type { ToasterPosition, ToastVariant } from './Toast.types';
|
|
18
|
+
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Story Wrapper Component
|
|
21
|
+
// =============================================================================
|
|
22
|
+
|
|
23
|
+
interface ToastStoryWrapperProps {
|
|
24
|
+
position?: ToasterPosition;
|
|
25
|
+
maxVisibleToasts?: number;
|
|
26
|
+
children: ReactElement;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Wrapper component that provides ToastProvider and Toaster for stories
|
|
31
|
+
*/
|
|
32
|
+
function ToastStoryWrapper({
|
|
33
|
+
position = 'bottom-right',
|
|
34
|
+
maxVisibleToasts = 3,
|
|
35
|
+
children,
|
|
36
|
+
}: ToastStoryWrapperProps): ReactElement {
|
|
37
|
+
// Clear toasts on unmount to prevent leaks between stories
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
return () => {
|
|
40
|
+
toastQueue.closeAll();
|
|
41
|
+
};
|
|
42
|
+
}, []);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<ToastProvider maxVisibleToasts={maxVisibleToasts}>
|
|
46
|
+
<div className="min-h-[400px] w-full p-8">
|
|
47
|
+
{children}
|
|
48
|
+
</div>
|
|
49
|
+
<Toaster position={position} aria-label="Notifications" />
|
|
50
|
+
</ToastProvider>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// =============================================================================
|
|
55
|
+
// Meta Configuration
|
|
56
|
+
// =============================================================================
|
|
57
|
+
|
|
58
|
+
const meta = {
|
|
59
|
+
title: 'Elements/Toast',
|
|
60
|
+
component: Toaster,
|
|
61
|
+
parameters: {
|
|
62
|
+
layout: 'fullscreen',
|
|
63
|
+
docs: {
|
|
64
|
+
description: {
|
|
65
|
+
component: `Accessible toast notification system built with React Aria toast primitives, CVA variant styling, and WCAG 2.2 AAA compliance.
|
|
66
|
+
|
|
67
|
+
**Key Features:**
|
|
68
|
+
- 4 semantic variants (default, primary, destructive, accent)
|
|
69
|
+
- 6 position options
|
|
70
|
+
- Programmatic API via \`toast()\` function
|
|
71
|
+
- Queue management with configurable limit
|
|
72
|
+
- Swipe-to-dismiss on touch devices
|
|
73
|
+
- Full keyboard navigation
|
|
74
|
+
- Reduced motion support
|
|
75
|
+
- "Clear All" button for bulk dismissal`,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
tags: ['autodocs'],
|
|
80
|
+
argTypes: {
|
|
81
|
+
position: {
|
|
82
|
+
control: 'select',
|
|
83
|
+
options: ['top-left', 'top-center', 'top-right', 'bottom-left', 'bottom-center', 'bottom-right'],
|
|
84
|
+
description: 'Position of the toast container',
|
|
85
|
+
table: {
|
|
86
|
+
defaultValue: { summary: 'bottom-right' },
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
'aria-label': {
|
|
90
|
+
control: 'text',
|
|
91
|
+
description: 'Accessible label for the toast region',
|
|
92
|
+
table: {
|
|
93
|
+
defaultValue: { summary: 'Notifications' },
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
} satisfies Meta<typeof Toaster>;
|
|
98
|
+
|
|
99
|
+
export default meta;
|
|
100
|
+
type Story = StoryObj<typeof meta>;
|
|
101
|
+
|
|
102
|
+
// =============================================================================
|
|
103
|
+
// Basic Stories
|
|
104
|
+
// =============================================================================
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Default toast with simple string content
|
|
108
|
+
*/
|
|
109
|
+
export const Default: Story = {
|
|
110
|
+
render: () => (
|
|
111
|
+
<ToastStoryWrapper>
|
|
112
|
+
<div className="flex flex-col items-start gap-4">
|
|
113
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
114
|
+
Click the button to show a toast notification.
|
|
115
|
+
</p>
|
|
116
|
+
<Button onPress={() => toast('This is a default toast notification')}>
|
|
117
|
+
Show Toast
|
|
118
|
+
</Button>
|
|
119
|
+
</div>
|
|
120
|
+
</ToastStoryWrapper>
|
|
121
|
+
),
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* All 4 variant styles in one view
|
|
126
|
+
*/
|
|
127
|
+
export const AllVariants: Story = {
|
|
128
|
+
render: () => (
|
|
129
|
+
<ToastStoryWrapper>
|
|
130
|
+
<div className="flex flex-col items-start gap-4">
|
|
131
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
132
|
+
Click each button to see different toast variants.
|
|
133
|
+
</p>
|
|
134
|
+
<div className="flex flex-wrap gap-4">
|
|
135
|
+
<Button
|
|
136
|
+
variant="outline"
|
|
137
|
+
onPress={() => toast('Default notification', { variant: 'default' })}
|
|
138
|
+
>
|
|
139
|
+
Default
|
|
140
|
+
</Button>
|
|
141
|
+
<Button
|
|
142
|
+
variant="default"
|
|
143
|
+
onPress={() => toast('Primary notification', { variant: 'primary' })}
|
|
144
|
+
>
|
|
145
|
+
Primary
|
|
146
|
+
</Button>
|
|
147
|
+
<Button
|
|
148
|
+
variant="destructive"
|
|
149
|
+
onPress={() => toast('Destructive notification', { variant: 'destructive' })}
|
|
150
|
+
>
|
|
151
|
+
Destructive
|
|
152
|
+
</Button>
|
|
153
|
+
<Button
|
|
154
|
+
variant="secondary"
|
|
155
|
+
onPress={() => toast('Accent notification', { variant: 'accent' })}
|
|
156
|
+
>
|
|
157
|
+
Accent
|
|
158
|
+
</Button>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</ToastStoryWrapper>
|
|
162
|
+
),
|
|
163
|
+
parameters: {
|
|
164
|
+
docs: {
|
|
165
|
+
description: {
|
|
166
|
+
story: 'Four semantic variants that map to theme tokens: default, primary, destructive, and accent.',
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// =============================================================================
|
|
173
|
+
// Custom Content Stories
|
|
174
|
+
// =============================================================================
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Toast with custom ReactNode content including icons and actions
|
|
178
|
+
*/
|
|
179
|
+
export const WithCustomContent: Story = {
|
|
180
|
+
render: () => (
|
|
181
|
+
<ToastStoryWrapper>
|
|
182
|
+
<div className="flex flex-col items-start gap-4">
|
|
183
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
184
|
+
Toasts can contain custom content including icons and interactive elements.
|
|
185
|
+
</p>
|
|
186
|
+
<div className="flex flex-wrap gap-4">
|
|
187
|
+
<Button
|
|
188
|
+
variant="outline"
|
|
189
|
+
onPress={() =>
|
|
190
|
+
toast(
|
|
191
|
+
<div className="flex items-center gap-2">
|
|
192
|
+
<CheckCircle2 className="h-4 w-4 text-green-500" />
|
|
193
|
+
<span>Changes saved successfully!</span>
|
|
194
|
+
</div>
|
|
195
|
+
)
|
|
196
|
+
}
|
|
197
|
+
>
|
|
198
|
+
With Success Icon
|
|
199
|
+
</Button>
|
|
200
|
+
<Button
|
|
201
|
+
variant="outline"
|
|
202
|
+
onPress={() =>
|
|
203
|
+
toast(
|
|
204
|
+
<div className="flex items-center gap-2">
|
|
205
|
+
<AlertTriangle className="h-4 w-4 text-yellow-500" />
|
|
206
|
+
<span>Your session will expire in 5 minutes</span>
|
|
207
|
+
</div>,
|
|
208
|
+
{ variant: 'accent' }
|
|
209
|
+
)
|
|
210
|
+
}
|
|
211
|
+
>
|
|
212
|
+
With Warning Icon
|
|
213
|
+
</Button>
|
|
214
|
+
<Button
|
|
215
|
+
variant="outline"
|
|
216
|
+
onPress={() =>
|
|
217
|
+
toast(
|
|
218
|
+
<div className="flex items-center gap-2">
|
|
219
|
+
<Info className="h-4 w-4" />
|
|
220
|
+
<span>New version available</span>
|
|
221
|
+
<button
|
|
222
|
+
type="button"
|
|
223
|
+
className="ml-2 text-xs underline hover:no-underline"
|
|
224
|
+
onClick={() => alert('Updating...')}
|
|
225
|
+
>
|
|
226
|
+
Update now
|
|
227
|
+
</button>
|
|
228
|
+
</div>
|
|
229
|
+
)
|
|
230
|
+
}
|
|
231
|
+
>
|
|
232
|
+
With Action Button
|
|
233
|
+
</Button>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
</ToastStoryWrapper>
|
|
237
|
+
),
|
|
238
|
+
parameters: {
|
|
239
|
+
docs: {
|
|
240
|
+
description: {
|
|
241
|
+
story: 'Custom ReactNode content allows icons, styled text, and interactive elements within toasts.',
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
// =============================================================================
|
|
248
|
+
// Timing Stories
|
|
249
|
+
// =============================================================================
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Auto-dismiss behavior with default 5 second timeout
|
|
253
|
+
*/
|
|
254
|
+
export const AutoDismiss: Story = {
|
|
255
|
+
render: () => (
|
|
256
|
+
<ToastStoryWrapper>
|
|
257
|
+
<div className="flex flex-col items-start gap-4">
|
|
258
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
259
|
+
Toasts auto-dismiss after 5 seconds (minimum for accessibility).
|
|
260
|
+
</p>
|
|
261
|
+
<Button onPress={() => toast('This will auto-dismiss in 5 seconds')}>
|
|
262
|
+
Show Auto-Dismiss Toast
|
|
263
|
+
</Button>
|
|
264
|
+
</div>
|
|
265
|
+
</ToastStoryWrapper>
|
|
266
|
+
),
|
|
267
|
+
parameters: {
|
|
268
|
+
docs: {
|
|
269
|
+
description: {
|
|
270
|
+
story: 'Toasts enforce a minimum 5-second timeout for WCAG 2.2 accessibility compliance, giving users adequate time to read.',
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Persistent toast that stays until manually dismissed
|
|
278
|
+
*/
|
|
279
|
+
export const Persistent: Story = {
|
|
280
|
+
render: () => (
|
|
281
|
+
<ToastStoryWrapper>
|
|
282
|
+
<div className="flex flex-col items-start gap-4">
|
|
283
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
284
|
+
Set timeout to 0 for persistent toasts that require user action.
|
|
285
|
+
</p>
|
|
286
|
+
<Button
|
|
287
|
+
onPress={() =>
|
|
288
|
+
toast('This toast will stay until you dismiss it', { timeout: 0 })
|
|
289
|
+
}
|
|
290
|
+
>
|
|
291
|
+
Show Persistent Toast
|
|
292
|
+
</Button>
|
|
293
|
+
</div>
|
|
294
|
+
</ToastStoryWrapper>
|
|
295
|
+
),
|
|
296
|
+
parameters: {
|
|
297
|
+
docs: {
|
|
298
|
+
description: {
|
|
299
|
+
story: 'Use `timeout: 0` for important notifications that require user acknowledgment.',
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
// =============================================================================
|
|
306
|
+
// Callback Stories
|
|
307
|
+
// =============================================================================
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Toast with onClose callback for tracking
|
|
311
|
+
*/
|
|
312
|
+
export const WithCallback: Story = {
|
|
313
|
+
render: function WithCallbackStory() {
|
|
314
|
+
const [log, setLog] = useState<string[]>([]);
|
|
315
|
+
|
|
316
|
+
return (
|
|
317
|
+
<ToastStoryWrapper>
|
|
318
|
+
<div className="flex flex-col items-start gap-4">
|
|
319
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
320
|
+
The onClose callback receives the toast key and dismissal reason.
|
|
321
|
+
</p>
|
|
322
|
+
<Button
|
|
323
|
+
onPress={() =>
|
|
324
|
+
toast('Dismiss me to see the callback', {
|
|
325
|
+
timeout: 0,
|
|
326
|
+
onClose: (key, reason) => {
|
|
327
|
+
setLog((prev) => [...prev, `Toast ${key.slice(0, 8)}... dismissed: ${reason}`]);
|
|
328
|
+
},
|
|
329
|
+
})
|
|
330
|
+
}
|
|
331
|
+
>
|
|
332
|
+
Show Toast with Callback
|
|
333
|
+
</Button>
|
|
334
|
+
{log.length > 0 && (
|
|
335
|
+
<div className="mt-4 rounded border border-[var(--border)] bg-[var(--muted)] p-4">
|
|
336
|
+
<p className="mb-2 text-sm font-medium">Callback Log:</p>
|
|
337
|
+
{log.map((entry, i) => (
|
|
338
|
+
<p key={i} className="text-xs font-mono">{entry}</p>
|
|
339
|
+
))}
|
|
340
|
+
</div>
|
|
341
|
+
)}
|
|
342
|
+
</div>
|
|
343
|
+
</ToastStoryWrapper>
|
|
344
|
+
);
|
|
345
|
+
},
|
|
346
|
+
parameters: {
|
|
347
|
+
docs: {
|
|
348
|
+
description: {
|
|
349
|
+
story: 'The `onClose` callback is invoked with the toast key and reason (`timeout`, `user`, or `programmatic`) for analytics and state management.',
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
// =============================================================================
|
|
356
|
+
// Position Stories
|
|
357
|
+
// =============================================================================
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* All 6 position options
|
|
361
|
+
*/
|
|
362
|
+
export const AllPositions: Story = {
|
|
363
|
+
render: function AllPositionsStory() {
|
|
364
|
+
const [position, setPosition] = useState<ToasterPosition>('bottom-right');
|
|
365
|
+
|
|
366
|
+
return (
|
|
367
|
+
<ToastStoryWrapper position={position}>
|
|
368
|
+
<div className="flex flex-col items-start gap-4">
|
|
369
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
370
|
+
Select a position and click "Show Toast" to see it in action.
|
|
371
|
+
</p>
|
|
372
|
+
<div className="flex flex-wrap gap-2">
|
|
373
|
+
{(['top-left', 'top-center', 'top-right', 'bottom-left', 'bottom-center', 'bottom-right'] as const).map(
|
|
374
|
+
(pos) => (
|
|
375
|
+
<Button
|
|
376
|
+
key={pos}
|
|
377
|
+
variant={position === pos ? 'default' : 'outline'}
|
|
378
|
+
size="sm"
|
|
379
|
+
onPress={() => setPosition(pos)}
|
|
380
|
+
>
|
|
381
|
+
{pos}
|
|
382
|
+
</Button>
|
|
383
|
+
)
|
|
384
|
+
)}
|
|
385
|
+
</div>
|
|
386
|
+
<Button onPress={() => toast(`Toast at ${position}`, { timeout: 0 })}>
|
|
387
|
+
Show Toast
|
|
388
|
+
</Button>
|
|
389
|
+
</div>
|
|
390
|
+
</ToastStoryWrapper>
|
|
391
|
+
);
|
|
392
|
+
},
|
|
393
|
+
parameters: {
|
|
394
|
+
docs: {
|
|
395
|
+
description: {
|
|
396
|
+
story: 'Six position options allow placement at any corner or center edge of the viewport.',
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
// =============================================================================
|
|
403
|
+
// Queue Management Stories
|
|
404
|
+
// =============================================================================
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Multiple toasts with queue management
|
|
408
|
+
*/
|
|
409
|
+
export const MultipleToasts: Story = {
|
|
410
|
+
render: () => (
|
|
411
|
+
<ToastStoryWrapper>
|
|
412
|
+
<div className="flex flex-col items-start gap-4">
|
|
413
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
414
|
+
Click rapidly to see multiple toasts stack and queue.
|
|
415
|
+
</p>
|
|
416
|
+
<div className="flex flex-wrap gap-4">
|
|
417
|
+
<Button
|
|
418
|
+
onPress={() => {
|
|
419
|
+
const variants: ToastVariant[] = ['default', 'primary', 'destructive', 'accent'];
|
|
420
|
+
const variant = variants[Math.floor(Math.random() * variants.length)];
|
|
421
|
+
toast(`Toast #${Date.now() % 1000}`, { variant, timeout: 0 });
|
|
422
|
+
}}
|
|
423
|
+
>
|
|
424
|
+
Add Random Toast
|
|
425
|
+
</Button>
|
|
426
|
+
<Button variant="outline" onPress={() => toastQueue.closeAll()}>
|
|
427
|
+
Clear All
|
|
428
|
+
</Button>
|
|
429
|
+
</div>
|
|
430
|
+
</div>
|
|
431
|
+
</ToastStoryWrapper>
|
|
432
|
+
),
|
|
433
|
+
parameters: {
|
|
434
|
+
docs: {
|
|
435
|
+
description: {
|
|
436
|
+
story: 'Multiple toasts stack vertically with the newest at the bottom. Excess toasts are queued.',
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
};
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Queue limit demonstration
|
|
444
|
+
*/
|
|
445
|
+
export const QueueManagement: Story = {
|
|
446
|
+
render: () => (
|
|
447
|
+
<ToastStoryWrapper maxVisibleToasts={3}>
|
|
448
|
+
<div className="flex flex-col items-start gap-4">
|
|
449
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
450
|
+
Default maxVisibleToasts is 3. Additional toasts are queued and shown when space is available.
|
|
451
|
+
</p>
|
|
452
|
+
<Button
|
|
453
|
+
onPress={() => {
|
|
454
|
+
for (let i = 1; i <= 6; i++) {
|
|
455
|
+
toast(`Toast ${i} of 6`, { timeout: 0 });
|
|
456
|
+
}
|
|
457
|
+
}}
|
|
458
|
+
>
|
|
459
|
+
Add 6 Toasts (3 visible, 3 queued)
|
|
460
|
+
</Button>
|
|
461
|
+
</div>
|
|
462
|
+
</ToastStoryWrapper>
|
|
463
|
+
),
|
|
464
|
+
parameters: {
|
|
465
|
+
docs: {
|
|
466
|
+
description: {
|
|
467
|
+
story: 'The `maxVisibleToasts` prop limits visible toasts. Additional toasts are queued and appear when others are dismissed.',
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Collapsed stack indicator
|
|
475
|
+
*/
|
|
476
|
+
export const CollapsedStack: Story = {
|
|
477
|
+
render: () => (
|
|
478
|
+
<ToastStoryWrapper maxVisibleToasts={2}>
|
|
479
|
+
<div className="flex flex-col items-start gap-4">
|
|
480
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
481
|
+
When toasts exceed maxVisibleToasts, a collapsed stack indicator shows the queue count.
|
|
482
|
+
</p>
|
|
483
|
+
<Button
|
|
484
|
+
onPress={() => {
|
|
485
|
+
for (let i = 1; i <= 5; i++) {
|
|
486
|
+
toast(`Notification ${i}`, { timeout: 0 });
|
|
487
|
+
}
|
|
488
|
+
}}
|
|
489
|
+
>
|
|
490
|
+
Add 5 Toasts (maxVisible=2)
|
|
491
|
+
</Button>
|
|
492
|
+
</div>
|
|
493
|
+
</ToastStoryWrapper>
|
|
494
|
+
),
|
|
495
|
+
parameters: {
|
|
496
|
+
docs: {
|
|
497
|
+
description: {
|
|
498
|
+
story: 'A "+N more" indicator appears below visible toasts when additional notifications are queued, using `aria-live="polite"` for screen reader announcement.',
|
|
499
|
+
},
|
|
500
|
+
},
|
|
501
|
+
},
|
|
502
|
+
};
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Clear All button demonstration
|
|
506
|
+
*/
|
|
507
|
+
export const ClearAllButton: Story = {
|
|
508
|
+
render: () => (
|
|
509
|
+
<ToastStoryWrapper>
|
|
510
|
+
<div className="flex flex-col items-start gap-4">
|
|
511
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
512
|
+
When 2+ toasts are visible, a "Clear All" button appears to dismiss all at once.
|
|
513
|
+
</p>
|
|
514
|
+
<Button
|
|
515
|
+
onPress={() => {
|
|
516
|
+
toast('First notification', { timeout: 0 });
|
|
517
|
+
toast('Second notification', { timeout: 0 });
|
|
518
|
+
toast('Third notification', { timeout: 0 });
|
|
519
|
+
}}
|
|
520
|
+
>
|
|
521
|
+
Add 3 Toasts
|
|
522
|
+
</Button>
|
|
523
|
+
</div>
|
|
524
|
+
</ToastStoryWrapper>
|
|
525
|
+
),
|
|
526
|
+
parameters: {
|
|
527
|
+
docs: {
|
|
528
|
+
description: {
|
|
529
|
+
story: 'The "Clear All" button provides a quick way to dismiss all visible toasts. It appears only when 2+ toasts are visible.',
|
|
530
|
+
},
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
// =============================================================================
|
|
536
|
+
// Accessibility Stories
|
|
537
|
+
// =============================================================================
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Keyboard navigation instructions
|
|
541
|
+
*/
|
|
542
|
+
export const KeyboardNavigation: Story = {
|
|
543
|
+
render: () => (
|
|
544
|
+
<ToastStoryWrapper>
|
|
545
|
+
<div className="flex flex-col items-start gap-4">
|
|
546
|
+
<div className="rounded border border-[var(--border)] bg-[var(--muted)] p-4">
|
|
547
|
+
<p className="mb-2 font-medium">Keyboard Controls:</p>
|
|
548
|
+
<ul className="space-y-1 text-sm">
|
|
549
|
+
<li><kbd className="rounded bg-[var(--background)] px-1">F6</kbd> - Navigate to toast region</li>
|
|
550
|
+
<li><kbd className="rounded bg-[var(--background)] px-1">Tab</kbd> - Move between toasts and buttons</li>
|
|
551
|
+
<li><kbd className="rounded bg-[var(--background)] px-1">Escape</kbd> - Dismiss focused toast</li>
|
|
552
|
+
<li><kbd className="rounded bg-[var(--background)] px-1">Enter</kbd> - Activate focused button</li>
|
|
553
|
+
</ul>
|
|
554
|
+
</div>
|
|
555
|
+
<Button onPress={() => toast('Try navigating with keyboard!', { timeout: 0 })}>
|
|
556
|
+
Show Toast (then use F6 to focus)
|
|
557
|
+
</Button>
|
|
558
|
+
</div>
|
|
559
|
+
</ToastStoryWrapper>
|
|
560
|
+
),
|
|
561
|
+
parameters: {
|
|
562
|
+
docs: {
|
|
563
|
+
description: {
|
|
564
|
+
story: 'Full keyboard navigation support for users who cannot use a mouse. The toast region is an ARIA landmark accessible via F6.',
|
|
565
|
+
},
|
|
566
|
+
},
|
|
567
|
+
},
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Touch target size demonstration
|
|
572
|
+
*/
|
|
573
|
+
export const TouchTarget: Story = {
|
|
574
|
+
render: () => (
|
|
575
|
+
<ToastStoryWrapper>
|
|
576
|
+
<div className="flex flex-col items-start gap-4">
|
|
577
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
578
|
+
Close buttons have 44x44px minimum touch targets (WCAG 2.2 AAA compliant).
|
|
579
|
+
</p>
|
|
580
|
+
<Button onPress={() => toast('Close button has 44x44px touch target', { timeout: 0 })}>
|
|
581
|
+
Show Toast
|
|
582
|
+
</Button>
|
|
583
|
+
</div>
|
|
584
|
+
</ToastStoryWrapper>
|
|
585
|
+
),
|
|
586
|
+
parameters: {
|
|
587
|
+
docs: {
|
|
588
|
+
description: {
|
|
589
|
+
story: 'All interactive elements meet WCAG 2.2 AAA 44x44px minimum touch target requirement.',
|
|
590
|
+
},
|
|
591
|
+
},
|
|
592
|
+
},
|
|
593
|
+
};
|
|
594
|
+
|
|
595
|
+
/**
|
|
596
|
+
* Swipe-to-dismiss on touch devices
|
|
597
|
+
*/
|
|
598
|
+
export const SwipeToDismiss: Story = {
|
|
599
|
+
render: () => (
|
|
600
|
+
<ToastStoryWrapper>
|
|
601
|
+
<div className="flex flex-col items-start gap-4">
|
|
602
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
603
|
+
On touch devices, swipe right to dismiss a toast (50px threshold).
|
|
604
|
+
</p>
|
|
605
|
+
<div className="rounded border border-[var(--border)] bg-[var(--accent-background)] p-4 text-sm">
|
|
606
|
+
<p>Try on a touch device or enable touch emulation in DevTools.</p>
|
|
607
|
+
</div>
|
|
608
|
+
<Button onPress={() => toast('Swipe me right to dismiss!', { timeout: 0 })}>
|
|
609
|
+
Show Toast
|
|
610
|
+
</Button>
|
|
611
|
+
</div>
|
|
612
|
+
</ToastStoryWrapper>
|
|
613
|
+
),
|
|
614
|
+
parameters: {
|
|
615
|
+
docs: {
|
|
616
|
+
description: {
|
|
617
|
+
story: 'Touch users can swipe toasts to the right to dismiss them. A 50px threshold prevents accidental dismissals.',
|
|
618
|
+
},
|
|
619
|
+
},
|
|
620
|
+
},
|
|
621
|
+
};
|
|
622
|
+
|
|
623
|
+
/**
|
|
624
|
+
* Reduced motion support
|
|
625
|
+
*/
|
|
626
|
+
export const ReducedMotion: Story = {
|
|
627
|
+
render: () => (
|
|
628
|
+
<ToastStoryWrapper>
|
|
629
|
+
<div className="flex flex-col items-start gap-4">
|
|
630
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
631
|
+
When <code>prefers-reduced-motion: reduce</code> is set, animations are disabled.
|
|
632
|
+
</p>
|
|
633
|
+
<div className="rounded border border-[var(--border)] bg-[var(--muted)] p-4 text-sm">
|
|
634
|
+
<p>To test: Enable "Reduce motion" in your OS accessibility settings,</p>
|
|
635
|
+
<p>or use DevTools → Rendering → Emulate CSS media feature → prefers-reduced-motion: reduce</p>
|
|
636
|
+
</div>
|
|
637
|
+
<Button onPress={() => toast('This toast respects reduced motion preferences')}>
|
|
638
|
+
Show Toast
|
|
639
|
+
</Button>
|
|
640
|
+
</div>
|
|
641
|
+
</ToastStoryWrapper>
|
|
642
|
+
),
|
|
643
|
+
parameters: {
|
|
644
|
+
docs: {
|
|
645
|
+
description: {
|
|
646
|
+
story: 'Toasts respect `prefers-reduced-motion` media query. When enabled, slide animations are disabled and toasts appear/disappear instantly.',
|
|
647
|
+
},
|
|
648
|
+
},
|
|
649
|
+
},
|
|
650
|
+
};
|
|
651
|
+
|
|
652
|
+
// =============================================================================
|
|
653
|
+
// Theme Stories
|
|
654
|
+
// =============================================================================
|
|
655
|
+
|
|
656
|
+
/**
|
|
657
|
+
* All themes demonstration
|
|
658
|
+
*/
|
|
659
|
+
export const AllThemes: Story = {
|
|
660
|
+
render: () => (
|
|
661
|
+
<ToastStoryWrapper>
|
|
662
|
+
<div className="flex flex-col items-start gap-4">
|
|
663
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
664
|
+
Toasts automatically adapt to the current theme via CSS custom properties.
|
|
665
|
+
</p>
|
|
666
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
667
|
+
Use the theme switcher in the Storybook toolbar to see different themes.
|
|
668
|
+
</p>
|
|
669
|
+
<div className="flex flex-wrap gap-4">
|
|
670
|
+
<Button
|
|
671
|
+
variant="outline"
|
|
672
|
+
onPress={() => toast('Default variant', { variant: 'default', timeout: 0 })}
|
|
673
|
+
>
|
|
674
|
+
Default
|
|
675
|
+
</Button>
|
|
676
|
+
<Button
|
|
677
|
+
variant="default"
|
|
678
|
+
onPress={() => toast('Primary variant', { variant: 'primary', timeout: 0 })}
|
|
679
|
+
>
|
|
680
|
+
Primary
|
|
681
|
+
</Button>
|
|
682
|
+
<Button
|
|
683
|
+
variant="destructive"
|
|
684
|
+
onPress={() => toast('Destructive variant', { variant: 'destructive', timeout: 0 })}
|
|
685
|
+
>
|
|
686
|
+
Destructive
|
|
687
|
+
</Button>
|
|
688
|
+
<Button
|
|
689
|
+
variant="secondary"
|
|
690
|
+
onPress={() => toast('Accent variant', { variant: 'accent', timeout: 0 })}
|
|
691
|
+
>
|
|
692
|
+
Accent
|
|
693
|
+
</Button>
|
|
694
|
+
</div>
|
|
695
|
+
</div>
|
|
696
|
+
</ToastStoryWrapper>
|
|
697
|
+
),
|
|
698
|
+
parameters: {
|
|
699
|
+
docs: {
|
|
700
|
+
description: {
|
|
701
|
+
story: 'Toast variants use semantic CSS tokens that automatically adapt to light, dark, high-contrast, and colorblind themes.',
|
|
702
|
+
},
|
|
703
|
+
},
|
|
704
|
+
},
|
|
705
|
+
};
|
|
706
|
+
|
|
707
|
+
// =============================================================================
|
|
708
|
+
// Real-World Example Stories
|
|
709
|
+
// =============================================================================
|
|
710
|
+
|
|
711
|
+
/**
|
|
712
|
+
* File upload progress notification
|
|
713
|
+
*/
|
|
714
|
+
export const FileUploadExample: Story = {
|
|
715
|
+
render: () => (
|
|
716
|
+
<ToastStoryWrapper>
|
|
717
|
+
<div className="flex flex-col items-start gap-4">
|
|
718
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
719
|
+
Real-world example: File upload progress and completion notifications.
|
|
720
|
+
</p>
|
|
721
|
+
<div className="flex flex-wrap gap-4">
|
|
722
|
+
<Button
|
|
723
|
+
variant="outline"
|
|
724
|
+
onPress={() => {
|
|
725
|
+
toast(
|
|
726
|
+
<div className="flex items-center gap-2">
|
|
727
|
+
<Download className="h-4 w-4 animate-pulse" />
|
|
728
|
+
<span>Uploading document.pdf...</span>
|
|
729
|
+
</div>,
|
|
730
|
+
{ timeout: 0 }
|
|
731
|
+
);
|
|
732
|
+
}}
|
|
733
|
+
>
|
|
734
|
+
<Download className="h-4 w-4 mr-2" />
|
|
735
|
+
Start Upload
|
|
736
|
+
</Button>
|
|
737
|
+
<Button
|
|
738
|
+
variant="outline"
|
|
739
|
+
onPress={() => {
|
|
740
|
+
toast(
|
|
741
|
+
<div className="flex items-center gap-2">
|
|
742
|
+
<CheckCircle2 className="h-4 w-4 text-green-500" />
|
|
743
|
+
<span>Upload complete! File saved.</span>
|
|
744
|
+
</div>,
|
|
745
|
+
{ variant: 'primary' }
|
|
746
|
+
);
|
|
747
|
+
}}
|
|
748
|
+
>
|
|
749
|
+
<CheckCircle2 className="h-4 w-4 mr-2" />
|
|
750
|
+
Complete Upload
|
|
751
|
+
</Button>
|
|
752
|
+
</div>
|
|
753
|
+
</div>
|
|
754
|
+
</ToastStoryWrapper>
|
|
755
|
+
),
|
|
756
|
+
parameters: {
|
|
757
|
+
docs: {
|
|
758
|
+
description: {
|
|
759
|
+
story: 'Example of using toasts for file upload progress and completion feedback.',
|
|
760
|
+
},
|
|
761
|
+
},
|
|
762
|
+
},
|
|
763
|
+
};
|
|
764
|
+
|
|
765
|
+
/**
|
|
766
|
+
* Delete confirmation notification
|
|
767
|
+
*/
|
|
768
|
+
export const DeleteConfirmationExample: Story = {
|
|
769
|
+
render: () => (
|
|
770
|
+
<ToastStoryWrapper>
|
|
771
|
+
<div className="flex flex-col items-start gap-4">
|
|
772
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
773
|
+
Real-world example: Destructive action confirmation with undo option.
|
|
774
|
+
</p>
|
|
775
|
+
<Button
|
|
776
|
+
variant="destructive"
|
|
777
|
+
onPress={() => {
|
|
778
|
+
const key = toast(
|
|
779
|
+
<div className="flex items-center gap-2">
|
|
780
|
+
<Trash2 className="h-4 w-4" />
|
|
781
|
+
<span>Item deleted.</span>
|
|
782
|
+
<button
|
|
783
|
+
type="button"
|
|
784
|
+
className="ml-2 underline hover:no-underline"
|
|
785
|
+
onClick={() => {
|
|
786
|
+
toastQueue.close(key);
|
|
787
|
+
toast('Item restored!', { variant: 'primary' });
|
|
788
|
+
}}
|
|
789
|
+
>
|
|
790
|
+
Undo
|
|
791
|
+
</button>
|
|
792
|
+
</div>,
|
|
793
|
+
{ variant: 'destructive', timeout: 8000 }
|
|
794
|
+
);
|
|
795
|
+
}}
|
|
796
|
+
>
|
|
797
|
+
<Trash2 className="h-4 w-4 mr-2" />
|
|
798
|
+
Delete Item
|
|
799
|
+
</Button>
|
|
800
|
+
</div>
|
|
801
|
+
</ToastStoryWrapper>
|
|
802
|
+
),
|
|
803
|
+
parameters: {
|
|
804
|
+
docs: {
|
|
805
|
+
description: {
|
|
806
|
+
story: 'Example of a destructive notification with an inline undo action.',
|
|
807
|
+
},
|
|
808
|
+
},
|
|
809
|
+
},
|
|
810
|
+
};
|
|
811
|
+
|
|
812
|
+
/**
|
|
813
|
+
* Notification center pattern
|
|
814
|
+
*/
|
|
815
|
+
export const NotificationCenterExample: Story = {
|
|
816
|
+
render: () => (
|
|
817
|
+
<ToastStoryWrapper>
|
|
818
|
+
<div className="flex flex-col items-start gap-4">
|
|
819
|
+
<p className="text-sm text-[var(--muted-foreground)]">
|
|
820
|
+
Real-world example: Multiple notification types in a notification center pattern.
|
|
821
|
+
</p>
|
|
822
|
+
<Button
|
|
823
|
+
onPress={() => {
|
|
824
|
+
toast(
|
|
825
|
+
<div className="flex items-center gap-2">
|
|
826
|
+
<Bell className="h-4 w-4" />
|
|
827
|
+
<span>New message from John Doe</span>
|
|
828
|
+
</div>,
|
|
829
|
+
{ timeout: 0 }
|
|
830
|
+
);
|
|
831
|
+
setTimeout(() => {
|
|
832
|
+
toast(
|
|
833
|
+
<div className="flex items-center gap-2">
|
|
834
|
+
<CheckCircle2 className="h-4 w-4 text-green-500" />
|
|
835
|
+
<span>Interview scheduled for tomorrow</span>
|
|
836
|
+
</div>,
|
|
837
|
+
{ variant: 'primary', timeout: 0 }
|
|
838
|
+
);
|
|
839
|
+
}, 500);
|
|
840
|
+
setTimeout(() => {
|
|
841
|
+
toast(
|
|
842
|
+
<div className="flex items-center gap-2">
|
|
843
|
+
<AlertTriangle className="h-4 w-4 text-yellow-500" />
|
|
844
|
+
<span>Document review required</span>
|
|
845
|
+
</div>,
|
|
846
|
+
{ variant: 'accent', timeout: 0 }
|
|
847
|
+
);
|
|
848
|
+
}, 1000);
|
|
849
|
+
}}
|
|
850
|
+
>
|
|
851
|
+
<Bell className="h-4 w-4 mr-2" />
|
|
852
|
+
Show Notifications
|
|
853
|
+
</Button>
|
|
854
|
+
</div>
|
|
855
|
+
</ToastStoryWrapper>
|
|
856
|
+
),
|
|
857
|
+
parameters: {
|
|
858
|
+
docs: {
|
|
859
|
+
description: {
|
|
860
|
+
story: 'Example of multiple notification types appearing in sequence, demonstrating the queue and stack behavior.',
|
|
861
|
+
},
|
|
862
|
+
},
|
|
863
|
+
},
|
|
864
|
+
};
|
|
865
|
+
|
|
866
|
+
// =============================================================================
|
|
867
|
+
// API Reference Story
|
|
868
|
+
// =============================================================================
|
|
869
|
+
|
|
870
|
+
/**
|
|
871
|
+
* Programmatic API demonstration
|
|
872
|
+
*/
|
|
873
|
+
export const APIReference: Story = {
|
|
874
|
+
render: function APIReferenceStory() {
|
|
875
|
+
const [keys, setKeys] = useState<string[]>([]);
|
|
876
|
+
|
|
877
|
+
return (
|
|
878
|
+
<ToastStoryWrapper>
|
|
879
|
+
<div className="flex flex-col gap-6">
|
|
880
|
+
<div className="rounded border border-[var(--border)] p-4">
|
|
881
|
+
<h4 className="mb-2 font-medium">toast() Function</h4>
|
|
882
|
+
<pre className="rounded bg-[var(--muted)] p-2 text-xs overflow-x-auto">
|
|
883
|
+
{`// Simple string
|
|
884
|
+
toast("Hello world!");
|
|
885
|
+
|
|
886
|
+
// With options
|
|
887
|
+
toast("Error occurred", {
|
|
888
|
+
variant: "destructive",
|
|
889
|
+
timeout: 0,
|
|
890
|
+
onClose: (key, reason) => console.log(reason)
|
|
891
|
+
});
|
|
892
|
+
|
|
893
|
+
// Custom content
|
|
894
|
+
toast(<div className="flex items-center gap-2">
|
|
895
|
+
<Icon /><span>Custom content</span>
|
|
896
|
+
</div>);`}
|
|
897
|
+
</pre>
|
|
898
|
+
</div>
|
|
899
|
+
|
|
900
|
+
<div className="rounded border border-[var(--border)] p-4">
|
|
901
|
+
<h4 className="mb-2 font-medium">toastQueue Methods</h4>
|
|
902
|
+
<div className="flex flex-wrap gap-2">
|
|
903
|
+
<Button
|
|
904
|
+
size="sm"
|
|
905
|
+
variant="outline"
|
|
906
|
+
onPress={() => {
|
|
907
|
+
const key = toast('New toast', { timeout: 0 });
|
|
908
|
+
setKeys((prev) => [...prev, key]);
|
|
909
|
+
}}
|
|
910
|
+
>
|
|
911
|
+
add() - Returns key
|
|
912
|
+
</Button>
|
|
913
|
+
<Button
|
|
914
|
+
size="sm"
|
|
915
|
+
variant="outline"
|
|
916
|
+
onPress={() => {
|
|
917
|
+
if (keys.length > 0) {
|
|
918
|
+
toastQueue.close(keys[keys.length - 1] ?? '');
|
|
919
|
+
setKeys((prev) => prev.slice(0, -1));
|
|
920
|
+
}
|
|
921
|
+
}}
|
|
922
|
+
>
|
|
923
|
+
close(key)
|
|
924
|
+
</Button>
|
|
925
|
+
<Button
|
|
926
|
+
size="sm"
|
|
927
|
+
variant="outline"
|
|
928
|
+
onPress={() => {
|
|
929
|
+
toastQueue.closeAll();
|
|
930
|
+
setKeys([]);
|
|
931
|
+
}}
|
|
932
|
+
>
|
|
933
|
+
closeAll()
|
|
934
|
+
</Button>
|
|
935
|
+
<Button
|
|
936
|
+
size="sm"
|
|
937
|
+
variant="outline"
|
|
938
|
+
onPress={() => toastQueue.pauseAll()}
|
|
939
|
+
>
|
|
940
|
+
pauseAll()
|
|
941
|
+
</Button>
|
|
942
|
+
<Button
|
|
943
|
+
size="sm"
|
|
944
|
+
variant="outline"
|
|
945
|
+
onPress={() => toastQueue.resumeAll()}
|
|
946
|
+
>
|
|
947
|
+
resumeAll()
|
|
948
|
+
</Button>
|
|
949
|
+
</div>
|
|
950
|
+
</div>
|
|
951
|
+
|
|
952
|
+
{keys.length > 0 && (
|
|
953
|
+
<div className="rounded border border-[var(--border)] bg-[var(--muted)] p-4">
|
|
954
|
+
<p className="mb-2 text-sm font-medium">Active Toast Keys:</p>
|
|
955
|
+
{keys.map((key, i) => (
|
|
956
|
+
<p key={i} className="text-xs font-mono">{key}</p>
|
|
957
|
+
))}
|
|
958
|
+
</div>
|
|
959
|
+
)}
|
|
960
|
+
</div>
|
|
961
|
+
</ToastStoryWrapper>
|
|
962
|
+
);
|
|
963
|
+
},
|
|
964
|
+
parameters: {
|
|
965
|
+
docs: {
|
|
966
|
+
description: {
|
|
967
|
+
story: 'Interactive demonstration of the programmatic toast API and queue management methods.',
|
|
968
|
+
},
|
|
969
|
+
},
|
|
970
|
+
},
|
|
971
|
+
};
|