@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
|
@@ -20,7 +20,8 @@ export const docs = {
|
|
|
20
20
|
{
|
|
21
21
|
name: 'icon',
|
|
22
22
|
type: 'ReactNode',
|
|
23
|
-
description:
|
|
23
|
+
description:
|
|
24
|
+
'Icon element rendered inside the button. An Astryx Icon with no explicit size defaults to sm for sm/md buttons and md for lg buttons.',
|
|
24
25
|
required: true,
|
|
25
26
|
slotElements: [{__element: 'Icon', props: {icon: 'check'}}],
|
|
26
27
|
},
|
|
@@ -46,19 +47,22 @@ export const docs = {
|
|
|
46
47
|
{
|
|
47
48
|
name: 'isLoading',
|
|
48
49
|
type: 'boolean',
|
|
49
|
-
description:
|
|
50
|
+
description:
|
|
51
|
+
'Shows a loading spinner and blocks re-activation while staying focusable (aria-busy + aria-disabled, not native disabled).',
|
|
50
52
|
default: 'false',
|
|
51
53
|
},
|
|
52
54
|
{
|
|
53
55
|
name: 'isDisabled',
|
|
54
56
|
type: 'boolean',
|
|
55
|
-
description:
|
|
57
|
+
description:
|
|
58
|
+
'Disables the button. When a tooltip is present, uses aria-disabled instead of native disabled so the button stays focusable.',
|
|
56
59
|
default: 'false',
|
|
57
60
|
},
|
|
58
61
|
{
|
|
59
62
|
name: 'tooltip',
|
|
60
63
|
type: 'string',
|
|
61
|
-
description:
|
|
64
|
+
description:
|
|
65
|
+
"Tooltip text shown on hover and keyboard focus. It also describes the button, unless it repeats the button's accessible name.",
|
|
62
66
|
},
|
|
63
67
|
{
|
|
64
68
|
name: 'onClick',
|
|
@@ -70,10 +74,69 @@ export const docs = {
|
|
|
70
74
|
type: '(e: MouseEvent) => void | Promise<void>',
|
|
71
75
|
description: 'Async click handler with automatic loading state.',
|
|
72
76
|
},
|
|
77
|
+
{
|
|
78
|
+
name: 'isInterruptible',
|
|
79
|
+
type: 'boolean',
|
|
80
|
+
description:
|
|
81
|
+
'Keep the button clickable while a clickAction is pending: the spinner and aria-busy still show, but the button is not disabled and the action is not deduped, so a re-click lands and interrupts the in-flight action with a fresh one. Use it for interruptible actions, not fire-once actions (submit, save, pay).',
|
|
82
|
+
default: 'false',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'width',
|
|
86
|
+
type: 'SizeValue',
|
|
87
|
+
description:
|
|
88
|
+
'Width of the button. Numbers are treated as pixels, strings are used as-is. Without it the button keeps its icon-only aspect, square by default; with it the button takes that width.',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'type',
|
|
92
|
+
type: "'button' | 'submit' | 'reset'",
|
|
93
|
+
description: 'HTML button type attribute.',
|
|
94
|
+
default: "'button'",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'name',
|
|
98
|
+
type: 'string',
|
|
99
|
+
description: 'HTML name attribute for form submission.',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'value',
|
|
103
|
+
type: 'string | number | readonly string[]',
|
|
104
|
+
description: 'HTML value attribute for form submission.',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
name: 'form',
|
|
108
|
+
type: 'string',
|
|
109
|
+
description: 'Associates the button with a form element by ID.',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'href',
|
|
113
|
+
type: 'string',
|
|
114
|
+
description:
|
|
115
|
+
'When provided, renders the button as a link element (<a> or custom link component). A disabled IconButton still renders a <button>.',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'as',
|
|
119
|
+
type: 'ComponentType',
|
|
120
|
+
description:
|
|
121
|
+
'Custom link component to use when href is provided (e.g. Next.js Link).',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'target',
|
|
125
|
+
type: 'string',
|
|
126
|
+
description:
|
|
127
|
+
'HTML target attribute when rendered as a link (e.g. "_blank").',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'rel',
|
|
131
|
+
type: 'string',
|
|
132
|
+
description:
|
|
133
|
+
'HTML rel attribute when rendered as a link (e.g. "noopener noreferrer").',
|
|
134
|
+
},
|
|
73
135
|
],
|
|
74
136
|
|
|
75
137
|
usage: {
|
|
76
|
-
description:
|
|
138
|
+
description:
|
|
139
|
+
'A button that shows only an icon with no visible text. Use IconButton in toolbars, table rows, and compact UI where space is tight and the icon is universally understood.',
|
|
77
140
|
accessibility: [
|
|
78
141
|
{
|
|
79
142
|
name: 'Essential icon or spinner arc',
|
|
@@ -113,26 +176,68 @@ export const docs = {
|
|
|
113
176
|
},
|
|
114
177
|
],
|
|
115
178
|
bestPractices: [
|
|
116
|
-
{
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
179
|
+
{
|
|
180
|
+
guidance: true,
|
|
181
|
+
description:
|
|
182
|
+
'Make the aria-label specific: a trash icon labeled "Delete conversation" is clearer than just "Delete" for screen readers.',
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
guidance: true,
|
|
186
|
+
description:
|
|
187
|
+
'Add a tooltip: even a gear icon can mean Settings, Preferences, or Configure.',
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
guidance: true,
|
|
191
|
+
description:
|
|
192
|
+
'Use ghost in toolbars and dense areas to reduce visual clutter.',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
guidance: false,
|
|
196
|
+
description:
|
|
197
|
+
"Use IconButton if the action isn't obvious from the icon alone; use Button with text.",
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
guidance: false,
|
|
201
|
+
description:
|
|
202
|
+
'Skip the tooltip; label only reaches screen readers, sighted users need the hover hint.',
|
|
203
|
+
},
|
|
121
204
|
],
|
|
122
205
|
},
|
|
123
206
|
};
|
|
124
207
|
|
|
125
208
|
/** @type {import('@astryxdesign/cli/authoring').ComponentTranslationDoc} */
|
|
126
209
|
export const docsDense = {
|
|
127
|
-
description:
|
|
210
|
+
description:
|
|
211
|
+
'Button showing only an icon, no visible text. Use in toolbars, table rows, compact UI where space is tight + icon universally understood.',
|
|
128
212
|
usage: {
|
|
129
|
-
description:
|
|
213
|
+
description:
|
|
214
|
+
'Button showing only an icon, no visible text. Use in toolbars, table rows, compact UI where space is tight + icon universally understood.',
|
|
130
215
|
bestPractices: [
|
|
131
|
-
{
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
216
|
+
{
|
|
217
|
+
guidance: true,
|
|
218
|
+
description:
|
|
219
|
+
'Make aria-label specific: trash icon labeled "Delete conversation" > just "Delete" for screen readers.',
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
guidance: true,
|
|
223
|
+
description:
|
|
224
|
+
'Add tooltip: even gear icon can mean Settings/Preferences/Configure.',
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
guidance: true,
|
|
228
|
+
description:
|
|
229
|
+
'Use ghost in toolbars + dense areas to reduce visual clutter.',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
guidance: false,
|
|
233
|
+
description:
|
|
234
|
+
"Use IconButton if action isn't obvious from icon alone; use Button w/ text instead.",
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
guidance: false,
|
|
238
|
+
description:
|
|
239
|
+
'Skip tooltip: label only reaches screen readers; sighted users need hover hint.',
|
|
240
|
+
},
|
|
136
241
|
],
|
|
137
242
|
},
|
|
138
243
|
propDescriptions: {
|
|
@@ -140,11 +245,26 @@ export const docsDense = {
|
|
|
140
245
|
icon: 'icon element rendered inside button; unsized Astryx Icon defaults to sm for sm/md buttons and md for lg',
|
|
141
246
|
variant: 'visual style variant',
|
|
142
247
|
size: 'size variant',
|
|
143
|
-
elevation:
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
248
|
+
elevation:
|
|
249
|
+
'resting shadow depth: none|low|med|high; raise for a floating action button (FAB)',
|
|
250
|
+
isLoading:
|
|
251
|
+
'shows loading spinner, blocks re-activation but stays focusable (aria-disabled, not native disabled)',
|
|
252
|
+
isDisabled: 'disables button; uses aria-disabled when tooltip present',
|
|
253
|
+
tooltip:
|
|
254
|
+
'tooltip on hover + keyboard focus; also describes the button unless it repeats the accessible name',
|
|
147
255
|
onClick: 'standard click handler',
|
|
148
256
|
clickAction: 'async click handler w/ automatic loading state',
|
|
257
|
+
isInterruptible:
|
|
258
|
+
'keeps button clickable while clickAction pending; a re-click interrupts it. Not for fire-once actions (submit/save/pay)',
|
|
259
|
+
width:
|
|
260
|
+
'button width; numbers=pixels, strings=as-is; without it keeps the icon-only aspect (square by default)',
|
|
261
|
+
type: 'HTML button type; defaults to "button"',
|
|
262
|
+
name: 'HTML name for form submission',
|
|
263
|
+
value: 'HTML value for form submission',
|
|
264
|
+
form: 'associates button with form element by ID',
|
|
265
|
+
href: 'renders as a link; a disabled IconButton stays a <button>',
|
|
266
|
+
as: 'custom link component used with href',
|
|
267
|
+
target: 'HTML target when rendered as a link',
|
|
268
|
+
rel: 'HTML rel when rendered as a link',
|
|
149
269
|
},
|
|
150
270
|
};
|
|
@@ -237,6 +237,8 @@ export function useSwipeAction({
|
|
|
237
237
|
reducedMotionRef.current = isReducedMotion;
|
|
238
238
|
});
|
|
239
239
|
|
|
240
|
+
// Releases the settle timer, the animation frame and the pinch watch on
|
|
241
|
+
// unmount.
|
|
240
242
|
useEffect(
|
|
241
243
|
() => () => {
|
|
242
244
|
if (settleTimerRef.current != null) {
|
package/src/Layer/modalOutlet.ts
CHANGED
|
@@ -188,6 +188,8 @@ export function useModalOutlet(
|
|
|
188
188
|
const isLatestRef = useRef(isLatest);
|
|
189
189
|
isLatestRef.current = isLatest;
|
|
190
190
|
const suppliedRef = useRef<HTMLDialogElement | null>(null);
|
|
191
|
+
// Syncs the module registry of modal outlets with this dialog while it is
|
|
192
|
+
// active. It also follows the dialog's native `close` event.
|
|
191
193
|
useEffect(() => {
|
|
192
194
|
const element = ref.current;
|
|
193
195
|
if (!isActive || element == null) {
|
package/src/Layer/useLayer.tsx
CHANGED
|
@@ -1560,6 +1560,8 @@ function useLayerImplementation(
|
|
|
1560
1560
|
forgetDismissalRef.current = forget;
|
|
1561
1561
|
}, []);
|
|
1562
1562
|
|
|
1563
|
+
// Syncs the document's capture-phase gesture tracking with this mount.
|
|
1564
|
+
// Unmount forgets the layer's dismissal.
|
|
1563
1565
|
useEffect(() => {
|
|
1564
1566
|
// Install capture-phase gesture tracking before the first interaction.
|
|
1565
1567
|
currentGesture();
|
|
@@ -155,6 +155,8 @@ export function useLayerDismissal(
|
|
|
155
155
|
|
|
156
156
|
const isRegistered = isActive && isEnabled;
|
|
157
157
|
|
|
158
|
+
// Syncs the shared dismissal stack with `isRegistered`. A registered layer
|
|
159
|
+
// gets Escape and outside presses in stack order.
|
|
158
160
|
useEffect(() => {
|
|
159
161
|
if (!isRegistered) {
|
|
160
162
|
wasRegisteredRef.current = false;
|
package/src/Layer/usePressPin.ts
CHANGED
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* @file usePressPin.ts
|
|
7
7
|
* @input A hover layer's trigger, open state, show and hide, and its
|
|
8
8
|
* `triggerBehavior` and `touchTrigger` options
|
|
9
|
-
* @output usePressPin, the press toggle that pins a hover layer open
|
|
10
|
-
*
|
|
9
|
+
* @output usePressPin, the press toggle that pins a hover layer open, and
|
|
10
|
+
* the app hold behind useTooltip's show() and hide(); isPressPinTrigger;
|
|
11
|
+
* stopPressPinClick; the LayerTriggerBehavior type
|
|
11
12
|
* @position Core-internal: one call per hover layer, useTooltip's. It owns
|
|
12
13
|
* the layer's touch trigger, so the host makes no second touch-trigger call.
|
|
13
14
|
*
|
|
@@ -103,8 +104,18 @@ export interface UsePressPinReturn {
|
|
|
103
104
|
isHeldOpen: () => boolean;
|
|
104
105
|
/** Wires the trigger element, or unwires it with `null`. */
|
|
105
106
|
attach: (element: HTMLElement | null) => void;
|
|
106
|
-
/** Drops the pin: Escape, or a hide
|
|
107
|
+
/** Drops the pin and the app hold: Escape, or a hide from elsewhere. */
|
|
107
108
|
unpin: () => void;
|
|
109
|
+
/**
|
|
110
|
+
* The app's `show()`: shows the layer and holds it open, as a pin does,
|
|
111
|
+
* until `release`, Escape, a press outside, or focus leaving the trigger
|
|
112
|
+
* and the layer. A controlled layer reports the request instead.
|
|
113
|
+
*/
|
|
114
|
+
hold: () => void;
|
|
115
|
+
/** The app's `hide()`: drops the hold and hides the layer. */
|
|
116
|
+
release: () => void;
|
|
117
|
+
/** Whether the app's `show()` holds the layer open now. */
|
|
118
|
+
isAppHeld: () => boolean;
|
|
108
119
|
/**
|
|
109
120
|
* While pinned, focus moving onto an element outside the trigger and the
|
|
110
121
|
* layer closes it. Returns whether the pin decided. The pin calls it for its
|
|
@@ -112,8 +123,9 @@ export interface UsePressPinReturn {
|
|
|
112
123
|
*/
|
|
113
124
|
handleFocusLeave: (event: FocusEvent) => boolean;
|
|
114
125
|
/**
|
|
115
|
-
* Whether the layer shows pinned on a wired trigger
|
|
116
|
-
* its rendered text, unless the layer has
|
|
126
|
+
* Whether the layer shows pinned on a wired trigger, or held by the app's
|
|
127
|
+
* `show()`. The host then announces its rendered text, unless the layer has
|
|
128
|
+
* a `label`.
|
|
117
129
|
*/
|
|
118
130
|
isPinShown: boolean;
|
|
119
131
|
/** The layer's touch trigger (useTouchTriggerInternal), wired to the pin. */
|
|
@@ -175,8 +187,19 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
175
187
|
setIsPinnedState(next);
|
|
176
188
|
}, []);
|
|
177
189
|
|
|
190
|
+
// The app's show() holds the layer on any trigger, in any mode.
|
|
191
|
+
const isAppHeldRef = useRef(false);
|
|
192
|
+
const [isAppHeldState, setIsAppHeldState] = useState(false);
|
|
193
|
+
const setAppHeld = useCallback((next: boolean) => {
|
|
194
|
+
isAppHeldRef.current = next;
|
|
195
|
+
setIsAppHeldState(next);
|
|
196
|
+
}, []);
|
|
197
|
+
|
|
178
198
|
// The last offered element lets a `triggerBehavior` change rewire it.
|
|
179
199
|
const triggerRef = useRef<HTMLElement | null>(null);
|
|
200
|
+
// Every offered trigger, in any mode, so focus leaving ends a pin or an
|
|
201
|
+
// app hold.
|
|
202
|
+
const focusTargetRef = useRef<HTMLElement | null>(null);
|
|
180
203
|
const offeredRef = useRef<HTMLElement | null>(null);
|
|
181
204
|
// A primitive: re-attaching the same trigger renders nothing.
|
|
182
205
|
const [offeredKind, setOfferedKind] = useState<'none' | 'other' | 'button'>(
|
|
@@ -192,6 +215,13 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
192
215
|
// a pinned layer through the pin, so the pin drops with it.
|
|
193
216
|
const hideFromTouch = useCallback(() => {
|
|
194
217
|
const current = optionsRef.current;
|
|
218
|
+
if (isAppHeldRef.current) {
|
|
219
|
+
setAppHeld(false);
|
|
220
|
+
if (current.isOpen !== undefined) {
|
|
221
|
+
current.report(false);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
195
225
|
if (current.triggerBehavior === 'toggle' && triggerRef.current != null) {
|
|
196
226
|
if (current.isOpen !== undefined) {
|
|
197
227
|
current.report(false);
|
|
@@ -202,7 +232,7 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
202
232
|
}
|
|
203
233
|
}
|
|
204
234
|
current.hide();
|
|
205
|
-
}, [setPinned]);
|
|
235
|
+
}, [setPinned, setAppHeld]);
|
|
206
236
|
|
|
207
237
|
const {
|
|
208
238
|
isTouchPointerRef,
|
|
@@ -233,13 +263,14 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
233
263
|
const close = useCallback(() => {
|
|
234
264
|
const current = optionsRef.current;
|
|
235
265
|
clearTapOpen();
|
|
266
|
+
setAppHeld(false);
|
|
236
267
|
if (current.isOpen !== undefined) {
|
|
237
268
|
current.report(false);
|
|
238
269
|
return;
|
|
239
270
|
}
|
|
240
271
|
setPinned(false);
|
|
241
272
|
current.hide();
|
|
242
|
-
}, [setPinned, clearTapOpen]);
|
|
273
|
+
}, [setPinned, setAppHeld, clearTapOpen]);
|
|
243
274
|
|
|
244
275
|
const announceName = useCallback(() => {
|
|
245
276
|
const current = optionsRef.current;
|
|
@@ -348,6 +379,9 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
348
379
|
|
|
349
380
|
const isHeldOpen = useCallback(() => {
|
|
350
381
|
const current = optionsRef.current;
|
|
382
|
+
if (isAppHeldRef.current && current.isLayerOpen) {
|
|
383
|
+
return current.isOpen !== false;
|
|
384
|
+
}
|
|
351
385
|
if (current.triggerBehavior !== 'toggle' || triggerRef.current == null) {
|
|
352
386
|
return false;
|
|
353
387
|
}
|
|
@@ -364,7 +398,7 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
364
398
|
return false;
|
|
365
399
|
}
|
|
366
400
|
const next = event.relatedTarget;
|
|
367
|
-
const trigger =
|
|
401
|
+
const trigger = focusTargetRef.current;
|
|
368
402
|
// Focus that leaves for no element is a press's to decide. The trigger
|
|
369
403
|
// can sit in another document, so the check uses its own window.
|
|
370
404
|
const view = trigger?.ownerDocument.defaultView;
|
|
@@ -387,6 +421,8 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
387
421
|
);
|
|
388
422
|
|
|
389
423
|
const unwire = useCallback(() => {
|
|
424
|
+
focusTargetRef.current?.removeEventListener('focusout', handleFocusLeave);
|
|
425
|
+
focusTargetRef.current = null;
|
|
390
426
|
const previous = triggerRef.current;
|
|
391
427
|
if (previous == null) {
|
|
392
428
|
return;
|
|
@@ -394,7 +430,6 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
394
430
|
previous.removeEventListener('click', handlePress);
|
|
395
431
|
previous.removeEventListener('keydown', handleKeyDown);
|
|
396
432
|
previous.removeEventListener('keyup', handleKeyUp);
|
|
397
|
-
previous.removeEventListener('focusout', handleFocusLeave);
|
|
398
433
|
const own = ownStateRef.current;
|
|
399
434
|
if (own != null) {
|
|
400
435
|
restoreAttribute(previous, 'aria-expanded', own.expanded);
|
|
@@ -423,10 +458,14 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
423
458
|
}
|
|
424
459
|
settledRef.current = {element, mode: current.triggerBehavior};
|
|
425
460
|
unwire();
|
|
426
|
-
if (element == null
|
|
461
|
+
if (element == null) {
|
|
427
462
|
return;
|
|
428
463
|
}
|
|
429
|
-
|
|
464
|
+
// Its own focus-leave listener, in any mode: `focusTrigger="never"`
|
|
465
|
+
// attaches none, and an app hold needs it on any trigger.
|
|
466
|
+
element.addEventListener('focusout', handleFocusLeave);
|
|
467
|
+
focusTargetRef.current = element;
|
|
468
|
+
if (current.triggerBehavior !== 'toggle' || !isPressPinTrigger(element)) {
|
|
430
469
|
return;
|
|
431
470
|
}
|
|
432
471
|
element.addEventListener('click', handlePress);
|
|
@@ -434,8 +473,6 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
434
473
|
element.addEventListener('keydown', handleKeyDown);
|
|
435
474
|
element.addEventListener('keyup', handleKeyUp);
|
|
436
475
|
}
|
|
437
|
-
// Its own focus-leave listener: `focusTrigger="never"` attaches none.
|
|
438
|
-
element.addEventListener('focusout', handleFocusLeave);
|
|
439
476
|
ownStateRef.current = {
|
|
440
477
|
expanded: element.getAttribute('aria-expanded'),
|
|
441
478
|
controls: element.getAttribute('aria-controls'),
|
|
@@ -473,7 +510,31 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
473
510
|
if (isPinnedRef.current) {
|
|
474
511
|
setPinned(false);
|
|
475
512
|
}
|
|
476
|
-
|
|
513
|
+
if (isAppHeldRef.current) {
|
|
514
|
+
setAppHeld(false);
|
|
515
|
+
}
|
|
516
|
+
}, [setPinned, setAppHeld]);
|
|
517
|
+
|
|
518
|
+
const hold = useCallback(() => {
|
|
519
|
+
const current = optionsRef.current;
|
|
520
|
+
if (!current.isEnabled) {
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
setAppHeld(true);
|
|
524
|
+
armOutsideDismiss();
|
|
525
|
+
announceName();
|
|
526
|
+
if (current.isOpen !== undefined) {
|
|
527
|
+
current.report(true);
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
current.show();
|
|
531
|
+
}, [setAppHeld, armOutsideDismiss, announceName]);
|
|
532
|
+
|
|
533
|
+
const release = useCallback(() => {
|
|
534
|
+
close();
|
|
535
|
+
}, [close]);
|
|
536
|
+
|
|
537
|
+
const isAppHeld = useCallback(() => isAppHeldRef.current, []);
|
|
477
538
|
|
|
478
539
|
// Each path that hides a pinned layer drops the pin itself, so a layer that
|
|
479
540
|
// does not show is never reported expanded.
|
|
@@ -490,13 +551,18 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
|
|
|
490
551
|
writeAttribute(trigger, 'aria-controls', isLayerOpen ? layerId : null);
|
|
491
552
|
});
|
|
492
553
|
|
|
493
|
-
const isPinShown =
|
|
554
|
+
const isPinShown =
|
|
555
|
+
(isToggleMode && isWired && isExpanded) ||
|
|
556
|
+
(isAppHeldState && isLayerOpen && isOpen !== false);
|
|
494
557
|
|
|
495
558
|
return {
|
|
496
559
|
isToggleTrigger,
|
|
497
560
|
isHeldOpen,
|
|
498
561
|
attach,
|
|
499
562
|
unpin,
|
|
563
|
+
hold,
|
|
564
|
+
release,
|
|
565
|
+
isAppHeld,
|
|
500
566
|
handleFocusLeave,
|
|
501
567
|
isPinShown,
|
|
502
568
|
touch: {
|
|
@@ -436,7 +436,9 @@ export function useTouchTriggerInternal(
|
|
|
436
436
|
}
|
|
437
437
|
}, [triggerRef, disarmOutsideDismiss]);
|
|
438
438
|
|
|
439
|
+
// Releases the outside-dismiss listener on unmount.
|
|
439
440
|
useEffect(() => disarmOutsideDismiss, [disarmOutsideDismiss]);
|
|
441
|
+
// Releases a pending tap on unmount.
|
|
440
442
|
useEffect(() => () => forgetPendingTapRef.current?.(), []);
|
|
441
443
|
|
|
442
444
|
const isTouchInteraction = useCallback(
|
|
@@ -55,6 +55,7 @@ import {
|
|
|
55
55
|
} from '../i18n/useComponentTranslator';
|
|
56
56
|
import english from '../i18n/generated-english/Lightbox/Lightbox.generated';
|
|
57
57
|
import {isRenderable} from '../utils/isRenderable';
|
|
58
|
+
import {prepareFocusReturnOnRemoval} from '../utils/focusReturn';
|
|
58
59
|
|
|
59
60
|
registerEnglishFallback(english);
|
|
60
61
|
/**
|
|
@@ -428,6 +429,7 @@ export function Lightbox({
|
|
|
428
429
|
// Open/close dialog. The dialog renders only with an item, so a viewer
|
|
429
430
|
// opened before its first item arrives opens when that item does.
|
|
430
431
|
const hasItem = currentItem != null;
|
|
432
|
+
// Syncs the native dialog with `isOpen` through `showModal()` and `close()`.
|
|
431
433
|
useIsomorphicLayoutEffect(() => {
|
|
432
434
|
const dialog = dialogRef.current;
|
|
433
435
|
if (!dialog || !hasItem) {
|
|
@@ -445,6 +447,23 @@ export function Lightbox({
|
|
|
445
447
|
}
|
|
446
448
|
}, [isOpen, hasItem]);
|
|
447
449
|
|
|
450
|
+
// A viewer that unmounts while open (rendered only while open, or removed
|
|
451
|
+
// with the rest of a view) never runs the close branch above. Focus the
|
|
452
|
+
// removal lost goes back to the opener while the opener is still on the
|
|
453
|
+
// page.
|
|
454
|
+
useEffect(() => {
|
|
455
|
+
const dialog = dialogRef.current;
|
|
456
|
+
if (dialog == null) {
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
const returnFocusOnRemoval = prepareFocusReturnOnRemoval(dialog);
|
|
460
|
+
return () => {
|
|
461
|
+
if (dialog.open) {
|
|
462
|
+
returnFocusOnRemoval(triggerElementRef.current);
|
|
463
|
+
}
|
|
464
|
+
};
|
|
465
|
+
}, [hasItem]);
|
|
466
|
+
|
|
448
467
|
const handleClose = useCallback(() => {
|
|
449
468
|
onOpenChange(false);
|
|
450
469
|
}, [onOpenChange]);
|
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
* without manual z-index management. The browser provides:
|
|
19
19
|
* - Top layer promotion (no z-index needed)
|
|
20
20
|
* - `::backdrop` pseudo-element
|
|
21
|
-
* - Body scroll lock
|
|
22
21
|
* - Focus trapping
|
|
23
22
|
*
|
|
23
|
+
* The page behind takes `useScrollLock`, the same lock as every other modal.
|
|
24
|
+
*
|
|
24
25
|
* Escape is owned by the shared dismissal stack (`useLayerDismissal`), so a
|
|
25
26
|
* drawer opened over another layer takes the press and nothing behind it
|
|
26
27
|
* closes. The native `cancel` event still handles the dismissals the browser
|
|
@@ -36,7 +37,7 @@
|
|
|
36
37
|
* SYNC: When modified, update these files to stay in sync:
|
|
37
38
|
* - /packages/core/src/MobileNav/index.ts (exports if types change)
|
|
38
39
|
* - /packages/core/src/Layer/useLayerDismissal.ts (dismissal stack)
|
|
39
|
-
* - /packages/core/src/hooks/
|
|
40
|
+
* - /packages/core/src/hooks/useScrollLock.ts (the page's scroll lock)
|
|
40
41
|
* - /packages/cli/assets/templates/blocks/components/MobileNav/ (showcase blocks)
|
|
41
42
|
*/
|
|
42
43
|
|
|
@@ -62,10 +63,6 @@ import {Button} from '../Button';
|
|
|
62
63
|
import {Icon} from '../Icon';
|
|
63
64
|
import {Heading} from '../Heading/Heading';
|
|
64
65
|
import {useAppShellMobile} from '../AppShell/AppShellMobileContext';
|
|
65
|
-
import {
|
|
66
|
-
holdScrollbarGutter,
|
|
67
|
-
type ScrollbarGutterHold,
|
|
68
|
-
} from '../hooks/scrollbarGutter';
|
|
69
66
|
import {mergeProps, composeEventHandlers} from '../utils';
|
|
70
67
|
import {layerTextReset} from '../Layer/layerTextReset.stylex';
|
|
71
68
|
import {layerStructureReset} from '../Layer/layerStructureReset.stylex';
|
|
@@ -79,6 +76,7 @@ import type {BaseProps} from '../BaseProps';
|
|
|
79
76
|
import {themeProps} from '../utils/themeProps';
|
|
80
77
|
|
|
81
78
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
79
|
+
import {useScrollLock} from '../hooks/useScrollLock';
|
|
82
80
|
import {
|
|
83
81
|
registerEnglishFallback,
|
|
84
82
|
useComponentTranslator,
|
|
@@ -525,15 +523,10 @@ export function MobileNav({
|
|
|
525
523
|
setWasOpen(isOpen);
|
|
526
524
|
setIsCloseHeld(!isOpen);
|
|
527
525
|
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
//
|
|
531
|
-
|
|
532
|
-
if (gutterRef.current) {
|
|
533
|
-
gutterRef.current.release();
|
|
534
|
-
gutterRef.current = null;
|
|
535
|
-
}
|
|
536
|
-
}, []);
|
|
526
|
+
// The same page lock as every other modal. Its effect runs before the
|
|
527
|
+
// open/close effect below, so it measures the scrollbar gutter before
|
|
528
|
+
// showModal() can hide the scrollbar.
|
|
529
|
+
useScrollLock(isOpen);
|
|
537
530
|
// Resolved side — computed from trigger position when side='auto'
|
|
538
531
|
const [resolvedSide, setResolvedSide] = useState<'start' | 'end'>(
|
|
539
532
|
side === 'auto' ? 'end' : side,
|
|
@@ -576,10 +569,6 @@ export function MobileNav({
|
|
|
576
569
|
}
|
|
577
570
|
|
|
578
571
|
if (isOpen) {
|
|
579
|
-
// Taken first: every mutation below is one that can hide the scrollbar,
|
|
580
|
-
// and the gutter has to be measured while it is still there.
|
|
581
|
-
gutterRef.current ??= holdScrollbarGutter(document.documentElement);
|
|
582
|
-
|
|
583
572
|
if (!dialog.open) {
|
|
584
573
|
// Capture the opener before showModal() pulls focus into the top
|
|
585
574
|
// layer. Only on the transition into open: a reopen while the delayed
|
|
@@ -589,15 +578,7 @@ export function MobileNav({
|
|
|
589
578
|
document.activeElement as HTMLElement | null;
|
|
590
579
|
dialog.showModal();
|
|
591
580
|
}
|
|
592
|
-
// Prevent background scrolling and iOS pull-to-refresh.
|
|
593
|
-
// overflow: clip avoids creating a scroll container (unlike hidden),
|
|
594
|
-
// so there's no scroll bounce and no need to save/restore scroll position.
|
|
595
|
-
document.documentElement.style.overflow = 'clip';
|
|
596
|
-
gutterRef.current.settle();
|
|
597
581
|
} else if (dialog.open) {
|
|
598
|
-
document.documentElement.style.overflow = '';
|
|
599
|
-
releaseGutter();
|
|
600
|
-
|
|
601
582
|
closeTimeoutRef.current = setTimeout(() => {
|
|
602
583
|
closeAndRestoreFocus(dialog, triggerElementRef);
|
|
603
584
|
setIsCloseHeld(false);
|
|
@@ -613,10 +594,8 @@ export function MobileNav({
|
|
|
613
594
|
clearTimeout(closeTimeoutRef.current);
|
|
614
595
|
closeTimeoutRef.current = null;
|
|
615
596
|
}
|
|
616
|
-
document.documentElement.style.overflow = '';
|
|
617
|
-
releaseGutter();
|
|
618
597
|
};
|
|
619
|
-
}, [isOpen
|
|
598
|
+
}, [isOpen]);
|
|
620
599
|
|
|
621
600
|
// Close the native dialog on unmount if it's still open. Inside AppShell the
|
|
622
601
|
// drawer is mounted in an <Activity> that switches to mode="hidden" when the
|
|
@@ -42,6 +42,8 @@ export function useOutlineFromDOM(
|
|
|
42
42
|
collectOutlineItems(containerRef.current),
|
|
43
43
|
);
|
|
44
44
|
|
|
45
|
+
// Syncs the outline items with the container's DOM through a
|
|
46
|
+
// MutationObserver.
|
|
45
47
|
useEffect(() => {
|
|
46
48
|
const container = containerRef.current;
|
|
47
49
|
setItems(collectOutlineItems(container));
|
|
@@ -275,6 +275,8 @@ export function useScrollSpy({
|
|
|
275
275
|
);
|
|
276
276
|
}, [rootRef, scrollContainerRef]);
|
|
277
277
|
|
|
278
|
+
// Syncs a scroll listener on the scroll root and a window resize listener
|
|
279
|
+
// with the items and offset. They choose the active outline item.
|
|
278
280
|
useEffect(() => {
|
|
279
281
|
if (isControlled || typeof window === 'undefined') {
|
|
280
282
|
return;
|
|
@@ -350,6 +350,8 @@ export function OverflowList({
|
|
|
350
350
|
const overflowItemsRef = useRef(overflowItems);
|
|
351
351
|
overflowItemsRef.current = overflowItems;
|
|
352
352
|
|
|
353
|
+
// Reports the measured overflow to `onOverflowChange`. A ResizeObserver
|
|
354
|
+
// drives the measurement, so no event handler can report it.
|
|
353
355
|
useIsomorphicLayoutEffect(() => {
|
|
354
356
|
if (
|
|
355
357
|
!onOverflowChange ||
|