@vielzeug/refine 1.7.0 → 2.0.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 (829) hide show
  1. package/README.md +5 -12
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +2 -5
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  7. package/dist/accordion-item.cjs +26 -24
  8. package/dist/accordion-item.cjs.map +1 -1
  9. package/dist/accordion-item.js +53 -51
  10. package/dist/accordion-item.js.map +1 -1
  11. package/dist/accordion.cjs +3 -1
  12. package/dist/accordion.cjs.map +1 -1
  13. package/dist/accordion.js +5 -3
  14. package/dist/accordion.js.map +1 -1
  15. package/dist/alert.cjs +1 -1
  16. package/dist/alert.cjs.map +1 -1
  17. package/dist/alert.js +1 -1
  18. package/dist/alert.js.map +1 -1
  19. package/dist/async.cjs +14 -12
  20. package/dist/async.cjs.map +1 -1
  21. package/dist/async.js +5 -4
  22. package/dist/async.js.map +1 -1
  23. package/dist/avatar-group.cjs +7 -0
  24. package/dist/avatar-group.cjs.map +1 -0
  25. package/dist/avatar-group.js +34 -0
  26. package/dist/avatar-group.js.map +1 -0
  27. package/dist/avatar.cjs +21 -16
  28. package/dist/avatar.cjs.map +1 -1
  29. package/dist/avatar.js +38 -54
  30. package/dist/avatar.js.map +1 -1
  31. package/dist/badge.cjs +4 -2
  32. package/dist/badge.cjs.map +1 -1
  33. package/dist/badge.js +6 -4
  34. package/dist/badge.js.map +1 -1
  35. package/dist/box.cjs +3 -1
  36. package/dist/box.cjs.map +1 -1
  37. package/dist/box.js +24 -18
  38. package/dist/box.js.map +1 -1
  39. package/dist/breadcrumb.cjs +4 -4
  40. package/dist/breadcrumb.cjs.map +1 -1
  41. package/dist/breadcrumb.js +4 -4
  42. package/dist/breadcrumb.js.map +1 -1
  43. package/dist/button-group.cjs +3 -3
  44. package/dist/button-group.cjs.map +1 -1
  45. package/dist/button-group.js +18 -16
  46. package/dist/button-group.js.map +1 -1
  47. package/dist/button.cjs +16 -12
  48. package/dist/button.cjs.map +1 -1
  49. package/dist/button.js +31 -28
  50. package/dist/button.js.map +1 -1
  51. package/dist/calendar.cjs +94 -69
  52. package/dist/calendar.cjs.map +1 -1
  53. package/dist/calendar.js +131 -99
  54. package/dist/calendar.js.map +1 -1
  55. package/dist/card.cjs +7 -7
  56. package/dist/card.cjs.map +1 -1
  57. package/dist/card.js +53 -49
  58. package/dist/card.js.map +1 -1
  59. package/dist/carousel.cjs +65 -57
  60. package/dist/carousel.cjs.map +1 -1
  61. package/dist/carousel.js +157 -201
  62. package/dist/carousel.js.map +1 -1
  63. package/dist/chat-message.cjs +21 -19
  64. package/dist/chat-message.cjs.map +1 -1
  65. package/dist/chat-message.js +18 -15
  66. package/dist/chat-message.js.map +1 -1
  67. package/dist/checkbox-group.cjs +12 -10
  68. package/dist/checkbox-group.cjs.map +1 -1
  69. package/dist/checkbox-group.js +75 -77
  70. package/dist/checkbox-group.js.map +1 -1
  71. package/dist/checkbox.cjs +4 -4
  72. package/dist/checkbox.cjs.map +1 -1
  73. package/dist/checkbox.js +55 -55
  74. package/dist/checkbox.js.map +1 -1
  75. package/dist/chip.cjs +22 -20
  76. package/dist/chip.cjs.map +1 -1
  77. package/dist/chip.js +15 -12
  78. package/dist/chip.js.map +1 -1
  79. package/dist/code-window.cjs +11 -5
  80. package/dist/code-window.cjs.map +1 -1
  81. package/dist/code-window.js +9 -4
  82. package/dist/code-window.js.map +1 -1
  83. package/dist/combobox.cjs +63 -58
  84. package/dist/combobox.cjs.map +1 -1
  85. package/dist/combobox.js +199 -197
  86. package/dist/combobox.js.map +1 -1
  87. package/dist/command-palette.cjs +49 -29
  88. package/dist/command-palette.cjs.map +1 -1
  89. package/dist/command-palette.js +150 -119
  90. package/dist/command-palette.js.map +1 -1
  91. package/dist/content/avatar/avatar-group.d.ts +33 -0
  92. package/dist/content/avatar/avatar-group.d.ts.map +1 -0
  93. package/dist/content/avatar/avatar.d.ts +0 -32
  94. package/dist/content/avatar/avatar.d.ts.map +1 -1
  95. package/dist/content/card/card.css.cjs +1 -1
  96. package/dist/content/card/card.css.cjs.map +1 -1
  97. package/dist/content/card/card.css.js +1 -1
  98. package/dist/content/card/card.css.js.map +1 -1
  99. package/dist/content/card/card.d.ts.map +1 -1
  100. package/dist/content/carousel/carousel-slide.cjs +3 -1
  101. package/dist/content/carousel/carousel-slide.cjs.map +1 -1
  102. package/dist/content/carousel/carousel-slide.css.cjs +1 -1
  103. package/dist/content/carousel/carousel-slide.css.cjs.map +1 -1
  104. package/dist/content/carousel/carousel-slide.css.js +1 -1
  105. package/dist/content/carousel/carousel-slide.css.js.map +1 -1
  106. package/dist/content/carousel/carousel-slide.js +3 -1
  107. package/dist/content/carousel/carousel-slide.js.map +1 -1
  108. package/dist/content/carousel/carousel.css.cjs +1 -1
  109. package/dist/content/carousel/carousel.css.cjs.map +1 -1
  110. package/dist/content/carousel/carousel.css.js +1 -1
  111. package/dist/content/carousel/carousel.css.js.map +1 -1
  112. package/dist/content/carousel/carousel.d.ts +5 -19
  113. package/dist/content/carousel/carousel.d.ts.map +1 -1
  114. package/dist/content/chat-message/chat-message.d.ts.map +1 -1
  115. package/dist/content/code-window/code-window.d.ts.map +1 -1
  116. package/dist/content/icon/icon.d.ts.map +1 -1
  117. package/dist/content/index.d.ts +10 -2
  118. package/dist/content/index.d.ts.map +1 -1
  119. package/dist/content/list/_list-item-reveal.cjs +1 -1
  120. package/dist/content/list/_list-item-reveal.cjs.map +1 -1
  121. package/dist/content/list/_list-item-reveal.d.ts +2 -2
  122. package/dist/content/list/_list-item-reveal.d.ts.map +1 -1
  123. package/dist/content/list/_list-item-reveal.js +2 -2
  124. package/dist/content/list/_list-item-reveal.js.map +1 -1
  125. package/dist/content/list/list.d.ts.map +1 -1
  126. package/dist/content/marquee/index.d.ts +2 -0
  127. package/dist/content/marquee/index.d.ts.map +1 -0
  128. package/dist/content/marquee/marquee.css.cjs +2 -0
  129. package/dist/content/marquee/marquee.css.cjs.map +1 -0
  130. package/dist/content/marquee/marquee.css.js +6 -0
  131. package/dist/content/marquee/marquee.css.js.map +1 -0
  132. package/dist/content/marquee/marquee.d.ts +44 -0
  133. package/dist/content/marquee/marquee.d.ts.map +1 -0
  134. package/dist/content/stepper/_is-step-navigable.cjs +2 -0
  135. package/dist/content/stepper/_is-step-navigable.cjs.map +1 -0
  136. package/dist/content/stepper/_is-step-navigable.d.ts +14 -0
  137. package/dist/content/stepper/_is-step-navigable.d.ts.map +1 -0
  138. package/dist/content/stepper/_is-step-navigable.js +8 -0
  139. package/dist/content/stepper/_is-step-navigable.js.map +1 -0
  140. package/dist/content/stepper/step.css.cjs +2 -0
  141. package/dist/content/stepper/step.css.cjs.map +1 -0
  142. package/dist/content/stepper/step.css.js +6 -0
  143. package/dist/content/stepper/step.css.js.map +1 -0
  144. package/dist/content/stepper/step.d.ts +63 -0
  145. package/dist/content/stepper/step.d.ts.map +1 -0
  146. package/dist/content/stepper/stepper.css.cjs +2 -0
  147. package/dist/content/stepper/stepper.css.cjs.map +1 -0
  148. package/dist/content/stepper/stepper.css.js +6 -0
  149. package/dist/content/stepper/stepper.css.js.map +1 -0
  150. package/dist/content/stepper/stepper.d.ts +88 -0
  151. package/dist/content/stepper/stepper.d.ts.map +1 -0
  152. package/dist/copy-command.cjs +9 -3
  153. package/dist/copy-command.cjs.map +1 -1
  154. package/dist/copy-command.js +9 -3
  155. package/dist/copy-command.js.map +1 -1
  156. package/dist/{headless → core}/_internal.d.ts +3 -5
  157. package/dist/core/_internal.d.ts.map +1 -0
  158. package/dist/core/announcer.cjs.map +1 -0
  159. package/dist/core/announcer.d.ts.map +1 -0
  160. package/dist/{headless → core}/announcer.js +1 -1
  161. package/dist/core/announcer.js.map +1 -0
  162. package/dist/core/aria-reflection.cjs.map +1 -0
  163. package/dist/core/aria-reflection.d.ts.map +1 -0
  164. package/dist/{headless → core}/aria-reflection.js +1 -1
  165. package/dist/core/aria-reflection.js.map +1 -0
  166. package/dist/core/auto-resize.cjs.map +1 -0
  167. package/dist/core/auto-resize.d.ts.map +1 -0
  168. package/dist/{headless → core}/auto-resize.js +1 -1
  169. package/dist/core/auto-resize.js.map +1 -0
  170. package/dist/core/checkable.cjs.map +1 -0
  171. package/dist/core/checkable.d.ts.map +1 -0
  172. package/dist/{headless → core}/checkable.js +1 -1
  173. package/dist/core/checkable.js.map +1 -0
  174. package/dist/core/choice-field.cjs +2 -0
  175. package/dist/core/choice-field.cjs.map +1 -0
  176. package/dist/core/choice-field.d.ts.map +1 -0
  177. package/dist/{headless → core}/choice-field.js +3 -2
  178. package/dist/core/choice-field.js.map +1 -0
  179. package/dist/core/composer.cjs.map +1 -0
  180. package/dist/core/composer.d.ts.map +1 -0
  181. package/dist/{headless → core}/composer.js +1 -1
  182. package/dist/core/composer.js.map +1 -0
  183. package/dist/{headless → core}/date-picker.cjs +1 -1
  184. package/dist/core/date-picker.cjs.map +1 -0
  185. package/dist/core/date-picker.d.ts.map +1 -0
  186. package/dist/{headless → core}/date-picker.js +3 -3
  187. package/dist/core/date-picker.js.map +1 -0
  188. package/dist/core/direction.cjs.map +1 -0
  189. package/dist/core/direction.d.ts.map +1 -0
  190. package/dist/{headless → core}/direction.js +1 -1
  191. package/dist/core/direction.js.map +1 -0
  192. package/dist/core/field-base.cjs +2 -0
  193. package/dist/core/field-base.cjs.map +1 -0
  194. package/dist/{headless → core}/field-base.d.ts +3 -3
  195. package/dist/core/field-base.d.ts.map +1 -0
  196. package/dist/core/field-base.js +66 -0
  197. package/dist/core/field-base.js.map +1 -0
  198. package/dist/core/focus.cjs.map +1 -0
  199. package/dist/core/focus.d.ts.map +1 -0
  200. package/dist/{headless → core}/focus.js +1 -1
  201. package/dist/core/focus.js.map +1 -0
  202. package/dist/{headless → core}/index.d.ts +7 -6
  203. package/dist/core/index.d.ts.map +1 -0
  204. package/dist/{headless → core}/keyboard.cjs +1 -1
  205. package/dist/core/keyboard.cjs.map +1 -0
  206. package/dist/core/keyboard.d.ts.map +1 -0
  207. package/dist/{headless → core}/keyboard.js +2 -2
  208. package/dist/core/keyboard.js.map +1 -0
  209. package/dist/core/light-dom.cjs.map +1 -0
  210. package/dist/core/light-dom.d.ts.map +1 -0
  211. package/dist/{headless → core}/light-dom.js +1 -1
  212. package/dist/core/light-dom.js.map +1 -0
  213. package/dist/core/nav.cjs.map +1 -0
  214. package/dist/core/nav.d.ts.map +1 -0
  215. package/dist/{headless → core}/nav.js +1 -1
  216. package/dist/core/nav.js.map +1 -0
  217. package/dist/core/numbers.cjs.map +1 -0
  218. package/dist/core/numbers.d.ts.map +1 -0
  219. package/dist/{headless → core}/numbers.js +1 -1
  220. package/dist/core/numbers.js.map +1 -0
  221. package/dist/core/option-list.cjs +2 -0
  222. package/dist/core/option-list.cjs.map +1 -0
  223. package/dist/core/option-list.d.ts +49 -0
  224. package/dist/core/option-list.d.ts.map +1 -0
  225. package/dist/core/option-list.js +65 -0
  226. package/dist/core/option-list.js.map +1 -0
  227. package/dist/core/ore.cjs.map +1 -0
  228. package/dist/{headless → core}/ore.d.ts +2 -2
  229. package/dist/core/ore.d.ts.map +1 -0
  230. package/dist/{headless → core}/ore.js +1 -1
  231. package/dist/core/ore.js.map +1 -0
  232. package/dist/core/overlay.cjs +2 -0
  233. package/dist/core/overlay.cjs.map +1 -0
  234. package/dist/core/overlay.d.ts +41 -0
  235. package/dist/core/overlay.d.ts.map +1 -0
  236. package/dist/core/overlay.js +17 -0
  237. package/dist/core/overlay.js.map +1 -0
  238. package/dist/core/paginated-list.d.ts.map +1 -0
  239. package/dist/core/parse.cjs.map +1 -0
  240. package/dist/core/parse.d.ts.map +1 -0
  241. package/dist/{headless → core}/parse.js +1 -1
  242. package/dist/core/parse.js.map +1 -0
  243. package/dist/core/positioner.cjs +2 -0
  244. package/dist/core/positioner.cjs.map +1 -0
  245. package/dist/core/positioner.d.ts.map +1 -0
  246. package/dist/{headless → core}/positioner.js +7 -7
  247. package/dist/core/positioner.js.map +1 -0
  248. package/dist/core/ref-callback.cjs +2 -0
  249. package/dist/core/ref-callback.cjs.map +1 -0
  250. package/dist/core/ref-callback.d.ts.map +1 -0
  251. package/dist/{headless → core}/ref-callback.js +2 -2
  252. package/dist/core/ref-callback.js.map +1 -0
  253. package/dist/core/signals.cjs +2 -0
  254. package/dist/core/signals.cjs.map +1 -0
  255. package/dist/core/signals.d.ts.map +1 -0
  256. package/dist/{headless → core}/signals.js +3 -2
  257. package/dist/core/signals.js.map +1 -0
  258. package/dist/core/slider.cjs +2 -0
  259. package/dist/core/slider.cjs.map +1 -0
  260. package/dist/core/slider.d.ts.map +1 -0
  261. package/dist/{headless → core}/slider.js +3 -3
  262. package/dist/{headless/slider.cjs.map → core/slider.js.map} +1 -1
  263. package/dist/core/spinner.cjs +2 -0
  264. package/dist/core/spinner.cjs.map +1 -0
  265. package/dist/core/spinner.d.ts.map +1 -0
  266. package/dist/{headless → core}/spinner.js +3 -3
  267. package/dist/{headless/spinner.cjs.map → core/spinner.js.map} +1 -1
  268. package/dist/core/swipe.cjs.map +1 -0
  269. package/dist/core/swipe.d.ts.map +1 -0
  270. package/dist/{headless → core}/swipe.js +1 -1
  271. package/dist/core/swipe.js.map +1 -0
  272. package/dist/core/text-field.cjs.map +1 -0
  273. package/dist/core/text-field.d.ts.map +1 -0
  274. package/dist/{headless → core}/text-field.js +1 -1
  275. package/dist/core/text-field.js.map +1 -0
  276. package/dist/core/typeahead.cjs.map +1 -0
  277. package/dist/core/typeahead.d.ts.map +1 -0
  278. package/dist/{headless → core}/typeahead.js +1 -1
  279. package/dist/core/typeahead.js.map +1 -0
  280. package/dist/custom-elements.json +4433 -3949
  281. package/dist/datagrid.cjs +320 -271
  282. package/dist/datagrid.cjs.map +1 -1
  283. package/dist/datagrid.js +489 -435
  284. package/dist/datagrid.js.map +1 -1
  285. package/dist/date-picker.cjs +77 -62
  286. package/dist/date-picker.cjs.map +1 -1
  287. package/dist/date-picker.js +169 -146
  288. package/dist/date-picker.js.map +1 -1
  289. package/dist/dialog.cjs +3 -3
  290. package/dist/dialog.cjs.map +1 -1
  291. package/dist/dialog.js +18 -7
  292. package/dist/dialog.js.map +1 -1
  293. package/dist/disclosure/tab-panel/tab-panel.d.ts.map +1 -1
  294. package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
  295. package/dist/drawer.cjs +5 -5
  296. package/dist/drawer.cjs.map +1 -1
  297. package/dist/drawer.js +52 -47
  298. package/dist/drawer.js.map +1 -1
  299. package/dist/errors.cjs.map +1 -1
  300. package/dist/errors.js.map +1 -1
  301. package/dist/feedback/async/async.d.ts.map +1 -1
  302. package/dist/feedback/chip/chip.d.ts.map +1 -1
  303. package/dist/feedback/progress/progress.d.ts.map +1 -1
  304. package/dist/feedback/skeleton/skeleton.d.ts.map +1 -1
  305. package/dist/feedback/toast/index.d.ts +1 -1
  306. package/dist/feedback/toast/index.d.ts.map +1 -1
  307. package/dist/feedback/toast/toast.d.ts +16 -68
  308. package/dist/feedback/toast/toast.d.ts.map +1 -1
  309. package/dist/feedback/typing-indicator/typing-indicator.d.ts +1 -1
  310. package/dist/file-input.cjs +111 -78
  311. package/dist/file-input.cjs.map +1 -1
  312. package/dist/file-input.js +220 -184
  313. package/dist/file-input.js.map +1 -1
  314. package/dist/grid-item.cjs +3 -1
  315. package/dist/grid-item.cjs.map +1 -1
  316. package/dist/grid-item.js +3 -1
  317. package/dist/grid-item.js.map +1 -1
  318. package/dist/grid.cjs +3 -1
  319. package/dist/grid.cjs.map +1 -1
  320. package/dist/grid.js +6 -5
  321. package/dist/grid.js.map +1 -1
  322. package/dist/icon.cjs +5 -1
  323. package/dist/icon.cjs.map +1 -1
  324. package/dist/icon.js +50 -47
  325. package/dist/icon.js.map +1 -1
  326. package/dist/index.cjs +1 -1
  327. package/dist/index.d.ts +7 -8
  328. package/dist/index.d.ts.map +1 -1
  329. package/dist/index.js +2 -67
  330. package/dist/input.cjs +44 -40
  331. package/dist/input.cjs.map +1 -1
  332. package/dist/input.js +132 -130
  333. package/dist/input.js.map +1 -1
  334. package/dist/inputs/button-group/button-group.css.cjs +1 -1
  335. package/dist/inputs/button-group/button-group.css.cjs.map +1 -1
  336. package/dist/inputs/button-group/button-group.css.js +1 -1
  337. package/dist/inputs/button-group/button-group.css.js.map +1 -1
  338. package/dist/inputs/button-group/button-group.d.ts +6 -3
  339. package/dist/inputs/button-group/button-group.d.ts.map +1 -1
  340. package/dist/inputs/calendar/calendar.d.ts.map +1 -1
  341. package/dist/inputs/checkbox/checkbox.d.ts +6 -5
  342. package/dist/inputs/checkbox/checkbox.d.ts.map +1 -1
  343. package/dist/inputs/checkbox-group/checkbox-group.d.ts +1 -1
  344. package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -1
  345. package/dist/inputs/combobox/combobox.d.ts +4 -2
  346. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  347. package/dist/inputs/combobox/combobox.types.d.ts +5 -7
  348. package/dist/inputs/combobox/combobox.types.d.ts.map +1 -1
  349. package/dist/inputs/datagrid/datagrid-column.cjs +1 -1
  350. package/dist/inputs/datagrid/datagrid-column.cjs.map +1 -1
  351. package/dist/inputs/datagrid/datagrid-column.d.ts +1 -1
  352. package/dist/inputs/datagrid/datagrid-column.d.ts.map +1 -1
  353. package/dist/inputs/datagrid/datagrid-column.js +5 -5
  354. package/dist/inputs/datagrid/datagrid-column.js.map +1 -1
  355. package/dist/inputs/datagrid/datagrid-model.cjs +2 -0
  356. package/dist/inputs/datagrid/datagrid-model.cjs.map +1 -0
  357. package/dist/inputs/datagrid/datagrid-model.d.ts +101 -0
  358. package/dist/inputs/datagrid/datagrid-model.d.ts.map +1 -0
  359. package/dist/inputs/datagrid/datagrid-model.js +202 -0
  360. package/dist/inputs/datagrid/datagrid-model.js.map +1 -0
  361. package/dist/inputs/datagrid/datagrid-nav.cjs.map +1 -1
  362. package/dist/inputs/datagrid/datagrid.d.ts +44 -45
  363. package/dist/inputs/datagrid/datagrid.d.ts.map +1 -1
  364. package/dist/inputs/date-picker/date-picker.d.ts +4 -4
  365. package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
  366. package/dist/inputs/file-input/file-input-upload.cjs +1 -1
  367. package/dist/inputs/file-input/file-input-upload.cjs.map +1 -1
  368. package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -1
  369. package/dist/inputs/file-input/file-input-upload.js +6 -3
  370. package/dist/inputs/file-input/file-input-upload.js.map +1 -1
  371. package/dist/inputs/file-input/file-input.d.ts.map +1 -1
  372. package/dist/inputs/index.d.ts +0 -4
  373. package/dist/inputs/index.d.ts.map +1 -1
  374. package/dist/inputs/input/input.d.ts +4 -10
  375. package/dist/inputs/input/input.d.ts.map +1 -1
  376. package/dist/inputs/message-composer/message-composer.d.ts +6 -10
  377. package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
  378. package/dist/inputs/number-input/number-input.d.ts +4 -10
  379. package/dist/inputs/number-input/number-input.d.ts.map +1 -1
  380. package/dist/inputs/otp-input/otp-input.d.ts +4 -6
  381. package/dist/inputs/otp-input/otp-input.d.ts.map +1 -1
  382. package/dist/inputs/radio/radio.d.ts +4 -3
  383. package/dist/inputs/radio/radio.d.ts.map +1 -1
  384. package/dist/inputs/radio-group/radio-group.d.ts +1 -1
  385. package/dist/inputs/radio-group/radio-group.d.ts.map +1 -1
  386. package/dist/inputs/rating/rating.d.ts +4 -5
  387. package/dist/inputs/rating/rating.d.ts.map +1 -1
  388. package/dist/inputs/select/select.d.ts +7 -9
  389. package/dist/inputs/select/select.d.ts.map +1 -1
  390. package/dist/inputs/shared/field-binding.cjs.map +1 -1
  391. package/dist/inputs/shared/field-binding.d.ts +1 -1
  392. package/dist/inputs/shared/field-binding.js.map +1 -1
  393. package/dist/inputs/shared/index.d.ts +0 -1
  394. package/dist/inputs/shared/index.d.ts.map +1 -1
  395. package/dist/inputs/shared/native-field-event.cjs +2 -0
  396. package/dist/inputs/shared/native-field-event.cjs.map +1 -0
  397. package/dist/inputs/shared/native-field-event.d.ts +6 -0
  398. package/dist/inputs/shared/native-field-event.d.ts.map +1 -0
  399. package/dist/inputs/shared/native-field-event.js +29 -0
  400. package/dist/inputs/shared/native-field-event.js.map +1 -0
  401. package/dist/inputs/shared/templates.cjs +18 -12
  402. package/dist/inputs/shared/templates.cjs.map +1 -1
  403. package/dist/inputs/shared/templates.d.ts +1 -1
  404. package/dist/inputs/shared/templates.d.ts.map +1 -1
  405. package/dist/inputs/shared/templates.js +19 -13
  406. package/dist/inputs/shared/templates.js.map +1 -1
  407. package/dist/inputs/slider/slider.css.cjs +1 -1
  408. package/dist/inputs/slider/slider.css.cjs.map +1 -1
  409. package/dist/inputs/slider/slider.css.js +1 -1
  410. package/dist/inputs/slider/slider.css.js.map +1 -1
  411. package/dist/inputs/slider/slider.d.ts +7 -10
  412. package/dist/inputs/slider/slider.d.ts.map +1 -1
  413. package/dist/inputs/switch/switch.d.ts +4 -3
  414. package/dist/inputs/switch/switch.d.ts.map +1 -1
  415. package/dist/inputs/textarea/textarea.d.ts +4 -10
  416. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  417. package/dist/inputs/time-picker/time-picker.d.ts +4 -4
  418. package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
  419. package/dist/layout/box/box.d.ts.map +1 -1
  420. package/dist/layout/navbar/navbar.css.cjs +1 -1
  421. package/dist/layout/navbar/navbar.css.cjs.map +1 -1
  422. package/dist/layout/navbar/navbar.css.js +1 -1
  423. package/dist/layout/navbar/navbar.css.js.map +1 -1
  424. package/dist/layout/navbar/navbar.d.ts +10 -0
  425. package/dist/layout/navbar/navbar.d.ts.map +1 -1
  426. package/dist/layout/sidebar/sidebar-item.css.cjs +1 -1
  427. package/dist/layout/sidebar/sidebar-item.css.cjs.map +1 -1
  428. package/dist/layout/sidebar/sidebar-item.css.js +1 -1
  429. package/dist/layout/sidebar/sidebar-item.css.js.map +1 -1
  430. package/dist/layout/sidebar/sidebar.css.cjs +1 -1
  431. package/dist/layout/sidebar/sidebar.css.cjs.map +1 -1
  432. package/dist/layout/sidebar/sidebar.css.js +1 -1
  433. package/dist/layout/sidebar/sidebar.css.js.map +1 -1
  434. package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
  435. package/dist/list-item.cjs +2 -2
  436. package/dist/list-item.cjs.map +1 -1
  437. package/dist/list-item.js +4 -4
  438. package/dist/list-item.js.map +1 -1
  439. package/dist/list.cjs +3 -1
  440. package/dist/list.cjs.map +1 -1
  441. package/dist/list.js +28 -25
  442. package/dist/list.js.map +1 -1
  443. package/dist/marquee.cjs +32 -0
  444. package/dist/marquee.cjs.map +1 -0
  445. package/dist/marquee.js +93 -0
  446. package/dist/marquee.js.map +1 -0
  447. package/dist/menu.cjs +7 -7
  448. package/dist/menu.cjs.map +1 -1
  449. package/dist/menu.js +135 -103
  450. package/dist/menu.js.map +1 -1
  451. package/dist/message-composer.cjs +33 -31
  452. package/dist/message-composer.cjs.map +1 -1
  453. package/dist/message-composer.js +123 -123
  454. package/dist/message-composer.js.map +1 -1
  455. package/dist/navbar.cjs +17 -15
  456. package/dist/navbar.cjs.map +1 -1
  457. package/dist/navbar.js +108 -89
  458. package/dist/navbar.js.map +1 -1
  459. package/dist/number-input.cjs +19 -19
  460. package/dist/number-input.cjs.map +1 -1
  461. package/dist/number-input.js +94 -97
  462. package/dist/number-input.js.map +1 -1
  463. package/dist/otp-input.cjs +15 -13
  464. package/dist/otp-input.cjs.map +1 -1
  465. package/dist/otp-input.js +83 -82
  466. package/dist/otp-input.js.map +1 -1
  467. package/dist/overlay/command-palette/command-palette.d.ts +2 -2
  468. package/dist/overlay/command-palette/command-palette.d.ts.map +1 -1
  469. package/dist/overlay/command-palette/command-palette.types.d.ts +4 -5
  470. package/dist/overlay/command-palette/command-palette.types.d.ts.map +1 -1
  471. package/dist/overlay/dialog/dialog.d.ts +7 -6
  472. package/dist/overlay/dialog/dialog.d.ts.map +1 -1
  473. package/dist/overlay/drawer/drawer.d.ts +7 -10
  474. package/dist/overlay/drawer/drawer.d.ts.map +1 -1
  475. package/dist/overlay/index.d.ts +1 -1
  476. package/dist/overlay/index.d.ts.map +1 -1
  477. package/dist/overlay/menu/menu.d.ts +9 -7
  478. package/dist/overlay/menu/menu.d.ts.map +1 -1
  479. package/dist/overlay/popover/popover.d.ts +6 -11
  480. package/dist/overlay/popover/popover.d.ts.map +1 -1
  481. package/dist/overlay/shared/await-exit.cjs +1 -1
  482. package/dist/overlay/shared/await-exit.cjs.map +1 -1
  483. package/dist/overlay/shared/await-exit.js +1 -1
  484. package/dist/overlay/shared/await-exit.js.map +1 -1
  485. package/dist/overlay/shared/use-dialog.cjs +1 -1
  486. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  487. package/dist/overlay/shared/use-dialog.d.ts +13 -3
  488. package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
  489. package/dist/overlay/shared/use-dialog.js +80 -72
  490. package/dist/overlay/shared/use-dialog.js.map +1 -1
  491. package/dist/overlay/shared/use-floating-trigger.cjs +1 -1
  492. package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
  493. package/dist/overlay/shared/use-floating-trigger.d.ts +3 -1
  494. package/dist/overlay/shared/use-floating-trigger.d.ts.map +1 -1
  495. package/dist/overlay/shared/use-floating-trigger.js +64 -70
  496. package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
  497. package/dist/overlay/tooltip/tooltip.d.ts +9 -0
  498. package/dist/overlay/tooltip/tooltip.d.ts.map +1 -1
  499. package/dist/pagination.cjs +69 -55
  500. package/dist/pagination.cjs.map +1 -1
  501. package/dist/pagination.js +70 -56
  502. package/dist/pagination.js.map +1 -1
  503. package/dist/password-strength.cjs +6 -4
  504. package/dist/password-strength.cjs.map +1 -1
  505. package/dist/password-strength.js +6 -4
  506. package/dist/password-strength.js.map +1 -1
  507. package/dist/popover.cjs +4 -4
  508. package/dist/popover.cjs.map +1 -1
  509. package/dist/popover.js +28 -17
  510. package/dist/popover.js.map +1 -1
  511. package/dist/progress.cjs +25 -17
  512. package/dist/progress.cjs.map +1 -1
  513. package/dist/progress.js +29 -22
  514. package/dist/progress.js.map +1 -1
  515. package/dist/radio-group.cjs +14 -12
  516. package/dist/radio-group.cjs.map +1 -1
  517. package/dist/radio-group.js +88 -90
  518. package/dist/radio-group.js.map +1 -1
  519. package/dist/radio.cjs +4 -4
  520. package/dist/radio.cjs.map +1 -1
  521. package/dist/radio.js +90 -90
  522. package/dist/radio.js.map +1 -1
  523. package/dist/rating.cjs +18 -16
  524. package/dist/rating.cjs.map +1 -1
  525. package/dist/rating.js +69 -69
  526. package/dist/rating.js.map +1 -1
  527. package/dist/refine.cjs +1670 -1325
  528. package/dist/refine.cjs.map +1 -1
  529. package/dist/refine.iife.js +1673 -1328
  530. package/dist/refine.iife.js.map +1 -1
  531. package/dist/refine.js +1758 -1413
  532. package/dist/refine.js.map +1 -1
  533. package/dist/register.d.ts +21 -0
  534. package/dist/register.d.ts.map +1 -0
  535. package/dist/select.cjs +59 -51
  536. package/dist/select.cjs.map +1 -1
  537. package/dist/select.js +189 -182
  538. package/dist/select.js.map +1 -1
  539. package/dist/separator.cjs +9 -9
  540. package/dist/separator.cjs.map +1 -1
  541. package/dist/separator.js +9 -9
  542. package/dist/separator.js.map +1 -1
  543. package/dist/shared/index.d.ts +1 -1
  544. package/dist/shared/prop-bundles.cjs +1 -1
  545. package/dist/shared/prop-bundles.cjs.map +1 -1
  546. package/dist/shared/prop-bundles.js +4 -2
  547. package/dist/shared/prop-bundles.js.map +1 -1
  548. package/dist/shared/size-presets.cjs +1 -1
  549. package/dist/shared/size-presets.cjs.map +1 -1
  550. package/dist/shared/size-presets.d.ts +3 -0
  551. package/dist/shared/size-presets.d.ts.map +1 -1
  552. package/dist/shared/size-presets.js +4 -1
  553. package/dist/shared/size-presets.js.map +1 -1
  554. package/dist/sidebar.cjs +8 -8
  555. package/dist/sidebar.cjs.map +1 -1
  556. package/dist/sidebar.js +25 -25
  557. package/dist/sidebar.js.map +1 -1
  558. package/dist/skeleton.cjs +4 -6
  559. package/dist/skeleton.cjs.map +1 -1
  560. package/dist/skeleton.js +21 -22
  561. package/dist/skeleton.js.map +1 -1
  562. package/dist/slider.cjs +14 -14
  563. package/dist/slider.cjs.map +1 -1
  564. package/dist/slider.js +160 -168
  565. package/dist/slider.js.map +1 -1
  566. package/dist/step.cjs +47 -0
  567. package/dist/step.cjs.map +1 -0
  568. package/dist/step.js +127 -0
  569. package/dist/step.js.map +1 -0
  570. package/dist/stepper.cjs +8 -0
  571. package/dist/stepper.cjs.map +1 -0
  572. package/dist/stepper.js +101 -0
  573. package/dist/stepper.js.map +1 -0
  574. package/dist/styles/index.d.ts +0 -28
  575. package/dist/styles/index.d.ts.map +1 -1
  576. package/dist/styles/mixins/shape.css.cjs +2 -2
  577. package/dist/styles/mixins/shape.css.cjs.map +1 -1
  578. package/dist/styles/mixins/shape.css.js +6 -6
  579. package/dist/styles/mixins/shape.css.js.map +1 -1
  580. package/dist/styles/tokens.css +4 -0
  581. package/dist/switch.cjs +4 -4
  582. package/dist/switch.cjs.map +1 -1
  583. package/dist/switch.js +44 -44
  584. package/dist/switch.js.map +1 -1
  585. package/dist/tab-item.cjs +3 -3
  586. package/dist/tab-item.cjs.map +1 -1
  587. package/dist/tab-item.js +24 -24
  588. package/dist/tab-item.js.map +1 -1
  589. package/dist/tab-panel.cjs +9 -7
  590. package/dist/tab-panel.cjs.map +1 -1
  591. package/dist/tab-panel.js +15 -14
  592. package/dist/tab-panel.js.map +1 -1
  593. package/dist/table.cjs +3 -1
  594. package/dist/table.cjs.map +1 -1
  595. package/dist/table.js +3 -1
  596. package/dist/table.js.map +1 -1
  597. package/dist/tabs.cjs +6 -6
  598. package/dist/tabs.cjs.map +1 -1
  599. package/dist/tabs.js +30 -29
  600. package/dist/tabs.js.map +1 -1
  601. package/dist/text.cjs +3 -1
  602. package/dist/text.cjs.map +1 -1
  603. package/dist/text.js +3 -1
  604. package/dist/text.js.map +1 -1
  605. package/dist/textarea.cjs +22 -22
  606. package/dist/textarea.cjs.map +1 -1
  607. package/dist/textarea.js +110 -112
  608. package/dist/textarea.js.map +1 -1
  609. package/dist/time-picker.cjs +69 -61
  610. package/dist/time-picker.cjs.map +1 -1
  611. package/dist/time-picker.js +146 -132
  612. package/dist/time-picker.js.map +1 -1
  613. package/dist/toast.cjs +22 -22
  614. package/dist/toast.cjs.map +1 -1
  615. package/dist/toast.js +280 -173
  616. package/dist/toast.js.map +1 -1
  617. package/dist/tooltip.cjs +5 -5
  618. package/dist/tooltip.cjs.map +1 -1
  619. package/dist/tooltip.js +61 -51
  620. package/dist/tooltip.js.map +1 -1
  621. package/dist/typing-indicator.cjs +1 -1
  622. package/dist/typing-indicator.cjs.map +1 -1
  623. package/dist/typing-indicator.js +5 -5
  624. package/dist/typing-indicator.js.map +1 -1
  625. package/dist/utils/link.cjs.map +1 -1
  626. package/dist/utils/link.d.ts +2 -2
  627. package/package.json +36 -117
  628. package/dist/form.cjs +0 -11
  629. package/dist/form.cjs.map +0 -1
  630. package/dist/form.js +0 -59
  631. package/dist/form.js.map +0 -1
  632. package/dist/headless/_internal.d.ts.map +0 -1
  633. package/dist/headless/announcer.cjs.map +0 -1
  634. package/dist/headless/announcer.d.ts.map +0 -1
  635. package/dist/headless/announcer.js.map +0 -1
  636. package/dist/headless/aria-reflection.cjs.map +0 -1
  637. package/dist/headless/aria-reflection.d.ts.map +0 -1
  638. package/dist/headless/aria-reflection.js.map +0 -1
  639. package/dist/headless/auto-resize.cjs.map +0 -1
  640. package/dist/headless/auto-resize.d.ts.map +0 -1
  641. package/dist/headless/auto-resize.js.map +0 -1
  642. package/dist/headless/checkable.cjs.map +0 -1
  643. package/dist/headless/checkable.d.ts.map +0 -1
  644. package/dist/headless/checkable.js.map +0 -1
  645. package/dist/headless/choice-field.cjs +0 -2
  646. package/dist/headless/choice-field.cjs.map +0 -1
  647. package/dist/headless/choice-field.d.ts.map +0 -1
  648. package/dist/headless/choice-field.js.map +0 -1
  649. package/dist/headless/composer.cjs.map +0 -1
  650. package/dist/headless/composer.d.ts.map +0 -1
  651. package/dist/headless/composer.js.map +0 -1
  652. package/dist/headless/datagrid.cjs +0 -2
  653. package/dist/headless/datagrid.cjs.map +0 -1
  654. package/dist/headless/datagrid.d.ts +0 -158
  655. package/dist/headless/datagrid.d.ts.map +0 -1
  656. package/dist/headless/datagrid.js +0 -55
  657. package/dist/headless/datagrid.js.map +0 -1
  658. package/dist/headless/date-picker.cjs.map +0 -1
  659. package/dist/headless/date-picker.d.ts.map +0 -1
  660. package/dist/headless/date-picker.js.map +0 -1
  661. package/dist/headless/direction.cjs.map +0 -1
  662. package/dist/headless/direction.d.ts.map +0 -1
  663. package/dist/headless/direction.js.map +0 -1
  664. package/dist/headless/field-base.cjs +0 -2
  665. package/dist/headless/field-base.cjs.map +0 -1
  666. package/dist/headless/field-base.d.ts.map +0 -1
  667. package/dist/headless/field-base.js +0 -72
  668. package/dist/headless/field-base.js.map +0 -1
  669. package/dist/headless/focus.cjs.map +0 -1
  670. package/dist/headless/focus.d.ts.map +0 -1
  671. package/dist/headless/focus.js.map +0 -1
  672. package/dist/headless/index.d.ts.map +0 -1
  673. package/dist/headless/keyboard.cjs.map +0 -1
  674. package/dist/headless/keyboard.d.ts.map +0 -1
  675. package/dist/headless/keyboard.js.map +0 -1
  676. package/dist/headless/light-dom.cjs.map +0 -1
  677. package/dist/headless/light-dom.d.ts.map +0 -1
  678. package/dist/headless/light-dom.js.map +0 -1
  679. package/dist/headless/nav.cjs.map +0 -1
  680. package/dist/headless/nav.d.ts.map +0 -1
  681. package/dist/headless/nav.js.map +0 -1
  682. package/dist/headless/numbers.cjs.map +0 -1
  683. package/dist/headless/numbers.d.ts.map +0 -1
  684. package/dist/headless/numbers.js.map +0 -1
  685. package/dist/headless/option-list.cjs +0 -2
  686. package/dist/headless/option-list.cjs.map +0 -1
  687. package/dist/headless/option-list.d.ts +0 -107
  688. package/dist/headless/option-list.d.ts.map +0 -1
  689. package/dist/headless/option-list.js +0 -66
  690. package/dist/headless/option-list.js.map +0 -1
  691. package/dist/headless/ore.cjs.map +0 -1
  692. package/dist/headless/ore.d.ts.map +0 -1
  693. package/dist/headless/ore.js.map +0 -1
  694. package/dist/headless/overlay.cjs +0 -2
  695. package/dist/headless/overlay.cjs.map +0 -1
  696. package/dist/headless/overlay.d.ts +0 -64
  697. package/dist/headless/overlay.d.ts.map +0 -1
  698. package/dist/headless/overlay.js +0 -32
  699. package/dist/headless/overlay.js.map +0 -1
  700. package/dist/headless/paginated-list.cjs +0 -2
  701. package/dist/headless/paginated-list.cjs.map +0 -1
  702. package/dist/headless/paginated-list.d.ts.map +0 -1
  703. package/dist/headless/paginated-list.js +0 -34
  704. package/dist/headless/paginated-list.js.map +0 -1
  705. package/dist/headless/parse.cjs.map +0 -1
  706. package/dist/headless/parse.d.ts.map +0 -1
  707. package/dist/headless/parse.js.map +0 -1
  708. package/dist/headless/positioner.cjs +0 -2
  709. package/dist/headless/positioner.cjs.map +0 -1
  710. package/dist/headless/positioner.d.ts.map +0 -1
  711. package/dist/headless/positioner.js.map +0 -1
  712. package/dist/headless/ref-callback.cjs +0 -2
  713. package/dist/headless/ref-callback.cjs.map +0 -1
  714. package/dist/headless/ref-callback.d.ts.map +0 -1
  715. package/dist/headless/ref-callback.js.map +0 -1
  716. package/dist/headless/selection-control.cjs +0 -2
  717. package/dist/headless/selection-control.cjs.map +0 -1
  718. package/dist/headless/selection-control.d.ts +0 -30
  719. package/dist/headless/selection-control.d.ts.map +0 -1
  720. package/dist/headless/selection-control.js +0 -44
  721. package/dist/headless/selection-control.js.map +0 -1
  722. package/dist/headless/signals.cjs +0 -2
  723. package/dist/headless/signals.cjs.map +0 -1
  724. package/dist/headless/signals.d.ts.map +0 -1
  725. package/dist/headless/signals.js.map +0 -1
  726. package/dist/headless/slider.cjs +0 -2
  727. package/dist/headless/slider.d.ts.map +0 -1
  728. package/dist/headless/slider.js.map +0 -1
  729. package/dist/headless/sort-control.cjs +0 -2
  730. package/dist/headless/sort-control.cjs.map +0 -1
  731. package/dist/headless/sort-control.d.ts +0 -22
  732. package/dist/headless/sort-control.d.ts.map +0 -1
  733. package/dist/headless/sort-control.js +0 -36
  734. package/dist/headless/sort-control.js.map +0 -1
  735. package/dist/headless/spinner.cjs +0 -2
  736. package/dist/headless/spinner.d.ts.map +0 -1
  737. package/dist/headless/spinner.js.map +0 -1
  738. package/dist/headless/swipe.cjs.map +0 -1
  739. package/dist/headless/swipe.d.ts.map +0 -1
  740. package/dist/headless/swipe.js.map +0 -1
  741. package/dist/headless/text-field.cjs.map +0 -1
  742. package/dist/headless/text-field.d.ts.map +0 -1
  743. package/dist/headless/text-field.js.map +0 -1
  744. package/dist/headless/typeahead.cjs.map +0 -1
  745. package/dist/headless/typeahead.d.ts.map +0 -1
  746. package/dist/headless/typeahead.js.map +0 -1
  747. package/dist/headless.cjs +0 -1
  748. package/dist/headless.js +0 -30
  749. package/dist/inputs/datagrid/datagrid-controls.cjs +0 -2
  750. package/dist/inputs/datagrid/datagrid-controls.cjs.map +0 -1
  751. package/dist/inputs/datagrid/datagrid-controls.d.ts +0 -98
  752. package/dist/inputs/datagrid/datagrid-controls.d.ts.map +0 -1
  753. package/dist/inputs/datagrid/datagrid-controls.js +0 -147
  754. package/dist/inputs/datagrid/datagrid-controls.js.map +0 -1
  755. package/dist/inputs/form/form.css.cjs +0 -2
  756. package/dist/inputs/form/form.css.cjs.map +0 -1
  757. package/dist/inputs/form/form.css.js +0 -6
  758. package/dist/inputs/form/form.css.js.map +0 -1
  759. package/dist/inputs/form/form.d.ts +0 -59
  760. package/dist/inputs/form/form.d.ts.map +0 -1
  761. package/dist/inputs/shared/form-context.cjs +0 -2
  762. package/dist/inputs/shared/form-context.cjs.map +0 -1
  763. package/dist/inputs/shared/form-context.d.ts +0 -55
  764. package/dist/inputs/shared/form-context.d.ts.map +0 -1
  765. package/dist/inputs/shared/form-context.js +0 -15
  766. package/dist/inputs/shared/form-context.js.map +0 -1
  767. package/dist/keymap/dist/_dev.cjs +0 -2
  768. package/dist/keymap/dist/_dev.cjs.map +0 -1
  769. package/dist/keymap/dist/_dev.js +0 -4
  770. package/dist/keymap/dist/_dev.js.map +0 -1
  771. package/dist/keymap/dist/format.cjs +0 -1
  772. package/dist/keymap/dist/format.js +0 -1
  773. package/dist/keymap/dist/index.cjs +0 -1
  774. package/dist/keymap/dist/index.js +0 -4
  775. package/dist/keymap/dist/keymap.cjs +0 -2
  776. package/dist/keymap/dist/keymap.cjs.map +0 -1
  777. package/dist/keymap/dist/keymap.js +0 -221
  778. package/dist/keymap/dist/keymap.js.map +0 -1
  779. package/dist/keymap/dist/layer.cjs +0 -1
  780. package/dist/keymap/dist/layer.js +0 -1
  781. package/dist/styles/index.cjs +0 -2
  782. package/dist/styles/index.cjs.map +0 -1
  783. package/dist/styles/index.js +0 -25
  784. package/dist/styles/index.js.map +0 -1
  785. package/dist/styles/styles.css +0 -5
  786. package/dist/testing/index.d.ts +0 -233
  787. package/dist/testing/index.d.ts.map +0 -1
  788. package/dist/testing.cjs +0 -2
  789. package/dist/testing.cjs.map +0 -1
  790. package/dist/testing.js +0 -43
  791. package/dist/testing.js.map +0 -1
  792. /package/dist/{headless → core}/announcer.cjs +0 -0
  793. /package/dist/{headless → core}/announcer.d.ts +0 -0
  794. /package/dist/{headless → core}/aria-reflection.cjs +0 -0
  795. /package/dist/{headless → core}/aria-reflection.d.ts +0 -0
  796. /package/dist/{headless → core}/auto-resize.cjs +0 -0
  797. /package/dist/{headless → core}/auto-resize.d.ts +0 -0
  798. /package/dist/{headless → core}/checkable.cjs +0 -0
  799. /package/dist/{headless → core}/checkable.d.ts +0 -0
  800. /package/dist/{headless → core}/choice-field.d.ts +0 -0
  801. /package/dist/{headless → core}/composer.cjs +0 -0
  802. /package/dist/{headless → core}/composer.d.ts +0 -0
  803. /package/dist/{headless → core}/date-picker.d.ts +0 -0
  804. /package/dist/{headless → core}/direction.cjs +0 -0
  805. /package/dist/{headless → core}/direction.d.ts +0 -0
  806. /package/dist/{headless → core}/focus.cjs +0 -0
  807. /package/dist/{headless → core}/focus.d.ts +0 -0
  808. /package/dist/{headless → core}/keyboard.d.ts +0 -0
  809. /package/dist/{headless → core}/light-dom.cjs +0 -0
  810. /package/dist/{headless → core}/light-dom.d.ts +0 -0
  811. /package/dist/{headless → core}/nav.cjs +0 -0
  812. /package/dist/{headless → core}/nav.d.ts +0 -0
  813. /package/dist/{headless → core}/numbers.cjs +0 -0
  814. /package/dist/{headless → core}/numbers.d.ts +0 -0
  815. /package/dist/{headless → core}/ore.cjs +0 -0
  816. /package/dist/{headless → core}/paginated-list.d.ts +0 -0
  817. /package/dist/{headless → core}/parse.cjs +0 -0
  818. /package/dist/{headless → core}/parse.d.ts +0 -0
  819. /package/dist/{headless → core}/positioner.d.ts +0 -0
  820. /package/dist/{headless → core}/ref-callback.d.ts +0 -0
  821. /package/dist/{headless → core}/signals.d.ts +0 -0
  822. /package/dist/{headless → core}/slider.d.ts +0 -0
  823. /package/dist/{headless → core}/spinner.d.ts +0 -0
  824. /package/dist/{headless → core}/swipe.cjs +0 -0
  825. /package/dist/{headless → core}/swipe.d.ts +0 -0
  826. /package/dist/{headless → core}/text-field.cjs +0 -0
  827. /package/dist/{headless → core}/text-field.d.ts +0 -0
  828. /package/dist/{headless → core}/typeahead.cjs +0 -0
  829. /package/dist/{headless → core}/typeahead.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.cjs","names":[],"sources":["../../src/core/focus.ts"],"sourcesContent":["// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type FocusManagerOptions = {\n /**\n * Returns the CSS selector for the element that should receive focus on open.\n *\n * **Security note:** this value is passed directly to `querySelector`. It must\n * come from trusted developer-controlled configuration, never from raw user input.\n */\n getInitialFocusSelector: () => string | undefined;\n /**\n * Returns whether focus should be restored to the previously focused element\n * on close. `undefined` or `true` means restore; `false` means skip.\n */\n getReturnFocus: () => boolean | undefined;\n /** Host element used for `querySelector` when resolving the initial focus target. */\n host: HTMLElement;\n /**\n * `AbortSignal` from the component lifecycle. Cancels a pending `applyInitialFocus()`\n * animation frame automatically on abort — prevents a stray `.focus()` call landing on an\n * element that's been disconnected in the meantime (e.g. the dialog closes and unmounts\n * before the deferred focus frame runs).\n */\n signal?: AbortSignal;\n};\n\nexport type FocusManager = {\n /** Move focus to the element matching `getInitialFocusSelector` (deferred one frame). */\n applyInitialFocus: () => void;\n /** Cancel a pending `applyInitialFocus` rAF, if any. */\n cancelInitialFocus: () => void;\n /** Capture the currently focused element so it can be restored later. */\n captureReturnFocus: () => void;\n /** Restore focus to the element captured by `captureReturnFocus`. */\n restoreFocus: () => void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Encapsulates the three-step focus lifecycle used by dialogs and drawers:\n * 1. Capture the element that triggered the open.\n * 2. Move focus inside the overlay (optionally to a specific element).\n * 3. Restore focus when the overlay closes.\n */\nexport function createFocusManager(options: FocusManagerOptions): FocusManager {\n let returnFocusEl: HTMLElement | null = null;\n let rafHandle: ReturnType<typeof requestAnimationFrame> | null = null;\n\n const cancelInitialFocus = (): void => {\n if (rafHandle !== null) {\n cancelAnimationFrame(rafHandle);\n rafHandle = null;\n }\n };\n\n options.signal?.addEventListener('abort', cancelInitialFocus, { once: true });\n\n return {\n applyInitialFocus() {\n cancelInitialFocus();\n\n const selector = options.getInitialFocusSelector();\n\n if (selector) {\n // Query the shadow root first (all refine components render into Shadow DOM),\n // falling back to the host's light-DOM tree for non-Shadow contexts.\n const root = options.host.shadowRoot ?? options.host;\n\n let target: HTMLElement | null = null;\n\n try {\n target = root.querySelector<HTMLElement>(selector);\n } catch {\n // Malformed selector (SyntaxError) — skip initial focus rather than throw.\n return;\n }\n\n if (target) {\n rafHandle = requestAnimationFrame(() => {\n rafHandle = null;\n target.focus();\n });\n }\n }\n },\n\n cancelInitialFocus,\n\n captureReturnFocus() {\n returnFocusEl = document.activeElement as HTMLElement;\n },\n\n restoreFocus() {\n if (options.getReturnFocus() !== false && returnFocusEl) {\n returnFocusEl.focus();\n returnFocusEl = null;\n }\n },\n };\n}\n"],"mappings":"AA6CA,SAAgB,EAAmB,EAA4C,CAC7E,IAAI,EAAoC,KACpC,EAA6D,KAE3D,MAAiC,CACjC,IAAc,OAChB,qBAAqB,CAAS,EAC9B,EAAY,KAEhB,EAIA,OAFA,EAAQ,QAAQ,iBAAiB,QAAS,EAAoB,CAAE,KAAM,EAAK,CAAC,EAErE,CACL,mBAAoB,CAClB,EAAmB,EAEnB,IAAM,EAAW,EAAQ,wBAAwB,EAEjD,GAAI,EAAU,CAGZ,IAAM,EAAO,EAAQ,KAAK,YAAc,EAAQ,KAE5C,EAA6B,KAEjC,GAAI,CACF,EAAS,EAAK,cAA2B,CAAQ,CACnD,MAAQ,CAEN,MACF,CAEI,IACF,EAAY,0BAA4B,CACtC,EAAY,KACZ,EAAO,MAAM,CACf,CAAC,EAEL,CACF,EAEA,qBAEA,oBAAqB,CACnB,EAAgB,SAAS,aAC3B,EAEA,cAAe,CACT,EAAQ,eAAe,IAAM,IAAS,IACxC,EAAc,MAAM,EACpB,EAAgB,KAEpB,CACF,CACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../src/core/focus.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG;IAChC;;;;;OAKG;IACH,uBAAuB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAClD;;;OAGG;IACH,cAAc,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;IAC1C,qFAAqF;IACrF,IAAI,EAAE,WAAW,CAAC;IAClB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,yFAAyF;IACzF,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,wDAAwD;IACxD,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,yEAAyE;IACzE,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,qEAAqE;IACrE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAuD7E"}
