@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,166 @@
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 { emitEvent } from "../../events/emit.js";
6
+ import { define } from "../../registry/define.js";
7
+
8
+ export type TagVariant =
9
+ | "neutral"
10
+ | "primary"
11
+ | "secondary"
12
+ | "success"
13
+ | "warning"
14
+ | "error"
15
+ | "info";
16
+ export type TagSize = "sm" | "md" | "lg";
17
+
18
+ // Close icon SVG
19
+ const closeIcon = html`
20
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
21
+ <path d="M18 6L6 18M6 6l12 12" />
22
+ </svg>
23
+ `;
24
+
25
+ /**
26
+ * Tag component for categorization with optional remove action.
27
+ *
28
+ * @element ds-tag
29
+ *
30
+ * @slot - Tag content
31
+ * @slot icon - Optional leading icon
32
+ *
33
+ * @fires ds-remove - When the remove button is clicked
34
+ * @fires ds-click - When the tag is clicked (if clickable)
35
+ *
36
+ * @cssprop --ds-tag-bg - Background color
37
+ * @cssprop --ds-tag-color - Text color
38
+ */
39
+ export class DsTag extends DSElement {
40
+ static override styles = [];
41
+
42
+ /**
43
+ * Color variant.
44
+ */
45
+ @property({ type: String, reflect: true })
46
+ variant: TagVariant = "neutral";
47
+
48
+ /**
49
+ * Size variant.
50
+ */
51
+ @property({ type: String, reflect: true })
52
+ size: TagSize = "md";
53
+
54
+ /**
55
+ * Use solid (filled) style instead of subtle.
56
+ */
57
+ @property({ type: Boolean, reflect: true })
58
+ solid = false;
59
+
60
+ /**
61
+ * Show remove button.
62
+ */
63
+ @property({ type: Boolean, reflect: true })
64
+ removable = false;
65
+
66
+ /**
67
+ * Make tag clickable/interactive.
68
+ */
69
+ @property({ type: Boolean, reflect: true })
70
+ clickable = false;
71
+
72
+ /**
73
+ * Disable the tag.
74
+ */
75
+ @property({ type: Boolean, reflect: true })
76
+ disabled = false;
77
+
78
+ /**
79
+ * Value for identification in events.
80
+ */
81
+ @property({ type: String })
82
+ value = "";
83
+
84
+ private handleRemove(event: Event): void {
85
+ event.stopPropagation();
86
+ if (this.disabled) return;
87
+
88
+ emitEvent(this, "remove", {
89
+ detail: { value: this.value },
90
+ });
91
+ }
92
+
93
+ private handleClick(): void {
94
+ if (!this.clickable || this.disabled) return;
95
+
96
+ emitEvent(this, "click", {
97
+ detail: { value: this.value },
98
+ });
99
+ }
100
+
101
+ private handleKeyDown(event: KeyboardEvent): void {
102
+ if (this.disabled) return;
103
+
104
+ if (event.key === "Enter" || event.key === " ") {
105
+ if (this.clickable) {
106
+ event.preventDefault();
107
+ this.handleClick();
108
+ }
109
+ } else if (event.key === "Backspace" || event.key === "Delete") {
110
+ if (this.removable) {
111
+ event.preventDefault();
112
+ emitEvent(this, "remove", { detail: { value: this.value } });
113
+ }
114
+ }
115
+ }
116
+
117
+ override render(): TemplateResult {
118
+ const classes = {
119
+ "ds-tag": true,
120
+ };
121
+
122
+ return html`
123
+ <span
124
+ class=${classMap(classes)}
125
+ role=${this.clickable ? "button" : "status"}
126
+ tabindex=${this.clickable && !this.disabled ? 0 : nothing}
127
+ data-variant=${this.variant}
128
+ data-size=${this.size !== "md" ? this.size : nothing}
129
+ ?data-solid=${this.solid}
130
+ ?data-clickable=${this.clickable}
131
+ ?data-disabled=${this.disabled}
132
+ aria-disabled=${this.disabled ? "true" : nothing}
133
+ @click=${this.handleClick}
134
+ @keydown=${this.handleKeyDown}
135
+ >
136
+ <slot name="icon"></slot>
137
+ <slot></slot>
138
+ ${
139
+ this.removable
140
+ ? html`
141
+ <button
142
+ type="button"
143
+ class="ds-tag__remove"
144
+ aria-label="Remove"
145
+ ?disabled=${this.disabled}
146
+ @click=${this.handleRemove}
147
+ >
148
+ ${closeIcon}
149
+ </button>
150
+ `
151
+ : nothing
152
+ }
153
+ </span>
154
+ `;
155
+ }
156
+ }
157
+
158
+ // Register the component
159
+ define("ds-tag", DsTag);
160
+
161
+ // TypeScript declaration for HTML
162
+ declare global {
163
+ interface HTMLElementTagNameMap {
164
+ "ds-tag": DsTag;
165
+ }
166
+ }
@@ -0,0 +1,100 @@
1
+ import type { ReactNode } from "react";
2
+ import { createElement, forwardRef } from "react";
3
+ import { Slot } from "../primitives/slot.js";
4
+ import type { AsChildProps } from "../types/polymorphic.js";
5
+ import { mergeClassNames } from "../utils/merge-props.js";
6
+
7
+ export type TextSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
8
+ export type TextWeight = "normal" | "medium" | "semibold" | "bold";
9
+ export type TextVariant = "default" | "muted" | "success" | "warning" | "error";
10
+
11
+ export interface TextProps extends AsChildProps {
12
+ /** Text size */
13
+ size?: TextSize;
14
+ /** Font weight */
15
+ weight?: TextWeight;
16
+ /** Color variant */
17
+ variant?: TextVariant;
18
+ /** Truncate text with ellipsis */
19
+ truncate?: boolean;
20
+ /** Additional CSS classes */
21
+ className?: string;
22
+ /** Text content */
23
+ children?: ReactNode;
24
+ }
25
+
26
+ /**
27
+ * Maps text props to CSS utility classes.
28
+ */
29
+ function buildTextClasses(props: TextProps): string[] {
30
+ const classes: string[] = [];
31
+
32
+ // Size
33
+ if (props.size) {
34
+ classes.push(`ds-text-${props.size}`);
35
+ }
36
+
37
+ // Weight
38
+ if (props.weight) {
39
+ classes.push(`ds-font-${props.weight}`);
40
+ }
41
+
42
+ // Variant (color)
43
+ if (props.variant && props.variant !== "default") {
44
+ classes.push(`ds-text-${props.variant}`);
45
+ }
46
+
47
+ // Truncate
48
+ if (props.truncate) {
49
+ classes.push("ds-truncate");
50
+ }
51
+
52
+ return classes;
53
+ }
54
+
55
+ /**
56
+ * Text is a typography primitive that applies consistent text styling.
57
+ * Supports asChild for semantic HTML elements (h1-h6, p, etc.).
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * <Text size="lg" weight="bold">Large bold text</Text>
62
+ *
63
+ * <Text size="2xl" weight="bold" asChild>
64
+ * <h1>Page Title</h1>
65
+ * </Text>
66
+ *
67
+ * <Text variant="muted" asChild>
68
+ * <p>Muted paragraph text</p>
69
+ * </Text>
70
+ * ```
71
+ */
72
+ export const Text = forwardRef<HTMLElement, TextProps>((props, ref) => {
73
+ const {
74
+ asChild = false,
75
+ size = "md",
76
+ weight = "normal",
77
+ variant = "default",
78
+ truncate = false,
79
+ className,
80
+ children,
81
+ ...rest
82
+ } = props;
83
+
84
+ const textClasses = buildTextClasses({ size, weight, variant, truncate });
85
+ const allClasses = mergeClassNames(...textClasses, className);
86
+
87
+ const Component = asChild ? Slot : "span";
88
+
89
+ return createElement(
90
+ Component,
91
+ {
92
+ ref,
93
+ className: allClasses || undefined,
94
+ ...rest,
95
+ },
96
+ children
97
+ );
98
+ });
99
+
100
+ Text.displayName = "Text";
@@ -0,0 +1,94 @@
1
+ import type { TemplateResult } from "lit";
2
+ import { property } from "lit/decorators.js";
3
+ import { classMap } from "lit/directives/class-map.js";
4
+ import { html as staticHtml, unsafeStatic } from "lit/static-html.js";
5
+ import { DSElement } from "../../base/ds-element.js";
6
+ import { define } from "../../registry/define.js";
7
+
8
+ export type TextSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
9
+ export type TextWeight = "normal" | "medium" | "semibold" | "bold";
10
+ export type TextVariant = "default" | "muted" | "success" | "warning" | "error";
11
+ export type TextAs = "span" | "p" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
12
+
13
+ const VALID_AS_VALUES = new Set<string>(["span", "p", "h1", "h2", "h3", "h4", "h5", "h6"]);
14
+
15
+ /**
16
+ * A typography component for consistent text styling.
17
+ *
18
+ * @element ds-text
19
+ * @slot - Default slot for text content
20
+ */
21
+ export class DsText extends DSElement {
22
+ static override styles = [];
23
+
24
+ /**
25
+ * The text size.
26
+ */
27
+ @property({ type: String, reflect: true })
28
+ size: TextSize = "md";
29
+
30
+ /**
31
+ * The font weight.
32
+ */
33
+ @property({ type: String, reflect: true })
34
+ weight: TextWeight = "normal";
35
+
36
+ /**
37
+ * The color variant.
38
+ */
39
+ @property({ type: String, reflect: true })
40
+ variant: TextVariant = "default";
41
+
42
+ /**
43
+ * The semantic element to render as.
44
+ * Supports: span, p, h1-h6
45
+ */
46
+ @property({ type: String, reflect: true })
47
+ as: TextAs = "span";
48
+
49
+ /**
50
+ * Whether to truncate text with ellipsis.
51
+ */
52
+ @property({ type: Boolean, reflect: true })
53
+ truncate = false;
54
+
55
+ private getValidAs(): TextAs {
56
+ if (VALID_AS_VALUES.has(this.as)) {
57
+ return this.as;
58
+ }
59
+
60
+ console.warn(
61
+ `[ds-text] Invalid "as" value "${this.as}". Expected one of: ${Array.from(VALID_AS_VALUES).join(", ")}. Falling back to "span".`
62
+ );
63
+ return "span";
64
+ }
65
+
66
+ override render(): TemplateResult {
67
+ const validAs = this.getValidAs();
68
+ const tag = unsafeStatic(validAs);
69
+
70
+ const classes = {
71
+ "ds-text": true,
72
+ [`ds-text--${this.size}`]: true,
73
+ [`ds-text--${this.weight}`]: true,
74
+ [`ds-text--${this.variant}`]: true,
75
+ "ds-text--truncate": this.truncate,
76
+ };
77
+
78
+ return staticHtml`
79
+ <${tag} class=${classMap(classes)}>
80
+ <slot></slot>
81
+ </${tag}>
82
+ `;
83
+ }
84
+ }
85
+
86
+ // Register the component
87
+ define("ds-text", DsText);
88
+
89
+ // TypeScript declaration for HTML
90
+ declare global {
91
+ interface HTMLElementTagNameMap {
92
+ "ds-text": DsText;
93
+ }
94
+ }
@@ -0,0 +1,134 @@
1
+ import type React from "react";
2
+ import {
3
+ type TextareaHTMLAttributes,
4
+ createElement,
5
+ forwardRef,
6
+ useCallback,
7
+ useEffect,
8
+ useRef,
9
+ } from "react";
10
+ import {
11
+ type ResponsiveProp,
12
+ generateResponsiveDataAttr,
13
+ isResponsiveObject,
14
+ resolveResponsiveValue,
15
+ } from "../primitives/responsive.js";
16
+
17
+ export type TextareaSize = "sm" | "md" | "lg";
18
+
19
+ export interface TextareaProps
20
+ extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "onChange" | "onInput"> {
21
+ /**
22
+ * Textarea size - supports responsive object syntax
23
+ * @example
24
+ * ```tsx
25
+ * // Single value
26
+ * <Textarea size="md" />
27
+ *
28
+ * // Responsive
29
+ * <Textarea size={{ base: "sm", md: "md", lg: "lg" }} />
30
+ * ```
31
+ */
32
+ size?: ResponsiveProp<TextareaSize>;
33
+ /** Error state */
34
+ error?: boolean;
35
+ /** Auto-resize to fit content */
36
+ autoResize?: boolean;
37
+ /** Change handler */
38
+ onChange?: (value: string, event: Event) => void;
39
+ /** Value change handler - fires on every keystroke */
40
+ onValueChange?: (value: string, event: Event) => void;
41
+ }
42
+
43
+ /**
44
+ * React wrapper for ds-textarea Web Component.
45
+ * Multi-line text input with auto-resize support.
46
+ */
47
+ export const Textarea = forwardRef<HTMLElement, TextareaProps>((props, forwardedRef) => {
48
+ const {
49
+ size = "md",
50
+ name,
51
+ value,
52
+ placeholder,
53
+ disabled = false,
54
+ readOnly = false,
55
+ required = false,
56
+ error = false,
57
+ autoResize = false,
58
+ rows,
59
+ minLength,
60
+ maxLength,
61
+ onChange,
62
+ onValueChange,
63
+ className,
64
+ ...rest
65
+ } = props;
66
+
67
+ const internalRef = useRef<HTMLElement>(null);
68
+
69
+ // Store handlers in refs for stable callback references
70
+ const onChangeRef = useRef(onChange);
71
+ const onValueChangeRef = useRef(onValueChange);
72
+ onChangeRef.current = onChange;
73
+ onValueChangeRef.current = onValueChange;
74
+
75
+ useEffect(() => {
76
+ if (typeof forwardedRef === "function") {
77
+ forwardedRef(internalRef.current);
78
+ } else if (forwardedRef) {
79
+ (forwardedRef as React.MutableRefObject<HTMLElement | null>).current = internalRef.current;
80
+ }
81
+ }, [forwardedRef]);
82
+
83
+ // Stable handlers that read from refs
84
+ const handleInputEvent = useCallback((event: Event) => {
85
+ const customEvent = event as CustomEvent<{ value: string }>;
86
+ onValueChangeRef.current?.(customEvent.detail.value, event);
87
+ }, []);
88
+
89
+ const handleChangeEvent = useCallback((event: Event) => {
90
+ const customEvent = event as CustomEvent<{ value: string }>;
91
+ onChangeRef.current?.(customEvent.detail.value, event);
92
+ }, []);
93
+
94
+ // Handle events - no handler deps needed
95
+ useEffect(() => {
96
+ const element = internalRef.current;
97
+ if (!element) return;
98
+
99
+ element.addEventListener("input", handleInputEvent);
100
+ element.addEventListener("change", handleChangeEvent);
101
+
102
+ return () => {
103
+ element.removeEventListener("input", handleInputEvent);
104
+ element.removeEventListener("change", handleChangeEvent);
105
+ };
106
+ }, [handleInputEvent, handleChangeEvent]);
107
+
108
+ // Resolve responsive size - use base value for the WC attribute
109
+ const resolvedSize = resolveResponsiveValue(size, "md");
110
+ const isResponsive = isResponsiveObject(size);
111
+ const responsiveSizeAttr = isResponsive ? generateResponsiveDataAttr(size) : undefined;
112
+
113
+ return createElement("ds-textarea", {
114
+ ref: internalRef,
115
+ size: resolvedSize,
116
+ name,
117
+ value,
118
+ placeholder,
119
+ disabled: disabled || undefined,
120
+ readonly: readOnly || undefined,
121
+ required: required || undefined,
122
+ error: error || undefined,
123
+ "auto-resize": autoResize || undefined,
124
+ rows,
125
+ minlength: minLength,
126
+ maxlength: maxLength,
127
+ class: className,
128
+ // Add responsive data attribute for CSS targeting
129
+ "data-size-responsive": responsiveSizeAttr,
130
+ ...rest,
131
+ });
132
+ });
133
+
134
+ Textarea.displayName = "Textarea";