@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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file tooltipEntries.ts
|
|
5
|
-
* @input A Date
|
|
5
|
+
* @input A Date, the consumer's tooltip entry list, a locale and a calendar
|
|
6
6
|
* @output Pure formatting of one tooltip line per entry, plus the entry types
|
|
7
7
|
* @position Leaf module; owns which zone each tooltip line names and whether
|
|
8
8
|
* it needs a zone abbreviation, then defers to formatInstant to render it
|
|
@@ -25,6 +25,7 @@ import {devWarn} from '../utils/devWarning';
|
|
|
25
25
|
import {formatInstant} from './formatInstant';
|
|
26
26
|
import type {InstantFormat} from './formatInstant';
|
|
27
27
|
import type {Locale} from '../i18n/types';
|
|
28
|
+
import type {CalendarSystem} from '../utils/calendarSystem';
|
|
28
29
|
|
|
29
30
|
// =============================================================================
|
|
30
31
|
// Types
|
|
@@ -197,15 +198,17 @@ function shouldShowZoneName(
|
|
|
197
198
|
}
|
|
198
199
|
|
|
199
200
|
/**
|
|
200
|
-
* Renders one tooltip line per entry, in the order given
|
|
201
|
+
* Renders one tooltip line per entry, in the order given, with dates in
|
|
202
|
+
* `calendar`.
|
|
201
203
|
*
|
|
202
204
|
* Pure: the same `date` and `entries` always produce the same lines for a given
|
|
203
|
-
* host zone and
|
|
205
|
+
* host zone, locale, and calendar.
|
|
204
206
|
*/
|
|
205
207
|
export function formatTooltipLines(
|
|
206
208
|
date: Date,
|
|
207
209
|
entries: ReadonlyArray<TimestampTooltipEntry>,
|
|
208
210
|
locale: Locale,
|
|
211
|
+
calendar: CalendarSystem = 'gregory',
|
|
209
212
|
): ReadonlyArray<TimestampTooltipLine> {
|
|
210
213
|
const resolved = entries.map(entry => resolveTimezoneID(entry.timezoneID));
|
|
211
214
|
const hasMultipleZones = new Set(resolved.map(zoneKey)).size > 1;
|
|
@@ -219,6 +222,7 @@ export function formatTooltipLines(
|
|
|
219
222
|
isCopyable: entry.isCopyable ?? false,
|
|
220
223
|
value: formatInstant(date, format, locale, {
|
|
221
224
|
timeZone,
|
|
225
|
+
calendar,
|
|
222
226
|
isTimezoneShown: shouldShowZoneName(
|
|
223
227
|
format,
|
|
224
228
|
hasMultipleZones,
|
package/src/Token/Token.tsx
CHANGED
|
@@ -39,6 +39,7 @@ import {themeProps} from '../utils/themeProps';
|
|
|
39
39
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
40
40
|
import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
|
|
41
41
|
import {usePressFeedback} from '../hooks/usePressFeedback';
|
|
42
|
+
import {cancelNestedTouchPress} from '../hooks/useClickableContainer';
|
|
42
43
|
import type {TokenColorMap} from './index';
|
|
43
44
|
import {disabledInteractionProps} from '../utils/disabledInteraction';
|
|
44
45
|
import {TokenNamingContext} from './TokenNamingContext';
|
|
@@ -510,6 +511,19 @@ export function Token({
|
|
|
510
511
|
}
|
|
511
512
|
effectiveOnClick(e);
|
|
512
513
|
};
|
|
514
|
+
// A finger press on Remove or a control in end content does not run the
|
|
515
|
+
// token's action, so the token shows no press for it. The inner button,
|
|
516
|
+
// the first button child, is the token's own action.
|
|
517
|
+
const handleContainerPointerDown = (
|
|
518
|
+
e: React.PointerEvent<HTMLSpanElement>,
|
|
519
|
+
) => {
|
|
520
|
+
rest.onPointerDown?.(e);
|
|
521
|
+
cancelNestedTouchPress(
|
|
522
|
+
e,
|
|
523
|
+
e.currentTarget,
|
|
524
|
+
e.currentTarget.querySelector(':scope > button'),
|
|
525
|
+
);
|
|
526
|
+
};
|
|
513
527
|
|
|
514
528
|
return (
|
|
515
529
|
<span
|
|
@@ -535,7 +549,10 @@ export function Token({
|
|
|
535
549
|
style,
|
|
536
550
|
)}
|
|
537
551
|
{...rest}
|
|
538
|
-
{...sharedProps}
|
|
552
|
+
{...sharedProps}
|
|
553
|
+
onPointerDown={
|
|
554
|
+
isDisabled ? rest.onPointerDown : handleContainerPointerDown
|
|
555
|
+
}>
|
|
539
556
|
{icon}
|
|
540
557
|
<button
|
|
541
558
|
type="button"
|
package/src/Token/TokenLink.tsx
CHANGED
|
@@ -90,12 +90,13 @@ export function TokenLink({
|
|
|
90
90
|
removeButton,
|
|
91
91
|
onClick: onClickProp,
|
|
92
92
|
onMouseUp: onMouseUpProp,
|
|
93
|
+
onPointerDown: onPointerDownProp,
|
|
93
94
|
...containerProps
|
|
94
95
|
}: TokenLinkProps) {
|
|
95
96
|
const containerRef = useRef<HTMLElement | null>(null);
|
|
96
97
|
const linkRef = useRef<HTMLElement | null>(null);
|
|
97
98
|
|
|
98
|
-
const {onClick, onMouseUp} = useClickableContainer({
|
|
99
|
+
const {onClick, onMouseUp, onPointerDown} = useClickableContainer({
|
|
99
100
|
containerRef,
|
|
100
101
|
interactiveRef: linkRef,
|
|
101
102
|
href,
|
|
@@ -113,6 +114,11 @@ export function TokenLink({
|
|
|
113
114
|
isDisabled
|
|
114
115
|
? onMouseUpProp
|
|
115
116
|
: composeEventHandlers(onMouseUpProp, onMouseUp)
|
|
117
|
+
}
|
|
118
|
+
onPointerDown={
|
|
119
|
+
isDisabled
|
|
120
|
+
? onPointerDownProp
|
|
121
|
+
: composeEventHandlers(onPointerDownProp, onPointerDown)
|
|
116
122
|
}>
|
|
117
123
|
{icon}
|
|
118
124
|
{isDisabled ? (
|
|
@@ -296,7 +296,7 @@ export const docs = {
|
|
|
296
296
|
name: 'presentation',
|
|
297
297
|
type: "'popover' | 'bottom-sheet' | 'adaptive'",
|
|
298
298
|
description:
|
|
299
|
-
'How the field presents its choices. adaptive (the default) uses the bottom sheet on compact touch screens and the popover otherwise, resolved the same way Selector resolves it; the server render and the hydrating render are the popover. popover is the inline combobox with its anchored suggestion menu on every device. bottom-sheet replaces it on every device with a
|
|
299
|
+
'How the field presents its choices. adaptive (the default) uses the bottom sheet on compact touch screens and the popover otherwise, resolved the same way Selector resolves it; the server render and the hydrating render are the popover. popover is the inline combobox with its anchored suggestion menu on every device. bottom-sheet replaces it on every device with a field showing the selected tokens, whose trigger opens one tall modal sheet: a search row on top, full-width checkbox rows that keep their place while the sheet is open, a Create row with hasCreate, and a footer pinned in every state with a confirmed Clear all and Save; the sheet edits a draft, so onChange fires once, when Save commits it, and a swipe, scrim or Escape close of a changed draft asks before discarding. In the sheet presentation the field box holds the trigger, the tokens and endContent, and keeps the box, theming target and focus ring of the inline field; the trigger is the control: ref, id, aria-* and data-* reach it, and ref receives the trigger button there, so type it Ref<HTMLInputElement | HTMLButtonElement>, which the component accepts (TokenizerProps keeps its released input ref type). endContent sits at the inline end of the field and renderToken renders its tokens, as in the inline field; their own controls act without opening the sheet. renderItem, hasClear (the sheet has its own Clear all), hasEntriesOnFocus, menuWidth, tokenOverflowBehavior (the field wraps its tokens) and hasAutoFocus have no surface in the sheet, and the field warns once in development when they are passed. Pass presentation="popover" to keep the inline field and those props on every device.',
|
|
300
300
|
default: "'adaptive'",
|
|
301
301
|
},
|
|
302
302
|
],
|
|
@@ -642,7 +642,7 @@ export const docsZh = {
|
|
|
642
642
|
name: 'presentation',
|
|
643
643
|
type: "'popover' | 'bottom-sheet' | 'adaptive'",
|
|
644
644
|
description:
|
|
645
|
-
'字段如何呈现选项。adaptive(默认)在紧凑触摸屏上使用底部面板,其他情况使用 popover,解析方式与 Selector 相同;服务端渲染和水合期间的渲染均为 popover。popover 在所有设备上为内联组合框及其锚定建议菜单。bottom-sheet
|
|
645
|
+
'字段如何呈现选项。adaptive(默认)在紧凑触摸屏上使用底部面板,其他情况使用 popover,解析方式与 Selector 相同;服务端渲染和水合期间的渲染均为 popover。popover 在所有设备上为内联组合框及其锚定建议菜单。bottom-sheet 在所有设备上改为一个显示已选标记的字段,点按其中的触发按钮后打开一个高的模态底部面板——顶部为搜索行,下方为整行复选框行(面板打开期间位置保持不变),hasCreate 时有「创建」行,底部固定显示需确认的「全部清除」和「保存」;面板编辑的是草稿,onChange 仅在「保存」提交时触发一次,草稿有改动时滑动、点击遮罩或按 Escape 关闭会先询问是否放弃。在底部面板呈现中,字段框包含触发按钮、标记和 endContent,并保留内联字段的外框、主题目标和焦点环;触发按钮即为控件:ref、id、aria-* 和 data-* 都作用于它,ref 在该呈现中收到的是触发按钮,因此请将其类型声明为组件所接受的 Ref<HTMLInputElement | HTMLButtonElement>(TokenizerProps 保留已发布的输入框 ref 类型)。endContent 位于字段的行内末端,renderToken 渲染字段中的标记,与内联字段相同;其中的控件可直接操作,不会打开底部面板。renderItem、hasClear(底部面板自带“全部清除”)、hasEntriesOnFocus、menuWidth、tokenOverflowBehavior(字段会换行显示标记)和 hasAutoFocus 在底部面板中没有作用对象,传入时开发模式下会警告一次。传入 presentation="popover" 可在所有设备上保留内联字段和这些属性。',
|
|
646
646
|
default: "'adaptive'",
|
|
647
647
|
},
|
|
648
648
|
],
|
|
@@ -845,6 +845,6 @@ export const docsDense = {
|
|
|
845
845
|
endContent: 'Content at input row end. For buttons, counts, controls.',
|
|
846
846
|
handleRef: 'Imperative handle for focus() and blur() control.',
|
|
847
847
|
presentation:
|
|
848
|
-
"'adaptive' (default: sheet on compact touch, else popover; SSR/hydration render popover) | 'popover' (inline combobox, every device) | 'bottom-sheet' (trigger + one searchable modal sheet of checkbox rows editing a draft that Save commits; onChange fires once, on Save). Sheet: ref reaches the trigger button; renderItem/
|
|
848
|
+
"'adaptive' (default: sheet on compact touch, else popover; SSR/hydration render popover) | 'popover' (inline combobox, every device) | 'bottom-sheet' (field box with trigger + one searchable modal sheet of checkbox rows editing a draft that Save commits; onChange fires once, on Save). Sheet: field box keeps the inline box, theming target and focus ring; ref reaches the trigger button; endContent (field end) and renderToken (field tokens) work as inline; renderItem/hasClear/hasEntriesOnFocus/menuWidth/tokenOverflowBehavior/hasAutoFocus inert (dev warning). presentation=\"popover\" keeps them on every device.",
|
|
849
849
|
},
|
|
850
850
|
};
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* useAdaptivePresentation, and TokenizerBottomSheet (lazy)
|
|
9
9
|
* @output Exports Tokenizer multi-select typeahead component
|
|
10
10
|
* @position Composed component; forwards DOM ref and exposes focus control via
|
|
11
|
-
* handleRef. The `presentation` prop swaps the inline combobox for a
|
|
12
|
-
* trigger
|
|
11
|
+
* handleRef. The `presentation` prop swaps the inline combobox for a field
|
|
12
|
+
* box whose trigger opens TokenizerBottomSheet.
|
|
13
13
|
*
|
|
14
14
|
* SYNC: When modified, update:
|
|
15
15
|
* - /packages/core/src/Tokenizer/index.ts
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
} from '../Field/fieldParts';
|
|
49
49
|
import {inputDisabledFocusStyles} from '../Field/inputDisabledFocus';
|
|
50
50
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
51
|
+
import {hasInteractiveAncestor} from '../hooks/useClickableContainer';
|
|
51
52
|
import {TokenizerClearAllMessageContext} from './TokenizerClearAllMessageContext';
|
|
52
53
|
import {TokenizerItemRemovableContext} from './TokenizerItemRemovableContext';
|
|
53
54
|
import {useBusyAnnouncement} from '../hooks/useBusyAnnouncement';
|
|
@@ -303,8 +304,8 @@ export interface TokenizerProps<T extends SearchableItem> extends Omit<
|
|
|
303
304
|
* How the field presents its choices.
|
|
304
305
|
* - `'popover'`: the inline combobox with its anchored suggestion menu, on
|
|
305
306
|
* every device.
|
|
306
|
-
* - `'bottom-sheet'`: a
|
|
307
|
-
* tall modal sheet: a search row on top, full-width checkbox rows that
|
|
307
|
+
* - `'bottom-sheet'`: a field showing the selected tokens, whose trigger
|
|
308
|
+
* opens one tall modal sheet: a search row on top, full-width checkbox rows that
|
|
308
309
|
* keep their place while the sheet is open, a create row with
|
|
309
310
|
* `hasCreate`, and a footer pinned in every state with a confirmed Clear
|
|
310
311
|
* all and Save. The sheet edits a draft: `onChange` fires once, when Save
|
|
@@ -315,12 +316,16 @@ export interface TokenizerProps<T extends SearchableItem> extends Omit<
|
|
|
315
316
|
* otherwise the popover — the same resolution Selector uses. The server
|
|
316
317
|
* render and the hydrating render are the popover.
|
|
317
318
|
*
|
|
318
|
-
* In the sheet presentation the
|
|
319
|
-
*
|
|
320
|
-
* `endContent
|
|
321
|
-
* `
|
|
322
|
-
*
|
|
323
|
-
*
|
|
319
|
+
* In the sheet presentation the field's box keeps the inline field's box,
|
|
320
|
+
* theming target and focus ring, and holds the trigger, the tokens and
|
|
321
|
+
* `endContent`. The trigger is the control: `ref`, `id`, `aria-*`, and
|
|
322
|
+
* `data-*` reach it. `endContent` renders at the field's
|
|
323
|
+
* inline end and `renderToken` renders the field's tokens, as in the inline
|
|
324
|
+
* field. `renderItem`, `hasClear` (the sheet has its own Clear all),
|
|
325
|
+
* `hasEntriesOnFocus`, `menuWidth`, `tokenOverflowBehavior` (the field
|
|
326
|
+
* wraps its tokens), and `hasAutoFocus` have no surface to act on and warn
|
|
327
|
+
* once in development. Pass `'popover'` to keep the inline field and those
|
|
328
|
+
* props on every device.
|
|
324
329
|
* @default 'adaptive'
|
|
325
330
|
*/
|
|
326
331
|
presentation?: TokenizerPresentation;
|
|
@@ -487,20 +492,52 @@ const styles = stylex.create({
|
|
|
487
492
|
color: colorVars['--color-text-secondary'],
|
|
488
493
|
paddingInline: spacingVars['--spacing-1'],
|
|
489
494
|
},
|
|
490
|
-
// The sheet presentation's
|
|
491
|
-
// button
|
|
492
|
-
//
|
|
493
|
-
|
|
495
|
+
// The sheet presentation's field: the inline field's own control box. A
|
|
496
|
+
// button cannot contain controls, so the trigger, the tokens and the end lane
|
|
497
|
+
// are siblings in this box. `endContent` and a custom token can then hold their
|
|
498
|
+
// own controls. There is no input to type into, so the cursor says "press".
|
|
499
|
+
sheetField: {
|
|
494
500
|
width: '100%',
|
|
501
|
+
cursor: {
|
|
502
|
+
default: 'pointer',
|
|
503
|
+
':is(:disabled,[aria-disabled="true"])': 'default',
|
|
504
|
+
},
|
|
505
|
+
},
|
|
506
|
+
// The box carries no aria-disabled: that would expose a caller's operable
|
|
507
|
+
// `endContent` as disabled. The trigger carries it, so the box keys its
|
|
508
|
+
// disabled cursor on the prop.
|
|
509
|
+
sheetFieldDisabled: {
|
|
510
|
+
cursor: 'default',
|
|
511
|
+
},
|
|
512
|
+
// With tokens, the button covers the box beneath them. A tap on a token or
|
|
513
|
+
// on empty space then opens the sheet. The box draws the focus ring, so the
|
|
514
|
+
// button draws none.
|
|
515
|
+
sheetTrigger: {
|
|
516
|
+
appearance: 'none',
|
|
517
|
+
flexGrow: 1,
|
|
518
|
+
alignSelf: 'stretch',
|
|
519
|
+
display: 'flex',
|
|
520
|
+
alignItems: 'center',
|
|
521
|
+
minWidth: 0,
|
|
522
|
+
padding: 0,
|
|
523
|
+
margin: 0,
|
|
524
|
+
borderWidth: 0,
|
|
525
|
+
borderStyle: 'none',
|
|
526
|
+
backgroundColor: 'transparent',
|
|
495
527
|
fontFamily: 'inherit',
|
|
496
528
|
fontSize: 'inherit',
|
|
529
|
+
lineHeight: 'inherit',
|
|
497
530
|
color: 'inherit',
|
|
498
531
|
textAlign: 'start',
|
|
499
|
-
appearance: 'none',
|
|
500
532
|
cursor: {
|
|
501
533
|
default: 'pointer',
|
|
502
534
|
':is(:disabled,[aria-disabled="true"])': 'default',
|
|
503
535
|
},
|
|
536
|
+
outline: 'none',
|
|
537
|
+
},
|
|
538
|
+
sheetTriggerWithTokens: {
|
|
539
|
+
position: 'absolute',
|
|
540
|
+
inset: 0,
|
|
504
541
|
},
|
|
505
542
|
// An aria-disabled button gets no system disabled paint in forced colors;
|
|
506
543
|
// GrayText is the platform's disabled affordance there. Defaults repeat the
|
|
@@ -906,8 +943,6 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
906
943
|
? (
|
|
907
944
|
[
|
|
908
945
|
['renderItem', renderItem],
|
|
909
|
-
['renderToken', renderToken],
|
|
910
|
-
['endContent', endContent],
|
|
911
946
|
['hasClear', hasClear || undefined],
|
|
912
947
|
['hasEntriesOnFocus', hasEntriesOnFocus || undefined],
|
|
913
948
|
['menuWidth', menuWidth],
|
|
@@ -989,12 +1024,32 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
989
1024
|
[tooltipAnchorRef],
|
|
990
1025
|
);
|
|
991
1026
|
|
|
1027
|
+
// A swap also removes `endContent` and a custom token's remove. If focus is
|
|
1028
|
+
// in the box when it detaches, the new control takes it. The box also anchors
|
|
1029
|
+
// the disabled-message tooltip.
|
|
1030
|
+
const sheetFieldCallbackRef = useCallback(
|
|
1031
|
+
(el: HTMLDivElement | null) => {
|
|
1032
|
+
tooltipAnchorRef(el);
|
|
1033
|
+
if (el == null) {
|
|
1034
|
+
return;
|
|
1035
|
+
}
|
|
1036
|
+
return () => {
|
|
1037
|
+
if (el.contains(el.ownerDocument.activeElement)) {
|
|
1038
|
+
isFocusPendingHandOffRef.current = true;
|
|
1039
|
+
}
|
|
1040
|
+
tooltipAnchorRef(null);
|
|
1041
|
+
};
|
|
1042
|
+
},
|
|
1043
|
+
[tooltipAnchorRef],
|
|
1044
|
+
);
|
|
1045
|
+
|
|
992
1046
|
// The sheet presentation has no input; the public ref reaches the trigger,
|
|
993
|
-
// the control it stands for (`family:input-fields` FR10).
|
|
1047
|
+
// the control it stands for (`family:input-fields` FR10). The
|
|
1048
|
+
// disabled-message tooltip anchors to the field box around it, as it
|
|
1049
|
+
// anchors to the inline field's wrapper.
|
|
994
1050
|
const triggerMergedRef = useMergedRefs<HTMLButtonElement>(
|
|
995
1051
|
triggerRef,
|
|
996
1052
|
ref as React.Ref<HTMLButtonElement> | undefined,
|
|
997
|
-
disabledMessageTooltip.ref,
|
|
998
1053
|
handOffFocusRef,
|
|
999
1054
|
);
|
|
1000
1055
|
|
|
@@ -1019,6 +1074,14 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1019
1074
|
// `endContent`, a clear button, or all three — so its width is measured
|
|
1020
1075
|
// rather than assumed, and the input reserves it.
|
|
1021
1076
|
const [laneRef, laneReserve] = useEndLaneReserve(END_LANE_INSET);
|
|
1077
|
+
// `laneRef` publishes the lane's width, so token rows and the placeholder
|
|
1078
|
+
// stop short of it. `sheetLaneRef` tells a tap in the lane from a tap on the
|
|
1079
|
+
// field.
|
|
1080
|
+
const sheetLaneRef = useRef<HTMLDivElement | null>(null);
|
|
1081
|
+
const sheetLaneMergedRef = useMergedRefs<HTMLDivElement>(
|
|
1082
|
+
laneRef,
|
|
1083
|
+
sheetLaneRef,
|
|
1084
|
+
);
|
|
1022
1085
|
// A composing component can lock tokens (PowerSearch's read-only filters
|
|
1023
1086
|
// and read-only field). No remove path removes a locked token.
|
|
1024
1087
|
const isItemRemovable = use(TokenizerItemRemovableContext);
|
|
@@ -1556,92 +1619,91 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1556
1619
|
</div>
|
|
1557
1620
|
);
|
|
1558
1621
|
|
|
1622
|
+
// A `renderToken` token's own remove control in the sheet field removes at
|
|
1623
|
+
// once, as it does in the inline field. Its control leaves with it, so
|
|
1624
|
+
// focus moves to the trigger.
|
|
1625
|
+
const handleSheetTokenRemove = (item: T) => {
|
|
1626
|
+
if (handleRemove(item)) {
|
|
1627
|
+
triggerRef.current?.focus();
|
|
1628
|
+
}
|
|
1629
|
+
};
|
|
1630
|
+
// A tap on a token, the placeholder or empty space opens the sheet, as a tap
|
|
1631
|
+
// on the trigger does. The trigger, `endContent` and a custom token's
|
|
1632
|
+
// controls handle their own clicks.
|
|
1633
|
+
const handleSheetFieldClick = (event: React.MouseEvent<HTMLDivElement>) => {
|
|
1634
|
+
const trigger = triggerRef.current;
|
|
1635
|
+
const target = event.target;
|
|
1636
|
+
if (trigger == null || !(target instanceof Element)) {
|
|
1637
|
+
return;
|
|
1638
|
+
}
|
|
1639
|
+
if (
|
|
1640
|
+
trigger.contains(target) ||
|
|
1641
|
+
sheetLaneRef.current?.contains(target) ||
|
|
1642
|
+
hasInteractiveAncestor(target, event.currentTarget)
|
|
1643
|
+
) {
|
|
1644
|
+
return;
|
|
1645
|
+
}
|
|
1646
|
+
trigger.click();
|
|
1647
|
+
};
|
|
1648
|
+
|
|
1649
|
+
// The caller's onFocus and onBlur report focus entering and leaving the whole
|
|
1650
|
+
// box, as for the inline wrapper. A move between the trigger, `endContent`
|
|
1651
|
+
// and a custom token's controls stays inside the field.
|
|
1652
|
+
const handleSheetFieldFocus = (event: React.FocusEvent<HTMLDivElement>) => {
|
|
1653
|
+
// BottomSheet focuses the trigger only after its exit completes; that
|
|
1654
|
+
// focus is the signal that the retained sheet can leave. If the
|
|
1655
|
+
// resolution moved to the popover meanwhile, the inline input takes the
|
|
1656
|
+
// focus over once it mounts.
|
|
1657
|
+
const isReturningFromSheet =
|
|
1658
|
+
(event.target as EventTarget) === triggerRef.current &&
|
|
1659
|
+
!isSheetOpen &&
|
|
1660
|
+
isSheetPresented;
|
|
1661
|
+
if (isReturningFromSheet) {
|
|
1662
|
+
setIsSheetPresented(false);
|
|
1663
|
+
}
|
|
1664
|
+
const relatedTarget = event.relatedTarget;
|
|
1665
|
+
if (
|
|
1666
|
+
relatedTarget instanceof Node &&
|
|
1667
|
+
event.currentTarget.contains(relatedTarget)
|
|
1668
|
+
) {
|
|
1669
|
+
return;
|
|
1670
|
+
}
|
|
1671
|
+
// Focus that returns from the field's own sheet, or that a presentation swap
|
|
1672
|
+
// hands over, does not enter from outside. The caller's onFocus stays quiet
|
|
1673
|
+
// for it (`family:input-fields` FR10).
|
|
1674
|
+
const isInsideTheField =
|
|
1675
|
+
(isReturningFromSheet && hasReportedFocusRef.current) ||
|
|
1676
|
+
isHandingOffFocusRef.current;
|
|
1677
|
+
if (!isInsideTheField) {
|
|
1678
|
+
hasReportedFocusRef.current = true;
|
|
1679
|
+
onFocus?.(event);
|
|
1680
|
+
}
|
|
1681
|
+
};
|
|
1682
|
+
const handleSheetFieldBlur = (event: React.FocusEvent<HTMLDivElement>) => {
|
|
1683
|
+
// Focus moving into the sheet, or to another control in the box, is
|
|
1684
|
+
// still the field's. Only a blur to somewhere else reports.
|
|
1685
|
+
const relatedTarget = event.relatedTarget;
|
|
1686
|
+
if (
|
|
1687
|
+
isSheetOpen ||
|
|
1688
|
+
(relatedTarget instanceof Node &&
|
|
1689
|
+
event.currentTarget.contains(relatedTarget))
|
|
1690
|
+
) {
|
|
1691
|
+
return;
|
|
1692
|
+
}
|
|
1693
|
+
hasReportedFocusRef.current = false;
|
|
1694
|
+
isFocusPendingHandOffRef.current = false;
|
|
1695
|
+
onBlur?.(event);
|
|
1696
|
+
};
|
|
1697
|
+
|
|
1559
1698
|
let tokenizerContent: ReactNode;
|
|
1560
1699
|
if (isSheetPresentation) {
|
|
1561
1700
|
tokenizerContent = (
|
|
1562
1701
|
<>
|
|
1563
|
-
<
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
{
|
|
1567
|
-
|
|
1568
|
-
type="button"
|
|
1569
|
-
id={inputId}
|
|
1570
|
-
aria-labelledby={fieldLabelledBy}
|
|
1571
|
-
aria-haspopup="dialog"
|
|
1572
|
-
aria-expanded={isSheetOpen}
|
|
1573
|
-
aria-disabled={isDisabled || undefined}
|
|
1574
|
-
// The description is what the inline input's is, in its order —
|
|
1575
|
-
// the caller's ids, the field description, the status message, the
|
|
1576
|
-
// disabled reason (`spec:AST-085` FR5: a disabled control exposes
|
|
1577
|
-
// its description and reason on itself) — then the hidden count and
|
|
1578
|
-
// the rendered tokens themselves, each by id: the
|
|
1579
|
-
// accessible-description algorithm reads the referenced elements in
|
|
1580
|
-
// order and separates them, so every label renders once
|
|
1581
|
-
// (`architecture:component-style-authoring` INV7) and no locale's
|
|
1582
|
-
// list punctuation is written here (AR6).
|
|
1583
|
-
aria-describedby={
|
|
1584
|
-
[
|
|
1585
|
-
ariaDescribedByProp,
|
|
1586
|
-
ariaDescribedBy,
|
|
1587
|
-
value.length > 0 ? triggerTokensId : null,
|
|
1588
|
-
...value.map(item => tokenElementId(item.id)),
|
|
1589
|
-
]
|
|
1590
|
-
.filter(Boolean)
|
|
1591
|
-
.join(' ') || undefined
|
|
1592
|
-
}
|
|
1593
|
-
// The open runs first and the caller's onClick after it, as the
|
|
1594
|
-
// inline input composes its click: a caller observes the click but
|
|
1595
|
-
// cannot cancel the field's own handling
|
|
1596
|
-
// (`family:input-fields` FR10).
|
|
1597
|
-
onClick={composeEventHandlers<React.MouseEvent<HTMLButtonElement>>(
|
|
1598
|
-
() => {
|
|
1599
|
-
if (isDisabled) {
|
|
1600
|
-
return;
|
|
1601
|
-
}
|
|
1602
|
-
setIsSheetPresented(true);
|
|
1603
|
-
setSheetInitialQuery(sheetQueryRef.current);
|
|
1604
|
-
setIsSheetOpen(true);
|
|
1605
|
-
},
|
|
1606
|
-
// Typed for the input by the base props; here the control is the
|
|
1607
|
-
// trigger button, and the handler only reads the event.
|
|
1608
|
-
callerOnClick as unknown as
|
|
1609
|
-
React.MouseEventHandler<HTMLButtonElement> | undefined,
|
|
1610
|
-
)}
|
|
1611
|
-
onFocus={event => {
|
|
1612
|
-
// BottomSheet focuses the trigger only after its exit completes;
|
|
1613
|
-
// that focus is the signal that the retained sheet can leave. If
|
|
1614
|
-
// the resolution moved to the popover meanwhile, the inline input
|
|
1615
|
-
// takes the focus over once it mounts. The field's own sheet is
|
|
1616
|
-
// part of the field: focus coming back from it, or handed over by
|
|
1617
|
-
// a presentation swap, is not focus entering from outside, so the
|
|
1618
|
-
// caller's onFocus — "when focus enters the tokenizer from
|
|
1619
|
-
// outside" — stays quiet for it (`family:input-fields` FR10).
|
|
1620
|
-
const isReturningFromSheet = !isSheetOpen && isSheetPresented;
|
|
1621
|
-
if (isReturningFromSheet) {
|
|
1622
|
-
setIsSheetPresented(false);
|
|
1623
|
-
}
|
|
1624
|
-
const isInsideTheField =
|
|
1625
|
-
(isReturningFromSheet && hasReportedFocusRef.current) ||
|
|
1626
|
-
isHandingOffFocusRef.current;
|
|
1627
|
-
if (!isInsideTheField) {
|
|
1628
|
-
hasReportedFocusRef.current = true;
|
|
1629
|
-
onFocus?.(event);
|
|
1630
|
-
}
|
|
1631
|
-
}}
|
|
1632
|
-
onBlur={event => {
|
|
1633
|
-
// Focus moving into the sheet is still the field's: the flag
|
|
1634
|
-
// stays, and the caller's onBlur — "when focus leaves the
|
|
1635
|
-
// tokenizer entirely" — stays quiet. Only a blur to somewhere
|
|
1636
|
-
// else reports.
|
|
1637
|
-
if (isSheetOpen) {
|
|
1638
|
-
return;
|
|
1639
|
-
}
|
|
1640
|
-
hasReportedFocusRef.current = false;
|
|
1641
|
-
isFocusPendingHandOffRef.current = false;
|
|
1642
|
-
onBlur?.(event);
|
|
1643
|
-
}}
|
|
1644
|
-
onKeyDown={onKeyDown}
|
|
1702
|
+
<div
|
|
1703
|
+
ref={sheetFieldCallbackRef}
|
|
1704
|
+
onClick={handleSheetFieldClick}
|
|
1705
|
+
onFocus={handleSheetFieldFocus}
|
|
1706
|
+
onBlur={handleSheetFieldBlur}
|
|
1645
1707
|
{...mergeProps(
|
|
1646
1708
|
themeProps('tokenizer', {
|
|
1647
1709
|
size,
|
|
@@ -1651,8 +1713,9 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1651
1713
|
stylex.props(
|
|
1652
1714
|
inputWrapperStyles.base,
|
|
1653
1715
|
styles.wrapper,
|
|
1654
|
-
styles.
|
|
1655
|
-
|
|
1716
|
+
styles.sheetField,
|
|
1717
|
+
isDisabled && styles.sheetFieldDisabled,
|
|
1718
|
+
// The field keeps the inline field's height for its size step,
|
|
1656
1719
|
// as Selector's bottom-sheet trigger does; the sheet's own rows
|
|
1657
1720
|
// and search field carry the touch-sized targets.
|
|
1658
1721
|
sizeStyles[size],
|
|
@@ -1675,8 +1738,77 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1675
1738
|
{renderIconSlot(startIcon, {size: 'sm', color: 'secondary'})}
|
|
1676
1739
|
</span>
|
|
1677
1740
|
)}
|
|
1678
|
-
|
|
1679
|
-
|
|
1741
|
+
<button
|
|
1742
|
+
// The field-level pass-through props (`data-*`, `aria-*`) were typed
|
|
1743
|
+
// for the inline input; here the control is a button.
|
|
1744
|
+
{...(restWithoutClick as React.ButtonHTMLAttributes<HTMLButtonElement>)}
|
|
1745
|
+
ref={triggerMergedRef}
|
|
1746
|
+
type="button"
|
|
1747
|
+
id={inputId}
|
|
1748
|
+
aria-labelledby={fieldLabelledBy}
|
|
1749
|
+
aria-haspopup="dialog"
|
|
1750
|
+
aria-expanded={isSheetOpen}
|
|
1751
|
+
aria-disabled={isDisabled || undefined}
|
|
1752
|
+
// The description follows the inline input's order: the caller's
|
|
1753
|
+
// ids, the field description, the status message, then the
|
|
1754
|
+
// disabled reason (`spec:AST-085` FR5). The hidden count and the
|
|
1755
|
+
// token labels follow, each by id. The algorithm separates
|
|
1756
|
+
// referenced elements, so no list punctuation is written here
|
|
1757
|
+
// (AR6). A default token is display-only and is its own label. A
|
|
1758
|
+
// custom token can hold controls, so a hidden copy of its item
|
|
1759
|
+
// label stands in.
|
|
1760
|
+
aria-describedby={
|
|
1761
|
+
[
|
|
1762
|
+
ariaDescribedByProp,
|
|
1763
|
+
ariaDescribedBy,
|
|
1764
|
+
value.length > 0 ? triggerTokensId : null,
|
|
1765
|
+
...value.map(item => tokenElementId(item.id)),
|
|
1766
|
+
]
|
|
1767
|
+
.filter(Boolean)
|
|
1768
|
+
.join(' ') || undefined
|
|
1769
|
+
}
|
|
1770
|
+
// The open runs first and the caller's onClick after it, as the
|
|
1771
|
+
// inline input composes its click: a caller observes the click but
|
|
1772
|
+
// cannot cancel the field's own handling
|
|
1773
|
+
// (`family:input-fields` FR10).
|
|
1774
|
+
onClick={composeEventHandlers<React.MouseEvent<HTMLButtonElement>>(
|
|
1775
|
+
() => {
|
|
1776
|
+
if (isDisabled) {
|
|
1777
|
+
return;
|
|
1778
|
+
}
|
|
1779
|
+
setIsSheetPresented(true);
|
|
1780
|
+
setSheetInitialQuery(sheetQueryRef.current);
|
|
1781
|
+
setIsSheetOpen(true);
|
|
1782
|
+
},
|
|
1783
|
+
// Typed for the input by the base props; here the control is the
|
|
1784
|
+
// trigger button, and the handler only reads the event.
|
|
1785
|
+
callerOnClick as unknown as
|
|
1786
|
+
React.MouseEventHandler<HTMLButtonElement> | undefined,
|
|
1787
|
+
)}
|
|
1788
|
+
onKeyDown={onKeyDown}
|
|
1789
|
+
{...stylex.props(
|
|
1790
|
+
styles.sheetTrigger,
|
|
1791
|
+
value.length > 0 && styles.sheetTriggerWithTokens,
|
|
1792
|
+
// With no token the placeholder stops short of the end lane, as
|
|
1793
|
+
// the inline input's text does.
|
|
1794
|
+
value.length === 0 && laneReserve,
|
|
1795
|
+
)}>
|
|
1796
|
+
{value.length === 0 && (
|
|
1797
|
+
<span
|
|
1798
|
+
{...stylex.props(
|
|
1799
|
+
styles.sheetTriggerPlaceholder,
|
|
1800
|
+
isDisabled && styles.sheetTriggerPlaceholderDisabled,
|
|
1801
|
+
)}>
|
|
1802
|
+
{placeholder ?? ''}
|
|
1803
|
+
</span>
|
|
1804
|
+
)}
|
|
1805
|
+
</button>
|
|
1806
|
+
{value.map(item =>
|
|
1807
|
+
renderToken ? (
|
|
1808
|
+
<span key={item.id} {...stylex.props(styles.token)}>
|
|
1809
|
+
{renderToken(item, () => handleSheetTokenRemove(item))}
|
|
1810
|
+
</span>
|
|
1811
|
+
) : (
|
|
1680
1812
|
<Token
|
|
1681
1813
|
key={item.id}
|
|
1682
1814
|
id={tokenElementId(item.id)}
|
|
@@ -1685,22 +1817,27 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1685
1817
|
isDisabled={isDisabled}
|
|
1686
1818
|
xstyle={isDisabled ? styles.sheetTokenDisabled : undefined}
|
|
1687
1819
|
/>
|
|
1688
|
-
)
|
|
1689
|
-
)
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
</span>
|
|
1820
|
+
),
|
|
1821
|
+
)}
|
|
1822
|
+
{isRenderable(endContent) && (
|
|
1823
|
+
<div
|
|
1824
|
+
ref={sheetLaneMergedRef}
|
|
1825
|
+
{...stylex.props(styles.endSection, endSectionSizeStyles[size])}>
|
|
1826
|
+
{endContent}
|
|
1827
|
+
</div>
|
|
1697
1828
|
)}
|
|
1698
|
-
</
|
|
1829
|
+
</div>
|
|
1699
1830
|
{value.length > 0 && (
|
|
1700
1831
|
<VisuallyHidden id={triggerTokensId}>
|
|
1701
1832
|
{t('@astryx.tokenizer.selectedCount', {count: value.length})}
|
|
1702
1833
|
</VisuallyHidden>
|
|
1703
1834
|
)}
|
|
1835
|
+
{renderToken != null &&
|
|
1836
|
+
value.map(item => (
|
|
1837
|
+
<span key={item.id} id={tokenElementId(item.id)} hidden>
|
|
1838
|
+
{item.label}
|
|
1839
|
+
</span>
|
|
1840
|
+
))}
|
|
1704
1841
|
{/* Form carriers, gated exactly as the inline branch gates its own: a
|
|
1705
1842
|
disabled field submits nothing. */}
|
|
1706
1843
|
{htmlName != null &&
|