@vielzeug/refine 2.0.3 → 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 (521) 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.cjs.map +1 -1
  119. package/dist/content/text/text.css.js +1 -1
  120. package/dist/content/text/text.css.js.map +1 -1
  121. package/dist/content/text/text.d.ts +1 -1
  122. package/dist/content/text/text.d.ts.map +1 -1
  123. package/dist/copy-command.cjs.map +1 -1
  124. package/dist/copy-command.js.map +1 -1
  125. package/dist/core/checkable.cjs +1 -1
  126. package/dist/core/checkable.cjs.map +1 -1
  127. package/dist/core/checkable.d.ts.map +1 -1
  128. package/dist/core/checkable.js +4 -4
  129. package/dist/core/checkable.js.map +1 -1
  130. package/dist/core/choice-field.cjs +1 -1
  131. package/dist/core/choice-field.cjs.map +1 -1
  132. package/dist/core/choice-field.d.ts.map +1 -1
  133. package/dist/core/choice-field.js +1 -2
  134. package/dist/core/choice-field.js.map +1 -1
  135. package/dist/core/date-picker.cjs +1 -1
  136. package/dist/core/date-picker.cjs.map +1 -1
  137. package/dist/core/date-picker.d.ts.map +1 -1
  138. package/dist/core/date-picker.js +3 -3
  139. package/dist/core/date-picker.js.map +1 -1
  140. package/dist/core/index.d.ts +17 -17
  141. package/dist/core/index.d.ts.map +1 -1
  142. package/dist/core/option-list.cjs +1 -1
  143. package/dist/core/option-list.cjs.map +1 -1
  144. package/dist/core/option-list.d.ts.map +1 -1
  145. package/dist/core/option-list.js +4 -4
  146. package/dist/core/option-list.js.map +1 -1
  147. package/dist/core/overlay.cjs.map +1 -1
  148. package/dist/core/overlay.d.ts +2 -2
  149. package/dist/core/overlay.d.ts.map +1 -1
  150. package/dist/core/overlay.js.map +1 -1
  151. package/dist/core/positioner.cjs +1 -1
  152. package/dist/core/positioner.cjs.map +1 -1
  153. package/dist/core/positioner.d.ts +6 -1
  154. package/dist/core/positioner.d.ts.map +1 -1
  155. package/dist/core/positioner.js +11 -11
  156. package/dist/core/positioner.js.map +1 -1
  157. package/dist/core/ref-callback.cjs +1 -1
  158. package/dist/core/ref-callback.cjs.map +1 -1
  159. package/dist/core/ref-callback.d.ts.map +1 -1
  160. package/dist/core/ref-callback.js +1 -1
  161. package/dist/core/ref-callback.js.map +1 -1
  162. package/dist/core/signals.cjs +1 -1
  163. package/dist/core/signals.cjs.map +1 -1
  164. package/dist/core/signals.d.ts.map +1 -1
  165. package/dist/core/signals.js +1 -2
  166. package/dist/core/signals.js.map +1 -1
  167. package/dist/core/slider.cjs.map +1 -1
  168. package/dist/core/slider.d.ts.map +1 -1
  169. package/dist/core/slider.js.map +1 -1
  170. package/dist/core/spinner.cjs.map +1 -1
  171. package/dist/core/spinner.d.ts.map +1 -1
  172. package/dist/core/spinner.js.map +1 -1
  173. package/dist/core/text-field.cjs +1 -1
  174. package/dist/core/text-field.cjs.map +1 -1
  175. package/dist/core/text-field.js +1 -1
  176. package/dist/core/text-field.js.map +1 -1
  177. package/dist/custom-elements.json +4926 -4678
  178. package/dist/datagrid.cjs +114 -114
  179. package/dist/datagrid.cjs.map +1 -1
  180. package/dist/datagrid.js +42 -43
  181. package/dist/datagrid.js.map +1 -1
  182. package/dist/date-picker.cjs.map +1 -1
  183. package/dist/date-picker.js.map +1 -1
  184. package/dist/dialog.cjs.map +1 -1
  185. package/dist/dialog.js.map +1 -1
  186. package/dist/disclosure/accordion/accordion.d.ts.map +1 -1
  187. package/dist/disclosure/accordion-item/accordion-item.css.cjs +1 -1
  188. package/dist/disclosure/accordion-item/accordion-item.css.cjs.map +1 -1
  189. package/dist/disclosure/accordion-item/accordion-item.css.js +1 -1
  190. package/dist/disclosure/accordion-item/accordion-item.css.js.map +1 -1
  191. package/dist/disclosure/index.d.ts +6 -6
  192. package/dist/disclosure/index.d.ts.map +1 -1
  193. package/dist/disclosure/tab-item/tab-item.css.cjs.map +1 -1
  194. package/dist/disclosure/tab-item/tab-item.css.js.map +1 -1
  195. package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
  196. package/dist/disclosure/tabs/tabs.css.cjs +1 -1
  197. package/dist/disclosure/tabs/tabs.css.cjs.map +1 -1
  198. package/dist/disclosure/tabs/tabs.css.js +1 -1
  199. package/dist/disclosure/tabs/tabs.css.js.map +1 -1
  200. package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
  201. package/dist/drawer.cjs +5 -5
  202. package/dist/drawer.cjs.map +1 -1
  203. package/dist/drawer.js +26 -26
  204. package/dist/drawer.js.map +1 -1
  205. package/dist/feedback/alert/alert.css.cjs +1 -1
  206. package/dist/feedback/alert/alert.css.js +1 -1
  207. package/dist/feedback/async/async.d.ts +1 -1
  208. package/dist/feedback/async/async.d.ts.map +1 -1
  209. package/dist/feedback/badge/badge.css.cjs +1 -1
  210. package/dist/feedback/badge/badge.css.js +1 -1
  211. package/dist/feedback/badge/badge.d.ts.map +1 -1
  212. package/dist/feedback/chip/chip.css.cjs.map +1 -1
  213. package/dist/feedback/chip/chip.css.js.map +1 -1
  214. package/dist/feedback/chip/chip.d.ts.map +1 -1
  215. package/dist/feedback/index.d.ts +12 -12
  216. package/dist/feedback/index.d.ts.map +1 -1
  217. package/dist/feedback/progress/progress.d.ts.map +1 -1
  218. package/dist/feedback/skeleton/skeleton.d.ts.map +1 -1
  219. package/dist/feedback/toast/index.d.ts +1 -1
  220. package/dist/feedback/toast/index.d.ts.map +1 -1
  221. package/dist/feedback/toast/toast.css.cjs +1 -1
  222. package/dist/feedback/toast/toast.css.cjs.map +1 -1
  223. package/dist/feedback/toast/toast.css.js +1 -1
  224. package/dist/feedback/toast/toast.css.js.map +1 -1
  225. package/dist/feedback/toast/toast.d.ts +1 -1
  226. package/dist/feedback/toast/toast.d.ts.map +1 -1
  227. package/dist/feedback/typing-indicator/typing-indicator.d.ts.map +1 -1
  228. package/dist/file-input.cjs +67 -67
  229. package/dist/file-input.cjs.map +1 -1
  230. package/dist/file-input.js +129 -130
  231. package/dist/file-input.js.map +1 -1
  232. package/dist/frameworks/elements.d.ts +86 -0
  233. package/dist/frameworks/react.d.ts +18 -0
  234. package/dist/frameworks/vue.d.ts +16 -0
  235. package/dist/grid.cjs.map +1 -1
  236. package/dist/grid.js.map +1 -1
  237. package/dist/icon.cjs.map +1 -1
  238. package/dist/icon.js.map +1 -1
  239. package/dist/input.cjs +21 -21
  240. package/dist/input.cjs.map +1 -1
  241. package/dist/input.js +58 -58
  242. package/dist/input.js.map +1 -1
  243. package/dist/inputs/button/button.css.cjs +1 -1
  244. package/dist/inputs/button/button.css.cjs.map +1 -1
  245. package/dist/inputs/button/button.css.js +1 -1
  246. package/dist/inputs/button/button.css.js.map +1 -1
  247. package/dist/inputs/button/button.d.ts.map +1 -1
  248. package/dist/inputs/button-group/button-group.css.cjs.map +1 -1
  249. package/dist/inputs/button-group/button-group.css.js.map +1 -1
  250. package/dist/inputs/button-group/button-group.d.ts +1 -1
  251. package/dist/inputs/button-group/button-group.d.ts.map +1 -1
  252. package/dist/inputs/calendar/calendar.css.cjs +1 -1
  253. package/dist/inputs/calendar/calendar.css.cjs.map +1 -1
  254. package/dist/inputs/calendar/calendar.css.js +1 -1
  255. package/dist/inputs/calendar/calendar.css.js.map +1 -1
  256. package/dist/inputs/calendar/calendar.d.ts.map +1 -1
  257. package/dist/inputs/checkbox/checkbox.css.cjs +1 -1
  258. package/dist/inputs/checkbox/checkbox.css.js +1 -1
  259. package/dist/inputs/checkbox/checkbox.d.ts.map +1 -1
  260. package/dist/inputs/checkbox-group/checkbox-group.d.ts +1 -1
  261. package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -1
  262. package/dist/inputs/combobox/combobox.css.cjs +1 -1
  263. package/dist/inputs/combobox/combobox.css.js +1 -1
  264. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  265. package/dist/inputs/datagrid/datagrid-column.cjs.map +1 -1
  266. package/dist/inputs/datagrid/datagrid-column.d.ts.map +1 -1
  267. package/dist/inputs/datagrid/datagrid-column.js.map +1 -1
  268. package/dist/inputs/datagrid/datagrid-model.cjs +1 -1
  269. package/dist/inputs/datagrid/datagrid-model.cjs.map +1 -1
  270. package/dist/inputs/datagrid/datagrid-model.d.ts.map +1 -1
  271. package/dist/inputs/datagrid/datagrid-model.js +1 -2
  272. package/dist/inputs/datagrid/datagrid-model.js.map +1 -1
  273. package/dist/inputs/datagrid/datagrid.css.cjs +1 -1
  274. package/dist/inputs/datagrid/datagrid.css.cjs.map +1 -1
  275. package/dist/inputs/datagrid/datagrid.css.js +1 -1
  276. package/dist/inputs/datagrid/datagrid.css.js.map +1 -1
  277. package/dist/inputs/datagrid/datagrid.d.ts +1 -1
  278. package/dist/inputs/datagrid/datagrid.d.ts.map +1 -1
  279. package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
  280. package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
  281. package/dist/inputs/date-picker/date-picker.css.js +1 -1
  282. package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
  283. package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
  284. package/dist/inputs/file-input/file-input-upload.cjs +1 -1
  285. package/dist/inputs/file-input/file-input-upload.cjs.map +1 -1
  286. package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -1
  287. package/dist/inputs/file-input/file-input-upload.js +2 -3
  288. package/dist/inputs/file-input/file-input-upload.js.map +1 -1
  289. package/dist/inputs/file-input/file-input.css.cjs +1 -1
  290. package/dist/inputs/file-input/file-input.css.js +1 -1
  291. package/dist/inputs/file-input/file-input.d.ts.map +1 -1
  292. package/dist/inputs/index.d.ts +28 -28
  293. package/dist/inputs/index.d.ts.map +1 -1
  294. package/dist/inputs/input/input.css.cjs +1 -1
  295. package/dist/inputs/input/input.css.js +1 -1
  296. package/dist/inputs/input/input.d.ts.map +1 -1
  297. package/dist/inputs/message-composer/message-composer.css.cjs +1 -1
  298. package/dist/inputs/message-composer/message-composer.css.js +1 -1
  299. package/dist/inputs/message-composer/message-composer.d.ts +1 -1
  300. package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
  301. package/dist/inputs/number-input/number-input.d.ts.map +1 -1
  302. package/dist/inputs/otp-input/otp-input.d.ts.map +1 -1
  303. package/dist/inputs/radio/radio.css.cjs +1 -1
  304. package/dist/inputs/radio/radio.css.js +1 -1
  305. package/dist/inputs/radio/radio.d.ts.map +1 -1
  306. package/dist/inputs/radio-group/radio-group.d.ts +2 -2
  307. package/dist/inputs/radio-group/radio-group.d.ts.map +1 -1
  308. package/dist/inputs/rating/rating.d.ts.map +1 -1
  309. package/dist/inputs/select/select.css.cjs +1 -1
  310. package/dist/inputs/select/select.css.js +1 -1
  311. package/dist/inputs/select/select.d.ts.map +1 -1
  312. package/dist/inputs/shared/field-binding.cjs.map +1 -1
  313. package/dist/inputs/shared/field-binding.d.ts.map +1 -1
  314. package/dist/inputs/shared/field-binding.js.map +1 -1
  315. package/dist/inputs/shared/templates.cjs.map +1 -1
  316. package/dist/inputs/shared/templates.d.ts.map +1 -1
  317. package/dist/inputs/shared/templates.js.map +1 -1
  318. package/dist/inputs/slider/slider.d.ts.map +1 -1
  319. package/dist/inputs/switch/switch.css.cjs +1 -1
  320. package/dist/inputs/switch/switch.css.js +1 -1
  321. package/dist/inputs/switch/switch.d.ts.map +1 -1
  322. package/dist/inputs/textarea/textarea.css.cjs +1 -1
  323. package/dist/inputs/textarea/textarea.css.js +1 -1
  324. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  325. package/dist/inputs/time-picker/time-picker.css.cjs +1 -1
  326. package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -1
  327. package/dist/inputs/time-picker/time-picker.css.js +1 -1
  328. package/dist/inputs/time-picker/time-picker.css.js.map +1 -1
  329. package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
  330. package/dist/layout/box/box.d.ts.map +1 -1
  331. package/dist/layout/grid/grid.d.ts.map +1 -1
  332. package/dist/layout/index.d.ts +6 -6
  333. package/dist/layout/index.d.ts.map +1 -1
  334. package/dist/layout/navbar/navbar.css.cjs +1 -1
  335. package/dist/layout/navbar/navbar.css.js +1 -1
  336. package/dist/layout/navbar/navbar.d.ts.map +1 -1
  337. package/dist/layout/sidebar/sidebar-group.css.cjs +1 -1
  338. package/dist/layout/sidebar/sidebar-group.css.cjs.map +1 -1
  339. package/dist/layout/sidebar/sidebar-group.css.js +1 -1
  340. package/dist/layout/sidebar/sidebar-group.css.js.map +1 -1
  341. package/dist/layout/sidebar/sidebar.css.cjs +1 -1
  342. package/dist/layout/sidebar/sidebar.css.cjs.map +1 -1
  343. package/dist/layout/sidebar/sidebar.css.js +1 -1
  344. package/dist/layout/sidebar/sidebar.css.js.map +1 -1
  345. package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
  346. package/dist/list-item.cjs.map +1 -1
  347. package/dist/list-item.js.map +1 -1
  348. package/dist/list.cjs +2 -2
  349. package/dist/list.cjs.map +1 -1
  350. package/dist/list.js +15 -16
  351. package/dist/list.js.map +1 -1
  352. package/dist/marquee.cjs +1 -1
  353. package/dist/marquee.cjs.map +1 -1
  354. package/dist/marquee.js +1 -1
  355. package/dist/marquee.js.map +1 -1
  356. package/dist/menu.cjs +5 -5
  357. package/dist/menu.cjs.map +1 -1
  358. package/dist/menu.js +40 -41
  359. package/dist/menu.js.map +1 -1
  360. package/dist/message-composer.cjs +16 -16
  361. package/dist/message-composer.cjs.map +1 -1
  362. package/dist/message-composer.js +61 -61
  363. package/dist/message-composer.js.map +1 -1
  364. package/dist/navbar.cjs +9 -9
  365. package/dist/navbar.cjs.map +1 -1
  366. package/dist/navbar.js +1 -2
  367. package/dist/navbar.js.map +1 -1
  368. package/dist/navigation-menu.cjs +11 -0
  369. package/dist/navigation-menu.cjs.map +1 -0
  370. package/dist/navigation-menu.js +138 -0
  371. package/dist/navigation-menu.js.map +1 -0
  372. package/dist/number-input.cjs +24 -24
  373. package/dist/number-input.cjs.map +1 -1
  374. package/dist/number-input.js +41 -42
  375. package/dist/number-input.js.map +1 -1
  376. package/dist/otp-input.cjs +13 -13
  377. package/dist/otp-input.cjs.map +1 -1
  378. package/dist/otp-input.js +32 -33
  379. package/dist/otp-input.js.map +1 -1
  380. package/dist/overlay/command-palette/command-palette-items.cjs.map +1 -1
  381. package/dist/overlay/command-palette/command-palette-items.d.ts.map +1 -1
  382. package/dist/overlay/command-palette/command-palette-items.js.map +1 -1
  383. package/dist/overlay/command-palette/command-palette.css.cjs +1 -1
  384. package/dist/overlay/command-palette/command-palette.css.cjs.map +1 -1
  385. package/dist/overlay/command-palette/command-palette.css.js +1 -1
  386. package/dist/overlay/command-palette/command-palette.css.js.map +1 -1
  387. package/dist/overlay/command-palette/command-palette.d.ts.map +1 -1
  388. package/dist/overlay/dialog/dialog.css.cjs +1 -1
  389. package/dist/overlay/dialog/dialog.css.js +1 -1
  390. package/dist/overlay/dialog/dialog.d.ts.map +1 -1
  391. package/dist/overlay/drawer/drawer.css.cjs +1 -1
  392. package/dist/overlay/drawer/drawer.css.js +1 -1
  393. package/dist/overlay/drawer/drawer.d.ts +2 -2
  394. package/dist/overlay/drawer/drawer.d.ts.map +1 -1
  395. package/dist/overlay/index.d.ts +7 -5
  396. package/dist/overlay/index.d.ts.map +1 -1
  397. package/dist/overlay/menu/menu.css.cjs +1 -1
  398. package/dist/overlay/menu/menu.css.js +1 -1
  399. package/dist/overlay/menu/menu.d.ts +2 -2
  400. package/dist/overlay/menu/menu.d.ts.map +1 -1
  401. package/dist/overlay/navigation-menu/navigation-menu-item.css.cjs +2 -0
  402. package/dist/overlay/navigation-menu/navigation-menu-item.css.cjs.map +1 -0
  403. package/dist/overlay/navigation-menu/navigation-menu-item.css.js +6 -0
  404. package/dist/overlay/navigation-menu/navigation-menu-item.css.js.map +1 -0
  405. package/dist/overlay/navigation-menu/navigation-menu-panel.css.cjs +2 -0
  406. package/dist/overlay/navigation-menu/navigation-menu-panel.css.cjs.map +1 -0
  407. package/dist/overlay/navigation-menu/navigation-menu-panel.css.js +6 -0
  408. package/dist/overlay/navigation-menu/navigation-menu-panel.css.js.map +1 -0
  409. package/dist/overlay/navigation-menu/navigation-menu.css.cjs +2 -0
  410. package/dist/overlay/navigation-menu/navigation-menu.css.cjs.map +1 -0
  411. package/dist/overlay/navigation-menu/navigation-menu.css.js +6 -0
  412. package/dist/overlay/navigation-menu/navigation-menu.css.js.map +1 -0
  413. package/dist/overlay/navigation-menu/navigation-menu.d.ts +75 -0
  414. package/dist/overlay/navigation-menu/navigation-menu.d.ts.map +1 -0
  415. package/dist/overlay/popover/popover.d.ts +1 -1
  416. package/dist/overlay/popover/popover.d.ts.map +1 -1
  417. package/dist/overlay/shared/use-dialog.cjs +1 -1
  418. package/dist/overlay/shared/use-dialog.cjs.map +1 -1
  419. package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
  420. package/dist/overlay/shared/use-dialog.js +4 -5
  421. package/dist/overlay/shared/use-dialog.js.map +1 -1
  422. package/dist/overlay/shared/use-floating-trigger.cjs +1 -1
  423. package/dist/overlay/shared/use-floating-trigger.cjs.map +1 -1
  424. package/dist/overlay/shared/use-floating-trigger.d.ts.map +1 -1
  425. package/dist/overlay/shared/use-floating-trigger.js +1 -2
  426. package/dist/overlay/shared/use-floating-trigger.js.map +1 -1
  427. package/dist/overlay/tooltip/tooltip.d.ts +1 -1
  428. package/dist/overlay/tooltip/tooltip.d.ts.map +1 -1
  429. package/dist/pagination.cjs.map +1 -1
  430. package/dist/pagination.js.map +1 -1
  431. package/dist/popover.cjs +1 -1
  432. package/dist/popover.cjs.map +1 -1
  433. package/dist/popover.js +0 -1
  434. package/dist/popover.js.map +1 -1
  435. package/dist/progress.cjs.map +1 -1
  436. package/dist/progress.js.map +1 -1
  437. package/dist/radio-group.cjs +5 -5
  438. package/dist/radio-group.cjs.map +1 -1
  439. package/dist/radio-group.js +26 -27
  440. package/dist/radio-group.js.map +1 -1
  441. package/dist/radio.cjs +2 -2
  442. package/dist/radio.cjs.map +1 -1
  443. package/dist/radio.js +41 -41
  444. package/dist/radio.js.map +1 -1
  445. package/dist/rating.cjs +4 -4
  446. package/dist/rating.cjs.map +1 -1
  447. package/dist/rating.js +36 -36
  448. package/dist/rating.js.map +1 -1
  449. package/dist/refine.cjs +692 -683
  450. package/dist/refine.cjs.map +1 -1
  451. package/dist/refine.iife.js +692 -683
  452. package/dist/refine.iife.js.map +1 -1
  453. package/dist/refine.js +743 -734
  454. package/dist/refine.js.map +1 -1
  455. package/dist/select.cjs +42 -42
  456. package/dist/select.cjs.map +1 -1
  457. package/dist/select.js +146 -147
  458. package/dist/select.js.map +1 -1
  459. package/dist/separator.cjs.map +1 -1
  460. package/dist/separator.js.map +1 -1
  461. package/dist/sidebar.cjs +17 -17
  462. package/dist/sidebar.cjs.map +1 -1
  463. package/dist/sidebar.js +7 -8
  464. package/dist/sidebar.js.map +1 -1
  465. package/dist/skeleton.cjs +3 -3
  466. package/dist/skeleton.cjs.map +1 -1
  467. package/dist/skeleton.js +1 -2
  468. package/dist/skeleton.js.map +1 -1
  469. package/dist/slider.cjs +12 -12
  470. package/dist/slider.cjs.map +1 -1
  471. package/dist/slider.js +54 -55
  472. package/dist/slider.js.map +1 -1
  473. package/dist/step.cjs.map +1 -1
  474. package/dist/step.js.map +1 -1
  475. package/dist/stepper.cjs +2 -2
  476. package/dist/stepper.cjs.map +1 -1
  477. package/dist/stepper.js +8 -7
  478. package/dist/stepper.js.map +1 -1
  479. package/dist/styles/index.d.ts +2 -2
  480. package/dist/styles/index.d.ts.map +1 -1
  481. package/dist/styles/preflight.css +1 -1
  482. package/dist/styles/theme.css +15 -30
  483. package/dist/switch.cjs +3 -3
  484. package/dist/switch.cjs.map +1 -1
  485. package/dist/switch.js +28 -28
  486. package/dist/switch.js.map +1 -1
  487. package/dist/tab-item.cjs +2 -2
  488. package/dist/tab-item.cjs.map +1 -1
  489. package/dist/tab-item.js +21 -21
  490. package/dist/tab-item.js.map +1 -1
  491. package/dist/tab-panel.cjs +2 -2
  492. package/dist/tab-panel.cjs.map +1 -1
  493. package/dist/tab-panel.js +9 -9
  494. package/dist/tab-panel.js.map +1 -1
  495. package/dist/table.cjs +1 -1
  496. package/dist/table.cjs.map +1 -1
  497. package/dist/table.js +1 -1
  498. package/dist/table.js.map +1 -1
  499. package/dist/tabs.cjs +6 -6
  500. package/dist/tabs.cjs.map +1 -1
  501. package/dist/tabs.js +14 -15
  502. package/dist/tabs.js.map +1 -1
  503. package/dist/text.cjs.map +1 -1
  504. package/dist/text.js.map +1 -1
  505. package/dist/textarea.cjs +11 -11
  506. package/dist/textarea.cjs.map +1 -1
  507. package/dist/textarea.js +59 -59
  508. package/dist/textarea.js.map +1 -1
  509. package/dist/time-picker.cjs.map +1 -1
  510. package/dist/time-picker.js.map +1 -1
  511. package/dist/toast.cjs +16 -16
  512. package/dist/toast.cjs.map +1 -1
  513. package/dist/toast.js +20 -21
  514. package/dist/toast.js.map +1 -1
  515. package/dist/tooltip.cjs.map +1 -1
  516. package/dist/tooltip.js.map +1 -1
  517. package/dist/typing-indicator.cjs +1 -1
  518. package/dist/typing-indicator.cjs.map +1 -1
  519. package/dist/typing-indicator.js +1 -1
  520. package/dist/typing-indicator.js.map +1 -1
  521. package/package.json +104 -78
