@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,112 @@
1
+ import { type TemplateResult, html, nothing } from "lit";
2
+ import { property, state } 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
+ import type { AvatarSize } from "./avatar.js";
7
+
8
+ /**
9
+ * Avatar group component for displaying multiple avatars with overflow.
10
+ *
11
+ * @element ds-avatar-group
12
+ *
13
+ * @slot - Avatar elements to display
14
+ *
15
+ * @csspart overflow - The overflow indicator element
16
+ *
17
+ * @cssprop --ds-avatar-size - Avatar dimensions (inherited by children)
18
+ */
19
+ export class DsAvatarGroup extends DSElement {
20
+ static override styles = [];
21
+
22
+ /**
23
+ * Maximum number of avatars to display before showing overflow.
24
+ */
25
+ @property({ type: Number })
26
+ max = 5;
27
+
28
+ /**
29
+ * Size variant (inherited by child avatars).
30
+ */
31
+ @property({ type: String, reflect: true })
32
+ size: AvatarSize = "md";
33
+
34
+ @state()
35
+ private overflowCount = 0;
36
+
37
+ @state()
38
+ private visibleAvatars: Element[] = [];
39
+
40
+ override connectedCallback(): void {
41
+ super.connectedCallback();
42
+ this.updateAvatarVisibility();
43
+
44
+ // Use MutationObserver to track slot changes
45
+ const observer = new MutationObserver(() => this.updateAvatarVisibility());
46
+ observer.observe(this, { childList: true });
47
+ }
48
+
49
+ private updateAvatarVisibility(): void {
50
+ const avatars = Array.from(this.querySelectorAll("ds-avatar"));
51
+ const total = avatars.length;
52
+
53
+ if (total <= this.max) {
54
+ this.visibleAvatars = avatars;
55
+ this.overflowCount = 0;
56
+ } else {
57
+ this.visibleAvatars = avatars.slice(0, this.max);
58
+ this.overflowCount = total - this.max;
59
+ }
60
+
61
+ // Hide overflow avatars
62
+ avatars.forEach((avatar, index) => {
63
+ if (index >= this.max) {
64
+ (avatar as HTMLElement).style.display = "none";
65
+ } else {
66
+ (avatar as HTMLElement).style.display = "";
67
+ }
68
+ });
69
+
70
+ this.requestUpdate();
71
+ }
72
+
73
+ override render(): TemplateResult {
74
+ const classes = {
75
+ "ds-avatar-group": true,
76
+ };
77
+
78
+ return html`
79
+ <div
80
+ class=${classMap(classes)}
81
+ role="group"
82
+ aria-label="Avatar group"
83
+ data-size=${this.size}
84
+ >
85
+ ${
86
+ this.overflowCount > 0
87
+ ? html`
88
+ <span
89
+ part="overflow"
90
+ class="ds-avatar-group__overflow"
91
+ aria-label="${this.overflowCount} more users"
92
+ >
93
+ +${this.overflowCount}
94
+ </span>
95
+ `
96
+ : nothing
97
+ }
98
+ <slot @slotchange=${this.updateAvatarVisibility}></slot>
99
+ </div>
100
+ `;
101
+ }
102
+ }
103
+
104
+ // Register the component
105
+ define("ds-avatar-group", DsAvatarGroup);
106
+
107
+ // TypeScript declaration for HTML
108
+ declare global {
109
+ interface HTMLElementTagNameMap {
110
+ "ds-avatar-group": DsAvatarGroup;
111
+ }
112
+ }
@@ -0,0 +1,184 @@
1
+ import { type TemplateResult, html, nothing } from "lit";
2
+ import { property, state } 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 AvatarSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
8
+ export type AvatarShape = "circle" | "square";
9
+ export type AvatarStatus = "online" | "offline" | "away" | "busy";
10
+
11
+ // Default user icon SVG
12
+ const defaultUserIcon = html`
13
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
14
+ <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" />
15
+ </svg>
16
+ `;
17
+
18
+ /**
19
+ * Avatar component for user representation.
20
+ *
21
+ * @element ds-avatar
22
+ *
23
+ * @csspart image - The avatar image element
24
+ * @csspart initials - The initials fallback element
25
+ * @csspart icon - The icon fallback element
26
+ * @csspart status - The status indicator element
27
+ *
28
+ * @cssprop --ds-avatar-size - Avatar dimensions
29
+ * @cssprop --ds-avatar-radius - Border radius
30
+ * @cssprop --ds-avatar-bg - Background color for fallback
31
+ * @cssprop --ds-avatar-color - Text color for initials/icon
32
+ */
33
+ export class DsAvatar extends DSElement {
34
+ static override styles = [];
35
+
36
+ /**
37
+ * Image source URL.
38
+ */
39
+ @property({ type: String })
40
+ src = "";
41
+
42
+ /**
43
+ * Alt text for image.
44
+ */
45
+ @property({ type: String })
46
+ alt = "";
47
+
48
+ /**
49
+ * User's name (used for initials fallback).
50
+ */
51
+ @property({ type: String })
52
+ name = "";
53
+
54
+ /**
55
+ * Size variant.
56
+ */
57
+ @property({ type: String, reflect: true })
58
+ size: AvatarSize = "md";
59
+
60
+ /**
61
+ * Shape variant.
62
+ */
63
+ @property({ type: String, reflect: true })
64
+ shape: AvatarShape = "circle";
65
+
66
+ /**
67
+ * Status indicator.
68
+ */
69
+ @property({ type: String })
70
+ status?: AvatarStatus;
71
+
72
+ /**
73
+ * Whether to show status indicator.
74
+ */
75
+ @property({ type: Boolean, attribute: "show-status" })
76
+ showStatus = false;
77
+
78
+ @state()
79
+ private imageError = false;
80
+
81
+ private get initials(): string {
82
+ if (!this.name) return "";
83
+
84
+ const names = this.name.trim().split(/\s+/);
85
+ if (names.length === 0) return "";
86
+ if (names.length === 1) {
87
+ return (names[0] ?? "").charAt(0).toUpperCase();
88
+ }
89
+ const first = names[0] ?? "";
90
+ const last = names[names.length - 1] ?? "";
91
+ return (first.charAt(0) + last.charAt(0)).toUpperCase();
92
+ }
93
+
94
+ private get showImage(): boolean {
95
+ return Boolean(this.src && !this.imageError);
96
+ }
97
+
98
+ private get showInitials(): boolean {
99
+ return !this.showImage && Boolean(this.initials);
100
+ }
101
+
102
+ private get showIcon(): boolean {
103
+ return !this.showImage && !this.showInitials;
104
+ }
105
+
106
+ private handleImageError(): void {
107
+ this.imageError = true;
108
+ }
109
+
110
+ private handleImageLoad(): void {
111
+ this.imageError = false;
112
+ }
113
+
114
+ override render(): TemplateResult {
115
+ const classes = {
116
+ "ds-avatar": true,
117
+ };
118
+
119
+ return html`
120
+ <span
121
+ class=${classMap(classes)}
122
+ role="img"
123
+ aria-label=${this.alt || this.name || "Avatar"}
124
+ data-size=${this.size}
125
+ data-shape=${this.shape !== "circle" ? this.shape : nothing}
126
+ >
127
+ ${
128
+ this.showImage
129
+ ? html`
130
+ <img
131
+ part="image"
132
+ class="ds-avatar__image"
133
+ src=${this.src}
134
+ alt=""
135
+ @error=${this.handleImageError}
136
+ @load=${this.handleImageLoad}
137
+ />
138
+ `
139
+ : nothing
140
+ }
141
+ ${
142
+ this.showInitials
143
+ ? html`
144
+ <span part="initials" class="ds-avatar__initials">
145
+ ${this.initials}
146
+ </span>
147
+ `
148
+ : nothing
149
+ }
150
+ ${
151
+ this.showIcon
152
+ ? html`
153
+ <span part="icon" class="ds-avatar__icon">
154
+ ${defaultUserIcon}
155
+ </span>
156
+ `
157
+ : nothing
158
+ }
159
+ ${
160
+ this.showStatus && this.status
161
+ ? html`
162
+ <span
163
+ part="status"
164
+ class="ds-avatar__status"
165
+ data-status=${this.status}
166
+ aria-label=${`Status: ${this.status}`}
167
+ ></span>
168
+ `
169
+ : nothing
170
+ }
171
+ </span>
172
+ `;
173
+ }
174
+ }
175
+
176
+ // Register the component
177
+ define("ds-avatar", DsAvatar);
178
+
179
+ // TypeScript declaration for HTML
180
+ declare global {
181
+ interface HTMLElementTagNameMap {
182
+ "ds-avatar": DsAvatar;
183
+ }
184
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Avatar component exports
3
+ */
4
+ export { DsAvatar, type AvatarSize, type AvatarShape, type AvatarStatus } from "./avatar.js";
5
+ export { DsAvatarGroup } from "./avatar-group.js";
@@ -0,0 +1,140 @@
1
+ "use client";
2
+
3
+ import { type HTMLAttributes, createElement, forwardRef } from "react";
4
+ import "@hypoth-ui/wc";
5
+ import {
6
+ type ResponsiveProp,
7
+ generateResponsiveDataAttr,
8
+ isResponsiveObject,
9
+ resolveResponsiveValue,
10
+ } from "../../primitives/responsive.js";
11
+
12
+ export type BadgeVariant =
13
+ | "neutral"
14
+ | "primary"
15
+ | "secondary"
16
+ | "success"
17
+ | "warning"
18
+ | "error"
19
+ | "info";
20
+ export type BadgeSize = "sm" | "md" | "lg";
21
+ export type BadgePosition = "top-right" | "top-left" | "bottom-right" | "bottom-left";
22
+
23
+ export interface BadgeProps extends Omit<HTMLAttributes<HTMLElement>, "content"> {
24
+ /**
25
+ * Badge content/count.
26
+ */
27
+ content?: string | number;
28
+
29
+ /**
30
+ * Maximum count to show. Displays "{max}+" if exceeded.
31
+ */
32
+ max?: number;
33
+
34
+ /**
35
+ * Color variant.
36
+ * @default "primary"
37
+ */
38
+ variant?: BadgeVariant;
39
+
40
+ /**
41
+ * Size variant - supports responsive object syntax.
42
+ * @default "md"
43
+ * @example
44
+ * ```tsx
45
+ * // Single value
46
+ * <Badge content={5} size="md" />
47
+ *
48
+ * // Responsive
49
+ * <Badge content={5} size={{ base: "sm", md: "md" }} />
50
+ * ```
51
+ */
52
+ size?: ResponsiveProp<BadgeSize>;
53
+
54
+ /**
55
+ * Use outline style.
56
+ * @default false
57
+ */
58
+ outline?: boolean;
59
+
60
+ /**
61
+ * Show as dot (no content).
62
+ * @default false
63
+ */
64
+ dot?: boolean;
65
+
66
+ /**
67
+ * Position when used in wrapper.
68
+ * @default "top-right"
69
+ */
70
+ position?: BadgePosition;
71
+
72
+ /**
73
+ * Show pulse animation.
74
+ * @default false
75
+ */
76
+ pulse?: boolean;
77
+ }
78
+
79
+ /**
80
+ * Badge component for counts, notifications, and status indicators.
81
+ *
82
+ * @example
83
+ * ```tsx
84
+ * // Count badge
85
+ * <Badge content={5} variant="error" />
86
+ *
87
+ * // Max count
88
+ * <Badge content={150} max={99} />
89
+ *
90
+ * // Dot indicator
91
+ * <Badge dot variant="success" />
92
+ * ```
93
+ */
94
+ export const Badge = forwardRef<HTMLElement, BadgeProps>(function Badge(
95
+ {
96
+ content,
97
+ max,
98
+ variant = "primary",
99
+ size = "md",
100
+ outline = false,
101
+ dot = false,
102
+ position = "top-right",
103
+ pulse = false,
104
+ className,
105
+ ...props
106
+ },
107
+ ref
108
+ ) {
109
+ // Resolve responsive size - use base value for the WC attribute
110
+ const resolvedSize = resolveResponsiveValue(size, "md");
111
+ const isResponsive = isResponsiveObject(size);
112
+ const responsiveSizeAttr = isResponsive ? generateResponsiveDataAttr(size) : undefined;
113
+
114
+ return createElement("ds-badge", {
115
+ ref,
116
+ content: content?.toString() ?? "",
117
+ max,
118
+ variant,
119
+ size: resolvedSize,
120
+ outline: outline || undefined,
121
+ dot: dot || undefined,
122
+ position,
123
+ pulse: pulse || undefined,
124
+ class: className,
125
+ // Add responsive data attribute for CSS targeting
126
+ "data-size-responsive": responsiveSizeAttr,
127
+ ...props,
128
+ });
129
+ });
130
+
131
+ // TypeScript declaration for JSX
132
+ declare global {
133
+ namespace JSX {
134
+ interface IntrinsicElements {
135
+ "ds-badge": BadgeProps & {
136
+ ref?: React.Ref<HTMLElement>;
137
+ };
138
+ }
139
+ }
140
+ }
@@ -0,0 +1,119 @@
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 BadgeVariant =
8
+ | "neutral"
9
+ | "primary"
10
+ | "secondary"
11
+ | "success"
12
+ | "warning"
13
+ | "error"
14
+ | "info";
15
+ export type BadgeSize = "sm" | "md" | "lg";
16
+ export type BadgePosition = "top-right" | "top-left" | "bottom-right" | "bottom-left";
17
+
18
+ /**
19
+ * Badge component for counts, notifications, and status indicators.
20
+ *
21
+ * @element ds-badge
22
+ *
23
+ * @cssprop --ds-badge-bg - Background color
24
+ * @cssprop --ds-badge-color - Text color
25
+ */
26
+ export class DsBadge extends DSElement {
27
+ static override styles = [];
28
+
29
+ /**
30
+ * Badge content/count.
31
+ */
32
+ @property({ type: String })
33
+ content = "";
34
+
35
+ /**
36
+ * Maximum count to show. Displays "{max}+" if exceeded.
37
+ */
38
+ @property({ type: Number })
39
+ max?: number;
40
+
41
+ /**
42
+ * Color variant.
43
+ */
44
+ @property({ type: String, reflect: true })
45
+ variant: BadgeVariant = "primary";
46
+
47
+ /**
48
+ * Size variant.
49
+ */
50
+ @property({ type: String, reflect: true })
51
+ size: BadgeSize = "md";
52
+
53
+ /**
54
+ * Use outline style.
55
+ */
56
+ @property({ type: Boolean, reflect: true })
57
+ outline = false;
58
+
59
+ /**
60
+ * Show as dot (no content).
61
+ */
62
+ @property({ type: Boolean, reflect: true })
63
+ dot = false;
64
+
65
+ /**
66
+ * Position when used in wrapper.
67
+ */
68
+ @property({ type: String, reflect: true })
69
+ position: BadgePosition = "top-right";
70
+
71
+ /**
72
+ * Show pulse animation.
73
+ */
74
+ @property({ type: Boolean, reflect: true })
75
+ pulse = false;
76
+
77
+ private get displayContent(): string {
78
+ if (this.dot) return "";
79
+ if (this.max !== undefined && !Number.isNaN(Number(this.content))) {
80
+ const count = Number(this.content);
81
+ if (count > this.max) {
82
+ return `${this.max}+`;
83
+ }
84
+ }
85
+ return this.content;
86
+ }
87
+
88
+ override render(): TemplateResult {
89
+ const classes = {
90
+ "ds-badge": true,
91
+ };
92
+
93
+ return html`
94
+ <span
95
+ class=${classMap(classes)}
96
+ role="status"
97
+ data-variant=${this.variant}
98
+ data-size=${this.size !== "md" ? this.size : nothing}
99
+ ?data-outline=${this.outline}
100
+ ?data-dot=${this.dot}
101
+ data-position=${this.position}
102
+ ?data-pulse=${this.pulse}
103
+ aria-label=${this.dot ? "Notification indicator" : `${this.displayContent} notifications`}
104
+ >
105
+ ${this.dot ? nothing : this.displayContent}
106
+ </span>
107
+ `;
108
+ }
109
+ }
110
+
111
+ // Register the component
112
+ define("ds-badge", DsBadge);
113
+
114
+ // TypeScript declaration for HTML
115
+ declare global {
116
+ interface HTMLElementTagNameMap {
117
+ "ds-badge": DsBadge;
118
+ }
119
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Badge component exports
3
+ */
4
+ export {
5
+ DsBadge,
6
+ type BadgeVariant,
7
+ type BadgeSize,
8
+ type BadgePosition,
9
+ } from "./badge.js";