@vielzeug/refine 1.5.4 → 1.8.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/dist/accordion.cjs +1 -1
  2. package/dist/accordion.cjs.map +1 -1
  3. package/dist/accordion.js +30 -28
  4. package/dist/accordion.js.map +1 -1
  5. package/dist/async.cjs +11 -11
  6. package/dist/async.cjs.map +1 -1
  7. package/dist/async.js +1 -2
  8. package/dist/async.js.map +1 -1
  9. package/dist/button-group.cjs.map +1 -1
  10. package/dist/button-group.js.map +1 -1
  11. package/dist/button.cjs +1 -1
  12. package/dist/button.cjs.map +1 -1
  13. package/dist/button.js +1 -0
  14. package/dist/button.js.map +1 -1
  15. package/dist/calendar.cjs +26 -26
  16. package/dist/calendar.cjs.map +1 -1
  17. package/dist/calendar.js +4 -5
  18. package/dist/calendar.js.map +1 -1
  19. package/dist/checkbox-group.cjs +9 -9
  20. package/dist/checkbox-group.cjs.map +1 -1
  21. package/dist/checkbox-group.js +50 -58
  22. package/dist/checkbox-group.js.map +1 -1
  23. package/dist/code-window.cjs +4 -4
  24. package/dist/code-window.cjs.map +1 -1
  25. package/dist/code-window.js +1 -2
  26. package/dist/code-window.js.map +1 -1
  27. package/dist/combobox.cjs +29 -28
  28. package/dist/combobox.cjs.map +1 -1
  29. package/dist/combobox.js +201 -195
  30. package/dist/combobox.js.map +1 -1
  31. package/dist/command-palette.cjs +6 -6
  32. package/dist/command-palette.cjs.map +1 -1
  33. package/dist/command-palette.js +46 -47
  34. package/dist/command-palette.js.map +1 -1
  35. package/dist/content/card/card.css.cjs +1 -1
  36. package/dist/content/card/card.css.cjs.map +1 -1
  37. package/dist/content/card/card.css.js +1 -1
  38. package/dist/content/card/card.css.js.map +1 -1
  39. package/dist/content/chat-message/chat-message.css.cjs +1 -1
  40. package/dist/content/chat-message/chat-message.css.cjs.map +1 -1
  41. package/dist/content/chat-message/chat-message.css.js +1 -1
  42. package/dist/content/chat-message/chat-message.css.js.map +1 -1
  43. package/dist/content/code-window/code-window.d.ts.map +1 -1
  44. package/dist/content/icon/icon.d.ts.map +1 -1
  45. package/dist/content/index.d.ts +4 -0
  46. package/dist/content/index.d.ts.map +1 -1
  47. package/dist/content/list/_list-item-reveal.cjs +2 -0
  48. package/dist/content/list/_list-item-reveal.cjs.map +1 -0
  49. package/dist/content/list/_list-item-reveal.d.ts +25 -0
  50. package/dist/content/list/_list-item-reveal.d.ts.map +1 -0
  51. package/dist/content/list/_list-item-reveal.js +33 -0
  52. package/dist/content/list/_list-item-reveal.js.map +1 -0
  53. package/dist/content/list/list-item.css.cjs +2 -0
  54. package/dist/content/list/list-item.css.cjs.map +1 -0
  55. package/dist/content/list/list-item.css.js +6 -0
  56. package/dist/content/list/list-item.css.js.map +1 -0
  57. package/dist/content/list/list-item.d.ts +111 -0
  58. package/dist/content/list/list-item.d.ts.map +1 -0
  59. package/dist/content/list/list.css.cjs +2 -0
  60. package/dist/content/list/list.css.cjs.map +1 -0
  61. package/dist/content/list/list.css.js +6 -0
  62. package/dist/content/list/list.css.js.map +1 -0
  63. package/dist/content/list/list.d.ts +93 -0
  64. package/dist/content/list/list.d.ts.map +1 -0
  65. package/dist/custom-elements.json +5693 -5090
  66. package/dist/datagrid.cjs +2 -2
  67. package/dist/datagrid.js +206 -206
  68. package/dist/datagrid.js.map +1 -1
  69. package/dist/date-picker.cjs +2 -1
  70. package/dist/date-picker.cjs.map +1 -1
  71. package/dist/date-picker.js +2 -0
  72. package/dist/date-picker.js.map +1 -1
  73. package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
  74. package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
  75. package/dist/drawer.cjs +1 -1
  76. package/dist/drawer.cjs.map +1 -1
  77. package/dist/drawer.js +47 -48
  78. package/dist/drawer.js.map +1 -1
  79. package/dist/feedback/async/async.d.ts.map +1 -1
  80. package/dist/feedback/progress/progress.d.ts.map +1 -1
  81. package/dist/file-input.cjs +108 -42
  82. package/dist/file-input.cjs.map +1 -1
  83. package/dist/file-input.js +215 -156
  84. package/dist/file-input.js.map +1 -1
  85. package/dist/headless/aria-reflection.cjs +2 -0
  86. package/dist/headless/aria-reflection.cjs.map +1 -0
  87. package/dist/headless/aria-reflection.d.ts +27 -0
  88. package/dist/headless/aria-reflection.d.ts.map +1 -0
  89. package/dist/headless/aria-reflection.js +18 -0
  90. package/dist/headless/aria-reflection.js.map +1 -0
  91. package/dist/headless/checkable.cjs +1 -1
  92. package/dist/headless/checkable.cjs.map +1 -1
  93. package/dist/headless/checkable.d.ts +2 -10
  94. package/dist/headless/checkable.d.ts.map +1 -1
  95. package/dist/headless/checkable.js +29 -29
  96. package/dist/headless/checkable.js.map +1 -1
  97. package/dist/headless/choice-field.cjs +1 -1
  98. package/dist/headless/choice-field.cjs.map +1 -1
  99. package/dist/headless/choice-field.d.ts +2 -7
  100. package/dist/headless/choice-field.d.ts.map +1 -1
  101. package/dist/headless/choice-field.js +37 -37
  102. package/dist/headless/choice-field.js.map +1 -1
  103. package/dist/headless/field-base.cjs +1 -1
  104. package/dist/headless/field-base.cjs.map +1 -1
  105. package/dist/headless/field-base.d.ts +17 -0
  106. package/dist/headless/field-base.d.ts.map +1 -1
  107. package/dist/headless/field-base.js +21 -6
  108. package/dist/headless/field-base.js.map +1 -1
  109. package/dist/headless/focus.cjs +1 -1
  110. package/dist/headless/focus.cjs.map +1 -1
  111. package/dist/headless/focus.d.ts +7 -0
  112. package/dist/headless/focus.d.ts.map +1 -1
  113. package/dist/headless/focus.js +6 -6
  114. package/dist/headless/focus.js.map +1 -1
  115. package/dist/headless/index.d.ts +4 -2
  116. package/dist/headless/index.d.ts.map +1 -1
  117. package/dist/headless/nav.cjs +1 -1
  118. package/dist/headless/nav.cjs.map +1 -1
  119. package/dist/headless/nav.d.ts +12 -0
  120. package/dist/headless/nav.d.ts.map +1 -1
  121. package/dist/headless/nav.js +68 -50
  122. package/dist/headless/nav.js.map +1 -1
  123. package/dist/headless/overlay.cjs +1 -1
  124. package/dist/headless/overlay.cjs.map +1 -1
  125. package/dist/headless/overlay.d.ts +2 -0
  126. package/dist/headless/overlay.d.ts.map +1 -1
  127. package/dist/headless/overlay.js +8 -5
  128. package/dist/headless/overlay.js.map +1 -1
  129. package/dist/headless/ref-callback.cjs +2 -0
  130. package/dist/headless/ref-callback.cjs.map +1 -0
  131. package/dist/headless/ref-callback.d.ts +26 -0
  132. package/dist/headless/ref-callback.d.ts.map +1 -0
  133. package/dist/headless/ref-callback.js +13 -0
  134. package/dist/headless/ref-callback.js.map +1 -0
  135. package/dist/headless/swipe.cjs +1 -1
  136. package/dist/headless/swipe.cjs.map +1 -1
  137. package/dist/headless/swipe.d.ts +2 -0
  138. package/dist/headless/swipe.d.ts.map +1 -1
  139. package/dist/headless/swipe.js +26 -21
  140. package/dist/headless/swipe.js.map +1 -1
  141. package/dist/headless.cjs +1 -1
  142. package/dist/headless.js +28 -26
  143. package/dist/icon.cjs +1 -1
  144. package/dist/icon.cjs.map +1 -1
  145. package/dist/icon.js +35 -38
  146. package/dist/icon.js.map +1 -1
  147. package/dist/index.cjs +1 -1
  148. package/dist/index.js +63 -61
  149. package/dist/input.cjs +29 -26
  150. package/dist/input.cjs.map +1 -1
  151. package/dist/input.js +91 -79
  152. package/dist/input.js.map +1 -1
  153. package/dist/inputs/button/button.css.cjs +1 -1
  154. package/dist/inputs/button/button.css.cjs.map +1 -1
  155. package/dist/inputs/button/button.css.js +1 -1
  156. package/dist/inputs/button/button.css.js.map +1 -1
  157. package/dist/inputs/button/button.d.ts +8 -0
  158. package/dist/inputs/button/button.d.ts.map +1 -1
  159. package/dist/inputs/calendar/calendar.d.ts.map +1 -1
  160. package/dist/inputs/checkbox/checkbox.css.cjs +1 -1
  161. package/dist/inputs/checkbox/checkbox.css.cjs.map +1 -1
  162. package/dist/inputs/checkbox/checkbox.css.js +1 -1
  163. package/dist/inputs/checkbox/checkbox.css.js.map +1 -1
  164. package/dist/inputs/combobox/combobox.d.ts +1 -0
  165. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  166. package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
  167. package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
  168. package/dist/inputs/date-picker/date-picker.css.js +1 -1
  169. package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
  170. package/dist/inputs/date-picker/date-picker.d.ts +6 -0
  171. package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
  172. package/dist/inputs/file-input/file-input-upload.cjs +2 -0
  173. package/dist/inputs/file-input/file-input-upload.cjs.map +1 -0
  174. package/dist/inputs/file-input/file-input-upload.d.ts +76 -0
  175. package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -0
  176. package/dist/inputs/file-input/file-input-upload.js +145 -0
  177. package/dist/inputs/file-input/file-input-upload.js.map +1 -0
  178. package/dist/inputs/file-input/file-input.css.cjs +1 -1
  179. package/dist/inputs/file-input/file-input.css.cjs.map +1 -1
  180. package/dist/inputs/file-input/file-input.css.js +1 -1
  181. package/dist/inputs/file-input/file-input.css.js.map +1 -1
  182. package/dist/inputs/file-input/file-input.d.ts +54 -1
  183. package/dist/inputs/file-input/file-input.d.ts.map +1 -1
  184. package/dist/inputs/input/input.css.cjs +1 -1
  185. package/dist/inputs/input/input.css.cjs.map +1 -1
  186. package/dist/inputs/input/input.css.js +1 -1
  187. package/dist/inputs/input/input.css.js.map +1 -1
  188. package/dist/inputs/input/input.d.ts +13 -0
  189. package/dist/inputs/input/input.d.ts.map +1 -1
  190. package/dist/inputs/message-composer/message-composer.css.cjs +1 -1
  191. package/dist/inputs/message-composer/message-composer.css.cjs.map +1 -1
  192. package/dist/inputs/message-composer/message-composer.css.js +1 -1
  193. package/dist/inputs/message-composer/message-composer.css.js.map +1 -1
  194. package/dist/inputs/message-composer/message-composer.d.ts +7 -0
  195. package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
  196. package/dist/inputs/number-input/number-input.css.cjs +1 -1
  197. package/dist/inputs/number-input/number-input.css.cjs.map +1 -1
  198. package/dist/inputs/number-input/number-input.css.js +1 -1
  199. package/dist/inputs/number-input/number-input.css.js.map +1 -1
  200. package/dist/inputs/number-input/number-input.d.ts +15 -0
  201. package/dist/inputs/number-input/number-input.d.ts.map +1 -1
  202. package/dist/inputs/otp-input/otp-input.css.cjs +1 -1
  203. package/dist/inputs/otp-input/otp-input.css.cjs.map +1 -1
  204. package/dist/inputs/otp-input/otp-input.css.js +1 -1
  205. package/dist/inputs/otp-input/otp-input.css.js.map +1 -1
  206. package/dist/inputs/radio/radio.d.ts.map +1 -1
  207. package/dist/inputs/select/select.d.ts +1 -0
  208. package/dist/inputs/select/select.d.ts.map +1 -1
  209. package/dist/inputs/shared/index.d.ts +1 -1
  210. package/dist/inputs/shared/index.d.ts.map +1 -1
  211. package/dist/inputs/shared/templates.cjs +26 -3
  212. package/dist/inputs/shared/templates.cjs.map +1 -1
  213. package/dist/inputs/shared/templates.d.ts +20 -0
  214. package/dist/inputs/shared/templates.d.ts.map +1 -1
  215. package/dist/inputs/shared/templates.js +29 -5
  216. package/dist/inputs/shared/templates.js.map +1 -1
  217. package/dist/inputs/switch/switch.css.cjs +1 -1
  218. package/dist/inputs/switch/switch.css.cjs.map +1 -1
  219. package/dist/inputs/switch/switch.css.js +1 -1
  220. package/dist/inputs/switch/switch.css.js.map +1 -1
  221. package/dist/inputs/switch/switch.d.ts.map +1 -1
  222. package/dist/inputs/textarea/textarea.css.cjs +1 -1
  223. package/dist/inputs/textarea/textarea.css.cjs.map +1 -1
  224. package/dist/inputs/textarea/textarea.css.js +1 -1
  225. package/dist/inputs/textarea/textarea.css.js.map +1 -1
  226. package/dist/inputs/textarea/textarea.d.ts +14 -0
  227. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  228. package/dist/inputs/time-picker/time-picker.css.cjs +1 -1
  229. package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -1
  230. package/dist/inputs/time-picker/time-picker.css.js +1 -1
  231. package/dist/inputs/time-picker/time-picker.css.js.map +1 -1
  232. package/dist/inputs/time-picker/time-picker.d.ts +6 -0
  233. package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
  234. package/dist/list-item.cjs +22 -0
  235. package/dist/list-item.cjs.map +1 -0
  236. package/dist/list-item.js +91 -0
  237. package/dist/list-item.js.map +1 -0
  238. package/dist/list.cjs +2 -0
  239. package/dist/list.cjs.map +1 -0
  240. package/dist/list.js +64 -0
  241. package/dist/list.js.map +1 -0
  242. package/dist/menu.cjs +4 -4
  243. package/dist/menu.cjs.map +1 -1
  244. package/dist/menu.js +60 -59
  245. package/dist/menu.js.map +1 -1
  246. package/dist/message-composer.cjs +14 -20
  247. package/dist/message-composer.cjs.map +1 -1
  248. package/dist/message-composer.js +63 -64
  249. package/dist/message-composer.js.map +1 -1
  250. package/dist/number-input.cjs +5 -3
  251. package/dist/number-input.cjs.map +1 -1
  252. package/dist/number-input.js +8 -4
  253. package/dist/number-input.js.map +1 -1
  254. package/dist/otp-input.cjs +9 -9
  255. package/dist/otp-input.cjs.map +1 -1
  256. package/dist/otp-input.js +70 -62
  257. package/dist/otp-input.js.map +1 -1
  258. package/dist/overlay/menu/menu-item.css.cjs +1 -1
  259. package/dist/overlay/menu/menu-item.css.cjs.map +1 -1
  260. package/dist/overlay/menu/menu-item.css.js +1 -1
  261. package/dist/overlay/menu/menu-item.css.js.map +1 -1
  262. package/dist/overlay/menu/menu-separator.css.cjs +1 -1
  263. package/dist/overlay/menu/menu-separator.css.cjs.map +1 -1
  264. package/dist/overlay/menu/menu-separator.css.js +1 -1
  265. package/dist/overlay/menu/menu-separator.css.js.map +1 -1
  266. package/dist/overlay/menu/menu.css.cjs +1 -1
  267. package/dist/overlay/menu/menu.css.cjs.map +1 -1
  268. package/dist/overlay/menu/menu.css.js +1 -1
  269. package/dist/overlay/menu/menu.css.js.map +1 -1
  270. package/dist/overlay/shared/use-dialog.cjs +1 -1
  271. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  272. package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
  273. package/dist/overlay/shared/use-dialog.js +7 -6
  274. package/dist/overlay/shared/use-dialog.js.map +1 -1
  275. package/dist/progress.cjs +13 -13
  276. package/dist/progress.cjs.map +1 -1
  277. package/dist/progress.js +3 -4
  278. package/dist/progress.js.map +1 -1
  279. package/dist/radio-group.cjs +11 -11
  280. package/dist/radio-group.cjs.map +1 -1
  281. package/dist/radio-group.js +63 -70
  282. package/dist/radio-group.js.map +1 -1
  283. package/dist/radio.cjs +4 -4
  284. package/dist/radio.cjs.map +1 -1
  285. package/dist/radio.js +58 -58
  286. package/dist/radio.js.map +1 -1
  287. package/dist/rating.cjs.map +1 -1
  288. package/dist/rating.js.map +1 -1
  289. package/dist/refine.cjs +502 -309
  290. package/dist/refine.cjs.map +1 -1
  291. package/dist/refine.iife.js +562 -369
  292. package/dist/refine.iife.js.map +1 -1
  293. package/dist/refine.js +558 -365
  294. package/dist/refine.js.map +1 -1
  295. package/dist/select.cjs +21 -21
  296. package/dist/select.cjs.map +1 -1
  297. package/dist/select.js +135 -127
  298. package/dist/select.js.map +1 -1
  299. package/dist/shared/size-presets.cjs +1 -1
  300. package/dist/shared/size-presets.cjs.map +1 -1
  301. package/dist/shared/size-presets.d.ts +74 -0
  302. package/dist/shared/size-presets.d.ts.map +1 -1
  303. package/dist/shared/size-presets.js +48 -1
  304. package/dist/shared/size-presets.js.map +1 -1
  305. package/dist/shared/types.d.ts +5 -0
  306. package/dist/shared/types.d.ts.map +1 -1
  307. package/dist/styles/index.cjs +1 -1
  308. package/dist/styles/index.cjs.map +1 -1
  309. package/dist/styles/index.d.ts +1 -0
  310. package/dist/styles/index.d.ts.map +1 -1
  311. package/dist/styles/index.js +5 -4
  312. package/dist/styles/index.js.map +1 -1
  313. package/dist/styles/mixins/field-variants.css.cjs +85 -0
  314. package/dist/styles/mixins/field-variants.css.cjs.map +1 -0
  315. package/dist/styles/mixins/field-variants.css.d.ts +66 -0
  316. package/dist/styles/mixins/field-variants.css.d.ts.map +1 -0
  317. package/dist/styles/mixins/field-variants.css.js +90 -0
  318. package/dist/styles/mixins/field-variants.css.js.map +1 -0
  319. package/dist/switch.cjs +3 -3
  320. package/dist/switch.cjs.map +1 -1
  321. package/dist/switch.js +38 -36
  322. package/dist/switch.js.map +1 -1
  323. package/dist/tab-item.cjs +8 -8
  324. package/dist/tab-item.cjs.map +1 -1
  325. package/dist/tab-item.js +38 -28
  326. package/dist/tab-item.js.map +1 -1
  327. package/dist/tab-panel.cjs +7 -7
  328. package/dist/tab-panel.cjs.map +1 -1
  329. package/dist/tab-panel.js +33 -26
  330. package/dist/tab-panel.js.map +1 -1
  331. package/dist/tabs.cjs +4 -4
  332. package/dist/tabs.cjs.map +1 -1
  333. package/dist/tabs.js +64 -60
  334. package/dist/tabs.js.map +1 -1
  335. package/dist/testing/index.d.ts +15 -60
  336. package/dist/testing/index.d.ts.map +1 -1
  337. package/dist/testing.cjs +1 -1
  338. package/dist/testing.cjs.map +1 -1
  339. package/dist/testing.js +7 -24
  340. package/dist/testing.js.map +1 -1
  341. package/dist/textarea.cjs +15 -18
  342. package/dist/textarea.cjs.map +1 -1
  343. package/dist/textarea.js +83 -74
  344. package/dist/textarea.js.map +1 -1
  345. package/dist/time-picker.cjs +34 -31
  346. package/dist/time-picker.cjs.map +1 -1
  347. package/dist/time-picker.js +121 -109
  348. package/dist/time-picker.js.map +1 -1
  349. package/package.json +22 -9
  350. package/dist/headless/dialog-focus.cjs +0 -2
  351. package/dist/headless/dialog-focus.cjs.map +0 -1
  352. package/dist/headless/dialog-focus.d.ts +0 -40
  353. package/dist/headless/dialog-focus.d.ts.map +0 -1
  354. package/dist/headless/dialog-focus.js +0 -22
  355. package/dist/headless/dialog-focus.js.map +0 -1
  356. package/dist/headless/focus-trap.cjs +0 -2
  357. package/dist/headless/focus-trap.cjs.map +0 -1
  358. package/dist/headless/focus-trap.d.ts +0 -45
  359. package/dist/headless/focus-trap.d.ts.map +0 -1
  360. package/dist/headless/focus-trap.js +0 -51
  361. package/dist/headless/focus-trap.js.map +0 -1
  362. package/dist/keymap/dist/_dev.cjs +0 -2
  363. package/dist/keymap/dist/_dev.cjs.map +0 -1
  364. package/dist/keymap/dist/_dev.js +0 -4
  365. package/dist/keymap/dist/_dev.js.map +0 -1
  366. package/dist/keymap/dist/format.cjs +0 -1
  367. package/dist/keymap/dist/format.js +0 -1
  368. package/dist/keymap/dist/index.cjs +0 -1
  369. package/dist/keymap/dist/index.js +0 -4
  370. package/dist/keymap/dist/keymap.cjs +0 -2
  371. package/dist/keymap/dist/keymap.cjs.map +0 -1
  372. package/dist/keymap/dist/keymap.js +0 -221
  373. package/dist/keymap/dist/keymap.js.map +0 -1
  374. package/dist/keymap/dist/layer.cjs +0 -1
  375. package/dist/keymap/dist/layer.js +0 -1
