@astryxdesign/core 0.7.7 → 0.7.8-canary.0588a13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/AlertDialog.d.ts +4 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +46 -6
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +11 -3
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +1 -0
- package/dist/BottomSheet/BottomSheetPanel.d.ts +1 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +55 -18
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
- package/dist/BottomSheet/bottomSheetStack.js +1 -1
- package/dist/BottomSheet/useSheetGestures.d.ts +3 -1
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +16 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +17 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +18 -22
- package/dist/Calendar/getWeekdayHeaderNames.d.ts +16 -0
- package/dist/Calendar/getWeekdayHeaderNames.d.ts.map +1 -0
- package/dist/Calendar/getWeekdayHeaderNames.js +70 -0
- package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
- package/dist/Calendar/hooks/useCalendarDays.js +2 -10
- package/dist/Calendar/{standaloneShortWeekdayNames.generated.d.ts → weekdayHeaderNames.generated.d.ts} +14 -14
- package/dist/Calendar/weekdayHeaderNames.generated.d.ts.map +1 -0
- package/dist/Calendar/{standaloneShortWeekdayNames.generated.js → weekdayHeaderNames.generated.js} +12 -12
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +2 -0
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +6 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +2 -1
- package/dist/Chat/useChatDictation.d.ts.map +1 -1
- package/dist/Chat/useChatDictation.js +2 -0
- package/dist/Chat/useChatNewMessages.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +2 -0
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +3 -0
- package/dist/Chat/useTriggerMenu.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +17 -12
- package/dist/CheckboxList/CheckboxList.d.ts +20 -2
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +12 -4
- package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListContext.js +2 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +14 -2
- package/dist/CheckboxList/requiredGroup.d.ts +22 -0
- package/dist/CheckboxList/requiredGroup.d.ts.map +1 -0
- package/dist/CheckboxList/requiredGroup.js +52 -0
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +28 -11
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +2 -0
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +2 -0
- package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +14 -4
- package/dist/ContextMenu/ContextMenu.js +2 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +5 -2
- package/dist/DateInput/PickerWheel.d.ts +19 -0
- package/dist/DateInput/PickerWheel.d.ts.map +1 -0
- package/dist/DateInput/PickerWheel.js +646 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +9 -30
- package/dist/DateInput/Wheel.d.ts +18 -37
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +133 -120
- package/dist/DateInput/datePickerTouch.d.ts +13 -0
- package/dist/DateInput/datePickerTouch.d.ts.map +1 -0
- package/dist/DateInput/datePickerTouch.js +14 -0
- package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
- package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
- package/dist/DateInput/useOwnScrollGesture.js +16 -3
- package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
- package/dist/DateInput/usePointerDragScroll.js +2 -0
- package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
- package/dist/DateInput/useScrollSettle.js +3 -0
- package/dist/DateInput/useWheelListbox.d.ts +59 -0
- package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
- package/dist/DateInput/useWheelListbox.js +88 -0
- package/dist/DateInput/wheelOptions.d.ts +94 -0
- package/dist/DateInput/wheelOptions.d.ts.map +1 -0
- package/dist/DateInput/wheelOptions.js +110 -0
- package/dist/DateInput/wheelPhysics.d.ts +127 -0
- package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
- package/dist/DateInput/wheelPhysics.js +341 -0
- package/dist/DateInput/wheelStrip.d.ts +92 -0
- package/dist/DateInput/wheelStrip.d.ts.map +1 -0
- package/dist/DateInput/wheelStrip.js +258 -0
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +70 -127
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -32
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +3 -0
- package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
- package/dist/DropdownMenu/useMenuOverflow.js +5 -0
- package/dist/Field/Field.js +2 -2
- package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
- package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
- package/dist/FormLayout/FormLayout.d.ts +5 -1
- package/dist/FormLayout/FormLayout.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.d.ts +6 -4
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +48 -3
- package/dist/HoverCard/useHoverCard.d.ts +5 -4
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +26 -34
- package/dist/Icon/Icon.d.ts +5 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +20 -3
- package/dist/InfoTip/InfoTip.d.ts +5 -5
- package/dist/InfoTip/InfoTip.d.ts.map +1 -1
- package/dist/InfoTip/InfoTip.js +58 -19
- package/dist/Item/useSwipeAction.d.ts.map +1 -1
- package/dist/Item/useSwipeAction.js +3 -0
- package/dist/Layer/modalOutlet.d.ts.map +1 -1
- package/dist/Layer/modalOutlet.js +2 -0
- package/dist/Layer/outsidePress.d.ts.map +1 -1
- package/dist/Layer/outsidePress.js +1 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +4 -1
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
- package/dist/Layer/useLayerDismissal.js +3 -0
- package/dist/Layer/useTouchTrigger.d.ts +13 -7
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +20 -6
- package/dist/Layout/index.d.ts +1 -1
- package/dist/Layout/index.d.ts.map +1 -1
- package/dist/Layout/index.js +1 -1
- package/dist/Layout/layoutReset.js +1 -1
- package/dist/Layout/overlayPaddingReset.stylex.d.ts +68 -0
- package/dist/Layout/overlayPaddingReset.stylex.d.ts.map +1 -0
- package/dist/Layout/overlayPaddingReset.stylex.js +72 -0
- package/dist/Layout/padding.stylex.d.ts +5 -129
- package/dist/Layout/padding.stylex.d.ts.map +1 -1
- package/dist/Layout/padding.stylex.js +9 -143
- package/dist/Layout/paddingStyles.stylex.d.ts +83 -0
- package/dist/Layout/paddingStyles.stylex.d.ts.map +1 -0
- package/dist/Layout/paddingStyles.stylex.js +99 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +20 -1
- package/dist/MobileNav/MobileNav.d.ts +3 -2
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +10 -26
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +2 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +2 -1
- package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromDOM.js +3 -0
- package/dist/Outline/useScrollSpy.d.ts.map +1 -1
- package/dist/Outline/useScrollSpy.js +3 -0
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -0
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +7 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -0
- package/dist/Popover/usePopover.js +2 -2
- package/dist/PowerSearch/PowerSearch.d.ts +41 -4
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +441 -134
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +125 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.js +2041 -0
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +43 -10
- package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
- package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
- package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchToken.js +3 -2
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +273 -86
- package/dist/PowerSearch/formatFilterValue.d.ts +14 -7
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +31 -23
- package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
- package/dist/PowerSearch/formatTokenValue.js +161 -0
- package/dist/PowerSearch/index.d.ts +1 -1
- package/dist/PowerSearch/index.d.ts.map +1 -1
- package/dist/PowerSearch/powerSearchDateZone.d.ts +25 -0
- package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchDateZone.js +57 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
- package/dist/PowerSearch/types.d.ts +8 -1
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBarTouch.js +2 -0
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +3 -2
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -3
- package/dist/Resizable/ResizeHandle.d.ts +2 -1
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +116 -92
- package/dist/Resizable/createResizable.d.ts +199 -0
- package/dist/Resizable/createResizable.d.ts.map +1 -0
- package/dist/Resizable/createResizable.js +733 -0
- package/dist/Resizable/separatorAttributes.d.ts +45 -0
- package/dist/Resizable/separatorAttributes.d.ts.map +1 -0
- package/dist/Resizable/separatorAttributes.js +35 -0
- package/dist/Resizable/useResizable.d.ts +3 -3
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +252 -459
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
- package/dist/SelectableCard/SelectableCard.d.ts +2 -0
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +36 -11
- package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
- package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
- package/dist/SelectableCard/selectableCardInput.js +20 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +7 -9
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +36 -5
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +16 -11
- package/dist/Slider/sliderTouchController.js +2 -2
- package/dist/Spinner/Spinner.d.ts +1 -1
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +60 -58
- package/dist/Stepper/Stepper.d.ts.map +1 -1
- package/dist/Stepper/Stepper.js +10 -15
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +4 -10
- package/dist/Switch/useSwitchTouch.js +4 -4
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +29 -8
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +12 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +17 -3
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +11 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +27 -14
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +2 -1
- package/dist/TextInput/TextInput.d.ts +2 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +12 -8
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +2 -0
- package/dist/TimeInput/TimeWheels.d.ts +32 -0
- package/dist/TimeInput/TimeWheels.d.ts.map +1 -0
- package/dist/TimeInput/TimeWheels.js +144 -0
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +63 -116
- package/dist/TimeInput/timeWheelRules.d.ts +124 -0
- package/dist/TimeInput/timeWheelRules.d.ts.map +1 -0
- package/dist/TimeInput/timeWheelRules.js +277 -0
- package/dist/Timer/Timer.d.ts.map +1 -1
- package/dist/Timer/Timer.js +2 -0
- package/dist/Timestamp/Timestamp.js +1 -1
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +1 -23
- package/dist/Toast/Toast.d.ts +11 -1
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -15
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +97 -34
- package/dist/Toast/types.d.ts +9 -3
- package/dist/Toast/types.d.ts.map +1 -1
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +1 -0
- package/dist/Tokenizer/Tokenizer.d.ts +44 -46
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -21
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +12 -18
- package/dist/Tokenizer/index.d.ts +1 -1
- package/dist/Tokenizer/index.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.d.ts +2 -23
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.js +5 -29
- package/dist/Tooltip/useTooltip.d.ts +23 -30
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +200 -108
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +27 -18
- package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/animator/createAnimator.d.ts +98 -0
- package/dist/animator/createAnimator.d.ts.map +1 -0
- package/dist/animator/createAnimator.js +259 -0
- package/dist/astryx.css +53 -8
- package/dist/gestures/GestureHost.d.ts +16 -1
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +4 -1
- package/dist/gestures/PressTracker.d.ts.map +1 -1
- package/dist/gestures/PressTracker.js +4 -3
- package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
- package/dist/hooks/ModalAnnounceProvider.js +1 -0
- package/dist/hooks/actionGroupTracker.d.ts +4 -1
- package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
- package/dist/hooks/actionGroupTracker.js +18 -7
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/longPressDetector.d.ts +66 -0
- package/dist/hooks/longPressDetector.d.ts.map +1 -0
- package/dist/hooks/longPressDetector.js +200 -0
- package/dist/hooks/pressGroupContext.d.ts +6 -0
- package/dist/hooks/pressGroupContext.d.ts.map +1 -0
- package/dist/hooks/pressGroupContext.js +20 -0
- package/dist/hooks/rootScrollStyles.d.ts +48 -0
- package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
- package/dist/hooks/rootScrollStyles.js +207 -0
- package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
- package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
- package/dist/hooks/scrollLockTouchGuard.js +117 -0
- package/dist/hooks/scrollbarGutter.d.ts +4 -4
- package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
- package/dist/hooks/scrollbarGutter.js +36 -23
- package/dist/hooks/useActionGroupTracking.d.ts +53 -0
- package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
- package/dist/hooks/useActionGroupTracking.js +174 -0
- package/dist/hooks/useAnimator.d.ts +41 -0
- package/dist/hooks/useAnimator.d.ts.map +1 -0
- package/dist/hooks/useAnimator.js +70 -0
- package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
- package/dist/hooks/useAnnounceRenderedText.js +1 -0
- package/dist/hooks/useAttachment.d.ts +1 -1
- package/dist/hooks/useAttachment.js +1 -1
- package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
- package/dist/hooks/useAutoMediaMode.js +1 -0
- package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
- package/dist/hooks/useBusyAnnouncement.js +2 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -1
- package/dist/hooks/useDevWarning.js +2 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +2 -0
- package/dist/hooks/useGridFocus.d.ts +8 -5
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +4 -3
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -0
- package/dist/hooks/useImageMode.d.ts.map +1 -1
- package/dist/hooks/useImageMode.js +3 -0
- package/dist/hooks/useInputStatusIcon.d.ts +1 -1
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +2 -2
- package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
- package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -1
- package/dist/hooks/useKeyboardHint.js +1 -1
- package/dist/hooks/useLongPress.d.ts +8 -9
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +23 -106
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +2 -0
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +3 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +2 -1
- package/dist/hooks/usePressFeedback.d.ts.map +1 -1
- package/dist/hooks/usePressFeedback.js +1 -0
- package/dist/hooks/useResolvedRequired.d.ts +3 -0
- package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
- package/dist/hooks/useResolvedRequired.js +3 -0
- package/dist/hooks/useScrollLock.d.ts +8 -9
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +50 -48
- package/dist/hooks/useScrollableArea.d.ts.map +1 -1
- package/dist/hooks/useScrollableArea.js +5 -0
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +3 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +45 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
- package/dist/i18n/generated-english/Resizable/createResizable.generated.d.ts +8 -0
- package/dist/i18n/generated-english/Resizable/createResizable.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/Resizable/createResizable.generated.js +13 -0
- package/dist/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.js +3 -1
- package/dist/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.js +3 -1
- package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.d.ts +8 -0
- package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.js +17 -0
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +37 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +37 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/internal/indicatorPress.stylex.d.ts +20 -0
- package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
- package/dist/internal/indicatorPress.stylex.js +26 -0
- package/dist/internal/selectable-card.d.ts +21 -0
- package/dist/internal/selectable-card.d.ts.map +1 -0
- package/dist/internal/selectable-card.js +20 -0
- package/dist/internal/sheetDraft.d.ts +2 -2
- package/dist/internal/sheetDraft.js +2 -2
- package/dist/keyboard/index.d.ts +17 -0
- package/dist/keyboard/index.d.ts.map +1 -0
- package/dist/keyboard/index.js +19 -0
- package/dist/keyboard/keyboardHeight.d.ts +149 -0
- package/dist/keyboard/keyboardHeight.d.ts.map +1 -0
- package/dist/keyboard/keyboardHeight.js +432 -0
- package/dist/keyboard/keyboardLayoutGuide.d.ts +59 -0
- package/dist/keyboard/keyboardLayoutGuide.d.ts.map +1 -0
- package/dist/keyboard/keyboardLayoutGuide.js +207 -0
- package/dist/keyboard/keyboardModel.d.ts +93 -0
- package/dist/keyboard/keyboardModel.d.ts.map +1 -0
- package/dist/keyboard/keyboardModel.js +220 -0
- package/dist/keyboard/rideKeyboard.d.ts +42 -0
- package/dist/keyboard/rideKeyboard.d.ts.map +1 -0
- package/dist/keyboard/rideKeyboard.js +77 -0
- package/dist/keyboard/useMobileKeyboard.d.ts +61 -0
- package/dist/keyboard/useMobileKeyboard.d.ts.map +1 -0
- package/dist/keyboard/useMobileKeyboard.js +699 -0
- package/dist/motion/android/index.d.ts +16 -0
- package/dist/motion/android/index.d.ts.map +1 -0
- package/dist/motion/android/index.js +18 -0
- package/dist/motion/android/keyboard.d.ts +83 -0
- package/dist/motion/android/keyboard.d.ts.map +1 -0
- package/dist/motion/android/keyboard.js +96 -0
- package/dist/motion/animatedLayout.d.ts +8 -0
- package/dist/motion/animatedLayout.d.ts.map +1 -1
- package/dist/motion/animatedLayout.js +246 -53
- package/dist/motion/animator.d.ts +14 -14
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +45 -26
- package/dist/motion/frameBlock.d.ts +14 -0
- package/dist/motion/frameBlock.d.ts.map +1 -0
- package/dist/motion/frameBlock.js +16 -0
- package/dist/motion/progress.d.ts +88 -0
- package/dist/motion/progress.d.ts.map +1 -0
- package/dist/motion/progress.js +128 -0
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +3 -1
- package/dist/motion/uikit/alert.d.ts +41 -0
- package/dist/motion/uikit/alert.d.ts.map +1 -0
- package/dist/motion/uikit/alert.js +43 -0
- package/dist/motion/uikit/datePicker.d.ts +58 -0
- package/dist/motion/uikit/datePicker.d.ts.map +1 -0
- package/dist/motion/uikit/datePicker.js +60 -0
- package/dist/motion/uikit/index.d.ts +6 -4
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +6 -4
- package/dist/motion/uikit/picker.d.ts +96 -0
- package/dist/motion/uikit/picker.d.ts.map +1 -0
- package/dist/motion/uikit/picker.js +117 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
- package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
- package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +29 -4
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +14 -13
- package/dist/theme/motionKnobs.d.ts +4 -3
- package/dist/theme/motionKnobs.d.ts.map +1 -1
- package/dist/theme/motionKnobs.js +3 -2
- package/dist/theme/themeMotion.d.ts +6 -0
- package/dist/theme/themeMotion.d.ts.map +1 -1
- package/dist/theme/themeMotion.js +15 -2
- package/dist/theme/tokens.stylex.d.ts +3 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +4 -1
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +12 -0
- package/dist/utils/disabledInteraction.d.ts +10 -2
- package/dist/utils/disabledInteraction.d.ts.map +1 -1
- package/dist/utils/disabledInteraction.js +16 -2
- package/dist/utils/focusReturn.d.ts +22 -25
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +36 -29
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +4 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +6 -4
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +6 -4
- package/dist/utils/isFocusDetached.d.ts +27 -0
- package/dist/utils/isFocusDetached.d.ts.map +1 -0
- package/dist/utils/isFocusDetached.js +32 -0
- package/dist/utils/layoutViewport.d.ts +25 -0
- package/dist/utils/layoutViewport.d.ts.map +1 -0
- package/dist/utils/layoutViewport.js +102 -0
- package/dist/utils/plainDate.d.ts +31 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +68 -4
- package/dist/utils/pressFeedback.d.ts +6 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +97 -18
- package/dist/utils/pressGesture.d.ts +4 -2
- package/dist/utils/pressGesture.d.ts.map +1 -1
- package/dist/utils/pressGesture.js +3 -1
- package/dist/utils/selectionLock.d.ts +10 -1
- package/dist/utils/selectionLock.d.ts.map +1 -1
- package/dist/utils/selectionLock.js +31 -5
- package/dist/utils/sharedMutationObserver.d.ts +2 -1
- package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
- package/dist/utils/sharedMutationObserver.js +2 -1
- package/dist/utils/timeParser.d.ts +2 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +29 -3
- package/dist/utils/triggerFocus.d.ts +36 -0
- package/dist/utils/triggerFocus.d.ts.map +1 -0
- package/dist/utils/triggerFocus.js +65 -0
- package/locales/en.json +148 -0
- package/locales/pseudo.json +111 -0
- package/package.json +14 -9
- package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
- package/src/AlertDialog/AlertDialog.tsx +46 -5
- package/src/AppShell/AppShell.tsx +13 -4
- package/src/BottomSheet/BottomSheet.doc.mjs +1 -1
- package/src/BottomSheet/BottomSheet.tsx +1 -0
- package/src/BottomSheet/BottomSheetPanel.tsx +80 -16
- package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +5 -0
- package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
- package/src/BottomSheet/bottomSheetStack.ts +1 -1
- package/src/BottomSheet/useSheetGestures.ts +16 -1
- package/src/Button/Button.tsx +26 -4
- package/src/Calendar/Calendar.tsx +40 -32
- package/src/Calendar/getWeekdayHeaderNames.ts +88 -0
- package/src/Calendar/hooks/useCalendarDays.ts +5 -10
- package/src/Calendar/{standaloneShortWeekdayNames.generated.ts → weekdayHeaderNames.generated.ts} +14 -14
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/ChatComposerInput.tsx +4 -7
- package/src/Chat/ChatMessageList.tsx +2 -1
- package/src/Chat/useChatDictation.ts +1 -0
- package/src/Chat/useChatNewMessages.ts +1 -1
- package/src/Chat/useChatStreamScroll.ts +2 -0
- package/src/Chat/useSpeechRecognition.ts +2 -0
- package/src/Chat/useTriggerMenu.tsx +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
- package/src/CheckboxInput/CheckboxInput.tsx +38 -15
- package/src/CheckboxList/CheckboxList.doc.mjs +14 -0
- package/src/CheckboxList/CheckboxList.tsx +43 -2
- package/src/CheckboxList/CheckboxListContext.tsx +9 -1
- package/src/CheckboxList/CheckboxListItem.tsx +23 -2
- package/src/CheckboxList/requiredGroup.ts +77 -0
- package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
- package/src/CodeBlock/CodeBlock.tsx +41 -4
- package/src/CommandPalette/CommandPalette.tsx +1 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
- package/src/ComplexSelector/ComplexSelector.tsx +20 -5
- package/src/ContextMenu/ContextMenu.tsx +2 -2
- package/src/DateInput/MonthScroller.tsx +8 -2
- package/src/DateInput/PickerWheel.tsx +796 -0
- package/src/DateInput/TouchDateField.tsx +6 -32
- package/src/DateInput/Wheel.tsx +188 -171
- package/src/DateInput/datePickerTouch.ts +15 -0
- package/src/DateInput/useOwnScrollGesture.ts +25 -3
- package/src/DateInput/usePointerDragScroll.ts +1 -0
- package/src/DateInput/useScrollSettle.ts +2 -0
- package/src/DateInput/useWheelListbox.ts +112 -0
- package/src/DateInput/wheelOptions.ts +184 -0
- package/src/DateInput/wheelPhysics.ts +406 -0
- package/src/DateInput/wheelStrip.ts +341 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +100 -189
- package/src/Dialog/Dialog.tsx +12 -32
- package/src/Drawer/useDrawerDialogPresence.ts +2 -0
- package/src/DropdownMenu/useMenuOverflow.ts +3 -0
- package/src/Field/Field.tsx +2 -2
- package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
- package/src/FormLayout/FormLayout.doc.mjs +181 -46
- package/src/FormLayout/FormLayout.tsx +5 -1
- package/src/HoverCard/HoverCard.doc.mjs +10 -8
- package/src/HoverCard/HoverCard.tsx +58 -6
- package/src/HoverCard/useHoverCard.doc.mjs +178 -36
- package/src/HoverCard/useHoverCard.tsx +55 -55
- package/src/Icon/Icon.doc.mjs +51 -10
- package/src/Icon/Icon.tsx +31 -8
- package/src/IconButton/IconButton.doc.mjs +141 -21
- package/src/InfoTip/InfoTip.tsx +72 -16
- package/src/Item/useSwipeAction.ts +2 -0
- package/src/Layer/modalOutlet.ts +2 -0
- package/src/Layer/outsidePress.ts +1 -0
- package/src/Layer/useLayer.tsx +3 -1
- package/src/Layer/useLayerDismissal.ts +2 -0
- package/src/Layer/useTouchTrigger.ts +19 -6
- package/src/Layout/index.ts +1 -1
- package/src/Layout/layoutReset.ts +1 -1
- package/src/Layout/overlayPaddingReset.stylex.ts +73 -0
- package/src/Layout/padding.stylex.ts +9 -133
- package/src/Layout/paddingStyles.stylex.ts +87 -0
- package/src/Lightbox/Lightbox.tsx +20 -1
- package/src/Lightbox/useLightbox.doc.mjs +167 -0
- package/src/MobileNav/MobileNav.tsx +10 -31
- package/src/MultiSelector/MultiSelector.tsx +2 -7
- package/src/NumberInput/NumberInput.tsx +2 -7
- package/src/Outline/useOutlineFromDOM.ts +2 -0
- package/src/Outline/useScrollSpy.ts +2 -0
- package/src/OverflowList/OverflowList.tsx +2 -0
- package/src/Overlay/Overlay.tsx +7 -2
- package/src/Popover/Popover.tsx +4 -0
- package/src/Popover/usePopover.tsx +2 -2
- package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
- package/src/PowerSearch/PowerSearch.tsx +622 -157
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +2700 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +65 -9
- package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
- package/src/PowerSearch/PowerSearchToken.tsx +2 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +340 -59
- package/src/PowerSearch/formatFilterValue.ts +49 -27
- package/src/PowerSearch/formatTokenValue.ts +220 -0
- package/src/PowerSearch/index.ts +5 -1
- package/src/PowerSearch/powerSearchDateZone.ts +95 -0
- package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
- package/src/PowerSearch/types.ts +8 -1
- package/src/ProgressBar/ProgressBarTouch.ts +2 -0
- package/src/RadioList/RadioList.tsx +3 -2
- package/src/RadioList/RadioListItem.tsx +5 -3
- package/src/Resizable/Resizable.doc.mjs +5 -4
- package/src/Resizable/ResizeHandle.tsx +187 -135
- package/src/Resizable/createResizable.ts +1046 -0
- package/src/Resizable/separatorAttributes.ts +73 -0
- package/src/Resizable/useResizable.ts +292 -623
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
- package/src/SelectableCard/SelectableCard.tsx +39 -10
- package/src/SelectableCard/selectableCardInput.ts +30 -0
- package/src/Selector/Selector.tsx +7 -19
- package/src/SideNav/SideNav.tsx +41 -5
- package/src/Slider/Slider.tsx +20 -11
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Spinner/Spinner.tsx +77 -63
- package/src/Stepper/Stepper.tsx +10 -27
- package/src/Switch/Switch.tsx +2 -6
- package/src/Switch/useSwitchTouch.ts +4 -4
- package/src/Table/BaseTable.tsx +46 -12
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
- package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +31 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
- package/src/Table/plugins/tree/useTableTreeData.tsx +43 -20
- package/src/Table/useTableRowExpansion.doc.mjs +9 -0
- package/src/Table/useTableTreeData.doc.mjs +15 -3
- package/src/TextArea/TextArea.tsx +2 -7
- package/src/TextInput/TextInput.tsx +13 -17
- package/src/TimeInput/TimeInput.tsx +2 -0
- package/src/TimeInput/TimeWheels.tsx +218 -0
- package/src/TimeInput/TouchTimeField.tsx +93 -155
- package/src/TimeInput/timeWheelRules.ts +352 -0
- package/src/Timer/Timer.tsx +1 -0
- package/src/Timestamp/Timestamp.tsx +1 -1
- package/src/Timestamp/formatInstant.ts +1 -33
- package/src/Toast/Toast.doc.mjs +4 -3
- package/src/Toast/Toast.tsx +52 -32
- package/src/Toast/ToastViewport.tsx +123 -35
- package/src/Toast/types.ts +9 -3
- package/src/Toast/useToast.tsx +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +10 -10
- package/src/Tokenizer/Tokenizer.tsx +61 -62
- package/src/Tokenizer/TokenizerBottomSheet.tsx +17 -23
- package/src/Tokenizer/index.ts +1 -0
- package/src/Tooltip/Tooltip.tsx +6 -42
- package/src/Tooltip/useTooltip.doc.mjs +24 -0
- package/src/Tooltip/useTooltip.tsx +243 -134
- package/src/Typeahead/BaseTypeahead.tsx +27 -17
- package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/animator/createAnimator.doc.mjs +153 -0
- package/src/animator/createAnimator.ts +324 -0
- package/src/gestures/GestureHost.ts +6 -5
- package/src/gestures/PressTracker.ts +4 -3
- package/src/gestures/README.md +10 -4
- package/src/hooks/ModalAnnounceProvider.tsx +1 -0
- package/src/hooks/actionGroupTracker.ts +25 -9
- package/src/hooks/index.ts +2 -0
- package/src/hooks/longPressDetector.ts +273 -0
- package/src/hooks/pressGroupContext.ts +21 -0
- package/src/hooks/rootScrollStyles.ts +247 -0
- package/src/hooks/scrollLockTouchGuard.ts +149 -0
- package/src/hooks/scrollbarGutter.ts +41 -26
- package/src/hooks/useActionGroupTracking.ts +224 -0
- package/src/hooks/useAnimator.doc.mjs +109 -0
- package/src/hooks/useAnimator.ts +67 -0
- package/src/hooks/useAnnounceRenderedText.ts +1 -0
- package/src/hooks/useAttachment.ts +1 -1
- package/src/hooks/useAutoMediaMode.ts +1 -0
- package/src/hooks/useBusyAnnouncement.ts +2 -0
- package/src/hooks/useDevWarning.ts +2 -0
- package/src/hooks/useFocusTrap.ts +2 -0
- package/src/hooks/useGridFocus.doc.mjs +6 -6
- package/src/hooks/useGridFocus.ts +10 -7
- package/src/hooks/useHotkeys.ts +2 -0
- package/src/hooks/useImageMode.ts +2 -0
- package/src/hooks/useInputStatusIcon.tsx +3 -2
- package/src/hooks/useKeyboardHint.tsx +1 -1
- package/src/hooks/useLongPress.doc.mjs +2 -2
- package/src/hooks/useLongPress.ts +32 -122
- package/src/hooks/useMenuHover.ts +1 -0
- package/src/hooks/useMenuPress.ts +2 -0
- package/src/hooks/useOverflow.ts +2 -1
- package/src/hooks/usePressFeedback.ts +1 -0
- package/src/hooks/useResolvedRequired.ts +3 -0
- package/src/hooks/useScrollLock.doc.mjs +51 -12
- package/src/hooks/useScrollLock.ts +53 -60
- package/src/hooks/useScrollableArea.ts +4 -0
- package/src/hooks/useStreamingText.ts +2 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +46 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
- package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
- package/src/i18n/generated-english/Resizable/createResizable.generated.ts +14 -0
- package/src/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.ts +3 -1
- package/src/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.ts +3 -1
- package/src/i18n/generated-english/TimeInput/TimeWheels.generated.ts +18 -0
- package/src/i18n/generated-locales/en.generated.ts +47 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +48 -0
- package/src/index.ts +13 -0
- package/src/internal/indicatorPress.stylex.ts +24 -0
- package/src/internal/selectable-card.ts +21 -0
- package/src/internal/sheetDraft.ts +2 -2
- package/src/keyboard/README.md +197 -0
- package/src/keyboard/index.ts +48 -0
- package/src/keyboard/keyboardHeight.ts +543 -0
- package/src/keyboard/keyboardLayoutGuide.ts +266 -0
- package/src/keyboard/keyboardModel.ts +301 -0
- package/src/keyboard/rideKeyboard.ts +100 -0
- package/src/keyboard/useMobileKeyboard.ts +866 -0
- package/src/motion/MEASUREMENTS.md +28 -0
- package/src/motion/README.md +12 -5
- package/src/motion/android/index.ts +18 -0
- package/src/motion/android/keyboard.ts +96 -0
- package/src/motion/animatedLayout.ts +323 -60
- package/src/motion/animator.ts +66 -37
- package/src/motion/frameBlock.ts +16 -0
- package/src/motion/progress.ts +155 -0
- package/src/motion/reducedMotion.ts +3 -1
- package/src/motion/uikit/alert.ts +43 -0
- package/src/motion/uikit/datePicker.ts +60 -0
- package/src/motion/uikit/index.ts +6 -4
- package/src/motion/uikit/picker.ts +116 -0
- package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
- package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
- package/src/theme/Theme.tsx +37 -3
- package/src/theme/generateThemeRules.ts +14 -12
- package/src/theme/motionKnobs.ts +4 -3
- package/src/theme/themeMotion.ts +17 -2
- package/src/theme/tokens.stylex.ts +2 -0
- package/src/utils/dateParser.ts +16 -0
- package/src/utils/disabledInteraction.ts +23 -2
- package/src/utils/focusReturn.ts +38 -31
- package/src/utils/index.ts +1 -1
- package/src/utils/interactionModality.ts +4 -0
- package/src/utils/interactionOverlay.stylex.ts +6 -4
- package/src/utils/isFocusDetached.ts +34 -0
- package/src/utils/layoutViewport.ts +104 -0
- package/src/utils/plainDate.ts +80 -4
- package/src/utils/pressFeedback.ts +126 -30
- package/src/utils/pressGesture.ts +4 -2
- package/src/utils/selectionLock.ts +40 -6
- package/src/utils/sharedMutationObserver.ts +2 -1
- package/src/utils/timeParser.ts +40 -3
- package/src/utils/triggerFocus.ts +80 -0
- package/dist/BottomSheet/useMobileKeyboard.d.ts +0 -21
- package/dist/BottomSheet/useMobileKeyboard.d.ts.map +0 -1
- package/dist/BottomSheet/useMobileKeyboard.js +0 -407
- package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +0 -14
- package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +0 -1
- package/dist/Calendar/getStandaloneShortWeekdayNames.js +0 -26
- package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +0 -1
- package/dist/Layer/usePressPin.d.ts +0 -93
- package/dist/Layer/usePressPin.d.ts.map +0 -1
- package/dist/Layer/usePressPin.js +0 -363
- package/dist/internal/touch-sheet.d.ts +0 -21
- package/dist/internal/touch-sheet.d.ts.map +0 -1
- package/dist/internal/touch-sheet.js +0 -19
- package/src/BottomSheet/useMobileKeyboard.ts +0 -538
- package/src/Calendar/getStandaloneShortWeekdayNames.ts +0 -38
- package/src/Layer/usePressPin.ts +0 -510
- package/src/internal/touch-sheet.ts +0 -21
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file keyboardHeight.ts
|
|
7
|
+
* @input The visual viewport, the window's input stream (focus, blur,
|
|
8
|
+
* resize, scroll and touch), and the layout viewport's height
|
|
9
|
+
* @output The on-screen keyboard module: measureKeyboardHeight,
|
|
10
|
+
* isKeyboardMeasurable, subscribeKeyboardHeight, getKeyboardHeight,
|
|
11
|
+
* isTextEntryControl, findTextEntryControl, refuseFocusReveal and
|
|
12
|
+
* watchRevealPan
|
|
13
|
+
* @position Core's one source for the on-screen keyboard. It is internal to
|
|
14
|
+
* core and never exported from the package.
|
|
15
|
+
*
|
|
16
|
+
* SYNC: When modified, update /packages/core/src/keyboard/README.md
|
|
17
|
+
*/
|
|
18
|
+
import { subscribeInput } from "../utils/inputStream.js";
|
|
19
|
+
import { layoutViewportHeight } from "../utils/layoutViewport.js";
|
|
20
|
+
|
|
21
|
+
// A shortfall smaller than this is rounding, not a keyboard.
|
|
22
|
+
export const KEYBOARD_EPSILON = 1;
|
|
23
|
+
const NON_TEXT_INPUT_TYPES = new Set(['button', 'checkbox', 'color', 'file', 'hidden', 'image', 'radio', 'range', 'reset', 'submit']);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Whether this window measures the keyboard: a top-level document with a
|
|
27
|
+
* visual viewport. Capabilities decide it, never the user agent or the
|
|
28
|
+
* pointer. The module measures a browser with its own keyboard geometry API,
|
|
29
|
+
* such as Chrome on Android with the VirtualKeyboard API, the same way.
|
|
30
|
+
* Its visual viewport shrinks for the keyboard while the layout viewport keeps
|
|
31
|
+
* its height, as everywhere else. A desktop browser's visual viewport never
|
|
32
|
+
* shrinks for a keyboard, so it reads 0. Where the app sets
|
|
33
|
+
* `interactive-widget=resizes-content`, Chrome shrinks the layout viewport
|
|
34
|
+
* with the keyboard. The height is then 0 too, and nothing rides, because the
|
|
35
|
+
* browser has made the room itself.
|
|
36
|
+
*/
|
|
37
|
+
export function isKeyboardMeasurable(win) {
|
|
38
|
+
return win.visualViewport != null && win.self === win.top;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The on-screen keyboard's height over the layout viewport, CSS px. It is 0
|
|
43
|
+
* when none is shown, also while pinch-zoomed, and wherever
|
|
44
|
+
* `isKeyboardMeasurable` is false.
|
|
45
|
+
*/
|
|
46
|
+
export function measureKeyboardHeight(win) {
|
|
47
|
+
const viewport = win.visualViewport;
|
|
48
|
+
if (viewport == null || !isKeyboardMeasurable(win)) {
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
const height = layoutViewportHeight(win) - viewport.height * (viewport.scale ?? 1);
|
|
52
|
+
return height > KEYBOARD_EPSILON ? Math.round(height * 100) / 100 : 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** A report from the keyboard module, in the order the window raised them. */
|
|
56
|
+
|
|
57
|
+
const stores = new WeakMap();
|
|
58
|
+
|
|
59
|
+
// A window's capture phase also hears its document's events. A window's own
|
|
60
|
+
// event has no node as its target.
|
|
61
|
+
export function isNodeTarget(target) {
|
|
62
|
+
return target != null && typeof target.nodeType === 'number';
|
|
63
|
+
}
|
|
64
|
+
function storeOf(win) {
|
|
65
|
+
let store = stores.get(win);
|
|
66
|
+
if (store == null) {
|
|
67
|
+
store = {
|
|
68
|
+
height: 0,
|
|
69
|
+
listeners: new Set(),
|
|
70
|
+
focusListeners: new Set(),
|
|
71
|
+
detach: null,
|
|
72
|
+
detachFocus: null
|
|
73
|
+
};
|
|
74
|
+
stores.set(win, store);
|
|
75
|
+
}
|
|
76
|
+
return store;
|
|
77
|
+
}
|
|
78
|
+
function attach(win, store) {
|
|
79
|
+
const viewport = win.visualViewport;
|
|
80
|
+
store.height = measureKeyboardHeight(win);
|
|
81
|
+
const onViewport = event => {
|
|
82
|
+
store.height = measureKeyboardHeight(win);
|
|
83
|
+
const report = {
|
|
84
|
+
type: 'viewport',
|
|
85
|
+
height: store.height,
|
|
86
|
+
timeStamp: event.timeStamp
|
|
87
|
+
};
|
|
88
|
+
for (const listener of [...store.listeners]) {
|
|
89
|
+
listener(report);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
viewport?.addEventListener('resize', onViewport);
|
|
93
|
+
viewport?.addEventListener('scroll', onViewport);
|
|
94
|
+
// Only the window's own resize reports.
|
|
95
|
+
const stopResize = subscribeInput(win, 'resize', event => {
|
|
96
|
+
if (!isNodeTarget(event.target)) {
|
|
97
|
+
onViewport(event);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
return () => {
|
|
101
|
+
viewport?.removeEventListener('resize', onViewport);
|
|
102
|
+
viewport?.removeEventListener('scroll', onViewport);
|
|
103
|
+
stopResize();
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Focus moves are heard only while a subscriber asks for them. A viewport
|
|
108
|
+
// reader, such as a Tall BottomSheet's hook under any pointer, adds no focus
|
|
109
|
+
// listener.
|
|
110
|
+
function attachFocus(win, store) {
|
|
111
|
+
const onFocus = event => {
|
|
112
|
+
const report = {
|
|
113
|
+
type: event.type === 'focusin' ? 'focusin' : 'focusout',
|
|
114
|
+
height: store.height,
|
|
115
|
+
timeStamp: event.timeStamp,
|
|
116
|
+
target: event.target,
|
|
117
|
+
relatedTarget: event.relatedTarget
|
|
118
|
+
};
|
|
119
|
+
for (const listener of [...store.focusListeners]) {
|
|
120
|
+
listener(report);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const stopFocusIn = subscribeInput(win, 'focusin', onFocus);
|
|
124
|
+
const stopFocusOut = subscribeInput(win, 'focusout', onFocus);
|
|
125
|
+
return () => {
|
|
126
|
+
stopFocusIn();
|
|
127
|
+
stopFocusOut();
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Calls `listener` with every report of `win`'s keyboard until the caller
|
|
133
|
+
* runs the returned function. It reports the viewport's changes, and focus
|
|
134
|
+
* moves too when the caller sets `focus`. All subscribers of a window share
|
|
135
|
+
* one set of listeners, and its focus listeners exist only while a subscriber
|
|
136
|
+
* asks for focus moves.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```
|
|
140
|
+
* const stop = subscribeKeyboardHeight(window, event => {
|
|
141
|
+
* if (event.type === 'viewport') layout(event.height);
|
|
142
|
+
* });
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export function subscribeKeyboardHeight(win, listener, {
|
|
146
|
+
focus = false
|
|
147
|
+
} = {}) {
|
|
148
|
+
const store = storeOf(win);
|
|
149
|
+
store.listeners.add(listener);
|
|
150
|
+
if (store.detach == null) {
|
|
151
|
+
store.detach = attach(win, store);
|
|
152
|
+
}
|
|
153
|
+
if (focus) {
|
|
154
|
+
store.focusListeners.add(listener);
|
|
155
|
+
if (store.detachFocus == null) {
|
|
156
|
+
store.detachFocus = attachFocus(win, store);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return () => {
|
|
160
|
+
store.listeners.delete(listener);
|
|
161
|
+
if (focus) {
|
|
162
|
+
store.focusListeners.delete(listener);
|
|
163
|
+
if (store.focusListeners.size === 0 && store.detachFocus != null) {
|
|
164
|
+
store.detachFocus();
|
|
165
|
+
store.detachFocus = null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (store.listeners.size === 0 && store.detach != null) {
|
|
169
|
+
store.detach();
|
|
170
|
+
store.detach = null;
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* `win`'s keyboard height. While the module listens, it is the height
|
|
177
|
+
* measured at the last report. Every reader of a keyboard change, such as
|
|
178
|
+
* each component's hook, shares that one layout read. Every change of the
|
|
179
|
+
* visual viewport or the window is a report, so a reader between two reports
|
|
180
|
+
* sees the current height. With nothing listening yet, the call measures the
|
|
181
|
+
* height now.
|
|
182
|
+
*/
|
|
183
|
+
export function getKeyboardHeight(win) {
|
|
184
|
+
const store = stores.get(win);
|
|
185
|
+
return store?.detach != null ? store.height : measureKeyboardHeight(win);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Whether focusing `element` brings up a keyboard for typing text. A control
|
|
190
|
+
* with `inputmode="none"` brings up none.
|
|
191
|
+
*/
|
|
192
|
+
export function isTextEntryControl(element) {
|
|
193
|
+
if (element instanceof HTMLElement && element.getAttribute('inputmode') === 'none') {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
if (element instanceof HTMLTextAreaElement) {
|
|
197
|
+
return !element.disabled && !element.readOnly;
|
|
198
|
+
}
|
|
199
|
+
if (element instanceof HTMLInputElement) {
|
|
200
|
+
return !element.disabled && !element.readOnly && !NON_TEXT_INPUT_TYPES.has((element.getAttribute('type') ?? 'text').toLowerCase());
|
|
201
|
+
}
|
|
202
|
+
return element instanceof HTMLElement && element.matches('[contenteditable]:not([contenteditable="false"])');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** The text-entry control inside `container` that `target` is or labels. */
|
|
206
|
+
export function findTextEntryControl(target, container) {
|
|
207
|
+
if (!(target instanceof Element)) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
const direct = target.closest('input, textarea, [contenteditable]:not([contenteditable="false"])');
|
|
211
|
+
if (container.contains(direct) && isTextEntryControl(direct)) {
|
|
212
|
+
return direct;
|
|
213
|
+
}
|
|
214
|
+
const label = target.closest('label');
|
|
215
|
+
const control = label instanceof HTMLLabelElement ? label.control : null;
|
|
216
|
+
return container.contains(control) && isTextEntryControl(control) ? control : null;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** The caller's rules for refuseFocusReveal. */
|
|
220
|
+
|
|
221
|
+
// One shared `blur` subscription per document serves every caller of
|
|
222
|
+
// refuseFocusReveal in it, so listeners do not grow with the number of
|
|
223
|
+
// instances. The first caller adds it, and the last removes it.
|
|
224
|
+
const focusTakeovers = new WeakMap();
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Delivers the focus moves `claim` accepts with `preventScroll`, so the
|
|
228
|
+
* browser never reveals their destination itself. It stops when the caller
|
|
229
|
+
* runs the returned function.
|
|
230
|
+
*
|
|
231
|
+
* The browser dispatches `blur` in the capture phase ahead of its own focus
|
|
232
|
+
* step, and `blur` names the destination in `relatedTarget`. Focusing it there
|
|
233
|
+
* with preventScroll settles the change. The browser's step then finds the
|
|
234
|
+
* element already active, so it dispatches nothing further and reveals
|
|
235
|
+
* nothing.
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* ```
|
|
239
|
+
* const stop = refuseFocusReveal(document, {
|
|
240
|
+
* claim: target => findTextEntryControl(target, body),
|
|
241
|
+
* park: () => sheet.focus({preventScroll: true}),
|
|
242
|
+
* });
|
|
243
|
+
* ```
|
|
244
|
+
*/
|
|
245
|
+
export function refuseFocusReveal(doc, {
|
|
246
|
+
isActive,
|
|
247
|
+
claim,
|
|
248
|
+
park
|
|
249
|
+
}) {
|
|
250
|
+
const onBlur = event => {
|
|
251
|
+
if (isActive != null && !isActive()) {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const destination = claim(event.relatedTarget);
|
|
255
|
+
if (destination != null) {
|
|
256
|
+
if (destination !== doc.activeElement) {
|
|
257
|
+
destination.focus({
|
|
258
|
+
preventScroll: true
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (event.relatedTarget == null) {
|
|
264
|
+
park?.(event.target);
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
let shared = focusTakeovers.get(doc);
|
|
268
|
+
if (shared == null) {
|
|
269
|
+
const view = doc.defaultView;
|
|
270
|
+
if (view == null) {
|
|
271
|
+
return () => {};
|
|
272
|
+
}
|
|
273
|
+
const callers = new Set();
|
|
274
|
+
// Callers hear each blur in the order they came, as separate listeners
|
|
275
|
+
// would; one that stopped during this blur no longer hears it.
|
|
276
|
+
const listener = event => {
|
|
277
|
+
for (const caller of [...callers]) {
|
|
278
|
+
if (callers.has(caller)) {
|
|
279
|
+
caller(event);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
// `blur` does not bubble: only the capture phase hears every one, and it
|
|
284
|
+
// runs before the browser's own focus step. The window's own blur moves
|
|
285
|
+
// no focus inside the document.
|
|
286
|
+
const stop = subscribeInput(view, 'blur', event => {
|
|
287
|
+
if (isNodeTarget(event.target)) {
|
|
288
|
+
listener(event);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
shared = {
|
|
292
|
+
stop,
|
|
293
|
+
callers
|
|
294
|
+
};
|
|
295
|
+
focusTakeovers.set(doc, shared);
|
|
296
|
+
}
|
|
297
|
+
shared.callers.add(onBlur);
|
|
298
|
+
return () => {
|
|
299
|
+
const current = focusTakeovers.get(doc);
|
|
300
|
+
if (current == null || !current.callers.delete(onBlur)) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (current.callers.size === 0) {
|
|
304
|
+
current.stop();
|
|
305
|
+
focusTakeovers.delete(doc);
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Test-only: how many callers refuse the focus reveal in `doc`, through its
|
|
312
|
+
* one shared subscription. Not part of the runtime API.
|
|
313
|
+
*
|
|
314
|
+
* @internal
|
|
315
|
+
*/
|
|
316
|
+
export function __focusTakeoverCallersForTest(doc) {
|
|
317
|
+
return focusTakeovers.get(doc)?.callers.size ?? 0;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/** The caller's rules for watchRevealPan. */
|
|
321
|
+
|
|
322
|
+
/** A watch for the browser's own reveal pan (see watchRevealPan). */
|
|
323
|
+
|
|
324
|
+
// One shared touch subscription per document serves every reveal-pan watch
|
|
325
|
+
// in it, so no instance adds a listener. The first watch adds it, and the
|
|
326
|
+
// last removes it.
|
|
327
|
+
const touchStartWatches = new WeakMap();
|
|
328
|
+
function watchTouchStarts(doc, onTouchStart) {
|
|
329
|
+
let shared = touchStartWatches.get(doc);
|
|
330
|
+
if (shared == null) {
|
|
331
|
+
const view = doc.defaultView;
|
|
332
|
+
if (view == null) {
|
|
333
|
+
return () => {};
|
|
334
|
+
}
|
|
335
|
+
const watches = new Set();
|
|
336
|
+
const stop = subscribeInput(view, 'touchstart', () => {
|
|
337
|
+
for (const watch of [...watches]) {
|
|
338
|
+
watch();
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
shared = {
|
|
342
|
+
stop,
|
|
343
|
+
watches
|
|
344
|
+
};
|
|
345
|
+
touchStartWatches.set(doc, shared);
|
|
346
|
+
}
|
|
347
|
+
shared.watches.add(onTouchStart);
|
|
348
|
+
return () => {
|
|
349
|
+
const current = touchStartWatches.get(doc);
|
|
350
|
+
if (current == null || !current.watches.delete(onTouchStart)) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
if (current.watches.size === 0) {
|
|
354
|
+
current.stop();
|
|
355
|
+
touchStartWatches.delete(doc);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Some browsers reveal a focused field themselves, after the keyboard's
|
|
362
|
+
* report, by panning the visual viewport to it while the keyboard still
|
|
363
|
+
* covers it. Firefox for Android pans 54 to 143 ms after the report. Chrome
|
|
364
|
+
* on Android animates a pan of the keyboard's whole height from about 100 to
|
|
365
|
+
* 170 ms after it. The page gets no frame until that pan ends. Such a pan
|
|
366
|
+
* moves the visual viewport down within the
|
|
367
|
+
* layout viewport. Since the report there is no touch, document scroll or
|
|
368
|
+
* zoom, and a text field the caller owns has focus. The watch reads the
|
|
369
|
+
* behavior, never the user agent. The caller lands its field itself and
|
|
370
|
+
* puts the pan back. Every keyboard-aware surface can use it.
|
|
371
|
+
*
|
|
372
|
+
* @example
|
|
373
|
+
* ```
|
|
374
|
+
* const watch = watchRevealPan(window, {owns: field => region.contains(field)});
|
|
375
|
+
* // On a report that changes the height: watch.report();
|
|
376
|
+
* // On any later report: if (watch.isRevealPan(height)) watch.putBack();
|
|
377
|
+
* ```
|
|
378
|
+
*/
|
|
379
|
+
export function watchRevealPan(win, {
|
|
380
|
+
owns,
|
|
381
|
+
onTouch
|
|
382
|
+
}) {
|
|
383
|
+
const doc = win.document;
|
|
384
|
+
let atReport = null;
|
|
385
|
+
let touchedSinceReport = false;
|
|
386
|
+
const stopTouchStarts = watchTouchStarts(doc, () => {
|
|
387
|
+
touchedSinceReport = true;
|
|
388
|
+
onTouch?.();
|
|
389
|
+
});
|
|
390
|
+
return {
|
|
391
|
+
report: () => {
|
|
392
|
+
const viewport = win.visualViewport;
|
|
393
|
+
atReport = viewport == null ? null : {
|
|
394
|
+
x: win.scrollX,
|
|
395
|
+
y: win.scrollY,
|
|
396
|
+
top: viewport.offsetTop,
|
|
397
|
+
scale: viewport.scale
|
|
398
|
+
};
|
|
399
|
+
touchedSinceReport = false;
|
|
400
|
+
},
|
|
401
|
+
isRevealPan: height => {
|
|
402
|
+
const viewport = win.visualViewport;
|
|
403
|
+
const focused = doc.activeElement;
|
|
404
|
+
return viewport != null && atReport != null && !touchedSinceReport && height > 0 && viewport.offsetTop > atReport.top && viewport.scale === atReport.scale && win.scrollX === atReport.x && win.scrollY === atReport.y && focused instanceof HTMLElement && isTextEntryControl(focused) && owns(focused);
|
|
405
|
+
},
|
|
406
|
+
putBack: anchor => {
|
|
407
|
+
const options = {
|
|
408
|
+
block: 'start',
|
|
409
|
+
inline: 'nearest',
|
|
410
|
+
behavior: 'instant'
|
|
411
|
+
};
|
|
412
|
+
if (anchor != null) {
|
|
413
|
+
anchor.scrollIntoView(options);
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
// A fixed element sits in the layout viewport, which the pan does not
|
|
417
|
+
// move: scrolling its top into view pans the visual viewport back.
|
|
418
|
+
const probe = doc.createElement('div');
|
|
419
|
+
probe.style.position = 'fixed';
|
|
420
|
+
probe.style.left = '0';
|
|
421
|
+
probe.style.top = `${atReport?.top ?? 0}px`;
|
|
422
|
+
probe.style.width = '1px';
|
|
423
|
+
probe.style.height = '1px';
|
|
424
|
+
probe.style.visibility = 'hidden';
|
|
425
|
+
probe.style.pointerEvents = 'none';
|
|
426
|
+
(doc.body ?? doc.documentElement).append(probe);
|
|
427
|
+
probe.scrollIntoView(options);
|
|
428
|
+
probe.remove();
|
|
429
|
+
},
|
|
430
|
+
stop: stopTouchStarts
|
|
431
|
+
};
|
|
432
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type KeyboardProfile, type KeyboardTransition } from './keyboardModel.js';
|
|
2
|
+
/**
|
|
3
|
+
* Whose keyboard schedule the guide reads: `chromium` where the browser has
|
|
4
|
+
* the VirtualKeyboard API, else null. Without the profile, no surface rides
|
|
5
|
+
* the guide. Chrome reports the keyboard as each slide starts. The profile is
|
|
6
|
+
* a capability, never the user agent. motion/android/keyboard.ts holds the
|
|
7
|
+
* measured timing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function keyboardProfileOf(win: Window): KeyboardProfile | null;
|
|
10
|
+
/** A window's keyboard layout guide. */
|
|
11
|
+
export interface KeyboardLayoutGuide {
|
|
12
|
+
/** The inset the keyboard rests at (or is heading to), CSS px. */
|
|
13
|
+
readonly inset: number;
|
|
14
|
+
/** The latest transition. */
|
|
15
|
+
readonly transition: KeyboardTransition;
|
|
16
|
+
/** The inset presented at `time` (default now), CSS px. */
|
|
17
|
+
presentation(time?: number): number;
|
|
18
|
+
/**
|
|
19
|
+
* Calls `listener` with every transition, inside the event that revealed
|
|
20
|
+
* it, until the caller runs the returned function.
|
|
21
|
+
*/
|
|
22
|
+
subscribe(listener: (transition: KeyboardTransition) => void): () => void;
|
|
23
|
+
/** Whose keyboard schedule the guide reads (keyboardProfileOf). */
|
|
24
|
+
readonly profile: KeyboardProfile | null;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Whether focusing `target` brings up a software keyboard (or another input
|
|
28
|
+
* view in its place, as a select's picker does).
|
|
29
|
+
*/
|
|
30
|
+
export declare function bringsUpKeyboard(target: EventTarget | null): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* The window's keyboard layout guide, created on first use.
|
|
33
|
+
*
|
|
34
|
+
* One guide serves each window. It subscribes to the keyboard module only
|
|
35
|
+
* while something subscribes to it. It owns no listener and measures nothing.
|
|
36
|
+
* It feeds the model the module's reports, the keyboard height and the focus
|
|
37
|
+
* changes that start a hide. It hands each transition to its subscribers.
|
|
38
|
+
* What it adds is timing: when a show started, a hide predicted from the
|
|
39
|
+
* blur, and the motion in between. Layout follows the keyboard height
|
|
40
|
+
* itself, and the guide's transitions only time the optional ride on top.
|
|
41
|
+
*
|
|
42
|
+
* The model reads Chrome's measured schedule: Chrome reports each slide just
|
|
43
|
+
* after it starts. A surface rides the guide only where the VirtualKeyboard
|
|
44
|
+
* API reports the keyboard. Focus can move from one field to another through
|
|
45
|
+
* something that brings no keyboard, such as a popover's container. Chrome
|
|
46
|
+
* then reports the keyboard gone for a moment and then back. So a hide
|
|
47
|
+
* reported while a field that just got focus still has it waits until the
|
|
48
|
+
* move settles.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```
|
|
52
|
+
* const guide = getKeyboardLayoutGuide(window);
|
|
53
|
+
* const unsubscribe = guide.subscribe(t => {
|
|
54
|
+
* rideKeyboard(animator, {y: -t.to}, t);
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function getKeyboardLayoutGuide(win: Window): KeyboardLayoutGuide;
|
|
59
|
+
//# sourceMappingURL=keyboardLayoutGuide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboardLayoutGuide.d.ts","sourceRoot":"","sources":["../../src/keyboard/keyboardLayoutGuide.ts"],"names":[],"mappings":"AAqBA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAErE;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,2DAA2D;IAC3D,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC1E,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAkBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAMpE;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAOvE"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file keyboardLayoutGuide.ts
|
|
5
|
+
* @input The keyboard module's reports (subscribeKeyboardHeight) and
|
|
6
|
+
* createKeyboardModel
|
|
7
|
+
* @output getKeyboardLayoutGuide (a window's one guide), bringsUpKeyboard and
|
|
8
|
+
* the KeyboardLayoutGuide type
|
|
9
|
+
* @position The web's UIKeyboardLayoutGuide: where the software keyboard
|
|
10
|
+
* covers the layout viewport and how it moves. Touch presentations read it
|
|
11
|
+
* to keep content above the keyboard. It is internal to core.
|
|
12
|
+
*
|
|
13
|
+
* SYNC: When modified, update /packages/core/src/keyboard/README.md
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { getKeyboardHeight, isTextEntryControl, subscribeKeyboardHeight } from "./keyboardHeight.js";
|
|
17
|
+
import { createKeyboardModel } from "./keyboardModel.js";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whose keyboard schedule the guide reads: `chromium` where the browser has
|
|
21
|
+
* the VirtualKeyboard API, else null. Without the profile, no surface rides
|
|
22
|
+
* the guide. Chrome reports the keyboard as each slide starts. The profile is
|
|
23
|
+
* a capability, never the user agent. motion/android/keyboard.ts holds the
|
|
24
|
+
* measured timing.
|
|
25
|
+
*/
|
|
26
|
+
export function keyboardProfileOf(win) {
|
|
27
|
+
return 'virtualKeyboard' in win.navigator ? 'chromium' : null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** A window's keyboard layout guide. */
|
|
31
|
+
|
|
32
|
+
// Extra time after a predicted transition's end before checking it.
|
|
33
|
+
const VERIFY_SLACK_MS = 150;
|
|
34
|
+
// How long after a field gains focus Chrome may still report the keyboard
|
|
35
|
+
// gone for a moment (measured: back within 50 ms of the move).
|
|
36
|
+
const FOCUS_HANDOFF_MS = 150;
|
|
37
|
+
|
|
38
|
+
// Controls whose picker Chrome on Android opens over the page while the
|
|
39
|
+
// keyboard goes away; on iOS the picker takes the keyboard's place.
|
|
40
|
+
const PICKER_INPUT_TYPES = new Set(['date', 'datetime-local', 'month', 'time', 'week']);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Whether focusing `target` brings up a software keyboard (or another input
|
|
44
|
+
* view in its place, as a select's picker does).
|
|
45
|
+
*/
|
|
46
|
+
export function bringsUpKeyboard(target) {
|
|
47
|
+
const element = target instanceof Element ? target : null;
|
|
48
|
+
return isTextEntryControl(element) || element instanceof HTMLSelectElement && !element.disabled;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Whether `target` is a select, or a date or time field, which Chrome on
|
|
52
|
+
// Android edits in a picker over the page.
|
|
53
|
+
function opensPickerOverPage(target) {
|
|
54
|
+
const element = target;
|
|
55
|
+
if (element == null || element.nodeType !== 1) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return element.tagName === 'SELECT' || element.tagName === 'INPUT' && PICKER_INPUT_TYPES.has(element.type);
|
|
59
|
+
}
|
|
60
|
+
const guides = new WeakMap();
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The window's keyboard layout guide, created on first use.
|
|
64
|
+
*
|
|
65
|
+
* One guide serves each window. It subscribes to the keyboard module only
|
|
66
|
+
* while something subscribes to it. It owns no listener and measures nothing.
|
|
67
|
+
* It feeds the model the module's reports, the keyboard height and the focus
|
|
68
|
+
* changes that start a hide. It hands each transition to its subscribers.
|
|
69
|
+
* What it adds is timing: when a show started, a hide predicted from the
|
|
70
|
+
* blur, and the motion in between. Layout follows the keyboard height
|
|
71
|
+
* itself, and the guide's transitions only time the optional ride on top.
|
|
72
|
+
*
|
|
73
|
+
* The model reads Chrome's measured schedule: Chrome reports each slide just
|
|
74
|
+
* after it starts. A surface rides the guide only where the VirtualKeyboard
|
|
75
|
+
* API reports the keyboard. Focus can move from one field to another through
|
|
76
|
+
* something that brings no keyboard, such as a popover's container. Chrome
|
|
77
|
+
* then reports the keyboard gone for a moment and then back. So a hide
|
|
78
|
+
* reported while a field that just got focus still has it waits until the
|
|
79
|
+
* move settles.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```
|
|
83
|
+
* const guide = getKeyboardLayoutGuide(window);
|
|
84
|
+
* const unsubscribe = guide.subscribe(t => {
|
|
85
|
+
* rideKeyboard(animator, {y: -t.to}, t);
|
|
86
|
+
* });
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
export function getKeyboardLayoutGuide(win) {
|
|
90
|
+
let guide = guides.get(win);
|
|
91
|
+
if (guide == null) {
|
|
92
|
+
guide = createGuide(win);
|
|
93
|
+
guides.set(win, guide);
|
|
94
|
+
}
|
|
95
|
+
return guide;
|
|
96
|
+
}
|
|
97
|
+
function createGuide(win) {
|
|
98
|
+
const listeners = new Set();
|
|
99
|
+
let profile = keyboardProfileOf(win);
|
|
100
|
+
let model = createKeyboardModel(getKeyboardHeight(win));
|
|
101
|
+
let verifyTimer = null;
|
|
102
|
+
let detach = null;
|
|
103
|
+
const publish = transition => {
|
|
104
|
+
if (transition == null) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (transition.predicted) {
|
|
108
|
+
scheduleVerify(transition);
|
|
109
|
+
}
|
|
110
|
+
for (const listener of [...listeners]) {
|
|
111
|
+
listener(transition);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const scheduleVerify = transition => {
|
|
115
|
+
if (verifyTimer != null) {
|
|
116
|
+
clearTimeout(verifyTimer);
|
|
117
|
+
}
|
|
118
|
+
const due = transition.start + (transition.curve?.durationMs ?? 0) + VERIFY_SLACK_MS;
|
|
119
|
+
verifyTimer = setTimeout(() => {
|
|
120
|
+
verifyTimer = null;
|
|
121
|
+
publish(model.verify(getKeyboardHeight(win), win.performance.now()));
|
|
122
|
+
}, Math.max(0, due - win.performance.now()));
|
|
123
|
+
};
|
|
124
|
+
const attach = () => {
|
|
125
|
+
profile = keyboardProfileOf(win);
|
|
126
|
+
model = createKeyboardModel(getKeyboardHeight(win));
|
|
127
|
+
// Whether focusing `target` keeps an input view where the keyboard is. On
|
|
128
|
+
// iOS, a select's picker or a date or time field's picker takes the
|
|
129
|
+
// keyboard's place. Chrome on Android opens it over the page, and the
|
|
130
|
+
// keyboard goes away.
|
|
131
|
+
const keepsInputView = target => bringsUpKeyboard(target) && !(profile === 'chromium' && opensPickerOverPage(target));
|
|
132
|
+
// When a field that brings up a keyboard last gained focus.
|
|
133
|
+
let keyboardFocusAt = -Infinity;
|
|
134
|
+
let handoffTimer = null;
|
|
135
|
+
const report = (height, time) => {
|
|
136
|
+
if (handoffTimer != null) {
|
|
137
|
+
clearTimeout(handoffTimer);
|
|
138
|
+
handoffTimer = null;
|
|
139
|
+
}
|
|
140
|
+
const settled = keyboardFocusAt + FOCUS_HANDOFF_MS;
|
|
141
|
+
if (profile === 'chromium' && height < 0.5 && model.inset >= 0.5 && time < settled && keepsInputView(win.document.activeElement)) {
|
|
142
|
+
// Focus just moved to another field: Chrome reports the keyboard
|
|
143
|
+
// gone before it reports it back. Hold the hide until the move
|
|
144
|
+
// settles, then believe whatever the keyboard is doing.
|
|
145
|
+
handoffTimer = setTimeout(() => {
|
|
146
|
+
handoffTimer = null;
|
|
147
|
+
publish(model.report(getKeyboardHeight(win), settled));
|
|
148
|
+
}, settled - time);
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
return model.report(height, time);
|
|
152
|
+
};
|
|
153
|
+
const onReport = event => {
|
|
154
|
+
if (event.type === 'viewport') {
|
|
155
|
+
publish(report(event.height, event.timeStamp));
|
|
156
|
+
} else if (event.type === 'focusin') {
|
|
157
|
+
if (keepsInputView(event.target)) {
|
|
158
|
+
keyboardFocusAt = event.timeStamp;
|
|
159
|
+
publish(model.focused(event.timeStamp));
|
|
160
|
+
}
|
|
161
|
+
} else if (keepsInputView(event.target) && !keepsInputView(event.relatedTarget)) {
|
|
162
|
+
publish(model.blurred(event.timeStamp));
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const unsubscribe = subscribeKeyboardHeight(win, onReport, {
|
|
166
|
+
focus: true
|
|
167
|
+
});
|
|
168
|
+
return () => {
|
|
169
|
+
unsubscribe();
|
|
170
|
+
if (handoffTimer != null) {
|
|
171
|
+
clearTimeout(handoffTimer);
|
|
172
|
+
handoffTimer = null;
|
|
173
|
+
}
|
|
174
|
+
if (verifyTimer != null) {
|
|
175
|
+
clearTimeout(verifyTimer);
|
|
176
|
+
verifyTimer = null;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
};
|
|
180
|
+
return {
|
|
181
|
+
get profile() {
|
|
182
|
+
return profile;
|
|
183
|
+
},
|
|
184
|
+
get inset() {
|
|
185
|
+
return model.inset;
|
|
186
|
+
},
|
|
187
|
+
get transition() {
|
|
188
|
+
return model.transition;
|
|
189
|
+
},
|
|
190
|
+
presentation(time = win.performance.now()) {
|
|
191
|
+
return model.presentation(time);
|
|
192
|
+
},
|
|
193
|
+
subscribe(listener) {
|
|
194
|
+
listeners.add(listener);
|
|
195
|
+
if (detach == null) {
|
|
196
|
+
detach = attach();
|
|
197
|
+
}
|
|
198
|
+
return () => {
|
|
199
|
+
listeners.delete(listener);
|
|
200
|
+
if (listeners.size === 0 && detach != null) {
|
|
201
|
+
detach();
|
|
202
|
+
detach = null;
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
}
|