@octanejs/aria 0.0.1 → 0.0.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 (500) hide show
  1. package/package.json +6 -3
  2. package/src/breadcrumbs/useBreadcrumbItem.ts +95 -0
  3. package/src/breadcrumbs/useBreadcrumbs.ts +51 -0
  4. package/src/button/useButton.ts +273 -0
  5. package/src/button/useToggleButton.ts +131 -0
  6. package/src/button/useToggleButtonGroup.ts +131 -0
  7. package/src/checkbox/useCheckbox.ts +114 -0
  8. package/src/checkbox/useCheckboxGroup.ts +107 -0
  9. package/src/checkbox/useCheckboxGroupItem.ts +132 -0
  10. package/src/checkbox/utils.ts +15 -0
  11. package/src/combobox/useComboBox.ts +602 -0
  12. package/src/dialog/useDialog.ts +147 -0
  13. package/src/disclosure/useDisclosure.ts +180 -0
  14. package/src/focus/FocusRing.ts +69 -0
  15. package/src/focus/FocusScope.ts +1205 -0
  16. package/src/focus/useFocusRing.ts +125 -0
  17. package/src/focus/useHasTabbableChild.ts +82 -0
  18. package/src/focus/virtualFocus.ts +38 -0
  19. package/src/form/useFormValidation.ts +205 -0
  20. package/src/grid/useGridSelectionAnnouncement.ts +177 -0
  21. package/src/grid/useGridSelectionCheckbox.ts +86 -0
  22. package/src/grid/useHighlightSelectionDescription.ts +81 -0
  23. package/src/gridlist/useGridList.ts +236 -0
  24. package/src/gridlist/useGridListItem.ts +512 -0
  25. package/src/gridlist/useGridListSection.ts +78 -0
  26. package/src/gridlist/useGridListSelectionCheckbox.ts +47 -0
  27. package/src/gridlist/utils.ts +36 -0
  28. package/src/i18n/I18nProvider.ts +97 -0
  29. package/src/i18n/server.ts +115 -0
  30. package/src/i18n/useCollator.ts +42 -0
  31. package/src/i18n/useDateFormatter.ts +64 -0
  32. package/src/i18n/useDefaultLocale.ts +93 -0
  33. package/src/i18n/useFilter.ts +107 -0
  34. package/src/i18n/useListFormatter.ts +33 -0
  35. package/src/i18n/useLocalizedStringFormatter.ts +90 -0
  36. package/src/i18n/useNumberFormatter.ts +33 -0
  37. package/src/i18n/utils.ts +67 -0
  38. package/src/index.ts +268 -0
  39. package/src/intl/breadcrumbs/ar-AE.json +3 -0
  40. package/src/intl/breadcrumbs/bg-BG.json +3 -0
  41. package/src/intl/breadcrumbs/cs-CZ.json +3 -0
  42. package/src/intl/breadcrumbs/da-DK.json +3 -0
  43. package/src/intl/breadcrumbs/de-DE.json +3 -0
  44. package/src/intl/breadcrumbs/el-GR.json +3 -0
  45. package/src/intl/breadcrumbs/en-US.json +3 -0
  46. package/src/intl/breadcrumbs/es-ES.json +3 -0
  47. package/src/intl/breadcrumbs/et-EE.json +3 -0
  48. package/src/intl/breadcrumbs/fi-FI.json +3 -0
  49. package/src/intl/breadcrumbs/fr-FR.json +3 -0
  50. package/src/intl/breadcrumbs/he-IL.json +3 -0
  51. package/src/intl/breadcrumbs/hr-HR.json +3 -0
  52. package/src/intl/breadcrumbs/hu-HU.json +3 -0
  53. package/src/intl/breadcrumbs/index.ts +75 -0
  54. package/src/intl/breadcrumbs/it-IT.json +3 -0
  55. package/src/intl/breadcrumbs/ja-JP.json +3 -0
  56. package/src/intl/breadcrumbs/ko-KR.json +3 -0
  57. package/src/intl/breadcrumbs/lt-LT.json +3 -0
  58. package/src/intl/breadcrumbs/lv-LV.json +3 -0
  59. package/src/intl/breadcrumbs/nb-NO.json +3 -0
  60. package/src/intl/breadcrumbs/nl-NL.json +3 -0
  61. package/src/intl/breadcrumbs/pl-PL.json +3 -0
  62. package/src/intl/breadcrumbs/pt-BR.json +3 -0
  63. package/src/intl/breadcrumbs/pt-PT.json +3 -0
  64. package/src/intl/breadcrumbs/ro-RO.json +3 -0
  65. package/src/intl/breadcrumbs/ru-RU.json +3 -0
  66. package/src/intl/breadcrumbs/sk-SK.json +3 -0
  67. package/src/intl/breadcrumbs/sl-SI.json +3 -0
  68. package/src/intl/breadcrumbs/sr-SP.json +3 -0
  69. package/src/intl/breadcrumbs/sv-SE.json +3 -0
  70. package/src/intl/breadcrumbs/tr-TR.json +3 -0
  71. package/src/intl/breadcrumbs/uk-UA.json +3 -0
  72. package/src/intl/breadcrumbs/zh-CN.json +3 -0
  73. package/src/intl/breadcrumbs/zh-TW.json +3 -0
  74. package/src/intl/combobox/ar-AE.json +7 -0
  75. package/src/intl/combobox/bg-BG.json +7 -0
  76. package/src/intl/combobox/cs-CZ.json +7 -0
  77. package/src/intl/combobox/da-DK.json +7 -0
  78. package/src/intl/combobox/de-DE.json +7 -0
  79. package/src/intl/combobox/el-GR.json +7 -0
  80. package/src/intl/combobox/en-US.json +7 -0
  81. package/src/intl/combobox/es-ES.json +7 -0
  82. package/src/intl/combobox/et-EE.json +7 -0
  83. package/src/intl/combobox/fi-FI.json +7 -0
  84. package/src/intl/combobox/fr-FR.json +7 -0
  85. package/src/intl/combobox/he-IL.json +7 -0
  86. package/src/intl/combobox/hr-HR.json +7 -0
  87. package/src/intl/combobox/hu-HU.json +7 -0
  88. package/src/intl/combobox/index.ts +75 -0
  89. package/src/intl/combobox/it-IT.json +7 -0
  90. package/src/intl/combobox/ja-JP.json +7 -0
  91. package/src/intl/combobox/ko-KR.json +7 -0
  92. package/src/intl/combobox/lt-LT.json +7 -0
  93. package/src/intl/combobox/lv-LV.json +7 -0
  94. package/src/intl/combobox/nb-NO.json +7 -0
  95. package/src/intl/combobox/nl-NL.json +7 -0
  96. package/src/intl/combobox/pl-PL.json +7 -0
  97. package/src/intl/combobox/pt-BR.json +7 -0
  98. package/src/intl/combobox/pt-PT.json +7 -0
  99. package/src/intl/combobox/ro-RO.json +7 -0
  100. package/src/intl/combobox/ru-RU.json +7 -0
  101. package/src/intl/combobox/sk-SK.json +7 -0
  102. package/src/intl/combobox/sl-SI.json +7 -0
  103. package/src/intl/combobox/sr-SP.json +7 -0
  104. package/src/intl/combobox/sv-SE.json +7 -0
  105. package/src/intl/combobox/tr-TR.json +7 -0
  106. package/src/intl/combobox/uk-UA.json +7 -0
  107. package/src/intl/combobox/zh-CN.json +7 -0
  108. package/src/intl/combobox/zh-TW.json +7 -0
  109. package/src/intl/grid/ar-AE.json +8 -0
  110. package/src/intl/grid/bg-BG.json +8 -0
  111. package/src/intl/grid/cs-CZ.json +8 -0
  112. package/src/intl/grid/da-DK.json +8 -0
  113. package/src/intl/grid/de-DE.json +8 -0
  114. package/src/intl/grid/el-GR.json +8 -0
  115. package/src/intl/grid/en-US.json +8 -0
  116. package/src/intl/grid/es-ES.json +8 -0
  117. package/src/intl/grid/et-EE.json +8 -0
  118. package/src/intl/grid/fi-FI.json +8 -0
  119. package/src/intl/grid/fr-FR.json +8 -0
  120. package/src/intl/grid/he-IL.json +8 -0
  121. package/src/intl/grid/hr-HR.json +8 -0
  122. package/src/intl/grid/hu-HU.json +8 -0
  123. package/src/intl/grid/index.ts +75 -0
  124. package/src/intl/grid/it-IT.json +8 -0
  125. package/src/intl/grid/ja-JP.json +8 -0
  126. package/src/intl/grid/ko-KR.json +8 -0
  127. package/src/intl/grid/lt-LT.json +8 -0
  128. package/src/intl/grid/lv-LV.json +8 -0
  129. package/src/intl/grid/nb-NO.json +8 -0
  130. package/src/intl/grid/nl-NL.json +8 -0
  131. package/src/intl/grid/pl-PL.json +8 -0
  132. package/src/intl/grid/pt-BR.json +8 -0
  133. package/src/intl/grid/pt-PT.json +8 -0
  134. package/src/intl/grid/ro-RO.json +8 -0
  135. package/src/intl/grid/ru-RU.json +8 -0
  136. package/src/intl/grid/sk-SK.json +8 -0
  137. package/src/intl/grid/sl-SI.json +8 -0
  138. package/src/intl/grid/sr-SP.json +8 -0
  139. package/src/intl/grid/sv-SE.json +8 -0
  140. package/src/intl/grid/tr-TR.json +8 -0
  141. package/src/intl/grid/uk-UA.json +8 -0
  142. package/src/intl/grid/zh-CN.json +8 -0
  143. package/src/intl/grid/zh-TW.json +8 -0
  144. package/src/intl/gridlist/ar-AE.json +4 -0
  145. package/src/intl/gridlist/bg-BG.json +4 -0
  146. package/src/intl/gridlist/cs-CZ.json +4 -0
  147. package/src/intl/gridlist/da-DK.json +4 -0
  148. package/src/intl/gridlist/de-DE.json +4 -0
  149. package/src/intl/gridlist/el-GR.json +4 -0
  150. package/src/intl/gridlist/en-US.json +4 -0
  151. package/src/intl/gridlist/es-ES.json +4 -0
  152. package/src/intl/gridlist/et-EE.json +4 -0
  153. package/src/intl/gridlist/fi-FI.json +4 -0
  154. package/src/intl/gridlist/fr-FR.json +4 -0
  155. package/src/intl/gridlist/he-IL.json +4 -0
  156. package/src/intl/gridlist/hr-HR.json +4 -0
  157. package/src/intl/gridlist/hu-HU.json +4 -0
  158. package/src/intl/gridlist/index.ts +75 -0
  159. package/src/intl/gridlist/it-IT.json +4 -0
  160. package/src/intl/gridlist/ja-JP.json +4 -0
  161. package/src/intl/gridlist/ko-KR.json +4 -0
  162. package/src/intl/gridlist/lt-LT.json +4 -0
  163. package/src/intl/gridlist/lv-LV.json +4 -0
  164. package/src/intl/gridlist/nb-NO.json +4 -0
  165. package/src/intl/gridlist/nl-NL.json +4 -0
  166. package/src/intl/gridlist/pl-PL.json +4 -0
  167. package/src/intl/gridlist/pt-BR.json +4 -0
  168. package/src/intl/gridlist/pt-PT.json +4 -0
  169. package/src/intl/gridlist/ro-RO.json +4 -0
  170. package/src/intl/gridlist/ru-RU.json +4 -0
  171. package/src/intl/gridlist/sk-SK.json +4 -0
  172. package/src/intl/gridlist/sl-SI.json +4 -0
  173. package/src/intl/gridlist/sr-SP.json +4 -0
  174. package/src/intl/gridlist/sv-SE.json +4 -0
  175. package/src/intl/gridlist/tr-TR.json +4 -0
  176. package/src/intl/gridlist/uk-UA.json +4 -0
  177. package/src/intl/gridlist/zh-CN.json +4 -0
  178. package/src/intl/gridlist/zh-TW.json +4 -0
  179. package/src/intl/menu/ar-AE.json +3 -0
  180. package/src/intl/menu/bg-BG.json +3 -0
  181. package/src/intl/menu/cs-CZ.json +3 -0
  182. package/src/intl/menu/da-DK.json +3 -0
  183. package/src/intl/menu/de-DE.json +3 -0
  184. package/src/intl/menu/el-GR.json +3 -0
  185. package/src/intl/menu/en-US.json +3 -0
  186. package/src/intl/menu/es-ES.json +3 -0
  187. package/src/intl/menu/et-EE.json +3 -0
  188. package/src/intl/menu/fi-FI.json +3 -0
  189. package/src/intl/menu/fr-FR.json +3 -0
  190. package/src/intl/menu/he-IL.json +3 -0
  191. package/src/intl/menu/hr-HR.json +3 -0
  192. package/src/intl/menu/hu-HU.json +3 -0
  193. package/src/intl/menu/index.ts +75 -0
  194. package/src/intl/menu/it-IT.json +3 -0
  195. package/src/intl/menu/ja-JP.json +3 -0
  196. package/src/intl/menu/ko-KR.json +3 -0
  197. package/src/intl/menu/lt-LT.json +3 -0
  198. package/src/intl/menu/lv-LV.json +3 -0
  199. package/src/intl/menu/nb-NO.json +3 -0
  200. package/src/intl/menu/nl-NL.json +3 -0
  201. package/src/intl/menu/pl-PL.json +3 -0
  202. package/src/intl/menu/pt-BR.json +3 -0
  203. package/src/intl/menu/pt-PT.json +3 -0
  204. package/src/intl/menu/ro-RO.json +3 -0
  205. package/src/intl/menu/ru-RU.json +3 -0
  206. package/src/intl/menu/sk-SK.json +3 -0
  207. package/src/intl/menu/sl-SI.json +3 -0
  208. package/src/intl/menu/sr-SP.json +3 -0
  209. package/src/intl/menu/sv-SE.json +3 -0
  210. package/src/intl/menu/tr-TR.json +3 -0
  211. package/src/intl/menu/uk-UA.json +3 -0
  212. package/src/intl/menu/zh-CN.json +3 -0
  213. package/src/intl/menu/zh-TW.json +3 -0
  214. package/src/intl/numberfield/ar-AE.json +5 -0
  215. package/src/intl/numberfield/bg-BG.json +5 -0
  216. package/src/intl/numberfield/cs-CZ.json +5 -0
  217. package/src/intl/numberfield/da-DK.json +5 -0
  218. package/src/intl/numberfield/de-DE.json +5 -0
  219. package/src/intl/numberfield/el-GR.json +5 -0
  220. package/src/intl/numberfield/en-US.json +5 -0
  221. package/src/intl/numberfield/es-ES.json +5 -0
  222. package/src/intl/numberfield/et-EE.json +5 -0
  223. package/src/intl/numberfield/fi-FI.json +5 -0
  224. package/src/intl/numberfield/fr-FR.json +5 -0
  225. package/src/intl/numberfield/he-IL.json +5 -0
  226. package/src/intl/numberfield/hr-HR.json +5 -0
  227. package/src/intl/numberfield/hu-HU.json +5 -0
  228. package/src/intl/numberfield/index.ts +75 -0
  229. package/src/intl/numberfield/it-IT.json +5 -0
  230. package/src/intl/numberfield/ja-JP.json +5 -0
  231. package/src/intl/numberfield/ko-KR.json +5 -0
  232. package/src/intl/numberfield/lt-LT.json +5 -0
  233. package/src/intl/numberfield/lv-LV.json +5 -0
  234. package/src/intl/numberfield/nb-NO.json +5 -0
  235. package/src/intl/numberfield/nl-NL.json +5 -0
  236. package/src/intl/numberfield/pl-PL.json +5 -0
  237. package/src/intl/numberfield/pt-BR.json +5 -0
  238. package/src/intl/numberfield/pt-PT.json +5 -0
  239. package/src/intl/numberfield/ro-RO.json +5 -0
  240. package/src/intl/numberfield/ru-RU.json +5 -0
  241. package/src/intl/numberfield/sk-SK.json +5 -0
  242. package/src/intl/numberfield/sl-SI.json +5 -0
  243. package/src/intl/numberfield/sr-SP.json +5 -0
  244. package/src/intl/numberfield/sv-SE.json +5 -0
  245. package/src/intl/numberfield/tr-TR.json +5 -0
  246. package/src/intl/numberfield/uk-UA.json +5 -0
  247. package/src/intl/numberfield/zh-CN.json +5 -0
  248. package/src/intl/numberfield/zh-TW.json +5 -0
  249. package/src/intl/overlays/ar-AE.json +3 -0
  250. package/src/intl/overlays/bg-BG.json +3 -0
  251. package/src/intl/overlays/cs-CZ.json +3 -0
  252. package/src/intl/overlays/da-DK.json +3 -0
  253. package/src/intl/overlays/de-DE.json +3 -0
  254. package/src/intl/overlays/el-GR.json +3 -0
  255. package/src/intl/overlays/en-US.json +3 -0
  256. package/src/intl/overlays/es-ES.json +3 -0
  257. package/src/intl/overlays/et-EE.json +3 -0
  258. package/src/intl/overlays/fi-FI.json +3 -0
  259. package/src/intl/overlays/fr-FR.json +3 -0
  260. package/src/intl/overlays/he-IL.json +3 -0
  261. package/src/intl/overlays/hr-HR.json +3 -0
  262. package/src/intl/overlays/hu-HU.json +3 -0
  263. package/src/intl/overlays/index.ts +75 -0
  264. package/src/intl/overlays/it-IT.json +3 -0
  265. package/src/intl/overlays/ja-JP.json +3 -0
  266. package/src/intl/overlays/ko-KR.json +3 -0
  267. package/src/intl/overlays/lt-LT.json +3 -0
  268. package/src/intl/overlays/lv-LV.json +3 -0
  269. package/src/intl/overlays/nb-NO.json +3 -0
  270. package/src/intl/overlays/nl-NL.json +3 -0
  271. package/src/intl/overlays/pl-PL.json +3 -0
  272. package/src/intl/overlays/pt-BR.json +3 -0
  273. package/src/intl/overlays/pt-PT.json +3 -0
  274. package/src/intl/overlays/ro-RO.json +3 -0
  275. package/src/intl/overlays/ru-RU.json +3 -0
  276. package/src/intl/overlays/sk-SK.json +3 -0
  277. package/src/intl/overlays/sl-SI.json +3 -0
  278. package/src/intl/overlays/sr-SP.json +3 -0
  279. package/src/intl/overlays/sv-SE.json +3 -0
  280. package/src/intl/overlays/tr-TR.json +3 -0
  281. package/src/intl/overlays/uk-UA.json +3 -0
  282. package/src/intl/overlays/zh-CN.json +3 -0
  283. package/src/intl/overlays/zh-TW.json +3 -0
  284. package/src/intl/searchfield/ar-AE.json +3 -0
  285. package/src/intl/searchfield/bg-BG.json +3 -0
  286. package/src/intl/searchfield/cs-CZ.json +3 -0
  287. package/src/intl/searchfield/da-DK.json +3 -0
  288. package/src/intl/searchfield/de-DE.json +3 -0
  289. package/src/intl/searchfield/el-GR.json +3 -0
  290. package/src/intl/searchfield/en-US.json +3 -0
  291. package/src/intl/searchfield/es-ES.json +3 -0
  292. package/src/intl/searchfield/et-EE.json +3 -0
  293. package/src/intl/searchfield/fi-FI.json +3 -0
  294. package/src/intl/searchfield/fr-FR.json +3 -0
  295. package/src/intl/searchfield/he-IL.json +3 -0
  296. package/src/intl/searchfield/hr-HR.json +3 -0
  297. package/src/intl/searchfield/hu-HU.json +3 -0
  298. package/src/intl/searchfield/index.ts +75 -0
  299. package/src/intl/searchfield/it-IT.json +3 -0
  300. package/src/intl/searchfield/ja-JP.json +3 -0
  301. package/src/intl/searchfield/ko-KR.json +3 -0
  302. package/src/intl/searchfield/lt-LT.json +3 -0
  303. package/src/intl/searchfield/lv-LV.json +3 -0
  304. package/src/intl/searchfield/nb-NO.json +3 -0
  305. package/src/intl/searchfield/nl-NL.json +3 -0
  306. package/src/intl/searchfield/pl-PL.json +3 -0
  307. package/src/intl/searchfield/pt-BR.json +3 -0
  308. package/src/intl/searchfield/pt-PT.json +3 -0
  309. package/src/intl/searchfield/ro-RO.json +3 -0
  310. package/src/intl/searchfield/ru-RU.json +3 -0
  311. package/src/intl/searchfield/sk-SK.json +3 -0
  312. package/src/intl/searchfield/sl-SI.json +3 -0
  313. package/src/intl/searchfield/sr-SP.json +3 -0
  314. package/src/intl/searchfield/sv-SE.json +3 -0
  315. package/src/intl/searchfield/tr-TR.json +3 -0
  316. package/src/intl/searchfield/uk-UA.json +3 -0
  317. package/src/intl/searchfield/zh-CN.json +3 -0
  318. package/src/intl/searchfield/zh-TW.json +3 -0
  319. package/src/intl/spinbutton/ar-AE.json +3 -0
  320. package/src/intl/spinbutton/bg-BG.json +3 -0
  321. package/src/intl/spinbutton/cs-CZ.json +3 -0
  322. package/src/intl/spinbutton/da-DK.json +3 -0
  323. package/src/intl/spinbutton/de-DE.json +3 -0
  324. package/src/intl/spinbutton/el-GR.json +3 -0
  325. package/src/intl/spinbutton/en-US.json +3 -0
  326. package/src/intl/spinbutton/es-ES.json +3 -0
  327. package/src/intl/spinbutton/et-EE.json +3 -0
  328. package/src/intl/spinbutton/fi-FI.json +3 -0
  329. package/src/intl/spinbutton/fr-FR.json +3 -0
  330. package/src/intl/spinbutton/he-IL.json +3 -0
  331. package/src/intl/spinbutton/hr-HR.json +3 -0
  332. package/src/intl/spinbutton/hu-HU.json +3 -0
  333. package/src/intl/spinbutton/index.ts +75 -0
  334. package/src/intl/spinbutton/it-IT.json +3 -0
  335. package/src/intl/spinbutton/ja-JP.json +3 -0
  336. package/src/intl/spinbutton/ko-KR.json +3 -0
  337. package/src/intl/spinbutton/lt-LT.json +3 -0
  338. package/src/intl/spinbutton/lv-LV.json +3 -0
  339. package/src/intl/spinbutton/nb-NO.json +3 -0
  340. package/src/intl/spinbutton/nl-NL.json +3 -0
  341. package/src/intl/spinbutton/pl-PL.json +3 -0
  342. package/src/intl/spinbutton/pt-BR.json +3 -0
  343. package/src/intl/spinbutton/pt-PT.json +3 -0
  344. package/src/intl/spinbutton/ro-RO.json +3 -0
  345. package/src/intl/spinbutton/ru-RU.json +3 -0
  346. package/src/intl/spinbutton/sk-SK.json +3 -0
  347. package/src/intl/spinbutton/sl-SI.json +3 -0
  348. package/src/intl/spinbutton/sr-SP.json +3 -0
  349. package/src/intl/spinbutton/sv-SE.json +3 -0
  350. package/src/intl/spinbutton/tr-TR.json +3 -0
  351. package/src/intl/spinbutton/uk-UA.json +3 -0
  352. package/src/intl/spinbutton/zh-CN.json +3 -0
  353. package/src/intl/spinbutton/zh-TW.json +3 -0
  354. package/src/intl/tag/ar-AE.json +4 -0
  355. package/src/intl/tag/bg-BG.json +4 -0
  356. package/src/intl/tag/cs-CZ.json +4 -0
  357. package/src/intl/tag/da-DK.json +4 -0
  358. package/src/intl/tag/de-DE.json +4 -0
  359. package/src/intl/tag/el-GR.json +4 -0
  360. package/src/intl/tag/en-US.json +4 -0
  361. package/src/intl/tag/es-ES.json +4 -0
  362. package/src/intl/tag/et-EE.json +4 -0
  363. package/src/intl/tag/fi-FI.json +4 -0
  364. package/src/intl/tag/fr-FR.json +4 -0
  365. package/src/intl/tag/he-IL.json +4 -0
  366. package/src/intl/tag/hr-HR.json +4 -0
  367. package/src/intl/tag/hu-HU.json +4 -0
  368. package/src/intl/tag/index.ts +75 -0
  369. package/src/intl/tag/it-IT.json +4 -0
  370. package/src/intl/tag/ja-JP.json +4 -0
  371. package/src/intl/tag/ko-KR.json +4 -0
  372. package/src/intl/tag/lt-LT.json +4 -0
  373. package/src/intl/tag/lv-LV.json +4 -0
  374. package/src/intl/tag/nb-NO.json +4 -0
  375. package/src/intl/tag/nl-NL.json +4 -0
  376. package/src/intl/tag/pl-PL.json +4 -0
  377. package/src/intl/tag/pt-BR.json +4 -0
  378. package/src/intl/tag/pt-PT.json +4 -0
  379. package/src/intl/tag/ro-RO.json +4 -0
  380. package/src/intl/tag/ru-RU.json +4 -0
  381. package/src/intl/tag/sk-SK.json +4 -0
  382. package/src/intl/tag/sl-SI.json +4 -0
  383. package/src/intl/tag/sr-SP.json +4 -0
  384. package/src/intl/tag/sv-SE.json +4 -0
  385. package/src/intl/tag/tr-TR.json +4 -0
  386. package/src/intl/tag/uk-UA.json +4 -0
  387. package/src/intl/tag/zh-CN.json +4 -0
  388. package/src/intl/tag/zh-TW.json +4 -0
  389. package/src/label/useField.ts +67 -0
  390. package/src/label/useLabel.ts +78 -0
  391. package/src/link/useLink.ts +108 -0
  392. package/src/listbox/useListBox.ts +224 -0
  393. package/src/listbox/useListBoxSection.ts +74 -0
  394. package/src/listbox/useOption.ts +212 -0
  395. package/src/listbox/utils.ts +38 -0
  396. package/src/live-announcer/LiveAnnouncer.ts +172 -0
  397. package/src/menu/useMenu.ts +139 -0
  398. package/src/menu/useMenuItem.ts +453 -0
  399. package/src/menu/useMenuSection.ts +70 -0
  400. package/src/menu/useMenuTrigger.ts +189 -0
  401. package/src/menu/useSafelyMouseToSubmenu.ts +236 -0
  402. package/src/menu/useSubmenuTrigger.ts +357 -0
  403. package/src/menu/utils.ts +16 -0
  404. package/src/meter/useMeter.ts +43 -0
  405. package/src/numberfield/useNumberField.ts +572 -0
  406. package/src/overlays/DismissButton.ts +50 -0
  407. package/src/overlays/Overlay.ts +106 -0
  408. package/src/overlays/PortalProvider.ts +37 -0
  409. package/src/overlays/ariaHideOutside.ts +299 -0
  410. package/src/overlays/calculatePosition.ts +856 -0
  411. package/src/overlays/useCloseOnScroll.ts +75 -0
  412. package/src/overlays/useModal.ts +224 -0
  413. package/src/overlays/useModalOverlay.ts +103 -0
  414. package/src/overlays/useOverlay.ts +199 -0
  415. package/src/overlays/useOverlayPosition.ts +462 -0
  416. package/src/overlays/useOverlayTrigger.ts +94 -0
  417. package/src/overlays/usePopover.ts +170 -0
  418. package/src/overlays/usePreventScroll.ts +316 -0
  419. package/src/progress/useProgressBar.ts +115 -0
  420. package/src/radio/useRadio.ts +219 -0
  421. package/src/radio/useRadioGroup.ts +184 -0
  422. package/src/radio/utils.ts +15 -0
  423. package/src/searchfield/useSearchField.ts +156 -0
  424. package/src/select/HiddenSelect.ts +261 -0
  425. package/src/select/useSelect.ts +332 -0
  426. package/src/selection/DOMLayoutDelegate.ts +51 -0
  427. package/src/selection/ListKeyboardDelegate.ts +392 -0
  428. package/src/selection/useSelectableCollection.ts +750 -0
  429. package/src/selection/useSelectableItem.ts +499 -0
  430. package/src/selection/useSelectableList.ts +132 -0
  431. package/src/selection/useTypeSelect.ts +192 -0
  432. package/src/selection/utils.ts +50 -0
  433. package/src/separator/useSeparator.ts +41 -0
  434. package/src/slider/useSlider.ts +277 -0
  435. package/src/slider/useSliderThumb.ts +375 -0
  436. package/src/slider/utils.ts +20 -0
  437. package/src/spinbutton/useSpinButton.ts +380 -0
  438. package/src/stately/checkbox/useCheckboxGroupState.ts +177 -0
  439. package/src/stately/collections/CollectionBuilder.ts +332 -0
  440. package/src/stately/collections/Item.ts +78 -0
  441. package/src/stately/collections/Section.ts +52 -0
  442. package/src/stately/collections/getChildNodes.ts +94 -0
  443. package/src/stately/collections/getItemCount.ts +29 -0
  444. package/src/stately/collections/types.ts +20 -0
  445. package/src/stately/collections/useCollection.ts +54 -0
  446. package/src/stately/combobox/useComboBoxState.ts +763 -0
  447. package/src/stately/disclosure/useDisclosureGroupState.ts +108 -0
  448. package/src/stately/disclosure/useDisclosureState.ts +84 -0
  449. package/src/stately/form/useFormValidationState.ts +331 -0
  450. package/src/stately/index.ts +111 -0
  451. package/src/stately/list/ListCollection.ts +104 -0
  452. package/src/stately/list/useListState.ts +178 -0
  453. package/src/stately/list/useSingleSelectListState.ts +101 -0
  454. package/src/stately/menu/useMenuTriggerState.ts +120 -0
  455. package/src/stately/menu/useSubmenuTriggerState.ts +116 -0
  456. package/src/stately/numberfield/useNumberFieldState.ts +430 -0
  457. package/src/stately/overlays/useOverlayTriggerState.ts +85 -0
  458. package/src/stately/radio/useRadioGroupState.ts +150 -0
  459. package/src/stately/searchfield/useSearchFieldState.ts +79 -0
  460. package/src/stately/select/useSelectState.ts +322 -0
  461. package/src/stately/selection/Selection.ts +23 -0
  462. package/src/stately/selection/SelectionManager.ts +541 -0
  463. package/src/stately/selection/types.ts +117 -0
  464. package/src/stately/selection/useMultipleSelectionState.ts +178 -0
  465. package/src/stately/slider/useSliderState.ts +458 -0
  466. package/src/stately/tabs/useTabListState.ts +149 -0
  467. package/src/stately/toggle/useToggleGroupState.ts +109 -0
  468. package/src/stately/toggle/useToggleState.ts +100 -0
  469. package/src/stately/tooltip/useTooltipTriggerState.ts +218 -0
  470. package/src/stately/tree/TreeCollection.ts +92 -0
  471. package/src/stately/tree/useTreeState.ts +121 -0
  472. package/src/stately/utils/useControlledState.ts +7 -0
  473. package/src/switch/useSwitch.ts +77 -0
  474. package/src/tabs/TabsKeyboardDelegate.ts +99 -0
  475. package/src/tabs/useTab.ts +117 -0
  476. package/src/tabs/useTabList.ts +105 -0
  477. package/src/tabs/useTabPanel.ts +75 -0
  478. package/src/tabs/utils.ts +32 -0
  479. package/src/tag/useTag.ts +162 -0
  480. package/src/tag/useTagGroup.ts +192 -0
  481. package/src/textfield/useFormattedTextField.ts +203 -0
  482. package/src/textfield/useTextField.ts +248 -0
  483. package/src/toggle/useToggle.ts +265 -0
  484. package/src/toolbar/useToolbar.ts +147 -0
  485. package/src/tooltip/useTooltip.ts +64 -0
  486. package/src/tooltip/useTooltipTrigger.ts +187 -0
  487. package/src/utils/filterDOMProps.ts +121 -0
  488. package/src/utils/getScrollParent.ts +16 -0
  489. package/src/utils/getScrollParents.ts +20 -0
  490. package/src/utils/keyboard.ts +38 -0
  491. package/src/utils/scrollIntoView.ts +178 -0
  492. package/src/utils/useDeepMemo.ts +30 -0
  493. package/src/utils/useFormReset.ts +54 -0
  494. package/src/utils/useId.ts +5 -0
  495. package/src/utils/useLabels.ts +53 -0
  496. package/src/utils/useResizeObserver.ts +70 -0
  497. package/src/utils/useSlot.ts +78 -0
  498. package/src/utils/useUpdateEffect.ts +54 -0
  499. package/src/utils/useUpdateLayoutEffect.ts +58 -0
  500. package/src/visually-hidden/VisuallyHidden.ts +100 -0
