@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
@@ -1,9 +1,10 @@
1
1
  "use client";
2
2
  import { useRender } from "../internal/use-render.mjs";
3
+ import { useToolbarContext } from "../internal/toolbar-context.mjs";
3
4
  import { useDevWarning } from "../internal/use-dev-warning.mjs";
4
5
  import { usePopoverTrigger } from "../internal/use-popover-trigger.mjs";
5
6
  import { useMenuContext } from "./menu-context.mjs";
6
- import { edgeItem, focusItem, hasModifier } from "./menu-dom.mjs";
7
+ import { edgeItem, focusItem, hasModifier, isRtl } from "./menu-dom.mjs";
7
8
  //#region src/menu/menu-trigger.tsx
8
9
  /**
9
10
  * Opens with the first (`"first"`) or last (`"last"`) item focused, or focuses that item when the
@@ -29,7 +30,8 @@ function isPointerClick(event) {
29
30
  /**
30
31
  * The menu button: `<button type="button" commandfor command="toggle-popover"
31
32
  * aria-haspopup="menu" aria-expanded>`. A click (Enter, Space) toggles the menu through the
32
- * Root's transition; ArrowDown / ArrowUp open it with the first / last item focused.
33
+ * Root's transition; ArrowDown / ArrowUp open it with the first / last item focused (inside a
34
+ * vertical `Toolbar.Root`: the inline-end arrow, with the first item focused).
33
35
  *
34
36
  * Owned keys (conventions 1.2): `type` (on a `<button>` only), `id`, `disabled`, `commandfor`,
35
37
  * `command`, `aria-haspopup`, `aria-expanded`, `onClick`, `onKeyDown`, `data-open`,
@@ -38,11 +40,20 @@ function isPointerClick(event) {
38
40
  function MenuTrigger({ disabled = false, className, style, children, render, ...rest }) {
39
41
  const menu = useMenuContext("Menu.Trigger");
40
42
  useDevWarning(menu.submenu, "Menu.Trigger: rendered in a submenu. Use Menu.SubmenuTrigger, which is also an item of the parent menu.");
43
+ const toolbar = useToolbarContext();
41
44
  const onKeyDown = (event) => {
42
45
  if (disabled || hasModifier(event)) return;
43
- if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return;
46
+ let which;
47
+ if (toolbar?.orientation === "vertical") {
48
+ const openKey = isRtl(event.currentTarget) ? "ArrowLeft" : "ArrowRight";
49
+ if (event.key !== openKey) return;
50
+ which = "first";
51
+ } else {
52
+ if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return;
53
+ which = event.key === "ArrowDown" ? "first" : "last";
54
+ }
44
55
  event.preventDefault();
45
- openMenuWithFocus(menu, event.nativeEvent, event.key === "ArrowDown" ? "first" : "last");
56
+ openMenuWithFocus(menu, event.nativeEvent, which);
46
57
  };
47
58
  const { state, libraryProps, ref } = usePopoverTrigger(menu.popover, {
48
59
  part: "Menu.Trigger",
@@ -1 +1 @@
1
- {"version":3,"file":"menu-trigger.mjs","names":[],"sources":["../../src/menu/menu-trigger.tsx"],"sourcesContent":["\"use client\";\nimport type { ComponentPropsWithRef, CSSProperties, KeyboardEvent, ReactNode } from \"react\";\nimport type { RenderProp, StateValue } from \"../internal/types.js\";\nimport { useDevWarning } from \"../internal/use-dev-warning.js\";\nimport { usePopoverTrigger } from \"../internal/use-popover-trigger.js\";\nimport { useRender } from \"../internal/use-render.js\";\nimport { useMenuContext } from \"./menu-context.js\";\nimport type { MenuContextValue } from \"./menu-context.js\";\nimport { edgeItem, focusItem, hasModifier } from \"./menu-dom.js\";\n\nexport interface MenuTriggerState {\n /** Optimistic open state. */\n readonly open: boolean;\n /** The Root's transition is pending (an open, a part-initiated close or a dismissal notification). */\n readonly pending: boolean;\n readonly disabled: boolean;\n}\n\nexport interface MenuTriggerProps extends Omit<\n ComponentPropsWithRef<\"button\">,\n \"onClick\" | \"onKeyDown\" | \"aria-expanded\" | \"aria-haspopup\" | \"className\" | \"style\" | \"children\"\n> {\n /** Native `disabled`: the menu cannot be opened from this button. */\n disabled?: boolean;\n className?: StateValue<string | undefined, MenuTriggerState>;\n style?: StateValue<CSSProperties | undefined, MenuTriggerState>;\n /** Rendered from optimistic state; must not suspend. */\n children?: StateValue<ReactNode, MenuTriggerState>;\n /** Should render a `<button>` (the command path before hydration). */\n render?: RenderProp<ComponentPropsWithRef<\"button\">, MenuTriggerState>;\n}\n\n/**\n * Opens with the first (`\"first\"`) or last (`\"last\"`) item focused, or focuses that item when the\n * menu is already open (a pre-hydration open, walkthrough 10). Shared with SubmenuTrigger.\n */\nexport function openMenuWithFocus(\n menu: MenuContextValue,\n event: Event,\n which: \"first\" | \"last\",\n): void {\n const { popover } = menu;\n if (popover.intended()) {\n const popup = popover.popupRef.current;\n if (popup !== null && popup.matches(\":popover-open\")) {\n const item = edgeItem(popup, which);\n if (item !== null) focusItem(item);\n }\n return;\n }\n menu.setOpenCause(which, isPointerClick(event));\n popover.requestOpen(event, \"activate\");\n}\n\n/** A click from a pointing device (`detail` counts clicks; keyboard and `click()` give 0). */\nexport function isPointerClick(event: Event): boolean {\n return event.type === \"click\" && (event as MouseEvent).detail > 0;\n}\n\n/**\n * The menu button: `<button type=\"button\" commandfor command=\"toggle-popover\"\n * aria-haspopup=\"menu\" aria-expanded>`. A click (Enter, Space) toggles the menu through the\n * Root's transition; ArrowDown / ArrowUp open it with the first / last item focused.\n *\n * Owned keys (conventions 1.2): `type` (on a `<button>` only), `id`, `disabled`, `commandfor`,\n * `command`, `aria-haspopup`, `aria-expanded`, `onClick`, `onKeyDown`, `data-open`,\n * `data-pending`, `data-disabled`.\n */\nexport function MenuTrigger({\n disabled = false,\n className,\n style,\n children,\n render,\n ...rest\n}: MenuTriggerProps) {\n const menu = useMenuContext(\"Menu.Trigger\");\n useDevWarning(\n menu.submenu,\n \"Menu.Trigger: rendered in a submenu. Use Menu.SubmenuTrigger, which is also an item of the \" +\n \"parent menu.\",\n );\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || hasModifier(event)) return;\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n // No page scroll; Enter and Space stay the native click.\n event.preventDefault();\n openMenuWithFocus(menu, event.nativeEvent, event.key === \"ArrowDown\" ? \"first\" : \"last\");\n };\n\n const { state, libraryProps, ref } = usePopoverTrigger(menu.popover, {\n part: \"Menu.Trigger\",\n disabled,\n render,\n handlers: { onKeyDown },\n activate: (event) => {\n const native = event.nativeEvent;\n if (menu.popover.intended()) {\n menu.popover.requestClose(native, \"activate\");\n } else {\n menu.setOpenCause(\"first\", isPointerClick(native));\n menu.popover.requestOpen(native, \"activate\");\n }\n },\n });\n\n return useRender<ComponentPropsWithRef<\"button\">, MenuTriggerState>({\n defaultElement: \"button\",\n render,\n state,\n className,\n style,\n children,\n props: rest,\n libraryProps: {\n ...libraryProps,\n id: menu.triggerId,\n \"aria-haspopup\": \"menu\",\n },\n ref,\n });\n}\n\nMenuTrigger.displayName = \"MenuTrigger\";\n"],"mappings":";;;;;;;;;;;AAoCA,SAAgB,kBACd,MACA,OACA,OACM;CACN,MAAM,EAAE,YAAY;CACpB,IAAI,QAAQ,SAAS,GAAG;EACtB,MAAM,QAAQ,QAAQ,SAAS;EAC/B,IAAI,UAAU,QAAQ,MAAM,QAAQ,eAAe,GAAG;GACpD,MAAM,OAAO,SAAS,OAAO,KAAK;GAClC,IAAI,SAAS,MAAM,UAAU,IAAI;EACnC;EACA;CACF;CACA,KAAK,aAAa,OAAO,eAAe,KAAK,CAAC;CAC9C,QAAQ,YAAY,OAAO,UAAU;AACvC;;AAGA,SAAgB,eAAe,OAAuB;CACpD,OAAO,MAAM,SAAS,WAAY,MAAqB,SAAS;AAClE;;;;;;;;;;AAWA,SAAgB,YAAY,EAC1B,WAAW,OACX,WACA,OACA,UACA,QACA,GAAG,QACgB;CACnB,MAAM,OAAO,eAAe,cAAc;CAC1C,cACE,KAAK,SACL,yGAEF;CAEA,MAAM,aAAa,UAA4C;EAC7D,IAAI,YAAY,YAAY,KAAK,GAAG;EACpC,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;EAE1D,MAAM,eAAe;EACrB,kBAAkB,MAAM,MAAM,aAAa,MAAM,QAAQ,cAAc,UAAU,MAAM;CACzF;CAEA,MAAM,EAAE,OAAO,cAAc,QAAQ,kBAAkB,KAAK,SAAS;EACnE,MAAM;EACN;EACA;EACA,UAAU,EAAE,UAAU;EACtB,WAAW,UAAU;GACnB,MAAM,SAAS,MAAM;GACrB,IAAI,KAAK,QAAQ,SAAS,GACxB,KAAK,QAAQ,aAAa,QAAQ,UAAU;QACvC;IACL,KAAK,aAAa,SAAS,eAAe,MAAM,CAAC;IACjD,KAAK,QAAQ,YAAY,QAAQ,UAAU;GAC7C;EACF;CACF,CAAC;CAED,OAAO,UAA6D;EAClE,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA,OAAO;EACP,cAAc;GACZ,GAAG;GACH,IAAI,KAAK;GACT,iBAAiB;EACnB;EACA;CACF,CAAC;AACH;AAEA,YAAY,cAAc"}
1
+ {"version":3,"file":"menu-trigger.mjs","names":[],"sources":["../../src/menu/menu-trigger.tsx"],"sourcesContent":["\"use client\";\nimport type { ComponentPropsWithRef, CSSProperties, KeyboardEvent, ReactNode } from \"react\";\nimport { useToolbarContext } from \"../internal/toolbar-context.js\";\nimport type { RenderProp, StateValue } from \"../internal/types.js\";\nimport { useDevWarning } from \"../internal/use-dev-warning.js\";\nimport { usePopoverTrigger } from \"../internal/use-popover-trigger.js\";\nimport { useRender } from \"../internal/use-render.js\";\nimport { useMenuContext } from \"./menu-context.js\";\nimport type { MenuContextValue } from \"./menu-context.js\";\nimport { edgeItem, focusItem, hasModifier, isRtl } from \"./menu-dom.js\";\n\nexport interface MenuTriggerState {\n /** Optimistic open state. */\n readonly open: boolean;\n /** The Root's transition is pending (an open, a part-initiated close or a dismissal notification). */\n readonly pending: boolean;\n readonly disabled: boolean;\n}\n\nexport interface MenuTriggerProps extends Omit<\n ComponentPropsWithRef<\"button\">,\n \"onClick\" | \"onKeyDown\" | \"aria-expanded\" | \"aria-haspopup\" | \"className\" | \"style\" | \"children\"\n> {\n /** Native `disabled`: the menu cannot be opened from this button. */\n disabled?: boolean;\n className?: StateValue<string | undefined, MenuTriggerState>;\n style?: StateValue<CSSProperties | undefined, MenuTriggerState>;\n /** Rendered from optimistic state; must not suspend. */\n children?: StateValue<ReactNode, MenuTriggerState>;\n /** Should render a `<button>` (the command path before hydration). */\n render?: RenderProp<ComponentPropsWithRef<\"button\">, MenuTriggerState>;\n}\n\n/**\n * Opens with the first (`\"first\"`) or last (`\"last\"`) item focused, or focuses that item when the\n * menu is already open (a pre-hydration open, walkthrough 10). Shared with SubmenuTrigger.\n */\nexport function openMenuWithFocus(\n menu: MenuContextValue,\n event: Event,\n which: \"first\" | \"last\",\n): void {\n const { popover } = menu;\n if (popover.intended()) {\n const popup = popover.popupRef.current;\n if (popup !== null && popup.matches(\":popover-open\")) {\n const item = edgeItem(popup, which);\n if (item !== null) focusItem(item);\n }\n return;\n }\n menu.setOpenCause(which, isPointerClick(event));\n popover.requestOpen(event, \"activate\");\n}\n\n/** A click from a pointing device (`detail` counts clicks; keyboard and `click()` give 0). */\nexport function isPointerClick(event: Event): boolean {\n return event.type === \"click\" && (event as MouseEvent).detail > 0;\n}\n\n/**\n * The menu button: `<button type=\"button\" commandfor command=\"toggle-popover\"\n * aria-haspopup=\"menu\" aria-expanded>`. A click (Enter, Space) toggles the menu through the\n * Root's transition; ArrowDown / ArrowUp open it with the first / last item focused (inside a\n * vertical `Toolbar.Root`: the inline-end arrow, with the first item focused).\n *\n * Owned keys (conventions 1.2): `type` (on a `<button>` only), `id`, `disabled`, `commandfor`,\n * `command`, `aria-haspopup`, `aria-expanded`, `onClick`, `onKeyDown`, `data-open`,\n * `data-pending`, `data-disabled`.\n */\nexport function MenuTrigger({\n disabled = false,\n className,\n style,\n children,\n render,\n ...rest\n}: MenuTriggerProps) {\n const menu = useMenuContext(\"Menu.Trigger\");\n useDevWarning(\n menu.submenu,\n \"Menu.Trigger: rendered in a submenu. Use Menu.SubmenuTrigger, which is also an item of the \" +\n \"parent menu.\",\n );\n\n // Inside a vertical Toolbar, ArrowDown / ArrowUp are the Toolbar's: the trigger opens on the\n // inline-end arrow instead, as a submenu trigger does (design/components/toggle-group.md 7.4).\n const toolbar = useToolbarContext();\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (disabled || hasModifier(event)) return;\n let which: \"first\" | \"last\";\n if (toolbar?.orientation === \"vertical\") {\n const openKey = isRtl(event.currentTarget) ? \"ArrowLeft\" : \"ArrowRight\";\n if (event.key !== openKey) return;\n which = \"first\";\n } else {\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n which = event.key === \"ArrowDown\" ? \"first\" : \"last\";\n }\n // No page scroll, and an enclosing Toolbar sees `defaultPrevented`; Enter and Space stay the\n // native click.\n event.preventDefault();\n openMenuWithFocus(menu, event.nativeEvent, which);\n };\n\n const { state, libraryProps, ref } = usePopoverTrigger(menu.popover, {\n part: \"Menu.Trigger\",\n disabled,\n render,\n handlers: { onKeyDown },\n activate: (event) => {\n const native = event.nativeEvent;\n if (menu.popover.intended()) {\n menu.popover.requestClose(native, \"activate\");\n } else {\n menu.setOpenCause(\"first\", isPointerClick(native));\n menu.popover.requestOpen(native, \"activate\");\n }\n },\n });\n\n return useRender<ComponentPropsWithRef<\"button\">, MenuTriggerState>({\n defaultElement: \"button\",\n render,\n state,\n className,\n style,\n children,\n props: rest,\n libraryProps: {\n ...libraryProps,\n id: menu.triggerId,\n \"aria-haspopup\": \"menu\",\n },\n ref,\n });\n}\n\nMenuTrigger.displayName = \"MenuTrigger\";\n"],"mappings":";;;;;;;;;;;;AAqCA,SAAgB,kBACd,MACA,OACA,OACM;CACN,MAAM,EAAE,YAAY;CACpB,IAAI,QAAQ,SAAS,GAAG;EACtB,MAAM,QAAQ,QAAQ,SAAS;EAC/B,IAAI,UAAU,QAAQ,MAAM,QAAQ,eAAe,GAAG;GACpD,MAAM,OAAO,SAAS,OAAO,KAAK;GAClC,IAAI,SAAS,MAAM,UAAU,IAAI;EACnC;EACA;CACF;CACA,KAAK,aAAa,OAAO,eAAe,KAAK,CAAC;CAC9C,QAAQ,YAAY,OAAO,UAAU;AACvC;;AAGA,SAAgB,eAAe,OAAuB;CACpD,OAAO,MAAM,SAAS,WAAY,MAAqB,SAAS;AAClE;;;;;;;;;;;AAYA,SAAgB,YAAY,EAC1B,WAAW,OACX,WACA,OACA,UACA,QACA,GAAG,QACgB;CACnB,MAAM,OAAO,eAAe,cAAc;CAC1C,cACE,KAAK,SACL,yGAEF;CAIA,MAAM,UAAU,kBAAkB;CAClC,MAAM,aAAa,UAA4C;EAC7D,IAAI,YAAY,YAAY,KAAK,GAAG;EACpC,IAAI;EACJ,IAAI,SAAS,gBAAgB,YAAY;GACvC,MAAM,UAAU,MAAM,MAAM,aAAa,IAAI,cAAc;GAC3D,IAAI,MAAM,QAAQ,SAAS;GAC3B,QAAQ;EACV,OAAO;GACL,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;GAC1D,QAAQ,MAAM,QAAQ,cAAc,UAAU;EAChD;EAGA,MAAM,eAAe;EACrB,kBAAkB,MAAM,MAAM,aAAa,KAAK;CAClD;CAEA,MAAM,EAAE,OAAO,cAAc,QAAQ,kBAAkB,KAAK,SAAS;EACnE,MAAM;EACN;EACA;EACA,UAAU,EAAE,UAAU;EACtB,WAAW,UAAU;GACnB,MAAM,SAAS,MAAM;GACrB,IAAI,KAAK,QAAQ,SAAS,GACxB,KAAK,QAAQ,aAAa,QAAQ,UAAU;QACvC;IACL,KAAK,aAAa,SAAS,eAAe,MAAM,CAAC;IACjD,KAAK,QAAQ,YAAY,QAAQ,UAAU;GAC7C;EACF;CACF,CAAC;CAED,OAAO,UAA6D;EAClE,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA,OAAO;EACP,cAAc;GACZ,GAAG;GACH,IAAI,KAAK;GACT,iBAAiB;EACnB;EACA;CACF,CAAC;AACH;AAEA,YAAY,cAAc"}
@@ -0,0 +1,24 @@
1
+ import "../internal/platform-attributes.mjs";
2
+ import { MeterRegion } from "./meter-region.mjs";
3
+ import { MeterRoot, MeterRootProps, MeterState } from "./meter-root.mjs";
4
+ import { MeterIndicator, MeterIndicatorProps } from "./meter-indicator.mjs";
5
+ import { MeterLabel, MeterLabelProps } from "./meter-label.mjs";
6
+ import { MeterTrack, MeterTrackProps } from "./meter-track.mjs";
7
+ import { MeterValue, MeterValueProps } from "./meter-value.mjs";
8
+ //#region src/meter/index.d.ts
9
+ /**
10
+ * Meter (WAI-ARIA `meter`): `Root` (`div[role=meter]`, directive-free, so a Server Component may
11
+ * render it and it runs on the server), `Track`, `Indicator` (sized by your CSS from
12
+ * `--meter-value`), `Label` and `Value`. `low` / `high` / `optimum` decide the region
13
+ * (`data-region`: `optimum`, `suboptimum`, `even-less-good`) with the platform's rules.
14
+ */
15
+ export declare const Meter: {
16
+ readonly Root: typeof MeterRoot;
17
+ readonly Track: typeof MeterTrack;
18
+ readonly Indicator: typeof MeterIndicator;
19
+ readonly Label: typeof MeterLabel;
20
+ readonly Value: typeof MeterValue;
21
+ };
22
+ //#endregion
23
+ export type { MeterIndicatorProps, MeterLabelProps, MeterRegion, MeterRootProps, MeterState, MeterTrackProps, MeterValueProps };
24
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/meter/index.ts"],"mappings":";;;;;;;;;;;;;;qBAea;WACX,aAAI;WACJ,cAAK;WACL,kBAAS;WACT,cAAK;WACL,cAAK"}
@@ -0,0 +1,23 @@
1
+ import { MeterIndicator } from "./meter-indicator.mjs";
2
+ import { MeterLabel } from "./meter-label.mjs";
3
+ import { MeterRoot } from "./meter-root.mjs";
4
+ import { MeterTrack } from "./meter-track.mjs";
5
+ import { MeterValue } from "./meter-value.mjs";
6
+ //#region src/meter/index.ts
7
+ /**
8
+ * Meter (WAI-ARIA `meter`): `Root` (`div[role=meter]`, directive-free, so a Server Component may
9
+ * render it and it runs on the server), `Track`, `Indicator` (sized by your CSS from
10
+ * `--meter-value`), `Label` and `Value`. `low` / `high` / `optimum` decide the region
11
+ * (`data-region`: `optimum`, `suboptimum`, `even-less-good`) with the platform's rules.
12
+ */
13
+ const Meter = {
14
+ Root: MeterRoot,
15
+ Track: MeterTrack,
16
+ Indicator: MeterIndicator,
17
+ Label: MeterLabel,
18
+ Value: MeterValue
19
+ };
20
+ //#endregion
21
+ export { Meter };
22
+
23
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/meter/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 { MeterIndicator } from \"./meter-indicator.js\";\nimport { MeterLabel } from \"./meter-label.js\";\nimport { MeterRoot } from \"./meter-root.js\";\nimport { MeterTrack } from \"./meter-track.js\";\nimport { MeterValue } from \"./meter-value.js\";\n\n/**\n * Meter (WAI-ARIA `meter`): `Root` (`div[role=meter]`, directive-free, so a Server Component may\n * render it and it runs on the server), `Track`, `Indicator` (sized by your CSS from\n * `--meter-value`), `Label` and `Value`. `low` / `high` / `optimum` decide the region\n * (`data-region`: `optimum`, `suboptimum`, `even-less-good`) with the platform's rules.\n */\nexport const Meter = {\n Root: MeterRoot,\n Track: MeterTrack,\n Indicator: MeterIndicator,\n Label: MeterLabel,\n Value: MeterValue,\n} as const;\n\nexport type { MeterRootProps, MeterState, MeterRegion } from \"./meter-root.js\";\nexport type { MeterTrackProps } from \"./meter-track.js\";\nexport type { MeterIndicatorProps } from \"./meter-indicator.js\";\nexport type { MeterLabelProps } from \"./meter-label.js\";\nexport type { MeterValueProps } from \"./meter-value.js\";\n"],"mappings":";;;;;;;;;;;;AAeA,MAAa,QAAQ;CACnB,MAAM;CACN,OAAO;CACP,WAAW;CACX,OAAO;CACP,OAAO;AACT"}
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { createContext, use } from "react";
3
+ //#region src/meter/meter-context.ts
4
+ const MeterContext = createContext(null);
5
+ function useMeterContext(part) {
6
+ const context = use(MeterContext);
7
+ if (context === null) throw new Error(`${part} must be rendered inside a Meter.Root.`);
8
+ return context;
9
+ }
10
+ //#endregion
11
+ export { MeterContext, useMeterContext };
12
+
13
+ //# sourceMappingURL=meter-context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-context.mjs","names":[],"sources":["../../src/meter/meter-context.ts"],"sourcesContent":["\"use client\";\nimport { createContext, use } from \"react\";\nimport type { MeterState } from \"./meter-root.js\";\n\n/**\n * What the directive-free `Meter.Root` provides to its parts: plain serialisable data, so the\n * provider can be rendered by a Root running as a Server Component (design/components/progress.md\n * 8.1).\n */\nexport interface MeterContextValue {\n /** The Root's `useId`; `Meter.Label` renders `${id}-label`. */\n readonly id: string;\n readonly state: MeterState;\n}\n\nexport const MeterContext = createContext<MeterContextValue | null>(null);\n\nexport function useMeterContext(part: string): MeterContextValue {\n const context = use(MeterContext);\n if (context === null) {\n throw new Error(`${part} must be rendered inside a Meter.Root.`);\n }\n return context;\n}\n"],"mappings":";;;AAeA,MAAa,eAAe,cAAwC,IAAI;AAExE,SAAgB,gBAAgB,MAAiC;CAC/D,MAAM,UAAU,IAAI,YAAY;CAChC,IAAI,YAAY,MACd,MAAM,IAAI,MAAM,GAAG,KAAK,uCAAuC;CAEjE,OAAO;AACT"}
@@ -0,0 +1,19 @@
1
+ import { RenderProp, StateValue } from "../internal/types.mjs";
2
+ import { MeterState } from "./meter-root.mjs";
3
+ import { CSSProperties, ComponentPropsWithRef, ReactNode } from "react";
4
+ //#region src/meter/meter-indicator.d.ts
5
+ export interface MeterIndicatorProps extends Omit<ComponentPropsWithRef<"span">, "className" | "style" | "children"> {
6
+ className?: StateValue<string | undefined, MeterState>;
7
+ style?: StateValue<CSSProperties | undefined, MeterState>;
8
+ children?: StateValue<ReactNode, MeterState>;
9
+ render?: RenderProp<ComponentPropsWithRef<"span">, MeterState>;
10
+ }
11
+ /**
12
+ * `Meter.Indicator`: the fill. It renders no inline size: the consumer's CSS sizes it from the Root's inherited custom property. Owned keys: `data-region`.
13
+ */
14
+ export declare function MeterIndicator({ className, style, children, render, ...rest }: MeterIndicatorProps): ReactNode;
15
+ export declare namespace MeterIndicator {
16
+ var displayName: string;
17
+ }
18
+ //#endregion
19
+ //# sourceMappingURL=meter-indicator.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-indicator.d.mts","names":[],"sources":["../../src/meter/meter-indicator.tsx"],"mappings":";;;;iBAOiB,4BAA4B,KAC3C;EAGA,YAAY,+BAA+B;EAC3C,QAAQ,WAAW,2BAA2B;EAC9C,WAAW,WAAW,WAAW;EACjC,SAAS,WAAW,+BAA+B;;;;;wBAMrC,iBACd,WACA,OACA,UACA,WACG,QACF,sBAAmB;yBANN"}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { useRender } from "../internal/use-render.mjs";
3
+ import { useMeterContext } from "./meter-context.mjs";
4
+ //#region src/meter/meter-indicator.tsx
5
+ /**
6
+ * `Meter.Indicator`: the fill. It renders no inline size: the consumer's CSS sizes it from the Root's inherited custom property. Owned keys: `data-region`.
7
+ */
8
+ function MeterIndicator({ className, style, children, render, ...rest }) {
9
+ const { state } = useMeterContext("Meter.Indicator");
10
+ return useRender({
11
+ defaultElement: "span",
12
+ render,
13
+ state,
14
+ className,
15
+ style,
16
+ children,
17
+ props: rest,
18
+ libraryProps: { "data-region": state.region }
19
+ });
20
+ }
21
+ MeterIndicator.displayName = "MeterIndicator";
22
+ //#endregion
23
+ export { MeterIndicator };
24
+
25
+ //# sourceMappingURL=meter-indicator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-indicator.mjs","names":[],"sources":["../../src/meter/meter-indicator.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 MeterIndicatorProps extends Omit<\n ComponentPropsWithRef<\"span\">,\n \"className\" | \"style\" | \"children\"\n> {\n className?: StateValue<string | undefined, MeterState>;\n style?: StateValue<CSSProperties | undefined, MeterState>;\n children?: StateValue<ReactNode, MeterState>;\n render?: RenderProp<ComponentPropsWithRef<\"span\">, MeterState>;\n}\n\n/**\n * `Meter.Indicator`: the fill. It renders no inline size: the consumer's CSS sizes it from the Root's inherited custom property. Owned keys: `data-region`.\n */\nexport function MeterIndicator({\n className,\n style,\n children,\n render,\n ...rest\n}: MeterIndicatorProps) {\n const { state } = useMeterContext(\"Meter.Indicator\");\n return useRender<ComponentPropsWithRef<\"span\">, MeterState>({\n defaultElement: \"span\",\n render,\n state,\n className,\n style,\n children,\n props: rest,\n libraryProps: {\n \"data-region\": state.region,\n },\n });\n}\n\nMeterIndicator.displayName = \"MeterIndicator\";\n"],"mappings":";;;;;;;AAoBA,SAAgB,eAAe,EAC7B,WACA,OACA,UACA,QACA,GAAG,QACmB;CACtB,MAAM,EAAE,UAAU,gBAAgB,iBAAiB;CACnD,OAAO,UAAqD;EAC1D,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA,OAAO;EACP,cAAc,EACZ,eAAe,MAAM,OACvB;CACF,CAAC;AACH;AAEA,eAAe,cAAc"}
@@ -0,0 +1,19 @@
1
+ import { RenderProp, StateValue } from "../internal/types.mjs";
2
+ import { MeterState } from "./meter-root.mjs";
3
+ import { CSSProperties, ComponentPropsWithRef, ReactNode } from "react";
4
+ //#region src/meter/meter-label.d.ts
5
+ export interface MeterLabelProps extends Omit<ComponentPropsWithRef<"span">, "id" | "className" | "style" | "children"> {
6
+ className?: StateValue<string | undefined, MeterState>;
7
+ style?: StateValue<CSSProperties | undefined, MeterState>;
8
+ children?: StateValue<ReactNode, MeterState>;
9
+ render?: RenderProp<ComponentPropsWithRef<"span">, MeterState>;
10
+ }
11
+ /**
12
+ * `Meter.Label`: a `span` whose id the Root always references through `aria-labelledby` (the Root is not a labelable element, so a `<label for>` would associate nothing). Owned keys: `id`, `data-region`.
13
+ */
14
+ export declare function MeterLabel({ className, style, children, render, ...rest }: MeterLabelProps): ReactNode;
15
+ export declare namespace MeterLabel {
16
+ var displayName: string;
17
+ }
18
+ //#endregion
19
+ //# sourceMappingURL=meter-label.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-label.d.mts","names":[],"sources":["../../src/meter/meter-label.tsx"],"mappings":";;;;iBAOiB,wBAAwB,KACvC;EAGA,YAAY,+BAA+B;EAC3C,QAAQ,WAAW,2BAA2B;EAC9C,WAAW,WAAW,WAAW;EACjC,SAAS,WAAW,+BAA+B;;;;;wBAMrC,aAAa,WAAW,OAAO,UAAU,WAAW,QAAQ,kBAAe;yBAA3E"}
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { useRender } from "../internal/use-render.mjs";
3
+ import { useMeterContext } from "./meter-context.mjs";
4
+ //#region src/meter/meter-label.tsx
5
+ /**
6
+ * `Meter.Label`: a `span` whose id the Root always references through `aria-labelledby` (the Root is not a labelable element, so a `<label for>` would associate nothing). Owned keys: `id`, `data-region`.
7
+ */
8
+ function MeterLabel({ className, style, children, render, ...rest }) {
9
+ const { id, state } = useMeterContext("Meter.Label");
10
+ return useRender({
11
+ defaultElement: "span",
12
+ render,
13
+ state,
14
+ className,
15
+ style,
16
+ children,
17
+ props: rest,
18
+ libraryProps: {
19
+ id: `${id}-label`,
20
+ "data-region": state.region
21
+ }
22
+ });
23
+ }
24
+ MeterLabel.displayName = "MeterLabel";
25
+ //#endregion
26
+ export { MeterLabel };
27
+
28
+ //# sourceMappingURL=meter-label.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-label.mjs","names":[],"sources":["../../src/meter/meter-label.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 MeterLabelProps extends Omit<\n ComponentPropsWithRef<\"span\">,\n \"id\" | \"className\" | \"style\" | \"children\"\n> {\n className?: StateValue<string | undefined, MeterState>;\n style?: StateValue<CSSProperties | undefined, MeterState>;\n children?: StateValue<ReactNode, MeterState>;\n render?: RenderProp<ComponentPropsWithRef<\"span\">, MeterState>;\n}\n\n/**\n * `Meter.Label`: a `span` whose id the Root always references through `aria-labelledby` (the Root is not a labelable element, so a `<label for>` would associate nothing). Owned keys: `id`, `data-region`.\n */\nexport function MeterLabel({ className, style, children, render, ...rest }: MeterLabelProps) {\n const { id, state } = useMeterContext(\"Meter.Label\");\n return useRender<ComponentPropsWithRef<\"span\">, MeterState>({\n defaultElement: \"span\",\n render,\n state,\n className,\n style,\n children,\n props: rest,\n libraryProps: {\n id: `${id}-label`,\n \"data-region\": state.region,\n },\n });\n}\n\nMeterLabel.displayName = \"MeterLabel\";\n"],"mappings":";;;;;;;AAoBA,SAAgB,WAAW,EAAE,WAAW,OAAO,UAAU,QAAQ,GAAG,QAAyB;CAC3F,MAAM,EAAE,IAAI,UAAU,gBAAgB,aAAa;CACnD,OAAO,UAAqD;EAC1D,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA,OAAO;EACP,cAAc;GACZ,IAAI,GAAG,GAAG;GACV,eAAe,MAAM;EACvB;CACF,CAAC;AACH;AAEA,WAAW,cAAc"}
@@ -0,0 +1,4 @@
1
+ //#region src/meter/meter-region.d.ts
2
+ export type MeterRegion = "optimum" | "suboptimum" | "even-less-good";
3
+ //#endregion
4
+ //# sourceMappingURL=meter-region.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-region.d.mts","names":[],"sources":["../../src/meter/meter-region.ts"],"mappings":";YAGY"}
@@ -0,0 +1,39 @@
1
+ import { clamp } from "../internal/range-value.mjs";
2
+ //#region src/meter/meter-region.ts
3
+ function given(value) {
4
+ return value !== void 0 && Number.isFinite(value);
5
+ }
6
+ /**
7
+ * HTML's defaults and clamping for `<meter>`, in order: `low` (default `min`) to `[min, max]`,
8
+ * `high` (default `max`) to `[low, max]`, `optimum` (default the midpoint) to `[min, max]`. A
9
+ * non-finite boundary is treated as absent, as the platform's attribute parser does.
10
+ */
11
+ function resolveMeterBounds(min, max, low, high, optimum) {
12
+ const resolvedLow = clamp(given(low) ? low : min, min, max);
13
+ return {
14
+ low: resolvedLow,
15
+ high: clamp(given(high) ? high : max, resolvedLow, max),
16
+ optimum: clamp(given(optimum) ? optimum : (min + max) / 2, min, max)
17
+ };
18
+ }
19
+ /**
20
+ * The gauge region of a meter, with Chromium's comparison operators
21
+ * (`HTMLMeterElement::GetGaugeRegion`). Expects the clamped value and bounds.
22
+ */
23
+ function meterRegion(value, low, high, optimum) {
24
+ if (optimum < low) {
25
+ if (value <= low) return "optimum";
26
+ if (value <= high) return "suboptimum";
27
+ return "even-less-good";
28
+ }
29
+ if (high < optimum) {
30
+ if (high <= value) return "optimum";
31
+ if (low <= value) return "suboptimum";
32
+ return "even-less-good";
33
+ }
34
+ return low <= value && value <= high ? "optimum" : "suboptimum";
35
+ }
36
+ //#endregion
37
+ export { meterRegion, resolveMeterBounds };
38
+
39
+ //# sourceMappingURL=meter-region.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-region.mjs","names":[],"sources":["../../src/meter/meter-region.ts"],"sourcesContent":["// No \"use client\": pure functions (design/components/progress.md 2.4).\nimport { clamp } from \"../internal/range-value.js\";\n\nexport type MeterRegion = \"optimum\" | \"suboptimum\" | \"even-less-good\";\n\nexport interface MeterBounds {\n readonly low: number;\n readonly high: number;\n readonly optimum: number;\n}\n\nfunction given(value: number | undefined): value is number {\n return value !== undefined && Number.isFinite(value);\n}\n\n/**\n * HTML's defaults and clamping for `<meter>`, in order: `low` (default `min`) to `[min, max]`,\n * `high` (default `max`) to `[low, max]`, `optimum` (default the midpoint) to `[min, max]`. A\n * non-finite boundary is treated as absent, as the platform's attribute parser does.\n */\nexport function resolveMeterBounds(\n min: number,\n max: number,\n low: number | undefined,\n high: number | undefined,\n optimum: number | undefined,\n): MeterBounds {\n const resolvedLow = clamp(given(low) ? low : min, min, max);\n const resolvedHigh = clamp(given(high) ? high : max, resolvedLow, max);\n const resolvedOptimum = clamp(given(optimum) ? optimum : (min + max) / 2, min, max);\n return { low: resolvedLow, high: resolvedHigh, optimum: resolvedOptimum };\n}\n\n/**\n * The gauge region of a meter, with Chromium's comparison operators\n * (`HTMLMeterElement::GetGaugeRegion`). Expects the clamped value and bounds.\n */\nexport function meterRegion(\n value: number,\n low: number,\n high: number,\n optimum: number,\n): MeterRegion {\n if (optimum < low) {\n // Lower is better.\n if (value <= low) return \"optimum\";\n if (value <= high) return \"suboptimum\";\n return \"even-less-good\";\n }\n if (high < optimum) {\n // Higher is better.\n if (high <= value) return \"optimum\";\n if (low <= value) return \"suboptimum\";\n return \"even-less-good\";\n }\n // The middle is best: never \"even-less-good\".\n return low <= value && value <= high ? \"optimum\" : \"suboptimum\";\n}\n"],"mappings":";;AAWA,SAAS,MAAM,OAA4C;CACzD,OAAO,UAAU,KAAA,KAAa,OAAO,SAAS,KAAK;AACrD;;;;;;AAOA,SAAgB,mBACd,KACA,KACA,KACA,MACA,SACa;CACb,MAAM,cAAc,MAAM,MAAM,GAAG,IAAI,MAAM,KAAK,KAAK,GAAG;CAG1D,OAAO;EAAE,KAAK;EAAa,MAFN,MAAM,MAAM,IAAI,IAAI,OAAO,KAAK,aAAa,GAEtB;EAAG,SADvB,MAAM,MAAM,OAAO,IAAI,WAAW,MAAM,OAAO,GAAG,KAAK,GACT;CAAE;AAC1E;;;;;AAMA,SAAgB,YACd,OACA,KACA,MACA,SACa;CACb,IAAI,UAAU,KAAK;EAEjB,IAAI,SAAS,KAAK,OAAO;EACzB,IAAI,SAAS,MAAM,OAAO;EAC1B,OAAO;CACT;CACA,IAAI,OAAO,SAAS;EAElB,IAAI,QAAQ,OAAO,OAAO;EAC1B,IAAI,OAAO,OAAO,OAAO;EACzB,OAAO;CACT;CAEA,OAAO,OAAO,SAAS,SAAS,OAAO,YAAY;AACrD"}
@@ -0,0 +1,71 @@
1
+ import { RenderProp, StateValue } from "../internal/types.mjs";
2
+ import { MeterRegion } from "./meter-region.mjs";
3
+ import { CSSProperties, ComponentPropsWithRef, ReactNode } from "react";
4
+ //#region src/meter/meter-root.d.ts
5
+ /** The state every Meter part receives. */
6
+ export interface MeterState {
7
+ /** Clamped to `[min, max]`. */
8
+ readonly value: number;
9
+ readonly min: number;
10
+ readonly max: number;
11
+ /** After HTML's defaults and clamping. */
12
+ readonly low: number;
13
+ readonly high: number;
14
+ readonly optimum: number;
15
+ /** A number 0–100. */
16
+ readonly percentage: number;
17
+ /** The `Intl.NumberFormat` text of the value (or of the fraction, for the percent style). */
18
+ readonly formattedValue: string;
19
+ /** What `aria-valuetext` carries: `getAriaValueText`'s result, else `formattedValue`. */
20
+ readonly valueText: string | null;
21
+ readonly region: MeterRegion;
22
+ }
23
+ export interface MeterRootProps extends Omit<ComponentPropsWithRef<"div">, "role" | "aria-valuemin" | "aria-valuemax" | "aria-valuenow" | "aria-valuetext" | "defaultValue" | "defaultChecked" | "className" | "style" | "children"> {
24
+ /** Required: a meter always has a value. Clamped to `[min, max]`. */
25
+ value: number;
26
+ /** @default 0 */
27
+ min?: number;
28
+ /** @default 100 */
29
+ max?: number;
30
+ /** Upper bound of the "low" part of the range. Default `min`. */
31
+ low?: number;
32
+ /** Lower bound of the "high" part of the range. Default `max`. */
33
+ high?: number;
34
+ /** The best value. Default the midpoint. Decides which part of the range is `optimum`. */
35
+ optimum?: number;
36
+ /**
37
+ * `Intl.NumberFormat` options for `aria-valuetext` and `Meter.Value`. Default
38
+ * `{ style: "percent" }`. A `percent` style formats the fraction of the range; any other style
39
+ * formats the value. Serialisable: a Server Component may pass it.
40
+ */
41
+ format?: Intl.NumberFormatOptions;
42
+ /**
43
+ * BCP 47 tag for `Intl.NumberFormat`; default: the runtime's locale. Pass it when a client
44
+ * tree is server-rendered.
45
+ */
46
+ locale?: string;
47
+ /**
48
+ * The `aria-valuetext` to render instead of `formattedValue`. Called with the clamped value
49
+ * and the state as it would be without this prop. Return `null` to render no
50
+ * `aria-valuetext`.
51
+ */
52
+ getAriaValueText?: (value: number, state: MeterState) => string | null | undefined;
53
+ className?: StateValue<string | undefined, MeterState>;
54
+ style?: StateValue<CSSProperties | undefined, MeterState>;
55
+ children?: StateValue<ReactNode, MeterState>;
56
+ render?: RenderProp<ComponentPropsWithRef<"div">, MeterState>;
57
+ }
58
+ /**
59
+ * `Meter.Root`: a `div[role=meter]` with the ARIA values and `aria-valuetext` always,
60
+ * `data-region`, and `--meter-value` / `--meter-low` / `--meter-high` / `--meter-optimum` (the
61
+ * percentages) in `style`, where the consumer's entries win. Owned keys: `role`,
62
+ * `aria-valuemin`, `aria-valuemax`, `aria-valuenow`, `aria-valuetext`, `aria-labelledby`
63
+ * (token-merged: the consumer's tokens, then `Meter.Label`'s id, always), `data-region`.
64
+ */
65
+ export declare function MeterRoot({ value, min, max, low, high, optimum, format, locale, getAriaValueText, className, style, children, render, ref, ...rest }: MeterRootProps): import("react").JSX.Element;
66
+ export declare namespace MeterRoot {
67
+ var displayName: string;
68
+ }
69
+ //#endregion
70
+ export type { MeterRegion };
71
+ //# sourceMappingURL=meter-root.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-root.d.mts","names":[],"sources":["../../src/meter/meter-root.tsx"],"mappings":";;;;;iBAkBiB;;WAEN;WACA;WACA;;WAEA;WACA;WACA;;WAEA;;WAEA;;WAEA;WACA,QAAQ;;iBAGF,uBAAuB,KACtC;;EAaA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;EAMA,SAAS,KAAK;;;;;EAKd;;;;;;EAMA,oBAAoB,eAAe,OAAO;EAC1C,YAAY,+BAA+B;EAC3C,QAAQ,WAAW,2BAA2B;EAC9C,WAAW,WAAW,WAAW;EACjC,SAAS,WAAW,8BAA8B;;;;;;;;;wBAUpC,YACd,OACA,KACA,KACA,KACA,MACA,SACA,QACA,QACA,kBACA,WACA,OACA,UACA,QACA,QACG,QACF,iCAAc,IAAA;yBAhBD"}
@@ -0,0 +1,83 @@
1
+ import { mergeRenderRef, renderElement, resolveStateValue } from "../internal/render-element.mjs";
2
+ import { warnOnce } from "../internal/dev-warn.mjs";
3
+ import { clamp, formatRangeValue, isDegenerate, percentage } from "../internal/range-value.mjs";
4
+ import { MeterContext } from "./meter-context.mjs";
5
+ import { meterRegion, resolveMeterBounds } from "./meter-region.mjs";
6
+ import { useId } from "react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ //#region src/meter/meter-root.tsx
9
+ /**
10
+ * `Meter.Root`: a `div[role=meter]` with the ARIA values and `aria-valuetext` always,
11
+ * `data-region`, and `--meter-value` / `--meter-low` / `--meter-high` / `--meter-optimum` (the
12
+ * percentages) in `style`, where the consumer's entries win. Owned keys: `role`,
13
+ * `aria-valuemin`, `aria-valuemax`, `aria-valuenow`, `aria-valuetext`, `aria-labelledby`
14
+ * (token-merged: the consumer's tokens, then `Meter.Label`'s id, always), `data-region`.
15
+ */
16
+ function MeterRoot({ value, min = 0, max = 100, low, high, optimum, format, locale, getAriaValueText, className, style, children, render, ref, ...rest }) {
17
+ const id = useId();
18
+ let given = value;
19
+ if (!Number.isFinite(given)) {
20
+ warnOnce(`Meter.Root:non-finite:${given}`, `Meter.Root: \`value\` is ${given}, which is not a finite number; it is rendered as \`min\`.`);
21
+ given = min;
22
+ }
23
+ if (isDegenerate(min, max)) warnOnce(`Meter.Root:degenerate:${min}:${max}`, `Meter.Root: \`max\` (${max}) must be greater than \`min\` (${min}); the percentage is rendered as 0.`);
24
+ const clamped = clamp(given, min, max);
25
+ const bounds = resolveMeterBounds(min, max, low, high, optimum);
26
+ const formattedValue = formatRangeValue(clamped, min, max, format, locale);
27
+ const base = {
28
+ value: clamped,
29
+ min,
30
+ max,
31
+ ...bounds,
32
+ percentage: percentage(clamped, min, max),
33
+ formattedValue,
34
+ valueText: formattedValue,
35
+ region: meterRegion(clamped, bounds.low, bounds.high, bounds.optimum)
36
+ };
37
+ const valueText = getAriaValueText === void 0 ? formattedValue : getAriaValueText(clamped, base) ?? null;
38
+ const state = valueText === base.valueText ? base : {
39
+ ...base,
40
+ valueText
41
+ };
42
+ const variables = {
43
+ "--meter-value": `${state.percentage}%`,
44
+ "--meter-low": `${percentage(bounds.low, min, max)}%`,
45
+ "--meter-high": `${percentage(bounds.high, min, max)}%`,
46
+ "--meter-optimum": `${percentage(bounds.optimum, min, max)}%`
47
+ };
48
+ const libraryProps = {
49
+ role: "meter",
50
+ "aria-valuemin": min,
51
+ "aria-valuemax": max,
52
+ "aria-valuenow": clamped,
53
+ "aria-valuetext": valueText ?? void 0,
54
+ "aria-labelledby": `${id}-label`,
55
+ "data-region": state.region
56
+ };
57
+ const element = renderElement({
58
+ defaultElement: "div",
59
+ render,
60
+ state,
61
+ className,
62
+ style: (s) => ({
63
+ ...variables,
64
+ ...resolveStateValue(style, s)
65
+ }),
66
+ children,
67
+ props: rest,
68
+ libraryProps,
69
+ ref: mergeRenderRef(ref, render)
70
+ });
71
+ return /* @__PURE__ */ jsx(MeterContext, {
72
+ value: {
73
+ id,
74
+ state
75
+ },
76
+ children: element
77
+ });
78
+ }
79
+ MeterRoot.displayName = "MeterRoot";
80
+ //#endregion
81
+ export { MeterRoot };
82
+
83
+ //# sourceMappingURL=meter-root.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-root.mjs","names":[],"sources":["../../src/meter/meter-root.tsx"],"sourcesContent":["// No \"use client\": `Meter.Root` uses only `useId`, arithmetic and `Intl`, and renders the client\n// context's provider (conventions 7.1's second exception). Rendered by a Server Component it runs\n// once, on the server (design/components/progress.md 8.1). It must not import from any\n// \"use client\" module except its context (checked by src/__tests__/directives.test.ts).\nimport { useId } from \"react\";\nimport type { ComponentPropsWithRef, CSSProperties, ReactNode } from \"react\";\nimport { warnOnce } from \"../internal/dev-warn.js\";\nimport { clamp, formatRangeValue, isDegenerate, percentage } from \"../internal/range-value.js\";\nimport { mergeRenderRef, renderElement, resolveStateValue } from \"../internal/render-element.js\";\nimport type { DataAttributes } from \"../internal/render-element.js\";\nimport type { RenderProp, StateValue } from \"../internal/types.js\";\nimport { MeterContext } from \"./meter-context.js\";\nimport { meterRegion, resolveMeterBounds } from \"./meter-region.js\";\nimport type { MeterRegion } from \"./meter-region.js\";\n\nexport type { MeterRegion } from \"./meter-region.js\";\n\n/** The state every Meter part receives. */\nexport interface MeterState {\n /** Clamped to `[min, max]`. */\n readonly value: number;\n readonly min: number;\n readonly max: number;\n /** After HTML's defaults and clamping. */\n readonly low: number;\n readonly high: number;\n readonly optimum: number;\n /** A number 0–100. */\n readonly percentage: number;\n /** The `Intl.NumberFormat` text of the value (or of the fraction, for the percent style). */\n readonly formattedValue: string;\n /** What `aria-valuetext` carries: `getAriaValueText`'s result, else `formattedValue`. */\n readonly valueText: string | null;\n readonly region: MeterRegion;\n}\n\nexport interface MeterRootProps extends Omit<\n ComponentPropsWithRef<\"div\">,\n | \"role\"\n | \"aria-valuemin\"\n | \"aria-valuemax\"\n | \"aria-valuenow\"\n | \"aria-valuetext\"\n | \"defaultValue\"\n | \"defaultChecked\"\n | \"className\"\n | \"style\"\n | \"children\"\n> {\n /** Required: a meter always has a value. Clamped to `[min, max]`. */\n value: number;\n /** @default 0 */\n min?: number;\n /** @default 100 */\n max?: number;\n /** Upper bound of the \"low\" part of the range. Default `min`. */\n low?: number;\n /** Lower bound of the \"high\" part of the range. Default `max`. */\n high?: number;\n /** The best value. Default the midpoint. Decides which part of the range is `optimum`. */\n optimum?: number;\n /**\n * `Intl.NumberFormat` options for `aria-valuetext` and `Meter.Value`. Default\n * `{ style: \"percent\" }`. A `percent` style formats the fraction of the range; any other style\n * formats the value. Serialisable: a Server Component may pass it.\n */\n format?: Intl.NumberFormatOptions;\n /**\n * BCP 47 tag for `Intl.NumberFormat`; default: the runtime's locale. Pass it when a client\n * tree is server-rendered.\n */\n locale?: string;\n /**\n * The `aria-valuetext` to render instead of `formattedValue`. Called with the clamped value\n * and the state as it would be without this prop. Return `null` to render no\n * `aria-valuetext`.\n */\n getAriaValueText?: (value: number, state: MeterState) => string | null | undefined;\n className?: StateValue<string | undefined, MeterState>;\n style?: StateValue<CSSProperties | undefined, MeterState>;\n children?: StateValue<ReactNode, MeterState>;\n render?: RenderProp<ComponentPropsWithRef<\"div\">, MeterState>;\n}\n\n/**\n * `Meter.Root`: a `div[role=meter]` with the ARIA values and `aria-valuetext` always,\n * `data-region`, and `--meter-value` / `--meter-low` / `--meter-high` / `--meter-optimum` (the\n * percentages) in `style`, where the consumer's entries win. Owned keys: `role`,\n * `aria-valuemin`, `aria-valuemax`, `aria-valuenow`, `aria-valuetext`, `aria-labelledby`\n * (token-merged: the consumer's tokens, then `Meter.Label`'s id, always), `data-region`.\n */\nexport function MeterRoot({\n value,\n min = 0,\n max = 100,\n low,\n high,\n optimum,\n format,\n locale,\n getAriaValueText,\n className,\n style,\n children,\n render,\n ref,\n ...rest\n}: MeterRootProps) {\n const id = useId();\n\n let given = value;\n if (!Number.isFinite(given)) {\n warnOnce(\n `Meter.Root:non-finite:${given}`,\n `Meter.Root: \\`value\\` is ${given}, which is not a finite number; it is rendered as \\`min\\`.`,\n );\n given = min;\n }\n if (isDegenerate(min, max)) {\n warnOnce(\n `Meter.Root:degenerate:${min}:${max}`,\n `Meter.Root: \\`max\\` (${max}) must be greater than \\`min\\` (${min}); the percentage is ` +\n \"rendered as 0.\",\n );\n }\n\n const clamped = clamp(given, min, max);\n const bounds = resolveMeterBounds(min, max, low, high, optimum);\n const formattedValue = formatRangeValue(clamped, min, max, format, locale);\n const base: MeterState = {\n value: clamped,\n min,\n max,\n ...bounds,\n percentage: percentage(clamped, min, max),\n formattedValue,\n valueText: formattedValue,\n region: meterRegion(clamped, bounds.low, bounds.high, bounds.optimum),\n };\n const valueText =\n getAriaValueText === undefined ? formattedValue : (getAriaValueText(clamped, base) ?? null);\n const state: MeterState = valueText === base.valueText ? base : { ...base, valueText };\n\n const variables = {\n \"--meter-value\": `${state.percentage}%`,\n \"--meter-low\": `${percentage(bounds.low, min, max)}%`,\n \"--meter-high\": `${percentage(bounds.high, min, max)}%`,\n \"--meter-optimum\": `${percentage(bounds.optimum, min, max)}%`,\n };\n\n const libraryProps: Partial<ComponentPropsWithRef<\"div\">> & DataAttributes = {\n role: \"meter\",\n \"aria-valuemin\": min,\n \"aria-valuemax\": max,\n \"aria-valuenow\": clamped,\n \"aria-valuetext\": valueText ?? undefined,\n \"aria-labelledby\": `${id}-label`,\n \"data-region\": state.region,\n };\n\n const element = renderElement<ComponentPropsWithRef<\"div\">, MeterState>({\n defaultElement: \"div\",\n render,\n state,\n className,\n // The custom properties lose to the consumer's own entries (design 3.3).\n style: (s) => ({ ...(variables as CSSProperties), ...resolveStateValue(style, s) }),\n children,\n props: rest,\n libraryProps,\n // Passed through to the element, never read during render.\n // oxlint-disable-next-line react/refs\n ref: mergeRenderRef(ref, render),\n });\n\n return <MeterContext value={{ id, state }}>{element}</MeterContext>;\n}\n\nMeterRoot.displayName = \"MeterRoot\";\n"],"mappings":";;;;;;;;;;;;;;;AA2FA,SAAgB,UAAU,EACxB,OACA,MAAM,GACN,MAAM,KACN,KACA,MACA,SACA,QACA,QACA,kBACA,WACA,OACA,UACA,QACA,KACA,GAAG,QACc;CACjB,MAAM,KAAK,MAAM;CAEjB,IAAI,QAAQ;CACZ,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG;EAC3B,SACE,yBAAyB,SACzB,4BAA4B,MAAM,2DACpC;EACA,QAAQ;CACV;CACA,IAAI,aAAa,KAAK,GAAG,GACvB,SACE,yBAAyB,IAAI,GAAG,OAChC,wBAAwB,IAAI,kCAAkC,IAAI,oCAEpE;CAGF,MAAM,UAAU,MAAM,OAAO,KAAK,GAAG;CACrC,MAAM,SAAS,mBAAmB,KAAK,KAAK,KAAK,MAAM,OAAO;CAC9D,MAAM,iBAAiB,iBAAiB,SAAS,KAAK,KAAK,QAAQ,MAAM;CACzE,MAAM,OAAmB;EACvB,OAAO;EACP;EACA;EACA,GAAG;EACH,YAAY,WAAW,SAAS,KAAK,GAAG;EACxC;EACA,WAAW;EACX,QAAQ,YAAY,SAAS,OAAO,KAAK,OAAO,MAAM,OAAO,OAAO;CACtE;CACA,MAAM,YACJ,qBAAqB,KAAA,IAAY,iBAAkB,iBAAiB,SAAS,IAAI,KAAK;CACxF,MAAM,QAAoB,cAAc,KAAK,YAAY,OAAO;EAAE,GAAG;EAAM;CAAU;CAErF,MAAM,YAAY;EAChB,iBAAiB,GAAG,MAAM,WAAW;EACrC,eAAe,GAAG,WAAW,OAAO,KAAK,KAAK,GAAG,EAAE;EACnD,gBAAgB,GAAG,WAAW,OAAO,MAAM,KAAK,GAAG,EAAE;EACrD,mBAAmB,GAAG,WAAW,OAAO,SAAS,KAAK,GAAG,EAAE;CAC7D;CAEA,MAAM,eAAuE;EAC3E,MAAM;EACN,iBAAiB;EACjB,iBAAiB;EACjB,iBAAiB;EACjB,kBAAkB,aAAa,KAAA;EAC/B,mBAAmB,GAAG,GAAG;EACzB,eAAe,MAAM;CACvB;CAEA,MAAM,UAAU,cAAwD;EACtE,gBAAgB;EAChB;EACA;EACA;EAEA,QAAQ,OAAO;GAAE,GAAI;GAA6B,GAAG,kBAAkB,OAAO,CAAC;EAAE;EACjF;EACA,OAAO;EACP;EAGA,KAAK,eAAe,KAAK,MAAM;CACjC,CAAC;CAED,OAAO,oBAAC,cAAD;EAAc,OAAO;GAAE;GAAI;EAAM;EAAI,UAAA;CAAsB,CAAA;AACpE;AAEA,UAAU,cAAc"}
@@ -0,0 +1,19 @@
1
+ import { RenderProp, StateValue } from "../internal/types.mjs";
2
+ import { MeterState } from "./meter-root.mjs";
3
+ import { CSSProperties, ComponentPropsWithRef, ReactNode } from "react";
4
+ //#region src/meter/meter-track.d.ts
5
+ export interface MeterTrackProps extends Omit<ComponentPropsWithRef<"div">, "className" | "style" | "children"> {
6
+ className?: StateValue<string | undefined, MeterState>;
7
+ style?: StateValue<CSSProperties | undefined, MeterState>;
8
+ children?: StateValue<ReactNode, MeterState>;
9
+ render?: RenderProp<ComponentPropsWithRef<"div">, MeterState>;
10
+ }
11
+ /**
12
+ * `Meter.Track`: the rail. It renders nothing but the state's data attributes. Owned keys: `data-region`.
13
+ */
14
+ export declare function MeterTrack({ className, style, children, render, ...rest }: MeterTrackProps): ReactNode;
15
+ export declare namespace MeterTrack {
16
+ var displayName: string;
17
+ }
18
+ //#endregion
19
+ //# sourceMappingURL=meter-track.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-track.d.mts","names":[],"sources":["../../src/meter/meter-track.tsx"],"mappings":";;;;iBAOiB,wBAAwB,KACvC;EAGA,YAAY,+BAA+B;EAC3C,QAAQ,WAAW,2BAA2B;EAC9C,WAAW,WAAW,WAAW;EACjC,SAAS,WAAW,8BAA8B;;;;;wBAMpC,aAAa,WAAW,OAAO,UAAU,WAAW,QAAQ,kBAAe;yBAA3E"}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { useRender } from "../internal/use-render.mjs";
3
+ import { useMeterContext } from "./meter-context.mjs";
4
+ //#region src/meter/meter-track.tsx
5
+ /**
6
+ * `Meter.Track`: the rail. It renders nothing but the state's data attributes. Owned keys: `data-region`.
7
+ */
8
+ function MeterTrack({ className, style, children, render, ...rest }) {
9
+ const { state } = useMeterContext("Meter.Track");
10
+ return useRender({
11
+ defaultElement: "div",
12
+ render,
13
+ state,
14
+ className,
15
+ style,
16
+ children,
17
+ props: rest,
18
+ libraryProps: { "data-region": state.region }
19
+ });
20
+ }
21
+ MeterTrack.displayName = "MeterTrack";
22
+ //#endregion
23
+ export { MeterTrack };
24
+
25
+ //# sourceMappingURL=meter-track.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-track.mjs","names":[],"sources":["../../src/meter/meter-track.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 MeterTrackProps extends Omit<\n ComponentPropsWithRef<\"div\">,\n \"className\" | \"style\" | \"children\"\n> {\n className?: StateValue<string | undefined, MeterState>;\n style?: StateValue<CSSProperties | undefined, MeterState>;\n children?: StateValue<ReactNode, MeterState>;\n render?: RenderProp<ComponentPropsWithRef<\"div\">, MeterState>;\n}\n\n/**\n * `Meter.Track`: the rail. It renders nothing but the state's data attributes. Owned keys: `data-region`.\n */\nexport function MeterTrack({ className, style, children, render, ...rest }: MeterTrackProps) {\n const { state } = useMeterContext(\"Meter.Track\");\n return useRender<ComponentPropsWithRef<\"div\">, MeterState>({\n defaultElement: \"div\",\n render,\n state,\n className,\n style,\n children,\n props: rest,\n libraryProps: {\n \"data-region\": state.region,\n },\n });\n}\n\nMeterTrack.displayName = \"MeterTrack\";\n"],"mappings":";;;;;;;AAoBA,SAAgB,WAAW,EAAE,WAAW,OAAO,UAAU,QAAQ,GAAG,QAAyB;CAC3F,MAAM,EAAE,UAAU,gBAAgB,aAAa;CAC/C,OAAO,UAAoD;EACzD,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA,OAAO;EACP,cAAc,EACZ,eAAe,MAAM,OACvB;CACF,CAAC;AACH;AAEA,WAAW,cAAc"}
@@ -0,0 +1,20 @@
1
+ import { RenderProp, StateValue } from "../internal/types.mjs";
2
+ import { MeterState } from "./meter-root.mjs";
3
+ import { CSSProperties, ComponentPropsWithRef, ReactNode } from "react";
4
+ //#region src/meter/meter-value.d.ts
5
+ export interface MeterValueProps extends Omit<ComponentPropsWithRef<"span">, "className" | "style" | "children"> {
6
+ className?: StateValue<string | undefined, MeterState>;
7
+ style?: StateValue<CSSProperties | undefined, MeterState>;
8
+ /** Default: `state.formattedValue`. */
9
+ children?: StateValue<ReactNode, MeterState>;
10
+ render?: RenderProp<ComponentPropsWithRef<"span">, MeterState>;
11
+ }
12
+ /**
13
+ * `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`.
14
+ */
15
+ export declare function MeterValue({ className, style, children, render, ...rest }: MeterValueProps): ReactNode;
16
+ export declare namespace MeterValue {
17
+ var displayName: string;
18
+ }
19
+ //#endregion
20
+ //# sourceMappingURL=meter-value.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter-value.d.mts","names":[],"sources":["../../src/meter/meter-value.tsx"],"mappings":";;;;iBAOiB,wBAAwB,KACvC;EAGA,YAAY,+BAA+B;EAC3C,QAAQ,WAAW,2BAA2B;;EAE9C,WAAW,WAAW,WAAW;EACjC,SAAS,WAAW,+BAA+B;;;;;wBAMrC,aAAa,WAAW,OAAO,UAAU,WAAW,QAAQ,kBAAe;yBAA3E"}
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { useRender } from "../internal/use-render.mjs";
3
+ import { useMeterContext } from "./meter-context.mjs";
4
+ //#region src/meter/meter-value.tsx
5
+ /**
6
+ * `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`.
7
+ */
8
+ function MeterValue({ className, style, children, render, ...rest }) {
9
+ const { state } = useMeterContext("Meter.Value");
10
+ const props = {
11
+ ...rest,
12
+ "aria-hidden": rest["aria-hidden"] ?? true
13
+ };
14
+ return useRender({
15
+ defaultElement: "span",
16
+ render,
17
+ state,
18
+ className,
19
+ style,
20
+ children: children ?? state.formattedValue,
21
+ props,
22
+ libraryProps: { "data-region": state.region }
23
+ });
24
+ }
25
+ MeterValue.displayName = "MeterValue";
26
+ //#endregion
27
+ export { MeterValue };
28
+
29
+ //# sourceMappingURL=meter-value.mjs.map