@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
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import {
|
|
18
|
-
isValidElement,
|
|
19
18
|
useCallback,
|
|
20
19
|
useEffect,
|
|
21
20
|
useLayoutEffect,
|
|
@@ -28,6 +27,7 @@ import {createPortal} from 'react-dom';
|
|
|
28
27
|
import * as stylex from '@stylexjs/stylex';
|
|
29
28
|
import {spacingVars, durationVars, easeVars} from '../theme/tokens.stylex';
|
|
30
29
|
import {mergeProps} from '../utils';
|
|
30
|
+
import {getNodeText} from '../utils/getNodeText';
|
|
31
31
|
import {INTERACTIVE_SELECTORS} from '../hooks/useClickableContainer';
|
|
32
32
|
import {useAnnounce} from '../hooks/useAnnounce';
|
|
33
33
|
import {layerTextReset} from '../Layer/layerTextReset.stylex';
|
|
@@ -172,29 +172,6 @@ const styles = stylex.create({
|
|
|
172
172
|
},
|
|
173
173
|
});
|
|
174
174
|
|
|
175
|
-
// Flatten a toast's rendered content (title, description, etc.) to the plain
|
|
176
|
-
// text that should be spoken by a screen reader. Only text is announced —
|
|
177
|
-
// interactive endContent is deliberately excluded (it is reachable via F6).
|
|
178
|
-
function getNodeText(node: ReactNode): string {
|
|
179
|
-
if (node == null || typeof node === 'boolean') {
|
|
180
|
-
return '';
|
|
181
|
-
}
|
|
182
|
-
if (typeof node === 'string') {
|
|
183
|
-
return node;
|
|
184
|
-
}
|
|
185
|
-
if (typeof node === 'number') {
|
|
186
|
-
return String(node);
|
|
187
|
-
}
|
|
188
|
-
if (Array.isArray(node)) {
|
|
189
|
-
return node.map(getNodeText).filter(Boolean).join(' ');
|
|
190
|
-
}
|
|
191
|
-
if (isValidElement(node)) {
|
|
192
|
-
const {children} = node.props as {children?: ReactNode};
|
|
193
|
-
return getNodeText(children);
|
|
194
|
-
}
|
|
195
|
-
return '';
|
|
196
|
-
}
|
|
197
|
-
|
|
198
175
|
export interface ToastViewportProps {
|
|
199
176
|
position?: ToastPosition;
|
|
200
177
|
/** Maximum number of visible toasts. @default 5 */
|
|
@@ -344,6 +321,19 @@ export function ToastViewport({
|
|
|
344
321
|
const [exitingIds, setExitingIds] = useState<Set<string>>(new Set());
|
|
345
322
|
const toastsRef = useRef(toasts);
|
|
346
323
|
toastsRef.current = toasts;
|
|
324
|
+
// The list as last rendered: addToast moves toastsRef ahead of it within
|
|
325
|
+
// a batch, so this tells a rendered toast from one raised since.
|
|
326
|
+
const renderedToastsRef = useRef(toasts);
|
|
327
|
+
renderedToastsRef.current = toasts;
|
|
328
|
+
// Read by removeToast, which keeps one identity across renders.
|
|
329
|
+
const maxVisibleRef = useRef(maxVisible);
|
|
330
|
+
maxVisibleRef.current = maxVisible;
|
|
331
|
+
// Rendered entries a repeat has replaced in this batch: still found by a
|
|
332
|
+
// dismissal in the same handler, as before the swap. One replaced before it
|
|
333
|
+
// rendered was never shown and reports no onHide (Toast.spec.md FR3). A
|
|
334
|
+
// render starts a new batch.
|
|
335
|
+
const replacedRef = useRef<Map<string, ToastEntry>>(new Map());
|
|
336
|
+
replacedRef.current.clear();
|
|
347
337
|
|
|
348
338
|
const viewportRef = useRef<HTMLDivElement>(null);
|
|
349
339
|
// Toast ids whose exit has begun — guards onHide from double-firing (see
|
|
@@ -352,10 +342,13 @@ export function ToastViewport({
|
|
|
352
342
|
// Toasts dispatched since the last commit, by id: a dismiss() called
|
|
353
343
|
// before the toast first renders still finds it (and its onHide).
|
|
354
344
|
const pendingEntriesRef = useRef<Map<string, ToastEntry>>(new Map());
|
|
355
|
-
// The element that was focused before
|
|
356
|
-
//
|
|
357
|
-
// never falls to <body
|
|
345
|
+
// The element that was focused before focus entered the viewport, by F6,
|
|
346
|
+
// Tab or a click. Used to restore focus once all toasts are dismissed so
|
|
347
|
+
// focus never falls to <body> (FR10).
|
|
358
348
|
const prevFocusRef = useRef<HTMLElement | null>(null);
|
|
349
|
+
// The element focus last reached inside the viewport's React tree,
|
|
350
|
+
// portaled toast content included.
|
|
351
|
+
const lastFocusedWithinRef = useRef<EventTarget | null>(null);
|
|
359
352
|
// When a toast is dismissed while focus lives inside it, we need to move
|
|
360
353
|
// focus to a sensible neighbor after that toast unmounts. This holds the
|
|
361
354
|
// id of the toast whose removal should trigger a focus handoff.
|
|
@@ -410,6 +403,10 @@ export function ToastViewport({
|
|
|
410
403
|
const addToast = useCallback(
|
|
411
404
|
(entry: ToastEntry) => {
|
|
412
405
|
const {uniqueID, collisionBehavior = 'overwrite'} = entry.options;
|
|
406
|
+
// A toast holds its uniqueID until it unmounts, leaving included
|
|
407
|
+
// (Toast.spec.md FR8): an overwrite replaces it in place, and an ignored
|
|
408
|
+
// namesake is dropped.
|
|
409
|
+
const holdsUniqueID = (t: ToastEntry) => t.options.uniqueID === uniqueID;
|
|
413
410
|
// Resolve an ignored collision synchronously against the committed list
|
|
414
411
|
// so a suppressed toast is neither shown nor announced. The remaining
|
|
415
412
|
// announce + setToasts run outside the setToasts updater, which React may
|
|
@@ -417,16 +414,46 @@ export function ToastViewport({
|
|
|
417
414
|
if (
|
|
418
415
|
uniqueID &&
|
|
419
416
|
collisionBehavior === 'ignore' &&
|
|
420
|
-
toastsRef.current.some(
|
|
417
|
+
toastsRef.current.some(holdsUniqueID)
|
|
421
418
|
) {
|
|
422
419
|
return;
|
|
423
420
|
}
|
|
421
|
+
// Only text is announced; interactive endContent is reachable via F6.
|
|
424
422
|
const text = getNodeText(entry.options.body);
|
|
425
423
|
if (text) {
|
|
426
424
|
// Error toasts map to the assertive region (role="alert"); everything
|
|
427
425
|
// else to the polite region (role="status") — mirrors Toast.tsx.
|
|
428
426
|
announce(text, entry.options.type === 'error' ? 'assertive' : 'polite');
|
|
429
427
|
}
|
|
428
|
+
// A leaving toast that a new one pushes out of the visible window can no
|
|
429
|
+
// longer finish its exit on screen, so it leaves the list now (it
|
|
430
|
+
// already reported onHide); otherwise its row would come back collapsed
|
|
431
|
+
// when the window reached it again, holding a slot and the landmark.
|
|
432
|
+
const committed = toastsRef.current;
|
|
433
|
+
const overwritten = uniqueID ? committed.find(holdsUniqueID) : undefined;
|
|
434
|
+
if (overwritten && renderedToastsRef.current.includes(overwritten)) {
|
|
435
|
+
replacedRef.current.set(overwritten.id, overwritten);
|
|
436
|
+
}
|
|
437
|
+
const projected = overwritten
|
|
438
|
+
? committed.map(t => (t === overwritten ? entry : t))
|
|
439
|
+
: [...committed, entry];
|
|
440
|
+
// `maxVisible={0}` shows every toast (FR7): nothing leaves the window.
|
|
441
|
+
const firstVisible = maxVisible > 0 ? projected.length - maxVisible : 0;
|
|
442
|
+
const cutIds = new Set(
|
|
443
|
+
projected
|
|
444
|
+
.filter((t, i) => i < firstVisible && exitingIdsRef.current.has(t.id))
|
|
445
|
+
.map(t => t.id),
|
|
446
|
+
);
|
|
447
|
+
if (cutIds.size > 0) {
|
|
448
|
+
// Gone from every list, so a later dismissal reports nothing more.
|
|
449
|
+
for (const id of cutIds) {
|
|
450
|
+
exitingIdsRef.current.delete(id);
|
|
451
|
+
pendingEntriesRef.current.delete(id);
|
|
452
|
+
}
|
|
453
|
+
setExitingIds(prev => new Set([...prev].filter(id => !cutIds.has(id))));
|
|
454
|
+
}
|
|
455
|
+
// Later toasts in the same batch see this one before the next render.
|
|
456
|
+
toastsRef.current = projected.filter(t => !cutIds.has(t.id));
|
|
430
457
|
const pending = pendingEntriesRef.current;
|
|
431
458
|
if (uniqueID) {
|
|
432
459
|
// An overwrite replaces a toast that has not rendered yet too.
|
|
@@ -442,17 +469,17 @@ export function ToastViewport({
|
|
|
442
469
|
// dismissed. Its settled id is dropped by the prune below, which covers
|
|
443
470
|
// every silent exit with one rule rather than one branch per path.
|
|
444
471
|
setToasts(prev => {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
472
|
+
// The cut entries go first, then the choice the projection above made
|
|
473
|
+
// (by identity): a dismissal in the same handler may have marked the
|
|
474
|
+
// replaced namesake as leaving since, which must not turn the
|
|
475
|
+
// overwrite into an append. An ignored collision already returned.
|
|
476
|
+
const kept = prev.filter(t => !cutIds.has(t.id));
|
|
477
|
+
return overwritten && kept.includes(overwritten)
|
|
478
|
+
? kept.map(t => (t === overwritten ? entry : t))
|
|
479
|
+
: [...kept, entry];
|
|
453
480
|
});
|
|
454
481
|
},
|
|
455
|
-
[announce],
|
|
482
|
+
[announce, maxVisible],
|
|
456
483
|
);
|
|
457
484
|
|
|
458
485
|
const removeToast = useCallback((id: string, reason: ToastDismissReason) => {
|
|
@@ -465,6 +492,7 @@ export function ToastViewport({
|
|
|
465
492
|
}
|
|
466
493
|
const entry =
|
|
467
494
|
toastsRef.current.find(t => t.id === id) ??
|
|
495
|
+
replacedRef.current.get(id) ??
|
|
468
496
|
pendingEntriesRef.current.get(id);
|
|
469
497
|
if (entry == null) {
|
|
470
498
|
// Already gone: nothing to hide or report.
|
|
@@ -485,29 +513,54 @@ export function ToastViewport({
|
|
|
485
513
|
dismissedNode.contains(active)
|
|
486
514
|
) {
|
|
487
515
|
focusHandoffIdRef.current = id;
|
|
488
|
-
// Pick the
|
|
489
|
-
//
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
516
|
+
// Pick the toast to receive focus while the DOM is still intact: the
|
|
517
|
+
// nearest one after it, then before it, that shows once it is gone
|
|
518
|
+
// (FR10), else restore. The list may already run ahead of the render
|
|
519
|
+
// within this handler: a toast a repeat replaced has left it, and the
|
|
520
|
+
// replacement holds its place, so the neighbors are taken around the
|
|
521
|
+
// replacement, which takes focus only when no neighbor shows.
|
|
522
|
+
const list = toastsRef.current;
|
|
523
|
+
const {uniqueID} = entry.options;
|
|
524
|
+
const ownIndex = list.findIndex(t => t.id === id);
|
|
525
|
+
const placeIndex =
|
|
526
|
+
ownIndex >= 0 || uniqueID == null
|
|
527
|
+
? ownIndex
|
|
528
|
+
: list.findIndex(t => t.options.uniqueID === uniqueID);
|
|
529
|
+
const remaining = list.filter(t => t.id !== id);
|
|
530
|
+
const max = maxVisibleRef.current;
|
|
531
|
+
const shown = new Set(max > 0 ? remaining.slice(-max) : remaining);
|
|
532
|
+
const isShown = (t: ToastEntry) => shown.has(t);
|
|
533
|
+
const replacement = ownIndex < 0 ? list[placeIndex] : undefined;
|
|
534
|
+
const next =
|
|
535
|
+
placeIndex < 0
|
|
536
|
+
? undefined
|
|
537
|
+
: (list.slice(placeIndex + 1).find(isShown) ??
|
|
538
|
+
list.slice(0, placeIndex).reverse().find(isShown) ??
|
|
539
|
+
(replacement != null && isShown(replacement)
|
|
540
|
+
? replacement
|
|
541
|
+
: undefined));
|
|
542
|
+
pendingFocusRef.current = next ? next.id : 'restore';
|
|
500
543
|
}
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
544
|
+
// A toast this handler has already pushed out of the visible window still
|
|
545
|
+
// has its row now, but loses it when the batch renders.
|
|
546
|
+
const index = toastsRef.current.findIndex(t => t.id === id);
|
|
547
|
+
const isPushedOut =
|
|
548
|
+
maxVisibleRef.current > 0 &&
|
|
549
|
+
index >= 0 &&
|
|
550
|
+
index < toastsRef.current.length - maxVisibleRef.current;
|
|
551
|
+
if (dismissedNode == null || isPushedOut) {
|
|
552
|
+
// No row is mounted for it, or none will be: it is hidden past
|
|
553
|
+
// `maxVisible`, or it has not rendered yet. Nothing animates out, so it
|
|
554
|
+
// leaves the list now.
|
|
504
555
|
// Waiting for its row to finish exiting would keep it forever: when it
|
|
505
556
|
// surfaced, its row would mount already collapsed, with no transition
|
|
506
557
|
// left to end, and hold a visible slot as an empty row.
|
|
507
558
|
// It leaves the committed list now too, so a second dismissal before
|
|
508
|
-
// the next render finds nothing to report
|
|
559
|
+
// the next render finds nothing to report (nor does a toast a repeat
|
|
560
|
+
// replaced in this batch).
|
|
509
561
|
exitingIdsRef.current.delete(id);
|
|
510
562
|
pendingEntriesRef.current.delete(id);
|
|
563
|
+
replacedRef.current.delete(id);
|
|
511
564
|
toastsRef.current = toastsRef.current.filter(t => t.id !== id);
|
|
512
565
|
setToasts(prev => prev.filter(t => t.id !== id));
|
|
513
566
|
return;
|
|
@@ -731,6 +784,21 @@ export function ToastViewport({
|
|
|
731
784
|
const viewport = (
|
|
732
785
|
<div
|
|
733
786
|
ref={viewportRef}
|
|
787
|
+
onFocus={event => {
|
|
788
|
+
// Focus entering from outside, however it came, is where a dismissal
|
|
789
|
+
// of the last toast returns it. React also delivers focus inside a
|
|
790
|
+
// toast's portaled content here, so focus coming back from the last
|
|
791
|
+
// element focused within is not an entry, though it sits outside
|
|
792
|
+
// this element.
|
|
793
|
+
const from = event.relatedTarget;
|
|
794
|
+
const fromWithin =
|
|
795
|
+
from === lastFocusedWithinRef.current ||
|
|
796
|
+
(from instanceof Node && event.currentTarget.contains(from));
|
|
797
|
+
lastFocusedWithinRef.current = event.target;
|
|
798
|
+
if (from instanceof HTMLElement && !fromWithin) {
|
|
799
|
+
prevFocusRef.current = from;
|
|
800
|
+
}
|
|
801
|
+
}}
|
|
734
802
|
role={hasToasts ? 'region' : undefined}
|
|
735
803
|
aria-label={hasToasts ? t('@astryx.toast.viewport') : undefined}
|
|
736
804
|
tabIndex={hasToasts ? -1 : undefined}
|
|
@@ -656,6 +656,33 @@ describe('ToggleButtonGroup (single)', () => {
|
|
|
656
656
|
// ToggleButtonGroup — Multiple mode
|
|
657
657
|
// =============================================================================
|
|
658
658
|
|
|
659
|
+
describe('ToggleButtonGroup host props (public-component-api INV5)', () => {
|
|
660
|
+
it('passes className, style, id, aria-* and data-* to the group, keeping its own role and name', () => {
|
|
661
|
+
render(
|
|
662
|
+
<ToggleButtonGroup
|
|
663
|
+
label="Alignment"
|
|
664
|
+
value={null}
|
|
665
|
+
onChange={() => {}}
|
|
666
|
+
className="toolbar-group"
|
|
667
|
+
style={{marginTop: 8}}
|
|
668
|
+
id="alignment"
|
|
669
|
+
aria-describedby="alignment-hint"
|
|
670
|
+
data-section="format"
|
|
671
|
+
// A caller role or name never replaces the group's own.
|
|
672
|
+
{...{role: 'radiogroup', 'aria-label': 'Ignored'}}>
|
|
673
|
+
<ToggleButton value="left" label="Left" />
|
|
674
|
+
</ToggleButtonGroup>,
|
|
675
|
+
);
|
|
676
|
+
const group = screen.getByRole('group', {name: 'Alignment'});
|
|
677
|
+
expect(group).toHaveClass('toolbar-group');
|
|
678
|
+
expect(group).toHaveClass('astryx-toggle-button-group');
|
|
679
|
+
expect(group).toHaveStyle({marginTop: '8px'});
|
|
680
|
+
expect(group).toHaveAttribute('id', 'alignment');
|
|
681
|
+
expect(group).toHaveAttribute('aria-describedby', 'alignment-hint');
|
|
682
|
+
expect(group).toHaveAttribute('data-section', 'format');
|
|
683
|
+
});
|
|
684
|
+
});
|
|
685
|
+
|
|
659
686
|
describe('ToggleButtonGroup (multiple)', () => {
|
|
660
687
|
function MultipleGroup() {
|
|
661
688
|
const [value, setValue] = useState<string[]>(['bold']);
|
|
@@ -23,6 +23,7 @@ import {createLayerScopedContext as createContext} from '../Layer/layerScopedCon
|
|
|
23
23
|
import * as stylex from '@stylexjs/stylex';
|
|
24
24
|
import {spacingVars} from '../theme/tokens.stylex';
|
|
25
25
|
import type {ButtonSize} from '../Button';
|
|
26
|
+
import type {BaseProps} from '../BaseProps';
|
|
26
27
|
import {mergeProps} from '../utils';
|
|
27
28
|
import type {StyleXStyles} from '@stylexjs/stylex';
|
|
28
29
|
import {themeProps} from '../utils/themeProps';
|
|
@@ -74,7 +75,15 @@ const styles = stylex.create({
|
|
|
74
75
|
// Props — Discriminated Union
|
|
75
76
|
// =============================================================================
|
|
76
77
|
|
|
77
|
-
|
|
78
|
+
/**
|
|
79
|
+
* Host props reach the group element (`architecture:public-component-api`
|
|
80
|
+
* INV5): `className`, `style`, `id`, `aria-*`, `data-*` and handlers. The group
|
|
81
|
+
* keeps its own `role`, `aria-label` and theme target.
|
|
82
|
+
*/
|
|
83
|
+
interface ToggleButtonGroupBaseProps extends Omit<
|
|
84
|
+
BaseProps<HTMLDivElement>,
|
|
85
|
+
'onChange' | 'defaultValue' | 'role' | 'aria-label'
|
|
86
|
+
> {
|
|
78
87
|
/** Toggle button children. */
|
|
79
88
|
children: ReactNode;
|
|
80
89
|
|
|
@@ -184,7 +193,14 @@ export function ToggleButtonGroup(props: ToggleButtonGroupProps): ReactNode {
|
|
|
184
193
|
size,
|
|
185
194
|
isDisabled = false,
|
|
186
195
|
xstyle,
|
|
196
|
+
className,
|
|
197
|
+
style,
|
|
187
198
|
'data-testid': testId,
|
|
199
|
+
// Read through `props` below, where the union narrows them by `type`.
|
|
200
|
+
type: _type,
|
|
201
|
+
value: _value,
|
|
202
|
+
onChange: _onChange,
|
|
203
|
+
...hostProps
|
|
188
204
|
} = props;
|
|
189
205
|
|
|
190
206
|
const isMultiple = props.type === 'multiple';
|
|
@@ -225,6 +241,7 @@ export function ToggleButtonGroup(props: ToggleButtonGroupProps): ReactNode {
|
|
|
225
241
|
return (
|
|
226
242
|
<ToggleButtonGroupContext value={contextValue}>
|
|
227
243
|
<div
|
|
244
|
+
{...hostProps}
|
|
228
245
|
role="group"
|
|
229
246
|
aria-label={label}
|
|
230
247
|
data-testid={testId}
|
|
@@ -235,6 +252,8 @@ export function ToggleButtonGroup(props: ToggleButtonGroupProps): ReactNode {
|
|
|
235
252
|
orientation === 'vertical' && styles.vertical,
|
|
236
253
|
xstyle,
|
|
237
254
|
),
|
|
255
|
+
className,
|
|
256
|
+
style,
|
|
238
257
|
)}>
|
|
239
258
|
{children}
|
|
240
259
|
</div>
|
package/src/Token/Token.doc.mjs
CHANGED
|
@@ -88,7 +88,7 @@ export const docs = {
|
|
|
88
88
|
},
|
|
89
89
|
], theming: {
|
|
90
90
|
targets: [
|
|
91
|
-
{className: 'astryx-token', visualProps: ['color', 'size']},
|
|
91
|
+
{className: 'astryx-token', visualProps: ['color', 'size'], states: ['disabled']},
|
|
92
92
|
],
|
|
93
93
|
},
|
|
94
94
|
usage: {
|
|
@@ -193,7 +193,7 @@ export const docsZh = {
|
|
|
193
193
|
],
|
|
194
194
|
theming: {
|
|
195
195
|
targets: [
|
|
196
|
-
{className: 'astryx-token', visualProps: ['color', 'size']},
|
|
196
|
+
{className: 'astryx-token', visualProps: ['color', 'size'], states: ['disabled']},
|
|
197
197
|
],
|
|
198
198
|
},
|
|
199
199
|
usage: {
|
package/src/Token/Token.spec.md
CHANGED
|
@@ -41,7 +41,7 @@ system_specs: [spec:AST-005, spec:AST-009, spec:AST-085]
|
|
|
41
41
|
| Behavior | `href` renders a link, `onClick` (or an enclosing trigger context) renders a container whose inner button wraps the label, and `onRemove` adds a separate remove button beside, never inside, them. |
|
|
42
42
|
| End-user impact | Pointer users can activate the whole chip; keyboard and screen-reader users reach the chip's action and its remove action as separate, named controls. |
|
|
43
43
|
| Builder impact | None; the record describes shipped behavior. |
|
|
44
|
-
| Compatibility/readiness | Released behavior recorded as current; no API, default, or output changes.
|
|
44
|
+
| Compatibility/readiness | Released behavior recorded as current; no API, default, or output changes. Four implementation gaps are listed under Current-state impact. |
|
|
45
45
|
| Review checks | Reject a remove button nested in the link or the inner button, a remove target smaller than 24 by 24 CSS pixels, a native `disabled` attribute, or a token that navigates around the shared destination rule. |
|
|
46
46
|
| Governing rules | `family:navigation-destinations`; `spec:AST-005`; `spec:AST-085/FR1,FR2,FR5`; `architecture:public-component-api/INV5,INV6,INV8`; `architecture:component-theming-surface/INV6,INV14`. |
|
|
47
47
|
|
|
@@ -66,10 +66,6 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
66
66
|
|
|
67
67
|
## Current-state impact
|
|
68
68
|
|
|
69
|
-
- **Disabled link token (FR5, AR5).** A disabled token with `href` and no
|
|
70
|
-
`onClick` renders a static `span`: it loses its tab stop and exposes no
|
|
71
|
-
disabled state, where `spec:AST-085` FR1 and FR5 keep a disabled control
|
|
72
|
-
focusable and announced.
|
|
73
69
|
- **`onClick` with `href` (FR3).** When a token renders as a link, a supplied
|
|
74
70
|
`onClick` is not attached or called, where
|
|
75
71
|
`architecture:public-component-api` INV5 preserves accepted event inputs.
|
|
@@ -77,10 +73,6 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
77
73
|
static, clickable, or link-and-remove token puts `aria-label` on a `span` that
|
|
78
74
|
has no role, where WAI-ARIA 1.2 prohibits naming the generic role. The
|
|
79
75
|
visually hidden label text still reaches assistive technology.
|
|
80
|
-
- **Disabled state not reflected on the target (FR5).** No structure reflects
|
|
81
|
-
`isDisabled` on the `token` target, so a theme cannot style the disabled state
|
|
82
|
-
through it, where `architecture:component-theming-surface` INV6 keeps state on
|
|
83
|
-
the owning target.
|
|
84
76
|
- **Two focus indicators on Remove (AR4).** In clickable and link-and-remove
|
|
85
77
|
tokens, keyboard focus on the Remove button draws the token's outline and the
|
|
86
78
|
button's own, where `architecture:interaction-modality` INV3 allows one
|
|
@@ -116,29 +108,29 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
116
108
|
|
|
117
109
|
## Public concepts
|
|
118
110
|
|
|
119
|
-
| Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior
|
|
120
|
-
| ---------------- | ---------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------- | --------- | ----------------- | --------- |
|
|
121
|
-
| Structure | static; clickable; link; link-and-remove | Which element owns the token's own action (FR2–FR4). | Resolved from `href`, `onClick`, `isDisabled`, and an enclosing trigger context | static | `component:Token` | Stable | A disabled link token stays a focusable control that exposes its disabled state (FR5)
|
|
122
|
-
| Size | `sm`, `md`, `lg` | Selects the block size. | All structures | `md` | `component:Token` | Stable | TypeScript rejects other values.
|
|
123
|
-
| Tone (`color`) | `default`, `red`, `orange`, `yellow`, `green`, `teal`, `cyan`, `blue`, `purple`, `pink`, `gray`; theme additions | Selects fill and text color. | All structures | `default` | `component:Token` | Stable | A theme-added value is reflected on `token` and receives no component fill or color; TypeScript rejects unregistered values.
|
|
124
|
-
| Removable | present when `onRemove` is supplied; absent | Adds the Remove button after the label and end content. | All structures | absent | `component:Token` | Stable | —
|
|
125
|
-
| Label visibility | visible; visually hidden | Hides the label visually while keeping it as the token's name. | All structures | visible | `component:Token` | Stable | —
|
|
126
|
-
| Disabled | enabled; disabled | Blocks every token and remove action. | All structures | enabled | `component:Token` | Stable | —
|
|
111
|
+
| Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
|
|
112
|
+
| ---------------- | ---------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------- | --------- | ----------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
113
|
+
| Structure | static; clickable; link; link-and-remove | Which element owns the token's own action (FR2–FR4). | Resolved from `href`, `onClick`, `isDisabled`, and an enclosing trigger context | static | `component:Token` | Stable | A disabled link token stays a focusable control that exposes its disabled state (FR5). |
|
|
114
|
+
| Size | `sm`, `md`, `lg` | Selects the block size. | All structures | `md` | `component:Token` | Stable | TypeScript rejects other values. |
|
|
115
|
+
| Tone (`color`) | `default`, `red`, `orange`, `yellow`, `green`, `teal`, `cyan`, `blue`, `purple`, `pink`, `gray`; theme additions | Selects fill and text color. | All structures | `default` | `component:Token` | Stable | A theme-added value is reflected on `token` and receives no component fill or color; TypeScript rejects unregistered values. |
|
|
116
|
+
| Removable | present when `onRemove` is supplied; absent | Adds the Remove button after the label and end content. | All structures | absent | `component:Token` | Stable | — |
|
|
117
|
+
| Label visibility | visible; visually hidden | Hides the label visually while keeping it as the token's name. | All structures | visible | `component:Token` | Stable | — |
|
|
118
|
+
| Disabled | enabled; disabled | Blocks every token and remove action. | All structures | enabled | `component:Token` | Stable | — |
|
|
127
119
|
|
|
128
120
|
## Behavioral and layout contract
|
|
129
121
|
|
|
130
|
-
| ID | Invariant
|
|
131
|
-
| ---- |
|
|
132
|
-
| FR1 | Content renders in logical inline order: Icon, Label, End content, Remove button. The root is inline-flex with `--spacing-1` gaps, inline padding `--spacing-2`, `--radius-inner` corners, `--text-supporting-size` type at `--font-weight-medium`, and a minimum block size of `--size-element-sm`, `-md`, or `-lg` minus 8px for `sm`, `md`, and `lg`. That size grows with a set text size under `spec:AST-102` FR4; today's fixed size is a gap.
|
|
133
|
-
| FR2 | With no `href`, `onClick`, or enclosing trigger context, the token is a static `span` holding its content directly.
|
|
134
|
-
| FR3 | With an enabled `href` and no `onRemove`, the token root is the shared link component carrying the destination; it takes the root ref, passthrough props, and its own focus-visible outline. A supplied `onClick`, as an accepted event input, reaches the element that owns the contract (`architecture:public-component-api` INV5). Implementation gap: in both link structures `onClick` is not attached or called (Current-state impact).
|
|
135
|
-
| FR4 | With `onClick`, or an enclosing trigger context that resolves the token to a button, the root is a `span` container holding an inner `button` that wraps only the Label and calls `onClick`; a click on the container outside any nested button or link also calls `onClick`. With an enabled `href` and `onRemove`, the container instead holds an inner link wrapping only the Label; a plain click on the surface outside the Remove button follows that link, and a Cmd/Ctrl-click or middle click on the surface opens it in a new tab. A caller `onMouseUp` on the link-and-remove container runs before its delegation.
|
|
136
|
-
| FR5 | A disabled token renders at half opacity with pointer events off and fires neither `onClick` nor `onRemove` from pointer, Enter, or Space; inner and Remove buttons stay focusable with `aria-disabled="true"` and never receive native `disabled`. A disabled control keeps its tab stop and exposes its disabled state (`spec:AST-085` FR1, FR5), and the disabled state is reflected on the owning target (`architecture:component-theming-surface` INV6).
|
|
137
|
-
| FR6 | `onRemove` renders a `type="button"` Remove button holding a close glyph; a click stops propagation before `onRemove` runs, so it never triggers the token's own action or link. The button is a sibling of the inner button or link, never nested in it.
|
|
138
|
-
| FR7 | The label never wraps: the root is capped at its container's inline size and clips overflow. In the static and link structures the Label ends in an ellipsis; in the clickable and link-and-remove structures the inner control clips the Label without an ellipsis. `isLabelHidden` keeps the Label in the DOM with a visually hidden clip treatment.
|
|
139
|
-
| FR8 | `color` defaults to `default`, painting `--color-neutral` with primary text; every other built-in tone paints its tinted background with its matching colored text. The `token` target reflects the resolved `color` and `size` for every value, including a theme-added color, which receives no component fill or text color until a theme paints it.
|
|
140
|
-
| FR9 | Clickable and link structures paint the shared hover overlay under a hover-capable pointer and the shared pressed overlay for mouse and touch presses; the static structure paints neither.
|
|
141
|
-
| FR10 | `ref` reaches the root element of every structure. Supported DOM, ARIA, data, and event props reach the root; `data-testid` reaches the root; `xstyle`, `className`, and `style` merge in that order after component styles.
|
|
122
|
+
| ID | Invariant | Basis |
|
|
123
|
+
| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
|
|
124
|
+
| FR1 | Content renders in logical inline order: Icon, Label, End content, Remove button. The root is inline-flex with `--spacing-1` gaps, inline padding `--spacing-2`, `--radius-inner` corners, `--text-supporting-size` type at `--font-weight-medium`, and a minimum block size of `--size-element-sm`, `-md`, or `-lg` minus 8px for `sm`, `md`, and `lg`. That size grows with a set text size under `spec:AST-102` FR4; today's fixed size is a gap. | Current source and tests |
|
|
125
|
+
| FR2 | With no `href`, `onClick`, or enclosing trigger context, the token is a static `span` holding its content directly. | Current source and tests |
|
|
126
|
+
| FR3 | With an enabled `href` and no `onRemove`, the token root is the shared link component carrying the destination; it takes the root ref, passthrough props, and its own focus-visible outline. A supplied `onClick`, as an accepted event input, reaches the element that owns the contract (`architecture:public-component-api` INV5). Implementation gap: in both link structures `onClick` is not attached or called (Current-state impact). | Current source and tests |
|
|
127
|
+
| FR4 | With `onClick`, or an enclosing trigger context that resolves the token to a button, the root is a `span` container holding an inner `button` that wraps only the Label and calls `onClick`; a click on the container outside any nested button or link also calls `onClick`. With an enabled `href` and `onRemove`, the container instead holds an inner link wrapping only the Label; a plain click on the surface outside the Remove button follows that link, and a Cmd/Ctrl-click or middle click on the surface opens it in a new tab. A caller `onMouseUp` on the link-and-remove container runs before its delegation. | Current source and tests |
|
|
128
|
+
| FR5 | A disabled token renders at half opacity with pointer events off and fires neither `onClick` nor `onRemove` from pointer, Enter, or Space; inner and Remove buttons stay focusable with `aria-disabled="true"` and never receive native `disabled`. A disabled control keeps its tab stop and exposes its disabled state (`spec:AST-085` FR1, FR5), and the disabled state is reflected on the owning target (`architecture:component-theming-surface` INV6). A disabled token with `href` and no `onClick` or trigger context renders a focusable link with `aria-disabled="true"` and no `href`, and every structure reflects the disabled state on the `token` target. | Current source and tests |
|
|
129
|
+
| FR6 | `onRemove` renders a `type="button"` Remove button holding a close glyph; a click stops propagation before `onRemove` runs, so it never triggers the token's own action or link. The button is a sibling of the inner button or link, never nested in it. | Current source and tests |
|
|
130
|
+
| FR7 | The label never wraps: the root is capped at its container's inline size and clips overflow. In the static and link structures the Label ends in an ellipsis; in the clickable and link-and-remove structures the inner control clips the Label without an ellipsis. `isLabelHidden` keeps the Label in the DOM with a visually hidden clip treatment. | Current source and tests |
|
|
131
|
+
| FR8 | `color` defaults to `default`, painting `--color-neutral` with primary text; every other built-in tone paints its tinted background with its matching colored text. The `token` target reflects the resolved `color` and `size` for every value, including a theme-added color, which receives no component fill or text color until a theme paints it. | Current source and tests |
|
|
132
|
+
| FR9 | Clickable and link structures paint the shared hover overlay under a hover-capable pointer and the shared pressed overlay for mouse and touch presses; the static structure paints neither. | Current source |
|
|
133
|
+
| FR10 | `ref` reaches the root element of every structure. Supported DOM, ARIA, data, and event props reach the root, except that in the clickable structure `aria-labelledby` and `aria-describedby` reach the inner button, the element that owns the token's action (`architecture:public-component-api` INV5); `data-testid` reaches the root; `xstyle`, `className`, and `style` merge in that order after component styles. | Current source and tests |
|
|
142
134
|
|
|
143
135
|
### Allowed variation
|
|
144
136
|
|
|
@@ -150,24 +142,24 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
150
142
|
|
|
151
143
|
### Representative states
|
|
152
144
|
|
|
153
|
-
| State | Required invariant
|
|
154
|
-
| ------------------ |
|
|
155
|
-
| Static | `span` root; Token adds no focusable element except a Remove button.
|
|
156
|
-
| Clickable | One inner button named by the label
|
|
157
|
-
| Link | Root is the link; focus outline on the link itself.
|
|
158
|
-
| Link and remove | Container holds a link and a sibling Remove button; surface click activates the link.
|
|
159
|
-
| Removable | Remove button named "Remove {label}" with a 24 by 24 CSS pixel target.
|
|
160
|
-
| Disabled clickable | Buttons focusable with `aria-disabled="true"`; no callback fires; half opacity.
|
|
161
|
-
| Hidden label | Label text visually hidden; the root's `aria-label` equals the label.
|
|
145
|
+
| State | Required invariant | Allowed variation |
|
|
146
|
+
| ------------------ | ------------------------------------------------------------------------------------------------------- | --------------------------- |
|
|
147
|
+
| Static | `span` root; Token adds no focusable element except a Remove button. | Tone, size, slots. |
|
|
148
|
+
| Clickable | One inner button named by the label, or by a caller `aria-labelledby`; container click calls `onClick`. | End content. |
|
|
149
|
+
| Link | Root is the link; focus outline on the link itself. | Router link component. |
|
|
150
|
+
| Link and remove | Container holds a link and a sibling Remove button; surface click activates the link. | Modified and middle clicks. |
|
|
151
|
+
| Removable | Remove button named "Remove {label}" with a 24 by 24 CSS pixel target. | Locale wording. |
|
|
152
|
+
| Disabled clickable | Buttons focusable with `aria-disabled="true"`; no callback fires; half opacity. | Tone. |
|
|
153
|
+
| Hidden label | Label text visually hidden; the root's `aria-label` equals the label. | Structure. |
|
|
162
154
|
|
|
163
155
|
### Transformation and precedence order
|
|
164
156
|
|
|
165
157
|
- **ORD1 — Structure.** Enabled `href` → `onClick` → enclosing trigger context →
|
|
166
|
-
static. `onRemove` with an
|
|
167
|
-
container. A disabled `href`
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- **ORD2 — Root attributes.** Component class and `data-color`/`data-size` →
|
|
158
|
+
disabled `href` → static. `onRemove` with an `href` that wins selects the
|
|
159
|
+
link-and-remove container. A disabled `href` yields to `onClick` and a
|
|
160
|
+
trigger context; otherwise it keeps the link structure, rendered disabled
|
|
161
|
+
(FR5).
|
|
162
|
+
- **ORD2 — Root attributes.** Component class and `data-color`/`data-size`/`data-disabled` →
|
|
171
163
|
component styles → `xstyle` → `className` → `style` → caller props → `data-testid`, hidden-label
|
|
172
164
|
`aria-label`, and `aria-description`. A hidden label's `aria-label` replaces
|
|
173
165
|
a caller `aria-label`.
|
|
@@ -186,7 +178,8 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
186
178
|
separate focusable controls in DOM order; neither is nested in the other, so
|
|
187
179
|
the HTML interactive-content rule holds.
|
|
188
180
|
- **AR2 — Names.** In the clickable and link-and-remove structures the inner
|
|
189
|
-
button or link takes its name from the Label
|
|
181
|
+
button or link takes its name from the Label, or, in the clickable structure,
|
|
182
|
+
from a caller `aria-labelledby` (FR10). In the link structure the link
|
|
190
183
|
is the root and takes its name from all of its content, including End content
|
|
191
184
|
(a label "Inbox" with a count reads "Inbox 12"). The
|
|
192
185
|
Remove button is named by the translated "Remove {label}" string.
|
|
@@ -204,9 +197,7 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
204
197
|
those structures shows the container outline and the button's own.
|
|
205
198
|
- **AR5 — Disabled.** A disabled token's controls stay focusable, expose
|
|
206
199
|
`aria-disabled="true"`, and ignore pointer, Enter, and Space (`spec:AST-085`
|
|
207
|
-
FR1, FR2, FR5)
|
|
208
|
-
disabled link token renders as a static `span` with no tab stop and no
|
|
209
|
-
disabled state.
|
|
200
|
+
FR1, FR2, FR5), the disabled link included.
|
|
210
201
|
- **AR6 — Remove target size.** The Remove button's glyph box is 16 by 16 CSS
|
|
211
202
|
pixels and its hit area extends 4 pixels on every side to 24 by 24 at `md`
|
|
212
203
|
and `lg`, meeting WCAG 2.2 2.5.8, while a press on the adjacent label still
|
|
@@ -224,7 +215,7 @@ Consumer migration instructions belong in consumer docs and release notes.
|
|
|
224
215
|
| End content | Optional trailing content such as a count or status dot. | Current source and docs | Supporting | FR1 |
|
|
225
216
|
| Remove button | A trailing close control that dismisses the token. | Current source and docs | Supporting | FR6, AR1, AR2, AR6 |
|
|
226
217
|
|
|
227
|
-
Theming: the root is the single `token` target and reflects `color` and
|
|
218
|
+
Theming: the root is the single `token` target and reflects `color`, `size`, and the disabled state.
|
|
228
219
|
The Label, End content, and Icon add no targets; the Remove button inherits the
|
|
229
220
|
token's text color.
|
|
230
221
|
|
|
@@ -234,7 +225,7 @@ token's text color.
|
|
|
234
225
|
for both link structures, including delegated surface clicks; Token adopts
|
|
235
226
|
them through the shared link component and clickable-container delegation.
|
|
236
227
|
- `spec:AST-085` owns focusable disabled controls; FR5 and AR5 record Token's
|
|
237
|
-
conformance
|
|
228
|
+
conformance.
|
|
238
229
|
- `architecture:public-component-api` owns ref, passthrough, and styling-input
|
|
239
230
|
rules; FR3 records one gap against INV5.
|
|
240
231
|
- `architecture:component-theming-surface` owns the `token` target and the
|
|
@@ -244,18 +235,18 @@ token's text color.
|
|
|
244
235
|
|
|
245
236
|
## Verification map
|
|
246
237
|
|
|
247
|
-
| Contract | Verification | Representative states
|
|
248
|
-
| ------------------ | -------------------------------------------------------------------------------------- |
|
|
249
|
-
| FR2, FR10 | `Token.test.tsx` render, ref, and pass-through suites | Static, clickable, and link roots; caller props
|
|
250
|
-
| FR1, FR7 | `Token.stories.tsx` size, icon, and end-content fixtures in a browser | Sizes, icon and end content
|
|
251
|
-
| FR3, FR4, FR6, AR1 | `Token.test.tsx` link, clickable, and link-with-remove suites | Link, clickable, link and remove, modified and middle clicks
|
|
252
|
-
| FR5, AR5 | `Token.test.tsx` disabled tests | Disabled clickable with remove
|
|
253
|
-
| AR2, AR3, AR7 | `Token.test.tsx` accessibility suite | Remove name, hidden label, description
|
|
254
|
-
| AR6 | `TokenRemoveTarget.a11y.chromium.spec.ts` | Pre-set filter tokens (default size), LTR and RTL
|
|
255
|
-
| FR8 | `Token.test.tsx` custom-color test; `extensibleAxes.test.ts`; `themingTargets.test.ts` | Theme-added color; map wiring
|
|
256
|
-
| FR9, AR4 | `Token.stories.tsx` clickable and link fixtures in a browser | Hover, press, keyboard focus on the token
|
|
257
|
-
| PR1 | Source review | Every structure
|
|
258
|
-
| AR2, AR3, AR5, AR7 | Accessibility-tree evidence (`spec:AST-009` FR3) | Every structure; hidden label; description; disabled
|
|
238
|
+
| Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
|
|
239
|
+
| ------------------ | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- |
|
|
240
|
+
| FR2, FR10 | `Token.test.tsx` render, ref, and pass-through suites | Static, clickable, and link roots; caller props; caller naming on a clickable and a disabled link token | A wrong root element, a detached ref, a dropped caller prop, or a clickable token's `aria-labelledby` left on its root fails DOM assertions. Gap: no test covers the ref on the link-and-remove container. | `audit:Token/behavior` |
|
|
241
|
+
| FR1, FR7 | `Token.stories.tsx` size, icon, and end-content fixtures in a browser | Sizes, icon and end content | Gap: the size and overflow unit tests assert presence only, and no story renders a long label; slot order and block size are visible only in the rendered fixtures, and the ellipsis has no check. | `audit:Token/layout` |
|
|
242
|
+
| FR3, FR4, FR6, AR1 | `Token.test.tsx` link, clickable, and link-with-remove suites | Link, clickable, link and remove, modified and middle clicks | Nesting the Remove button, firing the token action from Remove, or losing delegation fails. Gap: no test asserts that `onClick` is dropped with `href`. | `audit:Token/behavior` |
|
|
243
|
+
| FR5, AR5 | `Token.test.tsx` disabled tests | Disabled clickable with remove; disabled static; disabled link with and without remove | A native `disabled`, a lost tab stop, a disabled link with a destination, an unreflected disabled state, or a fired callback fails. | `audit:Token/a11y` |
|
|
244
|
+
| AR2, AR3, AR7 | `Token.test.tsx` accessibility suite | Remove name, hidden label, description | A missing remove name, lost hidden label, or missing description fails. Gap: no test asserts the link structure's content-derived name. | `audit:Token/a11y` |
|
|
245
|
+
| AR6 | `TokenRemoveTarget.a11y.chromium.spec.ts` | Pre-set filter tokens (default size), LTR and RTL | A remove target that misses its X edge or swallows a label press fails in real Chromium. Gap: the `sm` clipping is not covered. | `audit:Token/a11y` |
|
|
246
|
+
| FR8 | `Token.test.tsx` custom-color test; `extensibleAxes.test.ts`; `themingTargets.test.ts` | Theme-added color; map wiring | Dropping the `color` reflection fails. Gap: no test asserts `data-size` or any tone's paint; those are visible only in `Token.stories.tsx`. | `audit:Token/theming` |
|
|
247
|
+
| FR9, AR4 | `Token.stories.tsx` clickable and link fixtures in a browser | Hover, press, keyboard focus on the token | Gap: no automated check covers overlays or indicators, and no story renders a clickable or link token with Remove, so the double indicator on Remove has no fixture. | `audit:Token/design` |
|
|
248
|
+
| PR1 | Source review | Every structure | Gap: no automated check fails if Token adds a per-token listener, observer, or timer. | `audit:Token/behavior` |
|
|
249
|
+
| AR2, AR3, AR5, AR7 | Accessibility-tree evidence (`spec:AST-009` FR3) | Every structure; hidden label; description; disabled | Gap: no accessibility-tree check proves the computed names, the hidden-label name, the description, or the disabled state; the unit tests assert DOM attributes only. | `audit:Token/a11y` |
|
|
259
250
|
|
|
260
251
|
## Decision log
|
|
261
252
|
|