@astryxdesign/core 0.7.7 → 0.7.8-canary.36cde5e
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 +5 -0
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +1 -0
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +25 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
- package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
- package/dist/BottomSheet/useMobileKeyboard.js +6 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +12 -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 +15 -16
- 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 +4 -0
- 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/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 +625 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +1 -0
- package/dist/DateInput/Wheel.d.ts +18 -37
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +84 -113
- 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 +74 -0
- package/dist/DateInput/wheelOptions.d.ts.map +1 -0
- package/dist/DateInput/wheelOptions.js +98 -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 +2 -0
- 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 +20 -33
- package/dist/Icon/Icon.d.ts +5 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +5 -2
- 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 +3 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
- package/dist/Layer/useLayerDismissal.js +3 -0
- package/dist/Layer/usePressPin.d.ts +17 -5
- package/dist/Layer/usePressPin.d.ts.map +1 -1
- package/dist/Layer/usePressPin.js +62 -12
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +3 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -0
- package/dist/MobileNav/MobileNav.d.ts +3 -2
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +9 -25
- 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/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -0
- package/dist/PowerSearch/PowerSearch.d.ts +43 -4
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +445 -134
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +25 -6
- 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 +7 -2
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +193 -83
- package/dist/PowerSearch/formatFilterValue.d.ts +18 -6
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +33 -12
- package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
- package/dist/PowerSearch/formatTokenValue.js +162 -0
- package/dist/PowerSearch/powerSearchDateZone.d.ts +21 -0
- package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchDateZone.js +37 -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 +2 -0
- 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 +101 -77
- package/dist/Resizable/createResizable.d.ts +145 -0
- package/dist/Resizable/createResizable.d.ts.map +1 -0
- package/dist/Resizable/createResizable.js +575 -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 +5 -8
- 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/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.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
- package/dist/TextInput/TextInput.d.ts +2 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +10 -7
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +2 -0
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +2 -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/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 +49 -37
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +22 -19
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +1 -1
- package/dist/Tokenizer/index.d.ts +1 -1
- package/dist/Tokenizer/index.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +19 -1
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +34 -53
- 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 +39 -6
- package/dist/gestures/GestureHost.d.ts +16 -1
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +1 -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 +13 -3
- 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 +134 -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/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 +7 -9
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +55 -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 +42 -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-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +30 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +30 -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/motion/animatedLayout.d.ts.map +1 -1
- package/dist/motion/animatedLayout.js +7 -7
- package/dist/motion/animator.d.ts +14 -14
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +45 -20
- 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/index.d.ts +4 -3
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +4 -3
- 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/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 +7 -0
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +12 -0
- package/dist/utils/focusReturn.d.ts +15 -0
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +28 -0
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +4 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +3 -2
- package/dist/utils/plainDate.d.ts +8 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +19 -0
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +20 -6
- 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 +120 -0
- package/locales/pseudo.json +90 -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 +4 -0
- package/src/BottomSheet/BottomSheet.tsx +1 -0
- package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
- package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
- package/src/BottomSheet/useMobileKeyboard.ts +4 -0
- package/src/BottomSheet/useSheetGestures.ts +10 -1
- package/src/Button/Button.tsx +26 -4
- package/src/Calendar/Calendar.tsx +36 -25
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/ChatComposerInput.tsx +2 -0
- 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/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 +765 -0
- package/src/DateInput/TouchDateField.tsx +1 -0
- package/src/DateInput/Wheel.tsx +94 -150
- 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 +155 -0
- package/src/DateInput/wheelPhysics.ts +406 -0
- package/src/DateInput/wheelStrip.ts +341 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +2 -0
- 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 +49 -54
- package/src/Icon/Icon.doc.mjs +49 -8
- package/src/Icon/Icon.tsx +15 -7
- package/src/IconButton/IconButton.doc.mjs +141 -21
- 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 +2 -0
- package/src/Layer/useLayerDismissal.ts +2 -0
- package/src/Layer/usePressPin.ts +81 -15
- package/src/Layer/useTouchTrigger.ts +2 -0
- package/src/Lightbox/Lightbox.tsx +19 -0
- package/src/MobileNav/MobileNav.tsx +9 -30
- package/src/Outline/useOutlineFromDOM.ts +2 -0
- package/src/Outline/useScrollSpy.ts +2 -0
- package/src/OverflowList/OverflowList.tsx +2 -0
- package/src/Popover/Popover.tsx +4 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
- package/src/PowerSearch/PowerSearch.tsx +627 -157
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +39 -6
- package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
- package/src/PowerSearch/PowerSearchToken.tsx +7 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +244 -58
- package/src/PowerSearch/formatFilterValue.ts +55 -17
- package/src/PowerSearch/formatTokenValue.ts +222 -0
- package/src/PowerSearch/powerSearchDateZone.ts +64 -0
- package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
- package/src/PowerSearch/types.ts +2 -0
- 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 +169 -109
- package/src/Resizable/createResizable.ts +831 -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 +5 -12
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Spinner/Spinner.tsx +77 -63
- 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 +4 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
- package/src/TextInput/TextInput.tsx +11 -10
- package/src/TimeInput/TimeInput.tsx +2 -0
- package/src/TimeInput/TouchTimeField.tsx +2 -0
- package/src/Timer/Timer.tsx +1 -0
- package/src/Timestamp/Timestamp.tsx +1 -1
- 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 +19 -3
- package/src/Tokenizer/Tokenizer.tsx +73 -51
- package/src/Tokenizer/TokenizerBottomSheet.tsx +1 -1
- package/src/Tokenizer/index.ts +1 -0
- package/src/Tooltip/useTooltip.doc.mjs +24 -0
- package/src/Tooltip/useTooltip.tsx +61 -56
- 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 +1 -1
- 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 +20 -5
- 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 +182 -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 +57 -60
- package/src/hooks/useScrollableArea.ts +4 -0
- package/src/hooks/useStreamingText.ts +2 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -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-locales/en.generated.ts +41 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +42 -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/motion/MEASUREMENTS.md +18 -0
- package/src/motion/README.md +10 -5
- package/src/motion/animatedLayout.ts +10 -5
- package/src/motion/animator.ts +66 -31
- 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/index.ts +4 -3
- 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/motionKnobs.ts +4 -3
- package/src/theme/themeMotion.ts +7 -0
- package/src/utils/dateParser.ts +16 -0
- package/src/utils/focusReturn.ts +30 -0
- package/src/utils/interactionModality.ts +4 -0
- package/src/utils/interactionOverlay.stylex.ts +3 -2
- package/src/utils/plainDate.ts +21 -0
- package/src/utils/pressFeedback.ts +24 -6
- package/src/utils/triggerFocus.ts +80 -0
- 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/internal/touch-sheet.ts +0 -21
|
@@ -35,21 +35,22 @@ import {
|
|
|
35
35
|
typographyVars,
|
|
36
36
|
typeScaleVars,
|
|
37
37
|
} from '../theme/tokens.stylex';
|
|
38
|
+
import {Field} from '../Field/Field';
|
|
39
|
+
import {InputClearButton} from '../Field/InputClearButton';
|
|
38
40
|
import {
|
|
39
|
-
Field,
|
|
40
|
-
InputClearButton,
|
|
41
|
-
type InputStatus,
|
|
42
41
|
inputWrapperStyles,
|
|
43
42
|
inputStatusBorderStyles,
|
|
44
43
|
inputStatusHoverShadowStyles,
|
|
45
44
|
inputStatusFocusWithinStyles,
|
|
46
|
-
} from '../Field';
|
|
47
|
-
import
|
|
45
|
+
} from '../Field/inputStyles.stylex';
|
|
46
|
+
import type {InputStatus} from '../Field/types';
|
|
47
|
+
import {renderIconSlot, type IconType} from '../Icon/Icon';
|
|
48
48
|
import {isRenderable} from '../utils/isRenderable';
|
|
49
|
-
import {Spinner} from '../Spinner';
|
|
50
|
-
import {useTooltip} from '../Tooltip';
|
|
51
|
-
import {VisuallyHidden} from '../VisuallyHidden';
|
|
52
|
-
import {getInputARIA
|
|
49
|
+
import {Spinner} from '../Spinner/Spinner';
|
|
50
|
+
import {useTooltip} from '../Tooltip/useTooltip';
|
|
51
|
+
import {VisuallyHidden} from '../VisuallyHidden/VisuallyHidden';
|
|
52
|
+
import {getInputARIA} from '../utils/inputAria';
|
|
53
|
+
import {isImeKeyEvent} from '../utils/ime';
|
|
53
54
|
import {
|
|
54
55
|
textEntryTraitAttributes,
|
|
55
56
|
type TextEntryTraitProps,
|
|
@@ -109,7 +110,7 @@ export type {
|
|
|
109
110
|
InputStatus as TextInputStatus,
|
|
110
111
|
InputStatusType as TextInputStatusType,
|
|
111
112
|
} from '../Field';
|
|
112
|
-
import {mergeProps} from '../utils';
|
|
113
|
+
import {mergeProps} from '../utils/mergeProps';
|
|
113
114
|
import {useSize} from '../SizeContext/SizeContext';
|
|
114
115
|
import {useInputContainer} from '../hooks/useInputContainer';
|
|
115
116
|
import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
|
|
@@ -491,6 +491,8 @@ function TimeField({
|
|
|
491
491
|
// region mounted together with its content is not reliably announced.
|
|
492
492
|
// Ungrouped mode delegates to Field -> FieldStatus, which announces itself.
|
|
493
493
|
const announce = useAnnounce();
|
|
494
|
+
// Syncs the live region with `status.message` when the field is in an
|
|
495
|
+
// InputGroup.
|
|
494
496
|
useEffect(() => {
|
|
495
497
|
if (inputGroup && status?.message) {
|
|
496
498
|
announce(
|
package/src/Timer/Timer.tsx
CHANGED
|
@@ -186,6 +186,7 @@ export function Timer({
|
|
|
186
186
|
const resolvedFormat = resolveFormat(format);
|
|
187
187
|
const initialPresentation = getPresentation(0, resolvedFormat);
|
|
188
188
|
|
|
189
|
+
// Syncs the elapsed-time text with a timer.
|
|
189
190
|
useEffect(() => {
|
|
190
191
|
const resolvedStartTime =
|
|
191
192
|
startTime !== undefined && Number.isFinite(startTime)
|
|
@@ -378,7 +378,7 @@ export function Timestamp({
|
|
|
378
378
|
? formatInstant(date, 'full', locale, {timeZoneNameStyle: 'long'})
|
|
379
379
|
: '';
|
|
380
380
|
|
|
381
|
-
//
|
|
381
|
+
// Syncs the relative time with an interval timer while the timestamp is live.
|
|
382
382
|
useEffect(() => {
|
|
383
383
|
if (!isLive || !isValidDate || !isRelativeFormat(effectiveFormat)) {
|
|
384
384
|
return;
|
package/src/Toast/Toast.doc.mjs
CHANGED
|
@@ -89,7 +89,7 @@ export const docs = {
|
|
|
89
89
|
name: 'renderContent',
|
|
90
90
|
type: '(toast: ToastContentRenderProps) => ReactNode',
|
|
91
91
|
description:
|
|
92
|
-
"Replaces the content of this toast's card with your own layout. Astryx keeps the card, its astryx-toast theme target
|
|
92
|
+
"Replaces the content of this toast's card with your own layout. Astryx keeps the card, its astryx-toast theme target and auto-hide behavior (inside a ToastViewport the viewport announces the toast, and while a modal hosts the viewport the card announces itself), then hands the renderer the message, endContent, resolved toast settings and a dismiss callback. The custom renderer owns every control in its layout: compose the control you want and call dismiss from it. Astryx does not inject a fallback close into custom content. Per-toast: an app shares one layout by wrapping useToast and passing it on every call, while a toast raised by library code that never passes it renders as an ordinary Astryx toast. The argument is {body, endContent, type, isAutoHide, autoHideDuration, dismiss}, where type is 'info' | 'error'.",
|
|
93
93
|
},
|
|
94
94
|
],
|
|
95
95
|
theming: {
|
|
@@ -211,7 +211,7 @@ export const docsZh = {
|
|
|
211
211
|
collisionBehavior: '当已存在相同 uniqueID 的 toast 时的行为。',
|
|
212
212
|
onHide: '当 toast 被移除时触发的回调。',
|
|
213
213
|
renderContent:
|
|
214
|
-
"用你自己的布局替换该 toast 卡片内部的内容。Astryx 保留卡片本身、astryx-toast
|
|
214
|
+
"用你自己的布局替换该 toast 卡片内部的内容。Astryx 保留卡片本身、astryx-toast 主题目标和自动关闭行为(在 ToastViewport 中由视口播报该 toast;当模态框承载视口时由卡片自行播报),并把消息、endContent、解析后的 toast 设置和 dismiss 回调交给渲染函数。自定义渲染函数完全拥有布局中的控件:请组合所需的控件并通过它调用 dismiss。Astryx 不会向自定义内容注入后备关闭按钮。按 toast 单独设置:应用可通过封装 useToast 并在每次调用时传入来共享同一套布局;而由库代码发起、从不传入该参数的 toast 会渲染为普通的 Astryx toast。传入参数为 {body, endContent, type, isAutoHide, autoHideDuration, dismiss},其中 type 为 'info' | 'error'。",
|
|
215
215
|
},
|
|
216
216
|
usage: {
|
|
217
217
|
description:
|
|
@@ -328,6 +328,7 @@ export const docsDense = {
|
|
|
328
328
|
uniqueID: 'unique id for dedup',
|
|
329
329
|
collisionBehavior: 'behavior when matching uniqueID exists',
|
|
330
330
|
onHide: 'callback when toast removed',
|
|
331
|
-
renderContent:
|
|
331
|
+
renderContent:
|
|
332
|
+
'custom inner layout; receives content, resolved settings + dismiss callback; no injected fallback control',
|
|
332
333
|
},
|
|
333
334
|
};
|
package/src/Toast/Toast.tsx
CHANGED
|
@@ -154,6 +154,16 @@ export interface ToastProps {
|
|
|
154
154
|
|
|
155
155
|
interface ToastSurfaceProps extends ToastProps {
|
|
156
156
|
gestureDirection: ToastGestureDirection;
|
|
157
|
+
/**
|
|
158
|
+
* Changes when a uniqueID overwrite updates this card in place: the new
|
|
159
|
+
* toast's auto-hide timer starts over.
|
|
160
|
+
*/
|
|
161
|
+
timerKey?: string;
|
|
162
|
+
/**
|
|
163
|
+
* False when the viewport announces the toast: the card then carries no
|
|
164
|
+
* live region of its own, so an update in place is announced once.
|
|
165
|
+
*/
|
|
166
|
+
isLiveRegion?: boolean;
|
|
157
167
|
}
|
|
158
168
|
|
|
159
169
|
/**
|
|
@@ -193,6 +203,8 @@ export function ToastSurface({
|
|
|
193
203
|
onDismiss,
|
|
194
204
|
renderContent,
|
|
195
205
|
gestureDirection,
|
|
206
|
+
timerKey,
|
|
207
|
+
isLiveRegion = true,
|
|
196
208
|
}: ToastSurfaceProps) {
|
|
197
209
|
const t = useComponentTranslator();
|
|
198
210
|
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
@@ -226,34 +238,28 @@ export function ToastSurface({
|
|
|
226
238
|
}, remainingRef.current);
|
|
227
239
|
}, [isAutoHide]);
|
|
228
240
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
},
|
|
249
|
-
[isAutoHide],
|
|
250
|
-
);
|
|
241
|
+
// Pointer, focus and gesture holds are tracked whatever isAutoHide is: an
|
|
242
|
+
// overwrite can turn a toast that does not auto-hide into one that does
|
|
243
|
+
// while a hold is in place. The window hold leaves with its listeners.
|
|
244
|
+
const pauseTimer = useCallback((source: PauseSource) => {
|
|
245
|
+
const sources = pauseSourcesRef.current;
|
|
246
|
+
const wasRunning = sources.size === 0;
|
|
247
|
+
sources.add(source);
|
|
248
|
+
if (!wasRunning) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
if (timerRef.current) {
|
|
252
|
+
clearTimeout(timerRef.current);
|
|
253
|
+
timerRef.current = null;
|
|
254
|
+
}
|
|
255
|
+
if (startTimeRef.current != null) {
|
|
256
|
+
const elapsed = Date.now() - startTimeRef.current;
|
|
257
|
+
remainingRef.current = Math.max(remainingRef.current - elapsed, 1000);
|
|
258
|
+
}
|
|
259
|
+
}, []);
|
|
251
260
|
|
|
252
261
|
const resumeTimer = useCallback(
|
|
253
262
|
(source: PauseSource) => {
|
|
254
|
-
if (!isAutoHide) {
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
263
|
const sources = pauseSourcesRef.current;
|
|
258
264
|
if (!sources.delete(source)) {
|
|
259
265
|
return;
|
|
@@ -271,20 +277,31 @@ export function ToastSurface({
|
|
|
271
277
|
}
|
|
272
278
|
startTimer();
|
|
273
279
|
},
|
|
274
|
-
[
|
|
280
|
+
[startTimer],
|
|
275
281
|
);
|
|
276
282
|
|
|
277
283
|
useEffect(() => {
|
|
278
284
|
remainingRef.current = autoHideDuration;
|
|
285
|
+
// An update in place can remove the focused control, which fires no blur:
|
|
286
|
+
// a focus hold whose focus has left the card is stale.
|
|
287
|
+
const root = cardRootRef.current?.current;
|
|
288
|
+
if (
|
|
289
|
+
pauseSourcesRef.current.has('focus') &&
|
|
290
|
+
root != null &&
|
|
291
|
+
!root.contains(root.ownerDocument.activeElement)
|
|
292
|
+
) {
|
|
293
|
+
pauseSourcesRef.current.delete('focus');
|
|
294
|
+
}
|
|
279
295
|
startTimer();
|
|
280
296
|
return () => {
|
|
281
297
|
if (timerRef.current) {
|
|
282
298
|
clearTimeout(timerRef.current);
|
|
283
299
|
}
|
|
284
300
|
};
|
|
285
|
-
// startTimer's identity is stable per isAutoHide, so this runs on mount
|
|
286
|
-
//
|
|
287
|
-
|
|
301
|
+
// startTimer's identity is stable per isAutoHide, so this runs on mount,
|
|
302
|
+
// on a genuine duration change and on an overwrite (timerKey), not on
|
|
303
|
+
// unrelated viewport renders.
|
|
304
|
+
}, [autoHideDuration, startTimer, timerKey]);
|
|
288
305
|
|
|
289
306
|
// Pause the auto-hide timer while the window is not focused, so a toast
|
|
290
307
|
// doesn't silently expire while the user is in another window or tab.
|
|
@@ -292,6 +309,7 @@ export function ToastSurface({
|
|
|
292
309
|
if (!isAutoHide) {
|
|
293
310
|
return;
|
|
294
311
|
}
|
|
312
|
+
const pauseSources = pauseSourcesRef.current;
|
|
295
313
|
const pauseForWindow = () => pauseTimer('window');
|
|
296
314
|
const resumeForWindow = () => resumeTimer('window');
|
|
297
315
|
window.addEventListener('blur', pauseForWindow);
|
|
@@ -304,6 +322,8 @@ export function ToastSurface({
|
|
|
304
322
|
return () => {
|
|
305
323
|
window.removeEventListener('blur', pauseForWindow);
|
|
306
324
|
window.removeEventListener('focus', resumeForWindow);
|
|
325
|
+
// With the listeners gone, no focus event would clear the window hold.
|
|
326
|
+
pauseSources.delete('window');
|
|
307
327
|
};
|
|
308
328
|
}, [isAutoHide, pauseTimer, resumeTimer]);
|
|
309
329
|
|
|
@@ -368,9 +388,9 @@ export function ToastSurface({
|
|
|
368
388
|
return (
|
|
369
389
|
<div
|
|
370
390
|
ref={rootRef}
|
|
371
|
-
role={isError ? 'alert' : 'status'}
|
|
372
|
-
aria-live={isError ? 'assertive' : 'polite'}
|
|
373
|
-
aria-atomic=
|
|
391
|
+
role={isLiveRegion ? (isError ? 'alert' : 'status') : undefined}
|
|
392
|
+
aria-live={isLiveRegion ? (isError ? 'assertive' : 'polite') : undefined}
|
|
393
|
+
aria-atomic={isLiveRegion ? 'true' : undefined}
|
|
374
394
|
onMouseEnter={pauseForPointer}
|
|
375
395
|
onMouseLeave={resumeForPointer}
|
|
376
396
|
onFocusCapture={pauseForFocus}
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
useMemo,
|
|
22
22
|
useRef,
|
|
23
23
|
useState,
|
|
24
|
+
useSyncExternalStore,
|
|
24
25
|
} from 'react';
|
|
25
26
|
import type {ReactNode} from 'react';
|
|
26
27
|
import {createPortal} from 'react-dom';
|
|
@@ -28,6 +29,11 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
28
29
|
import {spacingVars, durationVars, easeVars} from '../theme/tokens.stylex';
|
|
29
30
|
import {mergeProps} from '../utils';
|
|
30
31
|
import {getNodeText} from '../utils/getNodeText';
|
|
32
|
+
import {
|
|
33
|
+
moveFocusLeftBehind,
|
|
34
|
+
noteFocusWithin,
|
|
35
|
+
type FocusWithin,
|
|
36
|
+
} from '../utils/focusReturn';
|
|
31
37
|
import {INTERACTIVE_SELECTORS} from '../hooks/useClickableContainer';
|
|
32
38
|
import {useAnnounce} from '../hooks/useAnnounce';
|
|
33
39
|
import {layerTextReset} from '../Layer/layerTextReset.stylex';
|
|
@@ -224,6 +230,8 @@ interface ToastRowProps {
|
|
|
224
230
|
isReversed: boolean;
|
|
225
231
|
onExited: (id: string) => void;
|
|
226
232
|
onDismiss: (id: string, reason: ToastDismissReason) => void;
|
|
233
|
+
/** Whether the card carries its own live region (see ToastViewport). */
|
|
234
|
+
isLiveRegion: boolean;
|
|
227
235
|
}
|
|
228
236
|
|
|
229
237
|
/**
|
|
@@ -246,6 +254,7 @@ function ToastRow({
|
|
|
246
254
|
isReversed,
|
|
247
255
|
onExited,
|
|
248
256
|
onDismiss,
|
|
257
|
+
isLiveRegion,
|
|
249
258
|
}: ToastRowProps) {
|
|
250
259
|
const o = entry.options;
|
|
251
260
|
const type = o.type ?? 'info';
|
|
@@ -296,6 +305,8 @@ function ToastRow({
|
|
|
296
305
|
gestureDirection={isReversed ? -1 : 1}
|
|
297
306
|
onDismiss={reason => onDismiss(entry.id, reason)}
|
|
298
307
|
renderContent={o.renderContent}
|
|
308
|
+
timerKey={entry.id}
|
|
309
|
+
isLiveRegion={isLiveRegion}
|
|
299
310
|
/>
|
|
300
311
|
</div>
|
|
301
312
|
</div>
|
|
@@ -303,6 +314,9 @@ function ToastRow({
|
|
|
303
314
|
}
|
|
304
315
|
ToastRow.displayName = 'ToastRow';
|
|
305
316
|
|
|
317
|
+
const hasActiveModalOutlet = (): boolean => getActiveModalOutlet() != null;
|
|
318
|
+
const hasNoModalOutlet = (): boolean => false;
|
|
319
|
+
|
|
306
320
|
/**
|
|
307
321
|
* Container that renders and manages toast notifications. Place at the root
|
|
308
322
|
* of your app to enable useToast(). Toasts stack with enter/exit
|
|
@@ -363,6 +377,13 @@ export function ToastViewport({
|
|
|
363
377
|
// The next toast id that should receive focus once the dismissed toast has
|
|
364
378
|
// unmounted, or 'restore' to fall back to the previously-focused element.
|
|
365
379
|
const pendingFocusRef = useRef<string | 'restore' | null>(null);
|
|
380
|
+
// The id of a toast whose overwrite updated a row that held focus. If the
|
|
381
|
+
// update removed the focused control, the commit hands focus off.
|
|
382
|
+
const overwriteFocusRef = useRef<{id: string; note: FocusWithin} | null>(
|
|
383
|
+
null,
|
|
384
|
+
);
|
|
385
|
+
// Where focus was inside a toast whose dismissal hands focus off.
|
|
386
|
+
const dismissFocusNoteRef = useRef<FocusWithin | null>(null);
|
|
366
387
|
|
|
367
388
|
// Collect a focusable control within a toast node, if any.
|
|
368
389
|
// Reuses the canonical INTERACTIVE_SELECTORS list (native controls plus
|
|
@@ -392,13 +413,9 @@ export function ToastViewport({
|
|
|
392
413
|
[],
|
|
393
414
|
);
|
|
394
415
|
|
|
395
|
-
// Announce toasts through the persistent singleton live regions.
|
|
396
|
-
//
|
|
397
|
-
//
|
|
398
|
-
// screen readers do not announce (see useAnnounce.ts); the singleton regions
|
|
399
|
-
// are mounted empty and only mutated afterwards, so they are what actually
|
|
400
|
-
// guarantees the announcement (the per-toast markup is kept for browse-mode
|
|
401
|
-
// discoverability). The announcement happens in addToast — the imperative
|
|
416
|
+
// Announce toasts through the persistent singleton live regions. They are
|
|
417
|
+
// mounted empty and only mutated afterwards, which screen readers announce
|
|
418
|
+
// (see useAnnounce.ts). The announcement happens in addToast — the imperative
|
|
402
419
|
// dispatch path invoked once per useToast() call from an event handler,
|
|
403
420
|
// never from render — so each toast is announced exactly once by
|
|
404
421
|
// construction, independent of the React render lifecycle (StrictMode
|
|
@@ -406,6 +423,16 @@ export function ToastViewport({
|
|
|
406
423
|
// re-renders never re-announce). It is client-only (addToast never runs
|
|
407
424
|
// during SSR), so it is SSR-safe.
|
|
408
425
|
const announce = useAnnounce();
|
|
426
|
+
// An open native modal hides the body-level channel above from assistive
|
|
427
|
+
// technology, so while the viewport is hosted in one, each card announces
|
|
428
|
+
// itself through its own live region instead. Outside a modal the cards
|
|
429
|
+
// carry none, so a card updated in place is announced once.
|
|
430
|
+
const hasModalOutlet = useSyncExternalStore(
|
|
431
|
+
subscribeModalOutlets,
|
|
432
|
+
hasActiveModalOutlet,
|
|
433
|
+
hasNoModalOutlet,
|
|
434
|
+
);
|
|
435
|
+
const isModalHosted = isTopLayer && hasModalOutlet;
|
|
409
436
|
|
|
410
437
|
const addToast = useCallback(
|
|
411
438
|
(entry: ToastEntry) => {
|
|
@@ -441,9 +468,29 @@ export function ToastViewport({
|
|
|
441
468
|
if (overwritten && renderedToastsRef.current.includes(overwritten)) {
|
|
442
469
|
replacedRef.current.set(overwritten.id, overwritten);
|
|
443
470
|
}
|
|
471
|
+
// An overwrite of a toast that is not leaving keeps its row, so the card
|
|
472
|
+
// updates in place and focus inside it stays. A leaving namesake
|
|
473
|
+
// is replaced by a new row, which enters again.
|
|
474
|
+
const keepsRow =
|
|
475
|
+
overwritten != null && !exitingIdsRef.current.has(overwritten.id);
|
|
476
|
+
const placed: ToastEntry = keepsRow
|
|
477
|
+
? {...entry, rowKey: overwritten.rowKey ?? overwritten.id}
|
|
478
|
+
: entry;
|
|
479
|
+
if (keepsRow) {
|
|
480
|
+
// If the update removes the focused control, the commit hands focus
|
|
481
|
+
// off as a dismissal does.
|
|
482
|
+
const note = noteFocusWithin(
|
|
483
|
+
viewportRef.current?.querySelector<HTMLElement>(
|
|
484
|
+
`[data-toast-id="${overwritten.id}"]`,
|
|
485
|
+
),
|
|
486
|
+
);
|
|
487
|
+
if (note != null) {
|
|
488
|
+
overwriteFocusRef.current = {id: placed.id, note};
|
|
489
|
+
}
|
|
490
|
+
}
|
|
444
491
|
const projected = overwritten
|
|
445
|
-
? committed.map(t => (t === overwritten ?
|
|
446
|
-
: [...committed,
|
|
492
|
+
? committed.map(t => (t === overwritten ? placed : t))
|
|
493
|
+
: [...committed, placed];
|
|
447
494
|
// `maxVisible={0}` shows every toast (FR7): nothing leaves the window.
|
|
448
495
|
const firstVisible = maxVisible > 0 ? projected.length - maxVisible : 0;
|
|
449
496
|
const cutIds = new Set(
|
|
@@ -470,7 +517,7 @@ export function ToastViewport({
|
|
|
470
517
|
}
|
|
471
518
|
}
|
|
472
519
|
}
|
|
473
|
-
pending.set(entry.id,
|
|
520
|
+
pending.set(entry.id, placed);
|
|
474
521
|
// An overwrite swaps a new entry, with a new id, into the replaced
|
|
475
522
|
// toast's place, so the old row leaves the DOM without ever being
|
|
476
523
|
// dismissed. Its settled id is dropped by the prune below, which covers
|
|
@@ -482,8 +529,8 @@ export function ToastViewport({
|
|
|
482
529
|
// overwrite into an append. An ignored collision already returned.
|
|
483
530
|
const kept = prev.filter(t => !cutIds.has(t.id));
|
|
484
531
|
return overwritten && kept.includes(overwritten)
|
|
485
|
-
? kept.map(t => (t === overwritten ?
|
|
486
|
-
: [...kept,
|
|
532
|
+
? kept.map(t => (t === overwritten ? placed : t))
|
|
533
|
+
: [...kept, placed];
|
|
487
534
|
});
|
|
488
535
|
},
|
|
489
536
|
[announce, maxVisible],
|
|
@@ -512,14 +559,23 @@ export function ToastViewport({
|
|
|
512
559
|
// focused before the user entered the viewport) rather than <body>.
|
|
513
560
|
const el = viewportRef.current;
|
|
514
561
|
const active = document.activeElement;
|
|
515
|
-
|
|
516
|
-
|
|
562
|
+
// A toast an overwrite replaced in place no longer owns its row: the
|
|
563
|
+
// replacement does, so dismissing the replaced toast leaves the row, and
|
|
564
|
+
// focus in it, to the replacement.
|
|
565
|
+
const rowKey = entry.rowKey ?? entry.id;
|
|
566
|
+
const isReplacedInPlace =
|
|
567
|
+
!toastsRef.current.some(t => t.id === id) &&
|
|
568
|
+
toastsRef.current.some(t => t.rowKey === rowKey);
|
|
569
|
+
const dismissedNode = isReplacedInPlace
|
|
570
|
+
? null
|
|
571
|
+
: (el?.querySelector<HTMLElement>(`[data-toast-id="${id}"]`) ?? null);
|
|
517
572
|
if (
|
|
518
573
|
dismissedNode &&
|
|
519
574
|
active instanceof Node &&
|
|
520
575
|
dismissedNode.contains(active)
|
|
521
576
|
) {
|
|
522
577
|
focusHandoffIdRef.current = id;
|
|
578
|
+
dismissFocusNoteRef.current = noteFocusWithin(dismissedNode);
|
|
523
579
|
// Pick the toast to receive focus while the DOM is still intact: the
|
|
524
580
|
// nearest one after it, then before it, that shows once it is gone
|
|
525
581
|
// (FR10), else restore. The list may already run ahead of the render
|
|
@@ -587,6 +643,41 @@ export function ToastViewport({
|
|
|
587
643
|
setToasts(prev => prev.filter(t => t.id !== id));
|
|
588
644
|
}, []);
|
|
589
645
|
|
|
646
|
+
// Moves focus to a control in the target toast, else in another toast that
|
|
647
|
+
// shows (newest first), else back to the element focused before focus
|
|
648
|
+
// entered the viewport, so a handoff never drops focus to <body>.
|
|
649
|
+
const handOffFocus = useCallback(
|
|
650
|
+
(note: FocusWithin | null, targetId: string | null) => {
|
|
651
|
+
const el = viewportRef.current;
|
|
652
|
+
const rowFor = (id: string) =>
|
|
653
|
+
el?.querySelector<HTMLElement>(`[data-toast-id="${id}"]`) ?? null;
|
|
654
|
+
const shownIds = toastsRef.current
|
|
655
|
+
.slice(maxVisibleRef.current > 0 ? -maxVisibleRef.current : 0)
|
|
656
|
+
.map(t => t.id)
|
|
657
|
+
.reverse();
|
|
658
|
+
const candidates =
|
|
659
|
+
targetId == null
|
|
660
|
+
? []
|
|
661
|
+
: [targetId, ...shownIds.filter(id => id !== targetId)];
|
|
662
|
+
let target: HTMLElement | null = null;
|
|
663
|
+
for (const id of candidates) {
|
|
664
|
+
target = getFocusable(rowFor(id));
|
|
665
|
+
if (target != null) {
|
|
666
|
+
break;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
const prev = prevFocusRef.current;
|
|
670
|
+
const isReturning = target == null && prev != null && prev.isConnected;
|
|
671
|
+
if (target == null) {
|
|
672
|
+
target = isReturning ? prev : el;
|
|
673
|
+
}
|
|
674
|
+
if (moveFocusLeftBehind(note, target) && isReturning) {
|
|
675
|
+
prevFocusRef.current = null;
|
|
676
|
+
}
|
|
677
|
+
},
|
|
678
|
+
[getFocusable],
|
|
679
|
+
);
|
|
680
|
+
|
|
590
681
|
// After a dismissed toast unmounts, hand focus off so it never falls to
|
|
591
682
|
// <body>. Runs in a layout effect once the toast list no longer contains
|
|
592
683
|
// the dismissed toast.
|
|
@@ -602,27 +693,21 @@ export function ToastViewport({
|
|
|
602
693
|
}
|
|
603
694
|
focusHandoffIdRef.current = null;
|
|
604
695
|
pendingFocusRef.current = null;
|
|
605
|
-
const
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
// No remaining toast to receive focus — restore the previously-focused
|
|
617
|
-
// element if it's still connected, else fall back to the container.
|
|
618
|
-
const prev = prevFocusRef.current;
|
|
619
|
-
prevFocusRef.current = null;
|
|
620
|
-
if (prev && prev.isConnected) {
|
|
621
|
-
prev.focus();
|
|
622
|
-
} else if (el) {
|
|
623
|
-
el.focus();
|
|
696
|
+
const note = dismissFocusNoteRef.current;
|
|
697
|
+
dismissFocusNoteRef.current = null;
|
|
698
|
+
handOffFocus(note, target === 'restore' ? null : target);
|
|
699
|
+
}, [toasts, handOffFocus]);
|
|
700
|
+
|
|
701
|
+
// After an overwrite updated a row that held focus: focus stays on the same
|
|
702
|
+
// control, or, if the update removed it, moves as a dismissal hands it off.
|
|
703
|
+
useLayoutEffect(() => {
|
|
704
|
+
const overwrite = overwriteFocusRef.current;
|
|
705
|
+
if (overwrite == null) {
|
|
706
|
+
return;
|
|
624
707
|
}
|
|
625
|
-
|
|
708
|
+
overwriteFocusRef.current = null;
|
|
709
|
+
handOffFocus(overwrite.note, overwrite.id);
|
|
710
|
+
}, [toasts, handOffFocus]);
|
|
626
711
|
|
|
627
712
|
const findByUniqueID = useCallback((uid: string) => {
|
|
628
713
|
return toastsRef.current.find(t => t.options.uniqueID === uid);
|
|
@@ -672,6 +757,8 @@ export function ToastViewport({
|
|
|
672
757
|
};
|
|
673
758
|
}, [isTopLayer]);
|
|
674
759
|
|
|
760
|
+
// Syncs the host's place with the modal outlet registry. The host moves into
|
|
761
|
+
// the latest open modal, and back when that modal closes.
|
|
675
762
|
useLayoutEffect(() => {
|
|
676
763
|
if (!isTopLayer || host == null) {
|
|
677
764
|
return;
|
|
@@ -830,12 +917,13 @@ export function ToastViewport({
|
|
|
830
917
|
<LayerContentBoundary>
|
|
831
918
|
{visibleToasts.map(entry => (
|
|
832
919
|
<ToastRow
|
|
833
|
-
key={entry.id}
|
|
920
|
+
key={entry.rowKey ?? entry.id}
|
|
834
921
|
entry={entry}
|
|
835
922
|
isExiting={exitingIds.has(entry.id)}
|
|
836
923
|
isReversed={isReversed}
|
|
837
924
|
onExited={handleExited}
|
|
838
925
|
onDismiss={removeToast}
|
|
926
|
+
isLiveRegion={isModalHosted}
|
|
839
927
|
/>
|
|
840
928
|
))}
|
|
841
929
|
</LayerContentBoundary>
|
package/src/Toast/types.ts
CHANGED
|
@@ -38,9 +38,10 @@ export interface ToastOptions {
|
|
|
38
38
|
/**
|
|
39
39
|
* Replaces the content of this toast's card with your own layout.
|
|
40
40
|
*
|
|
41
|
-
* Astryx keeps the card
|
|
42
|
-
* the
|
|
43
|
-
*
|
|
41
|
+
* Astryx keeps the card and its auto-hide behavior (inside a
|
|
42
|
+
* `ToastViewport` the viewport announces the toast, and while a modal hosts
|
|
43
|
+
* the viewport the card announces itself), then hands the
|
|
44
|
+
* renderer this toast's content, resolved settings and `dismiss` callback. The renderer owns every control inside its layout; call
|
|
44
45
|
* `dismiss` from the control that should close the toast. Astryx does not
|
|
45
46
|
* inject a fallback control into custom content.
|
|
46
47
|
*
|
|
@@ -100,4 +101,9 @@ export interface ToastEntry {
|
|
|
100
101
|
id: string;
|
|
101
102
|
options: ToastOptions;
|
|
102
103
|
createdAt: number;
|
|
104
|
+
/**
|
|
105
|
+
* The row's identity in the stack. A uniqueID overwrite keeps the replaced
|
|
106
|
+
* toast's, so the card updates in place and focus inside it stays.
|
|
107
|
+
*/
|
|
108
|
+
rowKey?: string;
|
|
103
109
|
}
|
package/src/Toast/useToast.tsx
CHANGED
|
@@ -91,6 +91,7 @@ function getFallbackContext(): ToastContextValue {
|
|
|
91
91
|
const FallbackCapture = () => {
|
|
92
92
|
const ctx = use(ToastContext);
|
|
93
93
|
const doneRef = useRef(false);
|
|
94
|
+
// Syncs the module-level fallback with the first toast context that mounts.
|
|
94
95
|
useEffect(() => {
|
|
95
96
|
if (ctx && !doneRef.current) {
|
|
96
97
|
doneRef.current = true;
|
|
@@ -292,12 +292,19 @@ export const docs = {
|
|
|
292
292
|
type: 'CSSProperties',
|
|
293
293
|
description: 'Inline styles for the visual control box.',
|
|
294
294
|
},
|
|
295
|
+
{
|
|
296
|
+
name: 'presentation',
|
|
297
|
+
type: "'popover' | 'bottom-sheet' | 'adaptive'",
|
|
298
|
+
description:
|
|
299
|
+
'How the field presents its choices. adaptive (the default) uses the bottom sheet on compact touch screens and the popover otherwise, resolved the same way Selector resolves it; the server render and the hydrating render are the popover. popover is the inline combobox with its anchored suggestion menu on every device. bottom-sheet replaces it on every device with a trigger showing the selected tokens that opens one tall modal sheet: a search row on top, full-width checkbox rows that keep their place while the sheet is open, a Create row with hasCreate, and a footer pinned in every state with a confirmed Clear all and Save; the sheet edits a draft, so onChange fires once, when Save commits it, and a swipe, scrim or Escape close of a changed draft asks before discarding. In the sheet presentation the trigger is the control: ref, id, aria-* and data-* reach it, and ref receives the trigger button there, so type it Ref<HTMLInputElement | HTMLButtonElement>, which the component accepts (TokenizerProps keeps its released input ref type). renderItem, renderToken, endContent, hasClear, hasEntriesOnFocus, menuWidth, tokenOverflowBehavior and hasAutoFocus have no surface in the sheet, and the field warns once in development when they are passed. Pass presentation="popover" to keep the inline field and those props on every device.',
|
|
300
|
+
default: "'adaptive'",
|
|
301
|
+
},
|
|
295
302
|
{
|
|
296
303
|
name: 'experimental',
|
|
297
304
|
type: "{presentation?: 'popover' | 'bottom-sheet' | 'adaptive'}",
|
|
298
305
|
stability: 'experimental',
|
|
299
306
|
description:
|
|
300
|
-
|
|
307
|
+
'Experimental options: anything in this object may change or be removed in a patch release. Deprecated: experimental.presentation is the earlier spelling of presentation; use presentation. It still works with the same values, and presentation wins when both are set.',
|
|
301
308
|
},
|
|
302
309
|
],
|
|
303
310
|
theming: {
|
|
@@ -638,12 +645,19 @@ export const docsZh = {
|
|
|
638
645
|
type: 'CSSProperties',
|
|
639
646
|
description: '可视控件框的内联样式。',
|
|
640
647
|
},
|
|
648
|
+
{
|
|
649
|
+
name: 'presentation',
|
|
650
|
+
type: "'popover' | 'bottom-sheet' | 'adaptive'",
|
|
651
|
+
description:
|
|
652
|
+
'字段如何呈现选项。adaptive(默认)在紧凑触摸屏上使用底部面板,其他情况使用 popover,解析方式与 Selector 相同;服务端渲染和水合期间的渲染均为 popover。popover 在所有设备上为内联组合框及其锚定建议菜单。bottom-sheet 在所有设备上改为一个显示已选标记的触发按钮,点按后打开一个高的模态底部面板——顶部为搜索行,下方为整行复选框行(面板打开期间位置保持不变),hasCreate 时有「创建」行,底部固定显示需确认的「全部清除」和「保存」;面板编辑的是草稿,onChange 仅在「保存」提交时触发一次,草稿有改动时滑动、点击遮罩或按 Escape 关闭会先询问是否放弃。在底部面板呈现中,触发按钮即为控件:ref、id、aria-* 和 data-* 都作用于它,ref 在该呈现中收到的是触发按钮,因此请将其类型声明为组件所接受的 Ref<HTMLInputElement | HTMLButtonElement>(TokenizerProps 保留已发布的输入框 ref 类型)。renderItem、renderToken、endContent、hasClear、hasEntriesOnFocus、menuWidth、tokenOverflowBehavior 和 hasAutoFocus 在底部面板中没有作用对象,传入时开发模式下会警告一次。传入 presentation="popover" 可在所有设备上保留内联字段和这些属性。',
|
|
653
|
+
default: "'adaptive'",
|
|
654
|
+
},
|
|
641
655
|
{
|
|
642
656
|
name: 'experimental',
|
|
643
657
|
type: "{presentation?: 'popover' | 'bottom-sheet' | 'adaptive'}",
|
|
644
658
|
stability: 'experimental',
|
|
645
659
|
description:
|
|
646
|
-
|
|
660
|
+
'实验性选项:此对象中的任何内容都可能在补丁版本中更改或移除。已弃用:experimental.presentation 是 presentation 的旧写法,请改用 presentation。它仍以相同的取值生效,两者同时设置时以 presentation 为准。',
|
|
647
661
|
},
|
|
648
662
|
],
|
|
649
663
|
theming: {
|
|
@@ -844,7 +858,9 @@ export const docsDense = {
|
|
|
844
858
|
'Icon at input start, before tokens. Icon name, SVG component, or ReactNode.',
|
|
845
859
|
endContent: 'Content at input row end. For buttons, counts, controls.',
|
|
846
860
|
handleRef: 'Imperative handle for focus() and blur() control.',
|
|
861
|
+
presentation:
|
|
862
|
+
"'adaptive' (default: sheet on compact touch, else popover; SSR/hydration render popover) | 'popover' (inline combobox, every device) | 'bottom-sheet' (trigger + one searchable modal sheet of checkbox rows editing a draft that Save commits; onChange fires once, on Save). Sheet: ref reaches the trigger button; renderItem/renderToken/endContent/hasClear/hasEntriesOnFocus/menuWidth/tokenOverflowBehavior/hasAutoFocus inert (dev warning). presentation=\"popover\" keeps them on every device.",
|
|
847
863
|
experimental:
|
|
848
|
-
|
|
864
|
+
'Experimental; may change in a patch. Deprecated presentation: old spelling of presentation; presentation wins if both set.',
|
|
849
865
|
},
|
|
850
866
|
};
|