@@ -1,13 +1,14 @@
1
1
  import { reducedMotionMixin as e } from "./styles/mixins/accessibility.css.js";
2
2
  import { colorThemeMixin as t } from "./styles/mixins/theme.css.js";
3
3
  import { disablableBundle as n, roundableBundle as r, sizableBundle as i, themableBundle as a } from "./shared/prop-bundles.js";
4
- import { FORM_CTX as o, useFormContext as s } from "./inputs/shared/form-context.js";
5
- import c from "./inputs/time-picker/time-picker.css.js";
6
- import { bind as l, define as u, getHost as d, html as f, inject as p, onMounted as m, prop as h, useEmit as g } from "@vielzeug/ore";
7
- import { computed as _, signal as v } from "@vielzeug/ripple";
8
- import { useField as y } from "@vielzeug/ore/forms";
4
+ import { createDropdownPositioner as o } from "./headless/positioner.js";
5
+ import { FORM_CTX as s, useFormContext as c } from "./inputs/shared/form-context.js";
6
+ import l from "./inputs/time-picker/time-picker.css.js";
7
+ import { bind as u, define as d, getHost as f, html as p, inject as m, onMounted as h, prop as g, ref as _, useEmit as v } from "@vielzeug/ore";
8
+ import { computed as y, signal as b } from "@vielzeug/ripple";
9
+ import { useField as x } from "@vielzeug/ore/forms";
9
10
  //#region src/inputs/time-picker/time-picker.ts
