@hypoth-ui/cli 0.0.1 → 0.1.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 (375) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -115
  3. package/dist/{add-PDBC4JTE.js → add-V5PW73GC.js} +29 -17
  4. package/dist/{chunk-5LTQ2XVL.js → chunk-27CLUUVC.js} +0 -2
  5. package/dist/{chunk-YPKFYE45.js → chunk-NWIRSZUQ.js} +6 -13
  6. package/dist/{chunk-GJ6JOQ3Q.js → chunk-PBK72SJJ.js} +1 -1
  7. package/dist/{diff-BQEXG7HU.js → diff-776UATCA.js} +2 -2
  8. package/dist/index.js +5 -5
  9. package/dist/{init-7AZXYAPJ.js → init-GDU2PW7K.js} +10 -13
  10. package/dist/{list-X6ZLM2NQ.js → list-XDP5I537.js} +3 -3
  11. package/package.json +16 -12
  12. package/registry/components.json +1820 -206
  13. package/templates/accordion/index.tsx +266 -0
  14. package/templates/accordion/wc/accordion-content.ts +113 -0
  15. package/templates/accordion/wc/accordion-item.ts +111 -0
  16. package/templates/accordion/wc/accordion-trigger.ts +105 -0
  17. package/templates/accordion/wc/accordion.ts +213 -0
  18. package/templates/accordion/wc/index.ts +12 -0
  19. package/templates/alert/index.tsx +177 -0
  20. package/templates/alert/wc/alert.ts +167 -0
  21. package/templates/alert/wc/index.ts +1 -0
  22. package/templates/alert-dialog/index.tsx +360 -0
  23. package/templates/alert-dialog/wc/alert-dialog-action.ts +43 -0
  24. package/templates/alert-dialog/wc/alert-dialog-cancel.ts +43 -0
  25. package/templates/alert-dialog/wc/alert-dialog-content.ts +42 -0
  26. package/templates/alert-dialog/wc/alert-dialog-description.ts +34 -0
  27. package/templates/alert-dialog/wc/alert-dialog-footer.ts +25 -0
  28. package/templates/alert-dialog/wc/alert-dialog-header.ts +25 -0
  29. package/templates/alert-dialog/wc/alert-dialog-title.ts +34 -0
  30. package/templates/alert-dialog/wc/alert-dialog-trigger.ts +46 -0
  31. package/templates/alert-dialog/wc/alert-dialog.ts +302 -0
  32. package/templates/alert-dialog/wc/index.ts +13 -0
  33. package/templates/aspect-ratio/index.tsx +50 -0
  34. package/templates/aspect-ratio/wc/aspect-ratio.ts +78 -0
  35. package/templates/aspect-ratio/wc/index.ts +5 -0
  36. package/templates/avatar/avatar-group.tsx +88 -0
  37. package/templates/avatar/avatar.tsx +124 -0
  38. package/templates/avatar/index.tsx +33 -0
  39. package/templates/avatar/wc/avatar-group.ts +112 -0
  40. package/templates/avatar/wc/avatar.ts +184 -0
  41. package/templates/avatar/wc/index.ts +5 -0
  42. package/templates/badge/index.tsx +140 -0
  43. package/templates/badge/wc/badge.ts +119 -0
  44. package/templates/badge/wc/index.ts +9 -0
  45. package/templates/breadcrumb/index.tsx +157 -0
  46. package/templates/breadcrumb/wc/breadcrumb-item.ts +30 -0
  47. package/templates/breadcrumb/wc/breadcrumb-link.ts +70 -0
  48. package/templates/breadcrumb/wc/breadcrumb-list.ts +30 -0
  49. package/templates/breadcrumb/wc/breadcrumb-page.ts +32 -0
  50. package/templates/breadcrumb/wc/breadcrumb-separator.ts +31 -0
  51. package/templates/breadcrumb/wc/breadcrumb.ts +55 -0
  52. package/templates/breadcrumb/wc/index.ts +10 -0
  53. package/templates/button/button.tsx +119 -0
  54. package/templates/button/index.ts +1 -0
  55. package/templates/button/wc/button.ts +169 -0
  56. package/templates/calendar/index.tsx +149 -0
  57. package/templates/calendar/wc/calendar.ts +316 -0
  58. package/templates/calendar/wc/index.ts +4 -0
  59. package/templates/card/index.tsx +108 -0
  60. package/templates/card/wc/card-content.ts +25 -0
  61. package/templates/card/wc/card-footer.ts +25 -0
  62. package/templates/card/wc/card-header.ts +25 -0
  63. package/templates/card/wc/card.ts +43 -0
  64. package/templates/card/wc/index.ts +8 -0
  65. package/templates/checkbox/checkbox.tsx +85 -0
  66. package/templates/checkbox/wc/checkbox.ts +247 -0
  67. package/templates/collapsible/index.tsx +172 -0
  68. package/templates/collapsible/wc/collapsible-content.ts +97 -0
  69. package/templates/collapsible/wc/collapsible-trigger.ts +39 -0
  70. package/templates/collapsible/wc/collapsible.ts +143 -0
  71. package/templates/collapsible/wc/index.ts +7 -0
  72. package/templates/combobox/combobox-content.tsx +141 -0
  73. package/templates/combobox/combobox-context.ts +36 -0
  74. package/templates/combobox/combobox-empty.tsx +38 -0
  75. package/templates/combobox/combobox-input.tsx +159 -0
  76. package/templates/combobox/combobox-loading.tsx +38 -0
  77. package/templates/combobox/combobox-option.tsx +99 -0
  78. package/templates/combobox/combobox-root.tsx +207 -0
  79. package/templates/combobox/combobox-tag.tsx +62 -0
  80. package/templates/combobox/index.ts +62 -0
  81. package/templates/combobox/wc/combobox-content.ts +97 -0
  82. package/templates/combobox/wc/combobox-input.ts +134 -0
  83. package/templates/combobox/wc/combobox-option.ts +111 -0
  84. package/templates/combobox/wc/combobox-tag.ts +103 -0
  85. package/templates/combobox/wc/combobox.ts +981 -0
  86. package/templates/combobox/wc/index.ts +5 -0
  87. package/templates/command/index.tsx +279 -0
  88. package/templates/command/wc/command-empty.ts +24 -0
  89. package/templates/command/wc/command-group.ts +60 -0
  90. package/templates/command/wc/command-input.ts +136 -0
  91. package/templates/command/wc/command-item.ts +78 -0
  92. package/templates/command/wc/command-list.ts +103 -0
  93. package/templates/command/wc/command-loading.ts +24 -0
  94. package/templates/command/wc/command-separator.ts +23 -0
  95. package/templates/command/wc/command.ts +176 -0
  96. package/templates/context-menu/index.tsx +262 -0
  97. package/templates/context-menu/wc/context-menu-content.ts +41 -0
  98. package/templates/context-menu/wc/context-menu-item.ts +83 -0
  99. package/templates/context-menu/wc/context-menu-label.ts +30 -0
  100. package/templates/context-menu/wc/context-menu-separator.ts +28 -0
  101. package/templates/context-menu/wc/context-menu.ts +324 -0
  102. package/templates/context-menu/wc/index.ts +9 -0
  103. package/templates/data-table/index.tsx +263 -0
  104. package/templates/data-table/wc/data-table.ts +405 -0
  105. package/templates/data-table/wc/index.ts +10 -0
  106. package/templates/date-picker/date-picker-calendar.tsx +352 -0
  107. package/templates/date-picker/date-picker-content.tsx +121 -0
  108. package/templates/date-picker/date-picker-context.ts +46 -0
  109. package/templates/date-picker/date-picker-root.tsx +201 -0
  110. package/templates/date-picker/date-picker-trigger.tsx +95 -0
  111. package/templates/date-picker/index.ts +44 -0
  112. package/templates/date-picker/wc/date-picker-calendar.ts +457 -0
  113. package/templates/date-picker/wc/date-picker.ts +592 -0
  114. package/templates/date-picker/wc/date-utils.ts +467 -0
  115. package/templates/date-picker/wc/index.ts +3 -0
  116. package/templates/dialog/dialog-close.tsx +57 -0
  117. package/templates/dialog/dialog-content.tsx +106 -0
  118. package/templates/dialog/dialog-context.ts +24 -0
  119. package/templates/dialog/dialog-description.tsx +51 -0
  120. package/templates/dialog/dialog-root.tsx +104 -0
  121. package/templates/dialog/dialog-title.tsx +38 -0
  122. package/templates/dialog/dialog-trigger.tsx +94 -0
  123. package/templates/dialog/index.ts +52 -0
  124. package/templates/dialog/wc/dialog-content.ts +59 -0
  125. package/templates/dialog/wc/dialog-description.ts +58 -0
  126. package/templates/dialog/wc/dialog-title.ts +56 -0
  127. package/templates/dialog/wc/dialog.ts +411 -0
  128. package/templates/drawer/index.tsx +263 -0
  129. package/templates/drawer/wc/drawer-content.ts +150 -0
  130. package/templates/drawer/wc/drawer-description.ts +34 -0
  131. package/templates/drawer/wc/drawer-footer.ts +25 -0
  132. package/templates/drawer/wc/drawer-header.ts +25 -0
  133. package/templates/drawer/wc/drawer-title.ts +34 -0
  134. package/templates/drawer/wc/drawer.ts +348 -0
  135. package/templates/drawer/wc/index.ts +10 -0
  136. package/templates/dropdown-menu/index.tsx +454 -0
  137. package/templates/dropdown-menu/wc/dropdown-menu-checkbox-item.ts +93 -0
  138. package/templates/dropdown-menu/wc/dropdown-menu-content.ts +43 -0
  139. package/templates/dropdown-menu/wc/dropdown-menu-item.ts +85 -0
  140. package/templates/dropdown-menu/wc/dropdown-menu-label.ts +31 -0
  141. package/templates/dropdown-menu/wc/dropdown-menu-radio-group.ts +80 -0
  142. package/templates/dropdown-menu/wc/dropdown-menu-radio-item.ts +101 -0
  143. package/templates/dropdown-menu/wc/dropdown-menu-separator.ts +28 -0
  144. package/templates/dropdown-menu/wc/dropdown-menu.ts +358 -0
  145. package/templates/dropdown-menu/wc/index.ts +12 -0
  146. package/templates/field/field-description.tsx +39 -0
  147. package/templates/field/field-error.tsx +37 -0
  148. package/templates/field/field.tsx +46 -0
  149. package/templates/field/index.ts +4 -0
  150. package/templates/field/label.tsx +40 -0
  151. package/templates/field/wc/field-description.ts +42 -0
  152. package/templates/field/wc/field-error.ts +46 -0
  153. package/templates/field/wc/field.ts +210 -0
  154. package/templates/field/wc/label.ts +54 -0
  155. package/templates/file-upload/file-upload-context.ts +26 -0
  156. package/templates/file-upload/file-upload-dropzone.tsx +111 -0
  157. package/templates/file-upload/file-upload-input.tsx +86 -0
  158. package/templates/file-upload/file-upload-item.tsx +105 -0
  159. package/templates/file-upload/file-upload-root.tsx +115 -0
  160. package/templates/file-upload/index.ts +50 -0
  161. package/templates/file-upload/wc/file-upload.ts +380 -0
  162. package/templates/file-upload/wc/index.ts +1 -0
  163. package/templates/hover-card/index.tsx +203 -0
  164. package/templates/hover-card/wc/hover-card-content.ts +50 -0
  165. package/templates/hover-card/wc/hover-card.ts +382 -0
  166. package/templates/hover-card/wc/index.ts +6 -0
  167. package/templates/icon/icon.tsx +76 -0
  168. package/templates/icon/wc/icon-adapter.ts +108 -0
  169. package/templates/icon/wc/icon.ts +161 -0
  170. package/templates/input/input.tsx +130 -0
  171. package/templates/input/wc/input.ts +216 -0
  172. package/templates/layout/app-shell.tsx +177 -0
  173. package/templates/layout/box.tsx +53 -0
  174. package/templates/layout/center.tsx +42 -0
  175. package/templates/layout/container.tsx +43 -0
  176. package/templates/layout/flow.tsx +83 -0
  177. package/templates/layout/grid.tsx +79 -0
  178. package/templates/layout/index.ts +33 -0
  179. package/templates/layout/inline.tsx +16 -0
  180. package/templates/layout/page.tsx +43 -0
  181. package/templates/layout/section.tsx +39 -0
  182. package/templates/layout/spacer.tsx +30 -0
  183. package/templates/layout/split.tsx +47 -0
  184. package/templates/layout/stack.tsx +16 -0
  185. package/templates/layout/wc/app-shell.ts +58 -0
  186. package/templates/layout/wc/box.ts +117 -0
  187. package/templates/layout/wc/center.ts +78 -0
  188. package/templates/layout/wc/container.ts +77 -0
  189. package/templates/layout/wc/flow.ts +149 -0
  190. package/templates/layout/wc/footer.ts +57 -0
  191. package/templates/layout/wc/grid.ts +142 -0
  192. package/templates/layout/wc/header.ts +57 -0
  193. package/templates/layout/wc/index.ts +41 -0
  194. package/templates/layout/wc/main.ts +46 -0
  195. package/templates/layout/wc/page.ts +81 -0
  196. package/templates/layout/wc/section.ts +65 -0
  197. package/templates/layout/wc/spacer.ts +77 -0
  198. package/templates/layout/wc/split.ts +94 -0
  199. package/templates/layout/wc/wrap.ts +93 -0
  200. package/templates/layout/wrap.tsx +46 -0
  201. package/templates/link/link.tsx +109 -0
  202. package/templates/link/wc/link.ts +124 -0
  203. package/templates/list/index.tsx +55 -0
  204. package/templates/list/list-item.tsx +117 -0
  205. package/templates/list/list.tsx +115 -0
  206. package/templates/list/wc/index.ts +5 -0
  207. package/templates/list/wc/list-item.ts +127 -0
  208. package/templates/list/wc/list.ts +114 -0
  209. package/templates/menu/index.ts +49 -0
  210. package/templates/menu/menu-content.tsx +109 -0
  211. package/templates/menu/menu-context.ts +17 -0
  212. package/templates/menu/menu-item.tsx +108 -0
  213. package/templates/menu/menu-label.tsx +32 -0
  214. package/templates/menu/menu-root.tsx +108 -0
  215. package/templates/menu/menu-separator.tsx +24 -0
  216. package/templates/menu/menu-trigger.tsx +104 -0
  217. package/templates/menu/wc/menu-content.ts +67 -0
  218. package/templates/menu/wc/menu-item.ts +109 -0
  219. package/templates/menu/wc/menu.ts +449 -0
  220. package/templates/navigation-menu/index.tsx +328 -0
  221. package/templates/navigation-menu/wc/index.ts +12 -0
  222. package/templates/navigation-menu/wc/navigation-menu-content.ts +30 -0
  223. package/templates/navigation-menu/wc/navigation-menu-indicator.ts +30 -0
  224. package/templates/navigation-menu/wc/navigation-menu-item.ts +60 -0
  225. package/templates/navigation-menu/wc/navigation-menu-link.ts +97 -0
  226. package/templates/navigation-menu/wc/navigation-menu-list.ts +30 -0
  227. package/templates/navigation-menu/wc/navigation-menu-trigger.ts +110 -0
  228. package/templates/navigation-menu/wc/navigation-menu-viewport.ts +85 -0
  229. package/templates/navigation-menu/wc/navigation-menu.ts +272 -0
  230. package/templates/number-input/index.ts +46 -0
  231. package/templates/number-input/number-input-context.ts +38 -0
  232. package/templates/number-input/number-input-decrement.tsx +53 -0
  233. package/templates/number-input/number-input-field.tsx +93 -0
  234. package/templates/number-input/number-input-increment.tsx +53 -0
  235. package/templates/number-input/number-input-root.tsx +137 -0
  236. package/templates/number-input/wc/index.ts +1 -0
  237. package/templates/number-input/wc/number-input.ts +283 -0
  238. package/templates/pagination/index.tsx +198 -0
  239. package/templates/pagination/wc/index.ts +11 -0
  240. package/templates/pagination/wc/pagination-content.ts +30 -0
  241. package/templates/pagination/wc/pagination-ellipsis.ts +28 -0
  242. package/templates/pagination/wc/pagination-item.ts +30 -0
  243. package/templates/pagination/wc/pagination-link.ts +76 -0
  244. package/templates/pagination/wc/pagination-next.ts +69 -0
  245. package/templates/pagination/wc/pagination-previous.ts +69 -0
  246. package/templates/pagination/wc/pagination.ts +156 -0
  247. package/templates/pin-input/index.ts +39 -0
  248. package/templates/pin-input/pin-input-context.ts +30 -0
  249. package/templates/pin-input/pin-input-field.tsx +186 -0
  250. package/templates/pin-input/pin-input-root.tsx +120 -0
  251. package/templates/pin-input/wc/index.ts +1 -0
  252. package/templates/pin-input/wc/pin-input.ts +259 -0
  253. package/templates/popover/popover.tsx +121 -0
  254. package/templates/popover/wc/popover-content.ts +66 -0
  255. package/templates/popover/wc/popover.ts +343 -0
  256. package/templates/progress/index.tsx +117 -0
  257. package/templates/progress/wc/index.ts +4 -0
  258. package/templates/progress/wc/progress.ts +174 -0
  259. package/templates/radio/radio.tsx +43 -0
  260. package/templates/radio/wc/radio-group.ts +261 -0
  261. package/templates/radio/wc/radio.ts +145 -0
  262. package/templates/scroll-area/index.tsx +144 -0
  263. package/templates/scroll-area/wc/index.ts +8 -0
  264. package/templates/scroll-area/wc/scroll-area-scrollbar.ts +143 -0
  265. package/templates/scroll-area/wc/scroll-area-thumb.ts +225 -0
  266. package/templates/scroll-area/wc/scroll-area-viewport.ts +120 -0
  267. package/templates/scroll-area/wc/scroll-area.ts +63 -0
  268. package/templates/select/index.ts +57 -0
  269. package/templates/select/select-content.tsx +243 -0
  270. package/templates/select/select-context.ts +30 -0
  271. package/templates/select/select-group.tsx +53 -0
  272. package/templates/select/select-label.tsx +34 -0
  273. package/templates/select/select-option.tsx +97 -0
  274. package/templates/select/select-root.tsx +153 -0
  275. package/templates/select/select-separator.tsx +27 -0
  276. package/templates/select/select-trigger.tsx +112 -0
  277. package/templates/select/select-value.tsx +48 -0
  278. package/templates/select/wc/index.ts +6 -0
  279. package/templates/select/wc/select-content.ts +89 -0
  280. package/templates/select/wc/select-group.ts +82 -0
  281. package/templates/select/wc/select-label.ts +49 -0
  282. package/templates/select/wc/select-option.ts +111 -0
  283. package/templates/select/wc/select-trigger.ts +101 -0
  284. package/templates/select/wc/select.ts +840 -0
  285. package/templates/separator/index.tsx +49 -0
  286. package/templates/separator/wc/index.ts +5 -0
  287. package/templates/separator/wc/separator.ts +60 -0
  288. package/templates/sheet/index.tsx +291 -0
  289. package/templates/sheet/wc/index.ts +12 -0
  290. package/templates/sheet/wc/sheet-close.ts +43 -0
  291. package/templates/sheet/wc/sheet-content.ts +47 -0
  292. package/templates/sheet/wc/sheet-description.ts +34 -0
  293. package/templates/sheet/wc/sheet-footer.ts +25 -0
  294. package/templates/sheet/wc/sheet-header.ts +25 -0
  295. package/templates/sheet/wc/sheet-overlay.ts +23 -0
  296. package/templates/sheet/wc/sheet-title.ts +34 -0
  297. package/templates/sheet/wc/sheet.ts +336 -0
  298. package/templates/skeleton/index.tsx +131 -0
  299. package/templates/skeleton/wc/index.ts +10 -0
  300. package/templates/skeleton/wc/skeleton.ts +107 -0
  301. package/templates/slider/index.ts +41 -0
  302. package/templates/slider/slider-context.ts +36 -0
  303. package/templates/slider/slider-range.tsx +59 -0
  304. package/templates/slider/slider-root.tsx +166 -0
  305. package/templates/slider/slider-thumb.tsx +213 -0
  306. package/templates/slider/slider-track.tsx +113 -0
  307. package/templates/slider/wc/index.ts +1 -0
  308. package/templates/slider/wc/slider.ts +465 -0
  309. package/templates/spinner/spinner.tsx +64 -0
  310. package/templates/spinner/wc/spinner.ts +70 -0
  311. package/templates/stepper/index.tsx +230 -0
  312. package/templates/stepper/wc/index.ts +12 -0
  313. package/templates/stepper/wc/stepper-content.ts +30 -0
  314. package/templates/stepper/wc/stepper-description.ts +25 -0
  315. package/templates/stepper/wc/stepper-indicator.ts +30 -0
  316. package/templates/stepper/wc/stepper-item.ts +55 -0
  317. package/templates/stepper/wc/stepper-separator.ts +29 -0
  318. package/templates/stepper/wc/stepper-title.ts +25 -0
  319. package/templates/stepper/wc/stepper-trigger.ts +67 -0
  320. package/templates/stepper/wc/stepper.ts +164 -0
  321. package/templates/switch/switch.tsx +90 -0
  322. package/templates/switch/wc/switch.ts +228 -0
  323. package/templates/table/body.tsx +21 -0
  324. package/templates/table/cell.tsx +44 -0
  325. package/templates/table/head.tsx +112 -0
  326. package/templates/table/header.tsx +21 -0
  327. package/templates/table/index.tsx +93 -0
  328. package/templates/table/root.tsx +82 -0
  329. package/templates/table/row.tsx +36 -0
  330. package/templates/table/wc/index.ts +9 -0
  331. package/templates/table/wc/table-body.ts +32 -0
  332. package/templates/table/wc/table-cell.ts +58 -0
  333. package/templates/table/wc/table-head.ts +129 -0
  334. package/templates/table/wc/table-header.ts +32 -0
  335. package/templates/table/wc/table-row.ts +50 -0
  336. package/templates/table/wc/table.ts +93 -0
  337. package/templates/tabs/index.tsx +222 -0
  338. package/templates/tabs/wc/index.ts +8 -0
  339. package/templates/tabs/wc/tabs-content.ts +82 -0
  340. package/templates/tabs/wc/tabs-list.ts +56 -0
  341. package/templates/tabs/wc/tabs-trigger.ts +136 -0
  342. package/templates/tabs/wc/tabs.ts +202 -0
  343. package/templates/tag/index.tsx +186 -0
  344. package/templates/tag/wc/index.ts +4 -0
  345. package/templates/tag/wc/tag.ts +166 -0
  346. package/templates/text/text.tsx +100 -0
  347. package/templates/text/wc/text.ts +94 -0
  348. package/templates/textarea/textarea.tsx +134 -0
  349. package/templates/textarea/wc/textarea.ts +280 -0
  350. package/templates/time-picker/index.ts +42 -0
  351. package/templates/time-picker/time-picker-context.ts +28 -0
  352. package/templates/time-picker/time-picker-root.tsx +113 -0
  353. package/templates/time-picker/time-picker-segment.tsx +91 -0
  354. package/templates/time-picker/wc/index.ts +1 -0
  355. package/templates/time-picker/wc/time-picker.ts +221 -0
  356. package/templates/toast/index.tsx +71 -0
  357. package/templates/toast/provider.tsx +228 -0
  358. package/templates/toast/toast.tsx +142 -0
  359. package/templates/toast/use-toast.ts +89 -0
  360. package/templates/toast/wc/index.ts +15 -0
  361. package/templates/toast/wc/toast-controller.ts +282 -0
  362. package/templates/toast/wc/toast-provider.ts +161 -0
  363. package/templates/toast/wc/toast.ts +165 -0
  364. package/templates/tooltip/tooltip.tsx +62 -0
  365. package/templates/tooltip/wc/tooltip-content.ts +64 -0
  366. package/templates/tooltip/wc/tooltip.ts +289 -0
  367. package/templates/tree/index.tsx +60 -0
  368. package/templates/tree/tree-item.tsx +131 -0
  369. package/templates/tree/tree.tsx +138 -0
  370. package/templates/tree/wc/index.ts +11 -0
  371. package/templates/tree/wc/tree-item.ts +273 -0
  372. package/templates/tree/wc/tree-utils.ts +143 -0
  373. package/templates/tree/wc/tree.ts +139 -0
  374. package/templates/visually-hidden/visually-hidden.tsx +45 -0
  375. package/templates/visually-hidden/wc/visually-hidden.ts +64 -0
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Stepper compound component exports.
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { Stepper } from "@/components/ui";
7
+ *
8
+ * <Stepper.Root value={2} onStepChange={(step) => console.log(step)}>
9
+ * <Stepper.Item step={1} completed>
10
+ * <Stepper.Trigger>
11
+ * <Stepper.Indicator>1</Stepper.Indicator>
12
+ * <Stepper.Title>Account</Stepper.Title>
13
+ * </Stepper.Trigger>
14
+ * </Stepper.Item>
15
+ * <Stepper.Separator />
16
+ * <Stepper.Item step={2}>
17
+ * <Stepper.Trigger>
18
+ * <Stepper.Indicator>2</Stepper.Indicator>
19
+ * <Stepper.Title>Profile</Stepper.Title>
20
+ * </Stepper.Trigger>
21
+ * </Stepper.Item>
22
+ * </Stepper.Root>
23
+ * ```
24
+ */
25
+
26
+ import {
27
+ type HTMLAttributes,
28
+ type ReactNode,
29
+ createElement,
30
+ forwardRef,
31
+ useCallback,
32
+ useEffect,
33
+ useRef,
34
+ useState,
35
+ } from "react";
36
+
37
+ // ============================================================================
38
+ // Types
39
+ // ============================================================================
40
+
41
+ export type StepperOrientation = "horizontal" | "vertical";
42
+
43
+ export interface StepperRootProps extends HTMLAttributes<HTMLElement> {
44
+ children?: ReactNode;
45
+ value?: number;
46
+ defaultValue?: number;
47
+ onStepChange?: (step: number) => void;
48
+ orientation?: StepperOrientation;
49
+ linear?: boolean;
50
+ }
51
+
52
+ export interface StepperItemProps extends HTMLAttributes<HTMLElement> {
53
+ children?: ReactNode;
54
+ step: number;
55
+ completed?: boolean;
56
+ disabled?: boolean;
57
+ }
58
+
59
+ export interface StepperTriggerProps extends HTMLAttributes<HTMLElement> {
60
+ children?: ReactNode;
61
+ }
62
+
63
+ export interface StepperIndicatorProps extends HTMLAttributes<HTMLElement> {
64
+ children?: ReactNode;
65
+ }
66
+
67
+ export interface StepperTitleProps extends HTMLAttributes<HTMLElement> {
68
+ children?: ReactNode;
69
+ }
70
+
71
+ export interface StepperDescriptionProps extends HTMLAttributes<HTMLElement> {
72
+ children?: ReactNode;
73
+ }
74
+
75
+ export interface StepperSeparatorProps extends HTMLAttributes<HTMLElement> {}
76
+
77
+ export interface StepperContentProps extends HTMLAttributes<HTMLElement> {
78
+ children?: ReactNode;
79
+ }
80
+
81
+ // ============================================================================
82
+ // Components
83
+ // ============================================================================
84
+
85
+ const StepperRoot = forwardRef<HTMLElement, StepperRootProps>(function StepperRoot(
86
+ {
87
+ children,
88
+ className,
89
+ value: controlledValue,
90
+ defaultValue = 1,
91
+ onStepChange,
92
+ orientation = "horizontal",
93
+ linear = false,
94
+ ...props
95
+ },
96
+ ref
97
+ ) {
98
+ const [internalValue, setInternalValue] = useState(defaultValue);
99
+ const isControlled = controlledValue !== undefined;
100
+ const value = isControlled ? controlledValue : internalValue;
101
+ const elementRef = useRef<HTMLElement>(null);
102
+
103
+ const combinedRef = (node: HTMLElement | null) => {
104
+ (elementRef as React.MutableRefObject<HTMLElement | null>).current = node;
105
+ if (typeof ref === "function") ref(node);
106
+ else if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = node;
107
+ };
108
+
109
+ const handleStepChange = useCallback(
110
+ (event: Event) => {
111
+ const e = event as CustomEvent<{ step: number }>;
112
+ if (!isControlled) setInternalValue(e.detail.step);
113
+ onStepChange?.(e.detail.step);
114
+ },
115
+ [isControlled, onStepChange]
116
+ );
117
+
118
+ useEffect(() => {
119
+ const element = elementRef.current;
120
+ if (!element) return;
121
+ element.addEventListener("ds:step-change", handleStepChange);
122
+ return () => element.removeEventListener("ds:step-change", handleStepChange);
123
+ }, [handleStepChange]);
124
+
125
+ return createElement(
126
+ "ds-stepper",
127
+ {
128
+ ref: combinedRef,
129
+ class: className,
130
+ value,
131
+ orientation,
132
+ linear: linear || undefined,
133
+ ...props,
134
+ },
135
+ children
136
+ );
137
+ });
138
+ StepperRoot.displayName = "Stepper.Root";
139
+
140
+ const StepperItem = forwardRef<HTMLElement, StepperItemProps>(function StepperItem(
141
+ { children, className, step, completed, disabled, ...props },
142
+ ref
143
+ ) {
144
+ return createElement(
145
+ "ds-stepper-item",
146
+ {
147
+ ref,
148
+ class: className,
149
+ step,
150
+ completed: completed || undefined,
151
+ disabled: disabled || undefined,
152
+ ...props,
153
+ },
154
+ children
155
+ );
156
+ });
157
+ StepperItem.displayName = "Stepper.Item";
158
+
159
+ const StepperTrigger = forwardRef<HTMLElement, StepperTriggerProps>(function StepperTrigger(
160
+ { children, className, ...props },
161
+ ref
162
+ ) {
163
+ return createElement("ds-stepper-trigger", { ref, class: className, ...props }, children);
164
+ });
165
+ StepperTrigger.displayName = "Stepper.Trigger";
166
+
167
+ const StepperIndicator = forwardRef<HTMLElement, StepperIndicatorProps>(function StepperIndicator(
168
+ { children, className, ...props },
169
+ ref
170
+ ) {
171
+ return createElement("ds-stepper-indicator", { ref, class: className, ...props }, children);
172
+ });
173
+ StepperIndicator.displayName = "Stepper.Indicator";
174
+
175
+ const StepperTitle = forwardRef<HTMLElement, StepperTitleProps>(function StepperTitle(
176
+ { children, className, ...props },
177
+ ref
178
+ ) {
179
+ return createElement("ds-stepper-title", { ref, class: className, ...props }, children);
180
+ });
181
+ StepperTitle.displayName = "Stepper.Title";
182
+
183
+ const StepperDescription = forwardRef<HTMLElement, StepperDescriptionProps>(
184
+ function StepperDescription({ children, className, ...props }, ref) {
185
+ return createElement("ds-stepper-description", { ref, class: className, ...props }, children);
186
+ }
187
+ );
188
+ StepperDescription.displayName = "Stepper.Description";
189
+
190
+ const StepperSeparator = forwardRef<HTMLElement, StepperSeparatorProps>(function StepperSeparator(
191
+ { className, ...props },
192
+ ref
193
+ ) {
194
+ return createElement("ds-stepper-separator", { ref, class: className, ...props });
195
+ });
196
+ StepperSeparator.displayName = "Stepper.Separator";
197
+
198
+ const StepperContent = forwardRef<HTMLElement, StepperContentProps>(function StepperContent(
199
+ { children, className, ...props },
200
+ ref
201
+ ) {
202
+ return createElement("ds-stepper-content", { ref, class: className, ...props }, children);
203
+ });
204
+ StepperContent.displayName = "Stepper.Content";
205
+
206
+ // ============================================================================
207
+ // Compound Component
208
+ // ============================================================================
209
+
210
+ export const Stepper = {
211
+ Root: StepperRoot,
212
+ Item: StepperItem,
213
+ Trigger: StepperTrigger,
214
+ Indicator: StepperIndicator,
215
+ Title: StepperTitle,
216
+ Description: StepperDescription,
217
+ Separator: StepperSeparator,
218
+ Content: StepperContent,
219
+ };
220
+
221
+ export {
222
+ StepperRoot,
223
+ StepperItem,
224
+ StepperTrigger,
225
+ StepperIndicator,
226
+ StepperTitle,
227
+ StepperDescription,
228
+ StepperSeparator,
229
+ StepperContent,
230
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Stepper component exports.
3
+ */
4
+
5
+ export { DsStepper, type StepperOrientation } from "./stepper.js";
6
+ export { DsStepperItem } from "./stepper-item.js";
7
+ export { DsStepperTrigger } from "./stepper-trigger.js";
8
+ export { DsStepperIndicator } from "./stepper-indicator.js";
9
+ export { DsStepperTitle } from "./stepper-title.js";
10
+ export { DsStepperDescription } from "./stepper-description.js";
11
+ export { DsStepperSeparator } from "./stepper-separator.js";
12
+ export { DsStepperContent } from "./stepper-content.js";
@@ -0,0 +1,30 @@
1
+ /**
2
+ * StepperContent component - step panel content.
3
+ *
4
+ * @element ds-stepper-content
5
+ *
6
+ * @slot - Step content
7
+ */
8
+
9
+ import { html } from "lit";
10
+ import { DSElement } from "../../base/ds-element.js";
11
+ import { define } from "../../registry/define.js";
12
+
13
+ export class DsStepperContent extends DSElement {
14
+ override connectedCallback(): void {
15
+ super.connectedCallback();
16
+ this.setAttribute("role", "tabpanel");
17
+ }
18
+
19
+ override render() {
20
+ return html`<slot></slot>`;
21
+ }
22
+ }
23
+
24
+ define("ds-stepper-content", DsStepperContent);
25
+
26
+ declare global {
27
+ interface HTMLElementTagNameMap {
28
+ "ds-stepper-content": DsStepperContent;
29
+ }
30
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * StepperDescription component - optional step description.
3
+ *
4
+ * @element ds-stepper-description
5
+ *
6
+ * @slot - Description text
7
+ */
8
+
9
+ import { html } from "lit";
10
+ import { DSElement } from "../../base/ds-element.js";
11
+ import { define } from "../../registry/define.js";
12
+
13
+ export class DsStepperDescription extends DSElement {
14
+ override render() {
15
+ return html`<slot></slot>`;
16
+ }
17
+ }
18
+
19
+ define("ds-stepper-description", DsStepperDescription);
20
+
21
+ declare global {
22
+ interface HTMLElementTagNameMap {
23
+ "ds-stepper-description": DsStepperDescription;
24
+ }
25
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * StepperIndicator component - visual step number/icon.
3
+ *
4
+ * @element ds-stepper-indicator
5
+ *
6
+ * @slot - Step number or icon
7
+ */
8
+
9
+ import { html } from "lit";
10
+ import { DSElement } from "../../base/ds-element.js";
11
+ import { define } from "../../registry/define.js";
12
+
13
+ export class DsStepperIndicator extends DSElement {
14
+ override connectedCallback(): void {
15
+ super.connectedCallback();
16
+ this.setAttribute("aria-hidden", "true");
17
+ }
18
+
19
+ override render() {
20
+ return html`<slot></slot>`;
21
+ }
22
+ }
23
+
24
+ define("ds-stepper-indicator", DsStepperIndicator);
25
+
26
+ declare global {
27
+ interface HTMLElementTagNameMap {
28
+ "ds-stepper-indicator": DsStepperIndicator;
29
+ }
30
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * StepperItem component - individual step container.
3
+ *
4
+ * @element ds-stepper-item
5
+ *
6
+ * @slot - Trigger and content
7
+ */
8
+
9
+ import { html } from "lit";
10
+ import { property } from "lit/decorators.js";
11
+ import { DSElement } from "../../base/ds-element.js";
12
+ import { define } from "../../registry/define.js";
13
+
14
+ export class DsStepperItem extends DSElement {
15
+ /** Step number (1-indexed) */
16
+ @property({ type: Number, reflect: true })
17
+ step = 1;
18
+
19
+ /** Whether this step is completed */
20
+ @property({ type: Boolean, reflect: true })
21
+ completed = false;
22
+
23
+ /** Whether this step is disabled */
24
+ @property({ type: Boolean, reflect: true })
25
+ disabled = false;
26
+
27
+ override connectedCallback(): void {
28
+ super.connectedCallback();
29
+ this.setAttribute("role", "listitem");
30
+ this.setAttribute("data-state", "pending");
31
+ }
32
+
33
+ override updated(_changedProperties: Map<string, unknown>): void {
34
+ // Update aria-current when state changes
35
+ // Per APG, aria-current="step" indicates the current step in a process
36
+ const state = this.getAttribute("data-state");
37
+ if (state === "active") {
38
+ this.setAttribute("aria-current", "step");
39
+ } else {
40
+ this.removeAttribute("aria-current");
41
+ }
42
+ }
43
+
44
+ override render() {
45
+ return html`<slot></slot>`;
46
+ }
47
+ }
48
+
49
+ define("ds-stepper-item", DsStepperItem);
50
+
51
+ declare global {
52
+ interface HTMLElementTagNameMap {
53
+ "ds-stepper-item": DsStepperItem;
54
+ }
55
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * StepperSeparator component - line between steps.
3
+ *
4
+ * @element ds-stepper-separator
5
+ */
6
+
7
+ import { html } from "lit";
8
+ import { DSElement } from "../../base/ds-element.js";
9
+ import { define } from "../../registry/define.js";
10
+
11
+ export class DsStepperSeparator extends DSElement {
12
+ override connectedCallback(): void {
13
+ super.connectedCallback();
14
+ this.setAttribute("role", "separator");
15
+ this.setAttribute("aria-hidden", "true");
16
+ }
17
+
18
+ override render() {
19
+ return html``;
20
+ }
21
+ }
22
+
23
+ define("ds-stepper-separator", DsStepperSeparator);
24
+
25
+ declare global {
26
+ interface HTMLElementTagNameMap {
27
+ "ds-stepper-separator": DsStepperSeparator;
28
+ }
29
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * StepperTitle component - step title text.
3
+ *
4
+ * @element ds-stepper-title
5
+ *
6
+ * @slot - Title text
7
+ */
8
+
9
+ import { html } from "lit";
10
+ import { DSElement } from "../../base/ds-element.js";
11
+ import { define } from "../../registry/define.js";
12
+
13
+ export class DsStepperTitle extends DSElement {
14
+ override render() {
15
+ return html`<slot></slot>`;
16
+ }
17
+ }
18
+
19
+ define("ds-stepper-title", DsStepperTitle);
20
+
21
+ declare global {
22
+ interface HTMLElementTagNameMap {
23
+ "ds-stepper-title": DsStepperTitle;
24
+ }
25
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * StepperTrigger component - clickable step button.
3
+ *
4
+ * @element ds-stepper-trigger
5
+ *
6
+ * @slot - Indicator and title
7
+ */
8
+
9
+ import { html } from "lit";
10
+ import { DSElement } from "../../base/ds-element.js";
11
+ import { emitEvent } from "../../events/emit.js";
12
+ import { define } from "../../registry/define.js";
13
+
14
+ export class DsStepperTrigger extends DSElement {
15
+ override connectedCallback(): void {
16
+ super.connectedCallback();
17
+ this.setAttribute("role", "button");
18
+ this.setAttribute("tabindex", "0");
19
+
20
+ this.addEventListener("click", this.handleClick);
21
+ this.addEventListener("keydown", this.handleKeyDown);
22
+ }
23
+
24
+ override disconnectedCallback(): void {
25
+ super.disconnectedCallback();
26
+ this.removeEventListener("click", this.handleClick);
27
+ this.removeEventListener("keydown", this.handleKeyDown);
28
+ }
29
+
30
+ private getStep(): number {
31
+ const item = this.closest("ds-stepper-item");
32
+ return Number(item?.getAttribute("step")) || 1;
33
+ }
34
+
35
+ private isDisabled(): boolean {
36
+ const item = this.closest("ds-stepper-item");
37
+ return item?.hasAttribute("disabled") || false;
38
+ }
39
+
40
+ private handleClick = (): void => {
41
+ if (this.isDisabled()) return;
42
+
43
+ emitEvent(this, "ds:step-select", {
44
+ detail: { step: this.getStep() },
45
+ bubbles: true,
46
+ });
47
+ };
48
+
49
+ private handleKeyDown = (event: KeyboardEvent): void => {
50
+ if (event.key === "Enter" || event.key === " ") {
51
+ event.preventDefault();
52
+ this.handleClick();
53
+ }
54
+ };
55
+
56
+ override render() {
57
+ return html`<slot></slot>`;
58
+ }
59
+ }
60
+
61
+ define("ds-stepper-trigger", DsStepperTrigger);
62
+
63
+ declare global {
64
+ interface HTMLElementTagNameMap {
65
+ "ds-stepper-trigger": DsStepperTrigger;
66
+ }
67
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Stepper component - step-by-step progress indicator.
3
+ *
4
+ * @element ds-stepper
5
+ *
6
+ * @slot - Stepper items
7
+ *
8
+ * @fires ds:step-change - Fired when active step changes
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <ds-stepper value="2">
13
+ * <ds-stepper-item step="1" completed>
14
+ * <ds-stepper-trigger>
15
+ * <ds-stepper-indicator>1</ds-stepper-indicator>
16
+ * <ds-stepper-title>Account</ds-stepper-title>
17
+ * </ds-stepper-trigger>
18
+ * </ds-stepper-item>
19
+ * <ds-stepper-separator></ds-stepper-separator>
20
+ * <ds-stepper-item step="2">
21
+ * <ds-stepper-trigger>
22
+ * <ds-stepper-indicator>2</ds-stepper-indicator>
23
+ * <ds-stepper-title>Profile</ds-stepper-title>
24
+ * </ds-stepper-trigger>
25
+ * </ds-stepper-item>
26
+ * </ds-stepper>
27
+ * ```
28
+ */
29
+
30
+ import { html } from "lit";
31
+ import { property } from "lit/decorators.js";
32
+ import { DSElement } from "../../base/ds-element.js";
33
+ import { emitEvent } from "../../events/emit.js";
34
+ import { define } from "../../registry/define.js";
35
+
36
+ // Import child components
37
+ import "./stepper-item.js";
38
+ import "./stepper-trigger.js";
39
+ import "./stepper-indicator.js";
40
+ import "./stepper-title.js";
41
+ import "./stepper-description.js";
42
+ import "./stepper-separator.js";
43
+ import "./stepper-content.js";
44
+
45
+ export type StepperOrientation = "horizontal" | "vertical";
46
+
47
+ export class DsStepper extends DSElement {
48
+ /** Current step value */
49
+ @property({ type: Number, reflect: true })
50
+ value = 1;
51
+
52
+ /** Orientation */
53
+ @property({ type: String, reflect: true })
54
+ orientation: StepperOrientation = "horizontal";
55
+
56
+ /** Whether steps are linear (must complete in order) */
57
+ @property({ type: Boolean })
58
+ linear = false;
59
+
60
+ /**
61
+ * Accessible label for the stepper.
62
+ * Per APG, the stepper should have a clear label describing its purpose.
63
+ */
64
+ @property({ type: String, attribute: "aria-label" })
65
+ override ariaLabel = "Progress steps";
66
+
67
+ override connectedCallback(): void {
68
+ super.connectedCallback();
69
+ // Use role="list" for ordered sequence of steps per APG
70
+ // Combined with aria-current="step" on active item for process indication
71
+ this.setAttribute("role", "list");
72
+ this.setAttribute("aria-label", this.ariaLabel);
73
+
74
+ this.addEventListener("ds:step-select", this.handleStepSelect as EventListener);
75
+ }
76
+
77
+ override disconnectedCallback(): void {
78
+ super.disconnectedCallback();
79
+ this.removeEventListener("ds:step-select", this.handleStepSelect as EventListener);
80
+ }
81
+
82
+ /**
83
+ * Go to a specific step.
84
+ */
85
+ public goToStep(step: number): void {
86
+ if (this.linear) {
87
+ // In linear mode, can only go to completed steps or next step
88
+ const items = this.querySelectorAll("ds-stepper-item");
89
+ let maxAllowed = 1;
90
+
91
+ for (const item of items) {
92
+ const itemStep = Number(item.getAttribute("step"));
93
+ if (item.hasAttribute("completed") || itemStep === this.value) {
94
+ maxAllowed = Math.max(maxAllowed, itemStep + 1);
95
+ }
96
+ }
97
+
98
+ if (step > maxAllowed) return;
99
+ }
100
+
101
+ if (step !== this.value) {
102
+ this.value = step;
103
+ this.updateActiveState();
104
+
105
+ emitEvent(this, "ds:step-change", {
106
+ detail: { step: this.value },
107
+ bubbles: true,
108
+ });
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Go to next step.
114
+ */
115
+ public nextStep(): void {
116
+ this.goToStep(this.value + 1);
117
+ }
118
+
119
+ /**
120
+ * Go to previous step.
121
+ */
122
+ public previousStep(): void {
123
+ this.goToStep(this.value - 1);
124
+ }
125
+
126
+ private handleStepSelect = (event: CustomEvent<{ step: number }>): void => {
127
+ event.stopPropagation();
128
+ this.goToStep(event.detail.step);
129
+ };
130
+
131
+ private updateActiveState(): void {
132
+ const items = this.querySelectorAll("ds-stepper-item");
133
+
134
+ for (const item of items) {
135
+ const step = Number(item.getAttribute("step"));
136
+
137
+ if (step === this.value) {
138
+ item.setAttribute("data-state", "active");
139
+ } else if (step < this.value || item.hasAttribute("completed")) {
140
+ item.setAttribute("data-state", "completed");
141
+ } else {
142
+ item.setAttribute("data-state", "pending");
143
+ }
144
+ }
145
+ }
146
+
147
+ override updated(changedProperties: Map<string, unknown>): void {
148
+ if (changedProperties.has("value")) {
149
+ this.updateActiveState();
150
+ }
151
+ }
152
+
153
+ override render() {
154
+ return html`<slot></slot>`;
155
+ }
156
+ }
157
+
158
+ define("ds-stepper", DsStepper);
159
+
160
+ declare global {
161
+ interface HTMLElementTagNameMap {
162
+ "ds-stepper": DsStepper;
163
+ }
164
+ }