@octanejs/aria 0.0.1 → 0.0.3

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,108 @@
1
+ // Ported from react-stately (source: .react-spectrum/packages/react-stately/src/disclosure/useDisclosureGroupState.ts).
2
+ // octane adaptations: public-hook slot threading (splitSlot/subSlot) per the binding
3
+ // convention; upstream's dep-less `useEffect` becomes an explicit `null` (run after every
4
+ // render); explicit `Set<Key>` element types on the default-set constructions (strict
5
+ // inference).
6
+ import type { Key } from '@react-types/shared';
7
+ import { useEffect, useMemo } from 'octane';
8
+
9
+ import { S, splitSlot, subSlot } from '../../internal';
10
+ import { useControlledState } from '../utils/useControlledState';
11
+
12
+ export interface DisclosureGroupProps {
13
+ /** Whether multiple items can be expanded at the same time. */
14
+ allowsMultipleExpanded?: boolean;
15
+ /** Whether all items are disabled. */
16
+ isDisabled?: boolean;
17
+ /** The currently expanded keys in the group (controlled). */
18
+ expandedKeys?: Iterable<Key>;
19
+ /** The initial expanded keys in the group (uncontrolled). */
20
+ defaultExpandedKeys?: Iterable<Key>;
21
+ /** Handler that is called when items are expanded or collapsed. */
22
+ onExpandedChange?: (keys: Set<Key>) => any;
23
+ }
24
+
25
+ export interface DisclosureGroupState {
26
+ /** Whether multiple items can be expanded at the same time. */
27
+ readonly allowsMultipleExpanded: boolean;
28
+
29
+ /** Whether all items are disabled. */
30
+ readonly isDisabled: boolean;
31
+
32
+ /** A set of keys for items that are expanded. */
33
+ readonly expandedKeys: Set<Key>;
34
+
35
+ /** Toggles the expanded state for an item by its key. */
36
+ toggleKey(key: Key): void;
37
+
38
+ /** Replaces the set of expanded keys. */
39
+ setExpandedKeys(keys: Set<Key>): void;
40
+ }
41
+
42
+ /**
43
+ * Manages state for a group of disclosures, e.g. an accordion.
44
+ * It supports both single and multiple expanded items.
45
+ */
46
+ export function useDisclosureGroupState(props: DisclosureGroupProps): DisclosureGroupState;
47
+ // Slot-threading form: sibling ported hooks pass their derived sub-slot as the trailing arg.
48
+ export function useDisclosureGroupState(
49
+ props: DisclosureGroupProps,
50
+ slot: symbol | undefined,
51
+ ): DisclosureGroupState;
52
+ export function useDisclosureGroupState(...args: any[]): DisclosureGroupState {
53
+ const [user, slotArg] = splitSlot(args);
54
+ const slot = slotArg ?? S('useDisclosureGroupState');
55
+ const props = user[0] as DisclosureGroupProps;
56
+
57
+ let { allowsMultipleExpanded = false, isDisabled = false } = props;
58
+ let [expandedKeys, setExpandedKeys] = useControlledState(
59
+ useMemo(
60
+ () => (props.expandedKeys ? new Set(props.expandedKeys) : undefined),
61
+ [props.expandedKeys],
62
+ subSlot(slot, 'controlled'),
63
+ ),
64
+ useMemo(
65
+ () => (props.defaultExpandedKeys ? new Set(props.defaultExpandedKeys) : new Set<Key>()),
66
+ [props.defaultExpandedKeys],
67
+ subSlot(slot, 'default'),
68
+ ),
69
+ props.onExpandedChange,
70
+ subSlot(slot, 'keys'),
71
+ );
72
+
73
+ useEffect(
74
+ () => {
75
+ // Ensure only one item is expanded if allowsMultipleExpanded is false.
76
+ if (!allowsMultipleExpanded && expandedKeys.size > 1) {
77
+ let firstKey = expandedKeys.values().next().value;
78
+ if (firstKey != null) {
79
+ setExpandedKeys(new Set([firstKey]));
80
+ }
81
+ }
82
+ },
83
+ null,
84
+ subSlot(slot, 'single'),
85
+ );
86
+
87
+ return {
88
+ allowsMultipleExpanded,
89
+ isDisabled,
90
+ expandedKeys,
91
+ setExpandedKeys,
92
+ toggleKey(key) {
93
+ let keys: Set<Key>;
94
+ if (allowsMultipleExpanded) {
95
+ keys = new Set(expandedKeys);
96
+ if (keys.has(key)) {
97
+ keys.delete(key);
98
+ } else {
99
+ keys.add(key);
100
+ }
101
+ } else {
102
+ keys = new Set(expandedKeys.has(key) ? [] : [key]);
103
+ }
104
+
105
+ setExpandedKeys(keys);
106
+ },
107
+ };
108
+ }
@@ -0,0 +1,84 @@
1
+ // Ported from react-stately (source: .react-spectrum/packages/react-stately/src/disclosure/useDisclosureState.ts).
2
+ // octane adaptations: public-hook slot threading (splitSlot/subSlot) per the binding
3
+ // convention; explicit useCallback dep arrays preserved exactly.
4
+ import { useCallback } from 'octane';
5
+
6
+ import { S, splitSlot, subSlot } from '../../internal';
7
+ import { useControlledState } from '../utils/useControlledState';
8
+
9
+ export interface DisclosureProps {
10
+ /** Whether the disclosure is expanded (controlled). */
11
+ isExpanded?: boolean;
12
+ /** Whether the disclosure is expanded by default (uncontrolled). */
13
+ defaultExpanded?: boolean;
14
+ /** Handler that is called when the disclosure expanded state changes. */
15
+ onExpandedChange?: (isExpanded: boolean) => void;
16
+ }
17
+
18
+ export interface DisclosureState {
19
+ /** Whether the disclosure is currently expanded. */
20
+ readonly isExpanded: boolean;
21
+ /** Sets whether the disclosure is expanded. */
22
+ setExpanded(isExpanded: boolean): void;
23
+ /** Expand the disclosure. */
24
+ expand(): void;
25
+ /** Collapse the disclosure. */
26
+ collapse(): void;
27
+ /** Toggles the disclosure's visibility. */
28
+ toggle(): void;
29
+ }
30
+
31
+ /**
32
+ * Manages state for a disclosure widget. Tracks whether the disclosure is expanded, and provides
33
+ * methods to toggle this state.
34
+ */
35
+ export function useDisclosureState(props: DisclosureProps): DisclosureState;
36
+ // Slot-threading form: sibling ported hooks pass their derived sub-slot as the trailing arg.
37
+ export function useDisclosureState(
38
+ props: DisclosureProps,
39
+ slot: symbol | undefined,
40
+ ): DisclosureState;
41
+ export function useDisclosureState(...args: any[]): DisclosureState {
42
+ const [user, slotArg] = splitSlot(args);
43
+ const slot = slotArg ?? S('useDisclosureState');
44
+ const props = user[0] as DisclosureProps;
45
+
46
+ let [isExpanded, setExpanded] = useControlledState(
47
+ props.isExpanded,
48
+ props.defaultExpanded || false,
49
+ props.onExpandedChange,
50
+ subSlot(slot, 'expanded'),
51
+ );
52
+
53
+ const expand = useCallback(
54
+ () => {
55
+ setExpanded(true);
56
+ },
57
+ [setExpanded],
58
+ subSlot(slot, 'expand'),
59
+ );
60
+
61
+ const collapse = useCallback(
62
+ () => {
63
+ setExpanded(false);
64
+ },
65
+ [setExpanded],
66
+ subSlot(slot, 'collapse'),
67
+ );
68
+
69
+ const toggle = useCallback(
70
+ () => {
71
+ setExpanded(!isExpanded);
72
+ },
73
+ [setExpanded, isExpanded],
74
+ subSlot(slot, 'toggle'),
75
+ );
76
+
77
+ return {
78
+ isExpanded,
79
+ setExpanded,
80
+ expand,
81
+ collapse,
82
+ toggle,
83
+ };
84
+ }
@@ -0,0 +1,331 @@
1
+ // Ported from react-stately (source: .react-spectrum/packages/react-stately/src/form/useFormValidationState.ts).
2
+ // octane adaptations:
3
+ // - Public-hook slot threading (splitSlot/subSlot) per the binding convention; explicit dep
4
+ // arrays are preserved exactly, and upstream's dep-less `useEffect(commitValidation)`
5
+ // becomes an explicit `null` (run after every render).
6
+ // - The private group-state prop path returns before any hooks run — legal in octane
7
+ // (hooks are slot-keyed, not order-keyed), so upstream's eslint-suppressed structure
8
+ // ports as-is. `privateValidationStateProp` keeps upstream's exact string: it must be
9
+ // stable across server/client module evaluation for SSR hydration.
10
+ // - `ValidityState` writes/reads through dynamic keys cast via `Record<string, any>`
11
+ // (upstream relies on looser index typing).
12
+ import { createContext, useContext, useEffect, useMemo, useRef, useState } from 'octane';
13
+ import type {
14
+ Validation,
15
+ ValidationErrors,
16
+ ValidationFunction,
17
+ ValidationResult,
18
+ } from '@react-types/shared';
19
+
20
+ import { S, splitSlot, subSlot } from '../../internal';
21
+
22
+ export const VALID_VALIDITY_STATE: ValidityState = {
23
+ badInput: false,
24
+ customError: false,
25
+ patternMismatch: false,
26
+ rangeOverflow: false,
27
+ rangeUnderflow: false,
28
+ stepMismatch: false,
29
+ tooLong: false,
30
+ tooShort: false,
31
+ typeMismatch: false,
32
+ valueMissing: false,
33
+ valid: true,
34
+ };
35
+
36
+ const CUSTOM_VALIDITY_STATE: ValidityState = {
37
+ ...VALID_VALIDITY_STATE,
38
+ customError: true,
39
+ valid: false,
40
+ };
41
+
42
+ export const DEFAULT_VALIDATION_RESULT: ValidationResult = {
43
+ isInvalid: false,
44
+ validationDetails: VALID_VALIDITY_STATE,
45
+ validationErrors: [],
46
+ };
47
+
48
+ export const FormValidationContext = createContext<ValidationErrors>({});
49
+
50
+ // Private props that we pass from useFormValidationState to children.
51
+ // Ideally we'd use a Symbol for this, but React doesn't support them: https://github.com/facebook/react/issues/7552
52
+ // This needs to be stable across server and client module evaluation for SSR hydration.
53
+ export const privateValidationStateProp: string = '__reactAriaFormValidationState';
54
+
55
+ interface FormValidationProps<T> extends Validation<T> {
56
+ builtinValidation?: ValidationResult;
57
+ name?: string | string[];
58
+ value: T | null;
59
+ }
60
+
61
+ export interface FormValidationState {
62
+ /** Realtime validation results, updated as the user edits the value. */
63
+ realtimeValidation: ValidationResult;
64
+ /** Currently displayed validation results, updated when the user commits their changes. */
65
+ displayValidation: ValidationResult;
66
+ /**
67
+ * Updates the current validation result. Not displayed to the user until `commitValidation` is
68
+ * called.
69
+ */
70
+ updateValidation(result: ValidationResult): void;
71
+ /** Resets the displayed validation state to valid when the user resets the form. */
72
+ resetValidation(): void;
73
+ /** Commits the realtime validation so it is displayed to the user. */
74
+ commitValidation(): void;
75
+ }
76
+
77
+ export function useFormValidationState<T>(props: FormValidationProps<T>): FormValidationState;
78
+ // Slot-threading form: sibling ported hooks pass their derived sub-slot as the trailing arg.
79
+ export function useFormValidationState<T>(
80
+ props: FormValidationProps<T>,
81
+ slot: symbol | undefined,
82
+ ): FormValidationState;
83
+ export function useFormValidationState(...args: any[]): FormValidationState {
84
+ const [user, slotArg] = splitSlot(args);
85
+ const slot = slotArg ?? S('useFormValidationState');
86
+ const props = user[0] as FormValidationProps<any>;
87
+
88
+ // Private prop for parent components to pass state to children.
89
+ if ((props as any)[privateValidationStateProp]) {
90
+ let {
91
+ realtimeValidation,
92
+ displayValidation,
93
+ updateValidation,
94
+ resetValidation,
95
+ commitValidation,
96
+ } = (props as any)[privateValidationStateProp] as FormValidationState;
97
+ return {
98
+ realtimeValidation,
99
+ displayValidation,
100
+ updateValidation,
101
+ resetValidation,
102
+ commitValidation,
103
+ };
104
+ }
105
+
106
+ return useFormValidationStateImpl(props, slot);
107
+ }
108
+
109
+ function useFormValidationStateImpl<T>(
110
+ props: FormValidationProps<T>,
111
+ slot: symbol | undefined,
112
+ ): FormValidationState {
113
+ let {
114
+ isInvalid,
115
+ validationState,
116
+ name,
117
+ value,
118
+ builtinValidation,
119
+ validate,
120
+ validationBehavior = 'aria',
121
+ } = props;
122
+
123
+ // backward compatibility.
124
+ if (validationState) {
125
+ isInvalid ||= validationState === 'invalid';
126
+ }
127
+
128
+ // If the isInvalid prop is controlled, update validation result in realtime.
129
+ let controlledError: ValidationResult | null =
130
+ isInvalid !== undefined
131
+ ? {
132
+ isInvalid,
133
+ validationErrors: [],
134
+ validationDetails: CUSTOM_VALIDITY_STATE,
135
+ }
136
+ : null;
137
+
138
+ // Perform custom client side validation.
139
+ let clientError: ValidationResult | null = useMemo(
140
+ () => {
141
+ if (!validate || value == null) {
142
+ return null;
143
+ }
144
+ let validateErrors = runValidate(validate, value);
145
+ return getValidationResult(validateErrors);
146
+ },
147
+ [validate, value],
148
+ subSlot(slot, 'client'),
149
+ );
150
+
151
+ if (builtinValidation?.validationDetails.valid) {
152
+ builtinValidation = undefined;
153
+ }
154
+
155
+ // Get relevant server errors from the form.
156
+ let serverErrors = useContext(FormValidationContext);
157
+ let serverErrorMessages = useMemo(
158
+ () => {
159
+ if (name) {
160
+ return Array.isArray(name)
161
+ ? name.flatMap((name) => asArray(serverErrors[name]))
162
+ : asArray(serverErrors[name]);
163
+ }
164
+ return [];
165
+ },
166
+ [serverErrors, name],
167
+ subSlot(slot, 'serverMessages'),
168
+ );
169
+
170
+ // Show server errors when the form gets a new value, and clear when the user changes the value.
171
+ let [lastServerErrors, setLastServerErrors] = useState(serverErrors, subSlot(slot, 'lastServer'));
172
+ let [isServerErrorCleared, setServerErrorCleared] = useState(
173
+ false,
174
+ subSlot(slot, 'serverCleared'),
175
+ );
176
+ if (serverErrors !== lastServerErrors) {
177
+ setLastServerErrors(serverErrors);
178
+ setServerErrorCleared(false);
179
+ }
180
+
181
+ let serverError: ValidationResult | null = useMemo(
182
+ () => getValidationResult(isServerErrorCleared ? [] : serverErrorMessages),
183
+ [isServerErrorCleared, serverErrorMessages],
184
+ subSlot(slot, 'server'),
185
+ );
186
+
187
+ // Track the next validation state in a ref until commitValidation is called.
188
+ let nextValidation = useRef(DEFAULT_VALIDATION_RESULT, subSlot(slot, 'next'));
189
+ let [currentValidity, setCurrentValidity] = useState(
190
+ DEFAULT_VALIDATION_RESULT,
191
+ subSlot(slot, 'current'),
192
+ );
193
+
194
+ let lastError = useRef(DEFAULT_VALIDATION_RESULT, subSlot(slot, 'lastError'));
195
+ let commitValidation = () => {
196
+ if (!commitQueued) {
197
+ return;
198
+ }
199
+
200
+ setCommitQueued(false);
201
+ let error = clientError || builtinValidation || nextValidation.current;
202
+ if (!isEqualValidation(error, lastError.current)) {
203
+ lastError.current = error;
204
+ setCurrentValidity(error);
205
+ }
206
+ };
207
+
208
+ let [commitQueued, setCommitQueued] = useState(false, subSlot(slot, 'queued'));
209
+ useEffect(commitValidation, null, subSlot(slot, 'commit'));
210
+
211
+ // realtimeValidation is used to update the native input element's state based on custom validation logic.
212
+ // displayValidation is the currently displayed validation state that the user sees (e.g. on input change/form submit).
213
+ // With validationBehavior="aria", all errors are displayed in realtime rather than on submit.
214
+ let realtimeValidation =
215
+ controlledError || serverError || clientError || builtinValidation || DEFAULT_VALIDATION_RESULT;
216
+ let displayValidation =
217
+ validationBehavior === 'native'
218
+ ? controlledError || serverError || currentValidity
219
+ : controlledError || serverError || clientError || builtinValidation || currentValidity;
220
+
221
+ return {
222
+ realtimeValidation,
223
+ displayValidation,
224
+ updateValidation(value) {
225
+ // If validationBehavior is 'aria', update in realtime. Otherwise, store in a ref until commit.
226
+ if (validationBehavior === 'aria' && !isEqualValidation(currentValidity, value)) {
227
+ setCurrentValidity(value);
228
+ } else {
229
+ nextValidation.current = value;
230
+ }
231
+ },
232
+ resetValidation() {
233
+ // Update the currently displayed validation state to valid on form reset,
234
+ // even if the native validity says it isn't. It'll show again on the next form submit.
235
+ let error = DEFAULT_VALIDATION_RESULT;
236
+ if (!isEqualValidation(error, lastError.current)) {
237
+ lastError.current = error;
238
+ setCurrentValidity(error);
239
+ }
240
+
241
+ // Do not commit validation after the next render. This avoids a condition where
242
+ // useSelect calls commitValidation inside an onReset handler.
243
+ if (validationBehavior === 'native') {
244
+ setCommitQueued(false);
245
+ }
246
+
247
+ setServerErrorCleared(true);
248
+ },
249
+ commitValidation() {
250
+ // Commit validation state so the user sees it on blur/change/submit. Also clear any server errors.
251
+ // Wait until after the next render to commit so that the latest value has been validated.
252
+ if (validationBehavior === 'native') {
253
+ setCommitQueued(true);
254
+ }
255
+ setServerErrorCleared(true);
256
+ },
257
+ };
258
+ }
259
+
260
+ function asArray<T>(v: T | T[]): T[] {
261
+ if (!v) {
262
+ return [];
263
+ }
264
+
265
+ return Array.isArray(v) ? v : [v];
266
+ }
267
+
268
+ function runValidate<T>(validate: ValidationFunction<T>, value: T): string[] {
269
+ if (typeof validate === 'function') {
270
+ let e = validate(value);
271
+ if (e && typeof e !== 'boolean') {
272
+ return asArray(e);
273
+ }
274
+ }
275
+
276
+ return [];
277
+ }
278
+
279
+ function getValidationResult(errors: string[]): ValidationResult | null {
280
+ return errors.length
281
+ ? {
282
+ isInvalid: true,
283
+ validationErrors: errors,
284
+ validationDetails: CUSTOM_VALIDITY_STATE,
285
+ }
286
+ : null;
287
+ }
288
+
289
+ function isEqualValidation(a: ValidationResult | null, b: ValidationResult | null): boolean {
290
+ if (a === b) {
291
+ return true;
292
+ }
293
+
294
+ return (
295
+ !!a &&
296
+ !!b &&
297
+ a.isInvalid === b.isInvalid &&
298
+ a.validationErrors.length === b.validationErrors.length &&
299
+ a.validationErrors.every((a, i) => a === b.validationErrors[i]) &&
300
+ Object.entries(a.validationDetails).every(
301
+ ([k, v]) => (b.validationDetails as unknown as Record<string, any>)[k] === v,
302
+ )
303
+ );
304
+ }
305
+
306
+ export function mergeValidation(...results: ValidationResult[]): ValidationResult {
307
+ let errors = new Set<string>();
308
+ let isInvalid = false;
309
+ let validationDetails: Record<string, any> = {
310
+ ...VALID_VALIDITY_STATE,
311
+ };
312
+
313
+ for (let v of results) {
314
+ for (let e of v.validationErrors) {
315
+ errors.add(e);
316
+ }
317
+
318
+ // Only these properties apply for checkboxes.
319
+ isInvalid ||= v.isInvalid;
320
+ for (let key in validationDetails) {
321
+ validationDetails[key] ||= (v.validationDetails as unknown as Record<string, any>)[key];
322
+ }
323
+ }
324
+
325
+ validationDetails.valid = !isInvalid;
326
+ return {
327
+ isInvalid,
328
+ validationErrors: [...errors],
329
+ validationDetails: validationDetails as unknown as ValidityState,
330
+ };
331
+ }
@@ -5,3 +5,114 @@
5
5
  // utils
