@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,360 @@
1
+ /**
2
+ * AlertDialog compound component exports.
3
+ *
4
+ * AlertDialog is used for important confirmations that require explicit user action.
5
+ * Unlike Dialog, it cannot be dismissed by clicking outside or pressing Escape.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * import { AlertDialog } from "@/components/ui";
10
+ *
11
+ * <AlertDialog.Root>
12
+ * <AlertDialog.Trigger>
13
+ * <button>Delete Account</button>
14
+ * </AlertDialog.Trigger>
15
+ * <AlertDialog.Content>
16
+ * <AlertDialog.Header>
17
+ * <AlertDialog.Title>Are you absolutely sure?</AlertDialog.Title>
18
+ * <AlertDialog.Description>
19
+ * This action cannot be undone.
20
+ * </AlertDialog.Description>
21
+ * </AlertDialog.Header>
22
+ * <AlertDialog.Footer>
23
+ * <AlertDialog.Cancel>
24
+ * <button>Cancel</button>
25
+ * </AlertDialog.Cancel>
26
+ * <AlertDialog.Action>
27
+ * <button>Delete</button>
28
+ * </AlertDialog.Action>
29
+ * </AlertDialog.Footer>
30
+ * </AlertDialog.Content>
31
+ * </AlertDialog.Root>
32
+ * ```
33
+ */
34
+
35
+ import {
36
+ type HTMLAttributes,
37
+ type ReactNode,
38
+ createElement,
39
+ forwardRef,
40
+ useCallback,
41
+ useEffect,
42
+ useRef,
43
+ useState,
44
+ } from "react";
45
+
46
+ // ============================================================================
47
+ // Types
48
+ // ============================================================================
49
+
50
+ export type AlertDialogContentSize = "sm" | "md" | "lg" | "xl" | "full";
51
+
52
+ export interface AlertDialogRootProps extends HTMLAttributes<HTMLElement> {
53
+ /** Content */
54
+ children?: ReactNode;
55
+ /** Controlled open state */
56
+ open?: boolean;
57
+ /** Default open state (uncontrolled) */
58
+ defaultOpen?: boolean;
59
+ /** Called when open state changes */
60
+ onOpenChange?: (open: boolean) => void;
61
+ /** Whether to animate open/close transitions */
62
+ animated?: boolean;
63
+ }
64
+
65
+ export interface AlertDialogTriggerProps extends HTMLAttributes<HTMLElement> {
66
+ /** Trigger content (typically a button) */
67
+ children?: ReactNode;
68
+ }
69
+
70
+ export interface AlertDialogContentProps extends HTMLAttributes<HTMLElement> {
71
+ /** Content */
72
+ children?: ReactNode;
73
+ /** Size of the content */
74
+ size?: AlertDialogContentSize;
75
+ }
76
+
77
+ export interface AlertDialogHeaderProps extends HTMLAttributes<HTMLElement> {
78
+ /** Header content */
79
+ children?: ReactNode;
80
+ }
81
+
82
+ export interface AlertDialogFooterProps extends HTMLAttributes<HTMLElement> {
83
+ /** Footer content */
84
+ children?: ReactNode;
85
+ }
86
+
87
+ export interface AlertDialogTitleProps extends HTMLAttributes<HTMLElement> {
88
+ /** Title content */
89
+ children?: ReactNode;
90
+ }
91
+
92
+ export interface AlertDialogDescriptionProps extends HTMLAttributes<HTMLElement> {
93
+ /** Description content */
94
+ children?: ReactNode;
95
+ }
96
+
97
+ export interface AlertDialogActionProps extends HTMLAttributes<HTMLElement> {
98
+ /** Action button content */
99
+ children?: ReactNode;
100
+ /** Called when action is clicked */
101
+ onClick?: () => void;
102
+ }
103
+
104
+ export interface AlertDialogCancelProps extends HTMLAttributes<HTMLElement> {
105
+ /** Cancel button content */
106
+ children?: ReactNode;
107
+ /** Called when cancel is clicked */
108
+ onClick?: () => void;
109
+ }
110
+
111
+ // ============================================================================
112
+ // Components
113
+ // ============================================================================
114
+
115
+ /**
116
+ * AlertDialog root component.
117
+ */
118
+ const AlertDialogRoot = forwardRef<HTMLElement, AlertDialogRootProps>(function AlertDialogRoot(
119
+ {
120
+ children,
121
+ className,
122
+ open: controlledOpen,
123
+ defaultOpen = false,
124
+ onOpenChange,
125
+ animated = true,
126
+ ...props
127
+ },
128
+ ref
129
+ ) {
130
+ const [internalOpen, setInternalOpen] = useState(defaultOpen);
131
+ const isControlled = controlledOpen !== undefined;
132
+ const open = isControlled ? controlledOpen : internalOpen;
133
+ const elementRef = useRef<HTMLElement>(null);
134
+
135
+ // Combine refs
136
+ const combinedRef = (node: HTMLElement | null) => {
137
+ (elementRef as React.MutableRefObject<HTMLElement | null>).current = node;
138
+ if (typeof ref === "function") {
139
+ ref(node);
140
+ } else if (ref) {
141
+ (ref as React.MutableRefObject<HTMLElement | null>).current = node;
142
+ }
143
+ };
144
+
145
+ const handleOpenChange = useCallback(
146
+ (event: Event) => {
147
+ const customEvent = event as CustomEvent;
148
+ const isOpen = customEvent.type === "ds:open";
149
+
150
+ if (!isControlled) {
151
+ setInternalOpen(isOpen);
152
+ }
153
+ onOpenChange?.(isOpen);
154
+ },
155
+ [isControlled, onOpenChange]
156
+ );
157
+
158
+ // Attach event listeners
159
+ useEffect(() => {
160
+ const element = elementRef.current;
161
+ if (!element) return;
162
+
163
+ element.addEventListener("ds:open", handleOpenChange);
164
+ element.addEventListener("ds:close", handleOpenChange);
165
+
166
+ return () => {
167
+ element.removeEventListener("ds:open", handleOpenChange);
168
+ element.removeEventListener("ds:close", handleOpenChange);
169
+ };
170
+ }, [handleOpenChange]);
171
+
172
+ return createElement(
173
+ "ds-alert-dialog",
174
+ {
175
+ ref: combinedRef,
176
+ class: className,
177
+ open: open || undefined,
178
+ animated: animated || undefined,
179
+ ...props,
180
+ },
181
+ children
182
+ );
183
+ });
184
+ AlertDialogRoot.displayName = "AlertDialog.Root";
185
+
186
+ /**
187
+ * AlertDialog trigger component.
188
+ */
189
+ const AlertDialogTrigger = forwardRef<HTMLElement, AlertDialogTriggerProps>(
190
+ function AlertDialogTrigger({ children, className, ...props }, ref) {
191
+ return createElement("ds-alert-dialog-trigger", { ref, class: className, ...props }, children);
192
+ }
193
+ );
194
+ AlertDialogTrigger.displayName = "AlertDialog.Trigger";
195
+
196
+ /**
197
+ * AlertDialog content component.
198
+ */
199
+ const AlertDialogContent = forwardRef<HTMLElement, AlertDialogContentProps>(
200
+ function AlertDialogContent({ children, className, size = "md", ...props }, ref) {
201
+ return createElement(
202
+ "ds-alert-dialog-content",
203
+ { ref, class: className, size, ...props },
204
+ children
205
+ );
206
+ }
207
+ );
208
+ AlertDialogContent.displayName = "AlertDialog.Content";
209
+
210
+ /**
211
+ * AlertDialog header component.
212
+ */
213
+ const AlertDialogHeader = forwardRef<HTMLElement, AlertDialogHeaderProps>(
214
+ function AlertDialogHeader({ children, className, ...props }, ref) {
215
+ return createElement("ds-alert-dialog-header", { ref, class: className, ...props }, children);
216
+ }
217
+ );
218
+ AlertDialogHeader.displayName = "AlertDialog.Header";
219
+
220
+ /**
221
+ * AlertDialog footer component.
222
+ */
223
+ const AlertDialogFooter = forwardRef<HTMLElement, AlertDialogFooterProps>(
224
+ function AlertDialogFooter({ children, className, ...props }, ref) {
225
+ return createElement("ds-alert-dialog-footer", { ref, class: className, ...props }, children);
226
+ }
227
+ );
228
+ AlertDialogFooter.displayName = "AlertDialog.Footer";
229
+
230
+ /**
231
+ * AlertDialog title component.
232
+ */
233
+ const AlertDialogTitle = forwardRef<HTMLElement, AlertDialogTitleProps>(function AlertDialogTitle(
234
+ { children, className, ...props },
235
+ ref
236
+ ) {
237
+ return createElement("ds-alert-dialog-title", { ref, class: className, ...props }, children);
238
+ });
239
+ AlertDialogTitle.displayName = "AlertDialog.Title";
240
+
241
+ /**
242
+ * AlertDialog description component.
243
+ */
244
+ const AlertDialogDescription = forwardRef<HTMLElement, AlertDialogDescriptionProps>(
245
+ function AlertDialogDescription({ children, className, ...props }, ref) {
246
+ return createElement(
247
+ "ds-alert-dialog-description",
248
+ { ref, class: className, ...props },
249
+ children
250
+ );
251
+ }
252
+ );
253
+ AlertDialogDescription.displayName = "AlertDialog.Description";
254
+
255
+ /**
256
+ * AlertDialog action component.
257
+ */
258
+ const AlertDialogAction = forwardRef<HTMLElement, AlertDialogActionProps>(
259
+ function AlertDialogAction({ children, className, onClick, ...props }, ref) {
260
+ const elementRef = useRef<HTMLElement>(null);
261
+
262
+ // Combine refs
263
+ const combinedRef = (node: HTMLElement | null) => {
264
+ (elementRef as React.MutableRefObject<HTMLElement | null>).current = node;
265
+ if (typeof ref === "function") {
266
+ ref(node);
267
+ } else if (ref) {
268
+ (ref as React.MutableRefObject<HTMLElement | null>).current = node;
269
+ }
270
+ };
271
+
272
+ // Attach click handler
273
+ useEffect(() => {
274
+ const element = elementRef.current;
275
+ if (!element || !onClick) return;
276
+
277
+ const handleClick = () => onClick();
278
+ element.addEventListener("click", handleClick);
279
+
280
+ return () => {
281
+ element.removeEventListener("click", handleClick);
282
+ };
283
+ }, [onClick]);
284
+
285
+ return createElement(
286
+ "ds-alert-dialog-action",
287
+ { ref: combinedRef, class: className, ...props },
288
+ children
289
+ );
290
+ }
291
+ );
292
+ AlertDialogAction.displayName = "AlertDialog.Action";
293
+
294
+ /**
295
+ * AlertDialog cancel component.
296
+ */
297
+ const AlertDialogCancel = forwardRef<HTMLElement, AlertDialogCancelProps>(
298
+ function AlertDialogCancel({ children, className, onClick, ...props }, ref) {
299
+ const elementRef = useRef<HTMLElement>(null);
300
+
301
+ // Combine refs
302
+ const combinedRef = (node: HTMLElement | null) => {
303
+ (elementRef as React.MutableRefObject<HTMLElement | null>).current = node;
304
+ if (typeof ref === "function") {
305
+ ref(node);
306
+ } else if (ref) {
307
+ (ref as React.MutableRefObject<HTMLElement | null>).current = node;
308
+ }
309
+ };
310
+
311
+ // Attach click handler
312
+ useEffect(() => {
313
+ const element = elementRef.current;
314
+ if (!element || !onClick) return;
315
+
316
+ const handleClick = () => onClick();
317
+ element.addEventListener("click", handleClick);
318
+
319
+ return () => {
320
+ element.removeEventListener("click", handleClick);
321
+ };
322
+ }, [onClick]);
323
+
324
+ return createElement(
325
+ "ds-alert-dialog-cancel",
326
+ { ref: combinedRef, class: className, ...props },
327
+ children
328
+ );
329
+ }
330
+ );
331
+ AlertDialogCancel.displayName = "AlertDialog.Cancel";
332
+
333
+ // ============================================================================
334
+ // Compound Component
335
+ // ============================================================================
336
+
337
+ export const AlertDialog = {
338
+ Root: AlertDialogRoot,
339
+ Trigger: AlertDialogTrigger,
340
+ Content: AlertDialogContent,
341
+ Header: AlertDialogHeader,
342
+ Footer: AlertDialogFooter,
343
+ Title: AlertDialogTitle,
344
+ Description: AlertDialogDescription,
345
+ Action: AlertDialogAction,
346
+ Cancel: AlertDialogCancel,
347
+ };
348
+
349
+ // Also export individual components
350
+ export {
351
+ AlertDialogRoot,
352
+ AlertDialogTrigger,
353
+ AlertDialogContent,
354
+ AlertDialogHeader,
355
+ AlertDialogFooter,
356
+ AlertDialogTitle,
357
+ AlertDialogDescription,
358
+ AlertDialogAction,
359
+ AlertDialogCancel,
360
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * AlertDialogAction component - confirms the action and closes the dialog.
3
+ *
4
+ * @element ds-alert-dialog-action
5
+ *
6
+ * @slot - Action button content
7
+ *
8
+ * @fires ds:alert-dialog-action - Fired when action is clicked
9
+ */
10
+
11
+ import { html } from "lit";
12
+ import { DSElement } from "../../base/ds-element.js";
13
+ import { emitEvent } from "../../events/emit.js";
14
+ import { define } from "../../registry/define.js";
15
+
16
+ export class DsAlertDialogAction extends DSElement {
17
+ override connectedCallback(): void {
18
+ super.connectedCallback();
19
+ this.addEventListener("click", this.handleClick);
20
+ }
21
+
22
+ override disconnectedCallback(): void {
23
+ super.disconnectedCallback();
24
+ this.removeEventListener("click", this.handleClick);
25
+ }
26
+
27
+ private handleClick = (): void => {
28
+ // Emit action event - parent will handle closing
29
+ emitEvent(this, "ds:alert-dialog-action", { bubbles: true });
30
+ };
31
+
32
+ override render() {
33
+ return html`<slot></slot>`;
34
+ }
35
+ }
36
+
37
+ define("ds-alert-dialog-action", DsAlertDialogAction);
38
+
39
+ declare global {
40
+ interface HTMLElementTagNameMap {
41
+ "ds-alert-dialog-action": DsAlertDialogAction;
42
+ }
43
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * AlertDialogCancel component - cancels the action and closes the dialog.
3
+ *
4
+ * @element ds-alert-dialog-cancel
5
+ *
6
+ * @slot - Cancel button content
7
+ *
8
+ * @fires ds:alert-dialog-cancel - Fired when cancel is clicked
9
+ */
10
+
11
+ import { html } from "lit";
12
+ import { DSElement } from "../../base/ds-element.js";
13
+ import { emitEvent } from "../../events/emit.js";
14
+ import { define } from "../../registry/define.js";
15
+
16
+ export class DsAlertDialogCancel extends DSElement {
17
+ override connectedCallback(): void {
18
+ super.connectedCallback();
19
+ this.addEventListener("click", this.handleClick);
20
+ }
21
+
22
+ override disconnectedCallback(): void {
23
+ super.disconnectedCallback();
24
+ this.removeEventListener("click", this.handleClick);
25
+ }
26
+
27
+ private handleClick = (): void => {
28
+ // Emit cancel event - parent will handle closing
29
+ emitEvent(this, "ds:alert-dialog-cancel", { bubbles: true });
30
+ };
31
+
32
+ override render() {
33
+ return html`<slot></slot>`;
34
+ }
35
+ }
36
+
37
+ define("ds-alert-dialog-cancel", DsAlertDialogCancel);
38
+
39
+ declare global {
40
+ interface HTMLElementTagNameMap {
41
+ "ds-alert-dialog-cancel": DsAlertDialogCancel;
42
+ }
43
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * AlertDialogContent component - container for alert dialog content.
3
+ *
4
+ * @element ds-alert-dialog-content
5
+ *
6
+ * @slot - Alert dialog content (header, body, footer)
7
+ */
8
+
9
+ import { html } from "lit";
10
+ import { property } from "lit/decorators.js";
11
+ import { DSElement } from "../../base/ds-element.js";
12
+ import { define } from "../../registry/define.js";
13
+
14
+ export type AlertDialogContentSize = "sm" | "md" | "lg" | "xl" | "full";
15
+
16
+ export class DsAlertDialogContent extends DSElement {
17
+ /** Size of the alert dialog content */
18
+ @property({ reflect: true })
19
+ size: AlertDialogContentSize = "md";
20
+
21
+ /** Data state for animations */
22
+ @property({ attribute: "data-state", reflect: true })
23
+ dataState: "open" | "closed" = "closed";
24
+
25
+ override connectedCallback(): void {
26
+ super.connectedCallback();
27
+
28
+ // ARIA attributes are set by parent DsAlertDialog
29
+ }
30
+
31
+ override render() {
32
+ return html`<slot></slot>`;
33
+ }
34
+ }
35
+
36
+ define("ds-alert-dialog-content", DsAlertDialogContent);
37
+
38
+ declare global {
39
+ interface HTMLElementTagNameMap {
40
+ "ds-alert-dialog-content": DsAlertDialogContent;
41
+ }
42
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * AlertDialogDescription component - description for the alert dialog.
3
+ *
4
+ * @element ds-alert-dialog-description
5
+ *
6
+ * @slot - Description 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 DsAlertDialogDescription extends DSElement {
14
+ override connectedCallback(): void {
15
+ super.connectedCallback();
16
+
17
+ // Generate ID if not present (for aria-describedby)
18
+ if (!this.id) {
19
+ this.id = `alert-dialog-desc-${crypto.randomUUID().slice(0, 8)}`;
20
+ }
21
+ }
22
+
23
+ override render() {
24
+ return html`<slot></slot>`;
25
+ }
26
+ }
27
+
28
+ define("ds-alert-dialog-description", DsAlertDialogDescription);
29
+
30
+ declare global {
31
+ interface HTMLElementTagNameMap {
32
+ "ds-alert-dialog-description": DsAlertDialogDescription;
33
+ }
34
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * AlertDialogFooter component - footer section for alert dialog actions.
3
+ *
4
+ * @element ds-alert-dialog-footer
5
+ *
6
+ * @slot - Footer content (action and cancel buttons)
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 DsAlertDialogFooter extends DSElement {
14
+ override render() {
15
+ return html`<slot></slot>`;
16
+ }
17
+ }
18
+
19
+ define("ds-alert-dialog-footer", DsAlertDialogFooter);
20
+
21
+ declare global {
22
+ interface HTMLElementTagNameMap {
23
+ "ds-alert-dialog-footer": DsAlertDialogFooter;
24
+ }
25
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * AlertDialogHeader component - header section for alert dialog.
3
+ *
4
+ * @element ds-alert-dialog-header
5
+ *
6
+ * @slot - Header content (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 DsAlertDialogHeader extends DSElement {
14
+ override render() {
15
+ return html`<slot></slot>`;
16
+ }
17
+ }
18
+
19
+ define("ds-alert-dialog-header", DsAlertDialogHeader);
20
+
21
+ declare global {
22
+ interface HTMLElementTagNameMap {
23
+ "ds-alert-dialog-header": DsAlertDialogHeader;
24
+ }
25
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * AlertDialogTitle component - title for the alert dialog.
3
+ *
4
+ * @element ds-alert-dialog-title
5
+ *
6
+ * @slot - Title 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 DsAlertDialogTitle extends DSElement {
14
+ override connectedCallback(): void {
15
+ super.connectedCallback();
16
+
17
+ // Generate ID if not present (for aria-labelledby)
18
+ if (!this.id) {
19
+ this.id = `alert-dialog-title-${crypto.randomUUID().slice(0, 8)}`;
20
+ }
21
+ }
22
+
23
+ override render() {
24
+ return html`<slot></slot>`;
25
+ }
26
+ }
27
+
28
+ define("ds-alert-dialog-title", DsAlertDialogTitle);
29
+
30
+ declare global {
31
+ interface HTMLElementTagNameMap {
32
+ "ds-alert-dialog-title": DsAlertDialogTitle;
33
+ }
34
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * AlertDialogTrigger component - element that opens the alert dialog.
3
+ *
4
+ * @element ds-alert-dialog-trigger
5
+ *
6
+ * @slot - Trigger content (typically a button)
7
+ */
8
+
9
+ import { html } from "lit";
10
+ import { DSElement } from "../../base/ds-element.js";
11
+ import { define } from "../../registry/define.js";
12
+ import type { DsAlertDialog } from "./alert-dialog.js";
13
+
14
+ export class DsAlertDialogTrigger extends DSElement {
15
+ override connectedCallback(): void {
16
+ super.connectedCallback();
17
+
18
+ // Set slot attribute
19
+ this.setAttribute("slot", "trigger");
20
+
21
+ // Add click handler
22
+ this.addEventListener("click", this.handleClick);
23
+ }
24
+
25
+ override disconnectedCallback(): void {
26
+ super.disconnectedCallback();
27
+ this.removeEventListener("click", this.handleClick);
28
+ }
29
+
30
+ private handleClick = (): void => {
31
+ const alertDialog = this.closest("ds-alert-dialog") as DsAlertDialog | null;
32
+ alertDialog?.show();
33
+ };
34
+
35
+ override render() {
36
+ return html`<slot></slot>`;
37
+ }
38
+ }
39
+
40
+ define("ds-alert-dialog-trigger", DsAlertDialogTrigger);
41
+
42
+ declare global {
43
+ interface HTMLElementTagNameMap {
44
+ "ds-alert-dialog-trigger": DsAlertDialogTrigger;
45
+ }
46
+ }