@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.
- package/package.json +6 -3
- package/src/breadcrumbs/useBreadcrumbItem.ts +95 -0
- package/src/breadcrumbs/useBreadcrumbs.ts +51 -0
- package/src/button/useButton.ts +273 -0
- package/src/button/useToggleButton.ts +131 -0
- package/src/button/useToggleButtonGroup.ts +131 -0
- package/src/checkbox/useCheckbox.ts +114 -0
- package/src/checkbox/useCheckboxGroup.ts +107 -0
- package/src/checkbox/useCheckboxGroupItem.ts +132 -0
- package/src/checkbox/utils.ts +15 -0
- package/src/combobox/useComboBox.ts +602 -0
- package/src/dialog/useDialog.ts +147 -0
- package/src/disclosure/useDisclosure.ts +180 -0
- package/src/focus/FocusRing.ts +69 -0
- package/src/focus/FocusScope.ts +1205 -0
- package/src/focus/useFocusRing.ts +125 -0
- package/src/focus/useHasTabbableChild.ts +82 -0
- package/src/focus/virtualFocus.ts +38 -0
- package/src/form/useFormValidation.ts +205 -0
- package/src/grid/useGridSelectionAnnouncement.ts +177 -0
- package/src/grid/useGridSelectionCheckbox.ts +86 -0
- package/src/grid/useHighlightSelectionDescription.ts +81 -0
- package/src/gridlist/useGridList.ts +236 -0
- package/src/gridlist/useGridListItem.ts +512 -0
- package/src/gridlist/useGridListSection.ts +78 -0
- package/src/gridlist/useGridListSelectionCheckbox.ts +47 -0
- package/src/gridlist/utils.ts +36 -0
- package/src/i18n/I18nProvider.ts +97 -0
- package/src/i18n/server.ts +115 -0
- package/src/i18n/useCollator.ts +42 -0
- package/src/i18n/useDateFormatter.ts +64 -0
- package/src/i18n/useDefaultLocale.ts +93 -0
- package/src/i18n/useFilter.ts +107 -0
- package/src/i18n/useListFormatter.ts +33 -0
- package/src/i18n/useLocalizedStringFormatter.ts +90 -0
- package/src/i18n/useNumberFormatter.ts +33 -0
- package/src/i18n/utils.ts +67 -0
- package/src/index.ts +268 -0
- package/src/intl/breadcrumbs/ar-AE.json +3 -0
- package/src/intl/breadcrumbs/bg-BG.json +3 -0
- package/src/intl/breadcrumbs/cs-CZ.json +3 -0
- package/src/intl/breadcrumbs/da-DK.json +3 -0
- package/src/intl/breadcrumbs/de-DE.json +3 -0
- package/src/intl/breadcrumbs/el-GR.json +3 -0
- package/src/intl/breadcrumbs/en-US.json +3 -0
- package/src/intl/breadcrumbs/es-ES.json +3 -0
- package/src/intl/breadcrumbs/et-EE.json +3 -0
- package/src/intl/breadcrumbs/fi-FI.json +3 -0
- package/src/intl/breadcrumbs/fr-FR.json +3 -0
- package/src/intl/breadcrumbs/he-IL.json +3 -0
- package/src/intl/breadcrumbs/hr-HR.json +3 -0
- package/src/intl/breadcrumbs/hu-HU.json +3 -0
- package/src/intl/breadcrumbs/index.ts +75 -0
- package/src/intl/breadcrumbs/it-IT.json +3 -0
- package/src/intl/breadcrumbs/ja-JP.json +3 -0
- package/src/intl/breadcrumbs/ko-KR.json +3 -0
- package/src/intl/breadcrumbs/lt-LT.json +3 -0
- package/src/intl/breadcrumbs/lv-LV.json +3 -0
- package/src/intl/breadcrumbs/nb-NO.json +3 -0
- package/src/intl/breadcrumbs/nl-NL.json +3 -0
- package/src/intl/breadcrumbs/pl-PL.json +3 -0
- package/src/intl/breadcrumbs/pt-BR.json +3 -0
- package/src/intl/breadcrumbs/pt-PT.json +3 -0
- package/src/intl/breadcrumbs/ro-RO.json +3 -0
- package/src/intl/breadcrumbs/ru-RU.json +3 -0
- package/src/intl/breadcrumbs/sk-SK.json +3 -0
- package/src/intl/breadcrumbs/sl-SI.json +3 -0
- package/src/intl/breadcrumbs/sr-SP.json +3 -0
- package/src/intl/breadcrumbs/sv-SE.json +3 -0
- package/src/intl/breadcrumbs/tr-TR.json +3 -0
- package/src/intl/breadcrumbs/uk-UA.json +3 -0
- package/src/intl/breadcrumbs/zh-CN.json +3 -0
- package/src/intl/breadcrumbs/zh-TW.json +3 -0
- package/src/intl/combobox/ar-AE.json +7 -0
- package/src/intl/combobox/bg-BG.json +7 -0
- package/src/intl/combobox/cs-CZ.json +7 -0
- package/src/intl/combobox/da-DK.json +7 -0
- package/src/intl/combobox/de-DE.json +7 -0
- package/src/intl/combobox/el-GR.json +7 -0
- package/src/intl/combobox/en-US.json +7 -0
- package/src/intl/combobox/es-ES.json +7 -0
- package/src/intl/combobox/et-EE.json +7 -0
- package/src/intl/combobox/fi-FI.json +7 -0
- package/src/intl/combobox/fr-FR.json +7 -0
- package/src/intl/combobox/he-IL.json +7 -0
- package/src/intl/combobox/hr-HR.json +7 -0
- package/src/intl/combobox/hu-HU.json +7 -0
- package/src/intl/combobox/index.ts +75 -0
- package/src/intl/combobox/it-IT.json +7 -0
- package/src/intl/combobox/ja-JP.json +7 -0
- package/src/intl/combobox/ko-KR.json +7 -0
- package/src/intl/combobox/lt-LT.json +7 -0
- package/src/intl/combobox/lv-LV.json +7 -0
- package/src/intl/combobox/nb-NO.json +7 -0
- package/src/intl/combobox/nl-NL.json +7 -0
- package/src/intl/combobox/pl-PL.json +7 -0
- package/src/intl/combobox/pt-BR.json +7 -0
- package/src/intl/combobox/pt-PT.json +7 -0
- package/src/intl/combobox/ro-RO.json +7 -0
- package/src/intl/combobox/ru-RU.json +7 -0
- package/src/intl/combobox/sk-SK.json +7 -0
- package/src/intl/combobox/sl-SI.json +7 -0
- package/src/intl/combobox/sr-SP.json +7 -0
- package/src/intl/combobox/sv-SE.json +7 -0
- package/src/intl/combobox/tr-TR.json +7 -0
- package/src/intl/combobox/uk-UA.json +7 -0
- package/src/intl/combobox/zh-CN.json +7 -0
- package/src/intl/combobox/zh-TW.json +7 -0
- package/src/intl/grid/ar-AE.json +8 -0
- package/src/intl/grid/bg-BG.json +8 -0
- package/src/intl/grid/cs-CZ.json +8 -0
- package/src/intl/grid/da-DK.json +8 -0
- package/src/intl/grid/de-DE.json +8 -0
- package/src/intl/grid/el-GR.json +8 -0
- package/src/intl/grid/en-US.json +8 -0
- package/src/intl/grid/es-ES.json +8 -0
- package/src/intl/grid/et-EE.json +8 -0
- package/src/intl/grid/fi-FI.json +8 -0
- package/src/intl/grid/fr-FR.json +8 -0
- package/src/intl/grid/he-IL.json +8 -0
- package/src/intl/grid/hr-HR.json +8 -0
- package/src/intl/grid/hu-HU.json +8 -0
- package/src/intl/grid/index.ts +75 -0
- package/src/intl/grid/it-IT.json +8 -0
- package/src/intl/grid/ja-JP.json +8 -0
- package/src/intl/grid/ko-KR.json +8 -0
- package/src/intl/grid/lt-LT.json +8 -0
- package/src/intl/grid/lv-LV.json +8 -0
- package/src/intl/grid/nb-NO.json +8 -0
- package/src/intl/grid/nl-NL.json +8 -0
- package/src/intl/grid/pl-PL.json +8 -0
- package/src/intl/grid/pt-BR.json +8 -0
- package/src/intl/grid/pt-PT.json +8 -0
- package/src/intl/grid/ro-RO.json +8 -0
- package/src/intl/grid/ru-RU.json +8 -0
- package/src/intl/grid/sk-SK.json +8 -0
- package/src/intl/grid/sl-SI.json +8 -0
- package/src/intl/grid/sr-SP.json +8 -0
- package/src/intl/grid/sv-SE.json +8 -0
- package/src/intl/grid/tr-TR.json +8 -0
- package/src/intl/grid/uk-UA.json +8 -0
- package/src/intl/grid/zh-CN.json +8 -0
- package/src/intl/grid/zh-TW.json +8 -0
- package/src/intl/gridlist/ar-AE.json +4 -0
- package/src/intl/gridlist/bg-BG.json +4 -0
- package/src/intl/gridlist/cs-CZ.json +4 -0
- package/src/intl/gridlist/da-DK.json +4 -0
- package/src/intl/gridlist/de-DE.json +4 -0
- package/src/intl/gridlist/el-GR.json +4 -0
- package/src/intl/gridlist/en-US.json +4 -0
- package/src/intl/gridlist/es-ES.json +4 -0
- package/src/intl/gridlist/et-EE.json +4 -0
- package/src/intl/gridlist/fi-FI.json +4 -0
- package/src/intl/gridlist/fr-FR.json +4 -0
- package/src/intl/gridlist/he-IL.json +4 -0
- package/src/intl/gridlist/hr-HR.json +4 -0
- package/src/intl/gridlist/hu-HU.json +4 -0
- package/src/intl/gridlist/index.ts +75 -0
- package/src/intl/gridlist/it-IT.json +4 -0
- package/src/intl/gridlist/ja-JP.json +4 -0
- package/src/intl/gridlist/ko-KR.json +4 -0
- package/src/intl/gridlist/lt-LT.json +4 -0
- package/src/intl/gridlist/lv-LV.json +4 -0
- package/src/intl/gridlist/nb-NO.json +4 -0
- package/src/intl/gridlist/nl-NL.json +4 -0
- package/src/intl/gridlist/pl-PL.json +4 -0
- package/src/intl/gridlist/pt-BR.json +4 -0
- package/src/intl/gridlist/pt-PT.json +4 -0
- package/src/intl/gridlist/ro-RO.json +4 -0
- package/src/intl/gridlist/ru-RU.json +4 -0
- package/src/intl/gridlist/sk-SK.json +4 -0
- package/src/intl/gridlist/sl-SI.json +4 -0
- package/src/intl/gridlist/sr-SP.json +4 -0
- package/src/intl/gridlist/sv-SE.json +4 -0
- package/src/intl/gridlist/tr-TR.json +4 -0
- package/src/intl/gridlist/uk-UA.json +4 -0
- package/src/intl/gridlist/zh-CN.json +4 -0
- package/src/intl/gridlist/zh-TW.json +4 -0
- package/src/intl/menu/ar-AE.json +3 -0
- package/src/intl/menu/bg-BG.json +3 -0
- package/src/intl/menu/cs-CZ.json +3 -0
- package/src/intl/menu/da-DK.json +3 -0
- package/src/intl/menu/de-DE.json +3 -0
- package/src/intl/menu/el-GR.json +3 -0
- package/src/intl/menu/en-US.json +3 -0
- package/src/intl/menu/es-ES.json +3 -0
- package/src/intl/menu/et-EE.json +3 -0
- package/src/intl/menu/fi-FI.json +3 -0
- package/src/intl/menu/fr-FR.json +3 -0
- package/src/intl/menu/he-IL.json +3 -0
- package/src/intl/menu/hr-HR.json +3 -0
- package/src/intl/menu/hu-HU.json +3 -0
- package/src/intl/menu/index.ts +75 -0
- package/src/intl/menu/it-IT.json +3 -0
- package/src/intl/menu/ja-JP.json +3 -0
- package/src/intl/menu/ko-KR.json +3 -0
- package/src/intl/menu/lt-LT.json +3 -0
- package/src/intl/menu/lv-LV.json +3 -0
- package/src/intl/menu/nb-NO.json +3 -0
- package/src/intl/menu/nl-NL.json +3 -0
- package/src/intl/menu/pl-PL.json +3 -0
- package/src/intl/menu/pt-BR.json +3 -0
- package/src/intl/menu/pt-PT.json +3 -0
- package/src/intl/menu/ro-RO.json +3 -0
- package/src/intl/menu/ru-RU.json +3 -0
- package/src/intl/menu/sk-SK.json +3 -0
- package/src/intl/menu/sl-SI.json +3 -0
- package/src/intl/menu/sr-SP.json +3 -0
- package/src/intl/menu/sv-SE.json +3 -0
- package/src/intl/menu/tr-TR.json +3 -0
- package/src/intl/menu/uk-UA.json +3 -0
- package/src/intl/menu/zh-CN.json +3 -0
- package/src/intl/menu/zh-TW.json +3 -0
- package/src/intl/numberfield/ar-AE.json +5 -0
- package/src/intl/numberfield/bg-BG.json +5 -0
- package/src/intl/numberfield/cs-CZ.json +5 -0
- package/src/intl/numberfield/da-DK.json +5 -0
- package/src/intl/numberfield/de-DE.json +5 -0
- package/src/intl/numberfield/el-GR.json +5 -0
- package/src/intl/numberfield/en-US.json +5 -0
- package/src/intl/numberfield/es-ES.json +5 -0
- package/src/intl/numberfield/et-EE.json +5 -0
- package/src/intl/numberfield/fi-FI.json +5 -0
- package/src/intl/numberfield/fr-FR.json +5 -0
- package/src/intl/numberfield/he-IL.json +5 -0
- package/src/intl/numberfield/hr-HR.json +5 -0
- package/src/intl/numberfield/hu-HU.json +5 -0
- package/src/intl/numberfield/index.ts +75 -0
- package/src/intl/numberfield/it-IT.json +5 -0
- package/src/intl/numberfield/ja-JP.json +5 -0
- package/src/intl/numberfield/ko-KR.json +5 -0
- package/src/intl/numberfield/lt-LT.json +5 -0
- package/src/intl/numberfield/lv-LV.json +5 -0
- package/src/intl/numberfield/nb-NO.json +5 -0
- package/src/intl/numberfield/nl-NL.json +5 -0
- package/src/intl/numberfield/pl-PL.json +5 -0
- package/src/intl/numberfield/pt-BR.json +5 -0
- package/src/intl/numberfield/pt-PT.json +5 -0
- package/src/intl/numberfield/ro-RO.json +5 -0
- package/src/intl/numberfield/ru-RU.json +5 -0
- package/src/intl/numberfield/sk-SK.json +5 -0
- package/src/intl/numberfield/sl-SI.json +5 -0
- package/src/intl/numberfield/sr-SP.json +5 -0
- package/src/intl/numberfield/sv-SE.json +5 -0
- package/src/intl/numberfield/tr-TR.json +5 -0
- package/src/intl/numberfield/uk-UA.json +5 -0
- package/src/intl/numberfield/zh-CN.json +5 -0
- package/src/intl/numberfield/zh-TW.json +5 -0
- package/src/intl/overlays/ar-AE.json +3 -0
- package/src/intl/overlays/bg-BG.json +3 -0
- package/src/intl/overlays/cs-CZ.json +3 -0
- package/src/intl/overlays/da-DK.json +3 -0
- package/src/intl/overlays/de-DE.json +3 -0
- package/src/intl/overlays/el-GR.json +3 -0
- package/src/intl/overlays/en-US.json +3 -0
- package/src/intl/overlays/es-ES.json +3 -0
- package/src/intl/overlays/et-EE.json +3 -0
- package/src/intl/overlays/fi-FI.json +3 -0
- package/src/intl/overlays/fr-FR.json +3 -0
- package/src/intl/overlays/he-IL.json +3 -0
- package/src/intl/overlays/hr-HR.json +3 -0
- package/src/intl/overlays/hu-HU.json +3 -0
- package/src/intl/overlays/index.ts +75 -0
- package/src/intl/overlays/it-IT.json +3 -0
- package/src/intl/overlays/ja-JP.json +3 -0
- package/src/intl/overlays/ko-KR.json +3 -0
- package/src/intl/overlays/lt-LT.json +3 -0
- package/src/intl/overlays/lv-LV.json +3 -0
- package/src/intl/overlays/nb-NO.json +3 -0
- package/src/intl/overlays/nl-NL.json +3 -0
- package/src/intl/overlays/pl-PL.json +3 -0
- package/src/intl/overlays/pt-BR.json +3 -0
- package/src/intl/overlays/pt-PT.json +3 -0
- package/src/intl/overlays/ro-RO.json +3 -0
- package/src/intl/overlays/ru-RU.json +3 -0
- package/src/intl/overlays/sk-SK.json +3 -0
- package/src/intl/overlays/sl-SI.json +3 -0
- package/src/intl/overlays/sr-SP.json +3 -0
- package/src/intl/overlays/sv-SE.json +3 -0
- package/src/intl/overlays/tr-TR.json +3 -0
- package/src/intl/overlays/uk-UA.json +3 -0
- package/src/intl/overlays/zh-CN.json +3 -0
- package/src/intl/overlays/zh-TW.json +3 -0
- package/src/intl/searchfield/ar-AE.json +3 -0
- package/src/intl/searchfield/bg-BG.json +3 -0
- package/src/intl/searchfield/cs-CZ.json +3 -0
- package/src/intl/searchfield/da-DK.json +3 -0
- package/src/intl/searchfield/de-DE.json +3 -0
- package/src/intl/searchfield/el-GR.json +3 -0
- package/src/intl/searchfield/en-US.json +3 -0
- package/src/intl/searchfield/es-ES.json +3 -0
- package/src/intl/searchfield/et-EE.json +3 -0
- package/src/intl/searchfield/fi-FI.json +3 -0
- package/src/intl/searchfield/fr-FR.json +3 -0
- package/src/intl/searchfield/he-IL.json +3 -0
- package/src/intl/searchfield/hr-HR.json +3 -0
- package/src/intl/searchfield/hu-HU.json +3 -0
- package/src/intl/searchfield/index.ts +75 -0
- package/src/intl/searchfield/it-IT.json +3 -0
- package/src/intl/searchfield/ja-JP.json +3 -0
- package/src/intl/searchfield/ko-KR.json +3 -0
- package/src/intl/searchfield/lt-LT.json +3 -0
- package/src/intl/searchfield/lv-LV.json +3 -0
- package/src/intl/searchfield/nb-NO.json +3 -0
- package/src/intl/searchfield/nl-NL.json +3 -0
- package/src/intl/searchfield/pl-PL.json +3 -0
- package/src/intl/searchfield/pt-BR.json +3 -0
- package/src/intl/searchfield/pt-PT.json +3 -0
- package/src/intl/searchfield/ro-RO.json +3 -0
- package/src/intl/searchfield/ru-RU.json +3 -0
- package/src/intl/searchfield/sk-SK.json +3 -0
- package/src/intl/searchfield/sl-SI.json +3 -0
- package/src/intl/searchfield/sr-SP.json +3 -0
- package/src/intl/searchfield/sv-SE.json +3 -0
- package/src/intl/searchfield/tr-TR.json +3 -0
- package/src/intl/searchfield/uk-UA.json +3 -0
- package/src/intl/searchfield/zh-CN.json +3 -0
- package/src/intl/searchfield/zh-TW.json +3 -0
- package/src/intl/spinbutton/ar-AE.json +3 -0
- package/src/intl/spinbutton/bg-BG.json +3 -0
- package/src/intl/spinbutton/cs-CZ.json +3 -0
- package/src/intl/spinbutton/da-DK.json +3 -0
- package/src/intl/spinbutton/de-DE.json +3 -0
- package/src/intl/spinbutton/el-GR.json +3 -0
- package/src/intl/spinbutton/en-US.json +3 -0
- package/src/intl/spinbutton/es-ES.json +3 -0
- package/src/intl/spinbutton/et-EE.json +3 -0
- package/src/intl/spinbutton/fi-FI.json +3 -0
- package/src/intl/spinbutton/fr-FR.json +3 -0
- package/src/intl/spinbutton/he-IL.json +3 -0
- package/src/intl/spinbutton/hr-HR.json +3 -0
- package/src/intl/spinbutton/hu-HU.json +3 -0
- package/src/intl/spinbutton/index.ts +75 -0
- package/src/intl/spinbutton/it-IT.json +3 -0
- package/src/intl/spinbutton/ja-JP.json +3 -0
- package/src/intl/spinbutton/ko-KR.json +3 -0
- package/src/intl/spinbutton/lt-LT.json +3 -0
- package/src/intl/spinbutton/lv-LV.json +3 -0
- package/src/intl/spinbutton/nb-NO.json +3 -0
- package/src/intl/spinbutton/nl-NL.json +3 -0
- package/src/intl/spinbutton/pl-PL.json +3 -0
- package/src/intl/spinbutton/pt-BR.json +3 -0
- package/src/intl/spinbutton/pt-PT.json +3 -0
- package/src/intl/spinbutton/ro-RO.json +3 -0
- package/src/intl/spinbutton/ru-RU.json +3 -0
- package/src/intl/spinbutton/sk-SK.json +3 -0
- package/src/intl/spinbutton/sl-SI.json +3 -0
- package/src/intl/spinbutton/sr-SP.json +3 -0
- package/src/intl/spinbutton/sv-SE.json +3 -0
- package/src/intl/spinbutton/tr-TR.json +3 -0
- package/src/intl/spinbutton/uk-UA.json +3 -0
- package/src/intl/spinbutton/zh-CN.json +3 -0
- package/src/intl/spinbutton/zh-TW.json +3 -0
- package/src/intl/tag/ar-AE.json +4 -0
- package/src/intl/tag/bg-BG.json +4 -0
- package/src/intl/tag/cs-CZ.json +4 -0
- package/src/intl/tag/da-DK.json +4 -0
- package/src/intl/tag/de-DE.json +4 -0
- package/src/intl/tag/el-GR.json +4 -0
- package/src/intl/tag/en-US.json +4 -0
- package/src/intl/tag/es-ES.json +4 -0
- package/src/intl/tag/et-EE.json +4 -0
- package/src/intl/tag/fi-FI.json +4 -0
- package/src/intl/tag/fr-FR.json +4 -0
- package/src/intl/tag/he-IL.json +4 -0
- package/src/intl/tag/hr-HR.json +4 -0
- package/src/intl/tag/hu-HU.json +4 -0
- package/src/intl/tag/index.ts +75 -0
- package/src/intl/tag/it-IT.json +4 -0
- package/src/intl/tag/ja-JP.json +4 -0
- package/src/intl/tag/ko-KR.json +4 -0
- package/src/intl/tag/lt-LT.json +4 -0
- package/src/intl/tag/lv-LV.json +4 -0
- package/src/intl/tag/nb-NO.json +4 -0
- package/src/intl/tag/nl-NL.json +4 -0
- package/src/intl/tag/pl-PL.json +4 -0
- package/src/intl/tag/pt-BR.json +4 -0
- package/src/intl/tag/pt-PT.json +4 -0
- package/src/intl/tag/ro-RO.json +4 -0
- package/src/intl/tag/ru-RU.json +4 -0
- package/src/intl/tag/sk-SK.json +4 -0
- package/src/intl/tag/sl-SI.json +4 -0
- package/src/intl/tag/sr-SP.json +4 -0
- package/src/intl/tag/sv-SE.json +4 -0
- package/src/intl/tag/tr-TR.json +4 -0
- package/src/intl/tag/uk-UA.json +4 -0
- package/src/intl/tag/zh-CN.json +4 -0
- package/src/intl/tag/zh-TW.json +4 -0
- package/src/label/useField.ts +67 -0
- package/src/label/useLabel.ts +78 -0
- package/src/link/useLink.ts +108 -0
- package/src/listbox/useListBox.ts +224 -0
- package/src/listbox/useListBoxSection.ts +74 -0
- package/src/listbox/useOption.ts +212 -0
- package/src/listbox/utils.ts +38 -0
- package/src/live-announcer/LiveAnnouncer.ts +172 -0
- package/src/menu/useMenu.ts +139 -0
- package/src/menu/useMenuItem.ts +453 -0
- package/src/menu/useMenuSection.ts +70 -0
- package/src/menu/useMenuTrigger.ts +189 -0
- package/src/menu/useSafelyMouseToSubmenu.ts +236 -0
- package/src/menu/useSubmenuTrigger.ts +357 -0
- package/src/menu/utils.ts +16 -0
- package/src/meter/useMeter.ts +43 -0
- package/src/numberfield/useNumberField.ts +572 -0
- package/src/overlays/DismissButton.ts +50 -0
- package/src/overlays/Overlay.ts +106 -0
- package/src/overlays/PortalProvider.ts +37 -0
- package/src/overlays/ariaHideOutside.ts +299 -0
- package/src/overlays/calculatePosition.ts +856 -0
- package/src/overlays/useCloseOnScroll.ts +75 -0
- package/src/overlays/useModal.ts +224 -0
- package/src/overlays/useModalOverlay.ts +103 -0
- package/src/overlays/useOverlay.ts +199 -0
- package/src/overlays/useOverlayPosition.ts +462 -0
- package/src/overlays/useOverlayTrigger.ts +94 -0
- package/src/overlays/usePopover.ts +170 -0
- package/src/overlays/usePreventScroll.ts +316 -0
- package/src/progress/useProgressBar.ts +115 -0
- package/src/radio/useRadio.ts +219 -0
- package/src/radio/useRadioGroup.ts +184 -0
- package/src/radio/utils.ts +15 -0
- package/src/searchfield/useSearchField.ts +156 -0
- package/src/select/HiddenSelect.ts +261 -0
- package/src/select/useSelect.ts +332 -0
- package/src/selection/DOMLayoutDelegate.ts +51 -0
- package/src/selection/ListKeyboardDelegate.ts +392 -0
- package/src/selection/useSelectableCollection.ts +750 -0
- package/src/selection/useSelectableItem.ts +499 -0
- package/src/selection/useSelectableList.ts +132 -0
- package/src/selection/useTypeSelect.ts +192 -0
- package/src/selection/utils.ts +50 -0
- package/src/separator/useSeparator.ts +41 -0
- package/src/slider/useSlider.ts +277 -0
- package/src/slider/useSliderThumb.ts +375 -0
- package/src/slider/utils.ts +20 -0
- package/src/spinbutton/useSpinButton.ts +380 -0
- package/src/stately/checkbox/useCheckboxGroupState.ts +177 -0
- package/src/stately/collections/CollectionBuilder.ts +332 -0
- package/src/stately/collections/Item.ts +78 -0
- package/src/stately/collections/Section.ts +52 -0
- package/src/stately/collections/getChildNodes.ts +94 -0
- package/src/stately/collections/getItemCount.ts +29 -0
- package/src/stately/collections/types.ts +20 -0
- package/src/stately/collections/useCollection.ts +54 -0
- package/src/stately/combobox/useComboBoxState.ts +763 -0
- package/src/stately/disclosure/useDisclosureGroupState.ts +108 -0
- package/src/stately/disclosure/useDisclosureState.ts +84 -0
- package/src/stately/form/useFormValidationState.ts +331 -0
- package/src/stately/index.ts +111 -0
- package/src/stately/list/ListCollection.ts +104 -0
- package/src/stately/list/useListState.ts +178 -0
- package/src/stately/list/useSingleSelectListState.ts +101 -0
- package/src/stately/menu/useMenuTriggerState.ts +120 -0
- package/src/stately/menu/useSubmenuTriggerState.ts +116 -0
- package/src/stately/numberfield/useNumberFieldState.ts +430 -0
- package/src/stately/overlays/useOverlayTriggerState.ts +85 -0
- package/src/stately/radio/useRadioGroupState.ts +150 -0
- package/src/stately/searchfield/useSearchFieldState.ts +79 -0
- package/src/stately/select/useSelectState.ts +322 -0
- package/src/stately/selection/Selection.ts +23 -0
- package/src/stately/selection/SelectionManager.ts +541 -0
- package/src/stately/selection/types.ts +117 -0
- package/src/stately/selection/useMultipleSelectionState.ts +178 -0
- package/src/stately/slider/useSliderState.ts +458 -0
- package/src/stately/tabs/useTabListState.ts +149 -0
- package/src/stately/toggle/useToggleGroupState.ts +109 -0
- package/src/stately/toggle/useToggleState.ts +100 -0
- package/src/stately/tooltip/useTooltipTriggerState.ts +218 -0
- package/src/stately/tree/TreeCollection.ts +92 -0
- package/src/stately/tree/useTreeState.ts +121 -0
- package/src/stately/utils/useControlledState.ts +7 -0
- package/src/switch/useSwitch.ts +77 -0
- package/src/tabs/TabsKeyboardDelegate.ts +99 -0
- package/src/tabs/useTab.ts +117 -0
- package/src/tabs/useTabList.ts +105 -0
- package/src/tabs/useTabPanel.ts +75 -0
- package/src/tabs/utils.ts +32 -0
- package/src/tag/useTag.ts +162 -0
- package/src/tag/useTagGroup.ts +192 -0
- package/src/textfield/useFormattedTextField.ts +203 -0
- package/src/textfield/useTextField.ts +248 -0
- package/src/toggle/useToggle.ts +265 -0
- package/src/toolbar/useToolbar.ts +147 -0
- package/src/tooltip/useTooltip.ts +64 -0
- package/src/tooltip/useTooltipTrigger.ts +187 -0
- package/src/utils/filterDOMProps.ts +121 -0
- package/src/utils/getScrollParent.ts +16 -0
- package/src/utils/getScrollParents.ts +20 -0
- package/src/utils/keyboard.ts +38 -0
- package/src/utils/scrollIntoView.ts +178 -0
- package/src/utils/useDeepMemo.ts +30 -0
- package/src/utils/useFormReset.ts +54 -0
- package/src/utils/useId.ts +5 -0
- package/src/utils/useLabels.ts +53 -0
- package/src/utils/useResizeObserver.ts +70 -0
- package/src/utils/useSlot.ts +78 -0
- package/src/utils/useUpdateEffect.ts +54 -0
- package/src/utils/useUpdateLayoutEffect.ts +58 -0
- 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
|
+
}
|