@zentauri-ui/zentauri-components 1.5.22 → 1.6.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 (394) hide show
  1. package/README.md +136 -70
  2. package/cli/registry.json +2 -0
  3. package/dist/charts/area.js.map +1 -1
  4. package/dist/charts/area.mjs.map +1 -1
  5. package/dist/charts/bubble/Bubble.d.ts.map +1 -1
  6. package/dist/charts/bubble.js.map +1 -1
  7. package/dist/charts/bubble.mjs.map +1 -1
  8. package/dist/charts/pie/Pie.d.ts.map +1 -1
  9. package/dist/charts/pie.js +20 -2
  10. package/dist/charts/pie.js.map +1 -1
  11. package/dist/charts/pie.mjs +20 -2
  12. package/dist/charts/pie.mjs.map +1 -1
  13. package/dist/charts/shared/types.d.ts.map +1 -1
  14. package/dist/{chunk-G3LEYBRV.mjs → chunk-25EAVVGS.mjs} +61 -58
  15. package/dist/chunk-25EAVVGS.mjs.map +1 -0
  16. package/dist/{chunk-BCZIYH53.js → chunk-3OXIZ4ZO.js} +28 -28
  17. package/dist/chunk-3OXIZ4ZO.js.map +1 -0
  18. package/dist/chunk-3PC7XLJX.js +102 -0
  19. package/dist/chunk-3PC7XLJX.js.map +1 -0
  20. package/dist/chunk-4ECCMHAX.mjs +323 -0
  21. package/dist/chunk-4ECCMHAX.mjs.map +1 -0
  22. package/dist/chunk-4MPNRGUA.mjs +65 -0
  23. package/dist/chunk-4MPNRGUA.mjs.map +1 -0
  24. package/dist/{chunk-Y745GQR2.js → chunk-4PZIDDC6.js} +45 -45
  25. package/dist/chunk-4PZIDDC6.js.map +1 -0
  26. package/dist/{chunk-PWL5WD34.js → chunk-662PJBZD.js} +27 -26
  27. package/dist/chunk-662PJBZD.js.map +1 -0
  28. package/dist/{chunk-TINHLHCN.mjs → chunk-73RHHGIA.mjs} +39 -36
  29. package/dist/chunk-73RHHGIA.mjs.map +1 -0
  30. package/dist/{chunk-OLEMP2HL.js → chunk-746CV3AN.js} +29 -36
  31. package/dist/chunk-746CV3AN.js.map +1 -0
  32. package/dist/{chunk-AUGLZ3AN.js → chunk-BMFPUQZC.js} +50 -50
  33. package/dist/chunk-BMFPUQZC.js.map +1 -0
  34. package/dist/chunk-CFTDAGKD.js +130 -0
  35. package/dist/chunk-CFTDAGKD.js.map +1 -0
  36. package/dist/{chunk-N2OAI2HN.js → chunk-D55YIHBN.js} +15 -15
  37. package/dist/chunk-D55YIHBN.js.map +1 -0
  38. package/dist/chunk-DO2LEXUY.js +62 -0
  39. package/dist/chunk-DO2LEXUY.js.map +1 -0
  40. package/dist/chunk-EU63V22F.mjs +126 -0
  41. package/dist/chunk-EU63V22F.mjs.map +1 -0
  42. package/dist/chunk-EZS47EZW.mjs +70 -0
  43. package/dist/chunk-EZS47EZW.mjs.map +1 -0
  44. package/dist/{chunk-E4FZY7O2.js → chunk-GHJN3Z3V.js} +48 -48
  45. package/dist/chunk-GHJN3Z3V.js.map +1 -0
  46. package/dist/{chunk-MTLLJFUI.mjs → chunk-GIC3J6HR.mjs} +28 -28
  47. package/dist/chunk-GIC3J6HR.mjs.map +1 -0
  48. package/dist/{chunk-C5L465FW.mjs → chunk-HARD4NMB.mjs} +45 -45
  49. package/dist/chunk-HARD4NMB.mjs.map +1 -0
  50. package/dist/{chunk-2VQJ6OIL.js → chunk-HPN7H5ZM.js} +2 -2
  51. package/dist/{chunk-2VQJ6OIL.js.map → chunk-HPN7H5ZM.js.map} +1 -1
  52. package/dist/{chunk-YTRGRHEB.js → chunk-HV7LVRK3.js} +61 -58
  53. package/dist/chunk-HV7LVRK3.js.map +1 -0
  54. package/dist/{chunk-Q5B44QW7.js → chunk-J4LG43O2.js} +51 -51
  55. package/dist/chunk-J4LG43O2.js.map +1 -0
  56. package/dist/{chunk-ZYZJ74XB.mjs → chunk-J5QJEKY2.mjs} +28 -28
  57. package/dist/chunk-J5QJEKY2.mjs.map +1 -0
  58. package/dist/{chunk-7TLKLMBM.js → chunk-JOMSI4WH.js} +18 -15
  59. package/dist/chunk-JOMSI4WH.js.map +1 -0
  60. package/dist/{chunk-ZBBFOMSJ.mjs → chunk-M6FS7X54.mjs} +22 -22
  61. package/dist/chunk-M6FS7X54.mjs.map +1 -0
  62. package/dist/{chunk-JUDMPOCI.js → chunk-MM3P52WS.js} +22 -22
  63. package/dist/chunk-MM3P52WS.js.map +1 -0
  64. package/dist/chunk-N6B35KWW.mjs +3 -0
  65. package/dist/chunk-N6B35KWW.mjs.map +1 -0
  66. package/dist/{chunk-73VCO5TE.mjs → chunk-NWOE2TZN.mjs} +2 -2
  67. package/dist/{chunk-73VCO5TE.mjs.map → chunk-NWOE2TZN.mjs.map} +1 -1
  68. package/dist/{chunk-UWA23DUC.js → chunk-OB6TYS5Q.js} +28 -28
  69. package/dist/chunk-OB6TYS5Q.js.map +1 -0
  70. package/dist/{chunk-QZTEFGZF.mjs → chunk-OVTWPGMW.mjs} +18 -15
  71. package/dist/chunk-OVTWPGMW.mjs.map +1 -0
  72. package/dist/chunk-PPVJ4INP.mjs +60 -0
  73. package/dist/chunk-PPVJ4INP.mjs.map +1 -0
  74. package/dist/{chunk-LN77JJTY.mjs → chunk-PSIAOIXJ.mjs} +48 -48
  75. package/dist/chunk-PSIAOIXJ.mjs.map +1 -0
  76. package/dist/chunk-QNF4JPFP.js +339 -0
  77. package/dist/chunk-QNF4JPFP.js.map +1 -0
  78. package/dist/{chunk-A6KMZ5ZS.mjs → chunk-QSIJKHC5.mjs} +15 -15
  79. package/dist/chunk-QSIJKHC5.mjs.map +1 -0
  80. package/dist/chunk-RFFGQYDQ.mjs +337 -0
  81. package/dist/chunk-RFFGQYDQ.mjs.map +1 -0
  82. package/dist/chunk-RGOMHX4G.js +4 -0
  83. package/dist/chunk-RGOMHX4G.js.map +1 -0
  84. package/dist/{chunk-INMNX3HQ.mjs → chunk-S5H2OMTZ.mjs} +29 -36
  85. package/dist/chunk-S5H2OMTZ.mjs.map +1 -0
  86. package/dist/{chunk-JBAUEGYD.mjs → chunk-TFWKF3DR.mjs} +51 -51
  87. package/dist/chunk-TFWKF3DR.mjs.map +1 -0
  88. package/dist/chunk-VGWA26BN.js +72 -0
  89. package/dist/chunk-VGWA26BN.js.map +1 -0
  90. package/dist/chunk-VMCOX3Z2.js +67 -0
  91. package/dist/chunk-VMCOX3Z2.js.map +1 -0
  92. package/dist/chunk-Y3AHRRNM.mjs +99 -0
  93. package/dist/chunk-Y3AHRRNM.mjs.map +1 -0
  94. package/dist/{chunk-TJUNN2PT.mjs → chunk-YD3LVW7V.mjs} +27 -26
  95. package/dist/chunk-YD3LVW7V.mjs.map +1 -0
  96. package/dist/{chunk-AD2LA3XN.js → chunk-YIO7DFUA.js} +39 -36
  97. package/dist/chunk-YIO7DFUA.js.map +1 -0
  98. package/dist/chunk-YRTGORVB.js +232 -0
  99. package/dist/chunk-YRTGORVB.js.map +1 -0
  100. package/dist/chunk-Z7QK472J.mjs +220 -0
  101. package/dist/chunk-Z7QK472J.mjs.map +1 -0
  102. package/dist/hooks/useControllableState.js +3 -2
  103. package/dist/hooks/useControllableState.mjs +2 -1
  104. package/dist/hooks/useDisclosure.js +3 -2
  105. package/dist/hooks/useDisclosure.js.map +1 -1
  106. package/dist/hooks/useDisclosure.mjs +2 -1
  107. package/dist/hooks/useDisclosure.mjs.map +1 -1
  108. package/dist/hooks/useDynamicStepper/index.d.ts +2 -0
  109. package/dist/hooks/useDynamicStepper/index.d.ts.map +1 -0
  110. package/dist/hooks/useDynamicStepper/useDynamicStepper.d.ts +9 -0
  111. package/dist/hooks/useDynamicStepper/useDynamicStepper.d.ts.map +1 -0
  112. package/dist/hooks/useDynamicStepper.js +14 -0
  113. package/dist/hooks/useDynamicStepper.js.map +1 -0
  114. package/dist/hooks/useDynamicStepper.mjs +5 -0
  115. package/dist/hooks/useDynamicStepper.mjs.map +1 -0
  116. package/dist/ui/accordion/animated.js +7 -7
  117. package/dist/ui/accordion/animated.mjs +2 -2
  118. package/dist/ui/accordion/variants.d.ts.map +1 -1
  119. package/dist/ui/accordion.js +9 -9
  120. package/dist/ui/accordion.mjs +2 -2
  121. package/dist/ui/alert/animated.js +2 -2
  122. package/dist/ui/alert/animated.mjs +1 -1
  123. package/dist/ui/alert/variants.d.ts.map +1 -1
  124. package/dist/ui/alert.js +10 -10
  125. package/dist/ui/alert.mjs +2 -2
  126. package/dist/ui/avatar/animated.js +5 -5
  127. package/dist/ui/avatar/animated.mjs +2 -2
  128. package/dist/ui/avatar/variants.d.ts.map +1 -1
  129. package/dist/ui/avatar.js +9 -9
  130. package/dist/ui/avatar.mjs +2 -2
  131. package/dist/ui/badge/animated.js +2 -2
  132. package/dist/ui/badge/animated.mjs +1 -1
  133. package/dist/ui/badge/variants.d.ts +24 -24
  134. package/dist/ui/badge/variants.d.ts.map +1 -1
  135. package/dist/ui/badge.js +4 -4
  136. package/dist/ui/badge.mjs +2 -2
  137. package/dist/ui/breadcrumb/variants.d.ts.map +1 -1
  138. package/dist/ui/breadcrumb.js +30 -25
  139. package/dist/ui/breadcrumb.js.map +1 -1
  140. package/dist/ui/breadcrumb.mjs +30 -25
  141. package/dist/ui/breadcrumb.mjs.map +1 -1
  142. package/dist/ui/buttons/animated.js +3 -3
  143. package/dist/ui/buttons/animated.mjs +1 -1
  144. package/dist/ui/buttons/variants.d.ts.map +1 -1
  145. package/dist/ui/buttons.js +9 -57
  146. package/dist/ui/buttons.js.map +1 -1
  147. package/dist/ui/buttons.mjs +3 -59
  148. package/dist/ui/buttons.mjs.map +1 -1
  149. package/dist/ui/card/animated.js +7 -7
  150. package/dist/ui/card/animated.mjs +2 -2
  151. package/dist/ui/card/variants.d.ts.map +1 -1
  152. package/dist/ui/card.js +12 -12
  153. package/dist/ui/card.mjs +2 -2
  154. package/dist/ui/divider/animated.js +2 -2
  155. package/dist/ui/divider/animated.mjs +1 -1
  156. package/dist/ui/divider.js +6 -6
  157. package/dist/ui/divider.mjs +2 -2
  158. package/dist/ui/drawer/animated.js +11 -11
  159. package/dist/ui/drawer/animated.mjs +2 -2
  160. package/dist/ui/drawer/variants.d.ts.map +1 -1
  161. package/dist/ui/drawer.js +11 -11
  162. package/dist/ui/drawer.mjs +1 -1
  163. package/dist/ui/dropdown/variants.d.ts.map +1 -1
  164. package/dist/ui/dropdown.js +52 -52
  165. package/dist/ui/dropdown.js.map +1 -1
  166. package/dist/ui/dropdown.mjs +52 -52
  167. package/dist/ui/dropdown.mjs.map +1 -1
  168. package/dist/ui/dynamic-stepper/dynamic-stepper.d.ts +6 -0
  169. package/dist/ui/dynamic-stepper/dynamic-stepper.d.ts.map +1 -0
  170. package/dist/ui/dynamic-stepper/index.d.ts +5 -0
  171. package/dist/ui/dynamic-stepper/index.d.ts.map +1 -0
  172. package/dist/ui/dynamic-stepper/types.d.ts +61 -0
  173. package/dist/ui/dynamic-stepper/types.d.ts.map +1 -0
  174. package/dist/ui/dynamic-stepper/variants.d.ts +21 -0
  175. package/dist/ui/dynamic-stepper/variants.d.ts.map +1 -0
  176. package/dist/ui/dynamic-stepper.js +315 -0
  177. package/dist/ui/dynamic-stepper.js.map +1 -0
  178. package/dist/ui/dynamic-stepper.mjs +308 -0
  179. package/dist/ui/dynamic-stepper.mjs.map +1 -0
  180. package/dist/ui/empty-state/animated.js +2 -2
  181. package/dist/ui/empty-state/animated.mjs +1 -1
  182. package/dist/ui/empty-state/variants.d.ts.map +1 -1
  183. package/dist/ui/empty-state.js +10 -10
  184. package/dist/ui/empty-state.mjs +2 -2
  185. package/dist/ui/file-upload/file-upload.d.ts.map +1 -1
  186. package/dist/ui/file-upload/variants.d.ts.map +1 -1
  187. package/dist/ui/file-upload.js +18 -18
  188. package/dist/ui/file-upload.js.map +1 -1
  189. package/dist/ui/file-upload.mjs +18 -18
  190. package/dist/ui/file-upload.mjs.map +1 -1
  191. package/dist/ui/inputs/animated.js +3 -3
  192. package/dist/ui/inputs/animated.mjs +1 -1
  193. package/dist/ui/inputs/types.d.ts +1 -1
  194. package/dist/ui/inputs/types.d.ts.map +1 -1
  195. package/dist/ui/inputs/variants.d.ts +1 -1
  196. package/dist/ui/inputs/variants.d.ts.map +1 -1
  197. package/dist/ui/inputs.js +4 -4
  198. package/dist/ui/inputs.mjs +2 -2
  199. package/dist/ui/modal/animated.js +4 -4
  200. package/dist/ui/modal/animated.mjs +1 -1
  201. package/dist/ui/modal/variants.d.ts.map +1 -1
  202. package/dist/ui/modal.js +12 -12
  203. package/dist/ui/modal.mjs +2 -2
  204. package/dist/ui/pagination/pagination.d.ts +5 -16
  205. package/dist/ui/pagination/pagination.d.ts.map +1 -1
  206. package/dist/ui/pagination/types.d.ts +2 -2
  207. package/dist/ui/pagination/types.d.ts.map +1 -1
  208. package/dist/ui/pagination/variants.d.ts.map +1 -1
  209. package/dist/ui/pagination.js +200 -209
  210. package/dist/ui/pagination.js.map +1 -1
  211. package/dist/ui/pagination.mjs +201 -210
  212. package/dist/ui/pagination.mjs.map +1 -1
  213. package/dist/ui/progress/animated.js +8 -8
  214. package/dist/ui/progress/animated.mjs +2 -2
  215. package/dist/ui/progress/variants.d.ts.map +1 -1
  216. package/dist/ui/progress.js +9 -9
  217. package/dist/ui/progress.mjs +2 -2
  218. package/dist/ui/search/search-bar.d.ts.map +1 -1
  219. package/dist/ui/search/search-suggestion-list.d.ts.map +1 -1
  220. package/dist/ui/search.js +10 -9
  221. package/dist/ui/search.js.map +1 -1
  222. package/dist/ui/search.mjs +9 -8
  223. package/dist/ui/search.mjs.map +1 -1
  224. package/dist/ui/select/variants.d.ts.map +1 -1
  225. package/dist/ui/select.js +66 -66
  226. package/dist/ui/select.js.map +1 -1
  227. package/dist/ui/select.mjs +66 -66
  228. package/dist/ui/select.mjs.map +1 -1
  229. package/dist/ui/skeleton/animated.js +8 -8
  230. package/dist/ui/skeleton/animated.mjs +1 -1
  231. package/dist/ui/skeleton/variants.d.ts.map +1 -1
  232. package/dist/ui/skeleton.js +9 -9
  233. package/dist/ui/skeleton.mjs +1 -1
  234. package/dist/ui/slider.js +25 -25
  235. package/dist/ui/slider.js.map +1 -1
  236. package/dist/ui/slider.mjs +25 -25
  237. package/dist/ui/slider.mjs.map +1 -1
  238. package/dist/ui/spinner/animated.js +22 -22
  239. package/dist/ui/spinner/animated.js.map +1 -1
  240. package/dist/ui/spinner/animated.mjs +22 -22
  241. package/dist/ui/spinner/animated.mjs.map +1 -1
  242. package/dist/ui/stepper/stepper.d.ts.map +1 -1
  243. package/dist/ui/stepper/variants.d.ts.map +1 -1
  244. package/dist/ui/stepper.js +29 -26
  245. package/dist/ui/stepper.js.map +1 -1
  246. package/dist/ui/stepper.mjs +29 -26
  247. package/dist/ui/stepper.mjs.map +1 -1
  248. package/dist/ui/table/animated.js +8 -8
  249. package/dist/ui/table/animated.mjs +2 -2
  250. package/dist/ui/table/variants.d.ts.map +1 -1
  251. package/dist/ui/table.js +14 -14
  252. package/dist/ui/table.mjs +1 -1
  253. package/dist/ui/tabs/animated.js +2 -2
  254. package/dist/ui/tabs/animated.mjs +1 -1
  255. package/dist/ui/tabs/variants.d.ts.map +1 -1
  256. package/dist/ui/tabs.js +9 -9
  257. package/dist/ui/tabs.mjs +1 -1
  258. package/dist/ui/toast/animated.js +7 -7
  259. package/dist/ui/toast/animated.mjs +1 -1
  260. package/dist/ui/toast/toast-base.d.ts.map +1 -1
  261. package/dist/ui/toast/variants.d.ts.map +1 -1
  262. package/dist/ui/toast.js +12 -12
  263. package/dist/ui/toast.mjs +1 -1
  264. package/dist/ui/toggle/animated/toggle-animated.d.ts.map +1 -1
  265. package/dist/ui/toggle/animated.js +5 -4
  266. package/dist/ui/toggle/animated.js.map +1 -1
  267. package/dist/ui/toggle/animated.mjs +4 -3
  268. package/dist/ui/toggle/animated.mjs.map +1 -1
  269. package/dist/ui/toggle/toggle-base.d.ts.map +1 -1
  270. package/dist/ui/toggle/variants.d.ts +1 -0
  271. package/dist/ui/toggle/variants.d.ts.map +1 -1
  272. package/dist/ui/toggle.js +8 -7
  273. package/dist/ui/toggle.js.map +1 -1
  274. package/dist/ui/toggle.mjs +6 -5
  275. package/dist/ui/toggle.mjs.map +1 -1
  276. package/dist/ui/tooltip/animated.js +3 -3
  277. package/dist/ui/tooltip/animated.mjs +1 -1
  278. package/dist/ui/tooltip/variants.d.ts.map +1 -1
  279. package/dist/ui/tooltip.js +7 -7
  280. package/dist/ui/tooltip.mjs +1 -1
  281. package/dist/ui/typography/blockquote-base.d.ts.map +1 -1
  282. package/dist/ui/typography/code-block-base.d.ts.map +1 -1
  283. package/dist/ui/typography/heading-base.d.ts.map +1 -1
  284. package/dist/ui/typography/inline-code-base.d.ts.map +1 -1
  285. package/dist/ui/typography/variants.d.ts.map +1 -1
  286. package/dist/ui/typography.js +19 -19
  287. package/dist/ui/typography.js.map +1 -1
  288. package/dist/ui/typography.mjs +19 -19
  289. package/dist/ui/typography.mjs.map +1 -1
  290. package/package.json +4 -3
  291. package/src/charts/area/Area.tsx +1 -1
  292. package/src/charts/bubble/Bubble.tsx +10 -2
  293. package/src/charts/pie/Pie.tsx +22 -3
  294. package/src/charts/shared/types.ts +1 -1
  295. package/src/hooks/useDynamicStepper/index.ts +1 -0
  296. package/src/hooks/useDynamicStepper/useDynamicStepper.test.ts +107 -0
  297. package/src/hooks/useDynamicStepper/useDynamicStepper.ts +85 -0
  298. package/src/ui/accordion/variants.ts +55 -43
  299. package/src/ui/alert/variants.ts +45 -32
  300. package/src/ui/avatar/variants.ts +34 -26
  301. package/src/ui/badge/variants.ts +42 -29
  302. package/src/ui/breadcrumb/variants.ts +30 -25
  303. package/src/ui/buttons/variants.ts +40 -30
  304. package/src/ui/card/variants.ts +49 -39
  305. package/src/ui/divider/variants.ts +26 -26
  306. package/src/ui/drawer/drawer-base.tsx +1 -1
  307. package/src/ui/drawer/variants.ts +64 -48
  308. package/src/ui/dropdown/dropdown.tsx +1 -1
  309. package/src/ui/dropdown/variants.ts +63 -52
  310. package/src/ui/dynamic-stepper/dynamic-stepper.test.tsx +113 -0
  311. package/src/ui/dynamic-stepper/dynamic-stepper.tsx +173 -0
  312. package/src/ui/dynamic-stepper/index.ts +22 -0
  313. package/src/ui/dynamic-stepper/types.ts +85 -0
  314. package/src/ui/dynamic-stepper/variants.ts +247 -0
  315. package/src/ui/empty-state/variants.ts +14 -11
  316. package/src/ui/file-upload/file-upload.tsx +5 -3
  317. package/src/ui/file-upload/variants.ts +16 -15
  318. package/src/ui/inputs/types.ts +1 -1
  319. package/src/ui/inputs/variants.ts +106 -47
  320. package/src/ui/modal/modal-base.tsx +1 -1
  321. package/src/ui/modal/variants.ts +64 -47
  322. package/src/ui/pagination/pagination.tsx +186 -197
  323. package/src/ui/pagination/types.ts +2 -5
  324. package/src/ui/pagination/variants.ts +31 -28
  325. package/src/ui/progress/variants.ts +79 -65
  326. package/src/ui/search/search-bar.tsx +2 -1
  327. package/src/ui/search/search-suggestion-list.tsx +7 -5
  328. package/src/ui/select/variants.ts +72 -66
  329. package/src/ui/skeleton/variants.ts +22 -13
  330. package/src/ui/slider/variants.ts +25 -25
  331. package/src/ui/spinner/animated/variants.ts +22 -22
  332. package/src/ui/stepper/stepper.tsx +5 -2
  333. package/src/ui/stepper/variants.ts +25 -24
  334. package/src/ui/table/table-base.tsx +1 -1
  335. package/src/ui/table/variants.ts +53 -45
  336. package/src/ui/tabs/variants.ts +38 -23
  337. package/src/ui/toast/toast-base.tsx +1 -4
  338. package/src/ui/toast/variants.ts +33 -26
  339. package/src/ui/toggle/animated/toggle-animated.tsx +3 -2
  340. package/src/ui/toggle/toggle-base.tsx +4 -3
  341. package/src/ui/toggle/variants.ts +60 -28
  342. package/src/ui/tooltip/variants.ts +21 -20
  343. package/src/ui/typography/blockquote-base.tsx +0 -2
  344. package/src/ui/typography/code-block-base.tsx +1 -3
  345. package/src/ui/typography/heading-base.tsx +0 -2
  346. package/src/ui/typography/inline-code-base.tsx +0 -2
  347. package/src/ui/typography/variants.ts +21 -18
  348. package/dist/chunk-2BAMNRAL.mjs +0 -323
  349. package/dist/chunk-2BAMNRAL.mjs.map +0 -1
  350. package/dist/chunk-5TV7EL3H.mjs +0 -70
  351. package/dist/chunk-5TV7EL3H.mjs.map +0 -1
  352. package/dist/chunk-7TLKLMBM.js.map +0 -1
  353. package/dist/chunk-A6KMZ5ZS.mjs.map +0 -1
  354. package/dist/chunk-AD2LA3XN.js.map +0 -1
  355. package/dist/chunk-AOEI4V3W.mjs +0 -286
  356. package/dist/chunk-AOEI4V3W.mjs.map +0 -1
  357. package/dist/chunk-AUGLZ3AN.js.map +0 -1
  358. package/dist/chunk-BCZIYH53.js.map +0 -1
  359. package/dist/chunk-C5L465FW.mjs.map +0 -1
  360. package/dist/chunk-E4FZY7O2.js.map +0 -1
  361. package/dist/chunk-FQBMIZH2.mjs +0 -217
  362. package/dist/chunk-FQBMIZH2.mjs.map +0 -1
  363. package/dist/chunk-G3LEYBRV.mjs.map +0 -1
  364. package/dist/chunk-I6GR234Z.mjs +0 -126
  365. package/dist/chunk-I6GR234Z.mjs.map +0 -1
  366. package/dist/chunk-INMNX3HQ.mjs.map +0 -1
  367. package/dist/chunk-JBAUEGYD.mjs.map +0 -1
  368. package/dist/chunk-JQ5TIJ4F.mjs +0 -68
  369. package/dist/chunk-JQ5TIJ4F.mjs.map +0 -1
  370. package/dist/chunk-JUDMPOCI.js.map +0 -1
  371. package/dist/chunk-LN77JJTY.mjs.map +0 -1
  372. package/dist/chunk-MCOQHXRW.js +0 -130
  373. package/dist/chunk-MCOQHXRW.js.map +0 -1
  374. package/dist/chunk-MTLLJFUI.mjs.map +0 -1
  375. package/dist/chunk-N2OAI2HN.js.map +0 -1
  376. package/dist/chunk-OB4KJZK2.js +0 -72
  377. package/dist/chunk-OB4KJZK2.js.map +0 -1
  378. package/dist/chunk-OLEMP2HL.js.map +0 -1
  379. package/dist/chunk-PWL5WD34.js.map +0 -1
  380. package/dist/chunk-Q5B44QW7.js.map +0 -1
  381. package/dist/chunk-QZKMFSH5.js +0 -288
  382. package/dist/chunk-QZKMFSH5.js.map +0 -1
  383. package/dist/chunk-QZTEFGZF.mjs.map +0 -1
  384. package/dist/chunk-S7WKFNPT.js +0 -229
  385. package/dist/chunk-S7WKFNPT.js.map +0 -1
  386. package/dist/chunk-TINHLHCN.mjs.map +0 -1
  387. package/dist/chunk-TJUNN2PT.mjs.map +0 -1
  388. package/dist/chunk-UWA23DUC.js.map +0 -1
  389. package/dist/chunk-X22LLJL6.js +0 -71
  390. package/dist/chunk-X22LLJL6.js.map +0 -1
  391. package/dist/chunk-Y745GQR2.js.map +0 -1
  392. package/dist/chunk-YTRGRHEB.js.map +0 -1
  393. package/dist/chunk-ZBBFOMSJ.mjs.map +0 -1
  394. package/dist/chunk-ZYZJ74XB.mjs.map +0 -1
