@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,59 @@
1
+ /**
2
+ * Slider Range component - visual indicator of the selected range.
3
+ */
4
+
5
+ import { type HTMLAttributes, forwardRef } from "react";
6
+ import { useSliderContext } from "./slider-context.js";
7
+
8
+ export interface SliderRangeProps extends HTMLAttributes<HTMLDivElement> {}
9
+
10
+ /**
11
+ * Visual range indicator within the slider track.
12
+ * Automatically positions based on current value or range.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * <Slider.Track>
17
+ * <Slider.Range />
18
+ * <Slider.Thumb />
19
+ * </Slider.Track>
20
+ * ```
21
+ */
22
+ export const SliderRange = forwardRef<HTMLDivElement, SliderRangeProps>(
23
+ ({ className, style, ...restProps }, ref) => {
24
+ const { behavior, range, orientation } = useSliderContext("Slider.Range");
25
+ const { state } = behavior;
26
+
27
+ // Calculate percentage positions
28
+ const singlePercent = behavior.valueToPercent(state.value);
29
+ const minPercent = behavior.valueToPercent(state.rangeValue.min);
30
+ const maxPercent = behavior.valueToPercent(state.rangeValue.max);
31
+
32
+ const isVertical = orientation === "vertical";
33
+
34
+ // Build inline style for positioning
35
+ let positionStyle: React.CSSProperties;
36
+
37
+ if (range) {
38
+ positionStyle = isVertical
39
+ ? { bottom: `${minPercent}%`, height: `${maxPercent - minPercent}%` }
40
+ : { left: `${minPercent}%`, width: `${maxPercent - minPercent}%` };
41
+ } else {
42
+ positionStyle = isVertical
43
+ ? { bottom: "0%", height: `${singlePercent}%` }
44
+ : { left: "0%", width: `${singlePercent}%` };
45
+ }
46
+
47
+ return (
48
+ <div
49
+ ref={ref}
50
+ className={className}
51
+ style={{ ...positionStyle, ...style }}
52
+ data-orientation={orientation}
53
+ {...restProps}
54
+ />
55
+ );
56
+ }
57
+ );
58
+
59
+ SliderRange.displayName = "Slider.Range";
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Slider Root component - provides context to all Slider compound components.
3
+ */
4
+
5
+ import { createSliderBehavior } from "@hypoth-ui/primitives-dom";
6
+ import { type ReactNode, useCallback, useMemo, useState } from "react";
7
+ import { SliderProvider } from "./slider-context.js";
8
+
9
+ export interface SliderRootProps {
10
+ /** Slider content */
11
+ children?: ReactNode;
12
+ /** Minimum allowed value */
13
+ min?: number;
14
+ /** Maximum allowed value */
15
+ max?: number;
16
+ /** Step increment */
17
+ step?: number;
18
+ /** Controlled value (single mode) */
19
+ value?: number;
20
+ /** Default value (single mode, uncontrolled) */
21
+ defaultValue?: number;
22
+ /** Called when value changes */
23
+ onValueChange?: (value: number) => void;
24
+ /** Range mode (two thumbs) */
25
+ range?: boolean;
26
+ /** Controlled range values */
27
+ rangeValue?: { min: number; max: number };
28
+ /** Default range values */
29
+ defaultRangeValue?: { min: number; max: number };
30
+ /** Called when range changes */
31
+ onRangeChange?: (range: { min: number; max: number }) => void;
32
+ /** Orientation */
33
+ orientation?: "horizontal" | "vertical";
34
+ /** Disabled state */
35
+ disabled?: boolean;
36
+ /** Value text formatter for screen readers */
37
+ formatValueText?: (value: number) => string;
38
+ }
39
+
40
+ /**
41
+ * Root component for Slider compound pattern.
42
+ * Provides context to Track, Thumb, and Range components.
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * // Single value slider
47
+ * <Slider.Root onValueChange={(value) => console.log(value)}>
48
+ * <Slider.Track>
49
+ * <Slider.Range />
50
+ * <Slider.Thumb />
51
+ * </Slider.Track>
52
+ * </Slider.Root>
53
+ *
54
+ * // Range slider
55
+ * <Slider.Root range onRangeChange={(range) => console.log(range)}>
56
+ * <Slider.Track>
57
+ * <Slider.Range />
58
+ * <Slider.Thumb type="min" />
59
+ * <Slider.Thumb type="max" />
60
+ * </Slider.Track>
61
+ * </Slider.Root>
62
+ * ```
63
+ */
64
+ export function SliderRoot({
65
+ children,
66
+ min = 0,
67
+ max = 100,
68
+ step = 1,
69
+ value: controlledValue,
70
+ defaultValue = 0,
71
+ onValueChange,
72
+ range = false,
73
+ rangeValue: controlledRangeValue,
74
+ defaultRangeValue,
75
+ onRangeChange,
76
+ orientation = "horizontal",
77
+ disabled = false,
78
+ formatValueText,
79
+ }: SliderRootProps) {
80
+ // Compute default range if not provided
81
+ const defaultRange = defaultRangeValue ?? { min, max: Math.min(max, min + (max - min) / 2) };
82
+
83
+ // Support controlled and uncontrolled modes for value
84
+ const [internalValue, setInternalValue] = useState(defaultValue);
85
+ const isValueControlled = controlledValue !== undefined;
86
+ const value = isValueControlled ? controlledValue : internalValue;
87
+
88
+ // Support controlled and uncontrolled modes for range
89
+ const [internalRangeValue, setInternalRangeValue] = useState(defaultRange);
90
+ const isRangeControlled = controlledRangeValue !== undefined;
91
+ const rangeValue = isRangeControlled ? controlledRangeValue : internalRangeValue;
92
+
93
+ const setValue = useCallback(
94
+ (nextValue: number) => {
95
+ if (!isValueControlled) {
96
+ setInternalValue(nextValue);
97
+ }
98
+ onValueChange?.(nextValue);
99
+ },
100
+ [isValueControlled, onValueChange]
101
+ );
102
+
103
+ const setRangeValue = useCallback(
104
+ (nextRange: { min: number; max: number }) => {
105
+ if (!isRangeControlled) {
106
+ setInternalRangeValue(nextRange);
107
+ }
108
+ onRangeChange?.(nextRange);
109
+ },
110
+ [isRangeControlled, onRangeChange]
111
+ );
112
+
113
+ // Create behavior instance
114
+ // biome-ignore lint/correctness/useExhaustiveDependencies: behavior is created once
115
+ const behavior = useMemo(
116
+ () =>
117
+ createSliderBehavior({
118
+ min,
119
+ max,
120
+ step,
121
+ defaultValue: value,
122
+ defaultRange: rangeValue,
123
+ range,
124
+ orientation,
125
+ disabled,
126
+ onValueChange: setValue,
127
+ onRangeChange: setRangeValue,
128
+ }),
129
+ []
130
+ );
131
+
132
+ const contextValue = useMemo(
133
+ () => ({
134
+ behavior,
135
+ value,
136
+ setValue,
137
+ rangeValue,
138
+ setRangeValue,
139
+ range,
140
+ min,
141
+ max,
142
+ step,
143
+ orientation,
144
+ disabled,
145
+ formatValueText,
146
+ }),
147
+ [
148
+ behavior,
149
+ value,
150
+ setValue,
151
+ rangeValue,
152
+ setRangeValue,
153
+ range,
154
+ min,
155
+ max,
156
+ step,
157
+ orientation,
158
+ disabled,
159
+ formatValueText,
160
+ ]
161
+ );
162
+
163
+ return <SliderProvider value={contextValue}>{children}</SliderProvider>;
164
+ }
165
+
166
+ SliderRoot.displayName = "Slider.Root";
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Slider Thumb component - draggable handle for value selection.
3
+ */
4
+
5
+ import type { ThumbType } from "@hypoth-ui/primitives-dom";
6
+ import {
7
+ type HTMLAttributes,
8
+ type KeyboardEvent,
9
+ type PointerEvent as ReactPointerEvent,
10
+ forwardRef,
11
+ useCallback,
12
+ useEffect,
13
+ useRef,
14
+ useState,
15
+ } from "react";
16
+ import { useSliderContext } from "./slider-context.js";
17
+
18
+ export interface SliderThumbProps extends HTMLAttributes<HTMLDivElement> {
19
+ /** Thumb type for range mode */
20
+ type?: "single" | "min" | "max";
21
+ /** Accessible label */
22
+ "aria-label"?: string;
23
+ }
24
+
25
+ /**
26
+ * Draggable thumb for selecting values.
27
+ * In range mode, use type="min" and type="max" for the two thumbs.
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * // Single thumb
32
+ * <Slider.Thumb />
33
+ *
34
+ * // Range thumbs
35
+ * <Slider.Thumb type="min" aria-label="Minimum price" />
36
+ * <Slider.Thumb type="max" aria-label="Maximum price" />
37
+ * ```
38
+ */
39
+ export const SliderThumb = forwardRef<HTMLDivElement, SliderThumbProps>(
40
+ (
41
+ {
42
+ type = "single",
43
+ className,
44
+ style,
45
+ "aria-label": ariaLabel,
46
+ onPointerDown,
47
+ onKeyDown,
48
+ ...restProps
49
+ },
50
+ ref
51
+ ) => {
52
+ const { behavior, range, min, max, orientation, disabled, formatValueText } =
53
+ useSliderContext("Slider.Thumb");
54
+ const internalRef = useRef<HTMLDivElement>(null);
55
+ const [isDragging, setIsDragging] = useState(false);
56
+
57
+ // Merge refs
58
+ const mergedRef = useCallback(
59
+ (element: HTMLDivElement | null) => {
60
+ (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = element;
61
+ if (typeof ref === "function") {
62
+ ref(element);
63
+ } else if (ref) {
64
+ (ref as React.MutableRefObject<HTMLDivElement | null>).current = element;
65
+ }
66
+ },
67
+ [ref]
68
+ );
69
+
70
+ // Determine actual thumb type
71
+ const thumbType: ThumbType = range ? (type as "min" | "max") : "single";
72
+
73
+ // Get current value for this thumb
74
+ const { state } = behavior;
75
+ const value =
76
+ thumbType === "single"
77
+ ? state.value
78
+ : thumbType === "min"
79
+ ? state.rangeValue.min
80
+ : state.rangeValue.max;
81
+
82
+ // Calculate position
83
+ const percent = behavior.valueToPercent(value);
84
+ const isVertical = orientation === "vertical";
85
+ const positionStyle: React.CSSProperties = isVertical
86
+ ? { bottom: `${percent}%` }
87
+ : { left: `${percent}%` };
88
+
89
+ // Determine value constraints
90
+ let valueMin = min;
91
+ let valueMax = max;
92
+ if (range) {
93
+ if (thumbType === "min") {
94
+ valueMax = state.rangeValue.max;
95
+ } else if (thumbType === "max") {
96
+ valueMin = state.rangeValue.min;
97
+ }
98
+ }
99
+
100
+ // Value text for screen readers
101
+ const valueText = formatValueText ? formatValueText(value) : String(value);
102
+
103
+ // Pointer event handlers
104
+ const handlePointerDown = useCallback(
105
+ (event: ReactPointerEvent<HTMLDivElement>) => {
106
+ if (disabled) return;
107
+
108
+ event.preventDefault();
109
+ (event.target as HTMLElement).setPointerCapture(event.pointerId);
110
+
111
+ behavior.startDrag(thumbType, event.nativeEvent as PointerEvent);
112
+ setIsDragging(true);
113
+
114
+ onPointerDown?.(event);
115
+ },
116
+ [behavior, thumbType, disabled, onPointerDown]
117
+ );
118
+
119
+ // Global pointer move/up handlers
120
+ useEffect(() => {
121
+ if (!isDragging) return;
122
+
123
+ const handlePointerMove = (event: globalThis.PointerEvent) => {
124
+ behavior.drag(event);
125
+ };
126
+
127
+ const handlePointerUp = () => {
128
+ behavior.endDrag();
129
+ setIsDragging(false);
130
+ };
131
+
132
+ document.addEventListener("pointermove", handlePointerMove);
133
+ document.addEventListener("pointerup", handlePointerUp);
134
+
135
+ return () => {
136
+ document.removeEventListener("pointermove", handlePointerMove);
137
+ document.removeEventListener("pointerup", handlePointerUp);
138
+ };
139
+ }, [behavior, isDragging]);
140
+
141
+ // Keyboard handlers
142
+ const handleKeyDown = useCallback(
143
+ (event: KeyboardEvent<HTMLDivElement>) => {
144
+ if (disabled) return;
145
+
146
+ switch (event.key) {
147
+ case "ArrowRight":
148
+ case "ArrowUp":
149
+ event.preventDefault();
150
+ if (isVertical ? event.key === "ArrowUp" : event.key === "ArrowRight") {
151
+ behavior.increment(thumbType);
152
+ } else {
153
+ behavior.decrement(thumbType);
154
+ }
155
+ break;
156
+ case "ArrowLeft":
157
+ case "ArrowDown":
158
+ event.preventDefault();
159
+ if (isVertical ? event.key === "ArrowDown" : event.key === "ArrowLeft") {
160
+ behavior.decrement(thumbType);
161
+ } else {
162
+ behavior.increment(thumbType);
163
+ }
164
+ break;
165
+ case "PageUp":
166
+ event.preventDefault();
167
+ behavior.increment(thumbType, true);
168
+ break;
169
+ case "PageDown":
170
+ event.preventDefault();
171
+ behavior.decrement(thumbType, true);
172
+ break;
173
+ case "Home":
174
+ event.preventDefault();
175
+ behavior.setToMin(thumbType);
176
+ break;
177
+ case "End":
178
+ event.preventDefault();
179
+ behavior.setToMax(thumbType);
180
+ break;
181
+ }
182
+
183
+ onKeyDown?.(event);
184
+ },
185
+ [behavior, thumbType, isVertical, disabled, onKeyDown]
186
+ );
187
+
188
+ return (
189
+ <div
190
+ ref={mergedRef}
191
+ role="slider"
192
+ tabIndex={disabled ? -1 : 0}
193
+ aria-label={ariaLabel}
194
+ aria-valuemin={valueMin}
195
+ aria-valuemax={valueMax}
196
+ aria-valuenow={value}
197
+ aria-valuetext={valueText}
198
+ aria-orientation={orientation}
199
+ aria-disabled={disabled || undefined}
200
+ className={className}
201
+ style={{ ...positionStyle, ...style }}
202
+ data-thumb={thumbType}
203
+ data-dragging={isDragging || undefined}
204
+ data-disabled={disabled || undefined}
205
+ onPointerDown={handlePointerDown}
206
+ onKeyDown={handleKeyDown}
207
+ {...restProps}
208
+ />
209
+ );
210
+ }
211
+ );
212
+
213
+ SliderThumb.displayName = "Slider.Thumb";
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Slider Track component - the track along which thumbs move.
3
+ */
4
+
5
+ import {
6
+ type HTMLAttributes,
7
+ type ReactNode,
8
+ type PointerEvent as ReactPointerEvent,
9
+ forwardRef,
10
+ useCallback,
11
+ useEffect,
12
+ useRef,
13
+ } from "react";
14
+ import { useSliderContext } from "./slider-context.js";
15
+
16
+ export interface SliderTrackProps extends HTMLAttributes<HTMLDivElement> {
17
+ /** Track content (Range, Thumb components) */
18
+ children?: ReactNode;
19
+ }
20
+
21
+ /**
22
+ * Track component that contains the range and thumb elements.
23
+ * Handles click-to-position functionality.
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * <Slider.Track>
28
+ * <Slider.Range />
29
+ * <Slider.Thumb />
30
+ * </Slider.Track>
31
+ * ```
32
+ */
33
+ export const SliderTrack = forwardRef<HTMLDivElement, SliderTrackProps>(
34
+ ({ children, className, onClick, ...restProps }, ref) => {
35
+ const { behavior, range, orientation, disabled } = useSliderContext("Slider.Track");
36
+ const internalRef = useRef<HTMLDivElement>(null);
37
+
38
+ // Merge refs
39
+ const mergedRef = useCallback(
40
+ (element: HTMLDivElement | null) => {
41
+ (internalRef as React.MutableRefObject<HTMLDivElement | null>).current = element;
42
+ if (typeof ref === "function") {
43
+ ref(element);
44
+ } else if (ref) {
45
+ (ref as React.MutableRefObject<HTMLDivElement | null>).current = element;
46
+ }
47
+ },
48
+ [ref]
49
+ );
50
+
51
+ // Set track element on behavior
52
+ useEffect(() => {
53
+ if (internalRef.current) {
54
+ behavior.trackElement = internalRef.current;
55
+ }
56
+ return () => {
57
+ behavior.trackElement = null;
58
+ };
59
+ }, [behavior]);
60
+
61
+ const handleClick = useCallback(
62
+ (event: ReactPointerEvent<HTMLDivElement>) => {
63
+ if (disabled) return;
64
+
65
+ const track = internalRef.current;
66
+ if (!track) return;
67
+
68
+ // Determine click position as percentage
69
+ const rect = track.getBoundingClientRect();
70
+ let percent: number;
71
+
72
+ if (orientation === "horizontal") {
73
+ percent = ((event.clientX - rect.left) / rect.width) * 100;
74
+ } else {
75
+ percent = 100 - ((event.clientY - rect.top) / rect.height) * 100;
76
+ }
77
+
78
+ // Determine which thumb to move
79
+ const clickValue = behavior.percentToValue(percent);
80
+ let thumb: "single" | "min" | "max" = "single";
81
+
82
+ if (range) {
83
+ const { rangeValue } = behavior.state;
84
+ const minDist = Math.abs(clickValue - rangeValue.min);
85
+ const maxDist = Math.abs(clickValue - rangeValue.max);
86
+ thumb = minDist <= maxDist ? "min" : "max";
87
+ }
88
+
89
+ // Move thumb to click position
90
+ behavior.startDrag(thumb, event.nativeEvent as PointerEvent);
91
+ behavior.endDrag();
92
+
93
+ onClick?.(event);
94
+ },
95
+ [behavior, range, orientation, disabled, onClick]
96
+ );
97
+
98
+ return (
99
+ <div
100
+ ref={mergedRef}
101
+ className={className}
102
+ data-orientation={orientation}
103
+ data-disabled={disabled || undefined}
104
+ onClick={handleClick}
105
+ {...restProps}
106
+ >
107
+ {children}
108
+ </div>
109
+ );
110
+ }
111
+ );
112
+
113
+ SliderTrack.displayName = "Slider.Track";
@@ -0,0 +1 @@
1
+ export { DsSlider } from "./slider.js";