10
- function b(e) {
11
+ function S(e) {
11
12
  if (!e) return null;
12
13
  let t = /^(\d{1,2}):(\d{2})$/.exec(e.trim());
13
14
  if (!t) return null;
@@ -17,184 +18,195 @@ function b(e) {
17
18
  minutes: r
18
19
  };
19
20
  }
20
- function x(e, t) {
21
+ function C(e, t) {
21
22
  return `${String(e).padStart(2, "0")}:${String(t).padStart(2, "0")}`;
22
23
  }
23
- function S(e, t, n) {
24
+ function w(e, t, n) {
24
25
  if (n === "12") {
25
26
  let n = e >= 12 ? "PM" : "AM", r = e % 12 == 0 ? 12 : e % 12;
26
27
  return `${String(r).padStart(2, "0")}:${String(t).padStart(2, "0")} ${n}`;
27
28
  }
28
- return x(e, t);
29
+ return C(e, t);
29
30
  }
30
- function C(e, t, n, r) {
31
- let i = e * 60 + t, a = b(n), o = b(r), s = a ? a.hours * 60 + a.minutes : 0, c = o ? o.hours * 60 + o.minutes : 1439, l = Math.min(Math.max(i, s), c);
31
+ function T(e, t, n, r) {
32
+ let i = e * 60 + t, a = S(n), o = S(r), s = a ? a.hours * 60 + a.minutes : 0, c = o ? o.hours * 60 + o.minutes : 1439, l = Math.min(Math.max(i, s), c);
32
33
  return {
33
34
  hours: Math.floor(l / 60),
34
35
  minutes: l % 60
35
36
  };
36
37
  }
37
- var w = "ore-time-picker";
38
- u(w, {
38
+ var E = "ore-time-picker";
39
+ d(E, {
39
40
  formAssociated: !0,
40
41
  props: {
41
42
  ...a,
42
43
  ...i,
43
44
  ...n,
44
45
  ...r,
45
- error: h.string(),
46
- fullwidth: h.bool(!1),
47
- helper: h.string(),
48
- label: h.string(),
49
- "label-placement": h.oneOf(["inset", "outside"], "inset"),
50
- max: h.string(),
51
- min: h.string(),
52
- "minute-step": h.number(5),
53
- name: h.string(),
54
- placeholder: h.string(),
55
- required: h.bool(!1),
56
- "time-format": h.oneOf(["12", "24"], "24"),
57
- value: h.string(),
58
- variant: h.string()
46
+ error: g.string(),
47
+ fullwidth: g.bool(!1),
48
+ helper: g.string(),
49
+ label: g.string(),
50
+ "label-placement": g.oneOf(["inset", "outside"], "inset"),
51
+ max: g.string(),
52
+ min: g.string(),
53
+ "minute-step": g.number(5),
54
+ name: g.string(),
55
+ placeholder: g.string(),
56
+ required: g.bool(!1),
57
+ success: g.bool(!1),
58
+ "time-format": g.oneOf(["12", "24"], "24"),
59
+ value: g.string(),
60
+ variant: g.string()
59
61
  },
60
62
  setup(e) {
61
- let t = d(), n = g(), r = v(!1), i = v(b(e.value.value)), a = s(e, p(o)), c = a.disabled;
62
- y({
63
- disabled: c,
63
+ let t = f(), n = v(), r = b(!1), i = b(S(e.value.value)), a = _(), l = _(), d = o({
64
+ getFloating: () => l.value ?? null,
65
+ getReference: () => a.value ?? null,
66
+ matchWidth: !1,
67
+ offsetPx: 4
68
+ }), g = null, E = c(e, m(s)), D = E.disabled;
69
+ x({
70
+ disabled: D,
64
71
  toFormValue: (e) => e || null,
65
- value: _(() => {
72
+ value: y(() => {
66
73
  let e = i.value;
67
- return e ? x(e.hours, e.minutes) : "";
74
+ return e ? C(e.hours, e.minutes) : "";
68
75
  })
69
76
  });
70
- let u = _(() => e["time-format"].value ?? "24"), h = _(() => Math.max(1, Math.min(59, e["minute-step"].value ?? 5))), w = _(() => i.value ? S(i.value.hours, i.value.minutes, u.value) : e.placeholder.value || ""), T = _(() => u.value === "12" ? Array.from({ length: 12 }, (e, t) => t + 1) : Array.from({ length: 24 }, (e, t) => t)), E = _(() => {
71
- let e = h.value, t = [];
77
+ let O = y(() => e["time-format"].value ?? "24"), k = y(() => Math.max(1, Math.min(59, e["minute-step"].value ?? 5))), A = y(() => i.value ? w(i.value.hours, i.value.minutes, O.value) : e.placeholder.value || ""), j = y(() => O.value === "12" ? Array.from({ length: 12 }, (e, t) => t + 1) : Array.from({ length: 24 }, (e, t) => t)), M = y(() => {
78
+ let e = k.value, t = [];
72
79
  for (let n = 0; n < 60; n += e) t.push(n);
73
80
  return t;
74
- }), D = `time-picker-${Math.random().toString(36).slice(2, 9)}-dropdown`;
75
- function O(e) {
76
- if (u.value === "24") return e;
81
+ }), N = `time-picker-${Math.random().toString(36).slice(2, 9)}-dropdown`;
82
+ function P(e) {
83
+ if (O.value === "24") return e;
77
84
  let t = e % 12;
78
85
  return t === 0 ? 12 : t;
79
86
  }
80
- function k(e, t) {
81
- return u.value === "24" ? e : t === "AM" ? e === 12 ? 0 : e : e === 12 ? 12 : e + 12;
87
+ function F(e, t) {
88
+ return O.value === "24" ? e : t === "AM" ? e === 12 ? 0 : e : e === 12 ? 12 : e + 12;
82
89
  }
83
- function A(t, n) {
84
- let r = t * 60 + n, i = b(e.min.value), a = b(e.max.value);
90
+ function I(t, n) {
91
+ let r = t * 60 + n, i = S(e.min.value), a = S(e.max.value);
85
92
  return !!(i && r < i.hours * 60 + i.minutes || a && r > a.hours * 60 + a.minutes);
86
93
  }
87
- let j = v(i.value?.hours ?? 0), M = v(i.value?.minutes ?? 0), N = v((i.value?.hours ?? 0) >= 12 ? "PM" : "AM"), P = e.value.value;
88
- m(() => {
94
+ let L = b(i.value?.hours ?? 0), R = b(i.value?.minutes ?? 0), z = b((i.value?.hours ?? 0) >= 12 ? "PM" : "AM"), B = e.value.value;
95
+ h(() => {
89
96
  let t = setInterval(() => {
90
97
  let t = e.value.value;
91
- if (t !== P) {
92
- P = t;
93
- let e = b(t);
94
- i.value = e, e && (j.value = e.hours, M.value = e.minutes, N.value = e.hours >= 12 ? "PM" : "AM");
98
+ if (t !== B) {
99
+ B = t;
100
+ let e = S(t);
101
+ i.value = e, e && (L.value = e.hours, R.value = e.minutes, z.value = e.hours >= 12 ? "PM" : "AM");
95
102
  }
96
103
  }, 50);
97
104
  return () => clearInterval(t);
98
105
  });
99
- function F(t, r) {
100
- let a = C(t, r, e.min.value, e.max.value), o = Math.round(a.minutes / h.value) * h.value, s = Math.min(o, 59);
106
+ function V(t, r) {
107
+ let a = T(t, r, e.min.value, e.max.value), o = Math.round(a.minutes / k.value) * k.value, s = Math.min(o, 59);
101
108
  i.value = {
102
109
  hours: a.hours,
103
110
  minutes: s
104
- }, n("change", { value: x(a.hours, s) });
111
+ }, n("change", { value: C(a.hours, s) });
105
112
  }
106
- function I(e) {
107
- let t = u.value === "12" ? k(j.value, N.value) : j.value;
108
- M.value = e, F(t, e), R();
113
+ function H(e) {
114
+ let t = O.value === "12" ? F(L.value, z.value) : L.value;
115
+ R.value = e, V(t, e), W();
109
116
  }
110
- function L() {
111
- if (c.value) return;
117
+ function U() {
118
+ if (D.value) return;
112
119
  let e = i.value;
113
- e ? (j.value = u.value === "12" ? O(e.hours) : e.hours, M.value = e.minutes, N.value = e.hours >= 12 ? "PM" : "AM") : (j.value = u.value === "12" ? 12 : 0, M.value = 0, N.value = "AM"), r.value = !0;
120
+ e ? (L.value = O.value === "12" ? P(e.hours) : e.hours, R.value = e.minutes, z.value = e.hours >= 12 ? "PM" : "AM") : (L.value = O.value === "12" ? 12 : 0, R.value = 0, z.value = "AM"), r.value = !0, d.update(), g = d.startAutoUpdate?.() ?? null;
114
121
  }
115
- function R() {
116
- r.value = !1;
122
+ function W() {
123
+ r.value = !1, g?.(), g = null;
117
124
  }
118
- function z() {
119
- r.value ? R() : L();
125
+ function G() {
126
+ r.value ? W() : U();
120
127
  }
121
- function B(e) {
122
- r.value && (e.composedPath().includes(t) || R());
128
+ function K(e) {
129
+ r.value && (e.composedPath().includes(t) || W());
123
130
  }
124
- m(() => (document.addEventListener("pointerdown", B, { capture: !0 }), () => document.removeEventListener("pointerdown", B, { capture: !0 })));
125
- function V(e) {
126
- c.value || (e.key === "Enter" || e.key === " " ? (e.preventDefault(), z()) : e.key === "Escape" && r.value ? (e.preventDefault(), R()) : (e.key === "ArrowDown" || e.key === "ArrowUp") && !r.value && (e.preventDefault(), L()));
131
+ h(() => (document.addEventListener("pointerdown", K, { capture: !0 }), () => {
132
+ document.removeEventListener("pointerdown", K, { capture: !0 }), g?.(), g = null;
133
+ }));
134
+ function q(e) {
135
+ D.value || (e.key === "Enter" || e.key === " " ? (e.preventDefault(), G()) : e.key === "Escape" && r.value ? (e.preventDefault(), W()) : (e.key === "ArrowDown" || e.key === "ArrowUp") && !r.value && (e.preventDefault(), U()));
127
136
  }
128
- function H(e) {
129
- e.key === "Escape" && (e.preventDefault(), R());
137
+ function J(e) {
138
+ e.key === "Escape" && (e.preventDefault(), W());
130
139
  }
131
- function U(e) {
132
- let t = T.value, n = t.indexOf(j.value);
133
- e.key === "ArrowUp" ? (e.preventDefault(), j.value = t[(n - 1 + t.length) % t.length]) : e.key === "ArrowDown" && (e.preventDefault(), j.value = t[(n + 1) % t.length]);
140
+ function Y(e) {
141
+ let t = j.value, n = t.indexOf(L.value);
142
+ e.key === "ArrowUp" ? (e.preventDefault(), L.value = t[(n - 1 + t.length) % t.length]) : e.key === "ArrowDown" && (e.preventDefault(), L.value = t[(n + 1) % t.length]);
134
143
  }
135
- function W(e) {
136
- let t = E.value, n = t.indexOf(M.value);
137
- e.key === "ArrowUp" ? (e.preventDefault(), M.value = t[(n - 1 + t.length) % t.length]) : e.key === "ArrowDown" && (e.preventDefault(), M.value = t[(n + 1) % t.length]);
144
+ function X(e) {
145
+ let t = M.value, n = t.indexOf(R.value);
146
+ e.key === "ArrowUp" ? (e.preventDefault(), R.value = t[(n - 1 + t.length) % t.length]) : e.key === "ArrowDown" && (e.preventDefault(), R.value = t[(n + 1) % t.length]);
138
147
  }
139
- function G(e) {
140
- (e.key === "ArrowUp" || e.key === "ArrowDown") && (e.preventDefault(), N.value = N.value === "AM" ? "PM" : "AM");
148
+ function Z(e) {
149
+ (e.key === "ArrowUp" || e.key === "ArrowDown") && (e.preventDefault(), z.value = z.value === "AM" ? "PM" : "AM");
141
150
  }
142
- return l({ attr: { open: () => r.value ? !0 : void 0 } }), f`
151
+ return u({ attr: { open: () => r.value ? !0 : void 0 } }), p`
143
152
  <!-- Trigger -->
144
153
  <ore-input
145
154
  class="trigger"
155
+ ref="${a}"
146
156
  readonly
147
157
  tabindex="0"
148
158
  role="combobox"
149
159
  aria-haspopup="listbox"
150
- aria-controls="${D}"
160
+ aria-controls="${N}"
151
161
  :aria-expanded="${() => String(r.value)}"
152
- :aria-disabled="${() => c.value ? "true" : null}"
153
- :value="${() => w.value}"
162
+ :aria-disabled="${() => D.value ? "true" : null}"
163
+ :value="${() => A.value}"
154
164
  :label="${() => e.label.value ?? ""}"
155
165
  :placeholder="${() => e.placeholder.value ?? ""}"
156
166
  :label-placement="${() => e["label-placement"].value ?? "inset"}"
157
167
  :color="${() => e.color?.value ?? void 0}"
158
- :size="${() => a.size?.value ?? void 0}"
159
- :variant="${() => a.variant?.value ?? void 0}"
168
+ :size="${() => E.size?.value ?? void 0}"
169
+ :variant="${() => E.variant?.value ?? void 0}"
160
170
  :rounded="${() => e.rounded?.value ?? void 0}"
161
171
  :helper="${() => e.helper.value ?? ""}"
162
172
  :error="${() => e.error.value ?? ""}"
163
- ?disabled="${() => c.value ? !0 : void 0}"
173
+ ?disabled="${() => D.value ? !0 : void 0}"
164
174
  ?required="${() => e.required.value ? !0 : void 0}"
165
175
  ?fullwidth="${() => e.fullwidth.value ? !0 : void 0}"
166
- @click="${z}"
167
- @keydown="${V}">
176
+ ?success="${() => e.success.value}"
177
+ @click="${G}"
178
+ @keydown="${q}">
168
179
  <ore-icon slot="suffix" name="clock" size="16" stroke-width="1.75" aria-hidden="true"></ore-icon>
169
180
  </ore-input>
170
181
 
171
182
  <!-- Dropdown -->
172
183
  <div
173
184
  class="dropdown"
174
- id="${D}"
185
+ ref="${l}"
186
+ id="${N}"
175
187
  role="listbox"
176
188
  aria-label="${() => e.label.value ? `${e.label.value} — select time` : "Select time"}"
177
189
  ?data-open="${r}"
178
- @keydown="${H}">
190
+ @keydown="${J}">
179
191
  <div class="cols-row">
180
192
  <!-- Hours column -->
181
193
  <div class="col" part="column" role="group" aria-label="Hours">
182
194
  <div class="col-label" aria-hidden="true">HH</div>
183
195
  <div class="col-scroll">
184
- ${() => T.value.map((e) => {
185
- let t = A(u.value === "12" ? k(e, N.value) : e, M.value);
186
- return f`<div
196
+ ${() => j.value.map((e) => {
197
+ let t = I(O.value === "12" ? F(e, z.value) : e, R.value);
198
+ return p`<div
187
199
  class="option"
188
200
  part="option"
189
201
  role="option"
190
- tabindex="${() => j.value === e && !t ? "0" : "-1"}"
191
- :aria-selected="${() => String(j.value === e)}"
202
+ tabindex="${() => L.value === e && !t ? "0" : "-1"}"
203
+ :aria-selected="${() => String(L.value === e)}"
192
204
  :aria-disabled="${() => String(t)}"
193
205
  ?data-disabled="${() => t}"
194
206
  @click="${() => {
195
- t || (j.value = e);
207
+ t || (L.value = e);
196
208
  }}"
197
- @keydown="${U}">
209
+ @keydown="${Y}">
198
210
  ${String(e).padStart(2, "0")}
199
211
  </div>`;
200
212
  })}
@@ -207,20 +219,20 @@ u(w, {
207
219
  <div class="col" part="column" role="group" aria-label="Minutes">
208
220
  <div class="col-label" aria-hidden="true">MM</div>
209
221
  <div class="col-scroll">
210
- ${() => E.value.map((e) => {
211
- let t = A(u.value === "12" ? k(j.value, N.value) : j.value, e);
212
- return f`<div
222
+ ${() => M.value.map((e) => {
223
+ let t = I(O.value === "12" ? F(L.value, z.value) : L.value, e);
224
+ return p`<div
213
225
  class="option"
214
226
  part="option"
215
227
  role="option"
216
- tabindex="${() => M.value === e && !t ? "0" : "-1"}"
217
- :aria-selected="${() => String(M.value === e)}"
228
+ tabindex="${() => R.value === e && !t ? "0" : "-1"}"
229
+ :aria-selected="${() => String(R.value === e)}"
218
230
  :aria-disabled="${() => String(t)}"
219
231
  ?data-disabled="${() => t}"
220
232
  @click="${() => {
221
- t || I(e);
233
+ t || H(e);
222
234
  }}"
223
- @keydown="${W}">
235
+ @keydown="${X}">
224
236
  ${String(e).padStart(2, "0")}
225
237
  </div>`;
226
238
  })}
@@ -228,23 +240,23 @@ u(w, {
228
240
  </div>
229
241
 
230
242
  <!-- AM/PM column (12h mode only) -->
231
- ${() => u.value === "12" ? f` <div class="col col-period" part="column" role="group" aria-label="Period">
243
+ ${() => O.value === "12" ? p` <div class="col col-period" part="column" role="group" aria-label="Period">
232
244
  <div class="col-label" aria-hidden="true">AM/PM</div>
233
245
  <div class="col-scroll">
234
- ${["AM", "PM"].map((e) => f`<div
246
+ ${["AM", "PM"].map((e) => p`<div
235
247
  class="option"
236
248
  part="option"
237
249
  role="option"
238
- tabindex="${() => N.value === e ? "0" : "-1"}"
239
- :aria-selected="${() => String(N.value === e)}"
250
+ tabindex="${() => z.value === e ? "0" : "-1"}"
251
+ :aria-selected="${() => String(z.value === e)}"
240
252
  @click="${() => {
241
- N.value = e;
253
+ z.value = e;
242
254
  }}"
243
- @keydown="${G}">
255
+ @keydown="${Z}">
244
256
  ${e}
245
257
  </div>`)}
246
258
  </div>
247
- </div>` : f``}
259
+ </div>` : p``}
248
260
  </div>
249
261
  </div>
250
262
  `;
@@ -253,10 +265,10 @@ u(w, {
253
265
  styles: [
254
266
  t,
255
267
  e,
256
- c
268
+ l
257
269
  ]
258
270
  });
259
271
  //#endregion
260
- export { w as TIME_PICKER_TAG };
272
+ export { E as TIME_PICKER_TAG };
261
273
 
262
274
  //# sourceMappingURL=time-picker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time-picker.js","names":[],"sources":["../src/inputs/time-picker/time-picker.ts"],"sourcesContent":["import { define, html, inject, prop, bind, getHost, onMounted, useEmit } from '@vielzeug/ore';\nimport { useField } from '@vielzeug/ore/forms';\nimport { computed, signal } from '@vielzeug/ripple';\n\nimport type { VisualVariant } from '../../shared';\n\nimport '../../content/icon/icon';\nimport '../input/input';\nimport { disablableBundle, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { colorThemeMixin, reducedMotionMixin } from '../../styles';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport componentStyles from './time-picker.css?inline';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type OreTimePickerEvents = {\n change: { value: string | null };\n};\n\nexport type OreTimePickerProps = {\n /** Theme color */\n color?: string;\n /** Disable the picker */\n disabled?: boolean;\n /** Validation error message */\n error?: string;\n /** Expand to container width */\n fullwidth?: boolean;\n /** Helper text below the field */\n helper?: string;\n /** Visible label */\n label?: string;\n /** Label placement */\n 'label-placement'?: 'inset' | 'outside';\n /** Maximum selectable time in HH:MM format (24-hour) */\n max?: string;\n /** Minimum selectable time in HH:MM format (24-hour) */\n min?: string;\n /** Minute step interval (1–59) */\n 'minute-step'?: number;\n /** Form field name */\n name?: string;\n /** Placeholder shown in the trigger */\n placeholder?: string;\n /** Mark field as required */\n required?: boolean;\n /** Border radius */\n rounded?: string;\n /** Component size */\n size?: string;\n /** Display format: '12' for AM/PM, '24' for 24-hour (default: '24') */\n 'time-format'?: '12' | '24';\n /** Selected time in HH:MM format (24-hour) */\n value?: string;\n /** Visual variant */\n variant?: Exclude<VisualVariant, 'text' | 'frost'>;\n};\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Parse \"HH:MM\" → { hours: 0-23, minutes: 0-59 } | null */\nfunction parseTime(val: string | undefined | null): { hours: number; minutes: number } | null {\n if (!val) return null;\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(val.trim());\n\n if (!match) return null;\n\n const h = Number(match[1]);\n const m = Number(match[2]);\n\n if (h < 0 || h > 23 || m < 0 || m > 59) return null;\n\n return { hours: h, minutes: m };\n}\n\n/** Format { hours, minutes } → \"HH:MM\" (24-hour, zero-padded) */\nfunction formatTime(h: number, m: number): string {\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\n}\n\n/** Format for display label (respects 12/24 mode) */\nfunction formatDisplay(h: number, m: number, format: '12' | '24'): string {\n if (format === '12') {\n const period = h >= 12 ? 'PM' : 'AM';\n const displayH = h % 12 === 0 ? 12 : h % 12;\n\n return `${String(displayH).padStart(2, '0')}:${String(m).padStart(2, '0')} ${period}`;\n }\n\n return formatTime(h, m);\n}\n\n/** Clamp value to [min, max] in total minutes */\nfunction clampTime(\n h: number,\n m: number,\n minVal: string | undefined | null,\n maxVal: string | undefined | null,\n): { hours: number; minutes: number } {\n const total = h * 60 + m;\n const minParsed = parseTime(minVal);\n const maxParsed = parseTime(maxVal);\n const minMins = minParsed ? minParsed.hours * 60 + minParsed.minutes : 0;\n const maxMins = maxParsed ? maxParsed.hours * 60 + maxParsed.minutes : 23 * 60 + 59;\n const clamped = Math.min(Math.max(total, minMins), maxMins);\n\n return { hours: Math.floor(clamped / 60), minutes: clamped % 60 };\n}\n\n/**\n * An accessible time picker with a scrollable clock dropdown.\n * Supports 12/24-hour display formats, min/max bounds, minute steps, and form association.\n *\n * @element ore-time-picker\n *\n * @attr {string} value - Selected time in HH:MM (24-hour) format\n * @attr {string} min - Minimum selectable time (HH:MM)\n * @attr {string} max - Maximum selectable time (HH:MM)\n * @attr {string} label - Label text\n * @attr {string} label-placement - 'inset' | 'outside'\n * @attr {string} placeholder - Trigger placeholder\n * @attr {boolean} disabled - Disable the picker\n * @attr {boolean} required - Required field\n * @attr {string} name - Form field name\n * @attr {string} error - Error message\n * @attr {string} helper - Helper text\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Component size: 'sm' | 'md' | 'lg'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} time-format - '12' or '24' (default: '24')\n * @attr {number} minute-step - Minute increment (default: 5)\n *\n * @fires change - Fired when a time is selected. detail: { value: string | null }\n *\n * @slot label - Custom label for the trigger field\n * @slot prefix - Content before the trigger text (e.g. icon)\n * @slot helper - Custom helper text\n * @slot error - Custom error content\n *\n * @cssprop --time-picker-bg - Dropdown background\n * @cssprop --time-picker-border-color - Dropdown border color\n * @cssprop --time-picker-radius - Dropdown border radius\n * @cssprop --time-picker-shadow - Dropdown shadow\n * @cssprop --time-picker-selected-bg - Selected option background\n * @cssprop --time-picker-option-hover-bg - Option hover background\n *\n * @part field - The trigger field\n * @part dropdown - The floating time dropdown\n * @part column - A scrollable column (hours / minutes / period)\n * @part option - An individual time option cell\n *\n * @example\n * ```html\n * <!-- 24-hour clock, 15-minute steps -->\n * <ore-time-picker label=\"Meeting time\" value=\"09:30\" minute-step=\"15\" color=\"primary\"></ore-time-picker>\n *\n * <!-- 12-hour AM/PM format -->\n * <ore-time-picker label=\"Appointment\" time-format=\"12\" minute-step=\"30\"></ore-time-picker>\n *\n * <!-- Outside label, bordered variant -->\n * <ore-time-picker label=\"Start time\" label-placement=\"outside\" variant=\"bordered\"></ore-time-picker>\n * ```\n */\nexport const TIME_PICKER_TAG = 'ore-time-picker' as const;\n\ndefine<OreTimePickerProps>(TIME_PICKER_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n max: prop.string(),\n min: prop.string(),\n 'minute-step': prop.number(5),\n name: prop.string(),\n placeholder: prop.string(),\n required: prop.bool(false),\n 'time-format': prop.oneOf(['12', '24'] as const, '24'),\n value: prop.string(),\n variant: prop.string<'flat' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreTimePickerEvents>();\n\n // ── Signals ──────────────────────────────────────────────────────────────\n\n const isOpen = signal(false);\n const selectedTime = signal<{ hours: number; minutes: number } | null>(parseTime(props.value.value));\n\n // ── Form context ─────────────────────────────────────────────────────────\n\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(props, formCtx);\n const isDisabled = fCtxProps.disabled;\n\n // ── Form value ────────────────────────────────────────────────────────────\n\n useField<string>({\n disabled: isDisabled,\n toFormValue: (v) => v || null,\n value: computed(() => {\n const t = selectedTime.value;\n\n return t ? formatTime(t.hours, t.minutes) : '';\n }),\n });\n\n // ── Computed helpers ──────────────────────────────────────────────────────\n\n const fmt = computed(() => props['time-format'].value ?? '24');\n const minuteStep = computed(() => Math.max(1, Math.min(59, props['minute-step'].value ?? 5)));\n\n const triggerText = computed(() => {\n if (!selectedTime.value) return props.placeholder.value || '';\n\n return formatDisplay(selectedTime.value.hours, selectedTime.value.minutes, fmt.value as '12' | '24');\n });\n\n /** All hour options for the column (0-23 in 24h; 1-12 in 12h) */\n const hourOptions = computed<number[]>(() => {\n if (fmt.value === '12') {\n return Array.from({ length: 12 }, (_, i) => i + 1);\n }\n\n return Array.from({ length: 24 }, (_, i) => i);\n });\n\n /** All minute options for the column, stepped */\n const minuteOptions = computed<number[]>(() => {\n const step = minuteStep.value;\n const opts: number[] = [];\n\n for (let m = 0; m < 60; m += step) opts.push(m);\n\n return opts;\n });\n\n const dialogId = `time-picker-${Math.random().toString(36).slice(2, 9)}-dropdown`;\n\n /** Convert 24h hour to display hour in current format */\n function toDisplayHour(h24: number): number {\n if (fmt.value === '24') return h24;\n\n const h12 = h24 % 12;\n\n return h12 === 0 ? 12 : h12;\n }\n\n /** Convert display hour + period → 24h hour */\n function to24Hour(displayHour: number, period: 'AM' | 'PM'): number {\n if (fmt.value === '24') return displayHour;\n\n if (period === 'AM') return displayHour === 12 ? 0 : displayHour;\n\n return displayHour === 12 ? 12 : displayHour + 12;\n }\n\n /** Whether a given HH:MM is out of [min, max] */\n function isTimeDisabled(h: number, m: number): boolean {\n const total = h * 60 + m;\n const minParsed = parseTime(props.min.value);\n const maxParsed = parseTime(props.max.value);\n\n if (minParsed && total < minParsed.hours * 60 + minParsed.minutes) return true;\n\n if (maxParsed && total > maxParsed.hours * 60 + maxParsed.minutes) return true;\n\n return false;\n }\n\n // ── State for focused/pending selection ───────────────────────────────────\n\n /** Pending hour (24h) while user is navigating columns */\n const pendingHour = signal<number>(selectedTime.value?.hours ?? 0);\n /** Pending minute */\n const pendingMinute = signal<number>(selectedTime.value?.minutes ?? 0);\n /** Pending period (12h mode) */\n const pendingPeriod = signal<'AM' | 'PM'>((selectedTime.value?.hours ?? 0) >= 12 ? 'PM' : 'AM');\n\n // ── Sync value prop externally ────────────────────────────────────────────\n\n let lastValueProp = props.value.value;\n\n onMounted(() => {\n const interval = setInterval(() => {\n const current = props.value.value;\n\n if (current !== lastValueProp) {\n lastValueProp = current;\n\n const parsed = parseTime(current);\n\n selectedTime.value = parsed;\n\n if (parsed) {\n pendingHour.value = parsed.hours;\n pendingMinute.value = parsed.minutes;\n pendingPeriod.value = parsed.hours >= 12 ? 'PM' : 'AM';\n }\n }\n }, 50);\n\n return () => clearInterval(interval);\n });\n\n // ── Commit ────────────────────────────────────────────────────────────────\n\n function commit(h24: number, m: number): void {\n const clamped = clampTime(h24, m, props.min.value, props.max.value);\n const snapped = Math.round(clamped.minutes / minuteStep.value) * minuteStep.value;\n const snappedMin = Math.min(snapped, 59);\n\n selectedTime.value = { hours: clamped.hours, minutes: snappedMin };\n emit('change', { value: formatTime(clamped.hours, snappedMin) });\n }\n\n function commitFromMinute(m: number): void {\n const h24 = fmt.value === '12' ? to24Hour(pendingHour.value, pendingPeriod.value) : pendingHour.value;\n\n pendingMinute.value = m;\n commit(h24, m);\n closePicker();\n }\n\n // ── Open / close ──────────────────────────────────────────────────────────\n\n function openPicker(): void {\n if (isDisabled.value) return;\n\n const current = selectedTime.value;\n\n if (current) {\n pendingHour.value = fmt.value === '12' ? toDisplayHour(current.hours) : current.hours;\n pendingMinute.value = current.minutes;\n pendingPeriod.value = current.hours >= 12 ? 'PM' : 'AM';\n } else {\n pendingHour.value = fmt.value === '12' ? 12 : 0;\n pendingMinute.value = 0;\n pendingPeriod.value = 'AM';\n }\n\n isOpen.value = true;\n }\n\n function closePicker(): void {\n isOpen.value = false;\n }\n\n function handleTriggerClick(): void {\n if (isOpen.value) closePicker();\n else openPicker();\n }\n\n // ── Outside click ─────────────────────────────────────────────────────────\n\n function handleOutsideClick(e: PointerEvent | MouseEvent): void {\n if (!isOpen.value) return;\n\n if (!e.composedPath().includes(el)) closePicker();\n }\n\n onMounted(() => {\n document.addEventListener('pointerdown', handleOutsideClick, { capture: true });\n\n return () => document.removeEventListener('pointerdown', handleOutsideClick, { capture: true });\n });\n\n // ── Keyboard ──────────────────────────────────────────────────────────────\n\n function handleTriggerKeydown(e: KeyboardEvent): void {\n if (isDisabled.value) return;\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleTriggerClick();\n } else if (e.key === 'Escape' && isOpen.value) {\n e.preventDefault();\n closePicker();\n } else if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && !isOpen.value) {\n e.preventDefault();\n openPicker();\n }\n }\n\n function handleDropdownKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n closePicker();\n }\n }\n\n function handleHourKeydown(e: KeyboardEvent): void {\n const opts = hourOptions.value;\n const idx = opts.indexOf(pendingHour.value);\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n pendingHour.value = opts[(idx - 1 + opts.length) % opts.length];\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n pendingHour.value = opts[(idx + 1) % opts.length];\n }\n }\n\n function handleMinuteKeydown(e: KeyboardEvent): void {\n const opts = minuteOptions.value;\n const idx = opts.indexOf(pendingMinute.value);\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n pendingMinute.value = opts[(idx - 1 + opts.length) % opts.length];\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n pendingMinute.value = opts[(idx + 1) % opts.length];\n }\n }\n\n function handlePeriodKeydown(e: KeyboardEvent): void {\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n pendingPeriod.value = pendingPeriod.value === 'AM' ? 'PM' : 'AM';\n }\n }\n\n // ── Host bindings ─────────────────────────────────────────────────────────\n\n bind({\n attr: {\n open: () => (isOpen.value ? true : undefined),\n },\n });\n\n // ── ore-input prop helpers ────────────────────────────────────────────────\n\n const inputValue = () => triggerText.value;\n const inputLabel = () => props.label.value ?? '';\n const inputPlaceholder = () => props.placeholder.value ?? '';\n const inputLabelPlacement = () => props['label-placement'].value ?? 'inset';\n const inputColor = () => props.color?.value ?? undefined;\n const inputSize = () => fCtxProps.size?.value ?? undefined;\n const inputVariant = () => fCtxProps.variant?.value ?? undefined;\n const inputRounded = () => props.rounded?.value ?? undefined;\n const inputHelper = () => props.helper.value ?? '';\n const inputError = () => props.error.value ?? '';\n const inputDisabled = () => (isDisabled.value ? true : undefined);\n const inputRequired = () => (props.required.value ? true : undefined);\n const inputFullwidth = () => (props.fullwidth.value ? true : undefined);\n\n return html`\n <!-- Trigger -->\n <ore-input\n class=\"trigger\"\n readonly\n tabindex=\"0\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-controls=\"${dialogId}\"\n :aria-expanded=\"${() => String(isOpen.value)}\"\n :aria-disabled=\"${() => (isDisabled.value ? 'true' : null)}\"\n :value=\"${inputValue}\"\n :label=\"${inputLabel}\"\n :placeholder=\"${inputPlaceholder}\"\n :label-placement=\"${inputLabelPlacement}\"\n :color=\"${inputColor}\"\n :size=\"${inputSize}\"\n :variant=\"${inputVariant}\"\n :rounded=\"${inputRounded}\"\n :helper=\"${inputHelper}\"\n :error=\"${inputError}\"\n ?disabled=\"${inputDisabled}\"\n ?required=\"${inputRequired}\"\n ?fullwidth=\"${inputFullwidth}\"\n @click=\"${handleTriggerClick}\"\n @keydown=\"${handleTriggerKeydown}\">\n <ore-icon slot=\"suffix\" name=\"clock\" size=\"16\" stroke-width=\"1.75\" aria-hidden=\"true\"></ore-icon>\n </ore-input>\n\n <!-- Dropdown -->\n <div\n class=\"dropdown\"\n id=\"${dialogId}\"\n role=\"listbox\"\n aria-label=\"${() => (props.label.value ? `${props.label.value} — select time` : 'Select time')}\"\n ?data-open=\"${isOpen}\"\n @keydown=\"${handleDropdownKeydown}\">\n <div class=\"cols-row\">\n <!-- Hours column -->\n <div class=\"col\" part=\"column\" role=\"group\" aria-label=\"Hours\">\n <div class=\"col-label\" aria-hidden=\"true\">HH</div>\n <div class=\"col-scroll\">\n ${() =>\n hourOptions.value.map((h) => {\n const h24 = fmt.value === '12' ? to24Hour(h, pendingPeriod.value) : h;\n const disabled = isTimeDisabled(h24, pendingMinute.value);\n\n return html`<div\n class=\"option\"\n part=\"option\"\n role=\"option\"\n tabindex=\"${() => (pendingHour.value === h && !disabled ? '0' : '-1')}\"\n :aria-selected=\"${() => String(pendingHour.value === h)}\"\n :aria-disabled=\"${() => String(disabled)}\"\n ?data-disabled=\"${() => disabled}\"\n @click=\"${() => {\n if (!disabled) pendingHour.value = h;\n }}\"\n @keydown=\"${handleHourKeydown}\">\n ${String(h).padStart(2, '0')}\n </div>`;\n })}\n </div>\n </div>\n\n <div class=\"col-sep\" aria-hidden=\"true\">:</div>\n\n <!-- Minutes column -->\n <div class=\"col\" part=\"column\" role=\"group\" aria-label=\"Minutes\">\n <div class=\"col-label\" aria-hidden=\"true\">MM</div>\n <div class=\"col-scroll\">\n ${() =>\n minuteOptions.value.map((m) => {\n const h24 = fmt.value === '12' ? to24Hour(pendingHour.value, pendingPeriod.value) : pendingHour.value;\n const disabled = isTimeDisabled(h24, m);\n\n return html`<div\n class=\"option\"\n part=\"option\"\n role=\"option\"\n tabindex=\"${() => (pendingMinute.value === m && !disabled ? '0' : '-1')}\"\n :aria-selected=\"${() => String(pendingMinute.value === m)}\"\n :aria-disabled=\"${() => String(disabled)}\"\n ?data-disabled=\"${() => disabled}\"\n @click=\"${() => {\n if (!disabled) commitFromMinute(m);\n }}\"\n @keydown=\"${handleMinuteKeydown}\">\n ${String(m).padStart(2, '0')}\n </div>`;\n })}\n </div>\n </div>\n\n <!-- AM/PM column (12h mode only) -->\n ${() =>\n fmt.value === '12'\n ? html` <div class=\"col col-period\" part=\"column\" role=\"group\" aria-label=\"Period\">\n <div class=\"col-label\" aria-hidden=\"true\">AM/PM</div>\n <div class=\"col-scroll\">\n ${(['AM', 'PM'] as const).map(\n (p) =>\n html`<div\n class=\"option\"\n part=\"option\"\n role=\"option\"\n tabindex=\"${() => (pendingPeriod.value === p ? '0' : '-1')}\"\n :aria-selected=\"${() => String(pendingPeriod.value === p)}\"\n @click=\"${() => {\n pendingPeriod.value = p;\n }}\"\n @keydown=\"${handlePeriodKeydown}\">\n ${p}\n </div>`,\n )}\n </div>\n </div>`\n : html``}\n </div>\n </div>\n `;\n },\n\n shadow: { delegatesFocus: true },\n styles: [colorThemeMixin, reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"time-picker.js","names":[],"sources":["../src/inputs/time-picker/time-picker.ts"],"sourcesContent":["import { define, html, inject, prop, ref, bind, getHost, onMounted, useEmit } from '@vielzeug/ore';\nimport { useField } from '@vielzeug/ore/forms';\nimport { computed, signal } from '@vielzeug/ripple';\n\nimport type { VisualVariant } from '../../shared';\n\nimport { createDropdownPositioner } from '../../headless';\nimport '../../content/icon/icon';\nimport '../input/input';\nimport { disablableBundle, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { colorThemeMixin, reducedMotionMixin } from '../../styles';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport componentStyles from './time-picker.css?inline';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type OreTimePickerEvents = {\n change: { value: string | null };\n};\n\nexport type OreTimePickerProps = {\n /** Theme color */\n color?: string;\n /** Disable the picker */\n disabled?: boolean;\n /** Validation error message */\n error?: string;\n /** Expand to container width */\n fullwidth?: boolean;\n /** Helper text below the field */\n helper?: string;\n /** Visible label */\n label?: string;\n /** Label placement */\n 'label-placement'?: 'inset' | 'outside';\n /** Maximum selectable time in HH:MM format (24-hour) */\n max?: string;\n /** Minimum selectable time in HH:MM format (24-hour) */\n min?: string;\n /** Minute step interval (1–59) */\n 'minute-step'?: number;\n /** Form field name */\n name?: string;\n /** Placeholder shown in the trigger */\n placeholder?: string;\n /** Mark field as required */\n required?: boolean;\n /** Border radius */\n rounded?: string;\n /** Component size */\n size?: string;\n /**\n * Shows an inline green check icon inside the field to confirm the value has\n * passed validation. Ignored while `error` is set — an error always wins.\n */\n success?: boolean;\n /** Display format: '12' for AM/PM, '24' for 24-hour (default: '24') */\n 'time-format'?: '12' | '24';\n /** Selected time in HH:MM format (24-hour) */\n value?: string;\n /** Visual variant */\n variant?: Exclude<VisualVariant, 'text' | 'frost'>;\n};\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Parse \"HH:MM\" → { hours: 0-23, minutes: 0-59 } | null */\nfunction parseTime(val: string | undefined | null): { hours: number; minutes: number } | null {\n if (!val) return null;\n\n const match = /^(\\d{1,2}):(\\d{2})$/.exec(val.trim());\n\n if (!match) return null;\n\n const h = Number(match[1]);\n const m = Number(match[2]);\n\n if (h < 0 || h > 23 || m < 0 || m > 59) return null;\n\n return { hours: h, minutes: m };\n}\n\n/** Format { hours, minutes } → \"HH:MM\" (24-hour, zero-padded) */\nfunction formatTime(h: number, m: number): string {\n return `${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}`;\n}\n\n/** Format for display label (respects 12/24 mode) */\nfunction formatDisplay(h: number, m: number, format: '12' | '24'): string {\n if (format === '12') {\n const period = h >= 12 ? 'PM' : 'AM';\n const displayH = h % 12 === 0 ? 12 : h % 12;\n\n return `${String(displayH).padStart(2, '0')}:${String(m).padStart(2, '0')} ${period}`;\n }\n\n return formatTime(h, m);\n}\n\n/** Clamp value to [min, max] in total minutes */\nfunction clampTime(\n h: number,\n m: number,\n minVal: string | undefined | null,\n maxVal: string | undefined | null,\n): { hours: number; minutes: number } {\n const total = h * 60 + m;\n const minParsed = parseTime(minVal);\n const maxParsed = parseTime(maxVal);\n const minMins = minParsed ? minParsed.hours * 60 + minParsed.minutes : 0;\n const maxMins = maxParsed ? maxParsed.hours * 60 + maxParsed.minutes : 23 * 60 + 59;\n const clamped = Math.min(Math.max(total, minMins), maxMins);\n\n return { hours: Math.floor(clamped / 60), minutes: clamped % 60 };\n}\n\n/**\n * An accessible time picker with a scrollable clock dropdown.\n * Supports 12/24-hour display formats, min/max bounds, minute steps, and form association.\n *\n * @element ore-time-picker\n *\n * @attr {string} value - Selected time in HH:MM (24-hour) format\n * @attr {string} min - Minimum selectable time (HH:MM)\n * @attr {string} max - Maximum selectable time (HH:MM)\n * @attr {string} label - Label text\n * @attr {string} label-placement - 'inset' | 'outside'\n * @attr {string} placeholder - Trigger placeholder\n * @attr {boolean} disabled - Disable the picker\n * @attr {boolean} required - Required field\n * @attr {string} name - Form field name\n * @attr {string} error - Error message\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n * @attr {string} helper - Helper text\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - Component size: 'sm' | 'md' | 'lg'\n * @attr {string} variant - Visual variant: 'solid' | 'flat' | 'bordered' | 'outline' | 'ghost'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} time-format - '12' or '24' (default: '24')\n * @attr {number} minute-step - Minute increment (default: 5)\n *\n * @fires change - Fired when a time is selected. detail: { value: string | null }\n *\n * @slot label - Custom label for the trigger field\n * @slot prefix - Content before the trigger text (e.g. icon)\n * @slot helper - Custom helper text\n * @slot error - Custom error content\n *\n * @cssprop --time-picker-bg - Dropdown background\n * @cssprop --time-picker-border-color - Dropdown border color\n * @cssprop --time-picker-radius - Dropdown border radius\n * @cssprop --time-picker-shadow - Dropdown shadow\n * @cssprop --time-picker-selected-bg - Selected option background\n * @cssprop --time-picker-option-hover-bg - Option hover background\n *\n * @part field - The trigger field\n * @part dropdown - The floating time dropdown\n * @part column - A scrollable column (hours / minutes / period)\n * @part option - An individual time option cell\n *\n * @example\n * ```html\n * <!-- 24-hour clock, 15-minute steps -->\n * <ore-time-picker label=\"Meeting time\" value=\"09:30\" minute-step=\"15\" color=\"primary\"></ore-time-picker>\n *\n * <!-- 12-hour AM/PM format -->\n * <ore-time-picker label=\"Appointment\" time-format=\"12\" minute-step=\"30\"></ore-time-picker>\n *\n * <!-- Outside label, bordered variant -->\n * <ore-time-picker label=\"Start time\" label-placement=\"outside\" variant=\"bordered\"></ore-time-picker>\n * ```\n */\nexport const TIME_PICKER_TAG = 'ore-time-picker' as const;\n\ndefine<OreTimePickerProps>(TIME_PICKER_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n max: prop.string(),\n min: prop.string(),\n 'minute-step': prop.number(5),\n name: prop.string(),\n placeholder: prop.string(),\n required: prop.bool(false),\n success: prop.bool(false),\n 'time-format': prop.oneOf(['12', '24'] as const, '24'),\n value: prop.string(),\n variant: prop.string<'flat' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreTimePickerEvents>();\n\n // ── Signals ──────────────────────────────────────────────────────────────\n\n const isOpen = signal(false);\n const selectedTime = signal<{ hours: number; minutes: number } | null>(parseTime(props.value.value));\n\n // ── Floating position ────────────────────────────────────────────────────\n // Same Orbit-powered positioner ore-date-picker's `.calendar` popup uses (see its own\n // comment for the full rationale) — `fixed` + computed `top`/`left` instead of a static\n // `position: absolute; top: 100%`, so the dropdown flips/shifts to stay within the nearest\n // clipping ancestor instead of silently overflowing it.\n const triggerRef = ref<HTMLElement>();\n const dropdownRef = ref<HTMLElement>();\n\n const positioner = createDropdownPositioner({\n getFloating: () => dropdownRef.value ?? null,\n getReference: () => triggerRef.value ?? null,\n matchWidth: false,\n offsetPx: 4,\n });\n\n let stopAutoUpdate: (() => void) | null = null;\n\n // ── Form context ─────────────────────────────────────────────────────────\n\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(props, formCtx);\n const isDisabled = fCtxProps.disabled;\n\n // ── Form value ────────────────────────────────────────────────────────────\n\n useField<string>({\n disabled: isDisabled,\n toFormValue: (v) => v || null,\n value: computed(() => {\n const t = selectedTime.value;\n\n return t ? formatTime(t.hours, t.minutes) : '';\n }),\n });\n\n // ── Computed helpers ──────────────────────────────────────────────────────\n\n const fmt = computed(() => props['time-format'].value ?? '24');\n const minuteStep = computed(() => Math.max(1, Math.min(59, props['minute-step'].value ?? 5)));\n\n const triggerText = computed(() => {\n if (!selectedTime.value) return props.placeholder.value || '';\n\n return formatDisplay(selectedTime.value.hours, selectedTime.value.minutes, fmt.value as '12' | '24');\n });\n\n /** All hour options for the column (0-23 in 24h; 1-12 in 12h) */\n const hourOptions = computed<number[]>(() => {\n if (fmt.value === '12') {\n return Array.from({ length: 12 }, (_, i) => i + 1);\n }\n\n return Array.from({ length: 24 }, (_, i) => i);\n });\n\n /** All minute options for the column, stepped */\n const minuteOptions = computed<number[]>(() => {\n const step = minuteStep.value;\n const opts: number[] = [];\n\n for (let m = 0; m < 60; m += step) opts.push(m);\n\n return opts;\n });\n\n const dialogId = `time-picker-${Math.random().toString(36).slice(2, 9)}-dropdown`;\n\n /** Convert 24h hour to display hour in current format */\n function toDisplayHour(h24: number): number {\n if (fmt.value === '24') return h24;\n\n const h12 = h24 % 12;\n\n return h12 === 0 ? 12 : h12;\n }\n\n /** Convert display hour + period → 24h hour */\n function to24Hour(displayHour: number, period: 'AM' | 'PM'): number {\n if (fmt.value === '24') return displayHour;\n\n if (period === 'AM') return displayHour === 12 ? 0 : displayHour;\n\n return displayHour === 12 ? 12 : displayHour + 12;\n }\n\n /** Whether a given HH:MM is out of [min, max] */\n function isTimeDisabled(h: number, m: number): boolean {\n const total = h * 60 + m;\n const minParsed = parseTime(props.min.value);\n const maxParsed = parseTime(props.max.value);\n\n if (minParsed && total < minParsed.hours * 60 + minParsed.minutes) return true;\n\n if (maxParsed && total > maxParsed.hours * 60 + maxParsed.minutes) return true;\n\n return false;\n }\n\n // ── State for focused/pending selection ───────────────────────────────────\n\n /** Pending hour (24h) while user is navigating columns */\n const pendingHour = signal<number>(selectedTime.value?.hours ?? 0);\n /** Pending minute */\n const pendingMinute = signal<number>(selectedTime.value?.minutes ?? 0);\n /** Pending period (12h mode) */\n const pendingPeriod = signal<'AM' | 'PM'>((selectedTime.value?.hours ?? 0) >= 12 ? 'PM' : 'AM');\n\n // ── Sync value prop externally ────────────────────────────────────────────\n\n let lastValueProp = props.value.value;\n\n onMounted(() => {\n const interval = setInterval(() => {\n const current = props.value.value;\n\n if (current !== lastValueProp) {\n lastValueProp = current;\n\n const parsed = parseTime(current);\n\n selectedTime.value = parsed;\n\n if (parsed) {\n pendingHour.value = parsed.hours;\n pendingMinute.value = parsed.minutes;\n pendingPeriod.value = parsed.hours >= 12 ? 'PM' : 'AM';\n }\n }\n }, 50);\n\n return () => clearInterval(interval);\n });\n\n // ── Commit ────────────────────────────────────────────────────────────────\n\n function commit(h24: number, m: number): void {\n const clamped = clampTime(h24, m, props.min.value, props.max.value);\n const snapped = Math.round(clamped.minutes / minuteStep.value) * minuteStep.value;\n const snappedMin = Math.min(snapped, 59);\n\n selectedTime.value = { hours: clamped.hours, minutes: snappedMin };\n emit('change', { value: formatTime(clamped.hours, snappedMin) });\n }\n\n function commitFromMinute(m: number): void {\n const h24 = fmt.value === '12' ? to24Hour(pendingHour.value, pendingPeriod.value) : pendingHour.value;\n\n pendingMinute.value = m;\n commit(h24, m);\n closePicker();\n }\n\n // ── Open / close ──────────────────────────────────────────────────────────\n\n function openPicker(): void {\n if (isDisabled.value) return;\n\n const current = selectedTime.value;\n\n if (current) {\n pendingHour.value = fmt.value === '12' ? toDisplayHour(current.hours) : current.hours;\n pendingMinute.value = current.minutes;\n pendingPeriod.value = current.hours >= 12 ? 'PM' : 'AM';\n } else {\n pendingHour.value = fmt.value === '12' ? 12 : 0;\n pendingMinute.value = 0;\n pendingPeriod.value = 'AM';\n }\n\n isOpen.value = true;\n positioner.update();\n stopAutoUpdate = positioner.startAutoUpdate?.() ?? null;\n }\n\n function closePicker(): void {\n isOpen.value = false;\n stopAutoUpdate?.();\n stopAutoUpdate = null;\n }\n\n function handleTriggerClick(): void {\n if (isOpen.value) closePicker();\n else openPicker();\n }\n\n // ── Outside click ─────────────────────────────────────────────────────────\n\n function handleOutsideClick(e: PointerEvent | MouseEvent): void {\n if (!isOpen.value) return;\n\n if (!e.composedPath().includes(el)) closePicker();\n }\n\n onMounted(() => {\n document.addEventListener('pointerdown', handleOutsideClick, { capture: true });\n\n return () => {\n document.removeEventListener('pointerdown', handleOutsideClick, { capture: true });\n stopAutoUpdate?.();\n stopAutoUpdate = null;\n };\n });\n\n // ── Keyboard ──────────────────────────────────────────────────────────────\n\n function handleTriggerKeydown(e: KeyboardEvent): void {\n if (isDisabled.value) return;\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleTriggerClick();\n } else if (e.key === 'Escape' && isOpen.value) {\n e.preventDefault();\n closePicker();\n } else if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && !isOpen.value) {\n e.preventDefault();\n openPicker();\n }\n }\n\n function handleDropdownKeydown(e: KeyboardEvent): void {\n if (e.key === 'Escape') {\n e.preventDefault();\n closePicker();\n }\n }\n\n function handleHourKeydown(e: KeyboardEvent): void {\n const opts = hourOptions.value;\n const idx = opts.indexOf(pendingHour.value);\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n pendingHour.value = opts[(idx - 1 + opts.length) % opts.length];\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n pendingHour.value = opts[(idx + 1) % opts.length];\n }\n }\n\n function handleMinuteKeydown(e: KeyboardEvent): void {\n const opts = minuteOptions.value;\n const idx = opts.indexOf(pendingMinute.value);\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n pendingMinute.value = opts[(idx - 1 + opts.length) % opts.length];\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n pendingMinute.value = opts[(idx + 1) % opts.length];\n }\n }\n\n function handlePeriodKeydown(e: KeyboardEvent): void {\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n pendingPeriod.value = pendingPeriod.value === 'AM' ? 'PM' : 'AM';\n }\n }\n\n // ── Host bindings ─────────────────────────────────────────────────────────\n\n bind({\n attr: {\n open: () => (isOpen.value ? true : undefined),\n },\n });\n\n // ── ore-input prop helpers ────────────────────────────────────────────────\n\n const inputValue = () => triggerText.value;\n const inputLabel = () => props.label.value ?? '';\n const inputPlaceholder = () => props.placeholder.value ?? '';\n const inputLabelPlacement = () => props['label-placement'].value ?? 'inset';\n const inputColor = () => props.color?.value ?? undefined;\n const inputSize = () => fCtxProps.size?.value ?? undefined;\n const inputVariant = () => fCtxProps.variant?.value ?? undefined;\n const inputRounded = () => props.rounded?.value ?? undefined;\n const inputHelper = () => props.helper.value ?? '';\n const inputError = () => props.error.value ?? '';\n const inputDisabled = () => (isDisabled.value ? true : undefined);\n const inputRequired = () => (props.required.value ? true : undefined);\n const inputFullwidth = () => (props.fullwidth.value ? true : undefined);\n\n return html`\n <!-- Trigger -->\n <ore-input\n class=\"trigger\"\n ref=\"${triggerRef}\"\n readonly\n tabindex=\"0\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-controls=\"${dialogId}\"\n :aria-expanded=\"${() => String(isOpen.value)}\"\n :aria-disabled=\"${() => (isDisabled.value ? 'true' : null)}\"\n :value=\"${inputValue}\"\n :label=\"${inputLabel}\"\n :placeholder=\"${inputPlaceholder}\"\n :label-placement=\"${inputLabelPlacement}\"\n :color=\"${inputColor}\"\n :size=\"${inputSize}\"\n :variant=\"${inputVariant}\"\n :rounded=\"${inputRounded}\"\n :helper=\"${inputHelper}\"\n :error=\"${inputError}\"\n ?disabled=\"${inputDisabled}\"\n ?required=\"${inputRequired}\"\n ?fullwidth=\"${inputFullwidth}\"\n ?success=\"${() => props.success.value}\"\n @click=\"${handleTriggerClick}\"\n @keydown=\"${handleTriggerKeydown}\">\n <ore-icon slot=\"suffix\" name=\"clock\" size=\"16\" stroke-width=\"1.75\" aria-hidden=\"true\"></ore-icon>\n </ore-input>\n\n <!-- Dropdown -->\n <div\n class=\"dropdown\"\n ref=\"${dropdownRef}\"\n id=\"${dialogId}\"\n role=\"listbox\"\n aria-label=\"${() => (props.label.value ? `${props.label.value} — select time` : 'Select time')}\"\n ?data-open=\"${isOpen}\"\n @keydown=\"${handleDropdownKeydown}\">\n <div class=\"cols-row\">\n <!-- Hours column -->\n <div class=\"col\" part=\"column\" role=\"group\" aria-label=\"Hours\">\n <div class=\"col-label\" aria-hidden=\"true\">HH</div>\n <div class=\"col-scroll\">\n ${() =>\n hourOptions.value.map((h) => {\n const h24 = fmt.value === '12' ? to24Hour(h, pendingPeriod.value) : h;\n const disabled = isTimeDisabled(h24, pendingMinute.value);\n\n return html`<div\n class=\"option\"\n part=\"option\"\n role=\"option\"\n tabindex=\"${() => (pendingHour.value === h && !disabled ? '0' : '-1')}\"\n :aria-selected=\"${() => String(pendingHour.value === h)}\"\n :aria-disabled=\"${() => String(disabled)}\"\n ?data-disabled=\"${() => disabled}\"\n @click=\"${() => {\n if (!disabled) pendingHour.value = h;\n }}\"\n @keydown=\"${handleHourKeydown}\">\n ${String(h).padStart(2, '0')}\n </div>`;\n })}\n </div>\n </div>\n\n <div class=\"col-sep\" aria-hidden=\"true\">:</div>\n\n <!-- Minutes column -->\n <div class=\"col\" part=\"column\" role=\"group\" aria-label=\"Minutes\">\n <div class=\"col-label\" aria-hidden=\"true\">MM</div>\n <div class=\"col-scroll\">\n ${() =>\n minuteOptions.value.map((m) => {\n const h24 = fmt.value === '12' ? to24Hour(pendingHour.value, pendingPeriod.value) : pendingHour.value;\n const disabled = isTimeDisabled(h24, m);\n\n return html`<div\n class=\"option\"\n part=\"option\"\n role=\"option\"\n tabindex=\"${() => (pendingMinute.value === m && !disabled ? '0' : '-1')}\"\n :aria-selected=\"${() => String(pendingMinute.value === m)}\"\n :aria-disabled=\"${() => String(disabled)}\"\n ?data-disabled=\"${() => disabled}\"\n @click=\"${() => {\n if (!disabled) commitFromMinute(m);\n }}\"\n @keydown=\"${handleMinuteKeydown}\">\n ${String(m).padStart(2, '0')}\n </div>`;\n })}\n </div>\n </div>\n\n <!-- AM/PM column (12h mode only) -->\n ${() =>\n fmt.value === '12'\n ? html` <div class=\"col col-period\" part=\"column\" role=\"group\" aria-label=\"Period\">\n <div class=\"col-label\" aria-hidden=\"true\">AM/PM</div>\n <div class=\"col-scroll\">\n ${(['AM', 'PM'] as const).map(\n (p) =>\n html`<div\n class=\"option\"\n part=\"option\"\n role=\"option\"\n tabindex=\"${() => (pendingPeriod.value === p ? '0' : '-1')}\"\n :aria-selected=\"${() => String(pendingPeriod.value === p)}\"\n @click=\"${() => {\n pendingPeriod.value = p;\n }}\"\n @keydown=\"${handlePeriodKeydown}\">\n ${p}\n </div>`,\n )}\n </div>\n </div>`\n : html``}\n </div>\n </div>\n `;\n },\n\n shadow: { delegatesFocus: true },\n styles: [colorThemeMixin, reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/refine",
3
- "version": "1.5.4",
3
+ "version": "1.8.0",
4
4
  "description": "Accessible, themeable web components built on Ore custom element primitives",
5
5
  "keywords": [
6
6
  "web-components",
@@ -23,7 +23,7 @@
23
23
  "url": "https://github.com/helmuthdu/vielzeug/issues"
24
24
  },
25
25
  "engines": {
26
- "node": ">=18"
26
+ "node": ">=22"
27
27
  },
28
28
  "type": "module",
29
29
  "customElements": "dist/custom-elements.json",
@@ -285,6 +285,18 @@
285
285
  "require": "./dist/input.cjs",
286
286
  "types": "./dist/inputs/input/input.d.ts"
287
287
  },
288
+ "./list": {
289
+ "source": "./src/content/list/list.ts",
290
+ "import": "./dist/list.js",
291
+ "require": "./dist/list.cjs",
292
+ "types": "./dist/content/list/list.d.ts"
293
+ },
294
+ "./list-item": {
295
+ "source": "./src/content/list/list-item.ts",
296
+ "import": "./dist/list-item.js",
297
+ "require": "./dist/list-item.cjs",
298
+ "types": "./dist/content/list/list-item.d.ts"
299
+ },
288
300
  "./menu": {
289
301
  "source": "./src/overlay/menu/menu.ts",
290
302
  "import": "./dist/menu.js",
@@ -466,13 +478,14 @@
466
478
  "build:bundle:watch": "vite build --watch --config vite.bundle.config.ts"
467
479
  },
468
480
  "dependencies": {
469
- "@vielzeug/arsenal": "1.1.1",
470
- "@vielzeug/dnd": "1.2.1",
471
- "@vielzeug/keymap": "1.1.1",
472
- "@vielzeug/orbit": "1.1.1",
473
- "@vielzeug/ore": "1.2.2",
474
- "@vielzeug/ripple": "1.2.2",
475
- "@vielzeug/tempo": "1.0.3",
481
+ "@vielzeug/arsenal": "1.1.2",
482
+ "@vielzeug/assay": "1.0.0",
483
+ "@vielzeug/dnd": "1.2.2",
484
+ "@vielzeug/keymap": "1.1.2",
485
+ "@vielzeug/orbit": "1.1.3",
486
+ "@vielzeug/ore": "1.3.0",
487
+ "@vielzeug/ripple": "1.3.0",
488
+ "@vielzeug/tempo": "1.0.5",
476
489
  "lucide": "^1.23.0"
477
490
  },
478
491
  "devDependencies": {
@@ -1,2 +0,0 @@
1
- const e=require("./focus.cjs"),t=require("./focus-trap.cjs");var n=n=>{let r=t.createFocusTrap(n.getContainer,{enabled:n.trapEnabled}),i=e.createFocusManager({getInitialFocusSelector:n.getInitialFocusSelector,getReturnFocus:n.getReturnFocus,host:n.host});return{activate(){i.captureReturnFocus(),r.activate(),i.applyInitialFocus()},deactivate(){i.cancelInitialFocus(),r.deactivate(),i.restoreFocus()}}};exports.createDialogFocusControl=n;
2
- //# sourceMappingURL=dialog-focus.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialog-focus.cjs","names":[],"sources":["../../src/headless/dialog-focus.ts"],"sourcesContent":["import { createFocusManager } from './focus';\nimport { createFocusTrap } from './focus-trap';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type DialogFocusControlOptions = {\n /** Returns the container element (dialog or shadow root) for focus trapping. */\n getContainer: () => HTMLElement | ShadowRoot | null;\n /** Returns the CSS selector for the element to focus on open (e.g. `'[autofocus]'`). */\n getInitialFocusSelector: () => string | undefined;\n /** Returns whether focus should be restored to the trigger on close. */\n getReturnFocus: () => boolean | undefined;\n /** Host element used to resolve `getInitialFocusSelector`. */\n host: HTMLElement;\n /** When provided, the trap only intercepts Tab when this returns `true`. */\n trapEnabled?: () => boolean;\n};\n\nexport type DialogFocusControl = {\n /** Capture return focus, activate the trap, and apply initial focus. */\n activate(): void;\n /** Deactivate the trap and restore focus. */\n deactivate(): void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Combines {@link createFocusTrap} and {@link createFocusManager} into a single\n * `activate / deactivate` API suited for modal dialogs and drawers.\n *\n * @example\n * ```ts\n * const focusCtrl = createDialogFocusControl({\n * getContainer: () => dialog,\n * getInitialFocusSelector: () => props['initial-focus'].value,\n * getReturnFocus: () => props['return-focus'].value !== false,\n * host: el,\n * });\n *\n * // On open:\n * focusCtrl.activate();\n *\n * // On close:\n * focusCtrl.deactivate();\n * ```\n */\nexport const createDialogFocusControl = (options: DialogFocusControlOptions): DialogFocusControl => {\n const trap = createFocusTrap(options.getContainer, { enabled: options.trapEnabled });\n\n const manager = createFocusManager({\n getInitialFocusSelector: options.getInitialFocusSelector,\n getReturnFocus: options.getReturnFocus,\n host: options.host,\n });\n\n return {\n activate() {\n manager.captureReturnFocus();\n trap.activate();\n manager.applyInitialFocus();\n },\n\n deactivate() {\n manager.cancelInitialFocus();\n trap.deactivate();\n manager.restoreFocus();\n },\n };\n};\n"],"mappings":"6DA+CA,IAAa,EAA4B,GAA2D,CAClG,IAAM,EAAO,EAAA,gBAAgB,EAAQ,aAAc,CAAE,QAAS,EAAQ,WAAY,CAAC,EAE7E,EAAU,EAAA,mBAAmB,CACjC,wBAAyB,EAAQ,wBACjC,eAAgB,EAAQ,eACxB,KAAM,EAAQ,IAChB,CAAC,EAED,MAAO,CACL,UAAW,CACT,EAAQ,mBAAmB,EAC3B,EAAK,SAAS,EACd,EAAQ,kBAAkB,CAC5B,EAEA,YAAa,CACX,EAAQ,mBAAmB,EAC3B,EAAK,WAAW,EAChB,EAAQ,aAAa,CACvB,CACF,CACF"}