@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
package/dist/motion/animator.js
CHANGED
|
@@ -69,13 +69,17 @@
|
|
|
69
69
|
* Chromium starts it after the block.
|
|
70
70
|
*
|
|
71
71
|
* Promotion: Mobile Safari runs an animation whose start time is set from
|
|
72
|
-
* script on its compositor at its first commit only if the element
|
|
73
|
-
* has a compositing layer; without one, a block
|
|
74
|
-
* freezes it (iOS 26.2 simulator: 2 of 7 runs kept
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
72
|
+
* script on its compositor at its first commit only if the element (or the
|
|
73
|
+
* pseudo-element) already has a compositing layer; without one, a block
|
|
74
|
+
* right after that commit freezes it (iOS 26.2 simulator: 2 of 7 runs kept
|
|
75
|
+
* moving, 0 of 5 on a ::before). Every animation the animator creates, and
|
|
76
|
+
* every `set`, therefore promotes its channels in the same task: inline
|
|
77
|
+
* `will-change` on the element, merged with the element's own, or the custom
|
|
78
|
+
* property `--astryx-motion-will-change-<pseudo>` on the host for a
|
|
79
|
+
* pseudo-element, whose style opts in with
|
|
80
|
+
* `will-change: var(--astryx-motion-will-change-before, auto)`. That is
|
|
81
|
+
* enough (5 of 5, and 4 of 4 through the animator); promotion ends
|
|
82
|
+
* PROMOTION_LINGER_MS after the last motion.
|
|
79
83
|
*
|
|
80
84
|
* Known limits, iOS Safari (measured on the iOS 26.2 simulator):
|
|
81
85
|
* - a block in the task that starts a motion delays it: it starts when the
|
|
@@ -125,6 +129,14 @@
|
|
|
125
129
|
* Motion policy above, a cross-fade on a coarse pointer or after a touch
|
|
126
130
|
* release (`touchRelease`) and at once elsewhere (DR2, DR3).
|
|
127
131
|
*
|
|
132
|
+
* A pseudo-element (`options.pseudoElement`, a dialog's `::backdrop`) has no
|
|
133
|
+
* inline style: its end value is held by a static filling animation (after a
|
|
134
|
+
* curve ends, and after `set`) until the next animation replaces it, and for
|
|
135
|
+
* as long as the pseudo-element exists. The browser makes a `::backdrop`
|
|
136
|
+
* again each time its dialog opens, without the hold, so a presentation
|
|
137
|
+
* calls `set` with its starting value right after `showModal()`, in the same
|
|
138
|
+
* task: a `set` before it lands on the backdrop the open replaces.
|
|
139
|
+
*
|
|
128
140
|
* SSR-safe: nothing touches `window` or `document` at module scope, and an
|
|
129
141
|
* animator created without an element only keeps state until one is attached.
|
|
130
142
|
*
|
|
@@ -285,7 +297,7 @@ function format(channel, value) {
|
|
|
285
297
|
const shared = new WeakMap();
|
|
286
298
|
|
|
287
299
|
/**
|
|
288
|
-
* The one animator for `element
|
|
300
|
+
* The one animator for `element` (and `options.pseudoElement`), created on
|
|
289
301
|
* first use. Code that animates one element from several places (a swipe on
|
|
290
302
|
* x, a removal on y) shares it, so their curves compose in one `translate`
|
|
291
303
|
* track and retargeting one axis leaves the other on its curve; two
|
|
@@ -294,10 +306,16 @@ const shared = new WeakMap();
|
|
|
294
306
|
* elsewhere or `dispose` it: it lives as long as the element.
|
|
295
307
|
*/
|
|
296
308
|
export function animatorFor(element, options = {}) {
|
|
297
|
-
let
|
|
309
|
+
let byPseudo = shared.get(element);
|
|
310
|
+
if (byPseudo == null) {
|
|
311
|
+
byPseudo = new Map();
|
|
312
|
+
shared.set(element, byPseudo);
|
|
313
|
+
}
|
|
314
|
+
const key = options.pseudoElement ?? '';
|
|
315
|
+
let animator = byPseudo.get(key);
|
|
298
316
|
if (animator == null) {
|
|
299
317
|
animator = createAnimator(element, options);
|
|
300
|
-
|
|
318
|
+
byPseudo.set(key, animator);
|
|
301
319
|
}
|
|
302
320
|
return animator;
|
|
303
321
|
}
|
|
@@ -413,6 +431,7 @@ export function createAnimator(element, options = {}) {
|
|
|
413
431
|
const requestFrame = options.requestFrame ?? (typeof requestAnimationFrame === 'function' ? callback => {
|
|
414
432
|
requestAnimationFrame(() => callback());
|
|
415
433
|
} : null);
|
|
434
|
+
const pseudoElement = options.pseudoElement;
|
|
416
435
|
// Reduced Motion reads the person's settings and nothing else: no option
|
|
417
436
|
// overrides them (design:reduced-motion DR4).
|
|
418
437
|
const prefersReducedMotion = defaultPrefersReducedMotion;
|
|
@@ -463,6 +482,8 @@ export function createAnimator(element, options = {}) {
|
|
|
463
482
|
/** The stylesheet's will-change when there is no inline value. */
|
|
464
483
|
let sheetWillChange = '';
|
|
465
484
|
let demoteTimer = null;
|
|
485
|
+
/** A pseudo-element is promoted through a custom property on its host. */
|
|
486
|
+
const promotionProperty = pseudoElement == null ? null : `--astryx-motion-will-change-${pseudoElement.replace(/^:+/, '')}`;
|
|
466
487
|
/** Channels whose identity the last node held inline (see `attach`). */
|
|
467
488
|
let heldIdentity = new Set();
|
|
468
489
|
|
|
@@ -533,7 +554,7 @@ export function createAnimator(element, options = {}) {
|
|
|
533
554
|
|
|
534
555
|
const finalValue = property => segments.get(property)?.target ?? resting[property];
|
|
535
556
|
const writeInline = (channel, value) => {
|
|
536
|
-
if (target == null) {
|
|
557
|
+
if (target == null || pseudoElement != null) {
|
|
537
558
|
return;
|
|
538
559
|
}
|
|
539
560
|
touched.add(channel);
|
|
@@ -588,14 +609,36 @@ export function createAnimator(element, options = {}) {
|
|
|
588
609
|
}
|
|
589
610
|
return times;
|
|
590
611
|
};
|
|
612
|
+
|
|
613
|
+
/** A pseudo-element's resting value, held by a static filling animation. */
|
|
614
|
+
const hold = (channel, time) => {
|
|
615
|
+
if (target == null) {
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
const value = format(channel, finalValue);
|
|
619
|
+
const animation = target.animate([{
|
|
620
|
+
[channel]: value
|
|
621
|
+
}, {
|
|
622
|
+
[channel]: value
|
|
623
|
+
}], {
|
|
624
|
+
duration: 1,
|
|
625
|
+
fill: 'both',
|
|
626
|
+
pseudoElement
|
|
627
|
+
});
|
|
628
|
+
animation.startTime = time;
|
|
629
|
+
running.set(channel, animation);
|
|
630
|
+
};
|
|
591
631
|
const rebuild = (channel, time) => {
|
|
592
632
|
const previous = running.get(channel);
|
|
593
633
|
running.delete(channel);
|
|
594
634
|
clearTimeout(retireTimers.get(channel));
|
|
595
635
|
retireTimers.delete(channel);
|
|
596
|
-
//
|
|
597
|
-
//
|
|
598
|
-
|
|
636
|
+
// An element's inline style holds the end state, so its old animation can
|
|
637
|
+
// go first. A pseudo-element has none: its old animation keeps holding the
|
|
638
|
+
// value until the new one exists (same task, no frame in between).
|
|
639
|
+
if (pseudoElement == null) {
|
|
640
|
+
previous?.cancel();
|
|
641
|
+
}
|
|
599
642
|
const properties = CHANNELS[channel];
|
|
600
643
|
// Settled curves become resting values.
|
|
601
644
|
for (const property of properties) {
|
|
@@ -612,6 +655,10 @@ export function createAnimator(element, options = {}) {
|
|
|
612
655
|
return;
|
|
613
656
|
}
|
|
614
657
|
if (moving.length === 0) {
|
|
658
|
+
if (pseudoElement != null) {
|
|
659
|
+
hold(channel, time);
|
|
660
|
+
}
|
|
661
|
+
previous?.cancel();
|
|
615
662
|
return;
|
|
616
663
|
}
|
|
617
664
|
// A channel rebuilt by an explicit call (set, rebase, a retarget of
|
|
@@ -624,6 +671,10 @@ export function createAnimator(element, options = {}) {
|
|
|
624
671
|
const from = waiting?.provisional ?? time;
|
|
625
672
|
const end = Math.min(from + MAX_DURATION_MS, Math.max(...moving.map(p => segments.get(p).start + segments.get(p).duration)));
|
|
626
673
|
if (end <= from) {
|
|
674
|
+
if (pseudoElement != null) {
|
|
675
|
+
hold(channel, time);
|
|
676
|
+
}
|
|
677
|
+
previous?.cancel();
|
|
627
678
|
return;
|
|
628
679
|
}
|
|
629
680
|
if (callGroup != null) {
|
|
@@ -702,7 +753,10 @@ export function createAnimator(element, options = {}) {
|
|
|
702
753
|
// The main thread drops the animation once it runs after the end; the
|
|
703
754
|
// inline style already holds the same values, so that changes no pixel.
|
|
704
755
|
fill: 'both',
|
|
705
|
-
easing: 'linear'
|
|
756
|
+
easing: 'linear',
|
|
757
|
+
...(pseudoElement != null ? {
|
|
758
|
+
pseudoElement
|
|
759
|
+
} : {})
|
|
706
760
|
});
|
|
707
761
|
if (waiting != null) {
|
|
708
762
|
// From rest: no start time, so the browser starts the animation when
|
|
@@ -723,7 +777,9 @@ export function createAnimator(element, options = {}) {
|
|
|
723
777
|
|
|
724
778
|
/**
|
|
725
779
|
* Once the main thread runs after the curve's end, the animation leaves the
|
|
726
|
-
* running state:
|
|
780
|
+
* running state: an element's inline style already shows the end values; a
|
|
781
|
+
* pseudo-element's end value moves to a static holding animation, created
|
|
782
|
+
* before the long one goes.
|
|
727
783
|
*/
|
|
728
784
|
const scheduleRetire = (channel, animation, end) => {
|
|
729
785
|
clearTimeout(retireTimers.get(channel));
|
|
@@ -740,6 +796,12 @@ export function createAnimator(element, options = {}) {
|
|
|
740
796
|
return;
|
|
741
797
|
}
|
|
742
798
|
running.delete(channel);
|
|
799
|
+
// A pseudo-element holds its resting value, unless the stylesheet
|
|
800
|
+
// takes it back now (a borrowed dip that has ended).
|
|
801
|
+
const handsBack = channel === 'opacity' && borrowedOpacity != null && ![...landings].some(landing => landing.fadeIn?.isBorrowed === true);
|
|
802
|
+
if (pseudoElement != null && !handsBack) {
|
|
803
|
+
hold(channel, now());
|
|
804
|
+
}
|
|
743
805
|
animation.cancel();
|
|
744
806
|
releaseIdentity(channel);
|
|
745
807
|
flushReleases();
|
|
@@ -750,20 +812,30 @@ export function createAnimator(element, options = {}) {
|
|
|
750
812
|
/** The element's own (stylesheet) opacity, read once when a dip starts. */
|
|
751
813
|
const ownOpacity = () => {
|
|
752
814
|
const view = target?.ownerDocument.defaultView;
|
|
753
|
-
const value = target == null ? NaN : Number.parseFloat(view?.getComputedStyle(target).getPropertyValue('opacity') ?? '');
|
|
815
|
+
const value = target == null ? NaN : Number.parseFloat(view?.getComputedStyle(target, pseudoElement ?? null).getPropertyValue('opacity') ?? '');
|
|
754
816
|
return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 1;
|
|
755
817
|
};
|
|
756
818
|
|
|
757
819
|
/**
|
|
758
820
|
* Whether the animator holds an opacity of its own on the element: an inline
|
|
759
|
-
* value it wrote (a `set` over a
|
|
760
|
-
* returns to that value.
|
|
821
|
+
* value it wrote, or a pseudo-element's holding animation (a `set` over a
|
|
822
|
+
* stylesheet that hides or dims it). A dip returns to that value.
|
|
761
823
|
*/
|
|
762
|
-
const writesOwnOpacity = () => (target?.style.getPropertyValue('opacity') ?? '') !== '';
|
|
824
|
+
const writesOwnOpacity = () => pseudoElement == null ? (target?.style.getPropertyValue('opacity') ?? '') !== '' : running.has('opacity');
|
|
763
825
|
|
|
764
|
-
/**
|
|
826
|
+
/**
|
|
827
|
+
* Gives the element's opacity back to its stylesheet: an element's inline
|
|
828
|
+
* value goes; a pseudo-element, which has no inline style, loses the
|
|
829
|
+
* animation holding its value.
|
|
830
|
+
*/
|
|
765
831
|
const releaseOwnOpacity = () => {
|
|
766
|
-
|
|
832
|
+
if (pseudoElement == null) {
|
|
833
|
+
target?.style.removeProperty('opacity');
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
836
|
+
const held = running.get('opacity');
|
|
837
|
+
running.delete('opacity');
|
|
838
|
+
held?.cancel();
|
|
767
839
|
};
|
|
768
840
|
|
|
769
841
|
/**
|
|
@@ -844,6 +916,9 @@ export function createAnimator(element, options = {}) {
|
|
|
844
916
|
releaseOwnOpacity();
|
|
845
917
|
return;
|
|
846
918
|
}
|
|
919
|
+
if (pseudoElement != null) {
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
847
922
|
if (target.style.getPropertyValue(channel) !== IDENTITY_TEXT[channel]) {
|
|
848
923
|
return;
|
|
849
924
|
}
|
|
@@ -903,9 +978,17 @@ export function createAnimator(element, options = {}) {
|
|
|
903
978
|
|
|
904
979
|
// -- promotion -------------------------------------------------------------
|
|
905
980
|
|
|
906
|
-
/** Writes the promoted channels as will-change. */
|
|
981
|
+
/** Writes the promoted channels as will-change (or the pseudo's property). */
|
|
907
982
|
const writePromotion = element => {
|
|
908
983
|
const list = [...promoted].join(', ');
|
|
984
|
+
if (promotionProperty != null) {
|
|
985
|
+
if (list === '') {
|
|
986
|
+
element.style.removeProperty(promotionProperty);
|
|
987
|
+
} else {
|
|
988
|
+
element.style.setProperty(promotionProperty, list);
|
|
989
|
+
}
|
|
990
|
+
return;
|
|
991
|
+
}
|
|
909
992
|
if (list === '') {
|
|
910
993
|
element.style.willChange = ownWillChange ?? '';
|
|
911
994
|
ownWillChange = null;
|
|
@@ -924,7 +1007,7 @@ export function createAnimator(element, options = {}) {
|
|
|
924
1007
|
};
|
|
925
1008
|
|
|
926
1009
|
/**
|
|
927
|
-
* Gives the element a compositing layer for
|
|
1010
|
+
* Gives the element (or its pseudo-element) a compositing layer for
|
|
928
1011
|
* `channel` from the task that starts the motion: Mobile Safari runs an
|
|
929
1012
|
* animation whose start time is set from script on its compositor at its
|
|
930
1013
|
* first commit only if the element already has a layer.
|
|
@@ -1747,7 +1830,11 @@ export function createAnimator(element, options = {}) {
|
|
|
1747
1830
|
}
|
|
1748
1831
|
// After the landing's commit, which can promote the element again.
|
|
1749
1832
|
demote();
|
|
1833
|
+
// A pseudo-element holds an identity with a static animation, which the
|
|
1834
|
+
// cancel below drops: note the channels to hold again on the next node
|
|
1835
|
+
// (never a borrowed opacity, which is the stylesheet's).
|
|
1750
1836
|
const isOpacityBorrowed = borrowedOpacity != null || [...landings].some(landing => landing.restoreIsBorrowed === true);
|
|
1837
|
+
const pseudoHeld = pseudoElement == null || target == null ? null : new Set(Object.keys(CHANNELS).filter(channel => running.has(channel) && !(channel === 'opacity' && isOpacityBorrowed) && CHANNELS[channel].every(p => !segments.has(p) && resting[p] === IDENTITY[p])));
|
|
1751
1838
|
for (const animation of running.values()) {
|
|
1752
1839
|
animation.cancel();
|
|
1753
1840
|
}
|
|
@@ -1767,7 +1854,7 @@ export function createAnimator(element, options = {}) {
|
|
|
1767
1854
|
// differs, kept through a detach for the node that comes next.
|
|
1768
1855
|
if (target != null) {
|
|
1769
1856
|
const outgoing = target;
|
|
1770
|
-
heldIdentity = new Set(Object.keys(CHANNELS).filter(channel => outgoing.style.getPropertyValue(channel) === IDENTITY_TEXT[channel]));
|
|
1857
|
+
heldIdentity = pseudoHeld ?? new Set(Object.keys(CHANNELS).filter(channel => outgoing.style.getPropertyValue(channel) === IDENTITY_TEXT[channel]));
|
|
1771
1858
|
}
|
|
1772
1859
|
const held = heldIdentity;
|
|
1773
1860
|
target = next;
|
|
@@ -1792,8 +1879,13 @@ export function createAnimator(element, options = {}) {
|
|
|
1792
1879
|
} else if (held.has(channel)) {
|
|
1793
1880
|
// An identity the animator held inline over a stylesheet that
|
|
1794
1881
|
// differs goes onto the new node too (writeInline keeps it only
|
|
1795
|
-
// where the new node's stylesheet still differs)
|
|
1796
|
-
|
|
1882
|
+
// where the new node's stylesheet still differs); a pseudo-element's
|
|
1883
|
+
// is held again.
|
|
1884
|
+
if (pseudoElement != null) {
|
|
1885
|
+
hold(channel, time);
|
|
1886
|
+
} else {
|
|
1887
|
+
writeInline(channel, property => resting[property]);
|
|
1888
|
+
}
|
|
1797
1889
|
}
|
|
1798
1890
|
}
|
|
1799
1891
|
flushReleases();
|
|
@@ -70,7 +70,7 @@ import type { IndicatorRegistry } from '../Indicator/types.js';
|
|
|
70
70
|
import type { TypographyConfig } from './types.js';
|
|
71
71
|
import { type OnMediaOverrides, type ResolvedOnMedia } from './onMediaTokens.js';
|
|
72
72
|
import { colorDefaults, spacingDefaults, sizeDefaults, borderDefaults, focusDefaults, radiusDefaults, shadowDefaults, durationDefaults, easeDefaults, typographyDefaults, textSizeDefaults, fontWeightDefaults, typeScaleDefaults } from './tokens.stylex.js';
|
|
73
|
-
import type {
|
|
73
|
+
import type { ThemeMotionConfig } from './themeMotion.js';
|
|
74
74
|
import type { RadiusScaleConfig } from './expandRadiusScale.js';
|
|
75
75
|
import type { ColorScaleConfig } from './expandColorScale.js';
|
|
76
76
|
import { type NormalizedThemeAdaptations, type ResolvedThemeAdaptationRule, type ThemeAdaptations, type ThemeGenerativeAxes } from './themeAdaptations.js';
|
|
@@ -202,13 +202,27 @@ export interface DefineThemeInput<IconVariants extends ReadonlyArray<string> | u
|
|
|
202
202
|
*/
|
|
203
203
|
typography?: TypographyConfig;
|
|
204
204
|
/**
|
|
205
|
-
* Motion configuration
|
|
206
|
-
* base values and a scaling ratio: min = base × ratio, max = base / ratio.
|
|
205
|
+
* Motion configuration: two knobs (spec:AST-108), a motion scale, or both.
|
|
207
206
|
*
|
|
208
|
-
*
|
|
207
|
+
* - `tempo` (default 1, clamped to 0.75–1.5) scales every motion duration
|
|
208
|
+
* token; touch motion's springs don't read it yet.
|
|
209
|
+
* - `character` (`'crisp'`, `'standard'` or `'expressive'`) sets the
|
|
210
|
+
* entrance and move curves; exits and fades never overshoot.
|
|
211
|
+
*
|
|
212
|
+
* Every theme follows each person's Reduce Motion setting; nothing loosens it.
|
|
213
|
+
*
|
|
214
|
+
* A motion scale computes duration min/max variants from base values and a
|
|
215
|
+
* ratio (min = base × ratio, max = base / ratio); its durations win over
|
|
216
|
+
* `tempo`, and explicit `tokens` overrides win over both. Finger tracking,
|
|
217
|
+
* momentum, the keyboard, hover, the press's onset delay and tap flash, and
|
|
218
|
+
* busy loops never follow the knobs; the press release fade follows
|
|
219
|
+
* `tempo`.
|
|
209
220
|
*
|
|
210
221
|
* @example
|
|
211
222
|
* ```
|
|
223
|
+
* motion: { tempo: 1.2, character: 'crisp' }
|
|
224
|
+
*
|
|
225
|
+
* // A motion scale, as before:
|
|
212
226
|
* motion: { fast: 175, medium: 410, slow: 975, ratio: 0.75 }
|
|
213
227
|
*
|
|
214
228
|
* // Suggested starting points:
|
|
@@ -217,7 +231,7 @@ export interface DefineThemeInput<IconVariants extends ReadonlyArray<string> | u
|
|
|
217
231
|
* // Cinematic: { fast: 200, medium: 500, slow: 1200, ratio: 0.7 }
|
|
218
232
|
* ```
|
|
219
233
|
*/
|
|
220
|
-
motion?:
|
|
234
|
+
motion?: ThemeMotionConfig;
|
|
221
235
|
/**
|
|
222
236
|
* Radius configuration. Generates radius token overrides
|
|
223
237
|
* from a base unit and multiplier.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/theme/defineTheme.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAEpC;;;;;GAKG;AACH,KAAK,gBAAgB,CAAC,OAAO,SAAS,MAAM,IAAI,OAAO,CACrD,MAAM,CAAC,QAAQ,GAAG,kBAAkB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAC1D,CAAC;AAEF;;;GAGG;AACH,KAAK,oBAAoB,CAAC,IAAI,IAAI,IAAI,SAAS,YAAY,GACvD,eAAe,SAAS,MAAM,IAAI,GAChC,IAAI,SAAS;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,CAAC,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,CAAA;CAAC,GACvE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,GACxB,MAAM,GACR,MAAM,GACR,KAAK,CAAC;AAEV;;;GAGG;AACH,KAAK,gBAAgB,CACnB,YAAY,SAAS,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EACtD,IAAI,IACF,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,OAAO,SAAS,MAAM,CAAC,CAAC,GACpE,OAAO,GACP,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAE/B;;;;GAIG;AACH,KAAK,qBAAqB,CACxB,YAAY,SAAS,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,EACtD,IAAI,IACF,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,SAAS,OAAO,GACnE,CAAC,GACD,KAAK,CAAC,CAAC;AAEX,wEAAwE;AACxE,KAAK,kBAAkB,GAAG,OAAO,CAC/B,MAAM,CAAC,QAAQ,GAAG,kBAAkB,EAAE,SAAS,CAAC,CACjD,CAAC;AACF,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAC9C,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/theme/defineTheme.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,7 +68,7 @@ import { resolveOnMedia } from "./onMediaTokens.js";
|
|
|
68
68
|
import { colorDefaults, spacingDefaults, sizeDefaults, borderDefaults, focusDefaults, radiusDefaults, shadowDefaults, durationDefaults, easeDefaults, typographyDefaults, textSizeDefaults, fontWeightDefaults, typeScaleDefaults } from "./tokens.stylex.js";
|
|
69
69
|
import { resolveThemeValues } from "./resolveThemeValues.js";
|
|
70
70
|
import { normalizeThemeAdaptations, resolveThemeAdaptationRules, resolveThemeGenerativeAxes } from "./themeAdaptations.js";
|
|
71
|
-
import { domainTokenDefaults } from "./domainTokens/
|
|
71
|
+
import { domainTokenDefaults } from "./domainTokens/domainTokenDefaults.js";
|
|
72
72
|
import { registerTheme } from "./themeRegistry.js";
|
|
73
73
|
import { resolveLocalTokenContract } from "./localTokens.js";
|
|
74
74
|
|
|
@@ -204,6 +204,41 @@ function describeBadBase(value) {
|
|
|
204
204
|
return `an object with keys [${keys.slice(0, 4).join(', ')}${keys.length > 4 ? ', …' : ''}]`;
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
+
/** The slow band's duration tokens. */
|
|
208
|
+
const SLOW_BAND = ['--duration-slow-min', '--duration-slow', '--duration-slow-max'];
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* The base's tokens for the duration-scale fields a child leaves unset
|
|
212
|
+
* (spec:AST-108 FR5, field by field): a child that sets no `slow` of its own
|
|
213
|
+
* regenerates only the fast and medium bands, so an inherited slow band stays
|
|
214
|
+
* as the base's tokens hold it, at the ratio it was made with; and a child
|
|
215
|
+
* that sets no `easing` keeps the base's `--ease-standard`, an explicit one
|
|
216
|
+
* included, however many themes down either is inherited.
|
|
217
|
+
*/
|
|
218
|
+
function inheritedScaleTokens(base, baseMotion, own) {
|
|
219
|
+
const names = [...('slow' in baseMotion && !('slow' in own) ? SLOW_BAND : []), ...('easing' in baseMotion && !('easing' in own) ? ['--ease-standard'] : [])];
|
|
220
|
+
if (names.length === 0) {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
const tokens = base.tokens;
|
|
224
|
+
return Object.fromEntries(names.flatMap(name => tokens[name] !== undefined ? [[name, tokens[name]]] : []));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Refuses a duration scale that is missing `fast`, `medium` or `ratio` after
|
|
229
|
+
* inheritance. The scale applies only when all three are present, so a partial
|
|
230
|
+
* one beside a knob (`{fast: 100, tempo: 1.2}`) would otherwise be dropped
|
|
231
|
+
* silently, though its fields win over `tempo` (spec:AST-108 FR5). Adaptation
|
|
232
|
+
* rules refuse the same in `completeMotion`.
|
|
233
|
+
*/
|
|
234
|
+
function assertCompleteMotionScale(motion, themeName) {
|
|
235
|
+
const scale = motion;
|
|
236
|
+
const writesScale = scale.fast !== undefined || scale.medium !== undefined || scale.ratio !== undefined || scale.slow !== undefined || scale.easing !== undefined;
|
|
237
|
+
if (writesScale && (scale.fast === undefined || scale.medium === undefined || scale.ratio === undefined)) {
|
|
238
|
+
throw new Error(`defineTheme("${themeName}"): \`motion\` sets a duration scale field, so it must supply \`fast\`, \`medium\`, and \`ratio\` unless each missing field is inherited from \`extends\`.`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
207
242
|
/**
|
|
208
243
|
* Create an Astryx theme.
|
|
209
244
|
*
|
|
@@ -229,13 +264,33 @@ export function defineTheme(input) {
|
|
|
229
264
|
// The theme's own value axes and the resolved base an `extends` supplies.
|
|
230
265
|
// The same axis metadata is retained so adaptation rules can complete partial
|
|
231
266
|
// configs without approximating values from unrelated built-in defaults.
|
|
267
|
+
//
|
|
268
|
+
// Motion inherits field by field (spec:AST-108 FR5): a duration-scale field
|
|
269
|
+
// or knob the child leaves unset keeps its base's value, so the child's
|
|
270
|
+
// motion tokens come from the merged configuration. They resolve base first,
|
|
271
|
+
// then generated (`architecture:theme-authoring-contract`): what the child
|
|
272
|
+
// generates replaces the base's tokens, its explicit ones included. A
|
|
273
|
+
// child's motion regenerates only what it sets: an inherited slow band and
|
|
274
|
+
// an inherited easing keep the base's tokens.
|
|
275
|
+
const baseMotion = base?.__axes?.motion;
|
|
276
|
+
const motion = input.motion != null && baseMotion != null ? {
|
|
277
|
+
...baseMotion,
|
|
278
|
+
...input.motion
|
|
279
|
+
} : input.motion;
|
|
280
|
+
if (motion != null) {
|
|
281
|
+
assertCompleteMotionScale(motion, input.name);
|
|
282
|
+
}
|
|
283
|
+
const inheritedScale = input.motion != null && base != null && baseMotion != null ? inheritedScaleTokens(base, baseMotion, input.motion) : undefined;
|
|
232
284
|
const ownValues = {
|
|
233
285
|
typography: input.typography,
|
|
234
286
|
color: input.color,
|
|
235
287
|
radius: input.radius,
|
|
236
|
-
motion
|
|
288
|
+
motion,
|
|
237
289
|
syntax: input.syntax,
|
|
238
|
-
tokens:
|
|
290
|
+
tokens: inheritedScale != null && Object.keys(inheritedScale).length > 0 ? {
|
|
291
|
+
...inheritedScale,
|
|
292
|
+
...input.tokens
|
|
293
|
+
} : input.tokens,
|
|
239
294
|
components: input.components
|
|
240
295
|
};
|
|
241
296
|
const ownAxes = {
|
|
@@ -248,10 +303,15 @@ export function defineTheme(input) {
|
|
|
248
303
|
tokens: base.tokens,
|
|
249
304
|
components: base.components
|
|
250
305
|
} : undefined;
|
|
306
|
+
|
|
307
|
+
// An explicit --ease-standard follows the character the theme inherits
|
|
308
|
+
// when it sets no motion of its own (FR2).
|
|
251
309
|
const {
|
|
252
310
|
tokens,
|
|
253
311
|
components
|
|
254
|
-
} = resolveThemeValues(ownValues, seed
|
|
312
|
+
} = resolveThemeValues(ownValues, seed, {
|
|
313
|
+
inheritedCharacter: baseMotion?.character
|
|
314
|
+
});
|
|
255
315
|
|
|
256
316
|
// On-media token overrides (base's resolved surface, then defaults, then
|
|
257
317
|
// this theme's own overrides). They compile after adaptations so the
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domainTokenDefaults.d.ts","sourceRoot":"","sources":["../../../src/theme/domainTokens/domainTokenDefaults.ts"],"names":[],"mappings":"AAcA,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGtD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file domainTokens/domainTokenDefaults.ts
|
|
5
|
+
* @input syntaxTokenDefaults, dataTokenDefaults
|
|
6
|
+
* @output domainTokenDefaults
|
|
7
|
+
* @position Merges the domain token defaults for defineTheme. Kept out of the
|
|
8
|
+
* domainTokens barrel because defineTheme sits in a lazily imported module
|
|
9
|
+
* graph, which imports no barrel (pinned by scripts/core-single-bundle.test.mjs).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { syntaxTokenDefaults } from "../syntax/tokens.js";
|
|
13
|
+
import { dataTokenDefaults } from "./dataTokens.js";
|
|
14
|
+
|
|
15
|
+
/** All domain token defaults merged — used by defineTheme for validation */
|
|
16
|
+
export const domainTokenDefaults = {
|
|
17
|
+
...syntaxTokenDefaults,
|
|
18
|
+
...dataTokenDefaults
|
|
19
|
+
};
|
|
@@ -4,17 +4,18 @@
|
|
|
4
4
|
* @output domainTokenDefaults, DomainTokenName
|
|
5
5
|
* @position Token aggregator; consumed by defineTheme for validation + autocomplete
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Re-exports only. The merged map lives in domainTokenDefaults.ts so that
|
|
8
|
+
* defineTheme, inside a lazily imported module graph, imports it without a
|
|
9
|
+
* barrel. Actual token definitions live in their own directories (syntax/,
|
|
10
|
+
* dataviz/).
|
|
9
11
|
*/
|
|
10
12
|
export { syntaxTokenDefaults } from '../syntax/tokens.js';
|
|
11
13
|
export type { SyntaxTokenName } from '../syntax/tokens.js';
|
|
12
14
|
export { dataTokenDefaults } from './dataTokens.js';
|
|
13
15
|
export type { DataTokenName } from './dataTokens.js';
|
|
16
|
+
export { domainTokenDefaults } from './domainTokenDefaults.js';
|
|
14
17
|
import type { SyntaxTokenName } from '../syntax/tokens.js';
|
|
15
18
|
import type { DataTokenName } from './dataTokens.js';
|
|
16
|
-
/** All domain token defaults merged — used by defineTheme for validation */
|
|
17
|
-
export declare const domainTokenDefaults: Record<string, string>;
|
|
18
19
|
/** Union of all domain token names */
|
|
19
20
|
export type DomainTokenName = SyntaxTokenName | DataTokenName;
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/domainTokens/index.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/domainTokens/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAC,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,sCAAsC;AACtC,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,aAAa,CAAC"}
|
|
@@ -6,18 +6,14 @@
|
|
|
6
6
|
* @output domainTokenDefaults, DomainTokenName
|
|
7
7
|
* @position Token aggregator; consumed by defineTheme for validation + autocomplete
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* Re-exports only. The merged map lives in domainTokenDefaults.ts so that
|
|
10
|
+
* defineTheme, inside a lazily imported module graph, imports it without a
|
|
11
|
+
* barrel. Actual token definitions live in their own directories (syntax/,
|
|
12
|
+
* dataviz/).
|
|
11
13
|
*/
|
|
12
14
|
|
|
13
15
|
export { syntaxTokenDefaults } from "../syntax/tokens.js";
|
|
14
16
|
export { dataTokenDefaults } from "./dataTokens.js";
|
|
15
|
-
|
|
16
|
-
import { dataTokenDefaults } from "./dataTokens.js";
|
|
17
|
-
/** All domain token defaults merged — used by defineTheme for validation */
|
|
18
|
-
export const domainTokenDefaults = {
|
|
19
|
-
...syntaxTokenDefaults,
|
|
20
|
-
...dataTokenDefaults
|
|
21
|
-
};
|
|
17
|
+
export { domainTokenDefaults } from "./domainTokenDefaults.js";
|
|
22
18
|
|
|
23
19
|
/** Union of all domain token names */
|
package/dist/theme/index.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export { expandColorScale } from './expandColorScale.js';
|
|
|
32
32
|
export type { ColorScaleConfig, ColorScaleTokens } from './expandColorScale.js';
|
|
33
33
|
export { expandMotionScale } from './expandMotionScale.js';
|
|
34
34
|
export type { MotionScaleConfig, MotionScaleTokens } from './expandMotionScale.js';
|
|
35
|
+
export type { MotionCharacter, ThemeMotionConfig, ThemeMotionKnobs, } from './themeMotion.js';
|
|
35
36
|
export { colorDefaults, spacingDefaults, sizeDefaults, borderDefaults, focusDefaults, radiusDefaults, shadowDefaults, durationDefaults, easeDefaults, typographyDefaults, textSizeDefaults, fontWeightDefaults, typeScaleDefaults, colorVars, spacingVars, sizeVars, borderVars, focusVars, radiusVars, shadowVars, durationVars, easeVars, typographyVars, textSizeVars, fontWeightVars, typeScaleVars, } from './tokens.stylex.js';
|
|
36
37
|
export type { ColorVarName, SpacingVarName, SizeVarName, BorderVarName, RadiusVarName, ShadowVarName, DurationVarName, EaseVarName, TypographyVarName, TextSizeVarName, FontWeightVarName, TypeScaleVarName, } from './tokens.stylex.js';
|
|
37
38
|
export { useTheme, useThemeName, ThemeContext } from './useTheme.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AACxC,YAAY,EAAC,eAAe,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,cAAc,EACd,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,EACnB,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,oBAAoB,CAAC;AAE5B,YAAY,EACV,eAAe,EACf,eAAe,EACf,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAC,iBAAiB,EAAC,MAAM,UAAU,CAAC;AAC3C,YAAY,EACV,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,UAAU,CAAC;AACrD,YAAY,EAAC,oBAAoB,EAAC,MAAM,UAAU,CAAC;AAEnD,OAAO,EAAC,eAAe,EAAE,2BAA2B,EAAC,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EAAC,eAAe,EAAE,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAC,iBAAiB,EAAE,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAC,iBAAiB,EAAE,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file motionKnobs.ts
|
|
3
|
+
* @input A theme's motion knobs (`tempo`, `character`)
|
|
4
|
+
* @output Their types and `resolveMotionKnobs`, which fills in the defaults
|
|
5
|
+
* and clamps `tempo` (`spec:AST-108` FR1). `reducedMotion` is not a public
|
|
6
|
+
* knob until `'always'` ships: every theme resolves to `'system'`
|
|
7
|
+
* @position Theme utility with no imports: themeMotion.ts builds the motion
|
|
8
|
+
* tokens on it, and the motion foundation reads a theme's knobs through it
|
|
9
|
+
* without loading the token stylesheet. Pure; safe on the server and in
|
|
10
|
+
* plain Node.
|
|
11
|
+
*
|
|
12
|
+
* SYNC: When modified, update:
|
|
13
|
+
* - /packages/core/src/theme/themeMotion.ts (re-exports these)
|
|
14
|
+
* - /packages/core/src/theme/themeMotion.test.ts
|
|
15
|
+
*/
|
|
16
|
+
/** How lively a theme's motion feels. */
|
|
17
|
+
export type MotionCharacter = 'crisp' | 'standard' | 'expressive';
|
|
18
|
+
/**
|
|
19
|
+
* Whose Reduce Motion setting a theme follows: `'system'`, each person's own.
|
|
20
|
+
* Internal: no theme sets it until `'always'` ships (`spec:AST-108` FR6).
|
|
21
|
+
*/
|
|
22
|
+
export type ThemeReducedMotion = 'system';
|
|
23
|
+
/** The motion knobs a theme sets (`spec:AST-108` FR1). */
|
|
24
|
+
export interface ThemeMotionKnobs {
|
|
25
|
+
/**
|
|
26
|
+
* Scales every motion duration: 1 is Astryx's own, 0.75 the quickest and
|
|
27
|
+
* 1.5 the slowest (values outside are clamped). Default 1.
|
|
28
|
+
*/
|
|
29
|
+
tempo?: number;
|
|
30
|
+
/**
|
|
31
|
+
* `'crisp'` decelerates without overshoot, `'standard'` is Astryx's own,
|
|
32
|
+
* `'expressive'` overshoots slightly on entrances and moves. Exits and
|
|
33
|
+
* fades never overshoot. Default `'standard'`.
|
|
34
|
+
*/
|
|
35
|
+
character?: MotionCharacter;
|
|
36
|
+
}
|
|
37
|
+
/** The knobs with their defaults filled in and `tempo` clamped. */
|
|
38
|
+
export interface ResolvedMotionKnobs {
|
|
39
|
+
readonly tempo: number;
|
|
40
|
+
readonly character: MotionCharacter;
|
|
41
|
+
readonly reducedMotion: ThemeReducedMotion;
|
|
42
|
+
/**
|
|
43
|
+
* Whether the theme sets `tempo` itself. A `MotionScaleConfig` alone
|
|
44
|
+
* implies a tempo for its CSS durations only; the animator's springs stay
|
|
45
|
+
* at tempo 1 unless this is true (FR5).
|
|
46
|
+
*/
|
|
47
|
+
readonly tempoIsSet: boolean;
|
|
48
|
+
}
|
|
49
|
+
/** The range `tempo` is clamped to. */
|
|
50
|
+
export declare const TEMPO_RANGE: {
|
|
51
|
+
readonly min: 0.75;
|
|
52
|
+
readonly max: 1.5;
|
|
53
|
+
};
|
|
54
|
+
/** The knobs of `config`, defaults filled in, `tempo` clamped. */
|
|
55
|
+
export declare function resolveKnobs(config: ThemeMotionKnobs | undefined): ResolvedMotionKnobs;
|
|
56
|
+
//# sourceMappingURL=motionKnobs.d.ts.map
|