@hypoth-ui/cli 0.0.1 → 0.1.1

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,36 @@
1
+ "use client";
2
+
3
+ import { type HTMLAttributes, type ReactNode, createElement, forwardRef } from "react";
4
+ import "@hypoth-ui/wc";
5
+
6
+ export interface TableRowProps extends HTMLAttributes<HTMLElement> {
7
+ /**
8
+ * Row ID for selection tracking.
9
+ */
10
+ rowId?: string;
11
+
12
+ /**
13
+ * Whether this row is selected.
14
+ * @default false
15
+ */
16
+ selected?: boolean;
17
+
18
+ /**
19
+ * Row cells.
20
+ */
21
+ children?: ReactNode;
22
+ }
23
+
24
+ /**
25
+ * Table row component (tr).
26
+ */
27
+ export const TableRow = forwardRef<HTMLElement, TableRowProps>(function TableRow(
28
+ { rowId, selected = false, children, className, ...props },
29
+ ref
30
+ ) {
31
+ return createElement(
32
+ "ds-table-row",
33
+ { ref, "row-id": rowId, selected: selected || undefined, class: className, ...props },
34
+ children
35
+ );
36
+ });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Table component exports
3
+ */
4
+ export { DsTable, type TableSize } from "./table.js";
5
+ export { DsTableHeader } from "./table-header.js";
6
+ export { DsTableBody } from "./table-body.js";
7
+ export { DsTableRow } from "./table-row.js";
8
+ export { DsTableHead, type TableAlign, type SortDirection } from "./table-head.js";
9
+ export { DsTableCell } from "./table-cell.js";
@@ -0,0 +1,32 @@
1
+ import { type TemplateResult, html } from "lit";
2
+ import { DSElement } from "../../base/ds-element.js";
3
+ import { define } from "../../registry/define.js";
4
+
5
+ /**
6
+ * Table body component (tbody).
7
+ *
8
+ * @element ds-table-body
9
+ *
10
+ * @slot - TableRow elements for body
11
+ */
12
+ export class DsTableBody extends DSElement {
13
+ static override styles = [];
14
+
15
+ override render(): TemplateResult {
16
+ return html`
17
+ <tbody class="ds-table__body" role="rowgroup">
18
+ <slot></slot>
19
+ </tbody>
20
+ `;
21
+ }
22
+ }
23
+
24
+ // Register the component
25
+ define("ds-table-body", DsTableBody);
26
+
27
+ // TypeScript declaration for HTML
28
+ declare global {
29
+ interface HTMLElementTagNameMap {
30
+ "ds-table-body": DsTableBody;
31
+ }
32
+ }
@@ -0,0 +1,58 @@
1
+ import { type TemplateResult, html, nothing } from "lit";
2
+ import { property } from "lit/decorators.js";
3
+ import { DSElement } from "../../base/ds-element.js";
4
+ import { define } from "../../registry/define.js";
5
+ import type { TableAlign } from "./table-head.js";
6
+
7
+ /**
8
+ * Table cell component (td).
9
+ *
10
+ * @element ds-table-cell
11
+ *
12
+ * @slot - Cell content
13
+ */
14
+ export class DsTableCell extends DSElement {
15
+ static override styles = [];
16
+
17
+ /**
18
+ * Text alignment.
19
+ */
20
+ @property({ type: String, reflect: true })
21
+ align: TableAlign = "left";
22
+
23
+ /**
24
+ * Column span.
25
+ */
26
+ @property({ type: Number })
27
+ colspan = 1;
28
+
29
+ /**
30
+ * Row span.
31
+ */
32
+ @property({ type: Number })
33
+ rowspan = 1;
34
+
35
+ override render(): TemplateResult {
36
+ return html`
37
+ <td
38
+ class="ds-table__cell"
39
+ role="gridcell"
40
+ data-align=${this.align !== "left" ? this.align : nothing}
41
+ colspan=${this.colspan > 1 ? this.colspan : nothing}
42
+ rowspan=${this.rowspan > 1 ? this.rowspan : nothing}
43
+ >
44
+ <slot></slot>
45
+ </td>
46
+ `;
47
+ }
48
+ }
49
+
50
+ // Register the component
51
+ define("ds-table-cell", DsTableCell);
52
+
53
+ // TypeScript declaration for HTML
54
+ declare global {
55
+ interface HTMLElementTagNameMap {
56
+ "ds-table-cell": DsTableCell;
57
+ }
58
+ }
@@ -0,0 +1,129 @@
1
+ import { type TemplateResult, html, nothing } from "lit";
2
+ import { property } from "lit/decorators.js";
3
+ import { DSElement } from "../../base/ds-element.js";
4
+ import { emitEvent } from "../../events/emit.js";
5
+ import { define } from "../../registry/define.js";
6
+
7
+ export type TableAlign = "left" | "center" | "right";
8
+ export type SortDirection = "asc" | "desc" | "none";
9
+
10
+ // Sort icon SVG
11
+ const sortIcon = html`
12
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
13
+ <path d="M12 5v14M5 12l7-7 7 7" />
14
+ </svg>
15
+ `;
16
+
17
+ /**
18
+ * Table header cell component (th).
19
+ *
20
+ * @element ds-table-head
21
+ *
22
+ * @slot - Header content
23
+ *
24
+ * @fires ds-sort - When sortable header is clicked
25
+ */
26
+ export class DsTableHead extends DSElement {
27
+ static override styles = [];
28
+
29
+ /**
30
+ * Column key for sorting.
31
+ */
32
+ @property({ type: String })
33
+ column = "";
34
+
35
+ /**
36
+ * Text alignment.
37
+ */
38
+ @property({ type: String, reflect: true })
39
+ align: TableAlign = "left";
40
+
41
+ /**
42
+ * Whether this column is sortable.
43
+ */
44
+ @property({ type: Boolean, reflect: true })
45
+ sortable = false;
46
+
47
+ /**
48
+ * Current sort direction.
49
+ */
50
+ @property({ type: String, attribute: "sort-direction", reflect: true })
51
+ sortDirection: SortDirection = "none";
52
+
53
+ /**
54
+ * Column width (CSS value).
55
+ */
56
+ @property({ type: String })
57
+ width = "";
58
+
59
+ private handleClick(): void {
60
+ if (!this.sortable) return;
61
+
62
+ emitEvent(this, "sort", {
63
+ detail: {
64
+ column: this.column,
65
+ direction: this.getNextDirection(),
66
+ },
67
+ });
68
+ }
69
+
70
+ private handleKeyDown(event: KeyboardEvent): void {
71
+ if (!this.sortable) return;
72
+ if (event.key === "Enter" || event.key === " ") {
73
+ event.preventDefault();
74
+ this.handleClick();
75
+ }
76
+ }
77
+
78
+ private getNextDirection(): SortDirection {
79
+ if (this.sortDirection === "none") return "asc";
80
+ if (this.sortDirection === "asc") return "desc";
81
+ return "none";
82
+ }
83
+
84
+ /**
85
+ * Get the aria-sort attribute value.
86
+ * Per APG, sortable columns should always have aria-sort:
87
+ * - "ascending" for A-Z or low-high sort
88
+ * - "descending" for Z-A or high-low sort
89
+ * - "none" when sortable but not currently sorted
90
+ */
91
+ private getAriaSort(): "ascending" | "descending" | "none" {
92
+ if (this.sortDirection === "asc") return "ascending";
93
+ if (this.sortDirection === "desc") return "descending";
94
+ return "none";
95
+ }
96
+
97
+ override render(): TemplateResult {
98
+ const style = this.width ? `width: ${this.width}` : "";
99
+
100
+ return html`
101
+ <th
102
+ class="ds-table__head"
103
+ role="columnheader"
104
+ scope="col"
105
+ data-align=${this.align !== "left" ? this.align : nothing}
106
+ ?data-sortable=${this.sortable}
107
+ data-sort-direction=${this.sortable ? this.sortDirection : nothing}
108
+ aria-sort=${this.sortable ? this.getAriaSort() : nothing}
109
+ tabindex=${this.sortable ? 0 : nothing}
110
+ style=${style || nothing}
111
+ @click=${this.handleClick}
112
+ @keydown=${this.handleKeyDown}
113
+ >
114
+ <slot></slot>
115
+ ${this.sortable ? html`<span class="ds-table__sort-icon">${sortIcon}</span>` : nothing}
116
+ </th>
117
+ `;
118
+ }
119
+ }
120
+
121
+ // Register the component
122
+ define("ds-table-head", DsTableHead);
123
+
124
+ // TypeScript declaration for HTML
125
+ declare global {
126
+ interface HTMLElementTagNameMap {
127
+ "ds-table-head": DsTableHead;
128
+ }
129
+ }
@@ -0,0 +1,32 @@
1
+ import { type TemplateResult, html } from "lit";
2
+ import { DSElement } from "../../base/ds-element.js";
3
+ import { define } from "../../registry/define.js";
4
+
5
+ /**
6
+ * Table header component (thead).
7
+ *
8
+ * @element ds-table-header
9
+ *
10
+ * @slot - TableRow elements for header
11
+ */
12
+ export class DsTableHeader extends DSElement {
13
+ static override styles = [];
14
+
15
+ override render(): TemplateResult {
16
+ return html`
17
+ <thead class="ds-table__header" role="rowgroup">
18
+ <slot></slot>
19
+ </thead>
20
+ `;
21
+ }
22
+ }
23
+
24
+ // Register the component
25
+ define("ds-table-header", DsTableHeader);
26
+
27
+ // TypeScript declaration for HTML
28
+ declare global {
29
+ interface HTMLElementTagNameMap {
30
+ "ds-table-header": DsTableHeader;
31
+ }
32
+ }
@@ -0,0 +1,50 @@
1
+ import { type TemplateResult, html, nothing } from "lit";
2
+ import { property } from "lit/decorators.js";
3
+ import { DSElement } from "../../base/ds-element.js";
4
+ import { define } from "../../registry/define.js";
5
+
6
+ /**
7
+ * Table row component (tr).
8
+ *
9
+ * @element ds-table-row
10
+ *
11
+ * @slot - TableHead or TableCell elements
12
+ */
13
+ export class DsTableRow extends DSElement {
14
+ static override styles = [];
15
+
16
+ /**
17
+ * Row ID for selection tracking.
18
+ */
19
+ @property({ type: String, attribute: "row-id" })
20
+ rowId = "";
21
+
22
+ /**
23
+ * Whether this row is selected.
24
+ */
25
+ @property({ type: Boolean, reflect: true })
26
+ selected = false;
27
+
28
+ override render(): TemplateResult {
29
+ return html`
30
+ <tr
31
+ class="ds-table__row"
32
+ role="row"
33
+ ?data-selected=${this.selected}
34
+ aria-selected=${this.selected ? "true" : nothing}
35
+ >
36
+ <slot></slot>
37
+ </tr>
38
+ `;
39
+ }
40
+ }
41
+
42
+ // Register the component
43
+ define("ds-table-row", DsTableRow);
44
+
45
+ // TypeScript declaration for HTML
46
+ declare global {
47
+ interface HTMLElementTagNameMap {
48
+ "ds-table-row": DsTableRow;
49
+ }
50
+ }
@@ -0,0 +1,93 @@
1
+ import { type TemplateResult, html, nothing } from "lit";
2
+ import { property } from "lit/decorators.js";
3
+ import { classMap } from "lit/directives/class-map.js";
4
+ import { DSElement } from "../../base/ds-element.js";
5
+ import { define } from "../../registry/define.js";
6
+
7
+ export type TableSize = "compact" | "default" | "spacious";
8
+
9
+ /**
10
+ * Table root component.
11
+ *
12
+ * @element ds-table
13
+ *
14
+ * @slot - Table content (thead, tbody, tfoot)
15
+ *
16
+ * @cssprop --ds-table-border - Border style
17
+ * @cssprop --ds-table-radius - Border radius
18
+ * @cssprop --ds-table-bg - Background color
19
+ */
20
+ export class DsTable extends DSElement {
21
+ static override styles = [];
22
+
23
+ /**
24
+ * Size variant.
25
+ */
26
+ @property({ type: String, reflect: true })
27
+ size: TableSize = "default";
28
+
29
+ /**
30
+ * Whether to show striped rows.
31
+ */
32
+ @property({ type: Boolean, reflect: true })
33
+ striped = false;
34
+
35
+ /**
36
+ * Whether to remove borders.
37
+ */
38
+ @property({ type: Boolean, reflect: true })
39
+ borderless = false;
40
+
41
+ /**
42
+ * Whether to use fixed layout.
43
+ */
44
+ @property({ type: Boolean, reflect: true })
45
+ fixed = false;
46
+
47
+ /**
48
+ * Whether header is sticky.
49
+ */
50
+ @property({ type: Boolean, attribute: "sticky-header", reflect: true })
51
+ stickyHeader = false;
52
+
53
+ /**
54
+ * Accessible caption for screen readers.
55
+ */
56
+ @property({ type: String })
57
+ caption = "";
58
+
59
+ override render(): TemplateResult {
60
+ const classes = {
61
+ "ds-table": true,
62
+ };
63
+
64
+ return html`
65
+ <table
66
+ class=${classMap(classes)}
67
+ role="grid"
68
+ data-size=${this.size !== "default" ? this.size : nothing}
69
+ ?data-striped=${this.striped}
70
+ ?data-borderless=${this.borderless}
71
+ ?data-fixed=${this.fixed}
72
+ ?data-sticky-header=${this.stickyHeader}
73
+ >
74
+ ${
75
+ this.caption
76
+ ? html`<caption class="ds-table__caption">${this.caption}</caption>`
77
+ : nothing
78
+ }
79
+ <slot></slot>
80
+ </table>
81
+ `;
82
+ }
83
+ }
84
+
85
+ // Register the component
86
+ define("ds-table", DsTable);
87
+
88
+ // TypeScript declaration for HTML
89
+ declare global {
90
+ interface HTMLElementTagNameMap {
91
+ "ds-table": DsTable;
92
+ }
93
+ }
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Tabs compound component exports.
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { Tabs } from "@/components/ui";
7
+ *
8
+ * <Tabs.Root defaultValue="tab1">
9
+ * <Tabs.List>
10
+ * <Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
11
+ * <Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
12
+ * </Tabs.List>
13
+ * <Tabs.Content value="tab1">Content 1</Tabs.Content>
14
+ * <Tabs.Content value="tab2">Content 2</Tabs.Content>
15
+ * </Tabs.Root>
16
+ * ```
17
+ */
18
+
19
+ import {
20
+ type HTMLAttributes,
21
+ type ReactNode,
22
+ createElement,
23
+ forwardRef,
24
+ useCallback,
25
+ useEffect,
26
+ useRef,
27
+ useState,
28
+ } from "react";
29
+
30
+ // ============================================================================
31
+ // Types
32
+ // ============================================================================
33
+
34
+ export type TabsOrientation = "horizontal" | "vertical";
35
+ export type TabsActivationMode = "automatic" | "manual";
36
+
37
+ export interface TabsRootProps extends HTMLAttributes<HTMLElement> {
38
+ /** Content */
39
+ children?: ReactNode;
40
+ /** Controlled value */
41
+ value?: string;
42
+ /** Default value (uncontrolled) */
43
+ defaultValue?: string;
44
+ /** Called when value changes */
45
+ onValueChange?: (value: string) => void;
46
+ /** Keyboard navigation orientation */
47
+ orientation?: TabsOrientation;
48
+ /** Activation mode */
49
+ activationMode?: TabsActivationMode;
50
+ }
51
+
52
+ export interface TabsListProps extends HTMLAttributes<HTMLElement> {
53
+ /** Content */
54
+ children?: ReactNode;
55
+ /** Loop focus at ends */
56
+ loop?: boolean;
57
+ }
58
+
59
+ export interface TabsTriggerProps extends HTMLAttributes<HTMLElement> {
60
+ /** Content */
61
+ children?: ReactNode;
62
+ /** Unique value identifying this tab */
63
+ value: string;
64
+ /** Disable this tab */
65
+ disabled?: boolean;
66
+ }
67
+
68
+ export interface TabsContentProps extends HTMLAttributes<HTMLElement> {
69
+ /** Content */
70
+ children?: ReactNode;
71
+ /** Value of associated tab */
72
+ value: string;
73
+ /** Keep mounted when inactive */
74
+ forceMount?: boolean;
75
+ }
76
+
77
+ // ============================================================================
78
+ // Components
79
+ // ============================================================================
80
+
81
+ /**
82
+ * Tabs root component.
83
+ */
84
+ const TabsRoot = forwardRef<HTMLElement, TabsRootProps>(function TabsRoot(
85
+ {
86
+ children,
87
+ className,
88
+ value: controlledValue,
89
+ defaultValue,
90
+ onValueChange,
91
+ orientation = "horizontal",
92
+ activationMode = "automatic",
93
+ ...props
94
+ },
95
+ ref
96
+ ) {
97
+ const [internalValue, setInternalValue] = useState(defaultValue);
98
+ const isControlled = controlledValue !== undefined;
99
+ const value = isControlled ? controlledValue : internalValue;
100
+ const elementRef = useRef<HTMLElement>(null);
101
+
102
+ // Combine refs
103
+ const combinedRef = (node: HTMLElement | null) => {
104
+ (elementRef as React.MutableRefObject<HTMLElement | null>).current = node;
105
+ if (typeof ref === "function") {
106
+ ref(node);
107
+ } else if (ref) {
108
+ (ref as React.MutableRefObject<HTMLElement | null>).current = node;
109
+ }
110
+ };
111
+
112
+ const handleChange = useCallback(
113
+ (event: Event) => {
114
+ const customEvent = event as CustomEvent<{ value: string }>;
115
+ const newValue = customEvent.detail.value;
116
+
117
+ if (!isControlled) {
118
+ setInternalValue(newValue);
119
+ }
120
+ onValueChange?.(newValue);
121
+ },
122
+ [isControlled, onValueChange]
123
+ );
124
+
125
+ // Attach event listeners
126
+ useEffect(() => {
127
+ const element = elementRef.current;
128
+ if (!element) return;
129
+
130
+ element.addEventListener("ds:change", handleChange);
131
+
132
+ return () => {
133
+ element.removeEventListener("ds:change", handleChange);
134
+ };
135
+ }, [handleChange]);
136
+
137
+ return createElement(
138
+ "ds-tabs",
139
+ {
140
+ ref: combinedRef,
141
+ class: className,
142
+ value: isControlled ? value : undefined,
143
+ "default-value": !isControlled ? defaultValue : undefined,
144
+ orientation,
145
+ "activation-mode": activationMode,
146
+ ...props,
147
+ },
148
+ children
149
+ );
150
+ });
151
+ TabsRoot.displayName = "Tabs.Root";
152
+
153
+ /**
154
+ * Tabs list component.
155
+ */
156
+ const TabsList = forwardRef<HTMLElement, TabsListProps>(function TabsList(
157
+ { children, className, loop = true, ...props },
158
+ ref
159
+ ) {
160
+ return createElement(
161
+ "ds-tabs-list",
162
+ { ref, class: className, loop: loop || undefined, ...props },
163
+ children
164
+ );
165
+ });
166
+ TabsList.displayName = "Tabs.List";
167
+
168
+ /**
169
+ * Tabs trigger component.
170
+ */
171
+ const TabsTrigger = forwardRef<HTMLElement, TabsTriggerProps>(function TabsTrigger(
172
+ { children, className, value, disabled = false, ...props },
173
+ ref
174
+ ) {
175
+ return createElement(
176
+ "ds-tabs-trigger",
177
+ {
178
+ ref,
179
+ class: className,
180
+ value,
181
+ disabled: disabled || undefined,
182
+ ...props,
183
+ },
184
+ children
185
+ );
186
+ });
187
+ TabsTrigger.displayName = "Tabs.Trigger";
188
+
189
+ /**
190
+ * Tabs content component.
191
+ */
192
+ const TabsContent = forwardRef<HTMLElement, TabsContentProps>(function TabsContent(
193
+ { children, className, value, forceMount = false, ...props },
194
+ ref
195
+ ) {
196
+ return createElement(
197
+ "ds-tabs-content",
198
+ {
199
+ ref,
200
+ class: className,
201
+ value,
202
+ "force-mount": forceMount || undefined,
203
+ ...props,
204
+ },
205
+ children
206
+ );
207
+ });
208
+ TabsContent.displayName = "Tabs.Content";
209
+
210
+ // ============================================================================
211
+ // Compound Component
212
+ // ============================================================================
213
+
214
+ export const Tabs = {
215
+ Root: TabsRoot,
216
+ List: TabsList,
217
+ Trigger: TabsTrigger,
218
+ Content: TabsContent,
219
+ };
220
+
221
+ // Also export individual components
222
+ export { TabsRoot, TabsList, TabsTrigger, TabsContent };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tabs component barrel exports.
3
+ */
4
+
5
+ export { DsTabs, type TabsOrientation, type TabsActivationMode } from "./tabs.js";
6
+ export { DsTabsList } from "./tabs-list.js";
7
+ export { DsTabsTrigger } from "./tabs-trigger.js";
8
+ export { DsTabsContent } from "./tabs-content.js";