6
6
  export { useControlledState } from './utils/useControlledState';
7
7
  export type { SetStateAction } from './utils/useControlledState';
8
+
9
+ // toggle
10
+ export { useToggleState } from './toggle/useToggleState';
11
+ export { useToggleGroupState } from './toggle/useToggleGroupState';
12
+ export type { ToggleProps, ToggleState, ToggleStateOptions } from './toggle/useToggleState';
13
+ export type { ToggleGroupProps, ToggleGroupState } from './toggle/useToggleGroupState';
14
+
15
+ // checkbox
16
+ export { useCheckboxGroupState } from './checkbox/useCheckboxGroupState';
17
+ export type { CheckboxGroupProps, CheckboxGroupState } from './checkbox/useCheckboxGroupState';
18
+
19
+ // radio
20
+ export { useRadioGroupState } from './radio/useRadioGroupState';
21
+ export type { RadioGroupProps, RadioGroupState } from './radio/useRadioGroupState';
22
+
23
+ // searchfield
24
+ export { useSearchFieldState } from './searchfield/useSearchFieldState';
25
+ export type { SearchFieldProps, SearchFieldState } from './searchfield/useSearchFieldState';
26
+
27
+ // disclosure
28
+ export { useDisclosureState } from './disclosure/useDisclosureState';
29
+ export { useDisclosureGroupState } from './disclosure/useDisclosureGroupState';
30
+ export type { DisclosureProps, DisclosureState } from './disclosure/useDisclosureState';
31
+ export type {
32
+ DisclosureGroupProps,
33
+ DisclosureGroupState,
34
+ } from './disclosure/useDisclosureGroupState';
35
+
36
+ // form — mirrors the @react-stately/form shim surface.
37
+ export {
38
+ FormValidationContext,
39
+ useFormValidationState,
40
+ DEFAULT_VALIDATION_RESULT,
41
+ VALID_VALIDITY_STATE,
42
+ privateValidationStateProp,
43
+ mergeValidation,
44
+ } from './form/useFormValidationState';
45
+ export type { FormValidationState } from './form/useFormValidationState';
46
+
47
+ // selection — mirrors the @react-stately/selection shim surface.
48
+ export { useMultipleSelectionState } from './selection/useMultipleSelectionState';
49
+ export { SelectionManager } from './selection/SelectionManager';
50
+ export { Selection } from './selection/Selection';
51
+ export type { MultipleSelectionStateProps } from './selection/useMultipleSelectionState';
52
+ export type {
53
+ FocusState,
54
+ SingleSelectionState,
55
+ MultipleSelectionState,
56
+ MultipleSelectionManager,
57
+ } from './selection/types';
58
+
59
+ // collections — mirrors the @react-stately/collections shim surface.
60
+ export { Item } from './collections/Item';
61
+ export { Section } from './collections/Section';
62
+ export { CollectionBuilder } from './collections/CollectionBuilder';
63
+ export { useCollection } from './collections/useCollection';
64
+ export { getItemCount } from './collections/getItemCount';
65
+ export {
66
+ getChildNodes,
67
+ getFirstItem,
68
+ getLastItem,
69
+ getNthItem,
70
+ compareNodeOrder,
71
+ } from './collections/getChildNodes';
72
+ export type { PartialNode } from './collections/types';
73
+
74
+ // list
75
+ export { useListState, UNSTABLE_useFilteredListState } from './list/useListState';
76
+ export { useSingleSelectListState } from './list/useSingleSelectListState';
77
+ export { ListCollection } from './list/ListCollection';
78
+ export type { ListProps, ListState } from './list/useListState';
79
+ export type { SingleSelectListProps, SingleSelectListState } from './list/useSingleSelectListState';
80
+
81
+ // tree
82
+ export { useTreeState } from './tree/useTreeState';
83
+ export { TreeCollection } from './tree/TreeCollection';
84
+ export type { TreeProps, TreeState } from './tree/useTreeState';
85
+
86
+ // menu
87
+ export { useMenuTriggerState } from './menu/useMenuTriggerState';
88
+ export { useSubmenuTriggerState } from './menu/useSubmenuTriggerState';
89
+ export type { MenuTriggerState } from './menu/useMenuTriggerState';
90
+ export type { SubmenuTriggerState } from './menu/useSubmenuTriggerState';
91
+
92
+ // overlays
93
+ export { useOverlayTriggerState } from './overlays/useOverlayTriggerState';
94
+ export type { OverlayTriggerProps, OverlayTriggerState } from './overlays/useOverlayTriggerState';
95
+
96
+ // tooltip
97
+ export { useTooltipTriggerState } from './tooltip/useTooltipTriggerState';
98
+ export type { TooltipTriggerProps, TooltipTriggerState } from './tooltip/useTooltipTriggerState';
99
+
100
+ // select
101
+ export { useSelectState } from './select/useSelectState';
102
+ export type { SelectState, SelectStateOptions } from './select/useSelectState';
103
+
104
+ // combobox
105
+ export { useComboBoxState } from './combobox/useComboBoxState';
106
+ export type { ComboBoxState, ComboBoxStateOptions } from './combobox/useComboBoxState';
107
+
108
+ // tabs
109
+ export { useTabListState } from './tabs/useTabListState';
110
+ export type { TabListProps, TabListState, TabListStateOptions } from './tabs/useTabListState';
111
+
112
+ // numberfield
113
+ export { useNumberFieldState } from './numberfield/useNumberFieldState';
114
+ export type { NumberFieldState, NumberFieldStateOptions } from './numberfield/useNumberFieldState';
115
+
116
+ // slider
117
+ export { useSliderState } from './slider/useSliderState';
118
+ export type { SliderState, SliderStateOptions } from './slider/useSliderState';