@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
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file coarsePointer.ts
|
|
5
5
|
* @input A window
|
|
6
|
-
* @output Exports isCoarsePointer and
|
|
7
|
-
* primary pointer is coarse (TOUCH_QUERY), and when it
|
|
6
|
+
* @output Exports isCoarsePointer, watchCoarsePointer and watchMediaQuery:
|
|
7
|
+
* whether the primary pointer is coarse (TOUCH_QUERY), and when it or any
|
|
8
|
+
* media query changes
|
|
8
9
|
* @position The coarse-pointer gate of packages/core/src/gestures and of
|
|
9
10
|
* the press controller (pressFeedback.ts): touch-only work registers only
|
|
10
|
-
* while it holds
|
|
11
|
+
* while it holds. useMediaQuery watches through watchMediaQuery
|
|
11
12
|
*
|
|
12
13
|
* Under a coarse primary pointer, a phone's touch work stays registered: the
|
|
13
14
|
* gesture host's page listeners, the page hold and the finger scroll. Under a
|
|
@@ -29,23 +30,35 @@ export function isCoarsePointer(view: Window | null | undefined): boolean {
|
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
|
-
* Call `listener` with the new answer each time
|
|
33
|
-
* `view
|
|
33
|
+
* Call `listener` with the new answer each time `query` starts or stops
|
|
34
|
+
* matching in `view`, until the returned function is called.
|
|
34
35
|
*/
|
|
35
|
-
export function
|
|
36
|
+
export function watchMediaQuery(
|
|
36
37
|
view: Window | null | undefined,
|
|
37
|
-
|
|
38
|
+
query: string,
|
|
39
|
+
listener: (matches: boolean) => void,
|
|
38
40
|
): () => void {
|
|
39
41
|
if (typeof view?.matchMedia !== 'function') {
|
|
40
42
|
return () => {};
|
|
41
43
|
}
|
|
42
|
-
const
|
|
43
|
-
const onChange = (): void => listener(
|
|
44
|
-
if (typeof
|
|
45
|
-
|
|
46
|
-
return () =>
|
|
44
|
+
const list = view.matchMedia(query);
|
|
45
|
+
const onChange = (): void => listener(list.matches);
|
|
46
|
+
if (typeof list.addEventListener === 'function') {
|
|
47
|
+
list.addEventListener('change', onChange);
|
|
48
|
+
return () => list.removeEventListener('change', onChange);
|
|
47
49
|
}
|
|
48
50
|
// Safari before 14 only has the older pair.
|
|
49
|
-
|
|
50
|
-
return () =>
|
|
51
|
+
list.addListener(onChange);
|
|
52
|
+
return () => list.removeListener(onChange);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Call `listener` with the new answer each time the primary pointer of
|
|
57
|
+
* `view` turns coarse or fine, until the returned function is called.
|
|
58
|
+
*/
|
|
59
|
+
export function watchCoarsePointer(
|
|
60
|
+
view: Window | null | undefined,
|
|
61
|
+
listener: (isCoarse: boolean) => void,
|
|
62
|
+
): () => void {
|
|
63
|
+
return watchMediaQuery(view, TOUCH_QUERY, listener);
|
|
51
64
|
}
|
package/src/utils/flatTree.ts
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file flatTree.ts
|
|
5
5
|
* @input A DOM node
|
|
6
|
-
* @output Exports parentAcrossShadow,
|
|
6
|
+
* @output Exports parentAcrossShadow, containsAlongFlatTree, which walks it,
|
|
7
|
+
* and deepActiveElement
|
|
7
8
|
* @position The flat-tree parent the browser scrolls and dispatches
|
|
8
|
-
* through, shared by the gesture host's native-scroll probe
|
|
9
|
+
* through, shared by the gesture host's native-scroll probe, the
|
|
9
10
|
* selection lock (which the press feedback controller uses without the
|
|
10
|
-
* gesture system)
|
|
11
|
+
* gesture system) and the Layer module's input hold
|
|
11
12
|
*/
|
|
12
13
|
|
|
13
14
|
/** The node's parent, crossing out of shadow roots. */
|
|
@@ -38,3 +39,14 @@ export function containsAlongFlatTree(ancestor: Node, node: Node): boolean {
|
|
|
38
39
|
}
|
|
39
40
|
return false;
|
|
40
41
|
}
|
|
42
|
+
|
|
43
|
+
/** The focused element of `doc`, inside open shadow roots too. */
|
|
44
|
+
export function deepActiveElement(
|
|
45
|
+
doc: Document | null | undefined,
|
|
46
|
+
): Element | null {
|
|
47
|
+
let active = doc?.activeElement ?? null;
|
|
48
|
+
while (active?.shadowRoot?.activeElement != null) {
|
|
49
|
+
active = active.shadowRoot.activeElement;
|
|
50
|
+
}
|
|
51
|
+
return active;
|
|
52
|
+
}
|
package/src/utils/focusReturn.ts
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* @input The document's current active element and the shared interaction
|
|
6
6
|
* modality.
|
|
7
7
|
* @output Whether focus would be lost if a surface hid now; a focus move whose
|
|
8
|
-
* ring follows the last input;
|
|
9
|
-
*
|
|
8
|
+
* ring follows the last input; the focus return of a closed overlay, which
|
|
9
|
+
* never scrolls the page; and the one path that moves focus out of content a
|
|
10
|
+
* change removed or hid (`noteFocusWithin`, `moveFocusLeftBehind`).
|
|
10
11
|
* @position Utility; used by overlays (BottomSheet, Dialog, DropdownMenu) that
|
|
11
12
|
* move focus programmatically, and by disclosures that hide focused
|
|
12
13
|
* content. isFocusDetached lives in isFocusDetached.ts, so the utils entry,
|
|
@@ -130,30 +131,89 @@ export function focusForLastInput(
|
|
|
130
131
|
}
|
|
131
132
|
|
|
132
133
|
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
* Returns focus to `opener` after an overlay closes, without a scroll and with
|
|
135
|
+
* the ring the last input calls for. WebKit records the nearest focusable
|
|
136
|
+
* ancestor of a tapped button as the opener, such as a `tabindex="-1"` main
|
|
137
|
+
* region. A reveal of that region scrolls the page to its top edge.
|
|
138
|
+
*/
|
|
139
|
+
export function returnFocusForLastInput(
|
|
140
|
+
opener: HTMLElement,
|
|
141
|
+
modality?: InteractionModality,
|
|
142
|
+
): void {
|
|
143
|
+
focusForLastInput(opener, {preventScroll: true}, modality);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Prepares a focus repair for an open surface that may be removed while open
|
|
148
|
+
* (rendered only while open, or removed with its view). Removing a `<dialog>`
|
|
149
|
+
* runs no close and no browser focus return. Call this while the surface is
|
|
150
|
+
* mounted: it reads the frame that hosts the surface now, because a removed
|
|
151
|
+
* frame's document has no window. Call the returned function from the effect
|
|
152
|
+
* cleanup with the repair to run.
|
|
139
153
|
*
|
|
140
|
-
* Once the commit has finished,
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
154
|
+
* Once the commit has finished, the repair runs only when the surface really
|
|
155
|
+
* left the document (StrictMode's simulated unmount keeps it) and the removal
|
|
156
|
+
* lost focus, both in the surface's document and in the document that hosts
|
|
157
|
+
* its frame. A control the user pressed outside the surface, or outside its
|
|
158
|
+
* frame, keeps its focus, and so does a surface that took focus in the same
|
|
159
|
+
* commit.
|
|
145
160
|
*/
|
|
146
|
-
export function
|
|
161
|
+
export function prepareFocusRepairOnRemoval(
|
|
147
162
|
surface: Element,
|
|
148
|
-
|
|
163
|
+
options?: {
|
|
164
|
+
/**
|
|
165
|
+
* Skip the repair when focus already rested on the page body before the
|
|
166
|
+
* commit's first removal: the removal did not lose that focus.
|
|
167
|
+
*/
|
|
168
|
+
keepRestingFocus?: boolean;
|
|
169
|
+
},
|
|
170
|
+
): (repair: () => void) => void {
|
|
149
171
|
const host = surface.ownerDocument.defaultView?.frameElement ?? null;
|
|
150
|
-
return
|
|
172
|
+
return repair => {
|
|
173
|
+
if (
|
|
174
|
+
options?.keepRestingFocus === true &&
|
|
175
|
+
wasFocusDetachedBeforeRemoval(surface.ownerDocument)
|
|
176
|
+
) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
151
179
|
queueMicrotask(() => {
|
|
152
|
-
if (surface.isConnected
|
|
180
|
+
if (surface.isConnected) {
|
|
153
181
|
return;
|
|
154
182
|
}
|
|
155
183
|
if (isFocusLost(surface) && (host == null || isFocusLost(host))) {
|
|
156
|
-
|
|
184
|
+
repair();
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Whether focus rested on the page body when the current commit began
|
|
191
|
+
// removing surfaces, per document. One removal can drop focus before a later
|
|
192
|
+
// surface's cleanup runs, so every cleanup of the commit reads the first value.
|
|
193
|
+
const focusDetachedAtRemovalStart = new WeakMap<Document, boolean>();
|
|
194
|
+
function wasFocusDetachedBeforeRemoval(doc: Document): boolean {
|
|
195
|
+
let wasDetached = focusDetachedAtRemovalStart.get(doc);
|
|
196
|
+
if (wasDetached === undefined) {
|
|
197
|
+
wasDetached = isFocusDetached(doc);
|
|
198
|
+
focusDetachedAtRemovalStart.set(doc, wasDetached);
|
|
199
|
+
queueMicrotask(() => focusDetachedAtRemovalStart.delete(doc));
|
|
200
|
+
}
|
|
201
|
+
return wasDetached;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* The focus repair above that returns focus to `opener` while the opener is
|
|
206
|
+
* still on the page. Call the returned function from the effect cleanup with
|
|
207
|
+
* the opener.
|
|
208
|
+
*/
|
|
209
|
+
export function prepareFocusReturnOnRemoval(
|
|
210
|
+
surface: Element,
|
|
211
|
+
): (opener: Element | null) => void {
|
|
212
|
+
const repairOnRemoval = prepareFocusRepairOnRemoval(surface);
|
|
213
|
+
return opener => {
|
|
214
|
+
repairOnRemoval(() => {
|
|
215
|
+
if (opener != null && opener.isConnected) {
|
|
216
|
+
returnFocusForLastInput(opener as HTMLElement);
|
|
157
217
|
}
|
|
158
218
|
});
|
|
159
219
|
};
|
package/src/utils/hitArea.ts
CHANGED
|
@@ -24,6 +24,9 @@
|
|
|
24
24
|
// live control measures: only under a coarse primary pointer (AST-094), only on
|
|
25
25
|
// screen, and in one read pass per frame within a 4 ms budget. Until the first
|
|
26
26
|
// pass the insets are 0, so first paint never overlaps anything.
|
|
27
|
+
// The insets are lengths in the control's own box, so a pass measures in its
|
|
28
|
+
// layout px. A layer that opens from a smaller scale then keeps the insets of
|
|
29
|
+
// the size it settles at.
|
|
27
30
|
|
|
28
31
|
import {observeContent} from './sharedMutationObserver';
|
|
29
32
|
|
|
@@ -264,6 +267,7 @@ function now(): number {
|
|
|
264
267
|
interface Watch {
|
|
265
268
|
readonly element: Element;
|
|
266
269
|
readonly minSize: number;
|
|
270
|
+
readonly ownsDescendantTouches: boolean;
|
|
267
271
|
readonly onInsets: (insets: HitInsets) => void;
|
|
268
272
|
isVisible: boolean;
|
|
269
273
|
last: HitInsets;
|
|
@@ -284,6 +288,8 @@ const observedSizes = new WeakMap<Element, string>();
|
|
|
284
288
|
const scopeTimers = new Map<Element, ReturnType<typeof setTimeout>>();
|
|
285
289
|
let frame: number | null = null;
|
|
286
290
|
let view: Window | null = null;
|
|
291
|
+
/** The document the shared press listener is on, while it is on one. */
|
|
292
|
+
let pressDocument: Document | null = null;
|
|
287
293
|
let pointer: MediaQueryList | null = null;
|
|
288
294
|
let visibility: IntersectionObserver | null = null;
|
|
289
295
|
let resize: ResizeObserver | null = null;
|
|
@@ -330,6 +336,95 @@ function plainRect(element: Element): HitRect {
|
|
|
330
336
|
return {left, top, right, bottom};
|
|
331
337
|
}
|
|
332
338
|
|
|
339
|
+
/** A box that the transforms around it leave at its layout size. */
|
|
340
|
+
const UNSCALED = {x: 1, y: 1} as const;
|
|
341
|
+
|
|
342
|
+
/** One axis of a box's scale on screen: its client size over its layout size. */
|
|
343
|
+
function axisScale(onScreen: number, layout: number): number {
|
|
344
|
+
if (!(layout > 0) || !(onScreen > 0)) {
|
|
345
|
+
return 1;
|
|
346
|
+
}
|
|
347
|
+
const scale = onScreen / layout;
|
|
348
|
+
// Within rounding of 1 the box is at its layout size: no change to the rects.
|
|
349
|
+
return Math.abs(scale - 1) < 1e-3 ? 1 : scale;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* How far the transforms around `element` scale its box on screen, per axis.
|
|
354
|
+
* A layer that opens from a smaller scale scales every rect inside it, while
|
|
355
|
+
* the layout box keeps the size the layer settles at. Only a scale is
|
|
356
|
+
* expected: a rotated or skewed box would read as a larger scale.
|
|
357
|
+
*/
|
|
358
|
+
function screenScale(
|
|
359
|
+
element: Element,
|
|
360
|
+
onScreen: HitRect,
|
|
361
|
+
): {x: number; y: number} {
|
|
362
|
+
// The offset size is the layout size in whole pixels, unaffected by
|
|
363
|
+
// transforms, and costs no style resolution. A box with none, such as an SVG
|
|
364
|
+
// element or a jsdom box, reads as unscaled.
|
|
365
|
+
const box = element as Partial<HTMLElement>;
|
|
366
|
+
const offsetWidth = box.offsetWidth ?? 0;
|
|
367
|
+
const offsetHeight = box.offsetHeight ?? 0;
|
|
368
|
+
if (offsetWidth === 0 || offsetHeight === 0) {
|
|
369
|
+
return UNSCALED;
|
|
370
|
+
}
|
|
371
|
+
// Within a pixel of its layout size the box reads as unscaled, which bounds
|
|
372
|
+
// the inset error at about a pixel. Only a box that a transform shrinks or
|
|
373
|
+
// grows reads its exact size from the computed style.
|
|
374
|
+
if (
|
|
375
|
+
Math.abs(onScreen.right - onScreen.left - offsetWidth) <= 1 &&
|
|
376
|
+
Math.abs(onScreen.bottom - onScreen.top - offsetHeight) <= 1
|
|
377
|
+
) {
|
|
378
|
+
return UNSCALED;
|
|
379
|
+
}
|
|
380
|
+
const style = element.ownerDocument.defaultView?.getComputedStyle(element);
|
|
381
|
+
if (style == null || !style.width.endsWith('px')) {
|
|
382
|
+
return UNSCALED;
|
|
383
|
+
}
|
|
384
|
+
const px = (value: string) => Number.parseFloat(value) || 0;
|
|
385
|
+
const isContentBox = style.boxSizing !== 'border-box';
|
|
386
|
+
const width =
|
|
387
|
+
px(style.width) +
|
|
388
|
+
(isContentBox
|
|
389
|
+
? px(style.paddingLeft) +
|
|
390
|
+
px(style.paddingRight) +
|
|
391
|
+
px(style.borderLeftWidth) +
|
|
392
|
+
px(style.borderRightWidth)
|
|
393
|
+
: 0);
|
|
394
|
+
const height =
|
|
395
|
+
px(style.height) +
|
|
396
|
+
(isContentBox
|
|
397
|
+
? px(style.paddingTop) +
|
|
398
|
+
px(style.paddingBottom) +
|
|
399
|
+
px(style.borderTopWidth) +
|
|
400
|
+
px(style.borderBottomWidth)
|
|
401
|
+
: 0);
|
|
402
|
+
return {
|
|
403
|
+
x: axisScale(onScreen.right - onScreen.left, width),
|
|
404
|
+
y: axisScale(onScreen.bottom - onScreen.top, height),
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* `rect` in the layout px of the box at `origin`: its offset from `origin`,
|
|
410
|
+
* divided by that box's scale on screen.
|
|
411
|
+
*/
|
|
412
|
+
function inLayout(
|
|
413
|
+
rect: HitRect,
|
|
414
|
+
origin: HitRect,
|
|
415
|
+
scale: {x: number; y: number},
|
|
416
|
+
): HitRect {
|
|
417
|
+
if (scale.x === 1 && scale.y === 1) {
|
|
418
|
+
return rect;
|
|
419
|
+
}
|
|
420
|
+
return {
|
|
421
|
+
left: origin.left + (rect.left - origin.left) / scale.x,
|
|
422
|
+
top: origin.top + (rect.top - origin.top) / scale.y,
|
|
423
|
+
right: origin.left + (rect.right - origin.left) / scale.x,
|
|
424
|
+
bottom: origin.top + (rect.bottom - origin.top) / scale.y,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
|
|
333
428
|
interface Candidate {
|
|
334
429
|
readonly element: Element;
|
|
335
430
|
readonly rect: HitRect;
|
|
@@ -373,14 +468,15 @@ function measureOne(
|
|
|
373
468
|
candidates: ReadonlyArray<Candidate>,
|
|
374
469
|
): {target: HitRect; insets: HitInsets; neighbours: HitRect[]} {
|
|
375
470
|
const target = plainRect(watch.element);
|
|
471
|
+
const scale = screenScale(watch.element, target);
|
|
376
472
|
// Two targets each growing up to half the minimum reach each other from a
|
|
377
473
|
// minimum apart.
|
|
378
474
|
const reach = Math.max(0, watch.minSize);
|
|
379
475
|
const band = grown(target, {
|
|
380
|
-
top: reach,
|
|
381
|
-
right: reach,
|
|
382
|
-
bottom: reach,
|
|
383
|
-
left: reach,
|
|
476
|
+
top: reach * scale.y,
|
|
477
|
+
right: reach * scale.x,
|
|
478
|
+
bottom: reach * scale.y,
|
|
479
|
+
left: reach * scale.x,
|
|
384
480
|
});
|
|
385
481
|
const neighbours = candidates
|
|
386
482
|
.filter(
|
|
@@ -393,7 +489,16 @@ function measureOne(
|
|
|
393
489
|
.map(({rect}) => rect);
|
|
394
490
|
return {
|
|
395
491
|
target,
|
|
396
|
-
insets
|
|
492
|
+
// The insets are in the control's layout px. The returned rects stay in
|
|
493
|
+
// screen px for a touch's distance checks. A neighbour maps by the
|
|
494
|
+
// control's scale, as if it is in the same layer. A neighbour outside that
|
|
495
|
+
// layer then reads farther away. A touch compares screen distances, so it
|
|
496
|
+
// still counts that neighbour.
|
|
497
|
+
insets: clampedHitInsets(
|
|
498
|
+
inLayout(target, target, scale),
|
|
499
|
+
neighbours.map(rect => inLayout(rect, target, scale)),
|
|
500
|
+
watch.minSize,
|
|
501
|
+
),
|
|
397
502
|
neighbours,
|
|
398
503
|
};
|
|
399
504
|
}
|
|
@@ -497,7 +602,16 @@ function checkPress(element: Element, event: PointerEvent): void {
|
|
|
497
602
|
const own = distanceTo(target, x, y);
|
|
498
603
|
isNearerNeighbour ||= neighbours.some(rect => distanceTo(rect, x, y) < own);
|
|
499
604
|
}
|
|
500
|
-
|
|
605
|
+
// A watch can own its descendants' touches. Then a press that the browser
|
|
606
|
+
// hit-tests onto a descendant lands on content the element paints, even
|
|
607
|
+
// past its own box. A swipe panel's entry beside a moved row is such
|
|
608
|
+
// content. That touch is the element's.
|
|
609
|
+
const isOnOwnContent =
|
|
610
|
+
[...entry.watches].some(watch => watch.ownsDescendantTouches) &&
|
|
611
|
+
press.target instanceof Node &&
|
|
612
|
+
press.target !== element &&
|
|
613
|
+
element.contains(press.target);
|
|
614
|
+
if (isNearerNeighbour && !isOnOwnContent) {
|
|
501
615
|
const swallow = (click: Event) => {
|
|
502
616
|
disarm();
|
|
503
617
|
// A keyboard or assistive-technology activation (detail 0) is never
|
|
@@ -585,7 +699,8 @@ function startObserving(): void {
|
|
|
585
699
|
return;
|
|
586
700
|
}
|
|
587
701
|
view.addEventListener('resize', scheduleAll);
|
|
588
|
-
view.document
|
|
702
|
+
pressDocument = view.document;
|
|
703
|
+
pressDocument.addEventListener('pointerdown', onPress, PASSIVE_CAPTURE);
|
|
589
704
|
if (typeof IntersectionObserver === 'function') {
|
|
590
705
|
visibility = new IntersectionObserver(entries => {
|
|
591
706
|
for (const entry of entries) {
|
|
@@ -641,7 +756,10 @@ function stopObserving(): void {
|
|
|
641
756
|
entry.release = null;
|
|
642
757
|
}
|
|
643
758
|
view?.removeEventListener('resize', scheduleAll);
|
|
644
|
-
|
|
759
|
+
// The listener leaves the document it went on. A window can close first, as
|
|
760
|
+
// a removed iframe's, and then it has no document to read.
|
|
761
|
+
pressDocument?.removeEventListener('pointerdown', onPress, PASSIVE_CAPTURE);
|
|
762
|
+
pressDocument = null;
|
|
645
763
|
visibility?.disconnect();
|
|
646
764
|
resize?.disconnect();
|
|
647
765
|
visibility = null;
|
|
@@ -675,6 +793,13 @@ function onPointerChange(): void {
|
|
|
675
793
|
export interface WatchHitAreaOptions {
|
|
676
794
|
/** The size to grow toward, px. @default 44 */
|
|
677
795
|
readonly minSize?: number;
|
|
796
|
+
/**
|
|
797
|
+
* A touch that the browser hit-tests onto a descendant is the element's,
|
|
798
|
+
* however near a neighbour is. Set it for a host whose content can paint
|
|
799
|
+
* past its box, such as a list row with a swipe panel. A control whose
|
|
800
|
+
* grown input is its descendant leaves it off. @default false
|
|
801
|
+
*/
|
|
802
|
+
readonly ownsDescendantTouches?: boolean;
|
|
678
803
|
}
|
|
679
804
|
|
|
680
805
|
/**
|
|
@@ -706,7 +831,10 @@ export function resetHitAreaForTests(): void {
|
|
|
706
831
|
export function watchHitArea(
|
|
707
832
|
element: Element,
|
|
708
833
|
onInsets: (insets: HitInsets) => void,
|
|
709
|
-
{
|
|
834
|
+
{
|
|
835
|
+
minSize = MIN_TOUCH_TARGET,
|
|
836
|
+
ownsDescendantTouches = false,
|
|
837
|
+
}: WatchHitAreaOptions = {},
|
|
710
838
|
): () => void {
|
|
711
839
|
const owner = element.ownerDocument.defaultView;
|
|
712
840
|
if (owner == null) {
|
|
@@ -726,6 +854,7 @@ export function watchHitArea(
|
|
|
726
854
|
const watch: Watch = {
|
|
727
855
|
element,
|
|
728
856
|
minSize,
|
|
857
|
+
ownsDescendantTouches,
|
|
729
858
|
onInsets,
|
|
730
859
|
isVisible: isCoarse && visibility == null,
|
|
731
860
|
last: NO_HIT_INSETS,
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file inputPresentation.ts
|
|
5
|
-
* @input A presentation policy, the deprecated nativePicker value,
|
|
5
|
+
* @input A presentation policy, the deprecated nativePicker value, whether the
|
|
6
|
+
* native date control can show the calendar, and pointer type
|
|
6
7
|
* @output The resolved picker surface for DateInput, DateTimeInput, and TimeInput
|
|
7
8
|
* @position Shared presentation vocabulary (AST-043)
|
|
8
9
|
*
|
|
@@ -113,6 +114,25 @@ export function effectiveInputPresentation(
|
|
|
113
114
|
return DEFAULT_INPUT_PRESENTATION;
|
|
114
115
|
}
|
|
115
116
|
|
|
117
|
+
/**
|
|
118
|
+
* The policy a date picker follows in its calendar. `<input type="date">` is
|
|
119
|
+
* Gregorian, so in a calendar it cannot show, the policies that use it
|
|
120
|
+
* (`native` and `adaptive-native`) use the Astryx popover on a fine pointer and
|
|
121
|
+
* the bottom sheet on a coarse one instead.
|
|
122
|
+
*/
|
|
123
|
+
export function calendarPickerPresentation(
|
|
124
|
+
presentation: PickerPresentation,
|
|
125
|
+
isNativeCalendar: boolean,
|
|
126
|
+
): PickerPresentation {
|
|
127
|
+
if (
|
|
128
|
+
!isNativeCalendar &&
|
|
129
|
+
(presentation === 'native' || presentation === 'adaptive-native')
|
|
130
|
+
) {
|
|
131
|
+
return 'adaptive-bottom-sheet';
|
|
132
|
+
}
|
|
133
|
+
return presentation;
|
|
134
|
+
}
|
|
135
|
+
|
|
116
136
|
/** Resolve a picker-only policy to the surface rendered for the current pointer. */
|
|
117
137
|
export function resolvePickerPresentation(
|
|
118
138
|
presentation: PickerPresentation,
|
package/src/utils/inputStream.ts
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* @file inputStream.ts
|
|
5
5
|
* @input A window, and subscribers to its input events (the press feedback
|
|
6
6
|
* controller, the gesture host)
|
|
7
|
-
* @output subscribeInput
|
|
7
|
+
* @output subscribeInput, and getLastPointerType: the type of the latest
|
|
8
|
+
* pointer event the stream delivered
|
|
8
9
|
* @position The one entry for document-wide input listeners in core: one
|
|
9
10
|
* native listener per event type on the window's capture phase, shared by
|
|
10
11
|
* every subscriber
|
|
@@ -22,18 +23,21 @@
|
|
|
22
23
|
// `blur` or `focus`. A subscriber for the window's own event checks
|
|
23
24
|
// `event.target`.
|
|
24
25
|
//
|
|
25
|
-
// Subscribers run in subscription order
|
|
26
|
-
// the
|
|
26
|
+
// Subscribers run in subscription order, after the ones subscribed `first`.
|
|
27
|
+
// A first subscriber that returns `true` ends the dispatch: no later
|
|
28
|
+
// subscriber hears the event. One that throws is reported, and the rest still
|
|
29
|
+
// run.
|
|
27
30
|
//
|
|
28
31
|
// A type's native listener is passive, so it blocks no scroll. It is
|
|
29
32
|
// non-passive only while a subscriber that cancels the event
|
|
30
33
|
// (`{cancels: true}`) is subscribed. With no subscriber left, it is removed.
|
|
31
34
|
|
|
32
|
-
type InputListener = (event: Event) =>
|
|
35
|
+
type InputListener = (event: Event) => unknown;
|
|
33
36
|
|
|
34
37
|
interface Subscriber {
|
|
35
38
|
readonly listener: InputListener;
|
|
36
39
|
readonly cancels: boolean;
|
|
40
|
+
readonly isFirst: boolean;
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
interface Channel {
|
|
@@ -50,12 +54,30 @@ export interface InputSubscriptionOptions {
|
|
|
50
54
|
* @default false
|
|
51
55
|
*/
|
|
52
56
|
readonly cancels?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* The subscriber runs before every subscriber that is not first. When it
|
|
59
|
+
* returns `true`, no later subscriber hears the event.
|
|
60
|
+
* @default false
|
|
61
|
+
*/
|
|
62
|
+
readonly first?: boolean;
|
|
53
63
|
}
|
|
54
64
|
|
|
55
65
|
/** The events a window's capture phase sees: its own, and the document's. */
|
|
56
66
|
export type InputEventMap = WindowEventMap & DocumentEventMap;
|
|
57
67
|
|
|
58
68
|
const streams = new WeakMap<Window, Map<string, Channel>>();
|
|
69
|
+
/** The type of the latest pointer event each window's stream delivered. */
|
|
70
|
+
const lastPointerTypes = new WeakMap<Window, string>();
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The type of the latest pointer event `view`'s stream delivered: `mouse`,
|
|
74
|
+
* `pen` or `touch`, or `null` before any. The stream hears a pointer event
|
|
75
|
+
* type only while a subscriber listens to it, as press feedback does on any
|
|
76
|
+
* page with a pressable. Reading it adds no listener.
|
|
77
|
+
*/
|
|
78
|
+
export function getLastPointerType(view: Window): string | null {
|
|
79
|
+
return lastPointerTypes.get(view) ?? null;
|
|
80
|
+
}
|
|
59
81
|
|
|
60
82
|
/**
|
|
61
83
|
* Listen to `type` on `view`'s capture phase through its shared native
|
|
@@ -64,8 +86,8 @@ const streams = new WeakMap<Window, Map<string, Channel>>();
|
|
|
64
86
|
export function subscribeInput<K extends keyof InputEventMap>(
|
|
65
87
|
view: Window,
|
|
66
88
|
type: K,
|
|
67
|
-
listener: (event: InputEventMap[K]) =>
|
|
68
|
-
{cancels = false}: InputSubscriptionOptions = {},
|
|
89
|
+
listener: (event: InputEventMap[K]) => unknown,
|
|
90
|
+
{cancels = false, first = false}: InputSubscriptionOptions = {},
|
|
69
91
|
): () => void {
|
|
70
92
|
let channels = streams.get(view);
|
|
71
93
|
if (channels == null) {
|
|
@@ -80,8 +102,16 @@ export function subscribeInput<K extends keyof InputEventMap>(
|
|
|
80
102
|
const subscriber: Subscriber = {
|
|
81
103
|
listener: listener as InputListener,
|
|
82
104
|
cancels,
|
|
105
|
+
isFirst: first,
|
|
83
106
|
};
|
|
84
|
-
|
|
107
|
+
const firstLater = first
|
|
108
|
+
? channel.subscribers.findIndex(other => !other.isFirst)
|
|
109
|
+
: -1;
|
|
110
|
+
if (firstLater === -1) {
|
|
111
|
+
channel.subscribers.push(subscriber);
|
|
112
|
+
} else {
|
|
113
|
+
channel.subscribers.splice(firstLater, 0, subscriber);
|
|
114
|
+
}
|
|
85
115
|
register(view, type, channel);
|
|
86
116
|
let isSubscribed = true;
|
|
87
117
|
return () => {
|
|
@@ -124,12 +154,17 @@ function register(view: Window, type: string, channel: Channel): void {
|
|
|
124
154
|
if (wanted == null) {
|
|
125
155
|
return;
|
|
126
156
|
}
|
|
127
|
-
const listener: InputListener = event => dispatch(channel, event);
|
|
157
|
+
const listener: InputListener = event => dispatch(view, channel, event);
|
|
128
158
|
view.addEventListener(type, listener, {capture: true, passive: !wanted});
|
|
129
159
|
channel.native = {listener, cancels: wanted};
|
|
130
160
|
}
|
|
131
161
|
|
|
132
|
-
function dispatch(channel: Channel, event: Event): void {
|
|
162
|
+
function dispatch(view: Window, channel: Channel, event: Event): void {
|
|
163
|
+
// Recorded before any subscriber runs, so each reads the pointer at hand.
|
|
164
|
+
const {pointerType} = event as Partial<PointerEvent>;
|
|
165
|
+
if (typeof pointerType === 'string' && pointerType !== '') {
|
|
166
|
+
lastPointerTypes.set(view, pointerType);
|
|
167
|
+
}
|
|
133
168
|
// A subscriber may subscribe or unsubscribe while the event runs; the
|
|
134
169
|
// event goes to those subscribed when it arrived.
|
|
135
170
|
for (const subscriber of [...channel.subscribers]) {
|
|
@@ -137,7 +172,9 @@ function dispatch(channel: Channel, event: Event): void {
|
|
|
137
172
|
continue;
|
|
138
173
|
}
|
|
139
174
|
try {
|
|
140
|
-
subscriber.listener(event)
|
|
175
|
+
if (subscriber.listener(event) === true && subscriber.isFirst) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
141
178
|
} catch (error) {
|
|
142
179
|
report(error);
|
|
143
180
|
}
|