@vielzeug/refine 1.1.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (768) hide show
  1. package/dist/accordion-item.cjs +4 -4
  2. package/dist/accordion-item.cjs.map +1 -1
  3. package/dist/accordion-item.js +41 -41
  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 +21 -21
  8. package/dist/accordion.js.map +1 -1
  9. package/dist/alert.cjs +5 -5
  10. package/dist/alert.cjs.map +1 -1
  11. package/dist/alert.js +21 -21
  12. package/dist/alert.js.map +1 -1
  13. package/dist/async.cjs +10 -10
  14. package/dist/async.cjs.map +1 -1
  15. package/dist/async.js +27 -27
  16. package/dist/async.js.map +1 -1
  17. package/dist/avatar.cjs +2 -2
  18. package/dist/avatar.cjs.map +1 -1
  19. package/dist/avatar.js +30 -30
  20. package/dist/avatar.js.map +1 -1
  21. package/dist/badge.cjs +1 -1
  22. package/dist/badge.cjs.map +1 -1
  23. package/dist/badge.js +1 -1
  24. package/dist/box.cjs +1 -1
  25. package/dist/box.cjs.map +1 -1
  26. package/dist/box.js +1 -1
  27. package/dist/breadcrumb.cjs +2 -2
  28. package/dist/breadcrumb.cjs.map +1 -1
  29. package/dist/breadcrumb.js +20 -20
  30. package/dist/breadcrumb.js.map +1 -1
  31. package/dist/button-group.cjs +1 -1
  32. package/dist/button-group.cjs.map +1 -1
  33. package/dist/button-group.js +7 -7
  34. package/dist/button-group.js.map +1 -1
  35. package/dist/button.cjs +6 -6
  36. package/dist/button.cjs.map +1 -1
  37. package/dist/button.js +44 -42
  38. package/dist/button.js.map +1 -1
  39. package/dist/calendar.cjs +28 -28
  40. package/dist/calendar.cjs.map +1 -1
  41. package/dist/calendar.js +93 -91
  42. package/dist/calendar.js.map +1 -1
  43. package/dist/card.cjs +6 -6
  44. package/dist/card.cjs.map +1 -1
  45. package/dist/card.js +35 -34
  46. package/dist/card.js.map +1 -1
  47. package/dist/carousel.cjs +19 -19
  48. package/dist/carousel.cjs.map +1 -1
  49. package/dist/carousel.js +111 -111
  50. package/dist/carousel.js.map +1 -1
  51. package/dist/chat-message.cjs +47 -0
  52. package/dist/chat-message.cjs.map +1 -0
  53. package/dist/chat-message.js +121 -0
  54. package/dist/chat-message.js.map +1 -0
  55. package/dist/checkbox-group.cjs +9 -9
  56. package/dist/checkbox-group.cjs.map +1 -1
  57. package/dist/checkbox-group.js +54 -52
  58. package/dist/checkbox-group.js.map +1 -1
  59. package/dist/checkbox.cjs +4 -4
  60. package/dist/checkbox.cjs.map +1 -1
  61. package/dist/checkbox.js +39 -37
  62. package/dist/checkbox.js.map +1 -1
  63. package/dist/chip.cjs +14 -14
  64. package/dist/chip.cjs.map +1 -1
  65. package/dist/chip.js +43 -43
  66. package/dist/chip.js.map +1 -1
  67. package/dist/code-window.cjs +1 -1
  68. package/dist/code-window.cjs.map +1 -1
  69. package/dist/code-window.js +1 -1
  70. package/dist/combobox.cjs +25 -25
  71. package/dist/combobox.cjs.map +1 -1
  72. package/dist/combobox.js +181 -179
  73. package/dist/combobox.js.map +1 -1
  74. package/dist/command-palette.cjs +62 -0
  75. package/dist/command-palette.cjs.map +1 -0
  76. package/dist/command-palette.js +179 -0
  77. package/dist/command-palette.js.map +1 -0
  78. package/dist/content/avatar/{avatar-group.css?inline.cjs → avatar-group.css.cjs} +1 -1
  79. package/dist/content/avatar/avatar-group.css.cjs.map +1 -0
  80. package/dist/content/avatar/{avatar-group.css?inline.js → avatar-group.css.js} +1 -1
  81. package/dist/content/avatar/avatar-group.css.js.map +1 -0
  82. package/dist/content/avatar/{avatar.css?inline.cjs → avatar.css.cjs} +1 -1
  83. package/dist/content/avatar/avatar.css.cjs.map +1 -0
  84. package/dist/content/avatar/{avatar.css?inline.js → avatar.css.js} +1 -1
  85. package/dist/content/avatar/avatar.css.js.map +1 -0
  86. package/dist/content/breadcrumb/{breadcrumb-item.css?inline.cjs → breadcrumb-item.css.cjs} +1 -1
  87. package/dist/content/breadcrumb/breadcrumb-item.css.cjs.map +1 -0
  88. package/dist/content/breadcrumb/{breadcrumb-item.css?inline.js → breadcrumb-item.css.js} +1 -1
  89. package/dist/content/breadcrumb/breadcrumb-item.css.js.map +1 -0
  90. package/dist/content/breadcrumb/{breadcrumb.css?inline.cjs → breadcrumb.css.cjs} +1 -1
  91. package/dist/content/breadcrumb/breadcrumb.css.cjs.map +1 -0
  92. package/dist/content/breadcrumb/{breadcrumb.css?inline.js → breadcrumb.css.js} +1 -1
  93. package/dist/content/breadcrumb/breadcrumb.css.js.map +1 -0
  94. package/dist/content/card/{card.css?inline.cjs → card.css.cjs} +1 -1
  95. package/dist/content/card/card.css.cjs.map +1 -0
  96. package/dist/content/card/{card.css?inline.js → card.css.js} +1 -1
  97. package/dist/content/card/card.css.js.map +1 -0
  98. package/dist/content/carousel/carousel-slide.cjs +1 -1
  99. package/dist/content/carousel/carousel-slide.cjs.map +1 -1
  100. package/dist/content/carousel/{carousel-slide.css?inline.cjs → carousel-slide.css.cjs} +1 -1
  101. package/dist/content/carousel/carousel-slide.css.cjs.map +1 -0
  102. package/dist/content/carousel/{carousel-slide.css?inline.js → carousel-slide.css.js} +1 -1
  103. package/dist/content/carousel/carousel-slide.css.js.map +1 -0
  104. package/dist/content/carousel/carousel-slide.js +7 -7
  105. package/dist/content/carousel/carousel-slide.js.map +1 -1
  106. package/dist/content/carousel/{carousel.css?inline.cjs → carousel.css.cjs} +1 -1
  107. package/dist/content/carousel/carousel.css.cjs.map +1 -0
  108. package/dist/content/carousel/{carousel.css?inline.js → carousel.css.js} +1 -1
  109. package/dist/content/carousel/carousel.css.js.map +1 -0
  110. package/dist/content/chat-message/chat-message.css.cjs +2 -0
  111. package/dist/content/chat-message/chat-message.css.cjs.map +1 -0
  112. package/dist/content/chat-message/chat-message.css.js +6 -0
  113. package/dist/content/chat-message/chat-message.css.js.map +1 -0
  114. package/dist/content/chat-message/chat-message.d.ts +87 -0
  115. package/dist/content/chat-message/chat-message.d.ts.map +1 -0
  116. package/dist/content/code-window/{code-window.css?inline.cjs → code-window.css.cjs} +1 -1
  117. package/dist/content/code-window/code-window.css.cjs.map +1 -0
  118. package/dist/content/code-window/{code-window.css?inline.js → code-window.css.js} +1 -1
  119. package/dist/content/code-window/code-window.css.js.map +1 -0
  120. package/dist/content/copy-command/{copy-command.css?inline.cjs → copy-command.css.cjs} +1 -1
  121. package/dist/content/copy-command/copy-command.css.cjs.map +1 -0
  122. package/dist/content/copy-command/{copy-command.css?inline.js → copy-command.css.js} +1 -1
  123. package/dist/content/copy-command/copy-command.css.js.map +1 -0
  124. package/dist/content/icon/{icon.css?inline.cjs → icon.css.cjs} +1 -1
  125. package/dist/content/icon/icon.css.cjs.map +1 -0
  126. package/dist/content/icon/{icon.css?inline.js → icon.css.js} +1 -1
  127. package/dist/content/icon/icon.css.js.map +1 -0
  128. package/dist/content/index.d.ts +2 -0
  129. package/dist/content/index.d.ts.map +1 -1
  130. package/dist/content/pagination/{pagination.css?inline.cjs → pagination.css.cjs} +1 -1
  131. package/dist/content/pagination/pagination.css.cjs.map +1 -0
  132. package/dist/content/pagination/{pagination.css?inline.js → pagination.css.js} +1 -1
  133. package/dist/content/pagination/pagination.css.js.map +1 -0
  134. package/dist/content/separator/{separator.css?inline.cjs → separator.css.cjs} +1 -1
  135. package/dist/content/separator/separator.css.cjs.map +1 -0
  136. package/dist/content/separator/{separator.css?inline.js → separator.css.js} +1 -1
  137. package/dist/content/separator/separator.css.js.map +1 -0
  138. package/dist/content/table/{table.css?inline.cjs → table.css.cjs} +1 -1
  139. package/dist/content/table/table.css.cjs.map +1 -0
  140. package/dist/content/table/{table.css?inline.js → table.css.js} +1 -1
  141. package/dist/content/table/table.css.js.map +1 -0
  142. package/dist/content/text/{text.css?inline.cjs → text.css.cjs} +1 -1
  143. package/dist/content/text/text.css.cjs.map +1 -0
  144. package/dist/content/text/{text.css?inline.js → text.css.js} +1 -1
  145. package/dist/content/text/text.css.js.map +1 -0
  146. package/dist/copy-command.cjs +5 -5
  147. package/dist/copy-command.cjs.map +1 -1
  148. package/dist/copy-command.js +25 -25
  149. package/dist/copy-command.js.map +1 -1
  150. package/dist/custom-elements.json +5579 -4843
  151. package/dist/datagrid.cjs +109 -109
  152. package/dist/datagrid.cjs.map +1 -1
  153. package/dist/datagrid.js +194 -194
  154. package/dist/datagrid.js.map +1 -1
  155. package/dist/date-picker.cjs +40 -40
  156. package/dist/date-picker.cjs.map +1 -1
  157. package/dist/date-picker.js +116 -114
  158. package/dist/date-picker.js.map +1 -1
  159. package/dist/dialog.cjs +5 -5
  160. package/dist/dialog.cjs.map +1 -1
  161. package/dist/dialog.js +28 -28
  162. package/dist/dialog.js.map +1 -1
  163. package/dist/disclosure/accordion/{accordion.css?inline.cjs → accordion.css.cjs} +1 -1
  164. package/dist/disclosure/accordion/accordion.css.cjs.map +1 -0
  165. package/dist/disclosure/accordion/{accordion.css?inline.js → accordion.css.js} +1 -1
  166. package/dist/disclosure/accordion/accordion.css.js.map +1 -0
  167. package/dist/disclosure/accordion-item/{accordion-item.css?inline.cjs → accordion-item.css.cjs} +1 -1
  168. package/dist/disclosure/accordion-item/accordion-item.css.cjs.map +1 -0
  169. package/dist/disclosure/accordion-item/{accordion-item.css?inline.js → accordion-item.css.js} +1 -1
  170. package/dist/disclosure/accordion-item/accordion-item.css.js.map +1 -0
  171. package/dist/disclosure/tab-item/{tab-item.css?inline.cjs → tab-item.css.cjs} +1 -1
  172. package/dist/disclosure/tab-item/tab-item.css.cjs.map +1 -0
  173. package/dist/disclosure/tab-item/{tab-item.css?inline.js → tab-item.css.js} +1 -1
  174. package/dist/disclosure/tab-item/tab-item.css.js.map +1 -0
  175. package/dist/disclosure/tab-panel/{tab-panel.css?inline.cjs → tab-panel.css.cjs} +1 -1
  176. package/dist/disclosure/tab-panel/tab-panel.css.cjs.map +1 -0
  177. package/dist/disclosure/tab-panel/{tab-panel.css?inline.js → tab-panel.css.js} +1 -1
  178. package/dist/disclosure/tab-panel/tab-panel.css.js.map +1 -0
  179. package/dist/disclosure/tabs/{tabs.css?inline.cjs → tabs.css.cjs} +1 -1
  180. package/dist/disclosure/tabs/tabs.css.cjs.map +1 -0
  181. package/dist/disclosure/tabs/{tabs.css?inline.js → tabs.css.js} +1 -1
  182. package/dist/disclosure/tabs/tabs.css.js.map +1 -0
  183. package/dist/drawer.cjs +9 -9
  184. package/dist/drawer.cjs.map +1 -1
  185. package/dist/drawer.js +80 -80
  186. package/dist/drawer.js.map +1 -1
  187. package/dist/feedback/alert/{alert.css?inline.cjs → alert.css.cjs} +1 -1
  188. package/dist/feedback/alert/alert.css.cjs.map +1 -0
  189. package/dist/feedback/alert/{alert.css?inline.js → alert.css.js} +1 -1
  190. package/dist/feedback/alert/alert.css.js.map +1 -0
  191. package/dist/feedback/async/{async.css?inline.cjs → async.css.cjs} +1 -1
  192. package/dist/feedback/async/async.css.cjs.map +1 -0
  193. package/dist/feedback/async/{async.css?inline.js → async.css.js} +1 -1
  194. package/dist/feedback/async/async.css.js.map +1 -0
  195. package/dist/feedback/badge/{badge.css?inline.cjs → badge.css.cjs} +1 -1
  196. package/dist/feedback/badge/badge.css.cjs.map +1 -0
  197. package/dist/feedback/badge/{badge.css?inline.js → badge.css.js} +1 -1
  198. package/dist/feedback/badge/badge.css.js.map +1 -0
  199. package/dist/feedback/chip/{chip.css?inline.cjs → chip.css.cjs} +1 -1
  200. package/dist/feedback/chip/chip.css.cjs.map +1 -0
  201. package/dist/feedback/chip/{chip.css?inline.js → chip.css.js} +1 -1
  202. package/dist/feedback/chip/chip.css.js.map +1 -0
  203. package/dist/feedback/index.d.ts +2 -0
  204. package/dist/feedback/index.d.ts.map +1 -1
  205. package/dist/feedback/password-strength/{password-strength.css?inline.cjs → password-strength.css.cjs} +1 -1
  206. package/dist/feedback/password-strength/password-strength.css.cjs.map +1 -0
  207. package/dist/feedback/password-strength/{password-strength.css?inline.js → password-strength.css.js} +1 -1
  208. package/dist/feedback/password-strength/password-strength.css.js.map +1 -0
  209. package/dist/feedback/progress/{progress.css?inline.cjs → progress.css.cjs} +1 -1
  210. package/dist/feedback/progress/progress.css.cjs.map +1 -0
  211. package/dist/feedback/progress/{progress.css?inline.js → progress.css.js} +1 -1
  212. package/dist/feedback/progress/progress.css.js.map +1 -0
  213. package/dist/feedback/skeleton/{skeleton.css?inline.cjs → skeleton.css.cjs} +1 -1
  214. package/dist/feedback/skeleton/skeleton.css.cjs.map +1 -0
  215. package/dist/feedback/skeleton/{skeleton.css?inline.js → skeleton.css.js} +1 -1
  216. package/dist/feedback/skeleton/skeleton.css.js.map +1 -0
  217. package/dist/feedback/toast/{toast.css?inline.cjs → toast.css.cjs} +1 -1
  218. package/dist/feedback/toast/toast.css.cjs.map +1 -0
  219. package/dist/feedback/toast/{toast.css?inline.js → toast.css.js} +1 -1
  220. package/dist/feedback/toast/toast.css.js.map +1 -0
  221. package/dist/feedback/toast/toast.d.ts.map +1 -1
  222. package/dist/feedback/typing-indicator/typing-indicator.css.cjs +2 -0
  223. package/dist/feedback/typing-indicator/typing-indicator.css.cjs.map +1 -0
  224. package/dist/feedback/typing-indicator/typing-indicator.css.js +6 -0
  225. package/dist/feedback/typing-indicator/typing-indicator.css.js.map +1 -0
  226. package/dist/feedback/typing-indicator/typing-indicator.d.ts +42 -0
  227. package/dist/feedback/typing-indicator/typing-indicator.d.ts.map +1 -0
  228. package/dist/file-input.cjs +56 -34
  229. package/dist/file-input.cjs.map +1 -1
  230. package/dist/file-input.js +143 -104
  231. package/dist/file-input.js.map +1 -1
  232. package/dist/form.cjs +3 -3
  233. package/dist/form.cjs.map +1 -1
  234. package/dist/form.js +28 -25
  235. package/dist/form.js.map +1 -1
  236. package/dist/grid-item.cjs +1 -1
  237. package/dist/grid-item.cjs.map +1 -1
  238. package/dist/grid-item.js +19 -19
  239. package/dist/grid-item.js.map +1 -1
  240. package/dist/grid.cjs +1 -1
  241. package/dist/grid.cjs.map +1 -1
  242. package/dist/grid.js +48 -48
  243. package/dist/grid.js.map +1 -1
  244. package/dist/icon.cjs +1 -1
  245. package/dist/icon.cjs.map +1 -1
  246. package/dist/icon.js +26 -26
  247. package/dist/icon.js.map +1 -1
  248. package/dist/index.cjs +1 -1
  249. package/dist/index.js +52 -49
  250. package/dist/input.cjs +25 -25
  251. package/dist/input.cjs.map +1 -1
  252. package/dist/input.js +75 -73
  253. package/dist/input.js.map +1 -1
  254. package/dist/inputs/button/{button.css?inline.cjs → button.css.cjs} +1 -1
  255. package/dist/inputs/button/button.css.cjs.map +1 -0
  256. package/dist/inputs/button/{button.css?inline.js → button.css.js} +1 -1
  257. package/dist/inputs/button/button.css.js.map +1 -0
  258. package/dist/inputs/button/button.d.ts.map +1 -1
  259. package/dist/inputs/button-group/{button-group.css?inline.cjs → button-group.css.cjs} +1 -1
  260. package/dist/inputs/button-group/button-group.css.cjs.map +1 -0
  261. package/dist/inputs/button-group/{button-group.css?inline.js → button-group.css.js} +1 -1
  262. package/dist/inputs/button-group/button-group.css.js.map +1 -0
  263. package/dist/inputs/calendar/{calendar.css?inline.cjs → calendar.css.cjs} +1 -1
  264. package/dist/inputs/calendar/calendar.css.cjs.map +1 -0
  265. package/dist/inputs/calendar/{calendar.css?inline.js → calendar.css.js} +1 -1
  266. package/dist/inputs/calendar/calendar.css.js.map +1 -0
  267. package/dist/inputs/calendar/calendar.d.ts.map +1 -1
  268. package/dist/inputs/checkbox/{checkbox.css?inline.cjs → checkbox.css.cjs} +1 -1
  269. package/dist/inputs/checkbox/checkbox.css.cjs.map +1 -0
  270. package/dist/inputs/checkbox/{checkbox.css?inline.js → checkbox.css.js} +1 -1
  271. package/dist/inputs/checkbox/checkbox.css.js.map +1 -0
  272. package/dist/inputs/checkbox/checkbox.d.ts.map +1 -1
  273. package/dist/inputs/checkbox-group/{checkbox-group.css?inline.cjs → checkbox-group.css.cjs} +1 -1
  274. package/dist/inputs/checkbox-group/checkbox-group.css.cjs.map +1 -0
  275. package/dist/inputs/checkbox-group/{checkbox-group.css?inline.js → checkbox-group.css.js} +1 -1
  276. package/dist/inputs/checkbox-group/checkbox-group.css.js.map +1 -0
  277. package/dist/inputs/checkbox-group/checkbox-group.d.ts.map +1 -1
  278. package/dist/inputs/combobox/{combobox.css?inline.cjs → combobox.css.cjs} +1 -1
  279. package/dist/inputs/combobox/combobox.css.cjs.map +1 -0
  280. package/dist/inputs/combobox/{combobox.css?inline.js → combobox.css.js} +1 -1
  281. package/dist/inputs/combobox/combobox.css.js.map +1 -0
  282. package/dist/inputs/combobox/combobox.d.ts.map +1 -1
  283. package/dist/inputs/datagrid/{datagrid.css?inline.cjs → datagrid.css.cjs} +1 -1
  284. package/dist/inputs/datagrid/datagrid.css.cjs.map +1 -0
  285. package/dist/inputs/datagrid/{datagrid.css?inline.js → datagrid.css.js} +1 -1
  286. package/dist/inputs/datagrid/datagrid.css.js.map +1 -0
  287. package/dist/inputs/date-picker/{date-picker.css?inline.cjs → date-picker.css.cjs} +1 -1
  288. package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -0
  289. package/dist/inputs/date-picker/{date-picker.css?inline.js → date-picker.css.js} +1 -1
  290. package/dist/inputs/date-picker/date-picker.css.js.map +1 -0
  291. package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
  292. package/dist/inputs/file-input/{file-input.css?inline.cjs → file-input.css.cjs} +2 -2
  293. package/dist/inputs/file-input/file-input.css.cjs.map +1 -0
  294. package/dist/inputs/file-input/{file-input.css?inline.js → file-input.css.js} +2 -2
  295. package/dist/inputs/file-input/file-input.css.js.map +1 -0
  296. package/dist/inputs/file-input/file-input.d.ts +9 -0
  297. package/dist/inputs/file-input/file-input.d.ts.map +1 -1
  298. package/dist/inputs/form/{form.css?inline.cjs → form.css.cjs} +1 -1
  299. package/dist/inputs/form/form.css.cjs.map +1 -0
  300. package/dist/inputs/form/{form.css?inline.js → form.css.js} +1 -1
  301. package/dist/inputs/form/form.css.js.map +1 -0
  302. package/dist/inputs/input/{input.css?inline.cjs → input.css.cjs} +1 -1
  303. package/dist/inputs/input/input.css.cjs.map +1 -0
  304. package/dist/inputs/input/{input.css?inline.js → input.css.js} +1 -1
  305. package/dist/inputs/input/input.css.js.map +1 -0
  306. package/dist/inputs/input/input.d.ts.map +1 -1
  307. package/dist/inputs/number-input/{number-input.css?inline.cjs → number-input.css.cjs} +1 -1
  308. package/dist/inputs/number-input/number-input.css.cjs.map +1 -0
  309. package/dist/inputs/number-input/{number-input.css?inline.js → number-input.css.js} +1 -1
  310. package/dist/inputs/number-input/number-input.css.js.map +1 -0
  311. package/dist/inputs/otp-input/{otp-input.css?inline.cjs → otp-input.css.cjs} +1 -1
  312. package/dist/inputs/otp-input/otp-input.css.cjs.map +1 -0
  313. package/dist/inputs/otp-input/{otp-input.css?inline.js → otp-input.css.js} +1 -1
  314. package/dist/inputs/otp-input/otp-input.css.js.map +1 -0
  315. package/dist/inputs/otp-input/otp-input.d.ts.map +1 -1
  316. package/dist/inputs/radio/{radio.css?inline.cjs → radio.css.cjs} +1 -1
  317. package/dist/inputs/radio/radio.css.cjs.map +1 -0
  318. package/dist/inputs/radio/{radio.css?inline.js → radio.css.js} +1 -1
  319. package/dist/inputs/radio/radio.css.js.map +1 -0
  320. package/dist/inputs/radio/radio.d.ts.map +1 -1
  321. package/dist/inputs/radio-group/{radio-group.css?inline.cjs → radio-group.css.cjs} +1 -1
  322. package/dist/inputs/radio-group/radio-group.css.cjs.map +1 -0
  323. package/dist/inputs/radio-group/{radio-group.css?inline.js → radio-group.css.js} +1 -1
  324. package/dist/inputs/radio-group/radio-group.css.js.map +1 -0
  325. package/dist/inputs/radio-group/radio-group.d.ts.map +1 -1
  326. package/dist/inputs/rating/{rating.css?inline.cjs → rating.css.cjs} +1 -1
  327. package/dist/inputs/rating/rating.css.cjs.map +1 -0
  328. package/dist/inputs/rating/{rating.css?inline.js → rating.css.js} +1 -1
  329. package/dist/inputs/rating/rating.css.js.map +1 -0
  330. package/dist/inputs/rating/rating.d.ts.map +1 -1
  331. package/dist/inputs/select/{select.css?inline.cjs → select.css.cjs} +1 -1
  332. package/dist/inputs/select/select.css.cjs.map +1 -0
  333. package/dist/inputs/select/{select.css?inline.js → select.css.js} +1 -1
  334. package/dist/inputs/select/select.css.js.map +1 -0
  335. package/dist/inputs/select/select.d.ts.map +1 -1
  336. package/dist/inputs/shared/field-binding.cjs +1 -1
  337. package/dist/inputs/shared/field-binding.cjs.map +1 -1
  338. package/dist/inputs/shared/field-binding.d.ts +1 -2
  339. package/dist/inputs/shared/field-binding.d.ts.map +1 -1
  340. package/dist/inputs/shared/field-binding.js +3 -2
  341. package/dist/inputs/shared/field-binding.js.map +1 -1
  342. package/dist/inputs/shared/form-context.cjs +1 -1
  343. package/dist/inputs/shared/form-context.cjs.map +1 -1
  344. package/dist/inputs/shared/form-context.d.ts +4 -4
  345. package/dist/inputs/shared/form-context.d.ts.map +1 -1
  346. package/dist/inputs/shared/form-context.js +10 -10
  347. package/dist/inputs/shared/form-context.js.map +1 -1
  348. package/dist/inputs/slider/{slider.css?inline.cjs → slider.css.cjs} +1 -1
  349. package/dist/inputs/slider/slider.css.cjs.map +1 -0
  350. package/dist/inputs/slider/{slider.css?inline.js → slider.css.js} +1 -1
  351. package/dist/inputs/slider/slider.css.js.map +1 -0
  352. package/dist/inputs/slider/slider.d.ts.map +1 -1
  353. package/dist/inputs/switch/{switch.css?inline.cjs → switch.css.cjs} +1 -1
  354. package/dist/inputs/switch/switch.css.cjs.map +1 -0
  355. package/dist/inputs/switch/{switch.css?inline.js → switch.css.js} +1 -1
  356. package/dist/inputs/switch/switch.css.js.map +1 -0
  357. package/dist/inputs/switch/switch.d.ts.map +1 -1
  358. package/dist/inputs/textarea/{textarea.css?inline.cjs → textarea.css.cjs} +1 -1
  359. package/dist/inputs/textarea/textarea.css.cjs.map +1 -0
  360. package/dist/inputs/textarea/{textarea.css?inline.js → textarea.css.js} +1 -1
  361. package/dist/inputs/textarea/textarea.css.js.map +1 -0
  362. package/dist/inputs/textarea/textarea.d.ts.map +1 -1
  363. package/dist/inputs/time-picker/{time-picker.css?inline.cjs → time-picker.css.cjs} +1 -1
  364. package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -0
  365. package/dist/inputs/time-picker/{time-picker.css?inline.js → time-picker.css.js} +1 -1
  366. package/dist/inputs/time-picker/time-picker.css.js.map +1 -0
  367. package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
  368. package/dist/keymap/dist/_dev.cjs +2 -0
  369. package/dist/keymap/dist/_dev.cjs.map +1 -0
  370. package/dist/keymap/dist/_dev.js +4 -0
  371. package/dist/keymap/dist/_dev.js.map +1 -0
  372. package/dist/keymap/dist/format.cjs +1 -0
  373. package/dist/keymap/dist/format.js +1 -0
  374. package/dist/keymap/dist/index.cjs +1 -0
  375. package/dist/keymap/dist/index.js +4 -0
  376. package/dist/keymap/dist/keymap.cjs +2 -0
  377. package/dist/keymap/dist/keymap.cjs.map +1 -0
  378. package/dist/keymap/dist/keymap.js +221 -0
  379. package/dist/keymap/dist/keymap.js.map +1 -0
  380. package/dist/keymap/dist/layer.cjs +1 -0
  381. package/dist/keymap/dist/layer.js +1 -0
  382. package/dist/layout/box/{box.css?inline.cjs → box.css.cjs} +1 -1
  383. package/dist/layout/box/box.css.cjs.map +1 -0
  384. package/dist/layout/box/{box.css?inline.js → box.css.js} +1 -1
  385. package/dist/layout/box/box.css.js.map +1 -0
  386. package/dist/layout/grid/{grid.css?inline.cjs → grid.css.cjs} +1 -1
  387. package/dist/layout/grid/grid.css.cjs.map +1 -0
  388. package/dist/layout/grid/{grid.css?inline.js → grid.css.js} +1 -1
  389. package/dist/layout/grid/grid.css.js.map +1 -0
  390. package/dist/layout/grid-item/{grid-item.css?inline.cjs → grid-item.css.cjs} +1 -1
  391. package/dist/layout/grid-item/grid-item.css.cjs.map +1 -0
  392. package/dist/layout/grid-item/{grid-item.css?inline.js → grid-item.css.js} +1 -1
  393. package/dist/layout/grid-item/grid-item.css.js.map +1 -0
  394. package/dist/layout/navbar/{navbar.css?inline.cjs → navbar.css.cjs} +1 -1
  395. package/dist/layout/navbar/navbar.css.cjs.map +1 -0
  396. package/dist/layout/navbar/{navbar.css?inline.js → navbar.css.js} +1 -1
  397. package/dist/layout/navbar/navbar.css.js.map +1 -0
  398. package/dist/layout/navbar/navbar.d.ts.map +1 -1
  399. package/dist/layout/sidebar/{sidebar-group.css?inline.cjs → sidebar-group.css.cjs} +1 -1
  400. package/dist/layout/sidebar/sidebar-group.css.cjs.map +1 -0
  401. package/dist/layout/sidebar/{sidebar-group.css?inline.js → sidebar-group.css.js} +1 -1
  402. package/dist/layout/sidebar/sidebar-group.css.js.map +1 -0
  403. package/dist/layout/sidebar/{sidebar-item.css?inline.cjs → sidebar-item.css.cjs} +1 -1
  404. package/dist/layout/sidebar/sidebar-item.css.cjs.map +1 -0
  405. package/dist/layout/sidebar/{sidebar-item.css?inline.js → sidebar-item.css.js} +1 -1
  406. package/dist/layout/sidebar/sidebar-item.css.js.map +1 -0
  407. package/dist/layout/sidebar/{sidebar.css?inline.cjs → sidebar.css.cjs} +1 -1
  408. package/dist/layout/sidebar/sidebar.css.cjs.map +1 -0
  409. package/dist/layout/sidebar/{sidebar.css?inline.js → sidebar.css.js} +1 -1
  410. package/dist/layout/sidebar/sidebar.css.js.map +1 -0
  411. package/dist/layout/sidebar/sidebar.d.ts.map +1 -1
  412. package/dist/menu.cjs +5 -5
  413. package/dist/menu.cjs.map +1 -1
  414. package/dist/menu.js +85 -85
  415. package/dist/menu.js.map +1 -1
  416. package/dist/navbar.cjs +15 -15
  417. package/dist/navbar.cjs.map +1 -1
  418. package/dist/navbar.js +127 -127
  419. package/dist/navbar.js.map +1 -1
  420. package/dist/number-input.cjs +11 -11
  421. package/dist/number-input.cjs.map +1 -1
  422. package/dist/number-input.js +69 -69
  423. package/dist/number-input.js.map +1 -1
  424. package/dist/ore/dist/_dev.cjs.map +1 -1
  425. package/dist/ore/dist/_dev.js.map +1 -1
  426. package/dist/ore/dist/base-element.cjs +1 -1
  427. package/dist/ore/dist/base-element.cjs.map +1 -1
  428. package/dist/ore/dist/base-element.js +37 -35
  429. package/dist/ore/dist/base-element.js.map +1 -1
  430. package/dist/ore/dist/context.cjs +1 -1
  431. package/dist/ore/dist/context.cjs.map +1 -1
  432. package/dist/ore/dist/context.js +6 -33
  433. package/dist/ore/dist/context.js.map +1 -1
  434. package/dist/ore/dist/define.cjs.map +1 -1
  435. package/dist/ore/dist/define.js.map +1 -1
  436. package/dist/ore/dist/directives/raw.cjs +1 -1
  437. package/dist/ore/dist/directives/raw.cjs.map +1 -1
  438. package/dist/ore/dist/directives/raw.js +20 -17
  439. package/dist/ore/dist/directives/raw.js.map +1 -1
  440. package/dist/ore/dist/directives/when.cjs +1 -1
  441. package/dist/ore/dist/directives/when.cjs.map +1 -1
  442. package/dist/ore/dist/directives/when.js +29 -24
  443. package/dist/ore/dist/directives/when.js.map +1 -1
  444. package/dist/ore/dist/errors.cjs +2 -2
  445. package/dist/ore/dist/errors.cjs.map +1 -1
  446. package/dist/ore/dist/errors.js +12 -3
  447. package/dist/ore/dist/errors.js.map +1 -1
  448. package/dist/ore/dist/forms/context.cjs +2 -0
  449. package/dist/ore/dist/forms/context.cjs.map +1 -0
  450. package/dist/ore/dist/forms/context.js +6 -0
  451. package/dist/ore/dist/forms/context.js.map +1 -0
  452. package/dist/ore/dist/forms/field.cjs +2 -0
  453. package/dist/ore/dist/forms/field.cjs.map +1 -0
  454. package/dist/ore/dist/forms/field.js +35 -0
  455. package/dist/ore/dist/forms/field.js.map +1 -0
  456. package/dist/ore/dist/forms.cjs +1 -0
  457. package/dist/ore/dist/forms.js +3 -0
  458. package/dist/ore/dist/props.cjs +1 -1
  459. package/dist/ore/dist/props.cjs.map +1 -1
  460. package/dist/ore/dist/props.js +29 -27
  461. package/dist/ore/dist/props.js.map +1 -1
  462. package/dist/ore/dist/runtime.cjs +1 -1
  463. package/dist/ore/dist/runtime.cjs.map +1 -1
  464. package/dist/ore/dist/runtime.js +13 -23
  465. package/dist/ore/dist/runtime.js.map +1 -1
  466. package/dist/ore/dist/testing/render-hook.cjs +1 -1
  467. package/dist/ore/dist/testing/render-hook.js +0 -1
  468. package/dist/ore/dist/utils/dom.cjs +1 -1
  469. package/dist/ore/dist/utils/dom.cjs.map +1 -1
  470. package/dist/ore/dist/utils/dom.js +2 -6
  471. package/dist/ore/dist/utils/dom.js.map +1 -1
  472. package/dist/otp-input.cjs +9 -9
  473. package/dist/otp-input.cjs.map +1 -1
  474. package/dist/otp-input.js +70 -68
  475. package/dist/otp-input.js.map +1 -1
  476. package/dist/overlay/command-palette/command-palette-items.cjs +2 -0
  477. package/dist/overlay/command-palette/command-palette-items.cjs.map +1 -0
  478. package/dist/overlay/command-palette/command-palette-items.d.ts +22 -0
  479. package/dist/overlay/command-palette/command-palette-items.d.ts.map +1 -0
  480. package/dist/overlay/command-palette/command-palette-items.js +55 -0
  481. package/dist/overlay/command-palette/command-palette-items.js.map +1 -0
  482. package/dist/overlay/command-palette/command-palette.css.cjs +2 -0
  483. package/dist/overlay/command-palette/command-palette.css.cjs.map +1 -0
  484. package/dist/overlay/command-palette/command-palette.css.js +6 -0
  485. package/dist/overlay/command-palette/command-palette.css.js.map +1 -0
  486. package/dist/overlay/command-palette/command-palette.d.ts +72 -0
  487. package/dist/overlay/command-palette/command-palette.d.ts.map +1 -0
  488. package/dist/overlay/command-palette/command-palette.types.d.ts +76 -0
  489. package/dist/overlay/command-palette/command-palette.types.d.ts.map +1 -0
  490. package/dist/overlay/dialog/{dialog.css?inline.cjs → dialog.css.cjs} +1 -1
  491. package/dist/overlay/dialog/dialog.css.cjs.map +1 -0
  492. package/dist/overlay/dialog/{dialog.css?inline.js → dialog.css.js} +1 -1
  493. package/dist/overlay/dialog/dialog.css.js.map +1 -0
  494. package/dist/overlay/drawer/{drawer.css?inline.cjs → drawer.css.cjs} +1 -1
  495. package/dist/overlay/drawer/drawer.css.cjs.map +1 -0
  496. package/dist/overlay/drawer/{drawer.css?inline.js → drawer.css.js} +1 -1
  497. package/dist/overlay/drawer/drawer.css.js.map +1 -0
  498. package/dist/overlay/drawer/drawer.d.ts.map +1 -1
  499. package/dist/overlay/index.d.ts +2 -0
  500. package/dist/overlay/index.d.ts.map +1 -1
  501. package/dist/overlay/menu/{menu-item.css?inline.cjs → menu-item.css.cjs} +1 -1
  502. package/dist/overlay/menu/menu-item.css.cjs.map +1 -0
  503. package/dist/overlay/menu/{menu-item.css?inline.js → menu-item.css.js} +1 -1
  504. package/dist/overlay/menu/menu-item.css.js.map +1 -0
  505. package/dist/overlay/menu/{menu-separator.css?inline.cjs → menu-separator.css.cjs} +1 -1
  506. package/dist/overlay/menu/menu-separator.css.cjs.map +1 -0
  507. package/dist/overlay/menu/{menu-separator.css?inline.js → menu-separator.css.js} +1 -1
  508. package/dist/overlay/menu/menu-separator.css.js.map +1 -0
  509. package/dist/overlay/menu/{menu.css?inline.cjs → menu.css.cjs} +1 -1
  510. package/dist/overlay/menu/menu.css.cjs.map +1 -0
  511. package/dist/overlay/menu/{menu.css?inline.js → menu.css.js} +1 -1
  512. package/dist/overlay/menu/menu.css.js.map +1 -0
  513. package/dist/overlay/menu/menu.d.ts.map +1 -1
  514. package/dist/overlay/popover/{popover.css?inline.cjs → popover.css.cjs} +1 -1
  515. package/dist/overlay/popover/popover.css.cjs.map +1 -0
  516. package/dist/overlay/popover/{popover.css?inline.js → popover.css.js} +1 -1
  517. package/dist/overlay/popover/popover.css.js.map +1 -0
  518. package/dist/overlay/popover/popover.d.ts.map +1 -1
  519. package/dist/overlay/tooltip/{tooltip.css?inline.cjs → tooltip.css.cjs} +1 -1
  520. package/dist/overlay/tooltip/tooltip.css.cjs.map +1 -0
  521. package/dist/overlay/tooltip/{tooltip.css?inline.js → tooltip.css.js} +1 -1
  522. package/dist/overlay/tooltip/tooltip.css.js.map +1 -0
  523. package/dist/pagination.cjs +12 -12
  524. package/dist/pagination.cjs.map +1 -1
  525. package/dist/pagination.js +39 -38
  526. package/dist/pagination.js.map +1 -1
  527. package/dist/password-strength.cjs +8 -8
  528. package/dist/password-strength.cjs.map +1 -1
  529. package/dist/password-strength.js +34 -34
  530. package/dist/password-strength.js.map +1 -1
  531. package/dist/popover.cjs +4 -4
  532. package/dist/popover.cjs.map +1 -1
  533. package/dist/popover.js +30 -30
  534. package/dist/popover.js.map +1 -1
  535. package/dist/progress.cjs +1 -1
  536. package/dist/progress.cjs.map +1 -1
  537. package/dist/progress.js +30 -30
  538. package/dist/progress.js.map +1 -1
  539. package/dist/radio-group.cjs +11 -11
  540. package/dist/radio-group.cjs.map +1 -1
  541. package/dist/radio-group.js +67 -63
  542. package/dist/radio-group.js.map +1 -1
  543. package/dist/radio.cjs +4 -4
  544. package/dist/radio.cjs.map +1 -1
  545. package/dist/radio.js +69 -67
  546. package/dist/radio.js.map +1 -1
  547. package/dist/rating.cjs +4 -4
  548. package/dist/rating.cjs.map +1 -1
  549. package/dist/rating.js +57 -55
  550. package/dist/rating.js.map +1 -1
  551. package/dist/refine.cjs +763 -630
  552. package/dist/refine.cjs.map +1 -1
  553. package/dist/refine.iife.js +752 -619
  554. package/dist/refine.iife.js.map +1 -1
  555. package/dist/refine.js +774 -641
  556. package/dist/refine.js.map +1 -1
  557. package/dist/select.cjs +37 -37
  558. package/dist/select.cjs.map +1 -1
  559. package/dist/select.js +130 -128
  560. package/dist/select.js.map +1 -1
  561. package/dist/separator.cjs +1 -1
  562. package/dist/separator.cjs.map +1 -1
  563. package/dist/separator.js +1 -1
  564. package/dist/sidebar.cjs +22 -22
  565. package/dist/sidebar.cjs.map +1 -1
  566. package/dist/sidebar.js +135 -135
  567. package/dist/sidebar.js.map +1 -1
  568. package/dist/skeleton.cjs +2 -2
  569. package/dist/skeleton.cjs.map +1 -1
  570. package/dist/skeleton.js +28 -28
  571. package/dist/skeleton.js.map +1 -1
  572. package/dist/slider.cjs +13 -13
  573. package/dist/slider.cjs.map +1 -1
  574. package/dist/slider.js +142 -140
  575. package/dist/slider.js.map +1 -1
  576. package/dist/switch.cjs +4 -4
  577. package/dist/switch.cjs.map +1 -1
  578. package/dist/switch.js +35 -33
  579. package/dist/switch.js.map +1 -1
  580. package/dist/tab-item.cjs +5 -5
  581. package/dist/tab-item.cjs.map +1 -1
  582. package/dist/tab-item.js +25 -25
  583. package/dist/tab-item.js.map +1 -1
  584. package/dist/tab-panel.cjs +6 -6
  585. package/dist/tab-panel.cjs.map +1 -1
  586. package/dist/tab-panel.js +24 -24
  587. package/dist/tab-panel.js.map +1 -1
  588. package/dist/table.cjs +1 -1
  589. package/dist/table.cjs.map +1 -1
  590. package/dist/table.js +36 -35
  591. package/dist/table.js.map +1 -1
  592. package/dist/tabs.cjs +3 -3
  593. package/dist/tabs.cjs.map +1 -1
  594. package/dist/tabs.js +61 -61
  595. package/dist/tabs.js.map +1 -1
  596. package/dist/text.cjs +1 -1
  597. package/dist/text.cjs.map +1 -1
  598. package/dist/text.js +16 -16
  599. package/dist/text.js.map +1 -1
  600. package/dist/textarea.cjs +15 -15
  601. package/dist/textarea.cjs.map +1 -1
  602. package/dist/textarea.js +67 -65
  603. package/dist/textarea.js.map +1 -1
  604. package/dist/time-picker.cjs +31 -31
  605. package/dist/time-picker.cjs.map +1 -1
  606. package/dist/time-picker.js +115 -113
  607. package/dist/time-picker.js.map +1 -1
  608. package/dist/toast.cjs +14 -14
  609. package/dist/toast.cjs.map +1 -1
  610. package/dist/toast.js +85 -85
  611. package/dist/toast.js.map +1 -1
  612. package/dist/tooltip.cjs +5 -5
  613. package/dist/tooltip.cjs.map +1 -1
  614. package/dist/tooltip.js +55 -55
  615. package/dist/tooltip.js.map +1 -1
  616. package/dist/typing-indicator.cjs +8 -0
  617. package/dist/typing-indicator.cjs.map +1 -0
  618. package/dist/typing-indicator.js +49 -0
  619. package/dist/typing-indicator.js.map +1 -0
  620. package/package.json +21 -2
  621. package/dist/content/avatar/avatar-group.css?inline.cjs.map +0 -1
  622. package/dist/content/avatar/avatar-group.css?inline.js.map +0 -1
  623. package/dist/content/avatar/avatar.css?inline.cjs.map +0 -1
  624. package/dist/content/avatar/avatar.css?inline.js.map +0 -1
  625. package/dist/content/breadcrumb/breadcrumb-item.css?inline.cjs.map +0 -1
  626. package/dist/content/breadcrumb/breadcrumb-item.css?inline.js.map +0 -1
  627. package/dist/content/breadcrumb/breadcrumb.css?inline.cjs.map +0 -1
  628. package/dist/content/breadcrumb/breadcrumb.css?inline.js.map +0 -1
  629. package/dist/content/card/card.css?inline.cjs.map +0 -1
  630. package/dist/content/card/card.css?inline.js.map +0 -1
  631. package/dist/content/carousel/carousel-slide.css?inline.cjs.map +0 -1
  632. package/dist/content/carousel/carousel-slide.css?inline.js.map +0 -1
  633. package/dist/content/carousel/carousel.css?inline.cjs.map +0 -1
  634. package/dist/content/carousel/carousel.css?inline.js.map +0 -1
  635. package/dist/content/code-window/code-window.css?inline.cjs.map +0 -1
  636. package/dist/content/code-window/code-window.css?inline.js.map +0 -1
  637. package/dist/content/copy-command/copy-command.css?inline.cjs.map +0 -1
  638. package/dist/content/copy-command/copy-command.css?inline.js.map +0 -1
  639. package/dist/content/icon/icon.css?inline.cjs.map +0 -1
  640. package/dist/content/icon/icon.css?inline.js.map +0 -1
  641. package/dist/content/pagination/pagination.css?inline.cjs.map +0 -1
  642. package/dist/content/pagination/pagination.css?inline.js.map +0 -1
  643. package/dist/content/separator/separator.css?inline.cjs.map +0 -1
  644. package/dist/content/separator/separator.css?inline.js.map +0 -1
  645. package/dist/content/table/table.css?inline.cjs.map +0 -1
  646. package/dist/content/table/table.css?inline.js.map +0 -1
  647. package/dist/content/text/text.css?inline.cjs.map +0 -1
  648. package/dist/content/text/text.css?inline.js.map +0 -1
  649. package/dist/disclosure/accordion/accordion.css?inline.cjs.map +0 -1
  650. package/dist/disclosure/accordion/accordion.css?inline.js.map +0 -1
  651. package/dist/disclosure/accordion-item/accordion-item.css?inline.cjs.map +0 -1
  652. package/dist/disclosure/accordion-item/accordion-item.css?inline.js.map +0 -1
  653. package/dist/disclosure/tab-item/tab-item.css?inline.cjs.map +0 -1
  654. package/dist/disclosure/tab-item/tab-item.css?inline.js.map +0 -1
  655. package/dist/disclosure/tab-panel/tab-panel.css?inline.cjs.map +0 -1
  656. package/dist/disclosure/tab-panel/tab-panel.css?inline.js.map +0 -1
  657. package/dist/disclosure/tabs/tabs.css?inline.cjs.map +0 -1
  658. package/dist/disclosure/tabs/tabs.css?inline.js.map +0 -1
  659. package/dist/feedback/alert/alert.css?inline.cjs.map +0 -1
  660. package/dist/feedback/alert/alert.css?inline.js.map +0 -1
  661. package/dist/feedback/async/async.css?inline.cjs.map +0 -1
  662. package/dist/feedback/async/async.css?inline.js.map +0 -1
  663. package/dist/feedback/badge/badge.css?inline.cjs.map +0 -1
  664. package/dist/feedback/badge/badge.css?inline.js.map +0 -1
  665. package/dist/feedback/chip/chip.css?inline.cjs.map +0 -1
  666. package/dist/feedback/chip/chip.css?inline.js.map +0 -1
  667. package/dist/feedback/password-strength/password-strength.css?inline.cjs.map +0 -1
  668. package/dist/feedback/password-strength/password-strength.css?inline.js.map +0 -1
  669. package/dist/feedback/progress/progress.css?inline.cjs.map +0 -1
  670. package/dist/feedback/progress/progress.css?inline.js.map +0 -1
  671. package/dist/feedback/skeleton/skeleton.css?inline.cjs.map +0 -1
  672. package/dist/feedback/skeleton/skeleton.css?inline.js.map +0 -1
  673. package/dist/feedback/toast/toast.css?inline.cjs.map +0 -1
  674. package/dist/feedback/toast/toast.css?inline.js.map +0 -1
  675. package/dist/inputs/button/button.css?inline.cjs.map +0 -1
  676. package/dist/inputs/button/button.css?inline.js.map +0 -1
  677. package/dist/inputs/button-group/button-group.css?inline.cjs.map +0 -1
  678. package/dist/inputs/button-group/button-group.css?inline.js.map +0 -1
  679. package/dist/inputs/calendar/calendar.css?inline.cjs.map +0 -1
  680. package/dist/inputs/calendar/calendar.css?inline.js.map +0 -1
  681. package/dist/inputs/checkbox/checkbox.css?inline.cjs.map +0 -1
  682. package/dist/inputs/checkbox/checkbox.css?inline.js.map +0 -1
  683. package/dist/inputs/checkbox-group/checkbox-group.css?inline.cjs.map +0 -1
  684. package/dist/inputs/checkbox-group/checkbox-group.css?inline.js.map +0 -1
  685. package/dist/inputs/combobox/combobox.css?inline.cjs.map +0 -1
  686. package/dist/inputs/combobox/combobox.css?inline.js.map +0 -1
  687. package/dist/inputs/datagrid/datagrid.css?inline.cjs.map +0 -1
  688. package/dist/inputs/datagrid/datagrid.css?inline.js.map +0 -1
  689. package/dist/inputs/date-picker/date-picker.css?inline.cjs.map +0 -1
  690. package/dist/inputs/date-picker/date-picker.css?inline.js.map +0 -1
  691. package/dist/inputs/file-input/file-input.css?inline.cjs.map +0 -1
  692. package/dist/inputs/file-input/file-input.css?inline.js.map +0 -1
  693. package/dist/inputs/form/form.css?inline.cjs.map +0 -1
  694. package/dist/inputs/form/form.css?inline.js.map +0 -1
  695. package/dist/inputs/input/input.css?inline.cjs.map +0 -1
  696. package/dist/inputs/input/input.css?inline.js.map +0 -1
  697. package/dist/inputs/number-input/number-input.css?inline.cjs.map +0 -1
  698. package/dist/inputs/number-input/number-input.css?inline.js.map +0 -1
  699. package/dist/inputs/otp-input/otp-input.css?inline.cjs.map +0 -1
  700. package/dist/inputs/otp-input/otp-input.css?inline.js.map +0 -1
  701. package/dist/inputs/radio/radio.css?inline.cjs.map +0 -1
  702. package/dist/inputs/radio/radio.css?inline.js.map +0 -1
  703. package/dist/inputs/radio-group/radio-group.css?inline.cjs.map +0 -1
  704. package/dist/inputs/radio-group/radio-group.css?inline.js.map +0 -1
  705. package/dist/inputs/rating/rating.css?inline.cjs.map +0 -1
  706. package/dist/inputs/rating/rating.css?inline.js.map +0 -1
  707. package/dist/inputs/select/select.css?inline.cjs.map +0 -1
  708. package/dist/inputs/select/select.css?inline.js.map +0 -1
  709. package/dist/inputs/slider/slider.css?inline.cjs.map +0 -1
  710. package/dist/inputs/slider/slider.css?inline.js.map +0 -1
  711. package/dist/inputs/switch/switch.css?inline.cjs.map +0 -1
  712. package/dist/inputs/switch/switch.css?inline.js.map +0 -1
  713. package/dist/inputs/textarea/textarea.css?inline.cjs.map +0 -1
  714. package/dist/inputs/textarea/textarea.css?inline.js.map +0 -1
  715. package/dist/inputs/time-picker/time-picker.css?inline.cjs.map +0 -1
  716. package/dist/inputs/time-picker/time-picker.css?inline.js.map +0 -1
  717. package/dist/layout/box/box.css?inline.cjs.map +0 -1
  718. package/dist/layout/box/box.css?inline.js.map +0 -1
  719. package/dist/layout/grid/grid.css?inline.cjs.map +0 -1
  720. package/dist/layout/grid/grid.css?inline.js.map +0 -1
  721. package/dist/layout/grid-item/grid-item.css?inline.cjs.map +0 -1
  722. package/dist/layout/grid-item/grid-item.css?inline.js.map +0 -1
  723. package/dist/layout/navbar/navbar.css?inline.cjs.map +0 -1
  724. package/dist/layout/navbar/navbar.css?inline.js.map +0 -1
  725. package/dist/layout/sidebar/sidebar-group.css?inline.cjs.map +0 -1
  726. package/dist/layout/sidebar/sidebar-group.css?inline.js.map +0 -1
  727. package/dist/layout/sidebar/sidebar-item.css?inline.cjs.map +0 -1
  728. package/dist/layout/sidebar/sidebar-item.css?inline.js.map +0 -1
  729. package/dist/layout/sidebar/sidebar.css?inline.cjs.map +0 -1
  730. package/dist/layout/sidebar/sidebar.css?inline.js.map +0 -1
  731. package/dist/ore/dist/aria.cjs +0 -2
  732. package/dist/ore/dist/aria.cjs.map +0 -1
  733. package/dist/ore/dist/aria.js +0 -37
  734. package/dist/ore/dist/aria.js.map +0 -1
  735. package/dist/ore/dist/context-bag.cjs +0 -2
  736. package/dist/ore/dist/context-bag.cjs.map +0 -1
  737. package/dist/ore/dist/context-bag.js +0 -28
  738. package/dist/ore/dist/context-bag.js.map +0 -1
  739. package/dist/ore/dist/host-bind.cjs +0 -2
  740. package/dist/ore/dist/host-bind.cjs.map +0 -1
  741. package/dist/ore/dist/host-bind.js +0 -60
  742. package/dist/ore/dist/host-bind.js.map +0 -1
  743. package/dist/ore/dist/slots.cjs +0 -2
  744. package/dist/ore/dist/slots.cjs.map +0 -1
  745. package/dist/ore/dist/slots.js +0 -61
  746. package/dist/ore/dist/slots.js.map +0 -1
  747. package/dist/ore/dist/utils/aria.cjs +0 -2
  748. package/dist/ore/dist/utils/aria.cjs.map +0 -1
  749. package/dist/ore/dist/utils/aria.js +0 -6
  750. package/dist/ore/dist/utils/aria.js.map +0 -1
  751. package/dist/ore/dist/utils/emit.cjs +0 -2
  752. package/dist/ore/dist/utils/emit.cjs.map +0 -1
  753. package/dist/ore/dist/utils/emit.js +0 -16
  754. package/dist/ore/dist/utils/emit.js.map +0 -1
  755. package/dist/overlay/dialog/dialog.css?inline.cjs.map +0 -1
  756. package/dist/overlay/dialog/dialog.css?inline.js.map +0 -1
  757. package/dist/overlay/drawer/drawer.css?inline.cjs.map +0 -1
  758. package/dist/overlay/drawer/drawer.css?inline.js.map +0 -1
  759. package/dist/overlay/menu/menu-item.css?inline.cjs.map +0 -1
  760. package/dist/overlay/menu/menu-item.css?inline.js.map +0 -1
  761. package/dist/overlay/menu/menu-separator.css?inline.cjs.map +0 -1
  762. package/dist/overlay/menu/menu-separator.css?inline.js.map +0 -1
  763. package/dist/overlay/menu/menu.css?inline.cjs.map +0 -1
  764. package/dist/overlay/menu/menu.css?inline.js.map +0 -1
  765. package/dist/overlay/popover/popover.css?inline.cjs.map +0 -1
  766. package/dist/overlay/popover/popover.css?inline.js.map +0 -1
  767. package/dist/overlay/tooltip/tooltip.css?inline.cjs.map +0 -1
  768. package/dist/overlay/tooltip/tooltip.css?inline.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"navbar.js","names":[],"sources":["../src/layout/navbar/navbar.ts"],"sourcesContent":["import { createContext, define, html, inject, prop } from '@vielzeug/ore';\nimport { resizeObserver } from '@vielzeug/ore/observers';\nimport { computed, type Readable, signal, watch } from '@vielzeug/ripple';\n\nimport type { ElevationLevel, RoundedSize, ThemeColor, VisualVariant } from '../../types';\n\nimport '../../content/icon/icon';\nimport {\n coarsePointerMixin,\n colorThemeMixin,\n elevationMixin,\n frostVariantMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n} from '../../styles';\nimport { computeSafeRel } from '../../utils';\nimport navbarStyles from './navbar.css?inline';\n\nconst listen = <E extends Event = Event>(\n el: EventTarget | null | undefined,\n name: string,\n handler: (e: E) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n if (!el) return () => {};\n\n el.addEventListener(name, handler as EventListener, options);\n\n return () => el.removeEventListener(name, handler as EventListener, options);\n};\n\ntype NavbarMode = 'floating' | 'sticky';\n\nconst hasElementContent = (el: Element): boolean => {\n if (!(el instanceof HTMLElement)) return true;\n\n if (el.tagName.includes('-')) return true;\n\n if (el.childElementCount > 0) return true;\n\n return (el.textContent ?? '').trim().length > 0;\n};\n\nconst parseMaxWidthPx = (query: string | undefined): number | undefined => {\n const value = String(query ?? '').trim();\n\n if (!value) return undefined;\n\n const match = /max-width\\s*:\\s*([0-9]+(?:\\.[0-9]+)?)px/i.exec(value);\n\n if (!match) return undefined;\n\n const parsed = Number.parseFloat(match[1]);\n\n return Number.isFinite(parsed) ? parsed : undefined;\n};\n\nconst resolveContainerElement = (el: HTMLElement): HTMLElement | null => {\n let container = el.parentElement;\n\n while (container?.tagName.toLowerCase() === 'ore-grid-item') {\n container = container.parentElement;\n }\n\n return container;\n};\n\nconst readContainerWidth = (el: HTMLElement): number => {\n const parentWidth = resolveContainerElement(el)?.clientWidth ?? 0;\n\n if (parentWidth > 0) return parentWidth;\n\n return el.offsetWidth;\n};\n\nconst findScrollContainer = (start: HTMLElement): HTMLElement | null => {\n let current: HTMLElement | null = start.parentElement;\n\n while (current) {\n const styles = window.getComputedStyle(current);\n const overflowY = styles.overflowY;\n\n if (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') {\n return current;\n }\n\n current = current.parentElement;\n }\n\n return null;\n};\n\n/** Context provided by `ore-navbar` to `ore-navbar-item` children. */\nexport type NavbarContext = {\n isMobile: Readable<boolean>;\n mobileMenuOpen: Readable<boolean>;\n};\n\n/** Injection key for navbar context. */\nexport const NAVBAR_CTX = createContext<NavbarContext>('NavbarContext');\n\n/** Navbar component events */\nexport type OreNavbarEvents = {\n 'mobile-menu-change': { open: boolean };\n};\n\n/** Navbar component element interface */\nexport type NavbarElement = HTMLElement &\n OreNavbarProps & {\n closeMobileMenu(): void;\n openMobileMenu(): void;\n toggleMobileMenu(): void;\n };\n\ntype MobileSidebarElement = HTMLElement & {\n closeMobile?: () => void;\n openMobile?: () => void;\n toggleMobile?: () => void;\n};\n\n/** Navbar component properties */\nexport type OreNavbarProps = {\n /** CSS media query used for mobile layout switching */\n breakpoint?: string;\n /** Theme color */\n color?: ThemeColor;\n /** Evaluate mobile breakpoint against container width only when possible. */\n 'container-breakpoints'?: boolean;\n /** Shadow elevation level (0-5) */\n elevation?: ElevationLevel;\n /** Start as detached floating navbar */\n floating?: boolean;\n /** Accessible nav landmark label */\n label?: string;\n /** CSS selector for an external sidebar toggled by the mobile button */\n 'mobile-sidebar'?: string;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Scroll threshold in px used by floating+sticky transition */\n 'scroll-threshold'?: number;\n /** Stick to top of viewport */\n sticky?: boolean;\n /** Visual style variant */\n variant?: Exclude<VisualVariant, 'ghost' | 'text'>;\n};\n\n/** Navbar item properties */\nexport type OreNavbarItemProps = {\n /** Whether this item represents the current page */\n active?: boolean;\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Link target URL. Renders an anchor when provided. */\n href?: string;\n /** Relationship of linked URL (anchor-only) */\n rel?: string;\n /** Browsing context for link (anchor-only) */\n target?: string;\n};\n\n/**\n * `ore-navbar` — Responsive navigation with sticky/floating modes and a mobile overflow panel.\n *\n * @element ore-navbar\n * @element ore-navbar-item - Navigation link or button placed in the default or mobile-menu slot\n *\n * @attr {string} label - Accessible nav landmark label\n * @attr {boolean} sticky - Makes navbar sticky at top\n * @attr {boolean} floating - Makes navbar detached and floating\n * @attr {number} scroll-threshold - Scroll threshold for floating+sticky transition\n * @attr {string} breakpoint - CSS media query used for mobile mode\n * @attr {boolean} container-breakpoints - Evaluates parseable max-width breakpoints against container width\n * @attr {string} variant - Visual variant: 'flat' | 'solid' | 'bordered' | 'outline' | 'frost' | 'glass'\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} elevation - Shadow elevation: '0' | '1' | '2' | '3' | '4' | '5'\n *\n * @fires mobile-menu-change - Emitted when mobile menu open state changes. detail: { open: boolean }\n *\n * @slot logo - Brand/logo content rendered at the leading edge\n * @slot start - Content rendered in the left/start region\n * @slot - Center navigation content rendered between the start and end regions\n * @slot end - Content rendered in the right/end region\n * @slot mobile-menu - Controls and links rendered inside the mobile overflow panel\n *\n * @cssprop --navbar-height - Navbar bar height\n * @cssprop --navbar-width - Max width of the navbar content\n * @cssprop --navbar-offset - Horizontal offset for floating/sticky positioning\n * @cssprop --navbar-bg - Navbar background color\n * @cssprop --navbar-color - Navbar text color\n * @cssprop --navbar-border-color - Navbar border color\n * @cssprop --navbar-shadow - Navbar box shadow\n * @cssprop --navbar-radius - Border radius (floating/sticky modes)\n * @cssprop --navbar-backdrop-filter - Backdrop filter for blur effect\n * @cssprop --navbar-item-color - Nav item text color\n * @cssprop --navbar-item-hover-color - Nav item hover text color\n * @cssprop --navbar-item-hover-bg - Nav item hover background\n * @cssprop --navbar-item-active-color - Nav item active/current text color\n * @cssprop --navbar-item-active-bg - Nav item active/current background\n * @part nav - Outer navigation landmark\n * @part bar - Main navbar row container\n * @part logo - Logo slot container\n * @part start - Leading action/content region\n * @part center - Center content region\n * @part end - Trailing action/content region\n * @part mobile-toggle - Mobile menu toggle button\n * @part mobile-menu - Mobile overflow panel\n * @part item-icon - Leading icon inside navbar items\n * @part item-label - Label text inside navbar items\n * @part item-end - Trailing content inside navbar items\n * @part item - Clickable navbar item root\n * @example\n * ```html\n * <ore-navbar sticky elevation=\"1\">\n * <a href=\"/\" slot=\"logo\"><strong>MyApp</strong></a>\n * <ore-navbar-item href=\"/dashboard\">Dashboard</ore-navbar-item>\n * <ore-navbar-item href=\"/docs\">Docs</ore-navbar-item>\n * <ore-button slot=\"end\" variant=\"solid\" color=\"primary\" size=\"sm\">Sign in</ore-button>\n * </ore-navbar>\n * ```\n */\nexport const NAVBAR_TAG = 'ore-navbar' as const;\ndefine<OreNavbarProps, OreNavbarEvents>(NAVBAR_TAG, {\n props: {\n breakpoint: prop.string('(max-width: 768px)'),\n color: prop.string<ThemeColor>(),\n 'container-breakpoints': prop.bool(false),\n elevation: prop.number<ElevationLevel>(),\n floating: prop.bool(false),\n label: prop.string('Main navigation'),\n 'mobile-sidebar': prop.string(),\n rounded: prop.string<RoundedSize>(),\n 'scroll-threshold': prop.number(80),\n sticky: prop.bool(false),\n variant: prop.string<'flat' | 'solid' | 'bordered' | 'outline' | 'frost'>(),\n },\n setup(props, { bind, el, emit, onMounted, provide, slots }) {\n const hasLogo = () => slots.has('logo').value;\n const hasMobileMenu = () => slots.elements('mobile-menu').value.some(hasElementContent);\n const mobileSidebarTarget = signal<MobileSidebarElement | null>(null);\n const isExternalMobileMode = signal(false);\n const isExternalMobileOpen = signal(false);\n const isMobile = signal(false);\n const isMobileMenuOpen = signal(false);\n const isModeTransitioning = signal(false);\n const isScrolled = signal(false);\n const scrollBase = signal(0);\n const mediaMatches = signal(false);\n const sizeMatches = signal(false);\n const maxWidthPx = signal<number | undefined>(parseMaxWidthPx(props.breakpoint.value));\n const isPreviewMode = signal(false);\n\n const getExternalSidebar = () => {\n const selector = String(props['mobile-sidebar'].value ?? '').trim();\n\n if (!selector) return null;\n\n const root = el.getRootNode();\n const scopedTarget =\n root instanceof ShadowRoot || root instanceof Document\n ? (root.querySelector(selector) as MobileSidebarElement | null)\n : null;\n\n return scopedTarget ?? (document.querySelector(selector) as MobileSidebarElement | null);\n };\n\n provide(NAVBAR_CTX, {\n isMobile: computed(() => isMobile.value) as Readable<boolean>,\n mobileMenuOpen: computed(() => isMobileMenuOpen.value) as Readable<boolean>,\n });\n\n const computeMode = (): NavbarMode | undefined => {\n if (props.floating.value && props.sticky.value) {\n return isScrolled.value ? 'sticky' : 'floating';\n }\n\n if (props.floating.value) return 'floating';\n\n if (props.sticky.value) return 'sticky';\n\n return undefined;\n };\n\n const setMobileMenu = (next: boolean) => {\n const open = Boolean(next);\n\n if (!hasMobileMenu()) {\n const target = mobileSidebarTarget.value ?? getExternalSidebar();\n\n if (target) {\n if (open) {\n target.openMobile?.();\n } else {\n target.closeMobile?.();\n }\n\n return;\n }\n }\n\n if (open && !hasMobileMenu()) return;\n\n if (isMobileMenuOpen.value === open) return;\n\n isMobileMenuOpen.value = open;\n emit('mobile-menu-change', { open });\n };\n\n const closeMobileMenu = () => setMobileMenu(false);\n const openMobileMenu = () => setMobileMenu(true);\n const toggleMobileMenu = () => {\n if (!hasMobileMenu()) {\n const target = mobileSidebarTarget.value ?? getExternalSidebar();\n\n if (target) {\n if (typeof target.toggleMobile === 'function') {\n target.toggleMobile();\n } else if (typeof target.openMobile === 'function' && typeof target.closeMobile === 'function') {\n const isOpen = target.hasAttribute('data-mobile-open');\n\n if (isOpen) target.closeMobile();\n else target.openMobile();\n }\n\n return;\n }\n }\n\n setMobileMenu(!isMobileMenuOpen.value);\n };\n\n const syncMobileMode = () => {\n const next =\n (mobileSidebarTarget.value && !hasMobileMenu() ? isExternalMobileMode.value : false) ||\n mediaMatches.value ||\n sizeMatches.value;\n\n isMobile.value = next;\n\n if (!next) closeMobileMenu();\n };\n\n const readScrollOffset = (scrollContainer: HTMLElement | null): number => {\n if (scrollContainer) {\n return scrollContainer.scrollTop || 0;\n }\n\n return window.scrollY || document.documentElement.scrollTop || 0;\n };\n\n const resetScrollBase = (scrollContainer: HTMLElement | null) => {\n scrollBase.value = readScrollOffset(scrollContainer);\n };\n\n const updateScrolled = (scrollContainer: HTMLElement | null = null) => {\n if (!(props.floating.value && props.sticky.value)) {\n if (isScrolled.value) isScrolled.value = false;\n\n return;\n }\n\n const threshold = Math.max(0, Number(props['scroll-threshold'].value) || 0);\n const currentOffset = readScrollOffset(scrollContainer);\n const delta = currentOffset - scrollBase.value;\n\n isScrolled.value = delta > threshold;\n };\n\n bind({\n attr: {\n 'data-mobile': () => (isMobile.value ? true : undefined),\n 'data-mobile-open': () => (isMobile.value && isMobileMenuOpen.value ? true : undefined),\n 'data-mode': () => computeMode() ?? null,\n 'data-mode-transitioning': () => (isModeTransitioning.value ? true : undefined),\n 'data-preview-mode': () => (isPreviewMode.value ? true : undefined),\n 'data-scrolled': () => (props.floating.value && props.sticky.value && isScrolled.value ? true : undefined),\n },\n });\n\n onMounted(() => {\n const navbarEl = el as NavbarElement;\n const scrollContainer = findScrollContainer(el);\n\n navbarEl.closeMobileMenu = closeMobileMenu;\n navbarEl.openMobileMenu = openMobileMenu;\n navbarEl.toggleMobileMenu = toggleMobileMenu;\n\n const stopScroll = listen(\n window,\n 'scroll',\n () => {\n updateScrolled(scrollContainer);\n },\n { passive: true },\n );\n const stopContainerScroll = scrollContainer\n ? listen(\n scrollContainer,\n 'scroll',\n () => {\n updateScrolled(scrollContainer);\n },\n { passive: true },\n )\n : undefined;\n const stopEscape = listen(el, 'keydown', (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !isMobileMenuOpen.value) return;\n\n closeMobileMenu();\n });\n\n let mediaCleanup: (() => void) | undefined;\n let mobileSidebarCleanup: (() => void) | undefined;\n let modeTransitionTimeout: ReturnType<typeof setTimeout> | undefined;\n let previousMode: NavbarMode | undefined;\n\n const resolveMobileSidebarTarget = () => {\n mobileSidebarCleanup?.();\n mobileSidebarCleanup = undefined;\n mobileSidebarTarget.value = null;\n isExternalMobileMode.value = false;\n isExternalMobileOpen.value = false;\n\n const target = getExternalSidebar();\n\n if (!target) return;\n\n const syncTargetState = (event?: CustomEvent<{ open: boolean }>) => {\n const hasBottomNav = target.hasAttribute('data-bottom-nav');\n const hasMobileOpen = target.hasAttribute('data-mobile-open');\n\n isExternalMobileMode.value = hasBottomNav;\n isExternalMobileOpen.value = event?.detail ? event.detail.open : hasMobileOpen;\n\n // If the sidebar is reporting it's open, it must be in bottom-nav mode\n // (either natural or forced). We honor this to avoid race conditions\n // where attributes haven't reflected yet.\n if (isExternalMobileOpen.value && !isExternalMobileMode.value) {\n isExternalMobileMode.value = true;\n }\n\n syncMobileMode();\n };\n\n const targetObserver = new MutationObserver(() => {\n syncTargetState();\n });\n\n syncTargetState();\n targetObserver.observe(target, {\n attributeFilter: ['data-bottom-nav', 'data-mobile-open'],\n attributes: true,\n });\n target.addEventListener('mobile-open-change', syncTargetState as EventListener);\n mobileSidebarCleanup = () => {\n targetObserver.disconnect();\n target.removeEventListener('mobile-open-change', syncTargetState as EventListener);\n };\n mobileSidebarTarget.value = target;\n };\n\n const triggerModeTransition = () => {\n isModeTransitioning.value = true;\n\n if (modeTransitionTimeout != null) clearTimeout(modeTransitionTimeout);\n\n modeTransitionTimeout = setTimeout(() => {\n isModeTransitioning.value = false;\n modeTransitionTimeout = undefined;\n }, 220);\n };\n\n const stopModeWatch = watch(\n computed(() => props.floating.value && props.sticky.value),\n (enabled) => {\n if (!enabled) {\n if (isScrolled.value) isScrolled.value = false;\n\n if (isModeTransitioning.value) isModeTransitioning.value = false;\n\n previousMode = undefined;\n\n if (modeTransitionTimeout != null) {\n clearTimeout(modeTransitionTimeout);\n modeTransitionTimeout = undefined;\n }\n\n return;\n }\n\n resetScrollBase(scrollContainer);\n updateScrolled(scrollContainer);\n\n const currentMode = computeMode();\n\n previousMode = currentMode;\n },\n { immediate: true },\n );\n\n const stopMobileSidebarWatch = watch(\n props['mobile-sidebar'],\n () => {\n resolveMobileSidebarTarget();\n },\n { immediate: true },\n );\n\n const stopModeTransitionWatch = watch(\n computed(() => computeMode()),\n (nextMode) => {\n const comboEnabled = props.floating.value && props.sticky.value;\n\n if (!comboEnabled) {\n previousMode = nextMode ?? undefined;\n\n return;\n }\n\n const next = nextMode ?? undefined;\n\n if (previousMode && next && previousMode !== next) {\n triggerModeTransition();\n }\n\n previousMode = next;\n },\n { immediate: true },\n );\n\n const stopMobileMenuSlotWatch = watch(\n computed(() => hasMobileMenu()),\n (hasContent) => {\n if (!hasContent && isMobileMenuOpen.value) {\n closeMobileMenu();\n }\n },\n { immediate: true },\n );\n\n watch(\n props.breakpoint,\n (query) => {\n mediaCleanup?.();\n mediaCleanup = undefined;\n\n const mediaQuery = String(query ?? '').trim();\n\n maxWidthPx.value = parseMaxWidthPx(mediaQuery);\n mediaMatches.value = false;\n\n const width = readContainerWidth(el);\n\n sizeMatches.value = width > 0 && maxWidthPx.value != null ? width <= maxWidthPx.value : false;\n syncMobileMode();\n\n if (props['container-breakpoints'].value && maxWidthPx.value != null) {\n return;\n }\n\n if (!mediaQuery) {\n return;\n }\n\n if (typeof window.matchMedia !== 'function') {\n return;\n }\n\n const mql = window.matchMedia(mediaQuery);\n const syncMedia = (next: boolean) => {\n mediaMatches.value = next;\n syncMobileMode();\n };\n const onChange = (event: MediaQueryListEvent) => {\n syncMedia(event.matches);\n };\n\n syncMedia(mql.matches);\n mql.addEventListener('change', onChange);\n\n mediaCleanup = () => {\n mql.removeEventListener('change', onChange);\n };\n },\n { immediate: true },\n );\n\n const stopResizeEffect =\n typeof ResizeObserver === 'function'\n ? (() => {\n const hostSize = resizeObserver(el);\n const wrapperEl = el.parentElement;\n const containerEl = resolveContainerElement(el);\n const wrapperSize = wrapperEl ? resizeObserver(wrapperEl) : undefined;\n const parentSize = containerEl && containerEl !== wrapperEl ? resizeObserver(containerEl) : undefined;\n\n return watch(\n computed(() => [\n hostSize.value.width,\n hostSize.value.height,\n wrapperSize?.value.width,\n wrapperSize?.value.height,\n parentSize?.value.width,\n parentSize?.value.height,\n ]),\n () => {\n const width = readContainerWidth(el);\n const parentWidth = resolveContainerElement(el)?.clientWidth ?? 0;\n\n sizeMatches.value = width > 0 && maxWidthPx.value != null ? width <= maxWidthPx.value : false;\n isPreviewMode.value = parentWidth > 0 && parentWidth < window.innerWidth;\n syncMobileMode();\n },\n );\n })()\n : undefined;\n\n return () => {\n stopEscape?.();\n stopScroll?.();\n stopContainerScroll?.();\n stopModeWatch?.dispose();\n stopModeTransitionWatch?.dispose();\n stopMobileMenuSlotWatch?.dispose();\n stopMobileSidebarWatch?.dispose();\n mediaCleanup?.();\n mobileSidebarCleanup?.();\n stopResizeEffect?.dispose();\n\n if (modeTransitionTimeout != null) {\n clearTimeout(modeTransitionTimeout);\n modeTransitionTimeout = undefined;\n }\n };\n });\n\n return html`\n <nav part=\"nav\" aria-label=\"${props.label}\">\n <div class=\"navbar\" part=\"bar\">\n <div class=\"navbar-logo\" part=\"logo\" ?hidden=${() => !hasLogo()}>\n <slot name=\"logo\"></slot>\n </div>\n\n <div class=\"navbar-start\" part=\"start\">\n <slot name=\"start\"></slot>\n </div>\n\n <div class=\"navbar-center\" part=\"center\">\n <slot></slot>\n </div>\n\n <div class=\"navbar-end\" part=\"end\">\n <slot name=\"end\"></slot>\n </div>\n\n <button\n class=\"mobile-toggle\"\n part=\"mobile-toggle\"\n type=\"button\"\n aria-label=\"${() =>\n hasMobileMenu()\n ? isMobileMenuOpen.value\n ? 'Close navigation menu'\n : 'Open navigation menu'\n : isExternalMobileOpen.value\n ? 'Close navigation menu'\n : 'Open navigation menu'}\"\n aria-controls=\"mobile-menu-panel\"\n aria-expanded=\"${() => String(hasMobileMenu() ? isMobileMenuOpen.value : isExternalMobileOpen.value)}\"\n ?hidden=${() => !isMobile.value || (!hasMobileMenu() && !mobileSidebarTarget.value)}\n @click=\"${toggleMobileMenu}\">\n <ore-icon\n name=\"${() => ((hasMobileMenu() ? isMobileMenuOpen.value : isExternalMobileOpen.value) ? 'x' : 'menu')}\"\n size=\"18\"\n stroke-width=\"2.5\"\n aria-hidden=\"true\"></ore-icon>\n </button>\n </div>\n\n <div\n id=\"mobile-menu-panel\"\n class=\"mobile-menu-panel\"\n part=\"mobile-menu\"\n role=\"navigation\"\n :aria-label=\"${() => `${props.label.value} mobile menu`}\"\n ?hidden=${() => !isMobile.value || !isMobileMenuOpen.value || !hasMobileMenu()}>\n <slot name=\"mobile-menu\"></slot>\n </div>\n </nav>\n `;\n },\n styles: [\n colorThemeMixin,\n elevationMixin,\n roundedVariantMixin,\n coarsePointerMixin,\n reducedMotionMixin,\n frostVariantMixin('.navbar'),\n navbarStyles,\n ],\n});\n\n/**\n * `ore-navbar-item` — Navigation item for navbar slots.\n *\n * Renders as an anchor when `href` is provided and item is not disabled.\n *\n * @element ore-navbar-item\n *\n * @attr {boolean} active - Marks item as the current active route\n * @attr {boolean} disabled - Disables interaction\n * @attr {string} href - Link URL; renders as `<a>` when set\n * @attr {string} rel - Anchor `rel` attribute (links only)\n * @attr {string} target - Anchor `target` attribute (links only)\n *\n * @slot - Item label\n * @slot icon - Optional icon before the label\n *\n * @part item - Root clickable element (anchor or button).\n * @part item-icon - Leading icon container.\n * @part item-label - Label text container.\n * @part item-end - Trailing content container.\n *\n * @example\n * ```html\n * <ore-navbar-item href=\"/home\">Home</ore-navbar-item>\n * <ore-navbar-item href=\"/docs\" active>Docs</ore-navbar-item>\n * <ore-navbar-item href=\"/about\" target=\"_blank\" rel=\"noopener\">About</ore-navbar-item>\n * <ore-navbar-item disabled>Disabled</ore-navbar-item>\n * ```\n */\nexport const NAVBAR_ITEM_TAG = 'ore-navbar-item' as const;\ndefine<OreNavbarItemProps>(NAVBAR_ITEM_TAG, {\n props: {\n active: prop.bool(false),\n disabled: prop.bool(false),\n href: prop.string(),\n rel: prop.string(),\n target: prop.string(),\n },\n setup(props, { bind, slots }) {\n const hasIcon = () => slots.has('icon').value;\n const hasEnd = () => slots.has('end').value;\n const navbarCtx = inject(NAVBAR_CTX);\n\n bind({\n attr: {\n 'navbar-mobile': () => (navbarCtx?.isMobile.value ? true : undefined),\n 'navbar-mobile-open': () => (navbarCtx?.mobileMenuOpen.value ? true : undefined),\n },\n });\n\n const isLink = () => Boolean(props.href.value) && !props.disabled.value;\n\n // Prevent reverse tabnapping: auto-inject noopener + noreferrer for _blank links.\n const effectiveRel = computed(() => computeSafeRel(props.rel.value, props.target.value));\n\n const renderItemContent = () => html`\n <span class=\"item-icon\" part=\"item-icon\" ?hidden=${() => !hasIcon()} aria-hidden=\"true\">\n <slot name=\"icon\"></slot>\n </span>\n <span class=\"item-label\" part=\"item-label\"><slot></slot></span>\n <span class=\"item-end\" part=\"item-end\" ?hidden=${() => !hasEnd()}>\n <slot name=\"end\"></slot>\n </span>\n `;\n\n return html`\n ${() => {\n if (isLink()) {\n return html`\n <a\n class=\"item\"\n part=\"item\"\n href=\"${props.href}\"\n :rel=\"${effectiveRel}\"\n :target=\"${props.target}\"\n aria-current=\"${() => (props.active.value ? 'page' : null)}\">\n ${renderItemContent()}\n </a>\n `;\n }\n\n if (props.disabled.value) {\n return html`<div class=\"item\" part=\"item\" tabindex=\"-1\" aria-disabled=\"true\">${renderItemContent()}</div>`;\n }\n\n return html`<button class=\"item\" part=\"item\" type=\"button\">${renderItemContent()}</button>`;\n }}\n `;\n },\n styles: [coarsePointerMixin, navbarStyles],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"navbar.js","names":[],"sources":["../src/layout/navbar/navbar.ts"],"sourcesContent":["import {\n createContext,\n define,\n html,\n inject,\n prop,\n bind,\n getHost,\n onMounted,\n provide,\n useEmit,\n useSlots,\n} from '@vielzeug/ore';\nimport { resizeObserver } from '@vielzeug/ore/observers';\nimport { computed, type Readable, signal, watch } from '@vielzeug/ripple';\n\nimport type { ElevationLevel, RoundedSize, ThemeColor, VisualVariant } from '../../types';\n\nimport '../../content/icon/icon';\nimport {\n coarsePointerMixin,\n colorThemeMixin,\n elevationMixin,\n frostVariantMixin,\n reducedMotionMixin,\n roundedVariantMixin,\n} from '../../styles';\nimport { computeSafeRel } from '../../utils';\nimport navbarStyles from './navbar.css?inline';\n\nconst listen = <E extends Event = Event>(\n el: EventTarget | null | undefined,\n name: string,\n handler: (e: E) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n if (!el) return () => {};\n\n el.addEventListener(name, handler as EventListener, options);\n\n return () => el.removeEventListener(name, handler as EventListener, options);\n};\n\ntype NavbarMode = 'floating' | 'sticky';\n\nconst hasElementContent = (el: Element): boolean => {\n if (!(el instanceof HTMLElement)) return true;\n\n if (el.tagName.includes('-')) return true;\n\n if (el.childElementCount > 0) return true;\n\n return (el.textContent ?? '').trim().length > 0;\n};\n\nconst parseMaxWidthPx = (query: string | undefined): number | undefined => {\n const value = String(query ?? '').trim();\n\n if (!value) return undefined;\n\n const match = /max-width\\s*:\\s*([0-9]+(?:\\.[0-9]+)?)px/i.exec(value);\n\n if (!match) return undefined;\n\n const parsed = Number.parseFloat(match[1]);\n\n return Number.isFinite(parsed) ? parsed : undefined;\n};\n\nconst resolveContainerElement = (el: HTMLElement): HTMLElement | null => {\n let container = el.parentElement;\n\n while (container?.tagName.toLowerCase() === 'ore-grid-item') {\n container = container.parentElement;\n }\n\n return container;\n};\n\nconst readContainerWidth = (el: HTMLElement): number => {\n const parentWidth = resolveContainerElement(el)?.clientWidth ?? 0;\n\n if (parentWidth > 0) return parentWidth;\n\n return el.offsetWidth;\n};\n\nconst findScrollContainer = (start: HTMLElement): HTMLElement | null => {\n let current: HTMLElement | null = start.parentElement;\n\n while (current) {\n const styles = window.getComputedStyle(current);\n const overflowY = styles.overflowY;\n\n if (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') {\n return current;\n }\n\n current = current.parentElement;\n }\n\n return null;\n};\n\n/** Context provided by `ore-navbar` to `ore-navbar-item` children. */\nexport type NavbarContext = {\n isMobile: Readable<boolean>;\n mobileMenuOpen: Readable<boolean>;\n};\n\n/** Injection key for navbar context. */\nexport const NAVBAR_CTX = createContext<NavbarContext>('NavbarContext');\n\n/** Navbar component events */\nexport type OreNavbarEvents = {\n 'mobile-menu-change': { open: boolean };\n};\n\n/** Navbar component element interface */\nexport type NavbarElement = HTMLElement &\n OreNavbarProps & {\n closeMobileMenu(): void;\n openMobileMenu(): void;\n toggleMobileMenu(): void;\n };\n\ntype MobileSidebarElement = HTMLElement & {\n closeMobile?: () => void;\n openMobile?: () => void;\n toggleMobile?: () => void;\n};\n\n/** Navbar component properties */\nexport type OreNavbarProps = {\n /** CSS media query used for mobile layout switching */\n breakpoint?: string;\n /** Theme color */\n color?: ThemeColor;\n /** Evaluate mobile breakpoint against container width only when possible. */\n 'container-breakpoints'?: boolean;\n /** Shadow elevation level (0-5) */\n elevation?: ElevationLevel;\n /** Start as detached floating navbar */\n floating?: boolean;\n /** Accessible nav landmark label */\n label?: string;\n /** CSS selector for an external sidebar toggled by the mobile button */\n 'mobile-sidebar'?: string;\n /** Border radius size */\n rounded?: RoundedSize;\n /** Scroll threshold in px used by floating+sticky transition */\n 'scroll-threshold'?: number;\n /** Stick to top of viewport */\n sticky?: boolean;\n /** Visual style variant */\n variant?: Exclude<VisualVariant, 'ghost' | 'text'>;\n};\n\n/** Navbar item properties */\nexport type OreNavbarItemProps = {\n /** Whether this item represents the current page */\n active?: boolean;\n /** Whether this item is disabled */\n disabled?: boolean;\n /** Link target URL. Renders an anchor when provided. */\n href?: string;\n /** Relationship of linked URL (anchor-only) */\n rel?: string;\n /** Browsing context for link (anchor-only) */\n target?: string;\n};\n\n/**\n * `ore-navbar` — Responsive navigation with sticky/floating modes and a mobile overflow panel.\n *\n * @element ore-navbar\n * @element ore-navbar-item - Navigation link or button placed in the default or mobile-menu slot\n *\n * @attr {string} label - Accessible nav landmark label\n * @attr {boolean} sticky - Makes navbar sticky at top\n * @attr {boolean} floating - Makes navbar detached and floating\n * @attr {number} scroll-threshold - Scroll threshold for floating+sticky transition\n * @attr {string} breakpoint - CSS media query used for mobile mode\n * @attr {boolean} container-breakpoints - Evaluates parseable max-width breakpoints against container width\n * @attr {string} variant - Visual variant: 'flat' | 'solid' | 'bordered' | 'outline' | 'frost' | 'glass'\n * @attr {string} color - Theme color: 'primary' | 'secondary' | 'info' | 'success' | 'warning' | 'error'\n * @attr {string} rounded - Border radius: 'none' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n * @attr {string} elevation - Shadow elevation: '0' | '1' | '2' | '3' | '4' | '5'\n *\n * @fires mobile-menu-change - Emitted when mobile menu open state changes. detail: { open: boolean }\n *\n * @slot logo - Brand/logo content rendered at the leading edge\n * @slot start - Content rendered in the left/start region\n * @slot - Center navigation content rendered between the start and end regions\n * @slot end - Content rendered in the right/end region\n * @slot mobile-menu - Controls and links rendered inside the mobile overflow panel\n *\n * @cssprop --navbar-height - Navbar bar height\n * @cssprop --navbar-width - Max width of the navbar content\n * @cssprop --navbar-offset - Horizontal offset for floating/sticky positioning\n * @cssprop --navbar-bg - Navbar background color\n * @cssprop --navbar-color - Navbar text color\n * @cssprop --navbar-border-color - Navbar border color\n * @cssprop --navbar-shadow - Navbar box shadow\n * @cssprop --navbar-radius - Border radius (floating/sticky modes)\n * @cssprop --navbar-backdrop-filter - Backdrop filter for blur effect\n * @cssprop --navbar-item-color - Nav item text color\n * @cssprop --navbar-item-hover-color - Nav item hover text color\n * @cssprop --navbar-item-hover-bg - Nav item hover background\n * @cssprop --navbar-item-active-color - Nav item active/current text color\n * @cssprop --navbar-item-active-bg - Nav item active/current background\n * @part nav - Outer navigation landmark\n * @part bar - Main navbar row container\n * @part logo - Logo slot container\n * @part start - Leading action/content region\n * @part center - Center content region\n * @part end - Trailing action/content region\n * @part mobile-toggle - Mobile menu toggle button\n * @part mobile-menu - Mobile overflow panel\n * @part item-icon - Leading icon inside navbar items\n * @part item-label - Label text inside navbar items\n * @part item-end - Trailing content inside navbar items\n * @part item - Clickable navbar item root\n * @example\n * ```html\n * <ore-navbar sticky elevation=\"1\">\n * <a href=\"/\" slot=\"logo\"><strong>MyApp</strong></a>\n * <ore-navbar-item href=\"/dashboard\">Dashboard</ore-navbar-item>\n * <ore-navbar-item href=\"/docs\">Docs</ore-navbar-item>\n * <ore-button slot=\"end\" variant=\"solid\" color=\"primary\" size=\"sm\">Sign in</ore-button>\n * </ore-navbar>\n * ```\n */\nexport const NAVBAR_TAG = 'ore-navbar' as const;\ndefine<OreNavbarProps>(NAVBAR_TAG, {\n props: {\n breakpoint: prop.string('(max-width: 768px)'),\n color: prop.string<ThemeColor>(),\n 'container-breakpoints': prop.bool(false),\n elevation: prop.number<ElevationLevel>(),\n floating: prop.bool(false),\n label: prop.string('Main navigation'),\n 'mobile-sidebar': prop.string(),\n rounded: prop.string<RoundedSize>(),\n 'scroll-threshold': prop.number(80),\n sticky: prop.bool(false),\n variant: prop.string<'flat' | 'solid' | 'bordered' | 'outline' | 'frost'>(),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreNavbarEvents>();\n const slots = useSlots();\n\n const hasLogo = () => slots.has('logo').value;\n const hasMobileMenu = () => slots.elements('mobile-menu').value.some(hasElementContent);\n const mobileSidebarTarget = signal<MobileSidebarElement | null>(null);\n const isExternalMobileMode = signal(false);\n const isExternalMobileOpen = signal(false);\n const isMobile = signal(false);\n const isMobileMenuOpen = signal(false);\n const isModeTransitioning = signal(false);\n const isScrolled = signal(false);\n const scrollBase = signal(0);\n const mediaMatches = signal(false);\n const sizeMatches = signal(false);\n const maxWidthPx = signal<number | undefined>(parseMaxWidthPx(props.breakpoint.value));\n const isPreviewMode = signal(false);\n\n const getExternalSidebar = () => {\n const selector = String(props['mobile-sidebar'].value ?? '').trim();\n\n if (!selector) return null;\n\n const root = el.getRootNode();\n const scopedTarget =\n root instanceof ShadowRoot || root instanceof Document\n ? (root.querySelector(selector) as MobileSidebarElement | null)\n : null;\n\n return scopedTarget ?? (document.querySelector(selector) as MobileSidebarElement | null);\n };\n\n provide(NAVBAR_CTX, {\n isMobile: computed(() => isMobile.value) as Readable<boolean>,\n mobileMenuOpen: computed(() => isMobileMenuOpen.value) as Readable<boolean>,\n });\n\n const computeMode = (): NavbarMode | undefined => {\n if (props.floating.value && props.sticky.value) {\n return isScrolled.value ? 'sticky' : 'floating';\n }\n\n if (props.floating.value) return 'floating';\n\n if (props.sticky.value) return 'sticky';\n\n return undefined;\n };\n\n const setMobileMenu = (next: boolean) => {\n const open = Boolean(next);\n\n if (!hasMobileMenu()) {\n const target = mobileSidebarTarget.value ?? getExternalSidebar();\n\n if (target) {\n if (open) {\n target.openMobile?.();\n } else {\n target.closeMobile?.();\n }\n\n return;\n }\n }\n\n if (open && !hasMobileMenu()) return;\n\n if (isMobileMenuOpen.value === open) return;\n\n isMobileMenuOpen.value = open;\n emit('mobile-menu-change', { open });\n };\n\n const closeMobileMenu = () => setMobileMenu(false);\n const openMobileMenu = () => setMobileMenu(true);\n const toggleMobileMenu = () => {\n if (!hasMobileMenu()) {\n const target = mobileSidebarTarget.value ?? getExternalSidebar();\n\n if (target) {\n if (typeof target.toggleMobile === 'function') {\n target.toggleMobile();\n } else if (typeof target.openMobile === 'function' && typeof target.closeMobile === 'function') {\n const isOpen = target.hasAttribute('data-mobile-open');\n\n if (isOpen) target.closeMobile();\n else target.openMobile();\n }\n\n return;\n }\n }\n\n setMobileMenu(!isMobileMenuOpen.value);\n };\n\n const syncMobileMode = () => {\n const next =\n (mobileSidebarTarget.value && !hasMobileMenu() ? isExternalMobileMode.value : false) ||\n mediaMatches.value ||\n sizeMatches.value;\n\n isMobile.value = next;\n\n if (!next) closeMobileMenu();\n };\n\n const readScrollOffset = (scrollContainer: HTMLElement | null): number => {\n if (scrollContainer) {\n return scrollContainer.scrollTop || 0;\n }\n\n return window.scrollY || document.documentElement.scrollTop || 0;\n };\n\n const resetScrollBase = (scrollContainer: HTMLElement | null) => {\n scrollBase.value = readScrollOffset(scrollContainer);\n };\n\n const updateScrolled = (scrollContainer: HTMLElement | null = null) => {\n if (!(props.floating.value && props.sticky.value)) {\n if (isScrolled.value) isScrolled.value = false;\n\n return;\n }\n\n const threshold = Math.max(0, Number(props['scroll-threshold'].value) || 0);\n const currentOffset = readScrollOffset(scrollContainer);\n const delta = currentOffset - scrollBase.value;\n\n isScrolled.value = delta > threshold;\n };\n\n bind({\n attr: {\n 'data-mobile': () => (isMobile.value ? true : undefined),\n 'data-mobile-open': () => (isMobile.value && isMobileMenuOpen.value ? true : undefined),\n 'data-mode': () => computeMode() ?? null,\n 'data-mode-transitioning': () => (isModeTransitioning.value ? true : undefined),\n 'data-preview-mode': () => (isPreviewMode.value ? true : undefined),\n 'data-scrolled': () => (props.floating.value && props.sticky.value && isScrolled.value ? true : undefined),\n },\n });\n\n onMounted(() => {\n const navbarEl = el as NavbarElement;\n const scrollContainer = findScrollContainer(el);\n\n navbarEl.closeMobileMenu = closeMobileMenu;\n navbarEl.openMobileMenu = openMobileMenu;\n navbarEl.toggleMobileMenu = toggleMobileMenu;\n\n const stopScroll = listen(\n window,\n 'scroll',\n () => {\n updateScrolled(scrollContainer);\n },\n { passive: true },\n );\n const stopContainerScroll = scrollContainer\n ? listen(\n scrollContainer,\n 'scroll',\n () => {\n updateScrolled(scrollContainer);\n },\n { passive: true },\n )\n : undefined;\n const stopEscape = listen(el, 'keydown', (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !isMobileMenuOpen.value) return;\n\n closeMobileMenu();\n });\n\n let mediaCleanup: (() => void) | undefined;\n let mobileSidebarCleanup: (() => void) | undefined;\n let modeTransitionTimeout: ReturnType<typeof setTimeout> | undefined;\n let previousMode: NavbarMode | undefined;\n\n const resolveMobileSidebarTarget = () => {\n mobileSidebarCleanup?.();\n mobileSidebarCleanup = undefined;\n mobileSidebarTarget.value = null;\n isExternalMobileMode.value = false;\n isExternalMobileOpen.value = false;\n\n const target = getExternalSidebar();\n\n if (!target) return;\n\n const syncTargetState = (event?: CustomEvent<{ open: boolean }>) => {\n const hasBottomNav = target.hasAttribute('data-bottom-nav');\n const hasMobileOpen = target.hasAttribute('data-mobile-open');\n\n isExternalMobileMode.value = hasBottomNav;\n isExternalMobileOpen.value = event?.detail ? event.detail.open : hasMobileOpen;\n\n // If the sidebar is reporting it's open, it must be in bottom-nav mode\n // (either natural or forced). We honor this to avoid race conditions\n // where attributes haven't reflected yet.\n if (isExternalMobileOpen.value && !isExternalMobileMode.value) {\n isExternalMobileMode.value = true;\n }\n\n syncMobileMode();\n };\n\n const targetObserver = new MutationObserver(() => {\n syncTargetState();\n });\n\n syncTargetState();\n targetObserver.observe(target, {\n attributeFilter: ['data-bottom-nav', 'data-mobile-open'],\n attributes: true,\n });\n target.addEventListener('mobile-open-change', syncTargetState as EventListener);\n mobileSidebarCleanup = () => {\n targetObserver.disconnect();\n target.removeEventListener('mobile-open-change', syncTargetState as EventListener);\n };\n mobileSidebarTarget.value = target;\n };\n\n const triggerModeTransition = () => {\n isModeTransitioning.value = true;\n\n if (modeTransitionTimeout != null) clearTimeout(modeTransitionTimeout);\n\n modeTransitionTimeout = setTimeout(() => {\n isModeTransitioning.value = false;\n modeTransitionTimeout = undefined;\n }, 220);\n };\n\n const stopModeWatch = watch(\n computed(() => props.floating.value && props.sticky.value),\n (enabled) => {\n if (!enabled) {\n if (isScrolled.value) isScrolled.value = false;\n\n if (isModeTransitioning.value) isModeTransitioning.value = false;\n\n previousMode = undefined;\n\n if (modeTransitionTimeout != null) {\n clearTimeout(modeTransitionTimeout);\n modeTransitionTimeout = undefined;\n }\n\n return;\n }\n\n resetScrollBase(scrollContainer);\n updateScrolled(scrollContainer);\n\n const currentMode = computeMode();\n\n previousMode = currentMode;\n },\n { immediate: true },\n );\n\n const stopMobileSidebarWatch = watch(\n props['mobile-sidebar'],\n () => {\n resolveMobileSidebarTarget();\n },\n { immediate: true },\n );\n\n const stopModeTransitionWatch = watch(\n computed(() => computeMode()),\n (nextMode) => {\n const comboEnabled = props.floating.value && props.sticky.value;\n\n if (!comboEnabled) {\n previousMode = nextMode ?? undefined;\n\n return;\n }\n\n const next = nextMode ?? undefined;\n\n if (previousMode && next && previousMode !== next) {\n triggerModeTransition();\n }\n\n previousMode = next;\n },\n { immediate: true },\n );\n\n const stopMobileMenuSlotWatch = watch(\n computed(() => hasMobileMenu()),\n (hasContent) => {\n if (!hasContent && isMobileMenuOpen.value) {\n closeMobileMenu();\n }\n },\n { immediate: true },\n );\n\n watch(\n props.breakpoint,\n (query) => {\n mediaCleanup?.();\n mediaCleanup = undefined;\n\n const mediaQuery = String(query ?? '').trim();\n\n maxWidthPx.value = parseMaxWidthPx(mediaQuery);\n mediaMatches.value = false;\n\n const width = readContainerWidth(el);\n\n sizeMatches.value = width > 0 && maxWidthPx.value != null ? width <= maxWidthPx.value : false;\n syncMobileMode();\n\n if (props['container-breakpoints'].value && maxWidthPx.value != null) {\n return;\n }\n\n if (!mediaQuery) {\n return;\n }\n\n if (typeof window.matchMedia !== 'function') {\n return;\n }\n\n const mql = window.matchMedia(mediaQuery);\n const syncMedia = (next: boolean) => {\n mediaMatches.value = next;\n syncMobileMode();\n };\n const onChange = (event: MediaQueryListEvent) => {\n syncMedia(event.matches);\n };\n\n syncMedia(mql.matches);\n mql.addEventListener('change', onChange);\n\n mediaCleanup = () => {\n mql.removeEventListener('change', onChange);\n };\n },\n { immediate: true },\n );\n\n const stopResizeEffect =\n typeof ResizeObserver === 'function'\n ? (() => {\n const hostSize = resizeObserver(el);\n const wrapperEl = el.parentElement;\n const containerEl = resolveContainerElement(el);\n const wrapperSize = wrapperEl ? resizeObserver(wrapperEl) : undefined;\n const parentSize = containerEl && containerEl !== wrapperEl ? resizeObserver(containerEl) : undefined;\n\n return watch(\n computed(() => [\n hostSize.value.width,\n hostSize.value.height,\n wrapperSize?.value.width,\n wrapperSize?.value.height,\n parentSize?.value.width,\n parentSize?.value.height,\n ]),\n () => {\n const width = readContainerWidth(el);\n const parentWidth = resolveContainerElement(el)?.clientWidth ?? 0;\n\n sizeMatches.value = width > 0 && maxWidthPx.value != null ? width <= maxWidthPx.value : false;\n isPreviewMode.value = parentWidth > 0 && parentWidth < window.innerWidth;\n syncMobileMode();\n },\n );\n })()\n : undefined;\n\n return () => {\n stopEscape?.();\n stopScroll?.();\n stopContainerScroll?.();\n stopModeWatch?.dispose();\n stopModeTransitionWatch?.dispose();\n stopMobileMenuSlotWatch?.dispose();\n stopMobileSidebarWatch?.dispose();\n mediaCleanup?.();\n mobileSidebarCleanup?.();\n stopResizeEffect?.dispose();\n\n if (modeTransitionTimeout != null) {\n clearTimeout(modeTransitionTimeout);\n modeTransitionTimeout = undefined;\n }\n };\n });\n\n return html`\n <nav part=\"nav\" aria-label=\"${props.label}\">\n <div class=\"navbar\" part=\"bar\">\n <div class=\"navbar-logo\" part=\"logo\" ?hidden=${() => !hasLogo()}>\n <slot name=\"logo\"></slot>\n </div>\n\n <div class=\"navbar-start\" part=\"start\">\n <slot name=\"start\"></slot>\n </div>\n\n <div class=\"navbar-center\" part=\"center\">\n <slot></slot>\n </div>\n\n <div class=\"navbar-end\" part=\"end\">\n <slot name=\"end\"></slot>\n </div>\n\n <button\n class=\"mobile-toggle\"\n part=\"mobile-toggle\"\n type=\"button\"\n aria-label=\"${() =>\n hasMobileMenu()\n ? isMobileMenuOpen.value\n ? 'Close navigation menu'\n : 'Open navigation menu'\n : isExternalMobileOpen.value\n ? 'Close navigation menu'\n : 'Open navigation menu'}\"\n aria-controls=\"mobile-menu-panel\"\n aria-expanded=\"${() => String(hasMobileMenu() ? isMobileMenuOpen.value : isExternalMobileOpen.value)}\"\n ?hidden=${() => !isMobile.value || (!hasMobileMenu() && !mobileSidebarTarget.value)}\n @click=\"${toggleMobileMenu}\">\n <ore-icon\n name=\"${() => ((hasMobileMenu() ? isMobileMenuOpen.value : isExternalMobileOpen.value) ? 'x' : 'menu')}\"\n size=\"18\"\n stroke-width=\"2.5\"\n aria-hidden=\"true\"></ore-icon>\n </button>\n </div>\n\n <div\n id=\"mobile-menu-panel\"\n class=\"mobile-menu-panel\"\n part=\"mobile-menu\"\n role=\"navigation\"\n :aria-label=\"${() => `${props.label.value} mobile menu`}\"\n ?hidden=${() => !isMobile.value || !isMobileMenuOpen.value || !hasMobileMenu()}>\n <slot name=\"mobile-menu\"></slot>\n </div>\n </nav>\n `;\n },\n styles: [\n colorThemeMixin,\n elevationMixin,\n roundedVariantMixin,\n coarsePointerMixin,\n reducedMotionMixin,\n frostVariantMixin('.navbar'),\n navbarStyles,\n ],\n});\n\n/**\n * `ore-navbar-item` — Navigation item for navbar slots.\n *\n * Renders as an anchor when `href` is provided and item is not disabled.\n *\n * @element ore-navbar-item\n *\n * @attr {boolean} active - Marks item as the current active route\n * @attr {boolean} disabled - Disables interaction\n * @attr {string} href - Link URL; renders as `<a>` when set\n * @attr {string} rel - Anchor `rel` attribute (links only)\n * @attr {string} target - Anchor `target` attribute (links only)\n *\n * @slot - Item label\n * @slot icon - Optional icon before the label\n *\n * @part item - Root clickable element (anchor or button).\n * @part item-icon - Leading icon container.\n * @part item-label - Label text container.\n * @part item-end - Trailing content container.\n *\n * @example\n * ```html\n * <ore-navbar-item href=\"/home\">Home</ore-navbar-item>\n * <ore-navbar-item href=\"/docs\" active>Docs</ore-navbar-item>\n * <ore-navbar-item href=\"/about\" target=\"_blank\" rel=\"noopener\">About</ore-navbar-item>\n * <ore-navbar-item disabled>Disabled</ore-navbar-item>\n * ```\n */\nexport const NAVBAR_ITEM_TAG = 'ore-navbar-item' as const;\ndefine<OreNavbarItemProps>(NAVBAR_ITEM_TAG, {\n props: {\n active: prop.bool(false),\n disabled: prop.bool(false),\n href: prop.string(),\n rel: prop.string(),\n target: prop.string(),\n },\n setup(props) {\n const slots = useSlots();\n\n const hasIcon = () => slots.has('icon').value;\n const hasEnd = () => slots.has('end').value;\n const navbarCtx = inject(NAVBAR_CTX);\n\n bind({\n attr: {\n 'navbar-mobile': () => (navbarCtx?.isMobile.value ? true : undefined),\n 'navbar-mobile-open': () => (navbarCtx?.mobileMenuOpen.value ? true : undefined),\n },\n });\n\n const isLink = () => Boolean(props.href.value) && !props.disabled.value;\n\n // Prevent reverse tabnapping: auto-inject noopener + noreferrer for _blank links.\n const effectiveRel = computed(() => computeSafeRel(props.rel.value, props.target.value));\n\n const renderItemContent = () => html`\n <span class=\"item-icon\" part=\"item-icon\" ?hidden=${() => !hasIcon()} aria-hidden=\"true\">\n <slot name=\"icon\"></slot>\n </span>\n <span class=\"item-label\" part=\"item-label\"><slot></slot></span>\n <span class=\"item-end\" part=\"item-end\" ?hidden=${() => !hasEnd()}>\n <slot name=\"end\"></slot>\n </span>\n `;\n\n return html`\n ${() => {\n if (isLink()) {\n return html`\n <a\n class=\"item\"\n part=\"item\"\n href=\"${props.href}\"\n :rel=\"${effectiveRel}\"\n :target=\"${props.target}\"\n aria-current=\"${() => (props.active.value ? 'page' : null)}\">\n ${renderItemContent()}\n </a>\n `;\n }\n\n if (props.disabled.value) {\n return html`<div class=\"item\" part=\"item\" tabindex=\"-1\" aria-disabled=\"true\">${renderItemContent()}</div>`;\n }\n\n return html`<button class=\"item\" part=\"item\" type=\"button\">${renderItemContent()}</button>`;\n }}\n `;\n },\n styles: [coarsePointerMixin, navbarStyles],\n});\n"],"mappings":"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"}
@@ -1,38 +1,38 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/states.css.cjs"),t=require("./shared/prop-bundles.cjs"),n=require("./headless/spinner.cjs"),r=require("./inputs/shared/form-context.cjs"),i=require("./inputs/number-input/number-input.css?inline.cjs");let a=require("@vielzeug/ore"),o=require("@vielzeug/ripple"),s=require("@vielzeug/arsenal");var c=`ore-number-input`;(0,a.define)(c,{formAssociated:!0,props:{...t.themableBundle,...t.sizableBundle,...t.disablableBundle,...t.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),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.json(void 0),step:a.prop.number(1),value:a.prop.json(void 0),variant:a.prop.string()},setup(e,{bind:t,emit:i,onElement:c,watch:l}){let u=r.useFormContext(t,e,(0,a.inject)(r.FORM_CTX)),d=u.disabled,f=(0,o.computed)(()=>!!e.readonly.value),p=(0,o.signal)(e.value.value==null?``:String(e.value.value));(0,o.watch)(e.value,e=>{let t=e==null?``:String(e);p.value!==t&&(p.value=t)});function m(){let e=p.value.trim();if(!e)return null;let t=Number.parseFloat(e);return Number.isNaN(t)?null:t}function h(t,n){let r=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:(0,s.clamp)(t,r,a),c=o==null?``:String(o);p.value!==c&&(p.value=c),i(`change`,{originalEvent:n,value:o})}let g=n.createSpinnerControl({commit:h,disabled:d,largeStep:e[`large-step`],max:e.max,min:e.min,parse:m,readonly:f,step:e.step}),_=(0,a.ref)(),v=null,y=null,b=null,x=t=>{if(!t){v?.(),y?.(),b?.dispose(),v=null,y=null,b=null,e.ref.value?.(null);return}t.setAttribute(`inputmode`,`decimal`),t.setAttribute(`role`,`spinbutton`);let n=e=>{let t=e.target.value,n=t===``?null:Number.parseFloat(t);h(Number.isNaN(n??NaN)?null:n,e)},r=e=>{let t=e.target.value,n=t===``?null:Number.parseFloat(t);p.value=t,i(`input`,{originalEvent:e,value:Number.isNaN(n??NaN)?null:n})};t.addEventListener(`change`,n),t.addEventListener(`input`,r),y=()=>{t.removeEventListener(`change`,n),t.removeEventListener(`input`,r)},v=l(()=>{let n=m();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)),f.value?t.setAttribute(`aria-readonly`,`true`):t.removeAttribute(`aria-readonly`)}),e.ref.value?.(t),b=(0,o.watch)(e.ref,e=>{e?.(t)})};c(_,e=>{e.ref=x}),t({attr:{size:u.size,value:()=>p.value||null,variant:u.variant}});let S=(0,o.computed)(()=>d.value||f.value);return a.html`
2
- <div class="wrapper" part="control" @keydown="${e=>g.handleKeydown(e)}">
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./styles/mixins/states.css.cjs"),t=require("./shared/prop-bundles.cjs"),n=require("./headless/spinner.cjs"),r=require("./inputs/shared/form-context.cjs"),i=require("./inputs/number-input/number-input.css.cjs");let a=require("@vielzeug/ore"),o=require("@vielzeug/ripple"),s=require("@vielzeug/arsenal");var c=`ore-number-input`;(0,a.define)(c,{formAssociated:!0,props:{...t.themableBundle,...t.sizableBundle,...t.disablableBundle,...t.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),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.json(void 0),step:a.prop.number(1),value:a.prop.json(void 0),variant:a.prop.string()},setup(e){let t=(0,a.useEmit)(),i=a.watchEffect,c=r.useFormContext(e,(0,a.inject)(r.FORM_CTX)),l=c.disabled,u=(0,o.computed)(()=>!!e.readonly.value),d=(0,o.signal)(e.value.value==null?``:String(e.value.value));(0,o.watch)(e.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(n,r){let i=e.min.value==null?void 0:Number(e.min.value),a=e.max.value==null?void 0:Number(e.max.value),o=n==null?null:(0,s.clamp)(n,i,a),c=o==null?``:String(o);d.value!==c&&(d.value=c),t(`change`,{originalEvent:r,value:o})}let m=n.createSpinnerControl({commit:p,disabled:l,largeStep:e[`large-step`],max:e.max,min:e.min,parse:f,readonly:u,step:e.step}),h=(0,a.ref)(),g=null,_=null,v=null,y=n=>{if(!n){g?.(),_?.(),v?.dispose(),g=null,_=null,v=null,e.ref.value?.(null);return}n.setAttribute(`inputmode`,`decimal`),n.setAttribute(`role`,`spinbutton`);let r=e=>{let t=e.target.value,n=t===``?null:Number.parseFloat(t);p(Number.isNaN(n??NaN)?null:n,e)},a=e=>{let n=e.target.value,r=n===``?null:Number.parseFloat(n);d.value=n,t(`input`,{originalEvent:e,value:Number.isNaN(r??NaN)?null:r})};n.addEventListener(`change`,r),n.addEventListener(`input`,a),_=()=>{n.removeEventListener(`change`,r),n.removeEventListener(`input`,a)},g=i(()=>{let t=f();t==null?n.removeAttribute(`aria-valuenow`):n.setAttribute(`aria-valuenow`,String(t)),e.min.value==null?n.removeAttribute(`aria-valuemin`):n.setAttribute(`aria-valuemin`,String(e.min.value)),e.max.value==null?n.removeAttribute(`aria-valuemax`):n.setAttribute(`aria-valuemax`,String(e.max.value)),u.value?n.setAttribute(`aria-readonly`,`true`):n.removeAttribute(`aria-readonly`)}),e.ref.value?.(n),v=(0,o.watch)(e.ref,e=>{e?.(n)})};(0,a.onElement)(h,e=>{e.ref=y}),(0,a.bind)({attr:{size:c.size,value:()=>d.value||null,variant:c.variant}});let b=(0,o.computed)(()=>l.value||u.value);return a.html`
2
+ <div class="wrapper" part="control" @keydown="${e=>m.handleKeydown(e)}">
3
3
  <button
4
4
  type="button"
5
5
  part="decrement-btn"
6
6
  aria-label="Decrease"
7
- ?disabled="${()=>S.value||g.atMin()}"
8
- @click="${t=>g.incrementBy(-(Number(e.step.value)||1),t)}">
7
+ ?disabled="${()=>b.value||m.atMin()}"
8
+ @click="${t=>m.incrementBy(-(Number(e.step.value)||1),t)}">
9
9
  <ore-icon name="minus" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
10
10
  </button>
11
11
  <ore-input
12
12
  class="field"
13
13
  part="field"
14
- ref="${_}"
15
- :value="${()=>p.value}"
14
+ ref="${h}"
15
+ :value="${()=>d.value}"
16
16
  :label="${()=>e.label.value??``}"
17
17
  :label-placement="${()=>e[`label-placement`].value??`inset`}"
18
18
  :placeholder="${()=>e.placeholder.value??``}"
19
19
  :name="${()=>e.name.value??``}"
20
20
  :helper="${()=>e.helper.value??``}"
21
21
  :error="${()=>e.error.value??``}"
22
- :size="${u.size}"
22
+ :size="${c.size}"
23
23
  :color="${()=>e.color.value??``}"
24
24
  :variant="${()=>e.variant.value??``}"
25
25
  :rounded="${()=>e.rounded.value}"
26
- ?disabled="${d}"
27
- ?readonly="${f}"
26
+ ?disabled="${l}"
27
+ ?readonly="${u}"
28
28
  ?fullwidth="${()=>!1}">
29
29
  </ore-input>
30
30
  <button
31
31
  type="button"
32
32
  part="increment-btn"
33
33
  aria-label="Increase"
34
- ?disabled="${()=>S.value||g.atMax()}"
35
- @click="${t=>g.incrementBy(Number(e.step.value)||1,t)}">
34
+ ?disabled="${()=>b.value||m.atMax()}"
35
+ @click="${t=>m.incrementBy(Number(e.step.value)||1,t)}">
36
36
  <ore-icon name="plus" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
37
37
  </button>
38
38
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"number-input.cjs","names":[],"sources":["../src/inputs/number-input/number-input.ts"],"sourcesContent":["import { clamp } from '@vielzeug/arsenal';\nimport { define, html, inject, prop, ref } from '@vielzeug/ore';\nimport { computed, signal, watch as rippleWatch } from '@vielzeug/ripple';\n\nimport type { ComponentSize, ThemeColor, VisualVariant } from '../../types';\n\nimport { createSpinnerControl } from '../../headless';\nimport '../../content/icon/icon';\nimport '../input/input';\nimport { disablableBundle, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { disabledStateMixin } from '../../styles';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport styles from './number-input.css?inline';\n\nexport type OreNumberInputEvents = {\n change: { originalEvent?: Event; value: number | null };\n input: { originalEvent?: Event; value: number | null };\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 /** 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 /** 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 {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 change - On committed value change. detail: { value: number | null, originalEvent?: Event }\n * @fires input - On every keystroke. detail: { value: number | null, originalEvent?: Event }\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 * ```\n */\nexport const NUMBER_INPUT_TAG = 'ore-number-input' as const;\ndefine<OreNumberInputProps, OreNumberInputEvents>(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 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.json(undefined as ((el: HTMLInputElement | null) => void) | null | undefined),\n step: prop.number(1),\n value: prop.json(undefined as number | undefined),\n variant: prop.string<VisualVariant>(),\n },\n setup(props, { bind, emit, onElement, watch }) {\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(bind, props, formCtx);\n const isDisabled = fCtxProps.disabled;\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 // 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 emit('change', { originalEvent, value: clamped });\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 const n = val !== '' ? Number.parseFloat(val) : null;\n\n fieldValue.value = val;\n emit('input', { originalEvent: e, value: Number.isNaN(n ?? NaN) ? null : n });\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: fCtxProps.size,\n value: () => fieldValue.value || null,\n variant: fCtxProps.variant,\n },\n });\n\n const isNonInteractive = computed(() => isDisabled.value || isReadonly.value);\n\n return html`\n <div class=\"wrapper\" part=\"control\" @keydown=\"${(e: KeyboardEvent) => spinner.handleKeydown(e)}\">\n <button\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 <ore-input\n class=\"field\"\n part=\"field\"\n ref=\"${bitInputRef}\"\n :value=\"${() => fieldValue.value}\"\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=\"${fCtxProps.size}\"\n :color=\"${() => props.color.value ?? ''}\"\n :variant=\"${() => props.variant.value ?? ''}\"\n :rounded=\"${() => props.rounded.value}\"\n ?disabled=\"${isDisabled}\"\n ?readonly=\"${isReadonly}\"\n ?fullwidth=\"${() => false}\">\n </ore-input>\n <button\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 </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [disabledStateMixin, styles],\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';\nimport { define, html, inject, prop, ref, bind, onElement, useEmit, watchEffect } from '@vielzeug/ore';\nimport { computed, signal, watch as rippleWatch } from '@vielzeug/ripple';\n\nimport type { ComponentSize, ThemeColor, VisualVariant } from '../../types';\n\nimport { createSpinnerControl } from '../../headless';\nimport '../../content/icon/icon';\nimport '../input/input';\nimport { disablableBundle, roundableBundle, sizableBundle, themableBundle } from '../../shared';\nimport { disabledStateMixin } from '../../styles';\nimport { FORM_CTX, useFormContext } from '../shared/form-context';\nimport styles from './number-input.css?inline';\n\nexport type OreNumberInputEvents = {\n change: { originalEvent?: Event; value: number | null };\n input: { originalEvent?: Event; value: number | null };\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 /** 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 /** 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 {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 change - On committed value change. detail: { value: number | null, originalEvent?: Event }\n * @fires input - On every keystroke. detail: { value: number | null, originalEvent?: Event }\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 * ```\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 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.json(undefined as ((el: HTMLInputElement | null) => void) | null | undefined),\n step: prop.number(1),\n value: prop.json(undefined as number | undefined),\n variant: prop.string<VisualVariant>(),\n },\n setup(props) {\n const emit = useEmit<OreNumberInputEvents>();\n const watch = watchEffect;\n\n const formCtx = inject(FORM_CTX);\n const fCtxProps = useFormContext(props, formCtx);\n const isDisabled = fCtxProps.disabled;\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 // 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 emit('change', { originalEvent, value: clamped });\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 const n = val !== '' ? Number.parseFloat(val) : null;\n\n fieldValue.value = val;\n emit('input', { originalEvent: e, value: Number.isNaN(n ?? NaN) ? null : n });\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: fCtxProps.size,\n value: () => fieldValue.value || null,\n variant: fCtxProps.variant,\n },\n });\n\n const isNonInteractive = computed(() => isDisabled.value || isReadonly.value);\n\n return html`\n <div class=\"wrapper\" part=\"control\" @keydown=\"${(e: KeyboardEvent) => spinner.handleKeydown(e)}\">\n <button\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 <ore-input\n class=\"field\"\n part=\"field\"\n ref=\"${bitInputRef}\"\n :value=\"${() => fieldValue.value}\"\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=\"${fCtxProps.size}\"\n :color=\"${() => props.color.value ?? ''}\"\n :variant=\"${() => props.variant.value ?? ''}\"\n :rounded=\"${() => props.rounded.value}\"\n ?disabled=\"${isDisabled}\"\n ?readonly=\"${isReadonly}\"\n ?fullwidth=\"${() => false}\">\n </ore-input>\n <button\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 </div>\n `;\n },\n shadow: { delegatesFocus: true },\n styles: [disabledStateMixin, styles],\n});\n"],"mappings":"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"}
@@ -2,131 +2,131 @@ import { disabledStateMixin as e } from "./styles/mixins/states.css.js";
2
2
  import { disablableBundle as t, roundableBundle as n, sizableBundle as r, themableBundle as i } from "./shared/prop-bundles.js";
3
3
  import { createSpinnerControl as a } from "./headless/spinner.js";
4
4
  import { FORM_CTX as o, useFormContext as s } from "./inputs/shared/form-context.js";
5
- import c from "./inputs/number-input/number-input.css?inline.js";
6
- import { define as l, html as u, inject as d, prop as f, ref as p } from "@vielzeug/ore";
7
- import { computed as m, signal as h, watch as g } from "@vielzeug/ripple";
8
- import { clamp as _ } from "@vielzeug/arsenal";
5
+ import c from "./inputs/number-input/number-input.css.js";
6
+ import { bind as l, define as u, html as d, inject as f, onElement as p, prop as m, ref as h, useEmit as g, watchEffect as _ } from "@vielzeug/ore";
7
+ import { computed as v, signal as y, watch as b } from "@vielzeug/ripple";
8
+ import { clamp as x } from "@vielzeug/arsenal";
9
9
  //#region src/inputs/number-input/number-input.ts
10
- var v = "ore-number-input";
11
- l(v, {
10
+ var S = "ore-number-input";
11
+ u(S, {
12
12
  formAssociated: !0,
13
13
  props: {
14
14
  ...i,
15
15
  ...r,
16
16
  ...t,
17
17
  ...n,
18
- error: f.string(),
19
- fullwidth: f.bool(!1),
20
- helper: f.string(),
21
- label: f.string(),
22
- "label-placement": f.oneOf(["inset", "outside"], "inset"),
23
- "large-step": f.json(void 0),
24
- max: f.json(void 0),
25
- min: f.json(void 0),
26
- name: f.string(),
27
- placeholder: f.string(),
28
- readonly: f.bool(!1),
29
- ref: f.json(void 0),
30
- step: f.number(1),
31
- value: f.json(void 0),
32
- variant: f.string()
18
+ error: m.string(),
19
+ fullwidth: m.bool(!1),
20
+ helper: m.string(),
21
+ label: m.string(),
22
+ "label-placement": m.oneOf(["inset", "outside"], "inset"),
23
+ "large-step": m.json(void 0),
24
+ max: m.json(void 0),
25
+ min: m.json(void 0),
26
+ name: m.string(),
27
+ placeholder: m.string(),
28
+ readonly: m.bool(!1),
29
+ ref: m.json(void 0),
30
+ step: m.number(1),
31
+ value: m.json(void 0),
32
+ variant: m.string()
33
33
  },
34
- setup(e, { bind: t, emit: n, onElement: r, watch: i }) {
35
- let c = s(t, e, d(o)), l = c.disabled, f = m(() => !!e.readonly.value), v = h(e.value.value == null ? "" : String(e.value.value));
36
- g(e.value, (e) => {
34
+ setup(e) {
35
+ let t = g(), n = _, r = s(e, f(o)), i = r.disabled, c = v(() => !!e.readonly.value), u = y(e.value.value == null ? "" : String(e.value.value));
36
+ b(e.value, (e) => {
37
37
  let t = e == null ? "" : String(e);
38
- v.value !== t && (v.value = t);
38
+ u.value !== t && (u.value = t);
39
39
  });
40
- function y() {
41
- let e = v.value.trim();
40
+ function m() {
41
+ let e = u.value.trim();
42
42
  if (!e) return null;
43
43
  let t = Number.parseFloat(e);
44
44
  return Number.isNaN(t) ? null : t;
45
45
  }
46
- function b(t, r) {
47
- 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 : _(t, i, a), s = o == null ? "" : String(o);
48
- v.value !== s && (v.value = s), n("change", {
46
+ function S(n, r) {
47
+ let i = e.min.value == null ? void 0 : Number(e.min.value), a = e.max.value == null ? void 0 : Number(e.max.value), o = n == null ? null : x(n, i, a), s = o == null ? "" : String(o);
48
+ u.value !== s && (u.value = s), t("change", {
49
49
  originalEvent: r,
50
50
  value: o
51
51
  });
52
52
  }
53
- let x = a({
54
- commit: b,
55
- disabled: l,
53
+ let C = a({
54
+ commit: S,
55
+ disabled: i,
56
56
  largeStep: e["large-step"],
57
57
  max: e.max,
58
58
  min: e.min,
59
- parse: y,
60
- readonly: f,
59
+ parse: m,
60
+ readonly: c,
61
61
  step: e.step
62
- }), S = p(), C = null, w = null, T = null, E = (t) => {
63
- if (!t) {
64
- C?.(), w?.(), T?.dispose(), C = null, w = null, T = null, e.ref.value?.(null);
62
+ }), w = h(), T = null, E = null, D = null, O = (r) => {
63
+ if (!r) {
64
+ T?.(), E?.(), D?.dispose(), T = null, E = null, D = null, e.ref.value?.(null);
65
65
  return;
66
66
  }
67
- t.setAttribute("inputmode", "decimal"), t.setAttribute("role", "spinbutton");
68
- let r = (e) => {
67
+ r.setAttribute("inputmode", "decimal"), r.setAttribute("role", "spinbutton");
68
+ let i = (e) => {
69
69
  let t = e.target.value, n = t === "" ? null : Number.parseFloat(t);
70
- b(Number.isNaN(n ?? NaN) ? null : n, e);
70
+ S(Number.isNaN(n ?? NaN) ? null : n, e);
71
71
  }, a = (e) => {
72
- let t = e.target.value, r = t === "" ? null : Number.parseFloat(t);
73
- v.value = t, n("input", {
72
+ let n = e.target.value, r = n === "" ? null : Number.parseFloat(n);
73
+ u.value = n, t("input", {
74
74
  originalEvent: e,
75
75
  value: Number.isNaN(r ?? NaN) ? null : r
76
76
  });
77
77
  };
78
- t.addEventListener("change", r), t.addEventListener("input", a), w = () => {
79
- t.removeEventListener("change", r), t.removeEventListener("input", a);
80
- }, C = i(() => {
81
- let n = y();
82
- 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)), f.value ? t.setAttribute("aria-readonly", "true") : t.removeAttribute("aria-readonly");
83
- }), e.ref.value?.(t), T = g(e.ref, (e) => {
84
- e?.(t);
78
+ r.addEventListener("change", i), r.addEventListener("input", a), E = () => {
79
+ r.removeEventListener("change", i), r.removeEventListener("input", a);
80
+ }, T = n(() => {
81
+ let t = m();
82
+ t == null ? r.removeAttribute("aria-valuenow") : r.setAttribute("aria-valuenow", String(t)), e.min.value == null ? r.removeAttribute("aria-valuemin") : r.setAttribute("aria-valuemin", String(e.min.value)), e.max.value == null ? r.removeAttribute("aria-valuemax") : r.setAttribute("aria-valuemax", String(e.max.value)), c.value ? r.setAttribute("aria-readonly", "true") : r.removeAttribute("aria-readonly");
83
+ }), e.ref.value?.(r), D = b(e.ref, (e) => {
84
+ e?.(r);
85
85
  });
86
86
  };
87
- r(S, (e) => {
88
- e.ref = E;
89
- }), t({ attr: {
90
- size: c.size,
91
- value: () => v.value || null,
92
- variant: c.variant
87
+ p(w, (e) => {
88
+ e.ref = O;
89
+ }), l({ attr: {
90
+ size: r.size,
91
+ value: () => u.value || null,
92
+ variant: r.variant
93
93
  } });
94
- let D = m(() => l.value || f.value);
95
- return u`
96
- <div class="wrapper" part="control" @keydown="${(e) => x.handleKeydown(e)}">
94
+ let k = v(() => i.value || c.value);
95
+ return d`
96
+ <div class="wrapper" part="control" @keydown="${(e) => C.handleKeydown(e)}">
97
97
  <button
98
98
  type="button"
99
99
  part="decrement-btn"
100
100
  aria-label="Decrease"
101
- ?disabled="${() => D.value || x.atMin()}"
102
- @click="${(t) => x.incrementBy(-(Number(e.step.value) || 1), t)}">
101
+ ?disabled="${() => k.value || C.atMin()}"
102
+ @click="${(t) => C.incrementBy(-(Number(e.step.value) || 1), t)}">
103
103
  <ore-icon name="minus" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
104
104
  </button>
105
105
  <ore-input
106
106
  class="field"
107
107
  part="field"
108
- ref="${S}"
109
- :value="${() => v.value}"
108
+ ref="${w}"
109
+ :value="${() => u.value}"
110
110
  :label="${() => e.label.value ?? ""}"
111
111
  :label-placement="${() => e["label-placement"].value ?? "inset"}"
112
112
  :placeholder="${() => e.placeholder.value ?? ""}"
113
113
  :name="${() => e.name.value ?? ""}"
114
114
  :helper="${() => e.helper.value ?? ""}"
115
115
  :error="${() => e.error.value ?? ""}"
116
- :size="${c.size}"
116
+ :size="${r.size}"
117
117
  :color="${() => e.color.value ?? ""}"
118
118
  :variant="${() => e.variant.value ?? ""}"
119
119
  :rounded="${() => e.rounded.value}"
120
- ?disabled="${l}"
121
- ?readonly="${f}"
120
+ ?disabled="${i}"
121
+ ?readonly="${c}"
122
122
  ?fullwidth="${() => !1}">
123
123
  </ore-input>
124
124
  <button
125
125
  type="button"
126
126
  part="increment-btn"
127
127
  aria-label="Increase"
128
- ?disabled="${() => D.value || x.atMax()}"
129
- @click="${(t) => x.incrementBy(Number(e.step.value) || 1, t)}">
128
+ ?disabled="${() => k.value || C.atMax()}"
129
+ @click="${(t) => C.incrementBy(Number(e.step.value) || 1, t)}">
130
130
  <ore-icon name="plus" size="14" stroke-width="2.5" aria-hidden="true"></ore-icon>
131
131
  </button>
132
132
  </div>
@@ -136,6 +136,6 @@ l(v, {
136
136
  styles: [e, c]
137
137
  });
138
138
  //#endregion
139
- export { v as NUMBER_INPUT_TAG };
139
+ export { S as NUMBER_INPUT_TAG };
140
140
 
141
141
  //# sourceMappingURL=number-input.js.map