@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
|
@@ -4,19 +4,25 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file PowerSearch.tsx
|
|
7
|
-
* @input PowerSearchConfig, filters, onChange
|
|
7
|
+
* @input PowerSearchConfig, filters, onChange; Tokenizer, Field parts, Token,
|
|
8
|
+
* useAdaptivePresentation, and PowerSearchBottomSheet (lazy)
|
|
8
9
|
* @output Structured filter bar with token-based filter management
|
|
9
10
|
* @position Main component; forwards DOM ref and exposes tokenizer control via
|
|
10
|
-
* handleRef
|
|
11
|
+
* handleRef. The `presentation` prop swaps the tokenizer field and editor
|
|
12
|
+
* popover for one trigger that opens PowerSearchBottomSheet.
|
|
11
13
|
*
|
|
12
14
|
* SYNC: When modified, update:
|
|
13
15
|
* - /packages/core/src/PowerSearch/index.ts
|
|
16
|
+
* - /packages/core/src/PowerSearch/PowerSearchBottomSheet.tsx (sheet presentation)
|
|
14
17
|
* - /packages/cli/assets/templates/blocks/components/PowerSearch/ (showcase blocks)
|
|
15
18
|
*/
|
|
16
19
|
|
|
17
20
|
import React, {
|
|
21
|
+
lazy,
|
|
22
|
+
Suspense,
|
|
18
23
|
useCallback,
|
|
19
24
|
useEffect,
|
|
25
|
+
useId,
|
|
20
26
|
useImperativeHandle,
|
|
21
27
|
useMemo,
|
|
22
28
|
useRef,
|
|
@@ -37,30 +43,48 @@ import {Token} from '../Token';
|
|
|
37
43
|
import {TokenNamingContext} from '../Token/TokenNamingContext';
|
|
38
44
|
import {Avatar} from '../Avatar';
|
|
39
45
|
import {layerAnimations} from '../Layer/layerAnimations.stylex';
|
|
40
|
-
import {Icon} from '../Icon';
|
|
46
|
+
import {Icon, renderIconSlot} from '../Icon';
|
|
41
47
|
import type {IconType} from '../Icon';
|
|
42
48
|
import type {IconName} from '../Icon/globalIconRegistry';
|
|
43
49
|
import type {InputStatus} from '../Field';
|
|
50
|
+
import {Field} from '../Field/Field';
|
|
51
|
+
import {
|
|
52
|
+
inputStatusBorderStyles,
|
|
53
|
+
inputStatusFocusWithinStyles,
|
|
54
|
+
inputStatusHoverShadowStyles,
|
|
55
|
+
inputWrapperStyles,
|
|
56
|
+
} from '../Field/inputStyles.stylex';
|
|
44
57
|
import {usePopover} from '../Popover/usePopover';
|
|
58
|
+
import {useTooltip} from '../Tooltip/useTooltip';
|
|
45
59
|
import {layerViewportInset} from '../Layer/layerViewportInset.stylex';
|
|
46
60
|
import {useAnnounce} from '../hooks/useAnnounce';
|
|
61
|
+
import {
|
|
62
|
+
type AdaptivePresentation,
|
|
63
|
+
useAdaptivePresentation,
|
|
64
|
+
} from '../hooks/useAdaptivePresentation';
|
|
65
|
+
import {useDevWarning} from '../hooks/useDevWarning';
|
|
66
|
+
import {useIsHydrating} from '../hooks/useIsHydrating';
|
|
47
67
|
import {
|
|
48
68
|
spacingVars,
|
|
49
69
|
colorVars,
|
|
70
|
+
sizeVars,
|
|
50
71
|
typeScaleVars,
|
|
72
|
+
typographyVars,
|
|
51
73
|
fontWeightVars,
|
|
52
74
|
} from '../theme/tokens.stylex';
|
|
53
75
|
import {useSize} from '../SizeContext/SizeContext';
|
|
76
|
+
import {isFocusDetached} from '../utils/isFocusDetached';
|
|
77
|
+
import {isRenderable} from '../utils/isRenderable';
|
|
54
78
|
import {useInternalConfig} from './useInternalConfig';
|
|
55
79
|
import {usePowerSearchSource} from './usePowerSearchSource';
|
|
80
|
+
import {formatFilterValue} from './formatFilterValue';
|
|
81
|
+
import {NestedEditor, PowerSearchEditPopover} from './PowerSearchEditPopover';
|
|
56
82
|
import {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
} from './
|
|
60
|
-
import {PowerSearchEditPopover} from './PowerSearchEditPopover';
|
|
83
|
+
buildRelativeDateOptions,
|
|
84
|
+
PowerSearchValueEditor,
|
|
85
|
+
} from './PowerSearchValueEditor';
|
|
61
86
|
import {resolveOperatorLabel} from './resolveOperatorLabel';
|
|
62
87
|
import {themeProps} from '../utils/themeProps';
|
|
63
|
-
import {truncateCharacters} from '../utils/characters';
|
|
64
88
|
import {useLocale} from '../i18n/useLocale';
|
|
65
89
|
import type {Locale} from '../i18n/types';
|
|
66
90
|
import type {SearchableItem} from '../Typeahead/types';
|
|
@@ -74,10 +98,14 @@ import type {
|
|
|
74
98
|
PowerSearchHandle,
|
|
75
99
|
FilterValue,
|
|
76
100
|
OperatorValue,
|
|
77
|
-
EnumItem,
|
|
78
101
|
PowerSearchComponents,
|
|
79
102
|
PowerSearchOperator,
|
|
80
103
|
} from './types';
|
|
104
|
+
import type {
|
|
105
|
+
PowerSearchBottomSheetProps,
|
|
106
|
+
PowerSearchSheetEditors,
|
|
107
|
+
} from './PowerSearchBottomSheet';
|
|
108
|
+
import {formatTokenValueText} from './formatTokenValue';
|
|
81
109
|
|
|
82
110
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
83
111
|
import type {FieldStatusPlacement} from '../Field/fieldStatusPlacement';
|
|
@@ -150,130 +178,127 @@ const resultCountStyles = stylex.create({
|
|
|
150
178
|
},
|
|
151
179
|
});
|
|
152
180
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
181
|
+
// The sheet presentation's trigger field: the same control box as the
|
|
182
|
+
// tokenizer field, with display-only tokens and one button as its only tab
|
|
183
|
+
// stop.
|
|
184
|
+
const sheetTriggerSizeStyles = stylex.create({
|
|
185
|
+
sm: {minHeight: sizeVars['--size-element-sm']},
|
|
186
|
+
md: {minHeight: sizeVars['--size-element-md']},
|
|
187
|
+
lg: {minHeight: sizeVars['--size-element-lg']},
|
|
188
|
+
});
|
|
158
189
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
190
|
+
const sheetTriggerStyles = stylex.create({
|
|
191
|
+
wrapper: {
|
|
192
|
+
position: 'relative',
|
|
193
|
+
flexWrap: 'nowrap',
|
|
194
|
+
gap: spacingVars['--spacing-1'],
|
|
195
|
+
height: 'auto',
|
|
196
|
+
cursor: {
|
|
197
|
+
default: 'pointer',
|
|
198
|
+
':is([aria-disabled="true"])': 'default',
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
wrapperWithTokens: {
|
|
202
|
+
paddingBlock: `calc(${spacingVars['--spacing-1']} - 1px)`,
|
|
203
|
+
paddingInline: `calc(${spacingVars['--spacing-1']} - 1px)`,
|
|
204
|
+
},
|
|
205
|
+
contentSection: {
|
|
206
|
+
position: 'relative',
|
|
207
|
+
minWidth: 0,
|
|
208
|
+
flexGrow: 1,
|
|
209
|
+
display: 'flex',
|
|
210
|
+
alignItems: 'center',
|
|
211
|
+
flexWrap: 'wrap',
|
|
212
|
+
columnGap: spacingVars['--spacing-1'],
|
|
213
|
+
rowGap: `calc(${spacingVars['--spacing-1']} - 1px)`,
|
|
214
|
+
},
|
|
215
|
+
startIconWithTokens: {
|
|
216
|
+
marginInlineStart: `calc(${spacingVars['--spacing-2']} - ${spacingVars['--spacing-1']} + 1px)`,
|
|
217
|
+
},
|
|
218
|
+
// The only tab stop in the field. It stays visually borderless while the
|
|
219
|
+
// wrapper delegates taps on tokens and empty space to it.
|
|
220
|
+
trigger: {
|
|
221
|
+
appearance: 'none',
|
|
222
|
+
flex: '1 1 40px',
|
|
223
|
+
minWidth: '40px',
|
|
224
|
+
alignSelf: 'stretch',
|
|
225
|
+
display: 'flex',
|
|
226
|
+
alignItems: 'center',
|
|
227
|
+
paddingBlock: 0,
|
|
228
|
+
paddingInline: spacingVars['--spacing-1'],
|
|
229
|
+
margin: 0,
|
|
230
|
+
borderWidth: 0,
|
|
231
|
+
borderStyle: 'none',
|
|
232
|
+
backgroundColor: 'transparent',
|
|
233
|
+
color: colorVars['--color-text-secondary'],
|
|
234
|
+
fontFamily: typographyVars['--font-family-body'],
|
|
235
|
+
fontSize: typeScaleVars['--text-body-size'],
|
|
236
|
+
lineHeight: typeScaleVars['--text-body-leading'],
|
|
237
|
+
textAlign: 'start',
|
|
238
|
+
whiteSpace: 'nowrap',
|
|
239
|
+
cursor: {
|
|
240
|
+
default: 'pointer',
|
|
241
|
+
':is([aria-disabled="true"])': 'default',
|
|
242
|
+
},
|
|
243
|
+
outline: 'none',
|
|
244
|
+
},
|
|
245
|
+
// Once a token is present the empty trigger covers the token lane instead
|
|
246
|
+
// of reserving 40px or wrapping onto an otherwise blank row.
|
|
247
|
+
triggerWithTokens: {
|
|
248
|
+
position: 'absolute',
|
|
249
|
+
inset: 0,
|
|
250
|
+
minWidth: 0,
|
|
251
|
+
padding: 0,
|
|
252
|
+
},
|
|
253
|
+
endSection: {
|
|
254
|
+
display: 'flex',
|
|
255
|
+
alignItems: 'center',
|
|
256
|
+
gap: spacingVars['--spacing-2'],
|
|
257
|
+
flexShrink: 0,
|
|
258
|
+
paddingInlineEnd: spacingVars['--spacing-1'],
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
// The sheet flow (three standalone sheets, the sheet editors) only
|
|
263
|
+
// renders for the bottom-sheet presentation. Loading it on demand keeps it out
|
|
264
|
+
// of pages whose PowerSearch stays a tokenizer field.
|
|
265
|
+
// One import promise, shared by the preload and the lazy element: the sheet
|
|
266
|
+
// presentation loads the flow's chunk as soon as it is active, so the first
|
|
267
|
+
// press does not wait for the network, while nothing of the flow is rendered
|
|
268
|
+
// until a press.
|
|
269
|
+
const loadPowerSearchBottomSheet = async () =>
|
|
270
|
+
import('./PowerSearchBottomSheet');
|
|
271
|
+
const LazyPowerSearchBottomSheet = lazy(async () =>
|
|
272
|
+
loadPowerSearchBottomSheet().then(module => ({
|
|
273
|
+
default: module.PowerSearchBottomSheet,
|
|
274
|
+
})),
|
|
275
|
+
);
|
|
276
|
+
// The value step reuses the popover presentation's editors, which this
|
|
277
|
+
// module already loads; see PowerSearchSheetEditors.
|
|
278
|
+
const SHEET_EDITORS: PowerSearchSheetEditors = {
|
|
279
|
+
NestedEditor,
|
|
280
|
+
PowerSearchValueEditor,
|
|
281
|
+
buildRelativeDateOptions,
|
|
282
|
+
};
|
|
162
283
|
|
|
163
284
|
/**
|
|
164
|
-
*
|
|
165
|
-
*
|
|
285
|
+
* Hosts the lazily loaded sheet flow. Renders nothing on the server or in the
|
|
286
|
+
* render that hydrates server HTML: a lazy component that has not loaded yet
|
|
287
|
+
* would leave server markup incomplete and abort hydration. The closed flow
|
|
288
|
+
* has no visible markup, so it first renders right after hydration.
|
|
166
289
|
*/
|
|
167
|
-
function
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
switch (filterValue.type) {
|
|
174
|
-
case 'empty':
|
|
175
|
-
return null;
|
|
176
|
-
|
|
177
|
-
case 'string':
|
|
178
|
-
return truncateString(filterValue.value, maxLength);
|
|
179
|
-
|
|
180
|
-
case 'integer':
|
|
181
|
-
case 'float':
|
|
182
|
-
return String(filterValue.value);
|
|
183
|
-
|
|
184
|
-
case 'enum':
|
|
185
|
-
if (operatorValue.type === 'enum') {
|
|
186
|
-
return truncateString(
|
|
187
|
-
getEnumLabel(operatorValue.values, filterValue.value),
|
|
188
|
-
maxLength,
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
return truncateString(filterValue.value, maxLength);
|
|
192
|
-
|
|
193
|
-
case 'string_list': {
|
|
194
|
-
const items = filterValue.value;
|
|
195
|
-
if (items.length === 0) {
|
|
196
|
-
return null;
|
|
197
|
-
}
|
|
198
|
-
if (items.length === 1) {
|
|
199
|
-
return truncateString(items[0], maxLength);
|
|
200
|
-
}
|
|
201
|
-
const totalLength = items.reduce((sum, s) => sum + s.length, 0);
|
|
202
|
-
if (totalLength > maxLength) {
|
|
203
|
-
return `${items.length} items`;
|
|
204
|
-
}
|
|
205
|
-
return items.join(', ');
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
case 'enum_list': {
|
|
209
|
-
const items = filterValue.value;
|
|
210
|
-
if (items.length === 0) {
|
|
211
|
-
return null;
|
|
212
|
-
}
|
|
213
|
-
if (operatorValue.type === 'enum_list') {
|
|
214
|
-
const labels = items.map(v => getEnumLabel(operatorValue.values, v));
|
|
215
|
-
if (labels.length === 1) {
|
|
216
|
-
return truncateString(labels[0], maxLength);
|
|
217
|
-
}
|
|
218
|
-
const totalLength = labels.reduce((sum, s) => sum + s.length, 0);
|
|
219
|
-
if (totalLength > maxLength) {
|
|
220
|
-
return `${labels.length} items`;
|
|
221
|
-
}
|
|
222
|
-
return labels.join(', ');
|
|
223
|
-
}
|
|
224
|
-
if (items.length === 1) {
|
|
225
|
-
return truncateString(items[0], maxLength);
|
|
226
|
-
}
|
|
227
|
-
return `${items.length} items`;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
case 'entity_list': {
|
|
231
|
-
const entities = filterValue.value;
|
|
232
|
-
if (entities.length === 0) {
|
|
233
|
-
return null;
|
|
234
|
-
}
|
|
235
|
-
if (entities.length === 1) {
|
|
236
|
-
return truncateString(entities[0].label, maxLength);
|
|
237
|
-
}
|
|
238
|
-
const totalLength = entities.reduce((sum, e) => sum + e.label.length, 0);
|
|
239
|
-
if (totalLength > maxLength) {
|
|
240
|
-
return `${entities.length} items`;
|
|
241
|
-
}
|
|
242
|
-
return entities.map(e => e.label).join(', ');
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
case 'time':
|
|
246
|
-
return filterValue.value;
|
|
247
|
-
|
|
248
|
-
case 'date_absolute':
|
|
249
|
-
return truncateString(
|
|
250
|
-
formatDateAbsoluteCompact(filterValue.unixSeconds, locale),
|
|
251
|
-
maxLength,
|
|
252
|
-
);
|
|
253
|
-
|
|
254
|
-
case 'date_relative':
|
|
255
|
-
return truncateString(filterValue.value, maxLength);
|
|
256
|
-
|
|
257
|
-
case 'date_range':
|
|
258
|
-
return 'date range';
|
|
259
|
-
|
|
260
|
-
case 'custom':
|
|
261
|
-
if (operatorValue.type === 'custom') {
|
|
262
|
-
return truncateString(
|
|
263
|
-
operatorValue.getString(filterValue.value),
|
|
264
|
-
maxLength,
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
|
-
return filterValue.value;
|
|
268
|
-
|
|
269
|
-
case 'nested': {
|
|
270
|
-
const count = filterValue.value.length;
|
|
271
|
-
return count === 1 ? '1 filter' : `${count} filters`;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
default:
|
|
275
|
-
return null;
|
|
290
|
+
function PowerSearchSheetHost(
|
|
291
|
+
props: Omit<PowerSearchBottomSheetProps, 'editors'>,
|
|
292
|
+
) {
|
|
293
|
+
const isHydrating = useIsHydrating();
|
|
294
|
+
if (isHydrating) {
|
|
295
|
+
return null;
|
|
276
296
|
}
|
|
297
|
+
return (
|
|
298
|
+
<Suspense fallback={null}>
|
|
299
|
+
<LazyPowerSearchBottomSheet {...props} editors={SHEET_EDITORS} />
|
|
300
|
+
</Suspense>
|
|
301
|
+
);
|
|
277
302
|
}
|
|
278
303
|
|
|
279
304
|
function PowerSearchTokenValue({text}: {text: string}) {
|
|
@@ -356,7 +381,13 @@ export interface PowerSearchProps extends Omit<
|
|
|
356
381
|
maxSearchResults?: number;
|
|
357
382
|
/** Label for the save button in edit popover. @default 'Apply' */
|
|
358
383
|
popoverSaveButtonLabel?: string;
|
|
359
|
-
/**
|
|
384
|
+
/**
|
|
385
|
+
* IANA zone a date-only `date_absolute` value, and each absolute part of a
|
|
386
|
+
* `date_range`, is read and written in: the token, the label and the editor
|
|
387
|
+
* show its day there, and a picked day stores as that midnight. Unset, a
|
|
388
|
+
* day is its UTC day. A `date_absolute` with `isDateOnly: false` shows and
|
|
389
|
+
* edits its date and time in it; unset, in the viewer's zone.
|
|
390
|
+
*/
|
|
360
391
|
timezoneID?: string;
|
|
361
392
|
/**
|
|
362
393
|
* Controls how tokens overflow when the container is too narrow.
|
|
@@ -388,8 +419,36 @@ export interface PowerSearchProps extends Omit<
|
|
|
388
419
|
* Keys are operator value types (e.g. 'string', 'enum', 'date_absolute').
|
|
389
420
|
*/
|
|
390
421
|
components?: PowerSearchComponents;
|
|
422
|
+
/**
|
|
423
|
+
* How the field presents filter editing.
|
|
424
|
+
* - `'popover'`: the tokenizer field with its typeahead and the editor
|
|
425
|
+
* popover, on every device.
|
|
426
|
+
* - `'bottom-sheet'`: the whole field is one trigger showing display-only
|
|
427
|
+
* filter tokens; it opens a stack of sheets. Filters lists the filters
|
|
428
|
+
* as rows that edit or remove one, with Add filter, Done, and Clear
|
|
429
|
+
* all, which asks first and keeps read-only filters. Add filter opens
|
|
430
|
+
* above it with the fields (or the content search with inline
|
|
431
|
+
* suggestions), and a value step opens above that, stages operator →
|
|
432
|
+
* value, and confirms from its footer. Dismissing a step reveals the
|
|
433
|
+
* one beneath. The flow edits a draft: `onChange` is called when Done
|
|
434
|
+
* applies it, once per edit in order, and a dismissal with a changed
|
|
435
|
+
* draft asks before discarding it. Suited to compact touch screens,
|
|
436
|
+
* where the editor popover competes with the software keyboard.
|
|
437
|
+
* - `'adaptive'`: the bottom sheet on compact coarse-pointer screens,
|
|
438
|
+
* otherwise the popover — the same resolution Selector uses. The server
|
|
439
|
+
* render and the hydrating render are the popover.
|
|
440
|
+
*
|
|
441
|
+
* In the sheet presentation `menuWidth` and `tokenOverflowBehavior` have
|
|
442
|
+
* no surface to act on and warn in development. Pass `'popover'` to keep
|
|
443
|
+
* the tokenizer field and the editor popover on every device.
|
|
444
|
+
* @default 'adaptive'
|
|
445
|
+
*/
|
|
446
|
+
presentation?: PowerSearchPresentation;
|
|
391
447
|
}
|
|
392
448
|
|
|
449
|
+
/** How PowerSearch presents filter editing; see `PowerSearchProps.presentation`. */
|
|
450
|
+
export type PowerSearchPresentation = AdaptivePresentation;
|
|
451
|
+
|
|
393
452
|
// =============================================================================
|
|
394
453
|
// State
|
|
395
454
|
// =============================================================================
|
|
@@ -524,6 +583,7 @@ export function PowerSearch({
|
|
|
524
583
|
className,
|
|
525
584
|
style,
|
|
526
585
|
components: componentOverrides,
|
|
586
|
+
presentation = 'adaptive',
|
|
527
587
|
}: PowerSearchProps) {
|
|
528
588
|
const size = useSize(sizeProp, 'md');
|
|
529
589
|
const config = useInternalConfig(configProp);
|
|
@@ -537,6 +597,100 @@ export function PowerSearch({
|
|
|
537
597
|
popoverSaveButtonLabelFromProps ?? t('@astryx.powersearch.editor.apply');
|
|
538
598
|
const tokenizerRef = useRef<TokenizerHandle>(null);
|
|
539
599
|
|
|
600
|
+
const resolvedPresentation = useAdaptivePresentation(presentation);
|
|
601
|
+
const [isSheetOpen, setIsSheetOpen] = useState(false);
|
|
602
|
+
// Latched for the flow's lifetime: the flow stays presented after it closes
|
|
603
|
+
// until the sheets have run their exit and handed focus back to the trigger.
|
|
604
|
+
// Without the latch, `adaptive` resolving to `popover` mid-session (a phone
|
|
605
|
+
// turned to landscape) would unmount the sheets and the trigger they return
|
|
606
|
+
// focus to in the same render, dropping focus to the page body.
|
|
607
|
+
const [isSheetPresented, setIsSheetPresented] = useState(false);
|
|
608
|
+
const isSheetPresentation =
|
|
609
|
+
isSheetOpen || isSheetPresented || resolvedPresentation === 'bottom-sheet';
|
|
610
|
+
const triggerRef = useRef<HTMLButtonElement>(null);
|
|
611
|
+
// `hasAutoFocus` applies only to the control the field first mounts. A
|
|
612
|
+
// presentation swap remounts the control (combobox input or trigger), and
|
|
613
|
+
// React's `autoFocus` on the new one would pull focus from wherever on the
|
|
614
|
+
// page it was; the roots' callback refs hand over the focus the field held
|
|
615
|
+
// instead. A field that never swaps keeps `autoFocus` on every render, so a
|
|
616
|
+
// Dialog that keeps it mounted still finds its `data-autofocus` on open.
|
|
617
|
+
const [autoFocusState, setAutoFocusState] = useState({
|
|
618
|
+
presentation: isSheetPresentation,
|
|
619
|
+
isFirstControl: true,
|
|
620
|
+
});
|
|
621
|
+
if (autoFocusState.presentation !== isSheetPresentation) {
|
|
622
|
+
setAutoFocusState({
|
|
623
|
+
presentation: isSheetPresentation,
|
|
624
|
+
isFirstControl: false,
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
const autoFocusOnMount =
|
|
628
|
+
hasAutoFocus &&
|
|
629
|
+
autoFocusState.isFirstControl &&
|
|
630
|
+
autoFocusState.presentation === isSheetPresentation;
|
|
631
|
+
// A focus the swap moves continues the same visit to the field: the
|
|
632
|
+
// control that held focus is gone (no blur fires for a removed element), so
|
|
633
|
+
// the caller is told of neither a blur nor a new focus.
|
|
634
|
+
const isSwapFocusRef = useRef(false);
|
|
635
|
+
const focusAfterSwap = useCallback((control: {focus(): void} | null) => {
|
|
636
|
+
if (control == null) {
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
639
|
+
isSwapFocusRef.current = true;
|
|
640
|
+
try {
|
|
641
|
+
control.focus();
|
|
642
|
+
} finally {
|
|
643
|
+
isSwapFocusRef.current = false;
|
|
644
|
+
}
|
|
645
|
+
}, []);
|
|
646
|
+
const handleFieldFocus = useCallback(
|
|
647
|
+
(event: React.FocusEvent) => {
|
|
648
|
+
if (!isSwapFocusRef.current) {
|
|
649
|
+
onFocus?.(event);
|
|
650
|
+
}
|
|
651
|
+
},
|
|
652
|
+
[onFocus],
|
|
653
|
+
);
|
|
654
|
+
const handleFieldBlur = useCallback(
|
|
655
|
+
(event: React.FocusEvent) => {
|
|
656
|
+
onBlur?.(event);
|
|
657
|
+
},
|
|
658
|
+
[onBlur],
|
|
659
|
+
);
|
|
660
|
+
// While the flow is open, the sheet announces its own content from inside
|
|
661
|
+
// its dialog; this component announces only with the flow closed, and
|
|
662
|
+
// `useAnnounce` routes those messages by where the field is — into a Dialog
|
|
663
|
+
// or modal Drawer that holds it, or the shared channel when no modal does.
|
|
664
|
+
// A result count that changed during the flow's exit is spoken once the
|
|
665
|
+
// flow has fully closed and focus is back on the trigger: the closing
|
|
666
|
+
// dialog stays modal through its exit, so neither its region nor the
|
|
667
|
+
// page-body channel is heard before.
|
|
668
|
+
const afterCloseResultCountRef = useRef<string | null>(null);
|
|
669
|
+
const triggerId = useId();
|
|
670
|
+
const triggerLabelId = useId();
|
|
671
|
+
const triggerContentId = useId();
|
|
672
|
+
const statusMessageId = useId();
|
|
673
|
+
// A field that becomes disabled cannot keep its flow open, and must not
|
|
674
|
+
// reopen it when re-enabled. Adjusted in the
|
|
675
|
+
// render that sees the change, not an effect, so no frame shows both.
|
|
676
|
+
const [wasDisabled, setWasDisabled] = useState(isDisabled);
|
|
677
|
+
if (isDisabled !== wasDisabled) {
|
|
678
|
+
setWasDisabled(isDisabled);
|
|
679
|
+
if (isDisabled && isSheetOpen) {
|
|
680
|
+
setIsSheetOpen(false);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
useDevWarning(
|
|
684
|
+
'PowerSearch',
|
|
685
|
+
'`menuWidth` has no surface in the bottom-sheet presentation: the sheet flow has no typeahead popover to size. Pass `presentation="popover"` to keep the popover on every device, or leave it out.',
|
|
686
|
+
isSheetPresentation && menuWidth != null,
|
|
687
|
+
);
|
|
688
|
+
useDevWarning(
|
|
689
|
+
'PowerSearch',
|
|
690
|
+
'`tokenOverflowBehavior` has no surface in the bottom-sheet presentation: the trigger wraps its display-only tokens. Pass `presentation="popover"` to keep the tokenizer field on every device, or leave it out.',
|
|
691
|
+
isSheetPresentation && tokenOverflowBehavior != null,
|
|
692
|
+
);
|
|
693
|
+
|
|
540
694
|
const [popoverState, setPopoverStateRaw] = useState<PopoverState>({
|
|
541
695
|
type: 'idle',
|
|
542
696
|
});
|
|
@@ -552,7 +706,7 @@ export function PowerSearch({
|
|
|
552
706
|
const operatorLabel = operator ? resolveOperatorLabel(operator, t) : '';
|
|
553
707
|
const label = `${fieldLabel}: ${operatorLabel}`.trim();
|
|
554
708
|
const value = operator
|
|
555
|
-
?
|
|
709
|
+
? formatTokenValueText(
|
|
556
710
|
operator.value,
|
|
557
711
|
filter.value,
|
|
558
712
|
Math.max(
|
|
@@ -560,11 +714,14 @@ export function PowerSearch({
|
|
|
560
714
|
10,
|
|
561
715
|
),
|
|
562
716
|
locale,
|
|
717
|
+
undefined,
|
|
718
|
+
undefined,
|
|
719
|
+
timezoneID,
|
|
563
720
|
)
|
|
564
721
|
: null;
|
|
565
722
|
return {label, value, full: value != null ? `${label} ${value}` : label};
|
|
566
723
|
},
|
|
567
|
-
[config, maxTokenLength, t, locale],
|
|
724
|
+
[config, maxTokenLength, t, locale, timezoneID],
|
|
568
725
|
);
|
|
569
726
|
// The built-in token being edited. A token from a `components` override
|
|
570
727
|
// names itself, so its editor keeps the plain popover.
|
|
@@ -581,9 +738,21 @@ export function PowerSearch({
|
|
|
581
738
|
componentOverrides?.[editedOperator.value.type]?.Token == null
|
|
582
739
|
? editedFilter
|
|
583
740
|
: undefined;
|
|
741
|
+
// Whether the editor popover is open, for the hand-off below, which runs
|
|
742
|
+
// in the commit that swaps presentations.
|
|
743
|
+
const isPopoverOpenRef = useRef(false);
|
|
744
|
+
// When `adaptive` flips to the sheet while the editor popover is open (a
|
|
745
|
+
// phone rotated), the editing ends with the popover: its state returns to
|
|
746
|
+
// idle (through the raw setter, since the tokenizer input is gone), in the
|
|
747
|
+
// render that sees the swap, so a later switch back does not reopen a stale
|
|
748
|
+
// editor.
|
|
749
|
+
if (isSheetPresentation && popoverState.type !== 'idle') {
|
|
750
|
+
setPopoverStateRaw({type: 'idle'});
|
|
751
|
+
}
|
|
584
752
|
|
|
585
753
|
// Layer for positioning the edit popover anchored to the tokenizer
|
|
586
754
|
const handleLayerHide = useCallback(() => {
|
|
755
|
+
isPopoverOpenRef.current = false;
|
|
587
756
|
setPopoverStateRaw({type: 'idle'});
|
|
588
757
|
}, []);
|
|
589
758
|
|
|
@@ -604,9 +773,54 @@ export function PowerSearch({
|
|
|
604
773
|
: undefined,
|
|
605
774
|
});
|
|
606
775
|
|
|
776
|
+
// A presentation swap removes the focused control, so the other
|
|
777
|
+
// presentation's primary control (the combobox input or the trigger) takes
|
|
778
|
+
// focus and focus never falls to the page body. Each presentation keys its
|
|
779
|
+
// root, so a swap mounts a new root. The detaching root notes that it held
|
|
780
|
+
// focus, which also covers an input focused by server-rendered `autofocus`
|
|
781
|
+
// before hydration. The editor popover is portaled outside the root, so an
|
|
782
|
+
// open editor counts as held focus. The attaching root gives focus to its
|
|
783
|
+
// primary control when focus has fallen to the page body; the sheet root
|
|
784
|
+
// also hides a popover layer left open.
|
|
785
|
+
const isFocusPendingHandOffRef = useRef(false);
|
|
786
|
+
const hidePopover = popover.hide;
|
|
787
|
+
const handOffFocusRef = useCallback(
|
|
788
|
+
(node: HTMLDivElement | null) => {
|
|
789
|
+
if (node == null) {
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
const trigger = triggerRef.current;
|
|
793
|
+
const isSheetRoot = trigger != null && node.contains(trigger);
|
|
794
|
+
// The sheet presentation preloads the flow's chunk, so the first press
|
|
795
|
+
// opens without waiting for the network; nothing renders.
|
|
796
|
+
if (isSheetRoot) {
|
|
797
|
+
void loadPowerSearchBottomSheet();
|
|
798
|
+
}
|
|
799
|
+
if (isSheetRoot && isPopoverOpenRef.current) {
|
|
800
|
+
isPopoverOpenRef.current = false;
|
|
801
|
+
hidePopover();
|
|
802
|
+
}
|
|
803
|
+
const takesFocus = isFocusPendingHandOffRef.current;
|
|
804
|
+
isFocusPendingHandOffRef.current = false;
|
|
805
|
+
if (takesFocus && isFocusDetached(node.ownerDocument)) {
|
|
806
|
+
focusAfterSwap(isSheetRoot ? trigger : tokenizerRef.current);
|
|
807
|
+
}
|
|
808
|
+
return () => {
|
|
809
|
+
if (
|
|
810
|
+
node.contains(node.ownerDocument.activeElement) ||
|
|
811
|
+
isPopoverOpenRef.current
|
|
812
|
+
) {
|
|
813
|
+
isFocusPendingHandOffRef.current = true;
|
|
814
|
+
}
|
|
815
|
+
};
|
|
816
|
+
},
|
|
817
|
+
[focusAfterSwap, hidePopover],
|
|
818
|
+
);
|
|
819
|
+
|
|
607
820
|
// Wrapper that manages layer visibility and tokenizer focus alongside state
|
|
608
821
|
const setPopoverState = useCallback(
|
|
609
822
|
(state: PopoverState) => {
|
|
823
|
+
isPopoverOpenRef.current = state.type !== 'idle';
|
|
610
824
|
setPopoverStateRaw(state);
|
|
611
825
|
if (state.type !== 'idle') {
|
|
612
826
|
// Schedule after the current frame so React can render the popover
|
|
@@ -623,13 +837,22 @@ export function PowerSearch({
|
|
|
623
837
|
[popover],
|
|
624
838
|
);
|
|
625
839
|
|
|
626
|
-
// Expose imperative handle
|
|
840
|
+
// Expose imperative handle; in the sheet presentation the trigger is the
|
|
841
|
+
// field's focusable control.
|
|
627
842
|
useImperativeHandle(handleRef, () => ({
|
|
628
843
|
focusTypeahead() {
|
|
629
|
-
|
|
844
|
+
if (isSheetPresentation) {
|
|
845
|
+
triggerRef.current?.focus();
|
|
846
|
+
} else {
|
|
847
|
+
tokenizerRef.current?.focus();
|
|
848
|
+
}
|
|
630
849
|
},
|
|
631
850
|
blurTypeahead() {
|
|
632
|
-
|
|
851
|
+
if (isSheetPresentation) {
|
|
852
|
+
triggerRef.current?.blur();
|
|
853
|
+
} else {
|
|
854
|
+
tokenizerRef.current?.blur();
|
|
855
|
+
}
|
|
633
856
|
},
|
|
634
857
|
}));
|
|
635
858
|
|
|
@@ -833,10 +1056,12 @@ export function PowerSearch({
|
|
|
833
1056
|
setPopoverState({type: 'idle'});
|
|
834
1057
|
}, [setPopoverState]);
|
|
835
1058
|
|
|
836
|
-
//
|
|
837
|
-
//
|
|
838
|
-
|
|
839
|
-
|
|
1059
|
+
// Token renderer for both presentations. Given `onRemove`, the token is
|
|
1060
|
+
// the tokenizer field's: click edits, × removes. Without it (the sheet
|
|
1061
|
+
// presentation's trigger) the token is display-only; the field as a whole
|
|
1062
|
+
// opens the flow.
|
|
1063
|
+
const renderFilterToken = useCallback(
|
|
1064
|
+
(item: PowerSearchItem, onRemove: (() => void) | undefined) => {
|
|
840
1065
|
const auxData = item.auxiliaryData;
|
|
841
1066
|
const filterIndex = auxData?.filterIndex ?? -1;
|
|
842
1067
|
const filter = filterIndex >= 0 ? filters[filterIndex] : undefined;
|
|
@@ -846,7 +1071,8 @@ export function PowerSearch({
|
|
|
846
1071
|
? config.getOperator(auxData.fieldKey, auxData.operatorKey)
|
|
847
1072
|
: undefined;
|
|
848
1073
|
|
|
849
|
-
const canInteract =
|
|
1074
|
+
const canInteract =
|
|
1075
|
+
onRemove != null && !isReadOnly && !isDisabled && !filter?.isReadOnly;
|
|
850
1076
|
const handleClick = canInteract
|
|
851
1077
|
? () => handleTokenClick(filterIndex)
|
|
852
1078
|
: undefined;
|
|
@@ -868,6 +1094,7 @@ export function PowerSearch({
|
|
|
868
1094
|
onClick={handleClick}
|
|
869
1095
|
onRemove={handleRemove}
|
|
870
1096
|
isDisabled={isDisabled}
|
|
1097
|
+
timezoneID={timezoneID}
|
|
871
1098
|
/>
|
|
872
1099
|
);
|
|
873
1100
|
}
|
|
@@ -944,6 +1171,7 @@ export function PowerSearch({
|
|
|
944
1171
|
);
|
|
945
1172
|
},
|
|
946
1173
|
[
|
|
1174
|
+
timezoneID,
|
|
947
1175
|
filters,
|
|
948
1176
|
config,
|
|
949
1177
|
configProp,
|
|
@@ -959,6 +1187,12 @@ export function PowerSearch({
|
|
|
959
1187
|
],
|
|
960
1188
|
);
|
|
961
1189
|
|
|
1190
|
+
const renderToken = useCallback(
|
|
1191
|
+
(item: PowerSearchItem, onRemove: () => void) =>
|
|
1192
|
+
renderFilterToken(item, onRemove),
|
|
1193
|
+
[renderFilterToken],
|
|
1194
|
+
);
|
|
1195
|
+
|
|
962
1196
|
// Custom typeahead item renderer — adds field icon and description
|
|
963
1197
|
const renderItem = useCallback(
|
|
964
1198
|
(item: PowerSearchItem) => {
|
|
@@ -1032,6 +1266,7 @@ export function PowerSearch({
|
|
|
1032
1266
|
onCancel={handlePopoverCancel}
|
|
1033
1267
|
saveButtonLabel={popoverSaveButtonLabel}
|
|
1034
1268
|
isReadOnly={isReadOnly}
|
|
1269
|
+
timezoneID={timezoneID}
|
|
1035
1270
|
/>
|
|
1036
1271
|
);
|
|
1037
1272
|
}
|
|
@@ -1047,9 +1282,11 @@ export function PowerSearch({
|
|
|
1047
1282
|
saveButtonLabel={popoverSaveButtonLabel}
|
|
1048
1283
|
maxMenuItems={maxOperatorMenuItems}
|
|
1049
1284
|
isReadOnly={isReadOnly}
|
|
1285
|
+
timezoneID={timezoneID}
|
|
1050
1286
|
/>
|
|
1051
1287
|
);
|
|
1052
1288
|
}, [
|
|
1289
|
+
timezoneID,
|
|
1053
1290
|
popoverPartialFilter,
|
|
1054
1291
|
popoverState,
|
|
1055
1292
|
EditorOverride,
|
|
@@ -1076,13 +1313,18 @@ export function PowerSearch({
|
|
|
1076
1313
|
return resultCount;
|
|
1077
1314
|
}, [resultCount, t]);
|
|
1078
1315
|
|
|
1079
|
-
//
|
|
1080
|
-
//
|
|
1081
|
-
//
|
|
1082
|
-
//
|
|
1083
|
-
//
|
|
1084
|
-
//
|
|
1085
|
-
//
|
|
1316
|
+
// This Effect synchronizes a polite live region with the result count,
|
|
1317
|
+
// mirroring the way Typeahead announces its dropdown result count: the count
|
|
1318
|
+
// is otherwise only shown visually and stays silent to assistive tech. The
|
|
1319
|
+
// region follows where the field is: the modal that holds the field (a
|
|
1320
|
+
// Dialog, a modal Drawer), else the shared channel. While a sheet of the flow is open the sheet itself announces the
|
|
1321
|
+
// count from inside its dialog, and this Effect stays quiet. Only a
|
|
1322
|
+
// change after mount is spoken — the count present on mount is not
|
|
1323
|
+
// announced unprompted — and the guard compares against the last announced
|
|
1324
|
+
// text rather than a mounted flag, so StrictMode's effect replay announces
|
|
1325
|
+
// nothing either. A change that lands while the flow is closing waits for
|
|
1326
|
+
// the trigger focus, since the dialog is still modal through its exit. The
|
|
1327
|
+
// announcement acquires no resource, so there is no cleanup.
|
|
1086
1328
|
const announce = useAnnounce();
|
|
1087
1329
|
// PowerSearch words its Clear all as its record does; the field announces
|
|
1088
1330
|
// these words instead of Tokenizer's (component:Tokenizer AR7).
|
|
@@ -1095,15 +1337,20 @@ export function PowerSearch({
|
|
|
1095
1337
|
[hasReadOnlyFilter, t],
|
|
1096
1338
|
);
|
|
1097
1339
|
const announcedResultCountRef = useRef(resultCountText);
|
|
1340
|
+
const isSheetExiting = isSheetPresented && !isSheetOpen;
|
|
1098
1341
|
useEffect(() => {
|
|
1099
1342
|
if (resultCountText === announcedResultCountRef.current) {
|
|
1100
1343
|
return;
|
|
1101
1344
|
}
|
|
1102
1345
|
announcedResultCountRef.current = resultCountText;
|
|
1103
1346
|
if (resultCountText != null) {
|
|
1104
|
-
|
|
1347
|
+
if (isSheetExiting) {
|
|
1348
|
+
afterCloseResultCountRef.current = resultCountText;
|
|
1349
|
+
} else if (!isSheetOpen) {
|
|
1350
|
+
announce(resultCountText);
|
|
1351
|
+
}
|
|
1105
1352
|
}
|
|
1106
|
-
}, [resultCountText, announce]);
|
|
1353
|
+
}, [resultCountText, announce, isSheetExiting, isSheetOpen]);
|
|
1107
1354
|
|
|
1108
1355
|
// Build combined endContent from resultCount + endContent props
|
|
1109
1356
|
const combinedEndContent = useMemo((): React.ReactNode => {
|
|
@@ -1124,14 +1371,231 @@ export function PowerSearch({
|
|
|
1124
1371
|
return resultCountNode || endContent || undefined;
|
|
1125
1372
|
}, [resultCountText, endContent]);
|
|
1126
1373
|
|
|
1374
|
+
// ------------------------------------------------------- sheet trigger --
|
|
1375
|
+
|
|
1376
|
+
// Disabled-reason tooltip for the sheet trigger. Disabled controls swallow
|
|
1377
|
+
// pointer events, so the listeners attach to the field's control box; the
|
|
1378
|
+
// trigger stays perceivable through aria-disabled.
|
|
1379
|
+
const showsDisabledMessage = isDisabled && !!disabledMessage;
|
|
1380
|
+
const disabledMessageTooltip = useTooltip({
|
|
1381
|
+
placement: 'above',
|
|
1382
|
+
focusTrigger: 'always',
|
|
1383
|
+
isEnabled: isSheetPresentation && showsDisabledMessage,
|
|
1384
|
+
});
|
|
1385
|
+
const rootRef = useMergedRefs(
|
|
1386
|
+
ref,
|
|
1387
|
+
popover.triggerRef as React.Ref<HTMLDivElement>,
|
|
1388
|
+
handOffFocusRef,
|
|
1389
|
+
);
|
|
1390
|
+
|
|
1391
|
+
const openSheet = useCallback(() => {
|
|
1392
|
+
if (isDisabled) {
|
|
1393
|
+
return;
|
|
1394
|
+
}
|
|
1395
|
+
// The flow restores focus to the element that was active when it opened;
|
|
1396
|
+
// make sure that is the trigger even for a tap on a token.
|
|
1397
|
+
triggerRef.current?.focus({preventScroll: true});
|
|
1398
|
+
setIsSheetPresented(true);
|
|
1399
|
+
setIsSheetOpen(true);
|
|
1400
|
+
}, [isDisabled]);
|
|
1401
|
+
|
|
1402
|
+
// The field's end lane — the result count and `endContent` — sits outside
|
|
1403
|
+
// the trigger button: a caller's action button there keeps its own tab stop
|
|
1404
|
+
// and taps, and an interactive control must not nest in a component
|
|
1405
|
+
// button, so a tap on it must not open the flow.
|
|
1406
|
+
const endLaneRef = useRef<HTMLDivElement>(null);
|
|
1407
|
+
const handleTriggerWrapperClick = useCallback(
|
|
1408
|
+
(event: React.MouseEvent<HTMLDivElement>) => {
|
|
1409
|
+
// Tokens are display-only; a tap on them or the empty space around them
|
|
1410
|
+
// opens the flow. The trigger button handles its own click, and the end
|
|
1411
|
+
// lane handles its own.
|
|
1412
|
+
if (
|
|
1413
|
+
event.target instanceof Node &&
|
|
1414
|
+
(triggerRef.current?.contains(event.target) ||
|
|
1415
|
+
endLaneRef.current?.contains(event.target))
|
|
1416
|
+
) {
|
|
1417
|
+
return;
|
|
1418
|
+
}
|
|
1419
|
+
openSheet();
|
|
1420
|
+
},
|
|
1421
|
+
[openSheet],
|
|
1422
|
+
);
|
|
1423
|
+
|
|
1424
|
+
const handleTriggerFocusWithin = useCallback(
|
|
1425
|
+
(event: React.FocusEvent<HTMLDivElement>) => {
|
|
1426
|
+
// The flow focuses the trigger only after its exit completes; that focus
|
|
1427
|
+
// is the signal that the retained sheets can leave. If the resolution
|
|
1428
|
+
// moved to the popover meanwhile, the tokenizer input takes over the
|
|
1429
|
+
// focus once it mounts (the hand-off above).
|
|
1430
|
+
if (!isSheetOpen && isSheetPresented) {
|
|
1431
|
+
setIsSheetPresented(false);
|
|
1432
|
+
// The dialogs have closed: the page-body channel is exposed again.
|
|
1433
|
+
const resultCount = afterCloseResultCountRef.current;
|
|
1434
|
+
afterCloseResultCountRef.current = null;
|
|
1435
|
+
if (resultCount != null) {
|
|
1436
|
+
announce(resultCount);
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
if (
|
|
1440
|
+
!(event.relatedTarget instanceof Node) ||
|
|
1441
|
+
!event.currentTarget.contains(event.relatedTarget)
|
|
1442
|
+
) {
|
|
1443
|
+
handleFieldFocus(event);
|
|
1444
|
+
}
|
|
1445
|
+
},
|
|
1446
|
+
[announce, handleFieldFocus, isSheetOpen, isSheetPresented],
|
|
1447
|
+
);
|
|
1448
|
+
const handleTriggerBlurWithin = useCallback(
|
|
1449
|
+
(event: React.FocusEvent<HTMLDivElement>) => {
|
|
1450
|
+
if (
|
|
1451
|
+
!(event.relatedTarget instanceof Node) ||
|
|
1452
|
+
!event.currentTarget.contains(event.relatedTarget)
|
|
1453
|
+
) {
|
|
1454
|
+
handleFieldBlur(event);
|
|
1455
|
+
}
|
|
1456
|
+
},
|
|
1457
|
+
[handleFieldBlur],
|
|
1458
|
+
);
|
|
1459
|
+
|
|
1460
|
+
if (isSheetPresentation) {
|
|
1461
|
+
const triggerDescribedBy =
|
|
1462
|
+
[
|
|
1463
|
+
status?.message ? statusMessageId : null,
|
|
1464
|
+
showsDisabledMessage ? disabledMessageTooltip.describedBy : null,
|
|
1465
|
+
]
|
|
1466
|
+
.filter(Boolean)
|
|
1467
|
+
.join(' ') || undefined;
|
|
1468
|
+
|
|
1469
|
+
return (
|
|
1470
|
+
<div key="sheet" ref={rootRef} {...themeProps('power-search')}>
|
|
1471
|
+
<Field
|
|
1472
|
+
label={label}
|
|
1473
|
+
isLabelHidden={isLabelHidden}
|
|
1474
|
+
inputID={triggerId}
|
|
1475
|
+
labelID={triggerLabelId}
|
|
1476
|
+
isDisabled={isDisabled}
|
|
1477
|
+
status={
|
|
1478
|
+
status
|
|
1479
|
+
? {
|
|
1480
|
+
type: status.type,
|
|
1481
|
+
message: status.message,
|
|
1482
|
+
messageID: status.message ? statusMessageId : undefined,
|
|
1483
|
+
}
|
|
1484
|
+
: undefined
|
|
1485
|
+
}
|
|
1486
|
+
statusVariant={statusVariant}
|
|
1487
|
+
xstyle={xstyle}
|
|
1488
|
+
className={className}
|
|
1489
|
+
style={style}>
|
|
1490
|
+
<div
|
|
1491
|
+
ref={disabledMessageTooltip.ref}
|
|
1492
|
+
onClick={handleTriggerWrapperClick}
|
|
1493
|
+
onFocus={handleTriggerFocusWithin}
|
|
1494
|
+
onBlur={handleTriggerBlurWithin}
|
|
1495
|
+
aria-disabled={isDisabled ? true : undefined}
|
|
1496
|
+
{...stylex.props(
|
|
1497
|
+
inputWrapperStyles.base,
|
|
1498
|
+
sheetTriggerStyles.wrapper,
|
|
1499
|
+
filters.length > 0 && sheetTriggerStyles.wrapperWithTokens,
|
|
1500
|
+
sheetTriggerSizeStyles[size],
|
|
1501
|
+
isDisabled && inputWrapperStyles.disabled,
|
|
1502
|
+
status && inputStatusBorderStyles[status.type],
|
|
1503
|
+
status &&
|
|
1504
|
+
!isDisabled &&
|
|
1505
|
+
inputStatusHoverShadowStyles[status.type],
|
|
1506
|
+
status && inputStatusFocusWithinStyles[status.type],
|
|
1507
|
+
)}>
|
|
1508
|
+
{/* The trigger's name is the label plus everything visible here:
|
|
1509
|
+
the placeholder, or the tokens, so speech input can say what
|
|
1510
|
+
it sees and assistive technology hears the selected filters
|
|
1511
|
+
(WCAG 2.5.3). */}
|
|
1512
|
+
<div
|
|
1513
|
+
id={triggerContentId}
|
|
1514
|
+
{...stylex.props(sheetTriggerStyles.contentSection)}>
|
|
1515
|
+
{isRenderable(startIcon as React.ReactNode) && (
|
|
1516
|
+
<span
|
|
1517
|
+
{...stylex.props(
|
|
1518
|
+
filters.length > 0 &&
|
|
1519
|
+
sheetTriggerStyles.startIconWithTokens,
|
|
1520
|
+
)}>
|
|
1521
|
+
{renderIconSlot(startIcon, {size: 'sm', color: 'secondary'})}
|
|
1522
|
+
</span>
|
|
1523
|
+
)}
|
|
1524
|
+
{tokenizerValue.map(item => (
|
|
1525
|
+
<React.Fragment key={item.id}>
|
|
1526
|
+
{renderFilterToken(item, undefined)}
|
|
1527
|
+
</React.Fragment>
|
|
1528
|
+
))}
|
|
1529
|
+
<button
|
|
1530
|
+
type="button"
|
|
1531
|
+
id={triggerId}
|
|
1532
|
+
ref={triggerRef}
|
|
1533
|
+
// The field's primary control: `data-testid` lands here, as it
|
|
1534
|
+
// lands on the combobox input in the popover presentation.
|
|
1535
|
+
data-testid={testId}
|
|
1536
|
+
autoFocus={autoFocusOnMount}
|
|
1537
|
+
onClick={openSheet}
|
|
1538
|
+
aria-disabled={isDisabled ? true : undefined}
|
|
1539
|
+
aria-haspopup="dialog"
|
|
1540
|
+
aria-expanded={isSheetOpen}
|
|
1541
|
+
aria-labelledby={`${triggerLabelId} ${triggerContentId}`}
|
|
1542
|
+
aria-describedby={triggerDescribedBy}
|
|
1543
|
+
{...stylex.props(
|
|
1544
|
+
sheetTriggerStyles.trigger,
|
|
1545
|
+
filters.length > 0 && sheetTriggerStyles.triggerWithTokens,
|
|
1546
|
+
)}>
|
|
1547
|
+
{filters.length === 0 ? placeholder : null}
|
|
1548
|
+
</button>
|
|
1549
|
+
</div>
|
|
1550
|
+
{(endContent || isRenderable(resultCountText)) && (
|
|
1551
|
+
<div
|
|
1552
|
+
ref={endLaneRef}
|
|
1553
|
+
{...stylex.props(sheetTriggerStyles.endSection)}>
|
|
1554
|
+
{isRenderable(resultCountText) && (
|
|
1555
|
+
<span {...stylex.props(resultCountStyles.text)}>
|
|
1556
|
+
{resultCountText}
|
|
1557
|
+
</span>
|
|
1558
|
+
)}
|
|
1559
|
+
{endContent}
|
|
1560
|
+
</div>
|
|
1561
|
+
)}
|
|
1562
|
+
</div>
|
|
1563
|
+
{showsDisabledMessage &&
|
|
1564
|
+
disabledMessageTooltip.renderTooltip(disabledMessage)}
|
|
1565
|
+
</Field>
|
|
1566
|
+
{/* Mounted from the press until the flow's exit has completed and
|
|
1567
|
+
focus is back on the trigger (`isSheetPresented`): at rest the
|
|
1568
|
+
field renders its trigger alone — no closed dialogs, rows, search
|
|
1569
|
+
field or editors in the DOM. */}
|
|
1570
|
+
{(isSheetOpen || isSheetPresented) && (
|
|
1571
|
+
<PowerSearchSheetHost
|
|
1572
|
+
isOpen={isSheetOpen}
|
|
1573
|
+
onOpenChange={setIsSheetOpen}
|
|
1574
|
+
finalFocusRef={triggerRef}
|
|
1575
|
+
resultCountText={resultCountText}
|
|
1576
|
+
config={config}
|
|
1577
|
+
configProp={configProp}
|
|
1578
|
+
filters={filters}
|
|
1579
|
+
onChange={onChange}
|
|
1580
|
+
searchSource={searchSource}
|
|
1581
|
+
placeholder={placeholder}
|
|
1582
|
+
isReadOnly={isReadOnly}
|
|
1583
|
+
isDisabled={isDisabled}
|
|
1584
|
+
hasClear={hasClear}
|
|
1585
|
+
maxOperatorMenuItems={maxOperatorMenuItems}
|
|
1586
|
+
timezoneID={timezoneID}
|
|
1587
|
+
maxSearchResults={maxSearchResults}
|
|
1588
|
+
saveButtonLabel={popoverSaveButtonLabelFromProps}
|
|
1589
|
+
components={componentOverrides}
|
|
1590
|
+
/>
|
|
1591
|
+
)}
|
|
1592
|
+
</div>
|
|
1593
|
+
);
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1127
1596
|
return (
|
|
1128
1597
|
<>
|
|
1129
|
-
<div
|
|
1130
|
-
ref={useMergedRefs(
|
|
1131
|
-
ref,
|
|
1132
|
-
popover.triggerRef as React.Ref<HTMLDivElement>,
|
|
1133
|
-
)}
|
|
1134
|
-
{...themeProps('power-search')}>
|
|
1598
|
+
<div key="popover" ref={rootRef} {...themeProps('power-search')}>
|
|
1135
1599
|
{/* The field's Clear all announces PowerSearch's own words
|
|
1136
1600
|
(component:PowerSearch; component:Tokenizer AR7). */}
|
|
1137
1601
|
<TokenizerClearAllMessageContext value={clearAllMessage}>
|
|
@@ -1148,7 +1612,7 @@ export function PowerSearch({
|
|
|
1148
1612
|
maxMenuItems={MAX_BROWSE_MENU_ITEMS}
|
|
1149
1613
|
menuWidth={menuWidth}
|
|
1150
1614
|
placeholder={filters.length === 0 ? placeholder : ''}
|
|
1151
|
-
hasAutoFocus={
|
|
1615
|
+
hasAutoFocus={autoFocusOnMount}
|
|
1152
1616
|
hasClear={hasClear && !isReadOnly}
|
|
1153
1617
|
startIcon={startIcon}
|
|
1154
1618
|
endContent={combinedEndContent}
|
|
@@ -1160,12 +1624,13 @@ export function PowerSearch({
|
|
|
1160
1624
|
debounceMs={0}
|
|
1161
1625
|
status={status}
|
|
1162
1626
|
statusVariant={statusVariant}
|
|
1163
|
-
onFocus={
|
|
1164
|
-
onBlur={
|
|
1627
|
+
onFocus={handleFieldFocus}
|
|
1628
|
+
onBlur={handleFieldBlur}
|
|
1165
1629
|
containerXstyle={xstyle}
|
|
1166
1630
|
containerClassName={className}
|
|
1167
1631
|
containerStyle={style}
|
|
1168
1632
|
data-testid={testId}
|
|
1633
|
+
presentation="popover"
|
|
1169
1634
|
/>
|
|
1170
1635
|
</TokenizerItemRemovableContext>
|
|
1171
1636
|
</TokenizerClearAllMessageContext>
|