@astryxdesign/core 0.7.5 → 0.7.6-canary.0d71e8d
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/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +5 -5
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +183 -5
- package/dist/AppShell/observeMainOverflow.d.ts +9 -0
- package/dist/AppShell/observeMainOverflow.d.ts.map +1 -0
- package/dist/AppShell/observeMainOverflow.js +125 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +12 -3
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +7 -1
- package/dist/BottomSheet/BottomSheet.js +1 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +2 -1
- package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +30 -3
- package/dist/Button/Button.js +4 -4
- package/dist/Carousel/Carousel.d.ts +3 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +12 -3
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -5
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +37 -4
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +41 -4
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +12 -4
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +101 -15
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +8 -3
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +11 -7
- package/dist/DateInput/usePointerDragScroll.d.ts +10 -1
- package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
- package/dist/DateInput/usePointerDragScroll.js +25 -9
- package/dist/DateInput/useScrollSettle.d.ts +3 -1
- package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
- package/dist/DateInput/useScrollSettle.js +37 -8
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +23 -12
- package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
- package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +34 -9
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +5 -4
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +2 -1
- package/dist/Drawer/Drawer.d.ts +1 -0
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +7 -2
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +35 -22
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -16
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +2 -1
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +4 -4
- package/dist/Field/InputClearButton.js +3 -3
- package/dist/Field/PanelSearchInput.js +2 -2
- package/dist/FieldStatus/FieldStatus.d.ts +3 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +3 -2
- package/dist/FileInput/FileInput.d.ts +3 -0
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +34 -13
- package/dist/Heading/Heading.js +1 -1
- package/dist/Icon/Icon.js +1 -1
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckIndicator.js +2 -1
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +3 -1
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
- package/dist/Indicator/RadioIndicator.js +3 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +21 -7
- package/dist/Item/ItemSwipeLayer.js +1 -1
- package/dist/Layer/popoverOperations.d.ts +27 -0
- package/dist/Layer/popoverOperations.d.ts.map +1 -0
- package/dist/Layer/popoverOperations.js +159 -0
- package/dist/Layer/useLayer.d.ts +1 -1
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +120 -65
- package/dist/Layout/Layout.js +1 -1
- package/dist/Layout/LayoutContent.js +1 -1
- package/dist/Layout/LayoutFooter.js +1 -1
- package/dist/Layout/LayoutHeader.js +1 -1
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +5 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +8 -3
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +1 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +7 -2
- package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +26 -10
- package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenuItem.js +5 -29
- package/dist/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +26 -5
- package/dist/NumberInput/numberParser.d.ts +3 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -1
- package/dist/NumberInput/numberParser.js +7 -44
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +27 -0
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +32 -12
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +10 -3
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +37 -30
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +11 -3
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +28 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
- package/dist/Selector/useSelectorPresentation.d.ts +8 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +20 -4
- package/dist/SideNav/SideNavItem.d.ts +2 -2
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +18 -7
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +10 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +3 -3
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/Stepper/Step.d.ts.map +1 -1
- package/dist/Stepper/Step.js +26 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +10 -3
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +36 -10
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +46 -58
- package/dist/Text/Text.js +1 -1
- package/dist/Text/useTruncation.d.ts.map +1 -1
- package/dist/Text/useTruncation.js +23 -5
- package/dist/TextArea/TextArea.d.ts +1 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +13 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -3
- package/dist/TimeInput/TimeInput.d.ts +6 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -14
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +5 -4
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +2 -2
- package/dist/Timestamp/TimestampHoverCard.js +4 -4
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +60 -20
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +101 -54
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +7 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +16 -2
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +52 -5
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +14 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +44 -7
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts +2 -0
- package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerClearAllMessageContext.js +17 -0
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +2 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -0
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +1 -0
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +27 -4
- package/dist/Typeahead/BaseTypeahead.d.ts +4 -4
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +43 -7
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +43 -9
- package/dist/astryx.css +25 -4
- package/dist/gestures/GestureArena.d.ts +32 -1
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +110 -9
- package/dist/gestures/GestureHost.d.ts +351 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +13 -1
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +19 -1
- package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/LongPressGestureRecognizer.js +3 -0
- package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PanGestureRecognizer.js +3 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/PinchGestureRecognizer.js +128 -0
- package/dist/gestures/PressTracker.d.ts +112 -0
- package/dist/gestures/PressTracker.d.ts.map +1 -0
- package/dist/gestures/PressTracker.js +267 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/SwipeGestureRecognizer.js +148 -0
- package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
- package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/TapGestureRecognizer.js +3 -0
- package/dist/gestures/VelocityTracker.d.ts +6 -2
- package/dist/gestures/VelocityTracker.d.ts.map +1 -1
- package/dist/gestures/VelocityTracker.js +7 -3
- package/dist/gestures/haptics.d.ts +65 -0
- package/dist/gestures/haptics.d.ts.map +1 -0
- package/dist/gestures/haptics.js +182 -0
- package/dist/gestures/index.d.ts +37 -0
- package/dist/gestures/index.d.ts.map +1 -0
- package/dist/gestures/index.js +25 -0
- package/dist/gestures/nativeScroll.d.ts +42 -0
- package/dist/gestures/nativeScroll.d.ts.map +1 -0
- package/dist/gestures/nativeScroll.js +228 -0
- package/dist/gestures/touchAction.d.ts +60 -0
- package/dist/gestures/touchAction.d.ts.map +1 -0
- package/dist/gestures/touchAction.js +157 -0
- package/dist/gestures/touchActionRule.d.ts +34 -0
- package/dist/gestures/touchActionRule.d.ts.map +1 -0
- package/dist/gestures/touchActionRule.js +140 -0
- package/dist/gestures/types.d.ts +18 -7
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +22 -2
- package/dist/gestures/useGestureRecognizer.d.ts +56 -0
- package/dist/gestures/useGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/useGestureRecognizer.js +226 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/modalAnnounce.d.ts.map +1 -1
- package/dist/hooks/modalAnnounce.js +107 -61
- package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -1
- package/dist/hooks/scrollKeyboardDelegation.js +7 -3
- package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
- package/dist/hooks/useAdaptivePresentation.js +4 -1
- package/dist/hooks/useAnnounce.d.ts +101 -42
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +161 -75
- package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
- package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
- package/dist/hooks/useAnnounceRenderedText.js +5 -3
- package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
- package/dist/hooks/useBusyAnnouncement.js +6 -12
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +12 -1
- package/dist/hooks/useScrollOverflow.d.ts +2 -1
- package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
- package/dist/hooks/useScrollOverflow.js +56 -10
- package/dist/i18n/generated-locales/af-ZA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/af-ZA.generated.js +0 -5
- package/dist/i18n/generated-locales/ar-SA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ar-SA.generated.js +0 -5
- package/dist/i18n/generated-locales/ca-ES.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ca-ES.generated.js +0 -5
- package/dist/i18n/generated-locales/cs-CZ.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/cs-CZ.generated.js +0 -5
- package/dist/i18n/generated-locales/da-DK.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/da-DK.generated.js +0 -5
- package/dist/i18n/generated-locales/de-DE.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/de-DE.generated.js +0 -5
- package/dist/i18n/generated-locales/el-GR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/el-GR.generated.js +0 -5
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +8 -5
- package/dist/i18n/generated-locales/es-ES.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/es-ES.generated.js +0 -5
- package/dist/i18n/generated-locales/fi-FI.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/fi-FI.generated.js +0 -5
- package/dist/i18n/generated-locales/fr-FR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/fr-FR.generated.js +0 -5
- package/dist/i18n/generated-locales/he-IL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/he-IL.generated.js +0 -5
- package/dist/i18n/generated-locales/hu-HU.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/hu-HU.generated.js +0 -5
- package/dist/i18n/generated-locales/it-IT.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/it-IT.generated.js +0 -5
- package/dist/i18n/generated-locales/ja-JP.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ja-JP.generated.js +0 -5
- package/dist/i18n/generated-locales/ko-KR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ko-KR.generated.js +0 -5
- package/dist/i18n/generated-locales/nl-NL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/nl-NL.generated.js +0 -5
- package/dist/i18n/generated-locales/no-NO.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/no-NO.generated.js +0 -5
- package/dist/i18n/generated-locales/pl-PL.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pl-PL.generated.js +0 -5
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +8 -5
- package/dist/i18n/generated-locales/pt-BR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pt-BR.generated.js +0 -5
- package/dist/i18n/generated-locales/pt-PT.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pt-PT.generated.js +0 -5
- package/dist/i18n/generated-locales/ro-RO.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ro-RO.generated.js +0 -5
- package/dist/i18n/generated-locales/ru-RU.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/ru-RU.generated.js +0 -5
- package/dist/i18n/generated-locales/sr-SP.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/sr-SP.generated.js +0 -5
- package/dist/i18n/generated-locales/sv-SE.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/sv-SE.generated.js +0 -5
- package/dist/i18n/generated-locales/tr-TR.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/tr-TR.generated.js +0 -5
- package/dist/i18n/generated-locales/uk-UA.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/uk-UA.generated.js +0 -5
- package/dist/i18n/generated-locales/vi-VN.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/vi-VN.generated.js +0 -5
- package/dist/i18n/generated-locales/zh-CN.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/zh-CN.generated.js +0 -5
- package/dist/i18n/generated-locales/zh-TW.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/zh-TW.generated.js +0 -5
- package/dist/i18n/useListFormatter.d.ts +9 -0
- package/dist/i18n/useListFormatter.d.ts.map +1 -0
- package/dist/i18n/useListFormatter.js +41 -0
- package/dist/motion/animator.d.ts +83 -8
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +701 -119
- package/dist/motion/coast.d.ts +4 -1
- package/dist/motion/coast.d.ts.map +1 -1
- package/dist/motion/coast.js +4 -2
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +6 -2
- package/dist/motion/reducedMotionPlan.d.ts +7 -0
- package/dist/motion/reducedMotionPlan.d.ts.map +1 -1
- package/dist/motion/reducedMotionPlan.js +14 -1
- package/dist/motion/resolveMotion.d.ts +42 -0
- package/dist/motion/resolveMotion.d.ts.map +1 -0
- package/dist/motion/resolveMotion.js +43 -0
- package/dist/motion/roleValue.d.ts +2 -1
- package/dist/motion/roleValue.d.ts.map +1 -1
- package/dist/motion/roleValue.js +2 -1
- package/dist/motion/uikit/timing.d.ts +7 -1
- package/dist/motion/uikit/timing.d.ts.map +1 -1
- package/dist/motion/uikit/timing.js +19 -1
- package/dist/theme/defineTheme.d.ts +19 -5
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +64 -4
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
- package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
- package/dist/theme/domainTokens/index.d.ts +5 -4
- package/dist/theme/domainTokens/index.d.ts.map +1 -1
- package/dist/theme/domainTokens/index.js +5 -9
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/motionKnobs.d.ts +56 -0
- package/dist/theme/motionKnobs.d.ts.map +1 -0
- package/dist/theme/motionKnobs.js +48 -0
- package/dist/theme/resolveThemeValues.d.ts +11 -4
- package/dist/theme/resolveThemeValues.d.ts.map +1 -1
- package/dist/theme/resolveThemeValues.js +40 -4
- package/dist/theme/themeAdaptations.d.ts +7 -3
- package/dist/theme/themeAdaptations.d.ts.map +1 -1
- package/dist/theme/themeAdaptations.js +36 -7
- package/dist/theme/themeMotion.d.ts +96 -0
- package/dist/theme/themeMotion.d.ts.map +1 -0
- package/dist/theme/themeMotion.js +177 -0
- package/dist/theme/tokenReferences.d.ts +31 -0
- package/dist/theme/tokenReferences.d.ts.map +1 -0
- package/dist/theme/tokenReferences.js +132 -0
- package/dist/theme/tokens.d.ts +1 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +9 -129
- package/dist/theme/tokens.stylex.d.ts +12 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +12 -0
- package/dist/utils/focusOutline.stylex.d.ts +6 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.js +7 -0
- package/dist/utils/focusReturn.d.ts +17 -1
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +11 -4
- package/dist/utils/getNodeText.d.ts +8 -0
- package/dist/utils/getNodeText.d.ts.map +1 -0
- package/dist/utils/getNodeText.js +37 -0
- package/dist/utils/interactionModality.d.ts +11 -2
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +58 -5
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +17 -8
- package/dist/utils/plainDate.d.ts +2 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +46 -3
- package/dist/utils/presentation.d.ts +50 -0
- package/dist/utils/presentation.d.ts.map +1 -0
- package/dist/utils/presentation.js +125 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +20 -1
- package/dist/utils/primaryClick.d.ts +11 -0
- package/dist/utils/primaryClick.d.ts.map +1 -0
- package/dist/utils/primaryClick.js +25 -0
- package/dist/utils/sharedMutationObserver.d.ts +19 -11
- package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
- package/dist/utils/sharedMutationObserver.js +66 -26
- package/dist/utils/timeFormat.d.ts +47 -0
- package/dist/utils/timeFormat.d.ts.map +1 -0
- package/dist/utils/timeFormat.js +240 -0
- package/dist/utils/touchPresentation.d.ts +2 -2
- package/dist/utils/touchPresentation.d.ts.map +1 -1
- package/dist/utils/touchPresentation.js +13 -8
- package/dist/utils/touchPresentation.stylex.d.ts +15 -0
- package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
- package/dist/utils/touchPresentation.stylex.js +33 -0
- package/dist/utils/touchQueries.d.ts +13 -0
- package/dist/utils/touchQueries.d.ts.map +1 -0
- package/dist/utils/touchQueries.js +15 -0
- package/dist/utils/unicodeDigits.d.ts +20 -0
- package/dist/utils/unicodeDigits.d.ts.map +1 -0
- package/dist/utils/unicodeDigits.js +70 -0
- package/dist/utils/useFocusAcrossSwap.d.ts +19 -0
- package/dist/utils/useFocusAcrossSwap.d.ts.map +1 -0
- package/dist/utils/useFocusAcrossSwap.js +41 -0
- package/locales/af-ZA.json +0 -21
- package/locales/ar-SA.json +0 -21
- package/locales/ca-ES.json +0 -21
- package/locales/cs-CZ.json +0 -21
- package/locales/da-DK.json +0 -21
- package/locales/de-DE.json +0 -21
- package/locales/el-GR.json +0 -21
- package/locales/en.json +35 -23
- package/locales/es-ES.json +0 -21
- package/locales/fi-FI.json +0 -21
- package/locales/fr-FR.json +0 -21
- package/locales/he-IL.json +0 -21
- package/locales/hu-HU.json +0 -21
- package/locales/it-IT.json +0 -21
- package/locales/ja-JP.json +0 -21
- package/locales/ko-KR.json +0 -21
- package/locales/nl-NL.json +0 -21
- package/locales/no-NO.json +0 -21
- package/locales/pl-PL.json +0 -21
- package/locales/pseudo.json +23 -14
- package/locales/pt-BR.json +0 -21
- package/locales/pt-PT.json +0 -21
- package/locales/ro-RO.json +0 -21
- package/locales/ru-RU.json +0 -21
- package/locales/sr-SP.json +0 -21
- package/locales/sv-SE.json +0 -21
- package/locales/tr-TR.json +0 -21
- package/locales/uk-UA.json +0 -21
- package/locales/vi-VN.json +0 -21
- package/locales/zh-CN.json +0 -21
- package/locales/zh-TW.json +0 -21
- package/package.json +5 -4
- package/src/AlertDialog/AlertDialog.tsx +6 -5
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
- package/src/AppShell/AppShell.doc.mjs +1 -1
- package/src/AppShell/AppShell.spec.md +9 -12
- package/src/AppShell/AppShell.test.tsx +164 -2
- package/src/AppShell/AppShell.tsx +225 -5
- package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +534 -0
- package/src/AppShell/observeMainOverflow.test.ts +173 -0
- package/src/AppShell/observeMainOverflow.ts +143 -0
- package/src/Avatar/Avatar.spec.md +22 -22
- package/src/Avatar/Avatar.tsx +18 -1
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
- package/src/Badge/Badge.doc.mjs +1 -1
- package/src/Badge/Badge.tsx +19 -2
- package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
- package/src/BottomSheet/BottomSheet.test.tsx +46 -0
- package/src/BottomSheet/BottomSheet.tsx +1 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
- package/src/BottomSheet/useSheetGestures.test.ts +52 -0
- package/src/BottomSheet/useSheetGestures.ts +37 -6
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
- package/src/Button/Button.tsx +4 -4
- package/src/Calendar/Calendar.spec.md +87 -48
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/Carousel.doc.mjs +1 -1
- package/src/Carousel/Carousel.spec.md +9 -9
- package/src/Carousel/Carousel.test.tsx +124 -3
- package/src/Carousel/Carousel.tsx +10 -2
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +1 -16
- package/src/Chat/ChatComposer.spec.md +75 -59
- package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
- package/src/Chat/ChatDictationButton.spec.md +126 -81
- package/src/Chat/ChatLayout.spec.md +41 -36
- package/src/Chat/ChatLayoutScrollButton.spec.md +87 -103
- package/src/Chat/ChatMessage.spec.md +64 -65
- package/src/Chat/ChatSendButton.spec.md +78 -67
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/Citation/Citation.spec.md +60 -47
- package/src/ClickableCard/ClickableCard.test.tsx +96 -0
- package/src/ClickableCard/ClickableCard.tsx +48 -4
- package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +38 -3
- package/src/Collapsible/Collapsible.spec.md +2 -0
- package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
- package/src/ComplexSelector/ComplexSelector.test.tsx +148 -0
- package/src/ComplexSelector/ComplexSelector.tsx +41 -4
- package/src/ContextMenu/ContextMenu.spec.md +84 -56
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/ContextMenu/ContextMenuItem.spec.md +132 -0
- package/src/DateInput/DateInput.spec.md +74 -57
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +120 -0
- package/src/DateInput/MonthScroller.tsx +106 -20
- package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
- package/src/DateInput/TouchDateField.tsx +14 -3
- package/src/DateInput/Wheel.tsx +9 -6
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- package/src/DateInput/usePointerDragScroll.ts +34 -10
- package/src/DateInput/useScrollSettle.ts +38 -7
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
- package/src/DateRangeInput/DateRangeInput.tsx +16 -12
- package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
- package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
- package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
- package/src/DateTimeInput/DateTimeInput.tsx +46 -24
- package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
- package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
- package/src/Dialog/Dialog.test.tsx +216 -2
- package/src/Dialog/Dialog.tsx +42 -9
- package/src/Dialog/DialogHeader.tsx +5 -4
- package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
- package/src/Divider/Divider.tsx +2 -1
- package/src/Drawer/Drawer.spec.md +111 -80
- package/src/Drawer/Drawer.test.tsx +35 -0
- package/src/Drawer/Drawer.tsx +13 -2
- package/src/Drawer/DrawerHeader.spec.md +181 -0
- package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
- package/src/DropdownMenu/DropdownMenu.spec.md +198 -218
- package/src/DropdownMenu/DropdownMenu.test.tsx +158 -0
- package/src/DropdownMenu/DropdownMenu.tsx +43 -21
- package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +192 -0
- package/src/DropdownMenu/DropdownMenuDivider.spec.md +25 -31
- package/src/DropdownMenu/DropdownMenuGroup.spec.md +145 -0
- package/src/DropdownMenu/DropdownMenuItem.spec.md +48 -42
- package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +34 -37
- package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +54 -53
- package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +47 -41
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
- package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
- package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
- package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
- package/src/EmptyState/EmptyState.spec.md +35 -29
- package/src/EmptyState/EmptyState.tsx +2 -1
- package/src/Field/FieldLabel.tsx +5 -4
- package/src/Field/InputClearButton.tsx +3 -3
- package/src/Field/PanelSearchInput.tsx +2 -2
- package/src/FieldStatus/FieldStatus.tsx +9 -2
- package/src/FieldStatus/__tests__/FieldStatusAudit.a11y.chromium.spec.ts +477 -0
- package/src/FileInput/FileInput.test.tsx +159 -0
- package/src/FileInput/FileInput.tsx +34 -6
- package/src/FileInput/__tests__/FileInputAudit.a11y.chromium.spec.ts +796 -0
- package/src/FormLayout/FormLayout.spec.md +11 -20
- package/src/Heading/Heading.tsx +1 -1
- package/src/Icon/Icon.tsx +1 -1
- package/src/Indicator/CheckIndicator.spec.md +47 -42
- package/src/Indicator/CheckIndicator.tsx +2 -1
- package/src/Indicator/CheckboxIndicator.spec.md +40 -37
- package/src/Indicator/CheckboxIndicator.tsx +3 -1
- package/src/Indicator/Indicator.spec.md +188 -0
- package/src/Indicator/RadioIndicator.tsx +3 -1
- package/src/Item/Item.test.tsx +60 -0
- package/src/Item/Item.tsx +16 -8
- package/src/Item/ItemSwipeLayer.tsx +1 -1
- package/src/Kbd/Kbd.spec.md +81 -38
- package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
- package/src/Layer/popoverOperations.test.ts +205 -0
- package/src/Layer/popoverOperations.ts +172 -0
- package/src/Layer/useLayer.test.tsx +426 -4
- package/src/Layer/useLayer.tsx +145 -77
- package/src/Layout/Layout.spec.md +127 -131
- package/src/Layout/Layout.tsx +1 -1
- package/src/Layout/LayoutContent.spec.md +205 -0
- package/src/Layout/LayoutContent.tsx +1 -1
- package/src/Layout/LayoutFooter.spec.md +190 -0
- package/src/Layout/LayoutFooter.tsx +1 -1
- package/src/Layout/LayoutHeader.spec.md +193 -0
- package/src/Layout/LayoutHeader.tsx +1 -1
- package/src/Layout/LayoutPanel.spec.md +194 -0
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
- package/src/Lightbox/Lightbox.test.tsx +18 -0
- package/src/Lightbox/Lightbox.tsx +5 -0
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
- package/src/Link/Link.spec.md +3 -2
- package/src/Link/Link.tsx +11 -0
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +58 -0
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.spec.md +205 -0
- package/src/List/ListItem.tsx +3 -3
- package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +1 -1
- package/src/MetadataList/MetadataList.spec.md +187 -0
- package/src/MetadataList/MetadataListItem.spec.md +165 -0
- package/src/MobileNav/MobileNav.test.tsx +15 -0
- package/src/MobileNav/MobileNav.tsx +9 -1
- package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
- package/src/MoreMenu/MoreMenu.test.tsx +11 -0
- package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
- package/src/MultiSelector/MultiSelector.spec.md +7 -4
- package/src/MultiSelector/MultiSelector.test.tsx +270 -1
- package/src/MultiSelector/MultiSelector.tsx +25 -10
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
- package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
- package/src/NavMenu/NavHeadingMenuItem.tsx +5 -39
- package/src/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.test.tsx +68 -7
- package/src/NumberInput/NumberInput.tsx +44 -4
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/NumberInput/numberParser.ts +7 -45
- package/src/Outline/Outline.spec.md +165 -69
- package/src/Outline/Outline.test.tsx +67 -2
- package/src/Outline/Outline.tsx +23 -0
- package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +3 -4
- package/src/OverflowList/OverflowList.spec.md +102 -55
- package/src/Pagination/Pagination.spec.md +158 -84
- package/src/Popover/Popover.test.tsx +84 -0
- package/src/Popover/Popover.tsx +34 -14
- package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +70 -8
- package/src/Popover/usePopover.tsx +10 -3
- package/src/PowerSearch/PowerSearch.test.tsx +24 -0
- package/src/PowerSearch/PowerSearch.tsx +42 -31
- package/src/ProgressBar/ProgressBar.spec.md +143 -119
- package/src/ProgressBar/ProgressBar.test.tsx +108 -32
- package/src/ProgressBar/ProgressBar.tsx +58 -10
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
- package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
- package/src/RadioList/RadioList.spec.md +1 -1
- package/src/RadioList/RadioList.test.tsx +84 -0
- package/src/RadioList/RadioListItem.tsx +11 -2
- package/src/Resizable/Resizable.spec.md +144 -124
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
- package/src/Resizable/useResizable.test.ts +43 -0
- package/src/Resizable/useResizable.ts +32 -9
- package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
- package/src/Selector/Selector.test.tsx +90 -1
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
- package/src/Selector/useSelectorPresentation.ts +31 -3
- package/src/SideNav/SideNav.test.tsx +151 -4
- package/src/SideNav/SideNavItem.spec.md +14 -24
- package/src/SideNav/SideNavItem.tsx +27 -10
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
- package/src/Skeleton/Skeleton.tsx +3 -1
- package/src/Slider/Slider.test.tsx +31 -0
- package/src/Slider/Slider.tsx +8 -3
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
- package/src/Spinner/Spinner.tsx +5 -3
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/Stepper/Step.spec.md +36 -42
- package/src/Stepper/Step.tsx +33 -6
- package/src/Stepper/Stepper.doc.mjs +1 -1
- package/src/Stepper/Stepper.test.tsx +69 -7
- package/src/Switch/Switch.spec.md +1 -1
- package/src/Switch/Switch.test.tsx +66 -1
- package/src/Switch/Switch.tsx +11 -3
- package/src/TabList/TabList.test.tsx +58 -4
- package/src/TabList/TabList.tsx +16 -1
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
- package/src/Table/Table.spec.md +1 -1
- package/src/Table/Table.test.tsx +32 -0
- package/src/Table/Table.tsx +43 -11
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/__tests__/Table.a11y.states.ts +1 -5
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +73 -144
- package/src/Table/plugins/sortable/useTableSortable.tsx +44 -73
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +9 -21
- package/src/Text/Text.tsx +1 -1
- package/src/Text/useTruncation.test.tsx +128 -1
- package/src/Text/useTruncation.ts +23 -5
- package/src/TextArea/TextArea.spec.md +10 -13
- package/src/TextArea/TextArea.test.tsx +60 -0
- package/src/TextArea/TextArea.tsx +15 -1
- package/src/TextInput/TextInput.test.tsx +21 -0
- package/src/TextInput/TextInput.tsx +3 -1
- package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
- package/src/TimeInput/Presentation.test.tsx +21 -0
- package/src/TimeInput/TimeInput.doc.mjs +8 -8
- package/src/TimeInput/TimeInput.spec.md +58 -61
- package/src/TimeInput/TimeInput.test.tsx +76 -0
- package/src/TimeInput/TimeInput.tsx +36 -18
- package/src/TimeInput/TouchTimeField.tsx +4 -6
- package/src/Timestamp/Timestamp.spec.md +6 -12
- package/src/Timestamp/Timestamp.test.tsx +30 -5
- package/src/Timestamp/Timestamp.tsx +6 -2
- package/src/Timestamp/TimestampHoverCard.tsx +4 -4
- package/src/Toast/Toast.spec.md +15 -24
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +798 -1
- package/src/Toast/ToastViewport.tsx +121 -53
- package/src/ToggleButton/ToggleButton.test.tsx +27 -0
- package/src/ToggleButton/ToggleButtonGroup.tsx +20 -1
- package/src/Token/Token.doc.mjs +2 -2
- package/src/Token/Token.spec.md +52 -61
- package/src/Token/Token.test.tsx +104 -0
- package/src/Token/Token.tsx +75 -5
- package/src/Token/TokenLink.tsx +21 -7
- package/src/Tokenizer/Tokenizer.spec.md +18 -4
- package/src/Tokenizer/Tokenizer.test.tsx +176 -0
- package/src/Tokenizer/Tokenizer.tsx +48 -12
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +23 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- package/src/Tokenizer/TokenizerClearAllMessageContext.ts +21 -0
- package/src/Toolbar/Toolbar.spec.md +5 -6
- package/src/Toolbar/Toolbar.test.tsx +30 -0
- package/src/Toolbar/Toolbar.tsx +2 -1
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
- package/src/TopNav/TopNav.test.tsx +27 -0
- package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
- package/src/TopNav/TopNavMegaMenu.tsx +4 -1
- package/src/TopNav/TopNavMenu.test.tsx +17 -0
- package/src/TopNav/TopNavMenu.tsx +1 -0
- package/src/TreeList/TreeList.test.tsx +26 -0
- package/src/TreeList/TreeListItem.tsx +26 -4
- package/src/Typeahead/BaseTypeahead.doc.mjs +3 -3
- package/src/Typeahead/BaseTypeahead.spec.md +45 -45
- package/src/Typeahead/BaseTypeahead.tsx +48 -9
- package/src/Typeahead/Typeahead.test.tsx +294 -11
- package/src/Typeahead/Typeahead.tsx +51 -9
- package/src/__tests__/internalModulesNotExperimental.test.ts +88 -0
- package/src/__tests__/pressState.ts +8 -4
- package/src/gestures/GestureArena.ts +111 -11
- package/src/gestures/GestureHost.ts +2064 -0
- package/src/gestures/GestureRecognizer.ts +21 -1
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -0
- package/src/gestures/PressTracker.ts +386 -0
- package/src/gestures/README.md +420 -0
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
- package/src/gestures/SwipeGestureRecognizer.ts +197 -0
- package/src/gestures/TapGestureRecognizer.ts +4 -0
- package/src/gestures/VelocityTracker.ts +10 -3
- package/src/gestures/__tests__/GestureHost.test.ts +2136 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
- package/src/gestures/__tests__/PressTracker.test.ts +275 -0
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
- package/src/gestures/__tests__/arena.test.ts +40 -0
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
- package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
- package/src/gestures/__tests__/browser/fixture.ts +307 -0
- package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
- package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
- package/src/gestures/__tests__/haptics.test.ts +187 -0
- package/src/gestures/__tests__/harness.ts +52 -4
- package/src/gestures/__tests__/pressTrackerFactory.test.ts +59 -0
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/__tests__/useGestureRecognizer.test.tsx +570 -0
- package/src/gestures/haptics.ts +203 -0
- package/src/gestures/index.ts +79 -0
- package/src/gestures/nativeScroll.ts +277 -0
- package/src/gestures/touchAction.ts +191 -0
- package/src/gestures/touchActionRule.ts +157 -0
- package/src/gestures/types.ts +30 -9
- package/src/gestures/useGestureRecognizer.ts +305 -0
- package/src/hooks/index.ts +5 -1
- package/src/hooks/modalAnnounce.ts +129 -72
- package/src/hooks/scrollKeyboardDelegation.test.ts +33 -0
- package/src/hooks/scrollKeyboardDelegation.ts +9 -3
- package/src/hooks/useAdaptivePresentation.ts +4 -1
- package/src/hooks/useAnnounce.doc.mjs +35 -3
- package/src/hooks/useAnnounce.replace.test.tsx +516 -0
- package/src/hooks/useAnnounce.ts +209 -102
- package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
- package/src/hooks/useAnnounceRenderedText.ts +17 -3
- package/src/hooks/useBusyAnnouncement.ts +7 -10
- package/src/hooks/useMenuHover.ts +15 -1
- package/src/hooks/useScrollOverflow.doc.mjs +1 -1
- package/src/hooks/useScrollOverflow.test.tsx +102 -1
- package/src/hooks/useScrollOverflow.ts +59 -10
- package/src/i18n/__tests__/useListFormatter.test.tsx +58 -0
- package/src/i18n/generated-locales/af-ZA.generated.ts +0 -7
- package/src/i18n/generated-locales/ar-SA.generated.ts +0 -6
- package/src/i18n/generated-locales/ca-ES.generated.ts +0 -7
- package/src/i18n/generated-locales/cs-CZ.generated.ts +0 -6
- package/src/i18n/generated-locales/da-DK.generated.ts +0 -6
- package/src/i18n/generated-locales/de-DE.generated.ts +0 -6
- package/src/i18n/generated-locales/el-GR.generated.ts +0 -7
- package/src/i18n/generated-locales/en.generated.ts +9 -6
- package/src/i18n/generated-locales/es-ES.generated.ts +0 -7
- package/src/i18n/generated-locales/fi-FI.generated.ts +0 -6
- package/src/i18n/generated-locales/fr-FR.generated.ts +0 -7
- package/src/i18n/generated-locales/he-IL.generated.ts +0 -6
- package/src/i18n/generated-locales/hu-HU.generated.ts +0 -6
- package/src/i18n/generated-locales/it-IT.generated.ts +0 -7
- package/src/i18n/generated-locales/ja-JP.generated.ts +0 -6
- package/src/i18n/generated-locales/ko-KR.generated.ts +0 -6
- package/src/i18n/generated-locales/nl-NL.generated.ts +0 -6
- package/src/i18n/generated-locales/no-NO.generated.ts +0 -6
- package/src/i18n/generated-locales/pl-PL.generated.ts +0 -7
- package/src/i18n/generated-locales/pseudo.generated.ts +9 -6
- package/src/i18n/generated-locales/pt-BR.generated.ts +0 -7
- package/src/i18n/generated-locales/pt-PT.generated.ts +0 -7
- package/src/i18n/generated-locales/ro-RO.generated.ts +0 -6
- package/src/i18n/generated-locales/ru-RU.generated.ts +0 -7
- package/src/i18n/generated-locales/sr-SP.generated.ts +0 -6
- package/src/i18n/generated-locales/sv-SE.generated.ts +0 -6
- package/src/i18n/generated-locales/tr-TR.generated.ts +0 -7
- package/src/i18n/generated-locales/uk-UA.generated.ts +0 -7
- package/src/i18n/generated-locales/vi-VN.generated.ts +0 -6
- package/src/i18n/generated-locales/zh-CN.generated.ts +0 -6
- package/src/i18n/generated-locales/zh-TW.generated.ts +0 -6
- package/src/i18n/useListFormatter.ts +42 -0
- package/src/motion/MEASUREMENTS.md +2 -1
- package/src/motion/README.md +113 -33
- package/src/motion/__tests__/animator.interaction.browser.spec.ts +843 -0
- package/src/motion/__tests__/motionBundle.ts +14 -0
- package/src/motion/animator.test.ts +1125 -32
- package/src/motion/animator.ts +932 -130
- package/src/motion/coast.ts +10 -3
- package/src/motion/reducedMotion.ts +12 -2
- package/src/motion/reducedMotionPlan.test.ts +26 -0
- package/src/motion/reducedMotionPlan.ts +20 -1
- package/src/motion/resolveMotion.test.ts +123 -0
- package/src/motion/resolveMotion.ts +68 -0
- package/src/motion/roleValue.ts +2 -1
- package/src/motion/roles.test.ts +21 -4
- package/src/motion/uikit/tableImports.test.ts +293 -0
- package/src/motion/uikit/timing.ts +15 -1
- package/src/motion/uikit/values.test.ts +23 -12
- package/src/theme/Theme.doc.mjs +1 -1
- package/src/theme/defineTheme.ts +117 -8
- package/src/theme/derivedVarRegistry.test.ts +4 -0
- package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
- package/src/theme/domainTokens/index.ts +6 -10
- package/src/theme/expandMotionScale.test.ts +1 -1
- package/src/theme/index.ts +5 -0
- package/src/theme/motionKnobs.ts +82 -0
- package/src/theme/resolveThemeValues.ts +68 -6
- package/src/theme/themeAdaptations.ts +52 -12
- package/src/theme/themeMotion.test.ts +620 -0
- package/src/theme/themeMotion.ts +221 -0
- package/src/theme/tokenReferences.ts +149 -0
- package/src/theme/tokens.stylex.ts +10 -0
- package/src/theme/tokens.ts +15 -158
- package/src/utils/focusOutline.stylex.ts +28 -0
- package/src/utils/focusReturn.ts +17 -6
- package/src/utils/getNodeText.test.ts +24 -0
- package/src/utils/getNodeText.ts +37 -0
- package/src/utils/interactionModality.test.ts +45 -1
- package/src/utils/interactionModality.ts +64 -5
- package/src/utils/interactionOverlay.stylex.ts +12 -3
- package/src/utils/plainDate.test.ts +90 -0
- package/src/utils/plainDate.ts +58 -3
- package/src/utils/presentation.test.ts +380 -0
- package/src/utils/presentation.ts +180 -0
- package/src/utils/pressFeedback.test.ts +138 -0
- package/src/utils/pressFeedback.ts +34 -11
- package/src/utils/pressGesture.test.ts +9 -0
- package/src/utils/pressPaintPriority.test.ts +80 -0
- package/src/utils/primaryClick.test.ts +38 -0
- package/src/utils/primaryClick.ts +28 -0
- package/src/utils/sharedMutationObserver.test.ts +54 -1
- package/src/utils/sharedMutationObserver.ts +87 -29
- package/src/utils/timeFormat.test.ts +204 -0
- package/src/utils/timeFormat.ts +314 -0
- package/src/utils/touchPresentation.stylex.ts +43 -0
- package/src/utils/touchPresentation.test.ts +140 -1
- package/src/utils/touchPresentation.ts +13 -8
- package/src/utils/touchQueries.ts +15 -0
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
- package/src/utils/useFocusAcrossSwap.ts +55 -0
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
import React, {
|
|
28
28
|
lazy,
|
|
29
29
|
Suspense,
|
|
30
|
+
use,
|
|
30
31
|
useCallback,
|
|
31
32
|
useEffect,
|
|
32
33
|
useId,
|
|
@@ -51,6 +52,7 @@ import {
|
|
|
51
52
|
useFieldInputStyling,
|
|
52
53
|
} from '../Field/fieldParts';
|
|
53
54
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
55
|
+
import {TokenizerClearAllMessageContext} from './TokenizerClearAllMessageContext';
|
|
54
56
|
import {useBusyAnnouncement} from '../hooks/useBusyAnnouncement';
|
|
55
57
|
import {useAdaptivePresentation} from '../hooks/useAdaptivePresentation';
|
|
56
58
|
import {useIsHydrating} from '../hooks/useIsHydrating';
|
|
@@ -85,9 +87,11 @@ import {
|
|
|
85
87
|
} from '../theme/tokens.stylex';
|
|
86
88
|
import type {SearchableItem, SearchSource} from '../Typeahead/types';
|
|
87
89
|
import {composeEventHandlers, mergeProps} from '../utils';
|
|
90
|
+
import {joinAriaIDs} from '../utils/inputAria';
|
|
88
91
|
import {themeProps} from '../utils/themeProps';
|
|
89
92
|
import {useTranslator} from '../i18n';
|
|
90
93
|
import type {TokenizerBottomSheetProps} from './TokenizerBottomSheet';
|
|
94
|
+
import {useResolvedRequired} from '../hooks/useResolvedRequired';
|
|
91
95
|
|
|
92
96
|
// Re-export status types for convenience
|
|
93
97
|
export type {
|
|
@@ -754,8 +758,10 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
754
758
|
experimental,
|
|
755
759
|
id: idProp,
|
|
756
760
|
'aria-describedby': ariaDescribedByProp,
|
|
761
|
+
'aria-labelledby': ariaLabelledByProp,
|
|
757
762
|
...restProps
|
|
758
763
|
}: TokenizerWithPresentationProps<T>): React.JSX.Element {
|
|
764
|
+
const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
|
|
759
765
|
const {rest, container} = useFieldInputStyling('Tokenizer', restProps, {
|
|
760
766
|
containerXstyle,
|
|
761
767
|
containerClassName,
|
|
@@ -768,8 +774,15 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
768
774
|
const size = useSize(sizeProp, 'md');
|
|
769
775
|
const generatedInputId = useId();
|
|
770
776
|
const inputId = idProp ?? generatedInputId;
|
|
777
|
+
const fieldLabelId = useId();
|
|
771
778
|
const descriptionId = useId();
|
|
772
779
|
const statusMessageId = useId();
|
|
780
|
+
// A caller aria-labelledby names the input together with the field's own
|
|
781
|
+
// label, which it would otherwise replace.
|
|
782
|
+
const fieldLabelledBy =
|
|
783
|
+
ariaLabelledByProp != null
|
|
784
|
+
? joinAriaIDs(fieldLabelId, ariaLabelledByProp)
|
|
785
|
+
: undefined;
|
|
773
786
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
774
787
|
const wrapperRef = useRef<HTMLDivElement>(null);
|
|
775
788
|
|
|
@@ -1111,12 +1124,12 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1111
1124
|
return [
|
|
1112
1125
|
{
|
|
1113
1126
|
id: `${CREATABLE_ID_PREFIX}${trimmed}`,
|
|
1114
|
-
label:
|
|
1127
|
+
label: t('@astryx.tokenizer.create', {value: trimmed}),
|
|
1115
1128
|
auxiliaryData: {__createdValue: trimmed},
|
|
1116
1129
|
} as unknown as T,
|
|
1117
1130
|
];
|
|
1118
1131
|
},
|
|
1119
|
-
[hasCreate, selectedIds, selectedLabels],
|
|
1132
|
+
[hasCreate, selectedIds, selectedLabels, t],
|
|
1120
1133
|
);
|
|
1121
1134
|
|
|
1122
1135
|
const emptySource: SearchSource<T> = useMemo(
|
|
@@ -1214,15 +1227,27 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1214
1227
|
);
|
|
1215
1228
|
|
|
1216
1229
|
// Handle clearing all items
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1230
|
+
// A composing component that words its own Clear all (PowerSearch) provides
|
|
1231
|
+
// its words; otherwise the field's own (component:Tokenizer AR7).
|
|
1232
|
+
const clearAllMessage =
|
|
1233
|
+
use(TokenizerClearAllMessageContext) ?? t('@astryx.tokenizer.allRemoved');
|
|
1234
|
+
const handleClearAll = useCallback(
|
|
1235
|
+
(options?: {silent?: boolean}) => {
|
|
1236
|
+
if (isDisabled || value.length === 0) {
|
|
1237
|
+
return;
|
|
1238
|
+
}
|
|
1239
|
+
// Report the last item as removed (convention)
|
|
1240
|
+
const lastItem = value[value.length - 1];
|
|
1241
|
+
onChange([], {item: lastItem, type: 'remove'});
|
|
1242
|
+
// Focus moves to the input, so the emptied selection is announced, in
|
|
1243
|
+
// the sheet's words (WCAG 4.1.3). The sheet announces its own Clear all.
|
|
1244
|
+
if (!options?.silent) {
|
|
1245
|
+
announce(clearAllMessage);
|
|
1246
|
+
}
|
|
1247
|
+
inputRef.current?.focus();
|
|
1248
|
+
},
|
|
1249
|
+
[value, onChange, isDisabled, announce, clearAllMessage],
|
|
1250
|
+
);
|
|
1226
1251
|
|
|
1227
1252
|
// Handle backspace on empty input — remove last token
|
|
1228
1253
|
const handleKeyDown = useCallback(
|
|
@@ -1391,12 +1416,21 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1391
1416
|
isFocusableDisabled={showsDisabledMessage}
|
|
1392
1417
|
hasAutoFocus={hasAutoFocus}
|
|
1393
1418
|
inputId={inputId}
|
|
1419
|
+
ariaLabelledBy={fieldLabelledBy}
|
|
1394
1420
|
ariaDescribedBy={
|
|
1395
1421
|
[ariaDescribedByProp, ariaDescribedBy]
|
|
1396
1422
|
.filter(Boolean)
|
|
1397
1423
|
.join(' ') || undefined
|
|
1398
1424
|
}
|
|
1399
1425
|
onChangeQuery={onChangeQuery}
|
|
1426
|
+
// The resolved required state reaches the combobox, also when a
|
|
1427
|
+
// FormLayout default hides the visible marker (component:FormLayout
|
|
1428
|
+
// FR5, AR2).
|
|
1429
|
+
aria-required={isEffectivelyRequired || rest['aria-required']}
|
|
1430
|
+
// An error status is exposed on the combobox as on every other field
|
|
1431
|
+
// (WCAG 4.1.2; spec:AST-020 FR9). Without one, a caller's own
|
|
1432
|
+
// aria-required / aria-invalid still applies.
|
|
1433
|
+
aria-invalid={status?.type === 'error' || rest['aria-invalid']}
|
|
1400
1434
|
__queryEntries={createEntries}
|
|
1401
1435
|
debounceMs={debounceMs}
|
|
1402
1436
|
onKeyDown={handleKeyDown}
|
|
@@ -1457,6 +1491,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1457
1491
|
ref={triggerMergedRef}
|
|
1458
1492
|
type="button"
|
|
1459
1493
|
id={inputId}
|
|
1494
|
+
aria-labelledby={fieldLabelledBy}
|
|
1460
1495
|
aria-haspopup="dialog"
|
|
1461
1496
|
aria-expanded={isSheetOpen}
|
|
1462
1497
|
aria-disabled={isDisabled || undefined}
|
|
@@ -1625,7 +1660,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1625
1660
|
emptySearchText={emptySearchText}
|
|
1626
1661
|
onAdd={handleAdd}
|
|
1627
1662
|
onRemove={handleRemove}
|
|
1628
|
-
onClearAll={handleClearAll}
|
|
1663
|
+
onClearAll={() => handleClearAll({silent: true})}
|
|
1629
1664
|
onChangeQuery={handleSheetQueryChange}
|
|
1630
1665
|
/>
|
|
1631
1666
|
)}
|
|
@@ -1707,6 +1742,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1707
1742
|
isLabelHidden={isLabelHidden}
|
|
1708
1743
|
description={description}
|
|
1709
1744
|
inputID={inputId}
|
|
1745
|
+
labelID={ariaLabelledByProp != null ? fieldLabelId : undefined}
|
|
1710
1746
|
descriptionID={description ? descriptionId : undefined}
|
|
1711
1747
|
isOptional={isOptional}
|
|
1712
1748
|
isRequired={isRequired}
|
|
@@ -75,6 +75,7 @@ function Harness({
|
|
|
75
75
|
maxEntries?: number;
|
|
76
76
|
isDisabled?: boolean;
|
|
77
77
|
disabledMessage?: string;
|
|
78
|
+
'aria-labelledby'?: string;
|
|
78
79
|
debounceMs?: number;
|
|
79
80
|
onFocus?: (event: React.FocusEvent) => void;
|
|
80
81
|
onBlur?: (event: React.FocusEvent) => void;
|
|
@@ -238,6 +239,16 @@ describe('Tokenizer experimental.presentation (FR16)', () => {
|
|
|
238
239
|
});
|
|
239
240
|
|
|
240
241
|
describe('Tokenizer sheet presentation (single-sheet touch flow)', () => {
|
|
242
|
+
it('names the sheet trigger by its label, then a caller aria-labelledby', () => {
|
|
243
|
+
render(
|
|
244
|
+
<>
|
|
245
|
+
<span id="billing-heading">Billing</span>
|
|
246
|
+
<Harness aria-labelledby="billing-heading" />
|
|
247
|
+
</>,
|
|
248
|
+
);
|
|
249
|
+
expect(screen.getByRole('button', {name: 'Tags Billing'})).toBeTruthy();
|
|
250
|
+
});
|
|
251
|
+
|
|
241
252
|
it('keeps rows stable while open and applies selected-first order on reopen (FR19)', async () => {
|
|
242
253
|
const spy = vi.fn();
|
|
243
254
|
render(<Harness spy={spy} />);
|
|
@@ -797,6 +808,14 @@ describe('Tokenizer sheet presentation (single-sheet touch flow)', () => {
|
|
|
797
808
|
),
|
|
798
809
|
).toHaveTextContent('All items removed'),
|
|
799
810
|
);
|
|
811
|
+
// Exactly one live region says it: the field's own region stays silent
|
|
812
|
+
// for a Clear all the sheet already announced.
|
|
813
|
+
const saying = Array.from(
|
|
814
|
+
document.querySelectorAll(
|
|
815
|
+
'[aria-live], [role="status"], [role="alert"]',
|
|
816
|
+
),
|
|
817
|
+
).filter(region => region.textContent?.includes('All items removed'));
|
|
818
|
+
expect(saying).toHaveLength(1);
|
|
800
819
|
} finally {
|
|
801
820
|
modalSpy.mockRestore();
|
|
802
821
|
}
|
|
@@ -1787,7 +1806,7 @@ describe('Tokenizer sheet presentation (single-sheet touch flow)', () => {
|
|
|
1787
1806
|
// changes until the sheet closes.
|
|
1788
1807
|
compact = false;
|
|
1789
1808
|
act(() => {
|
|
1790
|
-
for (const cb of listeners) cb();
|
|
1809
|
+
for (const cb of listeners) {cb();}
|
|
1791
1810
|
});
|
|
1792
1811
|
expect(screen.getByRole('dialog', {name: 'Tags'})).toBe(dialog);
|
|
1793
1812
|
expect(trigger).toBeInTheDocument();
|
|
@@ -2531,7 +2550,7 @@ describe('Tokenizer sheet presentation (single-sheet touch flow)', () => {
|
|
|
2531
2550
|
// the hand-off inside the field reports neither a blur nor a focus.
|
|
2532
2551
|
compact = false;
|
|
2533
2552
|
act(() => {
|
|
2534
|
-
for (const cb of listeners) cb();
|
|
2553
|
+
for (const cb of listeners) {cb();}
|
|
2535
2554
|
});
|
|
2536
2555
|
expect(screen.getByRole('combobox')).toHaveFocus();
|
|
2537
2556
|
expect(onFocus).toHaveBeenCalledTimes(1);
|
|
@@ -2539,14 +2558,14 @@ describe('Tokenizer sheet presentation (single-sheet touch flow)', () => {
|
|
|
2539
2558
|
// And back: the input focused, the screen becomes compact again.
|
|
2540
2559
|
compact = true;
|
|
2541
2560
|
act(() => {
|
|
2542
|
-
for (const cb of listeners) cb();
|
|
2561
|
+
for (const cb of listeners) {cb();}
|
|
2543
2562
|
});
|
|
2544
2563
|
expect(openTrigger()).toHaveFocus();
|
|
2545
2564
|
// Unfocused, a change moves nothing.
|
|
2546
2565
|
openTrigger().blur();
|
|
2547
2566
|
compact = false;
|
|
2548
2567
|
act(() => {
|
|
2549
|
-
for (const cb of listeners) cb();
|
|
2568
|
+
for (const cb of listeners) {cb();}
|
|
2550
2569
|
});
|
|
2551
2570
|
expect(document.body).toHaveFocus();
|
|
2552
2571
|
});
|
|
@@ -41,15 +41,15 @@ import {BottomSheet} from '../BottomSheet/BottomSheet';
|
|
|
41
41
|
import {Button} from '../Button/Button';
|
|
42
42
|
import {EmptyState} from '../EmptyState/EmptyState';
|
|
43
43
|
import {PanelSearchInput} from '../Field/PanelSearchInput';
|
|
44
|
-
import {Icon} from '../Icon';
|
|
44
|
+
import {Icon} from '../Icon/Icon';
|
|
45
45
|
import {CheckboxIndicator} from '../Indicator/CheckboxIndicator';
|
|
46
|
-
import {Spinner} from '../Spinner';
|
|
46
|
+
import {Spinner} from '../Spinner/Spinner';
|
|
47
47
|
import {useBusyAnnouncement} from '../hooks/useBusyAnnouncement';
|
|
48
48
|
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
49
49
|
import {useAnnounce} from '../hooks/useAnnounce';
|
|
50
50
|
import {useAnnounceRenderedText} from '../hooks/useAnnounceRenderedText';
|
|
51
51
|
import {Text} from '../Text/Text';
|
|
52
|
-
import {useTranslator} from '../i18n';
|
|
52
|
+
import {useTranslator} from '../i18n/useTranslator';
|
|
53
53
|
import {warnOnce} from '../utils/devWarning';
|
|
54
54
|
import type {SearchableItem, SearchSource} from '../Typeahead/types';
|
|
55
55
|
import {colorVars, radiusVars, spacingVars} from '../theme/tokens.stylex';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file TokenizerClearAllMessageContext.ts
|
|
7
|
+
* @input None
|
|
8
|
+
* @output A context carrying the words a composing component announces for
|
|
9
|
+
* the field's Clear all
|
|
10
|
+
* @position Internal to Core: not exported from the Tokenizer barrel. A
|
|
11
|
+
* component that composes Tokenizer and words its own Clear all (PowerSearch:
|
|
12
|
+
* "All filters removed") provides it; Tokenizer otherwise announces its own
|
|
13
|
+
* words (component:Tokenizer AR7).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import {createContext} from 'react';
|
|
17
|
+
|
|
18
|
+
export const TokenizerClearAllMessageContext = createContext<string | null>(
|
|
19
|
+
null,
|
|
20
|
+
);
|
|
21
|
+
TokenizerClearAllMessageContext.displayName = 'TokenizerClearAllMessageContext';
|
|
@@ -80,10 +80,9 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
80
80
|
that does not hold the stop, the stop stays on the earlier control, so
|
|
81
81
|
Shift+Tab from the clicked control lands on that earlier control inside the
|
|
82
82
|
toolbar before leaving it.
|
|
83
|
-
- **
|
|
84
|
-
|
|
85
|
-
it
|
|
86
|
-
makes the toolbar a single tab stop.
|
|
83
|
+
- **Some fields keep their own tab stops.** A `textarea` or `select` in the
|
|
84
|
+
row is outside the roving stop: it keeps its own tab stop and the arrow keys
|
|
85
|
+
skip it. The APG toolbar pattern makes the toolbar a single tab stop.
|
|
87
86
|
|
|
88
87
|
## Ownership boundary
|
|
89
88
|
|
|
@@ -115,7 +114,7 @@ owns the shared structural-region boundary.
|
|
|
115
114
|
| FR1 | The render contains Section-owned Outer chrome around one Toolbar carrying `role="toolbar"`, `aria-label` from `label`, `aria-orientation`, and the `toolbar` target with `size`. Caller `role`, `aria-label`, and `aria-orientation` are dropped; other DOM props reach the toolbar row; `ref`, `className`, `style`, and `xstyle` reach the Section. | Current source, docs, tests, and family |
|
|
116
115
|
| FR2 | Without center content the Toolbar is a flex line of the present start and end lanes, a row when horizontal and a column of lanes when vertical; with center content it is a three-lane grid whose lanes sit side by side in either orientation. Each lane lays its controls out in a row. No lane clips its content, and the center lane can shrink below its content width. `gap` spaces controls within and between lanes. | Current source and focused structure tests |
|
|
117
116
|
| FR3 | Variant (default `transparent`), selected divider edges, and block padding by size remain delegated to Section, while Toolbar retains toolbar semantics, keyboard behavior, and internal layout. | Current source, docs, and family contract |
|
|
118
|
-
| FR4 | The row MUST be a single tab stop. ArrowRight and ArrowLeft (horizontal) or ArrowDown and ArrowUp (vertical) move focus between its controls, wrapping at the ends and skipping disabled controls; Home and End move to the first and last. Implementation gap: only buttons, inputs, and elements with `tabindex` share the stop, so
|
|
117
|
+
| FR4 | The row MUST be a single tab stop. ArrowRight and ArrowLeft (horizontal) or ArrowDown and ArrowUp (vertical) move focus between its controls, wrapping at the ends and skipping disabled controls; Home and End move to the first and last. Implementation gap: only buttons, inputs, links, and elements with `tabindex` share the stop, so `textarea` and `select` carry their own tab stops, and a pointer click does not move the stop (Current-state impact). Arrows do not move focus out of a text input whose caret is mid-line, and inside an open composed menu arrow keys belong to the menu. The toolbar keeps its tab stop after a composed menu is dismissed from outside, and keeps its own arrow movement when rendered inside a popover. | APG toolbar pattern; current source and tests |
|
|
119
118
|
| FR5 | Caller `onKeyDown`, `onFocus`, and `onBlur` run first; when the caller cancels the event, the built-in handling is skipped. | Current source and tests |
|
|
120
119
|
| FR6 | Keyboard focus entering the row can show a brief, self-dismissing hint for its arrow-key axis. | Current source |
|
|
121
120
|
| FR7 | `size` (default `md`) is provided to descendant controls as their default size; Toolbar starts its own size scope and does not inherit an outer size provider (`architecture:component-size-cascade` INV7). | Current source and tests |
|
|
@@ -204,7 +203,7 @@ Read from source, with no focused test yet:
|
|
|
204
203
|
- FR2: the flex and grid layouts themselves, and `gap` spacing.
|
|
205
204
|
- FR3: divider edges.
|
|
206
205
|
- FR5: caller `onFocus` and `onBlur` running first and their cancellation.
|
|
207
|
-
- FR4:
|
|
206
|
+
- FR4: `textarea` and `select` keeping their own tab stops, and the stop
|
|
208
207
|
staying put after a pointer click.
|
|
209
208
|
- FR6.
|
|
210
209
|
- FR7: descendant controls taking `size` as their default, and the fresh size
|
|
@@ -370,6 +370,36 @@ describe('Toolbar', () => {
|
|
|
370
370
|
expect(buttons[2]).toHaveAttribute('tabindex', '-1');
|
|
371
371
|
});
|
|
372
372
|
|
|
373
|
+
it('keeps a link member in the arrow order and off the tab order', async () => {
|
|
374
|
+
const user = userEvent.setup();
|
|
375
|
+
render(
|
|
376
|
+
<>
|
|
377
|
+
<Toolbar
|
|
378
|
+
label="Actions"
|
|
379
|
+
startContent={
|
|
380
|
+
<>
|
|
381
|
+
<button type="button">Cut</button>
|
|
382
|
+
<a href="https://example.com">Docs</a>
|
|
383
|
+
<button type="button">Paste</button>
|
|
384
|
+
</>
|
|
385
|
+
}
|
|
386
|
+
/>
|
|
387
|
+
<button type="button">After</button>
|
|
388
|
+
</>,
|
|
389
|
+
);
|
|
390
|
+
|
|
391
|
+
const cut = screen.getByRole('button', {name: 'Cut'});
|
|
392
|
+
cut.focus();
|
|
393
|
+
await user.tab();
|
|
394
|
+
expect(screen.getByRole('button', {name: 'After'})).toHaveFocus();
|
|
395
|
+
|
|
396
|
+
cut.focus();
|
|
397
|
+
await user.keyboard('{ArrowRight}');
|
|
398
|
+
expect(screen.getByRole('link', {name: 'Docs'})).toHaveFocus();
|
|
399
|
+
await user.keyboard('{ArrowRight}');
|
|
400
|
+
expect(screen.getByRole('button', {name: 'Paste'})).toHaveFocus();
|
|
401
|
+
});
|
|
402
|
+
|
|
373
403
|
it('keeps its tab stop after outside dismissal of MoreMenu', async () => {
|
|
374
404
|
const user = userEvent.setup();
|
|
375
405
|
render(
|
package/src/Toolbar/Toolbar.tsx
CHANGED
|
@@ -248,7 +248,8 @@ export function Toolbar({
|
|
|
248
248
|
const gapVar = spacingVars[spacingStepToVar[gap]] as string;
|
|
249
249
|
|
|
250
250
|
const {listRef, handleKeyDown, handleFocus} = useListFocus<HTMLDivElement>({
|
|
251
|
-
|
|
251
|
+
// `a[href]` catches a Button rendered with `href`.
|
|
252
|
+
itemSelector: 'button, input, a[href], [tabindex]',
|
|
252
253
|
boundarySelector: '[role="toolbar"], [popover]',
|
|
253
254
|
orientation,
|
|
254
255
|
hasRovingTabIndex: true,
|
|
@@ -93,15 +93,27 @@ async function runState(
|
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
// Checking coverage runs every state again, which on a loaded runner nears
|
|
97
|
+
// the per-test timeout as one test. It runs as one serial part per state,
|
|
98
|
+
// sharing their results, then one check over all of them.
|
|
99
|
+
test.describe('every toolbar expectation is exercised by a Toolbar state', () => {
|
|
100
|
+
test.describe.configure({mode: 'serial'});
|
|
100
101
|
const results: BindingResult[] = [];
|
|
102
|
+
|
|
101
103
|
for (const state of TOOLBAR_BINDING_STATES) {
|
|
102
|
-
|
|
104
|
+
test(`runs ${state.id}`, async ({page}) => {
|
|
105
|
+
const cdp = await page.context().newCDPSession(page);
|
|
106
|
+
results.push(await runState(page, cdp, state));
|
|
107
|
+
});
|
|
103
108
|
}
|
|
104
|
-
|
|
109
|
+
|
|
110
|
+
test('no expectation is left unexercised', () => {
|
|
111
|
+
// Every part ran in this worker; this test alone proves nothing.
|
|
112
|
+
expect(results.map(result => result.state).sort()).toEqual(
|
|
113
|
+
TOOLBAR_BINDING_STATES.map(state => state.id).sort(),
|
|
114
|
+
);
|
|
115
|
+
expect(neverExercised(results)).toEqual([]);
|
|
116
|
+
});
|
|
105
117
|
});
|
|
106
118
|
|
|
107
119
|
/**
|
|
@@ -104,16 +104,27 @@ async function runState(
|
|
|
104
104
|
});
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
// Checking coverage runs every state again, which on a loaded runner nears
|
|
108
|
+
// the per-test timeout as one test. It runs as one serial part per state,
|
|
109
|
+
// sharing their results, then one check over all of them.
|
|
110
|
+
test.describe('every tooltip expectation is exercised by a Tooltip state', () => {
|
|
111
|
+
test.describe.configure({mode: 'serial'});
|
|
112
112
|
const results: BindingResult[] = [];
|
|
113
|
+
|
|
113
114
|
for (const state of TOOLTIP_BINDING_STATES) {
|
|
114
|
-
|
|
115
|
+
test(`runs ${state.id}`, async ({page}) => {
|
|
116
|
+
const cdp = await page.context().newCDPSession(page);
|
|
117
|
+
results.push(await runState(page, cdp, state));
|
|
118
|
+
});
|
|
115
119
|
}
|
|
116
|
-
|
|
120
|
+
|
|
121
|
+
test('no expectation is left unexercised', () => {
|
|
122
|
+
// Every part ran in this worker; this test alone proves nothing.
|
|
123
|
+
expect(results.map(result => result.state).sort()).toEqual(
|
|
124
|
+
TOOLTIP_BINDING_STATES.map(state => state.id).sort(),
|
|
125
|
+
);
|
|
126
|
+
expect(neverExercised(results)).toEqual([]);
|
|
127
|
+
});
|
|
117
128
|
});
|
|
118
129
|
|
|
119
130
|
for (const state of TOOLTIP_BINDING_STATES) {
|
|
@@ -377,6 +377,33 @@ describe('TopNavHeading', () => {
|
|
|
377
377
|
);
|
|
378
378
|
});
|
|
379
379
|
|
|
380
|
+
it('moves focus one item per arrow key in a NavHeadingMenu (APG menu)', async () => {
|
|
381
|
+
__resetMenuPressForTest();
|
|
382
|
+
const user = userEvent.setup();
|
|
383
|
+
render(
|
|
384
|
+
<TopNavHeading
|
|
385
|
+
heading="My App"
|
|
386
|
+
menu={
|
|
387
|
+
<NavHeadingMenu>
|
|
388
|
+
<NavHeadingMenuItem label="One" onClick={() => {}} />
|
|
389
|
+
<NavHeadingMenuItem label="Two" onClick={() => {}} />
|
|
390
|
+
<NavHeadingMenuItem label="Three" onClick={() => {}} />
|
|
391
|
+
</NavHeadingMenu>
|
|
392
|
+
}
|
|
393
|
+
/>,
|
|
394
|
+
);
|
|
395
|
+
await user.click(screen.getByRole('button', {name: 'Open menu'}));
|
|
396
|
+
const item = (name: string) =>
|
|
397
|
+
screen.getByRole('menuitem', {name, hidden: true});
|
|
398
|
+
item('One').focus();
|
|
399
|
+
fireEvent.keyDown(item('One'), {key: 'ArrowDown'});
|
|
400
|
+
expect(item('Two')).toHaveFocus();
|
|
401
|
+
fireEvent.keyDown(item('Two'), {key: 'ArrowDown'});
|
|
402
|
+
expect(item('Three')).toHaveFocus();
|
|
403
|
+
fireEvent.keyDown(item('Three'), {key: 'ArrowUp'});
|
|
404
|
+
expect(item('Two')).toHaveFocus();
|
|
405
|
+
});
|
|
406
|
+
|
|
380
407
|
it('after a pointer pick, returns focus to the trigger without a keyboard ring (interaction-modality INV1)', async () => {
|
|
381
408
|
__resetMenuPressForTest();
|
|
382
409
|
const user = userEvent.setup();
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* SYNC: When TopNavMegaMenu changes, update tests to match new behavior
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import {createRef} from 'react';
|
|
12
13
|
import * as stylex from '@stylexjs/stylex';
|
|
13
14
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
14
15
|
import {describe, it, expect, vi, beforeAll, afterAll, afterEach} from 'vitest';
|
|
@@ -1130,3 +1131,23 @@ describe('TopNavMegaMenuItem pass-through props', () => {
|
|
|
1130
1131
|
);
|
|
1131
1132
|
});
|
|
1132
1133
|
});
|
|
1134
|
+
|
|
1135
|
+
describe('TopNavMegaMenu ref', () => {
|
|
1136
|
+
const items = <TopNavMegaMenuItem title="Analytics" href="/analytics" />;
|
|
1137
|
+
|
|
1138
|
+
it('forwards its ref to the trigger button', () => {
|
|
1139
|
+
const ref = createRef<HTMLButtonElement>();
|
|
1140
|
+
render(<TopNavMegaMenu ref={ref} label="Products" items={items} />);
|
|
1141
|
+
expect(ref.current).toBe(screen.getByRole('button', {name: 'Products'}));
|
|
1142
|
+
});
|
|
1143
|
+
|
|
1144
|
+
it('forwards its ref to the drawer trigger', () => {
|
|
1145
|
+
const ref = createRef<HTMLButtonElement>();
|
|
1146
|
+
render(
|
|
1147
|
+
<TopNavRenderContext value="drawer">
|
|
1148
|
+
<TopNavMegaMenu ref={ref} label="Products" items={items} />
|
|
1149
|
+
</TopNavRenderContext>,
|
|
1150
|
+
);
|
|
1151
|
+
expect(ref.current).toBe(screen.getByRole('button', {name: /Products/}));
|
|
1152
|
+
});
|
|
1153
|
+
});
|
|
@@ -378,6 +378,7 @@ export function TopNavMegaMenu({
|
|
|
378
378
|
if (renderMode === 'drawer') {
|
|
379
379
|
return (
|
|
380
380
|
<DrawerMegaMenu
|
|
381
|
+
ref={ref}
|
|
381
382
|
label={label}
|
|
382
383
|
items={items}
|
|
383
384
|
featured={featured}
|
|
@@ -564,6 +565,7 @@ function DefaultMegaMenu({
|
|
|
564
565
|
// =============================================================================
|
|
565
566
|
|
|
566
567
|
function DrawerMegaMenu({
|
|
568
|
+
ref,
|
|
567
569
|
label,
|
|
568
570
|
items,
|
|
569
571
|
featured,
|
|
@@ -572,7 +574,7 @@ function DrawerMegaMenu({
|
|
|
572
574
|
style,
|
|
573
575
|
onClick: onClickProp,
|
|
574
576
|
...rest
|
|
575
|
-
}: Pick<TopNavMegaMenuProps, 'label' | 'items' | 'featured'> &
|
|
577
|
+
}: Pick<TopNavMegaMenuProps, 'ref' | 'label' | 'items' | 'featured'> &
|
|
576
578
|
BaseProps<HTMLButtonElement>) {
|
|
577
579
|
const [isExpanded, setIsExpanded] = useState(false);
|
|
578
580
|
const pressable = usePressFeedback();
|
|
@@ -582,6 +584,7 @@ function DrawerMegaMenu({
|
|
|
582
584
|
<div {...stylex.props(styles.drawerSection)}>
|
|
583
585
|
{/* Header toggle — same pattern as TopNavMenu drawer */}
|
|
584
586
|
<button
|
|
587
|
+
ref={ref}
|
|
585
588
|
type="button"
|
|
586
589
|
{...rest}
|
|
587
590
|
onClick={composeEventHandlers(onClickProp, () =>
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* SYNC: When TopNavMenu changes, update tests to match new behavior
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
import {createRef} from 'react';
|
|
12
13
|
import {beforeEach, describe, it, expect, vi} from 'vitest';
|
|
13
14
|
import {render, screen, fireEvent, act} from '@testing-library/react';
|
|
14
15
|
import userEvent from '@testing-library/user-event';
|
|
@@ -322,6 +323,22 @@ describe('TopNavMenu pass-through props', () => {
|
|
|
322
323
|
expect(trigger).toHaveAttribute('data-source', 'nav');
|
|
323
324
|
});
|
|
324
325
|
|
|
326
|
+
it('forwards its ref to the trigger button', () => {
|
|
327
|
+
const ref = createRef<HTMLButtonElement>();
|
|
328
|
+
render(<TopNavMenu ref={ref} label="Products" items={mockItems} />);
|
|
329
|
+
expect(ref.current).toBe(screen.getByRole('button', {name: 'Products'}));
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it('forwards its ref to the drawer trigger', () => {
|
|
333
|
+
const ref = createRef<HTMLButtonElement>();
|
|
334
|
+
render(
|
|
335
|
+
<TopNavRenderContext value="drawer">
|
|
336
|
+
<TopNavMenu ref={ref} label="Products" items={mockItems} />
|
|
337
|
+
</TopNavRenderContext>,
|
|
338
|
+
);
|
|
339
|
+
expect(ref.current).toBe(screen.getByRole('button', {name: /Products/}));
|
|
340
|
+
});
|
|
341
|
+
|
|
325
342
|
it('keeps its own popup wiring when a caller passes the same attributes', () => {
|
|
326
343
|
render(
|
|
327
344
|
<TopNavMenu
|
|
@@ -861,6 +861,26 @@ describe('TreeList', () => {
|
|
|
861
861
|
});
|
|
862
862
|
});
|
|
863
863
|
|
|
864
|
+
it("keeps focus on an item's inner link when the item becomes disabled (spec:AST-085 FR4)", () => {
|
|
865
|
+
const tree = (isDisabled: boolean) => [
|
|
866
|
+
{
|
|
867
|
+
id: 'docs',
|
|
868
|
+
label: 'Docs',
|
|
869
|
+
isExpanded: true,
|
|
870
|
+
children: [
|
|
871
|
+
{id: 'report', label: 'Report', href: '/report', isDisabled},
|
|
872
|
+
],
|
|
873
|
+
},
|
|
874
|
+
];
|
|
875
|
+
const {rerender} = render(<TreeList items={tree(false)} />);
|
|
876
|
+
// A pointer click leaves focus on the inner link.
|
|
877
|
+
screen.getByRole('link', {name: 'Report', hidden: true}).focus();
|
|
878
|
+
rerender(<TreeList items={tree(true)} />);
|
|
879
|
+
const disabled = screen.getByRole('link', {name: 'Report', hidden: true});
|
|
880
|
+
expect(disabled).not.toHaveAttribute('href');
|
|
881
|
+
expect(disabled).toHaveFocus();
|
|
882
|
+
});
|
|
883
|
+
|
|
864
884
|
it('does not follow a disabled link row', () => {
|
|
865
885
|
const items = [
|
|
866
886
|
{
|
|
@@ -879,6 +899,12 @@ describe('TreeList', () => {
|
|
|
879
899
|
const row = link.closest<HTMLElement>('.astryx-tree-list-item')!;
|
|
880
900
|
fireEvent.click(row.firstElementChild!);
|
|
881
901
|
expect(onLinkClick).not.toHaveBeenCalled();
|
|
902
|
+
// No destination, so a screen reader's click or a link menu cannot
|
|
903
|
+
// navigate either (spec:AST-085 FR2).
|
|
904
|
+
expect(link).toHaveAttribute('aria-disabled', 'true');
|
|
905
|
+
for (const attribute of ['href', 'target']) {
|
|
906
|
+
expect(link).not.toHaveAttribute(attribute);
|
|
907
|
+
}
|
|
882
908
|
});
|
|
883
909
|
|
|
884
910
|
describe('row clicks outside the label (FR7)', () => {
|