@astryxdesign/core 0.7.8 → 0.7.9-canary.0200dfe
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/AppShell/observeMainOverflow.d.ts.map +1 -1
- package/dist/AppShell/observeMainOverflow.js +9 -6
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +37 -3
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +40 -8
- package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
- package/dist/BottomSheet/bottomSheetStack.js +4 -3
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +61 -21
- package/dist/Calendar/Calendar.d.ts +14 -2
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +63 -74
- package/dist/Calendar/getInitialFocusDate.d.ts +4 -1
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -1
- package/dist/Calendar/getInitialFocusDate.js +7 -5
- package/dist/Calendar/hooks/useCalendarDays.d.ts +19 -2
- package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
- package/dist/Calendar/hooks/useCalendarDays.js +57 -64
- package/dist/Calendar/hooks/useCalendarNavigation.d.ts +28 -3
- package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
- package/dist/Calendar/hooks/useCalendarNavigation.js +33 -22
- package/dist/Calendar/styles.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts +2 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +74 -18
- package/dist/CheckboxInput/CheckboxRowPressContext.d.ts +2 -0
- package/dist/CheckboxInput/CheckboxRowPressContext.d.ts.map +1 -0
- package/dist/CheckboxInput/CheckboxRowPressContext.js +20 -0
- package/dist/CheckboxList/CheckboxListItem.d.ts +2 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +40 -14
- package/dist/ClickableCard/ClickableCard.d.ts +1 -1
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +2 -0
- package/dist/DateInput/DateInput.d.ts +37 -6
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +97 -124
- package/dist/DateInput/MonthScroller.d.ts +5 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +26 -29
- package/dist/DateInput/MonthYearWheels.d.ts +10 -1
- package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
- package/dist/DateInput/MonthYearWheels.js +54 -42
- package/dist/DateInput/PickerWheel.d.ts.map +1 -1
- package/dist/DateInput/PickerWheel.js +7 -1
- package/dist/DateInput/TouchDateField.d.ts +1 -1
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +26 -21
- package/dist/DateInput/monthGeometry.d.ts +42 -8
- package/dist/DateInput/monthGeometry.d.ts.map +1 -1
- package/dist/DateInput/monthGeometry.js +81 -7
- package/dist/DateInput/useCalendarPresentation.d.ts +10 -0
- package/dist/DateInput/useCalendarPresentation.d.ts.map +1 -0
- package/dist/DateInput/useCalendarPresentation.js +32 -0
- package/dist/DateInput/useTypedDate.d.ts +92 -0
- package/dist/DateInput/useTypedDate.d.ts.map +1 -0
- package/dist/DateInput/useTypedDate.js +269 -0
- package/dist/DateInput/wheelStrip.js +2 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts +17 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +15 -8
- package/dist/DateTimeInput/DateTimeInput.d.ts +26 -3
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +92 -88
- package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +26 -20
- package/dist/Dialog/Dialog.d.ts +2 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +14 -3
- package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +11 -2
- package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +11 -8
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
- package/dist/Field/inputDisabledFocus.d.ts +4 -4
- package/dist/Field/inputStyles.stylex.d.ts +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +16 -2
- package/dist/HoverCard/useHoverCard.d.ts +3 -1
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/Icon/Icon.d.ts +1 -1
- package/dist/InfoTip/InfoTip.d.ts +1 -0
- package/dist/InfoTip/InfoTip.d.ts.map +1 -1
- package/dist/InfoTip/InfoTip.js +6 -18
- package/dist/InputGroup/InputGroup.d.ts +4 -3
- package/dist/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/InputGroup/InputGroup.js +2 -2
- package/dist/InputGroup/InputGroupText.d.ts +2 -1
- package/dist/InputGroup/InputGroupText.d.ts.map +1 -1
- package/dist/InputGroup/InputGroupText.js +2 -1
- package/dist/InputGroup/groupStyles.d.ts +1 -1
- package/dist/InputGroup/groupStyles.d.ts.map +1 -1
- package/dist/InputGroup/groupStyles.js +1 -1
- package/dist/Item/Item.d.ts +20 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +97 -29
- package/dist/Item/ItemListRowContext.d.ts +2 -0
- package/dist/Item/ItemListRowContext.d.ts.map +1 -0
- package/dist/Item/ItemListRowContext.js +16 -0
- package/dist/Layer/holdEntranceInput.d.ts +24 -0
- package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
- package/dist/Layer/holdEntranceInput.js +65 -0
- package/dist/Layer/inputHold.d.ts +49 -0
- package/dist/Layer/inputHold.d.ts.map +1 -0
- package/dist/Layer/inputHold.js +636 -0
- package/dist/Layer/outsidePress.d.ts +4 -0
- package/dist/Layer/outsidePress.d.ts.map +1 -1
- package/dist/Layer/outsidePress.js +18 -1
- package/dist/Layer/preserveAnimations.d.ts +1 -5
- package/dist/Layer/preserveAnimations.d.ts.map +1 -1
- package/dist/Layer/preserveAnimations.js +12 -214
- package/dist/Layer/useBackdropPress.d.ts +8 -0
- package/dist/Layer/useBackdropPress.d.ts.map +1 -1
- package/dist/Layer/useBackdropPress.js +31 -2
- package/dist/Layer/useLayer.d.ts +3 -1
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +64 -4
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +4 -0
- package/dist/Layout/LayoutContent.d.ts +3 -1
- package/dist/Layout/LayoutContent.d.ts.map +1 -1
- package/dist/Layout/LayoutContent.js +12 -4
- package/dist/Layout/LayoutPanel.d.ts +13 -10
- package/dist/Layout/LayoutPanel.d.ts.map +1 -1
- package/dist/Layout/LayoutPanel.js +81 -11
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +4 -0
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +1 -0
- package/dist/List/ListItem.d.ts +5 -4
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +45 -9
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +56 -39
- package/dist/MetadataList/MetadataList.js +1 -1
- package/dist/MobileNav/MobileNav.d.ts +11 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +39 -1
- package/dist/MoreMenu/MoreMenu.d.ts +5 -3
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +6 -9
- package/dist/NumberInput/NumberInput.d.ts +4 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +244 -11
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +7 -2
- package/dist/Popover/usePopover.d.ts +1 -0
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +12 -5
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchBottomSheet.js +4 -2
- package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchToken.js +3 -1
- package/dist/PowerSearch/formatFilterValue.d.ts +9 -3
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +14 -11
- package/dist/PowerSearch/formatTokenValue.d.ts +6 -2
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatTokenValue.js +6 -3
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +16 -3
- package/dist/Resizable/ResizeHandle.d.ts +5 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +44 -5
- package/dist/Resizable/resizablePane.d.ts +58 -0
- package/dist/Resizable/resizablePane.d.ts.map +1 -0
- package/dist/Resizable/resizablePane.js +137 -0
- package/dist/Resizable/useResizable.d.ts +7 -0
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +13 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
- package/dist/SelectableCard/SelectableCard.d.ts +1 -1
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +5 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +51 -10
- package/dist/SideNav/SideNav.d.ts +9 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +45 -10
- package/dist/Slider/sliderTouchController.js +2 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +14 -71
- package/dist/Spinner/index.d.ts +1 -1
- package/dist/Spinner/index.d.ts.map +1 -1
- package/dist/Spinner/spinnerRotor.d.ts +28 -0
- package/dist/Spinner/spinnerRotor.d.ts.map +1 -0
- package/dist/Spinner/spinnerRotor.js +98 -0
- package/dist/Stack/StackItem.d.ts +8 -4
- package/dist/Stack/StackItem.d.ts.map +1 -1
- package/dist/Stack/StackItem.js +17 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +13 -10
- package/dist/Switch/useSwitchTouch.js +4 -4
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +5 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +14 -8
- package/dist/Timestamp/formatInstant.d.ts +10 -1
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +13 -27
- package/dist/Timestamp/tooltipEntries.d.ts +5 -3
- package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
- package/dist/Timestamp/tooltipEntries.js +6 -4
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +9 -0
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +4 -1
- package/dist/Tokenizer/Tokenizer.d.ts +14 -10
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +189 -89
- package/dist/Tooltip/useTooltip.d.ts +3 -1
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +164 -59
- package/dist/TreeList/TreeListItem.d.ts +2 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +27 -3
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +2 -1
- package/dist/animator/createAnimator.js +2 -2
- package/dist/astryx.css +362 -325
- package/dist/gestures/GestureHost.d.ts +2 -2
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +21 -6
- package/dist/gestures/PanGestureRecognizer.d.ts +11 -1
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PanGestureRecognizer.js +15 -1
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +6 -1
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/nativeScroll.d.ts +3 -6
- package/dist/gestures/nativeScroll.d.ts.map +1 -1
- package/dist/gestures/nativeScroll.js +7 -52
- package/dist/gestures/wheelSegmenter.d.ts +68 -1
- package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
- package/dist/gestures/wheelSegmenter.js +199 -10
- package/dist/hooks/StackItemScrollRegion.d.ts +31 -0
- package/dist/hooks/StackItemScrollRegion.d.ts.map +1 -0
- package/dist/hooks/StackItemScrollRegion.js +40 -0
- package/dist/hooks/computeOverflow.d.ts +2 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.js +1 -1
- package/dist/hooks/menuPressGesture.d.ts +133 -21
- package/dist/hooks/menuPressGesture.d.ts.map +1 -1
- package/dist/hooks/menuPressGesture.js +155 -30
- package/dist/hooks/menuPressValues.d.ts +16 -0
- package/dist/hooks/menuPressValues.d.ts.map +1 -0
- package/dist/hooks/menuPressValues.js +18 -0
- package/dist/hooks/useClickableContainer.d.ts +36 -7
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +63 -14
- package/dist/hooks/useFocusTrap.d.ts +10 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +225 -132
- package/dist/hooks/useKeyboardHighlight.d.ts +17 -0
- package/dist/hooks/useKeyboardHighlight.d.ts.map +1 -0
- package/dist/hooks/useKeyboardHighlight.js +38 -0
- package/dist/hooks/useMediaQuery.d.ts +2 -1
- package/dist/hooks/useMediaQuery.d.ts.map +1 -1
- package/dist/hooks/useMediaQuery.js +37 -12
- package/dist/hooks/useMenuPress.d.ts +34 -1
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +93 -5
- package/dist/hooks/useOverflow.d.ts +10 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +214 -23
- package/dist/hooks/usePressFeedback.d.ts +6 -6
- package/dist/hooks/usePressFeedback.js +6 -6
- package/dist/hooks/useScrollRegionProps.d.ts +35 -0
- package/dist/hooks/useScrollRegionProps.d.ts.map +1 -0
- package/dist/hooks/useScrollRegionProps.js +51 -0
- package/dist/i18n/InternationalizationContext.d.ts +6 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.d.ts +23 -3
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +8 -3
- package/dist/i18n/generated-english/DateInput/DateInput.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/DateInput/DateInput.generated.js +0 -1
- package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts +8 -0
- package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/DateInput/useTypedDate.generated.js +16 -0
- package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.js +0 -1
- package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts +8 -0
- package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.js +12 -0
- 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/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +1 -0
- package/dist/i18n/useCalendarSystem.d.ts +19 -0
- package/dist/i18n/useCalendarSystem.d.ts.map +1 -0
- package/dist/i18n/useCalendarSystem.js +61 -0
- package/dist/internal/calendar-system.d.ts +18 -0
- package/dist/internal/calendar-system.d.ts.map +1 -0
- package/dist/internal/calendar-system.js +19 -0
- package/dist/internal/spinner-rotor.d.ts +16 -0
- package/dist/internal/spinner-rotor.d.ts.map +1 -0
- package/dist/internal/spinner-rotor.js +16 -0
- package/dist/internal/touch.d.ts +20 -2
- package/dist/internal/touch.d.ts.map +1 -1
- package/dist/internal/touch.js +29 -3
- package/dist/motion/animator.d.ts +5 -5
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +7 -6
- package/dist/motion/carryAnimations.d.ts +58 -0
- package/dist/motion/carryAnimations.d.ts.map +1 -0
- package/dist/motion/carryAnimations.js +305 -0
- package/dist/motion/transientCopy.d.ts +4 -2
- package/dist/motion/transientCopy.d.ts.map +1 -1
- package/dist/motion/transientCopy.js +34 -5
- package/dist/motion/uikit/gestures.d.ts +41 -0
- package/dist/motion/uikit/gestures.d.ts.map +1 -1
- package/dist/motion/uikit/gestures.js +25 -0
- package/dist/motion/uikit/index.d.ts +1 -1
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +1 -1
- package/dist/motion/uikit/timing.d.ts +14 -10
- package/dist/motion/uikit/timing.d.ts.map +1 -1
- package/dist/motion/uikit/timing.js +7 -5
- package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
- package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
- package/dist/privateAttributes/press.stylex.d.ts +142 -0
- package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/press.stylex.js +101 -0
- package/dist/theme/themeMotion.d.ts +3 -2
- package/dist/theme/themeMotion.d.ts.map +1 -1
- package/dist/theme/themeMotion.js +3 -2
- package/dist/theme/tokens.stylex.d.ts +2 -2
- package/dist/theme/tokens.stylex.js +1 -1
- package/dist/utils/calendarDateParser.d.ts +110 -0
- package/dist/utils/calendarDateParser.d.ts.map +1 -0
- package/dist/utils/calendarDateParser.js +1225 -0
- package/dist/utils/calendarSystem.d.ts +176 -0
- package/dist/utils/calendarSystem.d.ts.map +1 -0
- package/dist/utils/calendarSystem.js +569 -0
- package/dist/utils/coarsePointer.d.ts +5 -0
- package/dist/utils/coarsePointer.d.ts.map +1 -1
- package/dist/utils/coarsePointer.js +22 -13
- package/dist/utils/flatTree.d.ts +6 -3
- package/dist/utils/flatTree.d.ts.map +1 -1
- package/dist/utils/flatTree.js +13 -3
- package/dist/utils/focusReturn.d.ts +34 -13
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +64 -17
- package/dist/utils/hitArea.d.ts +8 -1
- package/dist/utils/hitArea.d.ts.map +1 -1
- package/dist/utils/hitArea.js +99 -9
- package/dist/utils/inputPresentation.d.ts +9 -1
- package/dist/utils/inputPresentation.d.ts.map +1 -1
- package/dist/utils/inputPresentation.js +15 -1
- package/dist/utils/inputStream.d.ts +14 -1
- package/dist/utils/inputStream.d.ts.map +1 -1
- package/dist/utils/inputStream.js +40 -9
- package/dist/utils/interactionOverlay.stylex.d.ts +5 -9
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +29 -31
- package/dist/utils/plainDate.d.ts +38 -7
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +92 -18
- package/dist/utils/pressFeedback.d.ts +10 -2
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +40 -15
- package/dist/utils/pressGesture.d.ts +12 -6
- package/dist/utils/pressGesture.d.ts.map +1 -1
- package/dist/utils/pressGesture.js +26 -8
- package/dist/utils/scrollView.d.ts +25 -0
- package/dist/utils/scrollView.d.ts.map +1 -0
- package/dist/utils/scrollView.js +108 -0
- package/dist/utils/selectionLock.d.ts.map +1 -1
- package/dist/utils/selectionLock.js +1 -10
- package/dist/utils/touchHitArea.d.ts +30 -0
- package/dist/utils/touchHitArea.d.ts.map +1 -0
- package/dist/utils/touchHitArea.js +167 -0
- package/dist/utils/touchHitArea.stylex.d.ts +38 -0
- package/dist/utils/touchHitArea.stylex.d.ts.map +1 -0
- package/dist/utils/touchHitArea.stylex.js +48 -0
- package/dist/utils/triggerFocus.d.ts +5 -0
- package/dist/utils/triggerFocus.d.ts.map +1 -1
- package/dist/utils/triggerFocus.js +9 -2
- package/locales/en.json +21 -1
- package/locales/pseudo.json +15 -0
- package/package.json +15 -4
- package/src/AppShell/observeMainOverflow.ts +9 -6
- package/src/BottomSheet/BottomSheet.tsx +45 -3
- package/src/BottomSheet/BottomSheetPanel.tsx +64 -7
- package/src/BottomSheet/bottomSheetStack.ts +4 -3
- package/src/BottomSheet/useSheetGestures.ts +83 -20
- package/src/Calendar/Calendar.doc.mjs +76 -6
- package/src/Calendar/Calendar.tsx +123 -104
- package/src/Calendar/getInitialFocusDate.ts +22 -8
- package/src/Calendar/hooks/useCalendarDays.ts +89 -63
- package/src/Calendar/hooks/useCalendarNavigation.ts +68 -26
- package/src/CheckboxInput/CheckboxInput.doc.mjs +5 -4
- package/src/CheckboxInput/CheckboxInput.tsx +105 -20
- package/src/CheckboxInput/CheckboxRowPressContext.ts +22 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
- package/src/CheckboxList/CheckboxListItem.doc.mjs +3 -3
- package/src/CheckboxList/CheckboxListItem.tsx +35 -14
- package/src/ClickableCard/ClickableCard.tsx +8 -1
- package/src/ContextMenu/ContextMenu.tsx +2 -0
- package/src/DateInput/DateInput.doc.mjs +45 -12
- package/src/DateInput/DateInput.tsx +165 -179
- package/src/DateInput/MonthScroller.tsx +39 -37
- package/src/DateInput/MonthYearWheels.tsx +68 -47
- package/src/DateInput/PickerWheel.tsx +7 -2
- package/src/DateInput/TouchDateField.tsx +45 -17
- package/src/DateInput/monthGeometry.ts +110 -8
- package/src/DateInput/useCalendarPresentation.ts +64 -0
- package/src/DateInput/useTypedDate.ts +469 -0
- package/src/DateInput/wheelStrip.ts +2 -2
- package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -0
- package/src/DateRangeInput/DateRangeInput.tsx +43 -9
- package/src/DateTimeInput/DateTimeInput.doc.mjs +42 -9
- package/src/DateTimeInput/DateTimeInput.tsx +138 -148
- package/src/DateTimeInput/TouchDateTimeField.tsx +31 -16
- package/src/Dialog/Dialog.doc.mjs +1 -1
- package/src/Dialog/Dialog.tsx +14 -2
- package/src/Drawer/Drawer.doc.mjs +1 -1
- package/src/Drawer/useDrawerDialogPresence.ts +9 -2
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
- package/src/DropdownMenu/DropdownMenu.tsx +31 -7
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
- package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
- package/src/FileInput/FileInput.tsx +16 -2
- package/src/HoverCard/useHoverCard.tsx +3 -1
- package/src/Icon/useIcon.doc.mjs +94 -0
- package/src/InfoTip/InfoTip.doc.mjs +26 -2
- package/src/InfoTip/InfoTip.tsx +6 -27
- package/src/InputGroup/InputGroup.doc.mjs +4 -3
- package/src/InputGroup/InputGroup.tsx +4 -3
- package/src/InputGroup/InputGroupText.doc.mjs +45 -3
- package/src/InputGroup/InputGroupText.tsx +2 -1
- package/src/InputGroup/groupStyles.ts +3 -1
- package/src/Item/Item.tsx +139 -35
- package/src/Item/ItemListRowContext.tsx +18 -0
- package/src/Layer/holdEntranceInput.ts +84 -0
- package/src/Layer/inputHold.ts +734 -0
- package/src/Layer/outsidePress.ts +18 -1
- package/src/Layer/preserveAnimations.ts +12 -275
- package/src/Layer/useBackdropPress.ts +41 -1
- package/src/Layer/useLayer.tsx +77 -4
- package/src/Layer/useTouchTrigger.ts +4 -0
- package/src/Layout/LayoutContent.doc.mjs +6 -3
- package/src/Layout/LayoutContent.tsx +10 -4
- package/src/Layout/LayoutPanel.doc.mjs +14 -11
- package/src/Layout/LayoutPanel.tsx +113 -16
- package/src/Lightbox/Lightbox.tsx +4 -0
- package/src/List/List.doc.mjs +10 -1
- package/src/List/List.tsx +5 -0
- package/src/List/ListItem.tsx +63 -8
- package/src/Markdown/parser.ts +65 -42
- package/src/MetadataList/MetadataList.tsx +1 -1
- package/src/MobileNav/MobileNav.doc.mjs +3 -3
- package/src/MobileNav/MobileNav.tsx +39 -1
- package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
- package/src/MoreMenu/MoreMenu.tsx +5 -3
- package/src/MultiSelector/MultiSelector.tsx +7 -17
- package/src/NumberInput/NumberInput.doc.mjs +1 -1
- package/src/NumberInput/NumberInput.tsx +259 -11
- package/src/OverflowList/OverflowList.tsx +15 -9
- package/src/Popover/usePopover.tsx +1 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
- package/src/PowerSearch/PowerSearch.tsx +20 -3
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +4 -1
- package/src/PowerSearch/PowerSearchToken.tsx +3 -0
- package/src/PowerSearch/formatFilterValue.ts +21 -11
- package/src/PowerSearch/formatTokenValue.ts +7 -1
- package/src/RadioList/RadioListItem.doc.mjs +3 -2
- package/src/RadioList/RadioListItem.tsx +16 -6
- package/src/Resizable/Resizable.doc.mjs +40 -12
- package/src/Resizable/ResizeHandle.tsx +68 -6
- package/src/Resizable/resizablePane.ts +179 -0
- package/src/Resizable/useResizable.ts +15 -0
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +3 -3
- package/src/SelectableCard/SelectableCard.tsx +8 -1
- package/src/Selector/Selector.tsx +83 -8
- package/src/SideNav/SideNav.doc.mjs +2 -2
- package/src/SideNav/SideNav.tsx +87 -12
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Spinner/Spinner.tsx +7 -89
- package/src/Spinner/index.ts +1 -5
- package/src/Spinner/spinnerRotor.ts +113 -0
- package/src/Stack/Stack.doc.mjs +1 -1
- package/src/Stack/StackItem.tsx +27 -13
- package/src/Switch/Switch.tsx +7 -6
- package/src/Switch/useSwitchTouch.ts +4 -4
- package/src/TabList/Tab.tsx +5 -1
- package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
- package/src/Timestamp/Timestamp.doc.mjs +3 -3
- package/src/Timestamp/Timestamp.tsx +13 -8
- package/src/Timestamp/formatInstant.ts +49 -28
- package/src/Timestamp/tooltipEntries.ts +7 -3
- package/src/Token/Token.tsx +18 -1
- package/src/Token/TokenLink.tsx +7 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
- package/src/Tokenizer/Tokenizer.tsx +252 -115
- package/src/Tooltip/useTooltip.tsx +180 -80
- package/src/TreeList/TreeListItem.tsx +36 -2
- package/src/Typeahead/BaseTypeahead.tsx +2 -0
- package/src/animator/createAnimator.ts +3 -3
- package/src/gestures/GestureHost.ts +21 -5
- package/src/gestures/PanGestureRecognizer.ts +19 -2
- package/src/gestures/README.md +14 -5
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +6 -1
- package/src/gestures/nativeScroll.ts +12 -68
- package/src/gestures/wheelSegmenter.ts +243 -10
- package/src/hooks/StackItemScrollRegion.tsx +57 -0
- package/src/hooks/computeOverflow.ts +1 -1
- package/src/hooks/menuPressGesture.ts +244 -38
- package/src/hooks/menuPressValues.ts +18 -0
- package/src/hooks/useClickableContainer.doc.mjs +8 -2
- package/src/hooks/useClickableContainer.ts +93 -15
- package/src/hooks/useFocusTrap.ts +268 -151
- package/src/hooks/useKeyboardHighlight.ts +71 -0
- package/src/hooks/useMediaQuery.ts +41 -12
- package/src/hooks/useMenuPress.ts +118 -11
- package/src/hooks/useOverflow.ts +321 -75
- package/src/hooks/usePressFeedback.doc.mjs +3 -3
- package/src/hooks/usePressFeedback.ts +6 -6
- package/src/hooks/useScrollRegionProps.ts +76 -0
- package/src/i18n/InternationalizationContext.ts +6 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +29 -1
- package/src/i18n/InternationalizationProvider.tsx +35 -3
- package/src/i18n/generated-english/DateInput/DateInput.generated.ts +0 -1
- package/src/i18n/generated-english/DateInput/useTypedDate.generated.ts +17 -0
- package/src/i18n/generated-english/DateTimeInput/DateTimeInput.generated.ts +0 -1
- package/src/i18n/generated-english/hooks/useScrollRegionProps.generated.ts +13 -0
- package/src/i18n/generated-locales/en.generated.ts +7 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +7 -0
- package/src/i18n/index.ts +2 -0
- package/src/i18n/useCalendarSystem.ts +95 -0
- package/src/internal/calendar-system.ts +26 -0
- package/src/internal/spinner-rotor.ts +20 -0
- package/src/internal/touch.ts +43 -2
- package/src/motion/MEASUREMENTS.md +11 -0
- package/src/motion/README.md +3 -3
- package/src/motion/animator.ts +7 -7
- package/src/motion/carryAnimations.ts +389 -0
- package/src/motion/transientCopy.ts +45 -5
- package/src/motion/uikit/gestures.ts +22 -0
- package/src/motion/uikit/index.ts +1 -0
- package/src/motion/uikit/timing.ts +7 -5
- package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
- package/src/privateAttributes/press.stylex.ts +261 -0
- package/src/theme/themeMotion.ts +3 -2
- package/src/theme/tokens.stylex.ts +1 -1
- package/src/utils/calendarDateParser.ts +1385 -0
- package/src/utils/calendarSystem.ts +832 -0
- package/src/utils/coarsePointer.ts +27 -14
- package/src/utils/flatTree.ts +15 -3
- package/src/utils/focusReturn.ts +78 -18
- package/src/utils/hitArea.ts +138 -9
- package/src/utils/inputPresentation.ts +21 -1
- package/src/utils/inputStream.ts +47 -10
- package/src/utils/interactionOverlay.stylex.ts +19 -22
- package/src/utils/plainDate.ts +130 -19
- package/src/utils/pressFeedback.ts +46 -14
- package/src/utils/pressGesture.ts +35 -9
- package/src/utils/scrollView.ts +135 -0
- package/src/utils/selectionLock.ts +5 -10
- package/src/utils/touchHitArea.stylex.ts +56 -0
- package/src/utils/touchHitArea.ts +177 -0
- package/src/utils/triggerFocus.ts +17 -4
package/src/Spinner/Spinner.tsx
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import {useId, type ReactNode} from 'react';
|
|
20
20
|
import * as stylex from '@stylexjs/stylex';
|
|
21
|
-
import {colorVars,
|
|
21
|
+
import {colorVars, spacingVars} from '../theme/tokens.stylex';
|
|
22
22
|
import type {BaseProps} from '../BaseProps';
|
|
23
23
|
import {Text} from '../Text/Text';
|
|
24
24
|
import {mergeProps} from '../utils/mergeProps';
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
useComponentTranslator,
|
|
29
29
|
} from '../i18n/useComponentTranslator';
|
|
30
30
|
import english from '../i18n/generated-english/Spinner/Spinner.generated';
|
|
31
|
+
import {spinnerRotorStyles, syncRotationPhase} from './spinnerRotor';
|
|
31
32
|
|
|
32
33
|
registerEnglishFallback(english);
|
|
33
34
|
|
|
@@ -36,13 +37,13 @@ registerEnglishFallback(english);
|
|
|
36
37
|
// =============================================================================
|
|
37
38
|
|
|
38
39
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
40
|
+
* The fraction of the ring the arc covers: SPINNER_ARC_FRACTION. StyleX reads
|
|
41
|
+
* only a literal in this file, and a test pins the two together.
|
|
41
42
|
*
|
|
42
43
|
* Themeable via `--spinner-arc-fraction`, declared alongside the other public
|
|
43
44
|
* vars in `sizeStyles` below. Only the inline `strokeDasharray` attribute
|
|
44
|
-
* (the pre-stylesheet render
|
|
45
|
-
*
|
|
45
|
+
* (the pre-stylesheet render) still reads the constant directly; the CSS side
|
|
46
|
+
* composes the dash from the live var.
|
|
46
47
|
*/
|
|
47
48
|
const ARC_FRACTION = 0.375;
|
|
48
49
|
|
|
@@ -152,75 +153,6 @@ function registerSpinnerVars(): void {
|
|
|
152
153
|
// elide.
|
|
153
154
|
registerSpinnerVars();
|
|
154
155
|
|
|
155
|
-
/**
|
|
156
|
-
* Pin every ring's rotation to the document timeline's origin instead of its
|
|
157
|
-
* own start time, so spinners mounted seconds apart stay in phase.
|
|
158
|
-
*
|
|
159
|
-
* Setting `startTime` is exact where arithmetic on a clock read is not. A
|
|
160
|
-
* negative `animation-delay` computed at mount is only as good as the gap
|
|
161
|
-
* between the clock read and the frame the animation starts in. At 10x CPU
|
|
162
|
-
* throttling that gap measured 116 degrees of drift.
|
|
163
|
-
*
|
|
164
|
-
* Rotors are collected and pinned in one frame. `getAnimations()` resolves
|
|
165
|
-
* style, and `startTime` dirties it again. So pinning them one at a time makes
|
|
166
|
-
* each mount re-force what the previous one invalidated: 53 style recalcs for
|
|
167
|
-
* 38 spinners, against 19 batched.
|
|
168
|
-
*/
|
|
169
|
-
const pendingRotors = new Set<HTMLSpanElement>();
|
|
170
|
-
let flushScheduled = false;
|
|
171
|
-
|
|
172
|
-
function pinRotorsToTimelineOrigin(): void {
|
|
173
|
-
flushScheduled = false;
|
|
174
|
-
const animations: Animation[] = [];
|
|
175
|
-
for (const rotor of pendingRotors) {
|
|
176
|
-
animations.push(...rotor.getAnimations());
|
|
177
|
-
}
|
|
178
|
-
pendingRotors.clear();
|
|
179
|
-
for (const animation of animations) {
|
|
180
|
-
animation.startTime = 0;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Ref callback for the rotor: the one place a mounted ring touches the DOM.
|
|
186
|
-
*
|
|
187
|
-
* It reads nothing back — the geometry is resolved by the cascade, not in JS.
|
|
188
|
-
*/
|
|
189
|
-
function syncRotationPhase(
|
|
190
|
-
rotor: HTMLSpanElement | null,
|
|
191
|
-
): (() => void) | undefined {
|
|
192
|
-
if (rotor == null) {
|
|
193
|
-
return undefined;
|
|
194
|
-
}
|
|
195
|
-
// jsdom implements no Web Animations, and this runs in every consumer's
|
|
196
|
-
// component tests.
|
|
197
|
-
if (typeof rotor.getAnimations !== 'function') {
|
|
198
|
-
return undefined;
|
|
199
|
-
}
|
|
200
|
-
pendingRotors.add(rotor);
|
|
201
|
-
if (!flushScheduled) {
|
|
202
|
-
flushScheduled = true;
|
|
203
|
-
requestAnimationFrame(pinRotorsToTimelineOrigin);
|
|
204
|
-
}
|
|
205
|
-
return () => {
|
|
206
|
-
pendingRotors.delete(rotor);
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// =============================================================================
|
|
211
|
-
// Animation
|
|
212
|
-
// =============================================================================
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* A `transform` animation runs on the compositor, so the ring keeps turning
|
|
216
|
-
* while a script runs. A `stroke-dashoffset` animation would repaint the arc
|
|
217
|
-
* on the main thread every frame, so it would stop while a script runs.
|
|
218
|
-
*/
|
|
219
|
-
const rotation = stylex.keyframes({
|
|
220
|
-
'0%': {transform: 'rotate(0deg)'},
|
|
221
|
-
'100%': {transform: 'rotate(360deg)'},
|
|
222
|
-
});
|
|
223
|
-
|
|
224
156
|
// =============================================================================
|
|
225
157
|
// Styles
|
|
226
158
|
// =============================================================================
|
|
@@ -299,20 +231,6 @@ const styles = stylex.create({
|
|
|
299
231
|
gridArea: '1 / 1',
|
|
300
232
|
width: `var(${BOX_SIZE})`,
|
|
301
233
|
height: `var(${BOX_SIZE})`,
|
|
302
|
-
// Mobile Safari keeps a re-timed animation off the main thread only on an
|
|
303
|
-
// element with its own layer. So the rotor declares one before the start
|
|
304
|
-
// time is set (see `pinRotorsToTimelineOrigin`).
|
|
305
|
-
willChange: 'transform',
|
|
306
|
-
// Reduced motion slows the turn but never stops it: a still ring reads as
|
|
307
|
-
// broken. The status role and its name still say that work is busy.
|
|
308
|
-
animationDuration: {
|
|
309
|
-
// The loop reads the duration before a theme's tempo scales it.
|
|
310
|
-
default: `var(--_astryx-pre-tempo-duration-slow-min, ${durationVars['--duration-slow-min']})`,
|
|
311
|
-
'@media (prefers-reduced-motion: reduce)': '3s',
|
|
312
|
-
},
|
|
313
|
-
animationIterationCount: 'infinite',
|
|
314
|
-
animationName: rotation,
|
|
315
|
-
animationTimingFunction: 'linear',
|
|
316
234
|
},
|
|
317
235
|
circle: {
|
|
318
236
|
fill: 'none',
|
|
@@ -594,7 +512,7 @@ export function Spinner({
|
|
|
594
512
|
<span
|
|
595
513
|
ref={syncRotationPhase}
|
|
596
514
|
aria-hidden="true"
|
|
597
|
-
{...stylex.props(styles.rotor)}>
|
|
515
|
+
{...stylex.props(styles.rotor, spinnerRotorStyles.turn)}>
|
|
598
516
|
<svg
|
|
599
517
|
width={frameSize}
|
|
600
518
|
height={frameSize}
|
package/src/Spinner/index.ts
CHANGED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file spinnerRotor.ts
|
|
7
|
+
* @input StyleX keyframes and the slow-min duration token
|
|
8
|
+
* @output The one turning arc: SPINNER_ARC_FRACTION, spinnerRotorStyles.turn
|
|
9
|
+
* and syncRotationPhase
|
|
10
|
+
* @position Spinner's rotor, shared by Spinner and Lab's indeterminate
|
|
11
|
+
* CircularProgress (through `@astryxdesign/core/internal/spinner-rotor`), so
|
|
12
|
+
* both rings turn the same way on the compositor.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as stylex from '@stylexjs/stylex';
|
|
16
|
+
import {durationVars} from '../theme/tokens.stylex';
|
|
17
|
+
|
|
18
|
+
/** The fraction of the ring the arc covers: 135°. */
|
|
19
|
+
export const SPINNER_ARC_FRACTION = 0.375;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Full turns in one iteration of the rotation.
|
|
23
|
+
*
|
|
24
|
+
* Chromium wakes the main thread at each iteration boundary while the
|
|
25
|
+
* document listens for `animationiteration`. React listens for it on every
|
|
26
|
+
* root. One iteration holds 100 turns, so the wake comes once in 100 turns.
|
|
27
|
+
* Each turn is 360 degrees, so the ring looks the same.
|
|
28
|
+
*/
|
|
29
|
+
const TURNS_PER_ITERATION = 100;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* A `transform` animation runs on the compositor, so the ring keeps turning
|
|
33
|
+
* while a script runs. A `stroke-dashoffset` animation would repaint the arc
|
|
34
|
+
* on the main thread every frame, so it would stop while a script runs.
|
|
35
|
+
*/
|
|
36
|
+
const rotation = stylex.keyframes({
|
|
37
|
+
'0%': {transform: 'rotate(0deg)'},
|
|
38
|
+
'100%': {transform: `rotate(${360 * TURNS_PER_ITERATION}deg)`},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export const spinnerRotorStyles = stylex.create({
|
|
42
|
+
turn: {
|
|
43
|
+
// Mobile Safari keeps a re-timed animation off the main thread only on an
|
|
44
|
+
// element with its own layer. So the rotor declares one before the start
|
|
45
|
+
// time is set (see `pinRotorsToTimelineOrigin`).
|
|
46
|
+
willChange: 'transform',
|
|
47
|
+
// Reduced motion slows the turn but never stops it: a still ring reads as
|
|
48
|
+
// broken. The ring's role and name still say that work is busy.
|
|
49
|
+
animationDuration: {
|
|
50
|
+
// The loop reads the duration before a theme's tempo scales it.
|
|
51
|
+
default: `calc(var(--_astryx-pre-tempo-duration-slow-min, ${durationVars['--duration-slow-min']}) * ${TURNS_PER_ITERATION})`,
|
|
52
|
+
'@media (prefers-reduced-motion: reduce)': `calc(3s * ${TURNS_PER_ITERATION})`,
|
|
53
|
+
},
|
|
54
|
+
animationIterationCount: 'infinite',
|
|
55
|
+
animationName: rotation,
|
|
56
|
+
animationTimingFunction: 'linear',
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Pin every ring's rotation to the document timeline's origin instead of its
|
|
62
|
+
* own start time, so spinners mounted seconds apart stay in phase.
|
|
63
|
+
*
|
|
64
|
+
* Setting `startTime` is exact where arithmetic on a clock read is not. A
|
|
65
|
+
* negative `animation-delay` computed at mount is only as good as the gap
|
|
66
|
+
* between the clock read and the frame the animation starts in. At 10x CPU
|
|
67
|
+
* throttling that gap measured 116 degrees of drift.
|
|
68
|
+
*
|
|
69
|
+
* Rotors are collected and pinned in one frame. `getAnimations()` resolves
|
|
70
|
+
* style, and `startTime` dirties it again. So pinning them one at a time makes
|
|
71
|
+
* each mount re-force what the previous one invalidated: 53 style recalcs for
|
|
72
|
+
* 38 spinners, against 19 batched.
|
|
73
|
+
*/
|
|
74
|
+
const pendingRotors = new Set<Element>();
|
|
75
|
+
let flushScheduled = false;
|
|
76
|
+
|
|
77
|
+
function pinRotorsToTimelineOrigin(): void {
|
|
78
|
+
flushScheduled = false;
|
|
79
|
+
const animations: Animation[] = [];
|
|
80
|
+
for (const rotor of pendingRotors) {
|
|
81
|
+
animations.push(...rotor.getAnimations());
|
|
82
|
+
}
|
|
83
|
+
pendingRotors.clear();
|
|
84
|
+
for (const animation of animations) {
|
|
85
|
+
animation.startTime = 0;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Ref callback for a rotor: the one place a mounted ring touches the DOM.
|
|
91
|
+
*
|
|
92
|
+
* It reads nothing back — the geometry is resolved by the cascade, not in JS.
|
|
93
|
+
*/
|
|
94
|
+
export function syncRotationPhase(
|
|
95
|
+
rotor: Element | null,
|
|
96
|
+
): (() => void) | undefined {
|
|
97
|
+
if (rotor == null) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
// jsdom implements no Web Animations, and this runs in every consumer's
|
|
101
|
+
// component tests.
|
|
102
|
+
if (typeof rotor.getAnimations !== 'function') {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
pendingRotors.add(rotor);
|
|
106
|
+
if (!flushScheduled) {
|
|
107
|
+
flushScheduled = true;
|
|
108
|
+
requestAnimationFrame(pinRotorsToTimelineOrigin);
|
|
109
|
+
}
|
|
110
|
+
return () => {
|
|
111
|
+
pendingRotors.delete(rotor);
|
|
112
|
+
};
|
|
113
|
+
}
|
package/src/Stack/Stack.doc.mjs
CHANGED
|
@@ -524,7 +524,7 @@ export const docs = {
|
|
|
524
524
|
name: 'isScrollable',
|
|
525
525
|
type: 'boolean',
|
|
526
526
|
description:
|
|
527
|
-
'Enables scrollable overflow (overflow: auto). StackItem already applies the flex min-height/min-width reset, so <StackItem size="fill" isScrollable> is a complete scroll region. Matches isScrollable on LayoutContent and LayoutPanel.',
|
|
527
|
+
'Enables scrollable overflow (overflow: auto). StackItem already applies the flex min-height/min-width reset, so <StackItem size="fill" isScrollable> is a complete scroll region. Matches isScrollable on LayoutContent and LayoutPanel. While its content overflows, a div or span item is a group named by aria-label, or by a translated "Content"; another element keeps its own role.',
|
|
528
528
|
default: 'false',
|
|
529
529
|
},
|
|
530
530
|
{
|
package/src/Stack/StackItem.tsx
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file StackItem.tsx
|
|
5
|
-
* @input Uses React, ElementType, stackItem utility
|
|
5
|
+
* @input Uses React, ElementType, stackItem utility, StackItemScrollRegion
|
|
6
6
|
* @output Exports StackItem polymorphic component and StackItemProps
|
|
7
|
-
* @position Layout/Stack component; uses stackItem.stylex.ts
|
|
7
|
+
* @position Layout/Stack component; uses stackItem.stylex.ts. A scrollable
|
|
8
|
+
* `div` or `span` item renders through StackItemScrollRegion, which names
|
|
9
|
+
* it while it scrolls.
|
|
8
10
|
*
|
|
9
11
|
* SYNC: When modified, update these files to stay in sync:
|
|
10
12
|
* - /packages/core/src/Stack/Stack.doc.mjs
|
|
@@ -21,6 +23,7 @@ import {
|
|
|
21
23
|
} from './stackItem.stylex';
|
|
22
24
|
import {mergeProps} from '../utils/mergeProps';
|
|
23
25
|
import {themeProps} from '../utils/themeProps';
|
|
26
|
+
import {StackItemScrollRegion} from '../hooks/StackItemScrollRegion';
|
|
24
27
|
|
|
25
28
|
const overflowStyles = stylex.create({
|
|
26
29
|
scrollable: {
|
|
@@ -53,7 +56,9 @@ export interface StackItemProps extends BaseProps<HTMLElement> {
|
|
|
53
56
|
* reset, so `<StackItem size="fill" isScrollable>` is a complete scroll
|
|
54
57
|
* region — it grows to fill the stack and scrolls its own overflow with
|
|
55
58
|
* no extra style plumbing. Matches `isScrollable` on `LayoutContent`
|
|
56
|
-
* and `LayoutPanel`.
|
|
59
|
+
* and `LayoutPanel`. While its content overflows, a `div` or `span` item
|
|
60
|
+
* is a group named by the caller's `aria-label`, or by a translated
|
|
61
|
+
* "Content". Another element keeps its own role.
|
|
57
62
|
* @default false
|
|
58
63
|
*/
|
|
59
64
|
isScrollable?: boolean;
|
|
@@ -102,18 +107,27 @@ export function StackItem({
|
|
|
102
107
|
xstyle,
|
|
103
108
|
);
|
|
104
109
|
|
|
110
|
+
const elementProps = {
|
|
111
|
+
...mergeProps(
|
|
112
|
+
themeProps('stack-item', {size}),
|
|
113
|
+
stylexProps,
|
|
114
|
+
className,
|
|
115
|
+
style,
|
|
116
|
+
),
|
|
117
|
+
...props,
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
if (isScrollable && (element === 'div' || element === 'span')) {
|
|
121
|
+
return createElement(
|
|
122
|
+
StackItemScrollRegion,
|
|
123
|
+
{as: element, ref, elementProps},
|
|
124
|
+
children,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
105
128
|
return createElement(
|
|
106
129
|
element,
|
|
107
|
-
{
|
|
108
|
-
ref: ref as Ref<Element>,
|
|
109
|
-
...mergeProps(
|
|
110
|
-
themeProps('stack-item', {size}),
|
|
111
|
-
stylexProps,
|
|
112
|
-
className,
|
|
113
|
-
style,
|
|
114
|
-
),
|
|
115
|
-
...props,
|
|
116
|
-
},
|
|
130
|
+
{ref: ref as Ref<Element>, ...elementProps},
|
|
117
131
|
children,
|
|
118
132
|
);
|
|
119
133
|
}
|
package/src/Switch/Switch.tsx
CHANGED
|
@@ -62,9 +62,9 @@ import {
|
|
|
62
62
|
import english from '../i18n/generated-english/Switch/Switch.generated';
|
|
63
63
|
|
|
64
64
|
registerEnglishFallback(english);
|
|
65
|
+
import {reducedMotionFadeConsts} from '../motion/reducedMotion.stylex';
|
|
65
66
|
import {
|
|
66
67
|
interactionOverlayStyles,
|
|
67
|
-
pressConsts,
|
|
68
68
|
pressVars,
|
|
69
69
|
} from '../utils/interactionOverlay.stylex';
|
|
70
70
|
import {pressHoldsDragProps} from '../privateAttributes/pressHoldsDrag.stylex';
|
|
@@ -93,14 +93,15 @@ const PRESS_FADING = '[data-astryx-press="fading"]';
|
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
95
|
* The shared press release, for the press layers the switch fades on the
|
|
96
|
-
* compositor
|
|
97
|
-
*
|
|
96
|
+
* compositor: the theme's exit motion tokens, no longer than the Reduce
|
|
97
|
+
* Motion fade under Reduce Motion. Switch.test.tsx compares them with
|
|
98
|
+
* the overlay's.
|
|
98
99
|
* SYNC: utils/interactionOverlay.stylex.ts PRESS_RELEASE_DURATION,
|
|
99
100
|
* PRESS_RELEASE_DURATION_REDUCED and RELEASE_EASE.
|
|
100
101
|
*/
|
|
101
|
-
const PRESS_RELEASE_DURATION =
|
|
102
|
-
const PRESS_RELEASE_DURATION_REDUCED = `min(${
|
|
103
|
-
const PRESS_RELEASE_EASE = '
|
|
102
|
+
const PRESS_RELEASE_DURATION = durationVars['--duration-exit'];
|
|
103
|
+
const PRESS_RELEASE_DURATION_REDUCED = `min(${durationVars['--duration-exit']}, ${reducedMotionFadeConsts.duration})`;
|
|
104
|
+
const PRESS_RELEASE_EASE = easeVars['--ease-exit'];
|
|
104
105
|
|
|
105
106
|
// The measured hit insets (utils/hitArea), 0 until measured.
|
|
106
107
|
const HIT_TOP = 'var(--astryx-hit-inset-top, 0px)';
|
|
@@ -23,7 +23,7 @@ import type {GestureTouch} from '../gestures/types';
|
|
|
23
23
|
import {isRtlElement} from '../hooks/isRtlElement';
|
|
24
24
|
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
25
25
|
import {
|
|
26
|
-
|
|
26
|
+
createMotionEngine,
|
|
27
27
|
type Animator,
|
|
28
28
|
type MotionCurve,
|
|
29
29
|
} from '../motion/animator';
|
|
@@ -282,15 +282,15 @@ export class SwitchTouchController {
|
|
|
282
282
|
return;
|
|
283
283
|
}
|
|
284
284
|
registerSwitchTable();
|
|
285
|
-
this.thumb =
|
|
285
|
+
this.thumb = createMotionEngine(elements.thumb);
|
|
286
286
|
// The layer rests clear (its class's opacity 0) while the visuals show
|
|
287
287
|
// the value; from here its opacity is the animator's.
|
|
288
|
-
this.fade =
|
|
288
|
+
this.fade = createMotionEngine(elements.track, {
|
|
289
289
|
pseudoElement: '::after',
|
|
290
290
|
initial: {opacity: 0},
|
|
291
291
|
});
|
|
292
292
|
this.fade.set({opacity: 0});
|
|
293
|
-
this.shadow =
|
|
293
|
+
this.shadow = createMotionEngine(elements.thumb, {
|
|
294
294
|
pseudoElement: '::after',
|
|
295
295
|
initial: {opacity: 0},
|
|
296
296
|
});
|
package/src/TabList/Tab.tsx
CHANGED
|
@@ -39,6 +39,7 @@ import {useLinkComponent} from '../Link/useLinkComponent';
|
|
|
39
39
|
import type {LinkComponentType} from '../Link/types';
|
|
40
40
|
import {mergeProps} from '../utils';
|
|
41
41
|
import {useDevWarning} from '../hooks/useDevWarning';
|
|
42
|
+
import {withholdCallerHandlers} from '../utils/disabledInteraction';
|
|
42
43
|
import {EDGE_COMP_ATTR} from '../Layout/edgeCompensation.stylex';
|
|
43
44
|
import {themeProps} from '../utils/themeProps';
|
|
44
45
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
@@ -362,7 +363,10 @@ export function Tab({
|
|
|
362
363
|
) : null;
|
|
363
364
|
|
|
364
365
|
const sharedProps = {
|
|
365
|
-
|
|
366
|
+
// A disabled tab keeps its tab stop, so the browser still sends it events.
|
|
367
|
+
// It runs no caller handler other than `onFocus` and `onBlur`, as a natively
|
|
368
|
+
// disabled control runs none. `onClick` is guarded in `handleSelect`.
|
|
369
|
+
...withholdCallerHandlers(restProps, isDisabled),
|
|
366
370
|
...pressable,
|
|
367
371
|
...(isLabelHidden ? {'aria-label': label} : {}),
|
|
368
372
|
[EDGE_COMP_ATTR]: '',
|
|
@@ -168,7 +168,7 @@ const sortStyles = stylex.create({
|
|
|
168
168
|
fontSize: 10,
|
|
169
169
|
// eslint-disable-next-line @astryx/no-hardcoded-styles -- no token for lineHeight:1 (tight badge)
|
|
170
170
|
lineHeight: '1',
|
|
171
|
-
color: colorVars['--color-accent'],
|
|
171
|
+
color: colorVars['--color-text-accent'],
|
|
172
172
|
},
|
|
173
173
|
});
|
|
174
174
|
|
|
@@ -28,7 +28,7 @@ export const docs = {
|
|
|
28
28
|
name: 'format',
|
|
29
29
|
type: "'relative' | 'relative_short' | 'auto' | 'date' | 'date_long' | 'date_weekday' | 'date_time' | 'time' | 'system_date' | 'system_date_time' | 'system_time' | 'unix_seconds'",
|
|
30
30
|
description:
|
|
31
|
-
"Display format. 'relative' uses the locale's native long relative-time wording ('2 hours ago' in English), 'relative_short' uses its narrow pattern ('2h ago' in English) for compact surfaces, 'date' shows 'Mar 21, 2025', 'date_long' shows 'March 21, 2025', 'date_weekday' shows 'Wed, Mar 21, 2025', 'date_time' shows 'Mar 21, 2025, 2:51 PM', 'time' shows '2:51 PM', 'system_*' variants use ISO-style formatting, 'unix_seconds' shows the Unix time in whole seconds since the epoch (an absolute, zone-independent value), 'auto' switches from relative to date_time based on recency. Absolute formats never read the current time. 'relative', 'relative_short' and 'auto' read it on the client only: a server render or static prerender shows the full date and time in UTC, labelled, and the client switches to the format's normal output after hydration.",
|
|
31
|
+
"Display format. 'relative' uses the locale's native long relative-time wording ('2 hours ago' in English), 'relative_short' uses its narrow pattern ('2h ago' in English) for compact surfaces, 'date' shows 'Mar 21, 2025', 'date_long' shows 'March 21, 2025', 'date_weekday' shows 'Wed, Mar 21, 2025', 'date_time' shows 'Mar 21, 2025, 2:51 PM', 'time' shows '2:51 PM', 'system_*' variants use ISO-style formatting, 'unix_seconds' shows the Unix time in whole seconds since the epoch (an absolute, zone-independent value), 'auto' switches from relative to date_time based on recency. Absolute formats never read the current time. 'relative', 'relative_short' and 'auto' read it on the client only: a server render or static prerender shows the full date and time in UTC, labelled, and the client switches to the format's normal output after hydration. Date-bearing formats ('date', 'date_long', 'date_weekday', 'date_time', and the full date in the hover card and the accessible name) use the InternationalizationProvider calendar, such as calendar=\"persian\"; 'time', the relative formats, 'system_*', and 'unix_seconds' do not change.",
|
|
32
32
|
default: "'auto'",
|
|
33
33
|
},
|
|
34
34
|
{
|
|
@@ -124,7 +124,7 @@ export const docs = {
|
|
|
124
124
|
export const docsZh = {
|
|
125
125
|
propDescriptions: {
|
|
126
126
|
value: '\u8981\u663e\u793a\u7684\u65e5\u671f/\u65f6\u95f4\u3002\u63a5\u53d7 Unix \u65f6\u95f4\u6233\uff08\u79d2\uff09\u6216 ISO 8601 \u5b57\u7b26\u4e32\u3002',
|
|
127
|
-
format: "\u663e\u793a\u683c\u5f0f\u3002'relative' \u663e\u793a '2\u5c0f\u65f6\u524d'\uff0c'date' \u663e\u793a\u65e5\u671f\uff0c'date_long' \u663e\u793a\u957f\u6708\u4efd\u65e5\u671f\uff0c'date_weekday' \u663e\u793a\u661f\u671f+\u65e5\u671f\uff0c'auto' \u6839\u636e\u65f6\u95f4\u8fdc\u8fd1\u81ea\u52a8\u5207\u6362\u3002",
|
|
127
|
+
format: "\u663e\u793a\u683c\u5f0f\u3002'relative' \u663e\u793a '2\u5c0f\u65f6\u524d'\uff0c'date' \u663e\u793a\u65e5\u671f\uff0c'date_long' \u663e\u793a\u957f\u6708\u4efd\u65e5\u671f\uff0c'date_weekday' \u663e\u793a\u661f\u671f+\u65e5\u671f\uff0c'auto' \u6839\u636e\u65f6\u95f4\u8fdc\u8fd1\u81ea\u52a8\u5207\u6362\u3002\u5e26\u65e5\u671f\u7684\u683c\u5f0f\uff08'date'\u3001'date_long'\u3001'date_weekday'\u3001'date_time'\uff0c\u4ee5\u53ca\u60ac\u505c\u5361\u7247\u548c\u65e0\u969c\u788d\u540d\u79f0\u4e2d\u7684\u5b8c\u6574\u65e5\u671f\uff09\u4f7f\u7528 InternationalizationProvider \u7684\u5386\u6cd5\uff08\u5982 calendar=\"persian\"\uff09\uff1b'time'\u3001\u76f8\u5bf9\u683c\u5f0f\u3001'system_*' \u548c 'unix_seconds' \u4e0d\u53d8\u3002",
|
|
128
128
|
autoThreshold: "auto \u683c\u5f0f\u4ece\u76f8\u5bf9\u65f6\u95f4\u5207\u6362\u5230 date_time \u7684\u9608\u503c\u79d2\u6570\u3002",
|
|
129
129
|
hasTooltip: '\u60ac\u505c\u65f6\u662f\u5426\u663e\u793a\u5305\u542b\u5b8c\u6574\u65e5\u671f/\u65f6\u95f4\u7684\u53ef\u590d\u5236\u60ac\u505c\u5361\u7247\uff08\u76f8\u5bf9\u65f6\u95f4\u6a21\u5f0f\uff0c\u6216\u914d\u7f6e tooltipEntries \u7684\u4efb\u610f\u683c\u5f0f\uff09\u3002',
|
|
130
130
|
tooltipEntries:
|
|
@@ -186,7 +186,7 @@ export const docsDense = {
|
|
|
186
186
|
},
|
|
187
187
|
propDescriptions: {
|
|
188
188
|
value: 'date/time as unix seconds or ISO string',
|
|
189
|
-
format: "display mode: 'relative' (locale-native long wording), 'relative_short' (locale-native narrow wording), 'auto', 'date', 'date_long', 'date_weekday', 'date_time', 'time', 'system_date', 'system_date_time', 'system_time', 'unix_seconds'",
|
|
189
|
+
format: "display mode: 'relative' (locale-native long wording), 'relative_short' (locale-native narrow wording), 'auto', 'date', 'date_long', 'date_weekday', 'date_time', 'time', 'system_date', 'system_date_time', 'system_time', 'unix_seconds'; date-bearing formats use the provider calendar, system_* and time do not",
|
|
190
190
|
autoThreshold: 'seconds threshold for auto relative\u2192date_time switch',
|
|
191
191
|
hasTooltip: 'show copyable full-time hover card on hover (relative mode, or any format with tooltipEntries)',
|
|
192
192
|
tooltipEntries:
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Timestamp.tsx
|
|
7
|
-
* @input Uses React, Text, provider locale, and Timestamp formatters
|
|
7
|
+
* @input Uses React, Text, provider locale and calendar, and Timestamp formatters
|
|
8
8
|
* @output Exports Timestamp component and related types
|
|
9
9
|
* @position Core implementation; renders formatted timestamps
|
|
10
10
|
*
|
|
@@ -31,6 +31,7 @@ import type {TextType, TextSize, TextColor, TextWeight} from '../theme/types';
|
|
|
31
31
|
import {mergeProps} from '../utils';
|
|
32
32
|
import {useDevWarning} from '../hooks/useDevWarning';
|
|
33
33
|
import {useLocale} from '../i18n/useLocale';
|
|
34
|
+
import {useCalendarSystem} from '../i18n/useCalendarSystem';
|
|
34
35
|
import type {BaseProps} from '../BaseProps';
|
|
35
36
|
import {themeProps} from '../utils/themeProps';
|
|
36
37
|
import {formatInstant} from './formatInstant';
|
|
@@ -297,6 +298,7 @@ export function Timestamp({
|
|
|
297
298
|
}: TimestampProps) {
|
|
298
299
|
const t = useComponentTranslator();
|
|
299
300
|
const locale = useLocale();
|
|
301
|
+
const calendar = useCalendarSystem(undefined, 'Timestamp');
|
|
300
302
|
const timeRef = useRef<HTMLTimeElement>(null);
|
|
301
303
|
const mergedTimeRef = useMergedRefs(ref, timeRef);
|
|
302
304
|
// Only relative and auto formats depend on the current time. Absolute
|
|
@@ -358,12 +360,12 @@ export function Timestamp({
|
|
|
358
360
|
date,
|
|
359
361
|
effectiveFormat,
|
|
360
362
|
locale,
|
|
361
|
-
// The
|
|
362
|
-
//
|
|
363
|
-
//
|
|
363
|
+
// The placeholder before hydration is Gregorian and in UTC, with
|
|
364
|
+
// its zone. The server and the client then write the same text,
|
|
365
|
+
// with or without Temporal.
|
|
364
366
|
isClockPending
|
|
365
367
|
? {timeZone: 'UTC', isTimezoneShown: true}
|
|
366
|
-
: {isTimezoneShown},
|
|
368
|
+
: {isTimezoneShown, calendar},
|
|
367
369
|
)
|
|
368
370
|
: '';
|
|
369
371
|
|
|
@@ -372,10 +374,13 @@ export function Timestamp({
|
|
|
372
374
|
// out in full: abbreviations like "PST" or "GMT+2" are unexpanded
|
|
373
375
|
// abbreviations to a screen-reader user (WCAG 3.1.4).
|
|
374
376
|
const fullAbsoluteText = isValidDate
|
|
375
|
-
? formatInstant(date, 'full', locale)
|
|
377
|
+
? formatInstant(date, 'full', locale, {calendar})
|
|
376
378
|
: '';
|
|
377
379
|
const ariaLabelText = isValidDate
|
|
378
|
-
? formatInstant(date, 'full', locale, {
|
|
380
|
+
? formatInstant(date, 'full', locale, {
|
|
381
|
+
timeZoneNameStyle: 'long',
|
|
382
|
+
calendar,
|
|
383
|
+
})
|
|
379
384
|
: '';
|
|
380
385
|
|
|
381
386
|
// Syncs the relative time with an interval timer while the timestamp is live.
|
|
@@ -424,7 +429,7 @@ export function Timestamp({
|
|
|
424
429
|
const lines: ReadonlyArray<TimestampTooltipLine> =
|
|
425
430
|
entries === undefined
|
|
426
431
|
? [{value: fullAbsoluteText, isCopyable: true}]
|
|
427
|
-
: formatTooltipLines(date, entries, locale);
|
|
432
|
+
: formatTooltipLines(date, entries, locale, calendar);
|
|
428
433
|
|
|
429
434
|
const timestampProps = mergeProps(
|
|
430
435
|
themeProps('timestamp', {format: effectiveFormat}),
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file formatInstant.ts
|
|
5
|
-
* @input A Date, one absolute format name,
|
|
5
|
+
* @input A Date, one absolute format name, an optional time zone and calendar
|
|
6
6
|
* @output That instant rendered as a string
|
|
7
7
|
* @position Leaf shared by Timestamp's visible text and each of its tooltip
|
|
8
8
|
* lines; owns every absolute format Timestamp can produce
|
|
@@ -30,6 +30,10 @@
|
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
32
|
import {SHARED_DATE_FORMAT_OPTIONS, getWallClock} from '../utils/plainDate';
|
|
33
|
+
import {
|
|
34
|
+
formatCalendarInstant,
|
|
35
|
+
type CalendarSystem,
|
|
36
|
+
} from '../utils/calendarSystem';
|
|
33
37
|
import type {Locale} from '../i18n/types';
|
|
34
38
|
import type {TimestampFormat} from './Timestamp';
|
|
35
39
|
|
|
@@ -80,6 +84,14 @@ export interface FormatInstantOptions {
|
|
|
80
84
|
* @default 'short'
|
|
81
85
|
*/
|
|
82
86
|
timeZoneNameStyle?: 'short' | 'long';
|
|
87
|
+
/**
|
|
88
|
+
* The calendar that date-bearing formats write the date in. Timestamp
|
|
89
|
+
* passes its resolved calendar. `time` has no date, and the `system_*`
|
|
90
|
+
* shapes and `unix_seconds` stay Gregorian ISO or calendar-neutral in every
|
|
91
|
+
* calendar.
|
|
92
|
+
* @default 'gregory'
|
|
93
|
+
*/
|
|
94
|
+
calendar?: CalendarSystem;
|
|
83
95
|
}
|
|
84
96
|
|
|
85
97
|
// =============================================================================
|
|
@@ -139,6 +151,7 @@ export function formatInstant(
|
|
|
139
151
|
timeZone,
|
|
140
152
|
isTimezoneShown = false,
|
|
141
153
|
timeZoneNameStyle = 'short',
|
|
154
|
+
calendar = 'gregory',
|
|
142
155
|
}: FormatInstantOptions = {},
|
|
143
156
|
): string {
|
|
144
157
|
const zone = timeZone === undefined ? {} : {timeZone};
|
|
@@ -146,41 +159,49 @@ export function formatInstant(
|
|
|
146
159
|
|
|
147
160
|
switch (format) {
|
|
148
161
|
case 'full':
|
|
149
|
-
return
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
...
|
|
153
|
-
|
|
154
|
-
|
|
162
|
+
return formatCalendarInstant(
|
|
163
|
+
calendar,
|
|
164
|
+
date,
|
|
165
|
+
{...FULL_OPTIONS, timeZoneName: timeZoneNameStyle},
|
|
166
|
+
locale,
|
|
167
|
+
timeZone,
|
|
168
|
+
);
|
|
155
169
|
|
|
156
170
|
case 'date':
|
|
157
|
-
return
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
171
|
+
return formatCalendarInstant(
|
|
172
|
+
calendar,
|
|
173
|
+
date,
|
|
174
|
+
SHARED_DATE_FORMAT_OPTIONS.date,
|
|
175
|
+
locale,
|
|
176
|
+
timeZone,
|
|
177
|
+
);
|
|
162
178
|
|
|
163
179
|
case 'date_long':
|
|
164
|
-
return
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
180
|
+
return formatCalendarInstant(
|
|
181
|
+
calendar,
|
|
182
|
+
date,
|
|
183
|
+
SHARED_DATE_FORMAT_OPTIONS.date_long,
|
|
184
|
+
locale,
|
|
185
|
+
timeZone,
|
|
186
|
+
);
|
|
169
187
|
|
|
170
188
|
case 'date_weekday':
|
|
171
|
-
return
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
189
|
+
return formatCalendarInstant(
|
|
190
|
+
calendar,
|
|
191
|
+
date,
|
|
192
|
+
SHARED_DATE_FORMAT_OPTIONS.date_weekday,
|
|
193
|
+
locale,
|
|
194
|
+
timeZone,
|
|
195
|
+
);
|
|
176
196
|
|
|
177
197
|
case 'date_time':
|
|
178
|
-
return
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
...
|
|
182
|
-
|
|
183
|
-
|
|
198
|
+
return formatCalendarInstant(
|
|
199
|
+
calendar,
|
|
200
|
+
date,
|
|
201
|
+
{...DATE_TIME_OPTIONS, ...zoneName},
|
|
202
|
+
locale,
|
|
203
|
+
timeZone,
|
|
204
|
+
);
|
|
184
205
|
|
|
185
206
|
case 'time':
|
|
186
207
|
return new Intl.DateTimeFormat(locale, {
|