@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,157 @@
1
+ /**
2
+ * Breadcrumb compound component exports.
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { Breadcrumb } from "@/components/ui";
7
+ *
8
+ * <Breadcrumb.Root>
9
+ * <Breadcrumb.List>
10
+ * <Breadcrumb.Item>
11
+ * <Breadcrumb.Link href="/">Home</Breadcrumb.Link>
12
+ * </Breadcrumb.Item>
13
+ * <Breadcrumb.Separator />
14
+ * <Breadcrumb.Item>
15
+ * <Breadcrumb.Page>Current</Breadcrumb.Page>
16
+ * </Breadcrumb.Item>
17
+ * </Breadcrumb.List>
18
+ * </Breadcrumb.Root>
19
+ * ```
20
+ */
21
+
22
+ import {
23
+ type HTMLAttributes,
24
+ type ReactNode,
25
+ createElement,
26
+ forwardRef,
27
+ useEffect,
28
+ useRef,
29
+ } from "react";
30
+
31
+ // ============================================================================
32
+ // Types
33
+ // ============================================================================
34
+
35
+ export interface BreadcrumbRootProps extends HTMLAttributes<HTMLElement> {
36
+ children?: ReactNode;
37
+ }
38
+
39
+ export interface BreadcrumbListProps extends HTMLAttributes<HTMLElement> {
40
+ children?: ReactNode;
41
+ }
42
+
43
+ export interface BreadcrumbItemProps extends HTMLAttributes<HTMLElement> {
44
+ children?: ReactNode;
45
+ }
46
+
47
+ export interface BreadcrumbLinkProps extends HTMLAttributes<HTMLElement> {
48
+ children?: ReactNode;
49
+ href?: string;
50
+ onNavigate?: (href: string) => void;
51
+ }
52
+
53
+ export interface BreadcrumbPageProps extends HTMLAttributes<HTMLElement> {
54
+ children?: ReactNode;
55
+ }
56
+
57
+ export interface BreadcrumbSeparatorProps extends HTMLAttributes<HTMLElement> {
58
+ children?: ReactNode;
59
+ }
60
+
61
+ // ============================================================================
62
+ // Components
63
+ // ============================================================================
64
+
65
+ const BreadcrumbRoot = forwardRef<HTMLElement, BreadcrumbRootProps>(function BreadcrumbRoot(
66
+ { children, className, ...props },
67
+ ref
68
+ ) {
69
+ return createElement("ds-breadcrumb", { ref, class: className, ...props }, children);
70
+ });
71
+ BreadcrumbRoot.displayName = "Breadcrumb.Root";
72
+
73
+ const BreadcrumbList = forwardRef<HTMLElement, BreadcrumbListProps>(function BreadcrumbList(
74
+ { children, className, ...props },
75
+ ref
76
+ ) {
77
+ return createElement("ds-breadcrumb-list", { ref, class: className, ...props }, children);
78
+ });
79
+ BreadcrumbList.displayName = "Breadcrumb.List";
80
+
81
+ const BreadcrumbItem = forwardRef<HTMLElement, BreadcrumbItemProps>(function BreadcrumbItem(
82
+ { children, className, ...props },
83
+ ref
84
+ ) {
85
+ return createElement("ds-breadcrumb-item", { ref, class: className, ...props }, children);
86
+ });
87
+ BreadcrumbItem.displayName = "Breadcrumb.Item";
88
+
89
+ const BreadcrumbLink = forwardRef<HTMLElement, BreadcrumbLinkProps>(function BreadcrumbLink(
90
+ { children, className, href, onNavigate, ...props },
91
+ ref
92
+ ) {
93
+ const elementRef = useRef<HTMLElement>(null);
94
+
95
+ const combinedRef = (node: HTMLElement | null) => {
96
+ (elementRef as React.MutableRefObject<HTMLElement | null>).current = node;
97
+ if (typeof ref === "function") ref(node);
98
+ else if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = node;
99
+ };
100
+
101
+ useEffect(() => {
102
+ const element = elementRef.current;
103
+ if (!element || !onNavigate) return;
104
+
105
+ const handleNavigate = (event: Event) => {
106
+ event.preventDefault();
107
+ const e = event as CustomEvent<{ href: string }>;
108
+ onNavigate(e.detail.href);
109
+ };
110
+ element.addEventListener("ds:navigate", handleNavigate);
111
+ return () => element.removeEventListener("ds:navigate", handleNavigate);
112
+ }, [onNavigate]);
113
+
114
+ return createElement(
115
+ "ds-breadcrumb-link",
116
+ { ref: combinedRef, class: className, href, ...props },
117
+ children
118
+ );
119
+ });
120
+ BreadcrumbLink.displayName = "Breadcrumb.Link";
121
+
122
+ const BreadcrumbPage = forwardRef<HTMLElement, BreadcrumbPageProps>(function BreadcrumbPage(
123
+ { children, className, ...props },
124
+ ref
125
+ ) {
126
+ return createElement("ds-breadcrumb-page", { ref, class: className, ...props }, children);
127
+ });
128
+ BreadcrumbPage.displayName = "Breadcrumb.Page";
129
+
130
+ const BreadcrumbSeparator = forwardRef<HTMLElement, BreadcrumbSeparatorProps>(
131
+ function BreadcrumbSeparator({ children, className, ...props }, ref) {
132
+ return createElement("ds-breadcrumb-separator", { ref, class: className, ...props }, children);
133
+ }
134
+ );
135
+ BreadcrumbSeparator.displayName = "Breadcrumb.Separator";
136
+
137
+ // ============================================================================
138
+ // Compound Component
139
+ // ============================================================================
140
+
141
+ export const Breadcrumb = {
142
+ Root: BreadcrumbRoot,
143
+ List: BreadcrumbList,
144
+ Item: BreadcrumbItem,
145
+ Link: BreadcrumbLink,
146
+ Page: BreadcrumbPage,
147
+ Separator: BreadcrumbSeparator,
148
+ };
149
+
150
+ export {
151
+ BreadcrumbRoot,
152
+ BreadcrumbList,
153
+ BreadcrumbItem,
154
+ BreadcrumbLink,
155
+ BreadcrumbPage,
156
+ BreadcrumbSeparator,
157
+ };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * BreadcrumbItem component - individual breadcrumb item.
3
+ *
4
+ * @element ds-breadcrumb-item
5
+ *
6
+ * @slot - Link or page 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 DsBreadcrumbItem extends DSElement {
14
+ override connectedCallback(): void {
15
+ super.connectedCallback();
16
+ this.setAttribute("role", "listitem");
17
+ }
18
+
19
+ override render() {
20
+ return html`<slot></slot>`;
21
+ }
22
+ }
23
+
24
+ define("ds-breadcrumb-item", DsBreadcrumbItem);
25
+
26
+ declare global {
27
+ interface HTMLElementTagNameMap {
28
+ "ds-breadcrumb-item": DsBreadcrumbItem;
29
+ }
30
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * BreadcrumbLink component - navigable breadcrumb link.
3
+ *
4
+ * @element ds-breadcrumb-link
5
+ *
6
+ * @slot - Link content
7
+ *
8
+ * @fires ds:navigate - Fired when link is clicked (for SPA navigation)
9
+ */
10
+
11
+ import { html } from "lit";
12
+ import { property } from "lit/decorators.js";
13
+ import { DSElement } from "../../base/ds-element.js";
14
+ import { emitEvent } from "../../events/emit.js";
15
+ import { define } from "../../registry/define.js";
16
+
17
+ export class DsBreadcrumbLink extends DSElement {
18
+ /** URL to navigate to */
19
+ @property({ type: String, reflect: true })
20
+ href = "";
21
+
22
+ override connectedCallback(): void {
23
+ super.connectedCallback();
24
+ this.setAttribute("tabindex", "0");
25
+
26
+ this.addEventListener("click", this.handleClick);
27
+ this.addEventListener("keydown", this.handleKeyDown);
28
+ }
29
+
30
+ override disconnectedCallback(): void {
31
+ super.disconnectedCallback();
32
+ this.removeEventListener("click", this.handleClick);
33
+ this.removeEventListener("keydown", this.handleKeyDown);
34
+ }
35
+
36
+ private handleClick = (event: MouseEvent): void => {
37
+ const navigateEvent = emitEvent(this, "ds:navigate", {
38
+ detail: { href: this.href },
39
+ bubbles: true,
40
+ cancelable: true,
41
+ });
42
+
43
+ if (!navigateEvent.defaultPrevented && this.href) {
44
+ if (event.ctrlKey || event.metaKey) {
45
+ window.open(this.href, "_blank");
46
+ } else {
47
+ window.location.href = this.href;
48
+ }
49
+ }
50
+ };
51
+
52
+ private handleKeyDown = (event: KeyboardEvent): void => {
53
+ if (event.key === "Enter") {
54
+ event.preventDefault();
55
+ this.handleClick(new MouseEvent("click"));
56
+ }
57
+ };
58
+
59
+ override render() {
60
+ return html`<slot></slot>`;
61
+ }
62
+ }
63
+
64
+ define("ds-breadcrumb-link", DsBreadcrumbLink);
65
+
66
+ declare global {
67
+ interface HTMLElementTagNameMap {
68
+ "ds-breadcrumb-link": DsBreadcrumbLink;
69
+ }
70
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * BreadcrumbList component - ordered list container.
3
+ *
4
+ * @element ds-breadcrumb-list
5
+ *
6
+ * @slot - Breadcrumb items and separators
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 DsBreadcrumbList extends DSElement {
14
+ override connectedCallback(): void {
15
+ super.connectedCallback();
16
+ this.setAttribute("role", "list");
17
+ }
18
+
19
+ override render() {
20
+ return html`<slot></slot>`;
21
+ }
22
+ }
23
+
24
+ define("ds-breadcrumb-list", DsBreadcrumbList);
25
+
26
+ declare global {
27
+ interface HTMLElementTagNameMap {
28
+ "ds-breadcrumb-list": DsBreadcrumbList;
29
+ }
30
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * BreadcrumbPage component - current page (non-navigable).
3
+ *
4
+ * @element ds-breadcrumb-page
5
+ *
6
+ * @slot - Page 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 DsBreadcrumbPage extends DSElement {
14
+ override connectedCallback(): void {
15
+ super.connectedCallback();
16
+ this.setAttribute("role", "link");
17
+ this.setAttribute("aria-current", "page");
18
+ this.setAttribute("aria-disabled", "true");
19
+ }
20
+
21
+ override render() {
22
+ return html`<slot></slot>`;
23
+ }
24
+ }
25
+
26
+ define("ds-breadcrumb-page", DsBreadcrumbPage);
27
+
28
+ declare global {
29
+ interface HTMLElementTagNameMap {
30
+ "ds-breadcrumb-page": DsBreadcrumbPage;
31
+ }
32
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * BreadcrumbSeparator component - visual separator between items.
3
+ *
4
+ * @element ds-breadcrumb-separator
5
+ *
6
+ * @slot - Separator content (defaults to /)
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 DsBreadcrumbSeparator extends DSElement {
14
+ override connectedCallback(): void {
15
+ super.connectedCallback();
16
+ this.setAttribute("role", "presentation");
17
+ this.setAttribute("aria-hidden", "true");
18
+ }
19
+
20
+ override render() {
21
+ return html`<slot>/</slot>`;
22
+ }
23
+ }
24
+
25
+ define("ds-breadcrumb-separator", DsBreadcrumbSeparator);
26
+
27
+ declare global {
28
+ interface HTMLElementTagNameMap {
29
+ "ds-breadcrumb-separator": DsBreadcrumbSeparator;
30
+ }
31
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Breadcrumb component - navigation trail.
3
+ *
4
+ * Shows the current page location within a navigational hierarchy.
5
+ *
6
+ * @element ds-breadcrumb
7
+ *
8
+ * @slot - Breadcrumb list
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <ds-breadcrumb>
13
+ * <ds-breadcrumb-list>
14
+ * <ds-breadcrumb-item>
15
+ * <ds-breadcrumb-link href="/">Home</ds-breadcrumb-link>
16
+ * </ds-breadcrumb-item>
17
+ * <ds-breadcrumb-separator>/</ds-breadcrumb-separator>
18
+ * <ds-breadcrumb-item>
19
+ * <ds-breadcrumb-page>Current</ds-breadcrumb-page>
20
+ * </ds-breadcrumb-item>
21
+ * </ds-breadcrumb-list>
22
+ * </ds-breadcrumb>
23
+ * ```
24
+ */
25
+
26
+ import { html } from "lit";
27
+ import { DSElement } from "../../base/ds-element.js";
28
+ import { define } from "../../registry/define.js";
29
+
30
+ // Import child components
31
+ import "./breadcrumb-list.js";
32
+ import "./breadcrumb-item.js";
33
+ import "./breadcrumb-link.js";
34
+ import "./breadcrumb-page.js";
35
+ import "./breadcrumb-separator.js";
36
+
37
+ export class DsBreadcrumb extends DSElement {
38
+ override connectedCallback(): void {
39
+ super.connectedCallback();
40
+ this.setAttribute("role", "navigation");
41
+ this.setAttribute("aria-label", "Breadcrumb");
42
+ }
43
+
44
+ override render() {
45
+ return html`<slot></slot>`;
46
+ }
47
+ }
48
+
49
+ define("ds-breadcrumb", DsBreadcrumb);
50
+
51
+ declare global {
52
+ interface HTMLElementTagNameMap {
53
+ "ds-breadcrumb": DsBreadcrumb;
54
+ }
55
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Breadcrumb component exports.
3
+ */
4
+
5
+ export { DsBreadcrumb } from "./breadcrumb.js";
6
+ export { DsBreadcrumbList } from "./breadcrumb-list.js";
7
+ export { DsBreadcrumbItem } from "./breadcrumb-item.js";
8
+ export { DsBreadcrumbLink } from "./breadcrumb-link.js";
9
+ export { DsBreadcrumbPage } from "./breadcrumb-page.js";
10
+ export { DsBreadcrumbSeparator } from "./breadcrumb-separator.js";
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Native React Button component using createButtonBehavior.
3
+ * Provides accessible button with loading and disabled states.
4
+ */
5
+
6
+ import { type ButtonBehaviorOptions, createButtonBehavior } from "@hypoth-ui/primitives-dom";
7
+ import {
8
+ type ButtonHTMLAttributes,
9
+ type ReactNode,
10
+ forwardRef,
11
+ useCallback,
12
+ useEffect,
13
+ useMemo,
14
+ } from "react";
15
+ import { Slot } from "../../primitives/slot.js";
16
+
17
+ export interface ButtonProps
18
+ extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "disabled"> {
19
+ /** Button content */
20
+ children?: ReactNode;
21
+ /** Button type */
22
+ type?: "button" | "submit" | "reset";
23
+ /** Whether button is disabled */
24
+ disabled?: boolean;
25
+ /** Whether button is in loading state */
26
+ loading?: boolean;
27
+ /** Render as child element (polymorphic) */
28
+ asChild?: boolean;
29
+ /** Called when button is activated */
30
+ onPress?: () => void;
31
+ }
32
+
33
+ /**
34
+ * Accessible button component with loading and disabled states.
35
+ *
36
+ * @example
37
+ * ```tsx
38
+ * <Button onPress={() => console.log("clicked")}>Click me</Button>
39
+ *
40
+ * <Button loading>Saving...</Button>
41
+ *
42
+ * <Button asChild>
43
+ * <a href="/link">Link styled as button</a>
44
+ * </Button>
45
+ * ```
46
+ */
47
+ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
48
+ (
49
+ {
50
+ children,
51
+ type = "button",
52
+ disabled = false,
53
+ loading = false,
54
+ asChild = false,
55
+ onPress,
56
+ onClick,
57
+ onKeyDown,
58
+ ...restProps
59
+ },
60
+ ref
61
+ ) => {
62
+ // Create behavior instance - intentionally created once with initial values
63
+ // biome-ignore lint/correctness/useExhaustiveDependencies: behavior is created once, updates handled via setState
64
+ const behavior = useMemo(() => {
65
+ const options: ButtonBehaviorOptions = {
66
+ disabled,
67
+ loading,
68
+ type,
69
+ onActivate: onPress,
70
+ };
71
+ return createButtonBehavior(options);
72
+ }, []);
73
+
74
+ // Update behavior state when props change
75
+ useEffect(() => {
76
+ behavior.setState({ disabled, loading, type });
77
+ }, [behavior, disabled, loading, type]);
78
+
79
+ // Get button props from behavior
80
+ const buttonProps = behavior.getButtonProps();
81
+
82
+ // Handle keyboard events
83
+ const handleKeyDown = useCallback(
84
+ (event: React.KeyboardEvent<HTMLButtonElement>) => {
85
+ behavior.handleKeyDown(event.nativeEvent);
86
+ onKeyDown?.(event);
87
+ },
88
+ [behavior, onKeyDown]
89
+ );
90
+
91
+ // Handle click events
92
+ const handleClick = useCallback(
93
+ (event: React.MouseEvent<HTMLButtonElement>) => {
94
+ behavior.handleClick(event.nativeEvent);
95
+ onClick?.(event);
96
+ },
97
+ [behavior, onClick]
98
+ );
99
+
100
+ const Component = asChild ? Slot : "button";
101
+
102
+ return (
103
+ <Component
104
+ ref={ref}
105
+ type={asChild ? undefined : buttonProps.type}
106
+ aria-disabled={buttonProps["aria-disabled"]}
107
+ aria-busy={buttonProps["aria-busy"]}
108
+ tabIndex={buttonProps.tabIndex}
109
+ onClick={handleClick}
110
+ onKeyDown={handleKeyDown}
111
+ {...restProps}
112
+ >
113
+ {children}
114
+ </Component>
115
+ );
116
+ }
117
+ );
118
+
119
+ Button.displayName = "Button";
@@ -0,0 +1 @@
1
+ export { Button, type ButtonProps } from "./button.js";