@@ -0,0 +1,138 @@
1
+ import { reducedMotionMixin as e } from "./styles/mixins/accessibility.css.js";
2
+ import { lifecycleSignal as t } from "./core/ore.js";
3
+ import { createOutsidePointerDismissal as n } from "./core/overlay.js";
4
+ import { createDropdownPositioner as r } from "./core/positioner.js";
5
+ import { disablableBundle as i } from "./shared/prop-bundles.js";
6
+ import a from "./overlay/navigation-menu/navigation-menu.css.js";
7
+ import o from "./overlay/navigation-menu/navigation-menu-item.css.js";
8
+ import s from "./overlay/navigation-menu/navigation-menu-panel.css.js";
9
+ import { createStableId as c, define as l, getHost as u, html as d, onCleanup as f, onMounted as p, prop as m, useEmit as h, useSlots as g } from "@vielzeug/ore";
10
+ import { computed as _, signal as v, watch as y } from "@vielzeug/ripple";
11
+ //#region src/overlay/navigation-menu/navigation-menu.ts
12
+ var b = (e) => e ?? void 0, x = "ore-navigation-menu-item";
13
+ l(x, {
14
+ props: {
15
+ disabled: m.bool(!1),
16
+ value: m.string("")
17
+ },
18
+ setup(e) {
19
+ return d`
20
+ <button class="trigger" type="button" ?disabled=${e.disabled}><slot></slot></button>
21
+ `;
22
+ },
23
+ styles: [o]
24
+ });
25
+ var S = "ore-navigation-menu-panel";
26
+ l(S, {
27
+ props: { for: m.string() },
28
+ setup() {
29
+ let e = g();
30
+ return d`
31
+ <div class="content" part="content"><slot></slot></div>
32
+ <div class="footer" part="footer" ?hidden=${() => !e.has("footer").value}><slot name="footer"></slot></div>
33
+ `;
34
+ },
35
+ styles: [s]
36
+ });
37
+ var C = "ore-navigation-menu";
38
+ l(C, {
39
+ props: {
40
+ ...i,
41
+ "close-on-select": m.bool(!0),
42
+ columns: m.number(),
43
+ "default-open": m.string(),
44
+ label: m.string("Navigation menu"),
45
+ open: {
46
+ default: void 0,
47
+ parse: b
48
+ },
49
+ placement: m.oneOf(["bottom-end", "bottom-start"], "bottom-start")
50
+ },
51
+ setup(e) {
52
+ let i = u(), a = h(), o = t(f), s = c("navigation-menu"), l = _(() => e.disabled.value), m = v(null), g = null, b = null, C = null, w = () => Array.from(i.querySelectorAll(`${x}:not([disabled])`)), T = (e) => e.getAttribute("value") ?? "", E = () => Array.from(i.querySelectorAll(S)), D = (e) => E().find((t) => t.getAttribute("for") === e) ?? null, O = () => e.open.value !== void 0, k = (e) => e.id ||= c("navigation-menu-panel"), A = r({
53
+ getFloating: () => b,
54
+ getPlacement: () => e.placement.value ?? "bottom-start",
55
+ getReference: () => g?.shadowRoot?.querySelector(".trigger") ?? g,
56
+ matchWidth: !1,
57
+ offsetPx: 8,
58
+ useClippingAncestor: !1
59
+ }), j = () => {
60
+ let t = e.columns.value;
61
+ return t === void 0 ? void 0 : Math.max(1, Math.trunc(t));
62
+ }, M = (e) => {
63
+ if (e.hidden = !1, e.dataset.open = "", "showPopover" in e) try {
64
+ e.matches(":popover-open") || e.showPopover();
65
+ } catch {}
66
+ }, N = (e) => {
67
+ if (delete e.dataset.open, "hidePopover" in e) try {
68
+ e.matches(":popover-open") && e.hidePopover();
69
+ } catch {}
70
+ e.hidden = !0;
71
+ }, P = (e) => {
72
+ let t = e === null ? null : D(e);
73
+ C?.(), C = null, m.value = e, g = e ? w().find((t) => T(t) === e) ?? null : null, b = t;
74
+ for (let t of w()) {
75
+ let n = T(t) === e, r = t.shadowRoot?.querySelector(".trigger");
76
+ t.setAttribute("aria-expanded", String(n)), r?.setAttribute("aria-expanded", String(n));
77
+ }
78
+ for (let e of E()) e !== t && N(e);
79
+ if (t) {
80
+ let e = j();
81
+ e !== void 0 && t.style.setProperty("--navigation-menu-panel-columns", String(e)), t.setAttribute("aria-labelledby", g?.id ?? ""), M(t), A.update(), C = A.startAutoUpdate?.() ?? null;
82
+ }
83
+ }, F = (e, t) => {
84
+ l.value || m.value === e || e !== null && !D(e) || (O() || P(e), a("open-change", {
85
+ open: e !== null,
86
+ reason: t,
87
+ value: e
88
+ }));
89
+ };
90
+ return f(() => {
91
+ C?.();
92
+ for (let e of E()) N(e);
93
+ }), n({
94
+ getTargets: () => [i, b],
95
+ isActive: () => m.value !== null,
96
+ onDismiss: () => F(null, "outsideClick"),
97
+ signal: o
98
+ }), p(() => {
99
+ let t = /* @__PURE__ */ new Set();
100
+ for (let t of E()) t.setAttribute("popover", "manual"), t.setAttribute("role", "region"), k(t), N(t), t.addEventListener("click", (n) => {
101
+ let r = n.target instanceof Element ? n.target.closest("a[href]") : null;
102
+ if (!r || !t.contains(r)) return;
103
+ let i = m.value;
104
+ i && (a("select", {
105
+ href: r.href,
106
+ value: i
107
+ }), e["close-on-select"].value && !r.closest("[data-navigation-menu-keep-open]") && F(null, "select"));
108
+ }, { signal: o });
109
+ document.addEventListener("keydown", (e) => {
110
+ e.key === "Escape" && m.value !== null && (e.preventDefault(), F(null, "escape"), g?.shadowRoot?.querySelector(".trigger")?.focus());
111
+ }, { signal: o });
112
+ for (let e of w()) {
113
+ let n = T(e), r = D(n);
114
+ if (!n || t.has(n) || !r) continue;
115
+ t.add(n), e.id ||= c("navigation-menu-trigger");
116
+ let i = e.shadowRoot?.querySelector(".trigger");
117
+ i && (i.setAttribute("aria-controls", k(r)), i.setAttribute("aria-haspopup", "true"), i.setAttribute("aria-expanded", "false"), e.setAttribute("aria-expanded", "false"), i.addEventListener("click", () => F(m.value === n ? null : n, "click"), { signal: o }), i.addEventListener("keydown", (t) => {
118
+ let r = w(), i = r.indexOf(e);
119
+ t.key === "ArrowLeft" || t.key === "ArrowRight" || t.key === "Home" || t.key === "End" ? (t.preventDefault(), (t.key === "Home" ? r[0] : t.key === "End" ? r.at(-1) : r[(i + (t.key === "ArrowRight" ? 1 : r.length - 1)) % r.length])?.shadowRoot?.querySelector(".trigger")?.focus()) : t.key === "ArrowDown" && (t.preventDefault(), F(n, "keyboard"), requestAnimationFrame(() => b?.querySelector("a, button, input, [tabindex]:not([tabindex=\"-1\"])")?.focus()));
120
+ }, { signal: o }));
121
+ }
122
+ e.open.value === void 0 ? e["default-open"].value && P(e["default-open"].value) : P(e.open.value);
123
+ }), y(e.open, (e) => {
124
+ e !== void 0 && P(e);
125
+ }), y(e.disabled, (e) => {
126
+ e && P(null);
127
+ }), d`
128
+ <nav class="triggers" aria-label="${e.label}" id="${s}"><slot></slot></nav>
129
+ <slot name="panel"></slot>
130
+ <slot name="footer"></slot>
131
+ `;
132
+ },
133
+ styles: [e, a]
134
+ });
135
+ //#endregion
136
+ export { x as NAVIGATION_MENU_ITEM_TAG, S as NAVIGATION_MENU_PANEL_TAG, C as NAVIGATION_MENU_TAG };
137
+
138
+ //# sourceMappingURL=navigation-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-menu.js","names":[],"sources":["../src/overlay/navigation-menu/navigation-menu.ts"],"sourcesContent":["import { createStableId, define, getHost, html, onCleanup, onMounted, prop, useEmit, useSlots } from '@vielzeug/ore';\nimport { computed, signal, watch } from '@vielzeug/ripple';\n\nimport type { OverlayOpenChangeDetail } from '../../core';\n\nimport { createDropdownPositioner, createOutsidePointerDismissal, lifecycleSignal } from '../../core';\nimport { disablableBundle } from '../../shared';\nimport { reducedMotionMixin } from '../../styles';\nimport hostStyles from './navigation-menu.css?inline';\nimport itemStyles from './navigation-menu-item.css?inline';\nimport panelStyles from './navigation-menu-panel.css?inline';\n\nexport type OreNavigationMenuEvents = {\n 'open-change': OverlayOpenChangeDetail & { value: string | null };\n select: NavigationMenuSelectDetail;\n};\n\nexport type NavigationMenuSelectDetail = {\n href: string;\n value: string;\n};\n\nexport type OreNavigationMenuItemProps = {\n disabled?: boolean;\n value: string;\n};\n\nexport type OreNavigationMenuProps = {\n /** Close after activating a panel link. */\n 'close-on-select'?: boolean;\n columns?: number;\n 'default-open'?: string;\n disabled?: boolean;\n /** Accessible label for the trigger region. */\n label?: string;\n open?: string;\n placement?: 'bottom-end' | 'bottom-start';\n};\n\nconst parseOptionalString = (value: string | null): string | undefined => value ?? undefined;\n\n/**\n * A trigger for an associated navigation menu panel.\n *\n * @element ore-navigation-menu-item\n *\n * @attr {boolean} disabled - Disables panel activation\n * @attr {string} value - Unique value matched by a panel's `for` attribute\n *\n * @slot - Trigger label and optional icon\n */\nexport const NAVIGATION_MENU_ITEM_TAG = 'ore-navigation-menu-item' as const;\ndefine<OreNavigationMenuItemProps>(NAVIGATION_MENU_ITEM_TAG, {\n props: { disabled: prop.bool(false), value: prop.string('') },\n setup(props) {\n return html`\n <button class=\"trigger\" type=\"button\" ?disabled=${props.disabled}><slot></slot></button>\n `;\n },\n styles: [itemStyles],\n});\n\n/**\n * An anchored navigation menu panel associated with an item.\n *\n * @element ore-navigation-menu-panel\n *\n * @attr {string} for - Value of the associated navigation menu item\n *\n * @slot - Panel content\n * @slot footer - Optional panel footer\n *\n * @part content - Grid container for panel content\n * @part footer - Container for optional footer content\n */\nexport const NAVIGATION_MENU_PANEL_TAG = 'ore-navigation-menu-panel' as const;\ndefine<{ for?: string }>(NAVIGATION_MENU_PANEL_TAG, {\n props: { for: prop.string() },\n setup() {\n const slots = useSlots();\n\n return html`\n <div class=\"content\" part=\"content\"><slot></slot></div>\n <div class=\"footer\" part=\"footer\" ?hidden=${() => !slots.has('footer').value}><slot name=\"footer\"></slot></div>\n `;\n },\n styles: [panelStyles],\n});\n\n/**\n * A horizontal set of triggers with anchored, non-modal navigation panels.\n *\n * @element ore-navigation-menu\n *\n * @attr {string} open - Controlled active trigger value\n * @attr {string} default-open - Initial uncontrolled active trigger value\n * @attr {boolean} close-on-select - Closes after activating a panel link\n * @attr {number} columns - Number of panel content columns\n * @attr {boolean} disabled - Disables all triggers\n * @attr {string} label - Accessible navigation region label\n * @attr {'bottom-start'|'bottom-end'} placement - Panel placement relative to its trigger\n *\n * @slot - Navigation menu items and panels\n *\n * @event open-change - Requested active panel change\n * @event select - A panel link was activated\n *\n * @cssprop --navigation-menu-panel-width - Maximum panel width\n * @cssprop --navigation-menu-panel-columns - Fallback number of panel content columns\n * @cssprop --navigation-menu-backdrop-blur - Frosted panel backdrop blur\n */\nexport const NAVIGATION_MENU_TAG = 'ore-navigation-menu' as const;\ndefine<OreNavigationMenuProps>(NAVIGATION_MENU_TAG, {\n props: {\n ...disablableBundle,\n 'close-on-select': prop.bool(true),\n columns: prop.number(),\n 'default-open': prop.string(),\n label: prop.string('Navigation menu'),\n open: { default: undefined as string | undefined, parse: parseOptionalString },\n placement: prop.oneOf(['bottom-end', 'bottom-start'] as const, 'bottom-start'),\n },\n setup(props) {\n const host = getHost();\n const emit = useEmit<OreNavigationMenuEvents>();\n const abortSignal = lifecycleSignal(onCleanup);\n const panelId = createStableId('navigation-menu');\n const isDisabled = computed(() => props.disabled.value);\n const activeValue = signal<string | null>(null);\n let activeTrigger: HTMLElement | null = null;\n let activePanel: HTMLElement | null = null;\n let stopPositioning: (() => void) | null = null;\n\n const items = () => Array.from(host.querySelectorAll<HTMLElement>(`${NAVIGATION_MENU_ITEM_TAG}:not([disabled])`));\n const valueOf = (item: HTMLElement) => item.getAttribute('value') ?? '';\n const panels = () => Array.from(host.querySelectorAll<HTMLElement>(NAVIGATION_MENU_PANEL_TAG));\n const panelFor = (value: string) => panels().find((panel) => panel.getAttribute('for') === value) ?? null;\n const isControlled = () => props.open.value !== undefined;\n const panelIdFor = (panel: HTMLElement) => (panel.id ||= createStableId('navigation-menu-panel'));\n\n const positioner = createDropdownPositioner({\n getFloating: () => activePanel,\n getPlacement: () => props.placement.value ?? 'bottom-start',\n getReference: () => activeTrigger?.shadowRoot?.querySelector<HTMLElement>('.trigger') ?? activeTrigger,\n matchWidth: false,\n offsetPx: 8,\n useClippingAncestor: false,\n });\n\n const panelColumns = (): number | undefined => {\n const columns = props.columns.value;\n\n return columns === undefined ? undefined : Math.max(1, Math.trunc(columns));\n };\n\n const showPanel = (panel: HTMLElement): void => {\n panel.hidden = false;\n panel.dataset.open = '';\n\n if ('showPopover' in panel) {\n try {\n if (!panel.matches(':popover-open')) panel.showPopover();\n } catch {\n // Sandboxed documents can reject the Popover API; data-open remains the fixed-position fallback.\n }\n }\n };\n\n const hidePanel = (panel: HTMLElement): void => {\n delete panel.dataset.open;\n\n if ('hidePopover' in panel) {\n try {\n if (panel.matches(':popover-open')) panel.hidePopover();\n } catch {\n // The fallback visibility state is still cleared below.\n }\n }\n\n panel.hidden = true;\n };\n\n const applyActive = (value: string | null): void => {\n const nextPanel = value === null ? null : panelFor(value);\n\n stopPositioning?.();\n stopPositioning = null;\n activeValue.value = value;\n activeTrigger = value ? (items().find((item) => valueOf(item) === value) ?? null) : null;\n activePanel = nextPanel;\n\n for (const item of items()) {\n const expanded = valueOf(item) === value;\n const trigger = item.shadowRoot?.querySelector<HTMLElement>('.trigger');\n\n item.setAttribute('aria-expanded', String(expanded));\n trigger?.setAttribute('aria-expanded', String(expanded));\n }\n for (const panel of panels()) {\n if (panel !== nextPanel) hidePanel(panel);\n }\n\n if (nextPanel) {\n const columns = panelColumns();\n\n if (columns !== undefined) nextPanel.style.setProperty('--navigation-menu-panel-columns', String(columns));\n\n nextPanel.setAttribute('aria-labelledby', activeTrigger?.id ?? '');\n showPanel(nextPanel);\n positioner.update();\n stopPositioning = positioner.startAutoUpdate?.() ?? null;\n }\n };\n\n const requestActive = (value: string | null, reason: OverlayOpenChangeDetail['reason']): void => {\n if (isDisabled.value || activeValue.value === value) return;\n\n if (value !== null && !panelFor(value)) return;\n\n if (!isControlled()) applyActive(value);\n\n emit('open-change', { open: value !== null, reason, value });\n };\n\n onCleanup(() => {\n stopPositioning?.();\n\n for (const panel of panels()) hidePanel(panel);\n });\n\n createOutsidePointerDismissal({\n getTargets: () => [host, activePanel],\n isActive: () => activeValue.value !== null,\n onDismiss: () => requestActive(null, 'outsideClick'),\n signal: abortSignal,\n });\n\n onMounted(() => {\n const values = new Set<string>();\n\n for (const panel of panels()) {\n panel.setAttribute('popover', 'manual');\n panel.setAttribute('role', 'region');\n panelIdFor(panel);\n hidePanel(panel);\n\n panel.addEventListener(\n 'click',\n (event) => {\n const link = event.target instanceof Element ? event.target.closest<HTMLAnchorElement>('a[href]') : null;\n\n if (!link || !panel.contains(link)) return;\n\n const value = activeValue.value;\n\n if (!value) return;\n\n emit('select', { href: link.href, value });\n\n if (props['close-on-select'].value && !link.closest('[data-navigation-menu-keep-open]')) {\n requestActive(null, 'select');\n }\n },\n { signal: abortSignal },\n );\n }\n\n document.addEventListener(\n 'keydown',\n (event) => {\n if (event.key !== 'Escape' || activeValue.value === null) return;\n\n event.preventDefault();\n requestActive(null, 'escape');\n activeTrigger?.shadowRoot?.querySelector<HTMLElement>('.trigger')?.focus();\n },\n { signal: abortSignal },\n );\n\n for (const item of items()) {\n const value = valueOf(item);\n const panel = panelFor(value);\n\n if (!value || values.has(value) || !panel) continue;\n\n values.add(value);\n item.id ||= createStableId('navigation-menu-trigger');\n\n const trigger = item.shadowRoot?.querySelector<HTMLButtonElement>('.trigger');\n\n if (!trigger) continue;\n\n trigger.setAttribute('aria-controls', panelIdFor(panel));\n trigger.setAttribute('aria-haspopup', 'true');\n trigger.setAttribute('aria-expanded', 'false');\n item.setAttribute('aria-expanded', 'false');\n trigger.addEventListener('click', () => requestActive(activeValue.value === value ? null : value, 'click'), {\n signal: abortSignal,\n });\n trigger.addEventListener(\n 'keydown',\n (event) => {\n const all = items();\n const index = all.indexOf(item);\n\n if (\n event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' ||\n event.key === 'Home' ||\n event.key === 'End'\n ) {\n event.preventDefault();\n\n const next =\n event.key === 'Home'\n ? all[0]\n : event.key === 'End'\n ? all.at(-1)\n : all[(index + (event.key === 'ArrowRight' ? 1 : all.length - 1)) % all.length];\n\n next?.shadowRoot?.querySelector<HTMLElement>('.trigger')?.focus();\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n requestActive(value, 'keyboard');\n requestAnimationFrame(() =>\n activePanel?.querySelector<HTMLElement>('a, button, input, [tabindex]:not([tabindex=\"-1\"])')?.focus(),\n );\n }\n },\n { signal: abortSignal },\n );\n }\n\n if (props.open.value !== undefined) applyActive(props.open.value);\n else if (props['default-open'].value) applyActive(props['default-open'].value);\n });\n\n watch(props.open, (value) => {\n if (value !== undefined) applyActive(value);\n });\n\n watch(props.disabled, (disabled) => {\n if (disabled) applyActive(null);\n });\n\n return html`\n <nav class=\"triggers\" aria-label=\"${props.label}\" id=\"${panelId}\"><slot></slot></nav>\n <slot name=\"panel\"></slot>\n <slot name=\"footer\"></slot>\n `;\n },\n styles: [reducedMotionMixin, hostStyles],\n});\n"],"mappings":"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"}
@@ -1,32 +1,32 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./core/spinner.cjs"),t=require("./styles/mixins/states.css.cjs"),n=require("./shared/prop-bundles.cjs"),r=require("./inputs/shared/native-field-event.cjs"),i=require("./inputs/number-input/number-input.css.cjs");let a=require("@vielzeug/ore"),o=require("@vielzeug/ripple"),s=require("@vielzeug/ripple/watch"),c=require("@vielzeug/arsenal/math");var l=`ore-number-input`;(0,a.define)(l,{formAssociated:!0,props:{...n.themableBundle,...n.sizableBundle,...n.disablableBundle,...n.roundableBundle,error:a.prop.string(),fullwidth:a.prop.bool(!1),helper:a.prop.string(),label:a.prop.string(),"label-placement":a.prop.oneOf([`inset`,`outside`],`inset`),"large-step":a.prop.json(void 0),loading:a.prop.bool(!1),max:a.prop.json(void 0),min:a.prop.json(void 0),name:a.prop.string(),placeholder:a.prop.string(),readonly:a.prop.bool(!1),ref:a.prop.data(),step:a.prop.number(1),success:a.prop.bool(!1),value:a.prop.json(void 0),variant:a.prop.string()},setup(t){let n=(0,a.getHost)(),i=a.watchEffect,l=(0,o.computed)(()=>t.disabled.value||t.loading.value),u=(0,o.computed)(()=>!!t.readonly.value),d=(0,o.signal)(t.value.value==null?``:String(t.value.value));r.defineFieldValue(n,()=>d.value,e=>{d.value=e}),(0,s.watch)(t.value,e=>{let t=e==null?``:String(e);d.value!==t&&(d.value=t)});function f(){let e=d.value.trim();if(!e)return null;let t=Number.parseFloat(e);return Number.isNaN(t)?null:t}function p(e,i){let a=t.min.value==null?void 0:Number(t.min.value),o=t.max.value==null?void 0:Number(t.max.value),s=e==null?null:(0,c.clamp)(e,a,o),l=s==null?``:String(s);d.value!==l&&(d.value=l),r.setFieldValue(n,l),r.dispatchNativeFieldEvent(n,`change`)}let m=e.createSpinnerControl({commit:p,disabled:l,largeStep:t[`large-step`],max:t.max,min:t.min,parse:f,readonly:u,step:t.step}),h=(0,a.ref)(),g=null,_=null,v=null,y=e=>{if(!e){g?.(),_?.(),v?.dispose(),g=null,_=null,v=null,t.ref.value?.(null);return}e.setAttribute(`inputmode`,`decimal`),e.setAttribute(`role`,`spinbutton`);let a=e=>{let t=e.target.value,n=t===``?null:Number.parseFloat(t);p(Number.isNaN(n??NaN)?null:n,e)},o=e=>{let t=e.target.value;d.value=t,r.setFieldValue(n,t),r.dispatchNativeFieldEvent(n,`input`)};e.addEventListener(`change`,a),e.addEventListener(`input`,o),_=()=>{e.removeEventListener(`change`,a),e.removeEventListener(`input`,o)},g=i(()=>{let n=f();n==null?e.removeAttribute(`aria-valuenow`):e.setAttribute(`aria-valuenow`,String(n)),t.min.value==null?e.removeAttribute(`aria-valuemin`):e.setAttribute(`aria-valuemin`,String(t.min.value)),t.max.value==null?e.removeAttribute(`aria-valuemax`):e.setAttribute(`aria-valuemax`,String(t.max.value)),u.value?e.setAttribute(`aria-readonly`,`true`):e.removeAttribute(`aria-readonly`)}),t.ref.value?.(e),v=(0,s.watch)(t.ref,t=>{t?.(e)})};(0,a.onElement)(h,e=>{e.ref=y}),(0,a.bind)({attr:{size:t.size,value:()=>d.value||null,variant:t.variant}});let b=(0,o.computed)(()=>l.value||u.value);return a.html`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/states.css.cjs"),t=require("./core/spinner.cjs"),n=require("./shared/prop-bundles.cjs"),r=require("./inputs/shared/native-field-event.cjs"),i=require("./inputs/number-input/number-input.css.cjs");let a=require("@vielzeug/ore"),o=require("@vielzeug/ripple"),s=require("@vielzeug/arsenal/math");var c=`ore-number-input`;(0,a.define)(c,{formAssociated:!0,props:{...n.themableBundle,...n.sizableBundle,...n.disablableBundle,...n.roundableBundle,error:a.prop.string(),fullwidth:a.prop.bool(!1),helper:a.prop.string(),label:a.prop.string(),"label-placement":a.prop.oneOf([`inset`,`outside`],`inset`),"large-step":a.prop.json(void 0),loading:a.prop.bool(!1),max:a.prop.json(void 0),min:a.prop.json(void 0),name:a.prop.string(),placeholder:a.prop.string(),readonly:a.prop.bool(!1),ref:a.prop.data(),step:a.prop.number(1),success:a.prop.bool(!1),value:a.prop.json(void 0),variant:a.prop.string()},setup(e){let n=(0,a.getHost)(),i=a.watchEffect,c=(0,o.computed)(()=>e.disabled.value||e.loading.value),l=(0,o.computed)(()=>!!e.readonly.value),u=(0,o.signal)(e.value.value==null?``:String(e.value.value));r.defineFieldValue(n,()=>u.value,e=>{u.value=e}),(0,o.watch)(e.value,e=>{let t=e==null?``:String(e);u.value!==t&&(u.value=t)});function d(){let e=u.value.trim();if(!e)return null;let t=Number.parseFloat(e);return Number.isNaN(t)?null:t}function f(t,i){let a=e.min.value==null?void 0:Number(e.min.value),o=e.max.value==null?void 0:Number(e.max.value),c=t==null?null:(0,s.clamp)(t,a,o),l=c==null?``:String(c);u.value!==l&&(u.value=l),r.setFieldValue(n,l),r.dispatchNativeFieldEvent(n,`change`)}let p=t.createSpinnerControl({commit:f,disabled:c,largeStep:e[`large-step`],max:e.max,min:e.min,parse:d,readonly:l,step:e.step}),m=(0,a.ref)(),h=null,g=null,_=null,v=t=>{if(!t){h?.(),g?.(),_?.dispose(),h=null,g=null,_=null,e.ref.value?.(null);return}t.setAttribute(`inputmode`,`decimal`),t.setAttribute(`role`,`spinbutton`);let a=e=>{let t=e.target.value,n=t===``?null:Number.parseFloat(t);f(Number.isNaN(n??NaN)?null:n,e)},s=e=>{let t=e.target.value;u.value=t,r.setFieldValue(n,t),r.dispatchNativeFieldEvent(n,`input`)};t.addEventListener(`change`,a),t.addEventListener(`input`,s),g=()=>{t.removeEventListener(`change`,a),t.removeEventListener(`input`,s)},h=i(()=>{let n=d();n==null?t.removeAttribute(`aria-valuenow`):t.setAttribute(`aria-valuenow`,String(n)),e.min.value==null?t.removeAttribute(`aria-valuemin`):t.setAttribute(`aria-valuemin`,String(e.min.value)),e.max.value==null?t.removeAttribute(`aria-valuemax`):t.setAttribute(`aria-valuemax`,String(e.max.value)),l.value?t.setAttribute(`aria-readonly`,`true`):t.removeAttribute(`aria-readonly`)}),e.ref.value?.(t),_=(0,o.watch)(e.ref,e=>{e?.(t)})};(0,a.onElement)(m,e=>{e.ref=v}),(0,a.bind)({attr:{size:e.size,value:()=>u.value||null,variant:e.variant}});let y=(0,o.computed)(()=>c.value||l.value);return a.html`
2
2
  <ore-input
3
3
  class="field"
4
4
  part="field control"
5
- ref="${h}"
6
- value="${()=>d.value??0}"
7
- label="${()=>t.label.value??``}"
8
- label-placement="${()=>t[`label-placement`].value??`inset`}"
9
- placeholder="${()=>t.placeholder.value??``}"
10
- name="${()=>t.name.value??``}"
11
- helper="${()=>t.helper.value??``}"
12
- error="${()=>t.error.value??``}"
13
- size="${t.size}"
14
- color="${()=>t.color.value??``}"
15
- variant="${t.variant}"
16
- rounded="${()=>t.rounded.value}"
17
- ?disabled="${t.disabled}"
18
- ?readonly="${u}"
19
- ?fullwidth="${()=>t.fullwidth.value}"
20
- ?loading="${()=>t.loading.value}"
21
- ?success="${()=>t.success.value}"
22
- @keydown="${e=>m.handleKeydown(e)}">
5
+ ref="${m}"
6
+ value="${()=>u.value??0}"
7
+ label="${()=>e.label.value??``}"
8
+ label-placement="${()=>e[`label-placement`].value??`inset`}"
9
+ placeholder="${()=>e.placeholder.value??``}"
10
+ name="${()=>e.name.value??``}"
11
+ helper="${()=>e.helper.value??``}"
12
+ error="${()=>e.error.value??``}"
13
+ size="${e.size}"
14
+ color="${()=>e.color.value??``}"
15
+ variant="${e.variant}"
16
+ rounded="${()=>e.rounded.value}"
17
+ ?disabled="${e.disabled}"
18
+ ?readonly="${l}"
19
+ ?fullwidth="${()=>e.fullwidth.value}"
20
+ ?loading="${()=>e.loading.value}"
21
+ ?success="${()=>e.success.value}"
22
+ @keydown="${e=>p.handleKeydown(e)}">
23
23
  <button
24
24
  slot="prefix"
25
25
  type="button"
26
26
  part="decrement-btn"
27
27
  aria-label="Decrease"
28
- ?disabled="${()=>b.value||m.atMin()}"
29
- @click="${e=>m.incrementBy(-(Number(t.step.value)||1),e)}">
28
+ ?disabled="${()=>y.value||p.atMin()}"
29
+ @click="${t=>p.incrementBy(-(Number(e.step.value)||1),t)}">
30
30
  <ore-icon name="minus" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
31
31
  </button>
32
32
  <button
@@ -34,10 +34,10 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
34
34
  type="button"
35
35
  part="increment-btn"
36
36
  aria-label="Increase"
37
- ?disabled="${()=>b.value||m.atMax()}"
38
- @click="${e=>m.incrementBy(Number(t.step.value)||1,e)}">
37
+ ?disabled="${()=>y.value||p.atMax()}"
38
+ @click="${t=>p.incrementBy(Number(e.step.value)||1,t)}">
39
39
  <ore-icon name="plus" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
40
40
  </button>
41
41
  </ore-input>
42
- `},shadow:{delegatesFocus:!0},styles:[t.disabledLoadingMixin,i.default]}),exports.NUMBER_INPUT_TAG=l;
42
+ `},shadow:{delegatesFocus:!0},styles:[e.disabledLoadingMixin,i.default]}),exports.NUMBER_INPUT_TAG=c;
43
43
  //# sourceMappingURL=number-input.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"number-input.cjs","names":[],"sources":["../src/inputs/number-input/number-input.ts"],"sourcesContent":["import { clamp } from '@vielzeug/arsenal/math';\nimport { define, html, prop, ref, bind, getHost, onElement, watchEffect } from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport { watch as rippleWatch } from '@vielzeug/ripple/watch';\n\nimport type { ComponentSize, ThemeColor, VisualVariant } from '../../types';\n\nimport { createSpinnerControl } from '../../core';\nimport '../../content/icon/icon';\nimport '../input/input';\nimport { disablableBundle, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { disabledLoadingMixin } from '../../styles';\nimport { defineFieldValue, dispatchNativeFieldEvent, setFieldValue } from '../shared/native-field-event';\nimport componentStyles from './number-input.css?inline';\n\nexport type OreNumberInputEvents = {\n change: Event;\n input: InputEvent;\n};\n\n/** Number Input props */\nexport type OreNumberInputProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Error message */\n error?: string;\n /** Stretch to full width of container */\n fullwidth?: boolean;\n /** Helper text */\n helper?: string;\n /** Visible label */\n label?: string;\n /** Label placement: 'inset' renders the label inside the control box, 'outside' renders it above */\n 'label-placement'?: 'inset' | 'outside';\n /** Large step (for Page Up/Down, default: 10 × step) */\n 'large-step'?: number;\n /**\n * Shows an inline spinner inside the field and forces the control into `disabled` for the\n * duration — use while an async validation/submission request is in flight to prevent\n * double-submits.\n */\n loading?: boolean;\n /** Maximum allowed value */\n max?: number;\n /** Minimum allowed value */\n min?: number;\n /** Form field name */\n name?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Make the input read-only */\n readonly?: boolean;\n /**\n * JS-only callback fired with the inner `<input>` element when it mounts,\n * and with `null` when it unmounts.\n * Set as a JS property: `bitNumberInput.ref = (el) => { ... }`.\n */\n ref?: ((el: HTMLInputElement | null) => void) | null;\n /** Border radius */\n rounded?: string;\n /** Component size */\n size?: ComponentSize;\n /** Step size for increment/decrement */\n step?: number;\n /**\n * Shows an inline green check icon inside the field to confirm the value has\n * passed validation. Ignored while `error` is set — an error always wins.\n */\n success?: boolean;\n /** Current numeric value */\n value?: number;\n /** Visual variant */\n variant?: VisualVariant;\n};\n\n/**\n * A numeric spin-button input with +/− controls, min/max clamping, and full keyboard support.\n *\n * @element ore-number-input\n *\n * @attr {number} value - Current value\n * @attr {number} min - Minimum value\n * @attr {number} max - Maximum value\n * @attr {number} step - Increment/decrement step (default: 1)\n * @attr {number} large-step - Step for Page Up/Down (default: 10)\n * @attr {boolean} disabled - Disables the control\n * @attr {boolean} readonly - Read-only mode\n * @attr {boolean} loading - Show an inline spinner and force the control disabled\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n * @attr {string} label - Visible label\n * @attr {string} name - Form field name\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} placeholder - Input placeholder\n *\n * @fires input - On every keystroke.\n * @fires change - On committed value change.\n *\n * @slot prefix - Content before the input (e.g. icon)\n * @slot suffix - Content after the input (e.g. unit label)\n * @slot label - Custom label content\n * @slot helper - Custom helper text content\n * @slot error - Custom error content\n *\n * @cssprop --number-input-height - Control height\n * @cssprop --number-input-border-color - Border color\n * @cssprop --number-input-radius - Border radius\n * @cssprop --number-input-bg - Background\n * @cssprop --number-input-btn-bg - Spin button background\n *\n * @part control - Control container.\n * @part decrement-btn - Decrement stepper button.\n * @part input - Input element.\n * @part increment-btn - Increment stepper button.\n * @example\n * ```html\n * <ore-number-input label=\"Quantity\" value=\"1\" min=\"1\" max=\"99\" step=\"1\"></ore-number-input>\n * <ore-number-input label=\"Quantity\" success></ore-number-input>\n * <ore-number-input label=\"Quantity\" loading></ore-number-input>\n * ```\n */\nexport const NUMBER_INPUT_TAG = 'ore-number-input' as const;\ndefine<OreNumberInputProps>(NUMBER_INPUT_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n 'large-step': prop.json(undefined as number | undefined),\n loading: prop.bool(false),\n max: prop.json(undefined as number | undefined),\n min: prop.json(undefined as number | undefined),\n name: prop.string(),\n placeholder: prop.string(),\n readonly: prop.bool(false),\n ref: prop.data<((el: HTMLInputElement | null) => void) | null>(),\n step: prop.number(1),\n success: prop.bool(false),\n value: prop.json(undefined as number | undefined),\n variant: prop.string<VisualVariant>(),\n },\n setup(props) {\n const el = getHost();\n const watch = watchEffect;\n\n // `loading` behaves like a temporary `disabled` — see ore-input's identical computation.\n const isDisabled = computed(() => props.disabled.value || props.loading.value);\n const isReadonly = computed(() => Boolean(props.readonly.value));\n\n // Internal numeric value signal (string representation for the input)\n const fieldValue = signal(props.value.value != null ? String(props.value.value) : '');\n\n defineFieldValue(\n el,\n () => fieldValue.value,\n (value) => {\n fieldValue.value = value;\n },\n );\n\n // Keep fieldValue in sync when props.value changes externally\n rippleWatch(props.value, (v) => {\n const next = v != null ? String(v) : '';\n\n if (fieldValue.value !== next) fieldValue.value = next;\n });\n\n function parseValue(): number | null {\n const v = fieldValue.value.trim();\n\n if (!v) return null;\n\n const n = Number.parseFloat(v);\n\n return Number.isNaN(n) ? null : n;\n }\n\n function commit(val: number | null, _originalEvent?: Event) {\n const min = props.min.value != null ? Number(props.min.value) : undefined;\n const max = props.max.value != null ? Number(props.max.value) : undefined;\n const clamped = val != null ? clamp(val, min, max) : null;\n const nextValue = clamped != null ? String(clamped) : '';\n\n if (fieldValue.value !== nextValue) fieldValue.value = nextValue;\n\n setFieldValue(el, nextValue);\n dispatchNativeFieldEvent(el, 'change');\n }\n\n const spinner = createSpinnerControl({\n commit,\n disabled: isDisabled,\n largeStep: props['large-step'],\n max: props.max,\n min: props.min,\n parse: parseValue,\n readonly: isReadonly,\n step: props.step,\n });\n\n // Composition uses ore-input's own documented `ref` prop (fired with the raw\n // <input> on mount, `null` on unmount) instead of reaching into its shadow DOM —\n // see `packages/refine/AGENTS.md` / input.ts's `ref` JSDoc for the supported contract.\n // Set imperatively (rather than declared in the template) because ore's template\n // engine treats a function-valued attr binding as a reactive getter to invoke, not\n // a literal value to assign — a plain property assignment avoids that entirely.\n const bitInputRef = ref<HTMLElementTagNameMap['ore-input']>();\n let stopAriaWatch: (() => void) | null = null;\n let detachListeners: (() => void) | null = null;\n let refSub: { dispose(): void } | null = null;\n\n const handleFieldRef = (rawInput: HTMLInputElement | null): void => {\n if (!rawInput) {\n stopAriaWatch?.();\n detachListeners?.();\n refSub?.dispose();\n stopAriaWatch = null;\n detachListeners = null;\n refSub = null;\n props.ref.value?.(null);\n\n return;\n }\n\n rawInput.setAttribute('inputmode', 'decimal');\n // The wrapper div is a plain layout container — WAI-ARIA spinbutton semantics\n // live on the actually-focusable element (the raw <input> rendered by ore-input).\n rawInput.setAttribute('role', 'spinbutton');\n\n const handleChange = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n const n = val !== '' ? Number.parseFloat(val) : null;\n\n commit(Number.isNaN(n ?? NaN) ? null : n, e);\n };\n\n const handleInput = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n\n fieldValue.value = val;\n setFieldValue(el, val);\n dispatchNativeFieldEvent(el, 'input');\n };\n\n rawInput.addEventListener('change', handleChange);\n rawInput.addEventListener('input', handleInput);\n detachListeners = () => {\n rawInput.removeEventListener('change', handleChange);\n rawInput.removeEventListener('input', handleInput);\n };\n\n stopAriaWatch = watch(() => {\n const now = parseValue();\n\n if (now == null) rawInput.removeAttribute('aria-valuenow');\n else rawInput.setAttribute('aria-valuenow', String(now));\n\n if (props.min.value != null) rawInput.setAttribute('aria-valuemin', String(props.min.value));\n else rawInput.removeAttribute('aria-valuemin');\n\n if (props.max.value != null) rawInput.setAttribute('aria-valuemax', String(props.max.value));\n else rawInput.removeAttribute('aria-valuemax');\n\n if (isReadonly.value) rawInput.setAttribute('aria-readonly', 'true');\n else rawInput.removeAttribute('aria-readonly');\n });\n\n // Fire user ref callback\n props.ref.value?.(rawInput);\n\n refSub = rippleWatch(props.ref, (cb) => {\n cb?.(rawInput);\n });\n };\n\n // ore-input's own onElement/ref lifecycle calls this back with `null` when its\n // inner <input> unmounts, so no explicit teardown is needed here.\n onElement(bitInputRef, (bitInputEl) => {\n bitInputEl.ref = handleFieldRef;\n });\n\n bind({\n attr: {\n size: props.size,\n value: () => fieldValue.value || null,\n variant: props.variant,\n },\n });\n\n const isNonInteractive = computed(() => isDisabled.value || isReadonly.value);\n\n // The stepper buttons are slotted *into* ore-input's own `prefix`/`suffix` slots instead of\n // sitting outside it in a separate wrapper — they render inside ore-input's own bordered\n // box (same as its built-in clear/password-toggle buttons), matching every other field's\n // single-box look instead of floating as two detached icon buttons either side of a\n // narrow field. `@keydown` moves to ore-input itself: native keyboard events are\n // `composed: true` and bubble out past a shadow boundary, so it still sees keydowns\n // originating from ore-input's internal <input> as well as from these slotted buttons.\n return html`\n <ore-input\n class=\"field\"\n part=\"field control\"\n ref=\"${bitInputRef}\"\n value=\"${() => fieldValue.value ?? 0}\"\n label=\"${() => props.label.value ?? ''}\"\n label-placement=\"${() => props['label-placement'].value ?? 'inset'}\"\n placeholder=\"${() => props.placeholder.value ?? ''}\"\n name=\"${() => props.name.value ?? ''}\"\n helper=\"${() => props.helper.value ?? ''}\"\n error=\"${() => props.error.value ?? ''}\"\n size=\"${props.size}\"\n color=\"${() => props.color.value ?? ''}\"\n variant=\"${props.variant}\"\n rounded=\"${() => props.rounded.value}\"\n ?disabled=\"${props.disabled}\"\n ?readonly=\"${isReadonly}\"\n ?fullwidth=\"${() => props.fullwidth.value}\"\n ?loading=\"${() => props.loading.value}\"\n ?success=\"${() => props.success.value}\"\n @keydown=\"${(e: KeyboardEvent) => spinner.handleKeydown(e)}\">\n <button\n slot=\"prefix\"\n type=\"button\"\n part=\"decrement-btn\"\n aria-label=\"Decrease\"\n ?disabled=\"${() => isNonInteractive.value || spinner.atMin()}\"\n @click=\"${(e: Event) => spinner.incrementBy(-(Number(props.step.value) || 1), e)}\">\n <ore-icon name=\"minus\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n <button\n slot=\"suffix\"\n type=\"button\"\n part=\"increment-btn\"\n aria-label=\"Increase\"\n ?disabled=\"${() => isNonInteractive.value || spinner.atMax()}\"\n @click=\"${(e: Event) => spinner.incrementBy(Number(props.step.value) || 1, e)}\">\n <ore-icon name=\"plus\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n </ore-input>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [disabledLoadingMixin, componentStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"number-input.cjs","names":[],"sources":["../src/inputs/number-input/number-input.ts"],"sourcesContent":["import { clamp } from '@vielzeug/arsenal/math';\nimport { bind, define, getHost, html, onElement, prop, ref, watchEffect } from '@vielzeug/ore';\nimport { computed, watch as rippleWatch, signal } from '@vielzeug/ripple';\nimport { createSpinnerControl } from '../../core';\nimport type { ComponentSize, ThemeColor, VisualVariant } from '../../types';\nimport '../../content/icon/icon';\nimport '../input/input';\nimport { disablableBundle, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { disabledLoadingMixin } from '../../styles';\nimport { defineFieldValue, dispatchNativeFieldEvent, setFieldValue } from '../shared/native-field-event';\nimport componentStyles from './number-input.css?inline';\n\nexport type OreNumberInputEvents = {\n change: Event;\n input: InputEvent;\n};\n\n/** Number Input props */\nexport type OreNumberInputProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Error message */\n error?: string;\n /** Stretch to full width of container */\n fullwidth?: boolean;\n /** Helper text */\n helper?: string;\n /** Visible label */\n label?: string;\n /** Label placement: 'inset' renders the label inside the control box, 'outside' renders it above */\n 'label-placement'?: 'inset' | 'outside';\n /** Large step (for Page Up/Down, default: 10 × step) */\n 'large-step'?: number;\n /**\n * Shows an inline spinner inside the field and forces the control into `disabled` for the\n * duration — use while an async validation/submission request is in flight to prevent\n * double-submits.\n */\n loading?: boolean;\n /** Maximum allowed value */\n max?: number;\n /** Minimum allowed value */\n min?: number;\n /** Form field name */\n name?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Make the input read-only */\n readonly?: boolean;\n /**\n * JS-only callback fired with the inner `<input>` element when it mounts,\n * and with `null` when it unmounts.\n * Set as a JS property: `bitNumberInput.ref = (el) => { ... }`.\n */\n ref?: ((el: HTMLInputElement | null) => void) | null;\n /** Border radius */\n rounded?: string;\n /** Component size */\n size?: ComponentSize;\n /** Step size for increment/decrement */\n step?: number;\n /**\n * Shows an inline green check icon inside the field to confirm the value has\n * passed validation. Ignored while `error` is set — an error always wins.\n */\n success?: boolean;\n /** Current numeric value */\n value?: number;\n /** Visual variant */\n variant?: VisualVariant;\n};\n\n/**\n * A numeric spin-button input with +/− controls, min/max clamping, and full keyboard support.\n *\n * @element ore-number-input\n *\n * @attr {number} value - Current value\n * @attr {number} min - Minimum value\n * @attr {number} max - Maximum value\n * @attr {number} step - Increment/decrement step (default: 1)\n * @attr {number} large-step - Step for Page Up/Down (default: 10)\n * @attr {boolean} disabled - Disables the control\n * @attr {boolean} readonly - Read-only mode\n * @attr {boolean} loading - Show an inline spinner and force the control disabled\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n * @attr {string} label - Visible label\n * @attr {string} name - Form field name\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} placeholder - Input placeholder\n *\n * @fires input - On every keystroke.\n * @fires change - On committed value change.\n *\n * @slot prefix - Content before the input (e.g. icon)\n * @slot suffix - Content after the input (e.g. unit label)\n * @slot label - Custom label content\n * @slot helper - Custom helper text content\n * @slot error - Custom error content\n *\n * @cssprop --number-input-height - Control height\n * @cssprop --number-input-border-color - Border color\n * @cssprop --number-input-radius - Border radius\n * @cssprop --number-input-bg - Background\n * @cssprop --number-input-btn-bg - Spin button background\n *\n * @part control - Control container.\n * @part decrement-btn - Decrement stepper button.\n * @part input - Input element.\n * @part increment-btn - Increment stepper button.\n * @example\n * ```html\n * <ore-number-input label=\"Quantity\" value=\"1\" min=\"1\" max=\"99\" step=\"1\"></ore-number-input>\n * <ore-number-input label=\"Quantity\" success></ore-number-input>\n * <ore-number-input label=\"Quantity\" loading></ore-number-input>\n * ```\n */\nexport const NUMBER_INPUT_TAG = 'ore-number-input' as const;\ndefine<OreNumberInputProps>(NUMBER_INPUT_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n 'large-step': prop.json(undefined as number | undefined),\n loading: prop.bool(false),\n max: prop.json(undefined as number | undefined),\n min: prop.json(undefined as number | undefined),\n name: prop.string(),\n placeholder: prop.string(),\n readonly: prop.bool(false),\n ref: prop.data<((el: HTMLInputElement | null) => void) | null>(),\n step: prop.number(1),\n success: prop.bool(false),\n value: prop.json(undefined as number | undefined),\n variant: prop.string<VisualVariant>(),\n },\n setup(props) {\n const el = getHost();\n const watch = watchEffect;\n\n // `loading` behaves like a temporary `disabled` — see ore-input's identical computation.\n const isDisabled = computed(() => props.disabled.value || props.loading.value);\n const isReadonly = computed(() => Boolean(props.readonly.value));\n\n // Internal numeric value signal (string representation for the input)\n const fieldValue = signal(props.value.value != null ? String(props.value.value) : '');\n\n defineFieldValue(\n el,\n () => fieldValue.value,\n (value) => {\n fieldValue.value = value;\n },\n );\n\n // Keep fieldValue in sync when props.value changes externally\n rippleWatch(props.value, (v) => {\n const next = v != null ? String(v) : '';\n\n if (fieldValue.value !== next) fieldValue.value = next;\n });\n\n function parseValue(): number | null {\n const v = fieldValue.value.trim();\n\n if (!v) return null;\n\n const n = Number.parseFloat(v);\n\n return Number.isNaN(n) ? null : n;\n }\n\n function commit(val: number | null, _originalEvent?: Event) {\n const min = props.min.value != null ? Number(props.min.value) : undefined;\n const max = props.max.value != null ? Number(props.max.value) : undefined;\n const clamped = val != null ? clamp(val, min, max) : null;\n const nextValue = clamped != null ? String(clamped) : '';\n\n if (fieldValue.value !== nextValue) fieldValue.value = nextValue;\n\n setFieldValue(el, nextValue);\n dispatchNativeFieldEvent(el, 'change');\n }\n\n const spinner = createSpinnerControl({\n commit,\n disabled: isDisabled,\n largeStep: props['large-step'],\n max: props.max,\n min: props.min,\n parse: parseValue,\n readonly: isReadonly,\n step: props.step,\n });\n\n // Composition uses ore-input's own documented `ref` prop (fired with the raw\n // <input> on mount, `null` on unmount) instead of reaching into its shadow DOM —\n // see `packages/refine/AGENTS.md` / input.ts's `ref` JSDoc for the supported contract.\n // Set imperatively (rather than declared in the template) because ore's template\n // engine treats a function-valued attr binding as a reactive getter to invoke, not\n // a literal value to assign — a plain property assignment avoids that entirely.\n const bitInputRef = ref<HTMLElementTagNameMap['ore-input']>();\n let stopAriaWatch: (() => void) | null = null;\n let detachListeners: (() => void) | null = null;\n let refSub: { dispose(): void } | null = null;\n\n const handleFieldRef = (rawInput: HTMLInputElement | null): void => {\n if (!rawInput) {\n stopAriaWatch?.();\n detachListeners?.();\n refSub?.dispose();\n stopAriaWatch = null;\n detachListeners = null;\n refSub = null;\n props.ref.value?.(null);\n\n return;\n }\n\n rawInput.setAttribute('inputmode', 'decimal');\n // The wrapper div is a plain layout container — WAI-ARIA spinbutton semantics\n // live on the actually-focusable element (the raw <input> rendered by ore-input).\n rawInput.setAttribute('role', 'spinbutton');\n\n const handleChange = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n const n = val !== '' ? Number.parseFloat(val) : null;\n\n commit(Number.isNaN(n ?? NaN) ? null : n, e);\n };\n\n const handleInput = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n\n fieldValue.value = val;\n setFieldValue(el, val);\n dispatchNativeFieldEvent(el, 'input');\n };\n\n rawInput.addEventListener('change', handleChange);\n rawInput.addEventListener('input', handleInput);\n detachListeners = () => {\n rawInput.removeEventListener('change', handleChange);\n rawInput.removeEventListener('input', handleInput);\n };\n\n stopAriaWatch = watch(() => {\n const now = parseValue();\n\n if (now == null) rawInput.removeAttribute('aria-valuenow');\n else rawInput.setAttribute('aria-valuenow', String(now));\n\n if (props.min.value != null) rawInput.setAttribute('aria-valuemin', String(props.min.value));\n else rawInput.removeAttribute('aria-valuemin');\n\n if (props.max.value != null) rawInput.setAttribute('aria-valuemax', String(props.max.value));\n else rawInput.removeAttribute('aria-valuemax');\n\n if (isReadonly.value) rawInput.setAttribute('aria-readonly', 'true');\n else rawInput.removeAttribute('aria-readonly');\n });\n\n // Fire user ref callback\n props.ref.value?.(rawInput);\n\n refSub = rippleWatch(props.ref, (cb) => {\n cb?.(rawInput);\n });\n };\n\n // ore-input's own onElement/ref lifecycle calls this back with `null` when its\n // inner <input> unmounts, so no explicit teardown is needed here.\n onElement(bitInputRef, (bitInputEl) => {\n bitInputEl.ref = handleFieldRef;\n });\n\n bind({\n attr: {\n size: props.size,\n value: () => fieldValue.value || null,\n variant: props.variant,\n },\n });\n\n const isNonInteractive = computed(() => isDisabled.value || isReadonly.value);\n\n // The stepper buttons are slotted *into* ore-input's own `prefix`/`suffix` slots instead of\n // sitting outside it in a separate wrapper — they render inside ore-input's own bordered\n // box (same as its built-in clear/password-toggle buttons), matching every other field's\n // single-box look instead of floating as two detached icon buttons either side of a\n // narrow field. `@keydown` moves to ore-input itself: native keyboard events are\n // `composed: true` and bubble out past a shadow boundary, so it still sees keydowns\n // originating from ore-input's internal <input> as well as from these slotted buttons.\n return html`\n <ore-input\n class=\"field\"\n part=\"field control\"\n ref=\"${bitInputRef}\"\n value=\"${() => fieldValue.value ?? 0}\"\n label=\"${() => props.label.value ?? ''}\"\n label-placement=\"${() => props['label-placement'].value ?? 'inset'}\"\n placeholder=\"${() => props.placeholder.value ?? ''}\"\n name=\"${() => props.name.value ?? ''}\"\n helper=\"${() => props.helper.value ?? ''}\"\n error=\"${() => props.error.value ?? ''}\"\n size=\"${props.size}\"\n color=\"${() => props.color.value ?? ''}\"\n variant=\"${props.variant}\"\n rounded=\"${() => props.rounded.value}\"\n ?disabled=\"${props.disabled}\"\n ?readonly=\"${isReadonly}\"\n ?fullwidth=\"${() => props.fullwidth.value}\"\n ?loading=\"${() => props.loading.value}\"\n ?success=\"${() => props.success.value}\"\n @keydown=\"${(e: KeyboardEvent) => spinner.handleKeydown(e)}\">\n <button\n slot=\"prefix\"\n type=\"button\"\n part=\"decrement-btn\"\n aria-label=\"Decrease\"\n ?disabled=\"${() => isNonInteractive.value || spinner.atMin()}\"\n @click=\"${(e: Event) => spinner.incrementBy(-(Number(props.step.value) || 1), e)}\">\n <ore-icon name=\"minus\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n <button\n slot=\"suffix\"\n type=\"button\"\n part=\"increment-btn\"\n aria-label=\"Increase\"\n ?disabled=\"${() => isNonInteractive.value || spinner.atMax()}\"\n @click=\"${(e: Event) => spinner.incrementBy(Number(props.step.value) || 1, e)}\">\n <ore-icon name=\"plus\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n </ore-input>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [disabledLoadingMixin, componentStyles],\n});\n"],"mappings":"yYAwHA,IAAa,EAAmB,oBAChC,EAAA,EAAA,OAAA,CAA4B,EAAkB,CAC5C,eAAgB,GAChB,MAAO,CACL,GAAG,EAAA,eACH,GAAG,EAAA,cACH,GAAG,EAAA,iBACH,GAAG,EAAA,gBACH,MAAO,EAAA,KAAK,OAAO,EACnB,UAAW,EAAA,KAAK,KAAK,EAAK,EAC1B,OAAQ,EAAA,KAAK,OAAO,EACpB,MAAO,EAAA,KAAK,OAAO,EACnB,kBAAmB,EAAA,KAAK,MAAM,CAAC,QAAS,SAAS,EAAY,OAAO,EACpE,aAAc,EAAA,KAAK,KAAK,IAAA,EAA+B,EACvD,QAAS,EAAA,KAAK,KAAK,EAAK,EACxB,IAAK,EAAA,KAAK,KAAK,IAAA,EAA+B,EAC9C,IAAK,EAAA,KAAK,KAAK,IAAA,EAA+B,EAC9C,KAAM,EAAA,KAAK,OAAO,EAClB,YAAa,EAAA,KAAK,OAAO,EACzB,SAAU,EAAA,KAAK,KAAK,EAAK,EACzB,IAAK,EAAA,KAAK,KAAqD,EAC/D,KAAM,EAAA,KAAK,OAAO,CAAC,EACnB,QAAS,EAAA,KAAK,KAAK,EAAK,EACxB,MAAO,EAAA,KAAK,KAAK,IAAA,EAA+B,EAChD,QAAS,EAAA,KAAK,OAAsB,CACtC,EACA,MAAM,EAAO,CACX,IAAM,GAAA,EAAK,EAAA,QAAA,CAAQ,EACb,EAAQ,EAAA,YAGR,GAAA,EAAa,EAAA,SAAA,KAAe,EAAM,SAAS,OAAS,EAAM,QAAQ,KAAK,EACvE,GAAA,EAAa,EAAA,SAAA,KAAe,EAAQ,EAAM,SAAS,KAAM,EAGzD,GAAA,EAAa,EAAA,OAAA,CAAO,EAAM,MAAM,OAAS,KAAmC,GAA5B,OAAO,EAAM,MAAM,KAAK,CAAM,EAEpF,EAAA,iBACE,MACM,EAAW,MAChB,GAAU,CACT,EAAW,MAAQ,CACrB,CACF,GAGA,EAAA,EAAA,MAAA,CAAY,EAAM,MAAQ,GAAM,CAC9B,IAAM,EAAO,GAAK,KAAmB,GAAZ,OAAO,CAAC,EAE7B,EAAW,QAAU,IAAM,EAAW,MAAQ,EACpD,CAAC,EAED,SAAS,GAA4B,CACnC,IAAM,EAAI,EAAW,MAAM,KAAK,EAEhC,GAAI,CAAC,EAAG,OAAO,KAEf,IAAM,EAAI,OAAO,WAAW,CAAC,EAE7B,OAAO,OAAO,MAAM,CAAC,EAAI,KAAO,CAClC,CAEA,SAAS,EAAO,EAAoB,EAAwB,CAC1D,IAAM,EAAM,EAAM,IAAI,OAAS,KAAiC,IAAA,GAA1B,OAAO,EAAM,IAAI,KAAK,EACtD,EAAM,EAAM,IAAI,OAAS,KAAiC,IAAA,GAA1B,OAAO,EAAM,IAAI,KAAK,EACtD,EAAU,GAAO,KAA8B,MAA9B,EAAO,EAAA,MAAA,CAAM,EAAK,EAAK,CAAG,EAC3C,EAAY,GAAW,KAAyB,GAAlB,OAAO,CAAO,EAE9C,EAAW,QAAU,IAAW,EAAW,MAAQ,GAEvD,EAAA,cAAc,EAAI,CAAS,EAC3B,EAAA,yBAAyB,EAAI,QAAQ,CACvC,CAEA,IAAM,EAAU,EAAA,qBAAqB,CACnC,SACA,SAAU,EACV,UAAW,EAAM,cACjB,IAAK,EAAM,IACX,IAAK,EAAM,IACX,MAAO,EACP,SAAU,EACV,KAAM,EAAM,IACd,CAAC,EAQK,GAAA,EAAc,EAAA,IAAA,CAAwC,EACxD,EAAqC,KACrC,EAAuC,KACvC,EAAqC,KAEnC,EAAkB,GAA4C,CAClE,GAAI,CAAC,EAAU,CACb,IAAgB,EAChB,IAAkB,EAClB,GAAQ,QAAQ,EAChB,EAAgB,KAChB,EAAkB,KAClB,EAAS,KACT,EAAM,IAAI,QAAQ,IAAI,EAEtB,MACF,CAEA,EAAS,aAAa,YAAa,SAAS,EAG5C,EAAS,aAAa,OAAQ,YAAY,EAE1C,IAAM,EAAgB,GAAa,CACjC,IAAM,EAAO,EAAE,OAA4B,MACrC,EAAI,IAAQ,GAA8B,KAAzB,OAAO,WAAW,CAAG,EAE5C,EAAO,OAAO,MAAM,GAAK,GAAG,EAAI,KAAO,EAAG,CAAC,CAC7C,EAEM,EAAe,GAAa,CAChC,IAAM,EAAO,EAAE,OAA4B,MAE3C,EAAW,MAAQ,EACnB,EAAA,cAAc,EAAI,CAAG,EACrB,EAAA,yBAAyB,EAAI,OAAO,CACtC,EAEA,EAAS,iBAAiB,SAAU,CAAY,EAChD,EAAS,iBAAiB,QAAS,CAAW,EAC9C,MAAwB,CACtB,EAAS,oBAAoB,SAAU,CAAY,EACnD,EAAS,oBAAoB,QAAS,CAAW,CACnD,EAEA,EAAgB,MAAY,CAC1B,IAAM,EAAM,EAAW,EAEnB,GAAO,KAAM,EAAS,gBAAgB,eAAe,EACpD,EAAS,aAAa,gBAAiB,OAAO,CAAG,CAAC,EAEnD,EAAM,IAAI,OAAS,KAClB,EAAS,gBAAgB,eAAe,EADhB,EAAS,aAAa,gBAAiB,OAAO,EAAM,IAAI,KAAK,CAAC,EAGvF,EAAM,IAAI,OAAS,KAClB,EAAS,gBAAgB,eAAe,EADhB,EAAS,aAAa,gBAAiB,OAAO,EAAM,IAAI,KAAK,CAAC,EAGvF,EAAW,MAAO,EAAS,aAAa,gBAAiB,MAAM,EAC9D,EAAS,gBAAgB,eAAe,CAC/C,CAAC,EAGD,EAAM,IAAI,QAAQ,CAAQ,EAE1B,GAAA,EAAS,EAAA,MAAA,CAAY,EAAM,IAAM,GAAO,CACtC,IAAK,CAAQ,CACf,CAAC,CACH,GAIA,EAAA,EAAA,UAAA,CAAU,EAAc,GAAe,CACrC,EAAW,IAAM,CACnB,CAAC,GAED,EAAA,EAAA,KAAA,CAAK,CACH,KAAM,CACJ,KAAM,EAAM,KACZ,UAAa,EAAW,OAAS,KACjC,QAAS,EAAM,OACjB,CACF,CAAC,EAED,IAAM,GAAA,EAAmB,EAAA,SAAA,KAAe,EAAW,OAAS,EAAW,KAAK,EAS5E,MAAO,GAAA,IAAI;;;;eAIA,EAAY;qBACJ,EAAW,OAAS,EAAE;qBACtB,EAAM,MAAM,OAAS,GAAG;+BACd,EAAM,kBAAkB,CAAC,OAAS,QAAQ;2BAC9C,EAAM,YAAY,OAAS,GAAG;oBACrC,EAAM,KAAK,OAAS,GAAG;sBACrB,EAAM,OAAO,OAAS,GAAG;qBAC1B,EAAM,MAAM,OAAS,GAAG;gBAC/B,EAAM,KAAK;qBACJ,EAAM,MAAM,OAAS,GAAG;mBAC5B,EAAM,QAAQ;uBACR,EAAM,QAAQ,MAAM;qBACxB,EAAM,SAAS;qBACf,EAAW;0BACJ,EAAM,UAAU,MAAM;wBACxB,EAAM,QAAQ,MAAM;wBACpB,EAAM,QAAQ,MAAM;oBACzB,GAAqB,EAAQ,cAAc,CAAC,EAAE;;;;;;2BAMtC,EAAiB,OAAS,EAAQ,MAAM,EAAE;oBAClD,GAAa,EAAQ,YAAY,EAAE,OAAO,EAAM,KAAK,KAAK,GAAK,GAAI,CAAC,EAAE;;;;;;;;2BAQ9D,EAAiB,OAAS,EAAQ,MAAM,EAAE;oBAClD,GAAa,EAAQ,YAAY,OAAO,EAAM,KAAK,KAAK,GAAK,EAAG,CAAC,EAAE;;;;KAKtF,EACA,OAAQ,CAAE,eAAgB,EAAK,EAC/B,OAAQ,CAAC,EAAA,qBAAsB,EAAA,OAAe,CAChD,CAAC"}
@@ -1,11 +1,10 @@
1
- import { createSpinnerControl as e } from "./core/spinner.js";
2
- import { disabledLoadingMixin as t } from "./styles/mixins/states.css.js";
1
+ import { disabledLoadingMixin as e } from "./styles/mixins/states.css.js";
2
+ import { createSpinnerControl as t } from "./core/spinner.js";
3
3
  import { disablableBundle as n, roundableBundle as r, sizableBundle as i, themableBundle as a } from "./shared/prop-bundles.js";
4
4
  import { defineFieldValue as o, dispatchNativeFieldEvent as s, setFieldValue as c } from "./inputs/shared/native-field-event.js";
5
5
  import l from "./inputs/number-input/number-input.css.js";
6
6
  import { bind as u, define as d, getHost as f, html as p, onElement as m, prop as h, ref as g, watchEffect as _ } from "@vielzeug/ore";
7
- import { computed as v, signal as y } from "@vielzeug/ripple";
8
- import { watch as b } from "@vielzeug/ripple/watch";
7
+ import { computed as v, signal as y, watch as b } from "@vielzeug/ripple";
9
8
  import { clamp as x } from "@vielzeug/arsenal/math";
10
9
  //#region src/inputs/number-input/number-input.ts
11
10
  var S = "ore-number-input";
@@ -34,11 +33,11 @@ d(S, {
34
33
  value: h.json(void 0),
35
34
  variant: h.string()
36
35
  },
37
- setup(t) {
38
- let n = f(), r = _, i = v(() => t.disabled.value || t.loading.value), a = v(() => !!t.readonly.value), l = y(t.value.value == null ? "" : String(t.value.value));
36
+ setup(e) {
37
+ let n = f(), r = _, i = v(() => e.disabled.value || e.loading.value), a = v(() => !!e.readonly.value), l = y(e.value.value == null ? "" : String(e.value.value));
39
38
  o(n, () => l.value, (e) => {
40
39
  l.value = e;
41
- }), b(t.value, (e) => {
40
+ }), b(e.value, (e) => {
42
41
  let t = e == null ? "" : String(e);
43
42
  l.value !== t && (l.value = t);
44
43
  });
@@ -48,25 +47,25 @@ d(S, {
48
47
  let t = Number.parseFloat(e);
49
48
  return Number.isNaN(t) ? null : t;
50
49
  }
51
- function h(e, r) {
52
- let i = t.min.value == null ? void 0 : Number(t.min.value), a = t.max.value == null ? void 0 : Number(t.max.value), o = e == null ? null : x(e, i, a), u = o == null ? "" : String(o);
50
+ function h(t, r) {
51
+ let i = e.min.value == null ? void 0 : Number(e.min.value), a = e.max.value == null ? void 0 : Number(e.max.value), o = t == null ? null : x(t, i, a), u = o == null ? "" : String(o);
53
52
  l.value !== u && (l.value = u), c(n, u), s(n, "change");
54
53
  }
55
- let S = e({
54
+ let S = t({
56
55
  commit: h,
57
56
  disabled: i,
58
- largeStep: t["large-step"],
59
- max: t.max,
60
- min: t.min,
57
+ largeStep: e["large-step"],
58
+ max: e.max,
59
+ min: e.min,
61
60
  parse: d,
62
61
  readonly: a,
63
- step: t.step
64
- }), C = g(), w = null, T = null, E = null, D = (e) => {
65
- if (!e) {
66
- w?.(), T?.(), E?.dispose(), w = null, T = null, E = null, t.ref.value?.(null);
62
+ step: e.step
63
+ }), C = g(), w = null, T = null, E = null, D = (t) => {
64
+ if (!t) {
65
+ w?.(), T?.(), E?.dispose(), w = null, T = null, E = null, e.ref.value?.(null);
67
66
  return;
68
67
  }
69
- e.setAttribute("inputmode", "decimal"), e.setAttribute("role", "spinbutton");
68
+ t.setAttribute("inputmode", "decimal"), t.setAttribute("role", "spinbutton");
70
69
  let i = (e) => {
71
70
  let t = e.target.value, n = t === "" ? null : Number.parseFloat(t);
72
71
  h(Number.isNaN(n ?? NaN) ? null : n, e);
@@ -74,21 +73,21 @@ d(S, {
74
73
  let t = e.target.value;
75
74
  l.value = t, c(n, t), s(n, "input");
76
75
  };
77
- e.addEventListener("change", i), e.addEventListener("input", o), T = () => {
78
- e.removeEventListener("change", i), e.removeEventListener("input", o);
76
+ t.addEventListener("change", i), t.addEventListener("input", o), T = () => {
77
+ t.removeEventListener("change", i), t.removeEventListener("input", o);
79
78
  }, w = r(() => {
80
79
  let n = d();
81
- n == null ? e.removeAttribute("aria-valuenow") : e.setAttribute("aria-valuenow", String(n)), t.min.value == null ? e.removeAttribute("aria-valuemin") : e.setAttribute("aria-valuemin", String(t.min.value)), t.max.value == null ? e.removeAttribute("aria-valuemax") : e.setAttribute("aria-valuemax", String(t.max.value)), a.value ? e.setAttribute("aria-readonly", "true") : e.removeAttribute("aria-readonly");
82
- }), t.ref.value?.(e), E = b(t.ref, (t) => {
83
- t?.(e);
80
+ n == null ? t.removeAttribute("aria-valuenow") : t.setAttribute("aria-valuenow", String(n)), e.min.value == null ? t.removeAttribute("aria-valuemin") : t.setAttribute("aria-valuemin", String(e.min.value)), e.max.value == null ? t.removeAttribute("aria-valuemax") : t.setAttribute("aria-valuemax", String(e.max.value)), a.value ? t.setAttribute("aria-readonly", "true") : t.removeAttribute("aria-readonly");
81
+ }), e.ref.value?.(t), E = b(e.ref, (e) => {
82
+ e?.(t);
84
83
  });
85
84
  };
86
85
  m(C, (e) => {
87
86
  e.ref = D;
88
87
  }), u({ attr: {
89
- size: t.size,
88
+ size: e.size,
90
89
  value: () => l.value || null,
91
- variant: t.variant
90
+ variant: e.variant
92
91
  } });
93
92
  let O = v(() => i.value || a.value);
94
93
  return p`
@@ -97,21 +96,21 @@ d(S, {
97
96
  part="field control"
98
97
  ref="${C}"
99
98
  value="${() => l.value ?? 0}"
100
- label="${() => t.label.value ?? ""}"
101
- label-placement="${() => t["label-placement"].value ?? "inset"}"
102
- placeholder="${() => t.placeholder.value ?? ""}"
103
- name="${() => t.name.value ?? ""}"
104
- helper="${() => t.helper.value ?? ""}"
105
- error="${() => t.error.value ?? ""}"
106
- size="${t.size}"
107
- color="${() => t.color.value ?? ""}"
108
- variant="${t.variant}"
109
- rounded="${() => t.rounded.value}"
110
- ?disabled="${t.disabled}"
99
+ label="${() => e.label.value ?? ""}"
100
+ label-placement="${() => e["label-placement"].value ?? "inset"}"
101
+ placeholder="${() => e.placeholder.value ?? ""}"
102
+ name="${() => e.name.value ?? ""}"
103
+ helper="${() => e.helper.value ?? ""}"
104
+ error="${() => e.error.value ?? ""}"
105
+ size="${e.size}"
106
+ color="${() => e.color.value ?? ""}"
107
+ variant="${e.variant}"
108
+ rounded="${() => e.rounded.value}"
109
+ ?disabled="${e.disabled}"
111
110
  ?readonly="${a}"
112
- ?fullwidth="${() => t.fullwidth.value}"
113
- ?loading="${() => t.loading.value}"
114
- ?success="${() => t.success.value}"
111
+ ?fullwidth="${() => e.fullwidth.value}"
112
+ ?loading="${() => e.loading.value}"
113
+ ?success="${() => e.success.value}"
115
114
  @keydown="${(e) => S.handleKeydown(e)}">
116
115
  <button
117
116
  slot="prefix"
@@ -119,7 +118,7 @@ d(S, {
119
118
  part="decrement-btn"
120
119
  aria-label="Decrease"
121
120
  ?disabled="${() => O.value || S.atMin()}"
122
- @click="${(e) => S.incrementBy(-(Number(t.step.value) || 1), e)}">
121
+ @click="${(t) => S.incrementBy(-(Number(e.step.value) || 1), t)}">
123
122
  <ore-icon name="minus" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
124
123
  </button>
125
124
  <button
@@ -128,14 +127,14 @@ d(S, {
128
127
  part="increment-btn"
129
128
  aria-label="Increase"
130
129
  ?disabled="${() => O.value || S.atMax()}"
131
- @click="${(e) => S.incrementBy(Number(t.step.value) || 1, e)}">
130
+ @click="${(t) => S.incrementBy(Number(e.step.value) || 1, t)}">
132
131
  <ore-icon name="plus" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
133
132
  </button>
134
133
  </ore-input>
135
134
  `;
136
135
  },
137
136
  shadow: { delegatesFocus: !0 },
138
- styles: [t, l]
137
+ styles: [e, l]
139
138
  });
140
139
  //#endregion
141
140
  export { S as NUMBER_INPUT_TAG };
@@ -1 +1 @@
1
- {"version":3,"file":"number-input.js","names":[],"sources":["../src/inputs/number-input/number-input.ts"],"sourcesContent":["import { clamp } from '@vielzeug/arsenal/math';\nimport { define, html, prop, ref, bind, getHost, onElement, watchEffect } from '@vielzeug/ore';\nimport { computed, signal } from '@vielzeug/ripple';\nimport { watch as rippleWatch } from '@vielzeug/ripple/watch';\n\nimport type { ComponentSize, ThemeColor, VisualVariant } from '../../types';\n\nimport { createSpinnerControl } from '../../core';\nimport '../../content/icon/icon';\nimport '../input/input';\nimport { disablableBundle, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { disabledLoadingMixin } from '../../styles';\nimport { defineFieldValue, dispatchNativeFieldEvent, setFieldValue } from '../shared/native-field-event';\nimport componentStyles from './number-input.css?inline';\n\nexport type OreNumberInputEvents = {\n change: Event;\n input: InputEvent;\n};\n\n/** Number Input props */\nexport type OreNumberInputProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Error message */\n error?: string;\n /** Stretch to full width of container */\n fullwidth?: boolean;\n /** Helper text */\n helper?: string;\n /** Visible label */\n label?: string;\n /** Label placement: 'inset' renders the label inside the control box, 'outside' renders it above */\n 'label-placement'?: 'inset' | 'outside';\n /** Large step (for Page Up/Down, default: 10 × step) */\n 'large-step'?: number;\n /**\n * Shows an inline spinner inside the field and forces the control into `disabled` for the\n * duration — use while an async validation/submission request is in flight to prevent\n * double-submits.\n */\n loading?: boolean;\n /** Maximum allowed value */\n max?: number;\n /** Minimum allowed value */\n min?: number;\n /** Form field name */\n name?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Make the input read-only */\n readonly?: boolean;\n /**\n * JS-only callback fired with the inner `<input>` element when it mounts,\n * and with `null` when it unmounts.\n * Set as a JS property: `bitNumberInput.ref = (el) => { ... }`.\n */\n ref?: ((el: HTMLInputElement | null) => void) | null;\n /** Border radius */\n rounded?: string;\n /** Component size */\n size?: ComponentSize;\n /** Step size for increment/decrement */\n step?: number;\n /**\n * Shows an inline green check icon inside the field to confirm the value has\n * passed validation. Ignored while `error` is set — an error always wins.\n */\n success?: boolean;\n /** Current numeric value */\n value?: number;\n /** Visual variant */\n variant?: VisualVariant;\n};\n\n/**\n * A numeric spin-button input with +/− controls, min/max clamping, and full keyboard support.\n *\n * @element ore-number-input\n *\n * @attr {number} value - Current value\n * @attr {number} min - Minimum value\n * @attr {number} max - Maximum value\n * @attr {number} step - Increment/decrement step (default: 1)\n * @attr {number} large-step - Step for Page Up/Down (default: 10)\n * @attr {boolean} disabled - Disables the control\n * @attr {boolean} readonly - Read-only mode\n * @attr {boolean} loading - Show an inline spinner and force the control disabled\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n * @attr {string} label - Visible label\n * @attr {string} name - Form field name\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} placeholder - Input placeholder\n *\n * @fires input - On every keystroke.\n * @fires change - On committed value change.\n *\n * @slot prefix - Content before the input (e.g. icon)\n * @slot suffix - Content after the input (e.g. unit label)\n * @slot label - Custom label content\n * @slot helper - Custom helper text content\n * @slot error - Custom error content\n *\n * @cssprop --number-input-height - Control height\n * @cssprop --number-input-border-color - Border color\n * @cssprop --number-input-radius - Border radius\n * @cssprop --number-input-bg - Background\n * @cssprop --number-input-btn-bg - Spin button background\n *\n * @part control - Control container.\n * @part decrement-btn - Decrement stepper button.\n * @part input - Input element.\n * @part increment-btn - Increment stepper button.\n * @example\n * ```html\n * <ore-number-input label=\"Quantity\" value=\"1\" min=\"1\" max=\"99\" step=\"1\"></ore-number-input>\n * <ore-number-input label=\"Quantity\" success></ore-number-input>\n * <ore-number-input label=\"Quantity\" loading></ore-number-input>\n * ```\n */\nexport const NUMBER_INPUT_TAG = 'ore-number-input' as const;\ndefine<OreNumberInputProps>(NUMBER_INPUT_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n 'large-step': prop.json(undefined as number | undefined),\n loading: prop.bool(false),\n max: prop.json(undefined as number | undefined),\n min: prop.json(undefined as number | undefined),\n name: prop.string(),\n placeholder: prop.string(),\n readonly: prop.bool(false),\n ref: prop.data<((el: HTMLInputElement | null) => void) | null>(),\n step: prop.number(1),\n success: prop.bool(false),\n value: prop.json(undefined as number | undefined),\n variant: prop.string<VisualVariant>(),\n },\n setup(props) {\n const el = getHost();\n const watch = watchEffect;\n\n // `loading` behaves like a temporary `disabled` — see ore-input's identical computation.\n const isDisabled = computed(() => props.disabled.value || props.loading.value);\n const isReadonly = computed(() => Boolean(props.readonly.value));\n\n // Internal numeric value signal (string representation for the input)\n const fieldValue = signal(props.value.value != null ? String(props.value.value) : '');\n\n defineFieldValue(\n el,\n () => fieldValue.value,\n (value) => {\n fieldValue.value = value;\n },\n );\n\n // Keep fieldValue in sync when props.value changes externally\n rippleWatch(props.value, (v) => {\n const next = v != null ? String(v) : '';\n\n if (fieldValue.value !== next) fieldValue.value = next;\n });\n\n function parseValue(): number | null {\n const v = fieldValue.value.trim();\n\n if (!v) return null;\n\n const n = Number.parseFloat(v);\n\n return Number.isNaN(n) ? null : n;\n }\n\n function commit(val: number | null, _originalEvent?: Event) {\n const min = props.min.value != null ? Number(props.min.value) : undefined;\n const max = props.max.value != null ? Number(props.max.value) : undefined;\n const clamped = val != null ? clamp(val, min, max) : null;\n const nextValue = clamped != null ? String(clamped) : '';\n\n if (fieldValue.value !== nextValue) fieldValue.value = nextValue;\n\n setFieldValue(el, nextValue);\n dispatchNativeFieldEvent(el, 'change');\n }\n\n const spinner = createSpinnerControl({\n commit,\n disabled: isDisabled,\n largeStep: props['large-step'],\n max: props.max,\n min: props.min,\n parse: parseValue,\n readonly: isReadonly,\n step: props.step,\n });\n\n // Composition uses ore-input's own documented `ref` prop (fired with the raw\n // <input> on mount, `null` on unmount) instead of reaching into its shadow DOM —\n // see `packages/refine/AGENTS.md` / input.ts's `ref` JSDoc for the supported contract.\n // Set imperatively (rather than declared in the template) because ore's template\n // engine treats a function-valued attr binding as a reactive getter to invoke, not\n // a literal value to assign — a plain property assignment avoids that entirely.\n const bitInputRef = ref<HTMLElementTagNameMap['ore-input']>();\n let stopAriaWatch: (() => void) | null = null;\n let detachListeners: (() => void) | null = null;\n let refSub: { dispose(): void } | null = null;\n\n const handleFieldRef = (rawInput: HTMLInputElement | null): void => {\n if (!rawInput) {\n stopAriaWatch?.();\n detachListeners?.();\n refSub?.dispose();\n stopAriaWatch = null;\n detachListeners = null;\n refSub = null;\n props.ref.value?.(null);\n\n return;\n }\n\n rawInput.setAttribute('inputmode', 'decimal');\n // The wrapper div is a plain layout container — WAI-ARIA spinbutton semantics\n // live on the actually-focusable element (the raw <input> rendered by ore-input).\n rawInput.setAttribute('role', 'spinbutton');\n\n const handleChange = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n const n = val !== '' ? Number.parseFloat(val) : null;\n\n commit(Number.isNaN(n ?? NaN) ? null : n, e);\n };\n\n const handleInput = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n\n fieldValue.value = val;\n setFieldValue(el, val);\n dispatchNativeFieldEvent(el, 'input');\n };\n\n rawInput.addEventListener('change', handleChange);\n rawInput.addEventListener('input', handleInput);\n detachListeners = () => {\n rawInput.removeEventListener('change', handleChange);\n rawInput.removeEventListener('input', handleInput);\n };\n\n stopAriaWatch = watch(() => {\n const now = parseValue();\n\n if (now == null) rawInput.removeAttribute('aria-valuenow');\n else rawInput.setAttribute('aria-valuenow', String(now));\n\n if (props.min.value != null) rawInput.setAttribute('aria-valuemin', String(props.min.value));\n else rawInput.removeAttribute('aria-valuemin');\n\n if (props.max.value != null) rawInput.setAttribute('aria-valuemax', String(props.max.value));\n else rawInput.removeAttribute('aria-valuemax');\n\n if (isReadonly.value) rawInput.setAttribute('aria-readonly', 'true');\n else rawInput.removeAttribute('aria-readonly');\n });\n\n // Fire user ref callback\n props.ref.value?.(rawInput);\n\n refSub = rippleWatch(props.ref, (cb) => {\n cb?.(rawInput);\n });\n };\n\n // ore-input's own onElement/ref lifecycle calls this back with `null` when its\n // inner <input> unmounts, so no explicit teardown is needed here.\n onElement(bitInputRef, (bitInputEl) => {\n bitInputEl.ref = handleFieldRef;\n });\n\n bind({\n attr: {\n size: props.size,\n value: () => fieldValue.value || null,\n variant: props.variant,\n },\n });\n\n const isNonInteractive = computed(() => isDisabled.value || isReadonly.value);\n\n // The stepper buttons are slotted *into* ore-input's own `prefix`/`suffix` slots instead of\n // sitting outside it in a separate wrapper — they render inside ore-input's own bordered\n // box (same as its built-in clear/password-toggle buttons), matching every other field's\n // single-box look instead of floating as two detached icon buttons either side of a\n // narrow field. `@keydown` moves to ore-input itself: native keyboard events are\n // `composed: true` and bubble out past a shadow boundary, so it still sees keydowns\n // originating from ore-input's internal <input> as well as from these slotted buttons.\n return html`\n <ore-input\n class=\"field\"\n part=\"field control\"\n ref=\"${bitInputRef}\"\n value=\"${() => fieldValue.value ?? 0}\"\n label=\"${() => props.label.value ?? ''}\"\n label-placement=\"${() => props['label-placement'].value ?? 'inset'}\"\n placeholder=\"${() => props.placeholder.value ?? ''}\"\n name=\"${() => props.name.value ?? ''}\"\n helper=\"${() => props.helper.value ?? ''}\"\n error=\"${() => props.error.value ?? ''}\"\n size=\"${props.size}\"\n color=\"${() => props.color.value ?? ''}\"\n variant=\"${props.variant}\"\n rounded=\"${() => props.rounded.value}\"\n ?disabled=\"${props.disabled}\"\n ?readonly=\"${isReadonly}\"\n ?fullwidth=\"${() => props.fullwidth.value}\"\n ?loading=\"${() => props.loading.value}\"\n ?success=\"${() => props.success.value}\"\n @keydown=\"${(e: KeyboardEvent) => spinner.handleKeydown(e)}\">\n <button\n slot=\"prefix\"\n type=\"button\"\n part=\"decrement-btn\"\n aria-label=\"Decrease\"\n ?disabled=\"${() => isNonInteractive.value || spinner.atMin()}\"\n @click=\"${(e: Event) => spinner.incrementBy(-(Number(props.step.value) || 1), e)}\">\n <ore-icon name=\"minus\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n <button\n slot=\"suffix\"\n type=\"button\"\n part=\"increment-btn\"\n aria-label=\"Increase\"\n ?disabled=\"${() => isNonInteractive.value || spinner.atMax()}\"\n @click=\"${(e: Event) => spinner.incrementBy(Number(props.step.value) || 1, e)}\">\n <ore-icon name=\"plus\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n </ore-input>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [disabledLoadingMixin, componentStyles],\n});\n"],"mappings":";;;;;;;;;;AA2HA,IAAa,IAAmB;AAChC,EAA4B,GAAkB;CAC5C,gBAAgB;CAChB,OAAO;EACL,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,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,cAAc,EAAK,KAAK,KAAA,CAA+B;EACvD,SAAS,EAAK,KAAK,EAAK;EACxB,KAAK,EAAK,KAAK,KAAA,CAA+B;EAC9C,KAAK,EAAK,KAAK,KAAA,CAA+B;EAC9C,MAAM,EAAK,OAAO;EAClB,aAAa,EAAK,OAAO;EACzB,UAAU,EAAK,KAAK,EAAK;EACzB,KAAK,EAAK,KAAqD;EAC/D,MAAM,EAAK,OAAO,CAAC;EACnB,SAAS,EAAK,KAAK,EAAK;EACxB,OAAO,EAAK,KAAK,KAAA,CAA+B;EAChD,SAAS,EAAK,OAAsB;CACtC;CACA,MAAM,GAAO;EACX,IAAM,IAAK,EAAQ,GACb,IAAQ,GAGR,IAAa,QAAe,EAAM,SAAS,SAAS,EAAM,QAAQ,KAAK,GACvE,IAAa,QAAe,EAAQ,EAAM,SAAS,KAAM,GAGzD,IAAa,EAAO,EAAM,MAAM,SAAS,OAAmC,KAA5B,OAAO,EAAM,MAAM,KAAK,CAAM;EAWpF,AATA,EACE,SACM,EAAW,QAChB,MAAU;GACT,EAAW,QAAQ;EACrB,CACF,GAGA,EAAY,EAAM,QAAQ,MAAM;GAC9B,IAAM,IAAO,KAAK,OAAmB,KAAZ,OAAO,CAAC;GAEjC,AAAI,EAAW,UAAU,MAAM,EAAW,QAAQ;EACpD,CAAC;EAED,SAAS,IAA4B;GACnC,IAAM,IAAI,EAAW,MAAM,KAAK;GAEhC,IAAI,CAAC,GAAG,OAAO;GAEf,IAAM,IAAI,OAAO,WAAW,CAAC;GAE7B,OAAO,OAAO,MAAM,CAAC,IAAI,OAAO;EAClC;EAEA,SAAS,EAAO,GAAoB,GAAwB;GAC1D,IAAM,IAAM,EAAM,IAAI,SAAS,OAAiC,KAAA,IAA1B,OAAO,EAAM,IAAI,KAAK,GACtD,IAAM,EAAM,IAAI,SAAS,OAAiC,KAAA,IAA1B,OAAO,EAAM,IAAI,KAAK,GACtD,IAAU,KAAO,OAA8B,OAAvB,EAAM,GAAK,GAAK,CAAG,GAC3C,IAAY,KAAW,OAAyB,KAAlB,OAAO,CAAO;GAKlD,AAHI,EAAW,UAAU,MAAW,EAAW,QAAQ,IAEvD,EAAc,GAAI,CAAS,GAC3B,EAAyB,GAAI,QAAQ;EACvC;EAEA,IAAM,IAAU,EAAqB;GACnC;GACA,UAAU;GACV,WAAW,EAAM;GACjB,KAAK,EAAM;GACX,KAAK,EAAM;GACX,OAAO;GACP,UAAU;GACV,MAAM,EAAM;EACd,CAAC,GAQK,IAAc,EAAwC,GACxD,IAAqC,MACrC,IAAuC,MACvC,IAAqC,MAEnC,KAAkB,MAA4C;GAClE,IAAI,CAAC,GAAU;IAOb,AANA,IAAgB,GAChB,IAAkB,GAClB,GAAQ,QAAQ,GAChB,IAAgB,MAChB,IAAkB,MAClB,IAAS,MACT,EAAM,IAAI,QAAQ,IAAI;IAEtB;GACF;GAKA,AAHA,EAAS,aAAa,aAAa,SAAS,GAG5C,EAAS,aAAa,QAAQ,YAAY;GAE1C,IAAM,KAAgB,MAAa;IACjC,IAAM,IAAO,EAAE,OAA4B,OACrC,IAAI,MAAQ,KAA8B,OAAzB,OAAO,WAAW,CAAG;IAE5C,EAAO,OAAO,MAAM,KAAK,GAAG,IAAI,OAAO,GAAG,CAAC;GAC7C,GAEM,KAAe,MAAa;IAChC,IAAM,IAAO,EAAE,OAA4B;IAI3C,AAFA,EAAW,QAAQ,GACnB,EAAc,GAAI,CAAG,GACrB,EAAyB,GAAI,OAAO;GACtC;GA4BA,AA1BA,EAAS,iBAAiB,UAAU,CAAY,GAChD,EAAS,iBAAiB,SAAS,CAAW,GAC9C,UAAwB;IAEtB,AADA,EAAS,oBAAoB,UAAU,CAAY,GACnD,EAAS,oBAAoB,SAAS,CAAW;GACnD,GAEA,IAAgB,QAAY;IAC1B,IAAM,IAAM,EAAW;IAWvB,AATI,KAAO,OAAM,EAAS,gBAAgB,eAAe,IACpD,EAAS,aAAa,iBAAiB,OAAO,CAAG,CAAC,GAEnD,EAAM,IAAI,SAAS,OAClB,EAAS,gBAAgB,eAAe,IADhB,EAAS,aAAa,iBAAiB,OAAO,EAAM,IAAI,KAAK,CAAC,GAGvF,EAAM,IAAI,SAAS,OAClB,EAAS,gBAAgB,eAAe,IADhB,EAAS,aAAa,iBAAiB,OAAO,EAAM,IAAI,KAAK,CAAC,GAGvF,EAAW,QAAO,EAAS,aAAa,iBAAiB,MAAM,IAC9D,EAAS,gBAAgB,eAAe;GAC/C,CAAC,GAGD,EAAM,IAAI,QAAQ,CAAQ,GAE1B,IAAS,EAAY,EAAM,MAAM,MAAO;IACtC,IAAK,CAAQ;GACf,CAAC;EACH;EAQA,AAJA,EAAU,IAAc,MAAe;GACrC,EAAW,MAAM;EACnB,CAAC,GAED,EAAK,EACH,MAAM;GACJ,MAAM,EAAM;GACZ,aAAa,EAAW,SAAS;GACjC,SAAS,EAAM;EACjB,EACF,CAAC;EAED,IAAM,IAAmB,QAAe,EAAW,SAAS,EAAW,KAAK;EAS5E,OAAO,CAAI;;;;eAIA,EAAY;uBACJ,EAAW,SAAS,EAAE;uBACtB,EAAM,MAAM,SAAS,GAAG;iCACd,EAAM,kBAAkB,CAAC,SAAS,QAAQ;6BAC9C,EAAM,YAAY,SAAS,GAAG;sBACrC,EAAM,KAAK,SAAS,GAAG;wBACrB,EAAM,OAAO,SAAS,GAAG;uBAC1B,EAAM,MAAM,SAAS,GAAG;gBAC/B,EAAM,KAAK;uBACJ,EAAM,MAAM,SAAS,GAAG;mBAC5B,EAAM,QAAQ;yBACR,EAAM,QAAQ,MAAM;qBACxB,EAAM,SAAS;qBACf,EAAW;4BACJ,EAAM,UAAU,MAAM;0BACxB,EAAM,QAAQ,MAAM;0BACpB,EAAM,QAAQ,MAAM;qBACzB,MAAqB,EAAQ,cAAc,CAAC,EAAE;;;;;;6BAMtC,EAAiB,SAAS,EAAQ,MAAM,EAAE;qBAClD,MAAa,EAAQ,YAAY,EAAE,OAAO,EAAM,KAAK,KAAK,KAAK,IAAI,CAAC,EAAE;;;;;;;;6BAQ9D,EAAiB,SAAS,EAAQ,MAAM,EAAE;qBAClD,MAAa,EAAQ,YAAY,OAAO,EAAM,KAAK,KAAK,KAAK,GAAG,CAAC,EAAE;;;;;CAKtF;CACA,QAAQ,EAAE,gBAAgB,GAAK;CAC/B,QAAQ,CAAC,GAAsB,CAAe;AAChD,CAAC"}
1
+ {"version":3,"file":"number-input.js","names":[],"sources":["../src/inputs/number-input/number-input.ts"],"sourcesContent":["import { clamp } from '@vielzeug/arsenal/math';\nimport { bind, define, getHost, html, onElement, prop, ref, watchEffect } from '@vielzeug/ore';\nimport { computed, watch as rippleWatch, signal } from '@vielzeug/ripple';\nimport { createSpinnerControl } from '../../core';\nimport type { ComponentSize, ThemeColor, VisualVariant } from '../../types';\nimport '../../content/icon/icon';\nimport '../input/input';\nimport { disablableBundle, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { disabledLoadingMixin } from '../../styles';\nimport { defineFieldValue, dispatchNativeFieldEvent, setFieldValue } from '../shared/native-field-event';\nimport componentStyles from './number-input.css?inline';\n\nexport type OreNumberInputEvents = {\n change: Event;\n input: InputEvent;\n};\n\n/** Number Input props */\nexport type OreNumberInputProps = {\n /** Theme color */\n color?: ThemeColor;\n /** Disable interaction */\n disabled?: boolean;\n /** Error message */\n error?: string;\n /** Stretch to full width of container */\n fullwidth?: boolean;\n /** Helper text */\n helper?: string;\n /** Visible label */\n label?: string;\n /** Label placement: 'inset' renders the label inside the control box, 'outside' renders it above */\n 'label-placement'?: 'inset' | 'outside';\n /** Large step (for Page Up/Down, default: 10 × step) */\n 'large-step'?: number;\n /**\n * Shows an inline spinner inside the field and forces the control into `disabled` for the\n * duration — use while an async validation/submission request is in flight to prevent\n * double-submits.\n */\n loading?: boolean;\n /** Maximum allowed value */\n max?: number;\n /** Minimum allowed value */\n min?: number;\n /** Form field name */\n name?: string;\n /** Placeholder text */\n placeholder?: string;\n /** Make the input read-only */\n readonly?: boolean;\n /**\n * JS-only callback fired with the inner `<input>` element when it mounts,\n * and with `null` when it unmounts.\n * Set as a JS property: `bitNumberInput.ref = (el) => { ... }`.\n */\n ref?: ((el: HTMLInputElement | null) => void) | null;\n /** Border radius */\n rounded?: string;\n /** Component size */\n size?: ComponentSize;\n /** Step size for increment/decrement */\n step?: number;\n /**\n * Shows an inline green check icon inside the field to confirm the value has\n * passed validation. Ignored while `error` is set — an error always wins.\n */\n success?: boolean;\n /** Current numeric value */\n value?: number;\n /** Visual variant */\n variant?: VisualVariant;\n};\n\n/**\n * A numeric spin-button input with +/− controls, min/max clamping, and full keyboard support.\n *\n * @element ore-number-input\n *\n * @attr {number} value - Current value\n * @attr {number} min - Minimum value\n * @attr {number} max - Maximum value\n * @attr {number} step - Increment/decrement step (default: 1)\n * @attr {number} large-step - Step for Page Up/Down (default: 10)\n * @attr {boolean} disabled - Disables the control\n * @attr {boolean} readonly - Read-only mode\n * @attr {boolean} loading - Show an inline spinner and force the control disabled\n * @attr {boolean} success - Show an inline success check icon (suppressed while `error` is set)\n * @attr {string} label - Visible label\n * @attr {string} name - Form field name\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} size - 'sm' | 'md' | 'lg'\n * @attr {string} placeholder - Input placeholder\n *\n * @fires input - On every keystroke.\n * @fires change - On committed value change.\n *\n * @slot prefix - Content before the input (e.g. icon)\n * @slot suffix - Content after the input (e.g. unit label)\n * @slot label - Custom label content\n * @slot helper - Custom helper text content\n * @slot error - Custom error content\n *\n * @cssprop --number-input-height - Control height\n * @cssprop --number-input-border-color - Border color\n * @cssprop --number-input-radius - Border radius\n * @cssprop --number-input-bg - Background\n * @cssprop --number-input-btn-bg - Spin button background\n *\n * @part control - Control container.\n * @part decrement-btn - Decrement stepper button.\n * @part input - Input element.\n * @part increment-btn - Increment stepper button.\n * @example\n * ```html\n * <ore-number-input label=\"Quantity\" value=\"1\" min=\"1\" max=\"99\" step=\"1\"></ore-number-input>\n * <ore-number-input label=\"Quantity\" success></ore-number-input>\n * <ore-number-input label=\"Quantity\" loading></ore-number-input>\n * ```\n */\nexport const NUMBER_INPUT_TAG = 'ore-number-input' as const;\ndefine<OreNumberInputProps>(NUMBER_INPUT_TAG, {\n formAssociated: true,\n props: {\n ...themableBundle,\n ...sizableBundle,\n ...disablableBundle,\n ...roundableBundle,\n error: prop.string(),\n fullwidth: prop.bool(false),\n helper: prop.string(),\n label: prop.string(),\n 'label-placement': prop.oneOf(['inset', 'outside'] as const, 'inset'),\n 'large-step': prop.json(undefined as number | undefined),\n loading: prop.bool(false),\n max: prop.json(undefined as number | undefined),\n min: prop.json(undefined as number | undefined),\n name: prop.string(),\n placeholder: prop.string(),\n readonly: prop.bool(false),\n ref: prop.data<((el: HTMLInputElement | null) => void) | null>(),\n step: prop.number(1),\n success: prop.bool(false),\n value: prop.json(undefined as number | undefined),\n variant: prop.string<VisualVariant>(),\n },\n setup(props) {\n const el = getHost();\n const watch = watchEffect;\n\n // `loading` behaves like a temporary `disabled` — see ore-input's identical computation.\n const isDisabled = computed(() => props.disabled.value || props.loading.value);\n const isReadonly = computed(() => Boolean(props.readonly.value));\n\n // Internal numeric value signal (string representation for the input)\n const fieldValue = signal(props.value.value != null ? String(props.value.value) : '');\n\n defineFieldValue(\n el,\n () => fieldValue.value,\n (value) => {\n fieldValue.value = value;\n },\n );\n\n // Keep fieldValue in sync when props.value changes externally\n rippleWatch(props.value, (v) => {\n const next = v != null ? String(v) : '';\n\n if (fieldValue.value !== next) fieldValue.value = next;\n });\n\n function parseValue(): number | null {\n const v = fieldValue.value.trim();\n\n if (!v) return null;\n\n const n = Number.parseFloat(v);\n\n return Number.isNaN(n) ? null : n;\n }\n\n function commit(val: number | null, _originalEvent?: Event) {\n const min = props.min.value != null ? Number(props.min.value) : undefined;\n const max = props.max.value != null ? Number(props.max.value) : undefined;\n const clamped = val != null ? clamp(val, min, max) : null;\n const nextValue = clamped != null ? String(clamped) : '';\n\n if (fieldValue.value !== nextValue) fieldValue.value = nextValue;\n\n setFieldValue(el, nextValue);\n dispatchNativeFieldEvent(el, 'change');\n }\n\n const spinner = createSpinnerControl({\n commit,\n disabled: isDisabled,\n largeStep: props['large-step'],\n max: props.max,\n min: props.min,\n parse: parseValue,\n readonly: isReadonly,\n step: props.step,\n });\n\n // Composition uses ore-input's own documented `ref` prop (fired with the raw\n // <input> on mount, `null` on unmount) instead of reaching into its shadow DOM —\n // see `packages/refine/AGENTS.md` / input.ts's `ref` JSDoc for the supported contract.\n // Set imperatively (rather than declared in the template) because ore's template\n // engine treats a function-valued attr binding as a reactive getter to invoke, not\n // a literal value to assign — a plain property assignment avoids that entirely.\n const bitInputRef = ref<HTMLElementTagNameMap['ore-input']>();\n let stopAriaWatch: (() => void) | null = null;\n let detachListeners: (() => void) | null = null;\n let refSub: { dispose(): void } | null = null;\n\n const handleFieldRef = (rawInput: HTMLInputElement | null): void => {\n if (!rawInput) {\n stopAriaWatch?.();\n detachListeners?.();\n refSub?.dispose();\n stopAriaWatch = null;\n detachListeners = null;\n refSub = null;\n props.ref.value?.(null);\n\n return;\n }\n\n rawInput.setAttribute('inputmode', 'decimal');\n // The wrapper div is a plain layout container — WAI-ARIA spinbutton semantics\n // live on the actually-focusable element (the raw <input> rendered by ore-input).\n rawInput.setAttribute('role', 'spinbutton');\n\n const handleChange = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n const n = val !== '' ? Number.parseFloat(val) : null;\n\n commit(Number.isNaN(n ?? NaN) ? null : n, e);\n };\n\n const handleInput = (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n\n fieldValue.value = val;\n setFieldValue(el, val);\n dispatchNativeFieldEvent(el, 'input');\n };\n\n rawInput.addEventListener('change', handleChange);\n rawInput.addEventListener('input', handleInput);\n detachListeners = () => {\n rawInput.removeEventListener('change', handleChange);\n rawInput.removeEventListener('input', handleInput);\n };\n\n stopAriaWatch = watch(() => {\n const now = parseValue();\n\n if (now == null) rawInput.removeAttribute('aria-valuenow');\n else rawInput.setAttribute('aria-valuenow', String(now));\n\n if (props.min.value != null) rawInput.setAttribute('aria-valuemin', String(props.min.value));\n else rawInput.removeAttribute('aria-valuemin');\n\n if (props.max.value != null) rawInput.setAttribute('aria-valuemax', String(props.max.value));\n else rawInput.removeAttribute('aria-valuemax');\n\n if (isReadonly.value) rawInput.setAttribute('aria-readonly', 'true');\n else rawInput.removeAttribute('aria-readonly');\n });\n\n // Fire user ref callback\n props.ref.value?.(rawInput);\n\n refSub = rippleWatch(props.ref, (cb) => {\n cb?.(rawInput);\n });\n };\n\n // ore-input's own onElement/ref lifecycle calls this back with `null` when its\n // inner <input> unmounts, so no explicit teardown is needed here.\n onElement(bitInputRef, (bitInputEl) => {\n bitInputEl.ref = handleFieldRef;\n });\n\n bind({\n attr: {\n size: props.size,\n value: () => fieldValue.value || null,\n variant: props.variant,\n },\n });\n\n const isNonInteractive = computed(() => isDisabled.value || isReadonly.value);\n\n // The stepper buttons are slotted *into* ore-input's own `prefix`/`suffix` slots instead of\n // sitting outside it in a separate wrapper — they render inside ore-input's own bordered\n // box (same as its built-in clear/password-toggle buttons), matching every other field's\n // single-box look instead of floating as two detached icon buttons either side of a\n // narrow field. `@keydown` moves to ore-input itself: native keyboard events are\n // `composed: true` and bubble out past a shadow boundary, so it still sees keydowns\n // originating from ore-input's internal <input> as well as from these slotted buttons.\n return html`\n <ore-input\n class=\"field\"\n part=\"field control\"\n ref=\"${bitInputRef}\"\n value=\"${() => fieldValue.value ?? 0}\"\n label=\"${() => props.label.value ?? ''}\"\n label-placement=\"${() => props['label-placement'].value ?? 'inset'}\"\n placeholder=\"${() => props.placeholder.value ?? ''}\"\n name=\"${() => props.name.value ?? ''}\"\n helper=\"${() => props.helper.value ?? ''}\"\n error=\"${() => props.error.value ?? ''}\"\n size=\"${props.size}\"\n color=\"${() => props.color.value ?? ''}\"\n variant=\"${props.variant}\"\n rounded=\"${() => props.rounded.value}\"\n ?disabled=\"${props.disabled}\"\n ?readonly=\"${isReadonly}\"\n ?fullwidth=\"${() => props.fullwidth.value}\"\n ?loading=\"${() => props.loading.value}\"\n ?success=\"${() => props.success.value}\"\n @keydown=\"${(e: KeyboardEvent) => spinner.handleKeydown(e)}\">\n <button\n slot=\"prefix\"\n type=\"button\"\n part=\"decrement-btn\"\n aria-label=\"Decrease\"\n ?disabled=\"${() => isNonInteractive.value || spinner.atMin()}\"\n @click=\"${(e: Event) => spinner.incrementBy(-(Number(props.step.value) || 1), e)}\">\n <ore-icon name=\"minus\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n <button\n slot=\"suffix\"\n type=\"button\"\n part=\"increment-btn\"\n aria-label=\"Increase\"\n ?disabled=\"${() => isNonInteractive.value || spinner.atMax()}\"\n @click=\"${(e: Event) => spinner.incrementBy(Number(props.step.value) || 1, e)}\">\n <ore-icon name=\"plus\" size=\"14\" stroke-width=\"2.5\" aria-hidden=\"true\"></ore-icon>\n </button>\n </ore-input>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [disabledLoadingMixin, componentStyles],\n});\n"],"mappings":"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"}