@astryxdesign/core 0.7.7-canary.c0929c8 → 0.7.7-canary.c19ca12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AlertDialog/AlertDialog.d.ts +4 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +36 -6
- package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts +13 -0
- package/dist/AppShell/useCloseMobileDrawerOnActivate.d.ts.map +1 -0
- package/dist/AppShell/useCloseMobileDrawerOnActivate.js +45 -0
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +79 -9
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +23 -4
- package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -1
- package/dist/BottomSheet/bottomSheetStack.js +5 -4
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +3 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +2 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +7 -3
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +47 -3
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +13 -2
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +7 -1
- package/dist/CheckboxList/CheckboxListContext.d.ts +6 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +10 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +14 -4
- package/dist/ContextMenu/ContextMenu.js +2 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +5 -2
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +13 -27
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +22 -41
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +5 -2
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +23 -45
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +15 -11
- package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
- package/dist/Drawer/useDrawerDialogPresence.js +5 -1
- package/dist/Field/Field.js +2 -2
- package/dist/Field/PanelSearchInput.d.ts +9 -1
- package/dist/Field/PanelSearchInput.d.ts.map +1 -1
- package/dist/Field/PanelSearchInput.js +3 -1
- package/dist/HoverCard/HoverCard.d.ts +4 -3
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +27 -2
- package/dist/HoverCard/useHoverCard.d.ts +5 -4
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -31
- package/dist/Icon/Icon.d.ts +5 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +5 -2
- package/dist/InfoTip/InfoTip.d.ts +63 -0
- package/dist/InfoTip/InfoTip.d.ts.map +1 -0
- package/dist/InfoTip/InfoTip.js +126 -0
- package/dist/InfoTip/index.d.ts +10 -0
- package/dist/InfoTip/index.d.ts.map +1 -0
- package/dist/InfoTip/index.js +12 -0
- package/dist/Layer/layerAnimations.stylex.d.ts +7 -8
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +25 -20
- package/dist/Layer/useBackdropPress.d.ts +27 -0
- package/dist/Layer/useBackdropPress.d.ts.map +1 -0
- package/dist/Layer/useBackdropPress.js +53 -0
- package/dist/Layer/usePressPin.d.ts +20 -10
- package/dist/Layer/usePressPin.d.ts.map +1 -1
- package/dist/Layer/usePressPin.js +66 -18
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +18 -0
- package/dist/MobileNav/MobileNav.js +0 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +2 -4
- package/dist/Outline/Outline.d.ts +2 -4
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +4 -52
- package/dist/Outline/useOutlineFromMarkdown.d.ts.map +1 -1
- package/dist/Outline/useOutlineFromMarkdown.js +1 -0
- package/dist/Outline/useScrollSpy.js +3 -3
- package/dist/PowerSearch/PowerSearch.d.ts +36 -3
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +571 -302
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +100 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
- package/dist/PowerSearch/PowerSearchBottomSheet.js +1913 -0
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +32 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +17 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +170 -61
- package/dist/PowerSearch/formatFilterValue.d.ts +7 -0
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +11 -1
- package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
- package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
- package/dist/PowerSearch/formatTokenValue.js +160 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
- package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
- package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +8 -2
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -3
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +118 -260
- package/dist/Resizable/resizeGesture.d.ts +91 -0
- package/dist/Resizable/resizeGesture.d.ts.map +1 -0
- package/dist/Resizable/resizeGesture.js +251 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +3 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +115 -8
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +6 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -0
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +8 -1
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts +357 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -0
- package/dist/SegmentedControl/useSegmentedSelectionMotion.js +1349 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts +70 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.d.ts.map +1 -0
- package/dist/SegmentedControl/useSegmentedTouchTracking.js +264 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +96 -67
- package/dist/Selector/optionShape.d.ts +24 -0
- package/dist/Selector/optionShape.d.ts.map +1 -0
- package/dist/Selector/optionShape.js +48 -0
- package/dist/Selector/selectableOptionEntries.d.ts +20 -0
- package/dist/Selector/selectableOptionEntries.d.ts.map +1 -0
- package/dist/Selector/selectableOptionEntries.js +38 -0
- package/dist/Selector/utils.d.ts +2 -17
- package/dist/Selector/utils.d.ts.map +1 -1
- package/dist/Selector/utils.js +3 -51
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +3 -9
- package/dist/Slider/sliderTouchController.js +2 -2
- package/dist/Spinner/Spinner.d.ts +1 -1
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +60 -58
- package/dist/Switch/switchTouch.d.ts +0 -7
- package/dist/Switch/switchTouch.d.ts.map +1 -1
- package/dist/Switch/switchTouch.js +2 -10
- package/dist/Switch/useSwitchTouch.d.ts +2 -11
- package/dist/Switch/useSwitchTouch.d.ts.map +1 -1
- package/dist/Switch/useSwitchTouch.js +35 -93
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +29 -8
- package/dist/TextInput/TextInput.d.ts +2 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +10 -7
- package/dist/Toast/Toast.d.ts +11 -1
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +30 -15
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +94 -34
- package/dist/Toast/types.d.ts +9 -3
- package/dist/Toast/types.d.ts.map +1 -1
- package/dist/Token/Token.d.ts +2 -2
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +13 -4
- package/dist/Token/TokenNamingContext.d.ts +14 -0
- package/dist/Token/TokenNamingContext.d.ts.map +1 -0
- package/dist/Token/TokenNamingContext.js +23 -0
- package/dist/Tokenizer/Tokenizer.d.ts +46 -59
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +40 -57
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts +25 -28
- package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -1
- package/dist/Tokenizer/TokenizerBottomSheet.js +157 -54
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts +3 -0
- package/dist/Tokenizer/TokenizerItemRemovableContext.d.ts.map +1 -0
- package/dist/Tokenizer/TokenizerItemRemovableContext.js +19 -0
- package/dist/Tooltip/Tooltip.d.ts +25 -30
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/Tooltip.js +24 -5
- package/dist/Tooltip/index.d.ts +1 -1
- package/dist/Tooltip/index.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +45 -28
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +52 -59
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +4 -7
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +4 -7
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -7
- package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/animator/createAnimator.d.ts +98 -0
- package/dist/animator/createAnimator.d.ts.map +1 -0
- package/dist/animator/createAnimator.js +259 -0
- package/dist/astryx.css +96 -7
- package/dist/gestures/GestureHost.d.ts +27 -1
- package/dist/gestures/GestureHost.d.ts.map +1 -1
- package/dist/gestures/GestureHost.js +157 -21
- package/dist/gestures/PressTracker.d.ts.map +1 -1
- package/dist/gestures/PressTracker.js +4 -3
- package/dist/hooks/actionGroupTracker.d.ts +7 -4
- package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
- package/dist/hooks/actionGroupTracker.js +19 -56
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/pressGroupContext.d.ts +6 -0
- package/dist/hooks/pressGroupContext.d.ts.map +1 -0
- package/dist/hooks/pressGroupContext.js +20 -0
- package/dist/hooks/useActionGroupTracking.d.ts +53 -0
- package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
- package/dist/hooks/useActionGroupTracking.js +174 -0
- package/dist/hooks/useAnimator.d.ts +41 -0
- package/dist/hooks/useAnimator.d.ts.map +1 -0
- package/dist/hooks/useAnimator.js +70 -0
- package/dist/hooks/useAttachment.d.ts +1 -1
- package/dist/hooks/useAttachment.js +1 -1
- package/dist/hooks/useHighlightedOptionScroll.d.ts +11 -1
- package/dist/hooks/useHighlightedOptionScroll.d.ts.map +1 -1
- package/dist/hooks/useHighlightedOptionScroll.js +112 -11
- package/dist/hooks/useInputStatusIcon.d.ts +1 -1
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +2 -2
- package/dist/hooks/useLongPress.d.ts +6 -2
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +95 -15
- package/dist/hooks/useMediaQuery.d.ts +2 -1
- package/dist/hooks/useMediaQuery.d.ts.map +1 -1
- package/dist/hooks/useMediaQuery.js +7 -4
- package/dist/hooks/useMenuPress.d.ts.map +1 -1
- package/dist/hooks/useMenuPress.js +4 -2
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.d.ts +8 -0
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/InfoTip/InfoTip.generated.js +12 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearch.generated.js +1 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
- package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
- package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.d.ts.map +1 -1
- package/dist/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.js +7 -1
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +33 -1
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +33 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/internal/SheetConfirmation.d.ts +11 -0
- package/dist/internal/SheetConfirmation.d.ts.map +1 -0
- package/dist/internal/SheetConfirmation.js +92 -0
- package/dist/internal/indicatorPress.stylex.d.ts +20 -0
- package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
- package/dist/internal/indicatorPress.stylex.js +26 -0
- package/dist/internal/sheetDraft.d.ts +35 -0
- package/dist/internal/sheetDraft.d.ts.map +1 -0
- package/dist/internal/sheetDraft.js +65 -0
- package/dist/internal/touch-sheet.d.ts +21 -0
- package/dist/internal/touch-sheet.d.ts.map +1 -0
- package/dist/internal/touch-sheet.js +19 -0
- package/dist/internal/useDismissSearchOnTouchDrag.d.ts +24 -0
- package/dist/internal/useDismissSearchOnTouchDrag.d.ts.map +1 -0
- package/dist/internal/useDismissSearchOnTouchDrag.js +56 -0
- package/dist/motion/animator.d.ts +14 -14
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +41 -18
- package/dist/motion/reducedMotion.d.ts +24 -0
- package/dist/motion/reducedMotion.d.ts.map +1 -1
- package/dist/motion/reducedMotion.js +78 -1
- package/dist/motion/roles.d.ts +7 -1
- package/dist/motion/roles.d.ts.map +1 -1
- package/dist/motion/roles.js +20 -1
- package/dist/motion/uikit/alert.d.ts +41 -0
- package/dist/motion/uikit/alert.d.ts.map +1 -0
- package/dist/motion/uikit/alert.js +43 -0
- package/dist/motion/uikit/index.d.ts +6 -5
- package/dist/motion/uikit/index.d.ts.map +1 -1
- package/dist/motion/uikit/index.js +6 -5
- package/dist/motion/uikit/segmented.d.ts +55 -0
- package/dist/motion/uikit/segmented.d.ts.map +1 -0
- package/dist/motion/uikit/segmented.js +77 -0
- package/dist/motion/uikit/springs.d.ts +0 -18
- package/dist/motion/uikit/springs.d.ts.map +1 -1
- package/dist/motion/uikit/springs.js +5 -21
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts +15 -0
- package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/pressGroupItem.stylex.js +23 -0
- package/dist/privateAttributes/segmentTitle.stylex.d.ts +5 -0
- package/dist/privateAttributes/segmentTitle.stylex.d.ts.map +1 -0
- package/dist/privateAttributes/segmentTitle.stylex.js +22 -0
- package/dist/utils/browserClickWait.d.ts +35 -0
- package/dist/utils/browserClickWait.d.ts.map +1 -0
- package/dist/utils/browserClickWait.js +123 -0
- package/dist/utils/clickGuard.d.ts +14 -1
- package/dist/utils/clickGuard.d.ts.map +1 -1
- package/dist/utils/clickGuard.js +46 -1
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +12 -0
- package/dist/utils/focusReturn.d.ts +15 -0
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +28 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
- package/dist/utils/interactionOverlay.stylex.js +3 -2
- package/dist/utils/pressFeedback.d.ts.map +1 -1
- package/dist/utils/pressFeedback.js +19 -6
- package/dist/utils/triggerFocus.d.ts +36 -0
- package/dist/utils/triggerFocus.d.ts.map +1 -0
- package/dist/utils/triggerFocus.js +65 -0
- package/locales/en.json +128 -0
- package/locales/pseudo.json +96 -0
- package/package.json +18 -8
- package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
- package/src/AlertDialog/AlertDialog.tsx +37 -5
- package/src/AppShell/useCloseMobileDrawerOnActivate.ts +52 -0
- package/src/BottomSheet/BottomSheet.tsx +95 -10
- package/src/BottomSheet/BottomSheetPanel.tsx +40 -5
- package/src/BottomSheet/bottomSheetStack.ts +8 -4
- package/src/BottomSheet/useSheetGestures.ts +3 -1
- package/src/Breadcrumbs/BreadcrumbItem.tsx +13 -3
- package/src/Button/Button.tsx +63 -5
- package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
- package/src/CheckboxInput/CheckboxInput.tsx +36 -9
- package/src/CheckboxList/CheckboxList.doc.mjs +4 -2
- package/src/CheckboxList/CheckboxList.tsx +6 -0
- package/src/CheckboxList/CheckboxListContext.tsx +6 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/ComplexSelector/ComplexSelector.tsx +20 -5
- package/src/ContextMenu/ContextMenu.tsx +2 -2
- package/src/DateInput/DateInput.tsx +8 -2
- package/src/DateInput/MonthScroller.tsx +18 -22
- package/src/DateInput/Wheel.tsx +30 -32
- package/src/DateTimeInput/DateTimeInput.tsx +8 -2
- package/src/Dialog/Dialog.tsx +54 -45
- package/src/Drawer/Drawer.tsx +28 -11
- package/src/Drawer/useDrawerDialogPresence.ts +5 -1
- package/src/Field/Field.tsx +2 -2
- package/src/Field/PanelSearchInput.tsx +11 -0
- package/src/HoverCard/HoverCard.doc.mjs +4 -2
- package/src/HoverCard/HoverCard.tsx +35 -4
- package/src/HoverCard/useHoverCard.doc.mjs +178 -36
- package/src/HoverCard/useHoverCard.tsx +46 -52
- package/src/Icon/Icon.doc.mjs +49 -8
- package/src/Icon/Icon.tsx +15 -7
- package/src/InfoTip/InfoTip.doc.mjs +192 -0
- package/src/InfoTip/InfoTip.tsx +186 -0
- package/src/InfoTip/index.ts +14 -0
- package/src/Layer/layerAnimations.stylex.ts +24 -16
- package/src/Layer/useBackdropPress.ts +81 -0
- package/src/Layer/usePressPin.ts +86 -26
- package/src/Lightbox/Lightbox.tsx +18 -0
- package/src/MobileNav/MobileNav.tsx +1 -1
- package/src/MultiSelector/hooks.ts +2 -4
- package/src/Outline/Outline.doc.mjs +177 -51
- package/src/Outline/Outline.tsx +5 -57
- package/src/Outline/useOutlineFromMarkdown.doc.mjs +157 -0
- package/src/Outline/useOutlineFromMarkdown.ts +1 -0
- package/src/Outline/useScrollSpy.ts +3 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +55 -6
- package/src/PowerSearch/PowerSearch.tsx +798 -324
- package/src/PowerSearch/PowerSearchBottomSheet.tsx +2515 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +28 -6
- package/src/PowerSearch/PowerSearchValueEditor.tsx +203 -38
- package/src/PowerSearch/formatFilterValue.ts +18 -1
- package/src/PowerSearch/formatTokenValue.ts +215 -0
- package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioList.tsx +7 -2
- package/src/RadioList/RadioListItem.tsx +5 -3
- package/src/Resizable/ResizeHandle.tsx +133 -328
- package/src/Resizable/resizeGesture.ts +368 -0
- package/src/SegmentedControl/SegmentedControl.doc.mjs +3 -3
- package/src/SegmentedControl/SegmentedControl.tsx +179 -5
- package/src/SegmentedControl/SegmentedControlContext.ts +6 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +12 -1
- package/src/SegmentedControl/useSegmentedSelectionMotion.ts +1640 -0
- package/src/SegmentedControl/useSegmentedTouchTracking.ts +308 -0
- package/src/Selector/Selector.tsx +136 -89
- package/src/Selector/optionShape.ts +64 -0
- package/src/Selector/selectableOptionEntries.ts +39 -0
- package/src/Selector/utils.ts +9 -68
- package/src/SideNav/SideNavItem.tsx +3 -7
- package/src/Slider/sliderTouchController.ts +2 -2
- package/src/Spinner/Spinner.tsx +77 -63
- package/src/Switch/switchTouch.ts +2 -10
- package/src/Switch/useSwitchTouch.ts +38 -104
- package/src/Table/BaseTable.tsx +46 -12
- package/src/TextInput/TextInput.tsx +11 -10
- package/src/Toast/Toast.doc.mjs +4 -3
- package/src/Toast/Toast.tsx +57 -32
- package/src/Toast/ToastViewport.tsx +121 -35
- package/src/Toast/types.ts +9 -3
- package/src/Token/Token.tsx +15 -4
- package/src/Token/TokenNamingContext.ts +28 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -0
- package/src/Tokenizer/Tokenizer.tsx +89 -85
- package/src/Tokenizer/TokenizerBottomSheet.tsx +219 -93
- package/src/Tokenizer/TokenizerItemRemovableContext.ts +24 -0
- package/src/Tooltip/Tooltip.doc.mjs +123 -54
- package/src/Tooltip/Tooltip.tsx +36 -39
- package/src/Tooltip/index.ts +0 -1
- package/src/Tooltip/useTooltip.doc.mjs +171 -33
- package/src/Tooltip/useTooltip.tsx +98 -86
- package/src/TopNav/TopNavItem.tsx +6 -5
- package/src/TopNav/TopNavMegaMenuItem.tsx +6 -5
- package/src/TopNav/TopNavMenu.tsx +6 -5
- package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/animator/createAnimator.doc.mjs +153 -0
- package/src/animator/createAnimator.ts +324 -0
- package/src/gestures/GestureHost.ts +198 -20
- package/src/gestures/PressTracker.ts +4 -3
- package/src/gestures/README.md +7 -1
- package/src/hooks/actionGroupTracker.ts +32 -61
- package/src/hooks/index.ts +2 -0
- package/src/hooks/pressGroupContext.ts +21 -0
- package/src/hooks/useActionGroupTracking.ts +224 -0
- package/src/hooks/useAnimator.doc.mjs +109 -0
- package/src/hooks/useAnimator.ts +67 -0
- package/src/hooks/useAttachment.ts +1 -1
- package/src/hooks/useHighlightedOptionScroll.ts +123 -15
- package/src/hooks/useInputStatusIcon.tsx +3 -2
- package/src/hooks/useLongPress.doc.mjs +2 -2
- package/src/hooks/useLongPress.ts +136 -15
- package/src/hooks/useMediaQuery.doc.mjs +2 -2
- package/src/hooks/useMediaQuery.ts +13 -4
- package/src/hooks/useMenuPress.ts +8 -2
- package/src/i18n/generated-english/InfoTip/InfoTip.generated.ts +13 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearch.generated.ts +1 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
- package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
- package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
- package/src/i18n/generated-english/Tokenizer/TokenizerBottomSheet.generated.ts +7 -1
- package/src/i18n/generated-locales/en.generated.ts +43 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +44 -0
- package/src/index.ts +14 -0
- package/src/internal/SheetConfirmation.tsx +101 -0
- package/src/internal/indicatorPress.stylex.ts +24 -0
- package/src/internal/sheetDraft.ts +80 -0
- package/src/internal/touch-sheet.ts +21 -0
- package/src/internal/useDismissSearchOnTouchDrag.ts +69 -0
- package/src/motion/MEASUREMENTS.md +7 -0
- package/src/motion/README.md +9 -5
- package/src/motion/animator.ts +61 -29
- package/src/motion/reducedMotion.ts +79 -1
- package/src/motion/roles.ts +20 -1
- package/src/motion/uikit/alert.ts +43 -0
- package/src/motion/uikit/index.ts +5 -5
- package/src/motion/uikit/segmented.ts +74 -0
- package/src/motion/uikit/springs.ts +5 -21
- package/src/privateAttributes/pressGroupItem.stylex.ts +23 -0
- package/src/privateAttributes/segmentTitle.stylex.ts +22 -0
- package/src/utils/browserClickWait.ts +133 -0
- package/src/utils/clickGuard.ts +64 -1
- package/src/utils/dateParser.ts +16 -0
- package/src/utils/focusReturn.ts +30 -0
- package/src/utils/interactionOverlay.stylex.ts +3 -2
- package/src/utils/pressFeedback.ts +19 -6
- package/src/utils/triggerFocus.ts +80 -0
- package/dist/internal/tokenizer-presentation.d.ts +0 -21
- package/dist/internal/tokenizer-presentation.d.ts.map +0 -1
- package/dist/internal/tokenizer-presentation.js +0 -21
- package/src/internal/tokenizer-presentation.ts +0 -25
package/src/Token/Token.tsx
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* - /packages/cli/assets/templates/blocks/components/Token/ (showcase blocks)
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import type
|
|
20
|
+
import {use, type ReactNode} from 'react';
|
|
21
21
|
import * as stylex from '@stylexjs/stylex';
|
|
22
22
|
import {
|
|
23
23
|
colorVars,
|
|
@@ -41,6 +41,7 @@ import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
|
|
|
41
41
|
import {usePressFeedback} from '../hooks/usePressFeedback';
|
|
42
42
|
import type {TokenColorMap} from './index';
|
|
43
43
|
import {disabledInteractionProps} from '../utils/disabledInteraction';
|
|
44
|
+
import {TokenNamingContext} from './TokenNamingContext';
|
|
44
45
|
import {
|
|
45
46
|
registerEnglishFallback,
|
|
46
47
|
useComponentTranslator,
|
|
@@ -193,6 +194,8 @@ const styles = stylex.create({
|
|
|
193
194
|
borderRadius: radiusVars['--radius-full'],
|
|
194
195
|
width: '16px',
|
|
195
196
|
height: '16px',
|
|
197
|
+
// A token cut by its width shrinks only its label, not the button.
|
|
198
|
+
flexShrink: 0,
|
|
196
199
|
color: 'inherit',
|
|
197
200
|
'::after': {
|
|
198
201
|
content: '""',
|
|
@@ -307,6 +310,8 @@ export function Token({
|
|
|
307
310
|
'data-testid': testId,
|
|
308
311
|
'aria-labelledby': ariaLabelledBy,
|
|
309
312
|
'aria-describedby': ariaDescribedBy,
|
|
313
|
+
'aria-haspopup': ariaHasPopup,
|
|
314
|
+
'aria-expanded': ariaExpanded,
|
|
310
315
|
ref,
|
|
311
316
|
...rest
|
|
312
317
|
}: TokenProps) {
|
|
@@ -317,6 +322,7 @@ export function Token({
|
|
|
317
322
|
const t = useComponentTranslator();
|
|
318
323
|
const LinkComponent = useLinkComponent();
|
|
319
324
|
const role = useInteractiveRole({href, onClick, isDisabled});
|
|
325
|
+
const naming = use(TokenNamingContext);
|
|
320
326
|
|
|
321
327
|
// When role is 'button' via context (no explicit onClick), treat as
|
|
322
328
|
// if onClick was provided — the popover attaches its own handler.
|
|
@@ -325,7 +331,9 @@ export function Token({
|
|
|
325
331
|
const removeButton = onRemove != null && (
|
|
326
332
|
<button
|
|
327
333
|
type="button"
|
|
328
|
-
aria-label={t('@astryx.token.remove', {
|
|
334
|
+
aria-label={t('@astryx.token.remove', {
|
|
335
|
+
label: naming?.removeName ?? label,
|
|
336
|
+
})}
|
|
329
337
|
onClick={e => {
|
|
330
338
|
e.stopPropagation();
|
|
331
339
|
onRemove(e);
|
|
@@ -350,12 +358,14 @@ export function Token({
|
|
|
350
358
|
</>
|
|
351
359
|
);
|
|
352
360
|
|
|
353
|
-
// Naming inputs reach the element that owns the token's action:
|
|
354
|
-
// button of a clickable token, otherwise the root
|
|
361
|
+
// Naming and popup inputs reach the element that owns the token's action:
|
|
362
|
+
// the inner button of a clickable token, otherwise the root
|
|
355
363
|
// (architecture:public-component-api INV5).
|
|
356
364
|
const labellingProps = {
|
|
357
365
|
'aria-labelledby': ariaLabelledBy,
|
|
358
366
|
'aria-describedby': ariaDescribedBy,
|
|
367
|
+
'aria-haspopup': ariaHasPopup,
|
|
368
|
+
'aria-expanded': ariaExpanded,
|
|
359
369
|
};
|
|
360
370
|
|
|
361
371
|
const sharedProps = {
|
|
@@ -530,6 +540,7 @@ export function Token({
|
|
|
530
540
|
<button
|
|
531
541
|
type="button"
|
|
532
542
|
onClick={effectiveOnClick}
|
|
543
|
+
aria-label={ariaLabelledBy == null ? naming?.actionName : undefined}
|
|
533
544
|
{...labellingProps}
|
|
534
545
|
aria-disabled={isDisabled || undefined}
|
|
535
546
|
{...(isDisabled ? disabledInteractionProps() : null)}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file TokenNamingContext.ts
|
|
7
|
+
* @input Naming parts from a caller whose token value renders outside its label
|
|
8
|
+
* @output Internal context: the names of a token's action and remove button
|
|
9
|
+
* @position Internal to Core; not exported from the Token entry point
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {createContext} from 'react';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Names for a Token whose visible text runs past its label. PowerSearch
|
|
16
|
+
* provides them: its tokens show the value as `endContent`.
|
|
17
|
+
*
|
|
18
|
+
* - `actionName` names a clickable token's inner button in place of `label`.
|
|
19
|
+
* - `removeName` names the remove button in place of `label`. The remove word
|
|
20
|
+
* still comes from the catalog, so each locale keeps its word order.
|
|
21
|
+
*/
|
|
22
|
+
export interface TokenNaming {
|
|
23
|
+
actionName?: string;
|
|
24
|
+
removeName?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const TokenNamingContext = createContext<TokenNaming | null>(null);
|
|
28
|
+
TokenNamingContext.displayName = 'TokenNamingContext';
|
|
@@ -292,6 +292,13 @@ export const docs = {
|
|
|
292
292
|
type: 'CSSProperties',
|
|
293
293
|
description: 'Inline styles for the visual control box.',
|
|
294
294
|
},
|
|
295
|
+
{
|
|
296
|
+
name: 'experimental',
|
|
297
|
+
type: "{presentation?: 'popover' | 'bottom-sheet' | 'adaptive'}",
|
|
298
|
+
stability: 'experimental',
|
|
299
|
+
description:
|
|
300
|
+
"Experimental options: anything in this object may change or be removed in a patch release, and omitting it keeps the stable behavior. presentation (default 'popover') chooses how the field presents its choices. popover is the inline combobox with its anchored suggestion menu. bottom-sheet replaces it with a trigger showing the selected tokens that opens one tall modal sheet: a search row on top, full-width checkbox rows that keep their place while the sheet is open, a Create row with hasCreate, and a footer pinned in every state with a confirmed Clear all and Save; the sheet edits a draft, so onChange fires once, when Save commits it, and a swipe, scrim or Escape close of a changed draft asks before discarding. adaptive uses the bottom sheet on compact touch screens and the popover otherwise, resolved the same way Selector resolves it. In the sheet presentation the trigger is the control (ref, id, aria-* and data-* reach it; with experimental passed, ref also accepts a Ref<HTMLInputElement | HTMLButtonElement> — an input-only ref still type-checks against that wider type, but with adaptive or bottom-sheet it receives the trigger button at runtime, so type the ref for both elements; TokenizerProps keeps its released ref type and gains only the optional experimental), and renderItem, renderToken, endContent, hasClear, hasEntriesOnFocus, menuWidth, tokenOverflowBehavior and hasAutoFocus have no surface to act on; the field warns once in development when they are passed. For example: <Tokenizer label=\"Tags\" searchSource={tagSource} value={tags} onChange={setTags} hasCreate experimental={{presentation: 'adaptive'}} />.",
|
|
301
|
+
},
|
|
295
302
|
],
|
|
296
303
|
theming: {
|
|
297
304
|
targets: [
|
|
@@ -631,6 +638,13 @@ export const docsZh = {
|
|
|
631
638
|
type: 'CSSProperties',
|
|
632
639
|
description: '可视控件框的内联样式。',
|
|
633
640
|
},
|
|
641
|
+
{
|
|
642
|
+
name: 'experimental',
|
|
643
|
+
type: "{presentation?: 'popover' | 'bottom-sheet' | 'adaptive'}",
|
|
644
|
+
stability: 'experimental',
|
|
645
|
+
description:
|
|
646
|
+
"实验性选项:此对象中的任何内容都可能在补丁版本中更改或移除;省略它即保持稳定行为。presentation(默认 'popover')决定字段如何呈现选项:popover 为内联组合框及其锚定建议菜单;bottom-sheet 改为一个显示已选标记的触发按钮,点按后打开一个高的模态底部面板——顶部为搜索行,下方为整行复选框行(面板打开期间位置保持不变),hasCreate 时有「创建」行,底部固定显示需确认的「全部清除」和「保存」;面板编辑的是草稿,onChange 仅在「保存」提交时触发一次,草稿有改动时滑动、点击遮罩或按 Escape 关闭会先询问是否放弃;adaptive 在紧凑触摸屏上使用底部面板,其他情况使用 popover,解析方式与 Selector 相同。在底部面板呈现中,触发按钮即为控件(ref、id、aria-* 和 data-* 都作用于它;传入 experimental 后,ref 也接受 Ref<HTMLInputElement | HTMLButtonElement>——仅为输入框类型的 ref 在这个更宽的类型下仍能通过类型检查,但在 adaptive 或 bottom-sheet 下运行时收到的是触发按钮,因此请为两种元素声明 ref 的类型;TokenizerProps 保留已发布的 ref 类型,仅新增可选的 experimental);renderItem、renderToken、endContent、hasClear、hasEntriesOnFocus、menuWidth、tokenOverflowBehavior 和 hasAutoFocus 没有作用对象,传入时开发模式下会警告一次。例如:<Tokenizer label=\"标签\" searchSource={tagSource} value={tags} onChange={setTags} hasCreate experimental={{presentation: 'adaptive'}} />。",
|
|
647
|
+
},
|
|
634
648
|
],
|
|
635
649
|
theming: {
|
|
636
650
|
targets: [
|
|
@@ -830,5 +844,7 @@ export const docsDense = {
|
|
|
830
844
|
'Icon at input start, before tokens. Icon name, SVG component, or ReactNode.',
|
|
831
845
|
endContent: 'Content at input row end. For buttons, counts, controls.',
|
|
832
846
|
handleRef: 'Imperative handle for focus() and blur() control.',
|
|
847
|
+
experimental:
|
|
848
|
+
"Experimental; may change in a patch. presentation: 'popover' (default, inline combobox) | 'bottom-sheet' (trigger + one searchable modal sheet of checkbox rows editing a draft that Save commits; onChange fires once, on Save) | 'adaptive' (sheet on compact touch, else popover).",
|
|
833
849
|
},
|
|
834
850
|
};
|
|
@@ -6,16 +6,10 @@
|
|
|
6
6
|
* @file Tokenizer.tsx
|
|
7
7
|
* @input Uses React, BaseTypeahead, Field, Token, useAnnounce,
|
|
8
8
|
* useAdaptivePresentation, and TokenizerBottomSheet (lazy)
|
|
9
|
-
* @output Exports Tokenizer multi-select typeahead component
|
|
10
|
-
* internal TokenizerWithPresentation signature the `internal/tokenizer-presentation`
|
|
11
|
-
* entry re-exports
|
|
9
|
+
* @output Exports Tokenizer multi-select typeahead component
|
|
12
10
|
* @position Composed component; forwards DOM ref and exposes focus control via
|
|
13
|
-
* handleRef. The
|
|
14
|
-
*
|
|
15
|
-
* offers no `experimental.presentation` while its user experience is being
|
|
16
|
-
* finished (`component:Tokenizer` DEC-3, implementation gap), and only
|
|
17
|
-
* Astryx's own packages reach it through the internal entry
|
|
18
|
-
* (`architecture:react-component-runtime` INV13).
|
|
11
|
+
* handleRef. The experimental `presentation` option swaps the inline
|
|
12
|
+
* combobox for a trigger that opens TokenizerBottomSheet.
|
|
19
13
|
*
|
|
20
14
|
* SYNC: When modified, update:
|
|
21
15
|
* - /packages/core/src/Tokenizer/index.ts
|
|
@@ -55,6 +49,7 @@ import {
|
|
|
55
49
|
import {inputDisabledFocusStyles} from '../Field/inputDisabledFocus';
|
|
56
50
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
57
51
|
import {TokenizerClearAllMessageContext} from './TokenizerClearAllMessageContext';
|
|
52
|
+
import {TokenizerItemRemovableContext} from './TokenizerItemRemovableContext';
|
|
58
53
|
import {useBusyAnnouncement} from '../hooks/useBusyAnnouncement';
|
|
59
54
|
import {useAdaptivePresentation} from '../hooks/useAdaptivePresentation';
|
|
60
55
|
import {useIsHydrating} from '../hooks/useIsHydrating';
|
|
@@ -95,6 +90,7 @@ import {composeEventHandlers, mergeProps} from '../utils';
|
|
|
95
90
|
import {joinAriaIDs} from '../utils/inputAria';
|
|
96
91
|
import {isFocusDetached} from '../utils/focusReturn';
|
|
97
92
|
import {themeProps} from '../utils/themeProps';
|
|
93
|
+
import type {SheetDraftChange} from '../internal/sheetDraft';
|
|
98
94
|
import type {TokenizerBottomSheetProps} from './TokenizerBottomSheet';
|
|
99
95
|
import {useResolvedRequired} from '../hooks/useResolvedRequired';
|
|
100
96
|
import type {FieldStatusPlacement} from '../Field/fieldStatusPlacement';
|
|
@@ -147,36 +143,6 @@ export interface TokenizerHandle {
|
|
|
147
143
|
blur(): void;
|
|
148
144
|
}
|
|
149
145
|
|
|
150
|
-
/**
|
|
151
|
-
* The presentation options the sheet-capable signature admits. Not public:
|
|
152
|
-
* `TokenizerProps` has no `experimental` while the sheet's user experience is
|
|
153
|
-
* being finished; Astryx's own packages reach the sheet through
|
|
154
|
-
* `@astryxdesign/core/internal/tokenizer-presentation`.
|
|
155
|
-
*/
|
|
156
|
-
export interface TokenizerPresentationOptions {
|
|
157
|
-
/**
|
|
158
|
-
* How the field presents its choices.
|
|
159
|
-
* - `'popover'`: the inline combobox with its anchored suggestion menu —
|
|
160
|
-
* the stable behavior.
|
|
161
|
-
* - `'bottom-sheet'`: a trigger showing the selected tokens that opens one
|
|
162
|
-
* tall modal sheet: a search row on top, full-width checkbox rows that
|
|
163
|
-
* keep their place while the sheet is open, a create row with
|
|
164
|
-
* `hasCreate`, and a footer with a confirmed Clear all and Done. Suited
|
|
165
|
-
* to compact touch screens, where the inline combobox competes with the
|
|
166
|
-
* software keyboard.
|
|
167
|
-
* - `'adaptive'`: the bottom sheet on compact coarse-pointer screens,
|
|
168
|
-
* otherwise the popover — the same resolution Selector uses.
|
|
169
|
-
*
|
|
170
|
-
* In the sheet presentation the trigger is the control: `ref`, `id`,
|
|
171
|
-
* `aria-*`, and `data-*` reach it. `renderItem`, `renderToken`,
|
|
172
|
-
* `endContent`, `hasClear`, `hasEntriesOnFocus`, `menuWidth`,
|
|
173
|
-
* `tokenOverflowBehavior`, and `hasAutoFocus` have no surface to act on
|
|
174
|
-
* and warn once in development.
|
|
175
|
-
* @default 'popover'
|
|
176
|
-
*/
|
|
177
|
-
presentation?: 'popover' | 'bottom-sheet' | 'adaptive';
|
|
178
|
-
}
|
|
179
|
-
|
|
180
146
|
export interface TokenizerProps<T extends SearchableItem> extends Omit<
|
|
181
147
|
FieldInputBaseProps<HTMLInputElement>,
|
|
182
148
|
'onChange' | 'onFocus' | 'onBlur' | 'onKeyDown'
|
|
@@ -334,26 +300,58 @@ export interface TokenizerProps<T extends SearchableItem> extends Omit<
|
|
|
334
300
|
ref?: React.Ref<HTMLInputElement>;
|
|
335
301
|
/** Imperative handle ref for focus/blur control. */
|
|
336
302
|
handleRef?: React.Ref<TokenizerHandle>;
|
|
303
|
+
/**
|
|
304
|
+
* Experimental options, outside the stable compatibility promise: anything
|
|
305
|
+
* in this object may change or be removed in a patch release. Omit it for
|
|
306
|
+
* the stable behavior.
|
|
307
|
+
* @experimental
|
|
308
|
+
*/
|
|
309
|
+
experimental?: {
|
|
310
|
+
/**
|
|
311
|
+
* How the field presents its choices.
|
|
312
|
+
* - `'popover'`: the inline combobox with its anchored suggestion menu —
|
|
313
|
+
* the stable behavior.
|
|
314
|
+
* - `'bottom-sheet'`: a trigger showing the selected tokens that opens one
|
|
315
|
+
* tall modal sheet: a search row on top, full-width checkbox rows that
|
|
316
|
+
* keep their place while the sheet is open, a create row with
|
|
317
|
+
* `hasCreate`, and a footer pinned in every state with a confirmed Clear
|
|
318
|
+
* all and Save. The sheet edits a draft: `onChange` fires once, when Save
|
|
319
|
+
* commits it, and a swipe, scrim or Escape close of a changed draft asks
|
|
320
|
+
* before discarding. Suited to compact touch screens, where the inline
|
|
321
|
+
* combobox competes with the software keyboard.
|
|
322
|
+
* - `'adaptive'`: the bottom sheet on compact coarse-pointer screens,
|
|
323
|
+
* otherwise the popover — the same resolution Selector uses.
|
|
324
|
+
*
|
|
325
|
+
* In the sheet presentation the trigger is the control: `ref`, `id`,
|
|
326
|
+
* `aria-*`, and `data-*` reach it. `renderItem`, `renderToken`,
|
|
327
|
+
* `endContent`, `hasClear`, `hasEntriesOnFocus`, `menuWidth`,
|
|
328
|
+
* `tokenOverflowBehavior`, and `hasAutoFocus` have no surface to act on
|
|
329
|
+
* and warn once in development.
|
|
330
|
+
* @experimental
|
|
331
|
+
* @default 'popover'
|
|
332
|
+
*/
|
|
333
|
+
presentation?: 'popover' | 'bottom-sheet' | 'adaptive';
|
|
334
|
+
};
|
|
337
335
|
}
|
|
338
336
|
|
|
339
337
|
/**
|
|
340
|
-
* The props
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
* `
|
|
345
|
-
* `
|
|
346
|
-
* their released shapes — names no presentation.
|
|
338
|
+
* The props the experimental opt-in admits. `experimental` is present, and
|
|
339
|
+
* `ref` also accepts the sheet presentation's trigger button, the control it
|
|
340
|
+
* stands for there. Only the overload below reaches this type. `TokenizerProps`
|
|
341
|
+
* stays the component's declared props type: it is an interface, so
|
|
342
|
+
* `interface X extends TokenizerProps<T>`, `Omit<TokenizerProps<T>, …>` and
|
|
343
|
+
* `ComponentProps<typeof Tokenizer>` keep their released shapes.
|
|
347
344
|
*/
|
|
348
|
-
|
|
345
|
+
type TokenizerExperimentalProps<T extends SearchableItem> = Omit<
|
|
349
346
|
TokenizerProps<T>,
|
|
350
|
-
'ref'
|
|
347
|
+
'ref' | 'experimental'
|
|
351
348
|
> & {
|
|
352
|
-
/**
|
|
353
|
-
experimental
|
|
349
|
+
/** @experimental */
|
|
350
|
+
experimental: NonNullable<TokenizerProps<T>['experimental']>;
|
|
354
351
|
/**
|
|
355
352
|
* Ref forwarded to the control: the combobox input in the popover
|
|
356
353
|
* presentation, the trigger button in the sheet presentation.
|
|
354
|
+
* @experimental
|
|
357
355
|
*/
|
|
358
356
|
ref?: React.Ref<HTMLInputElement | HTMLButtonElement>;
|
|
359
357
|
};
|
|
@@ -723,10 +721,13 @@ function EndLane({
|
|
|
723
721
|
);
|
|
724
722
|
}
|
|
725
723
|
|
|
726
|
-
//
|
|
727
|
-
// Tokenizer>`
|
|
728
|
-
//
|
|
729
|
-
// `
|
|
724
|
+
// Keep this overload first. TypeScript resolves `ComponentProps<typeof
|
|
725
|
+
// Tokenizer>` against the last overload, so that type stays the stable props.
|
|
726
|
+
// A call that passes `experimental` matches this one and may pass the wider
|
|
727
|
+
// `ref`.
|
|
728
|
+
export function Tokenizer<T extends SearchableItem>(
|
|
729
|
+
props: TokenizerExperimentalProps<T>,
|
|
730
|
+
): React.JSX.Element;
|
|
730
731
|
export function Tokenizer<T extends SearchableItem>(
|
|
731
732
|
props: TokenizerProps<T>,
|
|
732
733
|
): React.JSX.Element;
|
|
@@ -780,7 +781,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
780
781
|
'aria-describedby': ariaDescribedByProp,
|
|
781
782
|
'aria-labelledby': ariaLabelledByProp,
|
|
782
783
|
...restProps
|
|
783
|
-
}:
|
|
784
|
+
}: TokenizerProps<T> | TokenizerExperimentalProps<T>): React.JSX.Element {
|
|
784
785
|
const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
|
|
785
786
|
const {rest, container} = useFieldInputStyling('Tokenizer', restProps, {
|
|
786
787
|
containerXstyle,
|
|
@@ -843,6 +844,17 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
843
844
|
},
|
|
844
845
|
[onChangeQuery],
|
|
845
846
|
);
|
|
847
|
+
// Save's one report. The sheet announced each edit as it happened, so
|
|
848
|
+
// nothing is announced here; a field that is disabled at Save reports
|
|
849
|
+
// nothing.
|
|
850
|
+
const handleSheetCommit = useCallback(
|
|
851
|
+
(items: T[], change: SheetDraftChange<T>) => {
|
|
852
|
+
if (!isDisabled) {
|
|
853
|
+
onChange(items, change);
|
|
854
|
+
}
|
|
855
|
+
},
|
|
856
|
+
[isDisabled, onChange],
|
|
857
|
+
);
|
|
846
858
|
// Set around a focus move the field makes itself — a presentation swap
|
|
847
859
|
// handing focus from one control to the other — so the receiving control
|
|
848
860
|
// does not report it as focus entering from outside.
|
|
@@ -1008,11 +1020,18 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1008
1020
|
// `endContent`, a clear button, or all three — so its width is measured
|
|
1009
1021
|
// rather than assumed, and the input reserves it.
|
|
1010
1022
|
const [laneRef, laneReserve] = useEndLaneReserve(END_LANE_INSET);
|
|
1023
|
+
// A composing component can lock tokens (PowerSearch's read-only filters
|
|
1024
|
+
// and read-only field). No remove path removes a locked token.
|
|
1025
|
+
const isItemRemovable = use(TokenizerItemRemovableContext);
|
|
1026
|
+
const canRemoveItem = useCallback(
|
|
1027
|
+
(item: T) => isItemRemovable?.(item) ?? true,
|
|
1028
|
+
[isItemRemovable],
|
|
1029
|
+
);
|
|
1011
1030
|
// The half of the lane's contents this component knows about. The busy half
|
|
1012
1031
|
// is the leaf's own business — folding it in here would mean reading the
|
|
1013
1032
|
// busy state during this render, which is exactly the re-render the store
|
|
1014
1033
|
// exists to avoid.
|
|
1015
|
-
const hasClearButton = hasClear &&
|
|
1034
|
+
const hasClearButton = hasClear && !isDisabled && value.some(canRemoveItem);
|
|
1016
1035
|
const hasStaticEndLane = Boolean(endContent || hasClearButton);
|
|
1017
1036
|
const [isFocusedWithin, setIsFocusedWithin] = useState(false);
|
|
1018
1037
|
const isTruncated =
|
|
@@ -1264,7 +1283,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1264
1283
|
// announcement covers both.
|
|
1265
1284
|
const handleRemove = useCallback(
|
|
1266
1285
|
(item: T, options?: {silent?: boolean}): boolean => {
|
|
1267
|
-
if (isDisabled) {
|
|
1286
|
+
if (isDisabled || !canRemoveItem(item)) {
|
|
1268
1287
|
return false;
|
|
1269
1288
|
}
|
|
1270
1289
|
const newItems = value.filter(v => v.id !== item.id);
|
|
@@ -1275,22 +1294,25 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1275
1294
|
inputRef.current?.focus();
|
|
1276
1295
|
return true;
|
|
1277
1296
|
},
|
|
1278
|
-
[value, onChange, isDisabled, announce, t],
|
|
1297
|
+
[value, onChange, isDisabled, canRemoveItem, announce, t],
|
|
1279
1298
|
);
|
|
1280
1299
|
|
|
1281
|
-
// Handle clearing all items
|
|
1282
1300
|
// A composing component that words its own Clear all (PowerSearch) provides
|
|
1283
1301
|
// its words; otherwise the field's own (component:Tokenizer AR7).
|
|
1284
1302
|
const clearAllMessage =
|
|
1285
1303
|
use(TokenizerClearAllMessageContext) ?? t('@astryx.tokenizer.allRemoved');
|
|
1286
1304
|
const handleClearAll = useCallback(
|
|
1287
1305
|
(options?: {silent?: boolean}) => {
|
|
1288
|
-
|
|
1306
|
+
const removedItems = value.filter(canRemoveItem);
|
|
1307
|
+
if (isDisabled || removedItems.length === 0) {
|
|
1289
1308
|
return;
|
|
1290
1309
|
}
|
|
1291
|
-
//
|
|
1292
|
-
const
|
|
1293
|
-
onChange(
|
|
1310
|
+
// onChange names one item. Clear all names the last one it removes.
|
|
1311
|
+
const lastRemovedItem = removedItems[removedItems.length - 1];
|
|
1312
|
+
onChange(
|
|
1313
|
+
value.filter(item => !canRemoveItem(item)),
|
|
1314
|
+
{item: lastRemovedItem, type: 'remove'},
|
|
1315
|
+
);
|
|
1294
1316
|
// Focus moves to the input, so the emptied selection is announced, in
|
|
1295
1317
|
// the sheet's words (WCAG 4.1.3). The sheet announces its own Clear all.
|
|
1296
1318
|
if (!options?.silent) {
|
|
@@ -1298,7 +1320,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1298
1320
|
}
|
|
1299
1321
|
inputRef.current?.focus();
|
|
1300
1322
|
},
|
|
1301
|
-
[value, onChange, isDisabled, announce, clearAllMessage],
|
|
1323
|
+
[value, onChange, isDisabled, canRemoveItem, announce, clearAllMessage],
|
|
1302
1324
|
);
|
|
1303
1325
|
|
|
1304
1326
|
// Handle backspace on empty input — remove last token
|
|
@@ -1361,7 +1383,7 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1361
1383
|
key={item.id}
|
|
1362
1384
|
label={item.label}
|
|
1363
1385
|
size={size}
|
|
1364
|
-
onRemove={isDisabled ? undefined : onRemoveItem}
|
|
1386
|
+
onRemove={isDisabled || !canRemoveItem(item) ? undefined : onRemoveItem}
|
|
1365
1387
|
isDisabled={isDisabled}
|
|
1366
1388
|
xstyle={styles.token}
|
|
1367
1389
|
/>
|
|
@@ -1706,15 +1728,13 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1706
1728
|
label={label}
|
|
1707
1729
|
searchSource={searchSource}
|
|
1708
1730
|
value={value}
|
|
1709
|
-
|
|
1731
|
+
maxEntries={maxEntries}
|
|
1710
1732
|
hasCreate={hasCreate}
|
|
1711
1733
|
maxMenuItems={maxMenuItems ?? 10}
|
|
1712
1734
|
minQueryLength={minQueryLength ?? 1}
|
|
1713
1735
|
debounceMs={debounceMs ?? 150}
|
|
1714
1736
|
emptySearchText={emptySearchText}
|
|
1715
|
-
|
|
1716
|
-
onRemove={handleRemove}
|
|
1717
|
-
onClearAll={() => handleClearAll({silent: true})}
|
|
1737
|
+
onCommit={handleSheetCommit}
|
|
1718
1738
|
onChangeQuery={handleSheetQueryChange}
|
|
1719
1739
|
/>
|
|
1720
1740
|
)}
|
|
@@ -1821,19 +1841,3 @@ export function Tokenizer<T extends SearchableItem>({
|
|
|
1821
1841
|
}
|
|
1822
1842
|
|
|
1823
1843
|
Tokenizer.displayName = 'Tokenizer';
|
|
1824
|
-
|
|
1825
|
-
/**
|
|
1826
|
-
* The same component with the sheet presentation reachable: `experimental`
|
|
1827
|
-
* (`presentation: 'popover' | 'bottom-sheet' | 'adaptive'`) and a `ref` that
|
|
1828
|
-
* also takes the trigger button. Not public — re-exported only by
|
|
1829
|
-
* `@astryxdesign/core/internal/tokenizer-presentation`, the entry reserved
|
|
1830
|
-
* for Astryx's own packages (`architecture:react-component-runtime` INV13),
|
|
1831
|
-
* while the sheet's user experience is being finished (`component:Tokenizer`
|
|
1832
|
-
* DEC-3). The public `Tokenizer` renders the popover presentation for every
|
|
1833
|
-
* field.
|
|
1834
|
-
*/
|
|
1835
|
-
export const TokenizerWithPresentation = Tokenizer as <
|
|
1836
|
-
T extends SearchableItem,
|
|
1837
|
-
>(
|
|
1838
|
-
props: TokenizerWithPresentationProps<T>,
|
|
1839
|
-
) => React.JSX.Element;
|