@vielzeug/refine 2.1.0 → 2.1.2

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 (487) hide show
  1. package/dist/accordion-item.cjs +1 -1
  2. package/dist/accordion-item.cjs.map +1 -1
  3. package/dist/accordion-item.js +1 -1
  4. package/dist/accordion-item.js.map +1 -1
  5. package/dist/accordion.cjs +1 -1
  6. package/dist/accordion.cjs.map +1 -1
  7. package/dist/accordion.js +1 -1
  8. package/dist/accordion.js.map +1 -1
  9. package/dist/alert.cjs.map +1 -1
  10. package/dist/alert.js.map +1 -1
  11. package/dist/async.cjs.map +1 -1
  12. package/dist/async.js.map +1 -1
  13. package/dist/avatar-group.cjs.map +1 -1
  14. package/dist/avatar-group.js.map +1 -1
  15. package/dist/avatar.cjs +6 -6
  16. package/dist/avatar.cjs.map +1 -1
  17. package/dist/avatar.js +1 -2
  18. package/dist/avatar.js.map +1 -1
  19. package/dist/badge.cjs.map +1 -1
  20. package/dist/badge.js.map +1 -1
  21. package/dist/box.cjs.map +1 -1
  22. package/dist/box.js.map +1 -1
  23. package/dist/breadcrumb.cjs +3 -3
  24. package/dist/breadcrumb.cjs.map +1 -1
  25. package/dist/breadcrumb.js +4 -4
  26. package/dist/breadcrumb.js.map +1 -1
  27. package/dist/button-group.cjs +1 -1
  28. package/dist/button-group.cjs.map +1 -1
  29. package/dist/button-group.js +0 -1
  30. package/dist/button-group.js.map +1 -1
  31. package/dist/button.cjs.map +1 -1
  32. package/dist/button.js.map +1 -1
  33. package/dist/calendar.cjs.map +1 -1
  34. package/dist/calendar.js.map +1 -1
  35. package/dist/card.cjs +7 -7
  36. package/dist/card.cjs.map +1 -1
  37. package/dist/card.js +27 -27
  38. package/dist/card.js.map +1 -1
  39. package/dist/carousel.cjs +20 -20
  40. package/dist/carousel.cjs.map +1 -1
  41. package/dist/carousel.js +7 -8
  42. package/dist/carousel.js.map +1 -1
  43. package/dist/chat-message.cjs +10 -10
  44. package/dist/chat-message.cjs.map +1 -1
  45. package/dist/chat-message.js +1 -2
  46. package/dist/chat-message.js.map +1 -1
  47. package/dist/checkbox-group.cjs +7 -7
  48. package/dist/checkbox-group.cjs.map +1 -1
  49. package/dist/checkbox-group.js +26 -26
  50. package/dist/checkbox-group.js.map +1 -1
  51. package/dist/checkbox.cjs +2 -2
  52. package/dist/checkbox.cjs.map +1 -1
  53. package/dist/checkbox.js +33 -33
  54. package/dist/checkbox.js.map +1 -1
  55. package/dist/chip.cjs +16 -16
  56. package/dist/chip.cjs.map +1 -1
  57. package/dist/chip.js +1 -2
  58. package/dist/chip.js.map +1 -1
  59. package/dist/combobox.cjs +28 -28
  60. package/dist/combobox.cjs.map +1 -1
  61. package/dist/combobox.js +211 -211
  62. package/dist/combobox.js.map +1 -1
  63. package/dist/command-palette.cjs +21 -21
  64. package/dist/command-palette.cjs.map +1 -1
  65. package/dist/command-palette.js +27 -28
  66. package/dist/command-palette.js.map +1 -1
  67. package/dist/content/avatar/avatar.css.cjs +1 -1
  68. package/dist/content/avatar/avatar.css.js +1 -1
  69. package/dist/content/avatar/avatar.d.ts.map +1 -1
  70. package/dist/content/breadcrumb/breadcrumb.d.ts.map +1 -1
  71. package/dist/content/card/card.css.cjs +1 -1
  72. package/dist/content/card/card.css.cjs.map +1 -1
  73. package/dist/content/card/card.css.js +1 -1
  74. package/dist/content/card/card.css.js.map +1 -1
  75. package/dist/content/card/card.d.ts.map +1 -1
  76. package/dist/content/carousel/carousel-slide.cjs.map +1 -1
  77. package/dist/content/carousel/carousel-slide.js.map +1 -1
  78. package/dist/content/carousel/carousel.css.cjs +1 -1
  79. package/dist/content/carousel/carousel.css.cjs.map +1 -1
  80. package/dist/content/carousel/carousel.css.js +1 -1
  81. package/dist/content/carousel/carousel.css.js.map +1 -1
  82. package/dist/content/carousel/carousel.d.ts.map +1 -1
  83. package/dist/content/carousel/index.d.ts +1 -1
  84. package/dist/content/carousel/index.d.ts.map +1 -1
  85. package/dist/content/chat-message/chat-message.css.cjs +1 -1
  86. package/dist/content/chat-message/chat-message.css.js +1 -1
  87. package/dist/content/chat-message/chat-message.d.ts.map +1 -1
  88. package/dist/content/code-window/code-window.css.cjs +1 -1
  89. package/dist/content/code-window/code-window.css.js +1 -1
  90. package/dist/content/copy-command/copy-command.css.cjs +1 -1
  91. package/dist/content/copy-command/copy-command.css.js +1 -1
  92. package/dist/content/copy-command/copy-command.d.ts.map +1 -1
  93. package/dist/content/index.d.ts +22 -22
  94. package/dist/content/index.d.ts.map +1 -1
  95. package/dist/content/list/_list-item-reveal.cjs.map +1 -1
  96. package/dist/content/list/_list-item-reveal.d.ts +1 -1
  97. package/dist/content/list/_list-item-reveal.d.ts.map +1 -1
  98. package/dist/content/list/_list-item-reveal.js.map +1 -1
  99. package/dist/content/list/list-item.css.cjs +1 -1
  100. package/dist/content/list/list-item.css.cjs.map +1 -1
  101. package/dist/content/list/list-item.css.js +1 -1
  102. package/dist/content/list/list-item.css.js.map +1 -1
  103. package/dist/content/list/list.d.ts.map +1 -1
  104. package/dist/content/marquee/marquee.css.cjs +1 -1
  105. package/dist/content/marquee/marquee.css.js +1 -1
  106. package/dist/content/pagination/pagination.css.cjs +1 -1
  107. package/dist/content/pagination/pagination.css.js +1 -1
  108. package/dist/content/pagination/pagination.d.ts.map +1 -1
  109. package/dist/content/separator/separator.css.cjs +1 -1
  110. package/dist/content/separator/separator.css.js +1 -1
  111. package/dist/content/separator/separator.d.ts.map +1 -1
  112. package/dist/content/stepper/step.css.cjs.map +1 -1
  113. package/dist/content/stepper/step.css.js.map +1 -1
  114. package/dist/content/stepper/stepper.d.ts.map +1 -1
  115. package/dist/content/table/table.css.cjs +1 -1
  116. package/dist/content/table/table.css.js +1 -1
  117. package/dist/content/text/text.css.cjs +1 -1
  118. package/dist/content/text/text.css.js +1 -1
  119. package/dist/copy-command.cjs.map +1 -1
  120. package/dist/copy-command.js.map +1 -1
  121. package/dist/core/checkable.cjs +1 -1
  122. package/dist/core/checkable.cjs.map +1 -1
  123. package/dist/core/checkable.d.ts.map +1 -1
  124. package/dist/core/checkable.js +4 -4
  125. package/dist/core/checkable.js.map +1 -1
  126. package/dist/core/choice-field.cjs +1 -1
  127. package/dist/core/choice-field.cjs.map +1 -1
  128. package/dist/core/choice-field.d.ts.map +1 -1
  129. package/dist/core/choice-field.js +1 -2
  130. package/dist/core/choice-field.js.map +1 -1
  131. package/dist/core/date-picker.cjs +1 -1
  132. package/dist/core/date-picker.cjs.map +1 -1
  133. package/dist/core/date-picker.d.ts.map +1 -1
  134. package/dist/core/date-picker.js +3 -3
  135. package/dist/core/date-picker.js.map +1 -1
  136. package/dist/core/index.d.ts +17 -17
  137. package/dist/core/index.d.ts.map +1 -1
  138. package/dist/core/option-list.cjs +1 -1
  139. package/dist/core/option-list.cjs.map +1 -1
  140. package/dist/core/option-list.d.ts.map +1 -1
  141. package/dist/core/option-list.js +4 -4
  142. package/dist/core/option-list.js.map +1 -1
  143. package/dist/core/ref-callback.cjs +1 -1
  144. package/dist/core/ref-callback.cjs.map +1 -1
  145. package/dist/core/ref-callback.d.ts.map +1 -1
  146. package/dist/core/ref-callback.js +1 -1
  147. package/dist/core/ref-callback.js.map +1 -1
  148. package/dist/core/signals.cjs +1 -1
  149. package/dist/core/signals.cjs.map +1 -1
  150. package/dist/core/signals.d.ts.map +1 -1
  151. package/dist/core/signals.js +1 -2
  152. package/dist/core/signals.js.map +1 -1
  153. package/dist/core/slider.cjs.map +1 -1
  154. package/dist/core/slider.d.ts.map +1 -1
  155. package/dist/core/slider.js.map +1 -1
  156. package/dist/core/spinner.cjs.map +1 -1
  157. package/dist/core/spinner.d.ts.map +1 -1
  158. package/dist/core/spinner.js.map +1 -1
  159. package/dist/core/text-field.cjs +1 -1
  160. package/dist/core/text-field.cjs.map +1 -1
  161. package/dist/core/text-field.js +1 -1
  162. package/dist/core/text-field.js.map +1 -1
  163. package/dist/custom-elements.json +6036 -6036
  164. package/dist/datagrid.cjs +114 -114
  165. package/dist/datagrid.cjs.map +1 -1
  166. package/dist/datagrid.js +42 -43
  167. package/dist/datagrid.js.map +1 -1
  168. package/dist/date-picker.cjs.map +1 -1
  169. package/dist/date-picker.js.map +1 -1
  170. package/dist/dialog.cjs.map +1 -1
  171. package/dist/dialog.js.map +1 -1
  172. package/dist/disclosure/accordion/accordion.d.ts.map +1 -1
  173. package/dist/disclosure/accordion-item/accordion-item.css.cjs +1 -1
  174. package/dist/disclosure/accordion-item/accordion-item.css.cjs.map +1 -1
  175. package/dist/disclosure/accordion-item/accordion-item.css.js +1 -1
  176. package/dist/disclosure/accordion-item/accordion-item.css.js.map +1 -1
  177. package/dist/disclosure/index.d.ts +6 -6
  178. package/dist/disclosure/index.d.ts.map +1 -1
  179. package/dist/disclosure/tab-item/tab-item.css.cjs.map +1 -1
  180. package/dist/disclosure/tab-item/tab-item.css.js.map +1 -1
  181. package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
  182. package/dist/disclosure/tabs/tabs.css.cjs +1 -1
  183. package/dist/disclosure/tabs/tabs.css.cjs.map +1 -1
  184. package/dist/disclosure/tabs/tabs.css.js +1 -1
  185. package/dist/disclosure/tabs/tabs.css.js.map +1 -1
  186. package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
  187. package/dist/drawer.cjs +5 -5
  188. package/dist/drawer.cjs.map +1 -1
  189. package/dist/drawer.js +26 -26
  190. package/dist/drawer.js.map +1 -1
  191. package/dist/feedback/alert/alert.css.cjs +1 -1
  192. package/dist/feedback/alert/alert.css.js +1 -1
  193. package/dist/feedback/async/async.d.ts +1 -1
  194. package/dist/feedback/async/async.d.ts.map +1 -1
  195. package/dist/feedback/badge/badge.css.cjs +1 -1
  196. package/dist/feedback/badge/badge.css.js +1 -1
  197. package/dist/feedback/badge/badge.d.ts.map +1 -1
  198. package/dist/feedback/chip/chip.css.cjs.map +1 -1
  199. package/dist/feedback/chip/chip.css.js.map +1 -1
  200. package/dist/feedback/chip/chip.d.ts.map +1 -1
  201. package/dist/feedback/index.d.ts +12 -12
  202. package/dist/feedback/index.d.ts.map +1 -1
  203. package/dist/feedback/progress/progress.d.ts.map +1 -1
  204. package/dist/feedback/skeleton/skeleton.d.ts.map +1 -1
  205. package/dist/feedback/toast/index.d.ts +1 -1
  206. package/dist/feedback/toast/index.d.ts.map +1 -1
  207. package/dist/feedback/toast/toast.css.cjs +1 -1
  208. package/dist/feedback/toast/toast.css.cjs.map +1 -1
  209. package/dist/feedback/toast/toast.css.js +1 -1
  210. package/dist/feedback/toast/toast.css.js.map +1 -1
  211. package/dist/feedback/toast/toast.d.ts +1 -1
  212. package/dist/feedback/toast/toast.d.ts.map +1 -1
  213. package/dist/feedback/typing-indicator/typing-indicator.d.ts.map +1 -1
  214. package/dist/file-input.cjs +67 -67
  215. package/dist/file-input.cjs.map +1 -1
  216. package/dist/file-input.js +129 -130
  217. package/dist/file-input.js.map +1 -1
  218. package/dist/grid.cjs.map +1 -1
  219. package/dist/grid.js.map +1 -1
  220. package/dist/icon.cjs.map +1 -1
  221. package/dist/icon.js.map +1 -1
  222. package/dist/input.cjs +21 -21
  223. package/dist/input.cjs.map +1 -1
  224. package/dist/input.js +58 -58
  225. package/dist/input.js.map +1 -1
  226. package/dist/inputs/button/button.css.cjs +1 -1
  227. package/dist/inputs/button/button.css.js +1 -1
  228. package/dist/inputs/button/button.d.ts.map +1 -1
  229. package/dist/inputs/button-group/button-group.css.cjs.map +1 -1
  230. package/dist/inputs/button-group/button-group.css.js.map +1 -1
  231. package/dist/inputs/button-group/button-group.d.ts +1 -1
  232. package/dist/inputs/button-group/button-group.d.ts.map +1 -1
  233. package/dist/inputs/calendar/calendar.css.cjs +1 -1
  234. package/dist/inputs/calendar/calendar.css.cjs.map +1 -1
  235. package/dist/inputs/calendar/calendar.css.js +1 -1
  236. package/dist/inputs/calendar/calendar.css.js.map +1 -1
  237. package/dist/inputs/calendar/calendar.d.ts.map +1 -1
  238. package/dist/inputs/checkbox/checkbox.css.cjs +1 -1
  239. package/dist/inputs/checkbox/checkbox.css.js +1 -1
  240. package/dist/inputs/checkbox/checkbox.d.ts.map +1 -1
  241. package/dist/inputs/checkbox-group/checkbox-group.d.ts +1 -1
  242. package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -1
  243. package/dist/inputs/combobox/combobox.css.cjs +1 -1
  244. package/dist/inputs/combobox/combobox.css.js +1 -1
  245. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  246. package/dist/inputs/datagrid/datagrid-column.cjs.map +1 -1
  247. package/dist/inputs/datagrid/datagrid-column.d.ts.map +1 -1
  248. package/dist/inputs/datagrid/datagrid-column.js.map +1 -1
  249. package/dist/inputs/datagrid/datagrid-model.cjs +1 -1
  250. package/dist/inputs/datagrid/datagrid-model.cjs.map +1 -1
  251. package/dist/inputs/datagrid/datagrid-model.d.ts.map +1 -1
  252. package/dist/inputs/datagrid/datagrid-model.js +1 -2
  253. package/dist/inputs/datagrid/datagrid-model.js.map +1 -1
  254. package/dist/inputs/datagrid/datagrid.css.cjs +1 -1
  255. package/dist/inputs/datagrid/datagrid.css.cjs.map +1 -1
  256. package/dist/inputs/datagrid/datagrid.css.js +1 -1
  257. package/dist/inputs/datagrid/datagrid.css.js.map +1 -1
  258. package/dist/inputs/datagrid/datagrid.d.ts +1 -1
  259. package/dist/inputs/datagrid/datagrid.d.ts.map +1 -1
  260. package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
  261. package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
  262. package/dist/inputs/date-picker/date-picker.css.js +1 -1
  263. package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
  264. package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
  265. package/dist/inputs/file-input/file-input-upload.cjs +1 -1
  266. package/dist/inputs/file-input/file-input-upload.cjs.map +1 -1
  267. package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -1
  268. package/dist/inputs/file-input/file-input-upload.js +2 -3
  269. package/dist/inputs/file-input/file-input-upload.js.map +1 -1
  270. package/dist/inputs/file-input/file-input.css.cjs +1 -1
  271. package/dist/inputs/file-input/file-input.css.js +1 -1
  272. package/dist/inputs/file-input/file-input.d.ts.map +1 -1
  273. package/dist/inputs/index.d.ts +28 -28
  274. package/dist/inputs/index.d.ts.map +1 -1
  275. package/dist/inputs/input/input.css.cjs +1 -1
  276. package/dist/inputs/input/input.css.js +1 -1
  277. package/dist/inputs/input/input.d.ts.map +1 -1
  278. package/dist/inputs/message-composer/message-composer.css.cjs +1 -1
  279. package/dist/inputs/message-composer/message-composer.css.js +1 -1
  280. package/dist/inputs/message-composer/message-composer.d.ts +1 -1
  281. package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
  282. package/dist/inputs/number-input/number-input.d.ts.map +1 -1
  283. package/dist/inputs/otp-input/otp-input.d.ts.map +1 -1
  284. package/dist/inputs/radio/radio.css.cjs +1 -1
  285. package/dist/inputs/radio/radio.css.js +1 -1
  286. package/dist/inputs/radio/radio.d.ts.map +1 -1
  287. package/dist/inputs/radio-group/radio-group.d.ts +2 -2
  288. package/dist/inputs/radio-group/radio-group.d.ts.map +1 -1
  289. package/dist/inputs/rating/rating.d.ts.map +1 -1
  290. package/dist/inputs/select/select.css.cjs +1 -1
  291. package/dist/inputs/select/select.css.js +1 -1
  292. package/dist/inputs/select/select.d.ts.map +1 -1
  293. package/dist/inputs/shared/field-binding.cjs.map +1 -1
  294. package/dist/inputs/shared/field-binding.d.ts.map +1 -1
  295. package/dist/inputs/shared/field-binding.js.map +1 -1
  296. package/dist/inputs/shared/templates.cjs.map +1 -1
  297. package/dist/inputs/shared/templates.d.ts.map +1 -1
  298. package/dist/inputs/shared/templates.js.map +1 -1
  299. package/dist/inputs/slider/slider.d.ts.map +1 -1
  300. package/dist/inputs/switch/switch.css.cjs +1 -1
  301. package/dist/inputs/switch/switch.css.js +1 -1
  302. package/dist/inputs/switch/switch.d.ts.map +1 -1
  303. package/dist/inputs/textarea/textarea.css.cjs +1 -1
  304. package/dist/inputs/textarea/textarea.css.js +1 -1
  305. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  306. package/dist/inputs/time-picker/time-picker.css.cjs +1 -1
  307. package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -1
  308. package/dist/inputs/time-picker/time-picker.css.js +1 -1
  309. package/dist/inputs/time-picker/time-picker.css.js.map +1 -1
  310. package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
  311. package/dist/layout/box/box.d.ts.map +1 -1
  312. package/dist/layout/grid/grid.d.ts.map +1 -1
  313. package/dist/layout/index.d.ts +6 -6
  314. package/dist/layout/index.d.ts.map +1 -1
  315. package/dist/layout/navbar/navbar.css.cjs +1 -1
  316. package/dist/layout/navbar/navbar.css.js +1 -1
  317. package/dist/layout/navbar/navbar.d.ts.map +1 -1
  318. package/dist/layout/sidebar/sidebar-group.css.cjs +1 -1
  319. package/dist/layout/sidebar/sidebar-group.css.cjs.map +1 -1
  320. package/dist/layout/sidebar/sidebar-group.css.js +1 -1
  321. package/dist/layout/sidebar/sidebar-group.css.js.map +1 -1
  322. package/dist/layout/sidebar/sidebar.css.cjs +1 -1
  323. package/dist/layout/sidebar/sidebar.css.cjs.map +1 -1
  324. package/dist/layout/sidebar/sidebar.css.js +1 -1
  325. package/dist/layout/sidebar/sidebar.css.js.map +1 -1
  326. package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
  327. package/dist/list-item.cjs.map +1 -1
  328. package/dist/list-item.js.map +1 -1
  329. package/dist/list.cjs +2 -2
  330. package/dist/list.cjs.map +1 -1
  331. package/dist/list.js +15 -16
  332. package/dist/list.js.map +1 -1
  333. package/dist/marquee.cjs +1 -1
  334. package/dist/marquee.cjs.map +1 -1
  335. package/dist/marquee.js +1 -1
  336. package/dist/marquee.js.map +1 -1
  337. package/dist/menu.cjs +5 -5
  338. package/dist/menu.cjs.map +1 -1
  339. package/dist/menu.js +38 -39
  340. package/dist/menu.js.map +1 -1
  341. package/dist/message-composer.cjs +16 -16
  342. package/dist/message-composer.cjs.map +1 -1
  343. package/dist/message-composer.js +61 -61
  344. package/dist/message-composer.js.map +1 -1
  345. package/dist/navbar.cjs +9 -9
  346. package/dist/navbar.cjs.map +1 -1
  347. package/dist/navbar.js +1 -2
  348. package/dist/navbar.js.map +1 -1
  349. package/dist/navigation-menu.cjs +5 -5
  350. package/dist/navigation-menu.cjs.map +1 -1
  351. package/dist/navigation-menu.js +33 -34
  352. package/dist/navigation-menu.js.map +1 -1
  353. package/dist/number-input.cjs +24 -24
  354. package/dist/number-input.cjs.map +1 -1
  355. package/dist/number-input.js +41 -42
  356. package/dist/number-input.js.map +1 -1
  357. package/dist/otp-input.cjs +13 -13
  358. package/dist/otp-input.cjs.map +1 -1
  359. package/dist/otp-input.js +32 -33
  360. package/dist/otp-input.js.map +1 -1
  361. package/dist/overlay/command-palette/command-palette-items.cjs.map +1 -1
  362. package/dist/overlay/command-palette/command-palette-items.d.ts.map +1 -1
  363. package/dist/overlay/command-palette/command-palette-items.js.map +1 -1
  364. package/dist/overlay/command-palette/command-palette.css.cjs +1 -1
  365. package/dist/overlay/command-palette/command-palette.css.cjs.map +1 -1
  366. package/dist/overlay/command-palette/command-palette.css.js +1 -1
  367. package/dist/overlay/command-palette/command-palette.css.js.map +1 -1
  368. package/dist/overlay/command-palette/command-palette.d.ts.map +1 -1
  369. package/dist/overlay/dialog/dialog.css.cjs +1 -1
  370. package/dist/overlay/dialog/dialog.css.js +1 -1
  371. package/dist/overlay/dialog/dialog.d.ts.map +1 -1
  372. package/dist/overlay/drawer/drawer.css.cjs +1 -1
  373. package/dist/overlay/drawer/drawer.css.js +1 -1
  374. package/dist/overlay/drawer/drawer.d.ts +2 -2
  375. package/dist/overlay/drawer/drawer.d.ts.map +1 -1
  376. package/dist/overlay/index.d.ts +6 -6
  377. package/dist/overlay/index.d.ts.map +1 -1
  378. package/dist/overlay/menu/menu.css.cjs +1 -1
  379. package/dist/overlay/menu/menu.css.js +1 -1
  380. package/dist/overlay/menu/menu.d.ts +2 -2
  381. package/dist/overlay/menu/menu.d.ts.map +1 -1
  382. package/dist/overlay/navigation-menu/navigation-menu.d.ts.map +1 -1
  383. package/dist/overlay/popover/popover.d.ts +1 -1
  384. package/dist/overlay/popover/popover.d.ts.map +1 -1
  385. package/dist/overlay/shared/use-dialog.cjs +1 -1
  386. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  387. package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
  388. package/dist/overlay/shared/use-dialog.js +4 -5
  389. package/dist/overlay/shared/use-dialog.js.map +1 -1
  390. package/dist/overlay/shared/use-floating-trigger.cjs +1 -1
  391. package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
  392. package/dist/overlay/shared/use-floating-trigger.d.ts.map +1 -1
  393. package/dist/overlay/shared/use-floating-trigger.js +1 -2
  394. package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
  395. package/dist/overlay/tooltip/tooltip.d.ts +1 -1
  396. package/dist/overlay/tooltip/tooltip.d.ts.map +1 -1
  397. package/dist/pagination.cjs.map +1 -1
  398. package/dist/pagination.js.map +1 -1
  399. package/dist/popover.cjs +1 -1
  400. package/dist/popover.cjs.map +1 -1
  401. package/dist/popover.js +0 -1
  402. package/dist/popover.js.map +1 -1
  403. package/dist/progress.cjs.map +1 -1
  404. package/dist/progress.js.map +1 -1
  405. package/dist/radio-group.cjs +5 -5
  406. package/dist/radio-group.cjs.map +1 -1
  407. package/dist/radio-group.js +26 -27
  408. package/dist/radio-group.js.map +1 -1
  409. package/dist/radio.cjs +2 -2
  410. package/dist/radio.cjs.map +1 -1
  411. package/dist/radio.js +41 -41
  412. package/dist/radio.js.map +1 -1
  413. package/dist/rating.cjs +4 -4
  414. package/dist/rating.cjs.map +1 -1
  415. package/dist/rating.js +36 -36
  416. package/dist/rating.js.map +1 -1
  417. package/dist/refine.cjs +686 -686
  418. package/dist/refine.cjs.map +1 -1
  419. package/dist/refine.iife.js +686 -686
  420. package/dist/refine.iife.js.map +1 -1
  421. package/dist/refine.js +737 -737
  422. package/dist/refine.js.map +1 -1
  423. package/dist/select.cjs +42 -42
  424. package/dist/select.cjs.map +1 -1
  425. package/dist/select.js +146 -147
  426. package/dist/select.js.map +1 -1
  427. package/dist/separator.cjs.map +1 -1
  428. package/dist/separator.js.map +1 -1
  429. package/dist/sidebar.cjs +17 -17
  430. package/dist/sidebar.cjs.map +1 -1
  431. package/dist/sidebar.js +7 -8
  432. package/dist/sidebar.js.map +1 -1
  433. package/dist/skeleton.cjs +3 -3
  434. package/dist/skeleton.cjs.map +1 -1
  435. package/dist/skeleton.js +1 -2
  436. package/dist/skeleton.js.map +1 -1
  437. package/dist/slider.cjs +12 -12
  438. package/dist/slider.cjs.map +1 -1
  439. package/dist/slider.js +54 -55
  440. package/dist/slider.js.map +1 -1
  441. package/dist/step.cjs.map +1 -1
  442. package/dist/step.js.map +1 -1
  443. package/dist/stepper.cjs +2 -2
  444. package/dist/stepper.cjs.map +1 -1
  445. package/dist/stepper.js +8 -7
  446. package/dist/stepper.js.map +1 -1
  447. package/dist/styles/index.d.ts +2 -2
  448. package/dist/styles/index.d.ts.map +1 -1
  449. package/dist/styles/preflight.css +1 -1
  450. package/dist/styles/theme.css +15 -30
  451. package/dist/switch.cjs +3 -3
  452. package/dist/switch.cjs.map +1 -1
  453. package/dist/switch.js +28 -28
  454. package/dist/switch.js.map +1 -1
  455. package/dist/tab-item.cjs +2 -2
  456. package/dist/tab-item.cjs.map +1 -1
  457. package/dist/tab-item.js +21 -21
  458. package/dist/tab-item.js.map +1 -1
  459. package/dist/tab-panel.cjs +2 -2
  460. package/dist/tab-panel.cjs.map +1 -1
  461. package/dist/tab-panel.js +9 -9
  462. package/dist/tab-panel.js.map +1 -1
  463. package/dist/table.cjs +1 -1
  464. package/dist/table.cjs.map +1 -1
  465. package/dist/table.js +1 -1
  466. package/dist/table.js.map +1 -1
  467. package/dist/tabs.cjs +6 -6
  468. package/dist/tabs.cjs.map +1 -1
  469. package/dist/tabs.js +14 -15
  470. package/dist/tabs.js.map +1 -1
  471. package/dist/textarea.cjs +11 -11
  472. package/dist/textarea.cjs.map +1 -1
  473. package/dist/textarea.js +59 -59
  474. package/dist/textarea.js.map +1 -1
  475. package/dist/time-picker.cjs.map +1 -1
  476. package/dist/time-picker.js.map +1 -1
  477. package/dist/toast.cjs +16 -16
  478. package/dist/toast.cjs.map +1 -1
  479. package/dist/toast.js +20 -21
  480. package/dist/toast.js.map +1 -1
  481. package/dist/tooltip.cjs.map +1 -1
  482. package/dist/tooltip.js.map +1 -1
  483. package/dist/typing-indicator.cjs +1 -1
  484. package/dist/typing-indicator.cjs.map +1 -1
  485. package/dist/typing-indicator.js +1 -1
  486. package/dist/typing-indicator.js.map +1 -1
  487. package/package.json +96 -97
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.js","names":[],"sources":["../src/inputs/combobox/combobox.ts"],"sourcesContent":["import { define, html, prop, ref, bind, getHost, onCleanup, onElement, useEmit, watchEffect } from '@vielzeug/ore';\nimport { useField } from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\n\nimport type { AddEventListeners, ComponentSize, RoundedSize, ThemeColor } from '../../types';\nimport type { OreComboboxEvents, OreComboboxProps, ComboboxOptionInput, ComboboxOptionItem } from './combobox.types';\n\nimport {\n lifecycleSignal,\n createChoiceField,\n createInteraction,\n createListboxDropdown,\n type DropdownCloseReason,\n type OverlayOpenReason,\n} from '../../core';\nimport { colorThemeMixin, reducedMotionMixin, roundedVariantMixin, srOnlyMixin } from '../../styles';\nimport { dispatchNativeFieldEvent } from '../shared/native-field-event';\nimport { filterOptions, getCreatableLabel, makeCreatableValue, parseSlottedOptions } from './combobox-options';\nimport '../../feedback/chip/chip';\nimport '../input/input';\nimport componentStyles from './combobox.css?inline';\n\nexport type { OreComboboxEvents, OreComboboxProps } from './combobox.types';\n\n/**\n * A searchable select field with multiple selection, custom option creation, and large-list support.\n *\n * @element ore-combobox\n *\n * @attr {string} value - Selected value(s). Use comma-separated for multiple.\n * @attr {boolean} multiple - Enable multiple selection\n * @attr {boolean} creatable - Allow users to create custom options from search query\n * @attr {boolean} no-filter - Disable client-side filtering (useful for server-side search)\n * @attr {string} placeholder - Placeholder text\n * @attr {boolean} required - Require a non-blank selection for native form validation\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n *\n * @fires input - Emitted when the selection changes.\n * @fires change - Emitted when the selection changes.\n * @fires open-change - Emitted when the dropdown state changes. detail: { open, reason }\n * @fires {CustomEvent} search - Emitted when user types. detail: { query: string }\n *\n * @slot - Slotted combobox options and option groups\n * @cssprop --combobox-dropdown-bg - Dropdown panel background color\n * @cssprop --combobox-dropdown-border-color - Dropdown panel border color\n * @cssprop --combobox-option-hover-bg - Option background on hover\n * @cssprop --combobox-option-focus-bg - Option background when keyboard-focused\n * @cssprop --combobox-option-selected-bg - Option background when selected\n * @cssprop --combobox-option-selected-focus-bg - Option background when selected and focused\n * @cssprop --input-bg - Field background (passed through to ore-input)\n * @cssprop --input-border-color - Field border color (passed through to ore-input)\n *\n * @part wrapper - Root wrapper around the entire field\n * @part label - Label element shown inside or outside the field\n * @part field - Field container that holds the trigger input and clear button\n * @part input - Search input used to filter and select options\n * @part clear-btn - Button that clears the current selection/query\n * @part dropdown - Popup list container for options\n * @part helper-text - Helper text displayed below the field\n * @example\n * ```html\n * <ore-combobox label=\"Country\" name=\"country\">\n * <ore-combobox-option value=\"us\">United States</ore-combobox-option>\n * <ore-combobox-option value=\"gb\">United Kingdom</ore-combobox-option>\n * <ore-combobox-option value=\"de\" disabled>Germany</ore-combobox-option>\n * </ore-combobox>\n * ```\n */\nexport const COMBOBOX_TAG = 'ore-combobox' as const;\ndefine<OreComboboxProps>(COMBOBOX_TAG, {\n formAssociated: true,\n props: {\n autoclose: prop.bool(false),\n color: prop.string<ThemeColor>(),\n creatable: prop.bool(false),\n disabled: prop.bool(false),\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n loading: prop.bool(false),\n multiple: prop.bool(false),\n name: prop.string(),\n 'no-filter': prop.bool(false),\n options: prop.data<ComboboxOptionInput[]>(),\n placeholder: prop.string('Select...'),\n required: prop.bool(false),\n rounded: prop.string<RoundedSize>(),\n size: prop.string<ComponentSize>(),\n success: prop.bool(false),\n value: prop.string(),\n variant: prop.string<'flat' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreComboboxEvents>();\n const watch = watchEffect;\n\n const query = signal('');\n\n // Element refs needed by the listbox dropdown.\n let inputEl: HTMLInputElement | null = null;\n let fieldEl: HTMLElement | null = null; // set to the ore-input host once it mounts\n let dropdownEl: HTMLElement | null = null;\n let listboxEl: HTMLElement | null = null;\n\n // Ref to the ore-input host; resolved when the template renders.\n const bitInputRef = ref<HTMLElement>();\n\n const abortSignal = lifecycleSignal(onCleanup);\n const choice = createChoiceField({\n disabled: props.disabled,\n error: props.error,\n helper: props.helper,\n label: props.label,\n labelPlacement: props['label-placement'],\n multiple: props.multiple,\n prefix: 'combobox',\n required: props.required,\n signal: abortSignal,\n value: props.value,\n });\n\n // filteredOptions signal declared before optionList so the getItems getter\n // captures the live signal reference rather than needing a factory indirection.\n const filteredOptions = signal<ComboboxOptionItem[]>([]);\n\n const optionList = createListboxDropdown<ComboboxOptionItem>({\n getBoundary: () => el,\n getFocusedOptionElement: () => dropdownEl?.querySelector<HTMLElement>('[data-focused]') ?? null,\n getItems: () => filteredOptions.value,\n getOptionId: (index) => `${choice.fieldId}-opt-${index}`,\n getPanel: () => dropdownEl,\n getReference: () => fieldEl,\n getTrigger: () => inputEl,\n isDisabled: () => choice.disabled.value,\n onClose: (reason) => {\n emit('open-change', { open: false, reason });\n\n if (!abortSignal.aborted) restoreQueryFromSelection();\n\n choice.triggerValidation('blur');\n },\n onOpen: (reason) => emit('open-change', { open: true, reason }),\n restoreFocus: false,\n signal: abortSignal,\n });\n\n const { disabled: isDisabled, fieldId: comboId, selectedValues, triggerValidation } = choice;\n\n choice.attachFormField(\n useField<string>({\n disabled: choice.disabled,\n onReset: choice.reset,\n toFormValue: (v) => v,\n validationMessage: choice.validationMessage,\n validity: choice.validity,\n value: choice.formValue,\n }),\n );\n\n const { focusedIndex, isOpen, scrollFocusedIntoView, updatePosition } = optionList;\n // ── State ────────────────────────────────────────────────────────────────\n const isMultiple = () => Boolean(props.multiple.value);\n const isCreatable = () => Boolean(props.creatable.value);\n const isNoFilter = () => Boolean(props['no-filter'].value);\n\n bind({\n attr: {\n open: () => (isOpen.value ? true : undefined),\n size: props.size,\n variant: props.variant,\n },\n });\n\n let lastQueryBeforeClear: string | null = null;\n let isRestoringQuery = false;\n\n const selectedValue = computed(() => selectedValues.value[0] ?? '');\n\n // Expose a native-like, string-valued `.value` property on the host.\n Object.defineProperty(el, 'value', {\n configurable: true,\n get: () => choice.formValue.value,\n set: (val: unknown) => {\n const v = val as string | string[] | null | undefined;\n\n if (Array.isArray(v)) {\n choice.setValues(v.map((entry) => String(entry ?? '')));\n\n return;\n }\n\n if (v == null || v === '') {\n choice.clear();\n\n return;\n }\n\n choice.setValues(isMultiple() ? String(v).split(',') : [String(v)]);\n },\n });\n\n const hasValue = () => selectedValues.value.length > 0;\n\n function focusLiveInput() {\n inputEl?.focus();\n }\n\n // ── Options ──────────────────────────────────────────────────────────────\n const slottedOptions = signal<ComboboxOptionItem[]>([]);\n const createdOptions = signal<ComboboxOptionItem[]>([]);\n const isLoading = () => Boolean(props.loading.value);\n\n function normalizeOption(option: ComboboxOptionInput): ComboboxOptionItem {\n return {\n disabled: Boolean(option.disabled),\n iconEl: option.iconEl ?? null,\n label: option.label ?? option.value,\n value: option.value,\n };\n }\n\n // Merged options: explicit prop value overrides slotted options.\n const allOptions = computed<ComboboxOptionItem[]>(() => {\n const optionsProp = props.options.value;\n const base = Array.isArray(optionsProp) ? optionsProp.map(normalizeOption) : slottedOptions.value;\n\n if (createdOptions.value.length === 0) return base;\n\n return [...base, ...createdOptions.value];\n });\n\n const selectionController = {\n clear: () => {\n choice.clear();\n },\n remove: (key: string) => {\n choice.removeValue(key);\n },\n select: (key: string) => {\n choice.selectValue(key);\n },\n toggle: (key: string) => {\n choice.toggleValue(key);\n },\n };\n\n function readOptions(elements: Element[] = Array.from(el.children)) {\n slottedOptions.value = parseSlottedOptions(elements);\n\n if (!isMultiple()) {\n const match = allOptions.value.find((option) => option.value === selectedValue.value);\n\n query.value = match?.label ?? selectedValue.value;\n }\n }\n\n // Initialize from light DOM immediately; onMounted/observer keep this in sync afterwards.\n readOptions();\n\n watch(() => {\n const nextOptions = filterOptions(allOptions.value, query.value, isNoFilter());\n\n filteredOptions.value = isMultiple()\n ? nextOptions.filter((option) => !selectedValues.value.includes(option.value))\n : nextOptions;\n });\n\n // \"Create\" option shown when creatable + query doesn't match any existing option\n const creatableLabel = computed(() => {\n return getCreatableLabel(query.value, isCreatable(), filteredOptions.value);\n });\n const inputPlaceholder = () =>\n isMultiple() && selectedValues.value.length > 0 ? '' : props.placeholder.value || '';\n\n function emitChange() {\n dispatchNativeFieldEvent(el, 'input');\n dispatchNativeFieldEvent(el, 'change');\n }\n\n function removeChip(event: Event): void {\n event.stopPropagation();\n\n const value = (event as CustomEvent<{ value?: string }>).detail?.value;\n\n if (value === undefined) return;\n\n selectionController.remove(value);\n emitChange();\n triggerValidation('change');\n }\n\n function restoreQueryFromSelection() {\n // Keep input text and selected value in sync whenever the popup closes.\n if (!isMultiple()) {\n const match = allOptions.value.find((option) => option.value === selectedValue.value);\n\n isRestoringQuery = true;\n query.value = match?.label ?? '';\n Promise.resolve().then(() => {\n isRestoringQuery = false;\n });\n\n return;\n }\n\n query.value = '';\n }\n\n watch(() => {\n if (isOpen.value && !isMultiple() && selectedValue.value && focusedIndex.value === -1 && query.value === '') {\n const selectedIndex = filteredOptions.value.findIndex((option) => option.value === selectedValue.value);\n\n if (selectedIndex >= 0) {\n optionList.set(selectedIndex);\n }\n }\n });\n\n // ── Open / Close ─────────────────────────────────────────────────────────\n function openPopup(clearFilter = true, reason: OverlayOpenReason = 'programmatic') {\n if (clearFilter) {\n lastQueryBeforeClear = query.value;\n query.value = '';\n }\n\n // Pre-compute focused index BEFORE opening so the first render has it set\n if (!isMultiple() && selectedValue.value) {\n const freshOptions = filterOptions(allOptions.value, '', isNoFilter());\n const selectedIndex = freshOptions.findIndex((option) => option.value === selectedValue.value);\n\n if (selectedIndex >= 0) {\n optionList.set(selectedIndex);\n }\n }\n\n optionList.open(reason);\n\n if (!isMultiple() && selectedValue.value && focusedIndex.value >= 0) {\n requestAnimationFrame(() => {\n scrollFocusedIntoView();\n });\n }\n }\n\n function closePopup(reason: DropdownCloseReason = 'programmatic') {\n optionList.close(reason);\n }\n\n const fieldPress = createInteraction({\n disabled: isDisabled,\n onPress: () => {\n if (!isOpen.value) openPopup(true, 'click');\n\n focusLiveInput();\n },\n });\n\n const enterPress = createInteraction({\n disabled: isDisabled,\n keys: ['Enter'],\n onPress: (originalEvent: Event) => {\n const opts = filteredOptions.value;\n\n if (isOpen.value && focusedIndex.value >= 0 && focusedIndex.value < opts.length) {\n selectOption(opts[focusedIndex.value], originalEvent);\n } else if (isOpen.value && focusedIndex.value === -1 && creatableLabel.value) {\n // Focused on the \"create\" item\n createOption(query.value, originalEvent);\n } else if (!isOpen.value) {\n openPopup(true, 'keyboard');\n }\n },\n });\n\n // ── Selection ────────────────────────────────────────────────────────────\n function selectOption(opt: ComboboxOptionItem, _originalEvent?: Event) {\n if (opt.disabled) return;\n\n if (isMultiple()) {\n selectionController.toggle(opt.value);\n query.value = '';\n emitChange();\n triggerValidation('change');\n\n if (props.autoclose.value) {\n closePopup();\n }\n\n // Keep dropdown open in multiple mode (unless autoclose is true)\n focusLiveInput();\n requestAnimationFrame(() => focusLiveInput());\n } else {\n selectionController.select(opt.value);\n query.value = opt.label;\n emitChange();\n triggerValidation('change');\n closePopup();\n focusLiveInput();\n }\n }\n function resolveOptionFromElement(optionEl: HTMLElement): ComboboxOptionItem | null {\n const indexAttr = optionEl.getAttribute('data-option-index');\n const index = indexAttr ? Number(indexAttr) : -1;\n\n if (Number.isInteger(index) && index >= 0 && index < filteredOptions.value.length) {\n return filteredOptions.value[index] ?? null;\n }\n\n const valueAttr = optionEl.getAttribute('data-option-value');\n\n if (valueAttr) {\n const byValue = filteredOptions.value.find((option) => option.value === valueAttr);\n\n if (byValue) return byValue;\n }\n\n const labelText = optionEl.querySelector('span')?.textContent?.trim() ?? optionEl.textContent?.trim() ?? '';\n\n if (!labelText) return null;\n\n return filteredOptions.value.find((option) => option.label === labelText || option.value === labelText) ?? null;\n }\n function clearValue(e: Event) {\n e.stopPropagation();\n selectionController.clear();\n query.value = '';\n emitChange();\n triggerValidation('change');\n focusLiveInput();\n }\n function handleInput(e: InputEvent) {\n const target = e.target as HTMLInputElement;\n const newValue = target.value;\n\n // Skip all input processing if we're in the middle of restoring the query\n // This prevents the clearing logic from firing during close/restore\n if (isRestoringQuery) {\n return;\n }\n\n if (newValue === query.value) return;\n\n query.value = newValue;\n\n if (!isMultiple()) {\n const currentItem = selectedValues.value[0];\n const currentLabel = currentItem\n ? (allOptions.value.find((o) => o.value === currentItem)?.label ?? currentItem)\n : '';\n\n // Preserve the current selection while typing. Selection should only\n // change when a new option is committed or when the user explicitly clears.\n const isJustOpening = newValue === '' && lastQueryBeforeClear === currentLabel;\n\n if (isJustOpening) {\n lastQueryBeforeClear = null;\n }\n }\n\n optionList.navigate('first');\n\n if (!isOpen.value) openPopup(false, 'keyboard');\n\n emit('search', { query: target.value });\n }\n function handleFocus() {\n // Intentionally no-op: open only on explicit click or keyboard.\n // Opening on every focus surprises users tabbing through a form.\n }\n\n // ── Keyboard Navigation ──────────────────────────────────────────────────\n function handleKeydown(e: KeyboardEvent) {\n if (isDisabled.value) return;\n\n if (optionList.handleKeydown(e)) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n\n if (!isOpen.value) {\n openPopup(true, 'keyboard');\n optionList.navigate('first');\n } else {\n optionList.navigate('next');\n }\n\n break;\n case 'ArrowUp':\n e.preventDefault();\n\n if (!isOpen.value) {\n openPopup(true, 'keyboard');\n } else {\n optionList.navigate('prev');\n }\n\n break;\n case 'Backspace':\n // In multiple mode, remove the last chip when the input is empty\n if (isMultiple() && !query.value && selectedValues.value.length > 0) {\n choice.removeValue(selectedValues.value[selectedValues.value.length - 1] ?? '');\n emitChange();\n triggerValidation('change');\n }\n\n break;\n case 'Enter':\n enterPress.handleKeydown(e);\n\n break;\n case 'Tab':\n closePopup('programmatic');\n break;\n default:\n break;\n }\n }\n\n // ── Create option ────────────────────────────────────────────────────────\n function createOption(rawQuery: string, originalEvent?: Event) {\n const actualLabel = rawQuery.trim();\n\n if (!actualLabel) return;\n\n const value = makeCreatableValue(actualLabel);\n const newOpt: ComboboxOptionItem = { disabled: false, iconEl: null, label: actualLabel, value };\n\n createdOptions.value = [...createdOptions.value, newOpt];\n selectOption(newOpt, originalEvent);\n }\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n const observeLightDomOptions = (): (() => void) => {\n const observer = new MutationObserver(() => {\n readOptions();\n });\n\n observer.observe(el, {\n attributeFilter: ['disabled', 'label', 'value'],\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n return () => observer.disconnect();\n };\n\n const stopObserving = observeLightDomOptions();\n\n const handleShadowOptionPointerMove = (event: PointerEvent): void => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option || option.disabled) return;\n\n const focusedIdx = filteredOptions.value.findIndex((candidate) => candidate.value === option.value);\n\n if (focusedIdx >= 0) {\n optionList.set(focusedIdx);\n }\n };\n const shadowRoot = el.shadowRoot;\n\n if (shadowRoot) {\n shadowRoot.addEventListener('pointermove', handleShadowOptionPointerMove as EventListener);\n }\n\n const createListboxListeners = (listEl: HTMLElement): (() => void) => {\n const handleActivate = (event: Event) => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const createRow = target.closest<HTMLElement>('.no-results-create');\n\n if (createRow) {\n event.preventDefault();\n event.stopPropagation();\n createOption(query.value, event);\n\n return;\n }\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option) return;\n\n selectOption(option, event);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option) return;\n\n const focusedIdx = filteredOptions.value.findIndex((candidate) => candidate.value === option.value);\n\n if (focusedIdx >= 0) {\n optionList.set(focusedIdx);\n }\n };\n\n listEl.addEventListener('click', handleActivate);\n listEl.addEventListener('pointermove', handlePointerMove);\n\n return () => {\n listEl.removeEventListener('click', handleActivate);\n listEl.removeEventListener('pointermove', handlePointerMove);\n };\n };\n\n let stopListboxListeners: (() => void) | null = null;\n let listboxListenersTarget: HTMLElement | null = null;\n\n const setListboxElement = (el: HTMLElement | null): void => {\n listboxEl = el;\n\n if (listboxListenersTarget === el) return;\n\n stopListboxListeners?.();\n stopListboxListeners = null;\n listboxListenersTarget = null;\n\n if (!el) return;\n\n stopListboxListeners = createListboxListeners(el);\n listboxListenersTarget = el;\n };\n\n const ensureListboxListeners = (): void => {\n if (!listboxEl) return;\n\n if (listboxListenersTarget === listboxEl && stopListboxListeners) return;\n\n stopListboxListeners?.();\n stopListboxListeners = createListboxListeners(listboxEl);\n listboxListenersTarget = listboxEl;\n };\n\n watch(() => {\n ensureListboxListeners();\n\n if (isOpen.value) {\n if (dropdownEl && 'showPopover' in dropdownEl && !dropdownEl.matches(':popover-open')) dropdownEl.showPopover();\n\n updatePosition();\n } else {\n if (dropdownEl && 'hidePopover' in dropdownEl && dropdownEl.matches(':popover-open')) dropdownEl.hidePopover();\n }\n });\n\n // Once ore-input is in the DOM, grab its inner <input> from its shadow root\n // and attach all combobox-specific ARIA + event handlers imperatively.\n // MUST be registered before the ARIA effects below so inputEl is set first\n // when bitInputRef fires (effects run in registration order).\n onElement(bitInputRef, (bitInputEl) => {\n fieldEl = bitInputEl;\n\n const rawInput = bitInputEl.shadowRoot?.querySelector<HTMLInputElement>('input') ?? null;\n\n if (!rawInput) return;\n\n inputEl = rawInput;\n\n rawInput.setAttribute('role', 'combobox');\n rawInput.setAttribute('autocomplete', 'off');\n rawInput.setAttribute('aria-autocomplete', 'list');\n rawInput.setAttribute('aria-haspopup', 'listbox');\n rawInput.setAttribute('spellcheck', 'false');\n rawInput.setAttribute('aria-controls', `${comboId}-listbox`);\n\n const handleInputClick = (): void => {\n if (!isOpen.value) openPopup(true, 'click');\n\n focusLiveInput();\n };\n\n rawInput.addEventListener('input', handleInput as EventListener);\n rawInput.addEventListener('keydown', handleKeydown as EventListener);\n rawInput.addEventListener('focus', handleFocus);\n rawInput.addEventListener('click', handleInputClick);\n\n return () => {\n inputEl = null;\n fieldEl = null;\n rawInput.removeEventListener('input', handleInput as EventListener);\n rawInput.removeEventListener('keydown', handleKeydown as EventListener);\n rawInput.removeEventListener('focus', handleFocus);\n rawInput.removeEventListener('click', handleInputClick);\n };\n });\n\n // Reactively sync combobox-specific ARIA attrs that ore-input doesn't manage.\n // Uses bitInputRef (a signal) as the gate so the effect re-runs when the\n // inner input mounts — inputEl is a plain variable and would not trigger re-runs.\n watch(() => {\n if (!bitInputRef.value) return;\n\n const el = inputEl;\n\n if (!el) return;\n\n el.setAttribute('aria-expanded', String(isOpen.value));\n\n if (isDisabled.value) {\n el.setAttribute('aria-disabled', 'true');\n } else {\n el.removeAttribute('aria-disabled');\n }\n\n if (props.error.value) {\n el.setAttribute('aria-invalid', 'true');\n el.setAttribute('aria-errormessage', `${comboId}-error`);\n } else {\n el.removeAttribute('aria-invalid');\n el.removeAttribute('aria-errormessage');\n }\n });\n\n // Reactively sync the query signal into the raw input value.\n watch(() => {\n if (!bitInputRef.value) return;\n\n const el = inputEl;\n\n if (!el) return;\n\n if (el.value !== query.value) el.value = query.value;\n });\n\n onCleanup(() => {\n shadowRoot?.removeEventListener('pointermove', handleShadowOptionPointerMove as EventListener);\n stopListboxListeners?.();\n stopListboxListeners = null;\n listboxListenersTarget = null;\n stopObserving();\n });\n\n const inputColor = () => props.color?.value ?? undefined;\n const inputSize = () => props.size?.value ?? undefined;\n const inputVariant = () => props.variant?.value ?? undefined;\n const inputRounded = () => props.rounded?.value ?? undefined;\n const inputFullwidth = () => (props.fullwidth.value ? true : undefined);\n\n return html`\n <slot></slot>\n <ore-input\n class=\"trigger\"\n ref=${bitInputRef}\n label=\"${() => props.label.value ?? ''}\"\n placeholder=\"${inputPlaceholder}\"\n label-placement=\"${() => props['label-placement'].value ?? 'inset'}\"\n color=\"${inputColor}\"\n size=\"${inputSize}\"\n variant=\"${inputVariant}\"\n rounded=\"${inputRounded}\"\n helper=\"${() => props.helper.value ?? ''}\"\n error=\"${() => props.error.value ?? ''}\"\n ?disabled=\"${isDisabled}\"\n ?required=\"${() => false}\"\n ?fullwidth=\"${inputFullwidth}\"\n ?success=\"${() => props.success.value}\"\n name=\"${() => props.name.value ?? ''}\"\n @click=\"${(e: MouseEvent) => {\n fieldPress.handleClick(e);\n }}\"\n part=\"wrapper\">\n <div slot=\"prefix\" class=\"chips-row\">\n <!-- Keep chip list diffing isolated so input node identity stays stable. -->\n <span class=\"chips-list\">\n ${() =>\n (isMultiple() ? selectedValues.value : []).map(\n (value) => html`\n <ore-chip\n value=${value}\n label=${allOptions.value.find((option) => option.value === value)?.label ?? value}\n mode=\"removable\"\n variant=\"flat\"\n size=\"sm\"\n color=\"${props.color}\"\n @remove=${removeChip}>\n ${allOptions.value.find((option) => option.value === value)?.label ?? value}\n </ore-chip>\n `,\n )}\n </span>\n </div>\n <span slot=\"suffix\" class=\"combobox-suffix\" aria-hidden=\"true\">\n <button\n class=\"clear-btn\"\n part=\"clear-btn\"\n type=\"button\"\n aria-label=\"Clear\"\n tabindex=\"-1\"\n ?hidden=${() => !hasValue()}\n @click=\"${clearValue}\">\n <ore-icon name=\"x\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n <span class=\"combobox-suffix-end\">\n <span class=\"loader\"></span>\n <span class=\"chevron\">\n <ore-icon name=\"chevron-down\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>\n </span>\n </span>\n </span>\n </ore-input>\n <span\n class=\"sr-only\"\n id=\"${() => `${comboId}-error`}\"\n role=\"alert\"\n aria-live=\"assertive\"\n ?hidden=\"${() => !props.error.value}\">\n ${() => props.error.value ?? ''}\n </span>\n <div\n class=\"dropdown\"\n part=\"dropdown\"\n id=\"${() => `${comboId}-dropdown`}\"\n popover=\"manual\"\n ?data-open=${() => isOpen.value}\n ref=${(el: HTMLElement | null) => {\n dropdownEl = el;\n }}>\n <div\n role=\"listbox\"\n id=\"${() => `${comboId}-listbox`}\"\n style=\"${() =>\n isOpen.value && filteredOptions.value.length > 0 ? `height:${filteredOptions.value.length * 36}px;` : ''}\"\n aria-label=\"${() => props.label.value || props.placeholder.value || 'Options'}\"\n ref=${(el: HTMLElement | null) => {\n setListboxElement(el);\n }}>\n ${() => {\n if (!isOpen.value) return '';\n\n if (isLoading()) {\n return html`\n <div class=\"dropdown-loading\">Loading...</div>\n `;\n }\n\n if (filteredOptions.value.length === 0) {\n if (creatableLabel.value) {\n return html`\n <button type=\"button\" class=\"no-results-create\" ?data-focused=${() => focusedIndex.value === -1}>\n ${creatableLabel.value}\n </button>\n `;\n }\n\n return html`\n <div class=\"no-results\" role=\"presentation\">No results found</div>\n `;\n }\n\n return filteredOptions.value.map((option, index) => {\n return html`\n <div\n class=\"option\"\n role=\"option\"\n id=\"${`${comboId}-opt-${index}`}\"\n data-option-index=\"${index}\"\n data-option-value=\"${option.value}\"\n aria-selected=\"${() =>\n String(\n isMultiple() ? selectedValues.value.includes(option.value) : selectedValue.value === option.value,\n )}\"\n aria-disabled=\"${String(option.disabled)}\"\n style=\"${`position:absolute;top:0;left:0;right:0;transform:translateY(${index * 36}px);`}\"\n ?data-focused=${() => focusedIndex.value === index}\n ?data-selected=${() =>\n isMultiple() ? selectedValues.value.includes(option.value) : selectedValue.value === option.value}\n ?data-disabled=${option.disabled}>\n <span>${option.label}</span>\n <span class=\"option-check\" aria-hidden=\"true\">\n <ore-icon name=\"check\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </span>\n </div>\n `;\n });\n }}\n </div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [colorThemeMixin, reducedMotionMixin, roundedVariantMixin, srOnlyMixin, componentStyles],\n}) as unknown as AddEventListeners<OreComboboxEvents>;\n"],"mappings":";;;;;;;;;;;;;AAoEA,IAAa,IAAe;AAC5B,EAAyB,GAAc;CACrC,gBAAgB;CAChB,OAAO;EACL,WAAW,EAAK,KAAK,EAAK;EAC1B,OAAO,EAAK,OAAmB;EAC/B,WAAW,EAAK,KAAK,EAAK;EAC1B,UAAU,EAAK,KAAK,EAAK;EACzB,OAAO,EAAK,OAAO;EACnB,WAAW,EAAK,KAAK,EAAK;EAC1B,QAAQ,EAAK,OAAO;EACpB,OAAO,EAAK,OAAO;EACnB,mBAAmB,EAAK,MAAM,CAAC,SAAS,SAAS,GAAY,OAAO;EACpE,SAAS,EAAK,KAAK,EAAK;EACxB,UAAU,EAAK,KAAK,EAAK;EACzB,MAAM,EAAK,OAAO;EAClB,aAAa,EAAK,KAAK,EAAK;EAC5B,SAAS,EAAK,KAA4B;EAC1C,aAAa,EAAK,OAAO,WAAW;EACpC,UAAU,EAAK,KAAK,EAAK;EACzB,SAAS,EAAK,OAAoB;EAClC,MAAM,EAAK,OAAsB;EACjC,SAAS,EAAK,KAAK,EAAK;EACxB,OAAO,EAAK,OAAO;EACnB,SAAS,EAAK,OAA4D;CAC5E;CACA,MAAM,GAAO;EACX,IAAM,IAAK,GAAQ,GACb,IAAO,GAA2B,GAClC,IAAQ,IAER,IAAQ,EAAO,EAAE,GAGnB,IAAmC,MACnC,IAA8B,MAC9B,IAAiC,MACjC,IAAgC,MAG9B,IAAc,GAAiB,GAE/B,IAAc,EAAgB,CAAS,GACvC,IAAS,EAAkB;GAC/B,UAAU,EAAM;GAChB,OAAO,EAAM;GACb,QAAQ,EAAM;GACd,OAAO,EAAM;GACb,gBAAgB,EAAM;GACtB,UAAU,EAAM;GAChB,QAAQ;GACR,UAAU,EAAM;GAChB,QAAQ;GACR,OAAO,EAAM;EACf,CAAC,GAIK,IAAkB,EAA6B,CAAC,CAAC,GAEjD,IAAa,GAA0C;GAC3D,mBAAmB;GACnB,+BAA+B,GAAY,cAA2B,gBAAgB,KAAK;GAC3F,gBAAgB,EAAgB;GAChC,cAAc,MAAU,GAAG,EAAO,QAAQ,OAAO;GACjD,gBAAgB;GAChB,oBAAoB;GACpB,kBAAkB;GAClB,kBAAkB,EAAO,SAAS;GAClC,UAAU,MAAW;IAKnB,AAJA,EAAK,eAAe;KAAE,MAAM;KAAO;IAAO,CAAC,GAEtC,EAAY,WAAS,GAA0B,GAEpD,EAAO,kBAAkB,MAAM;GACjC;GACA,SAAS,MAAW,EAAK,eAAe;IAAE,MAAM;IAAM;GAAO,CAAC;GAC9D,cAAc;GACd,QAAQ;EACV,CAAC,GAEK,EAAE,UAAU,GAAY,SAAS,GAAS,mBAAgB,yBAAsB;EAEtF,EAAO,gBACL,GAAiB;GACf,UAAU,EAAO;GACjB,SAAS,EAAO;GAChB,cAAc,MAAM;GACpB,mBAAmB,EAAO;GAC1B,UAAU,EAAO;GACjB,OAAO,EAAO;EAChB,CAAC,CACH;EAEA,IAAM,EAAE,iBAAc,WAAQ,2BAAuB,uBAAmB,GAElE,UAAmB,EAAQ,EAAM,SAAS,OAC1C,WAAoB,EAAQ,EAAM,UAAU,OAC5C,WAAmB,EAAQ,EAAM,YAAY,CAAC;EAEpD,GAAK,EACH,MAAM;GACJ,YAAa,EAAO,QAAQ,KAAO,KAAA;GACnC,MAAM,EAAM;GACZ,SAAS,EAAM;EACjB,EACF,CAAC;EAED,IAAI,IAAsC,MACtC,IAAmB,IAEjB,IAAgB,QAAe,EAAe,MAAM,MAAM,EAAE;EAGlE,OAAO,eAAe,GAAI,SAAS;GACjC,cAAc;GACd,WAAW,EAAO,UAAU;GAC5B,MAAM,MAAiB;IACrB,IAAM,IAAI;IAEV,IAAI,MAAM,QAAQ,CAAC,GAAG;KACpB,EAAO,UAAU,EAAE,KAAK,MAAU,OAAO,KAAS,EAAE,CAAC,CAAC;KAEtD;IACF;IAEA,IAAI,KAAK,QAAQ,MAAM,IAAI;KACzB,EAAO,MAAM;KAEb;IACF;IAEA,EAAO,UAAU,EAAW,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;GACpE;EACF,CAAC;EAED,IAAM,WAAiB,EAAe,MAAM,SAAS;EAErD,SAAS,IAAiB;GACxB,GAAS,MAAM;EACjB;EAGA,IAAM,IAAiB,EAA6B,CAAC,CAAC,GAChD,IAAiB,EAA6B,CAAC,CAAC,GAChD,WAAkB,EAAQ,EAAM,QAAQ;EAE9C,SAAS,GAAgB,GAAiD;GACxE,OAAO;IACL,UAAU,EAAQ,EAAO;IACzB,QAAQ,EAAO,UAAU;IACzB,OAAO,EAAO,SAAS,EAAO;IAC9B,OAAO,EAAO;GAChB;EACF;EAGA,IAAM,IAAa,QAAqC;GACtD,IAAM,IAAc,EAAM,QAAQ,OAC5B,IAAO,MAAM,QAAQ,CAAW,IAAI,EAAY,IAAI,EAAe,IAAI,EAAe;GAI5F,OAFI,EAAe,MAAM,WAAW,IAAU,IAEvC,CAAC,GAAG,GAAM,GAAG,EAAe,KAAK;EAC1C,CAAC,GAEK,IAAsB;GAC1B,aAAa;IACX,EAAO,MAAM;GACf;GACA,SAAS,MAAgB;IACvB,EAAO,YAAY,CAAG;GACxB;GACA,SAAS,MAAgB;IACvB,EAAO,YAAY,CAAG;GACxB;GACA,SAAS,MAAgB;IACvB,EAAO,YAAY,CAAG;GACxB;EACF;EAEA,SAAS,EAAY,IAAsB,MAAM,KAAK,EAAG,QAAQ,GAAG;GAGlE,IAFA,EAAe,QAAQ,GAAoB,CAAQ,GAE/C,CAAC,EAAW,GAAG;IACjB,IAAM,IAAQ,EAAW,MAAM,MAAM,MAAW,EAAO,UAAU,EAAc,KAAK;IAEpF,EAAM,QAAQ,GAAO,SAAS,EAAc;GAC9C;EACF;EAKA,AAFA,EAAY,GAEZ,QAAY;GACV,IAAM,IAAc,EAAc,EAAW,OAAO,EAAM,OAAO,GAAW,CAAC;GAE7E,EAAgB,QAAQ,EAAW,IAC/B,EAAY,QAAQ,MAAW,CAAC,EAAe,MAAM,SAAS,EAAO,KAAK,CAAC,IAC3E;EACN,CAAC;EAGD,IAAM,IAAiB,QACd,GAAkB,EAAM,OAAO,GAAY,GAAG,EAAgB,KAAK,CAC3E,GACK,WACJ,EAAW,KAAK,EAAe,MAAM,SAAS,IAAI,KAAK,EAAM,YAAY,SAAS;EAEpF,SAAS,IAAa;GAEpB,AADA,EAAyB,GAAI,OAAO,GACpC,EAAyB,GAAI,QAAQ;EACvC;EAEA,SAAS,GAAW,GAAoB;GACtC,EAAM,gBAAgB;GAEtB,IAAM,IAAS,EAA0C,QAAQ;GAE7D,MAAU,KAAA,MAEd,EAAoB,OAAO,CAAK,GAChC,EAAW,GACX,EAAkB,QAAQ;EAC5B;EAEA,SAAS,KAA4B;GAEnC,IAAI,CAAC,EAAW,GAAG;IACjB,IAAM,IAAQ,EAAW,MAAM,MAAM,MAAW,EAAO,UAAU,EAAc,KAAK;IAIpF,AAFA,IAAmB,IACnB,EAAM,QAAQ,GAAO,SAAS,IAC9B,QAAQ,QAAQ,CAAC,CAAC,WAAW;KAC3B,IAAmB;IACrB,CAAC;IAED;GACF;GAEA,EAAM,QAAQ;EAChB;EAEA,QAAY;GACV,IAAI,EAAO,SAAS,CAAC,EAAW,KAAK,EAAc,SAAS,EAAa,UAAU,MAAM,EAAM,UAAU,IAAI;IAC3G,IAAM,IAAgB,EAAgB,MAAM,WAAW,MAAW,EAAO,UAAU,EAAc,KAAK;IAEtG,AAAI,KAAiB,KACnB,EAAW,IAAI,CAAa;GAEhC;EACF,CAAC;EAGD,SAAS,EAAU,IAAc,IAAM,IAA4B,gBAAgB;GAOjF,IANI,MACF,IAAuB,EAAM,OAC7B,EAAM,QAAQ,KAIZ,CAAC,EAAW,KAAK,EAAc,OAAO;IAExC,IAAM,IADe,EAAc,EAAW,OAAO,IAAI,GAAW,CAC9C,CAAA,CAAa,WAAW,MAAW,EAAO,UAAU,EAAc,KAAK;IAE7F,AAAI,KAAiB,KACnB,EAAW,IAAI,CAAa;GAEhC;GAIA,AAFA,EAAW,KAAK,CAAM,GAElB,CAAC,EAAW,KAAK,EAAc,SAAS,EAAa,SAAS,KAChE,4BAA4B;IAC1B,GAAsB;GACxB,CAAC;EAEL;EAEA,SAAS,EAAW,IAA8B,gBAAgB;GAChE,EAAW,MAAM,CAAM;EACzB;EAEA,IAAM,KAAa,EAAkB;GACnC,UAAU;GACV,eAAe;IAGb,AAFK,EAAO,SAAO,EAAU,IAAM,OAAO,GAE1C,EAAe;GACjB;EACF,CAAC,GAEK,KAAa,EAAkB;GACnC,UAAU;GACV,MAAM,CAAC,OAAO;GACd,UAAU,MAAyB;IACjC,IAAM,IAAO,EAAgB;IAE7B,AAAI,EAAO,SAAS,EAAa,SAAS,KAAK,EAAa,QAAQ,EAAK,SACvE,EAAa,EAAK,EAAa,QAAQ,CAAa,IAC3C,EAAO,SAAS,EAAa,UAAU,MAAM,EAAe,QAErE,EAAa,EAAM,OAAO,CAAa,IAC7B,EAAO,SACjB,EAAU,IAAM,UAAU;GAE9B;EACF,CAAC;EAGD,SAAS,EAAa,GAAyB,GAAwB;GACjE,EAAI,aAEJ,EAAW,KACb,EAAoB,OAAO,EAAI,KAAK,GACpC,EAAM,QAAQ,IACd,EAAW,GACX,EAAkB,QAAQ,GAEtB,EAAM,UAAU,SAClB,EAAW,GAIb,EAAe,GACf,4BAA4B,EAAe,CAAC,MAE5C,EAAoB,OAAO,EAAI,KAAK,GACpC,EAAM,QAAQ,EAAI,OAClB,EAAW,GACX,EAAkB,QAAQ,GAC1B,EAAW,GACX,EAAe;EAEnB;EACA,SAAS,EAAyB,GAAkD;GAClF,IAAM,IAAY,EAAS,aAAa,mBAAmB,GACrD,IAAQ,IAAY,OAAO,CAAS,IAAI;GAE9C,IAAI,OAAO,UAAU,CAAK,KAAK,KAAS,KAAK,IAAQ,EAAgB,MAAM,QACzE,OAAO,EAAgB,MAAM,MAAU;GAGzC,IAAM,IAAY,EAAS,aAAa,mBAAmB;GAE3D,IAAI,GAAW;IACb,IAAM,IAAU,EAAgB,MAAM,MAAM,MAAW,EAAO,UAAU,CAAS;IAEjF,IAAI,GAAS,OAAO;GACtB;GAEA,IAAM,IAAY,EAAS,cAAc,MAAM,CAAC,EAAE,aAAa,KAAK,KAAK,EAAS,aAAa,KAAK,KAAK;GAIzG,OAFK,IAEE,EAAgB,MAAM,MAAM,MAAW,EAAO,UAAU,KAAa,EAAO,UAAU,CAAS,KAAK,OAFpF;EAGzB;EACA,SAAS,GAAW,GAAU;GAM5B,AALA,EAAE,gBAAgB,GAClB,EAAoB,MAAM,GAC1B,EAAM,QAAQ,IACd,EAAW,GACX,EAAkB,QAAQ,GAC1B,EAAe;EACjB;EACA,SAAS,EAAY,GAAe;GAClC,IAAM,IAAS,EAAE,QACX,IAAW,EAAO;GAIpB,UAIA,MAAa,EAAM,OAIvB;QAFA,EAAM,QAAQ,GAEV,CAAC,EAAW,GAAG;KACjB,IAAM,IAAc,EAAe,MAAM,IACnC,IAAe,IAChB,EAAW,MAAM,MAAM,MAAM,EAAE,UAAU,CAAW,CAAC,EAAE,SAAS,IACjE;KAMJ,AAFsB,MAAa,MAAM,MAAyB,MAGhE,IAAuB;IAE3B;IAMA,AAJA,EAAW,SAAS,OAAO,GAEtB,EAAO,SAAO,EAAU,IAAO,UAAU,GAE9C,EAAK,UAAU,EAAE,OAAO,EAAO,MAAM,CAAC;GANtC;EAOF;EACA,SAAS,IAAc,CAGvB;EAGA,SAAS,EAAc,GAAkB;GACnC,OAAW,SAEX,GAAW,cAAc,CAAC,GAE9B,QAAQ,EAAE,KAAV;IACE,KAAK;KAGH,AAFA,EAAE,eAAe,GAEZ,EAAO,QAIV,EAAW,SAAS,MAAM,KAH1B,EAAU,IAAM,UAAU,GAC1B,EAAW,SAAS,OAAO;KAK7B;IACF,KAAK;KAGH,AAFA,EAAE,eAAe,GAEZ,EAAO,QAGV,EAAW,SAAS,MAAM,IAF1B,EAAU,IAAM,UAAU;KAK5B;IACF,KAAK;KAEH,AAAI,EAAW,KAAK,CAAC,EAAM,SAAS,EAAe,MAAM,SAAS,MAChE,EAAO,YAAY,EAAe,MAAM,EAAe,MAAM,SAAS,MAAM,EAAE,GAC9E,EAAW,GACX,EAAkB,QAAQ;KAG5B;IACF,KAAK;KACH,GAAW,cAAc,CAAC;KAE1B;IACF,KAAK,OACH,EAAW,cAAc;GAI7B;EACF;EAGA,SAAS,EAAa,GAAkB,GAAuB;GAC7D,IAAM,IAAc,EAAS,KAAK;GAElC,IAAI,CAAC,GAAa;GAGlB,IAAM,IAA6B;IAAE,UAAU;IAAO,QAAQ;IAAM,OAAO;IAAa,OAD1E,GAAmB,CACuD;GAAM;GAG9F,AADA,EAAe,QAAQ,CAAC,GAAG,EAAe,OAAO,CAAM,GACvD,EAAa,GAAQ,CAAa;EACpC;EAkBA,IAAM,YAf6C;GACjD,IAAM,IAAW,IAAI,uBAAuB;IAC1C,EAAY;GACd,CAAC;GASD,OAPA,EAAS,QAAQ,GAAI;IACnB,iBAAiB;KAAC;KAAY;KAAS;IAAO;IAC9C,YAAY;IACZ,WAAW;IACX,SAAS;GACX,CAAC,SAEY,EAAS,WAAW;EACnC,EAEsB,CAAuB,GAEvC,KAAiC,MAA8B;GACnE,IAAM,IAAS,EAAM;GAErB,IAAI,EAAE,aAAkB,UAAU;GAElC,IAAM,IAAW,EAAO,QAAqB,SAAS;GAEtD,IAAI,CAAC,GAAU;GAEf,IAAM,IAAS,EAAyB,CAAQ;GAEhD,IAAI,CAAC,KAAU,EAAO,UAAU;GAEhC,IAAM,IAAa,EAAgB,MAAM,WAAW,MAAc,EAAU,UAAU,EAAO,KAAK;GAElG,AAAI,KAAc,KAChB,EAAW,IAAI,CAAU;EAE7B,GACM,IAAa,EAAG;EAEtB,AAAI,KACF,EAAW,iBAAiB,eAAe,CAA8C;EAG3F,IAAM,KAA0B,MAAsC;GACpE,IAAM,KAAkB,MAAiB;IACvC,IAAM,IAAS,EAAM;IAErB,IAAI,EAAE,aAAkB,UAAU;IAIlC,IAFkB,EAAO,QAAqB,oBAE1C,GAAW;KAGb,AAFA,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAa,EAAM,OAAO,CAAK;KAE/B;IACF;IAEA,IAAM,IAAW,EAAO,QAAqB,SAAS;IAEtD,IAAI,CAAC,GAAU;IAGf,AADA,EAAM,eAAe,GACrB,EAAM,gBAAgB;IAEtB,IAAM,IAAS,EAAyB,CAAQ;IAE3C,KAEL,EAAa,GAAQ,CAAK;GAC5B,GAEM,KAAqB,MAAwB;IACjD,IAAM,IAAS,EAAM;IAErB,IAAI,EAAE,aAAkB,UAAU;IAElC,IAAM,IAAW,EAAO,QAAqB,SAAS;IAEtD,IAAI,CAAC,GAAU;IAEf,IAAM,IAAS,EAAyB,CAAQ;IAEhD,IAAI,CAAC,GAAQ;IAEb,IAAM,IAAa,EAAgB,MAAM,WAAW,MAAc,EAAU,UAAU,EAAO,KAAK;IAElG,AAAI,KAAc,KAChB,EAAW,IAAI,CAAU;GAE7B;GAKA,OAHA,EAAO,iBAAiB,SAAS,CAAc,GAC/C,EAAO,iBAAiB,eAAe,CAAiB,SAE3C;IAEX,AADA,EAAO,oBAAoB,SAAS,CAAc,GAClD,EAAO,oBAAoB,eAAe,CAAiB;GAC7D;EACF,GAEI,IAA4C,MAC5C,IAA6C,MAE3C,MAAqB,MAAiC;GAC1D,IAAY,GAER,MAA2B,MAE/B,IAAuB,GACvB,IAAuB,MACvB,IAAyB,MAEpB,MAEL,IAAuB,EAAuB,CAAE,GAChD,IAAyB;EAC3B,GAEM,WAAqC;GACpC,MAED,MAA2B,KAAa,MAE5C,IAAuB,GACvB,IAAuB,EAAuB,CAAS,GACvD,IAAyB;EAC3B;EA2GA,OAzGA,QAAY;GAGV,AAFA,GAAuB,GAEnB,EAAO,SACL,KAAc,iBAAiB,KAAc,CAAC,EAAW,QAAQ,eAAe,KAAG,EAAW,YAAY,GAE9G,GAAe,KAEX,KAAc,iBAAiB,KAAc,EAAW,QAAQ,eAAe,KAAG,EAAW,YAAY;EAEjH,CAAC,GAMD,GAAU,IAAc,MAAe;GACrC,IAAU;GAEV,IAAM,IAAW,EAAW,YAAY,cAAgC,OAAO,KAAK;GAEpF,IAAI,CAAC,GAAU;GASf,AAPA,IAAU,GAEV,EAAS,aAAa,QAAQ,UAAU,GACxC,EAAS,aAAa,gBAAgB,KAAK,GAC3C,EAAS,aAAa,qBAAqB,MAAM,GACjD,EAAS,aAAa,iBAAiB,SAAS,GAChD,EAAS,aAAa,cAAc,OAAO,GAC3C,EAAS,aAAa,iBAAiB,GAAG,EAAQ,SAAS;GAE3D,IAAM,UAA+B;IAGnC,AAFK,EAAO,SAAO,EAAU,IAAM,OAAO,GAE1C,EAAe;GACjB;GAOA,OALA,EAAS,iBAAiB,SAAS,CAA4B,GAC/D,EAAS,iBAAiB,WAAW,CAA8B,GACnE,EAAS,iBAAiB,SAAS,CAAW,GAC9C,EAAS,iBAAiB,SAAS,CAAgB,SAEtC;IAMX,AALA,IAAU,MACV,IAAU,MACV,EAAS,oBAAoB,SAAS,CAA4B,GAClE,EAAS,oBAAoB,WAAW,CAA8B,GACtE,EAAS,oBAAoB,SAAS,CAAW,GACjD,EAAS,oBAAoB,SAAS,CAAgB;GACxD;EACF,CAAC,GAKD,QAAY;GACV,IAAI,CAAC,EAAY,OAAO;GAExB,IAAM,IAAK;GAEN,MAEL,EAAG,aAAa,iBAAiB,OAAO,EAAO,KAAK,CAAC,GAEjD,EAAW,QACb,EAAG,aAAa,iBAAiB,MAAM,IAEvC,EAAG,gBAAgB,eAAe,GAGhC,EAAM,MAAM,SACd,EAAG,aAAa,gBAAgB,MAAM,GACtC,EAAG,aAAa,qBAAqB,GAAG,EAAQ,OAAO,MAEvD,EAAG,gBAAgB,cAAc,GACjC,EAAG,gBAAgB,mBAAmB;EAE1C,CAAC,GAGD,QAAY;GACV,IAAI,CAAC,EAAY,OAAO;GAExB,IAAM,IAAK;GAEN,KAED,EAAG,UAAU,EAAM,UAAO,EAAG,QAAQ,EAAM;EACjD,CAAC,GAED,QAAgB;GAKd,AAJA,GAAY,oBAAoB,eAAe,CAA8C,GAC7F,IAAuB,GACvB,IAAuB,MACvB,IAAyB,MACzB,GAAc;EAChB,CAAC,GAQM,CAAI;;;;cAID,EAAY;uBACH,EAAM,MAAM,SAAS,GAAG;uBACxB,GAAiB;iCACP,EAAM,kBAAkB,CAAC,SAAS,QAAQ;uBAb9C,EAAM,OAAO,SAAS,KAAA,EAcvB;sBAbA,EAAM,MAAM,SAAS,KAAA,EAcvB;yBAbK,EAAM,SAAS,SAAS,KAAA,EAcvB;yBAbD,EAAM,SAAS,SAAS,KAAA,EAcvB;wBACR,EAAM,OAAO,SAAS,GAAG;uBAC1B,EAAM,MAAM,SAAS,GAAG;qBAC1B,EAAW;2BACL,GAAM;4BAjBC,EAAM,UAAU,QAAQ,KAAO,KAAA,EAkB5B;0BACX,EAAM,QAAQ,MAAM;sBACxB,EAAM,KAAK,SAAS,GAAG;mBAC1B,MAAkB;GAC3B,GAAW,YAAY,CAAC;EAC1B,EAAE;;;;;qBAMK,EAAW,IAAI,EAAe,QAAQ,CAAC,EAAA,CAAG,KACxC,MAAU,CAAI;;4BAEH,EAAM;4BACN,EAAW,MAAM,MAAM,MAAW,EAAO,UAAU,CAAK,CAAC,EAAE,SAAS,EAAM;;;;6BAIzE,EAAM,MAAM;8BACX,GAAW;sBACnB,EAAW,MAAM,MAAM,MAAW,EAAO,UAAU,CAAK,CAAC,EAAE,SAAS,EAAM;;iBAGlF,EAAE;;;;;;;;;;4BAUY,CAAC,GAAS,EAAE;sBAClB,GAAW;;;;;;;;;;;;;oBAab,GAAG,EAAQ,QAAQ;;;yBAGd,CAAC,EAAM,MAAM,MAAM;gBAC5B,EAAM,MAAM,SAAS,GAAG;;;;;oBAKpB,GAAG,EAAQ,WAAW;;2BAEf,EAAO,MAAM;eACzB,MAA2B;GAChC,IAAa;EACf,EAAE;;;sBAGY,GAAG,EAAQ,UAAU;yBAE/B,EAAO,SAAS,EAAgB,MAAM,SAAS,IAAI,UAAU,EAAgB,MAAM,SAAS,GAAG,OAAO,GAAG;8BACvF,EAAM,MAAM,SAAS,EAAM,YAAY,SAAS,UAAU;iBACvE,MAA2B;GAChC,GAAkB,CAAE;EACtB,EAAE;kBAEK,EAAO,QAER,GAAU,IACL,CAAI;;kBAKT,EAAgB,MAAM,WAAW,IAC/B,EAAe,QACV,CAAI;wFAC6D,EAAa,UAAU,GAAG;sBAC5F,EAAe,MAAM;;oBAKtB,CAAI;;kBAKN,EAAgB,MAAM,KAAK,GAAQ,MACjC,CAAI;;;;wBAID,GAAG,EAAQ,OAAO,IAAQ;uCACX,EAAM;uCACN,EAAO,MAAM;yCAEhC,OACE,EAAW,IAAI,EAAe,MAAM,SAAS,EAAO,KAAK,IAAI,EAAc,UAAU,EAAO,KAC9F,EAAE;mCACa,OAAO,EAAO,QAAQ,EAAE;2BAChC,+DAA+D,IAAQ,GAAG,MAAM;wCACnE,EAAa,UAAU,EAAM;yCAEjD,EAAW,IAAI,EAAe,MAAM,SAAS,EAAO,KAAK,IAAI,EAAc,UAAU,EAAO,MAAM;mCACnF,EAAO,SAAS;0BACzB,EAAO,MAAM;;;;;eAM1B,IA9CyB,GA+C1B;;;;CAIV;CACA,QAAQ,EAAE,gBAAgB,GAAK;CAC/B,QAAQ;EAAC;EAAiB;EAAoB;EAAqB;EAAa;CAAe;AACjG,CAAC"}
1
+ {"version":3,"file":"combobox.js","names":[],"sources":["../src/inputs/combobox/combobox.ts"],"sourcesContent":["import {\n bind,\n define,\n getHost,\n html,\n onCleanup,\n onElement,\n prop,\n ref,\n useEmit,\n useField,\n watchEffect,\n} from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport {\n createChoiceField,\n createInteraction,\n createListboxDropdown,\n type DropdownCloseReason,\n lifecycleSignal,\n type OverlayOpenReason,\n} from '../../core';\nimport { colorThemeMixin, reducedMotionMixin, roundedVariantMixin, srOnlyMixin } from '../../styles';\nimport type { AddEventListeners, ComponentSize, RoundedSize, ThemeColor } from '../../types';\nimport { dispatchNativeFieldEvent } from '../shared/native-field-event';\nimport type { ComboboxOptionInput, ComboboxOptionItem, OreComboboxEvents, OreComboboxProps } from './combobox.types';\nimport { filterOptions, getCreatableLabel, makeCreatableValue, parseSlottedOptions } from './combobox-options';\nimport '../../feedback/chip/chip';\nimport '../input/input';\nimport componentStyles from './combobox.css?inline';\n\nexport type { OreComboboxEvents, OreComboboxProps } from './combobox.types';\n\n/**\n * A searchable select field with multiple selection, custom option creation, and large-list support.\n *\n * @element ore-combobox\n *\n * @attr {string} value - Selected value(s). Use comma-separated for multiple.\n * @attr {boolean} multiple - Enable multiple selection\n * @attr {boolean} creatable - Allow users to create custom options from search query\n * @attr {boolean} no-filter - Disable client-side filtering (useful for server-side search)\n * @attr {string} placeholder - Placeholder text\n * @attr {boolean} required - Require a non-blank selection for native form validation\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n *\n * @fires input - Emitted when the selection changes.\n * @fires change - Emitted when the selection changes.\n * @fires open-change - Emitted when the dropdown state changes. detail: { open, reason }\n * @fires {CustomEvent} search - Emitted when user types. detail: { query: string }\n *\n * @slot - Slotted combobox options and option groups\n * @cssprop --combobox-dropdown-bg - Dropdown panel background color\n * @cssprop --combobox-dropdown-border-color - Dropdown panel border color\n * @cssprop --combobox-option-hover-bg - Option background on hover\n * @cssprop --combobox-option-focus-bg - Option background when keyboard-focused\n * @cssprop --combobox-option-selected-bg - Option background when selected\n * @cssprop --combobox-option-selected-focus-bg - Option background when selected and focused\n * @cssprop --input-bg - Field background (passed through to ore-input)\n * @cssprop --input-border-color - Field border color (passed through to ore-input)\n *\n * @part wrapper - Root wrapper around the entire field\n * @part label - Label element shown inside or outside the field\n * @part field - Field container that holds the trigger input and clear button\n * @part input - Search input used to filter and select options\n * @part clear-btn - Button that clears the current selection/query\n * @part dropdown - Popup list container for options\n * @part helper-text - Helper text displayed below the field\n * @example\n * ```html\n * <ore-combobox label=\"Country\" name=\"country\">\n * <ore-combobox-option value=\"us\">United States</ore-combobox-option>\n * <ore-combobox-option value=\"gb\">United Kingdom</ore-combobox-option>\n * <ore-combobox-option value=\"de\" disabled>Germany</ore-combobox-option>\n * </ore-combobox>\n * ```\n */\nexport const COMBOBOX_TAG = 'ore-combobox' as const;\ndefine<OreComboboxProps>(COMBOBOX_TAG, {\n formAssociated: true,\n props: {\n autoclose: prop.bool(false),\n color: prop.string<ThemeColor>(),\n creatable: prop.bool(false),\n disabled: prop.bool(false),\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n loading: prop.bool(false),\n multiple: prop.bool(false),\n name: prop.string(),\n 'no-filter': prop.bool(false),\n options: prop.data<ComboboxOptionInput[]>(),\n placeholder: prop.string('Select...'),\n required: prop.bool(false),\n rounded: prop.string<RoundedSize>(),\n size: prop.string<ComponentSize>(),\n success: prop.bool(false),\n value: prop.string(),\n variant: prop.string<'flat' | 'solid' | 'bordered' | 'outline' | 'ghost'>(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreComboboxEvents>();\n const watch = watchEffect;\n\n const query = signal('');\n\n // Element refs needed by the listbox dropdown.\n let inputEl: HTMLInputElement | null = null;\n let fieldEl: HTMLElement | null = null; // set to the ore-input host once it mounts\n let dropdownEl: HTMLElement | null = null;\n let listboxEl: HTMLElement | null = null;\n\n // Ref to the ore-input host; resolved when the template renders.\n const bitInputRef = ref<HTMLElement>();\n\n const abortSignal = lifecycleSignal(onCleanup);\n const choice = createChoiceField({\n disabled: props.disabled,\n error: props.error,\n helper: props.helper,\n label: props.label,\n labelPlacement: props['label-placement'],\n multiple: props.multiple,\n prefix: 'combobox',\n required: props.required,\n signal: abortSignal,\n value: props.value,\n });\n\n // filteredOptions signal declared before optionList so the getItems getter\n // captures the live signal reference rather than needing a factory indirection.\n const filteredOptions = signal<ComboboxOptionItem[]>([]);\n\n const optionList = createListboxDropdown<ComboboxOptionItem>({\n getBoundary: () => el,\n getFocusedOptionElement: () => dropdownEl?.querySelector<HTMLElement>('[data-focused]') ?? null,\n getItems: () => filteredOptions.value,\n getOptionId: (index) => `${choice.fieldId}-opt-${index}`,\n getPanel: () => dropdownEl,\n getReference: () => fieldEl,\n getTrigger: () => inputEl,\n isDisabled: () => choice.disabled.value,\n onClose: (reason) => {\n emit('open-change', { open: false, reason });\n\n if (!abortSignal.aborted) restoreQueryFromSelection();\n\n choice.triggerValidation('blur');\n },\n onOpen: (reason) => emit('open-change', { open: true, reason }),\n restoreFocus: false,\n signal: abortSignal,\n });\n\n const { disabled: isDisabled, fieldId: comboId, selectedValues, triggerValidation } = choice;\n\n choice.attachFormField(\n useField<string>({\n disabled: choice.disabled,\n onReset: choice.reset,\n toFormValue: (v) => v,\n validationMessage: choice.validationMessage,\n validity: choice.validity,\n value: choice.formValue,\n }),\n );\n\n const { focusedIndex, isOpen, scrollFocusedIntoView, updatePosition } = optionList;\n // ── State ────────────────────────────────────────────────────────────────\n const isMultiple = () => Boolean(props.multiple.value);\n const isCreatable = () => Boolean(props.creatable.value);\n const isNoFilter = () => Boolean(props['no-filter'].value);\n\n bind({\n attr: {\n open: () => (isOpen.value ? true : undefined),\n size: props.size,\n variant: props.variant,\n },\n });\n\n let lastQueryBeforeClear: string | null = null;\n let isRestoringQuery = false;\n\n const selectedValue = computed(() => selectedValues.value[0] ?? '');\n\n // Expose a native-like, string-valued `.value` property on the host.\n Object.defineProperty(el, 'value', {\n configurable: true,\n get: () => choice.formValue.value,\n set: (val: unknown) => {\n const v = val as string | string[] | null | undefined;\n\n if (Array.isArray(v)) {\n choice.setValues(v.map((entry) => String(entry ?? '')));\n\n return;\n }\n\n if (v == null || v === '') {\n choice.clear();\n\n return;\n }\n\n choice.setValues(isMultiple() ? String(v).split(',') : [String(v)]);\n },\n });\n\n const hasValue = () => selectedValues.value.length > 0;\n\n function focusLiveInput() {\n inputEl?.focus();\n }\n\n // ── Options ──────────────────────────────────────────────────────────────\n const slottedOptions = signal<ComboboxOptionItem[]>([]);\n const createdOptions = signal<ComboboxOptionItem[]>([]);\n const isLoading = () => Boolean(props.loading.value);\n\n function normalizeOption(option: ComboboxOptionInput): ComboboxOptionItem {\n return {\n disabled: Boolean(option.disabled),\n iconEl: option.iconEl ?? null,\n label: option.label ?? option.value,\n value: option.value,\n };\n }\n\n // Merged options: explicit prop value overrides slotted options.\n const allOptions = computed<ComboboxOptionItem[]>(() => {\n const optionsProp = props.options.value;\n const base = Array.isArray(optionsProp) ? optionsProp.map(normalizeOption) : slottedOptions.value;\n\n if (createdOptions.value.length === 0) return base;\n\n return [...base, ...createdOptions.value];\n });\n\n const selectionController = {\n clear: () => {\n choice.clear();\n },\n remove: (key: string) => {\n choice.removeValue(key);\n },\n select: (key: string) => {\n choice.selectValue(key);\n },\n toggle: (key: string) => {\n choice.toggleValue(key);\n },\n };\n\n function readOptions(elements: Element[] = Array.from(el.children)) {\n slottedOptions.value = parseSlottedOptions(elements);\n\n if (!isMultiple()) {\n const match = allOptions.value.find((option) => option.value === selectedValue.value);\n\n query.value = match?.label ?? selectedValue.value;\n }\n }\n\n // Initialize from light DOM immediately; onMounted/observer keep this in sync afterwards.\n readOptions();\n\n watch(() => {\n const nextOptions = filterOptions(allOptions.value, query.value, isNoFilter());\n\n filteredOptions.value = isMultiple()\n ? nextOptions.filter((option) => !selectedValues.value.includes(option.value))\n : nextOptions;\n });\n\n // \"Create\" option shown when creatable + query doesn't match any existing option\n const creatableLabel = computed(() => {\n return getCreatableLabel(query.value, isCreatable(), filteredOptions.value);\n });\n const inputPlaceholder = () =>\n isMultiple() && selectedValues.value.length > 0 ? '' : props.placeholder.value || '';\n\n function emitChange() {\n dispatchNativeFieldEvent(el, 'input');\n dispatchNativeFieldEvent(el, 'change');\n }\n\n function removeChip(event: Event): void {\n event.stopPropagation();\n\n const value = (event as CustomEvent<{ value?: string }>).detail?.value;\n\n if (value === undefined) return;\n\n selectionController.remove(value);\n emitChange();\n triggerValidation('change');\n }\n\n function restoreQueryFromSelection() {\n // Keep input text and selected value in sync whenever the popup closes.\n if (!isMultiple()) {\n const match = allOptions.value.find((option) => option.value === selectedValue.value);\n\n isRestoringQuery = true;\n query.value = match?.label ?? '';\n Promise.resolve().then(() => {\n isRestoringQuery = false;\n });\n\n return;\n }\n\n query.value = '';\n }\n\n watch(() => {\n if (isOpen.value && !isMultiple() && selectedValue.value && focusedIndex.value === -1 && query.value === '') {\n const selectedIndex = filteredOptions.value.findIndex((option) => option.value === selectedValue.value);\n\n if (selectedIndex >= 0) {\n optionList.set(selectedIndex);\n }\n }\n });\n\n // ── Open / Close ─────────────────────────────────────────────────────────\n function openPopup(clearFilter = true, reason: OverlayOpenReason = 'programmatic') {\n if (clearFilter) {\n lastQueryBeforeClear = query.value;\n query.value = '';\n }\n\n // Pre-compute focused index BEFORE opening so the first render has it set\n if (!isMultiple() && selectedValue.value) {\n const freshOptions = filterOptions(allOptions.value, '', isNoFilter());\n const selectedIndex = freshOptions.findIndex((option) => option.value === selectedValue.value);\n\n if (selectedIndex >= 0) {\n optionList.set(selectedIndex);\n }\n }\n\n optionList.open(reason);\n\n if (!isMultiple() && selectedValue.value && focusedIndex.value >= 0) {\n requestAnimationFrame(() => {\n scrollFocusedIntoView();\n });\n }\n }\n\n function closePopup(reason: DropdownCloseReason = 'programmatic') {\n optionList.close(reason);\n }\n\n const fieldPress = createInteraction({\n disabled: isDisabled,\n onPress: () => {\n if (!isOpen.value) openPopup(true, 'click');\n\n focusLiveInput();\n },\n });\n\n const enterPress = createInteraction({\n disabled: isDisabled,\n keys: ['Enter'],\n onPress: (originalEvent: Event) => {\n const opts = filteredOptions.value;\n\n if (isOpen.value && focusedIndex.value >= 0 && focusedIndex.value < opts.length) {\n selectOption(opts[focusedIndex.value], originalEvent);\n } else if (isOpen.value && focusedIndex.value === -1 && creatableLabel.value) {\n // Focused on the \"create\" item\n createOption(query.value, originalEvent);\n } else if (!isOpen.value) {\n openPopup(true, 'keyboard');\n }\n },\n });\n\n // ── Selection ────────────────────────────────────────────────────────────\n function selectOption(opt: ComboboxOptionItem, _originalEvent?: Event) {\n if (opt.disabled) return;\n\n if (isMultiple()) {\n selectionController.toggle(opt.value);\n query.value = '';\n emitChange();\n triggerValidation('change');\n\n if (props.autoclose.value) {\n closePopup();\n }\n\n // Keep dropdown open in multiple mode (unless autoclose is true)\n focusLiveInput();\n requestAnimationFrame(() => focusLiveInput());\n } else {\n selectionController.select(opt.value);\n query.value = opt.label;\n emitChange();\n triggerValidation('change');\n closePopup();\n focusLiveInput();\n }\n }\n function resolveOptionFromElement(optionEl: HTMLElement): ComboboxOptionItem | null {\n const indexAttr = optionEl.getAttribute('data-option-index');\n const index = indexAttr ? Number(indexAttr) : -1;\n\n if (Number.isInteger(index) && index >= 0 && index < filteredOptions.value.length) {\n return filteredOptions.value[index] ?? null;\n }\n\n const valueAttr = optionEl.getAttribute('data-option-value');\n\n if (valueAttr) {\n const byValue = filteredOptions.value.find((option) => option.value === valueAttr);\n\n if (byValue) return byValue;\n }\n\n const labelText = optionEl.querySelector('span')?.textContent?.trim() ?? optionEl.textContent?.trim() ?? '';\n\n if (!labelText) return null;\n\n return filteredOptions.value.find((option) => option.label === labelText || option.value === labelText) ?? null;\n }\n function clearValue(e: Event) {\n e.stopPropagation();\n selectionController.clear();\n query.value = '';\n emitChange();\n triggerValidation('change');\n focusLiveInput();\n }\n function handleInput(e: InputEvent) {\n const target = e.target as HTMLInputElement;\n const newValue = target.value;\n\n // Skip all input processing if we're in the middle of restoring the query\n // This prevents the clearing logic from firing during close/restore\n if (isRestoringQuery) {\n return;\n }\n\n if (newValue === query.value) return;\n\n query.value = newValue;\n\n if (!isMultiple()) {\n const currentItem = selectedValues.value[0];\n const currentLabel = currentItem\n ? (allOptions.value.find((o) => o.value === currentItem)?.label ?? currentItem)\n : '';\n\n // Preserve the current selection while typing. Selection should only\n // change when a new option is committed or when the user explicitly clears.\n const isJustOpening = newValue === '' && lastQueryBeforeClear === currentLabel;\n\n if (isJustOpening) {\n lastQueryBeforeClear = null;\n }\n }\n\n optionList.navigate('first');\n\n if (!isOpen.value) openPopup(false, 'keyboard');\n\n emit('search', { query: target.value });\n }\n function handleFocus() {\n // Intentionally no-op: open only on explicit click or keyboard.\n // Opening on every focus surprises users tabbing through a form.\n }\n\n // ── Keyboard Navigation ──────────────────────────────────────────────────\n function handleKeydown(e: KeyboardEvent) {\n if (isDisabled.value) return;\n\n if (optionList.handleKeydown(e)) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n\n if (!isOpen.value) {\n openPopup(true, 'keyboard');\n optionList.navigate('first');\n } else {\n optionList.navigate('next');\n }\n\n break;\n case 'ArrowUp':\n e.preventDefault();\n\n if (!isOpen.value) {\n openPopup(true, 'keyboard');\n } else {\n optionList.navigate('prev');\n }\n\n break;\n case 'Backspace':\n // In multiple mode, remove the last chip when the input is empty\n if (isMultiple() && !query.value && selectedValues.value.length > 0) {\n choice.removeValue(selectedValues.value[selectedValues.value.length - 1] ?? '');\n emitChange();\n triggerValidation('change');\n }\n\n break;\n case 'Enter':\n enterPress.handleKeydown(e);\n\n break;\n case 'Tab':\n closePopup('programmatic');\n break;\n default:\n break;\n }\n }\n\n // ── Create option ────────────────────────────────────────────────────────\n function createOption(rawQuery: string, originalEvent?: Event) {\n const actualLabel = rawQuery.trim();\n\n if (!actualLabel) return;\n\n const value = makeCreatableValue(actualLabel);\n const newOpt: ComboboxOptionItem = { disabled: false, iconEl: null, label: actualLabel, value };\n\n createdOptions.value = [...createdOptions.value, newOpt];\n selectOption(newOpt, originalEvent);\n }\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n const observeLightDomOptions = (): (() => void) => {\n const observer = new MutationObserver(() => {\n readOptions();\n });\n\n observer.observe(el, {\n attributeFilter: ['disabled', 'label', 'value'],\n attributes: true,\n childList: true,\n subtree: true,\n });\n\n return () => observer.disconnect();\n };\n\n const stopObserving = observeLightDomOptions();\n\n const handleShadowOptionPointerMove = (event: PointerEvent): void => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option || option.disabled) return;\n\n const focusedIdx = filteredOptions.value.findIndex((candidate) => candidate.value === option.value);\n\n if (focusedIdx >= 0) {\n optionList.set(focusedIdx);\n }\n };\n const shadowRoot = el.shadowRoot;\n\n if (shadowRoot) {\n shadowRoot.addEventListener('pointermove', handleShadowOptionPointerMove as EventListener);\n }\n\n const createListboxListeners = (listEl: HTMLElement): (() => void) => {\n const handleActivate = (event: Event) => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const createRow = target.closest<HTMLElement>('.no-results-create');\n\n if (createRow) {\n event.preventDefault();\n event.stopPropagation();\n createOption(query.value, event);\n\n return;\n }\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option) return;\n\n selectOption(option, event);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n const target = event.target;\n\n if (!(target instanceof Element)) return;\n\n const optionEl = target.closest<HTMLElement>('.option');\n\n if (!optionEl) return;\n\n const option = resolveOptionFromElement(optionEl);\n\n if (!option) return;\n\n const focusedIdx = filteredOptions.value.findIndex((candidate) => candidate.value === option.value);\n\n if (focusedIdx >= 0) {\n optionList.set(focusedIdx);\n }\n };\n\n listEl.addEventListener('click', handleActivate);\n listEl.addEventListener('pointermove', handlePointerMove);\n\n return () => {\n listEl.removeEventListener('click', handleActivate);\n listEl.removeEventListener('pointermove', handlePointerMove);\n };\n };\n\n let stopListboxListeners: (() => void) | null = null;\n let listboxListenersTarget: HTMLElement | null = null;\n\n const setListboxElement = (el: HTMLElement | null): void => {\n listboxEl = el;\n\n if (listboxListenersTarget === el) return;\n\n stopListboxListeners?.();\n stopListboxListeners = null;\n listboxListenersTarget = null;\n\n if (!el) return;\n\n stopListboxListeners = createListboxListeners(el);\n listboxListenersTarget = el;\n };\n\n const ensureListboxListeners = (): void => {\n if (!listboxEl) return;\n\n if (listboxListenersTarget === listboxEl && stopListboxListeners) return;\n\n stopListboxListeners?.();\n stopListboxListeners = createListboxListeners(listboxEl);\n listboxListenersTarget = listboxEl;\n };\n\n watch(() => {\n ensureListboxListeners();\n\n if (isOpen.value) {\n if (dropdownEl && 'showPopover' in dropdownEl && !dropdownEl.matches(':popover-open')) dropdownEl.showPopover();\n\n updatePosition();\n } else {\n if (dropdownEl && 'hidePopover' in dropdownEl && dropdownEl.matches(':popover-open')) dropdownEl.hidePopover();\n }\n });\n\n // Once ore-input is in the DOM, grab its inner <input> from its shadow root\n // and attach all combobox-specific ARIA + event handlers imperatively.\n // MUST be registered before the ARIA effects below so inputEl is set first\n // when bitInputRef fires (effects run in registration order).\n onElement(bitInputRef, (bitInputEl) => {\n fieldEl = bitInputEl;\n\n const rawInput = bitInputEl.shadowRoot?.querySelector<HTMLInputElement>('input') ?? null;\n\n if (!rawInput) return;\n\n inputEl = rawInput;\n\n rawInput.setAttribute('role', 'combobox');\n rawInput.setAttribute('autocomplete', 'off');\n rawInput.setAttribute('aria-autocomplete', 'list');\n rawInput.setAttribute('aria-haspopup', 'listbox');\n rawInput.setAttribute('spellcheck', 'false');\n rawInput.setAttribute('aria-controls', `${comboId}-listbox`);\n\n const handleInputClick = (): void => {\n if (!isOpen.value) openPopup(true, 'click');\n\n focusLiveInput();\n };\n\n rawInput.addEventListener('input', handleInput as EventListener);\n rawInput.addEventListener('keydown', handleKeydown as EventListener);\n rawInput.addEventListener('focus', handleFocus);\n rawInput.addEventListener('click', handleInputClick);\n\n return () => {\n inputEl = null;\n fieldEl = null;\n rawInput.removeEventListener('input', handleInput as EventListener);\n rawInput.removeEventListener('keydown', handleKeydown as EventListener);\n rawInput.removeEventListener('focus', handleFocus);\n rawInput.removeEventListener('click', handleInputClick);\n };\n });\n\n // Reactively sync combobox-specific ARIA attrs that ore-input doesn't manage.\n // Uses bitInputRef (a signal) as the gate so the effect re-runs when the\n // inner input mounts — inputEl is a plain variable and would not trigger re-runs.\n watch(() => {\n if (!bitInputRef.value) return;\n\n const el = inputEl;\n\n if (!el) return;\n\n el.setAttribute('aria-expanded', String(isOpen.value));\n\n if (isDisabled.value) {\n el.setAttribute('aria-disabled', 'true');\n } else {\n el.removeAttribute('aria-disabled');\n }\n\n if (props.error.value) {\n el.setAttribute('aria-invalid', 'true');\n el.setAttribute('aria-errormessage', `${comboId}-error`);\n } else {\n el.removeAttribute('aria-invalid');\n el.removeAttribute('aria-errormessage');\n }\n });\n\n // Reactively sync the query signal into the raw input value.\n watch(() => {\n if (!bitInputRef.value) return;\n\n const el = inputEl;\n\n if (!el) return;\n\n if (el.value !== query.value) el.value = query.value;\n });\n\n onCleanup(() => {\n shadowRoot?.removeEventListener('pointermove', handleShadowOptionPointerMove as EventListener);\n stopListboxListeners?.();\n stopListboxListeners = null;\n listboxListenersTarget = null;\n stopObserving();\n });\n\n const inputColor = () => props.color?.value ?? undefined;\n const inputSize = () => props.size?.value ?? undefined;\n const inputVariant = () => props.variant?.value ?? undefined;\n const inputRounded = () => props.rounded?.value ?? undefined;\n const inputFullwidth = () => (props.fullwidth.value ? true : undefined);\n\n return html`\n <slot></slot>\n <ore-input\n class=\"trigger\"\n ref=${bitInputRef}\n label=\"${() => props.label.value ?? ''}\"\n placeholder=\"${inputPlaceholder}\"\n label-placement=\"${() => props['label-placement'].value ?? 'inset'}\"\n color=\"${inputColor}\"\n size=\"${inputSize}\"\n variant=\"${inputVariant}\"\n rounded=\"${inputRounded}\"\n helper=\"${() => props.helper.value ?? ''}\"\n error=\"${() => props.error.value ?? ''}\"\n ?disabled=\"${isDisabled}\"\n ?required=\"${() => false}\"\n ?fullwidth=\"${inputFullwidth}\"\n ?success=\"${() => props.success.value}\"\n name=\"${() => props.name.value ?? ''}\"\n @click=\"${(e: MouseEvent) => {\n fieldPress.handleClick(e);\n }}\"\n part=\"wrapper\">\n <div slot=\"prefix\" class=\"chips-row\">\n <!-- Keep chip list diffing isolated so input node identity stays stable. -->\n <span class=\"chips-list\">\n ${() =>\n (isMultiple() ? selectedValues.value : []).map(\n (value) => html`\n <ore-chip\n value=${value}\n label=${allOptions.value.find((option) => option.value === value)?.label ?? value}\n mode=\"removable\"\n variant=\"flat\"\n size=\"sm\"\n color=\"${props.color}\"\n @remove=${removeChip}>\n ${allOptions.value.find((option) => option.value === value)?.label ?? value}\n </ore-chip>\n `,\n )}\n </span>\n </div>\n <span slot=\"suffix\" class=\"combobox-suffix\" aria-hidden=\"true\">\n <button\n class=\"clear-btn\"\n part=\"clear-btn\"\n type=\"button\"\n aria-label=\"Clear\"\n tabindex=\"-1\"\n ?hidden=${() => !hasValue()}\n @click=\"${clearValue}\">\n <ore-icon name=\"x\" size=\"12\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n <span class=\"combobox-suffix-end\">\n <span class=\"loader\"></span>\n <span class=\"chevron\">\n <ore-icon name=\"chevron-down\" size=\"14\" stroke-width=\"2\" aria-hidden=\"true\"></ore-icon>\n </span>\n </span>\n </span>\n </ore-input>\n <span\n class=\"sr-only\"\n id=\"${() => `${comboId}-error`}\"\n role=\"alert\"\n aria-live=\"assertive\"\n ?hidden=\"${() => !props.error.value}\">\n ${() => props.error.value ?? ''}\n </span>\n <div\n class=\"dropdown\"\n part=\"dropdown\"\n id=\"${() => `${comboId}-dropdown`}\"\n popover=\"manual\"\n ?data-open=${() => isOpen.value}\n ref=${(el: HTMLElement | null) => {\n dropdownEl = el;\n }}>\n <div\n role=\"listbox\"\n id=\"${() => `${comboId}-listbox`}\"\n style=\"${() =>\n isOpen.value && filteredOptions.value.length > 0 ? `height:${filteredOptions.value.length * 36}px;` : ''}\"\n aria-label=\"${() => props.label.value || props.placeholder.value || 'Options'}\"\n ref=${(el: HTMLElement | null) => {\n setListboxElement(el);\n }}>\n ${() => {\n if (!isOpen.value) return '';\n\n if (isLoading()) {\n return html`\n <div class=\"dropdown-loading\">Loading...</div>\n `;\n }\n\n if (filteredOptions.value.length === 0) {\n if (creatableLabel.value) {\n return html`\n <button type=\"button\" class=\"no-results-create\" ?data-focused=${() => focusedIndex.value === -1}>\n ${creatableLabel.value}\n </button>\n `;\n }\n\n return html`\n <div class=\"no-results\" role=\"presentation\">No results found</div>\n `;\n }\n\n return filteredOptions.value.map((option, index) => {\n return html`\n <div\n class=\"option\"\n role=\"option\"\n id=\"${`${comboId}-opt-${index}`}\"\n data-option-index=\"${index}\"\n data-option-value=\"${option.value}\"\n aria-selected=\"${() =>\n String(\n isMultiple() ? selectedValues.value.includes(option.value) : selectedValue.value === option.value,\n )}\"\n aria-disabled=\"${String(option.disabled)}\"\n style=\"${`position:absolute;top:0;left:0;right:0;transform:translateY(${index * 36}px);`}\"\n ?data-focused=${() => focusedIndex.value === index}\n ?data-selected=${() =>\n isMultiple() ? selectedValues.value.includes(option.value) : selectedValue.value === option.value}\n ?data-disabled=${option.disabled}>\n <span>${option.label}</span>\n <span class=\"option-check\" aria-hidden=\"true\">\n <ore-icon name=\"check\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </span>\n </div>\n `;\n });\n }}\n </div>\n </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [colorThemeMixin, reducedMotionMixin, roundedVariantMixin, srOnlyMixin, componentStyles],\n}) as unknown as AddEventListeners<OreComboboxEvents>;\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./core/ore.cjs");require("./_dev.cjs");const t=require("./styles/mixins/accessibility.css.cjs"),n=require("./core/announcer.cjs"),r=require("./core/nav.cjs"),i=require("./overlay/shared/use-dialog.cjs"),a=require("./overlay/command-palette/command-palette-items.cjs"),o=require("./overlay/command-palette/command-palette.css.cjs");let s=require("@vielzeug/ore"),c=require("@vielzeug/ripple"),l=require("@vielzeug/ripple/watch"),u=require("@vielzeug/keymap");var d=e=>e==null?void 0:e===``||e===`true`,f=`ore-command-palette-item`;(0,s.define)(f,{setup(){return s.html``}});var p=`ore-command-palette`;(0,s.define)(p,{props:{"default-open":s.prop.bool(!1),"empty-text":s.prop.string(`No results found.`),items:s.prop.data(),"keep-open-on-select":s.prop.bool(!1),label:s.prop.string(`Command palette`),loading:s.prop.bool(!1),"no-filter":s.prop.bool(!1),open:{default:void 0,parse:d},placeholder:s.prop.string(`Type a command or search…`),shortcut:s.prop.string(`mod+k`)},setup(t){let o=(0,s.getHost)(),d=(0,s.useEmit)(),f=e.lifecycleSignal(s.onCleanup),p=(0,s.ref)(),m=(0,s.ref)(),h=`cmdk-listbox`,g=null,_=(0,c.signal)(``),v=(0,c.signal)([]),y=()=>{v.value=a.parseSlottedItems([...o.children])};y();let b=new MutationObserver(y);b.observe(o,{characterData:!0,childList:!0,subtree:!0}),(0,s.onCleanup)(()=>b.disconnect());let x=(0,c.computed)(()=>{let e=t.items.value;return Array.isArray(e)?e.map(a.normalizeItem):v.value}),S=(0,c.computed)(()=>a.filterItems(x.value,_.value,!!t[`no-filter`].value)),C=(0,c.computed)(()=>a.buildRows(S.value)),w=r.createListControl({getItems:()=>S.value,isItemDisabled:e=>e.disabled,onNavigate:()=>{g?.querySelector(`[data-focused]`)?.scrollIntoView({block:`nearest`})},signal:f}),{focusedIndex:T}=w,E=()=>{_.value=``,w.reset()},{closeWithAnimation:D,overlay:O,requestClose:k,setupNativeListeners:A}=i.useDialogControl({defaultOpen:t[`default-open`],dialogRef:p,getPanelEl:()=>p.value?.querySelector(`.panel`),host:o,initialFocus:(0,c.computed)(()=>`.search-input`),isPersistent:()=>!1,onCleanup:s.onCleanup,onEvent:s.onEvent,onNativeClose:e=>{d(`open-change`,{open:!1,reason:e}),E()},onOpen:e=>{d(`open-change`,{open:!0,reason:e}),w.navigate(`first`)},openProp:t.open,performClose:()=>D(),returnFocus:(0,c.computed)(()=>!0)}),j=(0,u.createKeymap)();j.mount(window),(0,s.onCleanup)(()=>j.dispose());let M=null;(0,l.watch)(t.shortcut,e=>{M?.(),M=null;let t=(e??``).trim();if(t)try{M=j.bind(t,()=>{O.toggle(`keyboard`,`trigger`)})}catch(e){`${t}${e instanceof Error?e.message:String(e)}`}},{immediate:!0}),(0,s.onMounted)(()=>{A()});function N(e){e.disabled||(d(`select`,{item:e,label:e.label,value:e.value}),t[`keep-open-on-select`].value?m.value?.focus():k(`trigger`))}function P(e){let r=e.target.value;_.value=r,w.navigate(`first`),d(`search`,{query:r});let i=S.value.length;n.announce(i===0?t[`empty-text`].value:`${i} result${i===1?``:`s`} found`)}function F(e){if(!w.handleKeydown(e)&&e.key===`Enter`){let t=w.getActiveItem()??S.value.find(e=>!e.disabled);t&&(e.preventDefault(),N(t))}}return s.html`
2
- <dialog ref="${p}" class="dialog" part="dialog" aria-label="${t.label}" aria-modal="true">
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/accessibility.css.cjs"),t=require("./core/announcer.cjs");require("./_dev.cjs");const n=require("./core/ore.cjs"),r=require("./core/nav.cjs"),i=require("./overlay/shared/use-dialog.cjs"),a=require("./overlay/command-palette/command-palette-items.cjs"),o=require("./overlay/command-palette/command-palette.css.cjs");let s=require("@vielzeug/ore"),c=require("@vielzeug/ripple"),l=require("@vielzeug/keymap");var u=e=>e==null?void 0:e===``||e===`true`,d=`ore-command-palette-item`;(0,s.define)(d,{setup(){return s.html``}});var f=`ore-command-palette`;(0,s.define)(f,{props:{"default-open":s.prop.bool(!1),"empty-text":s.prop.string(`No results found.`),items:s.prop.data(),"keep-open-on-select":s.prop.bool(!1),label:s.prop.string(`Command palette`),loading:s.prop.bool(!1),"no-filter":s.prop.bool(!1),open:{default:void 0,parse:u},placeholder:s.prop.string(`Type a command or search…`),shortcut:s.prop.string(`mod+k`)},setup(e){let o=(0,s.getHost)(),u=(0,s.useEmit)(),d=n.lifecycleSignal(s.onCleanup),f=(0,s.ref)(),p=(0,s.ref)(),m=`cmdk-listbox`,h=null,g=(0,c.signal)(``),_=(0,c.signal)([]),v=()=>{_.value=a.parseSlottedItems([...o.children])};v();let y=new MutationObserver(v);y.observe(o,{characterData:!0,childList:!0,subtree:!0}),(0,s.onCleanup)(()=>y.disconnect());let b=(0,c.computed)(()=>{let t=e.items.value;return Array.isArray(t)?t.map(a.normalizeItem):_.value}),x=(0,c.computed)(()=>a.filterItems(b.value,g.value,!!e[`no-filter`].value)),S=(0,c.computed)(()=>a.buildRows(x.value)),C=r.createListControl({getItems:()=>x.value,isItemDisabled:e=>e.disabled,onNavigate:()=>{h?.querySelector(`[data-focused]`)?.scrollIntoView({block:`nearest`})},signal:d}),{focusedIndex:w}=C,T=()=>{g.value=``,C.reset()},{closeWithAnimation:E,overlay:D,requestClose:O,setupNativeListeners:k}=i.useDialogControl({defaultOpen:e[`default-open`],dialogRef:f,getPanelEl:()=>f.value?.querySelector(`.panel`),host:o,initialFocus:(0,c.computed)(()=>`.search-input`),isPersistent:()=>!1,onCleanup:s.onCleanup,onEvent:s.onEvent,onNativeClose:e=>{u(`open-change`,{open:!1,reason:e}),T()},onOpen:e=>{u(`open-change`,{open:!0,reason:e}),C.navigate(`first`)},openProp:e.open,performClose:()=>E(),returnFocus:(0,c.computed)(()=>!0)}),A=(0,l.createKeymap)();A.mount(window),(0,s.onCleanup)(()=>A.dispose());let j=null;(0,c.watch)(e.shortcut,e=>{j?.(),j=null;let t=(e??``).trim();if(t)try{j=A.bind(t,()=>{D.toggle(`keyboard`,`trigger`)})}catch(e){`${t}${e instanceof Error?e.message:String(e)}`}},{immediate:!0}),(0,s.onMounted)(()=>{k()});function M(t){t.disabled||(u(`select`,{item:t,label:t.label,value:t.value}),e[`keep-open-on-select`].value?p.value?.focus():O(`trigger`))}function N(n){let r=n.target.value;g.value=r,C.navigate(`first`),u(`search`,{query:r});let i=x.value.length;t.announce(i===0?e[`empty-text`].value:`${i} result${i===1?``:`s`} found`)}function P(e){if(!C.handleKeydown(e)&&e.key===`Enter`){let t=C.getActiveItem()??x.value.find(e=>!e.disabled);t&&(e.preventDefault(),M(t))}}return s.html`
2
+ <dialog ref="${f}" class="dialog" part="dialog" aria-label="${e.label}" aria-modal="true">
3
3
  <div class="panel" part="panel">
4
4
  <div class="search" part="search">
5
5
  <span class="search-icon" aria-hidden="true"><ore-icon name="search" size="18"></ore-icon></span>
6
6
  <input
7
- ref="${m}"
7
+ ref="${p}"
8
8
  class="search-input"
9
9
  part="input"
10
10
  type="text"
@@ -13,38 +13,38 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
13
13
  spellcheck="false"
14
14
  aria-expanded="true"
15
15
  aria-autocomplete="list"
16
- aria-controls="${h}"
17
- aria-activedescendant="${()=>T.value>=0?`${h}-opt-${T.value}`:``}"
18
- placeholder="${t.placeholder}"
19
- value="${_}"
20
- @input="${P}"
21
- @keydown="${F}" />
22
- <span class="search-loader" ?hidden="${()=>!t.loading.value}" aria-hidden="true"></span>
16
+ aria-controls="${m}"
17
+ aria-activedescendant="${()=>w.value>=0?`${m}-opt-${w.value}`:``}"
18
+ placeholder="${e.placeholder}"
19
+ value="${g}"
20
+ @input="${N}"
21
+ @keydown="${P}" />
22
+ <span class="search-loader" ?hidden="${()=>!e.loading.value}" aria-hidden="true"></span>
23
23
  </div>
24
24
  <div
25
25
  class="listbox"
26
26
  part="listbox"
27
27
  role="listbox"
28
- id="${h}"
28
+ id="${m}"
29
29
  aria-label="Commands"
30
- ref="${e=>{g=e}}">
31
- <div class="empty" role="presentation" ?hidden="${()=>t.loading.value||C.value.length>0}">
32
- ${()=>t[`empty-text`].value}
30
+ ref="${e=>{h=e}}">
31
+ <div class="empty" role="presentation" ?hidden="${()=>e.loading.value||S.value.length>0}">
32
+ ${()=>e[`empty-text`].value}
33
33
  </div>
34
- ${()=>C.value.map(e=>e.type===`group`?s.html`
34
+ ${()=>S.value.map(e=>e.type===`group`?s.html`
35
35
  <div class="group-heading" role="presentation">${e.group}</div>
36
36
  `:s.html`
37
37
  <div
38
38
  class="item"
39
39
  part="item"
40
40
  role="option"
41
- id="${`${h}-opt-${e.idx}`}"
42
- aria-selected="${()=>String(T.value===e.idx)}"
41
+ id="${`${m}-opt-${e.idx}`}"
42
+ aria-selected="${()=>String(w.value===e.idx)}"
43
43
  aria-disabled="${()=>String(e.item.disabled)}"
44
- ?data-focused="${()=>T.value===e.idx}"
44
+ ?data-focused="${()=>w.value===e.idx}"
45
45
  ?data-disabled="${()=>e.item.disabled}"
46
- @click="${t=>{t.stopPropagation(),N(e.item)}}"
47
- @pointerenter="${()=>{w.set(e.idx)}}">
46
+ @click="${t=>{t.stopPropagation(),M(e.item)}}"
47
+ @pointerenter="${()=>{C.set(e.idx)}}">
48
48
  ${e.item.icon?s.html`
49
49
  <span class="item-icon" aria-hidden="true">
50
50
  <ore-icon name="${e.item.icon}" size="16"></ore-icon>
@@ -78,5 +78,5 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
78
78
  </div>
79
79
  </div>
80
80
  </dialog>
81
- `},styles:[t.reducedMotionMixin,o.default]}),exports.COMMAND_PALETTE_ITEM_TAG=f,exports.COMMAND_PALETTE_TAG=p;
81
+ `},styles:[e.reducedMotionMixin,o.default]}),exports.COMMAND_PALETTE_ITEM_TAG=d,exports.COMMAND_PALETTE_TAG=f;
82
82
  //# sourceMappingURL=command-palette.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-palette.cjs","names":[],"sources":["../src/overlay/command-palette/command-palette.ts"],"sourcesContent":["import { createKeymap } from '@vielzeug/keymap';\nimport { define, html, ref, prop, getHost, onCleanup, onEvent, onMounted, useEmit } from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport { watch } from '@vielzeug/ripple/watch';\n\nimport type { CommandPaletteItem, OreCommandPaletteEvents, OreCommandPaletteProps } from './command-palette.types';\n\nimport { warn } from '../../_dev';\nimport { announce, lifecycleSignal, createListControl } from '../../core';\nimport { reducedMotionMixin } from '../../styles';\nimport { useDialogControl } from '../shared/use-dialog';\nimport { buildRows, filterItems, normalizeItem, parseSlottedItems, splitShortcutKeys } from './command-palette-items';\nimport '../../content/icon/icon';\nimport componentStyles from './command-palette.css?inline';\n\nexport type { OreCommandPaletteEvents, OreCommandPaletteProps } from './command-palette.types';\n\nconst parseOptionalBool = (value: string | null): boolean | undefined =>\n value == null ? undefined : value === '' || value === 'true';\n\n/**\n * A pure data node describing one command. Never rendered directly — `ore-command-palette`\n * reads its attributes/text content and renders the visible row itself.\n *\n * @element ore-command-palette-item\n *\n * @attr {string} value - Value emitted by the `select` event and matched against the search query\n * @attr {string} label - Explicit label text; falls back to the element's text content\n * @attr {string} group - Group heading the item is clustered under\n * @attr {string} shortcut - Display-only keyboard hint rendered at the end of the row, one `<kbd>` per `+`-separated key (e.g. `\"⌘+S\"` renders two keycaps; a literal `+` key isn't representable — spell it out, e.g. `\"Ctrl+Plus\"`)\n * @attr {boolean} disabled - Excludes the item from keyboard navigation and selection\n *\n * @slot icon - Optional leading icon content\n *\n * @example\n * ```html\n * <ore-command-palette-item value=\"new-file\" group=\"File\" shortcut=\"⌘+N\">New File</ore-command-palette-item>\n * ```\n */\nexport const COMMAND_PALETTE_ITEM_TAG = 'ore-command-palette-item' as const;\ndefine(COMMAND_PALETTE_ITEM_TAG, {\n setup() {\n return html``;\n },\n});\n\n/**\n * A searchable, keyboard-driven list of commands presented in a centered modal —\n * the \"⌘K\" pattern popularized by editors and productivity apps. Built on the\n * native `<dialog>` element (focus trap, top-layer stacking, `Escape`-to-close)\n * and `@vielzeug/keymap` for the global shortcut that opens it.\n *\n * @element ore-command-palette\n * @element ore-command-palette-item - Slotted command definition (place in default slot)\n *\n * @attr {boolean} open - Controls the open state of the palette\n * @attr {boolean} default-open - Initial uncontrolled open state\n * @attr {string} label - Accessible label for the dialog (screen-reader-only heading)\n * @attr {string} placeholder - Placeholder text for the search input\n * @attr {string} shortcut - Global keyboard shortcut (keymap syntax) that toggles the palette. Default `\"mod+k\"`; set to `\"\"` to disable\n * @attr {boolean} no-filter - Disable built-in client-side filtering (for server-driven search)\n * @attr {boolean} loading - Shows a loading row below the search input\n * @attr {string} empty-text - Message shown when no item matches the query\n * @attr {boolean} keep-open-on-select - Keep the palette open after an item is selected\n *\n * @fires open-change - Fired when the palette state changes. detail: `{ open, reason }`\n * @fires search - Fired on every keystroke in the search input. detail: `{ query }`\n * @fires select - Fired when a command is chosen (click or `Enter`). detail: `{ value, label, item }`\n *\n * @slot - `<ore-command-palette-item>` elements (alternative/supplement to the `items` prop)\n *\n * @cssprop --command-palette-bg - Panel background color\n * @cssprop --command-palette-border-color - Panel border color\n * @cssprop --command-palette-radius - Panel border radius\n * @cssprop --command-palette-shadow - Panel drop shadow\n * @cssprop --command-palette-max-width - Maximum panel width\n * @cssprop --command-palette-backdrop - Backdrop overlay color\n * @cssprop --command-palette-option-hover-bg - Item background on hover\n * @cssprop --command-palette-option-focus-bg - Item background when keyboard-focused\n *\n * @part dialog - Dialog root container\n * @part panel - Panel container\n * @part input - Search input\n * @part listbox - Listbox of matching commands\n *\n * @example\n * ```html\n * <ore-command-palette label=\"Command palette\" placeholder=\"Type a command…\">\n * <ore-command-palette-item value=\"new-file\" group=\"File\" shortcut=\"⌘+N\">New File</ore-command-palette-item>\n * <ore-command-palette-item value=\"open-file\" group=\"File\" shortcut=\"⌘+O\">Open File…</ore-command-palette-item>\n * <ore-command-palette-item value=\"toggle-theme\" group=\"View\">Toggle Theme</ore-command-palette-item>\n * </ore-command-palette>\n * ```\n */\nexport const COMMAND_PALETTE_TAG = 'ore-command-palette' as const;\ndefine<OreCommandPaletteProps>(COMMAND_PALETTE_TAG, {\n props: {\n 'default-open': prop.bool(false),\n 'empty-text': prop.string('No results found.'),\n items: prop.data<OreCommandPaletteProps['items']>(),\n 'keep-open-on-select': prop.bool(false),\n label: prop.string('Command palette'),\n loading: prop.bool(false),\n 'no-filter': prop.bool(false),\n open: { default: undefined as boolean | undefined, parse: parseOptionalBool },\n placeholder: prop.string('Type a command or search…'),\n shortcut: prop.string('mod+k'),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreCommandPaletteEvents>();\n const abortSignal = lifecycleSignal(onCleanup);\n\n const dialogRef = ref<HTMLDialogElement>();\n const searchInputRef = ref<HTMLInputElement>();\n const listboxId = 'cmdk-listbox';\n\n let listboxEl: HTMLElement | null = null;\n\n const query = signal('');\n\n // ── Items: slotted <ore-command-palette-item> elements, merged with the `items` prop ──\n // Items are pure data nodes (see `ore-command-palette-item`'s own doc comment) — they're\n // never projected through a `<slot>`, just read directly off the host's light DOM. That\n // sidesteps `useSlots()`/`slotchange` entirely: a plain MutationObserver on the host\n // already covers everything `slotchange` would (an item added or removed) *and* the case\n // it can't — an already-assigned item's own text/attributes changing. For items written\n // as static, inline HTML, the browser's parser can insert the last item before appending\n // its text-node child; without watching `characterData`, that would permanently cache an\n // empty label, since nothing else re-triggers once the element itself stops changing.\n const slottedItems = signal<CommandPaletteItem[]>([]);\n\n const reparseSlottedItems = (): void => {\n slottedItems.value = parseSlottedItems([...el.children]);\n };\n\n reparseSlottedItems();\n\n const lightDomObserver = new MutationObserver(reparseSlottedItems);\n\n lightDomObserver.observe(el, { characterData: true, childList: true, subtree: true });\n onCleanup(() => lightDomObserver.disconnect());\n\n const allItems = computed<CommandPaletteItem[]>(() => {\n const explicit = props.items.value;\n\n return Array.isArray(explicit) ? explicit.map(normalizeItem) : slottedItems.value;\n });\n\n const filteredItems = computed(() => filterItems(allItems.value, query.value, Boolean(props['no-filter'].value)));\n const rows = computed(() => buildRows(filteredItems.value));\n\n // ── Keyboard navigation over the filtered list (Up/Down/Home/End) ──\n const scrollFocusedIntoView = (): void => {\n listboxEl?.querySelector<HTMLElement>('[data-focused]')?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<CommandPaletteItem>({\n getItems: () => filteredItems.value,\n isItemDisabled: (item) => item.disabled,\n onNavigate: scrollFocusedIntoView,\n signal: abortSignal,\n });\n const { focusedIndex } = list;\n\n // ── Dialog chrome: native <dialog>, focus trap, Escape, backdrop click ──\n const resetSearch = (): void => {\n query.value = '';\n list.reset();\n };\n\n const { closeWithAnimation, overlay, requestClose, setupNativeListeners } = useDialogControl({\n defaultOpen: props['default-open'],\n dialogRef,\n getPanelEl: () => dialogRef.value?.querySelector<HTMLElement>('.panel'),\n host: el,\n initialFocus: computed(() => '.search-input'),\n isPersistent: () => false,\n onCleanup,\n onEvent,\n onNativeClose: (reason) => {\n emit('open-change', { open: false, reason });\n resetSearch();\n },\n onOpen: (reason) => {\n emit('open-change', { open: true, reason });\n list.navigate('first');\n },\n openProp: props.open,\n performClose: () => closeWithAnimation(),\n returnFocus: computed(() => true),\n });\n\n // ── Global keyboard shortcut (opens/closes the palette from anywhere) ──\n const globalKeymap = createKeymap();\n\n globalKeymap.mount(window);\n onCleanup(() => globalKeymap.dispose());\n\n let unbindShortcut: (() => void) | null = null;\n\n watch(\n props.shortcut,\n (shortcutStr) => {\n unbindShortcut?.();\n unbindShortcut = null;\n\n const trimmed = (shortcutStr ?? '').trim();\n\n if (!trimmed) return;\n\n try {\n unbindShortcut = globalKeymap.bind(trimmed, () => {\n overlay.toggle('keyboard', 'trigger');\n });\n } catch (error) {\n warn(`invalid \"shortcut\" value \"${trimmed}\" — ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n { immediate: true },\n );\n\n onMounted(() => {\n setupNativeListeners();\n });\n\n // ── Selection ────────────────────────────────────────────────────────────\n function selectItem(item: CommandPaletteItem): void {\n if (item.disabled) return;\n\n emit('select', { item, label: item.label, value: item.value });\n\n if (props['keep-open-on-select'].value) {\n searchInputRef.value?.focus();\n } else {\n requestClose('trigger');\n }\n }\n\n function handleInput(e: Event): void {\n const value = (e.target as HTMLInputElement).value;\n\n query.value = value;\n list.navigate('first');\n emit('search', { query: value });\n\n const count = filteredItems.value.length;\n\n announce(count === 0 ? props['empty-text'].value! : `${count} result${count === 1 ? '' : 's'} found`);\n }\n\n function handleKeydown(e: KeyboardEvent): void {\n if (list.handleKeydown(e)) return;\n\n if (e.key === 'Enter') {\n // `list.navigate('first')` (called on open and on every keystroke) already keeps\n // the focused row off a disabled item, so this fallback is only ever reached when\n // nothing has been focused yet — but it mirrors `selectItem`'s own disabled guard\n // rather than blindly grabbing index 0, in case that navigate-on-open wiring ever\n // changes.\n const active = list.getActiveItem() ?? filteredItems.value.find((item) => !item.disabled);\n\n if (active) {\n e.preventDefault();\n selectItem(active);\n }\n }\n }\n\n return html`\n <dialog ref=\"${dialogRef}\" class=\"dialog\" part=\"dialog\" aria-label=\"${props.label}\" aria-modal=\"true\">\n <div class=\"panel\" part=\"panel\">\n <div class=\"search\" part=\"search\">\n <span class=\"search-icon\" aria-hidden=\"true\"><ore-icon name=\"search\" size=\"18\"></ore-icon></span>\n <input\n ref=\"${searchInputRef}\"\n class=\"search-input\"\n part=\"input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-expanded=\"true\"\n aria-autocomplete=\"list\"\n aria-controls=\"${listboxId}\"\n aria-activedescendant=\"${() => (focusedIndex.value >= 0 ? `${listboxId}-opt-${focusedIndex.value}` : '')}\"\n placeholder=\"${props.placeholder}\"\n value=\"${query}\"\n @input=\"${handleInput}\"\n @keydown=\"${handleKeydown}\" />\n <span class=\"search-loader\" ?hidden=\"${() => !props.loading.value}\" aria-hidden=\"true\"></span>\n </div>\n <div\n class=\"listbox\"\n part=\"listbox\"\n role=\"listbox\"\n id=\"${listboxId}\"\n aria-label=\"Commands\"\n ref=\"${(listEl: HTMLElement) => {\n listboxEl = listEl;\n }}\">\n <div class=\"empty\" role=\"presentation\" ?hidden=\"${() => props.loading.value || rows.value.length > 0}\">\n ${() => props['empty-text'].value}\n </div>\n ${() =>\n rows.value.map((row) =>\n row.type === 'group'\n ? html`\n <div class=\"group-heading\" role=\"presentation\">${row.group}</div>\n `\n : html`\n <div\n class=\"item\"\n part=\"item\"\n role=\"option\"\n id=\"${`${listboxId}-opt-${row.idx}`}\"\n aria-selected=\"${() => String(focusedIndex.value === row.idx)}\"\n aria-disabled=\"${() => String(row.item.disabled)}\"\n ?data-focused=\"${() => focusedIndex.value === row.idx}\"\n ?data-disabled=\"${() => row.item.disabled}\"\n @click=\"${(e: MouseEvent) => {\n e.stopPropagation();\n selectItem(row.item);\n }}\"\n @pointerenter=\"${() => {\n list.set(row.idx);\n }}\">\n ${\n row.item.icon\n ? html`\n <span class=\"item-icon\" aria-hidden=\"true\">\n <ore-icon name=\"${row.item.icon}\" size=\"16\"></ore-icon>\n </span>\n `\n : ''\n }\n <span class=\"item-label\">${row.item.label}</span>\n ${\n row.item.shortcut\n ? html`\n <span class=\"item-shortcut\">\n ${splitShortcutKeys(row.item.shortcut).map(\n (key) => html`\n <kbd>${key}</kbd>\n `,\n )}\n </span>\n `\n : ''\n }\n </div>\n `,\n )}\n </div>\n <div class=\"footer\" part=\"footer\">\n <span class=\"footer-hint\">\n <kbd>↑</kbd>\n <kbd>↓</kbd>\n Navigate\n </span>\n <span class=\"footer-hint\">\n <kbd>Enter</kbd>\n Select\n </span>\n <span class=\"footer-hint\">\n <kbd>Esc</kbd>\n Close\n </span>\n </div>\n </div>\n </dialog>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"command-palette.cjs","names":[],"sources":["../src/overlay/command-palette/command-palette.ts"],"sourcesContent":["import { createKeymap } from '@vielzeug/keymap';\nimport { define, getHost, html, onCleanup, onEvent, onMounted, prop, ref, useEmit } from '@vielzeug/ore';\nimport { computed, signal, watch } from '@vielzeug/ripple';\nimport { warn } from '../../_dev';\nimport { announce, createListControl, lifecycleSignal } from '../../core';\nimport { reducedMotionMixin } from '../../styles';\nimport { useDialogControl } from '../shared/use-dialog';\nimport type { CommandPaletteItem, OreCommandPaletteEvents, OreCommandPaletteProps } from './command-palette.types';\nimport { buildRows, filterItems, normalizeItem, parseSlottedItems, splitShortcutKeys } from './command-palette-items';\nimport '../../content/icon/icon';\nimport componentStyles from './command-palette.css?inline';\n\nexport type { OreCommandPaletteEvents, OreCommandPaletteProps } from './command-palette.types';\n\nconst parseOptionalBool = (value: string | null): boolean | undefined =>\n value == null ? undefined : value === '' || value === 'true';\n\n/**\n * A pure data node describing one command. Never rendered directly — `ore-command-palette`\n * reads its attributes/text content and renders the visible row itself.\n *\n * @element ore-command-palette-item\n *\n * @attr {string} value - Value emitted by the `select` event and matched against the search query\n * @attr {string} label - Explicit label text; falls back to the element's text content\n * @attr {string} group - Group heading the item is clustered under\n * @attr {string} shortcut - Display-only keyboard hint rendered at the end of the row, one `<kbd>` per `+`-separated key (e.g. `\"⌘+S\"` renders two keycaps; a literal `+` key isn't representable — spell it out, e.g. `\"Ctrl+Plus\"`)\n * @attr {boolean} disabled - Excludes the item from keyboard navigation and selection\n *\n * @slot icon - Optional leading icon content\n *\n * @example\n * ```html\n * <ore-command-palette-item value=\"new-file\" group=\"File\" shortcut=\"⌘+N\">New File</ore-command-palette-item>\n * ```\n */\nexport const COMMAND_PALETTE_ITEM_TAG = 'ore-command-palette-item' as const;\ndefine(COMMAND_PALETTE_ITEM_TAG, {\n setup() {\n return html``;\n },\n});\n\n/**\n * A searchable, keyboard-driven list of commands presented in a centered modal —\n * the \"⌘K\" pattern popularized by editors and productivity apps. Built on the\n * native `<dialog>` element (focus trap, top-layer stacking, `Escape`-to-close)\n * and `@vielzeug/keymap` for the global shortcut that opens it.\n *\n * @element ore-command-palette\n * @element ore-command-palette-item - Slotted command definition (place in default slot)\n *\n * @attr {boolean} open - Controls the open state of the palette\n * @attr {boolean} default-open - Initial uncontrolled open state\n * @attr {string} label - Accessible label for the dialog (screen-reader-only heading)\n * @attr {string} placeholder - Placeholder text for the search input\n * @attr {string} shortcut - Global keyboard shortcut (keymap syntax) that toggles the palette. Default `\"mod+k\"`; set to `\"\"` to disable\n * @attr {boolean} no-filter - Disable built-in client-side filtering (for server-driven search)\n * @attr {boolean} loading - Shows a loading row below the search input\n * @attr {string} empty-text - Message shown when no item matches the query\n * @attr {boolean} keep-open-on-select - Keep the palette open after an item is selected\n *\n * @fires open-change - Fired when the palette state changes. detail: `{ open, reason }`\n * @fires search - Fired on every keystroke in the search input. detail: `{ query }`\n * @fires select - Fired when a command is chosen (click or `Enter`). detail: `{ value, label, item }`\n *\n * @slot - `<ore-command-palette-item>` elements (alternative/supplement to the `items` prop)\n *\n * @cssprop --command-palette-bg - Panel background color\n * @cssprop --command-palette-border-color - Panel border color\n * @cssprop --command-palette-radius - Panel border radius\n * @cssprop --command-palette-shadow - Panel drop shadow\n * @cssprop --command-palette-max-width - Maximum panel width\n * @cssprop --command-palette-backdrop - Backdrop overlay color\n * @cssprop --command-palette-option-hover-bg - Item background on hover\n * @cssprop --command-palette-option-focus-bg - Item background when keyboard-focused\n *\n * @part dialog - Dialog root container\n * @part panel - Panel container\n * @part input - Search input\n * @part listbox - Listbox of matching commands\n *\n * @example\n * ```html\n * <ore-command-palette label=\"Command palette\" placeholder=\"Type a command…\">\n * <ore-command-palette-item value=\"new-file\" group=\"File\" shortcut=\"⌘+N\">New File</ore-command-palette-item>\n * <ore-command-palette-item value=\"open-file\" group=\"File\" shortcut=\"⌘+O\">Open File…</ore-command-palette-item>\n * <ore-command-palette-item value=\"toggle-theme\" group=\"View\">Toggle Theme</ore-command-palette-item>\n * </ore-command-palette>\n * ```\n */\nexport const COMMAND_PALETTE_TAG = 'ore-command-palette' as const;\ndefine<OreCommandPaletteProps>(COMMAND_PALETTE_TAG, {\n props: {\n 'default-open': prop.bool(false),\n 'empty-text': prop.string('No results found.'),\n items: prop.data<OreCommandPaletteProps['items']>(),\n 'keep-open-on-select': prop.bool(false),\n label: prop.string('Command palette'),\n loading: prop.bool(false),\n 'no-filter': prop.bool(false),\n open: { default: undefined as boolean | undefined, parse: parseOptionalBool },\n placeholder: prop.string('Type a command or search…'),\n shortcut: prop.string('mod+k'),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreCommandPaletteEvents>();\n const abortSignal = lifecycleSignal(onCleanup);\n\n const dialogRef = ref<HTMLDialogElement>();\n const searchInputRef = ref<HTMLInputElement>();\n const listboxId = 'cmdk-listbox';\n\n let listboxEl: HTMLElement | null = null;\n\n const query = signal('');\n\n // ── Items: slotted <ore-command-palette-item> elements, merged with the `items` prop ──\n // Items are pure data nodes (see `ore-command-palette-item`'s own doc comment) — they're\n // never projected through a `<slot>`, just read directly off the host's light DOM. That\n // sidesteps `useSlots()`/`slotchange` entirely: a plain MutationObserver on the host\n // already covers everything `slotchange` would (an item added or removed) *and* the case\n // it can't — an already-assigned item's own text/attributes changing. For items written\n // as static, inline HTML, the browser's parser can insert the last item before appending\n // its text-node child; without watching `characterData`, that would permanently cache an\n // empty label, since nothing else re-triggers once the element itself stops changing.\n const slottedItems = signal<CommandPaletteItem[]>([]);\n\n const reparseSlottedItems = (): void => {\n slottedItems.value = parseSlottedItems([...el.children]);\n };\n\n reparseSlottedItems();\n\n const lightDomObserver = new MutationObserver(reparseSlottedItems);\n\n lightDomObserver.observe(el, { characterData: true, childList: true, subtree: true });\n onCleanup(() => lightDomObserver.disconnect());\n\n const allItems = computed<CommandPaletteItem[]>(() => {\n const explicit = props.items.value;\n\n return Array.isArray(explicit) ? explicit.map(normalizeItem) : slottedItems.value;\n });\n\n const filteredItems = computed(() => filterItems(allItems.value, query.value, Boolean(props['no-filter'].value)));\n const rows = computed(() => buildRows(filteredItems.value));\n\n // ── Keyboard navigation over the filtered list (Up/Down/Home/End) ──\n const scrollFocusedIntoView = (): void => {\n listboxEl?.querySelector<HTMLElement>('[data-focused]')?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<CommandPaletteItem>({\n getItems: () => filteredItems.value,\n isItemDisabled: (item) => item.disabled,\n onNavigate: scrollFocusedIntoView,\n signal: abortSignal,\n });\n const { focusedIndex } = list;\n\n // ── Dialog chrome: native <dialog>, focus trap, Escape, backdrop click ──\n const resetSearch = (): void => {\n query.value = '';\n list.reset();\n };\n\n const { closeWithAnimation, overlay, requestClose, setupNativeListeners } = useDialogControl({\n defaultOpen: props['default-open'],\n dialogRef,\n getPanelEl: () => dialogRef.value?.querySelector<HTMLElement>('.panel'),\n host: el,\n initialFocus: computed(() => '.search-input'),\n isPersistent: () => false,\n onCleanup,\n onEvent,\n onNativeClose: (reason) => {\n emit('open-change', { open: false, reason });\n resetSearch();\n },\n onOpen: (reason) => {\n emit('open-change', { open: true, reason });\n list.navigate('first');\n },\n openProp: props.open,\n performClose: () => closeWithAnimation(),\n returnFocus: computed(() => true),\n });\n\n // ── Global keyboard shortcut (opens/closes the palette from anywhere) ──\n const globalKeymap = createKeymap();\n\n globalKeymap.mount(window);\n onCleanup(() => globalKeymap.dispose());\n\n let unbindShortcut: (() => void) | null = null;\n\n watch(\n props.shortcut,\n (shortcutStr) => {\n unbindShortcut?.();\n unbindShortcut = null;\n\n const trimmed = (shortcutStr ?? '').trim();\n\n if (!trimmed) return;\n\n try {\n unbindShortcut = globalKeymap.bind(trimmed, () => {\n overlay.toggle('keyboard', 'trigger');\n });\n } catch (error) {\n warn(`invalid \"shortcut\" value \"${trimmed}\" — ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n { immediate: true },\n );\n\n onMounted(() => {\n setupNativeListeners();\n });\n\n // ── Selection ────────────────────────────────────────────────────────────\n function selectItem(item: CommandPaletteItem): void {\n if (item.disabled) return;\n\n emit('select', { item, label: item.label, value: item.value });\n\n if (props['keep-open-on-select'].value) {\n searchInputRef.value?.focus();\n } else {\n requestClose('trigger');\n }\n }\n\n function handleInput(e: Event): void {\n const value = (e.target as HTMLInputElement).value;\n\n query.value = value;\n list.navigate('first');\n emit('search', { query: value });\n\n const count = filteredItems.value.length;\n\n announce(count === 0 ? props['empty-text'].value! : `${count} result${count === 1 ? '' : 's'} found`);\n }\n\n function handleKeydown(e: KeyboardEvent): void {\n if (list.handleKeydown(e)) return;\n\n if (e.key === 'Enter') {\n // `list.navigate('first')` (called on open and on every keystroke) already keeps\n // the focused row off a disabled item, so this fallback is only ever reached when\n // nothing has been focused yet — but it mirrors `selectItem`'s own disabled guard\n // rather than blindly grabbing index 0, in case that navigate-on-open wiring ever\n // changes.\n const active = list.getActiveItem() ?? filteredItems.value.find((item) => !item.disabled);\n\n if (active) {\n e.preventDefault();\n selectItem(active);\n }\n }\n }\n\n return html`\n <dialog ref=\"${dialogRef}\" class=\"dialog\" part=\"dialog\" aria-label=\"${props.label}\" aria-modal=\"true\">\n <div class=\"panel\" part=\"panel\">\n <div class=\"search\" part=\"search\">\n <span class=\"search-icon\" aria-hidden=\"true\"><ore-icon name=\"search\" size=\"18\"></ore-icon></span>\n <input\n ref=\"${searchInputRef}\"\n class=\"search-input\"\n part=\"input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-expanded=\"true\"\n aria-autocomplete=\"list\"\n aria-controls=\"${listboxId}\"\n aria-activedescendant=\"${() => (focusedIndex.value >= 0 ? `${listboxId}-opt-${focusedIndex.value}` : '')}\"\n placeholder=\"${props.placeholder}\"\n value=\"${query}\"\n @input=\"${handleInput}\"\n @keydown=\"${handleKeydown}\" />\n <span class=\"search-loader\" ?hidden=\"${() => !props.loading.value}\" aria-hidden=\"true\"></span>\n </div>\n <div\n class=\"listbox\"\n part=\"listbox\"\n role=\"listbox\"\n id=\"${listboxId}\"\n aria-label=\"Commands\"\n ref=\"${(listEl: HTMLElement) => {\n listboxEl = listEl;\n }}\">\n <div class=\"empty\" role=\"presentation\" ?hidden=\"${() => props.loading.value || rows.value.length > 0}\">\n ${() => props['empty-text'].value}\n </div>\n ${() =>\n rows.value.map((row) =>\n row.type === 'group'\n ? html`\n <div class=\"group-heading\" role=\"presentation\">${row.group}</div>\n `\n : html`\n <div\n class=\"item\"\n part=\"item\"\n role=\"option\"\n id=\"${`${listboxId}-opt-${row.idx}`}\"\n aria-selected=\"${() => String(focusedIndex.value === row.idx)}\"\n aria-disabled=\"${() => String(row.item.disabled)}\"\n ?data-focused=\"${() => focusedIndex.value === row.idx}\"\n ?data-disabled=\"${() => row.item.disabled}\"\n @click=\"${(e: MouseEvent) => {\n e.stopPropagation();\n selectItem(row.item);\n }}\"\n @pointerenter=\"${() => {\n list.set(row.idx);\n }}\">\n ${\n row.item.icon\n ? html`\n <span class=\"item-icon\" aria-hidden=\"true\">\n <ore-icon name=\"${row.item.icon}\" size=\"16\"></ore-icon>\n </span>\n `\n : ''\n }\n <span class=\"item-label\">${row.item.label}</span>\n ${\n row.item.shortcut\n ? html`\n <span class=\"item-shortcut\">\n ${splitShortcutKeys(row.item.shortcut).map(\n (key) => html`\n <kbd>${key}</kbd>\n `,\n )}\n </span>\n `\n : ''\n }\n </div>\n `,\n )}\n </div>\n <div class=\"footer\" part=\"footer\">\n <span class=\"footer-hint\">\n <kbd>↑</kbd>\n <kbd>↓</kbd>\n Navigate\n </span>\n <span class=\"footer-hint\">\n <kbd>Enter</kbd>\n Select\n </span>\n <span class=\"footer-hint\">\n <kbd>Esc</kbd>\n Close\n </span>\n </div>\n </div>\n </dialog>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
@@ -1,14 +1,13 @@
1
- import { lifecycleSignal as e } from "./core/ore.js";
1
+ import { reducedMotionMixin as e } from "./styles/mixins/accessibility.css.js";
2
+ import { announce as t } from "./core/announcer.js";
2
3
  import "./_dev.js";
3
- import { reducedMotionMixin as t } from "./styles/mixins/accessibility.css.js";
4
- import { announce as n } from "./core/announcer.js";
4
+ import { lifecycleSignal as n } from "./core/ore.js";
5
5
  import { createListControl as r } from "./core/nav.js";
6
6
  import { useDialogControl as i } from "./overlay/shared/use-dialog.js";
7
7
  import { buildRows as a, filterItems as o, normalizeItem as s, parseSlottedItems as c, splitShortcutKeys as l } from "./overlay/command-palette/command-palette-items.js";
8
8
  import u from "./overlay/command-palette/command-palette.css.js";
9
9
  import { define as d, getHost as f, html as p, onCleanup as m, onEvent as h, onMounted as g, prop as _, ref as v, useEmit as y } from "@vielzeug/ore";
10
- import { computed as b, signal as x } from "@vielzeug/ripple";
11
- import { watch as S } from "@vielzeug/ripple/watch";
10
+ import { computed as b, signal as x, watch as S } from "@vielzeug/ripple";
12
11
  import { createKeymap as C } from "@vielzeug/keymap";
13
12
  //#region src/overlay/command-palette/command-palette.ts
14
13
  var w = (e) => e == null ? void 0 : e === "" || e === "true", T = "ore-command-palette-item";
@@ -32,8 +31,8 @@ d(E, {
32
31
  placeholder: _.string("Type a command or search…"),
33
32
  shortcut: _.string("mod+k")
34
33
  },
35
- setup(t) {
36
- let u = f(), d = y(), _ = e(m), w = v(), T = v(), E = "cmdk-listbox", D = null, O = x(""), k = x([]), A = () => {
34
+ setup(e) {
35
+ let u = f(), d = y(), _ = n(m), w = v(), T = v(), E = "cmdk-listbox", D = null, O = x(""), k = x([]), A = () => {
37
36
  k.value = c([...u.children]);
38
37
  };
39
38
  A();
@@ -44,9 +43,9 @@ d(E, {
44
43
  subtree: !0
45
44
  }), m(() => j.disconnect());
46
45
  let M = b(() => {
47
- let e = t.items.value;
48
- return Array.isArray(e) ? e.map(s) : k.value;
49
- }), N = b(() => o(M.value, O.value, !!t["no-filter"].value)), P = b(() => a(N.value)), F = r({
46
+ let t = e.items.value;
47
+ return Array.isArray(t) ? t.map(s) : k.value;
48
+ }), N = b(() => o(M.value, O.value, !!e["no-filter"].value)), P = b(() => a(N.value)), F = r({
50
49
  getItems: () => N.value,
51
50
  isItemDisabled: (e) => e.disabled,
52
51
  onNavigate: () => {
@@ -56,7 +55,7 @@ d(E, {
56
55
  }), { focusedIndex: I } = F, L = () => {
57
56
  O.value = "", F.reset();
58
57
  }, { closeWithAnimation: R, overlay: z, requestClose: B, setupNativeListeners: V } = i({
59
- defaultOpen: t["default-open"],
58
+ defaultOpen: e["default-open"],
60
59
  dialogRef: w,
61
60
  getPanelEl: () => w.value?.querySelector(".panel"),
62
61
  host: u,
@@ -76,13 +75,13 @@ d(E, {
76
75
  reason: e
77
76
  }), F.navigate("first");
78
77
  },
79
- openProp: t.open,
78
+ openProp: e.open,
80
79
  performClose: () => R(),
81
80
  returnFocus: b(() => !0)
82
81
  }), H = C();
83
82
  H.mount(window), m(() => H.dispose());
84
83
  let U = null;
85
- S(t.shortcut, (e) => {
84
+ S(e.shortcut, (e) => {
86
85
  U?.(), U = null;
87
86
  let t = (e ?? "").trim();
88
87
  if (t) try {
@@ -95,18 +94,18 @@ d(E, {
95
94
  }, { immediate: !0 }), g(() => {
96
95
  V();
97
96
  });
98
- function W(e) {
99
- e.disabled || (d("select", {
100
- item: e,
101
- label: e.label,
102
- value: e.value
103
- }), t["keep-open-on-select"].value ? T.value?.focus() : B("trigger"));
97
+ function W(t) {
98
+ t.disabled || (d("select", {
99
+ item: t,
100
+ label: t.label,
101
+ value: t.value
102
+ }), e["keep-open-on-select"].value ? T.value?.focus() : B("trigger"));
104
103
  }
105
- function G(e) {
106
- let r = e.target.value;
104
+ function G(n) {
105
+ let r = n.target.value;
107
106
  O.value = r, F.navigate("first"), d("search", { query: r });
108
107
  let i = N.value.length;
109
- n(i === 0 ? t["empty-text"].value : `${i} result${i === 1 ? "" : "s"} found`);
108
+ t(i === 0 ? e["empty-text"].value : `${i} result${i === 1 ? "" : "s"} found`);
110
109
  }
111
110
  function K(e) {
112
111
  if (!F.handleKeydown(e) && e.key === "Enter") {
@@ -115,7 +114,7 @@ d(E, {
115
114
  }
116
115
  }
117
116
  return p`
118
- <dialog ref="${w}" class="dialog" part="dialog" aria-label="${t.label}" aria-modal="true">
117
+ <dialog ref="${w}" class="dialog" part="dialog" aria-label="${e.label}" aria-modal="true">
119
118
  <div class="panel" part="panel">
120
119
  <div class="search" part="search">
121
120
  <span class="search-icon" aria-hidden="true"><ore-icon name="search" size="18"></ore-icon></span>
@@ -131,11 +130,11 @@ d(E, {
131
130
  aria-autocomplete="list"
132
131
  aria-controls="${E}"
133
132
  aria-activedescendant="${() => I.value >= 0 ? `${E}-opt-${I.value}` : ""}"
134
- placeholder="${t.placeholder}"
133
+ placeholder="${e.placeholder}"
135
134
  value="${O}"
136
135
  @input="${G}"
137
136
  @keydown="${K}" />
138
- <span class="search-loader" ?hidden="${() => !t.loading.value}" aria-hidden="true"></span>
137
+ <span class="search-loader" ?hidden="${() => !e.loading.value}" aria-hidden="true"></span>
139
138
  </div>
140
139
  <div
141
140
  class="listbox"
@@ -146,8 +145,8 @@ d(E, {
146
145
  ref="${(e) => {
147
146
  D = e;
148
147
  }}">
149
- <div class="empty" role="presentation" ?hidden="${() => t.loading.value || P.value.length > 0}">
150
- ${() => t["empty-text"].value}
148
+ <div class="empty" role="presentation" ?hidden="${() => e.loading.value || P.value.length > 0}">
149
+ ${() => e["empty-text"].value}
151
150
  </div>
152
151
  ${() => P.value.map((e) => e.type === "group" ? p`
153
152
  <div class="group-heading" role="presentation">${e.group}</div>
@@ -202,7 +201,7 @@ d(E, {
202
201
  </dialog>
203
202
  `;
204
203
  },
205
- styles: [t, u]
204
+ styles: [e, u]
206
205
  });
207
206
  //#endregion
208
207
  export { T as COMMAND_PALETTE_ITEM_TAG, E as COMMAND_PALETTE_TAG };