@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
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file monthGeometry.ts
|
|
5
|
-
* @input PlainDate values, scroll offsets, pane heights
|
|
6
|
-
* @output
|
|
7
|
-
* @position Internal helper; consumed by
|
|
5
|
+
* @input PlainDate values, a calendar system, scroll offsets, pane heights
|
|
6
|
+
* @output Month-index arithmetic for a calendar and the virtualized pane window
|
|
7
|
+
* @position Internal helper; consumed by the touch date surfaces
|
|
8
8
|
*
|
|
9
|
-
* A "month index" is a single integer that totally orders calendar months
|
|
10
|
-
* `year * 12 + (month - 1)
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* A "month index" is a single integer that totally orders calendar months. In
|
|
10
|
+
* the Gregorian-aligned calendars it is `year * 12 + (month - 1)`; in the
|
|
11
|
+
* others it counts calendar months from a fixed month, because their years
|
|
12
|
+
* have 12 or 13 months. The scroller is a list of equal-width panes, so one
|
|
13
|
+
* integer converts freely between a month, a row in that list, and a scroll
|
|
14
|
+
* offset — which is the whole trick behind continuous scrolling.
|
|
13
15
|
*
|
|
14
16
|
* These are pure functions on purpose: the scroll math is the part most likely
|
|
15
17
|
* to be wrong, and it is testable without a layout engine.
|
|
@@ -17,7 +19,19 @@
|
|
|
17
19
|
* SYNC: When modified, update DateInputTouch.test.tsx.
|
|
18
20
|
*/
|
|
19
21
|
|
|
20
|
-
import type {PlainDate} from '../utils';
|
|
22
|
+
import type {PlainDate} from '../utils/dateTypes';
|
|
23
|
+
import {
|
|
24
|
+
type CalendarMonth,
|
|
25
|
+
type CalendarSystem,
|
|
26
|
+
calendarAddMonths,
|
|
27
|
+
calendarMonthOf,
|
|
28
|
+
calendarMonthOfYear,
|
|
29
|
+
calendarMonthsBetween,
|
|
30
|
+
calendarMonthsInCalendarYear,
|
|
31
|
+
calendarShiftYears,
|
|
32
|
+
calendarYearMonthOf,
|
|
33
|
+
isGregorianAligned,
|
|
34
|
+
} from '../utils/calendarSystem';
|
|
21
35
|
|
|
22
36
|
/** How many months are reachable in either direction when unbounded. */
|
|
23
37
|
export const DEFAULT_MONTH_REACH = 600;
|
|
@@ -116,3 +130,91 @@ export function rowsIn({start, end}: PaneWindow): number[] {
|
|
|
116
130
|
}
|
|
117
131
|
return rows;
|
|
118
132
|
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Month indexes for one calendar. Years and month positions are the ones
|
|
136
|
+
* `calendarMonthOfYear` counts.
|
|
137
|
+
*/
|
|
138
|
+
export interface MonthModel {
|
|
139
|
+
readonly calendar: CalendarSystem;
|
|
140
|
+
/** The index of the calendar month that contains a date. */
|
|
141
|
+
indexOf: (date: PlainDate) => number;
|
|
142
|
+
/** The calendar month at an index. */
|
|
143
|
+
monthAt: (index: number) => CalendarMonth;
|
|
144
|
+
/** The calendar year of an index and the month's position in it. */
|
|
145
|
+
yearMonthAt: (index: number) => {year: number; month: number};
|
|
146
|
+
/** The index of a month position in a calendar year. */
|
|
147
|
+
indexOfYearMonth: (year: number, month: number) => number;
|
|
148
|
+
/** The number of months in a calendar year. */
|
|
149
|
+
monthsInYear: (year: number) => number;
|
|
150
|
+
/**
|
|
151
|
+
* The index `years` calendar years from `index`, in the same month. A leap
|
|
152
|
+
* month that the target year does not have becomes its common counterpart.
|
|
153
|
+
*/
|
|
154
|
+
shiftYears: (index: number, years: number) => number;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const GREGORIAN_MONTH_MODELS = new Map<CalendarSystem, MonthModel>();
|
|
158
|
+
|
|
159
|
+
function gregorianMonthModel(calendar: CalendarSystem): MonthModel {
|
|
160
|
+
let model = GREGORIAN_MONTH_MODELS.get(calendar);
|
|
161
|
+
if (model == null) {
|
|
162
|
+
model = {
|
|
163
|
+
calendar,
|
|
164
|
+
indexOf: monthIndexOf,
|
|
165
|
+
monthAt: index => {
|
|
166
|
+
const {year, month} = fromMonthIndex(index);
|
|
167
|
+
return calendarMonthOfYear(calendar, year, month);
|
|
168
|
+
},
|
|
169
|
+
yearMonthAt: fromMonthIndex,
|
|
170
|
+
indexOfYearMonth: toMonthIndex,
|
|
171
|
+
monthsInYear: () => 12,
|
|
172
|
+
shiftYears: (index, years) => index + years * 12,
|
|
173
|
+
};
|
|
174
|
+
GREGORIAN_MONTH_MODELS.set(calendar, model);
|
|
175
|
+
}
|
|
176
|
+
return model;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// The month that holds EPOCH is index 0. Any fixed month works; a recent one
|
|
180
|
+
// keeps the indexes of nearby months small.
|
|
181
|
+
const EPOCH: PlainDate = {year: 2000, month: 1, day: 1};
|
|
182
|
+
|
|
183
|
+
function temporalMonthModel(calendar: CalendarSystem): MonthModel {
|
|
184
|
+
const epoch = calendarMonthOf(calendar, EPOCH);
|
|
185
|
+
// Temporal arithmetic is slow next to a render. The panes and the wheels ask
|
|
186
|
+
// for the same months on every render.
|
|
187
|
+
const months = new Map<number, CalendarMonth>();
|
|
188
|
+
const monthAt = (index: number) => {
|
|
189
|
+
let month = months.get(index);
|
|
190
|
+
if (month == null) {
|
|
191
|
+
month = calendarAddMonths(calendar, epoch, index);
|
|
192
|
+
months.set(index, month);
|
|
193
|
+
}
|
|
194
|
+
return month;
|
|
195
|
+
};
|
|
196
|
+
const indexOf = (date: PlainDate) =>
|
|
197
|
+
calendarMonthsBetween(calendar, epoch, calendarMonthOf(calendar, date));
|
|
198
|
+
return {
|
|
199
|
+
calendar,
|
|
200
|
+
indexOf,
|
|
201
|
+
monthAt,
|
|
202
|
+
yearMonthAt: index => calendarYearMonthOf(calendar, monthAt(index)),
|
|
203
|
+
indexOfYearMonth: (year, month) =>
|
|
204
|
+
indexOf(calendarMonthOfYear(calendar, year, month).start),
|
|
205
|
+
monthsInYear: year => calendarMonthsInCalendarYear(calendar, year),
|
|
206
|
+
shiftYears: (index, years) =>
|
|
207
|
+
indexOf(calendarShiftYears(calendar, monthAt(index).start, years)),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* The month model of a calendar. A calendar that needs Temporal must be
|
|
213
|
+
* available in this runtime; `useCalendarSystem` resolves one that is not to
|
|
214
|
+
* `gregory`.
|
|
215
|
+
*/
|
|
216
|
+
export function createMonthModel(calendar: CalendarSystem): MonthModel {
|
|
217
|
+
return isGregorianAligned(calendar)
|
|
218
|
+
? gregorianMonthModel(calendar)
|
|
219
|
+
: temporalMonthModel(calendar);
|
|
220
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useCalendarPresentation.ts
|
|
7
|
+
* @input A date component's `calendar`, `presentation`, and `nativePicker`
|
|
8
|
+
* @output The resolved calendar and the presentation policy it allows
|
|
9
|
+
* @position DateInput helper hook; used by DateInput and DateTimeInput to
|
|
10
|
+
* choose a surface. Warns once when an explicit `native` cannot apply.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import {useEffect} from 'react';
|
|
14
|
+
import {useCalendarSystem} from '../i18n/useCalendarSystem';
|
|
15
|
+
import {
|
|
16
|
+
type CalendarSystem,
|
|
17
|
+
isGregorianCalendar,
|
|
18
|
+
} from '../utils/calendarSystem';
|
|
19
|
+
import {warnOnce} from '../utils/devWarning';
|
|
20
|
+
import {
|
|
21
|
+
type LegacyNativePicker,
|
|
22
|
+
type PickerPresentation,
|
|
23
|
+
calendarPickerPresentation,
|
|
24
|
+
effectivePickerPresentation,
|
|
25
|
+
} from '../utils/inputPresentation';
|
|
26
|
+
|
|
27
|
+
export interface CalendarPresentation {
|
|
28
|
+
/** The calendar the component shows. */
|
|
29
|
+
calendar: CalendarSystem;
|
|
30
|
+
/** The presentation policy, with native surfaces replaced in a calendar the native control cannot show. */
|
|
31
|
+
presentation: PickerPresentation;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function useCalendarPresentation(
|
|
35
|
+
source: string,
|
|
36
|
+
calendarProp: CalendarSystem | undefined,
|
|
37
|
+
presentation: PickerPresentation | undefined,
|
|
38
|
+
nativePicker: LegacyNativePicker | undefined,
|
|
39
|
+
): CalendarPresentation {
|
|
40
|
+
const calendar = useCalendarSystem(calendarProp, source);
|
|
41
|
+
const isNativeCalendar = isGregorianCalendar(calendar);
|
|
42
|
+
const isNativeOverridden = presentation === 'native' && !isNativeCalendar;
|
|
43
|
+
// Synchronizes the development console. The key is the component and
|
|
44
|
+
// calendar, so a replay or a second field does not warn again.
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (isNativeOverridden) {
|
|
47
|
+
warnOnce(
|
|
48
|
+
`presentation-native-calendar:${source}:${calendar}`,
|
|
49
|
+
source,
|
|
50
|
+
`presentation="native" shows the Astryx picker in the "${calendar}" ` +
|
|
51
|
+
'calendar, because the native date control shows only Gregorian ' +
|
|
52
|
+
'dates: the popover on a fine pointer and the bottom sheet on a ' +
|
|
53
|
+
'coarse pointer.',
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
}, [isNativeOverridden, source, calendar]);
|
|
57
|
+
return {
|
|
58
|
+
calendar,
|
|
59
|
+
presentation: calendarPickerPresentation(
|
|
60
|
+
effectivePickerPresentation(presentation, nativePicker),
|
|
61
|
+
isNativeCalendar,
|
|
62
|
+
),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useTypedDate.ts
|
|
7
|
+
* @input Provider locale and calendar, a field's format, bounds and constraints;
|
|
8
|
+
* calendarDateParser, and parseDateInput for other Gregorian text
|
|
9
|
+
* @output Typed-date reading, committed text, the format hint, the calendar
|
|
10
|
+
* description and rejection messages for a date text field, and the typed
|
|
11
|
+
* entry state that DateInput and DateTimeInput share
|
|
12
|
+
* @position DateInput helper hook; used by DateInput and DateTimeInput
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {useCallback, useMemo, useRef, useState} from 'react';
|
|
16
|
+
import type {InputStatus} from '../Field/types';
|
|
17
|
+
import {useLocale} from '../i18n/useLocale';
|
|
18
|
+
import {useCalendarSystem} from '../i18n/useCalendarSystem';
|
|
19
|
+
import {
|
|
20
|
+
registerEnglishFallback,
|
|
21
|
+
useComponentTranslator,
|
|
22
|
+
} from '../i18n/useComponentTranslator';
|
|
23
|
+
import english from '../i18n/generated-english/DateInput/useTypedDate.generated';
|
|
24
|
+
import {
|
|
25
|
+
type CalendarSystem,
|
|
26
|
+
isGregorianCalendar,
|
|
27
|
+
} from '../utils/calendarSystem';
|
|
28
|
+
import {
|
|
29
|
+
type CalendarDateParseResult,
|
|
30
|
+
calendarDisplayName,
|
|
31
|
+
formatCalendarDateText,
|
|
32
|
+
formatCalendarDateHint,
|
|
33
|
+
getCalendarDateLexicon,
|
|
34
|
+
parseCalendarDate,
|
|
35
|
+
} from '../utils/calendarDateParser';
|
|
36
|
+
import type {ISODateString, PlainDate} from '../utils/dateTypes';
|
|
37
|
+
import {parseDateInput} from '../utils/dateParser';
|
|
38
|
+
import {
|
|
39
|
+
type SharedDateFormat,
|
|
40
|
+
nearestAcceptedDate,
|
|
41
|
+
plainDateFromISO,
|
|
42
|
+
plainDateIsAfter,
|
|
43
|
+
plainDateIsBefore,
|
|
44
|
+
plainDateToISO,
|
|
45
|
+
plainDateToday,
|
|
46
|
+
} from '../utils/plainDate';
|
|
47
|
+
|
|
48
|
+
registerEnglishFallback(english);
|
|
49
|
+
|
|
50
|
+
/** A rejected typed date, by the message it announces. */
|
|
51
|
+
export type TypedDateError = 'unreadable' | 'nonexistent' | 'outOfRange';
|
|
52
|
+
|
|
53
|
+
export interface UseTypedDateOptions {
|
|
54
|
+
/** The component that names itself in development warnings. */
|
|
55
|
+
source: string;
|
|
56
|
+
/** The field's own calendar; the provider's calendar applies otherwise. */
|
|
57
|
+
calendar?: CalendarSystem;
|
|
58
|
+
/** The committed display format. */
|
|
59
|
+
format: SharedDateFormat | ((value: ISODateString) => string);
|
|
60
|
+
min?: ISODateString;
|
|
61
|
+
max?: ISODateString;
|
|
62
|
+
isDateDisabled: (date: PlainDate) => boolean;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface TypedDate {
|
|
66
|
+
/** The resolved calendar, for the field's Calendar. */
|
|
67
|
+
calendar: CalendarSystem;
|
|
68
|
+
/** Builds the lexicon ahead of the first keystroke. */
|
|
69
|
+
prepare: () => void;
|
|
70
|
+
parse: (text: string) => CalendarDateParseResult;
|
|
71
|
+
formatCommitted: (value: ISODateString) => string;
|
|
72
|
+
/**
|
|
73
|
+
* An example date for an empty focused field, or null for Gregorian. The
|
|
74
|
+
* example is today when the field accepts it, else the nearest date it
|
|
75
|
+
* accepts.
|
|
76
|
+
*/
|
|
77
|
+
getFormatHint: () => string | null;
|
|
78
|
+
/** Names the calendar, or null when it is the provider's calendar. */
|
|
79
|
+
calendarDescription: string | null;
|
|
80
|
+
/** The message for a rejected result. */
|
|
81
|
+
errorMessage: (result: CalendarDateParseResult) => string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** The rejection a result shows: errors of complete text, or of committed text. */
|
|
85
|
+
export function typedDateError(
|
|
86
|
+
result: CalendarDateParseResult | null,
|
|
87
|
+
isCommitted: boolean,
|
|
88
|
+
): TypedDateError | null {
|
|
89
|
+
if (result == null) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
if (
|
|
93
|
+
result.kind === 'unreadable' ||
|
|
94
|
+
(result.kind === 'incomplete' && isCommitted)
|
|
95
|
+
) {
|
|
96
|
+
return 'unreadable';
|
|
97
|
+
}
|
|
98
|
+
if (
|
|
99
|
+
(result.kind === 'nonexistent' || result.kind === 'outOfRange') &&
|
|
100
|
+
(result.isComplete || isCommitted)
|
|
101
|
+
) {
|
|
102
|
+
return result.kind;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Typed entry for a date text field in the active calendar. Values stay
|
|
109
|
+
* Gregorian; the calendar changes only what people type and read.
|
|
110
|
+
*/
|
|
111
|
+
export function useTypedDate({
|
|
112
|
+
source,
|
|
113
|
+
calendar: calendarProp,
|
|
114
|
+
format,
|
|
115
|
+
min,
|
|
116
|
+
max,
|
|
117
|
+
isDateDisabled,
|
|
118
|
+
}: UseTypedDateOptions): TypedDate {
|
|
119
|
+
const t = useComponentTranslator();
|
|
120
|
+
const locale = useLocale();
|
|
121
|
+
const calendar = useCalendarSystem(calendarProp, source);
|
|
122
|
+
const providerCalendar = useCalendarSystem(undefined, source);
|
|
123
|
+
const isGregorian = isGregorianCalendar(calendar);
|
|
124
|
+
|
|
125
|
+
const prepare = useCallback(() => {
|
|
126
|
+
getCalendarDateLexicon(locale, calendar);
|
|
127
|
+
}, [locale, calendar]);
|
|
128
|
+
|
|
129
|
+
const parse = useCallback(
|
|
130
|
+
(text: string): CalendarDateParseResult => {
|
|
131
|
+
const result = parseCalendarDate(
|
|
132
|
+
text,
|
|
133
|
+
getCalendarDateLexicon(locale, calendar),
|
|
134
|
+
{isoIsGregorian: format === 'system_date', isDateDisabled},
|
|
135
|
+
);
|
|
136
|
+
if (
|
|
137
|
+
!isGregorian ||
|
|
138
|
+
(result.kind !== 'unreadable' && result.kind !== 'nonexistent')
|
|
139
|
+
) {
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
// Gregorian text that only parseDateInput reads still commits, on Enter
|
|
143
|
+
// or blur only: it is never complete while the person types. This
|
|
144
|
+
// includes a day-first date in a month-first locale, which
|
|
145
|
+
// parseDateInput reads by swapping the order.
|
|
146
|
+
const date = parseDateInput(text, locale);
|
|
147
|
+
if (date == null) {
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
return isDateDisabled(date)
|
|
151
|
+
? {kind: 'outOfRange', date, isComplete: false}
|
|
152
|
+
: {kind: 'value', date, isComplete: false};
|
|
153
|
+
},
|
|
154
|
+
[locale, calendar, format, isDateDisabled, isGregorian],
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
const formatCommitted = useCallback(
|
|
158
|
+
(value: ISODateString) =>
|
|
159
|
+
typeof format === 'function'
|
|
160
|
+
? format(value)
|
|
161
|
+
: formatCalendarDateText(
|
|
162
|
+
plainDateFromISO(value),
|
|
163
|
+
format,
|
|
164
|
+
locale,
|
|
165
|
+
calendar,
|
|
166
|
+
),
|
|
167
|
+
[format, locale, calendar],
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
const getFormatHint = useCallback(() => {
|
|
171
|
+
if (isGregorian) {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const example = nearestAcceptedDate(plainDateToday(), {
|
|
175
|
+
min: min != null ? plainDateFromISO(min) : null,
|
|
176
|
+
max: max != null ? plainDateFromISO(max) : null,
|
|
177
|
+
isDateDisabled,
|
|
178
|
+
});
|
|
179
|
+
return t('@astryx.dateInput.formatHint', {
|
|
180
|
+
example: formatCalendarDateHint(example, locale, calendar),
|
|
181
|
+
});
|
|
182
|
+
}, [isGregorian, t, locale, calendar, min, max, isDateDisabled]);
|
|
183
|
+
|
|
184
|
+
const calendarName = useMemo(
|
|
185
|
+
() => calendarDisplayName(calendar, locale),
|
|
186
|
+
[calendar, locale],
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
const errorMessage = useCallback(
|
|
190
|
+
(result: CalendarDateParseResult) => {
|
|
191
|
+
if (result.kind === 'nonexistent') {
|
|
192
|
+
return t('@astryx.dateInput.nonexistentDate', {calendar: calendarName});
|
|
193
|
+
}
|
|
194
|
+
if (result.kind === 'outOfRange') {
|
|
195
|
+
const boundFormat = typeof format === 'function' ? 'date_long' : format;
|
|
196
|
+
const writeBound = (bound: ISODateString) =>
|
|
197
|
+
formatCalendarDateText(
|
|
198
|
+
plainDateFromISO(bound),
|
|
199
|
+
boundFormat,
|
|
200
|
+
locale,
|
|
201
|
+
calendar,
|
|
202
|
+
);
|
|
203
|
+
const isBeforeMin =
|
|
204
|
+
min != null && plainDateIsBefore(result.date, plainDateFromISO(min));
|
|
205
|
+
const isAfterMax =
|
|
206
|
+
max != null && plainDateIsAfter(result.date, plainDateFromISO(max));
|
|
207
|
+
const bounds =
|
|
208
|
+
!isBeforeMin && !isAfterMax
|
|
209
|
+
? 'none'
|
|
210
|
+
: min != null && max != null
|
|
211
|
+
? 'both'
|
|
212
|
+
: min != null
|
|
213
|
+
? 'min'
|
|
214
|
+
: 'max';
|
|
215
|
+
return t('@astryx.dateInput.outOfRangeDate', {
|
|
216
|
+
bounds,
|
|
217
|
+
min: min != null ? writeBound(min) : '',
|
|
218
|
+
max: max != null ? writeBound(max) : '',
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return t('@astryx.dateInput.invalidDate');
|
|
222
|
+
},
|
|
223
|
+
[t, calendarName, format, locale, calendar, min, max],
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
const isProviderCalendar = isGregorian
|
|
227
|
+
? isGregorianCalendar(providerCalendar)
|
|
228
|
+
: calendar === providerCalendar;
|
|
229
|
+
|
|
230
|
+
return {
|
|
231
|
+
calendar,
|
|
232
|
+
prepare,
|
|
233
|
+
parse,
|
|
234
|
+
formatCommitted,
|
|
235
|
+
getFormatHint,
|
|
236
|
+
calendarDescription: isProviderCalendar
|
|
237
|
+
? null
|
|
238
|
+
: t('@astryx.dateInput.calendarDescription', {calendar: calendarName}),
|
|
239
|
+
errorMessage,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export interface UseTypedDateFieldOptions extends UseTypedDateOptions {
|
|
244
|
+
/** The committed date. */
|
|
245
|
+
value: ISODateString | undefined;
|
|
246
|
+
/** The date the field shows, which leads `value` while a commit is in flight. */
|
|
247
|
+
shownValue: ISODateString | undefined;
|
|
248
|
+
/** Reports a typed date. */
|
|
249
|
+
onChange: (value: ISODateString) => void;
|
|
250
|
+
/** Runs when Enter or blur commits emptied text. */
|
|
251
|
+
onClear: () => void;
|
|
252
|
+
/** Runs when typing completes a new date, such as to show its month. */
|
|
253
|
+
onTypedDate?: (value: ISODateString) => void;
|
|
254
|
+
/**
|
|
255
|
+
* A disabled or busy field ignores typing, Enter and blur, and hides a typed
|
|
256
|
+
* rejection. Typed text stays until the next Enter or blur once the field is
|
|
257
|
+
* editable, or until `value` changes. Once the field is editable, text whose
|
|
258
|
+
* date typing already reported gives way to the field's value.
|
|
259
|
+
*/
|
|
260
|
+
isDisabled: boolean;
|
|
261
|
+
/** The caller's status. Rejected text that stays shows its own error instead. */
|
|
262
|
+
status?: InputStatus;
|
|
263
|
+
/** Whether the shown status announces itself, as Field's status does. */
|
|
264
|
+
isStatusAnnounced: boolean;
|
|
265
|
+
/** Whether the caller gave a placeholder, which replaces the format hint. */
|
|
266
|
+
hasPlaceholder: boolean;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export interface TypedDateField {
|
|
270
|
+
typedDate: TypedDate;
|
|
271
|
+
/** The text the input shows. */
|
|
272
|
+
displayValue: string;
|
|
273
|
+
/** The format hint for an empty focused field. */
|
|
274
|
+
formatHint: string | null;
|
|
275
|
+
/** Whether typed text waits to commit. */
|
|
276
|
+
isPending: boolean;
|
|
277
|
+
isInvalid: boolean;
|
|
278
|
+
/** The status the field shows. */
|
|
279
|
+
fieldStatus: InputStatus | undefined;
|
|
280
|
+
/** A typed rejection that the field status does not announce. */
|
|
281
|
+
alertMessage: string;
|
|
282
|
+
handleChange: (text: string) => void;
|
|
283
|
+
/** Commits typed text, on Enter or blur. */
|
|
284
|
+
commit: () => void;
|
|
285
|
+
handleFocus: () => void;
|
|
286
|
+
handleBlur: () => void;
|
|
287
|
+
/** Drops typed text after a date is picked another way. */
|
|
288
|
+
reset: () => void;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/** The typed entry of a date text field: its text, rejections, and commits. */
|
|
292
|
+
export function useTypedDateField({
|
|
293
|
+
value,
|
|
294
|
+
shownValue,
|
|
295
|
+
onChange,
|
|
296
|
+
onClear,
|
|
297
|
+
onTypedDate,
|
|
298
|
+
isDisabled,
|
|
299
|
+
status,
|
|
300
|
+
isStatusAnnounced,
|
|
301
|
+
hasPlaceholder,
|
|
302
|
+
...options
|
|
303
|
+
}: UseTypedDateFieldOptions): TypedDateField {
|
|
304
|
+
const typedDate = useTypedDate(options);
|
|
305
|
+
// Typed text, or null when the field shows the committed value.
|
|
306
|
+
const [pendingInput, setPendingInput] = useState<string | null>(null);
|
|
307
|
+
// Set when Enter or blur keeps rejected text so the person can correct it.
|
|
308
|
+
const [isRejectionCommitted, setIsRejectionCommitted] = useState(false);
|
|
309
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
310
|
+
// The date that typing last reported, so one typing session reports each
|
|
311
|
+
// date once.
|
|
312
|
+
const lastFiredRef = useRef<ISODateString | undefined>(undefined);
|
|
313
|
+
|
|
314
|
+
const typedResult =
|
|
315
|
+
pendingInput !== null && pendingInput.trim()
|
|
316
|
+
? typedDate.parse(pendingInput)
|
|
317
|
+
: null;
|
|
318
|
+
// A locked field hides the rejection but keeps its state, so the rejection
|
|
319
|
+
// shows again once the field is editable.
|
|
320
|
+
const typedError = isDisabled
|
|
321
|
+
? null
|
|
322
|
+
: typedDateError(typedResult, isRejectionCommitted);
|
|
323
|
+
const errorMessage =
|
|
324
|
+
typedError != null && typedResult != null
|
|
325
|
+
? typedDate.errorMessage(typedResult)
|
|
326
|
+
: null;
|
|
327
|
+
// Text that stays in the field shows its reason as well as announcing it.
|
|
328
|
+
const isErrorShown =
|
|
329
|
+
typedError === 'nonexistent' ||
|
|
330
|
+
typedError === 'outOfRange' ||
|
|
331
|
+
(typedError === 'unreadable' && isRejectionCommitted);
|
|
332
|
+
const typedStatus: InputStatus | undefined =
|
|
333
|
+
isErrorShown && errorMessage != null
|
|
334
|
+
? {type: 'error', message: errorMessage}
|
|
335
|
+
: undefined;
|
|
336
|
+
const fieldStatus = typedStatus ?? status;
|
|
337
|
+
|
|
338
|
+
const reset = useCallback(() => {
|
|
339
|
+
setPendingInput(null);
|
|
340
|
+
setIsRejectionCommitted(false);
|
|
341
|
+
}, []);
|
|
342
|
+
|
|
343
|
+
// A value from outside drops typed text. Computed during render, so it
|
|
344
|
+
// takes no extra render.
|
|
345
|
+
const prevValueRef = useRef(value);
|
|
346
|
+
if (value !== prevValueRef.current) {
|
|
347
|
+
prevValueRef.current = value;
|
|
348
|
+
if (value !== lastFiredRef.current) {
|
|
349
|
+
lastFiredRef.current = undefined;
|
|
350
|
+
if (pendingInput !== null) {
|
|
351
|
+
setPendingInput(null);
|
|
352
|
+
setIsRejectionCommitted(false);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// Typing already reported this date through `onChange`. Once the field is
|
|
358
|
+
// editable, it shows its value. A retyped date then reports again. A focused
|
|
359
|
+
// field keeps the text until Enter or blur, which end the typing session.
|
|
360
|
+
const wasDisabledRef = useRef(isDisabled);
|
|
361
|
+
if (isDisabled !== wasDisabledRef.current) {
|
|
362
|
+
wasDisabledRef.current = isDisabled;
|
|
363
|
+
if (
|
|
364
|
+
!isDisabled &&
|
|
365
|
+
!isFocused &&
|
|
366
|
+
typedResult?.kind === 'value' &&
|
|
367
|
+
plainDateToISO(typedResult.date) === lastFiredRef.current
|
|
368
|
+
) {
|
|
369
|
+
lastFiredRef.current = undefined;
|
|
370
|
+
setPendingInput(null);
|
|
371
|
+
setIsRejectionCommitted(false);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const report = useCallback(
|
|
376
|
+
(date: ISODateString) => {
|
|
377
|
+
if (date === value || date === lastFiredRef.current) {
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
lastFiredRef.current = date;
|
|
381
|
+
onChange(date);
|
|
382
|
+
return true;
|
|
383
|
+
},
|
|
384
|
+
[value, onChange],
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
const handleChange = useCallback(
|
|
388
|
+
(text: string) => {
|
|
389
|
+
if (isDisabled) {
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
setPendingInput(text);
|
|
393
|
+
setIsRejectionCommitted(false);
|
|
394
|
+
// Report a date only once more typing cannot change it.
|
|
395
|
+
const result = typedDate.parse(text);
|
|
396
|
+
if (result.kind === 'value' && result.isComplete) {
|
|
397
|
+
const date = plainDateToISO(result.date);
|
|
398
|
+
if (report(date)) {
|
|
399
|
+
onTypedDate?.(date);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
[isDisabled, typedDate, report, onTypedDate],
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
const commit = useCallback(() => {
|
|
407
|
+
if (pendingInput === null || isDisabled) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
if (!pendingInput.trim()) {
|
|
411
|
+
onClear();
|
|
412
|
+
reset();
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
const result = typedDate.parse(pendingInput);
|
|
416
|
+
if (
|
|
417
|
+
result.kind === 'incomplete' ||
|
|
418
|
+
result.kind === 'nonexistent' ||
|
|
419
|
+
result.kind === 'outOfRange'
|
|
420
|
+
) {
|
|
421
|
+
// Keep the text and show why it cannot commit; never finish or adjust
|
|
422
|
+
// the date.
|
|
423
|
+
setIsRejectionCommitted(true);
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
if (result.kind === 'value') {
|
|
427
|
+
report(plainDateToISO(result.date));
|
|
428
|
+
}
|
|
429
|
+
// A new typing session reports a retyped date again.
|
|
430
|
+
lastFiredRef.current = undefined;
|
|
431
|
+
reset();
|
|
432
|
+
}, [pendingInput, isDisabled, onClear, typedDate, report, reset]);
|
|
433
|
+
|
|
434
|
+
const handleFocus = useCallback(() => {
|
|
435
|
+
setIsFocused(true);
|
|
436
|
+
typedDate.prepare();
|
|
437
|
+
}, [typedDate]);
|
|
438
|
+
|
|
439
|
+
const handleBlur = useCallback(() => {
|
|
440
|
+
setIsFocused(false);
|
|
441
|
+
commit();
|
|
442
|
+
}, [commit]);
|
|
443
|
+
|
|
444
|
+
const displayValue =
|
|
445
|
+
pendingInput !== null
|
|
446
|
+
? pendingInput
|
|
447
|
+
: shownValue != null && /^\d{4}-\d{2}-\d{2}$/.test(shownValue)
|
|
448
|
+
? typedDate.formatCommitted(shownValue)
|
|
449
|
+
: '';
|
|
450
|
+
|
|
451
|
+
return {
|
|
452
|
+
typedDate,
|
|
453
|
+
displayValue,
|
|
454
|
+
formatHint:
|
|
455
|
+
!hasPlaceholder && isFocused && !displayValue
|
|
456
|
+
? typedDate.getFormatHint()
|
|
457
|
+
: null,
|
|
458
|
+
isPending: pendingInput !== null,
|
|
459
|
+
isInvalid: typedError != null,
|
|
460
|
+
fieldStatus,
|
|
461
|
+
alertMessage:
|
|
462
|
+
isStatusAnnounced && typedStatus != null ? '' : (errorMessage ?? ''),
|
|
463
|
+
handleChange,
|
|
464
|
+
commit,
|
|
465
|
+
handleFocus,
|
|
466
|
+
handleBlur,
|
|
467
|
+
reset,
|
|
468
|
+
};
|
|
469
|
+
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import {canVibrate, playHaptic} from '../gestures/haptics';
|
|
19
|
-
import {
|
|
19
|
+
import {createMotionEngine, type MotionCurve} from '../motion/animator';
|
|
20
20
|
import {reducedMotionFade} from '../motion/reducedMotion';
|
|
21
21
|
import {picker} from '../motion/uikit/picker';
|
|
22
22
|
import {
|
|
@@ -132,7 +132,7 @@ function now(): number {
|
|
|
132
132
|
* ```
|
|
133
133
|
*/
|
|
134
134
|
export function createWheelStrip(initialLayout: WheelLayout): WheelStrip {
|
|
135
|
-
const animator =
|
|
135
|
+
const animator = createMotionEngine(null);
|
|
136
136
|
let layout = initialLayout;
|
|
137
137
|
let running: Running | null = null;
|
|
138
138
|
let nearestListener: ((position: number) => void) | null = null;
|