@@ -0,0 +1,357 @@
1
+ // Ported from react-aria (source: .react-spectrum/packages/react-aria/src/menu/useSubmenuTrigger.ts).
2
+ // octane adaptations:
3
+ // - Handlers receive NATIVE events: `submenuKeyDown` gets the native KeyboardEvent through
4
+ // the menu's merged onKeyDown chain; `submenuTriggerKeyDown` gets the ported
5
+ // BaseEvent-wrapped KeyboardEvent (it flows through useMenuItem's useKeyboard, which
6
+ // supplies `continuePropagation`).
7
+ // - The popover container types (`AriaPopoverProps` from overlays/usePopover and
8
+ // `OverlayProps` from overlays/Overlay) are NOT yet ported (overlay positioning/modal
9
+ // machinery is out of scope); `SubmenuTriggerAria.popoverProps` is a local structural
10
+ // equivalent of upstream's picked fields.
11
+ // - `SubmenuTriggerState` type from the ported stately menu state.
12
+ // - Public-hook slot threading (splitSlot/subSlot) per the binding convention; explicit
13
+ // dependency arrays are kept verbatim.
14
+ import type { AriaMenuItemProps } from './useMenuItem';
15
+ import type { AriaMenuOptions } from './useMenu';
16
+ import type { BaseEvent } from '../interactions/createEventHandler';
17
+ import type { FocusableElement, FocusStrategy, RefObject } from '@react-types/shared';
18
+ import { focusWithoutScrolling } from '../utils/focusWithoutScrolling';
19
+ import {
20
+ getActiveElement,
21
+ getEventTarget,
22
+ isFocusWithin,
23
+ nodeContains,
24
+ } from '../utils/shadowdom/DOMFunctions';
25
+ import type { PressEvent } from '@react-types/shared';
26
+ import type { SubmenuTriggerState } from '../stately/menu/useSubmenuTriggerState';
27
+ import { useCallback, useRef } from 'octane';
28
+ import { useEvent } from '../utils/useEvent';
29
+ import { useId } from '../utils/useId';
30
+ import { useLayoutEffect } from '../utils/useLayoutEffect';
31
+ import { useLocale } from '../i18n/I18nProvider';
32
+ import { useSafelyMouseToSubmenu } from './useSafelyMouseToSubmenu';
33
+
34
+ import { S, splitSlot, subSlot } from '../internal';
35
+
36
+ export interface AriaSubmenuTriggerProps {
37
+ /**
38
+ * An object representing the submenu trigger menu item. Contains all the relevant information
39
+ * that makes up the menu item.
40
+ *
41
+ * @deprecated
42
+ */
43
+ node?: any;
44
+ /** Whether the submenu trigger is disabled. */
45
+ isDisabled?: boolean;
46
+ /** The type of the contents that the submenu trigger opens. */
47
+ type?: 'dialog' | 'menu';
48
+ /** Ref of the menu that contains the submenu trigger. */
49
+ parentMenuRef: RefObject<HTMLElement | null>;
50
+ /** Ref of the submenu opened by the submenu trigger. */
51
+ submenuRef: RefObject<HTMLElement | null>;
52
+ /**
53
+ * The delay time in milliseconds for the submenu to appear after hovering over the trigger.
54
+ *
55
+ * @default 200
56
+ */
57
+ delay?: number;
58
+ /** Whether the submenu trigger uses virtual focus. */
59
+ shouldUseVirtualFocus?: boolean;
60
+ }
61
+
62
+ interface SubmenuTriggerProps extends Omit<AriaMenuItemProps, 'key' | 'onAction'> {
63
+ /** Whether the submenu trigger is in an expanded state. */
64
+ isOpen: boolean;
65
+ }
66
+
67
+ interface SubmenuProps<T> extends AriaMenuOptions<T> {
68
+ /** The level of the submenu. */
69
+ submenuLevel: number;
70
+ }
71
+
72
+ export interface SubmenuTriggerAria<T> {
73
+ /** Props for the submenu trigger menu item. */
74
+ submenuTriggerProps: SubmenuTriggerProps;
75
+ /** Props for the submenu controlled by the submenu trigger menu item. */
76
+ submenuProps: SubmenuProps<T>;
77
+ /**
78
+ * Props for the submenu's popover container.
79
+ *
80
+ * octane adaptation: a structural equivalent of upstream's
81
+ * `Pick<AriaPopoverProps, 'isNonModal' | 'shouldCloseOnInteractOutside'> &
82
+ * Pick<OverlayProps, 'disableFocusManagement'>` (the overlays area is not yet ported).
83
+ */
84
+ popoverProps: {
85
+ isNonModal?: boolean;
86
+ shouldCloseOnInteractOutside?: (element: Element) => boolean;
87
+ disableFocusManagement?: boolean;
88
+ };
89
+ }
90
+
91
+ /**
92
+ * Provides the behavior and accessibility implementation for a submenu trigger and its associated
93
+ * submenu.
94
+ *
95
+ * @param props - Props for the submenu trigger and refs attach to its submenu and parent menu.
96
+ * @param state - State for the submenu trigger.
97
+ * @param ref - Ref to the submenu trigger element.
98
+ */
99
+ export function useSubmenuTrigger<T>(
100
+ props: AriaSubmenuTriggerProps,
101
+ state: SubmenuTriggerState,
102
+ ref: RefObject<FocusableElement | null>,
103
+ ): SubmenuTriggerAria<T>;
104
+ // Slot-threading form: sibling ported hooks pass their derived sub-slot as the trailing arg.
105
+ export function useSubmenuTrigger<T>(
106
+ props: AriaSubmenuTriggerProps,
107
+ state: SubmenuTriggerState,
108
+ ref: RefObject<FocusableElement | null>,
109
+ slot: symbol | undefined,
110
+ ): SubmenuTriggerAria<T>;
111
+ export function useSubmenuTrigger(...args: any[]): SubmenuTriggerAria<any> {
112
+ const [user, slotArg] = splitSlot(args);
113
+ const slot = slotArg ?? S('useSubmenuTrigger');
114
+ const props = user[0] as AriaSubmenuTriggerProps;
115
+ const state = user[1] as SubmenuTriggerState;
116
+ const ref = user[2] as RefObject<FocusableElement | null>;
117
+
118
+ let {
119
+ parentMenuRef,
120
+ submenuRef,
121
+ type = 'menu',
122
+ isDisabled,
123
+ delay = 200,
124
+ shouldUseVirtualFocus,
125
+ } = props;
126
+ let submenuTriggerId = useId(subSlot(slot, 'triggerId'));
127
+ let overlayId = useId(subSlot(slot, 'overlayId'));
128
+ let { direction } = useLocale(subSlot(slot, 'locale'));
129
+ let openTimeout = useRef<ReturnType<typeof setTimeout> | undefined>(
130
+ undefined,
131
+ subSlot(slot, 'openTimeout'),
132
+ );
133
+ let cancelOpenTimeout = useCallback(
134
+ () => {
135
+ if (openTimeout.current) {
136
+ clearTimeout(openTimeout.current);
137
+ openTimeout.current = undefined;
138
+ }
139
+ },
140
+ [openTimeout],
141
+ subSlot(slot, 'cancelOpen'),
142
+ );
143
+
144
+ let onSubmenuOpen = useCallback(
145
+ (focusStrategy?: FocusStrategy) => {
146
+ cancelOpenTimeout();
147
+ state.open(focusStrategy);
148
+ },
149
+ [state, cancelOpenTimeout],
150
+ subSlot(slot, 'open'),
151
+ );
152
+
153
+ let onSubmenuClose = useCallback(
154
+ () => {
155
+ cancelOpenTimeout();
156
+ state.close();
157
+ },
158
+ [state, cancelOpenTimeout],
159
+ subSlot(slot, 'close'),
160
+ );
161
+
162
+ useLayoutEffect(
163
+ () => {
164
+ return () => {
165
+ cancelOpenTimeout();
166
+ };
167
+ },
168
+ [cancelOpenTimeout],
169
+ subSlot(slot, 'teardown'),
170
+ );
171
+
172
+ let submenuKeyDown = (e: KeyboardEvent) => {
173
+ // If focus is not within the menu, assume virtual focus is being used.
174
+ // This means some other input element is also within the popover, so we shouldn't close the menu.
175
+ if (!isFocusWithin(e.currentTarget as Element)) {
176
+ return;
177
+ }
178
+
179
+ switch (e.key) {
180
+ case 'ArrowLeft':
181
+ if (
182
+ direction === 'ltr' &&
183
+ nodeContains(e.currentTarget as Element, getEventTarget(e) as Element)
184
+ ) {
185
+ e.preventDefault();
186
+ e.stopPropagation();
187
+ onSubmenuClose();
188
+ if (!shouldUseVirtualFocus && ref.current) {
189
+ focusWithoutScrolling(ref.current);
190
+ }
191
+ }
192
+ break;
193
+ case 'ArrowRight':
194
+ if (
195
+ direction === 'rtl' &&
196
+ nodeContains(e.currentTarget as Element, getEventTarget(e) as Element)
197
+ ) {
198
+ e.preventDefault();
199
+ e.stopPropagation();
200
+ onSubmenuClose();
201
+ if (!shouldUseVirtualFocus && ref.current) {
202
+ focusWithoutScrolling(ref.current);
203
+ }
204
+ }
205
+ break;
206
+ case 'Escape':
207
+ // TODO: can remove this when we fix collection event leaks
208
+ if (nodeContains(submenuRef.current, getEventTarget(e) as Element)) {
209
+ e.stopPropagation();
210
+ onSubmenuClose();
211
+ if (!shouldUseVirtualFocus && ref.current) {
212
+ focusWithoutScrolling(ref.current);
213
+ }
214
+ }
215
+ break;
216
+ }
217
+ };
218
+
219
+ let submenuProps = {
220
+ id: overlayId,
221
+ 'aria-labelledby': submenuTriggerId,
222
+ submenuLevel: state.submenuLevel,
223
+ ...(type === 'menu' && {
224
+ onClose: state.closeAll,
225
+ autoFocus: state.focusStrategy ?? undefined,
226
+ onKeyDown: submenuKeyDown,
227
+ }),
228
+ };
229
+
230
+ let submenuTriggerKeyDown = (e: BaseEvent<KeyboardEvent>) => {
231
+ switch (e.key) {
232
+ case 'ArrowRight':
233
+ if (!isDisabled) {
234
+ if (direction === 'ltr') {
235
+ e.preventDefault();
236
+ if (!state.isOpen) {
237
+ onSubmenuOpen('first');
238
+ }
239
+
240
+ if (type === 'menu' && !!submenuRef?.current && getActiveElement() === ref?.current) {
241
+ focusWithoutScrolling(submenuRef.current);
242
+ }
243
+ } else if (state.isOpen) {
244
+ onSubmenuClose();
245
+ } else {
246
+ e.continuePropagation();
247
+ }
248
+ }
249
+
250
+ break;
251
+ case 'ArrowLeft':
252
+ if (!isDisabled) {
253
+ if (direction === 'rtl') {
254
+ e.preventDefault();
255
+ if (!state.isOpen) {
256
+ onSubmenuOpen('first');
257
+ }
258
+
259
+ if (type === 'menu' && !!submenuRef?.current && getActiveElement() === ref?.current) {
260
+ focusWithoutScrolling(submenuRef.current);
261
+ }
262
+ } else if (state.isOpen) {
263
+ onSubmenuClose();
264
+ } else {
265
+ e.continuePropagation();
266
+ }
267
+ }
268
+ break;
269
+ default:
270
+ e.continuePropagation();
271
+ break;
272
+ }
273
+ };
274
+
275
+ let onPressStart = (e: PressEvent) => {
276
+ if (!isDisabled && (e.pointerType === 'virtual' || e.pointerType === 'keyboard')) {
277
+ // If opened with a screen reader or keyboard, auto focus the first submenu item.
278
+ onSubmenuOpen('first');
279
+ }
280
+ };
281
+
282
+ let onPress = (e: PressEvent) => {
283
+ if (!isDisabled && (e.pointerType === 'touch' || e.pointerType === 'mouse')) {
284
+ // For touch or on a desktop device with a small screen open on press up to possible problems with
285
+ // press up happening on the newly opened tray items
286
+ onSubmenuOpen();
287
+ }
288
+ };
289
+
290
+ let onHoverChange = (isHovered: boolean) => {
291
+ if (!isDisabled) {
292
+ if (isHovered && !state.isOpen) {
293
+ if (!openTimeout.current) {
294
+ openTimeout.current = setTimeout(() => {
295
+ onSubmenuOpen();
296
+ }, delay);
297
+ }
298
+ } else if (!isHovered) {
299
+ cancelOpenTimeout();
300
+ }
301
+ }
302
+ };
303
+
304
+ useEvent(
305
+ parentMenuRef,
306
+ 'focusin',
307
+ (e) => {
308
+ // If we detect focus moved to a different item in the same menu that the currently open submenu trigger is in
309
+ // then close the submenu. This is for a case where the user hovers a root menu item when multiple submenus are open
310
+ if (
311
+ state.isOpen &&
312
+ nodeContains(parentMenuRef.current, getEventTarget(e) as HTMLElement) &&
313
+ getEventTarget(e) !== ref.current
314
+ ) {
315
+ onSubmenuClose();
316
+ }
317
+ },
318
+ subSlot(slot, 'focusin'),
319
+ );
320
+
321
+ let shouldCloseOnInteractOutside = (target: Element) => {
322
+ if (target !== ref.current) {
323
+ return true;
324
+ }
325
+
326
+ return false;
327
+ };
328
+
329
+ useSafelyMouseToSubmenu(
330
+ {
331
+ menuRef: parentMenuRef,
332
+ submenuRef,
333
+ isOpen: state.isOpen,
334
+ isDisabled: isDisabled,
335
+ },
336
+ subSlot(slot, 'safeMouse'),
337
+ );
338
+
339
+ return {
340
+ submenuTriggerProps: {
341
+ id: submenuTriggerId,
342
+ 'aria-controls': state.isOpen ? overlayId : undefined,
343
+ 'aria-haspopup': !isDisabled ? type : undefined,
344
+ 'aria-expanded': state.isOpen ? 'true' : 'false',
345
+ onPressStart,
346
+ onPress,
347
+ onHoverChange,
348
+ onKeyDown: submenuTriggerKeyDown,
349
+ isOpen: state.isOpen,
350
+ },
351
+ submenuProps,
352
+ popoverProps: {
353
+ isNonModal: true,
354
+ shouldCloseOnInteractOutside,
355
+ },
356
+ };
357
+ }
@@ -0,0 +1,16 @@
1
+ // Ported from react-aria (source: .react-spectrum/packages/react-aria/src/menu/utils.ts).
2
+ // octane adaptations: `TreeState` type from the ported stately tree state (upstream:
3
+ // 'react-stately/useTreeState').
4
+ import type { Key } from '@react-types/shared';
5
+ import type { TreeState } from '../stately/tree/useTreeState';
6
+
7
+ interface MenuData {
8
+ onClose?: () => void;
9
+ onAction?: (key: Key, value: any) => void;
10
+ shouldUseVirtualFocus?: boolean;
11
+ }
12
+
13
+ export const menuData: WeakMap<TreeState<unknown>, MenuData> = new WeakMap<
14
+ TreeState<unknown>,
15
+ MenuData
16
+ >();
@@ -0,0 +1,43 @@
1
+ // Ported from react-aria (source: .react-spectrum/packages/react-aria/src/meter/useMeter.ts).
2
+ import type { DOMAttributes } from '@react-types/shared';
3
+
4
+ import { S, splitSlot, subSlot } from '../internal';
5
+ import {
6
+ AriaProgressBarBaseProps,
7
+ ProgressBarBaseProps,
8
+ useProgressBar,
9
+ } from '../progress/useProgressBar';
10
+
11
+ export type MeterProps = ProgressBarBaseProps;
12
+ export interface AriaMeterProps extends AriaProgressBarBaseProps {}
13
+
14
+ export interface MeterAria {
15
+ /** Props for the meter container element. */
16
+ meterProps: DOMAttributes;
17
+ /** Props for the meter's visual label (if any). */
18
+ labelProps: DOMAttributes;
19
+ }
20
+
21
+ export function useMeter(props: AriaMeterProps): MeterAria;
22
+ // Slot-threading form: sibling ported hooks pass their derived sub-slot as the trailing arg.
23
+ export function useMeter(props: AriaMeterProps, slot: symbol | undefined): MeterAria;
24
+ export function useMeter(...args: any[]): MeterAria {
25
+ const [user, slotArg] = splitSlot(args);
26
+ const slot = slotArg ?? S('useMeter');
27
+ const props = user[0] as AriaMeterProps;
28
+
29
+ let { progressBarProps, labelProps } = useProgressBar(props, subSlot(slot, 'progress'));
30
+
31
+ return {
32
+ meterProps: {
33
+ ...progressBarProps,
34
+ // Use the meter role if available, but fall back to progressbar if not
35
+ // Chrome currently falls back from meter automatically, and Firefox
36
+ // does not support meter at all. Safari 13+ seems to support meter properly.
37
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=944542
38
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1460378
39
+ role: 'meter progressbar',
40
+ },
41
+ labelProps,
42
+ };
43
+ }