@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
|
@@ -140,9 +140,9 @@ describe('ProgressBar', () => {
|
|
|
140
140
|
expect(progressbar).toHaveAttribute('aria-valuenow', '0');
|
|
141
141
|
expect(progressbar.getAttribute('aria-valuetext')).toBe('0%');
|
|
142
142
|
expect(screen.queryByText(/NaN/)).not.toBeInTheDocument();
|
|
143
|
-
// The
|
|
143
|
+
// The filled share must be a real percentage, not "NaN%".
|
|
144
144
|
const fill = progressbar.firstElementChild as HTMLElement;
|
|
145
|
-
expect(fill.style.
|
|
145
|
+
expect(fill.style.getPropertyValue('--_progress-bar-fill')).toBe('0%');
|
|
146
146
|
});
|
|
147
147
|
|
|
148
148
|
it('treats a NaN max as an empty range instead of leaking "NaN"', () => {
|
|
@@ -653,16 +653,16 @@ describe('ProgressBar', () => {
|
|
|
653
653
|
);
|
|
654
654
|
const progressbar = screen.getByRole('progressbar');
|
|
655
655
|
const fill = progressbar.firstElementChild as HTMLElement;
|
|
656
|
-
expect(fill.style.
|
|
656
|
+
expect(fill.style.getPropertyValue('--_progress-bar-fill')).toBe('50%');
|
|
657
657
|
expect(fill.classList.contains('astryx-progress-bar-mark')).toBe(false);
|
|
658
658
|
expect(container.querySelectorAll(MARK)).toHaveLength(1);
|
|
659
659
|
});
|
|
660
660
|
|
|
661
|
-
it('
|
|
662
|
-
//
|
|
663
|
-
//
|
|
664
|
-
//
|
|
665
|
-
render(
|
|
661
|
+
it('keeps marks outside the clipping track, so a themed tall mark can still overhang', () => {
|
|
662
|
+
// The track clips its fill to the rounded rail. Marks sit beside the
|
|
663
|
+
// track in its unclipped container, never inside it, so a theme that
|
|
664
|
+
// makes a mark taller than the bar still sees it overhang both edges.
|
|
665
|
+
const {container} = render(
|
|
666
666
|
<ProgressBar
|
|
667
667
|
value={50}
|
|
668
668
|
label="Progress"
|
|
@@ -670,9 +670,36 @@ describe('ProgressBar', () => {
|
|
|
670
670
|
/>,
|
|
671
671
|
);
|
|
672
672
|
const progressbar = screen.getByRole('progressbar');
|
|
673
|
-
const
|
|
674
|
-
|
|
675
|
-
|
|
673
|
+
const marks = Array.from(container.querySelectorAll<HTMLElement>(MARK));
|
|
674
|
+
expect(marks).toHaveLength(1);
|
|
675
|
+
let css = '';
|
|
676
|
+
for (const sheet of Array.from(document.styleSheets)) {
|
|
677
|
+
for (const rule of Array.from(sheet.cssRules)) {
|
|
678
|
+
css += rule.cssText + '\n';
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
const clips = (el: Element) =>
|
|
682
|
+
Array.from(el.classList).some(cls =>
|
|
683
|
+
new RegExp(`\\.${cls}\\b[^{]*\\{[^}]*overflow:\\s*hidden`, 'i').test(
|
|
684
|
+
css,
|
|
685
|
+
),
|
|
686
|
+
);
|
|
687
|
+
for (const mark of marks) {
|
|
688
|
+
expect(progressbar.contains(mark)).toBe(false);
|
|
689
|
+
// No ancestor between the mark and the bar's root clips it.
|
|
690
|
+
let node = mark.parentElement;
|
|
691
|
+
while (node != null && node !== container) {
|
|
692
|
+
expect(clips(node)).toBe(false);
|
|
693
|
+
node = node.parentElement;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
});
|
|
697
|
+
|
|
698
|
+
it('clips the track in determinate mode (the fill slides in from the start)', () => {
|
|
699
|
+
// The determinate fill spans the whole track and is moved back by the
|
|
700
|
+
// unfilled share; the track's clip keeps the moved-out part hidden.
|
|
701
|
+
render(<ProgressBar value={30} label="Progress" />);
|
|
702
|
+
const progressbar = screen.getByRole('progressbar');
|
|
676
703
|
let css = '';
|
|
677
704
|
for (const sheet of Array.from(document.styleSheets)) {
|
|
678
705
|
try {
|
|
@@ -683,34 +710,83 @@ describe('ProgressBar', () => {
|
|
|
683
710
|
// ignore cross-origin sheets
|
|
684
711
|
}
|
|
685
712
|
}
|
|
686
|
-
css += Array.from(document.querySelectorAll('style'))
|
|
687
|
-
.map(s => s.textContent || '')
|
|
688
|
-
.join('\n');
|
|
689
|
-
// The atomic class that would set overflow:hidden must not be applied to
|
|
690
|
-
// the track. Sanity-check the bar still rendered with a StyleX class.
|
|
691
|
-
expect(trackClass).toBeDefined();
|
|
692
|
-
// No rule targeting the track's classes sets overflow:hidden. (StyleX
|
|
693
|
-
// atomic classes are unique per declaration; if overflow:hidden were on
|
|
694
|
-
// the track we'd see it applied. We assert the track element's computed
|
|
695
|
-
// intent by checking no overflow:hidden atomic is in its class list's
|
|
696
|
-
// rules — simplest robust check: the track style object omits it.)
|
|
697
713
|
const trackHasOverflowHidden = Array.from(progressbar.classList).some(
|
|
698
|
-
cls =>
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
);
|
|
703
|
-
return re.test(css);
|
|
704
|
-
},
|
|
714
|
+
cls =>
|
|
715
|
+
new RegExp(`\\.${cls}\\b[^{]*\\{[^}]*overflow:\\s*hidden`, 'i').test(
|
|
716
|
+
css,
|
|
717
|
+
),
|
|
705
718
|
);
|
|
706
|
-
expect(trackHasOverflowHidden).toBe(
|
|
719
|
+
expect(trackHasOverflowHidden).toBe(true);
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
it('moves the determinate fill with a transform, not its width, except under forced colors', () => {
|
|
723
|
+
// A width transition lays out and repaints on the main thread every
|
|
724
|
+
// frame, so it stalls while a script runs; a transform transition runs
|
|
725
|
+
// on the compositor. The fill spans the track and its leading edge sits
|
|
726
|
+
// at the filled share, mirrored in RTL.
|
|
727
|
+
render(<ProgressBar value={30} label="Progress" />);
|
|
728
|
+
const fill = screen.getByRole('progressbar')
|
|
729
|
+
.firstElementChild as HTMLElement;
|
|
730
|
+
// The stylesheet's rules, apart and under forced colors.
|
|
731
|
+
let css = '';
|
|
732
|
+
let forcedCss = '';
|
|
733
|
+
const collect = (rules: CSSRuleList, forced: boolean) => {
|
|
734
|
+
for (const rule of Array.from(rules)) {
|
|
735
|
+
if ('cssRules' in rule && 'conditionText' in rule) {
|
|
736
|
+
collect(
|
|
737
|
+
(rule as CSSMediaRule).cssRules,
|
|
738
|
+
forced ||
|
|
739
|
+
/forced-colors:\s*active/.test(
|
|
740
|
+
(rule as CSSMediaRule).conditionText,
|
|
741
|
+
),
|
|
742
|
+
);
|
|
743
|
+
} else if (forced) {
|
|
744
|
+
forcedCss += rule.cssText + '\n';
|
|
745
|
+
} else {
|
|
746
|
+
css += rule.cssText + '\n';
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
};
|
|
750
|
+
for (const sheet of Array.from(document.styleSheets)) {
|
|
751
|
+
collect(sheet.cssRules, false);
|
|
752
|
+
}
|
|
753
|
+
const declarationsIn = (text: string) =>
|
|
754
|
+
Array.from(fill.classList)
|
|
755
|
+
.flatMap(cls =>
|
|
756
|
+
Array.from(
|
|
757
|
+
text.matchAll(new RegExp(`\\.${cls}\\b[^{]*\\{([^}]*)\\}`, 'g')),
|
|
758
|
+
m => m[1].trim(),
|
|
759
|
+
),
|
|
760
|
+
)
|
|
761
|
+
.join('\n');
|
|
762
|
+
const joined = declarationsIn(css);
|
|
763
|
+
expect(fill.style.width).toBe('');
|
|
764
|
+
expect(fill.style.getPropertyValue('--_progress-bar-fill')).toBe('30%');
|
|
765
|
+
expect(joined).toMatch(/width:\s*100%/);
|
|
766
|
+
expect(joined).toMatch(/transition-property:\s*transform/);
|
|
767
|
+
expect(joined).not.toMatch(/transition-property:\s*width/);
|
|
768
|
+
expect(joined).toMatch(/will-change:\s*transform/);
|
|
769
|
+
expect(joined).toMatch(
|
|
770
|
+
/transform:\s*translateX\(calc\(var\(--_progress-bar-fill,\s*0%\) - 100%\)\)/,
|
|
771
|
+
);
|
|
772
|
+
expect(css).toMatch(
|
|
773
|
+
// The bar's own direction (`:dir(rtl)`), not any RTL ancestor.
|
|
774
|
+
/:dir\(rtl\)[^{]*\{[^}]*transform:\s*translateX\(calc\(100% - var\(--_progress-bar-fill,\s*0%\)\)\)/,
|
|
775
|
+
);
|
|
776
|
+
// Under forced colors the fill is sized to the value instead, so the
|
|
777
|
+
// track's clip never cuts its CanvasText outline (theme-tokens INV11);
|
|
778
|
+
// the Chromium spec checks the drawn outline.
|
|
779
|
+
const forced = declarationsIn(forcedCss);
|
|
780
|
+
expect(forced).toMatch(/width:\s*var\(--_progress-bar-fill,\s*0%\)/);
|
|
781
|
+
expect(forced).toMatch(/transform:\s*none/);
|
|
782
|
+
expect(forced).toMatch(/transition-property:\s*width/);
|
|
783
|
+
expect(forced).toMatch(/will-change:\s*auto/);
|
|
707
784
|
});
|
|
708
785
|
|
|
709
786
|
it('clips the track in indeterminate mode (the sliding fill must not escape)', () => {
|
|
710
787
|
// Regression: the indeterminate fill slides from translateX -100% to
|
|
711
788
|
// 250%, deliberately overshooting the track, and relies on the track
|
|
712
|
-
// clipping it to the visible window.
|
|
713
|
-
// marks can overhang — indeterminate mode must keep it.
|
|
789
|
+
// clipping it to the visible window.
|
|
714
790
|
render(<ProgressBar isIndeterminate label="Loading" />);
|
|
715
791
|
const progressbar = screen.getByRole('progressbar');
|
|
716
792
|
let css = '';
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* - /packages/cli/assets/templates/blocks/components/ProgressBar/ (showcase blocks)
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import {lazy, Suspense, useId} from 'react';
|
|
20
|
+
import {lazy, Suspense, useId, type CSSProperties} from 'react';
|
|
21
21
|
import * as stylex from '@stylexjs/stylex';
|
|
22
22
|
|
|
23
23
|
import {
|
|
@@ -223,19 +223,37 @@ const styles = stylex.create({
|
|
|
223
223
|
position: 'relative',
|
|
224
224
|
width: '100%',
|
|
225
225
|
},
|
|
226
|
-
// The semantic rail holds only the fill
|
|
226
|
+
// The semantic rail holds only the fill and clips it to the rounded rail:
|
|
227
|
+
// the determinate fill slides in from the inline-start side and the
|
|
228
|
+
// indeterminate one overshoots both ends. Marks live outside the track (in
|
|
229
|
+
// trackContainer), so the clip never cuts a themed tall mark.
|
|
227
230
|
track: {
|
|
228
231
|
width: '100%',
|
|
229
232
|
height: '8px',
|
|
230
233
|
backgroundColor: colorVars['--color-background-muted'],
|
|
231
234
|
borderRadius: radiusVars['--radius-full'],
|
|
232
|
-
},
|
|
233
|
-
// The indeterminate fill overshoots the track on both sides and must be
|
|
234
|
-
// clipped to the visible rail. Marks are suppressed in this mode.
|
|
235
|
-
trackClipped: {
|
|
236
235
|
overflow: 'hidden',
|
|
237
236
|
},
|
|
237
|
+
// The determinate fill spans the whole track and slides along it with a
|
|
238
|
+
// transform, so a value change animates on the compositor and keeps moving
|
|
239
|
+
// while a script runs; animating `width` would lay out and repaint on the
|
|
240
|
+
// main thread every frame and stall with it. `--_progress-bar-fill` is the
|
|
241
|
+
// filled share of the track (set inline); the fill's leading edge sits
|
|
242
|
+
// exactly there, mirrored in RTL. The mirror follows the bar's own
|
|
243
|
+
// direction (`:dir(rtl)`, the nearest `dir`), not any RTL ancestor, so a bar
|
|
244
|
+
// in an LTR region of an RTL page fills from the left like its label and
|
|
245
|
+
// marks. The layer is declared up front so Safari has the whole bar painted
|
|
246
|
+
// before it first moves.
|
|
247
|
+
//
|
|
248
|
+
// Under forced colors the fill is sized to the value instead (its `width`,
|
|
249
|
+
// no transform), as before: the track's clip would cut the CanvasText
|
|
250
|
+
// outline's start cap off a slid fill, and that outline is what keeps the
|
|
251
|
+
// fill's shape visible there (architecture:theme-tokens INV11).
|
|
238
252
|
fill: {
|
|
253
|
+
width: {
|
|
254
|
+
default: '100%',
|
|
255
|
+
'@media (forced-colors: active)': 'var(--_progress-bar-fill, 0%)',
|
|
256
|
+
},
|
|
239
257
|
height: '100%',
|
|
240
258
|
// Forced colors replace status fills with Canvas; this boundary keeps the
|
|
241
259
|
// fill's shape visible (architecture:theme-tokens INV11).
|
|
@@ -247,8 +265,32 @@ const styles = stylex.create({
|
|
|
247
265
|
},
|
|
248
266
|
outlineOffset: {default: null, '@media (forced-colors: active)': '-1px'},
|
|
249
267
|
borderRadius: radiusVars['--radius-full'],
|
|
250
|
-
|
|
251
|
-
|
|
268
|
+
transform: {
|
|
269
|
+
default: 'translateX(calc(var(--_progress-bar-fill, 0%) - 100%))',
|
|
270
|
+
':dir(rtl)': {
|
|
271
|
+
default: 'translateX(calc(100% - var(--_progress-bar-fill, 0%)))',
|
|
272
|
+
'@media (forced-colors: active)': 'none',
|
|
273
|
+
},
|
|
274
|
+
'@media (forced-colors: active)': 'none',
|
|
275
|
+
},
|
|
276
|
+
willChange: {
|
|
277
|
+
default: 'transform',
|
|
278
|
+
'@media (forced-colors: active)': 'auto',
|
|
279
|
+
},
|
|
280
|
+
transitionProperty: {
|
|
281
|
+
default: 'transform',
|
|
282
|
+
'@media (forced-colors: active)': 'width',
|
|
283
|
+
},
|
|
284
|
+
// Under reduced motion a new value lands at once, on every pointer: the
|
|
285
|
+
// fill never travels (design:reduced-motion DR1). The keys are the shared
|
|
286
|
+
// reduced-motion queries, a fine pointer's and a coarse pointer's, spelled
|
|
287
|
+
// as the record's other transitions spell them.
|
|
288
|
+
transitionDuration: {
|
|
289
|
+
default: durationVars['--duration-medium'],
|
|
290
|
+
'@media (prefers-reduced-motion: reduce) and (not (pointer: coarse))':
|
|
291
|
+
'0s',
|
|
292
|
+
'@media (prefers-reduced-motion: reduce) and (pointer: coarse)': '0s',
|
|
293
|
+
},
|
|
252
294
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
253
295
|
},
|
|
254
296
|
indeterminateFill: {
|
|
@@ -383,6 +425,11 @@ const markOnTrackStyles = stylex.create({
|
|
|
383
425
|
},
|
|
384
426
|
});
|
|
385
427
|
|
|
428
|
+
// `CSSProperties` has no index signature for custom properties, so the fill's
|
|
429
|
+
// inline style — which publishes the filled share as the private
|
|
430
|
+
// `--_progress-bar-fill` — needs this augmentation to typecheck.
|
|
431
|
+
type FillStyle = CSSProperties & Record<'--_progress-bar-fill', string>;
|
|
432
|
+
|
|
386
433
|
function defaultFormatValueLabel(value: number, max: number): string {
|
|
387
434
|
const pct = max > 0 ? Math.round((value / max) * 100) : 0;
|
|
388
435
|
return `${pct}%`;
|
|
@@ -462,6 +509,7 @@ export function ProgressBar({
|
|
|
462
509
|
const showValueLabel = hasValueLabel && !isIndeterminate;
|
|
463
510
|
|
|
464
511
|
const fillVariant = isDisabled ? 'disabled' : variant;
|
|
512
|
+
const fillStyle: FillStyle = {'--_progress-bar-fill': `${percentage}%`};
|
|
465
513
|
|
|
466
514
|
// Marks make no sense without a determinate value, so they are only drawn
|
|
467
515
|
// in determinate mode. Non-finite mark values are dropped; the rest are
|
|
@@ -536,7 +584,7 @@ export function ProgressBar({
|
|
|
536
584
|
aria-valuetext={isIndeterminate ? undefined : valueText}
|
|
537
585
|
{...mergeProps(
|
|
538
586
|
themeProps('progress-bar-track'),
|
|
539
|
-
stylex.props(styles.track
|
|
587
|
+
stylex.props(styles.track),
|
|
540
588
|
)}>
|
|
541
589
|
{isIndeterminate ? (
|
|
542
590
|
<div
|
|
@@ -554,7 +602,7 @@ export function ProgressBar({
|
|
|
554
602
|
themeProps('progress-bar-fill', {variant: fillVariant}),
|
|
555
603
|
stylex.props(styles.fill, variantStyles[fillVariant]),
|
|
556
604
|
)}
|
|
557
|
-
style={
|
|
605
|
+
style={fillStyle}
|
|
558
606
|
/>
|
|
559
607
|
)}
|
|
560
608
|
</div>
|
|
@@ -87,18 +87,30 @@ async function runState(
|
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
// Checking coverage runs every state again, which on a loaded runner nears
|
|
91
|
+
// the per-test timeout as one test. It runs as one serial part per state,
|
|
92
|
+
// sharing their results, then one check over all of them.
|
|
93
|
+
test.describe('every progressbar expectation is exercised by a ProgressBar state', () => {
|
|
94
|
+
test.describe.configure({mode: 'serial'});
|
|
94
95
|
const results: BindingResult[] = [];
|
|
96
|
+
|
|
95
97
|
for (const state of PROGRESSBAR_BINDING_STATES) {
|
|
96
|
-
|
|
98
|
+
test(`runs ${state.id}`, async ({page}) => {
|
|
99
|
+
const cdp = await page.context().newCDPSession(page);
|
|
100
|
+
results.push(await runState(page, cdp, state));
|
|
101
|
+
});
|
|
97
102
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
103
|
+
|
|
104
|
+
test('no expectation is left unexercised', () => {
|
|
105
|
+
// Every part ran in this worker; this test alone proves nothing.
|
|
106
|
+
expect(results.map(result => result.state).sort()).toEqual(
|
|
107
|
+
PROGRESSBAR_BINDING_STATES.map(state => state.id).sort(),
|
|
108
|
+
);
|
|
109
|
+
expect(neverExercised(results)).toEqual([]);
|
|
110
|
+
expect(unmatchedKnownFailures(PROGRESSBAR_KNOWN_FAILURES, results)).toEqual(
|
|
111
|
+
[],
|
|
112
|
+
);
|
|
113
|
+
});
|
|
102
114
|
});
|
|
103
115
|
|
|
104
116
|
for (const state of PROGRESSBAR_BINDING_STATES) {
|