@astryxdesign/core 0.7.8 → 0.7.9-canary.0200dfe
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AppShell/observeMainOverflow.d.ts.map +1 -1
- package/dist/AppShell/observeMainOverflow.js +9 -6
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +37 -3
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +40 -8
- package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
- package/dist/BottomSheet/bottomSheetStack.js +4 -3
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +61 -21
- package/dist/Calendar/Calendar.d.ts +14 -2
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +63 -74
- package/dist/Calendar/getInitialFocusDate.d.ts +4 -1
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -1
- package/dist/Calendar/getInitialFocusDate.js +7 -5
- package/dist/Calendar/hooks/useCalendarDays.d.ts +19 -2
- package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
- package/dist/Calendar/hooks/useCalendarDays.js +57 -64
- package/dist/Calendar/hooks/useCalendarNavigation.d.ts +28 -3
- package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
- package/dist/Calendar/hooks/useCalendarNavigation.js +33 -22
- package/dist/Calendar/styles.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts +2 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +74 -18
- package/dist/CheckboxInput/CheckboxRowPressContext.d.ts +2 -0
- package/dist/CheckboxInput/CheckboxRowPressContext.d.ts.map +1 -0
- package/dist/CheckboxInput/CheckboxRowPressContext.js +20 -0
- package/dist/CheckboxList/CheckboxListItem.d.ts +2 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +40 -14
- package/dist/ClickableCard/ClickableCard.d.ts +1 -1
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +2 -0
- package/dist/DateInput/DateInput.d.ts +37 -6
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +97 -124
- package/dist/DateInput/MonthScroller.d.ts +5 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +26 -29
- package/dist/DateInput/MonthYearWheels.d.ts +10 -1
- package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
- package/dist/DateInput/MonthYearWheels.js +54 -42
- package/dist/DateInput/PickerWheel.d.ts.map +1 -1
- package/dist/DateInput/PickerWheel.js +7 -1
- package/dist/DateInput/TouchDateField.d.ts +1 -1
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +26 -21
- package/dist/DateInput/monthGeometry.d.ts +42 -8
- package/dist/DateInput/monthGeometry.d.ts.map +1 -1
- package/dist/DateInput/monthGeometry.js +81 -7
- package/dist/DateInput/useCalendarPresentation.d.ts +10 -0
- package/dist/DateInput/useCalendarPresentation.d.ts.map +1 -0
- package/dist/DateInput/useCalendarPresentation.js +32 -0
- package/dist/DateInput/useTypedDate.d.ts +92 -0
- package/dist/DateInput/useTypedDate.d.ts.map +1 -0
- package/dist/DateInput/useTypedDate.js +269 -0
- package/dist/DateInput/wheelStrip.js +2 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts +17 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +15 -8
- package/dist/DateTimeInput/DateTimeInput.d.ts +26 -3
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +92 -88
- package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +26 -20
- package/dist/Dialog/Dialog.d.ts +2 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +14 -3
- package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +11 -2
- package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +11 -8
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
- package/dist/Field/inputDisabledFocus.d.ts +4 -4
- package/dist/Field/inputStyles.stylex.d.ts +1 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +16 -2
- package/dist/HoverCard/useHoverCard.d.ts +3 -1
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/Icon/Icon.d.ts +1 -1
- package/dist/InfoTip/InfoTip.d.ts +1 -0
- package/dist/InfoTip/InfoTip.d.ts.map +1 -1
- package/dist/InfoTip/InfoTip.js +6 -18
- package/dist/InputGroup/InputGroup.d.ts +4 -3
- package/dist/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/InputGroup/InputGroup.js +2 -2
- package/dist/InputGroup/InputGroupText.d.ts +2 -1
- package/dist/InputGroup/InputGroupText.d.ts.map +1 -1
- package/dist/InputGroup/InputGroupText.js +2 -1
- package/dist/InputGroup/groupStyles.d.ts +1 -1
- package/dist/InputGroup/groupStyles.d.ts.map +1 -1
- package/dist/InputGroup/groupStyles.js +1 -1
- package/dist/Item/Item.d.ts +20 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +97 -29
- package/dist/Item/ItemListRowContext.d.ts +2 -0
- package/dist/Item/ItemListRowContext.d.ts.map +1 -0
- package/dist/Item/ItemListRowContext.js +16 -0
- package/dist/Layer/holdEntranceInput.d.ts +24 -0
- package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
- package/dist/Layer/holdEntranceInput.js +65 -0
- package/dist/Layer/inputHold.d.ts +49 -0
- package/dist/Layer/inputHold.d.ts.map +1 -0
- package/dist/Layer/inputHold.js +636 -0
- package/dist/Layer/outsidePress.d.ts +4 -0
- package/dist/Layer/outsidePress.d.ts.map +1 -1
- package/dist/Layer/outsidePress.js +18 -1
- package/dist/Layer/preserveAnimations.d.ts +1 -5
- package/dist/Layer/preserveAnimations.d.ts.map +1 -1
- package/dist/Layer/preserveAnimations.js +12 -214
- package/dist/Layer/useBackdropPress.d.ts +8 -0
- package/dist/Layer/useBackdropPress.d.ts.map +1 -1
- package/dist/Layer/useBackdropPress.js +31 -2
- package/dist/Layer/useLayer.d.ts +3 -1
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +64 -4
- package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
- package/dist/Layer/useTouchTrigger.js +4 -0
- package/dist/Layout/LayoutContent.d.ts +3 -1
- package/dist/Layout/LayoutContent.d.ts.map +1 -1
- package/dist/Layout/LayoutContent.js +12 -4
- package/dist/Layout/LayoutPanel.d.ts +13 -10
- package/dist/Layout/LayoutPanel.d.ts.map +1 -1
- package/dist/Layout/LayoutPanel.js +81 -11
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +4 -0
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +1 -0
- package/dist/List/ListItem.d.ts +5 -4
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +45 -9
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +56 -39
- package/dist/MetadataList/MetadataList.js +1 -1
- package/dist/MobileNav/MobileNav.d.ts +11 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +39 -1
- package/dist/MoreMenu/MoreMenu.d.ts +5 -3
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +6 -9
- package/dist/NumberInput/NumberInput.d.ts +4 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +244 -11
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +7 -2
- package/dist/Popover/usePopover.d.ts +1 -0
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +12 -5
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchBottomSheet.js +4 -2
- package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchToken.js +3 -1
- package/dist/PowerSearch/formatFilterValue.d.ts +9 -3
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +14 -11
- package/dist/PowerSearch/formatTokenValue.d.ts +6 -2
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatTokenValue.js +6 -3
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +16 -3
- package/dist/Resizable/ResizeHandle.d.ts +5 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +44 -5
- package/dist/Resizable/resizablePane.d.ts +58 -0
- package/dist/Resizable/resizablePane.d.ts.map +1 -0
- package/dist/Resizable/resizablePane.js +137 -0
- package/dist/Resizable/useResizable.d.ts +7 -0
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +13 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
- package/dist/SelectableCard/SelectableCard.d.ts +1 -1
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +5 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +51 -10
- package/dist/SideNav/SideNav.d.ts +9 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +45 -10
- package/dist/Slider/sliderTouchController.js +2 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +14 -71
- package/dist/Spinner/index.d.ts +1 -1
- package/dist/Spinner/index.d.ts.map +1 -1
- package/dist/Spinner/spinnerRotor.d.ts +28 -0
- package/dist/Spinner/spinnerRotor.d.ts.map +1 -0
- package/dist/Spinner/spinnerRotor.js +98 -0
- package/dist/Stack/StackItem.d.ts +8 -4
- package/dist/Stack/StackItem.d.ts.map +1 -1
- package/dist/Stack/StackItem.js +17 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +13 -10
- package/dist/Switch/useSwitchTouch.js +4 -4
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +5 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +14 -8
- package/dist/Timestamp/formatInstant.d.ts +10 -1
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +13 -27
- package/dist/Timestamp/tooltipEntries.d.ts +5 -3
- package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
- package/dist/Timestamp/tooltipEntries.js +6 -4
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +9 -0
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +4 -1
- package/dist/Tokenizer/Tokenizer.d.ts +14 -10
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +189 -89
- package/dist/Tooltip/useTooltip.d.ts +3 -1
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +164 -59
- package/dist/TreeList/TreeListItem.d.ts +2 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +27 -3
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +2 -1
- package/dist/animator/createAnimator.js +2 -2
- package/dist/astryx.css +362 -325
- package/dist/gestures/GestureHost.d.ts +2 -2
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +21 -6
- package/dist/gestures/PanGestureRecognizer.d.ts +11 -1
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PanGestureRecognizer.js +15 -1
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +6 -1
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/nativeScroll.d.ts +3 -6
- package/dist/gestures/nativeScroll.d.ts.map +1 -1
- package/dist/gestures/nativeScroll.js +7 -52
- package/dist/gestures/wheelSegmenter.d.ts +68 -1
- package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
- package/dist/gestures/wheelSegmenter.js +199 -10
- package/dist/hooks/StackItemScrollRegion.d.ts +31 -0
- package/dist/hooks/StackItemScrollRegion.d.ts.map +1 -0
- package/dist/hooks/StackItemScrollRegion.js +40 -0
- package/dist/hooks/computeOverflow.d.ts +2 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.js +1 -1
- package/dist/hooks/menuPressGesture.d.ts +133 -21
- package/dist/hooks/menuPressGesture.d.ts.map +1 -1
- package/dist/hooks/menuPressGesture.js +155 -30
- package/dist/hooks/menuPressValues.d.ts +16 -0
- package/dist/hooks/menuPressValues.d.ts.map +1 -0
- package/dist/hooks/menuPressValues.js +18 -0
- package/dist/hooks/useClickableContainer.d.ts +36 -7
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +63 -14
- package/dist/hooks/useFocusTrap.d.ts +10 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +225 -132
- package/dist/hooks/useKeyboardHighlight.d.ts +17 -0
- package/dist/hooks/useKeyboardHighlight.d.ts.map +1 -0
- package/dist/hooks/useKeyboardHighlight.js +38 -0
- package/dist/hooks/useMediaQuery.d.ts +2 -1
- package/dist/hooks/useMediaQuery.d.ts.map +1 -1
- package/dist/hooks/useMediaQuery.js +37 -12
- package/dist/hooks/useMenuPress.d.ts +34 -1
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +93 -5
- package/dist/hooks/useOverflow.d.ts +10 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +214 -23
- package/dist/hooks/usePressFeedback.d.ts +6 -6
- package/dist/hooks/usePressFeedback.js +6 -6
- package/dist/hooks/useScrollRegionProps.d.ts +35 -0
- package/dist/hooks/useScrollRegionProps.d.ts.map +1 -0
- package/dist/hooks/useScrollRegionProps.js +51 -0
- package/dist/i18n/InternationalizationContext.d.ts +6 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.d.ts +23 -3
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +8 -3
- package/dist/i18n/generated-english/DateInput/DateInput.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/DateInput/DateInput.generated.js +0 -1
- package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts +8 -0
- package/dist/i18n/generated-english/DateInput/useTypedDate.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/DateInput/useTypedDate.generated.js +16 -0
- package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/DateTimeInput/DateTimeInput.generated.js +0 -1
- package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts +8 -0
- package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.js +12 -0
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +5 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +1 -0
- package/dist/i18n/useCalendarSystem.d.ts +19 -0
- package/dist/i18n/useCalendarSystem.d.ts.map +1 -0
- package/dist/i18n/useCalendarSystem.js +61 -0
- package/dist/internal/calendar-system.d.ts +18 -0
- package/dist/internal/calendar-system.d.ts.map +1 -0
- package/dist/internal/calendar-system.js +19 -0
- package/dist/internal/spinner-rotor.d.ts +16 -0
- package/dist/internal/spinner-rotor.d.ts.map +1 -0
- package/dist/internal/spinner-rotor.js +16 -0
- package/dist/internal/touch.d.ts +20 -2
- package/dist/internal/touch.d.ts.map +1 -1
- package/dist/internal/touch.js +29 -3
- package/dist/motion/animator.d.ts +5 -5
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +7 -6
- package/dist/motion/carryAnimations.d.ts +58 -0
- package/dist/motion/carryAnimations.d.ts.map +1 -0
- package/dist/motion/carryAnimations.js +305 -0
- package/dist/motion/transientCopy.d.ts +4 -2
- package/dist/motion/transientCopy.d.ts.map +1 -1
- package/dist/motion/transientCopy.js +34 -5
- package/dist/motion/uikit/gestures.d.ts +41 -0
- package/dist/motion/uikit/gestures.d.ts.map +1 -1
- package/dist/motion/uikit/gestures.js +25 -0
- package/dist/motion/uikit/index.d.ts +1 -1
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +1 -1
- package/dist/motion/uikit/timing.d.ts +14 -10
- package/dist/motion/uikit/timing.d.ts.map +1 -1
- package/dist/motion/uikit/timing.js +7 -5
- package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
- package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
- package/dist/privateAttributes/press.stylex.d.ts +142 -0
- package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/press.stylex.js +101 -0
- package/dist/theme/themeMotion.d.ts +3 -2
- package/dist/theme/themeMotion.d.ts.map +1 -1
- package/dist/theme/themeMotion.js +3 -2
- package/dist/theme/tokens.stylex.d.ts +2 -2
- package/dist/theme/tokens.stylex.js +1 -1
- package/dist/utils/calendarDateParser.d.ts +110 -0
- package/dist/utils/calendarDateParser.d.ts.map +1 -0
- package/dist/utils/calendarDateParser.js +1225 -0
- package/dist/utils/calendarSystem.d.ts +176 -0
- package/dist/utils/calendarSystem.d.ts.map +1 -0
- package/dist/utils/calendarSystem.js +569 -0
- package/dist/utils/coarsePointer.d.ts +5 -0
- package/dist/utils/coarsePointer.d.ts.map +1 -1
- package/dist/utils/coarsePointer.js +22 -13
- package/dist/utils/flatTree.d.ts +6 -3
- package/dist/utils/flatTree.d.ts.map +1 -1
- package/dist/utils/flatTree.js +13 -3
- package/dist/utils/focusReturn.d.ts +34 -13
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +64 -17
- package/dist/utils/hitArea.d.ts +8 -1
- package/dist/utils/hitArea.d.ts.map +1 -1
- package/dist/utils/hitArea.js +99 -9
- package/dist/utils/inputPresentation.d.ts +9 -1
- package/dist/utils/inputPresentation.d.ts.map +1 -1
- package/dist/utils/inputPresentation.js +15 -1
- package/dist/utils/inputStream.d.ts +14 -1
- package/dist/utils/inputStream.d.ts.map +1 -1
- package/dist/utils/inputStream.js +40 -9
- package/dist/utils/interactionOverlay.stylex.d.ts +5 -9
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +29 -31
- package/dist/utils/plainDate.d.ts +38 -7
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +92 -18
- package/dist/utils/pressFeedback.d.ts +10 -2
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +40 -15
- package/dist/utils/pressGesture.d.ts +12 -6
- package/dist/utils/pressGesture.d.ts.map +1 -1
- package/dist/utils/pressGesture.js +26 -8
- package/dist/utils/scrollView.d.ts +25 -0
- package/dist/utils/scrollView.d.ts.map +1 -0
- package/dist/utils/scrollView.js +108 -0
- package/dist/utils/selectionLock.d.ts.map +1 -1
- package/dist/utils/selectionLock.js +1 -10
- package/dist/utils/touchHitArea.d.ts +30 -0
- package/dist/utils/touchHitArea.d.ts.map +1 -0
- package/dist/utils/touchHitArea.js +167 -0
- package/dist/utils/touchHitArea.stylex.d.ts +38 -0
- package/dist/utils/touchHitArea.stylex.d.ts.map +1 -0
- package/dist/utils/touchHitArea.stylex.js +48 -0
- package/dist/utils/triggerFocus.d.ts +5 -0
- package/dist/utils/triggerFocus.d.ts.map +1 -1
- package/dist/utils/triggerFocus.js +9 -2
- package/locales/en.json +21 -1
- package/locales/pseudo.json +15 -0
- package/package.json +15 -4
- package/src/AppShell/observeMainOverflow.ts +9 -6
- package/src/BottomSheet/BottomSheet.tsx +45 -3
- package/src/BottomSheet/BottomSheetPanel.tsx +64 -7
- package/src/BottomSheet/bottomSheetStack.ts +4 -3
- package/src/BottomSheet/useSheetGestures.ts +83 -20
- package/src/Calendar/Calendar.doc.mjs +76 -6
- package/src/Calendar/Calendar.tsx +123 -104
- package/src/Calendar/getInitialFocusDate.ts +22 -8
- package/src/Calendar/hooks/useCalendarDays.ts +89 -63
- package/src/Calendar/hooks/useCalendarNavigation.ts +68 -26
- package/src/CheckboxInput/CheckboxInput.doc.mjs +5 -4
- package/src/CheckboxInput/CheckboxInput.tsx +105 -20
- package/src/CheckboxInput/CheckboxRowPressContext.ts +22 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
- package/src/CheckboxList/CheckboxListItem.doc.mjs +3 -3
- package/src/CheckboxList/CheckboxListItem.tsx +35 -14
- package/src/ClickableCard/ClickableCard.tsx +8 -1
- package/src/ContextMenu/ContextMenu.tsx +2 -0
- package/src/DateInput/DateInput.doc.mjs +45 -12
- package/src/DateInput/DateInput.tsx +165 -179
- package/src/DateInput/MonthScroller.tsx +39 -37
- package/src/DateInput/MonthYearWheels.tsx +68 -47
- package/src/DateInput/PickerWheel.tsx +7 -2
- package/src/DateInput/TouchDateField.tsx +45 -17
- package/src/DateInput/monthGeometry.ts +110 -8
- package/src/DateInput/useCalendarPresentation.ts +64 -0
- package/src/DateInput/useTypedDate.ts +469 -0
- package/src/DateInput/wheelStrip.ts +2 -2
- package/src/DateRangeInput/DateRangeInput.doc.mjs +9 -0
- package/src/DateRangeInput/DateRangeInput.tsx +43 -9
- package/src/DateTimeInput/DateTimeInput.doc.mjs +42 -9
- package/src/DateTimeInput/DateTimeInput.tsx +138 -148
- package/src/DateTimeInput/TouchDateTimeField.tsx +31 -16
- package/src/Dialog/Dialog.doc.mjs +1 -1
- package/src/Dialog/Dialog.tsx +14 -2
- package/src/Drawer/Drawer.doc.mjs +1 -1
- package/src/Drawer/useDrawerDialogPresence.ts +9 -2
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
- package/src/DropdownMenu/DropdownMenu.tsx +31 -7
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
- package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
- package/src/FileInput/FileInput.tsx +16 -2
- package/src/HoverCard/useHoverCard.tsx +3 -1
- package/src/Icon/useIcon.doc.mjs +94 -0
- package/src/InfoTip/InfoTip.doc.mjs +26 -2
- package/src/InfoTip/InfoTip.tsx +6 -27
- package/src/InputGroup/InputGroup.doc.mjs +4 -3
- package/src/InputGroup/InputGroup.tsx +4 -3
- package/src/InputGroup/InputGroupText.doc.mjs +45 -3
- package/src/InputGroup/InputGroupText.tsx +2 -1
- package/src/InputGroup/groupStyles.ts +3 -1
- package/src/Item/Item.tsx +139 -35
- package/src/Item/ItemListRowContext.tsx +18 -0
- package/src/Layer/holdEntranceInput.ts +84 -0
- package/src/Layer/inputHold.ts +734 -0
- package/src/Layer/outsidePress.ts +18 -1
- package/src/Layer/preserveAnimations.ts +12 -275
- package/src/Layer/useBackdropPress.ts +41 -1
- package/src/Layer/useLayer.tsx +77 -4
- package/src/Layer/useTouchTrigger.ts +4 -0
- package/src/Layout/LayoutContent.doc.mjs +6 -3
- package/src/Layout/LayoutContent.tsx +10 -4
- package/src/Layout/LayoutPanel.doc.mjs +14 -11
- package/src/Layout/LayoutPanel.tsx +113 -16
- package/src/Lightbox/Lightbox.tsx +4 -0
- package/src/List/List.doc.mjs +10 -1
- package/src/List/List.tsx +5 -0
- package/src/List/ListItem.tsx +63 -8
- package/src/Markdown/parser.ts +65 -42
- package/src/MetadataList/MetadataList.tsx +1 -1
- package/src/MobileNav/MobileNav.doc.mjs +3 -3
- package/src/MobileNav/MobileNav.tsx +39 -1
- package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
- package/src/MoreMenu/MoreMenu.tsx +5 -3
- package/src/MultiSelector/MultiSelector.tsx +7 -17
- package/src/NumberInput/NumberInput.doc.mjs +1 -1
- package/src/NumberInput/NumberInput.tsx +259 -11
- package/src/OverflowList/OverflowList.tsx +15 -9
- package/src/Popover/usePopover.tsx +1 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
- package/src/PowerSearch/PowerSearch.tsx +20 -3
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +4 -1
- package/src/PowerSearch/PowerSearchToken.tsx +3 -0
- package/src/PowerSearch/formatFilterValue.ts +21 -11
- package/src/PowerSearch/formatTokenValue.ts +7 -1
- package/src/RadioList/RadioListItem.doc.mjs +3 -2
- package/src/RadioList/RadioListItem.tsx +16 -6
- package/src/Resizable/Resizable.doc.mjs +40 -12
- package/src/Resizable/ResizeHandle.tsx +68 -6
- package/src/Resizable/resizablePane.ts +179 -0
- package/src/Resizable/useResizable.ts +15 -0
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +3 -3
- package/src/SelectableCard/SelectableCard.tsx +8 -1
- package/src/Selector/Selector.tsx +83 -8
- package/src/SideNav/SideNav.doc.mjs +2 -2
- package/src/SideNav/SideNav.tsx +87 -12
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Spinner/Spinner.tsx +7 -89
- package/src/Spinner/index.ts +1 -5
- package/src/Spinner/spinnerRotor.ts +113 -0
- package/src/Stack/Stack.doc.mjs +1 -1
- package/src/Stack/StackItem.tsx +27 -13
- package/src/Switch/Switch.tsx +7 -6
- package/src/Switch/useSwitchTouch.ts +4 -4
- package/src/TabList/Tab.tsx +5 -1
- package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
- package/src/Timestamp/Timestamp.doc.mjs +3 -3
- package/src/Timestamp/Timestamp.tsx +13 -8
- package/src/Timestamp/formatInstant.ts +49 -28
- package/src/Timestamp/tooltipEntries.ts +7 -3
- package/src/Token/Token.tsx +18 -1
- package/src/Token/TokenLink.tsx +7 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
- package/src/Tokenizer/Tokenizer.tsx +252 -115
- package/src/Tooltip/useTooltip.tsx +180 -80
- package/src/TreeList/TreeListItem.tsx +36 -2
- package/src/Typeahead/BaseTypeahead.tsx +2 -0
- package/src/animator/createAnimator.ts +3 -3
- package/src/gestures/GestureHost.ts +21 -5
- package/src/gestures/PanGestureRecognizer.ts +19 -2
- package/src/gestures/README.md +14 -5
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +6 -1
- package/src/gestures/nativeScroll.ts +12 -68
- package/src/gestures/wheelSegmenter.ts +243 -10
- package/src/hooks/StackItemScrollRegion.tsx +57 -0
- package/src/hooks/computeOverflow.ts +1 -1
- package/src/hooks/menuPressGesture.ts +244 -38
- package/src/hooks/menuPressValues.ts +18 -0
- package/src/hooks/useClickableContainer.doc.mjs +8 -2
- package/src/hooks/useClickableContainer.ts +93 -15
- package/src/hooks/useFocusTrap.ts +268 -151
- package/src/hooks/useKeyboardHighlight.ts +71 -0
- package/src/hooks/useMediaQuery.ts +41 -12
- package/src/hooks/useMenuPress.ts +118 -11
- package/src/hooks/useOverflow.ts +321 -75
- package/src/hooks/usePressFeedback.doc.mjs +3 -3
- package/src/hooks/usePressFeedback.ts +6 -6
- package/src/hooks/useScrollRegionProps.ts +76 -0
- package/src/i18n/InternationalizationContext.ts +6 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +29 -1
- package/src/i18n/InternationalizationProvider.tsx +35 -3
- package/src/i18n/generated-english/DateInput/DateInput.generated.ts +0 -1
- package/src/i18n/generated-english/DateInput/useTypedDate.generated.ts +17 -0
- package/src/i18n/generated-english/DateTimeInput/DateTimeInput.generated.ts +0 -1
- package/src/i18n/generated-english/hooks/useScrollRegionProps.generated.ts +13 -0
- package/src/i18n/generated-locales/en.generated.ts +7 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +7 -0
- package/src/i18n/index.ts +2 -0
- package/src/i18n/useCalendarSystem.ts +95 -0
- package/src/internal/calendar-system.ts +26 -0
- package/src/internal/spinner-rotor.ts +20 -0
- package/src/internal/touch.ts +43 -2
- package/src/motion/MEASUREMENTS.md +11 -0
- package/src/motion/README.md +3 -3
- package/src/motion/animator.ts +7 -7
- package/src/motion/carryAnimations.ts +389 -0
- package/src/motion/transientCopy.ts +45 -5
- package/src/motion/uikit/gestures.ts +22 -0
- package/src/motion/uikit/index.ts +1 -0
- package/src/motion/uikit/timing.ts +7 -5
- package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
- package/src/privateAttributes/press.stylex.ts +261 -0
- package/src/theme/themeMotion.ts +3 -2
- package/src/theme/tokens.stylex.ts +1 -1
- package/src/utils/calendarDateParser.ts +1385 -0
- package/src/utils/calendarSystem.ts +832 -0
- package/src/utils/coarsePointer.ts +27 -14
- package/src/utils/flatTree.ts +15 -3
- package/src/utils/focusReturn.ts +78 -18
- package/src/utils/hitArea.ts +138 -9
- package/src/utils/inputPresentation.ts +21 -1
- package/src/utils/inputStream.ts +47 -10
- package/src/utils/interactionOverlay.stylex.ts +19 -22
- package/src/utils/plainDate.ts +130 -19
- package/src/utils/pressFeedback.ts +46 -14
- package/src/utils/pressGesture.ts +35 -9
- package/src/utils/scrollView.ts +135 -0
- package/src/utils/selectionLock.ts +5 -10
- package/src/utils/touchHitArea.stylex.ts +56 -0
- package/src/utils/touchHitArea.ts +177 -0
- package/src/utils/triggerFocus.ts +17 -4
package/src/Dialog/Dialog.tsx
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Dialog.tsx
|
|
7
7
|
* @input Uses React, DialogHTMLAttributes, ReactNode, container (Layout), DialogContext, layerTextReset,
|
|
8
|
-
* layerStructureReset, modalOutlet, interactionModality, chainEventHandlers
|
|
8
|
+
* layerStructureReset, modalOutlet, interactionModality, chainEventHandlers, holdEntranceInput
|
|
9
9
|
* @output Exports Dialog component, DialogProps, DialogVariant, DialogPurpose types
|
|
10
10
|
* @position Core implementation; consumed by index.ts, tested by Dialog.test.tsx
|
|
11
11
|
*
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* SYNC: When modified, update these files to stay in sync:
|
|
28
28
|
* - /packages/core/src/Dialog/Dialog.doc.mjs (props table, features, implementation notes)
|
|
29
29
|
* - /packages/core/src/Dialog/Dialog.test.tsx (tests for new/changed behavior)
|
|
30
|
+
* - /packages/core/src/Dialog/__tests__/DialogTouchEntrance.interaction.browser.spec.ts (the touch entrance hold)
|
|
30
31
|
* - /packages/core/src/Dialog/index.ts (exports if types change)
|
|
31
32
|
* - /apps/storybook/stories/Dialog.stories.tsx (storybook stories)
|
|
32
33
|
* - /packages/cli/assets/templates/blocks/components/Dialog/ (showcase blocks)
|
|
@@ -51,8 +52,10 @@ import {layerStructureReset} from '../Layer/layerStructureReset.stylex';
|
|
|
51
52
|
import {LayerContentBoundary} from '../Layer/layerScopedContext';
|
|
52
53
|
import {layerClickBoundary} from '../Layer/layerClickBoundary';
|
|
53
54
|
import {LayerDepthProvider} from '../Layer/LayerDepthContext';
|
|
55
|
+
import {holdEntranceInput} from '../Layer/holdEntranceInput';
|
|
54
56
|
import {useLayerDismissal} from '../Layer/useLayerDismissal';
|
|
55
57
|
import {useBackdropPress} from '../Layer/useBackdropPress';
|
|
58
|
+
import {useFocusRegionContainment} from '../hooks/useFocusTrap';
|
|
56
59
|
import {useModalOutlet} from '../Layer/modalOutlet';
|
|
57
60
|
import {
|
|
58
61
|
colorVars,
|
|
@@ -84,6 +87,7 @@ import {useInteractionModalityTracking} from '../utils/interactionModality';
|
|
|
84
87
|
import {
|
|
85
88
|
focusForLastInput,
|
|
86
89
|
prepareFocusReturnOnRemoval,
|
|
90
|
+
returnFocusForLastInput,
|
|
87
91
|
} from '../utils/focusReturn';
|
|
88
92
|
import {ModalAnnounceProvider} from '../hooks/ModalAnnounceProvider';
|
|
89
93
|
|
|
@@ -547,6 +551,9 @@ export function Dialog({
|
|
|
547
551
|
props['aria-label'] != null || props['aria-labelledby'] != null;
|
|
548
552
|
|
|
549
553
|
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
554
|
+
// Native showModal() lets Tab leave for the browser's own UI, so the shared
|
|
555
|
+
// module wraps it. An inline preview is not modal and contains nothing.
|
|
556
|
+
useFocusRegionContainment(dialogRef, isOpen && !isInline);
|
|
550
557
|
|
|
551
558
|
// Callback ref on the <dialog>: sync the default aria-labelledby from the
|
|
552
559
|
// DialogHeader title (if one rendered) in the same commit, with no second
|
|
@@ -642,6 +649,11 @@ export function Dialog({
|
|
|
642
649
|
focusForLastInput(autofocusTarget);
|
|
643
650
|
}
|
|
644
651
|
}
|
|
652
|
+
// Under a coarse primary pointer, a tap or a drag during the entrance
|
|
653
|
+
// reaches nothing. Keys and assistive technology stay live. The hold
|
|
654
|
+
// ends with the entrance, or with this effect's cleanup on a close or
|
|
655
|
+
// unmount.
|
|
656
|
+
return holdEntranceInput(dialog) ?? undefined;
|
|
645
657
|
} else {
|
|
646
658
|
if (dialog.open) {
|
|
647
659
|
dialog.close();
|
|
@@ -650,7 +662,7 @@ export function Dialog({
|
|
|
650
662
|
// the last input in that element's own document calls for.
|
|
651
663
|
const trigger = triggerElementRef.current;
|
|
652
664
|
if (trigger) {
|
|
653
|
-
|
|
665
|
+
returnFocusForLastInput(trigger);
|
|
654
666
|
}
|
|
655
667
|
triggerElementRef.current = null;
|
|
656
668
|
}
|
|
@@ -172,7 +172,7 @@ export const docs = {
|
|
|
172
172
|
usage: {
|
|
173
173
|
anatomy,
|
|
174
174
|
description:
|
|
175
|
-
'A side panel that floats above page content for inspectors and detail views: the "click a table row, see its details" pattern. Unlike a docked panel it overlays the layout instead of reflowing it. Works on desktop and touch: the width budget applies on desktop and the panel preserves a 56px page reveal below 640px without exceeding the width budget. Escape closes the drawer (unless purpose is required) and focus returns to the element that opened it. Entry/exit slide animation respects prefers-reduced-motion. Stacking contract: sibling drawers stack last-opened on top, Escape closes only the topmost, and closing peels innermost-first; render them as siblings, never nested.\n\nLike Dialog, the drawer is a container: its content area is inset by --spacing-4 (16px) by default, by the padding prop, or by a theme\'s padding on drawer. Compose the header, body, and footer the way Dialog does, with a Layout: DrawerHeader in the header slot (it shows a close button when you pass it onOpenChange, like DialogHeader), the body in LayoutContent, and actions in LayoutFooter. The Layout redistributes the inset to those regions so they line up on one content line, and the header is not inset twice. A lone Section child also escapes the inset. Drawer renders no close button of its own, so give every drawer a visible way to close, especially a non-modal one, which has no scrim to click. Put data-autofocus on the control that should receive focus on open.\n\nChoosing a surface: use Dialog for a centered decision or short form, Drawer for full-height side detail that keeps the page in sight, BottomSheet for block-axis sheets on touch, and a docked panel (a layout column) when content should reflow the page instead of floating over it.\n\nTheming: the panel is the single stable target (astryx-drawer, with data-side reflecting side), and the scrim is the panel\'s native ::backdrop. DrawerHeader exposes astryx-drawer-header targets for its row, slots, and close icon.',
|
|
175
|
+
'A side panel that floats above page content for inspectors and detail views: the "click a table row, see its details" pattern. Unlike a docked panel it overlays the layout instead of reflowing it. Works on desktop and touch: the width budget applies on desktop and the panel preserves a 56px page reveal below 640px without exceeding the width budget. Escape closes the drawer (unless purpose is required) and focus returns to the element that opened it. Entry/exit slide animation respects prefers-reduced-motion. On a phone or tablet (a coarse primary pointer), a tap or a drag that lands while the drawer is still sliding in reaches nothing (for a drawer without a scrim, only one on the panel: the page stays live), and the drawer finishes sliding in; keys and assistive technology stay live, and a mouse or a trackpad still clicks: at once when it was the last pointer used, otherwise once it moves. Stacking contract: sibling drawers stack last-opened on top, Escape closes only the topmost, and closing peels innermost-first; render them as siblings, never nested.\n\nLike Dialog, the drawer is a container: its content area is inset by --spacing-4 (16px) by default, by the padding prop, or by a theme\'s padding on drawer. Compose the header, body, and footer the way Dialog does, with a Layout: DrawerHeader in the header slot (it shows a close button when you pass it onOpenChange, like DialogHeader), the body in LayoutContent, and actions in LayoutFooter. The Layout redistributes the inset to those regions so they line up on one content line, and the header is not inset twice. A lone Section child also escapes the inset. Drawer renders no close button of its own, so give every drawer a visible way to close, especially a non-modal one, which has no scrim to click. Put data-autofocus on the control that should receive focus on open.\n\nChoosing a surface: use Dialog for a centered decision or short form, Drawer for full-height side detail that keeps the page in sight, BottomSheet for block-axis sheets on touch, and a docked panel (a layout column) when content should reflow the page instead of floating over it.\n\nTheming: the panel is the single stable target (astryx-drawer, with data-side reflecting side), and the scrim is the panel\'s native ::backdrop. DrawerHeader exposes astryx-drawer-header targets for its row, slots, and close icon.',
|
|
176
176
|
bestPractices: [
|
|
177
177
|
{
|
|
178
178
|
guidance: true,
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useDrawerDialogPresence.ts
|
|
7
7
|
* @input Controlled open state, modal mode, dialog ref, and rendered-state setter
|
|
8
|
-
* @output Coordinates native top-layer presence, exit timing, focus restoration, and unmount cleanup
|
|
8
|
+
* @output Coordinates native top-layer presence, the touch entrance's input hold, exit timing, focus restoration, and unmount cleanup
|
|
9
9
|
* @position Drawer-internal hook; consumed only by Drawer.tsx
|
|
10
10
|
*
|
|
11
11
|
* The drawer has two independent notions of presence:
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
*
|
|
22
22
|
* SYNC: When modified, update:
|
|
23
23
|
* - /packages/core/src/Drawer/Drawer.test.tsx
|
|
24
|
+
* - /packages/core/src/Drawer/__tests__/DrawerTouchEntrance.interaction.browser.spec.ts
|
|
24
25
|
* - /.github/scripts/modal-close-visibility.js
|
|
25
26
|
*/
|
|
26
27
|
|
|
@@ -32,6 +33,7 @@ import {
|
|
|
32
33
|
type SetStateAction,
|
|
33
34
|
} from 'react';
|
|
34
35
|
import {flushSync} from 'react-dom';
|
|
36
|
+
import {holdEntranceInput} from '../Layer/holdEntranceInput';
|
|
35
37
|
import {notifyTopLayerEntry} from '../Layer/modalOutlet';
|
|
36
38
|
import {runPopoverOperation} from '../Layer/popoverOperations';
|
|
37
39
|
|
|
@@ -149,7 +151,12 @@ export function useDrawerDialogPresence({
|
|
|
149
151
|
// contract as Dialog).
|
|
150
152
|
dialog.querySelector<HTMLElement>('[data-autofocus]')?.focus();
|
|
151
153
|
}
|
|
152
|
-
|
|
154
|
+
// Under a coarse primary pointer, a tap or a drag during the slide-in
|
|
155
|
+
// reaches nothing. A non-modal drawer holds only its panel, so its page
|
|
156
|
+
// stays live. Keys and assistive technology stay live. The hold ends
|
|
157
|
+
// with the slide-in, or with this effect's cleanup on a close or
|
|
158
|
+
// unmount.
|
|
159
|
+
return holdEntranceInput(dialog, {isModal}) ?? undefined;
|
|
153
160
|
}
|
|
154
161
|
|
|
155
162
|
if (!isDrawerHostOpen(dialog, isModal)) {
|
|
@@ -201,8 +201,7 @@ export const docs = {
|
|
|
201
201
|
name: 'presentation',
|
|
202
202
|
type: "'popover' | 'bottom-sheet' | 'adaptive'",
|
|
203
203
|
description:
|
|
204
|
-
"Presentation surface for data-driven items. 'popover' stays anchored, 'bottom-sheet' always renders the actions in a modal BottomSheet, and 'adaptive' uses a BottomSheet on compact coarse-pointer layouts while remaining anchored elsewhere. Compound children currently support popover only.",
|
|
205
|
-
default: "'popover'",
|
|
204
|
+
"Presentation surface for data-driven items. 'popover' stays anchored, 'bottom-sheet' always renders the actions in a modal BottomSheet, and 'adaptive' uses a BottomSheet on compact coarse-pointer layouts while remaining anchored elsewhere. Compound children currently support popover only. Omitted, the menu is anchored, and under a finger, on every device, the finger that opened it picks a row only after moving 10 px. Pass 'popover' to keep the pointer behavior on every device, the settle rule included.",
|
|
206
205
|
},
|
|
207
206
|
{
|
|
208
207
|
name: 'isMenuOpen',
|
|
@@ -70,11 +70,11 @@ import {
|
|
|
70
70
|
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
71
71
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
72
72
|
import {useListFocus} from '../hooks/useListFocus';
|
|
73
|
-
import {
|
|
73
|
+
import {useDropdownMenuPress} from '../hooks/useMenuPress';
|
|
74
74
|
import type {MenuPressPointerType} from '../hooks/menuPressGesture';
|
|
75
75
|
import {useTypeahead} from '../hooks/useTypeahead';
|
|
76
76
|
import {useFocusReturnVisibility} from '../hooks/useFocusReturnVisibility';
|
|
77
|
-
import {
|
|
77
|
+
import {returnFocusForLastInput} from '../utils/focusReturn';
|
|
78
78
|
import {useMenuOverflow} from './useMenuOverflow';
|
|
79
79
|
import {MenuRegionsContext} from './menuRegionsContext';
|
|
80
80
|
import {moveRegionsTab} from './menuRegionStops';
|
|
@@ -460,7 +460,10 @@ interface DropdownMenuDataProps extends DropdownMenuBaseProps {
|
|
|
460
460
|
* Surface used to present the actions. Pass a value selected by product
|
|
461
461
|
* policy (for example, a compact-touch media query) when the presentation
|
|
462
462
|
* should adapt. Bottom-sheet presentation is intended for short action sets.
|
|
463
|
-
*
|
|
463
|
+
* Omitted, the menu is the anchored popover. Under a finger, on every
|
|
464
|
+
* device, the finger that opened it picks as UIMenu's does, once it has
|
|
465
|
+
* moved. `'popover'` pins the anchored popover with the pointer behavior on
|
|
466
|
+
* every device (the opening press follows the settle rule).
|
|
464
467
|
*/
|
|
465
468
|
presentation?: DropdownMenuPresentation;
|
|
466
469
|
items: DropdownMenuOption[];
|
|
@@ -468,6 +471,11 @@ interface DropdownMenuDataProps extends DropdownMenuBaseProps {
|
|
|
468
471
|
}
|
|
469
472
|
|
|
470
473
|
interface DropdownMenuCompoundProps extends DropdownMenuBaseProps {
|
|
474
|
+
/**
|
|
475
|
+
* `'popover'` pins the pointer behavior on every device (the opening press
|
|
476
|
+
* follows the settle rule). Omitted, on every device, the finger
|
|
477
|
+
* that opened the menu picks as UIMenu's does, once it has moved.
|
|
478
|
+
*/
|
|
471
479
|
presentation?: 'popover';
|
|
472
480
|
items?: undefined;
|
|
473
481
|
children: ReactNode;
|
|
@@ -881,6 +889,7 @@ function DropdownMenuPopover({
|
|
|
881
889
|
placement = 'below',
|
|
882
890
|
alignment = 'start',
|
|
883
891
|
presentation: _presentation,
|
|
892
|
+
pressTouchModel = 'uikit',
|
|
884
893
|
header,
|
|
885
894
|
footer,
|
|
886
895
|
className,
|
|
@@ -888,7 +897,13 @@ function DropdownMenuPopover({
|
|
|
888
897
|
xstyle,
|
|
889
898
|
'data-testid': testId,
|
|
890
899
|
...props
|
|
891
|
-
}: DropdownMenuProps
|
|
900
|
+
}: DropdownMenuProps & {
|
|
901
|
+
/**
|
|
902
|
+
* How a finger's press runs, on every device: UIMenu's, unless the caller
|
|
903
|
+
* pins `presentation="popover"`.
|
|
904
|
+
*/
|
|
905
|
+
pressTouchModel?: 'pointer' | 'uikit';
|
|
906
|
+
}) {
|
|
892
907
|
const t = useComponentTranslator();
|
|
893
908
|
const button = buttonFromProps ?? {label: t(DEFAULT_BUTTON_I18N_KEY)};
|
|
894
909
|
|
|
@@ -1018,7 +1033,7 @@ function DropdownMenuPopover({
|
|
|
1018
1033
|
// reaches only the design system's own Button; the browser's focus option
|
|
1019
1034
|
// also reaches a control the caller renders, which the browser would
|
|
1020
1035
|
// otherwise ring (Chromium after a mouse pick, WebKit after a touch).
|
|
1021
|
-
|
|
1036
|
+
returnFocusForLastInput(trigger);
|
|
1022
1037
|
}, [hideOpenFlyouts, isControlled, onOpenChange, prepareFocusReturn]);
|
|
1023
1038
|
|
|
1024
1039
|
// Defer item focus until the layer has committed open, so focus restore
|
|
@@ -1359,12 +1374,15 @@ function DropdownMenuPopover({
|
|
|
1359
1374
|
// The press model: the row under a release acts, the highlight follows a
|
|
1360
1375
|
// held pointer. A mouse released outside the menu dismisses it; a finger
|
|
1361
1376
|
// released outside leaves it open, so the hook never calls onDismiss then.
|
|
1362
|
-
const menuPress =
|
|
1377
|
+
const menuPress = useDropdownMenuPress({
|
|
1363
1378
|
menuRef: listRef,
|
|
1364
1379
|
triggerRef: buttonRef,
|
|
1365
1380
|
itemSelector: MENU_ITEM_SELECTOR,
|
|
1366
1381
|
onTriggerPress: handleTriggerPress,
|
|
1367
1382
|
onDismiss: closeMenu,
|
|
1383
|
+
// Under a finger, on every device, the opening finger picks as UIMenu's
|
|
1384
|
+
// does. `presentation="popover"` pins the pointer model.
|
|
1385
|
+
touchModel: pressTouchModel,
|
|
1368
1386
|
});
|
|
1369
1387
|
cancelMenuPressRef.current = menuPress.cancel;
|
|
1370
1388
|
|
|
@@ -1786,7 +1804,13 @@ export function DropdownMenu(props: DropdownMenuProps) {
|
|
|
1786
1804
|
);
|
|
1787
1805
|
}
|
|
1788
1806
|
|
|
1789
|
-
return
|
|
1807
|
+
return (
|
|
1808
|
+
<DropdownMenuPopover
|
|
1809
|
+
{...sharedProps}
|
|
1810
|
+
presentation="popover"
|
|
1811
|
+
pressTouchModel={props.presentation === 'popover' ? 'pointer' : 'uikit'}
|
|
1812
|
+
/>
|
|
1813
|
+
);
|
|
1790
1814
|
}
|
|
1791
1815
|
|
|
1792
1816
|
DropdownMenu.displayName = 'DropdownMenu';
|
|
@@ -38,6 +38,7 @@ import {useIndicator} from '../Indicator';
|
|
|
38
38
|
import {Item} from '../Item';
|
|
39
39
|
import {useDropdownMenuContext} from './DropdownMenuContext';
|
|
40
40
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
41
|
+
import {menuPressLitRowStyle} from '../privateAttributes/menuPressLit.stylex';
|
|
41
42
|
import {focusMenuItemOnHover} from './menuItemHover';
|
|
42
43
|
import {colorVars, focusVars, spacingVars} from '../theme/tokens.stylex';
|
|
43
44
|
import {composeEventHandlers, mergeProps, themeProps} from '../utils';
|
|
@@ -50,7 +51,9 @@ const styles = stylex.create({
|
|
|
50
51
|
color: colorVars['--color-text-primary'],
|
|
51
52
|
backgroundColor: {
|
|
52
53
|
default: 'transparent',
|
|
53
|
-
|
|
54
|
+
// menuPressLitRowStyle sets the variable on the row a held finger or pen
|
|
55
|
+
// lights.
|
|
56
|
+
':focus': `var(--_menu-row-focus-paint, ${colorVars['--color-overlay-hover']})`,
|
|
54
57
|
},
|
|
55
58
|
cursor: {
|
|
56
59
|
default: 'pointer',
|
|
@@ -231,6 +234,7 @@ export function DropdownMenuCheckboxItem({
|
|
|
231
234
|
xstyle={[
|
|
232
235
|
focusOutlineStyles.focusVisible,
|
|
233
236
|
styles.root,
|
|
237
|
+
menuPressLitRowStyle,
|
|
234
238
|
isDisabled && styles.disabled,
|
|
235
239
|
xstyle,
|
|
236
240
|
]}
|
|
@@ -49,6 +49,7 @@ import {composeEventHandlers, mergeProps} from '../utils';
|
|
|
49
49
|
import type {BaseProps} from '../BaseProps';
|
|
50
50
|
import {useDropdownMenuContext} from './DropdownMenuContext';
|
|
51
51
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
52
|
+
import {menuPressLitRowStyle} from '../privateAttributes/menuPressLit.stylex';
|
|
52
53
|
import {focusMenuItemOnHover} from './menuItemHover';
|
|
53
54
|
import {isModifiedClick} from './menuItemRoles';
|
|
54
55
|
import {themeProps} from '../utils/themeProps';
|
|
@@ -66,14 +67,16 @@ const menuItemStyles = stylex.create({
|
|
|
66
67
|
color: colorVars['--color-text-primary'],
|
|
67
68
|
backgroundColor: {
|
|
68
69
|
default: 'transparent',
|
|
69
|
-
|
|
70
|
+
// menuPressLitRowStyle sets the variable on the row a held finger or pen
|
|
71
|
+
// lights.
|
|
72
|
+
':focus': `var(--_menu-row-focus-paint, ${colorVars['--color-overlay-hover']})`,
|
|
70
73
|
// The pressed look only where hover exists. Under a finger the row a
|
|
71
74
|
// press BEGAN on would otherwise stay painted while the highlight (focus)
|
|
72
|
-
// moves to the row under the finger — two rows lit.
|
|
75
|
+
// moves to the row under the finger — two rows lit. A held finger or pen
|
|
76
|
+
// sets the variable on the menu. Then only the lit row keeps the look.
|
|
73
77
|
'@media (hover: hover)': {
|
|
74
78
|
default: null,
|
|
75
|
-
':active:where(:not(:disabled,[aria-disabled="true"]))':
|
|
76
|
-
colorVars['--color-overlay-pressed'],
|
|
79
|
+
':active:where(:not(:disabled,[aria-disabled="true"]))': `var(--_menu-row-active-paint, ${colorVars['--color-overlay-pressed']})`,
|
|
77
80
|
},
|
|
78
81
|
},
|
|
79
82
|
borderWidth: 0,
|
|
@@ -303,6 +306,7 @@ export function DropdownMenuItem({
|
|
|
303
306
|
xstyle={[
|
|
304
307
|
focusOutlineStyles.focusVisible,
|
|
305
308
|
menuItemStyles.root,
|
|
309
|
+
menuPressLitRowStyle,
|
|
306
310
|
itemSizeStyles[menuSize],
|
|
307
311
|
isDestructive && menuItemStyles.destructive,
|
|
308
312
|
isDisabled && menuItemStyles.disabled,
|
|
@@ -34,6 +34,7 @@ import {useIndicator} from '../Indicator';
|
|
|
34
34
|
import {Item} from '../Item';
|
|
35
35
|
import {useDropdownMenuContext} from './DropdownMenuContext';
|
|
36
36
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
37
|
+
import {menuPressLitRowStyle} from '../privateAttributes/menuPressLit.stylex';
|
|
37
38
|
import {focusMenuItemOnHover} from './menuItemHover';
|
|
38
39
|
import {colorVars, focusVars, spacingVars} from '../theme/tokens.stylex';
|
|
39
40
|
import {composeEventHandlers, mergeProps, themeProps} from '../utils';
|
|
@@ -47,7 +48,9 @@ const styles = stylex.create({
|
|
|
47
48
|
color: colorVars['--color-text-primary'],
|
|
48
49
|
backgroundColor: {
|
|
49
50
|
default: 'transparent',
|
|
50
|
-
|
|
51
|
+
// menuPressLitRowStyle sets the variable on the row a held finger or pen
|
|
52
|
+
// lights.
|
|
53
|
+
':focus': `var(--_menu-row-focus-paint, ${colorVars['--color-overlay-hover']})`,
|
|
51
54
|
},
|
|
52
55
|
cursor: {
|
|
53
56
|
default: 'pointer',
|
|
@@ -218,6 +221,7 @@ export function DropdownMenuRadioItem({
|
|
|
218
221
|
xstyle={[
|
|
219
222
|
focusOutlineStyles.focusVisible,
|
|
220
223
|
styles.root,
|
|
224
|
+
menuPressLitRowStyle,
|
|
221
225
|
isDisabled && styles.disabled,
|
|
222
226
|
xstyle,
|
|
223
227
|
]}
|
|
@@ -99,6 +99,7 @@ import {
|
|
|
99
99
|
rtlStyles,
|
|
100
100
|
} from '../utils';
|
|
101
101
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
102
|
+
import {menuPressLitRowStyle} from '../privateAttributes/menuPressLit.stylex';
|
|
102
103
|
import {getInteractionModality} from '../utils/interactionModality';
|
|
103
104
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
104
105
|
import {useDevWarning} from '../hooks/useDevWarning';
|
|
@@ -146,7 +147,9 @@ const triggerStyles = stylex.create({
|
|
|
146
147
|
color: colorVars['--color-text-primary'],
|
|
147
148
|
backgroundColor: {
|
|
148
149
|
default: 'transparent',
|
|
149
|
-
|
|
150
|
+
// menuPressLitRowStyle sets the variable on the row a held finger or pen
|
|
151
|
+
// lights.
|
|
152
|
+
':focus': `var(--_menu-row-focus-paint, ${colorVars['--color-overlay-hover']})`,
|
|
150
153
|
},
|
|
151
154
|
borderWidth: 0,
|
|
152
155
|
borderStyle: 'none',
|
|
@@ -1243,6 +1246,7 @@ export function DropdownMenuSubMenu(
|
|
|
1243
1246
|
xstyle={[
|
|
1244
1247
|
focusOutlineStyles.focusVisible,
|
|
1245
1248
|
triggerStyles.root,
|
|
1249
|
+
menuPressLitRowStyle,
|
|
1246
1250
|
triggerSizeStyles[menuSize],
|
|
1247
1251
|
isOpen && triggerStyles.open,
|
|
1248
1252
|
isDisabled && triggerStyles.disabled,
|
|
@@ -754,7 +754,14 @@ export function FileInput({
|
|
|
754
754
|
(e: DragEvent) => {
|
|
755
755
|
e.preventDefault();
|
|
756
756
|
e.stopPropagation();
|
|
757
|
-
if (
|
|
757
|
+
if (isSelectionDisabled) {
|
|
758
|
+
// A cancelled dragover with the default effect makes the zone a drop
|
|
759
|
+
// target.
|
|
760
|
+
// The 'none' effect shows the no-drop cursor and stops the drop.
|
|
761
|
+
if (e.dataTransfer) {
|
|
762
|
+
e.dataTransfer.dropEffect = 'none';
|
|
763
|
+
}
|
|
764
|
+
} else if (mode === 'dropzone') {
|
|
758
765
|
setIsDragOver(true);
|
|
759
766
|
}
|
|
760
767
|
},
|
|
@@ -765,7 +772,14 @@ export function FileInput({
|
|
|
765
772
|
(e: DragEvent) => {
|
|
766
773
|
e.preventDefault();
|
|
767
774
|
e.stopPropagation();
|
|
768
|
-
if (
|
|
775
|
+
if (isSelectionDisabled) {
|
|
776
|
+
// A cancelled dragover with the default effect makes the zone a drop
|
|
777
|
+
// target.
|
|
778
|
+
// The 'none' effect shows the no-drop cursor and stops the drop.
|
|
779
|
+
if (e.dataTransfer) {
|
|
780
|
+
e.dataTransfer.dropEffect = 'none';
|
|
781
|
+
}
|
|
782
|
+
} else if (mode === 'dropzone') {
|
|
769
783
|
setIsDragOver(true);
|
|
770
784
|
}
|
|
771
785
|
},
|
|
@@ -177,7 +177,8 @@ export interface HoverCardReturn {
|
|
|
177
177
|
|
|
178
178
|
/**
|
|
179
179
|
* Ref for the positioning anchor element.
|
|
180
|
-
*
|
|
180
|
+
* While the layer is shown, and until its exit animation ends, the trigger
|
|
181
|
+
* carries the layer's CSS anchor name.
|
|
181
182
|
*/
|
|
182
183
|
positionRef: RefCallback<HTMLElement>;
|
|
183
184
|
|
|
@@ -191,6 +192,7 @@ export interface HoverCardReturn {
|
|
|
191
192
|
/**
|
|
192
193
|
* The CSS anchor name to use for positioning.
|
|
193
194
|
* Use this when you need to set anchorName manually (e.g., display:contents wrapper).
|
|
195
|
+
* Set it only while the layer is shown or its exit animation runs.
|
|
194
196
|
*/
|
|
195
197
|
anchorId: string;
|
|
196
198
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('@astryxdesign/cli/authoring').HookDoc} */
|
|
4
|
+
export const docs = {
|
|
5
|
+
name: 'useIcon',
|
|
6
|
+
displayName: 'useIcon',
|
|
7
|
+
group: 'Icon',
|
|
8
|
+
keywords: [
|
|
9
|
+
'icon',
|
|
10
|
+
'semantic icon',
|
|
11
|
+
'theme icons',
|
|
12
|
+
'icon registry',
|
|
13
|
+
'getIcon',
|
|
14
|
+
'registerIcons',
|
|
15
|
+
'success',
|
|
16
|
+
'warning',
|
|
17
|
+
'error',
|
|
18
|
+
],
|
|
19
|
+
params: [
|
|
20
|
+
{
|
|
21
|
+
name: 'name',
|
|
22
|
+
type: 'IconName | NamespacedIconName',
|
|
23
|
+
description:
|
|
24
|
+
"Semantic icon name, such as 'success', 'warning' or 'close', or a namespaced extension key such as 'richtext:bold'. Both resolve through the same registry.",
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
returns: [
|
|
29
|
+
{
|
|
30
|
+
name: 'icon',
|
|
31
|
+
type: 'ReactNode',
|
|
32
|
+
description:
|
|
33
|
+
"The icon for that name from the nearest Theme's icons (or, outside any Theme, from the registered theme the document root names), else from registerIcons() overrides, else the built-in default. A function entry is read at {size: 'md'}.",
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
usage: {
|
|
37
|
+
description:
|
|
38
|
+
"Resolves a semantic icon name to a React node through the nearest Theme, so a custom component draws the same success, warning or error icon that Astryx components draw and follows a theme that overrides it. Resolution reads the nearest Theme's icons (outside any Theme, the registered theme the document root names), then registerIcons() overrides, then the built-in default. The node is returned as is, with no size or color wrapper: the built-in icons are 1em squares in currentColor, so they follow the surrounding text. A function entry is read at {size: 'md'}. Render <Icon icon={name} /> instead when the icon needs another size, a color or a label.",
|
|
39
|
+
bestPractices: [
|
|
40
|
+
{
|
|
41
|
+
guidance: true,
|
|
42
|
+
description:
|
|
43
|
+
'Use it in a custom component that places a semantic icon itself, so a Theme that overrides the icon changes the component too.',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
guidance: true,
|
|
47
|
+
description:
|
|
48
|
+
'Render <Icon icon={name} /> when the icon needs a size other than md, a color, or an accessible label.',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
guidance: false,
|
|
52
|
+
description:
|
|
53
|
+
'Import a specific icon library glyph for a semantic purpose that a theme should control, such as a success or error state.',
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
relatedComponents: ['Icon', 'Theme'],
|
|
58
|
+
relatedHooks: ['useTheme'],
|
|
59
|
+
importPath: '@astryxdesign/core/Icon',
|
|
60
|
+
category: 'utilities',
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/** @type {import('@astryxdesign/cli/authoring').HookTranslationDoc} */
|
|
64
|
+
export const docsDense = {
|
|
65
|
+
description:
|
|
66
|
+
"Resolves a semantic icon name to a React node via the nearest Theme, so custom components draw the same icons as Astryx components and follow theme overrides. Fallback: nearest Theme icons (outside any Theme, the root's registered theme), registerIcons() overrides, built-in default. Node returned as is (built-ins are 1em, currentColor). Function entries read at {size: 'md'}. Use <Icon icon={name} /> for another size, a color or a label.",
|
|
67
|
+
paramDescriptions: {
|
|
68
|
+
name: "semantic icon name ('success', 'close') or namespaced key ('richtext:bold'); same registry.",
|
|
69
|
+
},
|
|
70
|
+
returnDescriptions: {
|
|
71
|
+
icon: "icon node from nearest Theme (outside any Theme, the root's registered theme), else registerIcons() overrides, else built-in default; function entries read at {size: 'md'}.",
|
|
72
|
+
},
|
|
73
|
+
usage: {
|
|
74
|
+
description:
|
|
75
|
+
"Semantic icon name to React node via nearest Theme; custom components follow theme icon overrides. Fallback: nearest Theme (or root's registered theme), registerIcons(), built-in. No size/color wrapper; function entries read at {size: 'md'}. Use <Icon icon={name} /> for other sizes, color or a label.",
|
|
76
|
+
bestPractices: [
|
|
77
|
+
{
|
|
78
|
+
guidance: true,
|
|
79
|
+
description:
|
|
80
|
+
'Use in custom components that place a semantic icon, so Theme overrides reach them.',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
guidance: true,
|
|
84
|
+
description:
|
|
85
|
+
'Render <Icon icon={name} /> for a non-md size, a color, or an accessible label.',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
guidance: false,
|
|
89
|
+
description:
|
|
90
|
+
'Import a library glyph for a semantic purpose a theme should control (success, error).',
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
};
|
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
|
+
/** @type {import('@astryxdesign/cli/authoring').ComponentAnatomyElement[]} */
|
|
4
|
+
const anatomy = [
|
|
5
|
+
{
|
|
6
|
+
name: 'Trigger button',
|
|
7
|
+
required: true,
|
|
8
|
+
description:
|
|
9
|
+
'Small round native button, named by `label`, that previews and pins the help.',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
name: 'Info icon',
|
|
13
|
+
required: true,
|
|
14
|
+
description:
|
|
15
|
+
"The icon registry's `info` artwork at `size`; a theme may replace it.",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'Help surface',
|
|
19
|
+
required: true,
|
|
20
|
+
description:
|
|
21
|
+
'Tooltip surface that shows `content` while the help is shown.',
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
|
|
3
25
|
/** @type {import('@astryxdesign/cli/authoring').ComponentDoc} */
|
|
4
26
|
|
|
5
27
|
export const docs = {
|
|
@@ -50,8 +72,9 @@ export const docs = {
|
|
|
50
72
|
},
|
|
51
73
|
],
|
|
52
74
|
usage: {
|
|
75
|
+
anatomy,
|
|
53
76
|
description:
|
|
54
|
-
'An info icon that reveals help: a small "i" button. Hover and keyboard focus preview the help, and a click, tap, Enter, or Space pins it open until Escape, a second press, a press outside, or focus leaving. Use it next to labels, values, and metrics for permission notes, metric definitions, and field help. Its value over hand-composing Icon inside Tooltip is the pre-wired accessible trigger: a real button with an aria-label, Tab-reachable, tooltip on hover AND focus AND tap, and Escape dismissal.',
|
|
77
|
+
'An info icon that reveals help: a small "i" button. Hover and keyboard focus preview the help, and a click, tap, Enter, or Space pins it open until Escape, a second press, a press outside, or focus leaving. Use it next to labels, values, and metrics for permission notes, metric definitions, and field help. Its value over hand-composing Icon inside Tooltip is the pre-wired accessible trigger: a real button with an aria-label, Tab-reachable, tooltip on hover AND focus AND tap, and Escape dismissal. It follows the toggletip pattern: the button reports `aria-expanded="true"` while the help is pinned, and a screen reader hears the help once when it pins.',
|
|
55
78
|
bestPractices: [
|
|
56
79
|
{
|
|
57
80
|
guidance: true,
|
|
@@ -115,6 +138,7 @@ export const docsZh = {
|
|
|
115
138
|
},
|
|
116
139
|
],
|
|
117
140
|
usage: {
|
|
141
|
+
anatomy,
|
|
118
142
|
description:
|
|
119
143
|
'An info icon that reveals help: a small "i" button. Hover and keyboard focus preview the help, and a click, tap, Enter, or Space pins it open until Escape, a second press, a press outside, or focus leaving. Use it next to labels, values, and metrics for permission notes, metric definitions, and field help.',
|
|
120
144
|
bestPractices: [
|
|
@@ -153,7 +177,7 @@ export const docsDense = {
|
|
|
153
177
|
'Inline info-icon help affordance: accessible "i" button trigger pre-wired into a Tooltip.',
|
|
154
178
|
usage: {
|
|
155
179
|
description:
|
|
156
|
-
'A small "i" button: hover and keyboard focus preview the help; a click, tap, Enter, or Space pins it open. Use next to labels, values, and metrics for permission notes, metric definitions, and field help. Pre-wired accessible trigger: real button, aria-label, Tab-reachable, tooltip on hover AND focus AND tap, Escape dismissal.',
|
|
180
|
+
'A small "i" button: hover and keyboard focus preview the help; a click, tap, Enter, or Space pins it open. Use next to labels, values, and metrics for permission notes, metric definitions, and field help. Pre-wired accessible trigger: real button, aria-label, Tab-reachable, tooltip on hover AND focus AND tap, Escape dismissal. Toggletip pattern: aria-expanded="true" while pinned; the help is announced once when it pins.',
|
|
157
181
|
bestPractices: [
|
|
158
182
|
{
|
|
159
183
|
guidance: true,
|
package/src/InfoTip/InfoTip.tsx
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* - /docs/specs/components/InfoTip/InfoTip.spec.md (contract)
|
|
16
16
|
* - /packages/core/src/InfoTip/InfoTip.test.tsx (tests for new/changed behavior)
|
|
17
17
|
* - /packages/core/src/InfoTip/index.ts (exports if types change)
|
|
18
|
+
* - /packages/cli/assets/templates/blocks/components/InfoTip/ (showcase and example blocks)
|
|
18
19
|
*/
|
|
19
20
|
|
|
20
21
|
import {
|
|
@@ -46,7 +47,8 @@ import {
|
|
|
46
47
|
} from '../theme/tokens.stylex';
|
|
47
48
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
48
49
|
import {mergeProps} from '../utils/mergeProps';
|
|
49
|
-
import {
|
|
50
|
+
import {useTouchHitArea} from '../utils/touchHitArea';
|
|
51
|
+
import {touchHitAreaStyles} from '../utils/touchHitArea.stylex';
|
|
50
52
|
|
|
51
53
|
registerEnglishFallback(english);
|
|
52
54
|
|
|
@@ -106,21 +108,6 @@ const styles = stylex.create({
|
|
|
106
108
|
transitionDuration: durationVars['--duration-fast'],
|
|
107
109
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
108
110
|
},
|
|
109
|
-
// The invisible hit area. Under a coarse pointer, the shared hit area writes
|
|
110
|
-
// how far the button may grow toward 44 px on each side. It never takes a
|
|
111
|
-
// neighbour's tap, and it writes 0 elsewhere. This layer takes taps out to
|
|
112
|
-
// there.
|
|
113
|
-
// SYNC: /packages/core/src/utils/hitArea.ts (HIT_INSET_PROPERTIES)
|
|
114
|
-
hitArea: {
|
|
115
|
-
'::after': {
|
|
116
|
-
content: '""',
|
|
117
|
-
position: 'absolute',
|
|
118
|
-
// Physical sides on purpose: the shared hit area measures each side
|
|
119
|
-
// from the page's rects, left and right included, in any direction.
|
|
120
|
-
inset:
|
|
121
|
-
'calc(var(--astryx-hit-inset-top, 0px) * -1) calc(var(--astryx-hit-inset-right, 0px) * -1) calc(var(--astryx-hit-inset-bottom, 0px) * -1) calc(var(--astryx-hit-inset-left, 0px) * -1)',
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
111
|
});
|
|
125
112
|
|
|
126
113
|
/**
|
|
@@ -150,15 +137,7 @@ export function InfoTip({
|
|
|
150
137
|
style,
|
|
151
138
|
}: InfoTipProps): ReactNode {
|
|
152
139
|
const t = useComponentTranslator();
|
|
153
|
-
|
|
154
|
-
// lives as long as the button is attached: the ref's cleanup stops it, and a
|
|
155
|
-
// replaced button starts its own.
|
|
156
|
-
const watchButtonHitArea = useCallback((button: HTMLButtonElement | null) => {
|
|
157
|
-
if (button == null) {
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
return watchHitArea(button, insets => writeHitInsets(button, insets));
|
|
161
|
-
}, []);
|
|
140
|
+
const hitAreaRef = useTouchHitArea(true);
|
|
162
141
|
// Whether a press pinned the help. A hover or focus preview is not pinned.
|
|
163
142
|
const [isPinned, setIsPinned] = useState(false);
|
|
164
143
|
// Whether the help shows, pinned or previewed: the button names it in
|
|
@@ -172,7 +151,7 @@ export function InfoTip({
|
|
|
172
151
|
setIsPinned(false);
|
|
173
152
|
}, []);
|
|
174
153
|
const tooltip = useTooltip({onShow: handleShow, onHide: handleHide});
|
|
175
|
-
const mergedRef = useMergedRefs(ref,
|
|
154
|
+
const mergedRef = useMergedRefs(ref, hitAreaRef, tooltip.ref);
|
|
176
155
|
|
|
177
156
|
// A primary mouse or pen press on a preview calls show() first. The hook's
|
|
178
157
|
// press-to-close then leaves it open. The click pins it.
|
|
@@ -226,7 +205,7 @@ export function InfoTip({
|
|
|
226
205
|
stylex.props(
|
|
227
206
|
focusOutlineStyles.focusVisible,
|
|
228
207
|
styles.trigger,
|
|
229
|
-
|
|
208
|
+
touchHitAreaStyles.layer,
|
|
230
209
|
xstyle,
|
|
231
210
|
),
|
|
232
211
|
className,
|
|
@@ -24,7 +24,7 @@ export const docs = {
|
|
|
24
24
|
],
|
|
25
25
|
},
|
|
26
26
|
description:
|
|
27
|
-
'Groups an input with prefix
|
|
27
|
+
'Groups an input with prefix and suffix addons in one connected row. A focused member stays above its neighbours, so its focus ring shows in full.',
|
|
28
28
|
props: [
|
|
29
29
|
{
|
|
30
30
|
name: 'children',
|
|
@@ -59,7 +59,7 @@ export const docs = {
|
|
|
59
59
|
{
|
|
60
60
|
name: 'isOptional',
|
|
61
61
|
type: 'boolean',
|
|
62
|
-
description: 'Show "
|
|
62
|
+
description: 'Show the "Optional" indicator after the label.',
|
|
63
63
|
default: 'false',
|
|
64
64
|
},
|
|
65
65
|
{
|
|
@@ -77,7 +77,8 @@ export const docs = {
|
|
|
77
77
|
{
|
|
78
78
|
name: 'status',
|
|
79
79
|
type: "{type: 'warning' | 'error' | 'success', message?: string}",
|
|
80
|
-
description:
|
|
80
|
+
description:
|
|
81
|
+
'Validation status. Its message shows below the group. The group border does not change; a theme can style the row from `data-status`.',
|
|
81
82
|
},
|
|
82
83
|
{
|
|
83
84
|
name: 'labelTooltip',
|