@@ -1,4 +1,4 @@
1
- //#region src/headless/focus.ts
1
+ //#region src/core/focus.ts
2
2
  function e(e) {
3
3
  let t = null, n = null, r = () => {
4
4
  n !== null && (cancelAnimationFrame(n), n = null);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.js","names":[],"sources":["../../src/core/focus.ts"],"sourcesContent":["// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport type FocusManagerOptions = {\n /**\n * Returns the CSS selector for the element that should receive focus on open.\n *\n * **Security note:** this value is passed directly to `querySelector`. It must\n * come from trusted developer-controlled configuration, never from raw user input.\n */\n getInitialFocusSelector: () => string | undefined;\n /**\n * Returns whether focus should be restored to the previously focused element\n * on close. `undefined` or `true` means restore; `false` means skip.\n */\n getReturnFocus: () => boolean | undefined;\n /** Host element used for `querySelector` when resolving the initial focus target. */\n host: HTMLElement;\n /**\n * `AbortSignal` from the component lifecycle. Cancels a pending `applyInitialFocus()`\n * animation frame automatically on abort — prevents a stray `.focus()` call landing on an\n * element that's been disconnected in the meantime (e.g. the dialog closes and unmounts\n * before the deferred focus frame runs).\n */\n signal?: AbortSignal;\n};\n\nexport type FocusManager = {\n /** Move focus to the element matching `getInitialFocusSelector` (deferred one frame). */\n applyInitialFocus: () => void;\n /** Cancel a pending `applyInitialFocus` rAF, if any. */\n cancelInitialFocus: () => void;\n /** Capture the currently focused element so it can be restored later. */\n captureReturnFocus: () => void;\n /** Restore focus to the element captured by `captureReturnFocus`. */\n restoreFocus: () => void;\n};\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\n/**\n * Encapsulates the three-step focus lifecycle used by dialogs and drawers:\n * 1. Capture the element that triggered the open.\n * 2. Move focus inside the overlay (optionally to a specific element).\n * 3. Restore focus when the overlay closes.\n */\nexport function createFocusManager(options: FocusManagerOptions): FocusManager {\n let returnFocusEl: HTMLElement | null = null;\n let rafHandle: ReturnType<typeof requestAnimationFrame> | null = null;\n\n const cancelInitialFocus = (): void => {\n if (rafHandle !== null) {\n cancelAnimationFrame(rafHandle);\n rafHandle = null;\n }\n };\n\n options.signal?.addEventListener('abort', cancelInitialFocus, { once: true });\n\n return {\n applyInitialFocus() {\n cancelInitialFocus();\n\n const selector = options.getInitialFocusSelector();\n\n if (selector) {\n // Query the shadow root first (all refine components render into Shadow DOM),\n // falling back to the host's light-DOM tree for non-Shadow contexts.\n const root = options.host.shadowRoot ?? options.host;\n\n let target: HTMLElement | null = null;\n\n try {\n target = root.querySelector<HTMLElement>(selector);\n } catch {\n // Malformed selector (SyntaxError) — skip initial focus rather than throw.\n return;\n }\n\n if (target) {\n rafHandle = requestAnimationFrame(() => {\n rafHandle = null;\n target.focus();\n });\n }\n }\n },\n\n cancelInitialFocus,\n\n captureReturnFocus() {\n returnFocusEl = document.activeElement as HTMLElement;\n },\n\n restoreFocus() {\n if (options.getReturnFocus() !== false && returnFocusEl) {\n returnFocusEl.focus();\n returnFocusEl = null;\n }\n },\n };\n}\n"],"mappings":";AA6CA,SAAgB,EAAmB,GAA4C;CAC7E,IAAI,IAAoC,MACpC,IAA6D,MAE3D,UAAiC;EACrC,AAAI,MAAc,SAChB,qBAAqB,CAAS,GAC9B,IAAY;CAEhB;CAIA,OAFA,EAAQ,QAAQ,iBAAiB,SAAS,GAAoB,EAAE,MAAM,GAAK,CAAC,GAErE;EACL,oBAAoB;GAClB,EAAmB;GAEnB,IAAM,IAAW,EAAQ,wBAAwB;GAEjD,IAAI,GAAU;IAGZ,IAAM,IAAO,EAAQ,KAAK,cAAc,EAAQ,MAE5C,IAA6B;IAEjC,IAAI;KACF,IAAS,EAAK,cAA2B,CAAQ;IACnD,QAAQ;KAEN;IACF;IAEA,AAAI,MACF,IAAY,4BAA4B;KAEtC,AADA,IAAY,MACZ,EAAO,MAAM;IACf,CAAC;GAEL;EACF;EAEA;EAEA,qBAAqB;GACnB,IAAgB,SAAS;EAC3B;EAEA,eAAe;GACb,AAAI,EAAQ,eAAe,MAAM,MAAS,MACxC,EAAc,MAAM,GACpB,IAAgB;EAEpB;CACF;AACF"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Private implementation barrel for Refine components.
3
+ *
4
+ * This module is deliberately omitted from the package export map: its helpers
5
+ * encode component-specific Ore and Ripple behavior, not a stable public API.
6
+ */
1
7
  export { lifecycleSignal } from './ore';
2
8
  export { createAutoResize, type AutoResizeControl, type AutoResizeOptions } from './auto-resize';
3
9
  export { bindRefCallback, type RefCallback } from './ref-callback';
@@ -7,8 +13,7 @@ export { createTextField, type TextFieldDetach, type TextFieldHandle, type TextF
7
13
  export { createChoiceField, type ChoiceChangeDetail, type ChoiceFieldHandle, type ChoiceFieldOptions, } from './choice-field';
8
14
  export { createCheckable, type CheckableChangePayload, type CheckableHandle, type CheckableOptions } from './checkable';
9
15
  export { createComposerControl, type ComposerControl, type ComposerControlOptions, type SendShortcut, } from './composer';
10
- export { type DialogCloseReason, type DropdownCloseReason, type OverlayCloseDetail, type OverlayControl, type OverlayOpenDetail, type OverlayOpenReason, } from './overlay';
11
- export { createOptionList, type BaseOptionItem, type OptionListHandle, type OptionListOptions, type PlacementOptions, } from './option-list';
16
+ export { type DialogCloseReason, type DropdownCloseReason, type OverlayCloseDetail, type OverlayOpenChangeDetail, type OverlayOpenDetail, type OverlayOpenReason, } from './overlay';
12
17
  export { createPaginatedList, type PaginatedListHandle, type PaginatedListOptions } from './paginated-list';
13
18
  export { type ListKeyAction, type ListNavigationAction } from './nav';
14
19
  export { createSpinnerControl, type SpinnerControl, type SpinnerControlOptions } from './spinner';
@@ -18,13 +23,9 @@ export { announce, type AnnouncePoliteness, type AnnounceOptions } from './annou
18
23
  export { createDatePickerControl, formatDisplayDate, parseIso, toIsoString, type DateCell, type DatePickerControl, type DatePickerControlOptions, type DatePickerView, type MonthCell, type YearCell, } from './date-picker';
19
24
  export { getChoiceLabel, getLightChildrenByTag } from './light-dom';
20
25
  export { toFiniteNumber, toFiniteNumberOr, toPositiveStep } from './numbers';
21
- export { createDataGridControl, type DataGridColumn, type DataGridControl, type DataGridControlOptions, type SelectionMode, type SortDirection, type SortState, } from './datagrid';
22
26
  export { createDropdownPositioner, type DropdownPositionerOptions, type OverlayPositioner } from './positioner';
23
27
  export { createInteraction, dispatchKeyboardAction, type Interaction, type InteractionOptions, type KeyboardDispatchOptions, type PressTrigger, } from './keyboard';
24
28
  export { createListControl, type ListControl, type ListNavigationOptions } from './nav';
25
- export { createOverlayControl, type OverlayControlOptions } from './overlay';
26
- export { createSelectionControl, type SelectionControl, type SelectionControlOptions } from './selection-control';
27
- export { createSortControl, type SortControl, type SortControlOptions } from './sort-control';
28
29
  export { createTypeahead, type Typeahead, type TypeaheadOptions } from './typeahead';
29
30
  export { elementDirection } from './direction';
30
31
  export { parseStringTriggers } from './parse';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var e=(e,t)=>{if(t.disabled?.value)return!1;let n=Object.hasOwn(t.keymap,e.key)?t.keymap[e.key]:void 0;if(!n)return!1;let r=t.preventDefault??`before`;r===`before`&&e.preventDefault();let i=n(e)!==!1;return r===`after`&&i&&e.preventDefault(),i},t=t=>{let n=()=>!!t.disabled?.value,r=t.keys??[`Enter`,` `],i=Object.fromEntries(r.map(e=>[e,e=>t.onPress?.(e,`keyboard`)]));return{handleBlur:e=>{n()||t.onBlur?.(e)},handleClick:e=>n()?!1:(t.onPress?.(e,`pointer`),!0),handleFocus:e=>{n()||t.onFocus?.(e)},handleKeydown:n=>e(n,{disabled:t.disabled,keymap:i})}};exports.createInteraction=t,exports.dispatchKeyboardAction=e;
1
+ var e=(e,t)=>{if(t.disabled?.value)return!1;let n=Object.hasOwn(t.keymap,e.key)?t.keymap[e.key]:void 0;if(!n)return!1;let r=t.preventDefault??`before`;r===`before`&&e.preventDefault();let i=n(e)!==!1;return r===`after`&&i&&e.preventDefault(),i},t=t=>{let n=()=>!!t.disabled?.value,r=t.keys??[`Enter`,` `],i=Object.fromEntries(r.map(e=>[e,e=>t.onPress?.(e,`keyboard`)]));return{handleBlur:e=>{n()||t.onBlur?.(e)},handleClick:e=>!n()&&(t.onPress?.(e,`pointer`),!0),handleFocus:e=>{n()||t.onFocus?.(e)},handleKeydown:n=>e(n,{disabled:t.disabled,keymap:i})}};exports.createInteraction=t,exports.dispatchKeyboardAction=e;
2
2
  //# sourceMappingURL=keyboard.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.cjs","names":[],"sources":["../../src/core/keyboard.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\n// ── Keyboard dispatch ─────────────────────────────────────────────────────────\n\nexport type KeyboardDispatchOptions = {\n disabled?: Readable<boolean | undefined>;\n keymap: Record<string, (event: KeyboardEvent) => boolean | void>;\n preventDefault?: 'after' | 'before' | false;\n};\n\nexport const dispatchKeyboardAction = (event: KeyboardEvent, options: KeyboardDispatchOptions): boolean => {\n if (options.disabled?.value) return false;\n\n // `event.key` is attacker-influenceable on a synthetic KeyboardEvent (e.g. `new\n // KeyboardEvent('keydown', { key: '__proto__' })`). Guard with `Object.hasOwn` so a\n // crafted key name can never resolve to an inherited `Object.prototype` member\n // (`__proto__`, `constructor`, `toString`, …) instead of `undefined`.\n const action = Object.hasOwn(options.keymap, event.key) ? options.keymap[event.key] : undefined;\n\n if (!action) return false;\n\n const preventDefaultMode = options.preventDefault ?? 'before';\n\n if (preventDefaultMode === 'before') event.preventDefault();\n\n const handled = action(event) !== false;\n\n if (preventDefaultMode === 'after' && handled) event.preventDefault();\n\n return handled;\n};\n\n// ── Press control / Interaction ───────────────────────────────────────────────\n\nexport type PressTrigger = 'keyboard' | 'pointer';\n\n/**\n * Options for `createInteraction` — a unified press + focus/blur interaction\n * handler for accessible interactive elements.\n */\nexport type InteractionOptions = {\n /** `true` when the element is disabled. All handlers become no-ops. */\n disabled?: Readable<boolean | undefined>;\n /** Keys that trigger a press. Defaults to `['Enter', ' ']`. */\n keys?: string[];\n /** Called when the element loses focus. */\n onBlur?: (event: FocusEvent) => void;\n /** Called when the element receives focus. */\n onFocus?: (event: FocusEvent) => void;\n /** Called when the element is pressed via keyboard or pointer. */\n onPress?: (event: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;\n};\n\nexport type Interaction = {\n handleBlur: (event: FocusEvent) => void;\n handleClick: (event: MouseEvent) => boolean;\n handleFocus: (event: FocusEvent) => void;\n handleKeydown: (event: KeyboardEvent) => boolean;\n};\n\n/**\n * Creates a set of event handlers for an interactive element that responds to\n * keyboard and pointer presses, and optionally focus/blur events.\n *\n * @example\n * ```ts\n * const interaction = createInteraction({\n * disabled: props.disabled,\n * onPress: (event, trigger) => toggle(event),\n * onFocus: (event) => setFocused(true),\n * onBlur: (event) => setFocused(false),\n * });\n *\n * // In template:\n * // @click=\"${interaction.handleClick}\"\n * // @keydown=\"${interaction.handleKeydown}\"\n * // @focus=\"${interaction.handleFocus}\"\n * // @blur=\"${interaction.handleBlur}\"\n * ```\n */\nexport const createInteraction = (options: InteractionOptions): Interaction => {\n const isDisabled = (): boolean => Boolean(options.disabled?.value);\n const keyboardKeys = options.keys ?? ['Enter', ' '];\n const keymap = Object.fromEntries(\n keyboardKeys.map((key) => [key, (keyboardEvent: KeyboardEvent) => options.onPress?.(keyboardEvent, 'keyboard')]),\n );\n\n return {\n handleBlur: (event: FocusEvent): void => {\n if (!isDisabled()) options.onBlur?.(event);\n },\n handleClick: (event: MouseEvent): boolean => {\n if (isDisabled()) return false;\n\n options.onPress?.(event, 'pointer');\n\n return true;\n },\n handleFocus: (event: FocusEvent): void => {\n if (!isDisabled()) options.onFocus?.(event);\n },\n handleKeydown: (event: KeyboardEvent): boolean =>\n dispatchKeyboardAction(event, { disabled: options.disabled, keymap }),\n };\n};\n"],"mappings":"AAUA,IAAa,GAA0B,EAAsB,IAA8C,CACzG,GAAI,EAAQ,UAAU,MAAO,MAAO,GAMpC,IAAM,EAAS,OAAO,OAAO,EAAQ,OAAQ,EAAM,GAAG,EAAI,EAAQ,OAAO,EAAM,KAAO,IAAA,GAEtF,GAAI,CAAC,EAAQ,MAAO,GAEpB,IAAM,EAAqB,EAAQ,gBAAkB,SAEjD,IAAuB,UAAU,EAAM,eAAe,EAE1D,IAAM,EAAU,EAAO,CAAK,IAAM,GAIlC,OAFI,IAAuB,SAAW,GAAS,EAAM,eAAe,EAE7D,CACT,EAkDa,EAAqB,GAA6C,CAC7E,IAAM,MAA4B,EAAQ,EAAQ,UAAU,MACtD,EAAe,EAAQ,MAAQ,CAAC,QAAS,GAAG,EAC5C,EAAS,OAAO,YACpB,EAAa,IAAK,GAAQ,CAAC,EAAM,GAAiC,EAAQ,UAAU,EAAe,UAAU,CAAC,CAAC,CACjH,EAEA,MAAO,CACL,WAAa,GAA4B,CAClC,EAAW,GAAG,EAAQ,SAAS,CAAK,CAC3C,EACA,YAAc,GACZ,CAAI,EAAW,IAEf,EAAQ,UAAU,EAAO,SAAS,EAE3B,IAET,YAAc,GAA4B,CACnC,EAAW,GAAG,EAAQ,UAAU,CAAK,CAC5C,EACA,cAAgB,GACd,EAAuB,EAAO,CAAE,SAAU,EAAQ,SAAU,QAAO,CAAC,CACxE,CACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/core/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,GAAG,IAAI,CAAC,CAAC;IACjE,cAAc,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CAC7C,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,OAAO,aAAa,EAAE,SAAS,uBAAuB,KAAG,OAoB/F,CAAC;AAIF,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACzC,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACrC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CAC9E,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;IAC5C,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;CAClD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,GAAI,SAAS,kBAAkB,KAAG,WAwB/D,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/headless/keyboard.ts
1
+ //#region src/core/keyboard.ts
2
2
  var e = (e, t) => {
3
3
  if (t.disabled?.value) return !1;
4
4
  let n = Object.hasOwn(t.keymap, e.key) ? t.keymap[e.key] : void 0;
@@ -13,7 +13,7 @@ var e = (e, t) => {
13
13
  handleBlur: (e) => {
14
14
  n() || t.onBlur?.(e);
15
15
  },
16
- handleClick: (e) => n() ? !1 : (t.onPress?.(e, "pointer"), !0),
16
+ handleClick: (e) => !n() && (t.onPress?.(e, "pointer"), !0),
17
17
  handleFocus: (e) => {
18
18
  n() || t.onFocus?.(e);
19
19
  },
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","names":[],"sources":["../../src/core/keyboard.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\n// ── Keyboard dispatch ─────────────────────────────────────────────────────────\n\nexport type KeyboardDispatchOptions = {\n disabled?: Readable<boolean | undefined>;\n keymap: Record<string, (event: KeyboardEvent) => boolean | void>;\n preventDefault?: 'after' | 'before' | false;\n};\n\nexport const dispatchKeyboardAction = (event: KeyboardEvent, options: KeyboardDispatchOptions): boolean => {\n if (options.disabled?.value) return false;\n\n // `event.key` is attacker-influenceable on a synthetic KeyboardEvent (e.g. `new\n // KeyboardEvent('keydown', { key: '__proto__' })`). Guard with `Object.hasOwn` so a\n // crafted key name can never resolve to an inherited `Object.prototype` member\n // (`__proto__`, `constructor`, `toString`, …) instead of `undefined`.\n const action = Object.hasOwn(options.keymap, event.key) ? options.keymap[event.key] : undefined;\n\n if (!action) return false;\n\n const preventDefaultMode = options.preventDefault ?? 'before';\n\n if (preventDefaultMode === 'before') event.preventDefault();\n\n const handled = action(event) !== false;\n\n if (preventDefaultMode === 'after' && handled) event.preventDefault();\n\n return handled;\n};\n\n// ── Press control / Interaction ───────────────────────────────────────────────\n\nexport type PressTrigger = 'keyboard' | 'pointer';\n\n/**\n * Options for `createInteraction` — a unified press + focus/blur interaction\n * handler for accessible interactive elements.\n */\nexport type InteractionOptions = {\n /** `true` when the element is disabled. All handlers become no-ops. */\n disabled?: Readable<boolean | undefined>;\n /** Keys that trigger a press. Defaults to `['Enter', ' ']`. */\n keys?: string[];\n /** Called when the element loses focus. */\n onBlur?: (event: FocusEvent) => void;\n /** Called when the element receives focus. */\n onFocus?: (event: FocusEvent) => void;\n /** Called when the element is pressed via keyboard or pointer. */\n onPress?: (event: KeyboardEvent | MouseEvent, trigger: PressTrigger) => void;\n};\n\nexport type Interaction = {\n handleBlur: (event: FocusEvent) => void;\n handleClick: (event: MouseEvent) => boolean;\n handleFocus: (event: FocusEvent) => void;\n handleKeydown: (event: KeyboardEvent) => boolean;\n};\n\n/**\n * Creates a set of event handlers for an interactive element that responds to\n * keyboard and pointer presses, and optionally focus/blur events.\n *\n * @example\n * ```ts\n * const interaction = createInteraction({\n * disabled: props.disabled,\n * onPress: (event, trigger) => toggle(event),\n * onFocus: (event) => setFocused(true),\n * onBlur: (event) => setFocused(false),\n * });\n *\n * // In template:\n * // @click=\"${interaction.handleClick}\"\n * // @keydown=\"${interaction.handleKeydown}\"\n * // @focus=\"${interaction.handleFocus}\"\n * // @blur=\"${interaction.handleBlur}\"\n * ```\n */\nexport const createInteraction = (options: InteractionOptions): Interaction => {\n const isDisabled = (): boolean => Boolean(options.disabled?.value);\n const keyboardKeys = options.keys ?? ['Enter', ' '];\n const keymap = Object.fromEntries(\n keyboardKeys.map((key) => [key, (keyboardEvent: KeyboardEvent) => options.onPress?.(keyboardEvent, 'keyboard')]),\n );\n\n return {\n handleBlur: (event: FocusEvent): void => {\n if (!isDisabled()) options.onBlur?.(event);\n },\n handleClick: (event: MouseEvent): boolean => {\n if (isDisabled()) return false;\n\n options.onPress?.(event, 'pointer');\n\n return true;\n },\n handleFocus: (event: FocusEvent): void => {\n if (!isDisabled()) options.onFocus?.(event);\n },\n handleKeydown: (event: KeyboardEvent): boolean =>\n dispatchKeyboardAction(event, { disabled: options.disabled, keymap }),\n };\n};\n"],"mappings":";AAUA,IAAa,KAA0B,GAAsB,MAA8C;CACzG,IAAI,EAAQ,UAAU,OAAO,OAAO;CAMpC,IAAM,IAAS,OAAO,OAAO,EAAQ,QAAQ,EAAM,GAAG,IAAI,EAAQ,OAAO,EAAM,OAAO,KAAA;CAEtF,IAAI,CAAC,GAAQ,OAAO;CAEpB,IAAM,IAAqB,EAAQ,kBAAkB;CAErD,AAAI,MAAuB,YAAU,EAAM,eAAe;CAE1D,IAAM,IAAU,EAAO,CAAK,MAAM;CAIlC,OAFI,MAAuB,WAAW,KAAS,EAAM,eAAe,GAE7D;AACT,GAkDa,KAAqB,MAA6C;CAC7E,IAAM,UAA4B,EAAQ,EAAQ,UAAU,OACtD,IAAe,EAAQ,QAAQ,CAAC,SAAS,GAAG,GAC5C,IAAS,OAAO,YACpB,EAAa,KAAK,MAAQ,CAAC,IAAM,MAAiC,EAAQ,UAAU,GAAe,UAAU,CAAC,CAAC,CACjH;CAEA,OAAO;EACL,aAAa,MAA4B;GACvC,AAAK,EAAW,KAAG,EAAQ,SAAS,CAAK;EAC3C;EACA,cAAc,MACZ,CAAI,EAAW,MAEf,EAAQ,UAAU,GAAO,SAAS,GAE3B;EAET,cAAc,MAA4B;GACxC,AAAK,EAAW,KAAG,EAAQ,UAAU,CAAK;EAC5C;EACA,gBAAgB,MACd,EAAuB,GAAO;GAAE,UAAU,EAAQ;GAAU;EAAO,CAAC;CACxE;AACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light-dom.cjs","names":[],"sources":["../../src/core/light-dom.ts"],"sourcesContent":["// ── Slot / light-DOM query helpers ────────────────────────────────────────────\n// Utilities for querying slotted light-DOM children and resolving labels from\n// option elements. Used by group components (checkbox-group, radio-group) and\n// choice-field components (select, combobox).\n\n/**\n * Returns all light-DOM descendants matching `tag` inside `host`.\n * Uses `getElementsByTagName` on the host's light DOM \\u2014 not Shadow DOM slot assignment.\n */\nexport const getLightChildrenByTag = (host: HTMLElement, tag: string): HTMLElement[] =>\n Array.from(host.getElementsByTagName(tag)) as HTMLElement[];\n\n/**\n * Returns the `textContent` of the item whose `value` attribute matches `value`,\n * falling back to `value` itself when no match is found.\n * Used by choice-field components to derive labels for emitted change events.\n */\nexport const getChoiceLabel = (items: HTMLElement[], value: string): string => {\n const item = items.find((el) => (el.getAttribute('value') ?? '') === value);\n\n return item?.textContent?.replace(/\\s+/g, ' ').trim() || value;\n};\n"],"mappings":"AASA,IAAa,GAAyB,EAAmB,IACvD,MAAM,KAAK,EAAK,qBAAqB,CAAG,CAAC,EAO9B,GAAkB,EAAsB,IACtC,EAAM,KAAM,IAAQ,EAAG,aAAa,OAAO,GAAK,MAAQ,CAE9D,CAAA,EAAM,aAAa,QAAQ,OAAQ,GAAG,CAAC,CAAC,KAAK,GAAK"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light-dom.d.ts","sourceRoot":"","sources":["../../src/core/light-dom.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM,WAAW,EAAE,KAAK,MAAM,KAAG,WAAW,EACrB,CAAC;AAE9D;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,WAAW,EAAE,EAAE,OAAO,MAAM,KAAG,MAIpE,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/headless/light-dom.ts
1
+ //#region src/core/light-dom.ts
2
2
  var e = (e, t) => Array.from(e.getElementsByTagName(t)), t = (e, t) => e.find((e) => (e.getAttribute("value") ?? "") === t)?.textContent?.replace(/\s+/g, " ").trim() || t;
3
3
  //#endregion
4
4
  export { t as getChoiceLabel, e as getLightChildrenByTag };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"light-dom.js","names":[],"sources":["../../src/core/light-dom.ts"],"sourcesContent":["// ── Slot / light-DOM query helpers ────────────────────────────────────────────\n// Utilities for querying slotted light-DOM children and resolving labels from\n// option elements. Used by group components (checkbox-group, radio-group) and\n// choice-field components (select, combobox).\n\n/**\n * Returns all light-DOM descendants matching `tag` inside `host`.\n * Uses `getElementsByTagName` on the host's light DOM \\u2014 not Shadow DOM slot assignment.\n */\nexport const getLightChildrenByTag = (host: HTMLElement, tag: string): HTMLElement[] =>\n Array.from(host.getElementsByTagName(tag)) as HTMLElement[];\n\n/**\n * Returns the `textContent` of the item whose `value` attribute matches `value`,\n * falling back to `value` itself when no match is found.\n * Used by choice-field components to derive labels for emitted change events.\n */\nexport const getChoiceLabel = (items: HTMLElement[], value: string): string => {\n const item = items.find((el) => (el.getAttribute('value') ?? '') === value);\n\n return item?.textContent?.replace(/\\s+/g, ' ').trim() || value;\n};\n"],"mappings":";AASA,IAAa,KAAyB,GAAmB,MACvD,MAAM,KAAK,EAAK,qBAAqB,CAAG,CAAC,GAO9B,KAAkB,GAAsB,MACtC,EAAM,MAAM,OAAQ,EAAG,aAAa,OAAO,KAAK,QAAQ,CAE9D,CAAA,EAAM,aAAa,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK,KAAK"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav.cjs","names":[],"sources":["../../src/core/nav.ts"],"sourcesContent":["import { type Readable, signal } from '@vielzeug/ripple';\n\nimport { dispatchKeyboardAction } from './keyboard';\nimport { createTypeahead } from './typeahead';\n\n// ── Private array search helpers ────────────────────────────────────────────\nconst findForward = <T>(items: T[], start: number, predicate: (item: T, index: number) => boolean): number => {\n for (let idx = start; idx < items.length; idx++) {\n if (predicate(items[idx], idx)) return idx;\n }\n\n return -1;\n};\n\nconst findBackward = <T>(items: T[], start: number, predicate: (item: T, index: number) => boolean): number => {\n for (let idx = start; idx >= 0; idx--) {\n if (predicate(items[idx], idx)) return idx;\n }\n\n return -1;\n};\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\n/**\n * Arrow-key and Home/End navigation actions. Separate from `ListKeyAction` so\n * keymap declarations never need `Exclude<ListKeyAction, 'typeahead'>`.\n */\nexport type ListNavigationAction = 'first' | 'last' | 'next' | 'prev';\n\n/**\n * All possible navigation action names, including `'typeahead'` (character-key\n * search). Used in `onNavigate` callbacks where both nav and typeahead are valid.\n */\nexport type ListKeyAction = ListNavigationAction | 'typeahead';\n\n/**\n * Orientation-aware default key bindings for list navigation.\n * - `'vertical'` (default): Up/Down arrows, Home/End\n * - `'horizontal'`: Left/Right arrows, Home/End\n * - `'both'`: all four arrow keys + Home/End\n */\nconst DEFAULT_KEYS: Record<'both' | 'horizontal' | 'vertical', Record<ListNavigationAction, string[]>> = {\n both: { first: ['Home'], last: ['End'], next: ['ArrowDown', 'ArrowRight'], prev: ['ArrowUp', 'ArrowLeft'] },\n horizontal: { first: ['Home'], last: ['End'], next: ['ArrowRight'], prev: ['ArrowLeft'] },\n vertical: { first: ['Home'], last: ['End'], next: ['ArrowDown'], prev: ['ArrowUp'] },\n};\n\n/**\n * RTL mirror of `DEFAULT_KEYS`'s horizontal component (per WAI-ARIA APG — tabs/radiogroup\n * flip Left/Right in `dir=\"rtl\"` so \"next\" always advances in reading order, not screen-space\n * direction). Only the Left/Right bindings differ; Home/End and the vertical arrows are\n * direction-independent and stay identical to `DEFAULT_KEYS`.\n */\nconst DEFAULT_KEYS_RTL: Record<'both' | 'horizontal' | 'vertical', Record<ListNavigationAction, string[]>> = {\n both: { first: ['Home'], last: ['End'], next: ['ArrowDown', 'ArrowLeft'], prev: ['ArrowUp', 'ArrowRight'] },\n horizontal: { first: ['Home'], last: ['End'], next: ['ArrowLeft'], prev: ['ArrowRight'] },\n vertical: DEFAULT_KEYS.vertical,\n};\n\nexport type ListNavigationOptions<T> = {\n /**\n * Text direction, used to mirror the default Left/Right arrow-key bindings for\n * `'horizontal'`/`'both'` orientation (WAI-ARIA APG: `dir=\"rtl\"` flips which arrow key\n * means \"next\" vs \"prev\"). Pass a getter for dynamic/reactive direction (e.g. derived from\n * `elementDirection(getHost())`, since a `dir` ancestor attribute can change at runtime).\n * Has no effect when an explicit `keys` override is provided. Defaults to `'ltr'`.\n */\n direction?: 'ltr' | 'rtl' | (() => 'ltr' | 'rtl');\n disabled?: Readable<boolean | undefined>;\n /**\n * Returns a plain-text label for an item used by typeahead search.\n * When provided, pressing a printable character key jumps to the first enabled\n * item whose label starts with the accumulated type buffer (500 ms reset window).\n * Omit for contexts where the host element is a text input (e.g. combobox).\n */\n getItemLabel?: (item: T, index: number) => string;\n getItems: () => T[];\n isItemDisabled?: (item: T, index: number) => boolean;\n /** Override default key bindings for navigation actions. */\n keys?: Partial<Record<ListNavigationAction, string[]>>;\n loop?: boolean;\n /**\n * Called when navigation lands on a new index.\n * `event` is the originating `KeyboardEvent`, or `undefined` for programmatic navigation.\n * Use to sync side-effects such as focusing a DOM element.\n */\n onNavigate?: (action: ListKeyAction, index: number, event?: KeyboardEvent) => void;\n /**\n * Axis the list navigates along. Controls which arrow keys are treated as\n * `next`/`prev` when no explicit `keys` override is provided.\n * Pass a getter function for dynamic/reactive orientation (e.g. driven by a prop signal).\n *\n * - `'vertical'` (default): ↑↓ arrows\n * - `'horizontal'`: ←→ arrows\n * - `'both'`: all four arrow keys\n */\n orientation?: 'both' | 'horizontal' | 'vertical' | (() => 'both' | 'horizontal' | 'vertical');\n /** `AbortSignal` from the component lifecycle. Disposes typeahead timer on abort. */\n signal?: AbortSignal;\n};\n\nexport type ListControl<T> = {\n [Symbol.dispose](): void;\n /** Disposes the internal typeahead timer. Alias for `dispose()`. Conforms to the monorepo disposal convention. */\n dispose(): void;\n /** `true` after `dispose()` has been called. */\n readonly disposed: boolean;\n /** Current focused index. `-1` when nothing is focused. */\n readonly focusedIndex: Readable<number>;\n getActiveItem(): T | undefined;\n handleKeydown(event: KeyboardEvent): boolean;\n /**\n * Programmatically navigate to a named position.\n * Always fires `onNavigate` — consistent with keyboard navigation.\n * Returns the resolved index, or `-1` if no enabled item was found.\n */\n navigate(action: ListNavigationAction): number;\n /** Reset focused index to `-1`. */\n reset(): void;\n /**\n * Set focus to the item at `index`. Returns the resolved index.\n * Pass a negative index to clear focus (same as `reset()`).\n */\n set(index: number): number;\n};\n\nconst hasDisabledProp = (item: unknown): item is { disabled: boolean } =>\n typeof item === 'object' && item !== null && 'disabled' in item;\n\nexport const createListControl = <T>(options: ListNavigationOptions<T>): ListControl<T> => {\n const _index = signal(-1);\n\n const isItemDisabled = (item: T, index: number): boolean =>\n options.isItemDisabled?.(item, index) ?? (hasDisabledProp(item) ? item.disabled : false);\n\n const commitIndex = (idx: number, action: ListKeyAction, event?: KeyboardEvent): number => {\n if (idx >= 0) {\n _index.value = idx;\n options.onNavigate?.(action, idx, event);\n }\n\n return idx;\n };\n\n const findEnabledIndex = (items: T[], start: number, direction: 'forward' | 'backward'): number => {\n if (direction === 'forward') return findForward(items, start, (item, i) => !isItemDisabled(item, i));\n\n return findBackward(items, start, (item, i) => !isItemDisabled(item, i));\n };\n\n const set = (index: number): number => {\n if (index < 0) {\n reset();\n\n return -1;\n }\n\n const items = options.getItems();\n\n if (!items.length) return -1;\n\n const clamped = Math.min(index, items.length - 1);\n\n if (isItemDisabled(items[clamped], clamped)) return -1;\n\n _index.value = clamped;\n\n return clamped;\n };\n\n const move = (direction: 'forward' | 'backward', event?: KeyboardEvent): number => {\n const items = options.getItems();\n const current = _index.value;\n\n if (!items.length) return -1;\n\n const start: number =\n current < 0\n ? direction === 'forward'\n ? 0\n : items.length - 1\n : direction === 'forward'\n ? current + 1\n : current - 1;\n const idx = findEnabledIndex(items, start, direction);\n const action: ListNavigationAction = direction === 'forward' ? 'next' : 'prev';\n\n if (idx >= 0) return commitIndex(idx, action, event);\n\n if (options.loop) {\n const wrapStart = direction === 'forward' ? 0 : items.length - 1;\n const wrapped = findEnabledIndex(items, wrapStart, direction);\n\n if (wrapped >= 0) return commitIndex(wrapped, action, event);\n }\n\n return current;\n };\n\n const navigate = (action: ListNavigationAction): number => {\n const items = options.getItems();\n\n if (!items.length) return -1;\n\n if (action === 'first') {\n const idx = findEnabledIndex(items, 0, 'forward');\n\n return commitIndex(idx, 'first');\n }\n\n if (action === 'last') {\n const idx = findEnabledIndex(items, items.length - 1, 'backward');\n\n return commitIndex(idx, 'last');\n }\n\n return move(action === 'next' ? 'forward' : 'backward');\n };\n\n const getActiveItem = (): T | undefined => {\n const items = options.getItems();\n const index = _index.value;\n\n return index >= 0 && index < items.length ? items[index] : undefined;\n };\n\n const reset = (): void => {\n _index.value = -1;\n };\n\n // ── Keyboard handling ──────────────────────────────────────────────────────\n\n const isKeyDisabled = (): boolean => Boolean(options.disabled?.value);\n\n const resolveOrientation = (): 'both' | 'horizontal' | 'vertical' =>\n typeof options.orientation === 'function' ? options.orientation() : (options.orientation ?? 'vertical');\n\n const resolveDirection = (): 'ltr' | 'rtl' =>\n typeof options.direction === 'function' ? options.direction() : (options.direction ?? 'ltr');\n\n const buildKeymap = (): Record<string, (keyboardEvent: KeyboardEvent) => void> => {\n const keys = options.keys;\n const keyTable = resolveDirection() === 'rtl' ? DEFAULT_KEYS_RTL : DEFAULT_KEYS;\n const orientationDefaults = keyTable[resolveOrientation()];\n const resolved = {\n first: keys?.first ?? orientationDefaults.first,\n last: keys?.last ?? orientationDefaults.last,\n next: keys?.next ?? orientationDefaults.next,\n prev: keys?.prev ?? orientationDefaults.prev,\n };\n const km: Record<string, (keyboardEvent: KeyboardEvent) => void> = {};\n\n for (const action of ['next', 'prev', 'first', 'last'] as const) {\n for (const key of resolved[action]) {\n km[key] = (keyboardEvent: KeyboardEvent) => {\n if (action === 'first' || action === 'last') {\n const items = options.getItems();\n\n if (!items.length) return;\n\n const idx =\n action === 'first'\n ? findEnabledIndex(items, 0, 'forward')\n : findEnabledIndex(items, items.length - 1, 'backward');\n\n commitIndex(idx, action, keyboardEvent);\n } else {\n move(action === 'next' ? 'forward' : 'backward', keyboardEvent);\n }\n };\n }\n }\n\n return km;\n };\n\n // ── Typeahead ──────────────────────────────────────────────────────────────\n\n const typeahead = options.getItemLabel\n ? createTypeahead({\n getIndex: () => _index.value,\n getItemLabel: options.getItemLabel,\n getItems: options.getItems,\n isItemDisabled: (item, index) => isItemDisabled(item, index),\n onNavigate: (index, event) => {\n if (!isKeyDisabled()) {\n _index.value = index;\n options.onNavigate?.('typeahead', index, event);\n }\n },\n })\n : null;\n\n // Keymap depends on both orientation and direction — if either is dynamic, rebuild on every\n // keydown instead of caching once.\n const isDynamicKeymap = typeof options.orientation === 'function' || typeof options.direction === 'function';\n const _staticKeymap: Record<string, (e: KeyboardEvent) => void> | null = isDynamicKeymap ? null : buildKeymap();\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n const km = _staticKeymap ?? buildKeymap();\n\n if (dispatchKeyboardAction(event, { disabled: options.disabled, keymap: km })) return true;\n\n return typeahead?.handleKeydown(event) ?? false;\n };\n\n let disposed = false;\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n typeahead?.reset();\n };\n\n if (options.signal) {\n options.signal.addEventListener('abort', dispose, { once: true });\n }\n\n return {\n dispose,\n get disposed() {\n return disposed;\n },\n focusedIndex: _index,\n getActiveItem,\n handleKeydown,\n navigate,\n reset,\n set,\n [Symbol.dispose]: dispose,\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav.d.ts","sourceRoot":"","sources":["../../src/core/nav.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAU,MAAM,kBAAkB,CAAC;AAwBzD;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtE;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,oBAAoB,GAAG,WAAW,CAAC;AA0B/D,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IACrC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IACzC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD,4DAA4D;IAC5D,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACnF;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,CAAC,MAAM,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC;IAC9F,qFAAqF;IACrF,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,kHAAkH;IAClH,OAAO,IAAI,IAAI,CAAC;IAChB,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,2DAA2D;IAC3D,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxC,aAAa,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAAC;IAC/C,mCAAmC;IACnC,KAAK,IAAI,IAAI,CAAC;IACd;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,CAAC;AAKF,eAAO,MAAM,iBAAiB,GAAI,CAAC,EAAE,SAAS,qBAAqB,CAAC,CAAC,CAAC,KAAG,WAAW,CAAC,CAAC,CA2MrF,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { dispatchKeyboardAction as e } from "./keyboard.js";
2
2
  import { createTypeahead as t } from "./typeahead.js";
3
3
  import { signal as n } from "@vielzeug/ripple";
4
- //#region src/headless/nav.ts
4
+ //#region src/core/nav.ts
5
5
  var r = (e, t, n) => {
6
6
  for (let r = t; r < e.length; r++) if (n(e[r], r)) return r;
7
7
  return -1;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav.js","names":[],"sources":["../../src/core/nav.ts"],"sourcesContent":["import { type Readable, signal } from '@vielzeug/ripple';\n\nimport { dispatchKeyboardAction } from './keyboard';\nimport { createTypeahead } from './typeahead';\n\n// ── Private array search helpers ────────────────────────────────────────────\nconst findForward = <T>(items: T[], start: number, predicate: (item: T, index: number) => boolean): number => {\n for (let idx = start; idx < items.length; idx++) {\n if (predicate(items[idx], idx)) return idx;\n }\n\n return -1;\n};\n\nconst findBackward = <T>(items: T[], start: number, predicate: (item: T, index: number) => boolean): number => {\n for (let idx = start; idx >= 0; idx--) {\n if (predicate(items[idx], idx)) return idx;\n }\n\n return -1;\n};\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\n/**\n * Arrow-key and Home/End navigation actions. Separate from `ListKeyAction` so\n * keymap declarations never need `Exclude<ListKeyAction, 'typeahead'>`.\n */\nexport type ListNavigationAction = 'first' | 'last' | 'next' | 'prev';\n\n/**\n * All possible navigation action names, including `'typeahead'` (character-key\n * search). Used in `onNavigate` callbacks where both nav and typeahead are valid.\n */\nexport type ListKeyAction = ListNavigationAction | 'typeahead';\n\n/**\n * Orientation-aware default key bindings for list navigation.\n * - `'vertical'` (default): Up/Down arrows, Home/End\n * - `'horizontal'`: Left/Right arrows, Home/End\n * - `'both'`: all four arrow keys + Home/End\n */\nconst DEFAULT_KEYS: Record<'both' | 'horizontal' | 'vertical', Record<ListNavigationAction, string[]>> = {\n both: { first: ['Home'], last: ['End'], next: ['ArrowDown', 'ArrowRight'], prev: ['ArrowUp', 'ArrowLeft'] },\n horizontal: { first: ['Home'], last: ['End'], next: ['ArrowRight'], prev: ['ArrowLeft'] },\n vertical: { first: ['Home'], last: ['End'], next: ['ArrowDown'], prev: ['ArrowUp'] },\n};\n\n/**\n * RTL mirror of `DEFAULT_KEYS`'s horizontal component (per WAI-ARIA APG — tabs/radiogroup\n * flip Left/Right in `dir=\"rtl\"` so \"next\" always advances in reading order, not screen-space\n * direction). Only the Left/Right bindings differ; Home/End and the vertical arrows are\n * direction-independent and stay identical to `DEFAULT_KEYS`.\n */\nconst DEFAULT_KEYS_RTL: Record<'both' | 'horizontal' | 'vertical', Record<ListNavigationAction, string[]>> = {\n both: { first: ['Home'], last: ['End'], next: ['ArrowDown', 'ArrowLeft'], prev: ['ArrowUp', 'ArrowRight'] },\n horizontal: { first: ['Home'], last: ['End'], next: ['ArrowLeft'], prev: ['ArrowRight'] },\n vertical: DEFAULT_KEYS.vertical,\n};\n\nexport type ListNavigationOptions<T> = {\n /**\n * Text direction, used to mirror the default Left/Right arrow-key bindings for\n * `'horizontal'`/`'both'` orientation (WAI-ARIA APG: `dir=\"rtl\"` flips which arrow key\n * means \"next\" vs \"prev\"). Pass a getter for dynamic/reactive direction (e.g. derived from\n * `elementDirection(getHost())`, since a `dir` ancestor attribute can change at runtime).\n * Has no effect when an explicit `keys` override is provided. Defaults to `'ltr'`.\n */\n direction?: 'ltr' | 'rtl' | (() => 'ltr' | 'rtl');\n disabled?: Readable<boolean | undefined>;\n /**\n * Returns a plain-text label for an item used by typeahead search.\n * When provided, pressing a printable character key jumps to the first enabled\n * item whose label starts with the accumulated type buffer (500 ms reset window).\n * Omit for contexts where the host element is a text input (e.g. combobox).\n */\n getItemLabel?: (item: T, index: number) => string;\n getItems: () => T[];\n isItemDisabled?: (item: T, index: number) => boolean;\n /** Override default key bindings for navigation actions. */\n keys?: Partial<Record<ListNavigationAction, string[]>>;\n loop?: boolean;\n /**\n * Called when navigation lands on a new index.\n * `event` is the originating `KeyboardEvent`, or `undefined` for programmatic navigation.\n * Use to sync side-effects such as focusing a DOM element.\n */\n onNavigate?: (action: ListKeyAction, index: number, event?: KeyboardEvent) => void;\n /**\n * Axis the list navigates along. Controls which arrow keys are treated as\n * `next`/`prev` when no explicit `keys` override is provided.\n * Pass a getter function for dynamic/reactive orientation (e.g. driven by a prop signal).\n *\n * - `'vertical'` (default): ↑↓ arrows\n * - `'horizontal'`: ←→ arrows\n * - `'both'`: all four arrow keys\n */\n orientation?: 'both' | 'horizontal' | 'vertical' | (() => 'both' | 'horizontal' | 'vertical');\n /** `AbortSignal` from the component lifecycle. Disposes typeahead timer on abort. */\n signal?: AbortSignal;\n};\n\nexport type ListControl<T> = {\n [Symbol.dispose](): void;\n /** Disposes the internal typeahead timer. Alias for `dispose()`. Conforms to the monorepo disposal convention. */\n dispose(): void;\n /** `true` after `dispose()` has been called. */\n readonly disposed: boolean;\n /** Current focused index. `-1` when nothing is focused. */\n readonly focusedIndex: Readable<number>;\n getActiveItem(): T | undefined;\n handleKeydown(event: KeyboardEvent): boolean;\n /**\n * Programmatically navigate to a named position.\n * Always fires `onNavigate` — consistent with keyboard navigation.\n * Returns the resolved index, or `-1` if no enabled item was found.\n */\n navigate(action: ListNavigationAction): number;\n /** Reset focused index to `-1`. */\n reset(): void;\n /**\n * Set focus to the item at `index`. Returns the resolved index.\n * Pass a negative index to clear focus (same as `reset()`).\n */\n set(index: number): number;\n};\n\nconst hasDisabledProp = (item: unknown): item is { disabled: boolean } =>\n typeof item === 'object' && item !== null && 'disabled' in item;\n\nexport const createListControl = <T>(options: ListNavigationOptions<T>): ListControl<T> => {\n const _index = signal(-1);\n\n const isItemDisabled = (item: T, index: number): boolean =>\n options.isItemDisabled?.(item, index) ?? (hasDisabledProp(item) ? item.disabled : false);\n\n const commitIndex = (idx: number, action: ListKeyAction, event?: KeyboardEvent): number => {\n if (idx >= 0) {\n _index.value = idx;\n options.onNavigate?.(action, idx, event);\n }\n\n return idx;\n };\n\n const findEnabledIndex = (items: T[], start: number, direction: 'forward' | 'backward'): number => {\n if (direction === 'forward') return findForward(items, start, (item, i) => !isItemDisabled(item, i));\n\n return findBackward(items, start, (item, i) => !isItemDisabled(item, i));\n };\n\n const set = (index: number): number => {\n if (index < 0) {\n reset();\n\n return -1;\n }\n\n const items = options.getItems();\n\n if (!items.length) return -1;\n\n const clamped = Math.min(index, items.length - 1);\n\n if (isItemDisabled(items[clamped], clamped)) return -1;\n\n _index.value = clamped;\n\n return clamped;\n };\n\n const move = (direction: 'forward' | 'backward', event?: KeyboardEvent): number => {\n const items = options.getItems();\n const current = _index.value;\n\n if (!items.length) return -1;\n\n const start: number =\n current < 0\n ? direction === 'forward'\n ? 0\n : items.length - 1\n : direction === 'forward'\n ? current + 1\n : current - 1;\n const idx = findEnabledIndex(items, start, direction);\n const action: ListNavigationAction = direction === 'forward' ? 'next' : 'prev';\n\n if (idx >= 0) return commitIndex(idx, action, event);\n\n if (options.loop) {\n const wrapStart = direction === 'forward' ? 0 : items.length - 1;\n const wrapped = findEnabledIndex(items, wrapStart, direction);\n\n if (wrapped >= 0) return commitIndex(wrapped, action, event);\n }\n\n return current;\n };\n\n const navigate = (action: ListNavigationAction): number => {\n const items = options.getItems();\n\n if (!items.length) return -1;\n\n if (action === 'first') {\n const idx = findEnabledIndex(items, 0, 'forward');\n\n return commitIndex(idx, 'first');\n }\n\n if (action === 'last') {\n const idx = findEnabledIndex(items, items.length - 1, 'backward');\n\n return commitIndex(idx, 'last');\n }\n\n return move(action === 'next' ? 'forward' : 'backward');\n };\n\n const getActiveItem = (): T | undefined => {\n const items = options.getItems();\n const index = _index.value;\n\n return index >= 0 && index < items.length ? items[index] : undefined;\n };\n\n const reset = (): void => {\n _index.value = -1;\n };\n\n // ── Keyboard handling ──────────────────────────────────────────────────────\n\n const isKeyDisabled = (): boolean => Boolean(options.disabled?.value);\n\n const resolveOrientation = (): 'both' | 'horizontal' | 'vertical' =>\n typeof options.orientation === 'function' ? options.orientation() : (options.orientation ?? 'vertical');\n\n const resolveDirection = (): 'ltr' | 'rtl' =>\n typeof options.direction === 'function' ? options.direction() : (options.direction ?? 'ltr');\n\n const buildKeymap = (): Record<string, (keyboardEvent: KeyboardEvent) => void> => {\n const keys = options.keys;\n const keyTable = resolveDirection() === 'rtl' ? DEFAULT_KEYS_RTL : DEFAULT_KEYS;\n const orientationDefaults = keyTable[resolveOrientation()];\n const resolved = {\n first: keys?.first ?? orientationDefaults.first,\n last: keys?.last ?? orientationDefaults.last,\n next: keys?.next ?? orientationDefaults.next,\n prev: keys?.prev ?? orientationDefaults.prev,\n };\n const km: Record<string, (keyboardEvent: KeyboardEvent) => void> = {};\n\n for (const action of ['next', 'prev', 'first', 'last'] as const) {\n for (const key of resolved[action]) {\n km[key] = (keyboardEvent: KeyboardEvent) => {\n if (action === 'first' || action === 'last') {\n const items = options.getItems();\n\n if (!items.length) return;\n\n const idx =\n action === 'first'\n ? findEnabledIndex(items, 0, 'forward')\n : findEnabledIndex(items, items.length - 1, 'backward');\n\n commitIndex(idx, action, keyboardEvent);\n } else {\n move(action === 'next' ? 'forward' : 'backward', keyboardEvent);\n }\n };\n }\n }\n\n return km;\n };\n\n // ── Typeahead ──────────────────────────────────────────────────────────────\n\n const typeahead = options.getItemLabel\n ? createTypeahead({\n getIndex: () => _index.value,\n getItemLabel: options.getItemLabel,\n getItems: options.getItems,\n isItemDisabled: (item, index) => isItemDisabled(item, index),\n onNavigate: (index, event) => {\n if (!isKeyDisabled()) {\n _index.value = index;\n options.onNavigate?.('typeahead', index, event);\n }\n },\n })\n : null;\n\n // Keymap depends on both orientation and direction — if either is dynamic, rebuild on every\n // keydown instead of caching once.\n const isDynamicKeymap = typeof options.orientation === 'function' || typeof options.direction === 'function';\n const _staticKeymap: Record<string, (e: KeyboardEvent) => void> | null = isDynamicKeymap ? null : buildKeymap();\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n const km = _staticKeymap ?? buildKeymap();\n\n if (dispatchKeyboardAction(event, { disabled: options.disabled, keymap: km })) return true;\n\n return typeahead?.handleKeydown(event) ?? false;\n };\n\n let disposed = false;\n\n const dispose = (): void => {\n if (disposed) return;\n\n disposed = true;\n typeahead?.reset();\n };\n\n if (options.signal) {\n options.signal.addEventListener('abort', dispose, { once: true });\n }\n\n return {\n dispose,\n get disposed() {\n return disposed;\n },\n focusedIndex: _index,\n getActiveItem,\n handleKeydown,\n navigate,\n reset,\n set,\n [Symbol.dispose]: dispose,\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numbers.cjs","names":[],"sources":["../../src/core/numbers.ts"],"sourcesContent":["// ── Number helpers ────────────────────────────────────────────────────────────\n\n/**\n * Coerces `value` via `Number()` and returns it when finite, `undefined` otherwise.\n *\n * Caveat: `null` and `''` both coerce to `0` in JavaScript (`Number(null) === 0`,\n * `Number('') === 0`) and are therefore returned as the finite number `0`, not\n * `undefined` — this function does not treat \"absent\" values specially. Only\n * genuinely non-numeric input (`undefined`, `NaN`, non-numeric strings) yields\n * `undefined`. Callers that mean \"no bound set\" should pass `undefined`\n * explicitly rather than `null` or `''`.\n */\nexport const toFiniteNumber = (value: unknown): number | undefined => {\n const parsed = Number(value);\n\n return Number.isFinite(parsed) ? parsed : undefined;\n};\n\nexport const toFiniteNumberOr = (value: unknown, fallback: number): number => {\n return toFiniteNumber(value) ?? fallback;\n};\n\nexport const toPositiveStep = (value: unknown, fallback: number): number => {\n return Math.abs(toFiniteNumberOr(value, fallback)) || fallback;\n};\n"],"mappings":"AAYA,IAAa,EAAkB,GAAuC,CACpE,IAAM,EAAS,OAAO,CAAK,EAE3B,OAAO,OAAO,SAAS,CAAM,EAAI,EAAS,IAAA,EAC5C,EAEa,GAAoB,EAAgB,IACxC,EAAe,CAAK,GAAK,EAGrB,GAAkB,EAAgB,IACtC,KAAK,IAAI,EAAiB,EAAO,CAAQ,CAAC,GAAK"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numbers.d.ts","sourceRoot":"","sources":["../../src/core/numbers.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAIxD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,EAAE,UAAU,MAAM,KAAG,MAEnE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,EAAE,UAAU,MAAM,KAAG,MAEjE,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/headless/numbers.ts
1
+ //#region src/core/numbers.ts
2
2
  var e = (e) => {
3
3
  let t = Number(e);
4
4
  return Number.isFinite(t) ? t : void 0;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numbers.js","names":[],"sources":["../../src/core/numbers.ts"],"sourcesContent":["// ── Number helpers ────────────────────────────────────────────────────────────\n\n/**\n * Coerces `value` via `Number()` and returns it when finite, `undefined` otherwise.\n *\n * Caveat: `null` and `''` both coerce to `0` in JavaScript (`Number(null) === 0`,\n * `Number('') === 0`) and are therefore returned as the finite number `0`, not\n * `undefined` — this function does not treat \"absent\" values specially. Only\n * genuinely non-numeric input (`undefined`, `NaN`, non-numeric strings) yields\n * `undefined`. Callers that mean \"no bound set\" should pass `undefined`\n * explicitly rather than `null` or `''`.\n */\nexport const toFiniteNumber = (value: unknown): number | undefined => {\n const parsed = Number(value);\n\n return Number.isFinite(parsed) ? parsed : undefined;\n};\n\nexport const toFiniteNumberOr = (value: unknown, fallback: number): number => {\n return toFiniteNumber(value) ?? fallback;\n};\n\nexport const toPositiveStep = (value: unknown, fallback: number): number => {\n return Math.abs(toFiniteNumberOr(value, fallback)) || fallback;\n};\n"],"mappings":";AAYA,IAAa,KAAkB,MAAuC;CACpE,IAAM,IAAS,OAAO,CAAK;CAE3B,OAAO,OAAO,SAAS,CAAM,IAAI,IAAS,KAAA;AAC5C,GAEa,KAAoB,GAAgB,MACxC,EAAe,CAAK,KAAK,GAGrB,KAAkB,GAAgB,MACtC,KAAK,IAAI,EAAiB,GAAO,CAAQ,CAAC,KAAK"}
@@ -0,0 +1,2 @@
1
+ const e=require("../errors.cjs"),t=require("./positioner.cjs"),n=require("./nav.cjs"),r=require("./overlay.cjs");let i=require("@vielzeug/ripple");var a=a=>{if(typeof a.getBoundary!=`function`)throw new e.RefineConfigError(`createListboxDropdown: getBoundary is required`);if(typeof a.getPanel!=`function`)throw new e.RefineConfigError(`createListboxDropdown: getPanel is required`);if(typeof a.getReference!=`function`)throw new e.RefineConfigError(`createListboxDropdown: getReference is required`);let o=(0,i.signal)(!1),s=(0,i.computed)(()=>String(o.value)),c=null,l=t.createDropdownPositioner({...a.positioning,getFloating:a.getPanel,getReference:a.getReference}),u=()=>{a.getFocusedOptionElement?.()?.scrollIntoView({block:`nearest`})},d=n.createListControl({disabled:(0,i.computed)(()=>!o.value),getItemLabel:a.getItemLabel,getItems:a.getItems,isItemDisabled:a.isItemDisabled,keys:a.keys,loop:a.loop??!0,onNavigate:(e,t,n)=>{u(),t>=0&&a.onNavigate?.(e,t,n)},orientation:a.orientation,signal:a.signal}),f=(0,i.computed)(()=>{let e=d.focusedIndex.value;return a.getOptionId&&o.value&&e>=0?a.getOptionId(e):null}),p=()=>typeof a.restoreFocus==`function`?a.restoreFocus():a.restoreFocus??!0,m=(e=`programmatic`,t=!0)=>{o.value&&(o.value=!1,d.reset(),c?.(),c=null,t&&p()&&a.getTrigger&&r.restoreFocus(a.getTrigger),a.onClose?.(e))},h=(e=`programmatic`)=>{a.isDisabled?.()||o.value||(o.value=!0,l.update(),c=l.startAutoUpdate?.()??null,a.onOpen?.(e))};return r.createOutsidePointerDismissal({getTargets:()=>[a.getBoundary(),a.getPanel()],isActive:()=>o.value,onDismiss:()=>m(`outsideClick`),signal:a.signal}),a.signal.addEventListener(`abort`,()=>{o.value&&(o.value=!1,d.reset(),c?.(),c=null)},{once:!0}),{ariaActiveDescendant:f,ariaExpanded:s,close:m,focusedIndex:d.focusedIndex,getActiveItem:d.getActiveItem,handleKeydown:e=>o.value?e.key===`Escape`?(e.preventDefault(),m(`escape`),!0):d.handleKeydown(e):!1,isOpen:o,navigate:d.navigate,open:h,scrollFocusedIntoView:u,set:d.set,toggle:(e=`click`,t=`trigger`)=>{o.value?m(t):h(e)},updatePosition:l.update}};exports.createListboxDropdown=a;
2
+ //# sourceMappingURL=option-list.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-list.cjs","names":[],"sources":["../../src/core/option-list.ts"],"sourcesContent":["import { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport { RefineConfigError } from '../errors';\nimport { createListControl, type ListKeyAction, type ListNavigationAction } from './nav';\nimport {\n createOutsidePointerDismissal,\n restoreFocus,\n type DropdownCloseReason,\n type OverlayOpenReason,\n} from './overlay';\nimport { createDropdownPositioner, type DropdownPositionerOptions } from './positioner';\n\nexport type ListboxItem = object;\n\n/** Placement-only options for the listbox dropdown positioner. */\nexport type ListboxDropdownPlacementOptions = Omit<DropdownPositionerOptions, 'getFloating' | 'getReference'>;\n\nexport type ListboxDropdownOptions<T extends ListboxItem> = {\n getBoundary: () => HTMLElement | null;\n getFocusedOptionElement?: () => HTMLElement | null;\n getItemLabel?: (item: T, index: number) => string;\n getItems: () => T[];\n getOptionId?: (index: number) => string;\n getPanel: () => HTMLElement | null;\n getReference: () => HTMLElement | null;\n getTrigger?: () => HTMLElement | null;\n isDisabled?: () => boolean;\n isItemDisabled?: (item: T, index: number) => boolean;\n keys?: Partial<Record<ListNavigationAction, string[]>>;\n loop?: boolean;\n onClose?: (reason: DropdownCloseReason) => void;\n onNavigate?: (action: ListKeyAction, index: number, event?: KeyboardEvent) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n orientation?: 'both' | 'horizontal' | 'vertical';\n positioning?: ListboxDropdownPlacementOptions;\n restoreFocus?: boolean | (() => boolean);\n signal: AbortSignal;\n};\n\nexport type ListboxDropdown<T extends ListboxItem> = {\n readonly ariaActiveDescendant: Readable<string | null>;\n readonly ariaExpanded: Readable<string>;\n close(reason?: DropdownCloseReason): void;\n readonly focusedIndex: Readable<number>;\n getActiveItem(): T | undefined;\n handleKeydown(event: KeyboardEvent): boolean;\n readonly isOpen: Readable<boolean>;\n navigate(action: ListNavigationAction): number;\n open(reason?: OverlayOpenReason): void;\n scrollFocusedIntoView(): void;\n set(index: number): number;\n toggle(openReason?: OverlayOpenReason, closeReason?: DropdownCloseReason): void;\n updatePosition(): void;\n};\n\n/**\n * Internal listbox dropdown behavior for select and combobox. It owns only\n * listbox interactions; menu and other overlay families keep their own logic.\n */\nexport const createListboxDropdown = <T extends ListboxItem>(\n options: ListboxDropdownOptions<T>,\n): ListboxDropdown<T> => {\n if (typeof options.getBoundary !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getBoundary is required');\n }\n\n if (typeof options.getPanel !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getPanel is required');\n }\n\n if (typeof options.getReference !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getReference is required');\n }\n\n const isOpen = signal(false);\n const ariaExpanded = computed(() => String(isOpen.value));\n let stopPositioning: (() => void) | null = null;\n\n const positioner = createDropdownPositioner({\n ...options.positioning,\n getFloating: options.getPanel,\n getReference: options.getReference,\n });\n\n const scrollFocusedIntoView = (): void => {\n options.getFocusedOptionElement?.()?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<T>({\n disabled: computed(() => !isOpen.value),\n getItemLabel: options.getItemLabel,\n getItems: options.getItems,\n isItemDisabled: options.isItemDisabled,\n keys: options.keys,\n loop: options.loop ?? true,\n onNavigate: (action, index, event) => {\n scrollFocusedIntoView();\n\n if (index >= 0) options.onNavigate?.(action, index, event);\n },\n orientation: options.orientation,\n signal: options.signal,\n });\n\n const ariaActiveDescendant = computed<string | null>(() => {\n const index = list.focusedIndex.value;\n\n return options.getOptionId && isOpen.value && index >= 0 ? options.getOptionId(index) : null;\n });\n\n const shouldRestoreFocus = (): boolean => {\n return typeof options.restoreFocus === 'function' ? options.restoreFocus() : (options.restoreFocus ?? true);\n };\n\n const close = (reason: DropdownCloseReason = 'programmatic', shouldRestore = true): void => {\n if (!isOpen.value) return;\n\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n\n if (shouldRestore && shouldRestoreFocus() && options.getTrigger) restoreFocus(options.getTrigger);\n\n options.onClose?.(reason);\n };\n\n const open = (reason: OverlayOpenReason = 'programmatic'): void => {\n if (options.isDisabled?.() || isOpen.value) return;\n\n isOpen.value = true;\n positioner.update();\n stopPositioning = positioner.startAutoUpdate?.() ?? null;\n options.onOpen?.(reason);\n };\n\n const toggle = (openReason: OverlayOpenReason = 'click', closeReason: DropdownCloseReason = 'trigger'): void => {\n if (isOpen.value) close(closeReason);\n else open(openReason);\n };\n\n createOutsidePointerDismissal({\n getTargets: () => [options.getBoundary(), options.getPanel()],\n isActive: () => isOpen.value,\n onDismiss: () => close('outsideClick'),\n signal: options.signal,\n });\n\n options.signal.addEventListener(\n 'abort',\n () => {\n if (!isOpen.value) return;\n\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n },\n { once: true },\n );\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n if (!isOpen.value) return false;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n close('escape');\n\n return true;\n }\n\n return list.handleKeydown(event);\n };\n\n return {\n ariaActiveDescendant,\n ariaExpanded,\n close,\n focusedIndex: list.focusedIndex,\n getActiveItem: list.getActiveItem,\n handleKeydown,\n isOpen,\n navigate: list.navigate,\n open,\n scrollFocusedIntoView,\n set: list.set,\n toggle,\n updatePosition: positioner.update,\n };\n};\n"],"mappings":"mJA2DA,IAAa,EACX,GACuB,CACvB,GAAI,OAAO,EAAQ,aAAgB,WACjC,MAAM,IAAI,EAAA,kBAAkB,gDAAgD,EAG9E,GAAI,OAAO,EAAQ,UAAa,WAC9B,MAAM,IAAI,EAAA,kBAAkB,6CAA6C,EAG3E,GAAI,OAAO,EAAQ,cAAiB,WAClC,MAAM,IAAI,EAAA,kBAAkB,iDAAiD,EAG/E,IAAM,GAAA,EAAS,EAAA,OAAA,CAAO,EAAK,EACrB,GAAA,EAAe,EAAA,SAAA,KAAe,OAAO,EAAO,KAAK,CAAC,EACpD,EAAuC,KAErC,EAAa,EAAA,yBAAyB,CAC1C,GAAG,EAAQ,YACX,YAAa,EAAQ,SACrB,aAAc,EAAQ,YACxB,CAAC,EAEK,MAAoC,CACxC,EAAQ,0BAA0B,CAAC,EAAE,eAAe,CAAE,MAAO,SAAU,CAAC,CAC1E,EAEM,EAAO,EAAA,kBAAqB,CAChC,UAAA,EAAU,EAAA,SAAA,KAAe,CAAC,EAAO,KAAK,EACtC,aAAc,EAAQ,aACtB,SAAU,EAAQ,SAClB,eAAgB,EAAQ,eACxB,KAAM,EAAQ,KACd,KAAM,EAAQ,MAAQ,GACtB,YAAa,EAAQ,EAAO,IAAU,CACpC,EAAsB,EAElB,GAAS,GAAG,EAAQ,aAAa,EAAQ,EAAO,CAAK,CAC3D,EACA,YAAa,EAAQ,YACrB,OAAQ,EAAQ,MAClB,CAAC,EAEK,GAAA,EAAuB,EAAA,SAAA,KAA8B,CACzD,IAAM,EAAQ,EAAK,aAAa,MAEhC,OAAO,EAAQ,aAAe,EAAO,OAAS,GAAS,EAAI,EAAQ,YAAY,CAAK,EAAI,IAC1F,CAAC,EAEK,MACG,OAAO,EAAQ,cAAiB,WAAa,EAAQ,aAAa,EAAK,EAAQ,cAAgB,GAGlG,GAAS,EAA8B,eAAgB,EAAgB,KAAe,CACrF,EAAO,QAEZ,EAAO,MAAQ,GACf,EAAK,MAAM,EACX,IAAkB,EAClB,EAAkB,KAEd,GAAiB,EAAmB,GAAK,EAAQ,YAAY,EAAA,aAAa,EAAQ,UAAU,EAEhG,EAAQ,UAAU,CAAM,EAC1B,EAEM,GAAQ,EAA4B,iBAAyB,CAC7D,EAAQ,aAAa,GAAK,EAAO,QAErC,EAAO,MAAQ,GACf,EAAW,OAAO,EAClB,EAAkB,EAAW,kBAAkB,GAAK,KACpD,EAAQ,SAAS,CAAM,EACzB,EAwCA,OAjCA,EAAA,8BAA8B,CAC5B,eAAkB,CAAC,EAAQ,YAAY,EAAG,EAAQ,SAAS,CAAC,EAC5D,aAAgB,EAAO,MACvB,cAAiB,EAAM,cAAc,EACrC,OAAQ,EAAQ,MAClB,CAAC,EAED,EAAQ,OAAO,iBACb,YACM,CACC,EAAO,QAEZ,EAAO,MAAQ,GACf,EAAK,MAAM,EACX,IAAkB,EAClB,EAAkB,KACpB,EACA,CAAE,KAAM,EAAK,CACf,EAeO,CACL,uBACA,eACA,QACA,aAAc,EAAK,aACnB,cAAe,EAAK,cACpB,cAnBqB,GAChB,EAAO,MAER,EAAM,MAAQ,UAChB,EAAM,eAAe,EACrB,EAAM,QAAQ,EAEP,IAGF,EAAK,cAAc,CAAK,EATL,GAmB1B,SACA,SAAU,EAAK,SACf,OACA,wBACA,IAAK,EAAK,IACV,QAlDc,EAAgC,QAAS,EAAmC,YAAoB,CAC1G,EAAO,MAAO,EAAM,CAAW,EAC9B,EAAK,CAAU,CACtB,EAgDE,eAAgB,EAAW,MAC7B,CACF"}
@@ -0,0 +1,49 @@
1
+ import { type Readable } from '@vielzeug/ripple';
2
+ import { type ListKeyAction, type ListNavigationAction } from './nav';
3
+ import { type DropdownCloseReason, type OverlayOpenReason } from './overlay';
4
+ import { type DropdownPositionerOptions } from './positioner';
5
+ export type ListboxItem = object;
6
+ /** Placement-only options for the listbox dropdown positioner. */
7
+ export type ListboxDropdownPlacementOptions = Omit<DropdownPositionerOptions, 'getFloating' | 'getReference'>;
8
+ export type ListboxDropdownOptions<T extends ListboxItem> = {
9
+ getBoundary: () => HTMLElement | null;
10
+ getFocusedOptionElement?: () => HTMLElement | null;
11
+ getItemLabel?: (item: T, index: number) => string;
12
+ getItems: () => T[];
13
+ getOptionId?: (index: number) => string;
14
+ getPanel: () => HTMLElement | null;
15
+ getReference: () => HTMLElement | null;
16
+ getTrigger?: () => HTMLElement | null;
17
+ isDisabled?: () => boolean;
18
+ isItemDisabled?: (item: T, index: number) => boolean;
19
+ keys?: Partial<Record<ListNavigationAction, string[]>>;
20
+ loop?: boolean;
21
+ onClose?: (reason: DropdownCloseReason) => void;
22
+ onNavigate?: (action: ListKeyAction, index: number, event?: KeyboardEvent) => void;
23
+ onOpen?: (reason: OverlayOpenReason) => void;
24
+ orientation?: 'both' | 'horizontal' | 'vertical';
25
+ positioning?: ListboxDropdownPlacementOptions;
26
+ restoreFocus?: boolean | (() => boolean);
27
+ signal: AbortSignal;
28
+ };
29
+ export type ListboxDropdown<T extends ListboxItem> = {
30
+ readonly ariaActiveDescendant: Readable<string | null>;
31
+ readonly ariaExpanded: Readable<string>;
32
+ close(reason?: DropdownCloseReason): void;
33
+ readonly focusedIndex: Readable<number>;
34
+ getActiveItem(): T | undefined;
35
+ handleKeydown(event: KeyboardEvent): boolean;
36
+ readonly isOpen: Readable<boolean>;
37
+ navigate(action: ListNavigationAction): number;
38
+ open(reason?: OverlayOpenReason): void;
39
+ scrollFocusedIntoView(): void;
40
+ set(index: number): number;
41
+ toggle(openReason?: OverlayOpenReason, closeReason?: DropdownCloseReason): void;
42
+ updatePosition(): void;
43
+ };
44
+ /**
45
+ * Internal listbox dropdown behavior for select and combobox. It owns only
46
+ * listbox interactions; menu and other overlay families keep their own logic.
47
+ */
48
+ export declare const createListboxDropdown: <T extends ListboxItem>(options: ListboxDropdownOptions<T>) => ListboxDropdown<T>;
49
+ //# sourceMappingURL=option-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-list.d.ts","sourceRoot":"","sources":["../../src/core/option-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { RefineConfigError as e } from "../errors.js";
2
+ import { createDropdownPositioner as t } from "./positioner.js";
3
+ import { createListControl as n } from "./nav.js";
4
+ import { createOutsidePointerDismissal as r, restoreFocus as i } from "./overlay.js";
5
+ import { computed as a, signal as o } from "@vielzeug/ripple";
6
+ //#region src/core/option-list.ts
7
+ var s = (s) => {
8
+ if (typeof s.getBoundary != "function") throw new e("createListboxDropdown: getBoundary is required");
9
+ if (typeof s.getPanel != "function") throw new e("createListboxDropdown: getPanel is required");
10
+ if (typeof s.getReference != "function") throw new e("createListboxDropdown: getReference is required");
11
+ let c = o(!1), l = a(() => String(c.value)), u = null, d = t({
12
+ ...s.positioning,
13
+ getFloating: s.getPanel,
14
+ getReference: s.getReference
15
+ }), f = () => {
16
+ s.getFocusedOptionElement?.()?.scrollIntoView({ block: "nearest" });
17
+ }, p = n({
18
+ disabled: a(() => !c.value),
19
+ getItemLabel: s.getItemLabel,
20
+ getItems: s.getItems,
21
+ isItemDisabled: s.isItemDisabled,
22
+ keys: s.keys,
23
+ loop: s.loop ?? !0,
24
+ onNavigate: (e, t, n) => {
25
+ f(), t >= 0 && s.onNavigate?.(e, t, n);
26
+ },
27
+ orientation: s.orientation,
28
+ signal: s.signal
29
+ }), m = a(() => {
30
+ let e = p.focusedIndex.value;
31
+ return s.getOptionId && c.value && e >= 0 ? s.getOptionId(e) : null;
32
+ }), h = () => typeof s.restoreFocus == "function" ? s.restoreFocus() : s.restoreFocus ?? !0, g = (e = "programmatic", t = !0) => {
33
+ c.value && (c.value = !1, p.reset(), u?.(), u = null, t && h() && s.getTrigger && i(s.getTrigger), s.onClose?.(e));
34
+ }, _ = (e = "programmatic") => {
35
+ s.isDisabled?.() || c.value || (c.value = !0, d.update(), u = d.startAutoUpdate?.() ?? null, s.onOpen?.(e));
36
+ };
37
+ return r({
38
+ getTargets: () => [s.getBoundary(), s.getPanel()],
39
+ isActive: () => c.value,
40
+ onDismiss: () => g("outsideClick"),
41
+ signal: s.signal
42
+ }), s.signal.addEventListener("abort", () => {
43
+ c.value && (c.value = !1, p.reset(), u?.(), u = null);
44
+ }, { once: !0 }), {
45
+ ariaActiveDescendant: m,
46
+ ariaExpanded: l,
47
+ close: g,
48
+ focusedIndex: p.focusedIndex,
49
+ getActiveItem: p.getActiveItem,
50
+ handleKeydown: (e) => c.value ? e.key === "Escape" ? (e.preventDefault(), g("escape"), !0) : p.handleKeydown(e) : !1,
51
+ isOpen: c,
52
+ navigate: p.navigate,
53
+ open: _,
54
+ scrollFocusedIntoView: f,
55
+ set: p.set,
56
+ toggle: (e = "click", t = "trigger") => {
57
+ c.value ? g(t) : _(e);
58
+ },
59
+ updatePosition: d.update
60
+ };
61
+ };
62
+ //#endregion
63
+ export { s as createListboxDropdown };
64
+
65
+ //# sourceMappingURL=option-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"option-list.js","names":[],"sources":["../../src/core/option-list.ts"],"sourcesContent":["import { computed, type Readable, signal } from '@vielzeug/ripple';\n\nimport { RefineConfigError } from '../errors';\nimport { createListControl, type ListKeyAction, type ListNavigationAction } from './nav';\nimport {\n createOutsidePointerDismissal,\n restoreFocus,\n type DropdownCloseReason,\n type OverlayOpenReason,\n} from './overlay';\nimport { createDropdownPositioner, type DropdownPositionerOptions } from './positioner';\n\nexport type ListboxItem = object;\n\n/** Placement-only options for the listbox dropdown positioner. */\nexport type ListboxDropdownPlacementOptions = Omit<DropdownPositionerOptions, 'getFloating' | 'getReference'>;\n\nexport type ListboxDropdownOptions<T extends ListboxItem> = {\n getBoundary: () => HTMLElement | null;\n getFocusedOptionElement?: () => HTMLElement | null;\n getItemLabel?: (item: T, index: number) => string;\n getItems: () => T[];\n getOptionId?: (index: number) => string;\n getPanel: () => HTMLElement | null;\n getReference: () => HTMLElement | null;\n getTrigger?: () => HTMLElement | null;\n isDisabled?: () => boolean;\n isItemDisabled?: (item: T, index: number) => boolean;\n keys?: Partial<Record<ListNavigationAction, string[]>>;\n loop?: boolean;\n onClose?: (reason: DropdownCloseReason) => void;\n onNavigate?: (action: ListKeyAction, index: number, event?: KeyboardEvent) => void;\n onOpen?: (reason: OverlayOpenReason) => void;\n orientation?: 'both' | 'horizontal' | 'vertical';\n positioning?: ListboxDropdownPlacementOptions;\n restoreFocus?: boolean | (() => boolean);\n signal: AbortSignal;\n};\n\nexport type ListboxDropdown<T extends ListboxItem> = {\n readonly ariaActiveDescendant: Readable<string | null>;\n readonly ariaExpanded: Readable<string>;\n close(reason?: DropdownCloseReason): void;\n readonly focusedIndex: Readable<number>;\n getActiveItem(): T | undefined;\n handleKeydown(event: KeyboardEvent): boolean;\n readonly isOpen: Readable<boolean>;\n navigate(action: ListNavigationAction): number;\n open(reason?: OverlayOpenReason): void;\n scrollFocusedIntoView(): void;\n set(index: number): number;\n toggle(openReason?: OverlayOpenReason, closeReason?: DropdownCloseReason): void;\n updatePosition(): void;\n};\n\n/**\n * Internal listbox dropdown behavior for select and combobox. It owns only\n * listbox interactions; menu and other overlay families keep their own logic.\n */\nexport const createListboxDropdown = <T extends ListboxItem>(\n options: ListboxDropdownOptions<T>,\n): ListboxDropdown<T> => {\n if (typeof options.getBoundary !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getBoundary is required');\n }\n\n if (typeof options.getPanel !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getPanel is required');\n }\n\n if (typeof options.getReference !== 'function') {\n throw new RefineConfigError('createListboxDropdown: getReference is required');\n }\n\n const isOpen = signal(false);\n const ariaExpanded = computed(() => String(isOpen.value));\n let stopPositioning: (() => void) | null = null;\n\n const positioner = createDropdownPositioner({\n ...options.positioning,\n getFloating: options.getPanel,\n getReference: options.getReference,\n });\n\n const scrollFocusedIntoView = (): void => {\n options.getFocusedOptionElement?.()?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<T>({\n disabled: computed(() => !isOpen.value),\n getItemLabel: options.getItemLabel,\n getItems: options.getItems,\n isItemDisabled: options.isItemDisabled,\n keys: options.keys,\n loop: options.loop ?? true,\n onNavigate: (action, index, event) => {\n scrollFocusedIntoView();\n\n if (index >= 0) options.onNavigate?.(action, index, event);\n },\n orientation: options.orientation,\n signal: options.signal,\n });\n\n const ariaActiveDescendant = computed<string | null>(() => {\n const index = list.focusedIndex.value;\n\n return options.getOptionId && isOpen.value && index >= 0 ? options.getOptionId(index) : null;\n });\n\n const shouldRestoreFocus = (): boolean => {\n return typeof options.restoreFocus === 'function' ? options.restoreFocus() : (options.restoreFocus ?? true);\n };\n\n const close = (reason: DropdownCloseReason = 'programmatic', shouldRestore = true): void => {\n if (!isOpen.value) return;\n\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n\n if (shouldRestore && shouldRestoreFocus() && options.getTrigger) restoreFocus(options.getTrigger);\n\n options.onClose?.(reason);\n };\n\n const open = (reason: OverlayOpenReason = 'programmatic'): void => {\n if (options.isDisabled?.() || isOpen.value) return;\n\n isOpen.value = true;\n positioner.update();\n stopPositioning = positioner.startAutoUpdate?.() ?? null;\n options.onOpen?.(reason);\n };\n\n const toggle = (openReason: OverlayOpenReason = 'click', closeReason: DropdownCloseReason = 'trigger'): void => {\n if (isOpen.value) close(closeReason);\n else open(openReason);\n };\n\n createOutsidePointerDismissal({\n getTargets: () => [options.getBoundary(), options.getPanel()],\n isActive: () => isOpen.value,\n onDismiss: () => close('outsideClick'),\n signal: options.signal,\n });\n\n options.signal.addEventListener(\n 'abort',\n () => {\n if (!isOpen.value) return;\n\n isOpen.value = false;\n list.reset();\n stopPositioning?.();\n stopPositioning = null;\n },\n { once: true },\n );\n\n const handleKeydown = (event: KeyboardEvent): boolean => {\n if (!isOpen.value) return false;\n\n if (event.key === 'Escape') {\n event.preventDefault();\n close('escape');\n\n return true;\n }\n\n return list.handleKeydown(event);\n };\n\n return {\n ariaActiveDescendant,\n ariaExpanded,\n close,\n focusedIndex: list.focusedIndex,\n getActiveItem: list.getActiveItem,\n handleKeydown,\n isOpen,\n navigate: list.navigate,\n open,\n scrollFocusedIntoView,\n set: list.set,\n toggle,\n updatePosition: positioner.update,\n };\n};\n"],"mappings":";;;;;;AA2DA,IAAa,KACX,MACuB;CACvB,IAAI,OAAO,EAAQ,eAAgB,YACjC,MAAM,IAAI,EAAkB,gDAAgD;CAG9E,IAAI,OAAO,EAAQ,YAAa,YAC9B,MAAM,IAAI,EAAkB,6CAA6C;CAG3E,IAAI,OAAO,EAAQ,gBAAiB,YAClC,MAAM,IAAI,EAAkB,iDAAiD;CAG/E,IAAM,IAAS,EAAO,EAAK,GACrB,IAAe,QAAe,OAAO,EAAO,KAAK,CAAC,GACpD,IAAuC,MAErC,IAAa,EAAyB;EAC1C,GAAG,EAAQ;EACX,aAAa,EAAQ;EACrB,cAAc,EAAQ;CACxB,CAAC,GAEK,UAAoC;EACxC,EAAQ,0BAA0B,CAAC,EAAE,eAAe,EAAE,OAAO,UAAU,CAAC;CAC1E,GAEM,IAAO,EAAqB;EAChC,UAAU,QAAe,CAAC,EAAO,KAAK;EACtC,cAAc,EAAQ;EACtB,UAAU,EAAQ;EAClB,gBAAgB,EAAQ;EACxB,MAAM,EAAQ;EACd,MAAM,EAAQ,QAAQ;EACtB,aAAa,GAAQ,GAAO,MAAU;GAGpC,AAFA,EAAsB,GAElB,KAAS,KAAG,EAAQ,aAAa,GAAQ,GAAO,CAAK;EAC3D;EACA,aAAa,EAAQ;EACrB,QAAQ,EAAQ;CAClB,CAAC,GAEK,IAAuB,QAA8B;EACzD,IAAM,IAAQ,EAAK,aAAa;EAEhC,OAAO,EAAQ,eAAe,EAAO,SAAS,KAAS,IAAI,EAAQ,YAAY,CAAK,IAAI;CAC1F,CAAC,GAEK,UACG,OAAO,EAAQ,gBAAiB,aAAa,EAAQ,aAAa,IAAK,EAAQ,gBAAgB,IAGlG,KAAS,IAA8B,gBAAgB,IAAgB,OAAe;EACrF,EAAO,UAEZ,EAAO,QAAQ,IACf,EAAK,MAAM,GACX,IAAkB,GAClB,IAAkB,MAEd,KAAiB,EAAmB,KAAK,EAAQ,cAAY,EAAa,EAAQ,UAAU,GAEhG,EAAQ,UAAU,CAAM;CAC1B,GAEM,KAAQ,IAA4B,mBAAyB;EAC7D,EAAQ,aAAa,KAAK,EAAO,UAErC,EAAO,QAAQ,IACf,EAAW,OAAO,GAClB,IAAkB,EAAW,kBAAkB,KAAK,MACpD,EAAQ,SAAS,CAAM;CACzB;CAwCA,OAjCA,EAA8B;EAC5B,kBAAkB,CAAC,EAAQ,YAAY,GAAG,EAAQ,SAAS,CAAC;EAC5D,gBAAgB,EAAO;EACvB,iBAAiB,EAAM,cAAc;EACrC,QAAQ,EAAQ;CAClB,CAAC,GAED,EAAQ,OAAO,iBACb,eACM;EACC,EAAO,UAEZ,EAAO,QAAQ,IACf,EAAK,MAAM,GACX,IAAkB,GAClB,IAAkB;CACpB,GACA,EAAE,MAAM,GAAK,CACf,GAeO;EACL;EACA;EACA;EACA,cAAc,EAAK;EACnB,eAAe,EAAK;EACpB,gBAnBqB,MAChB,EAAO,QAER,EAAM,QAAQ,YAChB,EAAM,eAAe,GACrB,EAAM,QAAQ,GAEP,MAGF,EAAK,cAAc,CAAK,IATL;EAmB1B;EACA,UAAU,EAAK;EACf;EACA;EACA,KAAK,EAAK;EACV,SAlDc,IAAgC,SAAS,IAAmC,cAAoB;GAC9G,AAAI,EAAO,QAAO,EAAM,CAAW,IAC9B,EAAK,CAAU;EACtB;EAgDE,gBAAgB,EAAW;CAC7B;AACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ore.cjs","names":[],"sources":["../../src/core/ore.ts"],"sourcesContent":["// ── Ore adapter ─────────────────────────────────────────────────────────────\n// Utilities that bridge Ore's component lifecycle with Refine's core\n// primitives' `AbortSignal`-based lifecycle contract.\n\n/**\n * Creates an `AbortSignal` tied to the component's Ore lifecycle.\n *\n * Call once at the top of a `setup()` function and pass the resulting signal\n * as the required `signal` option to any stateful core primitive\n * (`createTextField`, `createCheckable`, `createListboxDropdown`, etc.).\n *\n * When Ore disconnects the component, `onCleanup` fires, aborting the\n * signal and triggering cleanup in every primitive that received it.\n *\n * @example\n * ```ts\n * setup(props, { el }) {\n * const signal = lifecycleSignal(onCleanup);\n * const tf = createTextField({ ..., signal });\n * }\n * ```\n */\nexport const lifecycleSignal = (onCleanup: (fn: () => void) => void): AbortSignal => {\n const controller = new AbortController();\n\n onCleanup(() => controller.abort());\n\n return controller.signal;\n};\n"],"mappings":"AAsBA,IAAa,EAAmB,GAAqD,CACnF,IAAM,EAAa,IAAI,gBAIvB,OAFA,MAAgB,EAAW,MAAM,CAAC,EAE3B,EAAW,MACpB"}
@@ -2,8 +2,8 @@
2
2
  * Creates an `AbortSignal` tied to the component's Ore lifecycle.
3
3
  *
4
4
  * Call once at the top of a `setup()` function and pass the resulting signal
5
- * as the required `signal` option to any stateful headless primitive
6
- * (`createTextField`, `createCheckable`, `createOptionList`, etc.).
5
+ * as the required `signal` option to any stateful core primitive
6
+ * (`createTextField`, `createCheckable`, `createListboxDropdown`, etc.).
7
7
  *
8
8
  * When Ore disconnects the component, `onCleanup` fires, aborting the
9
9
  * signal and triggering cleanup in every primitive that received it.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ore.d.ts","sourceRoot":"","sources":["../../src/core/ore.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe,GAAI,WAAW,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,KAAG,WAMrE,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region src/headless/ore.ts
1
+ //#region src/core/ore.ts
2
2
  var e = (e) => {
3
3
  let t = new AbortController();
4
4
  return e(() => t.abort()), t.signal;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ore.js","names":[],"sources":["../../src/core/ore.ts"],"sourcesContent":["// ── Ore adapter ─────────────────────────────────────────────────────────────\n// Utilities that bridge Ore's component lifecycle with Refine's core\n// primitives' `AbortSignal`-based lifecycle contract.\n\n/**\n * Creates an `AbortSignal` tied to the component's Ore lifecycle.\n *\n * Call once at the top of a `setup()` function and pass the resulting signal\n * as the required `signal` option to any stateful core primitive\n * (`createTextField`, `createCheckable`, `createListboxDropdown`, etc.).\n *\n * When Ore disconnects the component, `onCleanup` fires, aborting the\n * signal and triggering cleanup in every primitive that received it.\n *\n * @example\n * ```ts\n * setup(props, { el }) {\n * const signal = lifecycleSignal(onCleanup);\n * const tf = createTextField({ ..., signal });\n * }\n * ```\n */\nexport const lifecycleSignal = (onCleanup: (fn: () => void) => void): AbortSignal => {\n const controller = new AbortController();\n\n onCleanup(() => controller.abort());\n\n return controller.signal;\n};\n"],"mappings":";AAsBA,IAAa,KAAmB,MAAqD;CACnF,IAAM,IAAa,IAAI,gBAAgB;CAIvC,OAFA,QAAgB,EAAW,MAAM,CAAC,GAE3B,EAAW;AACpB"}
@@ -0,0 +1,2 @@
1
+ var e=e=>{let t=t=>{if(!e.isActive())return;let n=t.composedPath(),r=n[0]instanceof Node?n[0]:t.target instanceof Node?t.target:null;e.getTargets().some(e=>e!=null&&(n.includes(e)||!!(r&&e.contains(r))))||e.onDismiss()},n=()=>{document.removeEventListener(`pointerdown`,t,{capture:!0})};return document.addEventListener(`pointerdown`,t,{capture:!0}),e.signal.addEventListener(`abort`,n,{once:!0}),n},t=e=>{e()?.focus()};exports.createOutsidePointerDismissal=e,exports.restoreFocus=t;
2
+ //# sourceMappingURL=overlay.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.cjs","names":[],"sources":["../../src/core/overlay.ts"],"sourcesContent":["/**\n * Why an overlay was opened.\n * - `'click'` — user clicked the trigger element\n * - `'focus'` — focus entered the trigger (tooltip, popover)\n * - `'hover'` — pointer entered the trigger (tooltip)\n * - `'keyboard'` — keyboard shortcut or Enter/Space on a trigger\n * - `'programmatic'` — opened via the JS API without a user gesture\n * - `'trigger'` — opened via the Invoker Commands API (`command=\"show-modal\"`)\n */\nexport type OverlayOpenReason = 'click' | 'focus' | 'hover' | 'keyboard' | 'programmatic' | 'trigger';\n\n/** Close reasons valid for modal dialogs (includes 'swipe' for drawer). */\nexport type DialogCloseReason = 'escape' | 'outsideClick' | 'programmatic' | 'swipe' | 'trigger';\n/** Close reasons valid for dropdown overlays (no swipe). */\nexport type DropdownCloseReason = Exclude<DialogCloseReason, 'swipe'>;\n\n/** Detail shape for overlay open events emitted by components. */\nexport type OverlayOpenDetail = { reason: OverlayOpenReason };\n/** Detail shape for overlay close events emitted by components. */\nexport type OverlayCloseDetail = { reason: DialogCloseReason };\n/** Detail shape for state changes emitted by overlay components. */\nexport type OverlayOpenChangeDetail = {\n open: boolean;\n reason: DialogCloseReason | OverlayOpenReason;\n};\n\nexport type OutsidePointerDismissalOptions = {\n getTargets: () => Array<Element | null | undefined>;\n isActive: () => boolean;\n onDismiss: () => void;\n signal: AbortSignal;\n};\n\n/**\n * Dismisses an active floating surface when a pointer begins outside all of its\n * supplied boundary elements. Components retain ownership of their open state.\n */\nexport const createOutsidePointerDismissal = (options: OutsidePointerDismissalOptions): (() => void) => {\n const onPointerDown = (event: PointerEvent): void => {\n if (!options.isActive()) return;\n\n const path = event.composedPath();\n const target = path[0] instanceof Node ? path[0] : event.target instanceof Node ? event.target : null;\n const inside = options.getTargets().some((element) => {\n return (\n element !== null &&\n element !== undefined &&\n (path.includes(element) || Boolean(target && element.contains(target)))\n );\n });\n\n if (!inside) options.onDismiss();\n };\n\n const dispose = (): void => {\n document.removeEventListener('pointerdown', onPointerDown, { capture: true });\n };\n\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n options.signal.addEventListener('abort', dispose, { once: true });\n\n return dispose;\n};\n\n/** Restores focus to a trigger when the owning overlay chooses to do so. */\nexport const restoreFocus = (getTrigger: () => HTMLElement | null | undefined): void => {\n getTrigger()?.focus();\n};\n"],"mappings":"AAqCA,IAAa,EAAiC,GAA0D,CACtG,IAAM,EAAiB,GAA8B,CACnD,GAAI,CAAC,EAAQ,SAAS,EAAG,OAEzB,IAAM,EAAO,EAAM,aAAa,EAC1B,EAAS,EAAK,aAAc,KAAO,EAAK,GAAK,EAAM,kBAAkB,KAAO,EAAM,OAAS,KAClF,EAAQ,WAAW,CAAC,CAAC,KAAM,GAEtC,GAAY,OAEX,EAAK,SAAS,CAAO,GAAK,GAAQ,GAAU,EAAQ,SAAS,CAAM,GAInE,GAAQ,EAAQ,UAAU,CACjC,EAEM,MAAsB,CAC1B,SAAS,oBAAoB,cAAe,EAAe,CAAE,QAAS,EAAK,CAAC,CAC9E,EAKA,OAHA,SAAS,iBAAiB,cAAe,EAAe,CAAE,QAAS,EAAK,CAAC,EACzE,EAAQ,OAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,EAAK,CAAC,EAEzD,CACT,EAGa,EAAgB,GAA2D,CACtF,EAAW,CAAC,EAAE,MAAM,CACtB"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Why an overlay was opened.
3
+ * - `'click'` — user clicked the trigger element
4
+ * - `'focus'` — focus entered the trigger (tooltip, popover)
5
+ * - `'hover'` — pointer entered the trigger (tooltip)
6
+ * - `'keyboard'` — keyboard shortcut or Enter/Space on a trigger
7
+ * - `'programmatic'` — opened via the JS API without a user gesture
8
+ * - `'trigger'` — opened via the Invoker Commands API (`command="show-modal"`)
9
+ */
10
+ export type OverlayOpenReason = 'click' | 'focus' | 'hover' | 'keyboard' | 'programmatic' | 'trigger';
11
+ /** Close reasons valid for modal dialogs (includes 'swipe' for drawer). */
12
+ export type DialogCloseReason = 'escape' | 'outsideClick' | 'programmatic' | 'swipe' | 'trigger';
13
+ /** Close reasons valid for dropdown overlays (no swipe). */
14
+ export type DropdownCloseReason = Exclude<DialogCloseReason, 'swipe'>;
15
+ /** Detail shape for overlay open events emitted by components. */
16
+ export type OverlayOpenDetail = {
17
+ reason: OverlayOpenReason;
18
+ };
19
+ /** Detail shape for overlay close events emitted by components. */
20
+ export type OverlayCloseDetail = {
21
+ reason: DialogCloseReason;
22
+ };
23
+ /** Detail shape for state changes emitted by overlay components. */
24
+ export type OverlayOpenChangeDetail = {
25
+ open: boolean;
26
+ reason: DialogCloseReason | OverlayOpenReason;
27
+ };
28
+ export type OutsidePointerDismissalOptions = {
29
+ getTargets: () => Array<Element | null | undefined>;
30
+ isActive: () => boolean;
31
+ onDismiss: () => void;
32
+ signal: AbortSignal;
33
+ };
34
+ /**
35
+ * Dismisses an active floating surface when a pointer begins outside all of its
36
+ * supplied boundary elements. Components retain ownership of their open state.
37
+ */
38
+ export declare const createOutsidePointerDismissal: (options: OutsidePointerDismissalOptions) => (() => void);
39
+ /** Restores focus to a trigger when the owning overlay chooses to do so. */
40
+ export declare const restoreFocus: (getTrigger: () => HTMLElement | null | undefined) => void;
41
+ //# sourceMappingURL=overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/core/overlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,CAAC;AAEtG,2EAA2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,GAAG,OAAO,GAAG,SAAS,CAAC;AACjG,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAEtE,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GAAG;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAC9D,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAC/D,oEAAoE;AACpE,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,UAAU,EAAE,MAAM,KAAK,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACpD,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,6BAA6B,GAAI,SAAS,8BAA8B,KAAG,CAAC,MAAM,IAAI,CAyBlG,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,YAAY,GAAI,YAAY,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,KAAG,IAE/E,CAAC"}
@@ -0,0 +1,17 @@
1
+ //#region src/core/overlay.ts
2
+ var e = (e) => {
3
+ let t = (t) => {
4
+ if (!e.isActive()) return;
5
+ let n = t.composedPath(), r = n[0] instanceof Node ? n[0] : t.target instanceof Node ? t.target : null;
6
+ e.getTargets().some((e) => e != null && (n.includes(e) || !!(r && e.contains(r)))) || e.onDismiss();
7
+ }, n = () => {
8
+ document.removeEventListener("pointerdown", t, { capture: !0 });
9
+ };
10
+ return document.addEventListener("pointerdown", t, { capture: !0 }), e.signal.addEventListener("abort", n, { once: !0 }), n;
11
+ }, t = (e) => {
12
+ e()?.focus();
13
+ };
14
+ //#endregion
15
+ export { e as createOutsidePointerDismissal, t as restoreFocus };
16
+
17
+ //# sourceMappingURL=overlay.js.map