@funstack/ui 0.1.0-alpha.2 → 0.1.0-alpha.4

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 (403) hide show
  1. package/dist/accordion/accordion-context.mjs.map +1 -1
  2. package/dist/accordion/accordion-item.mjs +18 -4
  3. package/dist/accordion/accordion-item.mjs.map +1 -1
  4. package/dist/accordion/accordion-panel.mjs +2 -3
  5. package/dist/accordion/accordion-panel.mjs.map +1 -1
  6. package/dist/accordion/accordion-root.d.mts.map +1 -1
  7. package/dist/accordion/accordion-root.mjs +34 -15
  8. package/dist/accordion/accordion-root.mjs.map +1 -1
  9. package/dist/accordion/accordion-trigger.mjs +4 -5
  10. package/dist/accordion/accordion-trigger.mjs.map +1 -1
  11. package/dist/checkbox/checkbox.d.mts +5 -3
  12. package/dist/checkbox/checkbox.d.mts.map +1 -1
  13. package/dist/checkbox/checkbox.mjs +25 -9
  14. package/dist/checkbox/checkbox.mjs.map +1 -1
  15. package/dist/checkbox-group/checkbox-group-context.mjs.map +1 -1
  16. package/dist/checkbox-group/checkbox-group-item.d.mts +2 -1
  17. package/dist/checkbox-group/checkbox-group-item.d.mts.map +1 -1
  18. package/dist/checkbox-group/checkbox-group-item.mjs +3 -1
  19. package/dist/checkbox-group/checkbox-group-item.mjs.map +1 -1
  20. package/dist/checkbox-group/checkbox-group-root.d.mts +5 -2
  21. package/dist/checkbox-group/checkbox-group-root.d.mts.map +1 -1
  22. package/dist/checkbox-group/checkbox-group-root.mjs +24 -5
  23. package/dist/checkbox-group/checkbox-group-root.mjs.map +1 -1
  24. package/dist/combobox/combobox-clear.mjs +2 -1
  25. package/dist/combobox/combobox-clear.mjs.map +1 -1
  26. package/dist/combobox/combobox-context.mjs.map +1 -1
  27. package/dist/combobox/combobox-input.d.mts +3 -1
  28. package/dist/combobox/combobox-input.d.mts.map +1 -1
  29. package/dist/combobox/combobox-input.mjs +16 -2
  30. package/dist/combobox/combobox-input.mjs.map +1 -1
  31. package/dist/combobox/combobox-list.mjs +3 -2
  32. package/dist/combobox/combobox-list.mjs.map +1 -1
  33. package/dist/combobox/combobox-popup.d.mts.map +1 -1
  34. package/dist/combobox/combobox-popup.mjs +7 -2
  35. package/dist/combobox/combobox-popup.mjs.map +1 -1
  36. package/dist/combobox/combobox-root.d.mts.map +1 -1
  37. package/dist/combobox/combobox-root.mjs +20 -5
  38. package/dist/combobox/combobox-root.mjs.map +1 -1
  39. package/dist/combobox/combobox-trigger.mjs +2 -1
  40. package/dist/combobox/combobox-trigger.mjs.map +1 -1
  41. package/dist/dialog/dialog-close.d.mts +17 -10
  42. package/dist/dialog/dialog-close.d.mts.map +1 -1
  43. package/dist/dialog/dialog-close.mjs +33 -21
  44. package/dist/dialog/dialog-close.mjs.map +1 -1
  45. package/dist/dialog/dialog-context.mjs.map +1 -1
  46. package/dist/dialog/dialog-form.d.mts +23 -10
  47. package/dist/dialog/dialog-form.d.mts.map +1 -1
  48. package/dist/dialog/dialog-form.mjs +51 -32
  49. package/dist/dialog/dialog-form.mjs.map +1 -1
  50. package/dist/dialog/dialog-popup.d.mts +10 -4
  51. package/dist/dialog/dialog-popup.d.mts.map +1 -1
  52. package/dist/dialog/dialog-popup.mjs +117 -44
  53. package/dist/dialog/dialog-popup.mjs.map +1 -1
  54. package/dist/dialog/dialog-root.d.mts +14 -8
  55. package/dist/dialog/dialog-root.d.mts.map +1 -1
  56. package/dist/dialog/dialog-root.mjs +67 -12
  57. package/dist/dialog/dialog-root.mjs.map +1 -1
  58. package/dist/dialog/dialog-trigger.d.mts +3 -2
  59. package/dist/dialog/dialog-trigger.d.mts.map +1 -1
  60. package/dist/dialog/dialog-trigger.mjs +2 -1
  61. package/dist/dialog/dialog-trigger.mjs.map +1 -1
  62. package/dist/dialog/index.d.mts +4 -2
  63. package/dist/dialog/index.d.mts.map +1 -1
  64. package/dist/dialog/index.mjs +4 -2
  65. package/dist/dialog/index.mjs.map +1 -1
  66. package/dist/field/field-control.d.mts +33 -0
  67. package/dist/field/field-control.d.mts.map +1 -0
  68. package/dist/field/field-control.mjs +68 -0
  69. package/dist/field/field-control.mjs.map +1 -0
  70. package/dist/field/field-description.d.mts +24 -0
  71. package/dist/field/field-description.d.mts.map +1 -0
  72. package/dist/field/field-description.mjs +34 -0
  73. package/dist/field/field-description.mjs.map +1 -0
  74. package/dist/field/field-error.d.mts +30 -0
  75. package/dist/field/field-error.d.mts.map +1 -0
  76. package/dist/field/field-error.mjs +42 -0
  77. package/dist/field/field-error.mjs.map +1 -0
  78. package/dist/field/field-label.d.mts +25 -0
  79. package/dist/field/field-label.d.mts.map +1 -0
  80. package/dist/field/field-label.mjs +46 -0
  81. package/dist/field/field-label.mjs.map +1 -0
  82. package/dist/field/field-root.d.mts +53 -0
  83. package/dist/field/field-root.d.mts.map +1 -0
  84. package/dist/field/field-root.mjs +319 -0
  85. package/dist/field/field-root.mjs.map +1 -0
  86. package/dist/field/index.d.mts +18 -0
  87. package/dist/field/index.d.mts.map +1 -0
  88. package/dist/field/index.mjs +17 -0
  89. package/dist/field/index.mjs.map +1 -0
  90. package/dist/form/form-root.d.mts +58 -0
  91. package/dist/form/form-root.d.mts.map +1 -0
  92. package/dist/form/form-root.mjs +147 -0
  93. package/dist/form/form-root.mjs.map +1 -0
  94. package/dist/form/form-submit.d.mts +31 -0
  95. package/dist/form/form-submit.d.mts.map +1 -0
  96. package/dist/form/form-submit.mjs +53 -0
  97. package/dist/form/form-submit.mjs.map +1 -0
  98. package/dist/form/index.d.mts +11 -0
  99. package/dist/form/index.d.mts.map +1 -0
  100. package/dist/form/index.mjs +11 -0
  101. package/dist/form/index.mjs.map +1 -0
  102. package/dist/index.d.mts +53 -1
  103. package/dist/index.mjs +11 -1
  104. package/dist/internal/announce.mjs +53 -0
  105. package/dist/internal/announce.mjs.map +1 -0
  106. package/dist/internal/content-focus-probe.mjs +42 -0
  107. package/dist/internal/content-focus-probe.mjs.map +1 -0
  108. package/dist/internal/decimal.mjs +27 -0
  109. package/dist/internal/decimal.mjs.map +1 -0
  110. package/dist/internal/dev-warn.mjs +17 -0
  111. package/dist/internal/dev-warn.mjs.map +1 -0
  112. package/dist/internal/field-context.d.mts +19 -0
  113. package/dist/internal/field-context.d.mts.map +1 -0
  114. package/dist/internal/field-context.mjs +14 -0
  115. package/dist/internal/field-context.mjs.map +1 -0
  116. package/dist/internal/focus-first-invalid.mjs +67 -0
  117. package/dist/internal/focus-first-invalid.mjs.map +1 -0
  118. package/dist/internal/form-status-watcher.mjs +31 -0
  119. package/dist/internal/form-status-watcher.mjs.map +1 -0
  120. package/dist/internal/modal-registry.mjs +39 -0
  121. package/dist/internal/modal-registry.mjs.map +1 -0
  122. package/dist/internal/range-value.mjs +51 -0
  123. package/dist/internal/range-value.mjs.map +1 -0
  124. package/dist/internal/render-element.mjs +54 -0
  125. package/dist/internal/render-element.mjs.map +1 -0
  126. package/dist/internal/toolbar-context.mjs +17 -0
  127. package/dist/internal/toolbar-context.mjs.map +1 -0
  128. package/dist/internal/types.d.mts +3 -1
  129. package/dist/internal/types.d.mts.map +1 -1
  130. package/dist/internal/use-controllable-action.mjs +33 -15
  131. package/dist/internal/use-controllable-action.mjs.map +1 -1
  132. package/dist/internal/use-exit-animation.mjs +26 -6
  133. package/dist/internal/use-exit-animation.mjs.map +1 -1
  134. package/dist/internal/use-field-control.mjs +109 -0
  135. package/dist/internal/use-field-control.mjs.map +1 -0
  136. package/dist/internal/use-form-owner-event.mjs +44 -0
  137. package/dist/internal/use-form-owner-event.mjs.map +1 -0
  138. package/dist/internal/use-form-reset.mjs +10 -33
  139. package/dist/internal/use-form-reset.mjs.map +1 -1
  140. package/dist/internal/use-latest.mjs +32 -0
  141. package/dist/internal/use-latest.mjs.map +1 -0
  142. package/dist/internal/use-modal-registration.mjs +47 -0
  143. package/dist/internal/use-modal-registration.mjs.map +1 -0
  144. package/dist/internal/use-native-group-reconciliation.mjs +6 -5
  145. package/dist/internal/use-native-group-reconciliation.mjs.map +1 -1
  146. package/dist/internal/use-native-select-value.mjs +7 -5
  147. package/dist/internal/use-native-select-value.mjs.map +1 -1
  148. package/dist/internal/use-popover-popup.mjs +11 -24
  149. package/dist/internal/use-popover-popup.mjs.map +1 -1
  150. package/dist/internal/use-popover-root.mjs +58 -23
  151. package/dist/internal/use-popover-root.mjs.map +1 -1
  152. package/dist/internal/use-popover-trigger.mjs +1 -1
  153. package/dist/internal/use-render.mjs +11 -34
  154. package/dist/internal/use-render.mjs.map +1 -1
  155. package/dist/internal/use-roving-focus.mjs +255 -0
  156. package/dist/internal/use-roving-focus.mjs.map +1 -0
  157. package/dist/internal/validity.d.mts +24 -0
  158. package/dist/internal/validity.d.mts.map +1 -0
  159. package/dist/internal/validity.mjs +108 -0
  160. package/dist/internal/validity.mjs.map +1 -0
  161. package/dist/menu/menu-checkbox-item.mjs +2 -1
  162. package/dist/menu/menu-checkbox-item.mjs.map +1 -1
  163. package/dist/menu/menu-group.d.mts.map +1 -1
  164. package/dist/menu/menu-group.mjs +3 -2
  165. package/dist/menu/menu-group.mjs.map +1 -1
  166. package/dist/menu/menu-item.mjs +2 -1
  167. package/dist/menu/menu-item.mjs.map +1 -1
  168. package/dist/menu/menu-popup.d.mts.map +1 -1
  169. package/dist/menu/menu-popup.mjs +7 -2
  170. package/dist/menu/menu-popup.mjs.map +1 -1
  171. package/dist/menu/menu-radio-group.mjs +9 -4
  172. package/dist/menu/menu-radio-group.mjs.map +1 -1
  173. package/dist/menu/menu-radio-item.mjs +2 -1
  174. package/dist/menu/menu-radio-item.mjs.map +1 -1
  175. package/dist/menu/menu-root.mjs +1 -1
  176. package/dist/menu/menu-root.mjs.map +1 -1
  177. package/dist/menu/menu-trigger.d.mts +2 -1
  178. package/dist/menu/menu-trigger.d.mts.map +1 -1
  179. package/dist/menu/menu-trigger.mjs +15 -4
  180. package/dist/menu/menu-trigger.mjs.map +1 -1
  181. package/dist/meter/index.d.mts +24 -0
  182. package/dist/meter/index.d.mts.map +1 -0
  183. package/dist/meter/index.mjs +23 -0
  184. package/dist/meter/index.mjs.map +1 -0
  185. package/dist/meter/meter-context.mjs +13 -0
  186. package/dist/meter/meter-context.mjs.map +1 -0
  187. package/dist/meter/meter-indicator.d.mts +19 -0
  188. package/dist/meter/meter-indicator.d.mts.map +1 -0
  189. package/dist/meter/meter-indicator.mjs +25 -0
  190. package/dist/meter/meter-indicator.mjs.map +1 -0
  191. package/dist/meter/meter-label.d.mts +19 -0
  192. package/dist/meter/meter-label.d.mts.map +1 -0
  193. package/dist/meter/meter-label.mjs +28 -0
  194. package/dist/meter/meter-label.mjs.map +1 -0
  195. package/dist/meter/meter-region.d.mts +4 -0
  196. package/dist/meter/meter-region.d.mts.map +1 -0
  197. package/dist/meter/meter-region.mjs +39 -0
  198. package/dist/meter/meter-region.mjs.map +1 -0
  199. package/dist/meter/meter-root.d.mts +71 -0
  200. package/dist/meter/meter-root.d.mts.map +1 -0
  201. package/dist/meter/meter-root.mjs +83 -0
  202. package/dist/meter/meter-root.mjs.map +1 -0
  203. package/dist/meter/meter-track.d.mts +19 -0
  204. package/dist/meter/meter-track.d.mts.map +1 -0
  205. package/dist/meter/meter-track.mjs +25 -0
  206. package/dist/meter/meter-track.mjs.map +1 -0
  207. package/dist/meter/meter-value.d.mts +20 -0
  208. package/dist/meter/meter-value.d.mts.map +1 -0
  209. package/dist/meter/meter-value.mjs +29 -0
  210. package/dist/meter/meter-value.mjs.map +1 -0
  211. package/dist/number-field/index.d.mts +26 -0
  212. package/dist/number-field/index.d.mts.map +1 -0
  213. package/dist/number-field/index.mjs +26 -0
  214. package/dist/number-field/index.mjs.map +1 -0
  215. package/dist/number-field/number-field-arithmetic.mjs +78 -0
  216. package/dist/number-field/number-field-arithmetic.mjs.map +1 -0
  217. package/dist/number-field/number-field-context.d.mts +2 -0
  218. package/dist/number-field/number-field-context.mjs +13 -0
  219. package/dist/number-field/number-field-context.mjs.map +1 -0
  220. package/dist/number-field/number-field-decrement.d.mts +16 -0
  221. package/dist/number-field/number-field-decrement.d.mts.map +1 -0
  222. package/dist/number-field/number-field-decrement.mjs +19 -0
  223. package/dist/number-field/number-field-decrement.mjs.map +1 -0
  224. package/dist/number-field/number-field-format.mjs +279 -0
  225. package/dist/number-field/number-field-format.mjs.map +1 -0
  226. package/dist/number-field/number-field-increment.d.mts +32 -0
  227. package/dist/number-field/number-field-increment.d.mts.map +1 -0
  228. package/dist/number-field/number-field-increment.mjs +68 -0
  229. package/dist/number-field/number-field-increment.mjs.map +1 -0
  230. package/dist/number-field/number-field-input.d.mts +29 -0
  231. package/dist/number-field/number-field-input.d.mts.map +1 -0
  232. package/dist/number-field/number-field-input.mjs +163 -0
  233. package/dist/number-field/number-field-input.mjs.map +1 -0
  234. package/dist/number-field/number-field-label.d.mts +23 -0
  235. package/dist/number-field/number-field-label.d.mts.map +1 -0
  236. package/dist/number-field/number-field-label.mjs +47 -0
  237. package/dist/number-field/number-field-label.mjs.map +1 -0
  238. package/dist/number-field/number-field-root.d.mts +108 -0
  239. package/dist/number-field/number-field-root.d.mts.map +1 -0
  240. package/dist/number-field/number-field-root.mjs +523 -0
  241. package/dist/number-field/number-field-root.mjs.map +1 -0
  242. package/dist/number-field/use-step-button.mjs +107 -0
  243. package/dist/number-field/use-step-button.mjs.map +1 -0
  244. package/dist/popover/popover-close.mjs +2 -1
  245. package/dist/popover/popover-close.mjs.map +1 -1
  246. package/dist/popover/popover-popup.d.mts.map +1 -1
  247. package/dist/popover/popover-popup.mjs +7 -2
  248. package/dist/popover/popover-popup.mjs.map +1 -1
  249. package/dist/popover/popover-root.mjs +1 -1
  250. package/dist/progress/index.d.mts +24 -0
  251. package/dist/progress/index.d.mts.map +1 -0
  252. package/dist/progress/index.mjs +24 -0
  253. package/dist/progress/index.mjs.map +1 -0
  254. package/dist/progress/progress-context.mjs +13 -0
  255. package/dist/progress/progress-context.mjs.map +1 -0
  256. package/dist/progress/progress-indicator.d.mts +19 -0
  257. package/dist/progress/progress-indicator.d.mts.map +1 -0
  258. package/dist/progress/progress-indicator.mjs +29 -0
  259. package/dist/progress/progress-indicator.mjs.map +1 -0
  260. package/dist/progress/progress-label.d.mts +19 -0
  261. package/dist/progress/progress-label.d.mts.map +1 -0
  262. package/dist/progress/progress-label.mjs +30 -0
  263. package/dist/progress/progress-label.mjs.map +1 -0
  264. package/dist/progress/progress-root.d.mts +68 -0
  265. package/dist/progress/progress-root.d.mts.map +1 -0
  266. package/dist/progress/progress-root.mjs +80 -0
  267. package/dist/progress/progress-root.mjs.map +1 -0
  268. package/dist/progress/progress-track.d.mts +19 -0
  269. package/dist/progress/progress-track.d.mts.map +1 -0
  270. package/dist/progress/progress-track.mjs +29 -0
  271. package/dist/progress/progress-track.mjs.map +1 -0
  272. package/dist/progress/progress-value.d.mts +20 -0
  273. package/dist/progress/progress-value.d.mts.map +1 -0
  274. package/dist/progress/progress-value.mjs +33 -0
  275. package/dist/progress/progress-value.mjs.map +1 -0
  276. package/dist/radio-group/radio-group-root.d.mts +4 -2
  277. package/dist/radio-group/radio-group-root.d.mts.map +1 -1
  278. package/dist/radio-group/radio-group-root.mjs +34 -8
  279. package/dist/radio-group/radio-group-root.mjs.map +1 -1
  280. package/dist/select/select-group.d.mts.map +1 -1
  281. package/dist/select/select-group.mjs +6 -4
  282. package/dist/select/select-group.mjs.map +1 -1
  283. package/dist/select/select-root.d.mts +4 -2
  284. package/dist/select/select-root.d.mts.map +1 -1
  285. package/dist/select/select-root.mjs +26 -6
  286. package/dist/select/select-root.mjs.map +1 -1
  287. package/dist/slider/index.d.mts +32 -0
  288. package/dist/slider/index.d.mts.map +1 -0
  289. package/dist/slider/index.mjs +27 -0
  290. package/dist/slider/index.mjs.map +1 -0
  291. package/dist/slider/slider-arithmetic.mjs +104 -0
  292. package/dist/slider/slider-arithmetic.mjs.map +1 -0
  293. package/dist/slider/slider-context.mjs +13 -0
  294. package/dist/slider/slider-context.mjs.map +1 -0
  295. package/dist/slider/slider-indicator.d.mts +22 -0
  296. package/dist/slider/slider-indicator.d.mts.map +1 -0
  297. package/dist/slider/slider-indicator.mjs +36 -0
  298. package/dist/slider/slider-indicator.mjs.map +1 -0
  299. package/dist/slider/slider-label.d.mts +23 -0
  300. package/dist/slider/slider-label.d.mts.map +1 -0
  301. package/dist/slider/slider-label.mjs +44 -0
  302. package/dist/slider/slider-label.mjs.map +1 -0
  303. package/dist/slider/slider-root.d.mts +111 -0
  304. package/dist/slider/slider-root.d.mts.map +1 -0
  305. package/dist/slider/slider-root.mjs +583 -0
  306. package/dist/slider/slider-root.mjs.map +1 -0
  307. package/dist/slider/slider-thumb.d.mts +58 -0
  308. package/dist/slider/slider-thumb.d.mts.map +1 -0
  309. package/dist/slider/slider-thumb.mjs +146 -0
  310. package/dist/slider/slider-thumb.mjs.map +1 -0
  311. package/dist/slider/slider-track.d.mts +29 -0
  312. package/dist/slider/slider-track.d.mts.map +1 -0
  313. package/dist/slider/slider-track.mjs +55 -0
  314. package/dist/slider/slider-track.mjs.map +1 -0
  315. package/dist/slider/slider-value.d.mts +34 -0
  316. package/dist/slider/slider-value.d.mts.map +1 -0
  317. package/dist/slider/slider-value.mjs +38 -0
  318. package/dist/slider/slider-value.mjs.map +1 -0
  319. package/dist/switch/switch.d.mts +5 -3
  320. package/dist/switch/switch.d.mts.map +1 -1
  321. package/dist/switch/switch.mjs +24 -8
  322. package/dist/switch/switch.mjs.map +1 -1
  323. package/dist/tabs/tabs-indicator.mjs +2 -1
  324. package/dist/tabs/tabs-indicator.mjs.map +1 -1
  325. package/dist/tabs/tabs-root.mjs +13 -3
  326. package/dist/tabs/tabs-root.mjs.map +1 -1
  327. package/dist/tabs/tabs-tab.mjs +2 -1
  328. package/dist/tabs/tabs-tab.mjs.map +1 -1
  329. package/dist/toast/index.d.mts +25 -0
  330. package/dist/toast/index.d.mts.map +1 -0
  331. package/dist/toast/index.mjs +26 -0
  332. package/dist/toast/index.mjs.map +1 -0
  333. package/dist/toast/toast-action.d.mts +39 -0
  334. package/dist/toast/toast-action.d.mts.map +1 -0
  335. package/dist/toast/toast-action.mjs +65 -0
  336. package/dist/toast/toast-action.mjs.map +1 -0
  337. package/dist/toast/toast-close.d.mts +25 -0
  338. package/dist/toast/toast-close.d.mts.map +1 -0
  339. package/dist/toast/toast-close.mjs +47 -0
  340. package/dist/toast/toast-close.mjs.map +1 -0
  341. package/dist/toast/toast-context.mjs +19 -0
  342. package/dist/toast/toast-context.mjs.map +1 -0
  343. package/dist/toast/toast-description.d.mts +24 -0
  344. package/dist/toast/toast-description.d.mts.map +1 -0
  345. package/dist/toast/toast-description.mjs +35 -0
  346. package/dist/toast/toast-description.mjs.map +1 -0
  347. package/dist/toast/toast-root.d.mts +43 -0
  348. package/dist/toast/toast-root.d.mts.map +1 -0
  349. package/dist/toast/toast-root.mjs +205 -0
  350. package/dist/toast/toast-root.mjs.map +1 -0
  351. package/dist/toast/toast-title.d.mts +24 -0
  352. package/dist/toast/toast-title.d.mts.map +1 -0
  353. package/dist/toast/toast-title.mjs +33 -0
  354. package/dist/toast/toast-title.mjs.map +1 -0
  355. package/dist/toast/toast-viewport.d.mts +52 -0
  356. package/dist/toast/toast-viewport.d.mts.map +1 -0
  357. package/dist/toast/toast-viewport.mjs +644 -0
  358. package/dist/toast/toast-viewport.mjs.map +1 -0
  359. package/dist/toast/toast.d.mts +119 -0
  360. package/dist/toast/toast.d.mts.map +1 -0
  361. package/dist/toast/toast.mjs +157 -0
  362. package/dist/toast/toast.mjs.map +1 -0
  363. package/dist/toggle/toggle.mjs +2 -1
  364. package/dist/toggle/toggle.mjs.map +1 -1
  365. package/dist/toggle-group/index.d.mts +16 -0
  366. package/dist/toggle-group/index.d.mts.map +1 -0
  367. package/dist/toggle-group/index.mjs +15 -0
  368. package/dist/toggle-group/index.mjs.map +1 -0
  369. package/dist/toggle-group/toggle-group-context.d.mts +4 -0
  370. package/dist/toggle-group/toggle-group-context.d.mts.map +1 -0
  371. package/dist/toggle-group/toggle-group-context.mjs +13 -0
  372. package/dist/toggle-group/toggle-group-context.mjs.map +1 -0
  373. package/dist/toggle-group/toggle-group-item.d.mts +47 -0
  374. package/dist/toggle-group/toggle-group-item.d.mts.map +1 -0
  375. package/dist/toggle-group/toggle-group-item.mjs +63 -0
  376. package/dist/toggle-group/toggle-group-item.mjs.map +1 -0
  377. package/dist/toggle-group/toggle-group-root.d.mts +95 -0
  378. package/dist/toggle-group/toggle-group-root.d.mts.map +1 -0
  379. package/dist/toggle-group/toggle-group-root.mjs +211 -0
  380. package/dist/toggle-group/toggle-group-root.mjs.map +1 -0
  381. package/dist/toolbar/index.d.mts +18 -0
  382. package/dist/toolbar/index.d.mts.map +1 -0
  383. package/dist/toolbar/index.mjs +18 -0
  384. package/dist/toolbar/index.mjs.map +1 -0
  385. package/dist/toolbar/toolbar-button.d.mts +42 -0
  386. package/dist/toolbar/toolbar-button.d.mts.map +1 -0
  387. package/dist/toolbar/toolbar-button.mjs +50 -0
  388. package/dist/toolbar/toolbar-button.mjs.map +1 -0
  389. package/dist/toolbar/toolbar-root.d.mts +38 -0
  390. package/dist/toolbar/toolbar-root.d.mts.map +1 -0
  391. package/dist/toolbar/toolbar-root.mjs +66 -0
  392. package/dist/toolbar/toolbar-root.mjs.map +1 -0
  393. package/dist/toolbar/toolbar-separator.d.mts +25 -0
  394. package/dist/toolbar/toolbar-separator.d.mts.map +1 -0
  395. package/dist/toolbar/toolbar-separator.mjs +31 -0
  396. package/dist/toolbar/toolbar-separator.mjs.map +1 -0
  397. package/dist/tooltip/tooltip-popup.mjs +2 -1
  398. package/dist/tooltip/tooltip-popup.mjs.map +1 -1
  399. package/dist/tooltip/tooltip-root.mjs +16 -2
  400. package/dist/tooltip/tooltip-root.mjs.map +1 -1
  401. package/dist/tooltip/tooltip-trigger.mjs +2 -1
  402. package/dist/tooltip/tooltip-trigger.mjs.map +1 -1
  403. package/package.json +10 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-value.mjs","names":[],"sources":["../../src/meter/meter-value.tsx"],"sourcesContent":["\"use client\";\nimport type { ComponentPropsWithRef, CSSProperties, ReactNode } from \"react\";\nimport type { RenderProp, StateValue } from \"../internal/types.js\";\nimport { useRender } from \"../internal/use-render.js\";\nimport { useMeterContext } from \"./meter-context.js\";\nimport type { MeterState } from \"./meter-root.js\";\n\nexport interface MeterValueProps extends Omit<\n ComponentPropsWithRef<\"span\">,\n \"className\" | \"style\" | \"children\"\n> {\n className?: StateValue<string | undefined, MeterState>;\n style?: StateValue<CSSProperties | undefined, MeterState>;\n /** Default: `state.formattedValue`. */\n children?: StateValue<ReactNode, MeterState>;\n render?: RenderProp<ComponentPropsWithRef<\"span\">, MeterState>;\n}\n\n/**\n * `Meter.Value`: shows `state.formattedValue` or `children(state)`. `aria-hidden=\"true\"` is a default the consumer may override, not an owned key: the same text is in the Root's `aria-valuetext`. Owned keys: `data-region`.\n */\nexport function MeterValue({ className, style, children, render, ...rest }: MeterValueProps) {\n const { state } = useMeterContext(\"Meter.Value\");\n const props = { ...rest, \"aria-hidden\": rest[\"aria-hidden\"] ?? true };\n return useRender<ComponentPropsWithRef<\"span\">, MeterState>({\n defaultElement: \"span\",\n render,\n state,\n className,\n style,\n children: children ?? state.formattedValue,\n props,\n libraryProps: {\n \"data-region\": state.region,\n },\n });\n}\n\nMeterValue.displayName = \"MeterValue\";\n"],"mappings":";;;;;;;AAqBA,SAAgB,WAAW,EAAE,WAAW,OAAO,UAAU,QAAQ,GAAG,QAAyB;CAC3F,MAAM,EAAE,UAAU,gBAAgB,aAAa;CAC/C,MAAM,QAAQ;EAAE,GAAG;EAAM,eAAe,KAAK,kBAAkB;CAAK;CACpE,OAAO,UAAqD;EAC1D,gBAAgB;EAChB;EACA;EACA;EACA;EACA,UAAU,YAAY,MAAM;EAC5B;EACA,cAAc,EACZ,eAAe,MAAM,OACvB;CACF,CAAC;AACH;AAEA,WAAW,cAAc"}