@@ -5,41 +5,49 @@ export const triggerVariants = cva(
5
5
  {
6
6
  variants: {
7
7
  variant: {
8
- default: "bg-gray-900 text-white",
9
- outline: "border border-gray-300",
10
- ghost: "bg-transparent",
8
+ default: "bg-gray-200 dark:bg-gray-900 text-slate-900 dark:text-white",
9
+ outline:
10
+ "border border-gray-700 dark:border-gray-300 text-gray-900 dark:text-gray-100",
11
+ ghost: "bg-transparent text-gray-900 dark:text-gray-100",
11
12
  white: "bg-white text-gray-900",
12
13
  black: "bg-black text-white",
13
- sky: "border border-sky-600 text-sky-600",
14
- rose: "border border-rose-600 text-rose-600",
15
- purple: "border border-purple-600 text-purple-600",
16
- pink: "border border-pink-600 text-pink-600",
17
- orange: "border border-orange-600 text-orange-600",
18
- yellow: "border border-yellow-600 text-yellow-600",
19
- teal: "border border-teal-600 text-teal-600",
20
- indigo: "border border-indigo-600 text-indigo-600",
21
- emerald: "border border-emerald-600 text-emerald-600",
22
- gray: "border border-gray-600 text-gray-600",
23
- amber: "border border-amber-600 text-amber-600",
24
- violet: "border border-violet-600 text-violet-600",
14
+ sky: "border border-sky-800 dark:border-sky-600 text-sky-800 dark:text-sky-600",
15
+ rose: "border border-rose-800 dark:border-rose-600 text-rose-800 dark:text-rose-600",
16
+ purple:
17
+ "border border-purple-800 dark:border-purple-600 text-purple-800 dark:text-purple-600",
18
+ pink: "border border-pink-800 dark:border-pink-600 text-pink-800 dark:text-pink-600",
19
+ orange:
20
+ "border border-orange-800 dark:border-orange-600 text-orange-800 dark:text-orange-600",
21
+ yellow:
22
+ "border border-yellow-800 dark:border-yellow-600 text-yellow-800 dark:text-yellow-600",
23
+ teal: "border border-teal-800 dark:border-teal-600 text-teal-800 dark:text-teal-600",
24
+ indigo:
25
+ "border border-indigo-800 dark:border-indigo-600 text-indigo-800 dark:text-indigo-600",
26
+ emerald:
27
+ "border border-emerald-800 dark:border-emerald-600 text-emerald-800 dark:text-emerald-600",
28
+ gray: "border border-gray-800 dark:border-gray-600 text-gray-800 dark:text-gray-600",
29
+ amber:
30
+ "border border-amber-800 dark:border-amber-600 text-amber-800 dark:text-amber-600",
31
+ violet:
32
+ "border border-violet-800 dark:border-violet-600 text-violet-800 dark:text-violet-600",
25
33
  "gradient-blue":
26
- "bg-linear-to-r from-blue-600 to-purple-600 text-blue-200",
34
+ "bg-linear-to-r from-blue-800 dark:from-blue-600 to-purple-800 dark:to-purple-600 text-blue-200",
27
35
  "gradient-green":
28
- "bg-linear-to-r from-green-600 to-lime-600 text-green-200",
36
+ "bg-linear-to-r from-green-800 dark:from-green-600 to-lime-800 dark:to-lime-600 text-green-200",
29
37
  "gradient-red":
30
- "bg-linear-to-r from-red-600 to-pink-600 text-red-200",
38
+ "bg-linear-to-r from-red-800 dark:from-red-600 to-pink-800 dark:to-pink-600 text-red-200",
31
39
  "gradient-yellow":
32
- "bg-linear-to-r from-yellow-600 to-orange-600 text-yellow-200",
40
+ "bg-linear-to-r from-yellow-800 dark:from-yellow-600 to-orange-800 dark:to-orange-600 text-yellow-200",
33
41
  "gradient-purple":
34
- "bg-linear-to-r from-purple-600 to-pink-600 text-purple-200",
42
+ "bg-linear-to-r from-purple-800 dark:from-purple-600 to-pink-800 dark:to-pink-600 text-purple-200",
35
43
  "gradient-teal":
36
- "bg-linear-to-r from-teal-600 to-cyan-600 text-teal-200",
44
+ "bg-linear-to-r from-teal-800 dark:from-teal-600 to-cyan-800 dark:to-cyan-600 text-teal-200",
37
45
  "gradient-indigo":
38
- "bg-linear-to-r from-indigo-600 to-purple-600 text-indigo-200",
46
+ "bg-linear-to-r from-indigo-800 dark:from-indigo-600 to-purple-800 dark:to-purple-600 text-indigo-200",
39
47
  "gradient-pink":
40
- "bg-linear-to-r from-pink-600 to-rose-600 text-pink-200",
48
+ "bg-linear-to-r from-pink-800 dark:from-pink-600 to-rose-800 dark:to-rose-600 text-pink-200",
41
49
  "gradient-orange":
42
- "bg-linear-to-r from-orange-600 to-red-600 text-orange-200",
50
+ "bg-linear-to-r from-orange-800 dark:from-orange-600 to-red-800 dark:to-red-600 text-orange-200",
43
51
  },
44
52
  size: {
45
53
  sm: "px-2 py-1 text-sm",
@@ -55,7 +63,7 @@ export const triggerVariants = cva(
55
63
  );
56
64
 
57
65
  export const contentVariants = cva(
58
- "absolute min-w-[200px] rounded-md p-2 shadow-md z-50 border",
66
+ "absolute min-w-[200px] rounded-md p-2 shadow-md z-50 border border-slate-900/10 dark:border-white/10 bg-slate-100 dark:bg-slate-900 text-slate-900 dark:text-slate-100 shadow-lg rounded-lg",
59
67
  {
60
68
  variants: {
61
69
  placement: {
@@ -81,54 +89,57 @@ export const contentVariants = cva(
81
89
  );
82
90
 
83
91
  export const itemVariants = cva(
84
- "flex items-center justify-between px-3 py-2 text-sm cursor-pointer rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-500/60",
92
+ "flex items-center justify-between px-3 py-2 text-sm cursor-pointer rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-500/60 font-semibold",
85
93
  {
86
94
  variants: {
87
95
  variant: {
88
- default: "hover:bg-gray-100 hover:text-gray-900 text-gray-100",
96
+ default:
97
+ "hover:bg-gray-100 hover:text-gray-500 dark:hover:text-gray-900 text-gray-900 dark:text-gray-100",
89
98
  outline:
90
- "hover:bg-gray-100 hover:text-gray-900 border border-white text-gray-100",
99
+ "hover:bg-gray-100 hover:text-gray-500 dark:hover:text-gray-900 border border-black dark:border-white text-gray-900 dark:text-gray-100",
91
100
  ghost:
92
- "hover:bg-gray-100 hover:text-gray-900 bg-transparent text-gray-100",
93
- white: "hover:bg-gray-100 hover:text-gray-900 bg-white text-gray-900",
94
- black: "hover:bg-gray-100 hover:text-gray-900 bg-black text-white",
95
- sky: "hover:bg-sky-100 hover:text-sky-600 bg-sky-200 text-sky-800",
96
- rose: "hover:bg-rose-100 hover:text-rose-600 bg-rose-200 text-rose-800",
101
+ "hover:bg-gray-100 hover:text-gray-500 dark:hover:text-gray-900 bg-transparent text-gray-900 dark:text-gray-100",
102
+ white:
103
+ "hover:bg-gray-100 hover:text-gray-500 dark:hover:text-gray-900 bg-white dark:bg-black text-gray-900 dark:text-white",
104
+ black:
105
+ "hover:bg-gray-100 hover:text-gray-500 dark:hover:text-gray-900 bg-black dark:bg-white text-white dark:text-gray-900",
106
+ sky: "hover:bg-sky-100 hover:text-sky-800 dark:hover:text-sky-600 bg-sky-200 text-sky-900 dark:text-sky-800",
107
+ rose: "hover:bg-rose-100 hover:text-rose-800 dark:hover:text-rose-600 bg-rose-200 text-rose-900 dark:text-rose-800",
97
108
  purple:
98
- "hover:bg-purple-100 hover:text-purple-600 bg-purple-200 text-purple-800",
99
- pink: "hover:bg-pink-100 hover:text-pink-600 bg-pink-200 text-pink-800",
109
+ "hover:bg-purple-100 hover:text-purple-800 dark:hover:text-purple-600 bg-purple-200 text-purple-900 dark:text-purple-800",
110
+ pink: "hover:bg-pink-100 hover:text-pink-800 dark:hover:text-pink-600 bg-pink-200 text-pink-900 dark:text-pink-800",
100
111
  orange:
101
- "hover:bg-orange-100 hover:text-orange-600 bg-orange-200 text-orange-800",
112
+ "hover:bg-orange-100 hover:text-orange-800 dark:hover:text-orange-600 bg-orange-200 text-orange-900 dark:text-orange-800",
102
113
  yellow:
103
- "hover:bg-yellow-100 hover:text-yellow-600 bg-yellow-200 text-yellow-800",
104
- teal: "hover:bg-teal-100 hover:text-teal-600 bg-teal-200 text-teal-800",
114
+ "hover:bg-yellow-100 hover:text-yellow-800 dark:hover:text-yellow-600 bg-yellow-200 text-yellow-900 dark:text-yellow-800",
115
+ teal: "hover:bg-teal-100 hover:text-teal-800 dark:hover:text-teal-600 bg-teal-200 text-teal-900 dark:text-teal-800",
105
116
  indigo:
106
- "hover:bg-indigo-100 hover:text-indigo-600 bg-indigo-200 text-indigo-800",
117
+ "hover:bg-indigo-100 hover:text-indigo-800 dark:hover:text-indigo-600 bg-indigo-200 text-indigo-900 dark:text-indigo-800",
107
118
  emerald:
108
- "hover:bg-emerald-100 hover:text-emerald-600 bg-emerald-200 text-emerald-800",
109
- gray: "hover:bg-gray-100 hover:text-gray-900 bg-gray-200 text-gray-800",
119
+ "hover:bg-emerald-100 hover:text-emerald-800 dark:hover:text-emerald-600 bg-emerald-200 text-emerald-900 dark:text-emerald-800",
120
+ gray: "hover:bg-gray-100 hover:text-gray-500 dark:hover:text-gray-900 bg-gray-200 text-gray-500 dark:text-gray-800",
110
121
  amber:
111
- "hover:bg-amber-100 hover:text-amber-600 bg-amber-200 text-amber-800",
122
+ "hover:bg-amber-100 hover:text-amber-800 dark:hover:text-amber-600 bg-amber-200 text-amber-900 dark:text-amber-800",
112
123
  violet:
113
- "hover:bg-violet-100 hover:text-violet-600 bg-violet-200 text-violet-800",
124
+ "hover:bg-violet-100 hover:text-violet-800 dark:hover:text-violet-600 bg-violet-200 text-violet-900 dark:text-violet-800",
114
125
  "gradient-blue":
115
- "hover:bg-linear-to-r from-blue-600 to-purple-600 hover:text-blue-900 bg-linear-to-r from-blue-200 to-purple-200 text-blue-800",
126
+ "hover:bg-linear-to-r from-blue-800 dark:from-blue-600 to-purple-800 dark:to-purple-600 hover:text-blue-500 dark:hover:text-blue-900 bg-linear-to-r from-blue-200 to-purple-200 text-blue-900 dark:text-blue-200",
116
127
  "gradient-green":
117
- "hover:bg-linear-to-r from-green-600 to-lime-600 hover:text-green-900 bg-linear-to-r from-green-200 to-lime-200 text-green-800",
128
+ "hover:bg-linear-to-r from-green-800 dark:from-green-600 to-lime-800 dark:to-lime-600 hover:text-green-500 dark:hover:text-green-900 bg-linear-to-r from-green-200 to-lime-200 text-green-900 dark:text-green-200",
118
129
  "gradient-red":
119
- "hover:bg-linear-to-r from-red-600 to-pink-600 hover:text-red-900 bg-linear-to-r from-red-200 to-pink-200 text-red-800",
130
+ "hover:bg-linear-to-r from-red-800 dark:from-red-600 to-pink-800 dark:to-pink-600 hover:text-red-500 dark:hover:text-red-900 bg-linear-to-r from-red-200 to-pink-200 text-red-900 dark:text-red-200",
120
131
  "gradient-yellow":
121
- "hover:bg-linear-to-r from-yellow-600 to-orange-600 hover:text-yellow-900 bg-linear-to-r from-yellow-200 to-orange-200 text-yellow-800",
132
+ "hover:bg-linear-to-r from-yellow-800 dark:from-yellow-600 to-orange-800 dark:to-orange-600 hover:text-yellow-500 dark:hover:text-yellow-900 bg-linear-to-r from-yellow-200 to-orange-200 text-yellow-900 dark:text-yellow-200",
122
133
  "gradient-purple":
123
- "hover:bg-linear-to-r from-purple-600 to-pink-600 hover:text-purple-900 bg-linear-to-r from-purple-200 to-pink-200 text-purple-800",
134
+ "hover:bg-linear-to-r from-purple-800 dark:from-purple-600 to-pink-800 dark:to-pink-600 hover:text-purple-500 dark:hover:text-purple-900 bg-linear-to-r from-purple-200 to-pink-200 text-purple-900 dark:text-purple-200",
124
135
  "gradient-teal":
125
- "hover:bg-linear-to-r from-teal-600 to-cyan-600 hover:text-teal-900 bg-linear-to-r from-teal-200 to-cyan-200 text-teal-800",
136
+ "hover:bg-linear-to-r from-teal-800 dark:from-teal-600 to-cyan-800 dark:to-cyan-600 hover:text-teal-500 dark:hover:text-teal-900 bg-linear-to-r from-teal-200 to-cyan-200 text-teal-900 dark:text-teal-200",
126
137
  "gradient-indigo":
127
- "hover:bg-linear-to-r from-indigo-600 to-purple-600 hover:text-indigo-900 bg-linear-to-r from-indigo-200 to-purple-200 text-indigo-800",
138
+ "hover:bg-linear-to-r from-indigo-800 dark:from-indigo-600 to-purple-800 dark:to-purple-600 hover:text-indigo-500 dark:hover:text-indigo-900 bg-linear-to-r from-indigo-200 to-purple-200 text-indigo-900 dark:text-indigo-200",
128
139
  "gradient-pink":
129
- "hover:bg-linear-to-r from-pink-600 to-rose-600 hover:text-pink-900 bg-linear-to-r from-pink-200 to-rose-200 text-pink-800",
140
+ "hover:bg-linear-to-r from-pink-800 dark:from-pink-600 to-rose-800 dark:to-rose-600 hover:text-pink-500 dark:hover:text-pink-900 bg-linear-to-r from-pink-200 to-rose-200 text-pink-900 dark:text-pink-200",
130
141
  "gradient-orange":
131
- "hover:bg-linear-to-r from-orange-600 to-red-600 hover:text-orange-900 bg-linear-to-r from-orange-200 to-red-200 text-orange-800",
142
+ "hover:bg-linear-to-r from-orange-800 dark:from-orange-600 to-red-800 dark:to-red-600 hover:text-orange-500 dark:hover:text-orange-900 bg-linear-to-r from-orange-200 to-red-200 text-orange-900 dark:text-orange-200",
132
143
  },
133
144
  },
134
145
  defaultVariants: {
@@ -0,0 +1,113 @@
1
+ import { createRef } from "react";
2
+ import { render, screen } from "@testing-library/react";
3
+ import userEvent from "@testing-library/user-event";
4
+ import { describe, expect, it, vi } from "vitest";
5
+
6
+ import { DynamicStepper } from "./dynamic-stepper";
7
+
8
+ const sampleSteps = [
9
+ { id: "a", title: "One", description: "First" },
10
+ { id: "b", title: "Two", description: "Second" },
11
+ { id: "c", title: "Three", description: "Third" },
12
+ ];
13
+
14
+ describe("DynamicStepper", () => {
15
+ it("should expose displayName", () => {
16
+ expect(DynamicStepper.displayName).toBe("DynamicStepper");
17
+ });
18
+
19
+ it("should render null when steps is empty", () => {
20
+ const { container } = render(<DynamicStepper steps={[]} />);
21
+ expect(container.firstChild).toBeNull();
22
+ });
23
+
24
+ it("should stamp mapper ol and button ids with suffixes", () => {
25
+ render(<DynamicStepper steps={sampleSteps} />);
26
+ const mapper = document.querySelector(
27
+ '[data-slot="dynamic-stepper-mapper"]',
28
+ );
29
+ expect(mapper?.tagName).toBe("OL");
30
+ expect(mapper?.id.endsWith("-mapper")).toBe(true);
31
+
32
+ const prev = document.querySelector(
33
+ '[data-slot="dynamic-stepper-previous"]',
34
+ );
35
+ const next = document.querySelector('[data-slot="dynamic-stepper-next"]');
36
+ expect(prev?.id.endsWith("-previous")).toBe(true);
37
+ expect(next?.id.endsWith("-next")).toBe(true);
38
+ });
39
+
40
+ it("should navigate uncontrolled with next and previous", async () => {
41
+ const user = userEvent.setup();
42
+ render(<DynamicStepper steps={sampleSteps} defaultActiveStep={0} />);
43
+
44
+ expect(screen.getByText("One")).toBeInTheDocument();
45
+ const indicators = document.querySelectorAll(
46
+ '[data-slot="dynamic-stepper-indicator"]',
47
+ );
48
+ expect(indicators[0]?.className).toMatch(/violet/);
49
+
50
+ await user.click(screen.getByRole("button", { name: "Next" }));
51
+ expect(indicators[1]?.className).toMatch(/violet/);
52
+
53
+ await user.click(screen.getByRole("button", { name: "Previous" }));
54
+ expect(indicators[0]?.className).toMatch(/violet/);
55
+ });
56
+
57
+ it("should disable previous on first step and next on last step", () => {
58
+ render(<DynamicStepper steps={sampleSteps} defaultActiveStep={0} />);
59
+ expect(screen.getByRole("button", { name: "Previous" })).toBeDisabled();
60
+ expect(screen.getByRole("button", { name: "Next" })).not.toBeDisabled();
61
+ });
62
+
63
+ it("should respect controlled activeStep", async () => {
64
+ const user = userEvent.setup();
65
+ const onActiveStepChange = vi.fn();
66
+ const { rerender } = render(
67
+ <DynamicStepper
68
+ steps={sampleSteps}
69
+ activeStep={0}
70
+ onActiveStepChange={onActiveStepChange}
71
+ />,
72
+ );
73
+
74
+ await user.click(screen.getByRole("button", { name: "Next" }));
75
+ expect(onActiveStepChange).toHaveBeenCalledWith(1);
76
+
77
+ rerender(
78
+ <DynamicStepper
79
+ steps={sampleSteps}
80
+ activeStep={1}
81
+ onActiveStepChange={onActiveStepChange}
82
+ />,
83
+ );
84
+ const indicators = document.querySelectorAll(
85
+ '[data-slot="dynamic-stepper-indicator"]',
86
+ );
87
+ expect(indicators[1]?.className).toMatch(/violet/);
88
+ });
89
+
90
+ it("should forward ref to root", () => {
91
+ const ref = createRef<HTMLDivElement>();
92
+ render(<DynamicStepper ref={ref} steps={sampleSteps} />);
93
+ expect(ref.current?.getAttribute("data-slot")).toBe("dynamic-stepper");
94
+ });
95
+
96
+ it("should apply indicator tone props to semantic states", () => {
97
+ const { container } = render(
98
+ <DynamicStepper
99
+ steps={sampleSteps}
100
+ defaultActiveStep={1}
101
+ indicatorCompleteAppearance="sky"
102
+ indicatorCurrentAppearance="rose"
103
+ indicatorUpcomingAppearance="amber"
104
+ />,
105
+ );
106
+ const indicators = container.querySelectorAll(
107
+ '[data-slot="dynamic-stepper-indicator"]',
108
+ );
109
+ expect(indicators[0]?.className).toMatch(/sky-/);
110
+ expect(indicators[1]?.className).toMatch(/rose-/);
111
+ expect(indicators[2]?.className).toMatch(/amber-/);
112
+ });
113
+ });
@@ -0,0 +1,173 @@
1
+ "use client";
2
+
3
+ import { useId } from "react";
4
+
5
+ import { useDynamicStepper } from "../../hooks/useDynamicStepper/useDynamicStepper";
6
+ import { cn } from "../../lib/utils";
7
+ import { Button } from "../buttons/button";
8
+
9
+ import type { DynamicStepperProps } from "./types";
10
+ import {
11
+ dynamicStepperIndicatorToneClass,
12
+ dynamicStepperIndicatorVariants,
13
+ dynamicStepperItemVariants,
14
+ dynamicStepperMapperVariants,
15
+ dynamicStepperRootVariants,
16
+ } from "./variants";
17
+
18
+ export const DynamicStepper = ({
19
+ steps,
20
+ orientation = "horizontal",
21
+ buttonAppearance = "outline",
22
+ buttonSize = "md",
23
+ indicatorSize = "md",
24
+ indicatorCompleteAppearance = "emerald",
25
+ indicatorCurrentAppearance = "violet",
26
+ indicatorUpcomingAppearance = "outline",
27
+ activeStep: activeStepProp,
28
+ defaultActiveStep,
29
+ onActiveStepChange,
30
+ onPrevious,
31
+ onNext,
32
+ prevLabel = "Previous",
33
+ nextLabel = "Next",
34
+ className,
35
+ ref,
36
+ ...rest
37
+ }: DynamicStepperProps) => {
38
+ const baseId = useId();
39
+ const previousId = `${baseId}-previous`;
40
+ const nextId = `${baseId}-next`;
41
+ const mapperId = `${baseId}-mapper`;
42
+
43
+ const { activeStep, goPrevious, goNext, canGoPrevious, canGoNext } =
44
+ useDynamicStepper({
45
+ stepCount: steps.length,
46
+ activeStep: activeStepProp,
47
+ defaultActiveStep,
48
+ onActiveStepChange,
49
+ onPrevious,
50
+ onNext,
51
+ });
52
+
53
+ if (steps.length === 0) {
54
+ return null;
55
+ }
56
+
57
+ const itemOrientation =
58
+ orientation === "vertical" ? "vertical" : "horizontal";
59
+
60
+ return (
61
+ <div
62
+ ref={ref}
63
+ role="navigation"
64
+ data-slot="dynamic-stepper"
65
+ className={cn(dynamicStepperRootVariants({ orientation }), className)}
66
+ {...rest}
67
+ >
68
+ <Button
69
+ id={previousId}
70
+ data-slot="dynamic-stepper-previous"
71
+ type="button"
72
+ appearance={buttonAppearance}
73
+ size={buttonSize}
74
+ disabled={!canGoPrevious}
75
+ onClick={goPrevious}
76
+ className={
77
+ orientation === "vertical" ? "shrink-0 self-start" : "shrink-0"
78
+ }
79
+ >
80
+ {prevLabel}
81
+ </Button>
82
+
83
+ <ol
84
+ id={mapperId}
85
+ aria-label="Steps"
86
+ data-slot="dynamic-stepper-mapper"
87
+ className={dynamicStepperMapperVariants({ orientation })}
88
+ >
89
+ {steps.map((step, index) => {
90
+ const key = step.id ?? `dynamic-stepper-step-${index}`;
91
+ const isCurrent = index === activeStep;
92
+ const semanticState =
93
+ index < activeStep
94
+ ? "complete"
95
+ : isCurrent
96
+ ? "current"
97
+ : "upcoming";
98
+ const indicatorTone =
99
+ semanticState === "complete"
100
+ ? indicatorCompleteAppearance
101
+ : semanticState === "current"
102
+ ? indicatorCurrentAppearance
103
+ : indicatorUpcomingAppearance;
104
+
105
+ const isVertical = orientation === "vertical";
106
+
107
+ return (
108
+ <li
109
+ key={key}
110
+ data-slot="dynamic-stepper-item"
111
+ aria-current={isCurrent ? "step" : undefined}
112
+ className={dynamicStepperItemVariants({
113
+ orientation: itemOrientation,
114
+ })}
115
+ >
116
+ <div
117
+ data-slot="dynamic-stepper-indicator"
118
+ className={cn(
119
+ dynamicStepperIndicatorVariants({ size: indicatorSize }),
120
+ dynamicStepperIndicatorToneClass(
121
+ semanticState,
122
+ indicatorTone,
123
+ ),
124
+ )}
125
+ >
126
+ {step.indicator ?? index + 1}
127
+ </div>
128
+ <div
129
+ className={cn(
130
+ "min-w-0",
131
+ !isVertical && "flex flex-col items-center",
132
+ )}
133
+ >
134
+ {step.title != null && (
135
+ <div
136
+ className={cn(
137
+ "text-sm font-semibold dark:text-white text-slate-900",
138
+ !isVertical && "mt-3",
139
+ )}
140
+ >
141
+ {step.title}
142
+ </div>
143
+ )}
144
+ {step.description != null && (
145
+ <p className="mt-1 text-xs text-slate-900 dark:text-slate-400">
146
+ {step.description}
147
+ </p>
148
+ )}
149
+ </div>
150
+ </li>
151
+ );
152
+ })}
153
+ </ol>
154
+
155
+ <Button
156
+ id={nextId}
157
+ data-slot="dynamic-stepper-next"
158
+ type="button"
159
+ appearance={buttonAppearance}
160
+ size={buttonSize}
161
+ disabled={!canGoNext}
162
+ onClick={goNext}
163
+ className={
164
+ orientation === "vertical" ? "shrink-0 self-start" : "shrink-0"
165
+ }
166
+ >
167
+ {nextLabel}
168
+ </Button>
169
+ </div>
170
+ );
171
+ };
172
+
173
+ DynamicStepper.displayName = "DynamicStepper";
@@ -0,0 +1,22 @@
1
+ "use client";
2
+
3
+ export { DynamicStepper } from "./dynamic-stepper";
4
+ export type {
5
+ DynamicStepperButtonAppearance,
6
+ DynamicStepperButtonSize,
7
+ DynamicStepperIndicatorSize,
8
+ DynamicStepperIndicatorToneAppearance,
9
+ DynamicStepperOrientation,
10
+ DynamicStepperProps,
11
+ DynamicStepperStep,
12
+ UseDynamicStepperParams,
13
+ UseDynamicStepperResult,
14
+ } from "./types";
15
+ export {
16
+ dynamicStepperIndicatorToneClass,
17
+ dynamicStepperIndicatorVariants,
18
+ dynamicStepperItemVariants,
19
+ dynamicStepperMapperVariants,
20
+ dynamicStepperRootVariants,
21
+ } from "./variants";
22
+ export type { DynamicStepperIndicatorSemanticState } from "./variants";
@@ -0,0 +1,85 @@
1
+ import type { VariantProps } from "class-variance-authority";
2
+ import type { ComponentPropsWithRef, ReactNode } from "react";
3
+
4
+ import type { buttonVariants } from "../buttons/variants";
5
+ import type {
6
+ DynamicStepperIndicatorToneAppearance,
7
+ dynamicStepperIndicatorVariants,
8
+ dynamicStepperRootVariants,
9
+ } from "./variants";
10
+
11
+ export type DynamicStepperOrientation = NonNullable<
12
+ VariantProps<typeof dynamicStepperRootVariants>["orientation"]
13
+ >;
14
+
15
+ export type DynamicStepperIndicatorSize = NonNullable<
16
+ VariantProps<typeof dynamicStepperIndicatorVariants>["size"]
17
+ >;
18
+
19
+ export type { DynamicStepperIndicatorToneAppearance };
20
+
21
+ export type DynamicStepperStep = {
22
+ id?: string;
23
+ title?: ReactNode;
24
+ description?: ReactNode;
25
+ indicator?: ReactNode;
26
+ };
27
+
28
+ export type DynamicStepperButtonAppearance = NonNullable<
29
+ VariantProps<typeof buttonVariants>["appearance"]
30
+ >;
31
+
32
+ export type DynamicStepperButtonSize = NonNullable<
33
+ VariantProps<typeof buttonVariants>["size"]
34
+ >;
35
+
36
+ export type UseDynamicStepperParams = {
37
+ stepCount: number;
38
+ /** Controlled active step index (0-based). */
39
+ activeStep?: number;
40
+ /** Initial step when uncontrolled. Clamped to `[0, stepCount - 1]`. */
41
+ defaultActiveStep?: number;
42
+ onActiveStepChange?: (step: number) => void;
43
+ /** Fires after a successful move from the previous button with the new index. */
44
+ onPrevious?: (nextStep: number) => void;
45
+ /** Fires after a successful move from the next button with the new index. */
46
+ onNext?: (nextStep: number) => void;
47
+ };
48
+
49
+ export type UseDynamicStepperResult = {
50
+ /** Active step index (0-based), clamped to valid range. */
51
+ activeStep: number;
52
+ setActiveStep: (next: number | ((prev: number) => number)) => void;
53
+ goPrevious: () => void;
54
+ goNext: () => void;
55
+ canGoPrevious: boolean;
56
+ canGoNext: boolean;
57
+ stepCount: number;
58
+ };
59
+
60
+ export type DynamicStepperProps = Omit<
61
+ ComponentPropsWithRef<"div">,
62
+ "children"
63
+ > & {
64
+ steps: DynamicStepperStep[];
65
+ orientation?: DynamicStepperOrientation;
66
+ /** Passed to Previous / Next `Button` components. */
67
+ buttonAppearance?: DynamicStepperButtonAppearance;
68
+ /** Passed to Previous / Next `Button` components. */
69
+ buttonSize?: DynamicStepperButtonSize;
70
+ /** Indicator + text scale inside the mapper. */
71
+ indicatorSize?: DynamicStepperIndicatorSize;
72
+ /** Tone for completed steps (non-gradient button palette). @defaultValue emerald */
73
+ indicatorCompleteAppearance?: DynamicStepperIndicatorToneAppearance;
74
+ /** Tone for the active step. @defaultValue violet */
75
+ indicatorCurrentAppearance?: DynamicStepperIndicatorToneAppearance;
76
+ /** Tone for upcoming steps. @defaultValue outline */
77
+ indicatorUpcomingAppearance?: DynamicStepperIndicatorToneAppearance;
78
+ activeStep?: number;
79
+ defaultActiveStep?: number;
80
+ onActiveStepChange?: (step: number) => void;
81
+ onPrevious?: (nextStep: number) => void;
82
+ onNext?: (nextStep: number) => void;
83
+ prevLabel?: ReactNode;
84
+ nextLabel?: ReactNode;
85
+ };