@astryxdesign/core 0.7.5 → 0.7.6-canary.0ef60dd
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/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/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/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/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 +7 -3
- 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.js +2 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -1
- 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 +2 -1
- 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 +93 -59
- 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/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- 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/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +3 -3
- 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/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- 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/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/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- 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 +82 -51
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +13 -2
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- 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/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +9 -1
- package/dist/astryx.css +20 -4
- package/dist/gestures/GestureArena.d.ts +6 -0
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +39 -0
- package/dist/gestures/GestureHost.d.ts +352 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +10 -0
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +16 -0
- 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/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/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/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/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/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +5 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
- package/dist/motion/animator.d.ts +7 -1
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +119 -27
- 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/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/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.map +1 -1
- package/dist/utils/touchPresentation.js +5 -3
- 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/unicodeDigits.d.ts +20 -0
- package/dist/utils/unicodeDigits.d.ts.map +1 -0
- package/dist/utils/unicodeDigits.js +70 -0
- package/locales/en.json +23 -3
- package/locales/pseudo.json +15 -0
- 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/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/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/ClickableCard/ClickableCard.test.tsx +96 -0
- package/src/ClickableCard/ClickableCard.tsx +48 -4
- 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 +37 -0
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +76 -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/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- 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.test.tsx +41 -0
- package/src/DropdownMenu/DropdownMenu.tsx +10 -3
- 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.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 +2 -2
- package/src/FileInput/FileInput.test.tsx +21 -0
- package/src/FileInput/FileInput.tsx +4 -1
- package/src/FormLayout/FormLayout.spec.md +7 -8
- 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.tsx +2 -1
- 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 +348 -1
- package/src/Layer/useLayer.tsx +118 -71
- 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/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.spec.md +205 -0
- package/src/List/ListItem.tsx +3 -3
- 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/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.tsx +13 -3
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/NumberInput/numberParser.ts +7 -45
- 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/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 +27 -0
- 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/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/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- 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 +45 -48
- 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 +14 -20
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +719 -1
- package/src/Toast/ToastViewport.tsx +100 -50
- package/src/Tokenizer/Tokenizer.spec.md +5 -3
- package/src/Tokenizer/Tokenizer.test.tsx +68 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- 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/Typeahead/Typeahead.test.tsx +40 -0
- package/src/Typeahead/Typeahead.tsx +12 -1
- package/src/__tests__/pressState.ts +8 -4
- package/src/gestures/GestureArena.ts +35 -0
- package/src/gestures/GestureHost.ts +2065 -0
- package/src/gestures/GestureRecognizer.ts +18 -0
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -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 +2087 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -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 +5 -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 +21 -2
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/haptics.ts +203 -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/hooks/index.ts +5 -1
- package/src/hooks/modalAnnounce.ts +129 -72
- 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/i18n/generated-locales/en.generated.ts +6 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +6 -0
- package/src/motion/README.md +11 -1
- package/src/motion/animator.test.ts +151 -3
- package/src/motion/animator.ts +149 -33
- 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/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/pressPaintPriority.test.ts +80 -0
- package/src/utils/primaryClick.test.ts +38 -0
- package/src/utils/primaryClick.ts +28 -0
- 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 +5 -3
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file touchActionRule.ts
|
|
5
|
+
* @input An element and the touch-action its recognizers derive
|
|
6
|
+
* @output Exports markTouchAction and unmarkTouchAction: the element carries
|
|
7
|
+
* the derived value in TOUCH_ACTION_ATTRIBUTE, and its document or shadow
|
|
8
|
+
* root holds one zero-specificity rule per value in the first cascade
|
|
9
|
+
* layer (`reset`), so any author rule, in any layer or none, or inline
|
|
10
|
+
* value outranks the host's (`spec:AST-094` FR18, DEC-8); a root's rules
|
|
11
|
+
* go with its last marked element (FR24)
|
|
12
|
+
* @position The gesture host's touch-action writer (GestureHost.ts)
|
|
13
|
+
*
|
|
14
|
+
* The mark is set as a recognizer attaches, so a subtree that mounts with
|
|
15
|
+
* it is styled once with its touch-action: a value written after that first
|
|
16
|
+
* styling restyles every descendant (each one's effective touch-action
|
|
17
|
+
* changes). Until the host reads the element's own value, the value in
|
|
18
|
+
* force is the author's where the author sets one, and the derived value
|
|
19
|
+
* elsewhere: never wider than the author's.
|
|
20
|
+
*
|
|
21
|
+
* SYNC: When modified, update GestureHost.ts.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** The attribute that carries the host's derived touch-action. */
|
|
25
|
+
export const TOUCH_ACTION_ATTRIBUTE = 'data-astryx-touch-action';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The cascade layer the rules sit in: the first in the order every package
|
|
29
|
+
* stylesheet declares (`spec:AST-080` FR3), so an author rule in any later
|
|
30
|
+
* layer, or in none, outranks them. Unlayered, they would outrank every
|
|
31
|
+
* layered author rule.
|
|
32
|
+
*/
|
|
33
|
+
const RULE_LAYER = 'reset';
|
|
34
|
+
|
|
35
|
+
type RuleRoot = Document | ShadowRoot;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Per document or shadow root: the values it has a rule for, their rules'
|
|
39
|
+
* text, where that text goes (an adopted sheet, or a style element where
|
|
40
|
+
* constructable sheets are missing), and the elements marked there. The
|
|
41
|
+
* rules go with the root's last marked element (`spec:AST-094` FR24).
|
|
42
|
+
*/
|
|
43
|
+
const sheets = new WeakMap<
|
|
44
|
+
RuleRoot,
|
|
45
|
+
{
|
|
46
|
+
readonly values: Set<string>;
|
|
47
|
+
readonly marked: Set<Element>;
|
|
48
|
+
css: string;
|
|
49
|
+
write(css: string): void;
|
|
50
|
+
remove(): void;
|
|
51
|
+
}
|
|
52
|
+
>();
|
|
53
|
+
|
|
54
|
+
/** Where each marked element's rule lives, for its unmark after it leaves. */
|
|
55
|
+
const markedRoots = new WeakMap<Element, RuleRoot>();
|
|
56
|
+
|
|
57
|
+
function sheetOf(root: RuleRoot) {
|
|
58
|
+
let entry = sheets.get(root);
|
|
59
|
+
if (entry == null) {
|
|
60
|
+
const doc = root.nodeType === 9 ? (root as Document) : root.ownerDocument;
|
|
61
|
+
let write: ((css: string) => void) | undefined;
|
|
62
|
+
let remove: (() => void) | undefined;
|
|
63
|
+
// A constructable sheet where the engine has one; a style element only
|
|
64
|
+
// where it has none, so any other error from a sheet is not hidden.
|
|
65
|
+
const Sheet = doc?.defaultView?.CSSStyleSheet;
|
|
66
|
+
if (
|
|
67
|
+
typeof Sheet === 'function' &&
|
|
68
|
+
'replaceSync' in Sheet.prototype &&
|
|
69
|
+
'adoptedStyleSheets' in root
|
|
70
|
+
) {
|
|
71
|
+
const sheet = new Sheet();
|
|
72
|
+
root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
|
|
73
|
+
write = css => sheet.replaceSync(css);
|
|
74
|
+
remove = () => {
|
|
75
|
+
root.adoptedStyleSheets = root.adoptedStyleSheets.filter(
|
|
76
|
+
adopted => adopted !== sheet,
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
} else {
|
|
80
|
+
const style = doc?.createElement('style');
|
|
81
|
+
const parent =
|
|
82
|
+
root.nodeType === 9 ? (doc?.head ?? doc?.documentElement) : root;
|
|
83
|
+
if (style != null && parent != null) {
|
|
84
|
+
parent.append(style);
|
|
85
|
+
write = css => {
|
|
86
|
+
style.textContent = css;
|
|
87
|
+
};
|
|
88
|
+
remove = () => style.remove();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (write == null || remove == null) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
entry = {values: new Set(), marked: new Set(), css: '', write, remove};
|
|
95
|
+
sheets.set(root, entry);
|
|
96
|
+
}
|
|
97
|
+
return entry;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Give `element` the derived touch-action under a rule any author rule
|
|
102
|
+
* outranks. Returns false where no rule can hold it (a detached element):
|
|
103
|
+
* the caller writes nothing until the element is in a document.
|
|
104
|
+
*/
|
|
105
|
+
export function markTouchAction(element: Element, value: string): boolean {
|
|
106
|
+
const root = element.getRootNode() as RuleRoot;
|
|
107
|
+
const entry =
|
|
108
|
+
element.isConnected && (root.nodeType === 9 || 'host' in root)
|
|
109
|
+
? sheetOf(root)
|
|
110
|
+
: null;
|
|
111
|
+
if (entry == null) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (!entry.values.has(value)) {
|
|
115
|
+
entry.values.add(value);
|
|
116
|
+
entry.css += `:where([${TOUCH_ACTION_ATTRIBUTE}="${value}"]){touch-action:${value}}`;
|
|
117
|
+
entry.write(`@layer ${RULE_LAYER}{${entry.css}}`);
|
|
118
|
+
}
|
|
119
|
+
if (element.getAttribute(TOUCH_ACTION_ATTRIBUTE) !== value) {
|
|
120
|
+
element.setAttribute(TOUCH_ACTION_ATTRIBUTE, value);
|
|
121
|
+
}
|
|
122
|
+
const previous = markedRoots.get(element);
|
|
123
|
+
if (previous != null && previous !== root) {
|
|
124
|
+
// Moved to another root: the old one lets it go.
|
|
125
|
+
releaseMark(element, previous);
|
|
126
|
+
}
|
|
127
|
+
entry.marked.add(element);
|
|
128
|
+
markedRoots.set(element, root);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** `root` no longer holds `element`'s mark; its last mark takes the rules. */
|
|
133
|
+
function releaseMark(element: Element, root: RuleRoot): void {
|
|
134
|
+
const entry = sheets.get(root);
|
|
135
|
+
if (entry == null) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
entry.marked.delete(element);
|
|
139
|
+
if (entry.marked.size === 0) {
|
|
140
|
+
entry.remove();
|
|
141
|
+
sheets.delete(root);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Remove the host's mark; the element's own touch-action stands. The last
|
|
147
|
+
* mark in a document or shadow root takes its rules with it.
|
|
148
|
+
*/
|
|
149
|
+
export function unmarkTouchAction(element: Element): void {
|
|
150
|
+
element.removeAttribute(TOUCH_ACTION_ATTRIBUTE);
|
|
151
|
+
const root = markedRoots.get(element);
|
|
152
|
+
if (root == null) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
markedRoots.delete(element);
|
|
156
|
+
releaseMark(element, root);
|
|
157
|
+
}
|
package/src/gestures/types.ts
CHANGED
|
@@ -46,13 +46,6 @@ export interface NativeScrollProbe {
|
|
|
46
46
|
* lets the browser pan that axis).
|
|
47
47
|
*/
|
|
48
48
|
canScroll(dx: number, dy: number): boolean;
|
|
49
|
-
/**
|
|
50
|
-
* How much further (px) the scroller that would move for a finger moving
|
|
51
|
-
* by (dx, dy) can scroll before it reaches its edge; 0 when none would.
|
|
52
|
-
* Lets a reader place the point where the content runs out between two
|
|
53
|
-
* samples instead of at the next one.
|
|
54
|
-
*/
|
|
55
|
-
distanceToEdge?(dx: number, dy: number): number;
|
|
56
49
|
/** Whether any element under the touch can scroll natively at all. */
|
|
57
50
|
readonly isInsideScroller: boolean;
|
|
58
51
|
/**
|
|
@@ -127,6 +120,17 @@ export interface GestureEventContext {
|
|
|
127
120
|
export interface GestureEnvironment {
|
|
128
121
|
viewportSize(): {readonly width: number; readonly height: number};
|
|
129
122
|
isRtl(view: unknown): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* The box of a recognizer's view in viewport coordinates, or null when it
|
|
125
|
+
* has none to measure. A screen-edge pan reads it to tell a view within
|
|
126
|
+
* its edge band from any other.
|
|
127
|
+
*/
|
|
128
|
+
viewRect?(view: unknown): {
|
|
129
|
+
readonly left: number;
|
|
130
|
+
readonly top: number;
|
|
131
|
+
readonly width: number;
|
|
132
|
+
readonly height: number;
|
|
133
|
+
} | null;
|
|
130
134
|
}
|
|
131
135
|
|
|
132
136
|
export const DEFAULT_ENVIRONMENT: GestureEnvironment = {
|
|
@@ -136,8 +140,18 @@ export const DEFAULT_ENVIRONMENT: GestureEnvironment = {
|
|
|
136
140
|
}
|
|
137
141
|
return {width: window.innerWidth, height: window.innerHeight};
|
|
138
142
|
},
|
|
139
|
-
isRtl() {
|
|
140
|
-
|
|
143
|
+
isRtl(view) {
|
|
144
|
+
if (typeof window === 'undefined' || !(view instanceof Element)) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
return window.getComputedStyle(view).direction === 'rtl';
|
|
148
|
+
},
|
|
149
|
+
viewRect(view) {
|
|
150
|
+
if (typeof Element === 'undefined' || !(view instanceof Element)) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const {left, top, width, height} = view.getBoundingClientRect();
|
|
154
|
+
return {left, top, width, height};
|
|
141
155
|
},
|
|
142
156
|
};
|
|
143
157
|
|
|
@@ -158,4 +172,11 @@ export interface TouchConsumer {
|
|
|
158
172
|
* (attached above this consumer) from beginning for a touch on it.
|
|
159
173
|
*/
|
|
160
174
|
allowsAncestorRecognizer?(recognizer: unknown): boolean;
|
|
175
|
+
/**
|
|
176
|
+
* Whether the consumer takes touches now (a disabled control does not).
|
|
177
|
+
* The host listens only while something enabled is attached
|
|
178
|
+
* (`spec:AST-094` FR24); after this changes, call `host.update(element)`.
|
|
179
|
+
* @default true
|
|
180
|
+
*/
|
|
181
|
+
isEnabled?(): boolean;
|
|
161
182
|
}
|
package/src/hooks/index.ts
CHANGED
|
@@ -15,7 +15,11 @@ export {hasActiveFocusTrapEscape, useFocusTrap} from './useFocusTrap';
|
|
|
15
15
|
export type {UseFocusTrapOptions, UseFocusTrapReturn} from './useFocusTrap';
|
|
16
16
|
|
|
17
17
|
export {useAnnounce} from './useAnnounce';
|
|
18
|
-
export type {
|
|
18
|
+
export type {
|
|
19
|
+
AnnounceFn,
|
|
20
|
+
AnnouncePoliteness,
|
|
21
|
+
UseAnnounceOptions,
|
|
22
|
+
} from './useAnnounce';
|
|
19
23
|
|
|
20
24
|
export {useClipboard} from './useClipboard';
|
|
21
25
|
export type {UseClipboardOptions, UseClipboardReturn} from './useClipboard';
|
|
@@ -14,7 +14,11 @@
|
|
|
14
14
|
* handed to the channel exposed then, or held while an exiting modal still
|
|
15
15
|
* covers everything, and released at its real close; a covered modal is
|
|
16
16
|
* not written to; a caller inside a modal being presented in this commit
|
|
17
|
-
* waits one frame for the route.
|
|
17
|
+
* waits one frame for the route. Words move with their announcers'
|
|
18
|
+
* receipts, one delivery per announcer, so an announcer can take back its
|
|
19
|
+
* own share while it waits wherever it went: a `hasReplace` instance's
|
|
20
|
+
* next message (FR9), a busy start overtaken by its outcome (FR8). Loaded
|
|
21
|
+
* only by ModalAnnounceProvider, so
|
|
18
22
|
* a component that calls useAnnounce and renders no modal does not carry
|
|
19
23
|
* it.
|
|
20
24
|
*
|
|
@@ -25,14 +29,18 @@ import {
|
|
|
25
29
|
announceMessage,
|
|
26
30
|
clearModalRegion,
|
|
27
31
|
clearRegion,
|
|
32
|
+
forwardWaiting,
|
|
33
|
+
handleOf,
|
|
28
34
|
installModalRoute,
|
|
29
35
|
isOpenModal,
|
|
30
36
|
modalRegion,
|
|
31
|
-
|
|
32
|
-
withdrawFromModalRegion,
|
|
37
|
+
unexposedWords,
|
|
33
38
|
writeModalRegion,
|
|
34
39
|
type AnnouncePoliteness,
|
|
40
|
+
type AnnounceReceipt,
|
|
35
41
|
type ModalAnnounceScope,
|
|
42
|
+
type WaitingWords,
|
|
43
|
+
type WithdrawAnnouncement,
|
|
36
44
|
} from './useAnnounce';
|
|
37
45
|
|
|
38
46
|
/**
|
|
@@ -153,20 +161,58 @@ function isAnyModalOpen(): boolean {
|
|
|
153
161
|
// the accessibility tree for its exit but is still an open native modal, or
|
|
154
162
|
// such a dialog covers the channel they would go to, so nothing is exposed
|
|
155
163
|
// yet. They are delivered when a dialog closes (or theirs is exposed again).
|
|
156
|
-
|
|
164
|
+
// Each text keeps its announcers' receipts, so one taking its share back
|
|
165
|
+
// leaves it for the others, and a receipt follows the words when they are
|
|
166
|
+
// released; an entry is gone once delivered, so a receipt never reaches
|
|
167
|
+
// equal words held later.
|
|
168
|
+
interface HeldWords extends WaitingWords {
|
|
169
|
+
readonly receipts: AnnounceReceipt[];
|
|
170
|
+
}
|
|
171
|
+
const held = new Map<
|
|
172
|
+
HTMLDialogElement,
|
|
173
|
+
Record<AnnouncePoliteness, HeldWords[]>
|
|
174
|
+
>();
|
|
157
175
|
|
|
176
|
+
/** Hold `message` for `dialog`, for the announcer `receipt` stands for. */
|
|
158
177
|
function hold(
|
|
159
178
|
dialog: HTMLDialogElement,
|
|
160
179
|
message: string,
|
|
161
180
|
politeness: AnnouncePoliteness,
|
|
181
|
+
receipt: AnnounceReceipt,
|
|
162
182
|
): void {
|
|
163
183
|
let slot = held.get(dialog);
|
|
164
184
|
if (slot == null) {
|
|
165
185
|
slot = {polite: [], assertive: []};
|
|
166
186
|
held.set(dialog, slot);
|
|
167
187
|
}
|
|
168
|
-
|
|
169
|
-
|
|
188
|
+
let words = slot[politeness].find(entry => entry.text === message);
|
|
189
|
+
if (words == null) {
|
|
190
|
+
words = {text: message, receipts: []};
|
|
191
|
+
slot[politeness].push(words);
|
|
192
|
+
}
|
|
193
|
+
words.receipts.push(receipt);
|
|
194
|
+
const entry = words;
|
|
195
|
+
receipt.withdraw = () => dropHeldShare(dialog, politeness, entry, receipt);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** One announcer takes back its share of `words`, while they are held. */
|
|
199
|
+
function dropHeldShare(
|
|
200
|
+
dialog: HTMLDialogElement,
|
|
201
|
+
politeness: AnnouncePoliteness,
|
|
202
|
+
words: HeldWords,
|
|
203
|
+
receipt: AnnounceReceipt,
|
|
204
|
+
): void {
|
|
205
|
+
const slot = held.get(dialog);
|
|
206
|
+
const at = words.receipts.indexOf(receipt);
|
|
207
|
+
if (slot == null || !slot[politeness].includes(words) || at < 0) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
words.receipts.splice(at, 1);
|
|
211
|
+
if (words.receipts.length === 0) {
|
|
212
|
+
slot[politeness] = slot[politeness].filter(entry => entry !== words);
|
|
213
|
+
if (slot.polite.length === 0 && slot.assertive.length === 0) {
|
|
214
|
+
held.delete(dialog);
|
|
215
|
+
}
|
|
170
216
|
}
|
|
171
217
|
}
|
|
172
218
|
|
|
@@ -193,15 +239,13 @@ function releaseHeld(dialog: HTMLDialogElement): void {
|
|
|
193
239
|
}
|
|
194
240
|
held.delete(dialog);
|
|
195
241
|
for (const politeness of ['polite', 'assertive'] as const) {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
announceInModalRouted(dialog,
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
}
|
|
242
|
+
// One delivery per announcer, so each receipt follows its words.
|
|
243
|
+
forwardWaiting(slot[politeness], text =>
|
|
244
|
+
isExposed(dialog)
|
|
245
|
+
? announceInModalRouted(dialog, text, politeness)
|
|
246
|
+
: // Holds again if still nothing is exposed.
|
|
247
|
+
deliverBeyond(dialog, text, politeness),
|
|
248
|
+
);
|
|
205
249
|
}
|
|
206
250
|
}
|
|
207
251
|
|
|
@@ -221,20 +265,20 @@ function deliverBeyond(
|
|
|
221
265
|
dialog: HTMLDialogElement,
|
|
222
266
|
message: string,
|
|
223
267
|
politeness: AnnouncePoliteness,
|
|
224
|
-
):
|
|
268
|
+
): WithdrawAnnouncement | null {
|
|
225
269
|
const next = nextExposedChannel(dialog);
|
|
226
270
|
if (next === 'covered' || (next == null && isAnyModalOpen())) {
|
|
227
271
|
// An exiting modal — this one, or one above the next candidate — is
|
|
228
272
|
// still open and covers what is beneath it: nothing is exposed until
|
|
229
273
|
// it closes.
|
|
230
|
-
|
|
231
|
-
|
|
274
|
+
const receipt: AnnounceReceipt = {withdraw: null};
|
|
275
|
+
hold(dialog, message, politeness, receipt);
|
|
276
|
+
return handleOf(receipt);
|
|
232
277
|
}
|
|
233
278
|
if (next != null) {
|
|
234
|
-
announceInModalRouted(next, message, politeness);
|
|
235
|
-
return;
|
|
279
|
+
return announceInModalRouted(next, message, politeness);
|
|
236
280
|
}
|
|
237
|
-
announceMessage(message, politeness);
|
|
281
|
+
return announceMessage(message, politeness);
|
|
238
282
|
}
|
|
239
283
|
|
|
240
284
|
/**
|
|
@@ -245,10 +289,11 @@ function deliverBeyond(
|
|
|
245
289
|
*/
|
|
246
290
|
export function handOffUnexposed(dialog: HTMLDialogElement): void {
|
|
247
291
|
for (const politeness of ['polite', 'assertive'] as const) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
292
|
+
// One delivery per announcer, so each receipt follows its words and a
|
|
293
|
+
// `hasReplace` instance's next message can still take its own back.
|
|
294
|
+
forwardWaiting(takeUnexposed(dialog, politeness), text =>
|
|
295
|
+
deliverBeyond(dialog, text, politeness),
|
|
296
|
+
);
|
|
252
297
|
}
|
|
253
298
|
}
|
|
254
299
|
|
|
@@ -267,16 +312,19 @@ function withdrawFromModal(
|
|
|
267
312
|
dropHeld(dialog, politeness);
|
|
268
313
|
}
|
|
269
314
|
|
|
270
|
-
/**
|
|
315
|
+
/**
|
|
316
|
+
* Take the unexposed words out of a dialog's region, with their receipts,
|
|
317
|
+
* clearing it.
|
|
318
|
+
*/
|
|
271
319
|
function takeUnexposed(
|
|
272
320
|
dialog: HTMLDialogElement,
|
|
273
321
|
politeness: AnnouncePoliteness,
|
|
274
|
-
):
|
|
322
|
+
): WaitingWords[] {
|
|
275
323
|
const region = modalRegion(dialog, politeness);
|
|
276
324
|
if (region == null) {
|
|
277
325
|
return [];
|
|
278
326
|
}
|
|
279
|
-
const waiting =
|
|
327
|
+
const waiting = unexposedWords(region);
|
|
280
328
|
clearModalRegion(dialog, politeness);
|
|
281
329
|
return waiting;
|
|
282
330
|
}
|
|
@@ -285,10 +333,9 @@ function announceInModalRouted(
|
|
|
285
333
|
dialog: HTMLDialogElement,
|
|
286
334
|
message: string,
|
|
287
335
|
politeness: AnnouncePoliteness = 'polite',
|
|
288
|
-
):
|
|
336
|
+
): WithdrawAnnouncement | null {
|
|
289
337
|
if (!isExposed(dialog)) {
|
|
290
|
-
deliverBeyond(dialog, message, politeness);
|
|
291
|
-
return;
|
|
338
|
+
return deliverBeyond(dialog, message, politeness);
|
|
292
339
|
}
|
|
293
340
|
const top = topExposedModal();
|
|
294
341
|
if (top != null && top !== dialog && presented.includes(dialog)) {
|
|
@@ -296,35 +343,23 @@ function announceInModalRouted(
|
|
|
296
343
|
// one closes, and a message announced meanwhile is not heard — the
|
|
297
344
|
// container is clear before this modal is on top again.
|
|
298
345
|
clearModalRegion(dialog, politeness);
|
|
299
|
-
return;
|
|
346
|
+
return null;
|
|
300
347
|
}
|
|
301
|
-
writeModalRegion(dialog, message, politeness, {
|
|
348
|
+
return writeModalRegion(dialog, message, politeness, {
|
|
302
349
|
isExposed: () => isExposed(dialog),
|
|
303
|
-
redirect:
|
|
350
|
+
redirect: waiting =>
|
|
351
|
+
forwardWaiting(waiting, text => deliverBeyond(dialog, text, politeness)),
|
|
304
352
|
});
|
|
305
353
|
}
|
|
306
354
|
|
|
307
|
-
function withdrawFromModalPendingRouted(
|
|
308
|
-
dialog: HTMLDialogElement,
|
|
309
|
-
message: string,
|
|
310
|
-
politeness: AnnouncePoliteness,
|
|
311
|
-
): void {
|
|
312
|
-
withdrawFromModalRegion(dialog, message, politeness);
|
|
313
|
-
const slot = held.get(dialog);
|
|
314
|
-
if (slot != null) {
|
|
315
|
-
slot[politeness] = slot[politeness].filter(text => text !== message);
|
|
316
|
-
if (slot.polite.length === 0 && slot.assertive.length === 0) {
|
|
317
|
-
held.delete(dialog);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
355
|
// Messages from callers whose enclosing modal is being presented in this
|
|
323
356
|
// commit, waiting one frame for the route; an empty message among them
|
|
324
357
|
// withdraws the earlier ones of its urgency, as it would on a channel.
|
|
358
|
+
// Each message keeps a receipt per announcer: before the frame, taking it
|
|
359
|
+
// back drops that announcer's share; the frame points it at its write.
|
|
325
360
|
interface Deferred {
|
|
326
361
|
frame: number;
|
|
327
|
-
|
|
362
|
+
words: Record<AnnouncePoliteness, HeldWords[]>;
|
|
328
363
|
clears: Record<AnnouncePoliteness, boolean>;
|
|
329
364
|
}
|
|
330
365
|
const deferredByScope = new WeakMap<ModalAnnounceScope, Deferred>();
|
|
@@ -333,7 +368,7 @@ function deferUntilPresented(
|
|
|
333
368
|
scope: ModalAnnounceScope,
|
|
334
369
|
message: string,
|
|
335
370
|
politeness: AnnouncePoliteness,
|
|
336
|
-
):
|
|
371
|
+
): WithdrawAnnouncement | null {
|
|
337
372
|
let deferred = deferredByScope.get(scope);
|
|
338
373
|
if (deferred == null) {
|
|
339
374
|
const created: Deferred = {
|
|
@@ -348,29 +383,54 @@ function deferUntilPresented(
|
|
|
348
383
|
clearRegion(urgency);
|
|
349
384
|
}
|
|
350
385
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
announceMessage(text, urgency)
|
|
356
|
-
|
|
357
|
-
}
|
|
386
|
+
// One write per announcer, so each can take back its own share.
|
|
387
|
+
forwardWaiting(created.words[urgency], text =>
|
|
388
|
+
opened != null
|
|
389
|
+
? announceInModalRouted(opened, text, urgency)
|
|
390
|
+
: announceMessage(text, urgency),
|
|
391
|
+
);
|
|
358
392
|
}
|
|
359
393
|
}),
|
|
360
|
-
|
|
394
|
+
words: {polite: [], assertive: []},
|
|
361
395
|
clears: {polite: false, assertive: false},
|
|
362
396
|
};
|
|
363
397
|
deferred = created;
|
|
364
398
|
deferredByScope.set(scope, deferred);
|
|
365
399
|
}
|
|
400
|
+
const waiting = deferred;
|
|
366
401
|
if (!message) {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
402
|
+
// Taken back: the receipts of what waited have nothing left to take.
|
|
403
|
+
for (const words of waiting.words[politeness]) {
|
|
404
|
+
for (const receipt of words.receipts) {
|
|
405
|
+
receipt.withdraw = null;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
waiting.words[politeness] = [];
|
|
409
|
+
waiting.clears[politeness] = true;
|
|
410
|
+
return null;
|
|
370
411
|
}
|
|
371
|
-
|
|
372
|
-
|
|
412
|
+
let words = waiting.words[politeness].find(entry => entry.text === message);
|
|
413
|
+
if (words == null) {
|
|
414
|
+
words = {text: message, receipts: []};
|
|
415
|
+
waiting.words[politeness].push(words);
|
|
373
416
|
}
|
|
417
|
+
const entry = words;
|
|
418
|
+
const receipt: AnnounceReceipt = {withdraw: null};
|
|
419
|
+
receipt.withdraw = () => {
|
|
420
|
+
// Before the frame: drop this announcer's share of the waiting words.
|
|
421
|
+
const at = entry.receipts.indexOf(receipt);
|
|
422
|
+
if (at < 0) {
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
entry.receipts.splice(at, 1);
|
|
426
|
+
if (entry.receipts.length === 0) {
|
|
427
|
+
waiting.words[politeness] = waiting.words[politeness].filter(
|
|
428
|
+
other => other !== entry,
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
};
|
|
432
|
+
entry.receipts.push(receipt);
|
|
433
|
+
return handleOf(receipt);
|
|
374
434
|
}
|
|
375
435
|
|
|
376
436
|
/**
|
|
@@ -400,7 +460,7 @@ function announceFromScope(
|
|
|
400
460
|
scope: ModalAnnounceScope,
|
|
401
461
|
message: string,
|
|
402
462
|
politeness: AnnouncePoliteness,
|
|
403
|
-
):
|
|
463
|
+
): WithdrawAnnouncement | null {
|
|
404
464
|
if (isBeingPresented(scope)) {
|
|
405
465
|
// Announced in the commit that opens the enclosing modal — a field error
|
|
406
466
|
// inside `{isOpen && <Dialog isOpen>}`, alone or inside an already-open
|
|
@@ -411,8 +471,7 @@ function announceFromScope(
|
|
|
411
471
|
// (FR9). A caller inside a modal that is meant to be closed (its content
|
|
412
472
|
// stays mounted) is not waiting for anything: it takes the route of
|
|
413
473
|
// where it is now, joined with the frame's other messages.
|
|
414
|
-
deferUntilPresented(scope, message, politeness);
|
|
415
|
-
return;
|
|
474
|
+
return deferUntilPresented(scope, message, politeness);
|
|
416
475
|
}
|
|
417
476
|
const dialog = enclosingOpenModal(scope);
|
|
418
477
|
if (!message) {
|
|
@@ -423,17 +482,15 @@ function announceFromScope(
|
|
|
423
482
|
} else {
|
|
424
483
|
clearRegion(politeness);
|
|
425
484
|
}
|
|
426
|
-
return;
|
|
485
|
+
return null;
|
|
427
486
|
}
|
|
428
487
|
if (dialog != null) {
|
|
429
|
-
announceInModalRouted(dialog, message, politeness);
|
|
430
|
-
return;
|
|
488
|
+
return announceInModalRouted(dialog, message, politeness);
|
|
431
489
|
}
|
|
432
|
-
announceMessage(message, politeness);
|
|
490
|
+
return announceMessage(message, politeness);
|
|
433
491
|
}
|
|
434
492
|
|
|
435
493
|
installModalRoute({
|
|
436
494
|
announce: announceFromScope,
|
|
437
495
|
announceInModal: announceInModalRouted,
|
|
438
|
-
withdrawFromModalPending: withdrawFromModalPendingRouted,
|
|
439
496
|
});
|
|
@@ -7,7 +7,10 @@
|
|
|
7
7
|
* @input Uses React's external-store subscription over window.matchMedia
|
|
8
8
|
* and the touch presentation's compact-touch query
|
|
9
9
|
* @output Resolves popover/bottom-sheet presentation policy
|
|
10
|
-
* @position Internal overlay policy shared across component families
|
|
10
|
+
* @position Internal overlay policy shared across component families. A
|
|
11
|
+
* component that also switches input modes under a finger resolves its
|
|
12
|
+
* `presentation` with usePresentation (utils/presentation.ts), whose
|
|
13
|
+
* surface is this one's
|
|
11
14
|
*/
|
|
12
15
|
|
|
13
16
|
import {useCallback, useSyncExternalStore} from 'react';
|
|
@@ -17,14 +17,31 @@ export const docs = {
|
|
|
17
17
|
'assertive',
|
|
18
18
|
'visually hidden',
|
|
19
19
|
'wcag',
|
|
20
|
+
'replace',
|
|
21
|
+
'result count',
|
|
22
|
+
],
|
|
23
|
+
params: [
|
|
24
|
+
{
|
|
25
|
+
name: 'options',
|
|
26
|
+
type: 'UseAnnounceOptions',
|
|
27
|
+
description: 'Configuration object.',
|
|
28
|
+
required: false,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'options.hasReplace',
|
|
32
|
+
type: 'boolean',
|
|
33
|
+
description:
|
|
34
|
+
"The instance states one current state, such as a search's result count: each message it writes withdraws the instance's previous message while that one has not been spoken yet, whatever their politeness, and is spoken at its own politeness. A message already spoken stays. Messages from other instances, and from instances without hasReplace, still join. Give each state a component reports its own instance, for example one for the result count and one for selection changes.",
|
|
35
|
+
default: 'false',
|
|
36
|
+
required: false,
|
|
37
|
+
},
|
|
20
38
|
],
|
|
21
|
-
params: [],
|
|
22
39
|
returns: [
|
|
23
40
|
{
|
|
24
41
|
name: 'announce',
|
|
25
42
|
type: '(message: string, politeness?: "polite" | "assertive") => void',
|
|
26
43
|
description:
|
|
27
|
-
'Speaks a message through the live region the caller can be heard from: the shared one on the page body, or, when the calling component is rendered inside an open Astryx modal (Dialog, modal BottomSheet, modal Drawer, Lightbox, MobileNav, CommandPalette), a persistent region inside that modal, since a native modal hides the page-body region from assistive technology. Politeness defaults to "polite"; messages announced in the same frame are joined, in order, into one announcement, and an identical repeat is kept once. An empty message clears any lingering status, including joined messages not yet spoken, instead of announcing.',
|
|
44
|
+
'Speaks a message through the live region the caller can be heard from: the shared one on the page body, or, when the calling component is rendered inside an open Astryx modal (Dialog, modal BottomSheet, modal Drawer, Lightbox, MobileNav, CommandPalette), a persistent region inside that modal, since a native modal hides the page-body region from assistive technology. Politeness defaults to "polite"; messages announced in the same frame are joined, in order, into one announcement, and an identical repeat is kept once, except that each message from a hasReplace instance replaces the previous message of that instance not yet spoken. An empty message clears any lingering status, including joined messages not yet spoken, instead of announcing.',
|
|
28
45
|
},
|
|
29
46
|
],
|
|
30
47
|
usage: {
|
|
@@ -46,6 +63,11 @@ export const docs = {
|
|
|
46
63
|
description:
|
|
47
64
|
'Announce the outcome, not the interaction; "12 results" rather than "search ran".',
|
|
48
65
|
},
|
|
66
|
+
{
|
|
67
|
+
guidance: true,
|
|
68
|
+
description:
|
|
69
|
+
'Send a value that keeps changing, such as a result count as the user types, through its own useAnnounce({hasReplace: true}) instance, so input faster than a frame says only the latest count.',
|
|
70
|
+
},
|
|
49
71
|
{
|
|
50
72
|
guidance: false,
|
|
51
73
|
description:
|
|
@@ -63,9 +85,14 @@ export const docs = {
|
|
|
63
85
|
export const docsDense = {
|
|
64
86
|
description:
|
|
65
87
|
'Imperative screen-reader announcements via a visually-hidden live region: the page-body one, or one inside the open Astryx modal the caller is rendered in (a native modal hides the body region). Polite + assertive regions created empty on first use + kept mounted, so announcements are reliable (most AT ignore a live region inserted together w/ its content). Messages auto-clear after ~2s.',
|
|
88
|
+
paramDescriptions: {
|
|
89
|
+
options: 'config object.',
|
|
90
|
+
'options.hasReplace':
|
|
91
|
+
"instance states one current state (e.g. a search's result count): each message withdraws the instance's previous one not yet spoken, whatever politeness, spoken at its own; spoken messages stay; other instances + instances w/o hasReplace still join. Default false.",
|
|
92
|
+
},
|
|
66
93
|
returnDescriptions: {
|
|
67
94
|
announce:
|
|
68
|
-
'speaks message through the live region the caller is heard from: page body, or inside the open Astryx modal (Dialog, modal BottomSheet/Drawer, Lightbox, MobileNav, CommandPalette) the calling component is rendered in. politeness defaults "polite"; same-frame messages join in order, identical repeat kept once; empty message clears lingering + not-yet-spoken status.',
|
|
95
|
+
'speaks message through the live region the caller is heard from: page body, or inside the open Astryx modal (Dialog, modal BottomSheet/Drawer, Lightbox, MobileNav, CommandPalette) the calling component is rendered in. politeness defaults "polite"; same-frame messages join in order, identical repeat kept once, except a hasReplace instance replaces its own not-yet-spoken message; empty message clears lingering + not-yet-spoken status.',
|
|
69
96
|
},
|
|
70
97
|
usage: {
|
|
71
98
|
description:
|
|
@@ -86,6 +113,11 @@ export const docsDense = {
|
|
|
86
113
|
description:
|
|
87
114
|
'Announce outcome, not interaction; "12 results", not "search ran".',
|
|
88
115
|
},
|
|
116
|
+
{
|
|
117
|
+
guidance: true,
|
|
118
|
+
description:
|
|
119
|
+
'Changing value (result count while typing): own useAnnounce({hasReplace: true}) instance, so faster-than-a-frame input says only the latest.',
|
|
120
|
+
},
|
|
89
121
|
{
|
|
90
122
|
guidance: false,
|
|
91
123
|
description:
|