@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
|
@@ -53,7 +53,8 @@ export const docs = {
|
|
|
53
53
|
{
|
|
54
54
|
name: 'label',
|
|
55
55
|
type: 'string',
|
|
56
|
-
description:
|
|
56
|
+
description:
|
|
57
|
+
'Accessible label for the landmark element. While the region scrolls, it also names the scrolling region, which otherwise takes a translated "Content".',
|
|
57
58
|
},
|
|
58
59
|
{
|
|
59
60
|
name: 'role',
|
|
@@ -64,13 +65,13 @@ export const docs = {
|
|
|
64
65
|
name: 'width',
|
|
65
66
|
type: 'number | string',
|
|
66
67
|
description:
|
|
67
|
-
|
|
68
|
+
"Width of the panel. Numbers are treated as pixels, strings are used as-is. Ignored when resizable is provided; the hook controls width. Beside a ResizeHandle given a useResizable region's props, a panel at width={region.size} is inert while the region is collapsed, and focus inside it moves to the handle as it collapses.",
|
|
68
69
|
},
|
|
69
70
|
{
|
|
70
71
|
name: 'resizable',
|
|
71
|
-
type: 'ResizableProps',
|
|
72
|
+
type: 'ResizableRegion | ResizableProps',
|
|
72
73
|
description:
|
|
73
|
-
"
|
|
74
|
+
"The output of useResizable(), or its props. When provided, the hook drives the panel width and a ResizeHandle should be placed adjacent to the panel. Carries the region's axis ('horizontal' | 'vertical'), which must match the adjacent ResizeHandle's direction. Focus inside the panel moves to its ResizeHandle as it collapses, and the panel is inert while collapsed.",
|
|
74
75
|
},
|
|
75
76
|
],
|
|
76
77
|
};
|
|
@@ -106,7 +107,8 @@ export const docsZh = {
|
|
|
106
107
|
{
|
|
107
108
|
name: 'label',
|
|
108
109
|
type: 'string',
|
|
109
|
-
description:
|
|
110
|
+
description:
|
|
111
|
+
'地标元素的无障碍标签。区域滚动时,它也为滚动区域命名;未提供时使用已翻译的“Content”(内容)。',
|
|
110
112
|
},
|
|
111
113
|
{
|
|
112
114
|
name: 'role',
|
|
@@ -117,13 +119,13 @@ export const docsZh = {
|
|
|
117
119
|
name: 'width',
|
|
118
120
|
type: 'number | string',
|
|
119
121
|
description:
|
|
120
|
-
'面板宽度。数字按像素处理,字符串按原样使用。提供 resizable 时忽略,宽度由 hook
|
|
122
|
+
'面板宽度。数字按像素处理,字符串按原样使用。提供 resizable 时忽略,宽度由 hook 控制。放在接收 useResizable 区域 props 的 ResizeHandle 旁边、以 width={region.size} 渲染时,区域折叠期间面板为 inert,折叠时面板内的焦点移到手柄上。',
|
|
121
123
|
},
|
|
122
124
|
{
|
|
123
125
|
name: 'resizable',
|
|
124
|
-
type: 'ResizableProps',
|
|
126
|
+
type: 'ResizableRegion | ResizableProps',
|
|
125
127
|
description:
|
|
126
|
-
"
|
|
128
|
+
"useResizable() 的返回值或其 props。提供时面板宽度由 hook 驱动,应在面板旁放置 ResizeHandle。其中携带区域的轴向('horizontal' | 'vertical'),必须与相邻 ResizeHandle 的 direction 一致。折叠时面板内的焦点会移到其 ResizeHandle 上,折叠期间面板为 inert。",
|
|
127
129
|
},
|
|
128
130
|
],
|
|
129
131
|
};
|
|
@@ -139,11 +141,12 @@ export const docsDense = {
|
|
|
139
141
|
padding:
|
|
140
142
|
'Internal padding on spacing scale. Overrides layout container default.',
|
|
141
143
|
isScrollable: 'Enable scrollable overflow.',
|
|
142
|
-
label:
|
|
144
|
+
label:
|
|
145
|
+
'Accessible label for landmark element; also names the region while it scrolls (default "Content").',
|
|
143
146
|
role: 'ARIA landmark role.',
|
|
144
147
|
width:
|
|
145
|
-
'Panel width. Numbers = pixels, strings as-is. Ignored when resizable provided; hook controls width.',
|
|
148
|
+
'Panel width. Numbers = pixels, strings as-is. Ignored when resizable provided; hook controls width. width={region.size} beside a ResizeHandle given the region props: inert while collapsed; focus inside moves to the handle on collapse.',
|
|
146
149
|
resizable:
|
|
147
|
-
'
|
|
150
|
+
'useResizable() output or its props. Hook drives panel width; place ResizeHandle adjacent. Focus inside moves to the handle on collapse; inert while collapsed.',
|
|
148
151
|
},
|
|
149
152
|
};
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file LayoutPanel.tsx
|
|
7
|
-
* @input Uses React StyleX, LayoutAreaContext, LayoutSlotsContext
|
|
7
|
+
* @input Uses React StyleX, LayoutAreaContext, LayoutSlotsContext,
|
|
8
|
+
* useScrollRegionProps, resizablePane.ts
|
|
8
9
|
* @output Exports LayoutPanel component and LayoutPanelProps
|
|
9
10
|
* @position Sidebar panel for Layout start/end slots. Use for navigation panels,
|
|
10
11
|
* settings sidebars, detail panels, or any fixed-width side content.
|
|
@@ -17,14 +18,28 @@
|
|
|
17
18
|
|
|
18
19
|
import type {AriaRole, ReactNode} from 'react';
|
|
19
20
|
import type {BaseProps} from '../BaseProps';
|
|
20
|
-
import {use} from 'react';
|
|
21
|
+
import {use, useCallback, useRef, useState, useSyncExternalStore} from 'react';
|
|
21
22
|
import * as stylex from '@stylexjs/stylex';
|
|
22
23
|
import {colorVars, spacingVars} from '../theme/tokens.stylex';
|
|
23
24
|
import {LayoutAreaContext} from './LayoutAreaContext';
|
|
24
25
|
import {LayoutSlotsContext} from './LayoutSlotsContext';
|
|
26
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
27
|
+
import {useScrollRegionProps} from '../hooks/useScrollRegionProps';
|
|
25
28
|
import {mergeProps} from '../utils';
|
|
26
29
|
import type {SizeValue, SpacingStep} from '../utils/types';
|
|
27
|
-
import
|
|
30
|
+
import {
|
|
31
|
+
resizablePropsOf,
|
|
32
|
+
type ResizableProps,
|
|
33
|
+
type ResizableRegion,
|
|
34
|
+
} from '../Resizable/useResizable';
|
|
35
|
+
import {
|
|
36
|
+
createResizablePaneLink,
|
|
37
|
+
resizeHandleBeside,
|
|
38
|
+
} from '../Resizable/resizablePane';
|
|
39
|
+
import {LayoutChangeSnapshot} from '../motion/LayoutChangeSnapshot';
|
|
40
|
+
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
41
|
+
import {moveFocusLeftBehind, noteFocusWithin} from '../utils/focusReturn';
|
|
42
|
+
import {useFocusLeavingChange} from '../utils/useFocusLeavingChange';
|
|
28
43
|
import {themeProps} from '../utils/themeProps';
|
|
29
44
|
import {
|
|
30
45
|
paddingStyles,
|
|
@@ -77,6 +92,12 @@ const styles = stylex.create({
|
|
|
77
92
|
scrollable: {
|
|
78
93
|
overflow: 'auto',
|
|
79
94
|
},
|
|
95
|
+
// At width 0 the padding box is 0 too, so the clip hides every child.
|
|
96
|
+
zeroWidth: {
|
|
97
|
+
paddingInlineStart: 0,
|
|
98
|
+
paddingInlineEnd: 0,
|
|
99
|
+
overflow: 'clip',
|
|
100
|
+
},
|
|
80
101
|
// For start panel: divider on end edge
|
|
81
102
|
dividerEnd: {
|
|
82
103
|
borderInlineEndWidth: 1,
|
|
@@ -100,6 +121,8 @@ const styles = stylex.create({
|
|
|
100
121
|
},
|
|
101
122
|
});
|
|
102
123
|
|
|
124
|
+
const returnFalse = () => false;
|
|
125
|
+
|
|
103
126
|
// Dynamic styles for sizing props
|
|
104
127
|
const dynamicStyles = stylex.create({
|
|
105
128
|
sizing: (width: SizeValue | null) => ({
|
|
@@ -144,6 +167,8 @@ export interface LayoutPanelProps extends BaseProps<HTMLDivElement> {
|
|
|
144
167
|
/**
|
|
145
168
|
* Accessible label for the landmark.
|
|
146
169
|
* Required when role is set and multiple landmarks of the same type exist.
|
|
170
|
+
* While the panel scrolls, it also names the scrolling region, which
|
|
171
|
+
* otherwise takes a translated "Content".
|
|
147
172
|
*/
|
|
148
173
|
label?: string;
|
|
149
174
|
|
|
@@ -161,20 +186,20 @@ export interface LayoutPanelProps extends BaseProps<HTMLDivElement> {
|
|
|
161
186
|
width?: SizeValue;
|
|
162
187
|
|
|
163
188
|
/**
|
|
164
|
-
*
|
|
165
|
-
* is driven by the hook and a resize handle should be placed
|
|
166
|
-
* to this panel.
|
|
189
|
+
* The output of `useResizable()`, or its `props`. When provided, the panel
|
|
190
|
+
* width is driven by the hook and a resize handle should be placed
|
|
191
|
+
* adjacent to this panel.
|
|
167
192
|
*
|
|
168
193
|
* @example
|
|
169
194
|
* ```
|
|
170
|
-
* const
|
|
171
|
-
* <LayoutPanel resizable={
|
|
195
|
+
* const resizable = useResizable({ defaultSize: 250, minSize: 200 });
|
|
196
|
+
* <LayoutPanel resizable={resizable}>
|
|
172
197
|
* <Navigation />
|
|
173
198
|
* </LayoutPanel>
|
|
174
|
-
* <ResizeHandle resizable={
|
|
199
|
+
* <ResizeHandle resizable={resizable} />
|
|
175
200
|
* ```
|
|
176
201
|
*/
|
|
177
|
-
resizable?: ResizableProps;
|
|
202
|
+
resizable?: ResizableRegion | ResizableProps;
|
|
178
203
|
}
|
|
179
204
|
|
|
180
205
|
/**
|
|
@@ -213,28 +238,94 @@ export function LayoutPanel({
|
|
|
213
238
|
padding,
|
|
214
239
|
role,
|
|
215
240
|
width,
|
|
216
|
-
resizable,
|
|
241
|
+
resizable: resizableValue,
|
|
217
242
|
xstyle,
|
|
218
243
|
className,
|
|
219
244
|
style,
|
|
220
245
|
ref,
|
|
221
246
|
...props
|
|
222
247
|
}: LayoutPanelProps) {
|
|
248
|
+
const resizable =
|
|
249
|
+
resizableValue == null ? undefined : resizablePropsOf(resizableValue);
|
|
223
250
|
const area = use(LayoutAreaContext);
|
|
224
251
|
const {hasHeader, hasFooter} = use(LayoutSlotsContext);
|
|
225
252
|
|
|
226
253
|
// When resizable props are provided, use the hook-driven size
|
|
227
254
|
const effectiveWidth = resizable ? resizable._size : width;
|
|
228
255
|
|
|
256
|
+
// With no `resizable`, a ResizeHandle beside the panel that has a region's
|
|
257
|
+
// props finds the panel and holds it collapsed with the region. The panel
|
|
258
|
+
// lends its element in its callback ref for that.
|
|
259
|
+
const [paneLink] = useState(createResizablePaneLink);
|
|
260
|
+
const isHeldCollapsed = useSyncExternalStore(
|
|
261
|
+
paneLink.subscribe,
|
|
262
|
+
paneLink.isCollapsed,
|
|
263
|
+
returnFalse,
|
|
264
|
+
);
|
|
265
|
+
const isLentBeside = resizable == null;
|
|
266
|
+
const lendRef = useCallback(
|
|
267
|
+
(element: HTMLDivElement | null) => {
|
|
268
|
+
paneLink.attach(isLentBeside ? element : null);
|
|
269
|
+
},
|
|
270
|
+
[paneLink, isLentBeside],
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
// A collapsing panel moves focus inside it to its ResizeHandle, through the
|
|
274
|
+
// focus-leaving sequence that disclosures share. It goes inert and hidden
|
|
275
|
+
// from assistive technology a commit later, so inert never drops that focus
|
|
276
|
+
// to the page. Opening drops both at once. The ResizeHandle beside it holds
|
|
277
|
+
// the region's collapse state, or else the `resizable` props hold it.
|
|
278
|
+
const elementRef = useRef<HTMLDivElement>(null);
|
|
279
|
+
const isRegionCollapsed =
|
|
280
|
+
resizable == null ? isHeldCollapsed : resizable._isCollapsed;
|
|
281
|
+
const noteFocusBeforeCollapse = useFocusLeavingChange(
|
|
282
|
+
isRegionCollapsed,
|
|
283
|
+
(wasCollapsed: boolean) =>
|
|
284
|
+
wasCollapsed ? null : noteFocusWithin(elementRef.current),
|
|
285
|
+
(noted, isCollapsed) => {
|
|
286
|
+
const panel = elementRef.current;
|
|
287
|
+
if (isCollapsed && panel != null) {
|
|
288
|
+
moveFocusLeftBehind(
|
|
289
|
+
noted,
|
|
290
|
+
paneLink.focusTarget() ?? resizeHandleBeside(panel, area),
|
|
291
|
+
panel,
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
);
|
|
296
|
+
const [isSettledCollapsed, setIsSettledCollapsed] =
|
|
297
|
+
useState(isRegionCollapsed);
|
|
298
|
+
if (!isRegionCollapsed && isSettledCollapsed) {
|
|
299
|
+
setIsSettledCollapsed(false);
|
|
300
|
+
}
|
|
301
|
+
// Syncs `inert` with the browser's focus: the panel goes inert only after
|
|
302
|
+
// this commit's focus move.
|
|
303
|
+
useIsomorphicLayoutEffect(() => {
|
|
304
|
+
if (isRegionCollapsed && !isSettledCollapsed) {
|
|
305
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- the panel goes inert only after the focus-leaving move above ran in this commit; inert in the collapsing commit would drop that focus to the page first
|
|
306
|
+
setIsSettledCollapsed(true);
|
|
307
|
+
}
|
|
308
|
+
}, [isRegionCollapsed, isSettledCollapsed]);
|
|
309
|
+
const isConcealed = isRegionCollapsed && isSettledCollapsed;
|
|
310
|
+
|
|
229
311
|
// Determine panel position
|
|
230
312
|
const isStartPanel = area === 'start';
|
|
231
313
|
const isEndPanel = area === 'end';
|
|
232
314
|
|
|
233
315
|
const isZeroPadding = padding === 0;
|
|
316
|
+
// A collapsed region sizes its panel to 0.
|
|
317
|
+
const isZeroWidth = effectiveWidth === 0;
|
|
234
318
|
|
|
235
319
|
// When no divider, collapse spacing for seamless visual flow
|
|
236
320
|
const shouldCollapseSpacing =
|
|
237
|
-
!hasDivider && !isZeroPadding && padding == null;
|
|
321
|
+
!hasDivider && !isZeroPadding && padding == null && !isZeroWidth;
|
|
322
|
+
// At width 0 the panel clips its content, so it does not scroll.
|
|
323
|
+
const region = useScrollRegionProps({
|
|
324
|
+
isScrollable: isScrollable && !isZeroWidth,
|
|
325
|
+
role,
|
|
326
|
+
label,
|
|
327
|
+
});
|
|
328
|
+
const mergedRef = useMergedRefs(ref, region.ref, elementRef, lendRef);
|
|
238
329
|
|
|
239
330
|
// Select divider style based on position
|
|
240
331
|
const dividerStyle = isStartPanel
|
|
@@ -252,9 +343,9 @@ export function LayoutPanel({
|
|
|
252
343
|
|
|
253
344
|
return (
|
|
254
345
|
<div
|
|
255
|
-
ref={
|
|
256
|
-
role={role}
|
|
257
|
-
aria-label={label}
|
|
346
|
+
ref={mergedRef}
|
|
347
|
+
role={region.role}
|
|
348
|
+
aria-label={region['aria-label']}
|
|
258
349
|
{...mergeProps(
|
|
259
350
|
themeProps('layout-panel'),
|
|
260
351
|
stylex.props(
|
|
@@ -276,12 +367,18 @@ export function LayoutPanel({
|
|
|
276
367
|
padding != null && containerPaddingBlockEndVarStyles[padding],
|
|
277
368
|
hasDivider && dividerStyle,
|
|
278
369
|
shouldCollapseSpacing && collapseStyle,
|
|
370
|
+
isZeroWidth && styles.zeroWidth,
|
|
279
371
|
xstyle,
|
|
280
372
|
),
|
|
281
373
|
className,
|
|
282
374
|
style,
|
|
283
375
|
)}
|
|
284
|
-
{...props}
|
|
376
|
+
{...props}
|
|
377
|
+
{...(isConcealed ? {inert: true, 'aria-hidden': true} : {})}>
|
|
378
|
+
<LayoutChangeSnapshot
|
|
379
|
+
value={isRegionCollapsed}
|
|
380
|
+
onBeforeChange={noteFocusBeforeCollapse}
|
|
381
|
+
/>
|
|
285
382
|
{children}
|
|
286
383
|
</div>
|
|
287
384
|
);
|
|
@@ -46,6 +46,7 @@ import {ModalAnnounceProvider} from '../hooks/ModalAnnounceProvider';
|
|
|
46
46
|
import {overlayPaddingReset} from '../Layout/overlayPaddingReset.stylex';
|
|
47
47
|
import {LayerDepthProvider} from '../Layer/LayerDepthContext';
|
|
48
48
|
import {useLayerDismissal} from '../Layer/useLayerDismissal';
|
|
49
|
+
import {useFocusRegionContainment} from '../hooks/useFocusTrap';
|
|
49
50
|
|
|
50
51
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
51
52
|
import {isRtlElement} from '../hooks/isRtlElement';
|
|
@@ -341,6 +342,9 @@ export function Lightbox({
|
|
|
341
342
|
const t = useComponentTranslator();
|
|
342
343
|
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
343
344
|
const mergedDialogRef = useMergedRefs(ref, dialogRef);
|
|
345
|
+
// Native showModal() lets Tab leave for the browser's own UI, so the shared
|
|
346
|
+
// module wraps it.
|
|
347
|
+
useFocusRegionContainment(dialogRef, isOpen);
|
|
344
348
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
345
349
|
const imageWrapperRef = useRef<HTMLDivElement>(null);
|
|
346
350
|
const triggerElementRef = useRef<Element | null>(null);
|
package/src/List/List.doc.mjs
CHANGED
|
@@ -13,6 +13,15 @@ export const docs = {
|
|
|
13
13
|
{className: 'astryx-list', visualProps: ['density', 'listStyle']},
|
|
14
14
|
{className: 'astryx-list-item'},
|
|
15
15
|
],
|
|
16
|
+
vars: [
|
|
17
|
+
{
|
|
18
|
+
name: '--_hit-border-bottom',
|
|
19
|
+
description:
|
|
20
|
+
"Width of the divider below a divided row, 0 on the last row. The row's touch hit layer adds it to its offset, so its band starts past the divider. ListItem sets it on the row's own ::after from --border-width under hasDividers, so content inside the row never inherits it, and a theme changes the divider through that token.",
|
|
21
|
+
default: '0px',
|
|
22
|
+
private: true,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
16
25
|
},
|
|
17
26
|
description: 'List container with density, dividers, and header support.',
|
|
18
27
|
props: [
|
|
@@ -32,7 +41,7 @@ export const docs = {
|
|
|
32
41
|
{
|
|
33
42
|
name: 'density',
|
|
34
43
|
type: "'compact' | 'balanced' | 'spacious'",
|
|
35
|
-
description:
|
|
44
|
+
description: "Spacing density for items. Under a finger, an interactive row's hit target reaches 44px where its neighbors leave room, with no change to how rows look or lay out.",
|
|
36
45
|
default: "'balanced'",
|
|
37
46
|
},
|
|
38
47
|
{
|
package/src/List/List.tsx
CHANGED
|
@@ -148,6 +148,11 @@ const styles = stylex.create({
|
|
|
148
148
|
// `hidden`: hidden makes a scroll container, which fights the list's
|
|
149
149
|
// vertical scroller. (StyleX emits the physical longhand of this axis.)
|
|
150
150
|
overflowInline: 'clip',
|
|
151
|
+
// Under a finger, the isolation boundary for what rises inside the list.
|
|
152
|
+
// A row's touch band and a swipeable row order above the rows after them.
|
|
153
|
+
// They stay below a page-level sticky header at the same z-index. With a
|
|
154
|
+
// mouse nothing rises, so the list keeps its stacking.
|
|
155
|
+
isolation: {default: null, '@media (pointer: coarse)': 'isolate'},
|
|
151
156
|
},
|
|
152
157
|
// Subgridded numbered rows contribute their marker's intrinsic width to
|
|
153
158
|
// one column, so text and nested lists never move with an individual number.
|
package/src/List/ListItem.tsx
CHANGED
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file ListItem.tsx
|
|
7
|
-
* @input Uses React, ReactNode, StyleXStyles, theme tokens
|
|
8
|
-
* treatment
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* @input Uses React, ReactNode, StyleXStyles, theme tokens and the List row
|
|
8
|
+
* edge treatment. It also uses the touch hit area (utils/touchHitArea.ts and
|
|
9
|
+
* its layer) and CheckboxInput. It reads the marker or task checkbox a
|
|
10
|
+
* ListMarkerScope sets, for Markdown's nested lists and the task items of mixed
|
|
11
|
+
* lists. It also reads Item's private exact-marker formatting scope for numbered
|
|
11
12
|
* rows. Number markers stay on one line in the List's shared column,
|
|
12
13
|
* keeping every sibling's text and nested list on the same start line;
|
|
13
14
|
* they end on one line too, right-aligned with tabular figures, and hang
|
|
@@ -41,10 +42,14 @@ import type {BaseProps} from '../BaseProps';
|
|
|
41
42
|
import {ListContext, type ListMarker} from './ListContext';
|
|
42
43
|
import {CheckboxInput} from '../CheckboxInput/CheckboxInput';
|
|
43
44
|
import {mergeProps} from '../utils/mergeProps';
|
|
44
|
-
import {Item} from '../Item/Item';
|
|
45
|
+
import {Item, servesSwipeActions} from '../Item/Item';
|
|
46
|
+
import {ItemListRowContext} from '../Item/ItemListRowContext';
|
|
45
47
|
import {ItemMarkerColumnsContext} from '../Item/ItemMarkerColumnsContext';
|
|
46
48
|
import type {ItemAlign, ItemSwipeActions, ItemSwipeBehavior} from '../Item';
|
|
47
49
|
import {themeProps} from '../utils/themeProps';
|
|
50
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
51
|
+
import {useTouchHitArea} from '../utils/touchHitArea';
|
|
52
|
+
import {touchHitAreaStyles} from '../utils/touchHitArea.stylex';
|
|
48
53
|
|
|
49
54
|
// =============================================================================
|
|
50
55
|
// Types
|
|
@@ -198,6 +203,21 @@ const styles = stylex.create({
|
|
|
198
203
|
'max(var(--container-padding-inline-end, 0px), var(--_item-inset-inline))',
|
|
199
204
|
borderRadius: 0,
|
|
200
205
|
},
|
|
206
|
+
// Under a finger, the row's touch band rises above the rows after it. A
|
|
207
|
+
// later row is positioned with no z-index, so it would paint and hit-test
|
|
208
|
+
// over the band. Only inside a List (isInList).
|
|
209
|
+
bandRaised: {
|
|
210
|
+
'::after': {
|
|
211
|
+
zIndex: {default: null, '@media (pointer: coarse)': 1},
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
// A swipeable row is a stacking context at rest, since Item translates its
|
|
215
|
+
// swipe root. So its band's own z-index orders only inside it. Under a
|
|
216
|
+
// finger the row itself rises above the rows after it, whose boxes its band
|
|
217
|
+
// reaches into. The list isolates, so the row stays below a sticky header.
|
|
218
|
+
swipeRaised: {
|
|
219
|
+
zIndex: {default: null, '@media (pointer: coarse)': 1},
|
|
220
|
+
},
|
|
201
221
|
withDivider: {
|
|
202
222
|
borderBlockEndWidth: borderVars['--border-width'],
|
|
203
223
|
borderBlockEndStyle: 'solid',
|
|
@@ -209,6 +229,15 @@ const styles = stylex.create({
|
|
|
209
229
|
':last-child': {
|
|
210
230
|
borderBlockEndWidth: 0,
|
|
211
231
|
},
|
|
232
|
+
// The touch hit layer's band starts past the divider, the edge of the box
|
|
233
|
+
// its insets are measured from (utils/touchHitArea.stylex.ts). The width
|
|
234
|
+
// sits on the layer itself, so content inside the row never inherits it.
|
|
235
|
+
'::after': {
|
|
236
|
+
'--_hit-border-bottom': {
|
|
237
|
+
default: borderVars['--border-width'],
|
|
238
|
+
':last-child': '0px',
|
|
239
|
+
},
|
|
240
|
+
},
|
|
212
241
|
},
|
|
213
242
|
});
|
|
214
243
|
|
|
@@ -378,6 +407,28 @@ export function ListItem({
|
|
|
378
407
|
...restProps
|
|
379
408
|
}: ListItemProps) {
|
|
380
409
|
const ctx = use(ListContext);
|
|
410
|
+
// A List isolates its rows, so what a row raises stays below a page-level
|
|
411
|
+
// sticky header. Outside a List nothing bounds a raise, so a row raises
|
|
412
|
+
// nothing there.
|
|
413
|
+
const isInList = ctx != null;
|
|
414
|
+
// Under a finger, the row's hit target grows where its neighbors leave room.
|
|
415
|
+
const isTouchTarget =
|
|
416
|
+
(onClick != null || href != null || interactiveRef != null) && !isDisabled;
|
|
417
|
+
const hitAreaRef = useTouchHitArea(isTouchTarget);
|
|
418
|
+
const mergedRef = useMergedRefs(ref, hitAreaRef);
|
|
419
|
+
// A row that Item serves swipe actions on is a stacking context at rest. So
|
|
420
|
+
// its band's own z-index orders only inside it, and under a finger the row
|
|
421
|
+
// raises itself. Its root is its `<li>`, never a link.
|
|
422
|
+
const isRaisedSwipeRow =
|
|
423
|
+
isInList &&
|
|
424
|
+
isTouchTarget &&
|
|
425
|
+
servesSwipeActions({
|
|
426
|
+
swipeActions: restProps.swipeActions,
|
|
427
|
+
isDisabled,
|
|
428
|
+
isDelegate: interactiveRef != null,
|
|
429
|
+
isLinkRoot: false,
|
|
430
|
+
role: restProps.role,
|
|
431
|
+
});
|
|
381
432
|
const density = ctx?.density ?? 'balanced';
|
|
382
433
|
const hasDividers = ctx?.hasDividers ?? false;
|
|
383
434
|
const edge = ctx?.edge ?? 'padded';
|
|
@@ -432,7 +483,7 @@ export function ListItem({
|
|
|
432
483
|
const item = (
|
|
433
484
|
<Item
|
|
434
485
|
as="li"
|
|
435
|
-
ref={
|
|
486
|
+
ref={mergedRef}
|
|
436
487
|
marker={marker}
|
|
437
488
|
startContent={startContent}
|
|
438
489
|
label={label}
|
|
@@ -453,6 +504,9 @@ export function ListItem({
|
|
|
453
504
|
hasMarkers && styles.withCounter,
|
|
454
505
|
hasDividers && styles.withDivider,
|
|
455
506
|
hasDividers && embeddedStyles.noRadius,
|
|
507
|
+
isTouchTarget && touchHitAreaStyles.layer,
|
|
508
|
+
isTouchTarget && isInList && styles.bandRaised,
|
|
509
|
+
isRaisedSwipeRow && styles.swipeRaised,
|
|
456
510
|
edge === 'flush' && styles.edgeFlush,
|
|
457
511
|
edge === 'outset' && styles.edgeOutset,
|
|
458
512
|
edge === 'bleed' && styles.edgeBleed,
|
|
@@ -463,12 +517,13 @@ export function ListItem({
|
|
|
463
517
|
{...restProps}
|
|
464
518
|
/>
|
|
465
519
|
);
|
|
520
|
+
const row = <ItemListRowContext value>{item}</ItemListRowContext>;
|
|
466
521
|
// Only numbered rows contribute two cells to List's shared counter grid.
|
|
467
522
|
// Passing the marker identity keeps this request off unrelated Items in slots.
|
|
468
523
|
return listStyle === 'decimal' ? (
|
|
469
|
-
<ItemMarkerColumnsContext value={marker}>{
|
|
524
|
+
<ItemMarkerColumnsContext value={marker}>{row}</ItemMarkerColumnsContext>
|
|
470
525
|
) : (
|
|
471
|
-
|
|
526
|
+
row
|
|
472
527
|
);
|
|
473
528
|
}
|
|
474
529
|
|
package/src/Markdown/parser.ts
CHANGED
|
@@ -2748,11 +2748,12 @@ const URL_LITERAL_RE = new RegExp(
|
|
|
2748
2748
|
/** Bare www. URL. Resulting href gets `http://` prepended. */
|
|
2749
2749
|
const WWW_LITERAL_RE = new RegExp(`www\\.${ANY_NON_WHITESPACE_OR_ANGLE}`, 'g');
|
|
2750
2750
|
|
|
2751
|
-
/**
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
2751
|
+
/**
|
|
2752
|
+
* The domain of a bare email, with at least one dot. The scan matches it after
|
|
2753
|
+
* each `@`. A pattern that starts at every character rereads a long run each
|
|
2754
|
+
* time, so its cost grows with the square of the run.
|
|
2755
|
+
*/
|
|
2756
|
+
const EMAIL_DOMAIN_RE = new RegExp(DOMAIN_WITH_DOT, 'y');
|
|
2756
2757
|
|
|
2757
2758
|
/** Angle-bracket autolink: `<scheme:url>` (CommonMark §6.5). */
|
|
2758
2759
|
const ANGLE_URL_RE = new RegExp(`<(${ANGLE_SCHEME}:${ANGLE_URL_BODY})>`, 'g');
|
|
@@ -2771,6 +2772,11 @@ const EMAIL_LOCAL_CHARS = new Set(
|
|
|
2771
2772
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._%+-@',
|
|
2772
2773
|
);
|
|
2773
2774
|
|
|
2775
|
+
/** The characters `EMAIL_LOCAL_PART` allows. */
|
|
2776
|
+
const EMAIL_LOCAL_PART_CHARS = new Set(
|
|
2777
|
+
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._%+-',
|
|
2778
|
+
);
|
|
2779
|
+
|
|
2774
2780
|
interface AutolinkMatch {
|
|
2775
2781
|
start: number;
|
|
2776
2782
|
end: number;
|
|
@@ -2786,35 +2792,30 @@ interface AutolinkMatch {
|
|
|
2786
2792
|
* `https://example.com/Foo_(bar)` keeps the inner pair).
|
|
2787
2793
|
*/
|
|
2788
2794
|
function peelTrailingPunctAndParens(url: string): string {
|
|
2789
|
-
|
|
2790
|
-
|
|
2791
|
-
|
|
2792
|
-
|
|
2793
|
-
|
|
2794
|
-
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
|
|
2804
|
-
|
|
2805
|
-
|
|
2806
|
-
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
|
|
2810
|
-
if (close > open) {
|
|
2811
|
-
s = s.slice(0, -1);
|
|
2812
|
-
continue;
|
|
2813
|
-
}
|
|
2795
|
+
// Each peeled `)` lowers the close count instead of a recount, so a long
|
|
2796
|
+
// run of `)` costs one pass.
|
|
2797
|
+
let open = 0;
|
|
2798
|
+
let close = 0;
|
|
2799
|
+
for (let idx = 0; idx < url.length; idx++) {
|
|
2800
|
+
if (url[idx] === '(') {
|
|
2801
|
+
open++;
|
|
2802
|
+
} else if (url[idx] === ')') {
|
|
2803
|
+
close++;
|
|
2804
|
+
}
|
|
2805
|
+
}
|
|
2806
|
+
let end = url.length;
|
|
2807
|
+
while (end > 0) {
|
|
2808
|
+
const ch = url[end - 1];
|
|
2809
|
+
if (TRAILING_PUNCT_CHARS.has(ch)) {
|
|
2810
|
+
end--;
|
|
2811
|
+
} else if (ch === ')' && close > open) {
|
|
2812
|
+
close--;
|
|
2813
|
+
end--;
|
|
2814
|
+
} else {
|
|
2815
|
+
break;
|
|
2814
2816
|
}
|
|
2815
|
-
break;
|
|
2816
2817
|
}
|
|
2817
|
-
return
|
|
2818
|
+
return url.slice(0, end);
|
|
2818
2819
|
}
|
|
2819
2820
|
|
|
2820
2821
|
/** Characters that, when preceding a URL, indicate it's part of a larger token. */
|
|
@@ -2922,26 +2923,48 @@ function scanAutolinksInText(text: string): AutolinkMatch[] {
|
|
|
2922
2923
|
}
|
|
2923
2924
|
}
|
|
2924
2925
|
|
|
2925
|
-
// bare email
|
|
2926
|
+
// bare email: local-part@domain, found from each `@`
|
|
2926
2927
|
{
|
|
2927
|
-
|
|
2928
|
-
let
|
|
2929
|
-
|
|
2930
|
-
|
|
2928
|
+
// A match, accepted or not, ends where the next one may start.
|
|
2929
|
+
let consumedTo = 0;
|
|
2930
|
+
for (
|
|
2931
|
+
let at = text.indexOf('@');
|
|
2932
|
+
at !== -1;
|
|
2933
|
+
at = text.indexOf('@', at + 1)
|
|
2934
|
+
) {
|
|
2935
|
+
let start = at;
|
|
2936
|
+
while (
|
|
2937
|
+
start > consumedTo &&
|
|
2938
|
+
EMAIL_LOCAL_PART_CHARS.has(text[start - 1])
|
|
2939
|
+
) {
|
|
2940
|
+
start--;
|
|
2941
|
+
}
|
|
2942
|
+
if (start === at) {
|
|
2943
|
+
continue;
|
|
2944
|
+
}
|
|
2945
|
+
EMAIL_DOMAIN_RE.lastIndex = at + 1;
|
|
2946
|
+
const domain = EMAIL_DOMAIN_RE.exec(text);
|
|
2947
|
+
if (domain === null) {
|
|
2948
|
+
continue;
|
|
2949
|
+
}
|
|
2950
|
+
const end = at + 1 + domain[0].length;
|
|
2951
|
+
consumedTo = end;
|
|
2952
|
+
const prev = text[start - 1];
|
|
2931
2953
|
// Reject if previous char could be part of the local part or sits in
|
|
2932
2954
|
// a position that would make this match continuation of something
|
|
2933
2955
|
// bigger (`name@x.y@host`, `foo+bar@x`, `mailto:user@host`).
|
|
2934
2956
|
if (prev != null && EMAIL_LOCAL_CHARS.has(prev)) {
|
|
2935
2957
|
continue;
|
|
2936
2958
|
}
|
|
2937
|
-
if (text.slice(Math.max(0,
|
|
2959
|
+
if (text.slice(Math.max(0, start - 7), start) === 'mailto:') {
|
|
2938
2960
|
continue;
|
|
2939
2961
|
}
|
|
2962
|
+
const email = text.slice(start, end);
|
|
2940
2963
|
matches.push({
|
|
2941
|
-
start
|
|
2942
|
-
end
|
|
2943
|
-
href: `mailto:${
|
|
2944
|
-
display:
|
|
2964
|
+
start,
|
|
2965
|
+
end,
|
|
2966
|
+
href: `mailto:${email}`,
|
|
2967
|
+
display: email,
|
|
2945
2968
|
});
|
|
2946
2969
|
}
|
|
2947
2970
|
}
|
|
@@ -158,7 +158,7 @@ const styles = stylex.create({
|
|
|
158
158
|
default: 'pointer',
|
|
159
159
|
':is(:disabled,[aria-disabled="true"])': 'default',
|
|
160
160
|
},
|
|
161
|
-
color: colorVars['--color-accent'],
|
|
161
|
+
color: colorVars['--color-text-accent'],
|
|
162
162
|
fontSize: typeScaleVars['--text-body-size'],
|
|
163
163
|
lineHeight: typeScaleVars['--text-body-leading'],
|
|
164
164
|
fontWeight: fontWeightVars['--font-weight-medium'],
|