@cube-dev/ui-kit 0.142.9 → 0.143.0
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/README.md +1 -1
- package/dist/CHANGELOG.md +29 -0
- package/dist/README.md +1 -1
- package/dist/_internal/hooks/use-chained-callback.js +1 -1
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.js +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.js +11 -2
- package/dist/components/content/Item/Item.js.map +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +1 -1
- package/dist/components/content/Tree/TreeNode.js +8 -2
- package/dist/components/content/Tree/TreeNode.js.map +1 -1
- package/dist/components/content/Tree/styled.js +2 -1
- package/dist/components/content/Tree/styled.js.map +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +17 -213
- package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.d.ts +99 -0
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +402 -0
- package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +1 -0
- package/dist/components/fields/CommandTextArea/caretPosition.js +89 -0
- package/dist/components/fields/CommandTextArea/caretPosition.js.map +1 -0
- package/dist/components/fields/CommandTextArea/index.d.ts +2 -0
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js +68 -0
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js.map +1 -0
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/intl.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
- package/dist/components/fields/ListBox/ListBox.d.ts +5 -0
- package/dist/components/fields/ListBox/ListBox.js +10 -4
- package/dist/components/fields/ListBox/ListBox.js.map +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.d.ts +5 -0
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +164 -0
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +1 -0
- package/dist/components/fields/ListBoxPopover/index.d.ts +4 -0
- package/dist/components/fields/ListBoxPopover/listNavigation.d.ts +24 -0
- package/dist/components/fields/ListBoxPopover/listNavigation.js +102 -0
- package/dist/components/fields/ListBoxPopover/listNavigation.js.map +1 -0
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +2 -0
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +53 -0
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js.map +1 -0
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +8 -4
- package/dist/components/fields/NumberInput/StepButton.js.map +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/index.d.ts +2 -0
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +2 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js.map +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.d.ts +2 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +4 -6
- package/dist/components/overlays/Notifications/NotificationAction.js.map +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +34 -20
- package/dist/components/overlays/Notifications/NotificationCard.js.map +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/palette.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +3 -3
- package/docs/components/fields/CommandTextArea.md +153 -0
- package/docs/tasty/dsl.md +110 -1
- package/docs/tasty/pipeline.md +40 -2
- package/package.json +7 -20
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
|
+
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
|
+
import { DisplayTransition } from "../../helpers/DisplayTransition/DisplayTransition.js";
|
|
4
|
+
import { Portal } from "../../portal/Portal.js";
|
|
5
|
+
import { ListBox } from "../ListBox/ListBox.js";
|
|
6
|
+
import { tasty } from "@tenphi/tasty";
|
|
7
|
+
import React, { useCallback, useEffect, useRef } from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
import { useOverlay, useOverlayPosition } from "react-aria";
|
|
10
|
+
|
|
11
|
+
//#region src/components/fields/ListBoxPopover/ListBoxPopover.tsx
|
|
12
|
+
const ListBoxPopoverWrapper = tasty({
|
|
13
|
+
qa: "ComboBoxOverlayWrapper",
|
|
14
|
+
styles: {
|
|
15
|
+
position: "absolute",
|
|
16
|
+
zIndex: 1e3
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const ListBoxPopoverElement = tasty({
|
|
20
|
+
qa: "ComboBoxOverlay",
|
|
21
|
+
styles: {
|
|
22
|
+
display: "grid",
|
|
23
|
+
gridRows: "1sf",
|
|
24
|
+
gridColumns: "1sf",
|
|
25
|
+
width: "$overlay-min-width max-content 50vw",
|
|
26
|
+
height: "initial max-content (50vh - 5x)",
|
|
27
|
+
overflow: "auto",
|
|
28
|
+
fill: "#surface",
|
|
29
|
+
radius: "1cr",
|
|
30
|
+
shadow: true,
|
|
31
|
+
padding: "0",
|
|
32
|
+
border: "#border",
|
|
33
|
+
hide: {
|
|
34
|
+
"": false,
|
|
35
|
+
hidden: true
|
|
36
|
+
},
|
|
37
|
+
boxSizing: "border-box",
|
|
38
|
+
transition: "translate $transition ease-out, scale $transition ease-out, theme $transition ease-out",
|
|
39
|
+
translate: {
|
|
40
|
+
"": "0 0",
|
|
41
|
+
"open & [data-placement=\"top\"]": "0 0",
|
|
42
|
+
"!open & [data-placement=\"top\"]": "0 1x",
|
|
43
|
+
"open & ([data-placement=\"bottom\"] | ![data-placement])": "0 0",
|
|
44
|
+
"!open & ([data-placement=\"bottom\"] | ![data-placement])": "0 -1x"
|
|
45
|
+
},
|
|
46
|
+
transformOrigin: {
|
|
47
|
+
"": "top center",
|
|
48
|
+
"[data-placement=\"top\"]": "bottom center"
|
|
49
|
+
},
|
|
50
|
+
scale: {
|
|
51
|
+
"": "1 1",
|
|
52
|
+
"!open": "1 .9"
|
|
53
|
+
},
|
|
54
|
+
opacity: {
|
|
55
|
+
"": 1,
|
|
56
|
+
"!open": .001
|
|
57
|
+
},
|
|
58
|
+
"$overlay-min-width": "min 30x"
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const ListBoxPopover = function ListBoxPopover(props) {
|
|
62
|
+
const { isOpen, triggerRef, popoverRef, listBoxRef, direction, shouldFlip, overlayOffset, containerPadding, comboBoxWidth, listBoxId, overlayStyles, listBoxStyles, optionStyles, optionHighlight, sectionStyles, headingStyles, selectedKey, isDisabled, disabledKeys, items, children, listStateRef, onSelectionChange, onClose, label, ariaLabel, compositeFocusProps, filter, size = "medium", positionTargetRef, positionApiRef } = props;
|
|
63
|
+
const mergedPopoverRef = popoverRef;
|
|
64
|
+
const overlayScrollRef = useRef(null);
|
|
65
|
+
const { overlayProps: overlayPositionProps, placement, updatePosition } = useOverlayPosition({
|
|
66
|
+
targetRef: positionTargetRef ?? triggerRef,
|
|
67
|
+
overlayRef: mergedPopoverRef,
|
|
68
|
+
scrollRef: overlayScrollRef,
|
|
69
|
+
placement: `${direction} start`,
|
|
70
|
+
shouldFlip,
|
|
71
|
+
isOpen,
|
|
72
|
+
offset: overlayOffset,
|
|
73
|
+
containerPadding
|
|
74
|
+
});
|
|
75
|
+
const { maxHeight, maxWidth, ...positionStyle } = overlayPositionProps.style ?? {};
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
if (positionApiRef) positionApiRef.current = { updatePosition };
|
|
78
|
+
return () => {
|
|
79
|
+
if (positionApiRef) positionApiRef.current = null;
|
|
80
|
+
};
|
|
81
|
+
}, [positionApiRef, updatePosition]);
|
|
82
|
+
const { overlayProps: overlayBehaviorProps } = useOverlay({
|
|
83
|
+
onClose,
|
|
84
|
+
shouldCloseOnBlur: true,
|
|
85
|
+
isOpen,
|
|
86
|
+
isDismissable: true,
|
|
87
|
+
shouldCloseOnInteractOutside: (el) => {
|
|
88
|
+
const menuTriggerEl = el.closest("[data-popover-trigger]");
|
|
89
|
+
if (!menuTriggerEl) {
|
|
90
|
+
if (el.closest("[data-popover-keep]")) return false;
|
|
91
|
+
if (el.closest("[data-popover-dismiss]")) {
|
|
92
|
+
setTimeout(onClose, 0);
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
if (menuTriggerEl === triggerRef?.current) return true;
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}, mergedPopoverRef);
|
|
101
|
+
const placementDirection = placement?.split(" ")[0] || direction;
|
|
102
|
+
const transitionRefHolder = useRef(null);
|
|
103
|
+
const setScrollRef = useCallback((node) => {
|
|
104
|
+
overlayScrollRef.current = node;
|
|
105
|
+
transitionRefHolder.current?.(node);
|
|
106
|
+
}, []);
|
|
107
|
+
return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(DisplayTransition, {
|
|
108
|
+
isShown: isOpen,
|
|
109
|
+
children: ({ phase, isShown, ref: transitionRef }) => {
|
|
110
|
+
transitionRefHolder.current = transitionRef;
|
|
111
|
+
return /* @__PURE__ */ jsx(ListBoxPopoverWrapper, {
|
|
112
|
+
...mergeProps$1({
|
|
113
|
+
...overlayPositionProps,
|
|
114
|
+
style: positionStyle
|
|
115
|
+
}, overlayBehaviorProps, compositeFocusProps),
|
|
116
|
+
ref: mergedPopoverRef,
|
|
117
|
+
style: positionStyle,
|
|
118
|
+
children: /* @__PURE__ */ jsx(ListBoxPopoverElement, {
|
|
119
|
+
ref: setScrollRef,
|
|
120
|
+
"data-placement": placementDirection,
|
|
121
|
+
"data-phase": phase,
|
|
122
|
+
mods: {
|
|
123
|
+
open: isShown,
|
|
124
|
+
hidden: phase === "unmounted"
|
|
125
|
+
},
|
|
126
|
+
styles: overlayStyles,
|
|
127
|
+
style: {
|
|
128
|
+
"--overlay-min-width": comboBoxWidth ? `${comboBoxWidth}px` : void 0,
|
|
129
|
+
maxHeight,
|
|
130
|
+
maxWidth
|
|
131
|
+
},
|
|
132
|
+
children: /* @__PURE__ */ jsx(ListBox, {
|
|
133
|
+
ref: listBoxRef,
|
|
134
|
+
focusOnHover: true,
|
|
135
|
+
disableSelectionToggle: true,
|
|
136
|
+
id: listBoxId,
|
|
137
|
+
"aria-label": ariaLabel || (typeof label === "string" ? label : "Options"),
|
|
138
|
+
selectedKey,
|
|
139
|
+
selectionMode: "single",
|
|
140
|
+
isDisabled,
|
|
141
|
+
disabledKeys,
|
|
142
|
+
shouldUseVirtualFocus: true,
|
|
143
|
+
items,
|
|
144
|
+
filter,
|
|
145
|
+
styles: listBoxStyles,
|
|
146
|
+
optionStyles,
|
|
147
|
+
optionHighlight,
|
|
148
|
+
sectionStyles,
|
|
149
|
+
headingStyles,
|
|
150
|
+
stateRef: listStateRef,
|
|
151
|
+
size: "medium",
|
|
152
|
+
shape: "popover",
|
|
153
|
+
onSelectionChange,
|
|
154
|
+
children
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}) });
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
//#endregion
|
|
163
|
+
export { ListBoxPopover };
|
|
164
|
+
//# sourceMappingURL=ListBoxPopover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListBoxPopover.js","names":["mergeProps"],"sources":["../../../../src/components/fields/ListBoxPopover/ListBoxPopover.tsx"],"sourcesContent":["import { Key } from '@react-types/shared';\nimport { Styles, tasty } from '@tenphi/tasty';\nimport React, {\n CSSProperties,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useRef,\n} from 'react';\nimport { useOverlay, useOverlayPosition } from 'react-aria';\n\nimport { mergeProps } from '../../../utils/react';\nimport { DisplayTransition } from '../../helpers';\nimport { Portal } from '../../portal';\nimport { ListBox } from '../ListBox/ListBox';\n\nexport interface ListBoxPopoverProps {\n isOpen: boolean;\n triggerRef: RefObject<HTMLElement>;\n popoverRef: RefObject<HTMLDivElement>;\n listBoxRef: RefObject<HTMLDivElement>;\n direction: 'bottom' | 'top';\n shouldFlip: boolean;\n overlayOffset: number;\n containerPadding: number;\n /** Min width (px) for the overlay; usually the trigger's width. */\n comboBoxWidth?: number;\n /** Stable id used for the ListBox element and aria-controls wiring. */\n listBoxId: string;\n overlayStyles?: Styles;\n listBoxStyles?: Styles;\n optionStyles?: Styles;\n /** Substring to highlight within each option's (text) children. */\n optionHighlight?: string;\n sectionStyles?: Styles;\n headingStyles?: Styles;\n selectedKey?: Key | null;\n isDisabled?: boolean;\n disabledKeys?: Iterable<Key>;\n items?: Iterable<any>;\n children: ReactNode;\n /** Ref through which the ListBox exposes its internal list state. */\n listStateRef: RefObject<any>;\n onSelectionChange: (selection: Key | Key[] | null) => void;\n onClose: () => void;\n label?: ReactNode;\n ariaLabel?: string;\n compositeFocusProps: {\n onFocus: (e: React.FocusEvent) => void;\n onBlur: (e: React.FocusEvent) => void;\n };\n /** Collection node filter applied to the ListBox. */\n filter?: (nodes: Iterable<any>) => Iterable<any>;\n size?: 'small' | 'medium' | 'large' | (string & {});\n /**\n * Element to anchor the overlay to geometrically. Defaults to `triggerRef`.\n * Use this to anchor to something other than the trigger (e.g. the caret in\n * a textarea) while keeping `triggerRef` for outside-click/dismiss logic.\n */\n positionTargetRef?: RefObject<Element | null>;\n /**\n * Receives an imperative handle exposing `updatePosition()` so the caller can\n * force the overlay to re-anchor (e.g. when the caret moves).\n */\n positionApiRef?: RefObject<{ updatePosition: () => void } | null>;\n}\n\nconst ListBoxPopoverWrapper = tasty({\n qa: 'ComboBoxOverlayWrapper',\n styles: {\n position: 'absolute',\n zIndex: 1000,\n },\n});\n\nconst ListBoxPopoverElement = tasty({\n qa: 'ComboBoxOverlay',\n styles: {\n display: 'grid',\n gridRows: '1sf',\n gridColumns: '1sf',\n width: '$overlay-min-width max-content 50vw',\n height: 'initial max-content (50vh - 5x)',\n overflow: 'auto',\n fill: '#surface',\n radius: '1cr',\n shadow: true,\n padding: '0',\n border: '#border',\n hide: {\n '': false,\n hidden: true,\n },\n boxSizing: 'border-box',\n transition:\n 'translate $transition ease-out, scale $transition ease-out, theme $transition ease-out',\n translate: {\n '': '0 0',\n 'open & [data-placement=\"top\"]': '0 0',\n '!open & [data-placement=\"top\"]': '0 1x',\n 'open & ([data-placement=\"bottom\"] | ![data-placement])': '0 0',\n '!open & ([data-placement=\"bottom\"] | ![data-placement])': '0 -1x',\n },\n transformOrigin: {\n '': 'top center',\n '[data-placement=\"top\"]': 'bottom center',\n },\n scale: {\n '': '1 1',\n '!open': '1 .9',\n },\n opacity: {\n '': 1,\n '!open': 0.001,\n },\n\n '$overlay-min-width': 'min 30x',\n },\n});\n\nexport const ListBoxPopover = function ListBoxPopover(\n props: ListBoxPopoverProps,\n) {\n const {\n isOpen,\n triggerRef,\n popoverRef,\n listBoxRef,\n direction,\n shouldFlip,\n overlayOffset,\n containerPadding,\n comboBoxWidth,\n listBoxId,\n overlayStyles,\n listBoxStyles,\n optionStyles,\n optionHighlight,\n sectionStyles,\n headingStyles,\n selectedKey,\n isDisabled,\n disabledKeys,\n items,\n children,\n listStateRef,\n onSelectionChange,\n onClose,\n label,\n ariaLabel,\n compositeFocusProps,\n filter,\n size = 'medium',\n positionTargetRef,\n positionApiRef,\n } = props;\n\n const mergedPopoverRef = popoverRef;\n\n // Ref to the inner scrollable element (the visible popover). react-aria\n // measures this for its flip/shrink math and writes maxHeight onto the\n // overlay (positioning wrapper); we forward that maxHeight to this element\n // below so the scroll container actually shrinks instead of overflowing.\n const overlayScrollRef = useRef<HTMLDivElement | null>(null);\n\n // Overlay positioning — anchor to the explicit position target when given\n // (e.g. a caret anchor), otherwise to the trigger. `triggerRef` is still\n // used below for outside-click/dismiss behavior.\n const {\n overlayProps: overlayPositionProps,\n placement,\n updatePosition,\n } = useOverlayPosition({\n targetRef: (positionTargetRef ?? triggerRef) as any,\n overlayRef: mergedPopoverRef as any,\n scrollRef: overlayScrollRef as any,\n placement: `${direction} start` as any,\n shouldFlip,\n isOpen,\n offset: overlayOffset,\n containerPadding: containerPadding,\n });\n\n // Keep positioning (top/left/zIndex) on the wrapper, but split out the\n // available-space cap so it can be applied to the inner scroll element.\n const { maxHeight, maxWidth, ...positionStyle } =\n (overlayPositionProps.style ?? {}) as CSSProperties;\n\n // Expose updatePosition so callers can re-anchor on demand (e.g. caret move).\n useEffect(() => {\n if (positionApiRef) {\n positionApiRef.current = { updatePosition };\n }\n return () => {\n if (positionApiRef) {\n positionApiRef.current = null;\n }\n };\n }, [positionApiRef, updatePosition]);\n\n // Overlay behavior (dismiss on outside click, escape)\n const { overlayProps: overlayBehaviorProps } = useOverlay(\n {\n onClose,\n shouldCloseOnBlur: true,\n isOpen,\n isDismissable: true,\n shouldCloseOnInteractOutside: (el) => {\n const menuTriggerEl = el.closest('[data-popover-trigger]');\n if (!menuTriggerEl) {\n if (el.closest('[data-popover-keep]')) return false;\n // Plain interactive controls (Button, ItemButton) opt in via\n // `data-popover-dismiss` to dismiss us without losing their click\n // to useOverlay's stopPropagation. Schedule the close after the\n // click finishes so the button's onPress runs first.\n if (el.closest('[data-popover-dismiss]')) {\n setTimeout(onClose, 0);\n return false;\n }\n return true;\n }\n if (menuTriggerEl === triggerRef?.current) return true;\n return false;\n },\n },\n mergedPopoverRef as any,\n );\n\n // Extract primary placement direction for consistent styling\n const placementDirection = placement?.split(' ')[0] || direction;\n\n // Hold the DisplayTransition ref so we can bind the same node to both the\n // transition listener and our scroll ref via a single stable callback.\n const transitionRefHolder = useRef<\n ((node: HTMLElement | null) => void) | null\n >(null);\n const setScrollRef = useCallback((node: HTMLElement | null) => {\n overlayScrollRef.current = node as HTMLDivElement | null;\n transitionRefHolder.current?.(node);\n }, []);\n\n const overlayContent = (\n <DisplayTransition isShown={isOpen}>\n {({ phase, isShown, ref: transitionRef }) => {\n transitionRefHolder.current = transitionRef;\n return (\n <ListBoxPopoverWrapper\n {...mergeProps(\n { ...overlayPositionProps, style: positionStyle },\n overlayBehaviorProps,\n compositeFocusProps,\n )}\n ref={mergedPopoverRef}\n style={positionStyle}\n >\n <ListBoxPopoverElement\n ref={setScrollRef}\n data-placement={placementDirection}\n data-phase={phase}\n mods={{\n open: isShown,\n hidden: phase === 'unmounted',\n }}\n styles={overlayStyles}\n style={{\n '--overlay-min-width': comboBoxWidth\n ? `${comboBoxWidth}px`\n : undefined,\n maxHeight,\n maxWidth,\n }}\n >\n <ListBox\n ref={listBoxRef}\n focusOnHover\n disableSelectionToggle\n id={listBoxId}\n aria-label={\n ariaLabel || (typeof label === 'string' ? label : 'Options')\n }\n selectedKey={selectedKey}\n selectionMode=\"single\"\n isDisabled={isDisabled}\n disabledKeys={disabledKeys}\n shouldUseVirtualFocus={true}\n items={items as any}\n filter={filter}\n styles={listBoxStyles}\n optionStyles={optionStyles}\n optionHighlight={optionHighlight}\n sectionStyles={sectionStyles}\n headingStyles={headingStyles}\n stateRef={listStateRef}\n size=\"medium\"\n shape=\"popover\"\n onSelectionChange={onSelectionChange}\n >\n {children as any}\n </ListBox>\n </ListBoxPopoverElement>\n </ListBoxPopoverWrapper>\n );\n }}\n </DisplayTransition>\n );\n\n return <Portal>{overlayContent}</Portal>;\n};\n"],"mappings":";;;;;;;;;;;AAoEA,MAAM,wBAAwB,MAAM;CAClC,IAAI;CACJ,QAAQ;EACN,UAAU;EACV,QAAQ;EACT;CACF,CAAC;AAEF,MAAM,wBAAwB,MAAM;CAClC,IAAI;CACJ,QAAQ;EACN,SAAS;EACT,UAAU;EACV,aAAa;EACb,OAAO;EACP,QAAQ;EACR,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,SAAS;EACT,QAAQ;EACR,MAAM;GACJ,IAAI;GACJ,QAAQ;GACT;EACD,WAAW;EACX,YACE;EACF,WAAW;GACT,IAAI;GACJ,mCAAiC;GACjC,oCAAkC;GAClC,4DAA0D;GAC1D,6DAA2D;GAC5D;EACD,iBAAiB;GACf,IAAI;GACJ,4BAA0B;GAC3B;EACD,OAAO;GACL,IAAI;GACJ,SAAS;GACV;EACD,SAAS;GACP,IAAI;GACJ,SAAS;GACV;EAED,sBAAsB;EACvB;CACF,CAAC;AAEF,MAAa,iBAAiB,SAAS,eACrC,OACA;CACA,MAAM,EACJ,QACA,YACA,YACA,YACA,WACA,YACA,eACA,kBACA,eACA,WACA,eACA,eACA,cACA,iBACA,eACA,eACA,aACA,YACA,cACA,OACA,UACA,cACA,mBACA,SACA,OACA,WACA,qBACA,QACA,OAAO,UACP,mBACA,mBACE;CAEJ,MAAM,mBAAmB;CAMzB,MAAM,mBAAmB,OAA8B,KAAK;CAK5D,MAAM,EACJ,cAAc,sBACd,WACA,mBACE,mBAAmB;EACrB,WAAY,qBAAqB;EACjC,YAAY;EACZ,WAAW;EACX,WAAW,GAAG,UAAU;EACxB;EACA;EACA,QAAQ;EACU;EACnB,CAAC;CAIF,MAAM,EAAE,WAAW,UAAU,GAAG,kBAC7B,qBAAqB,SAAS,EAAE;AAGnC,iBAAgB;AACd,MAAI,eACF,gBAAe,UAAU,EAAE,gBAAgB;AAE7C,eAAa;AACX,OAAI,eACF,gBAAe,UAAU;;IAG5B,CAAC,gBAAgB,eAAe,CAAC;CAGpC,MAAM,EAAE,cAAc,yBAAyB,WAC7C;EACE;EACA,mBAAmB;EACnB;EACA,eAAe;EACf,+BAA+B,OAAO;GACpC,MAAM,gBAAgB,GAAG,QAAQ,yBAAyB;AAC1D,OAAI,CAAC,eAAe;AAClB,QAAI,GAAG,QAAQ,sBAAsB,CAAE,QAAO;AAK9C,QAAI,GAAG,QAAQ,yBAAyB,EAAE;AACxC,gBAAW,SAAS,EAAE;AACtB,YAAO;;AAET,WAAO;;AAET,OAAI,kBAAkB,YAAY,QAAS,QAAO;AAClD,UAAO;;EAEV,EACD,iBACD;CAGD,MAAM,qBAAqB,WAAW,MAAM,IAAI,CAAC,MAAM;CAIvD,MAAM,sBAAsB,OAE1B,KAAK;CACP,MAAM,eAAe,aAAa,SAA6B;AAC7D,mBAAiB,UAAU;AAC3B,sBAAoB,UAAU,KAAK;IAClC,EAAE,CAAC;AAmEN,QAAO,oBAAC,oBAhEN,oBAAC;EAAkB,SAAS;aACxB,EAAE,OAAO,SAAS,KAAK,oBAAoB;AAC3C,uBAAoB,UAAU;AAC9B,UACE,oBAAC;IACC,GAAIA,aACF;KAAE,GAAG;KAAsB,OAAO;KAAe,EACjD,sBACA,oBACD;IACD,KAAK;IACL,OAAO;cAEP,oBAAC;KACC,KAAK;KACL,kBAAgB;KAChB,cAAY;KACZ,MAAM;MACJ,MAAM;MACN,QAAQ,UAAU;MACnB;KACD,QAAQ;KACR,OAAO;MACL,uBAAuB,gBACnB,GAAG,cAAc,MACjB;MACJ;MACA;MACD;eAED,oBAAC;MACC,KAAK;MACL;MACA;MACA,IAAI;MACJ,cACE,cAAc,OAAO,UAAU,WAAW,QAAQ;MAEvC;MACb,eAAc;MACF;MACE;MACd,uBAAuB;MAChB;MACC;MACR,QAAQ;MACM;MACG;MACF;MACA;MACf,UAAU;MACV,MAAK;MACL,OAAM;MACa;MAElB;OACO;MACY;KACF;;GAGV,GAGkB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
|
|
2
|
+
import { Key } from "@react-types/shared";
|
|
3
|
+
|
|
4
|
+
//#region src/components/fields/ListBoxPopover/listNavigation.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Minimal view of a React Stately list state. Kept structural (no imports from
|
|
7
|
+
* `react-stately`) so the helpers can be used from any collection-backed
|
|
8
|
+
* component without dragging extra types in.
|
|
9
|
+
*/
|
|
10
|
+
interface ListStateLike {
|
|
11
|
+
selectionManager: {
|
|
12
|
+
focusedKey: Key | null;
|
|
13
|
+
setFocusedKey: (key: Key | null) => void;
|
|
14
|
+
};
|
|
15
|
+
collection: Iterable<any>;
|
|
16
|
+
disabledKeys?: Set<Key>;
|
|
17
|
+
lastFocusSourceRef?: {
|
|
18
|
+
current: 'keyboard' | 'mouse' | 'other';
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
type TextFilterFn = (textValue: string, inputValue: string) => boolean;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { ListStateLike, TextFilterFn };
|
|
24
|
+
//# sourceMappingURL=listNavigation.d.ts.map
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
|
+
//#region src/components/fields/ListBoxPopover/listNavigation.ts
|
|
3
|
+
/**
|
|
4
|
+
* Walks a collection (possibly nested under sections) and collects the keys of
|
|
5
|
+
* selectable items, skipping disabled ones. Mirrors the inline walker that
|
|
6
|
+
* used to live in `useComboBoxKeyboard`.
|
|
7
|
+
*/
|
|
8
|
+
function collectVisibleKeys(nodes, out, disabledKeys) {
|
|
9
|
+
for (const node of nodes) if (node.type === "item") {
|
|
10
|
+
if (!disabledKeys?.has(node.key)) out.push(node.key);
|
|
11
|
+
} else if (node.childNodes) collectVisibleKeys(node.childNodes, out, disabledKeys);
|
|
12
|
+
}
|
|
13
|
+
/** Convenience: returns the flat list of selectable keys for a list state. */
|
|
14
|
+
function getVisibleKeys(listState) {
|
|
15
|
+
const keys = [];
|
|
16
|
+
collectVisibleKeys(listState.collection, keys, listState.disabledKeys);
|
|
17
|
+
return keys;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Computes the next key to focus when navigating with ArrowUp/ArrowDown.
|
|
21
|
+
*
|
|
22
|
+
* - If `fromKey` is omitted, reads `selectionManager.focusedKey`.
|
|
23
|
+
* - When nothing is focused (or the focused key is no longer visible), falls
|
|
24
|
+
* back to the first/last visible key depending on `direction`.
|
|
25
|
+
* - When the current key is the boundary, either returns `null` (default) or
|
|
26
|
+
* wraps to the opposite edge when `opts.wrap` is true.
|
|
27
|
+
*/
|
|
28
|
+
function getNextVisibleKey(listState, direction, opts) {
|
|
29
|
+
const visibleKeys = getVisibleKeys(listState);
|
|
30
|
+
if (visibleKeys.length === 0) return null;
|
|
31
|
+
const isForward = direction === 1;
|
|
32
|
+
const currentKey = opts?.fromKey ?? listState.selectionManager.focusedKey;
|
|
33
|
+
if (currentKey == null) return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];
|
|
34
|
+
const currentIndex = visibleKeys.indexOf(currentKey);
|
|
35
|
+
if (currentIndex === -1) return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];
|
|
36
|
+
const newIndex = currentIndex + direction;
|
|
37
|
+
if (newIndex >= 0 && newIndex < visibleKeys.length) return visibleKeys[newIndex];
|
|
38
|
+
if (opts?.wrap) return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
/** Returns the first or last selectable key. */
|
|
42
|
+
function getEdgeVisibleKey(listState, edge) {
|
|
43
|
+
const visibleKeys = getVisibleKeys(listState);
|
|
44
|
+
if (visibleKeys.length === 0) return null;
|
|
45
|
+
return edge === "first" ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Marks a focus change as keyboard-driven so the underlying ListBox scrolls the
|
|
49
|
+
* highlighted option into view. No-op when the list state doesn't expose a
|
|
50
|
+
* `lastFocusSourceRef`.
|
|
51
|
+
*/
|
|
52
|
+
function markKeyboardFocus(listState) {
|
|
53
|
+
if (listState.lastFocusSourceRef) listState.lastFocusSourceRef.current = "keyboard";
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Collects the strings a node can be matched against. Always includes the
|
|
57
|
+
* node's `textValue`; when `matchExtraFields` is set, also includes any
|
|
58
|
+
* plain-text `children` and `description` props. Non-string children/description
|
|
59
|
+
* (e.g. React elements) are ignored since we can't reliably read their text.
|
|
60
|
+
*/
|
|
61
|
+
function getSearchableStrings(node, matchExtraFields) {
|
|
62
|
+
const strings = [];
|
|
63
|
+
if (node.textValue) strings.push(node.textValue);
|
|
64
|
+
if (matchExtraFields) {
|
|
65
|
+
const props = node.props;
|
|
66
|
+
if (props) {
|
|
67
|
+
if (typeof props.children === "string") strings.push(props.children);
|
|
68
|
+
if (typeof props.description === "string") strings.push(props.description);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return strings.length > 0 ? strings : [node.textValue || ""];
|
|
72
|
+
}
|
|
73
|
+
/** True when the term matches any of the node's searchable strings. */
|
|
74
|
+
function nodeMatchesTerm(node, term, textFilterFn, matchExtraFields) {
|
|
75
|
+
return getSearchableStrings(node, matchExtraFields).some((text) => textFilterFn(text, term));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Filters collection nodes by a search term while preserving section structure.
|
|
79
|
+
* By default a node matches only when the term matches its `textValue`; pass
|
|
80
|
+
* `{ matchExtraFields: true }` to also match its plain-text `children` and
|
|
81
|
+
* `description`. Sections whose children all fail the filter are dropped.
|
|
82
|
+
*/
|
|
83
|
+
function filterCollectionNodes(nodes, term, textFilterFn, options = {}) {
|
|
84
|
+
if (!term) return nodes;
|
|
85
|
+
const matchExtraFields = options.matchExtraFields ?? false;
|
|
86
|
+
return [...nodes].map((node) => {
|
|
87
|
+
if (node.type === "section" && node.childNodes) {
|
|
88
|
+
const filteredChildren = [...node.childNodes].filter((child) => nodeMatchesTerm(child, term, textFilterFn, matchExtraFields));
|
|
89
|
+
if (filteredChildren.length === 0) return null;
|
|
90
|
+
return {
|
|
91
|
+
...node,
|
|
92
|
+
childNodes: filteredChildren,
|
|
93
|
+
hasChildNodes: true
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return nodeMatchesTerm(node, term, textFilterFn, matchExtraFields) ? node : null;
|
|
97
|
+
}).filter(Boolean);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
//#endregion
|
|
101
|
+
export { collectVisibleKeys, filterCollectionNodes, getEdgeVisibleKey, getNextVisibleKey, markKeyboardFocus };
|
|
102
|
+
//# sourceMappingURL=listNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listNavigation.js","names":[],"sources":["../../../../src/components/fields/ListBoxPopover/listNavigation.ts"],"sourcesContent":["import { Key } from '@react-types/shared';\n\n/**\n * Minimal view of a React Stately list state. Kept structural (no imports from\n * `react-stately`) so the helpers can be used from any collection-backed\n * component without dragging extra types in.\n */\nexport interface ListStateLike {\n selectionManager: {\n focusedKey: Key | null;\n setFocusedKey: (key: Key | null) => void;\n };\n collection: Iterable<any>;\n disabledKeys?: Set<Key>;\n lastFocusSourceRef?: { current: 'keyboard' | 'mouse' | 'other' };\n}\n\nexport type NavigationDirection = 1 | -1;\nexport type NavigationEdge = 'first' | 'last';\n\n/**\n * Walks a collection (possibly nested under sections) and collects the keys of\n * selectable items, skipping disabled ones. Mirrors the inline walker that\n * used to live in `useComboBoxKeyboard`.\n */\nexport function collectVisibleKeys(\n nodes: Iterable<any>,\n out: Key[],\n disabledKeys?: Set<Key>,\n): void {\n for (const node of nodes) {\n if (node.type === 'item') {\n if (!disabledKeys?.has(node.key)) {\n out.push(node.key);\n }\n } else if (node.childNodes) {\n collectVisibleKeys(node.childNodes, out, disabledKeys);\n }\n }\n}\n\n/** Convenience: returns the flat list of selectable keys for a list state. */\nexport function getVisibleKeys(listState: ListStateLike): Key[] {\n const keys: Key[] = [];\n collectVisibleKeys(\n listState.collection,\n keys,\n listState.disabledKeys as Set<Key> | undefined,\n );\n return keys;\n}\n\n/**\n * Computes the next key to focus when navigating with ArrowUp/ArrowDown.\n *\n * - If `fromKey` is omitted, reads `selectionManager.focusedKey`.\n * - When nothing is focused (or the focused key is no longer visible), falls\n * back to the first/last visible key depending on `direction`.\n * - When the current key is the boundary, either returns `null` (default) or\n * wraps to the opposite edge when `opts.wrap` is true.\n */\nexport function getNextVisibleKey(\n listState: ListStateLike,\n direction: NavigationDirection,\n opts?: { wrap?: boolean; fromKey?: Key | null },\n): Key | null {\n const visibleKeys = getVisibleKeys(listState);\n if (visibleKeys.length === 0) return null;\n\n const isForward = direction === 1;\n const currentKey = opts?.fromKey ?? listState.selectionManager.focusedKey;\n\n if (currentKey == null) {\n return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];\n }\n\n const currentIndex = visibleKeys.indexOf(currentKey);\n\n if (currentIndex === -1) {\n // Focused item was filtered out — restart from the matching edge.\n return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];\n }\n\n const newIndex = currentIndex + direction;\n if (newIndex >= 0 && newIndex < visibleKeys.length) {\n return visibleKeys[newIndex];\n }\n\n if (opts?.wrap) {\n return isForward ? visibleKeys[0] : visibleKeys[visibleKeys.length - 1];\n }\n\n return null;\n}\n\n/** Returns the first or last selectable key. */\nexport function getEdgeVisibleKey(\n listState: ListStateLike,\n edge: NavigationEdge,\n): Key | null {\n const visibleKeys = getVisibleKeys(listState);\n if (visibleKeys.length === 0) return null;\n return edge === 'first'\n ? visibleKeys[0]\n : visibleKeys[visibleKeys.length - 1];\n}\n\n/**\n * Marks a focus change as keyboard-driven so the underlying ListBox scrolls the\n * highlighted option into view. No-op when the list state doesn't expose a\n * `lastFocusSourceRef`.\n */\nexport function markKeyboardFocus(listState: ListStateLike): void {\n if (listState.lastFocusSourceRef) {\n listState.lastFocusSourceRef.current = 'keyboard';\n }\n}\n\nexport type TextFilterFn = (textValue: string, inputValue: string) => boolean;\n\n/** Options controlling how {@link filterCollectionNodes} matches nodes. */\nexport interface FilterCollectionOptions {\n /**\n * Also match against a node's plain-text `children` and `description` props\n * in addition to its `textValue`. Defaults to `false` so the search stays\n * consistent with the visible `textValue` (which is what components like\n * ComboBox document). Components that surface `children`/`description` in the\n * option list (e.g. CommandTextArea) can opt in.\n */\n matchExtraFields?: boolean;\n}\n\n/**\n * Collects the strings a node can be matched against. Always includes the\n * node's `textValue`; when `matchExtraFields` is set, also includes any\n * plain-text `children` and `description` props. Non-string children/description\n * (e.g. React elements) are ignored since we can't reliably read their text.\n */\nfunction getSearchableStrings(node: any, matchExtraFields: boolean): string[] {\n const strings: string[] = [];\n\n if (node.textValue) {\n strings.push(node.textValue);\n }\n\n if (matchExtraFields) {\n const props = node.props;\n if (props) {\n if (typeof props.children === 'string') {\n strings.push(props.children);\n }\n if (typeof props.description === 'string') {\n strings.push(props.description);\n }\n }\n }\n\n return strings.length > 0 ? strings : [node.textValue || ''];\n}\n\n/** True when the term matches any of the node's searchable strings. */\nfunction nodeMatchesTerm(\n node: any,\n term: string,\n textFilterFn: TextFilterFn,\n matchExtraFields: boolean,\n): boolean {\n return getSearchableStrings(node, matchExtraFields).some((text) =>\n textFilterFn(text, term),\n );\n}\n\n/**\n * Filters collection nodes by a search term while preserving section structure.\n * By default a node matches only when the term matches its `textValue`; pass\n * `{ matchExtraFields: true }` to also match its plain-text `children` and\n * `description`. Sections whose children all fail the filter are dropped.\n */\nexport function filterCollectionNodes(\n nodes: Iterable<any>,\n term: string,\n textFilterFn: TextFilterFn,\n options: FilterCollectionOptions = {},\n): Iterable<any> {\n if (!term) {\n return nodes;\n }\n\n const matchExtraFields = options.matchExtraFields ?? false;\n\n return [...nodes]\n .map((node: any) => {\n if (node.type === 'section' && node.childNodes) {\n const filteredChildren = [...node.childNodes].filter((child: any) =>\n nodeMatchesTerm(child, term, textFilterFn, matchExtraFields),\n );\n\n if (filteredChildren.length === 0) {\n return null;\n }\n\n return {\n ...node,\n childNodes: filteredChildren,\n hasChildNodes: true,\n };\n }\n\n return nodeMatchesTerm(node, term, textFilterFn, matchExtraFields)\n ? node\n : null;\n })\n .filter(Boolean);\n}\n"],"mappings":";;;;;;;AAyBA,SAAgB,mBACd,OACA,KACA,cACM;AACN,MAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,SAAS,QAChB;MAAI,CAAC,cAAc,IAAI,KAAK,IAAI,CAC9B,KAAI,KAAK,KAAK,IAAI;YAEX,KAAK,WACd,oBAAmB,KAAK,YAAY,KAAK,aAAa;;;AAM5D,SAAgB,eAAe,WAAiC;CAC9D,MAAM,OAAc,EAAE;AACtB,oBACE,UAAU,YACV,MACA,UAAU,aACX;AACD,QAAO;;;;;;;;;;;AAYT,SAAgB,kBACd,WACA,WACA,MACY;CACZ,MAAM,cAAc,eAAe,UAAU;AAC7C,KAAI,YAAY,WAAW,EAAG,QAAO;CAErC,MAAM,YAAY,cAAc;CAChC,MAAM,aAAa,MAAM,WAAW,UAAU,iBAAiB;AAE/D,KAAI,cAAc,KAChB,QAAO,YAAY,YAAY,KAAK,YAAY,YAAY,SAAS;CAGvE,MAAM,eAAe,YAAY,QAAQ,WAAW;AAEpD,KAAI,iBAAiB,GAEnB,QAAO,YAAY,YAAY,KAAK,YAAY,YAAY,SAAS;CAGvE,MAAM,WAAW,eAAe;AAChC,KAAI,YAAY,KAAK,WAAW,YAAY,OAC1C,QAAO,YAAY;AAGrB,KAAI,MAAM,KACR,QAAO,YAAY,YAAY,KAAK,YAAY,YAAY,SAAS;AAGvE,QAAO;;;AAIT,SAAgB,kBACd,WACA,MACY;CACZ,MAAM,cAAc,eAAe,UAAU;AAC7C,KAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAO,SAAS,UACZ,YAAY,KACZ,YAAY,YAAY,SAAS;;;;;;;AAQvC,SAAgB,kBAAkB,WAAgC;AAChE,KAAI,UAAU,mBACZ,WAAU,mBAAmB,UAAU;;;;;;;;AAwB3C,SAAS,qBAAqB,MAAW,kBAAqC;CAC5E,MAAM,UAAoB,EAAE;AAE5B,KAAI,KAAK,UACP,SAAQ,KAAK,KAAK,UAAU;AAG9B,KAAI,kBAAkB;EACpB,MAAM,QAAQ,KAAK;AACnB,MAAI,OAAO;AACT,OAAI,OAAO,MAAM,aAAa,SAC5B,SAAQ,KAAK,MAAM,SAAS;AAE9B,OAAI,OAAO,MAAM,gBAAgB,SAC/B,SAAQ,KAAK,MAAM,YAAY;;;AAKrC,QAAO,QAAQ,SAAS,IAAI,UAAU,CAAC,KAAK,aAAa,GAAG;;;AAI9D,SAAS,gBACP,MACA,MACA,cACA,kBACS;AACT,QAAO,qBAAqB,MAAM,iBAAiB,CAAC,MAAM,SACxD,aAAa,MAAM,KAAK,CACzB;;;;;;;;AASH,SAAgB,sBACd,OACA,MACA,cACA,UAAmC,EAAE,EACtB;AACf,KAAI,CAAC,KACH,QAAO;CAGT,MAAM,mBAAmB,QAAQ,oBAAoB;AAErD,QAAO,CAAC,GAAG,MAAM,CACd,KAAK,SAAc;AAClB,MAAI,KAAK,SAAS,aAAa,KAAK,YAAY;GAC9C,MAAM,mBAAmB,CAAC,GAAG,KAAK,WAAW,CAAC,QAAQ,UACpD,gBAAgB,OAAO,MAAM,cAAc,iBAAiB,CAC7D;AAED,OAAI,iBAAiB,WAAW,EAC9B,QAAO;AAGT,UAAO;IACL,GAAG;IACH,YAAY;IACZ,eAAe;IAChB;;AAGH,SAAO,gBAAgB,MAAM,MAAM,cAAc,iBAAiB,GAC9D,OACA;GACJ,CACD,OAAO,QAAQ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/components/fields/ListBoxPopover/useCompositeFocus.ts
|
|
5
|
+
/**
|
|
6
|
+
* Tracks focus across a wrapper element and its (portaled) popover as a single
|
|
7
|
+
* logical focus scope. Fires `onFocus` when focus enters either and `onBlur`
|
|
8
|
+
* when it leaves both — essential for components whose overlay is portaled, so
|
|
9
|
+
* that clicking an option does not look like a blur of the whole component.
|
|
10
|
+
*
|
|
11
|
+
* Focus checks are deferred to the next animation frame to tolerate the
|
|
12
|
+
* synchronous focus shuffles React Aria and portals perform on selection.
|
|
13
|
+
*/
|
|
14
|
+
function useCompositeFocus({ wrapperRef, popoverRef, onFocus, onBlur, isDisabled }) {
|
|
15
|
+
const wasInsideRef = useRef(false);
|
|
16
|
+
const rafRef = useRef(null);
|
|
17
|
+
const checkFocus = useCallback(() => {
|
|
18
|
+
if (isDisabled) return;
|
|
19
|
+
const activeElement = document.activeElement;
|
|
20
|
+
const isInside = (wrapperRef.current?.contains(activeElement) ?? false) || (popoverRef.current?.contains(activeElement) ?? false);
|
|
21
|
+
if (isInside !== wasInsideRef.current) {
|
|
22
|
+
wasInsideRef.current = isInside;
|
|
23
|
+
if (isInside) onFocus?.();
|
|
24
|
+
else onBlur?.();
|
|
25
|
+
}
|
|
26
|
+
}, [
|
|
27
|
+
wrapperRef,
|
|
28
|
+
popoverRef,
|
|
29
|
+
onFocus,
|
|
30
|
+
onBlur,
|
|
31
|
+
isDisabled
|
|
32
|
+
]);
|
|
33
|
+
const handleFocusOrBlur = useCallback((e) => {
|
|
34
|
+
if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);
|
|
35
|
+
rafRef.current = requestAnimationFrame(() => {
|
|
36
|
+
rafRef.current = null;
|
|
37
|
+
checkFocus();
|
|
38
|
+
});
|
|
39
|
+
}, [checkFocus]);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
return () => {
|
|
42
|
+
if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);
|
|
43
|
+
};
|
|
44
|
+
}, []);
|
|
45
|
+
return { compositeFocusProps: {
|
|
46
|
+
onFocus: handleFocusOrBlur,
|
|
47
|
+
onBlur: handleFocusOrBlur
|
|
48
|
+
} };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
//#endregion
|
|
52
|
+
export { useCompositeFocus };
|
|
53
|
+
//# sourceMappingURL=useCompositeFocus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCompositeFocus.js","names":[],"sources":["../../../../src/components/fields/ListBoxPopover/useCompositeFocus.ts"],"sourcesContent":["import React, { RefObject, useCallback, useEffect, useRef } from 'react';\n\nexport interface UseCompositeFocusProps {\n wrapperRef: RefObject<HTMLElement>;\n popoverRef: RefObject<HTMLElement>;\n onFocus?: () => void;\n onBlur?: () => void;\n isDisabled?: boolean;\n}\n\nexport interface UseCompositeFocusReturn {\n compositeFocusProps: {\n onFocus: (e: React.FocusEvent) => void;\n onBlur: (e: React.FocusEvent) => void;\n };\n}\n\n/**\n * Tracks focus across a wrapper element and its (portaled) popover as a single\n * logical focus scope. Fires `onFocus` when focus enters either and `onBlur`\n * when it leaves both — essential for components whose overlay is portaled, so\n * that clicking an option does not look like a blur of the whole component.\n *\n * Focus checks are deferred to the next animation frame to tolerate the\n * synchronous focus shuffles React Aria and portals perform on selection.\n */\nexport function useCompositeFocus({\n wrapperRef,\n popoverRef,\n onFocus,\n onBlur,\n isDisabled,\n}: UseCompositeFocusProps): UseCompositeFocusReturn {\n const wasInsideRef = useRef(false);\n const rafRef = useRef<number | null>(null);\n\n const checkFocus = useCallback(() => {\n if (isDisabled) return;\n\n const activeElement = document.activeElement;\n const isInside =\n (wrapperRef.current?.contains(activeElement) ?? false) ||\n (popoverRef.current?.contains(activeElement) ?? false);\n\n if (isInside !== wasInsideRef.current) {\n wasInsideRef.current = isInside;\n if (isInside) {\n onFocus?.();\n } else {\n onBlur?.();\n }\n }\n }, [wrapperRef, popoverRef, onFocus, onBlur, isDisabled]);\n\n const handleFocusOrBlur = useCallback(\n (e: React.FocusEvent) => {\n // Cancel any pending check\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n\n // Schedule focus check for next frame\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n checkFocus();\n });\n },\n [checkFocus],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, []);\n\n return {\n compositeFocusProps: {\n onFocus: handleFocusOrBlur,\n onBlur: handleFocusOrBlur,\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;AA0BA,SAAgB,kBAAkB,EAChC,YACA,YACA,SACA,QACA,cACkD;CAClD,MAAM,eAAe,OAAO,MAAM;CAClC,MAAM,SAAS,OAAsB,KAAK;CAE1C,MAAM,aAAa,kBAAkB;AACnC,MAAI,WAAY;EAEhB,MAAM,gBAAgB,SAAS;EAC/B,MAAM,YACH,WAAW,SAAS,SAAS,cAAc,IAAI,WAC/C,WAAW,SAAS,SAAS,cAAc,IAAI;AAElD,MAAI,aAAa,aAAa,SAAS;AACrC,gBAAa,UAAU;AACvB,OAAI,SACF,YAAW;OAEX,WAAU;;IAGb;EAAC;EAAY;EAAY;EAAS;EAAQ;EAAW,CAAC;CAEzD,MAAM,oBAAoB,aACvB,MAAwB;AAEvB,MAAI,OAAO,YAAY,KACrB,sBAAqB,OAAO,QAAQ;AAItC,SAAO,UAAU,4BAA4B;AAC3C,UAAO,UAAU;AACjB,eAAY;IACZ;IAEJ,CAAC,WAAW,CACb;AAGD,iBAAgB;AACd,eAAa;AACX,OAAI,OAAO,YAAY,KACrB,sBAAqB,OAAO,QAAQ;;IAGvC,EAAE,CAAC;AAEN,QAAO,EACL,qBAAqB;EACnB,SAAS;EACT,QAAQ;EACT,EACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useProviderProps } from "../../../provider.js";
|
|
4
4
|
import { useFieldProps } from "../../form/Form/use-field/use-field-props.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { DirectionIcon } from "../../../icons/DirectionIcon.js";
|
|
3
3
|
import { Button } from "../../actions/index.js";
|
|
4
4
|
import { tasty } from "@tenphi/tasty";
|
|
@@ -9,14 +9,15 @@ const StepButtonElement = tasty(Button, {
|
|
|
9
9
|
preventDefault: true,
|
|
10
10
|
type: "clear",
|
|
11
11
|
styles: {
|
|
12
|
-
width: "
|
|
12
|
+
width: "($local-size * 1.25)",
|
|
13
13
|
height: "auto",
|
|
14
14
|
radius: {
|
|
15
15
|
"": "0 (1r - 1bw) 0 0",
|
|
16
16
|
down: "0 0 (1r - 1bw) 0"
|
|
17
17
|
},
|
|
18
18
|
padding: 0,
|
|
19
|
-
|
|
19
|
+
$size: "inherit",
|
|
20
|
+
"$local-size": "(($size - 2bw) / 2)",
|
|
20
21
|
Icon: {
|
|
21
22
|
width: "auto",
|
|
22
23
|
height: "auto"
|
|
@@ -36,7 +37,10 @@ function StepButton(props) {
|
|
|
36
37
|
},
|
|
37
38
|
label: `Step ${props.direction}`,
|
|
38
39
|
...props,
|
|
39
|
-
children: /* @__PURE__ */ jsx(DirectionIcon, {
|
|
40
|
+
children: /* @__PURE__ */ jsx(DirectionIcon, {
|
|
41
|
+
to: props.direction,
|
|
42
|
+
styles: { fontSize: "$local-size" }
|
|
43
|
+
})
|
|
40
44
|
});
|
|
41
45
|
}
|
|
42
46
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StepButton.js","names":[],"sources":["../../../../src/components/fields/NumberInput/StepButton.tsx"],"sourcesContent":["import { Styles, tasty } from '@tenphi/tasty';\n\nimport { CaretDownIcon, CaretUpIcon, DirectionIcon } from '../../../icons';\nimport { Button } from '../../actions';\n\nconst StepButtonElement = tasty(Button, {\n preventDefault: true,\n type: 'clear',\n styles: {\n width: '
|
|
1
|
+
{"version":3,"file":"StepButton.js","names":[],"sources":["../../../../src/components/fields/NumberInput/StepButton.tsx"],"sourcesContent":["import { Styles, tasty } from '@tenphi/tasty';\n\nimport { CaretDownIcon, CaretUpIcon, DirectionIcon } from '../../../icons';\nimport { Button } from '../../actions';\n\nconst StepButtonElement = tasty(Button, {\n preventDefault: true,\n type: 'clear',\n styles: {\n width: '($local-size * 1.25)',\n height: 'auto',\n radius: {\n '': '0 (1r - 1bw) 0 0',\n down: '0 0 (1r - 1bw) 0',\n },\n padding: 0,\n\n $size: 'inherit',\n '$local-size': '(($size - 2bw) / 2)',\n\n Icon: {\n width: 'auto',\n height: 'auto',\n },\n },\n});\n\n/**\n * Buttons for NumberField.\n */\nexport function StepButton(props) {\n return (\n <StepButtonElement\n preventDefault\n type=\"clear\"\n mods={{\n up: props.direction === 'up',\n down: props.direction === 'down',\n }}\n label={`Step ${props.direction}`}\n {...props}\n >\n <DirectionIcon\n to={props.direction}\n styles={{ fontSize: '$local-size' }}\n />\n </StepButtonElement>\n );\n}\n"],"mappings":";;;;;;;AAKA,MAAM,oBAAoB,MAAM,QAAQ;CACtC,gBAAgB;CAChB,MAAM;CACN,QAAQ;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;GACN,IAAI;GACJ,MAAM;GACP;EACD,SAAS;EAET,OAAO;EACP,eAAe;EAEf,MAAM;GACJ,OAAO;GACP,QAAQ;GACT;EACF;CACF,CAAC;;;;AAKF,SAAgB,WAAW,OAAO;AAChC,QACE,oBAAC;EACC;EACA,MAAK;EACL,MAAM;GACJ,IAAI,MAAM,cAAc;GACxB,MAAM,MAAM,cAAc;GAC3B;EACD,OAAO,QAAQ,MAAM;EACrB,GAAI;YAEJ,oBAAC;GACC,IAAI,MAAM;GACV,QAAQ,EAAE,UAAU,eAAe;IACnC;GACgB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useProviderProps } from "../../../provider.js";
|
|
4
4
|
import { ItemAction } from "../../actions/ItemAction/ItemAction.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { _Text } from "../../content/Text.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
4
4
|
import { useFocus as useFocus$1 } from "../../../utils/react/interactions.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
4
4
|
import { useProviderProps } from "../../../provider.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useProviderProps } from "../../../provider.js";
|
|
4
4
|
import { ItemAction } from "../../actions/ItemAction/ItemAction.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { forwardRefWithGenerics } from "../../../utils/react/forwardRefWithGenerics.js";
|
|
4
4
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { __Slider } from "./Slider.js";
|
|
3
3
|
import { forwardRef, useCallback, useMemo, useState } from "react";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { Gradation } from "./Gradation.js";
|
|
3
3
|
import { _SliderBase } from "./SliderBase.js";
|
|
4
4
|
import { SliderThumb } from "./SliderThumb.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { mergeProps } from "../../../utils/react/mergeProps.js";
|
|
4
4
|
import { Gradation } from "./Gradation.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { forwardRefWithGenerics } from "../../../utils/react/forwardRefWithGenerics.js";
|
|
4
4
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { SliderThumbElement } from "./elements.js";
|
|
4
4
|
import { useMemo, useRef } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { useId as useId$2 } from "../../../utils/react/useId.js";
|
|
4
4
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { chain } from "../../../utils/react/chain.js";
|
|
3
3
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
4
4
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useProviderProps } from "../../../provider.js";
|
|
4
4
|
import { useFieldProps } from "../../form/Form/use-field/use-field-props.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
4
4
|
import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.143.0 | Cube Dev Team */
|
|
2
2
|
import { mergeProps } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
|
|
4
4
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|