@@ -0,0 +1,26 @@
1
+ import "../internal/platform-attributes.mjs";
2
+ import { NumberFieldRoot, NumberFieldRootProps, NumberFieldState, NumberFieldValueChangeDetails } from "./number-field-root.mjs";
3
+ import { NumberFieldButtonState, NumberFieldDecrementProps, NumberFieldIncrement, NumberFieldIncrementProps } from "./number-field-increment.mjs";
4
+ import { NumberFieldDecrement } from "./number-field-decrement.mjs";
5
+ import { NumberFieldInput, NumberFieldInputProps } from "./number-field-input.mjs";
6
+ import { NumberFieldLabel, NumberFieldLabelProps } from "./number-field-label.mjs";
7
+ //#region src/number-field/index.d.ts
8
+ /**
9
+ * NumberField: a text field that holds a number. `Root` (`div[role=group]`, owns the state),
10
+ * `Label`, `Input` (the visible `input[type=text]` plus a visually hidden native
11
+ * `input[type=number]` that carries `name`, the constraints and the posted value), and the
12
+ * `Increment` / `Decrement` buttons (press-and-hold). The user types in their locale's notation
13
+ * (committed on blur or Enter) or steps with the keys and buttons. Two actions:
14
+ * `valueChangeAction` on every step (a transition; keep it cheap) and `valueCommitAction` once
15
+ * per gesture (the save; uncontrolled state is committed when it resolves).
16
+ */
17
+ export declare const NumberField: {
18
+ readonly Root: typeof NumberFieldRoot;
19
+ readonly Label: typeof NumberFieldLabel;
20
+ readonly Input: typeof NumberFieldInput;
21
+ readonly Increment: typeof NumberFieldIncrement;
22
+ readonly Decrement: typeof NumberFieldDecrement;
23
+ };
24
+ //#endregion
25
+ export type { NumberFieldButtonState, NumberFieldDecrementProps, NumberFieldIncrementProps, NumberFieldInputProps, NumberFieldLabelProps, NumberFieldRootProps, NumberFieldState, NumberFieldValueChangeDetails };
26
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/number-field/index.ts"],"mappings":";;;;;;;;;;;;;;;;qBAkBa;WACX,aAAI;WACJ,cAAK;WACL,cAAK;WACL,kBAAS;WACT,kBAAS"}
@@ -0,0 +1,26 @@
1
+ import { NumberFieldIncrement } from "./number-field-increment.mjs";
2
+ import { NumberFieldDecrement } from "./number-field-decrement.mjs";
3
+ import { NumberFieldRoot } from "./number-field-root.mjs";
4
+ import { NumberFieldInput } from "./number-field-input.mjs";
5
+ import { NumberFieldLabel } from "./number-field-label.mjs";
6
+ //#region src/number-field/index.ts
7
+ /**
8
+ * NumberField: a text field that holds a number. `Root` (`div[role=group]`, owns the state),
9
+ * `Label`, `Input` (the visible `input[type=text]` plus a visually hidden native
10
+ * `input[type=number]` that carries `name`, the constraints and the posted value), and the
11
+ * `Increment` / `Decrement` buttons (press-and-hold). The user types in their locale's notation
12
+ * (committed on blur or Enter) or steps with the keys and buttons. Two actions:
13
+ * `valueChangeAction` on every step (a transition; keep it cheap) and `valueCommitAction` once
14
+ * per gesture (the save; uncontrolled state is committed when it resolves).
15
+ */
16
+ const NumberField = {
17
+ Root: NumberFieldRoot,
18
+ Label: NumberFieldLabel,
19
+ Input: NumberFieldInput,
20
+ Increment: NumberFieldIncrement,
21
+ Decrement: NumberFieldDecrement
22
+ };
23
+ //#endregion
24
+ export { NumberField };
25
+
26
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/number-field/index.ts"],"sourcesContent":["// Ships the platform attribute typings with this subpath (conventions 7.4). Type-only: the\n// built JS has no import of it.\nimport \"../internal/platform-attributes.js\";\nimport { NumberFieldDecrement } from \"./number-field-decrement.js\";\nimport { NumberFieldIncrement } from \"./number-field-increment.js\";\nimport { NumberFieldInput } from \"./number-field-input.js\";\nimport { NumberFieldLabel } from \"./number-field-label.js\";\nimport { NumberFieldRoot } from \"./number-field-root.js\";\n\n/**\n * NumberField: a text field that holds a number. `Root` (`div[role=group]`, owns the state),\n * `Label`, `Input` (the visible `input[type=text]` plus a visually hidden native\n * `input[type=number]` that carries `name`, the constraints and the posted value), and the\n * `Increment` / `Decrement` buttons (press-and-hold). The user types in their locale's notation\n * (committed on blur or Enter) or steps with the keys and buttons. Two actions:\n * `valueChangeAction` on every step (a transition; keep it cheap) and `valueCommitAction` once\n * per gesture (the save; uncontrolled state is committed when it resolves).\n */\nexport const NumberField = {\n Root: NumberFieldRoot,\n Label: NumberFieldLabel,\n Input: NumberFieldInput,\n Increment: NumberFieldIncrement,\n Decrement: NumberFieldDecrement,\n} as const;\n\nexport type {\n NumberFieldRootProps,\n NumberFieldState,\n NumberFieldValueChangeDetails,\n} from \"./number-field-root.js\";\nexport type { NumberFieldLabelProps } from \"./number-field-label.js\";\nexport type { NumberFieldInputProps } from \"./number-field-input.js\";\nexport type {\n NumberFieldButtonState,\n NumberFieldIncrementProps,\n NumberFieldDecrementProps,\n} from \"./number-field-increment.js\";\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,MAAa,cAAc;CACzB,MAAM;CACN,OAAO;CACP,OAAO;CACP,WAAW;CACX,WAAW;AACb"}
@@ -0,0 +1,78 @@
1
+ import { decimalsOf, roundTo } from "../internal/decimal.mjs";
2
+ //#region src/number-field/number-field-arithmetic.ts
3
+ /** Tolerance for grid computations on binary floating point. */
4
+ const EPSILON = 1e-9;
5
+ function decimalsFor(bounds) {
6
+ return Math.max(decimalsOf(bounds.step), decimalsOf(bounds.min ?? 0));
7
+ }
8
+ /** The largest grid point `≤ max` (an unreachable `max` stays unreachable: `0..5` by `2` is `4`). */
9
+ function gridMax(max, base, step) {
10
+ return base + Math.floor((max - base) / step + EPSILON) * step;
11
+ }
12
+ function clampAndGuard(result, current, direction, bounds) {
13
+ const { min, max, step } = bounds;
14
+ const base = min ?? 0;
15
+ let next = result;
16
+ if (max !== void 0 && next > max + EPSILON) next = gridMax(max, base, step);
17
+ if (min !== void 0 && next < min - EPSILON) next = min;
18
+ next = roundTo(next, decimalsFor(bounds));
19
+ if (current !== null) {
20
+ if (direction > 0 && next < current) return current;
21
+ if (direction < 0 && next > current) return current;
22
+ }
23
+ return next;
24
+ }
25
+ /**
26
+ * `current` stepped `n` times (`n > 0` up, `n < 0` down): empty counts as `0`; the step base is
27
+ * `min` (else `0`); an off-grid value snaps to the nearest grid point in the stepping direction,
28
+ * which counts as one step; the result is clamped to `[min, max]` on the grid and rounded to the
29
+ * decimals of `step` and `min`. When the clamp would move the value against the direction, the
30
+ * value is returned unchanged.
31
+ */
32
+ function stepValue(current, n, bounds) {
33
+ const { min, step } = bounds;
34
+ const value = current ?? 0;
35
+ const base = min ?? 0;
36
+ const index = (value - base) / step;
37
+ const nearest = Math.round(index);
38
+ let target;
39
+ if (Math.abs(index - nearest) <= EPSILON * Math.max(1, Math.abs(index))) target = nearest + n;
40
+ else if (n > 0) target = Math.ceil(index) + (n - 1);
41
+ else target = Math.floor(index) + (n + 1);
42
+ return clampAndGuard(base + target * step, current, n, bounds);
43
+ }
44
+ /**
45
+ * `current` moved by `delta` (PageUp / PageDown, Shift+Arrow: `± largeStep`). A whole number of
46
+ * steps is `stepValue(current, delta / step)`; otherwise the value moves by `delta` and snaps to
47
+ * the grid toward the start (never past `delta`), at least one step.
48
+ */
49
+ function stepBy(current, delta, bounds) {
50
+ const { min, step } = bounds;
51
+ const ratio = delta / step;
52
+ if (Math.abs(ratio - Math.round(ratio)) <= EPSILON * Math.max(1, Math.abs(ratio))) return stepValue(current, Math.round(ratio), bounds);
53
+ const value = current ?? 0;
54
+ const base = min ?? 0;
55
+ const index = (value + delta - base) / step;
56
+ let target = delta > 0 ? Math.floor(index + EPSILON) : Math.ceil(index - EPSILON);
57
+ const start = (value - base) / step;
58
+ if (delta > 0 && target <= start + EPSILON) target = Math.floor(start + EPSILON) + 1;
59
+ if (delta < 0 && target >= start - EPSILON) target = Math.ceil(start - EPSILON) - 1;
60
+ return clampAndGuard(base + target * step, current, delta, bounds);
61
+ }
62
+ /** The bound a Home / End key moves to: `min`, or the largest grid point `≤ max`. */
63
+ function boundValue(which, bounds) {
64
+ const { min, max, step } = bounds;
65
+ if (which === "min") return min;
66
+ if (max === void 0) return void 0;
67
+ if (min !== void 0 && max < min) return min;
68
+ return roundTo(gridMax(max, min ?? 0, step), decimalsFor(bounds));
69
+ }
70
+ /** The next step in `direction` would change nothing (a button at its bound). Empty never is. */
71
+ function isAtBound(value, direction, bounds) {
72
+ if (value === null) return false;
73
+ return stepValue(value, direction, bounds) === value;
74
+ }
75
+ //#endregion
76
+ export { boundValue, isAtBound, stepBy, stepValue };
77
+
78
+ //# sourceMappingURL=number-field-arithmetic.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-field-arithmetic.mjs","names":[],"sources":["../../src/number-field/number-field-arithmetic.ts"],"sourcesContent":["// Stepping arithmetic of NumberField (design/components/number-field.md 5.5). No directive: no\n// React, no client-only API. The spec's `stepUp(n)` / `stepDown(n)` (snap off-grid values in the\n// stepping direction, clamp into `[min, max]` on the grid), not the native UI stepping.\nimport { decimalsOf, roundTo } from \"../internal/decimal.js\";\n\nexport interface StepBounds {\n readonly min: number | undefined;\n readonly max: number | undefined;\n /** Positive. */\n readonly step: number;\n}\n\n/** Tolerance for grid computations on binary floating point. */\nconst EPSILON = 1e-9;\n\nfunction decimalsFor(bounds: StepBounds): number {\n return Math.max(decimalsOf(bounds.step), decimalsOf(bounds.min ?? 0));\n}\n\n/** The largest grid point `≤ max` (an unreachable `max` stays unreachable: `0..5` by `2` is `4`). */\nfunction gridMax(max: number, base: number, step: number): number {\n return base + Math.floor((max - base) / step + EPSILON) * step;\n}\n\nfunction clampAndGuard(\n result: number,\n current: number | null,\n direction: number,\n bounds: StepBounds,\n): number {\n const { min, max, step } = bounds;\n const base = min ?? 0;\n let next = result;\n if (max !== undefined && next > max + EPSILON) next = gridMax(max, base, step);\n if (min !== undefined && next < min - EPSILON) next = min;\n next = roundTo(next, decimalsFor(bounds));\n // 4. A step that would move against its direction changes nothing (an empty value has no\n // direction to keep: empty + ArrowDown with `min 3` is `3`, design 5.5).\n if (current !== null) {\n if (direction > 0 && next < current) return current;\n if (direction < 0 && next > current) return current;\n }\n return next;\n}\n\n/**\n * `current` stepped `n` times (`n > 0` up, `n < 0` down): empty counts as `0`; the step base is\n * `min` (else `0`); an off-grid value snaps to the nearest grid point in the stepping direction,\n * which counts as one step; the result is clamped to `[min, max]` on the grid and rounded to the\n * decimals of `step` and `min`. When the clamp would move the value against the direction, the\n * value is returned unchanged.\n */\nexport function stepValue(current: number | null, n: number, bounds: StepBounds): number {\n const { min, step } = bounds;\n const value = current ?? 0;\n const base = min ?? 0;\n const index = (value - base) / step;\n const nearest = Math.round(index);\n let target: number;\n if (Math.abs(index - nearest) <= EPSILON * Math.max(1, Math.abs(index))) {\n target = nearest + n;\n } else if (n > 0) {\n target = Math.ceil(index) + (n - 1);\n } else {\n target = Math.floor(index) + (n + 1);\n }\n return clampAndGuard(base + target * step, current, n, bounds);\n}\n\n/**\n * `current` moved by `delta` (PageUp / PageDown, Shift+Arrow: `± largeStep`). A whole number of\n * steps is `stepValue(current, delta / step)`; otherwise the value moves by `delta` and snaps to\n * the grid toward the start (never past `delta`), at least one step.\n */\nexport function stepBy(current: number | null, delta: number, bounds: StepBounds): number {\n const { min, step } = bounds;\n const ratio = delta / step;\n if (Math.abs(ratio - Math.round(ratio)) <= EPSILON * Math.max(1, Math.abs(ratio))) {\n return stepValue(current, Math.round(ratio), bounds);\n }\n const value = current ?? 0;\n const base = min ?? 0;\n const index = (value + delta - base) / step;\n let target = delta > 0 ? Math.floor(index + EPSILON) : Math.ceil(index - EPSILON);\n const start = (value - base) / step;\n if (delta > 0 && target <= start + EPSILON) target = Math.floor(start + EPSILON) + 1;\n if (delta < 0 && target >= start - EPSILON) target = Math.ceil(start - EPSILON) - 1;\n return clampAndGuard(base + target * step, current, delta, bounds);\n}\n\n/** The bound a Home / End key moves to: `min`, or the largest grid point `≤ max`. */\nexport function boundValue(which: \"min\" | \"max\", bounds: StepBounds): number | undefined {\n const { min, max, step } = bounds;\n if (which === \"min\") return min;\n if (max === undefined) return undefined;\n if (min !== undefined && max < min) return min;\n return roundTo(gridMax(max, min ?? 0, step), decimalsFor(bounds));\n}\n\n/** The next step in `direction` would change nothing (a button at its bound). Empty never is. */\nexport function isAtBound(value: number | null, direction: 1 | -1, bounds: StepBounds): boolean {\n if (value === null) return false;\n return stepValue(value, direction, bounds) === value;\n}\n"],"mappings":";;;AAaA,MAAM,UAAU;AAEhB,SAAS,YAAY,QAA4B;CAC/C,OAAO,KAAK,IAAI,WAAW,OAAO,IAAI,GAAG,WAAW,OAAO,OAAO,CAAC,CAAC;AACtE;;AAGA,SAAS,QAAQ,KAAa,MAAc,MAAsB;CAChE,OAAO,OAAO,KAAK,OAAO,MAAM,QAAQ,OAAO,OAAO,IAAI;AAC5D;AAEA,SAAS,cACP,QACA,SACA,WACA,QACQ;CACR,MAAM,EAAE,KAAK,KAAK,SAAS;CAC3B,MAAM,OAAO,OAAO;CACpB,IAAI,OAAO;CACX,IAAI,QAAQ,KAAA,KAAa,OAAO,MAAM,SAAS,OAAO,QAAQ,KAAK,MAAM,IAAI;CAC7E,IAAI,QAAQ,KAAA,KAAa,OAAO,MAAM,SAAS,OAAO;CACtD,OAAO,QAAQ,MAAM,YAAY,MAAM,CAAC;CAGxC,IAAI,YAAY,MAAM;EACpB,IAAI,YAAY,KAAK,OAAO,SAAS,OAAO;EAC5C,IAAI,YAAY,KAAK,OAAO,SAAS,OAAO;CAC9C;CACA,OAAO;AACT;;;;;;;;AASA,SAAgB,UAAU,SAAwB,GAAW,QAA4B;CACvF,MAAM,EAAE,KAAK,SAAS;CACtB,MAAM,QAAQ,WAAW;CACzB,MAAM,OAAO,OAAO;CACpB,MAAM,SAAS,QAAQ,QAAQ;CAC/B,MAAM,UAAU,KAAK,MAAM,KAAK;CAChC,IAAI;CACJ,IAAI,KAAK,IAAI,QAAQ,OAAO,KAAK,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,GACpE,SAAS,UAAU;MACd,IAAI,IAAI,GACb,SAAS,KAAK,KAAK,KAAK,KAAK,IAAI;MAEjC,SAAS,KAAK,MAAM,KAAK,KAAK,IAAI;CAEpC,OAAO,cAAc,OAAO,SAAS,MAAM,SAAS,GAAG,MAAM;AAC/D;;;;;;AAOA,SAAgB,OAAO,SAAwB,OAAe,QAA4B;CACxF,MAAM,EAAE,KAAK,SAAS;CACtB,MAAM,QAAQ,QAAQ;CACtB,IAAI,KAAK,IAAI,QAAQ,KAAK,MAAM,KAAK,CAAC,KAAK,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,GAC9E,OAAO,UAAU,SAAS,KAAK,MAAM,KAAK,GAAG,MAAM;CAErD,MAAM,QAAQ,WAAW;CACzB,MAAM,OAAO,OAAO;CACpB,MAAM,SAAS,QAAQ,QAAQ,QAAQ;CACvC,IAAI,SAAS,QAAQ,IAAI,KAAK,MAAM,QAAQ,OAAO,IAAI,KAAK,KAAK,QAAQ,OAAO;CAChF,MAAM,SAAS,QAAQ,QAAQ;CAC/B,IAAI,QAAQ,KAAK,UAAU,QAAQ,SAAS,SAAS,KAAK,MAAM,QAAQ,OAAO,IAAI;CACnF,IAAI,QAAQ,KAAK,UAAU,QAAQ,SAAS,SAAS,KAAK,KAAK,QAAQ,OAAO,IAAI;CAClF,OAAO,cAAc,OAAO,SAAS,MAAM,SAAS,OAAO,MAAM;AACnE;;AAGA,SAAgB,WAAW,OAAsB,QAAwC;CACvF,MAAM,EAAE,KAAK,KAAK,SAAS;CAC3B,IAAI,UAAU,OAAO,OAAO;CAC5B,IAAI,QAAQ,KAAA,GAAW,OAAO,KAAA;CAC9B,IAAI,QAAQ,KAAA,KAAa,MAAM,KAAK,OAAO;CAC3C,OAAO,QAAQ,QAAQ,KAAK,OAAO,GAAG,IAAI,GAAG,YAAY,MAAM,CAAC;AAClE;;AAGA,SAAgB,UAAU,OAAsB,WAAmB,QAA6B;CAC9F,IAAI,UAAU,MAAM,OAAO;CAC3B,OAAO,UAAU,OAAO,WAAW,MAAM,MAAM;AACjD"}
@@ -0,0 +1,2 @@
1
+ import "./number-field-root.mjs";
2
+ import { RefObject } from "react";
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { createContext, use } from "react";
3
+ //#region src/number-field/number-field-context.ts
4
+ const NumberFieldContext = createContext(null);
5
+ function useNumberFieldContext(part) {
6
+ const context = use(NumberFieldContext);
7
+ if (context === null) throw new Error(`${part} must be rendered inside a NumberField.Root.`);
8
+ return context;
9
+ }
10
+ //#endregion
11
+ export { NumberFieldContext, useNumberFieldContext };
12
+
13
+ //# sourceMappingURL=number-field-context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-field-context.mjs","names":[],"sources":["../../src/number-field/number-field-context.ts"],"sourcesContent":["\"use client\";\nimport { createContext, use } from \"react\";\nimport type { RefObject } from \"react\";\nimport type { StepBounds } from \"./number-field-arithmetic.js\";\nimport type { NumberFieldState } from \"./number-field-root.js\";\n\n/** A step button's direction. */\nexport type StepDirection = \"increment\" | \"decrement\";\n\n/** What produced a step or a commit (`details.source`). */\nexport type NumberFieldSource = \"input\" | \"increment\" | \"decrement\" | \"keyboard\" | \"wheel\" | null;\n\nexport interface NumberFieldContextValue {\n /** The state every part's function props receive. */\n readonly state: NumberFieldState;\n readonly bounds: StepBounds;\n /** What a button steps from: the parsed draft while one is open, else the shown value. */\n readonly stepBase: number | null;\n /** The Root is pending and the latest step or commit came from this source. */\n readonly pendingSource: NumberFieldSource;\n /** Ids: the visible input (the Root's, or a Field's control id) and the Label. */\n readonly inputId: string;\n readonly labelId: string;\n readonly name: string | undefined;\n readonly form: string | undefined;\n /** `inputmode=\"decimal\"` rather than `\"numeric\"` (8.5). */\n readonly allowsFractions: boolean;\n readonly stepOnWheel: boolean;\n /** The hidden input's `defaultValue`: the reset target as `String(number)` or `\"\"`. */\n readonly resetTargetText: string;\n /** Inside a `Field.Root`: `data-invalid` on the Root and the Input. */\n readonly fieldInvalid: boolean | undefined;\n readonly visibleRef: RefObject<HTMLInputElement | null>;\n readonly hiddenRef: RefObject<HTMLInputElement | null>;\n\n /** `input` on the visible input: the urgent draft. */\n readonly typed: (text: string) => void;\n /** `focusout` on the visible input: commit the draft (4.1). */\n readonly commitDraft: (event: Event) => void;\n /** `keydown` on the visible input (4.2). */\n readonly keyDown: (event: KeyboardEvent) => void;\n /** The native `wheel` listener on the visible input (4.4). */\n readonly wheel: (event: WheelEvent) => void;\n /** `pointerdown` on a button: the first step; `false` when no hold is open afterwards. */\n readonly beginHold: (direction: StepDirection, event: Event) => boolean;\n /** One tick of the hold; `false` when the hold ended (the bound was reached). */\n readonly tickHold: (direction: StepDirection, event: Event | undefined) => boolean;\n /** The hold's release (or cancel): one commit. */\n readonly endHold: (direction: StepDirection, event: Event) => void;\n /** A click with no pointer gesture (assistive technology): step + commit. */\n readonly activate: (direction: StepDirection, event: Event) => void;\n /** Mirrors the hidden input's `validationMessage` onto the visible input (6.2). */\n readonly mirror: () => void;\n /** Called by the Label from a layout effect; returns the unregistration. */\n readonly registerLabel: () => () => void;\n /** Called by the Input from its mount layout effect (late mount reconciliation). */\n readonly onInputMounted: () => void;\n}\n\nexport const NumberFieldContext = createContext<NumberFieldContextValue | null>(null);\n\nexport function useNumberFieldContext(part: string): NumberFieldContextValue {\n const context = use(NumberFieldContext);\n if (context === null) {\n throw new Error(`${part} must be rendered inside a NumberField.Root.`);\n }\n return context;\n}\n"],"mappings":";;;AA2DA,MAAa,qBAAqB,cAA8C,IAAI;AAEpF,SAAgB,sBAAsB,MAAuC;CAC3E,MAAM,UAAU,IAAI,kBAAkB;CACtC,IAAI,YAAY,MACd,MAAM,IAAI,MAAM,GAAG,KAAK,6CAA6C;CAEvE,OAAO;AACT"}
@@ -0,0 +1,16 @@
1
+ import { NumberFieldDecrementProps } from "./number-field-increment.mjs";
2
+ //#region src/number-field/number-field-decrement.d.ts
3
+ /**
4
+ * Steps the value down: `button[type=button][tabindex=-1]` with `aria-controls` → the input and
5
+ * the default `aria-label` `"Decrease"`; one step at the press, then repeated while held, one
6
+ * commit at the release. Natively `disabled` when the next step would change nothing.
7
+ *
8
+ * Owned keys: `type`, `tabIndex`, `aria-controls`, `disabled`, `onPointerDown`, `onClick`,
9
+ * `onContextMenu`, `data-pending`, `data-disabled`.
10
+ */
11
+ export declare function NumberFieldDecrement(props: NumberFieldDecrementProps): import("react").ReactNode;
12
+ export declare namespace NumberFieldDecrement {
13
+ var displayName: string;
14
+ }
15
+ //#endregion
16
+ //# sourceMappingURL=number-field-decrement.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-field-decrement.d.mts","names":[],"sources":["../../src/number-field/number-field-decrement.tsx"],"mappings":";;;;;;;;;;wBAcgB,qBAAqB,OAAO,4CAAyB;yBAArD"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { useStepButtonElement } from "./number-field-increment.mjs";
3
+ //#region src/number-field/number-field-decrement.tsx
4
+ /**
5
+ * Steps the value down: `button[type=button][tabindex=-1]` with `aria-controls` → the input and
6
+ * the default `aria-label` `"Decrease"`; one step at the press, then repeated while held, one
7
+ * commit at the release. Natively `disabled` when the next step would change nothing.
8
+ *
9
+ * Owned keys: `type`, `tabIndex`, `aria-controls`, `disabled`, `onPointerDown`, `onClick`,
10
+ * `onContextMenu`, `data-pending`, `data-disabled`.
11
+ */
12
+ function NumberFieldDecrement(props) {
13
+ return useStepButtonElement("decrement", "NumberField.Decrement", props);
14
+ }
15
+ NumberFieldDecrement.displayName = "NumberFieldDecrement";
16
+ //#endregion
17
+ export { NumberFieldDecrement };
18
+
19
+ //# sourceMappingURL=number-field-decrement.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-field-decrement.mjs","names":[],"sources":["../../src/number-field/number-field-decrement.tsx"],"sourcesContent":["\"use client\";\nimport { useStepButtonElement } from \"./number-field-increment.js\";\nimport type { NumberFieldDecrementProps } from \"./number-field-increment.js\";\n\nexport type { NumberFieldDecrementProps } from \"./number-field-increment.js\";\n\n/**\n * Steps the value down: `button[type=button][tabindex=-1]` with `aria-controls` → the input and\n * the default `aria-label` `\"Decrease\"`; one step at the press, then repeated while held, one\n * commit at the release. Natively `disabled` when the next step would change nothing.\n *\n * Owned keys: `type`, `tabIndex`, `aria-controls`, `disabled`, `onPointerDown`, `onClick`,\n * `onContextMenu`, `data-pending`, `data-disabled`.\n */\nexport function NumberFieldDecrement(props: NumberFieldDecrementProps) {\n return useStepButtonElement(\"decrement\", \"NumberField.Decrement\", props);\n}\n\nNumberFieldDecrement.displayName = \"NumberFieldDecrement\";\n"],"mappings":";;;;;;;;;;;AAcA,SAAgB,qBAAqB,OAAkC;CACrE,OAAO,qBAAqB,aAAa,yBAAyB,KAAK;AACzE;AAEA,qBAAqB,cAAc"}
@@ -0,0 +1,279 @@
1
+ import { roundTo } from "../internal/decimal.mjs";
2
+ //#region src/number-field/number-field-format.ts
3
+ const BIDI = /[؜‎‏‪-‮⁦-⁩]/g;
4
+ function normalize(text) {
5
+ return text.normalize("NFKC").replace(BIDI, "").replace(/\s/g, " ").toLowerCase();
6
+ }
7
+ /** Every string `format` may emit, with the plural samples that change a unit or currency name. */
8
+ const SAMPLES = [
9
+ -1234567.891,
10
+ 0,
11
+ 1,
12
+ 2,
13
+ 3,
14
+ 5,
15
+ 11,
16
+ 21,
17
+ .5,
18
+ 1.5,
19
+ 100
20
+ ];
21
+ function collect(locale, options, type, into) {
22
+ let formatter;
23
+ try {
24
+ formatter = new Intl.NumberFormat(locale, options);
25
+ } catch {
26
+ return;
27
+ }
28
+ for (const sample of SAMPLES) for (const part of formatter.formatToParts(sample)) {
29
+ if (part.type !== type) continue;
30
+ const value = normalize(part.value).trim();
31
+ if (value !== "") into.add(value);
32
+ }
33
+ }
34
+ function deriveSymbols(locale, options, numberingSystem) {
35
+ const loc = locale;
36
+ const probeOptions = {
37
+ ...options,
38
+ notation: "standard",
39
+ useGrouping: true,
40
+ minimumFractionDigits: 1,
41
+ maximumFractionDigits: 3,
42
+ minimumSignificantDigits: void 0,
43
+ maximumSignificantDigits: void 0,
44
+ signDisplay: "auto",
45
+ numberingSystem
46
+ };
47
+ let probe;
48
+ try {
49
+ probe = new Intl.NumberFormat(loc, probeOptions);
50
+ } catch {
51
+ probe = new Intl.NumberFormat(loc, {
52
+ useGrouping: true,
53
+ minimumFractionDigits: 1,
54
+ numberingSystem
55
+ });
56
+ }
57
+ const parts = probe.formatToParts(-1234567890.5);
58
+ let decimal = ".";
59
+ let group = ",";
60
+ const minus = /* @__PURE__ */ new Set(["-", "−"]);
61
+ const plus = /* @__PURE__ */ new Set(["+"]);
62
+ const integers = [];
63
+ for (const part of parts) {
64
+ const value = normalize(part.value);
65
+ if (part.type === "decimal") decimal = value;
66
+ else if (part.type === "group") group = value;
67
+ else if (part.type === "minusSign" && value.trim() !== "") minus.add(value.trim());
68
+ else if (part.type === "integer") integers.push(part.value);
69
+ }
70
+ try {
71
+ for (const part of new Intl.NumberFormat(loc, {
72
+ ...probeOptions,
73
+ signDisplay: "always"
74
+ }).formatToParts(1)) if (part.type === "plusSign") plus.add(normalize(part.value).trim());
75
+ } catch {}
76
+ const primaryGroup = integers.at(-1)?.length ?? 3;
77
+ const secondaryGroup = integers.length > 2 ? integers.at(-2)?.length ?? 3 : primaryGroup;
78
+ const groups = [group.trim() === "" ? " " : group];
79
+ if ([
80
+ "'",
81
+ "’",
82
+ "ʼ"
83
+ ].includes(group)) groups.push("'", "’", "ʼ");
84
+ const affixes = /* @__PURE__ */ new Set();
85
+ const style = options.style ?? "decimal";
86
+ if (style === "percent") {
87
+ collect(loc, options, "percentSign", affixes);
88
+ affixes.add("%");
89
+ } else if (style === "currency") {
90
+ for (const currencyDisplay of [
91
+ "symbol",
92
+ "narrowSymbol",
93
+ "code",
94
+ "name"
95
+ ]) collect(loc, {
96
+ ...options,
97
+ currencyDisplay
98
+ }, "currency", affixes);
99
+ if (options.currency !== void 0) affixes.add(options.currency.toLowerCase());
100
+ } else if (style === "unit") for (const unitDisplay of [
101
+ "short",
102
+ "long",
103
+ "narrow"
104
+ ]) collect(loc, {
105
+ ...options,
106
+ unitDisplay
107
+ }, "unit", affixes);
108
+ const literals = /* @__PURE__ */ new Set();
109
+ collect(loc, options, "literal", literals);
110
+ for (const ch of ["(", ")"]) literals.delete(ch);
111
+ const literalList = [...literals].filter((l) => l !== "").sort((a, b) => b.length - a.length);
112
+ const digitFormat = new Intl.NumberFormat(loc, {
113
+ useGrouping: false,
114
+ numberingSystem
115
+ });
116
+ const digits = Array.from({ length: 10 }, (_, d) => normalize(digitFormat.format(d)));
117
+ return {
118
+ decimal,
119
+ groups,
120
+ minus: [...minus],
121
+ plus: [...plus],
122
+ affixes: [...affixes].sort((a, b) => b.length - a.length),
123
+ literals: literalList,
124
+ edges: [...affixes, ...literalList].sort((a, b) => b.length - a.length),
125
+ digits,
126
+ primaryGroup,
127
+ secondaryGroup
128
+ };
129
+ }
130
+ function stripEdges(text, tokens) {
131
+ let s = text.trim();
132
+ let changed = true;
133
+ while (changed && s !== "") {
134
+ changed = false;
135
+ for (const token of tokens) {
136
+ if (s.startsWith(token)) {
137
+ s = s.slice(token.length).trim();
138
+ changed = true;
139
+ }
140
+ if (s.endsWith(token)) {
141
+ s = s.slice(0, s.length - token.length).trim();
142
+ changed = true;
143
+ }
144
+ }
145
+ }
146
+ return s;
147
+ }
148
+ function startsWithAny(s, tokens) {
149
+ for (const token of tokens) if (s.startsWith(token)) return token;
150
+ return null;
151
+ }
152
+ function endsWithAny(s, tokens) {
153
+ for (const token of tokens) if (s.endsWith(token)) return token;
154
+ return null;
155
+ }
156
+ /** Strict grouping (5.3 step 5): the integer part, with group separators replaced by nothing. */
157
+ function ungroup(integer, symbols) {
158
+ const separators = symbols.groups;
159
+ const chunks = [];
160
+ let current = "";
161
+ for (const ch of integer) if (separators.includes(ch)) {
162
+ chunks.push(current);
163
+ current = "";
164
+ } else current += ch;
165
+ chunks.push(current);
166
+ if (chunks.length === 1) return integer;
167
+ const { primaryGroup, secondaryGroup } = symbols;
168
+ const last = chunks.length - 1;
169
+ for (let i = 0; i <= last; i += 1) {
170
+ const length = chunks[i].length;
171
+ if (i === last) {
172
+ if (length !== primaryGroup) return void 0;
173
+ } else if (i === 0) {
174
+ if (length < 1 || length > secondaryGroup) return void 0;
175
+ } else if (length !== secondaryGroup) return;
176
+ }
177
+ return chunks.join("");
178
+ }
179
+ function parseWith(text, symbols, percent, round) {
180
+ let s = normalize(text).trim();
181
+ if (s === "") return null;
182
+ const edges = symbols.edges;
183
+ s = stripEdges(s, edges);
184
+ if (s === "") return void 0;
185
+ let negative = false;
186
+ if (s.startsWith("(") && s.endsWith(")")) {
187
+ negative = true;
188
+ s = stripEdges(s.slice(1, -1), edges);
189
+ } else {
190
+ const leadMinus = startsWithAny(s, symbols.minus);
191
+ const leadPlus = leadMinus === null ? startsWithAny(s, symbols.plus) : null;
192
+ if (leadMinus !== null || leadPlus !== null) {
193
+ negative = leadMinus !== null;
194
+ s = s.slice((leadMinus ?? leadPlus).length);
195
+ } else {
196
+ const trailMinus = endsWithAny(s, symbols.minus);
197
+ const trailPlus = trailMinus === null ? endsWithAny(s, symbols.plus) : null;
198
+ if (trailMinus !== null || trailPlus !== null) {
199
+ negative = trailMinus !== null;
200
+ s = s.slice(0, s.length - (trailMinus ?? trailPlus).length);
201
+ }
202
+ }
203
+ s = stripEdges(s, edges);
204
+ }
205
+ if (s === "") return void 0;
206
+ const decimalAliases = [symbols.decimal];
207
+ if (symbols.decimal === "٫" && !symbols.groups.includes(".")) decimalAliases.push(".");
208
+ let integer = "";
209
+ let fraction = null;
210
+ for (const ch of s) {
211
+ const localDigit = symbols.digits.indexOf(ch);
212
+ const digit = localDigit !== -1 ? String(localDigit) : /[0-9]/.test(ch) ? ch : null;
213
+ if (digit !== null) {
214
+ if (fraction === null) integer += digit;
215
+ else fraction += digit;
216
+ } else if (decimalAliases.includes(ch)) {
217
+ if (fraction !== null) return void 0;
218
+ fraction = "";
219
+ } else if (symbols.groups.includes(ch)) {
220
+ if (fraction !== null) return void 0;
221
+ integer += ch;
222
+ } else return;
223
+ }
224
+ const digitsOnly = ungroup(integer, symbols);
225
+ if (digitsOnly === void 0) return void 0;
226
+ if (digitsOnly === "" && (fraction === null || fraction === "")) return void 0;
227
+ let value = Number(`${digitsOnly === "" ? "0" : digitsOnly}.${fraction ?? ""}`.replace(/\.$/, ""));
228
+ if (!Number.isFinite(value)) return void 0;
229
+ if (negative) value = -value;
230
+ const result = round(percent ? value / 100 : value);
231
+ return result === 0 ? 0 : result;
232
+ }
233
+ const cache = /* @__PURE__ */ new Map();
234
+ function cacheKey(locale, format) {
235
+ const entries = Object.entries(format).filter(([, v]) => v !== void 0).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
236
+ return JSON.stringify([locale ?? null, entries]);
237
+ }
238
+ /** A stable serialisation of `format`, for memoising on its content rather than its identity. */
239
+ function formatKey(format) {
240
+ return cacheKey(void 0, format ?? {});
241
+ }
242
+ /**
243
+ * The formatter and parser for `(locale, format)`, cached per pair at module level (construction
244
+ * is expensive). `locale` `undefined` is the runtime's locale.
245
+ */
246
+ function createNumberFormatter(locale, format = {}) {
247
+ const key = cacheKey(locale, format);
248
+ const cached = cache.get(key);
249
+ if (cached !== void 0) return cached;
250
+ const intl = new Intl.NumberFormat(locale, format);
251
+ const resolved = intl.resolvedOptions();
252
+ const percent = resolved.style === "percent";
253
+ const significant = format.maximumSignificantDigits !== void 0 || format.minimumSignificantDigits !== void 0;
254
+ const fractionDigits = significant ? void 0 : resolved.maximumFractionDigits;
255
+ const notation = format.notation ?? "standard";
256
+ const warning = notation !== "standard" ? `\`notation: "${notation}"\` cannot be parsed back; typed text in this format reverts.` : significant ? "`maximumSignificantDigits` makes the value's rounding impossible to state; the value may differ from the text." : null;
257
+ const round = (value) => {
258
+ if (fractionDigits === void 0) return value;
259
+ if (percent) return roundTo(roundTo(value * 100, fractionDigits) / 100, fractionDigits + 2);
260
+ return roundTo(value, fractionDigits);
261
+ };
262
+ const symbols = deriveSymbols(locale, format, resolved.numberingSystem);
263
+ const formatter = {
264
+ locale: resolved.locale,
265
+ format: (value) => value === null ? "" : intl.format(value),
266
+ parse: (text) => parseWith(text, symbols, percent, round),
267
+ round,
268
+ fractionDigits,
269
+ allowsFractions: percent || fractionDigits === void 0 || fractionDigits > 0,
270
+ percent,
271
+ warning
272
+ };
273
+ cache.set(key, formatter);
274
+ return formatter;
275
+ }
276
+ //#endregion
277
+ export { createNumberFormatter, formatKey };
278
+
279
+ //# sourceMappingURL=number-field-format.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-field-format.mjs","names":[],"sources":["../../src/number-field/number-field-format.ts"],"sourcesContent":["// Locale-aware formatting and parsing of NumberField (design/components/number-field.md 5). No\n// directive: no React, no client-only API; usable on the server.\n//\n// ECMA-402 has no parser, so the locale's symbols are derived from `formatToParts` once per\n// `(locale, format)` and the parser accepts exactly the shapes the formatter produces (plus\n// full-width digits, ASCII signs and the other spellings of the currency or unit), with **strict\n// grouping**: `1,5` under `en` is unparsable, never `15`.\nimport { roundTo } from \"../internal/decimal.js\";\n\nexport interface NumberFormatter {\n /** The resolved locale (`resolvedOptions().locale`). */\n readonly locale: string;\n /** The text for `value`; `\"\"` for `null`. */\n readonly format: (value: number | null) => string;\n /**\n * The value `text` stands for, rounded (5.4): `null` for an empty text, `undefined` for an\n * unparsable one.\n */\n readonly parse: (text: string) => number | null | undefined;\n /** `value` rounded to what the text can show (5.4); unchanged with significant digits. */\n readonly round: (value: number) => number;\n /** The resolved `maximumFractionDigits`, or `undefined` when significant digits rule. */\n readonly fractionDigits: number | undefined;\n /** The format can show a fraction (`inputmode=\"decimal\"`, 8.5). */\n readonly allowsFractions: boolean;\n /** `style: \"percent\"`: the text shows the value × 100. */\n readonly percent: boolean;\n /** Development: why this format cannot round-trip (`compact` notation, significant digits). */\n readonly warning: string | null;\n}\n\n// Bidirectional controls that some locales put around numbers and signs (`ar`: U+061C).\nconst BIDI = /[؜‎‏‪-‮⁦-⁩]/g;\n\nfunction normalize(text: string): string {\n return text.normalize(\"NFKC\").replace(BIDI, \"\").replace(/\\s/g, \" \").toLowerCase();\n}\n\n/** Every string `format` may emit, with the plural samples that change a unit or currency name. */\nconst SAMPLES = [-1234567.891, 0, 1, 2, 3, 5, 11, 21, 0.5, 1.5, 100];\n\nfunction collect(\n locale: string | readonly string[] | undefined,\n options: Intl.NumberFormatOptions,\n type: Intl.NumberFormatPartTypes,\n into: Set<string>,\n): void {\n let formatter: Intl.NumberFormat;\n try {\n formatter = new Intl.NumberFormat(locale as string | string[] | undefined, options);\n } catch {\n return;\n }\n for (const sample of SAMPLES) {\n for (const part of formatter.formatToParts(sample)) {\n if (part.type !== type) continue;\n const value = normalize(part.value).trim();\n if (value !== \"\") into.add(value);\n }\n }\n}\n\ninterface Symbols {\n readonly decimal: string;\n /** Group separators accepted (normalised). `\" \"` stands for any whitespace. */\n readonly groups: readonly string[];\n readonly minus: readonly string[];\n readonly plus: readonly string[];\n /** Currency, unit and percent strings, longest first. */\n readonly affixes: readonly string[];\n /** Literal strings the formatter puts around the number (never parentheses). */\n readonly literals: readonly string[];\n /** Affixes and literals, longest first: what may be stripped from the edges. */\n readonly edges: readonly string[];\n /** The numbering system's ten digits, normalised. */\n readonly digits: readonly string[];\n readonly primaryGroup: number;\n readonly secondaryGroup: number;\n}\n\nfunction deriveSymbols(\n locale: string | readonly string[] | undefined,\n options: Intl.NumberFormatOptions,\n numberingSystem: string,\n): Symbols {\n const loc = locale as string | string[] | undefined;\n // A probe that always shows a fraction and groups, without rounding by significant digits.\n const probeOptions: Intl.NumberFormatOptions = {\n ...options,\n notation: \"standard\",\n useGrouping: true,\n minimumFractionDigits: 1,\n maximumFractionDigits: 3,\n minimumSignificantDigits: undefined,\n maximumSignificantDigits: undefined,\n signDisplay: \"auto\",\n numberingSystem,\n };\n let probe: Intl.NumberFormat;\n try {\n probe = new Intl.NumberFormat(loc, probeOptions);\n } catch {\n probe = new Intl.NumberFormat(loc, {\n useGrouping: true,\n minimumFractionDigits: 1,\n numberingSystem,\n });\n }\n const parts = probe.formatToParts(-1234567890.5);\n let decimal = \".\";\n let group = \",\";\n const minus = new Set([\"-\", \"−\"]);\n const plus = new Set([\"+\"]);\n const integers: string[] = [];\n for (const part of parts) {\n const value = normalize(part.value);\n if (part.type === \"decimal\") decimal = value;\n else if (part.type === \"group\") group = value;\n else if (part.type === \"minusSign\" && value.trim() !== \"\") minus.add(value.trim());\n else if (part.type === \"integer\") integers.push(part.value);\n }\n try {\n for (const part of new Intl.NumberFormat(loc, {\n ...probeOptions,\n signDisplay: \"always\",\n }).formatToParts(1)) {\n if (part.type === \"plusSign\") plus.add(normalize(part.value).trim());\n }\n } catch {\n // The plus sign stays ASCII.\n }\n const primaryGroup = integers.at(-1)?.length ?? 3;\n const secondaryGroup = integers.length > 2 ? (integers.at(-2)?.length ?? 3) : primaryGroup;\n\n const groups = [group.trim() === \"\" ? \" \" : group];\n // An apostrophe group (`de-CH`) is typed with whichever apostrophe the keyboard has.\n if ([\"'\", \"’\", \"ʼ\"].includes(group)) groups.push(\"'\", \"’\", \"ʼ\");\n\n const affixes = new Set<string>();\n const style = options.style ?? \"decimal\";\n if (style === \"percent\") {\n collect(loc, options, \"percentSign\", affixes);\n affixes.add(\"%\");\n } else if (style === \"currency\") {\n for (const currencyDisplay of [\"symbol\", \"narrowSymbol\", \"code\", \"name\"] as const) {\n collect(loc, { ...options, currencyDisplay }, \"currency\", affixes);\n }\n if (options.currency !== undefined) affixes.add(options.currency.toLowerCase());\n } else if (style === \"unit\") {\n for (const unitDisplay of [\"short\", \"long\", \"narrow\"] as const) {\n collect(loc, { ...options, unitDisplay }, \"unit\", affixes);\n }\n }\n const literals = new Set<string>();\n collect(loc, options, \"literal\", literals);\n for (const ch of [\"(\", \")\"]) literals.delete(ch);\n\n const literalList = [...literals].filter((l) => l !== \"\").sort((a, b) => b.length - a.length);\n\n const digitFormat = new Intl.NumberFormat(loc, { useGrouping: false, numberingSystem });\n const digits = Array.from({ length: 10 }, (_, d) => normalize(digitFormat.format(d)));\n\n return {\n decimal,\n groups,\n minus: [...minus],\n plus: [...plus],\n affixes: [...affixes].sort((a, b) => b.length - a.length),\n literals: literalList,\n edges: [...affixes, ...literalList].sort((a, b) => b.length - a.length),\n digits,\n primaryGroup,\n secondaryGroup,\n };\n}\n\nfunction stripEdges(text: string, tokens: readonly string[]): string {\n let s = text.trim();\n let changed = true;\n while (changed && s !== \"\") {\n changed = false;\n for (const token of tokens) {\n if (s.startsWith(token)) {\n s = s.slice(token.length).trim();\n changed = true;\n }\n if (s.endsWith(token)) {\n s = s.slice(0, s.length - token.length).trim();\n changed = true;\n }\n }\n }\n return s;\n}\n\nfunction startsWithAny(s: string, tokens: readonly string[]): string | null {\n for (const token of tokens) if (s.startsWith(token)) return token;\n return null;\n}\n\nfunction endsWithAny(s: string, tokens: readonly string[]): string | null {\n for (const token of tokens) if (s.endsWith(token)) return token;\n return null;\n}\n\n/** Strict grouping (5.3 step 5): the integer part, with group separators replaced by nothing. */\nfunction ungroup(integer: string, symbols: Symbols): string | undefined {\n const separators = symbols.groups;\n const chunks: string[] = [];\n let current = \"\";\n for (const ch of integer) {\n if (separators.includes(ch)) {\n chunks.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n chunks.push(current);\n if (chunks.length === 1) return integer;\n const { primaryGroup, secondaryGroup } = symbols;\n const last = chunks.length - 1;\n for (let i = 0; i <= last; i += 1) {\n const length = chunks[i]!.length;\n if (i === last) {\n if (length !== primaryGroup) return undefined;\n } else if (i === 0) {\n if (length < 1 || length > secondaryGroup) return undefined;\n } else if (length !== secondaryGroup) {\n return undefined;\n }\n }\n return chunks.join(\"\");\n}\n\nfunction parseWith(\n text: string,\n symbols: Symbols,\n percent: boolean,\n round: (value: number) => number,\n): number | null | undefined {\n let s = normalize(text).trim();\n if (s === \"\") return null;\n\n // 2. Currency, unit and percent strings and literals, at the edges only (and again inside the\n // sign below): in the middle of the number they are garbage, never a group separator.\n const edges = symbols.edges;\n s = stripEdges(s, edges);\n if (s === \"\") return undefined;\n\n // 3. One sign: parentheses (accounting), a leading or trailing minus or plus.\n let negative = false;\n if (s.startsWith(\"(\") && s.endsWith(\")\")) {\n negative = true;\n s = stripEdges(s.slice(1, -1), edges);\n } else {\n const leadMinus = startsWithAny(s, symbols.minus);\n const leadPlus = leadMinus === null ? startsWithAny(s, symbols.plus) : null;\n if (leadMinus !== null || leadPlus !== null) {\n negative = leadMinus !== null;\n s = s.slice((leadMinus ?? leadPlus)!.length);\n } else {\n const trailMinus = endsWithAny(s, symbols.minus);\n const trailPlus = trailMinus === null ? endsWithAny(s, symbols.plus) : null;\n if (trailMinus !== null || trailPlus !== null) {\n negative = trailMinus !== null;\n s = s.slice(0, s.length - (trailMinus ?? trailPlus)!.length);\n }\n }\n s = stripEdges(s, edges);\n }\n if (s === \"\") return undefined;\n\n // 4. Digits to ASCII; anything but a digit, the decimal or a group separator is garbage.\n const decimalAliases = [symbols.decimal];\n // An Arabic decimal separator is often typed as the ASCII period.\n if (symbols.decimal === \"٫\" && !symbols.groups.includes(\".\")) decimalAliases.push(\".\");\n let integer = \"\";\n let fraction: string | null = null;\n for (const ch of s) {\n const localDigit = symbols.digits.indexOf(ch);\n const digit = localDigit !== -1 ? String(localDigit) : /[0-9]/.test(ch) ? ch : null;\n if (digit !== null) {\n if (fraction === null) integer += digit;\n else fraction += digit;\n } else if (decimalAliases.includes(ch)) {\n if (fraction !== null) return undefined;\n fraction = \"\";\n } else if (symbols.groups.includes(ch)) {\n // 5. Group separators only before the decimal separator.\n if (fraction !== null) return undefined;\n integer += ch;\n } else {\n return undefined;\n }\n }\n const digitsOnly = ungroup(integer, symbols);\n if (digitsOnly === undefined) return undefined;\n if (digitsOnly === \"\" && (fraction === null || fraction === \"\")) return undefined;\n\n // 6. The number; percent divides by 100.\n let value = Number(\n `${digitsOnly === \"\" ? \"0\" : digitsOnly}.${fraction ?? \"\"}`.replace(/\\.$/, \"\"),\n );\n if (!Number.isFinite(value)) return undefined;\n if (negative) value = -value;\n // 7. Rounded to what the text shows.\n const result = round(percent ? value / 100 : value);\n return result === 0 ? 0 : result;\n}\n\nconst cache = new Map<string, NumberFormatter>();\n\nfunction cacheKey(locale: string | readonly string[] | undefined, format: object): string {\n const entries = Object.entries(format)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return JSON.stringify([locale ?? null, entries]);\n}\n\n/** A stable serialisation of `format`, for memoising on its content rather than its identity. */\nexport function formatKey(format: Intl.NumberFormatOptions | undefined): string {\n return cacheKey(undefined, format ?? {});\n}\n\n/**\n * The formatter and parser for `(locale, format)`, cached per pair at module level (construction\n * is expensive). `locale` `undefined` is the runtime's locale.\n */\nexport function createNumberFormatter(\n locale: string | readonly string[] | undefined,\n format: Intl.NumberFormatOptions = {},\n): NumberFormatter {\n const key = cacheKey(locale, format);\n const cached = cache.get(key);\n if (cached !== undefined) return cached;\n\n const intl = new Intl.NumberFormat(locale as string | string[] | undefined, format);\n const resolved = intl.resolvedOptions() as Intl.ResolvedNumberFormatOptions & {\n roundingPriority?: string;\n };\n const percent = resolved.style === \"percent\";\n const significant =\n format.maximumSignificantDigits !== undefined || format.minimumSignificantDigits !== undefined;\n const fractionDigits = significant ? undefined : resolved.maximumFractionDigits;\n const notation = format.notation ?? \"standard\";\n const warning =\n notation !== \"standard\"\n ? `\\`notation: \"${notation}\"\\` cannot be parsed back; typed text in this format reverts.`\n : significant\n ? \"`maximumSignificantDigits` makes the value's rounding impossible to state; the value \" +\n \"may differ from the text.\"\n : null;\n\n const round = (value: number): number => {\n if (fractionDigits === undefined) return value;\n if (percent) return roundTo(roundTo(value * 100, fractionDigits) / 100, fractionDigits + 2);\n return roundTo(value, fractionDigits);\n };\n\n const symbols = deriveSymbols(locale, format, resolved.numberingSystem);\n const formatter: NumberFormatter = {\n locale: resolved.locale,\n format: (value) => (value === null ? \"\" : intl.format(value)),\n parse: (text) => parseWith(text, symbols, percent, round),\n round,\n fractionDigits,\n allowsFractions: percent || fractionDigits === undefined || fractionDigits > 0,\n percent,\n warning,\n };\n cache.set(key, formatter);\n return formatter;\n}\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { RenderProp, StateValue } from "../internal/types.mjs";
2
+ import "./number-field-context.mjs";
3
+ import { CSSProperties, ComponentPropsWithRef, ReactNode } from "react";
4
+ //#region src/number-field/number-field-increment.d.ts
5
+ export interface NumberFieldButtonState {
6
+ /** The Root is pending and the latest step or commit came from this button. */
7
+ readonly pending: boolean;
8
+ /** The prop, the Root's `disabled` or `readOnly`, or the next step would change nothing. */
9
+ readonly disabled: boolean;
10
+ }
11
+ export interface NumberFieldIncrementProps extends Omit<ComponentPropsWithRef<"button">, "type" | "tabIndex" | "disabled" | "onPointerDown" | "onClick" | "onContextMenu" | "aria-controls" | "className" | "style" | "children"> {
12
+ disabled?: boolean;
13
+ className?: StateValue<string | undefined, NumberFieldButtonState>;
14
+ style?: StateValue<CSSProperties | undefined, NumberFieldButtonState>;
15
+ children?: StateValue<ReactNode, NumberFieldButtonState>;
16
+ render?: RenderProp<ComponentPropsWithRef<"button">, NumberFieldButtonState>;
17
+ }
18
+ export type NumberFieldDecrementProps = NumberFieldIncrementProps;
19
+ /**
20
+ * Steps the value up: `button[type=button][tabindex=-1]` with `aria-controls` → the input and the
21
+ * default `aria-label` `"Increase"`; one step at the press, then repeated while held, one commit
22
+ * at the release. Natively `disabled` when the next step would change nothing.
23
+ *
24
+ * Owned keys: `type`, `tabIndex`, `aria-controls`, `disabled`, `onPointerDown`, `onClick`,
25
+ * `onContextMenu`, `data-pending`, `data-disabled`.
26
+ */
27
+ export declare function NumberFieldIncrement(props: NumberFieldIncrementProps): ReactNode;
28
+ export declare namespace NumberFieldIncrement {
29
+ var displayName: string;
30
+ }
31
+ //#endregion
32
+ //# sourceMappingURL=number-field-increment.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number-field-increment.d.mts","names":[],"sources":["../../src/number-field/number-field-increment.tsx"],"mappings":";;;;iBAYiB;;WAEN;;WAEA;;iBAGM,kCAAkC,KACjD;EAYA;EACA,YAAY,+BAA+B;EAC3C,QAAQ,WAAW,2BAA2B;EAC9C,WAAW,WAAW,WAAW;EACjC,SAAS,WAAW,iCAAiC;;YAG3C,4BAA4B;;;;;;;;;wBA6DxB,qBAAqB,OAAO,4BAAyB;yBAArD"}