@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.
Files changed (654) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +114 -0
  4. package/dist/Carousel-NTZX5TOW.js +16 -0
  5. package/dist/Carousel-NTZX5TOW.js.map +1 -0
  6. package/dist/Carousel-YH3DOQJU.mjs +7 -0
  7. package/dist/Carousel-YH3DOQJU.mjs.map +1 -0
  8. package/dist/chunk-2HIUTHMU.mjs +234 -0
  9. package/dist/chunk-2HIUTHMU.mjs.map +1 -0
  10. package/dist/chunk-34GTFTDO.js +431 -0
  11. package/dist/chunk-34GTFTDO.js.map +1 -0
  12. package/dist/chunk-3H7ASYR7.js +250 -0
  13. package/dist/chunk-3H7ASYR7.js.map +1 -0
  14. package/dist/chunk-3IEN7JOP.js +316 -0
  15. package/dist/chunk-3IEN7JOP.js.map +1 -0
  16. package/dist/chunk-3JHN4GAL.js +326 -0
  17. package/dist/chunk-3JHN4GAL.js.map +1 -0
  18. package/dist/chunk-3MJPASQU.js +232 -0
  19. package/dist/chunk-3MJPASQU.js.map +1 -0
  20. package/dist/chunk-3XD2JUL3.js +572 -0
  21. package/dist/chunk-3XD2JUL3.js.map +1 -0
  22. package/dist/chunk-3YOY2VJ6.js +189 -0
  23. package/dist/chunk-3YOY2VJ6.js.map +1 -0
  24. package/dist/chunk-4DU5JSXB.js +408 -0
  25. package/dist/chunk-4DU5JSXB.js.map +1 -0
  26. package/dist/chunk-4E4E2GSS.js +352 -0
  27. package/dist/chunk-4E4E2GSS.js.map +1 -0
  28. package/dist/chunk-4NHAP4AN.mjs +3 -0
  29. package/dist/chunk-4NHAP4AN.mjs.map +1 -0
  30. package/dist/chunk-4S33J5NY.mjs +415 -0
  31. package/dist/chunk-4S33J5NY.mjs.map +1 -0
  32. package/dist/chunk-5SMGRT3G.mjs +354 -0
  33. package/dist/chunk-5SMGRT3G.mjs.map +1 -0
  34. package/dist/chunk-5SVLJN2C.mjs +22 -0
  35. package/dist/chunk-5SVLJN2C.mjs.map +1 -0
  36. package/dist/chunk-66WTU4EB.mjs +299 -0
  37. package/dist/chunk-66WTU4EB.mjs.map +1 -0
  38. package/dist/chunk-6S25NMOT.mjs +335 -0
  39. package/dist/chunk-6S25NMOT.mjs.map +1 -0
  40. package/dist/chunk-6SP7UB3D.js +4 -0
  41. package/dist/chunk-6SP7UB3D.js.map +1 -0
  42. package/dist/chunk-6TYWWQHM.mjs +565 -0
  43. package/dist/chunk-6TYWWQHM.mjs.map +1 -0
  44. package/dist/chunk-A3YUJA6W.mjs +384 -0
  45. package/dist/chunk-A3YUJA6W.mjs.map +1 -0
  46. package/dist/chunk-A6KEDVUR.js +61 -0
  47. package/dist/chunk-A6KEDVUR.js.map +1 -0
  48. package/dist/chunk-A77RUEWL.js +730 -0
  49. package/dist/chunk-A77RUEWL.js.map +1 -0
  50. package/dist/chunk-AA4IKMPE.mjs +3 -0
  51. package/dist/chunk-AA4IKMPE.mjs.map +1 -0
  52. package/dist/chunk-AKIA6GW6.mjs +163 -0
  53. package/dist/chunk-AKIA6GW6.mjs.map +1 -0
  54. package/dist/chunk-AL6P275L.mjs +435 -0
  55. package/dist/chunk-AL6P275L.mjs.map +1 -0
  56. package/dist/chunk-AZ3RJYTB.js +37 -0
  57. package/dist/chunk-AZ3RJYTB.js.map +1 -0
  58. package/dist/chunk-B5Q4UPL6.js +32 -0
  59. package/dist/chunk-B5Q4UPL6.js.map +1 -0
  60. package/dist/chunk-B6DHPMDP.mjs +335 -0
  61. package/dist/chunk-B6DHPMDP.mjs.map +1 -0
  62. package/dist/chunk-BDXKKMBZ.mjs +184 -0
  63. package/dist/chunk-BDXKKMBZ.mjs.map +1 -0
  64. package/dist/chunk-BL6E2DLZ.mjs +52 -0
  65. package/dist/chunk-BL6E2DLZ.mjs.map +1 -0
  66. package/dist/chunk-CGFDS4XS.mjs +121 -0
  67. package/dist/chunk-CGFDS4XS.mjs.map +1 -0
  68. package/dist/chunk-CJIW5TKI.js +139 -0
  69. package/dist/chunk-CJIW5TKI.js.map +1 -0
  70. package/dist/chunk-CKNISJOQ.js +314 -0
  71. package/dist/chunk-CKNISJOQ.js.map +1 -0
  72. package/dist/chunk-D6CBOECS.mjs +1757 -0
  73. package/dist/chunk-D6CBOECS.mjs.map +1 -0
  74. package/dist/chunk-DDWEVC2S.js +166 -0
  75. package/dist/chunk-DDWEVC2S.js.map +1 -0
  76. package/dist/chunk-DZ556D2F.mjs +176 -0
  77. package/dist/chunk-DZ556D2F.mjs.map +1 -0
  78. package/dist/chunk-E2KQFV3O.mjs +10 -0
  79. package/dist/chunk-E2KQFV3O.mjs.map +1 -0
  80. package/dist/chunk-EMMLADSC.js +126 -0
  81. package/dist/chunk-EMMLADSC.js.map +1 -0
  82. package/dist/chunk-EP4WOI5D.mjs +926 -0
  83. package/dist/chunk-EP4WOI5D.mjs.map +1 -0
  84. package/dist/chunk-FJRXLJC2.mjs +160 -0
  85. package/dist/chunk-FJRXLJC2.mjs.map +1 -0
  86. package/dist/chunk-FKQI434R.js +345 -0
  87. package/dist/chunk-FKQI434R.js.map +1 -0
  88. package/dist/chunk-FPKEAJRZ.mjs +100 -0
  89. package/dist/chunk-FPKEAJRZ.mjs.map +1 -0
  90. package/dist/chunk-FWQYB22U.js +183 -0
  91. package/dist/chunk-FWQYB22U.js.map +1 -0
  92. package/dist/chunk-GD5GHTMA.js +189 -0
  93. package/dist/chunk-GD5GHTMA.js.map +1 -0
  94. package/dist/chunk-GE5XTSDZ.js +447 -0
  95. package/dist/chunk-GE5XTSDZ.js.map +1 -0
  96. package/dist/chunk-GVE47ZAX.mjs +32 -0
  97. package/dist/chunk-GVE47ZAX.mjs.map +1 -0
  98. package/dist/chunk-HK46BT5U.mjs +18 -0
  99. package/dist/chunk-HK46BT5U.mjs.map +1 -0
  100. package/dist/chunk-HQVRMR6N.js +365 -0
  101. package/dist/chunk-HQVRMR6N.js.map +1 -0
  102. package/dist/chunk-HSGBJPJO.mjs +398 -0
  103. package/dist/chunk-HSGBJPJO.mjs.map +1 -0
  104. package/dist/chunk-I3AUTOMZ.mjs +125 -0
  105. package/dist/chunk-I3AUTOMZ.mjs.map +1 -0
  106. package/dist/chunk-IEI5LD5C.mjs +1161 -0
  107. package/dist/chunk-IEI5LD5C.mjs.map +1 -0
  108. package/dist/chunk-IIPTC2X7.mjs +118 -0
  109. package/dist/chunk-IIPTC2X7.mjs.map +1 -0
  110. package/dist/chunk-J7TLHF2Q.js +4 -0
  111. package/dist/chunk-J7TLHF2Q.js.map +1 -0
  112. package/dist/chunk-JJOWXFXQ.mjs +765 -0
  113. package/dist/chunk-JJOWXFXQ.mjs.map +1 -0
  114. package/dist/chunk-JPTSS2OA.mjs +3 -0
  115. package/dist/chunk-JPTSS2OA.mjs.map +1 -0
  116. package/dist/chunk-KFXXRLTP.js +396 -0
  117. package/dist/chunk-KFXXRLTP.js.map +1 -0
  118. package/dist/chunk-KPRRBSG6.mjs +272 -0
  119. package/dist/chunk-KPRRBSG6.mjs.map +1 -0
  120. package/dist/chunk-NFSBGRDB.mjs +57 -0
  121. package/dist/chunk-NFSBGRDB.mjs.map +1 -0
  122. package/dist/chunk-NGJVCFTM.js +219 -0
  123. package/dist/chunk-NGJVCFTM.js.map +1 -0
  124. package/dist/chunk-NSQ6MZJ6.mjs +728 -0
  125. package/dist/chunk-NSQ6MZJ6.mjs.map +1 -0
  126. package/dist/chunk-NYQYHT76.mjs +296 -0
  127. package/dist/chunk-NYQYHT76.mjs.map +1 -0
  128. package/dist/chunk-OLJJGI5B.js +1193 -0
  129. package/dist/chunk-OLJJGI5B.js.map +1 -0
  130. package/dist/chunk-Q3572X2J.js +292 -0
  131. package/dist/chunk-Q3572X2J.js.map +1 -0
  132. package/dist/chunk-QH7N7D4I.mjs +210 -0
  133. package/dist/chunk-QH7N7D4I.mjs.map +1 -0
  134. package/dist/chunk-R7XUIV25.js +466 -0
  135. package/dist/chunk-R7XUIV25.js.map +1 -0
  136. package/dist/chunk-RFFO4KPM.js +135 -0
  137. package/dist/chunk-RFFO4KPM.js.map +1 -0
  138. package/dist/chunk-RFX7QKA7.mjs +180 -0
  139. package/dist/chunk-RFX7QKA7.mjs.map +1 -0
  140. package/dist/chunk-SN5LFAP3.js +940 -0
  141. package/dist/chunk-SN5LFAP3.js.map +1 -0
  142. package/dist/chunk-T4COXKQ3.js +24 -0
  143. package/dist/chunk-T4COXKQ3.js.map +1 -0
  144. package/dist/chunk-TS54QM27.js +125 -0
  145. package/dist/chunk-TS54QM27.js.map +1 -0
  146. package/dist/chunk-UE2S4PCX.mjs +220 -0
  147. package/dist/chunk-UE2S4PCX.mjs.map +1 -0
  148. package/dist/chunk-UTW3QX2A.mjs +282 -0
  149. package/dist/chunk-UTW3QX2A.mjs.map +1 -0
  150. package/dist/chunk-V74LGMAE.js +1767 -0
  151. package/dist/chunk-V74LGMAE.js.map +1 -0
  152. package/dist/chunk-VIREG536.js +12 -0
  153. package/dist/chunk-VIREG536.js.map +1 -0
  154. package/dist/chunk-VY7M7346.js +4 -0
  155. package/dist/chunk-VY7M7346.js.map +1 -0
  156. package/dist/chunk-W3TJOO7H.mjs +319 -0
  157. package/dist/chunk-W3TJOO7H.mjs.map +1 -0
  158. package/dist/chunk-WIUOB36M.js +54 -0
  159. package/dist/chunk-WIUOB36M.js.map +1 -0
  160. package/dist/chunk-WJGLM4CY.js +291 -0
  161. package/dist/chunk-WJGLM4CY.js.map +1 -0
  162. package/dist/chunk-WNURH5OO.mjs +453 -0
  163. package/dist/chunk-WNURH5OO.mjs.map +1 -0
  164. package/dist/chunk-X25TNRSD.mjs +364 -0
  165. package/dist/chunk-X25TNRSD.mjs.map +1 -0
  166. package/dist/chunk-Y3GT7ETK.js +108 -0
  167. package/dist/chunk-Y3GT7ETK.js.map +1 -0
  168. package/dist/chunk-Z4FRNOF6.mjs +115 -0
  169. package/dist/chunk-Z4FRNOF6.mjs.map +1 -0
  170. package/dist/chunk-ZMYLD3BN.js +166 -0
  171. package/dist/chunk-ZMYLD3BN.js.map +1 -0
  172. package/dist/chunk-ZP2KV6EX.js +815 -0
  173. package/dist/chunk-ZP2KV6EX.js.map +1 -0
  174. package/dist/chunk-ZVKXFELU.js +366 -0
  175. package/dist/chunk-ZVKXFELU.js.map +1 -0
  176. package/dist/elements/Accordion/Accordion.d.ts +139 -0
  177. package/dist/elements/Accordion/Accordion.d.ts.map +1 -0
  178. package/dist/elements/Accordion/Accordion.types.d.ts +143 -0
  179. package/dist/elements/Accordion/Accordion.types.d.ts.map +1 -0
  180. package/dist/elements/Accordion/index.d.ts +13 -0
  181. package/dist/elements/Accordion/index.d.ts.map +1 -0
  182. package/dist/elements/Accordion/index.js +78 -0
  183. package/dist/elements/Accordion/index.js.map +1 -0
  184. package/dist/elements/Accordion/index.mjs +5 -0
  185. package/dist/elements/Accordion/index.mjs.map +1 -0
  186. package/dist/elements/Avatar/Avatar.d.ts +51 -0
  187. package/dist/elements/Avatar/Avatar.d.ts.map +1 -0
  188. package/dist/elements/Avatar/Avatar.types.d.ts +145 -0
  189. package/dist/elements/Avatar/Avatar.types.d.ts.map +1 -0
  190. package/dist/elements/Avatar/AvatarGroup.d.ts +32 -0
  191. package/dist/elements/Avatar/AvatarGroup.d.ts.map +1 -0
  192. package/dist/elements/Avatar/index.d.ts +11 -0
  193. package/dist/elements/Avatar/index.d.ts.map +1 -0
  194. package/dist/elements/Avatar/index.js +54 -0
  195. package/dist/elements/Avatar/index.js.map +1 -0
  196. package/dist/elements/Avatar/index.mjs +5 -0
  197. package/dist/elements/Avatar/index.mjs.map +1 -0
  198. package/dist/elements/Badge/Badge.d.ts +39 -0
  199. package/dist/elements/Badge/Badge.d.ts.map +1 -0
  200. package/dist/elements/Badge/Badge.types.d.ts +76 -0
  201. package/dist/elements/Badge/Badge.types.d.ts.map +1 -0
  202. package/dist/elements/Badge/index.d.ts +18 -0
  203. package/dist/elements/Badge/index.d.ts.map +1 -0
  204. package/dist/elements/Badge/index.js +43 -0
  205. package/dist/elements/Badge/index.js.map +1 -0
  206. package/dist/elements/Badge/index.mjs +6 -0
  207. package/dist/elements/Badge/index.mjs.map +1 -0
  208. package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts +91 -0
  209. package/dist/elements/Breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  210. package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts +114 -0
  211. package/dist/elements/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -0
  212. package/dist/elements/Breadcrumbs/index.d.ts +14 -0
  213. package/dist/elements/Breadcrumbs/index.d.ts.map +1 -0
  214. package/dist/elements/Breadcrumbs/index.js +54 -0
  215. package/dist/elements/Breadcrumbs/index.js.map +1 -0
  216. package/dist/elements/Breadcrumbs/index.mjs +9 -0
  217. package/dist/elements/Breadcrumbs/index.mjs.map +1 -0
  218. package/dist/elements/Button/Button.d.ts +92 -0
  219. package/dist/elements/Button/Button.d.ts.map +1 -0
  220. package/dist/elements/Button/Button.types.d.ts +54 -0
  221. package/dist/elements/Button/Button.types.d.ts.map +1 -0
  222. package/dist/elements/Button/index.d.ts +18 -0
  223. package/dist/elements/Button/index.d.ts.map +1 -0
  224. package/dist/elements/Button/index.js +27 -0
  225. package/dist/elements/Button/index.js.map +1 -0
  226. package/dist/elements/Button/index.mjs +6 -0
  227. package/dist/elements/Button/index.mjs.map +1 -0
  228. package/dist/elements/ButtonGroup/ButtonGroup.d.ts +53 -0
  229. package/dist/elements/ButtonGroup/ButtonGroup.d.ts.map +1 -0
  230. package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts +98 -0
  231. package/dist/elements/ButtonGroup/ButtonGroup.types.d.ts.map +1 -0
  232. package/dist/elements/ButtonGroup/ButtonGroup.utils.d.ts +60 -0
  233. package/dist/elements/ButtonGroup/ButtonGroup.utils.d.ts.map +1 -0
  234. package/dist/elements/ButtonGroup/ButtonGroup.variants.d.ts +39 -0
  235. package/dist/elements/ButtonGroup/ButtonGroup.variants.d.ts.map +1 -0
  236. package/dist/elements/ButtonGroup/ButtonGroupContext.d.ts +42 -0
  237. package/dist/elements/ButtonGroup/ButtonGroupContext.d.ts.map +1 -0
  238. package/dist/elements/ButtonGroup/index.d.ts +35 -0
  239. package/dist/elements/ButtonGroup/index.d.ts.map +1 -0
  240. package/dist/elements/ButtonGroup/index.js +66 -0
  241. package/dist/elements/ButtonGroup/index.js.map +1 -0
  242. package/dist/elements/ButtonGroup/index.mjs +5 -0
  243. package/dist/elements/ButtonGroup/index.mjs.map +1 -0
  244. package/dist/elements/Card/Card.d.ts +104 -0
  245. package/dist/elements/Card/Card.d.ts.map +1 -0
  246. package/dist/elements/Card/Card.types.d.ts +227 -0
  247. package/dist/elements/Card/Card.types.d.ts.map +1 -0
  248. package/dist/elements/Card/index.d.ts +38 -0
  249. package/dist/elements/Card/index.d.ts.map +1 -0
  250. package/dist/elements/Card/index.js +85 -0
  251. package/dist/elements/Card/index.js.map +1 -0
  252. package/dist/elements/Card/index.mjs +8 -0
  253. package/dist/elements/Card/index.mjs.map +1 -0
  254. package/dist/elements/Carousel/Carousel.d.ts +13 -0
  255. package/dist/elements/Carousel/Carousel.d.ts.map +1 -0
  256. package/dist/elements/Carousel/Carousel.types.d.ts +65 -0
  257. package/dist/elements/Carousel/Carousel.types.d.ts.map +1 -0
  258. package/dist/elements/Carousel/LazyCarousel.d.ts +46 -0
  259. package/dist/elements/Carousel/LazyCarousel.d.ts.map +1 -0
  260. package/dist/elements/Carousel/index.d.ts +5 -0
  261. package/dist/elements/Carousel/index.d.ts.map +1 -0
  262. package/dist/elements/Carousel/index.js +23 -0
  263. package/dist/elements/Carousel/index.js.map +1 -0
  264. package/dist/elements/Carousel/index.mjs +10 -0
  265. package/dist/elements/Carousel/index.mjs.map +1 -0
  266. package/dist/elements/Chart/Chart.d.ts +44 -0
  267. package/dist/elements/Chart/Chart.d.ts.map +1 -0
  268. package/dist/elements/Chart/Chart.types.d.ts +254 -0
  269. package/dist/elements/Chart/Chart.types.d.ts.map +1 -0
  270. package/dist/elements/Chart/ChartAnnouncer.d.ts +24 -0
  271. package/dist/elements/Chart/ChartAnnouncer.d.ts.map +1 -0
  272. package/dist/elements/Chart/ChartAxis.d.ts +42 -0
  273. package/dist/elements/Chart/ChartAxis.d.ts.map +1 -0
  274. package/dist/elements/Chart/ChartBarSeries.d.ts +54 -0
  275. package/dist/elements/Chart/ChartBarSeries.d.ts.map +1 -0
  276. package/dist/elements/Chart/ChartContext.d.ts +46 -0
  277. package/dist/elements/Chart/ChartContext.d.ts.map +1 -0
  278. package/dist/elements/Chart/ChartDataPoint.d.ts +56 -0
  279. package/dist/elements/Chart/ChartDataPoint.d.ts.map +1 -0
  280. package/dist/elements/Chart/ChartDataTable.d.ts +35 -0
  281. package/dist/elements/Chart/ChartDataTable.d.ts.map +1 -0
  282. package/dist/elements/Chart/ChartGrid.d.ts +32 -0
  283. package/dist/elements/Chart/ChartGrid.d.ts.map +1 -0
  284. package/dist/elements/Chart/ChartLegend.d.ts +32 -0
  285. package/dist/elements/Chart/ChartLegend.d.ts.map +1 -0
  286. package/dist/elements/Chart/ChartLineSeries.d.ts +52 -0
  287. package/dist/elements/Chart/ChartLineSeries.d.ts.map +1 -0
  288. package/dist/elements/Chart/ChartSVG.d.ts +62 -0
  289. package/dist/elements/Chart/ChartSVG.d.ts.map +1 -0
  290. package/dist/elements/Chart/ChartTooltip.d.ts +45 -0
  291. package/dist/elements/Chart/ChartTooltip.d.ts.map +1 -0
  292. package/dist/elements/Chart/chart.constants.d.ts +108 -0
  293. package/dist/elements/Chart/chart.constants.d.ts.map +1 -0
  294. package/dist/elements/Chart/chart.variants.d.ts +45 -0
  295. package/dist/elements/Chart/chart.variants.d.ts.map +1 -0
  296. package/dist/elements/Chart/index.d.ts +12 -0
  297. package/dist/elements/Chart/index.d.ts.map +1 -0
  298. package/dist/elements/Chart/index.js +47 -0
  299. package/dist/elements/Chart/index.js.map +1 -0
  300. package/dist/elements/Chart/index.mjs +6 -0
  301. package/dist/elements/Chart/index.mjs.map +1 -0
  302. package/dist/elements/Chart/useChartDimensions.d.ts +18 -0
  303. package/dist/elements/Chart/useChartDimensions.d.ts.map +1 -0
  304. package/dist/elements/Chart/useChartKeyboard.d.ts +42 -0
  305. package/dist/elements/Chart/useChartKeyboard.d.ts.map +1 -0
  306. package/dist/elements/Chart/useRovingTabIndex.d.ts +46 -0
  307. package/dist/elements/Chart/useRovingTabIndex.d.ts.map +1 -0
  308. package/dist/elements/Checkbox/Checkbox.d.ts +94 -0
  309. package/dist/elements/Checkbox/Checkbox.d.ts.map +1 -0
  310. package/dist/elements/Checkbox/Checkbox.types.d.ts +82 -0
  311. package/dist/elements/Checkbox/Checkbox.types.d.ts.map +1 -0
  312. package/dist/elements/Checkbox/index.d.ts +7 -0
  313. package/dist/elements/Checkbox/index.d.ts.map +1 -0
  314. package/dist/elements/Checkbox/index.js +47 -0
  315. package/dist/elements/Checkbox/index.js.map +1 -0
  316. package/dist/elements/Checkbox/index.mjs +6 -0
  317. package/dist/elements/Checkbox/index.mjs.map +1 -0
  318. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts +130 -0
  319. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts.map +1 -0
  320. package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts +142 -0
  321. package/dist/elements/CheckboxGroup/CheckboxGroup.types.d.ts.map +1 -0
  322. package/dist/elements/CheckboxGroup/index.d.ts +10 -0
  323. package/dist/elements/CheckboxGroup/index.d.ts.map +1 -0
  324. package/dist/elements/CheckboxGroup/index.js +71 -0
  325. package/dist/elements/CheckboxGroup/index.js.map +1 -0
  326. package/dist/elements/CheckboxGroup/index.mjs +6 -0
  327. package/dist/elements/CheckboxGroup/index.mjs.map +1 -0
  328. package/dist/elements/DatePicker/Calendar.d.ts +16 -0
  329. package/dist/elements/DatePicker/Calendar.d.ts.map +1 -0
  330. package/dist/elements/DatePicker/DateField.d.ts +13 -0
  331. package/dist/elements/DatePicker/DateField.d.ts.map +1 -0
  332. package/dist/elements/DatePicker/DatePicker.d.ts +16 -0
  333. package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -0
  334. package/dist/elements/DatePicker/DatePicker.types.d.ts +390 -0
  335. package/dist/elements/DatePicker/DatePicker.types.d.ts.map +1 -0
  336. package/dist/elements/DatePicker/DatePicker.variants.d.ts +42 -0
  337. package/dist/elements/DatePicker/DatePicker.variants.d.ts.map +1 -0
  338. package/dist/elements/DatePicker/DateRangePicker.d.ts +13 -0
  339. package/dist/elements/DatePicker/DateRangePicker.d.ts.map +1 -0
  340. package/dist/elements/DatePicker/index.d.ts +14 -0
  341. package/dist/elements/DatePicker/index.d.ts.map +1 -0
  342. package/dist/elements/DatePicker/index.js +123 -0
  343. package/dist/elements/DatePicker/index.js.map +1 -0
  344. package/dist/elements/DatePicker/index.mjs +6 -0
  345. package/dist/elements/DatePicker/index.mjs.map +1 -0
  346. package/dist/elements/Dropdown/Dropdown.d.ts +197 -0
  347. package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -0
  348. package/dist/elements/Dropdown/Dropdown.types.d.ts +175 -0
  349. package/dist/elements/Dropdown/Dropdown.types.d.ts.map +1 -0
  350. package/dist/elements/Dropdown/index.d.ts +12 -0
  351. package/dist/elements/Dropdown/index.d.ts.map +1 -0
  352. package/dist/elements/Dropdown/index.js +41 -0
  353. package/dist/elements/Dropdown/index.js.map +1 -0
  354. package/dist/elements/Dropdown/index.mjs +4 -0
  355. package/dist/elements/Dropdown/index.mjs.map +1 -0
  356. package/dist/elements/FileField/FileField.d.ts +46 -0
  357. package/dist/elements/FileField/FileField.d.ts.map +1 -0
  358. package/dist/elements/FileField/FileField.types.d.ts +99 -0
  359. package/dist/elements/FileField/FileField.types.d.ts.map +1 -0
  360. package/dist/elements/FileField/FileField.variants.d.ts +49 -0
  361. package/dist/elements/FileField/FileField.variants.d.ts.map +1 -0
  362. package/dist/elements/FileField/FilePreview.d.ts +27 -0
  363. package/dist/elements/FileField/FilePreview.d.ts.map +1 -0
  364. package/dist/elements/FileField/FileProgress.d.ts +35 -0
  365. package/dist/elements/FileField/FileProgress.d.ts.map +1 -0
  366. package/dist/elements/FileField/FileProgress.variants.d.ts +55 -0
  367. package/dist/elements/FileField/FileProgress.variants.d.ts.map +1 -0
  368. package/dist/elements/FileField/index.d.ts +41 -0
  369. package/dist/elements/FileField/index.d.ts.map +1 -0
  370. package/dist/elements/FileField/index.js +138 -0
  371. package/dist/elements/FileField/index.js.map +1 -0
  372. package/dist/elements/FileField/index.mjs +9 -0
  373. package/dist/elements/FileField/index.mjs.map +1 -0
  374. package/dist/elements/FileField/useFilePreview.d.ts +46 -0
  375. package/dist/elements/FileField/useFilePreview.d.ts.map +1 -0
  376. package/dist/elements/FileField/utils.d.ts +134 -0
  377. package/dist/elements/FileField/utils.d.ts.map +1 -0
  378. package/dist/elements/FormLayout/FormLayout.d.ts +51 -0
  379. package/dist/elements/FormLayout/FormLayout.d.ts.map +1 -0
  380. package/dist/elements/FormLayout/FormLayout.types.d.ts +66 -0
  381. package/dist/elements/FormLayout/FormLayout.types.d.ts.map +1 -0
  382. package/dist/elements/FormLayout/index.d.ts +3 -0
  383. package/dist/elements/FormLayout/index.d.ts.map +1 -0
  384. package/dist/elements/FormLayout/index.js +17 -0
  385. package/dist/elements/FormLayout/index.js.map +1 -0
  386. package/dist/elements/FormLayout/index.mjs +4 -0
  387. package/dist/elements/FormLayout/index.mjs.map +1 -0
  388. package/dist/elements/Modal/Modal.d.ts +168 -0
  389. package/dist/elements/Modal/Modal.d.ts.map +1 -0
  390. package/dist/elements/Modal/Modal.types.d.ts +265 -0
  391. package/dist/elements/Modal/Modal.types.d.ts.map +1 -0
  392. package/dist/elements/Modal/index.d.ts +14 -0
  393. package/dist/elements/Modal/index.d.ts.map +1 -0
  394. package/dist/elements/Modal/index.js +52 -0
  395. package/dist/elements/Modal/index.js.map +1 -0
  396. package/dist/elements/Modal/index.mjs +3 -0
  397. package/dist/elements/Modal/index.mjs.map +1 -0
  398. package/dist/elements/NumberField/NumberField.d.ts +43 -0
  399. package/dist/elements/NumberField/NumberField.d.ts.map +1 -0
  400. package/dist/elements/NumberField/NumberField.types.d.ts +112 -0
  401. package/dist/elements/NumberField/NumberField.types.d.ts.map +1 -0
  402. package/dist/elements/NumberField/NumberField.variants.d.ts +82 -0
  403. package/dist/elements/NumberField/NumberField.variants.d.ts.map +1 -0
  404. package/dist/elements/NumberField/index.d.ts +25 -0
  405. package/dist/elements/NumberField/index.d.ts.map +1 -0
  406. package/dist/elements/NumberField/index.js +57 -0
  407. package/dist/elements/NumberField/index.js.map +1 -0
  408. package/dist/elements/NumberField/index.mjs +8 -0
  409. package/dist/elements/NumberField/index.mjs.map +1 -0
  410. package/dist/elements/OTPInput/OTPInput.d.ts +105 -0
  411. package/dist/elements/OTPInput/OTPInput.d.ts.map +1 -0
  412. package/dist/elements/OTPInput/OTPInput.styles.d.ts +83 -0
  413. package/dist/elements/OTPInput/OTPInput.styles.d.ts.map +1 -0
  414. package/dist/elements/OTPInput/OTPInput.types.d.ts +189 -0
  415. package/dist/elements/OTPInput/OTPInput.types.d.ts.map +1 -0
  416. package/dist/elements/OTPInput/components/OTPDigit.d.ts +51 -0
  417. package/dist/elements/OTPInput/components/OTPDigit.d.ts.map +1 -0
  418. package/dist/elements/OTPInput/hooks/useOTPInput.d.ts +36 -0
  419. package/dist/elements/OTPInput/hooks/useOTPInput.d.ts.map +1 -0
  420. package/dist/elements/OTPInput/hooks/useOTPKeyboard.d.ts +59 -0
  421. package/dist/elements/OTPInput/hooks/useOTPKeyboard.d.ts.map +1 -0
  422. package/dist/elements/OTPInput/index.d.ts +27 -0
  423. package/dist/elements/OTPInput/index.d.ts.map +1 -0
  424. package/dist/elements/OTPInput/index.js +13 -0
  425. package/dist/elements/OTPInput/index.js.map +1 -0
  426. package/dist/elements/OTPInput/index.mjs +4 -0
  427. package/dist/elements/OTPInput/index.mjs.map +1 -0
  428. package/dist/elements/Panel/Panel.d.ts +111 -0
  429. package/dist/elements/Panel/Panel.d.ts.map +1 -0
  430. package/dist/elements/Panel/Panel.types.d.ts +243 -0
  431. package/dist/elements/Panel/Panel.types.d.ts.map +1 -0
  432. package/dist/elements/Panel/index.d.ts +4 -0
  433. package/dist/elements/Panel/index.d.ts.map +1 -0
  434. package/dist/elements/Panel/index.js +33 -0
  435. package/dist/elements/Panel/index.js.map +1 -0
  436. package/dist/elements/Panel/index.mjs +4 -0
  437. package/dist/elements/Panel/index.mjs.map +1 -0
  438. package/dist/elements/Progress/Progress.d.ts +44 -0
  439. package/dist/elements/Progress/Progress.d.ts.map +1 -0
  440. package/dist/elements/Progress/Progress.types.d.ts +64 -0
  441. package/dist/elements/Progress/Progress.types.d.ts.map +1 -0
  442. package/dist/elements/Progress/index.d.ts +11 -0
  443. package/dist/elements/Progress/index.d.ts.map +1 -0
  444. package/dist/elements/Progress/index.js +30 -0
  445. package/dist/elements/Progress/index.js.map +1 -0
  446. package/dist/elements/Progress/index.mjs +5 -0
  447. package/dist/elements/Progress/index.mjs.map +1 -0
  448. package/dist/elements/RadioGroup/RadioGroup.d.ts +110 -0
  449. package/dist/elements/RadioGroup/RadioGroup.d.ts.map +1 -0
  450. package/dist/elements/RadioGroup/RadioGroup.types.d.ts +143 -0
  451. package/dist/elements/RadioGroup/RadioGroup.types.d.ts.map +1 -0
  452. package/dist/elements/RadioGroup/index.d.ts +10 -0
  453. package/dist/elements/RadioGroup/index.d.ts.map +1 -0
  454. package/dist/elements/RadioGroup/index.js +47 -0
  455. package/dist/elements/RadioGroup/index.js.map +1 -0
  456. package/dist/elements/RadioGroup/index.mjs +6 -0
  457. package/dist/elements/RadioGroup/index.mjs.map +1 -0
  458. package/dist/elements/Resizable/Resizable.types.d.ts +188 -0
  459. package/dist/elements/Resizable/Resizable.types.d.ts.map +1 -0
  460. package/dist/elements/Resizable/components/ResizableHandle.d.ts +28 -0
  461. package/dist/elements/Resizable/components/ResizableHandle.d.ts.map +1 -0
  462. package/dist/elements/Resizable/components/ResizablePanel.d.ts +24 -0
  463. package/dist/elements/Resizable/components/ResizablePanel.d.ts.map +1 -0
  464. package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts +26 -0
  465. package/dist/elements/Resizable/components/ResizablePanelGroup.d.ts.map +1 -0
  466. package/dist/elements/Resizable/components/ResizablePopover.d.ts +45 -0
  467. package/dist/elements/Resizable/components/ResizablePopover.d.ts.map +1 -0
  468. package/dist/elements/Resizable/hooks/useResizable.d.ts +50 -0
  469. package/dist/elements/Resizable/hooks/useResizable.d.ts.map +1 -0
  470. package/dist/elements/Resizable/hooks/useResizableContext.d.ts +36 -0
  471. package/dist/elements/Resizable/hooks/useResizableContext.d.ts.map +1 -0
  472. package/dist/elements/Resizable/index.d.ts +37 -0
  473. package/dist/elements/Resizable/index.d.ts.map +1 -0
  474. package/dist/elements/Resizable/index.js +65 -0
  475. package/dist/elements/Resizable/index.js.map +1 -0
  476. package/dist/elements/Resizable/index.mjs +8 -0
  477. package/dist/elements/Resizable/index.mjs.map +1 -0
  478. package/dist/elements/Select/Select.d.ts +184 -0
  479. package/dist/elements/Select/Select.d.ts.map +1 -0
  480. package/dist/elements/Select/Select.types.d.ts +166 -0
  481. package/dist/elements/Select/Select.types.d.ts.map +1 -0
  482. package/dist/elements/Select/index.d.ts +35 -0
  483. package/dist/elements/Select/index.d.ts.map +1 -0
  484. package/dist/elements/Select/index.js +33 -0
  485. package/dist/elements/Select/index.js.map +1 -0
  486. package/dist/elements/Select/index.mjs +4 -0
  487. package/dist/elements/Select/index.mjs.map +1 -0
  488. package/dist/elements/Skeleton/Skeleton.d.ts +31 -0
  489. package/dist/elements/Skeleton/Skeleton.d.ts.map +1 -0
  490. package/dist/elements/Skeleton/Skeleton.types.d.ts +36 -0
  491. package/dist/elements/Skeleton/Skeleton.types.d.ts.map +1 -0
  492. package/dist/elements/Skeleton/index.d.ts +11 -0
  493. package/dist/elements/Skeleton/index.d.ts.map +1 -0
  494. package/dist/elements/Skeleton/index.js +22 -0
  495. package/dist/elements/Skeleton/index.js.map +1 -0
  496. package/dist/elements/Skeleton/index.mjs +5 -0
  497. package/dist/elements/Skeleton/index.mjs.map +1 -0
  498. package/dist/elements/Switch/Switch.d.ts +39 -0
  499. package/dist/elements/Switch/Switch.d.ts.map +1 -0
  500. package/dist/elements/Switch/Switch.types.d.ts +53 -0
  501. package/dist/elements/Switch/Switch.types.d.ts.map +1 -0
  502. package/dist/elements/Switch/index.d.ts +8 -0
  503. package/dist/elements/Switch/index.d.ts.map +1 -0
  504. package/dist/elements/Switch/index.js +49 -0
  505. package/dist/elements/Switch/index.js.map +1 -0
  506. package/dist/elements/Switch/index.mjs +31 -0
  507. package/dist/elements/Switch/index.mjs.map +1 -0
  508. package/dist/elements/Table/Table.d.ts +123 -0
  509. package/dist/elements/Table/Table.d.ts.map +1 -0
  510. package/dist/elements/Table/Table.types.d.ts +356 -0
  511. package/dist/elements/Table/Table.types.d.ts.map +1 -0
  512. package/dist/elements/Table/index.d.ts +5 -0
  513. package/dist/elements/Table/index.d.ts.map +1 -0
  514. package/dist/elements/Table/index.js +76 -0
  515. package/dist/elements/Table/index.js.map +1 -0
  516. package/dist/elements/Table/index.mjs +7 -0
  517. package/dist/elements/Table/index.mjs.map +1 -0
  518. package/dist/elements/Tabs/Tabs.d.ts +129 -0
  519. package/dist/elements/Tabs/Tabs.d.ts.map +1 -0
  520. package/dist/elements/Tabs/Tabs.types.d.ts +179 -0
  521. package/dist/elements/Tabs/Tabs.types.d.ts.map +1 -0
  522. package/dist/elements/Tabs/index.d.ts +12 -0
  523. package/dist/elements/Tabs/index.d.ts.map +1 -0
  524. package/dist/elements/Tabs/index.js +74 -0
  525. package/dist/elements/Tabs/index.js.map +1 -0
  526. package/dist/elements/Tabs/index.mjs +5 -0
  527. package/dist/elements/Tabs/index.mjs.map +1 -0
  528. package/dist/elements/TextField/TextField.d.ts +155 -0
  529. package/dist/elements/TextField/TextField.d.ts.map +1 -0
  530. package/dist/elements/TextField/TextField.types.d.ts +258 -0
  531. package/dist/elements/TextField/TextField.types.d.ts.map +1 -0
  532. package/dist/elements/TextField/index.css +23 -0
  533. package/dist/elements/TextField/index.css.map +1 -0
  534. package/dist/elements/TextField/index.d.ts +13 -0
  535. package/dist/elements/TextField/index.d.ts.map +1 -0
  536. package/dist/elements/TextField/index.js +260 -0
  537. package/dist/elements/TextField/index.js.map +1 -0
  538. package/dist/elements/TextField/index.mjs +207 -0
  539. package/dist/elements/TextField/index.mjs.map +1 -0
  540. package/dist/elements/TimeField/TimeField.d.ts +34 -0
  541. package/dist/elements/TimeField/TimeField.d.ts.map +1 -0
  542. package/dist/elements/TimeField/TimeField.types.d.ts +151 -0
  543. package/dist/elements/TimeField/TimeField.types.d.ts.map +1 -0
  544. package/dist/elements/TimeField/index.d.ts +24 -0
  545. package/dist/elements/TimeField/index.d.ts.map +1 -0
  546. package/dist/elements/TimeField/index.js +45 -0
  547. package/dist/elements/TimeField/index.js.map +1 -0
  548. package/dist/elements/TimeField/index.mjs +4 -0
  549. package/dist/elements/TimeField/index.mjs.map +1 -0
  550. package/dist/elements/Toast/Toast.d.ts +105 -0
  551. package/dist/elements/Toast/Toast.d.ts.map +1 -0
  552. package/dist/elements/Toast/Toast.types.d.ts +209 -0
  553. package/dist/elements/Toast/Toast.types.d.ts.map +1 -0
  554. package/dist/elements/Toast/ToastProvider.d.ts +37 -0
  555. package/dist/elements/Toast/ToastProvider.d.ts.map +1 -0
  556. package/dist/elements/Toast/Toaster.d.ts +18 -0
  557. package/dist/elements/Toast/Toaster.d.ts.map +1 -0
  558. package/dist/elements/Toast/index.d.ts +27 -0
  559. package/dist/elements/Toast/index.d.ts.map +1 -0
  560. package/dist/elements/Toast/index.js +60 -0
  561. package/dist/elements/Toast/index.js.map +1 -0
  562. package/dist/elements/Toast/index.mjs +7 -0
  563. package/dist/elements/Toast/index.mjs.map +1 -0
  564. package/dist/elements/Tooltip/Tooltip.d.ts +108 -0
  565. package/dist/elements/Tooltip/Tooltip.d.ts.map +1 -0
  566. package/dist/elements/Tooltip/Tooltip.types.d.ts +135 -0
  567. package/dist/elements/Tooltip/Tooltip.types.d.ts.map +1 -0
  568. package/dist/elements/Tooltip/index.d.ts +11 -0
  569. package/dist/elements/Tooltip/index.d.ts.map +1 -0
  570. package/dist/elements/Tooltip/index.js +59 -0
  571. package/dist/elements/Tooltip/index.js.map +1 -0
  572. package/dist/elements/Tooltip/index.mjs +6 -0
  573. package/dist/elements/Tooltip/index.mjs.map +1 -0
  574. package/dist/elements/index.css +23 -0
  575. package/dist/elements/index.css.map +1 -0
  576. package/dist/elements/index.d.ts +42 -0
  577. package/dist/elements/index.d.ts.map +1 -0
  578. package/dist/elements/index.js +839 -0
  579. package/dist/elements/index.js.map +1 -0
  580. package/dist/elements/index.mjs +42 -0
  581. package/dist/elements/index.mjs.map +1 -0
  582. package/dist/index.css +23 -0
  583. package/dist/index.css.map +1 -0
  584. package/dist/index.d.ts +4 -0
  585. package/dist/index.d.ts.map +1 -0
  586. package/dist/index.js +865 -0
  587. package/dist/index.js.map +1 -0
  588. package/dist/index.mjs +44 -0
  589. package/dist/index.mjs.map +1 -0
  590. package/dist/schemas/BaseComponentProps.d.ts +25 -0
  591. package/dist/schemas/BaseComponentProps.d.ts.map +1 -0
  592. package/dist/schemas/RegistryItem.d.ts +55 -0
  593. package/dist/schemas/RegistryItem.d.ts.map +1 -0
  594. package/dist/schemas/index.d.ts +3 -0
  595. package/dist/schemas/index.d.ts.map +1 -0
  596. package/dist/schemas/index.js +29 -0
  597. package/dist/schemas/index.js.map +1 -0
  598. package/dist/schemas/index.mjs +4 -0
  599. package/dist/schemas/index.mjs.map +1 -0
  600. package/dist/styles/defaults.css +174 -0
  601. package/dist/styles/index.d.ts +7 -0
  602. package/dist/styles/index.d.ts.map +1 -0
  603. package/dist/styles/index.js +153 -0
  604. package/dist/styles/index.js.map +1 -0
  605. package/dist/styles/index.mjs +4 -0
  606. package/dist/styles/index.mjs.map +1 -0
  607. package/dist/styles/interaction-states.d.ts +96 -0
  608. package/dist/styles/interaction-states.d.ts.map +1 -0
  609. package/dist/styles/shared-variants.d.ts +120 -0
  610. package/dist/styles/shared-variants.d.ts.map +1 -0
  611. package/dist/styles/tokens.css +89 -0
  612. package/dist/utils/cn.d.ts +13 -0
  613. package/dist/utils/cn.d.ts.map +1 -0
  614. package/dist/utils/index.d.ts +2 -0
  615. package/dist/utils/index.d.ts.map +1 -0
  616. package/dist/utils/index.js +13 -0
  617. package/dist/utils/index.js.map +1 -0
  618. package/dist/utils/index.mjs +4 -0
  619. package/dist/utils/index.mjs.map +1 -0
  620. package/package.json +228 -0
  621. package/src/elements/Accordion/Accordion.stories.tsx +793 -0
  622. package/src/elements/Avatar/Avatar.stories.tsx +408 -0
  623. package/src/elements/Badge/Badge.stories.tsx +509 -0
  624. package/src/elements/Breadcrumbs/Breadcrumbs.stories.tsx +623 -0
  625. package/src/elements/Button/Button.stories.tsx +670 -0
  626. package/src/elements/ButtonGroup/ButtonGroup.stories.tsx +658 -0
  627. package/src/elements/Card/Card.stories.tsx +570 -0
  628. package/src/elements/Carousel/Carousel.stories.tsx +597 -0
  629. package/src/elements/Chart/Chart.stories.tsx +616 -0
  630. package/src/elements/Checkbox/Checkbox.stories.tsx +514 -0
  631. package/src/elements/CheckboxGroup/CheckboxGroup.stories.tsx +1514 -0
  632. package/src/elements/DatePicker/DatePicker.stories.tsx +341 -0
  633. package/src/elements/Dropdown/Dropdown.stories.tsx +397 -0
  634. package/src/elements/FileField/FileField.stories.tsx +1021 -0
  635. package/src/elements/FileField/FileProgress.stories.tsx +359 -0
  636. package/src/elements/FormLayout/FormLayout.stories.tsx +637 -0
  637. package/src/elements/Modal/Modal.stories.tsx +640 -0
  638. package/src/elements/NumberField/NumberField.stories.tsx +678 -0
  639. package/src/elements/OTPInput/OTPInput.stories.tsx +404 -0
  640. package/src/elements/Panel/Panel.stories.tsx +769 -0
  641. package/src/elements/Progress/Progress.stories.tsx +668 -0
  642. package/src/elements/RadioGroup/RadioGroup.stories.tsx +1153 -0
  643. package/src/elements/Resizable/Resizable.stories.tsx +374 -0
  644. package/src/elements/Select/Select.stories.tsx +362 -0
  645. package/src/elements/Skeleton/Skeleton.stories.tsx +284 -0
  646. package/src/elements/Switch/Switch.stories.tsx +441 -0
  647. package/src/elements/Table/Table.stories.tsx +790 -0
  648. package/src/elements/Tabs/Tabs.stories.tsx +661 -0
  649. package/src/elements/TextField/TextField.stories.tsx +1878 -0
  650. package/src/elements/TimeField/TimeField.stories.tsx +671 -0
  651. package/src/elements/Toast/Toast.stories.tsx +971 -0
  652. package/src/elements/Tooltip/Tooltip.stories.tsx +748 -0
  653. package/tailwind.config.js +10 -0
  654. 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
+ };