@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,108 @@
1
+ /**
2
+ * Card compound component exports.
3
+ *
4
+ * @example
5
+ * ```tsx
6
+ * import { Card } from "@/components/ui";
7
+ *
8
+ * <Card.Root>
9
+ * <Card.Header>
10
+ * <h3>Card Title</h3>
11
+ * </Card.Header>
12
+ * <Card.Content>
13
+ * <p>Card content goes here.</p>
14
+ * </Card.Content>
15
+ * <Card.Footer>
16
+ * <Button>Action</Button>
17
+ * </Card.Footer>
18
+ * </Card.Root>
19
+ * ```
20
+ */
21
+
22
+ import { type HTMLAttributes, type ReactNode, createElement, forwardRef } from "react";
23
+
24
+ // ============================================================================
25
+ // Types
26
+ // ============================================================================
27
+
28
+ export interface CardRootProps extends HTMLAttributes<HTMLElement> {
29
+ /** Card content */
30
+ children?: ReactNode;
31
+ }
32
+
33
+ export interface CardHeaderProps extends HTMLAttributes<HTMLElement> {
34
+ /** Header content */
35
+ children?: ReactNode;
36
+ }
37
+
38
+ export interface CardContentProps extends HTMLAttributes<HTMLElement> {
39
+ /** Content */
40
+ children?: ReactNode;
41
+ }
42
+
43
+ export interface CardFooterProps extends HTMLAttributes<HTMLElement> {
44
+ /** Footer content */
45
+ children?: ReactNode;
46
+ }
47
+
48
+ // ============================================================================
49
+ // Components
50
+ // ============================================================================
51
+
52
+ /**
53
+ * Card root component - container for grouping related content.
54
+ */
55
+ const CardRoot = forwardRef<HTMLElement, CardRootProps>(function CardRoot(
56
+ { children, className, ...props },
57
+ ref
58
+ ) {
59
+ return createElement("ds-card", { ref, class: className, ...props }, children);
60
+ });
61
+ CardRoot.displayName = "Card.Root";
62
+
63
+ /**
64
+ * Card header component - header section for Card.
65
+ */
66
+ const CardHeader = forwardRef<HTMLElement, CardHeaderProps>(function CardHeader(
67
+ { children, className, ...props },
68
+ ref
69
+ ) {
70
+ return createElement("ds-card-header", { ref, class: className, ...props }, children);
71
+ });
72
+ CardHeader.displayName = "Card.Header";
73
+
74
+ /**
75
+ * Card content component - main content section for Card.
76
+ */
77
+ const CardContent = forwardRef<HTMLElement, CardContentProps>(function CardContent(
78
+ { children, className, ...props },
79
+ ref
80
+ ) {
81
+ return createElement("ds-card-content", { ref, class: className, ...props }, children);
82
+ });
83
+ CardContent.displayName = "Card.Content";
84
+
85
+ /**
86
+ * Card footer component - footer section for Card.
87
+ */
88
+ const CardFooter = forwardRef<HTMLElement, CardFooterProps>(function CardFooter(
89
+ { children, className, ...props },
90
+ ref
91
+ ) {
92
+ return createElement("ds-card-footer", { ref, class: className, ...props }, children);
93
+ });
94
+ CardFooter.displayName = "Card.Footer";
95
+
96
+ // ============================================================================
97
+ // Compound Component
98
+ // ============================================================================
99
+
100
+ export const Card = {
101
+ Root: CardRoot,
102
+ Header: CardHeader,
103
+ Content: CardContent,
104
+ Footer: CardFooter,
105
+ };
106
+
107
+ // Also export individual components
108
+ export { CardRoot, CardHeader, CardContent, CardFooter };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Card Content component - main content section for ds-card.
3
+ *
4
+ * @element ds-card-content
5
+ *
6
+ * @slot - Default slot for main card 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 DsCardContent extends DSElement {
14
+ override render() {
15
+ return html`<slot></slot>`;
16
+ }
17
+ }
18
+
19
+ define("ds-card-content", DsCardContent);
20
+
21
+ declare global {
22
+ interface HTMLElementTagNameMap {
23
+ "ds-card-content": DsCardContent;
24
+ }
25
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Card Footer component - footer section for ds-card.
3
+ *
4
+ * @element ds-card-footer
5
+ *
6
+ * @slot - Default slot for footer content (typically actions)
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 DsCardFooter extends DSElement {
14
+ override render() {
15
+ return html`<slot></slot>`;
16
+ }
17
+ }
18
+
19
+ define("ds-card-footer", DsCardFooter);
20
+
21
+ declare global {
22
+ interface HTMLElementTagNameMap {
23
+ "ds-card-footer": DsCardFooter;
24
+ }
25
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Card Header component - header section for ds-card.
3
+ *
4
+ * @element ds-card-header
5
+ *
6
+ * @slot - Default slot for header content (typically title and description)
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 DsCardHeader extends DSElement {
14
+ override render() {
15
+ return html`<slot></slot>`;
16
+ }
17
+ }
18
+
19
+ define("ds-card-header", DsCardHeader);
20
+
21
+ declare global {
22
+ interface HTMLElementTagNameMap {
23
+ "ds-card-header": DsCardHeader;
24
+ }
25
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Card component - container for grouping related content.
3
+ *
4
+ * A structural component that provides visual grouping with consistent
5
+ * styling for headers, content areas, and footers.
6
+ *
7
+ * @element ds-card
8
+ *
9
+ * @slot - Default slot for card content (ds-card-header, ds-card-content, ds-card-footer)
10
+ *
11
+ * @example
12
+ * ```html
13
+ * <ds-card>
14
+ * <ds-card-header>
15
+ * <h3>Card Title</h3>
16
+ * </ds-card-header>
17
+ * <ds-card-content>
18
+ * <p>Card content goes here.</p>
19
+ * </ds-card-content>
20
+ * <ds-card-footer>
21
+ * <button>Action</button>
22
+ * </ds-card-footer>
23
+ * </ds-card>
24
+ * ```
25
+ */
26
+
27
+ import { html } from "lit";
28
+ import { DSElement } from "../../base/ds-element.js";
29
+ import { define } from "../../registry/define.js";
30
+
31
+ export class DsCard extends DSElement {
32
+ override render() {
33
+ return html`<slot></slot>`;
34
+ }
35
+ }
36
+
37
+ define("ds-card", DsCard);
38
+
39
+ declare global {
40
+ interface HTMLElementTagNameMap {
41
+ "ds-card": DsCard;
42
+ }
43
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Card component barrel exports.
3
+ */
4
+
5
+ export { DsCard } from "./card.js";
6
+ export { DsCardHeader } from "./card-header.js";
7
+ export { DsCardContent } from "./card-content.js";
8
+ export { DsCardFooter } from "./card-footer.js";
@@ -0,0 +1,85 @@
1
+ import type React from "react";
2
+ import { type HTMLAttributes, createElement, forwardRef, useEffect, useRef } from "react";
3
+
4
+ export interface CheckboxProps extends Omit<HTMLAttributes<HTMLElement>, "onChange"> {
5
+ /** Checkbox name */
6
+ name?: string;
7
+ /** Checkbox value */
8
+ value?: string;
9
+ /** Whether checked */
10
+ checked?: boolean;
11
+ /** Default checked state (uncontrolled) */
12
+ defaultChecked?: boolean;
13
+ /** Whether disabled */
14
+ disabled?: boolean;
15
+ /** Whether required */
16
+ required?: boolean;
17
+ /** Indeterminate state */
18
+ indeterminate?: boolean;
19
+ /** Change handler */
20
+ onChange?: (checked: boolean, event: Event) => void;
21
+ /** Checkbox label content */
22
+ children?: React.ReactNode;
23
+ }
24
+
25
+ /**
26
+ * React wrapper for ds-checkbox Web Component.
27
+ * Checkbox input with tri-state support.
28
+ */
29
+ export const Checkbox = forwardRef<HTMLElement, CheckboxProps>((props, forwardedRef) => {
30
+ const {
31
+ name,
32
+ value,
33
+ checked,
34
+ defaultChecked,
35
+ disabled = false,
36
+ required = false,
37
+ indeterminate = false,
38
+ onChange,
39
+ children,
40
+ className,
41
+ ...rest
42
+ } = props;
43
+
44
+ const internalRef = useRef<HTMLElement>(null);
45
+
46
+ useEffect(() => {
47
+ if (typeof forwardedRef === "function") {
48
+ forwardedRef(internalRef.current);
49
+ } else if (forwardedRef) {
50
+ (forwardedRef as React.MutableRefObject<HTMLElement | null>).current = internalRef.current;
51
+ }
52
+ }, [forwardedRef]);
53
+
54
+ useEffect(() => {
55
+ const element = internalRef.current;
56
+ if (!element || !onChange) return;
57
+
58
+ const handleChange = (event: Event) => {
59
+ const customEvent = event as CustomEvent<{ checked: boolean }>;
60
+ onChange(customEvent.detail.checked, event);
61
+ };
62
+
63
+ element.addEventListener("ds:change", handleChange);
64
+ return () => element.removeEventListener("ds:change", handleChange);
65
+ }, [onChange]);
66
+
67
+ return createElement(
68
+ "ds-checkbox",
69
+ {
70
+ ref: internalRef,
71
+ name,
72
+ value,
73
+ checked: checked || undefined,
74
+ "default-checked": defaultChecked || undefined,
75
+ disabled: disabled || undefined,
76
+ required: required || undefined,
77
+ indeterminate: indeterminate || undefined,
78
+ class: className,
79
+ ...rest,
80
+ },
81
+ children
82
+ );
83
+ });
84
+
85
+ Checkbox.displayName = "Checkbox";
@@ -0,0 +1,247 @@
1
+ import { html } from "lit";
2
+ import type { PropertyValues } from "lit";
3
+ import { property, state } from "lit/decorators.js";
4
+ import { ifDefined } from "lit/directives/if-defined.js";
5
+ import { DSElement } from "../../base/ds-element.js";
6
+ import { FormAssociatedMixin } from "../../base/form-associated.js";
7
+ import type { ValidationFlags } from "../../base/form-associated.js";
8
+ import { StandardEvents, emitEvent } from "../../events/emit.js";
9
+ import { define } from "../../registry/define.js";
10
+
11
+ /**
12
+ * Checkbox input with tri-state support and native form participation.
13
+ *
14
+ * Uses ElementInternals for form association - values are submitted with the form
15
+ * and the checkbox participates in constraint validation.
16
+ *
17
+ * @element ds-checkbox
18
+ * @fires ds:change - Fired on state change with { checked, indeterminate }
19
+ * @fires ds:invalid - Fired when customValidation is true and validation fails
20
+ *
21
+ * @slot - Checkbox label
22
+ *
23
+ * @example
24
+ * ```html
25
+ * <form>
26
+ * <ds-checkbox name="accept" required>Accept terms and conditions</ds-checkbox>
27
+ * <button type="submit">Submit</button>
28
+ * </form>
29
+ *
30
+ * <ds-field>
31
+ * <ds-checkbox name="newsletter" custom-validation>Subscribe to newsletter</ds-checkbox>
32
+ * <ds-field-error></ds-field-error>
33
+ * </ds-field>
34
+ * ```
35
+ */
36
+ export class DsCheckbox extends FormAssociatedMixin(DSElement) {
37
+ /** Checked state */
38
+ @property({ type: Boolean, reflect: true })
39
+ checked = false;
40
+
41
+ /** Indeterminate (mixed) state */
42
+ @property({ type: Boolean, reflect: true })
43
+ indeterminate = false;
44
+
45
+ /** ARIA describedby - IDs of elements that describe this checkbox */
46
+ @state()
47
+ private ariaDescribedBy?: string;
48
+
49
+ /** Label text captured from slot */
50
+ @state()
51
+ private labelText = "";
52
+
53
+ /** Unique ID for label association */
54
+ @state()
55
+ private labelId = "";
56
+
57
+ /** Default checked state for form reset */
58
+ private _defaultChecked = false;
59
+
60
+ private attributeObserver: MutationObserver | null = null;
61
+
62
+ override connectedCallback(): void {
63
+ // Capture label text before Lit renders
64
+ this.labelText = this.textContent?.trim() ?? "";
65
+ // Generate unique ID for label
66
+ this.labelId = `checkbox-label-${crypto.randomUUID().slice(0, 8)}`;
67
+ // Store default checked state
68
+ this._defaultChecked = this.checked;
69
+
70
+ super.connectedCallback();
71
+
72
+ // Set default value for form association
73
+ if (!this.value) {
74
+ this.value = "on";
75
+ }
76
+
77
+ // Observe ARIA attribute changes on the host element
78
+ this.attributeObserver = new MutationObserver((mutations) => {
79
+ for (const mutation of mutations) {
80
+ if (mutation.type === "attributes") {
81
+ this.syncAriaAttributes();
82
+ }
83
+ }
84
+ });
85
+
86
+ this.attributeObserver.observe(this, {
87
+ attributes: true,
88
+ attributeFilter: ["aria-describedby", "aria-invalid", "aria-required", "aria-disabled"],
89
+ });
90
+
91
+ // Initial sync
92
+ this.syncAriaAttributes();
93
+ }
94
+
95
+ override disconnectedCallback(): void {
96
+ super.disconnectedCallback();
97
+ this.attributeObserver?.disconnect();
98
+ this.attributeObserver = null;
99
+ }
100
+
101
+ /**
102
+ * Syncs ARIA attributes from the host element to internal state.
103
+ */
104
+ private syncAriaAttributes(): void {
105
+ this.ariaDescribedBy = this.getAttribute("aria-describedby") ?? undefined;
106
+
107
+ // Sync required state from aria-required
108
+ const ariaRequired = this.getAttribute("aria-required");
109
+ if (ariaRequired === "true") {
110
+ this.required = true;
111
+ }
112
+
113
+ // Sync disabled state from aria-disabled
114
+ const ariaDisabled = this.getAttribute("aria-disabled");
115
+ if (ariaDisabled === "true") {
116
+ this.disabled = true;
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Returns the aria-checked value based on state.
122
+ */
123
+ private getAriaChecked(): "true" | "false" | "mixed" {
124
+ if (this.indeterminate) return "mixed";
125
+ return this.checked ? "true" : "false";
126
+ }
127
+
128
+ /**
129
+ * Toggles the checkbox state.
130
+ */
131
+ private toggle(): void {
132
+ if (this.disabled) return;
133
+
134
+ // Clear indeterminate on any interaction
135
+ this.indeterminate = false;
136
+ this.checked = !this.checked;
137
+
138
+ emitEvent(this, StandardEvents.CHANGE, {
139
+ detail: {
140
+ checked: this.checked,
141
+ indeterminate: this.indeterminate,
142
+ },
143
+ });
144
+ }
145
+
146
+ private handleClick = (event: Event): void => {
147
+ event.preventDefault();
148
+ this.toggle();
149
+ };
150
+
151
+ private handleKeyDown = (event: KeyboardEvent): void => {
152
+ if (event.key === " ") {
153
+ event.preventDefault();
154
+ this.toggle();
155
+ }
156
+ };
157
+
158
+ // Form association implementation
159
+
160
+ protected getFormValue(): string | null {
161
+ return this.checked ? this.value : null;
162
+ }
163
+
164
+ protected getValidationAnchor(): HTMLElement | undefined {
165
+ return this.querySelector(".ds-checkbox__control") as HTMLElement | undefined;
166
+ }
167
+
168
+ protected getValidationFlags(): ValidationFlags {
169
+ if (this.required && !this.checked) {
170
+ return { valueMissing: true };
171
+ }
172
+ return {};
173
+ }
174
+
175
+ protected getValidationMessage(flags: ValidationFlags): string {
176
+ if (flags.valueMissing) {
177
+ return "Please check this box to proceed";
178
+ }
179
+ return "";
180
+ }
181
+
182
+ protected shouldUpdateFormValue(changedProperties: PropertyValues): boolean {
183
+ return changedProperties.has("checked");
184
+ }
185
+
186
+ protected shouldUpdateValidity(changedProperties: PropertyValues): boolean {
187
+ return changedProperties.has("checked");
188
+ }
189
+
190
+ protected onFormReset(): void {
191
+ this.checked = this._defaultChecked;
192
+ this.indeterminate = false;
193
+ }
194
+
195
+ protected onFormStateRestore(
196
+ state: string | File | FormData | null,
197
+ _mode: "restore" | "autocomplete"
198
+ ): void {
199
+ if (typeof state === "string") {
200
+ this.checked = state === this.value;
201
+ }
202
+ }
203
+
204
+ override render() {
205
+ return html`
206
+ <div
207
+ class="ds-checkbox"
208
+ part="container"
209
+ @click=${this.handleClick}
210
+ >
211
+ <div
212
+ role="checkbox"
213
+ part="control"
214
+ class="ds-checkbox__control"
215
+ tabindex=${this.disabled ? -1 : 0}
216
+ aria-checked=${this.getAriaChecked()}
217
+ aria-disabled=${this.disabled ? "true" : "false"}
218
+ aria-required=${this.required ? "true" : "false"}
219
+ aria-labelledby=${this.labelId}
220
+ aria-describedby=${ifDefined(this.ariaDescribedBy)}
221
+ @keydown=${this.handleKeyDown}
222
+ >
223
+ <span class="ds-checkbox__indicator" part="indicator">
224
+ ${
225
+ this.indeterminate
226
+ ? html`<span class="ds-checkbox__indeterminate-icon">−</span>`
227
+ : this.checked
228
+ ? html`<span class="ds-checkbox__check-icon">✓</span>`
229
+ : null
230
+ }
231
+ </span>
232
+ </div>
233
+ <span id=${this.labelId} class="ds-checkbox__label" part="label">
234
+ ${this.labelText}
235
+ </span>
236
+ </div>
237
+ `;
238
+ }
239
+ }
240
+
241
+ define("ds-checkbox", DsCheckbox);
242
+
243
+ declare global {
244
+ interface HTMLElementTagNameMap {
245
+ "ds-checkbox": DsCheckbox;
246
+ }
247
+ }