@cube-dev/ui-kit 0.193.1 → 0.194.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/dist/CHANGELOG.md +28 -0
- 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.d.ts +25 -12
- package/dist/components/CollectionItem.js +59 -4
- package/dist/components/CollectionItem.js.map +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 +2 -2
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.d.ts +1 -1
- package/dist/components/actions/Banner/Banner.js +6 -6
- package/dist/components/actions/Banner/Banner.js.map +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 +28 -25
- package/dist/components/actions/ButtonSplit/ButtonSplit.js.map +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.d.ts +7 -7
- package/dist/components/actions/CommandMenu/CommandMenu.js +232 -239
- package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +26 -22
- package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
- package/dist/components/actions/ItemActionContext.d.ts +3 -0
- package/dist/components/actions/ItemActionContext.js +15 -13
- package/dist/components/actions/ItemActionContext.js.map +1 -1
- package/dist/components/actions/ItemActionsWrapper.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.d.ts +2 -2
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.d.ts +9 -9
- package/dist/components/actions/Menu/Menu.js +88 -64
- package/dist/components/actions/Menu/Menu.js.map +1 -1
- package/dist/components/actions/Menu/MenuCollectionItem.d.ts +18 -0
- package/dist/components/actions/Menu/MenuCollectionItem.js +36 -0
- package/dist/components/actions/Menu/MenuCollectionItem.js.map +1 -0
- package/dist/components/actions/Menu/MenuItem.d.ts +5 -0
- package/dist/components/actions/Menu/MenuItem.js +402 -116
- package/dist/components/actions/Menu/MenuItem.js.map +1 -1
- package/dist/components/actions/Menu/MenuSection.d.ts +3 -1
- package/dist/components/actions/Menu/MenuSection.js +31 -33
- package/dist/components/actions/Menu/MenuSection.js.map +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.d.ts +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +2 -2
- package/dist/components/actions/Menu/SubMenuTrigger.js.map +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/index.d.ts +1 -0
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/actions-run.js +1 -1
- package/dist/components/actions/index.d.ts +3 -2
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +60 -36
- package/dist/components/actions/use-action.js.map +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.d.ts +19 -19
- 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 +44 -33
- package/dist/components/content/HotKeys/HotKeys.js.map +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.d.ts +7 -7
- package/dist/components/content/Item/Item.js +205 -67
- package/dist/components/content/Item/Item.js.map +1 -1
- package/dist/components/content/Item/ItemWithNativeLinks.js +314 -0
- package/dist/components/content/Item/ItemWithNativeLinks.js.map +1 -0
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.d.ts +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 +18 -15
- package/dist/components/content/Layout/LayoutPane.js.map +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +41 -46
- package/dist/components/content/Layout/LayoutPanel.js.map +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +2 -2
- package/dist/components/content/Layout/LayoutPanelTransition.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 +77 -70
- package/dist/components/content/Placeholder/Placeholder.js.map +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 +5 -5
- package/dist/components/content/Result/Result.js.map +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +18 -19
- package/dist/components/content/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/content/Tag/Tag.js +2 -2
- package/dist/components/content/Text.d.ts +14 -14
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +66 -48
- package/dist/components/content/Title.js.map +1 -1
- package/dist/components/content/Tree/Tree.js +6 -3
- package/dist/components/content/Tree/Tree.js.map +1 -1
- package/dist/components/content/Tree/TreeNode.js +1 -1
- package/dist/components/content/Tree/styled.js +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/types.d.ts +2 -2
- 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/data/DataTable/DataTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
- package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
- package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
- package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-column-widths.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-drag-drop.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-pagination.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-selection.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-sort.js +1 -1
- package/dist/components/data/ItemTable/use-item-table-tree-model.js +1 -1
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +39 -19
- package/dist/components/data/TableBase/TableView.js.map +1 -1
- package/dist/components/data/TableBase/TreeGridTable.js +1 -1
- package/dist/components/data/TableBase/column-header.js +1 -1
- package/dist/components/data/TableBase/column-menu.js +1 -1
- package/dist/components/data/TableBase/column-styles.js +1 -1
- package/dist/components/data/TableBase/column-tint.js +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.d.ts +1 -1
- package/dist/components/data/TableBase/styled.js +14 -1
- package/dist/components/data/TableBase/styled.js.map +1 -1
- package/dist/components/data/TableBase/table-tree.js +1 -1
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-menu.js +1 -1
- package/dist/components/data/TableBase/use-column-order.js +1 -1
- package/dist/components/data/TableBase/use-column-window.js +219 -0
- package/dist/components/data/TableBase/use-column-window.js.map +1 -0
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tooltip-refresh.js +32 -19
- package/dist/components/data/TableBase/use-table-tooltip-refresh.js.map +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +3 -1
- package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +13 -13
- package/dist/components/fields/Checkbox/CheckboxGroup.js.map +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js +32 -29
- package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.d.ts +2 -0
- package/dist/components/fields/ColorPicker/ColorPicker.js +8 -5
- package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +6 -3
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +41 -30
- package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
- package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
- package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
- 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 +2 -2
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +246 -238
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js.map +1 -1
- package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
- package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
- package/dist/components/fields/DatePicker/YearPicker.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/period.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 +22 -2
- package/dist/components/fields/FileInput/FileInput.js.map +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +5 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.d.ts +4 -2
- package/dist/components/fields/FilterPicker/FilterPicker.js +3 -2
- package/dist/components/fields/FilterPicker/FilterPicker.js.map +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.js +8 -7
- package/dist/components/fields/ListBox/ListBox.js.map +1 -1
- package/dist/components/fields/ListBox/optionId.js +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +36 -32
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +1 -1
- package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +1 -1
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
- package/dist/components/fields/Picker/Picker.d.ts +4 -2
- package/dist/components/fields/Picker/Picker.js +3 -2
- package/dist/components/fields/Picker/Picker.js.map +1 -1
- package/dist/components/fields/RadioGroup/Radio.d.ts +24 -24
- 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/SearchComboBox/SearchComboBox.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +1 -1
- package/dist/components/fields/Select/Select.d.ts +4 -4
- package/dist/components/fields/Select/Select.js +35 -32
- package/dist/components/fields/Select/Select.js.map +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/TagInput/TagInput.js +1 -1
- package/dist/components/fields/TagInput/TagList.js +1 -1
- package/dist/components/fields/TagInput/useActiveOption.js +1 -1
- package/dist/components/fields/TagInput/useTagError.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/TextInput/useAutoSizeTextArea.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +13 -5
- package/dist/components/fields/TextInputMapper/TextInputMapper.js.map +1 -1
- package/dist/components/fields/TriggerActions.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +62 -53
- package/dist/components/fields/color/ColorPanel.js.map +1 -1
- package/dist/components/fields/color/channels.js +1 -1
- package/dist/components/fields/color/color.js +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.d.ts +1 -0
- package/dist/components/form/FieldWrapper/FieldWrapper.js +133 -109
- package/dist/components/form/FieldWrapper/FieldWrapper.js.map +1 -1
- package/dist/components/form/FieldWrapper/field-description.js +102 -0
- package/dist/components/form/FieldWrapper/field-description.js.map +1 -0
- package/dist/components/form/FieldWrapper/types.d.ts +6 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ModernFormRoot.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/backend.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/modern/actions.js +1 -1
- package/dist/components/form/Form/modern/context.js +1 -1
- package/dist/components/form/Form/modern/controller.js +1 -1
- package/dist/components/form/Form/modern/field-binding.js +1 -1
- package/dist/components/form/Form/modern/field.js +1 -1
- package/dist/components/form/Form/modern/react.js +1 -1
- package/dist/components/form/Form/modern/store.js +1 -1
- package/dist/components/form/Form/modern/validation.js +1 -1
- package/dist/components/form/Form/modern/values.js +1 -1
- package/dist/components/form/Form/reset-unbound-controls.js +1 -1
- package/dist/components/form/Form/use-field/use-field-binding.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +17 -4
- package/dist/components/form/Form/use-field/use-field-props.js.map +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 +27 -24
- package/dist/components/form/Label.js.map +1 -1
- package/dist/components/form/legacy-tooltip.js +1 -1
- package/dist/components/form/validation/ValidationIndicator.js +1 -1
- package/dist/components/form/validation/resolve-validation-props.js +1 -1
- package/dist/components/form/validation/use-validation-props.js +1 -1
- package/dist/components/form/wrapper.js +2 -1
- package/dist/components/form/wrapper.js.map +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +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/Pagination/Pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Tabs/BoardDragActiveProvider.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.d.ts +3 -3
- 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/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/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.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/ModernDialogForm.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/default-button-text.js +1 -1
- package/dist/components/overlays/Dialog/use-content-overflow.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +44 -24
- package/dist/components/overlays/Modal/Modal.js.map +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 +34 -24
- package/dist/components/overlays/Modal/Popover.js.map +1 -1
- package/dist/components/overlays/Modal/Tray.js +45 -25
- package/dist/components/overlays/Modal/Tray.js.map +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Modal/modal-containment.js +145 -0
- package/dist/components/overlays/Modal/modal-containment.js.map +1 -0
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +2 -2
- 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 +50 -47
- package/dist/components/overlays/Tooltip/Tooltip.js.map +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/overlays/Tooltip/split-trigger-props.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/eslint-plugin/defaults.generated.js +2 -2
- package/dist/eslint-plugin/defaults.generated.js.map +1 -1
- package/dist/eslint-plugin/index.js +1 -1
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
- package/dist/i18n/I18nProvider.js +3 -2
- package/dist/i18n/I18nProvider.js.map +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.d.ts +2 -1
- package/dist/i18n/index.js +3 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/instance.d.ts +2 -3
- package/dist/i18n/instance.js +3 -4
- package/dist/i18n/instance.js.map +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +36 -5
- package/dist/i18n/locales/en-US/uikit.js +36 -5
- package/dist/i18n/locales/en-US/uikit.json.d.ts +41 -4
- package/dist/i18n/locales/es-ES/uikit.js +36 -5
- package/dist/i18n/locales/es-MX/uikit.js +36 -5
- package/dist/i18n/locales/fr-FR/uikit.js +36 -5
- package/dist/i18n/locales/it-IT/uikit.js +36 -5
- package/dist/i18n/locales/ja-JP/uikit.js +36 -5
- package/dist/i18n/locales/nb-NO/uikit.js +36 -5
- package/dist/i18n/locales/pt-BR/uikit.js +36 -5
- package/dist/i18n/locales/pt-PT/uikit.js +36 -5
- package/dist/i18n/locales/sv-SE/uikit.js +36 -5
- package/dist/i18n/locales/vi-VN/uikit.js +36 -5
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/namespace.d.ts +11 -0
- package/dist/i18n/namespace.js +12 -0
- package/dist/i18n/namespace.js.map +1 -0
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.js +5 -3
- package/dist/i18n/useI18n.js.map +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/ArrowNarrowDownIcon.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.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/PipetteIcon.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 +9 -7
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/index.js +1 -1
- package/dist/provider.js +2 -2
- package/dist/provider.js.map +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigation-url.js +11 -0
- package/dist/providers/navigation-url.js.map +1 -0
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/providers/use-navigation.js +19 -0
- package/dist/providers/use-navigation.js.map +1 -0
- package/dist/tokens/all-tokens.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/color-seed.js +1 -1
- package/dist/tokens/color-theme.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/legacy-color.js +1 -1
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette.js +1 -1
- package/dist/tokens/resolve.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/colors.js +1 -1
- package/dist/utils/dotize.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/disabledProps.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/overlayKeyPropagation.js +1 -1
- package/dist/utils/react/programmaticFocus.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useBufferedValue.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/useOverlayEscapeGuard.js +1 -1
- package/dist/utils/react/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useScheme.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 +2 -2
- package/docs/Usage.md +4 -0
- package/docs/components/CollectionItem.md +5 -1
- package/docs/components/actions/CommandMenu.md +46 -18
- package/docs/components/actions/Menu.md +124 -19
- package/docs/components/content/Placeholder.md +2 -0
- package/docs/components/content/Skeleton.md +2 -0
- package/docs/components/data/DataTable.md +3 -0
- package/docs/components/data/ItemTable.md +11 -1
- package/docs/components/overlays/Dialog.md +1 -1
- package/docs/components/overlays/DialogContainer.md +1 -2
- package/docs/components/overlays/DialogTrigger.md +1 -0
- package/package.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorSwatchGroup.js","names":["useObjectRef","BaseProps","BLOCK_STYLES","BlockStyleProps","OUTER_STYLES","OuterStyleProps","Styles","tasty","ForwardedRef","forwardRef","useMemo","useRef","useState","useRadio","useRadioGroup","useRadioGroupState","useEvent","FieldBaseProps","mergeProps","useFocus","extractStyles","getValidationMods","useFieldProps","wrapWithField","HiddenInput","ColorFormat","formatColor","parseColor","toHex","useIsInsideColorPopover","ColorPicker","RadioGroupState","CubeColorSwatchItem","color","label","SELECTED_RING","SWATCH_PX","Record","small","medium","large","CUSTOM_TRIGGER_STYLES","width","height","padding","radius","border","position","CUSTOM_SWATCH_STYLES","inset","CUSTOM_SWATCH_SELECTED_STYLES","shadow","GroupElement","qa","styles","display","columns","flow","gap","placeItems","gridColumns","RadiosElement","SwatchElement","as","cursor","disabled","fill","opacity","selected","outline","focused","transition","CubeColorSwatchGroupProps","colors","value","defaultValue","onChange","format","allowCustom","size","swatchStyles","SwatchProps","colorKey","state","isDisabled","mods","Swatch","t0","$","_c","inputRef","t1","inputProps","isSelected","isRadioDisabled","isFocused","focusProps","t2","t3","t4","t5","button","t6","t7","ColorSwatchGroup","allProps","ref","HTMLElement","props","defaultValidationTrigger","valuePropsMapper","isInvalid","isValid","ariaLabel","isInsidePopover","showCustom","swatches","seen","Map","key","entry","raw","parsed","has","set","undefined","values","internalValue","setInternalValue","currentValue","selectedColor","toString","selectedKey","isCustom","some","s","publish","next","handleChange","nextKey","isReadOnly","domRef","radioGroupProps","labelProps","form","orientation","group","String","map","swatch","cubeInputType"],"sources":["../../../../src/components/fields/ColorSwatchGroup/ColorSwatchGroup.tsx"],"sourcesContent":["import { useObjectRef } from '@react-aria/utils';\nimport {\n BaseProps,\n BLOCK_STYLES,\n BlockStyleProps,\n OUTER_STYLES,\n OuterStyleProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport { ForwardedRef, forwardRef, useMemo, useRef, useState } from 'react';\nimport { useRadio, useRadioGroup } from 'react-aria';\nimport { useRadioGroupState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal';\nimport { FieldBaseProps } from '../../../shared';\nimport { mergeProps } from '../../../utils/react';\nimport { useFocus } from '../../../utils/react/interactions';\nimport { extractStyles } from '../../../utils/styles';\nimport { getValidationMods, useFieldProps, wrapWithField } from '../../form';\nimport { HiddenInput } from '../../HiddenInput';\nimport { ColorFormat, formatColor, parseColor, toHex } from '../color/color';\nimport { useIsInsideColorPopover } from '../color/context';\nimport { ColorPicker } from '../ColorPicker';\n\nimport type { RadioGroupState } from 'react-stately';\n\n/** A swatch: a color, and optionally a name to announce instead of the color. */\nexport type CubeColorSwatchItem = string | { color: string; label?: string };\n\n/**\n * Two rings drawn inside the swatch, as React Aria marks selection. Outer ring\n * first: earlier shadows paint over later ones, so this reads as 2bw of\n * `#surface-text` at the edge and 2bw of `#surface` within it. Two tones that\n * flip with the scheme stay visible against any color the swatch holds.\n */\nconst SELECTED_RING = 'inset 0 0 0 2bw #surface-text, inset 0 0 0 4bw #surface';\n\n/** The swatch edge in px, per size. `Item` takes an exact number. */\nconst SWATCH_PX: Record<string, number> = {\n small: 16,\n medium: 20,\n large: 24,\n};\n\n/**\n * The trailing picker is a button wrapping a swatch, which would otherwise read\n * as a box inside a box. Stripping its chrome leaves just the swatch, so it\n * sits in the row as one of them.\n */\nconst CUSTOM_TRIGGER_STYLES: Styles = {\n // `size` sets the control's height; the box is pinned here as well so a flex\n // row cannot let the button size itself to its content instead.\n width: '$swatch-size $swatch-size',\n height: '$swatch-size $swatch-size',\n padding: 0,\n radius: '1r',\n border: 0,\n position: 'relative',\n};\n\n/**\n * The swatch is docked over the whole button rather than placed inside it.\n * `Item` lays its icon out in a grid that reserves room for a label even when\n * there is none, which left the swatch a pixel off centre.\n */\nconst CUSTOM_SWATCH_STYLES: Styles = {\n position: 'absolute',\n inset: 0,\n width: 'auto',\n height: 'auto',\n radius: '1r',\n};\n\n/**\n * The ring goes on the swatch, not on the button around it: an inset shadow\n * paints under child content, and the swatch covers the button edge to edge.\n */\nconst CUSTOM_SWATCH_SELECTED_STYLES: Styles = {\n ...CUSTOM_SWATCH_STYLES,\n shadow: SELECTED_RING,\n};\n\nconst GroupElement = tasty({\n qa: 'ColorSwatchGroup',\n styles: {\n // Wrapping is the better default: it is a single row wherever there is\n // room, and folds instead of overflowing where there is not. A fixed\n // `columns` switches to a grid, sized to the swatches rather than to the\n // container — `1fr` tracks would stretch them apart.\n display: {\n '': 'flex',\n columns: 'grid',\n },\n flow: {\n '': 'row wrap',\n columns: 'row',\n },\n gap: '.5x',\n placeItems: {\n '': 'center start',\n columns: 'stretch',\n },\n width: {\n '': 'auto',\n columns: 'max-content',\n },\n gridColumns: 'repeat($columns, max-content)',\n\n // 20px, 16px and 24px — 1x is 8px.\n '$swatch-size': {\n '': '2.5x',\n 'size=small': '2x',\n 'size=large': '3x',\n },\n },\n});\n\n/**\n * Only the swatches belong to the radiogroup. The custom picker is a button,\n * and inside `role=\"radiogroup\"` it both misreports what the palette holds and\n * hands arrow keys to React Aria's radio walker — pressing one while the picker\n * is focused jumps into a swatch and changes the color. The box is dropped so\n * the swatches remain direct children of the group's own layout.\n */\nconst RadiosElement = tasty({\n styles: { display: 'contents' },\n});\n\nconst SwatchElement = tasty({\n as: 'label',\n qa: 'ColorSwatchOption',\n styles: {\n display: 'grid',\n placeItems: 'stretch',\n position: 'relative',\n radius: '1r',\n cursor: {\n '': 'pointer',\n disabled: 'default',\n },\n width: '$swatch-size $swatch-size',\n height: '$swatch-size $swatch-size',\n fill: '(#color-swatch, #clear)',\n opacity: {\n '': 1,\n disabled: '$disabled-opacity',\n },\n // A ring at one border-width's distance, so the color area stays whole —\n // the inner ring is the surface showing through as the gap. `outline` is\n // deliberately left to the focus ring.\n shadow: {\n '': 'inset 0 0 0 1bw #dark.15',\n selected: SELECTED_RING,\n },\n // A 1bw offset keeps the ring clear of the 4px gap to its neighbours.\n outline: {\n '': '2bw #focus.0 / 1bw',\n focused: '2bw #focus / 1bw',\n },\n transition: 'theme',\n },\n});\n\nexport interface CubeColorSwatchGroupProps\n extends BaseProps,\n OuterStyleProps,\n BlockStyleProps,\n FieldBaseProps<string | null | undefined> {\n /** The colors to offer. Duplicates of the same color are dropped. */\n colors?: CubeColorSwatchItem[];\n /** The selected color (controlled). */\n value?: string | null;\n /** The selected color (uncontrolled). */\n defaultValue?: string | null;\n /** Called with the chosen color, written in `format`. */\n onChange?: (value: string | null) => void;\n /** Notation the value is written in. */\n format?: ColorFormat;\n /** How many swatches per row. Defaults to a single row. */\n columns?: number;\n /**\n * Append a `ColorPicker` for colors outside the set. Ignored inside a color\n * popover, which is where that picker would otherwise recurse.\n */\n allowCustom?: boolean;\n /** The size of each swatch. */\n size?: 'small' | 'medium' | 'large' | (string & {});\n styles?: Styles;\n /** Styles of an individual swatch. */\n swatchStyles?: Styles;\n 'aria-label'?: string;\n}\n\ninterface SwatchProps {\n colorKey: string;\n label: string;\n state: RadioGroupState;\n isDisabled?: boolean;\n size?: string;\n styles?: Styles;\n mods?: Record<string, boolean | undefined>;\n}\n\nfunction Swatch({\n colorKey,\n label,\n state,\n isDisabled,\n size,\n styles,\n mods,\n}: SwatchProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const {\n inputProps,\n isSelected,\n isDisabled: isRadioDisabled,\n } = useRadio(\n { value: colorKey, 'aria-label': label, isDisabled },\n state,\n inputRef,\n );\n // `useRadio` reports selection but not focus, and the swatch is the only\n // thing a keyboard user can see — without this the ring never appears.\n const { isFocused, focusProps } = useFocus(true);\n\n return (\n <SwatchElement\n data-size={size}\n mods={{\n selected: isSelected,\n disabled: isRadioDisabled,\n focused: isFocused,\n ...mods,\n }}\n styles={styles}\n style={{ '--color-swatch-color': colorKey }}\n >\n <HiddenInput\n {...mergeProps(inputProps, focusProps)}\n ref={inputRef}\n qa=\"ColorSwatchInput\"\n mods={{ button: true, disabled: isRadioDisabled }}\n />\n </SwatchElement>\n );\n}\n\n/**\n * A grid of color swatches, one of which can be selected — the palette half of\n * choosing a color, where `ColorPicker` is the freeform half.\n *\n * Swatches are keyed by their canonical hex, so the same color written two ways\n * collapses into one entry. Equivalent colors would otherwise make selection\n * ambiguous.\n */\nexport const ColorSwatchGroup = forwardRef(function ColorSwatchGroup(\n allProps: CubeColorSwatchGroupProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n const props = useFieldProps(allProps, {\n defaultValidationTrigger: 'onChange',\n valuePropsMapper: ({ value, onChange }) => ({\n value: value as string | null | undefined,\n onChange,\n }),\n });\n\n const {\n qa,\n colors = [],\n value,\n defaultValue,\n onChange,\n format = 'hex',\n columns,\n allowCustom,\n size = 'medium',\n isDisabled,\n isInvalid,\n isValid,\n swatchStyles,\n 'aria-label': ariaLabel,\n } = props;\n\n const styles = extractStyles(props, [...OUTER_STYLES, ...BLOCK_STYLES]);\n const isInsidePopover = useIsInsideColorPopover();\n // A custom picker inside a color popover would open a popover of its own.\n const showCustom = allowCustom && !isInsidePopover;\n\n /** Keyed by canonical hex so the same color written two ways is one swatch. */\n const swatches = useMemo(() => {\n const seen = new Map<string, { key: string; label: string }>();\n\n for (const entry of colors) {\n const raw = typeof entry === 'string' ? entry : entry.color;\n const parsed = parseColor(raw);\n\n if (!parsed) continue;\n\n const key = toHex(parsed);\n\n if (seen.has(key)) continue;\n\n seen.set(key, {\n key,\n label:\n (typeof entry === 'string' ? undefined : entry.label) ??\n formatColor(parsed, format),\n });\n }\n\n return [...seen.values()];\n }, [colors, format]);\n\n const [internalValue, setInternalValue] = useState<string | null>(\n () => defaultValue ?? null,\n );\n const currentValue = value !== undefined ? value : internalValue;\n\n const selectedColor = parseColor((currentValue ?? '').toString());\n const selectedKey = selectedColor ? toHex(selectedColor) : null;\n const isCustom =\n !!selectedKey && !swatches.some((s) => s.key === selectedKey);\n\n const publish = useEvent((next: string | null) => {\n if (value === undefined) setInternalValue(next);\n\n onChange?.(next);\n });\n\n // `null` arrives from React Aria's native form reset of a group that\n // mounted with no value.\n const handleChange = useEvent((nextKey: string | null) => {\n const parsed = nextKey == null ? null : parseColor(nextKey);\n\n publish(parsed ? formatColor(parsed, format) : null);\n });\n\n const state = useRadioGroupState({\n value: selectedKey ?? null,\n isDisabled,\n isReadOnly: props.isReadOnly,\n onChange: handleChange,\n });\n\n // `useFocusableRef` wants the ref of a real focusable control to forward to,\n // and a group of radios has no single one — `RadioGroup` takes the same\n // approach for the same reason.\n const domRef = useObjectRef(ref);\n const { radioGroupProps, labelProps } = useRadioGroup(\n {\n ...props,\n // React Aria hands `form` to every swatch's input as the id of its\n // `<form>`, so the form instance would render as `form=\"[object Object]\"`.\n form: undefined,\n // Only name the group here when nothing else does: an `aria-label` set\n // unconditionally would outrank the visible label React Aria wires up.\n 'aria-label': props.label ? undefined : ariaLabel ?? 'Colors',\n orientation: 'horizontal',\n },\n state,\n );\n\n const group = (\n <GroupElement\n ref={domRef}\n qa={qa || 'ColorSwatchGroup'}\n data-size={size}\n data-input-type=\"colorswatchgroup\"\n styles={styles}\n mods={{\n ...getValidationMods({ isInvalid, isValid }),\n columns: !!columns,\n }}\n style={columns ? { '--columns': String(columns) } : undefined}\n >\n <RadiosElement {...radioGroupProps}>\n {swatches.map((swatch) => (\n <Swatch\n key={swatch.key}\n colorKey={swatch.key}\n label={swatch.label}\n state={state}\n isDisabled={isDisabled}\n size={size}\n styles={swatchStyles}\n />\n ))}\n </RadiosElement>\n {showCustom ? (\n <ColorPicker\n aria-label=\"Custom color\"\n qa=\"ColorSwatchGroupCustom\"\n format={format}\n type=\"clear\"\n size={SWATCH_PX[size] ?? SWATCH_PX.medium}\n value={isCustom ? currentValue ?? null : null}\n isDisabled={isDisabled}\n isReadOnly={props.isReadOnly}\n triggerStyles={CUSTOM_TRIGGER_STYLES}\n swatchStyles={\n isCustom ? CUSTOM_SWATCH_SELECTED_STYLES : CUSTOM_SWATCH_STYLES\n }\n onChange={publish}\n >\n {null}\n </ColorPicker>\n ) : null}\n </GroupElement>\n );\n\n return wrapWithField(group, domRef, {\n ...props,\n labelProps: mergeProps(props.labelProps, labelProps),\n });\n});\n\n(ColorSwatchGroup as any).cubeInputType = 'Picker';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAMmC,gBAAgB;;AAGtB,MAAMC,YAAoC;CACxCE,OAAO;CACPC,QAAQ;CACRC,OAAO;CACR;;;;;;AAOD,MAAMC,wBAAgC;CAGpCC,OAAO;CACPC,QAAQ;CACRC,SAAS;CACTC,QAAQ;CACRC,QAAQ;CACRC,UAAU;CACX;;;;;;AAOD,MAAMC,uBAA+B;CACnCD,UAAU;CACVE,OAAO;CACPP,OAAO;CACPC,QAAQ;CACRE,QAAQ;CACT;;;;;AAMD,MAAMK,gCAAwC;CAC5C,GAAGF;CACHG,QAAQhB;CACT;AAED,MAAMiB,eAAe7C,MAAM;CACzB8C,IAAI;CACJC,QAAQ;EAKNC,SAAS;GACP,IAAI;GACJC,SAAS;GACV;EACDC,MAAM;GACJ,IAAI;GACJD,SAAS;GACV;EACDE,KAAK;EACLC,YAAY;GACV,IAAI;GACJH,SAAS;GACV;EACDd,OAAO;GACL,IAAI;GACJc,SAAS;GACV;EACDI,aAAa;EAGb,gBAAgB;GACd,IAAI;GACJ,cAAc;GACd,cAAc;GAChB;EACF;CACD,CAAC;;;;;;;;AASF,MAAMC,gBAAgBtD,MAAM,EAC1B+C,QAAQ,EAAEC,SAAS,YAAW,EAC/B,CAAC;AAEF,MAAMO,gBAAgBvD,MAAM;CAC1BwD,IAAI;CACJV,IAAI;CACJC,QAAQ;EACNC,SAAS;EACTI,YAAY;EACZZ,UAAU;EACVF,QAAQ;EACRmB,QAAQ;GACN,IAAI;GACJC,UAAU;GACX;EACDvB,OAAO;EACPC,QAAQ;EACRuB,MAAM;EACNC,SAAS;GACP,IAAI;GACJF,UAAU;GACX;EAIDd,QAAQ;GACN,IAAI;GACJiB,UAAUjC;GACX;EAEDkC,SAAS;GACP,IAAI;GACJC,SAAS;GACV;EACDC,YAAY;EACd;CACD,CAAC;AA0CF,SAAAe,OAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAgB,MAAA,EAAAP,UAAAhD,OAAAiD,OAAAC,YAAAL,MAAAzB,QAAA+B,SAAAE;CASd,MAAAG,WAAiB/E,OAAyB,KAAK;CAAC,IAAAgF;AAAA,KAAAH,EAAA,OAAAN,YAAAM,EAAA,OAAAJ,cAAAI,EAAA,OAAAtD,OAAA;AAM9CyD,OAAA;GAAAjB,OAASQ;GAAQ,cAAgBhD;GAAKkD;GAAc;AAAAI,IAAA,KAAAN;AAAAM,IAAA,KAAAJ;AAAAI,IAAA,KAAAtD;AAAAsD,IAAA,KAAAG;OAAAA,MAAAH,EAAA;CALtD,MAAA,EAAAI,YAAAC,YAAAT,YAAAU,oBAIIjF,SACF8E,IACAR,OACAO,SACD;CAGD,MAAA,EAAAK,WAAAC,eAAkC7E,WAAS,KAAK;CAAC,IAAA8E;AAAA,KAAAT,EAAA,OAAAO,aAAAP,EAAA,OAAAM,mBAAAN,EAAA,OAAAK,cAAAL,EAAA,OAAAH,MAAA;AAKvCY,OAAA;GAAA7B,UACMyB;GAAU5B,UACV6B;GAAexB,SAChByB;GAAS,GACfV;GACJ;AAAAG,IAAA,KAAAO;AAAAP,IAAA,KAAAM;AAAAN,IAAA,KAAAK;AAAAL,IAAA,KAAAH;AAAAG,IAAA,KAAAS;OAAAA,MAAAT,EAAA;CAAA,IAAAU;AAAA,KAAAV,EAAA,OAAAN,UAAA;AAEMgB,OAAA,EAAA,wBAA0BhB,UAAU;AAAAM,IAAA,KAAAN;AAAAM,IAAA,MAAAU;OAAAA,MAAAV,EAAA;CAAA,IAAAW;AAAA,KAAAX,EAAA,QAAAQ,cAAAR,EAAA,QAAAI,YAAA;AAGrCO,OAAAjF,aAAW0E,YAAYI,WAAW;AAAAR,IAAA,MAAAQ;AAAAR,IAAA,MAAAI;AAAAJ,IAAA,MAAAW;OAAAA,MAAAX,EAAA;CAAA,IAAAY;AAAA,KAAAZ,EAAA,QAAAM,iBAAA;AAGhCM,OAAA;GAAAC,QAAU;GAAIpC,UAAY6B;GAAiB;AAAAN,IAAA,MAAAM;AAAAN,IAAA,MAAAY;OAAAA,MAAAZ,EAAA;CAAA,IAAAc;AAAA,KAAAd,EAAA,QAAAW,MAAAX,EAAA,QAAAY,IAAA;AAJnDE,OAAA,oBAAC;GAAW,GACNH;GACCT,KAAAA;GACF,IAAA;GACG,MAAAU;IACN;AAAAZ,IAAA,MAAAW;AAAAX,IAAA,MAAAY;AAAAZ,IAAA,MAAAc;OAAAA,MAAAd,EAAA;CAAA,IAAAe;AAAA,KAAAf,EAAA,QAAAT,QAAAS,EAAA,QAAAlC,UAAAkC,EAAA,QAAAS,MAAAT,EAAA,QAAAU,MAAAV,EAAA,QAAAc,IAAA;AAhBJC,OAAA,oBAAC;GACYxB,aAAAA;GACL,MAAAkB;GAME3C;GACD,OAAA4C;aAEPI;IAMc;AAAAd,IAAA,MAAAT;AAAAS,IAAA,MAAAlC;AAAAkC,IAAA,MAAAS;AAAAT,IAAA,MAAAU;AAAAV,IAAA,MAAAc;AAAAd,IAAA,MAAAe;OAAAA,MAAAf,EAAA;AAAA,QAjBhBe;;;;;;;;;;AA6BJ,MAAaC,mBAAmB/F,WAAW,SAAS+F,iBAClDC,UACAC,KACA;CACA,MAAME,QAAQtF,cAAcmF,UAAU;EACpCI,0BAA0B;EAC1BC,mBAAmB,EAAEpC,OAAOE,gBAAgB;GACnCF;GACPE;GACD;EACF,CAAC;CAEF,MAAM,EACJvB,IACAoB,SAAS,EAAE,EACXC,OAAAA,SACAC,cACAC,UAAAA,YACAC,SAAS,OACTrB,SACAsB,aACAC,OAAO,UACPK,YACA2B,WACAC,SACAhC,cACA,cAAciC,cACZL;CAEJ,MAAMtD,SAASlC,cAAcwF,OAAO,CAAC,GAAGxG,cAAc,GAAGF,aAAa,CAAC;CACvE,MAAMgH,kBAAkBrF,yBAAyB;CAEjD,MAAMsF,aAAarC,eAAe,CAACoC;;CAGnC,MAAME,WAAW1G,cAAc;EAC7B,MAAM2G,uBAAO,IAAIC,KAA6C;AAE9D,OAAK,MAAME,SAAS/C,QAAQ;GAE1B,MAAMiD,SAAS/F,WADH,OAAO6F,UAAU,WAAWA,QAAQA,MAAMvF,MACxB;AAE9B,OAAI,CAACyF,OAAQ;GAEb,MAAMH,MAAM3F,MAAM8F,OAAO;AAEzB,OAAIL,KAAKM,IAAIJ,IAAI,CAAE;AAEnBF,QAAKO,IAAIL,KAAK;IACZA;IACArF,QACG,OAAOsF,UAAU,WAAWK,SAAYL,MAAMtF,UAC/CR,YAAYgG,QAAQ7C,OAAM;IAC7B,CAAC;;AAGJ,SAAO,CAAC,GAAGwC,KAAKS,QAAQ,CAAC;IACxB,CAACrD,QAAQI,OAAO,CAAC;CAEpB,MAAM,CAACkD,eAAeC,oBAAoBpH,eAClC+D,gBAAgB,KACvB;CACD,MAAMsD,eAAevD,YAAUmD,SAAYnD,UAAQqD;CAEnD,MAAMG,gBAAgBvG,YAAYsG,gBAAgB,IAAIE,UAAU,CAAC;CACjE,MAAMC,cAAcF,gBAAgBtG,MAAMsG,cAAc,GAAG;CAC3D,MAAMG,WACJ,CAAC,CAACD,eAAe,CAAChB,SAASkB,MAAMC,MAAMA,EAAEhB,QAAQa,YAAY;CAE/D,MAAMI,UAAUxH,UAAUyH,SAAwB;AAChD,MAAI/D,YAAUmD,OAAWG,kBAAiBS,KAAK;AAE/C7D,eAAW6D,KAAK;GAChB;CAIF,MAAMC,eAAe1H,UAAU2H,YAA2B;EACxD,MAAMjB,WAASiB,WAAW,OAAO,OAAOhH,WAAWgH,QAAQ;AAE3DH,UAAQd,WAAShG,YAAYgG,UAAQ7C,OAAO,GAAG,KAAK;GACpD;CAEF,MAAMM,QAAQpE,mBAAmB;EAC/B2D,OAAO0D,eAAe;EACtBhD;EACAwD,YAAYhC,MAAMgC;EAClBhE,UAAU8D;EACX,CAAC;CAKF,MAAMG,SAAS7I,aAAa0G,IAAI;CAChC,MAAM,EAAEoC,iBAAiBC,eAAejI,cACtC;EACE,GAAG8F;EAGHoC,MAAMnB;EAGN,cAAcjB,MAAM1E,QAAQ2F,SAAYZ,aAAa;EACrDgC,aAAa;EACd,EACD9D,MACD;AAkDD,QAAO5D,cA/CL,qBAAC;EACC,KAAKsH;EACL,IAAIxF,MAAM;EACV,aAAW0B;EACX,mBAAgB;EACRzB;EACR,MAAM;GACJ,GAAGjC,kBAAkB;IAAE0F;IAAWC;IAAS,CAAC;GAC5CxD,SAAS,CAAC,CAACA;GACZ;EACD,OAAOA,UAAU,EAAE,aAAa2F,OAAO3F,QAAO,EAAG,GAAGqE;aAEpD,oBAAC;GAAc,GAAIiB;aAChB1B,SAASgC,KAAKC,WACb,oBAAC;IAEC,UAAUA,OAAO9B;IACjB,OAAO8B,OAAOnH;IACPiD;IACKC;IACNL;IACN,QAAQC;MANHqE,OAAO9B,IAQf,CAAC;IACW,EACdJ,aACC,oBAAC;GACC,cAAW;GACX,IAAG;GACKtC;GACR,MAAK;GACL,MAAMzC,UAAU2C,SAAS3C,UAAUG;GACnC,OAAO8F,WAAWJ,gBAAgB,OAAO;GAC7B7C;GACZ,YAAYwB,MAAMgC;GAClB,eAAenG;GACf,cACE4F,WAAWnF,gCAAgCF;GAE7C,UAAUwF;aAET;IACW,GACZ;GAEP,EAE2BK,QAAQ;EAClC,GAAGjC;EACHmC,YAAY7H,aAAW0F,MAAMmC,YAAYA,WAAU;EACpD,CAAC;EACF;AAEF,AAACvC,iBAAyB8C,gBAAgB"}
|
|
1
|
+
{"version":3,"file":"ColorSwatchGroup.js","names":["useObjectRef","BaseProps","BLOCK_STYLES","BlockStyleProps","OUTER_STYLES","OuterStyleProps","Styles","tasty","ForwardedRef","forwardRef","useMemo","useRef","useState","useRadio","useRadioGroup","useRadioGroupState","useEvent","useI18n","FieldBaseProps","mergeProps","useFocus","extractStyles","getValidationMods","useFieldProps","wrapWithField","HiddenInput","ColorFormat","formatColor","parseColor","toHex","useIsInsideColorPopover","ColorPicker","RadioGroupState","CubeColorSwatchItem","color","label","SELECTED_RING","SWATCH_PX","Record","small","medium","large","CUSTOM_TRIGGER_STYLES","width","height","padding","radius","border","position","CUSTOM_SWATCH_STYLES","inset","CUSTOM_SWATCH_SELECTED_STYLES","shadow","GroupElement","qa","styles","display","columns","flow","gap","placeItems","gridColumns","RadiosElement","SwatchElement","as","cursor","disabled","fill","opacity","selected","outline","focused","transition","CubeColorSwatchGroupProps","colors","value","defaultValue","onChange","format","allowCustom","size","swatchStyles","SwatchProps","colorKey","state","isDisabled","mods","Swatch","t0","$","_c","inputRef","t1","inputProps","isSelected","isRadioDisabled","isFocused","focusProps","t2","t3","t4","t5","button","t6","t7","ColorSwatchGroup","allProps","ref","HTMLElement","t","props","defaultValidationTrigger","valuePropsMapper","isInvalid","isValid","ariaLabel","isInsidePopover","showCustom","swatches","seen","Map","key","entry","raw","parsed","has","set","undefined","values","internalValue","setInternalValue","currentValue","selectedColor","toString","selectedKey","isCustom","some","s","publish","next","handleChange","nextKey","isReadOnly","domRef","radioGroupProps","labelProps","form","orientation","group","String","map","swatch","cubeInputType"],"sources":["../../../../src/components/fields/ColorSwatchGroup/ColorSwatchGroup.tsx"],"sourcesContent":["import { useObjectRef } from '@react-aria/utils';\nimport {\n BaseProps,\n BLOCK_STYLES,\n BlockStyleProps,\n OUTER_STYLES,\n OuterStyleProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport { ForwardedRef, forwardRef, useMemo, useRef, useState } from 'react';\nimport { useRadio, useRadioGroup } from 'react-aria';\nimport { useRadioGroupState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal';\nimport { useI18n } from '../../../i18n';\nimport { FieldBaseProps } from '../../../shared';\nimport { mergeProps } from '../../../utils/react';\nimport { useFocus } from '../../../utils/react/interactions';\nimport { extractStyles } from '../../../utils/styles';\nimport { getValidationMods, useFieldProps, wrapWithField } from '../../form';\nimport { HiddenInput } from '../../HiddenInput';\nimport { ColorFormat, formatColor, parseColor, toHex } from '../color/color';\nimport { useIsInsideColorPopover } from '../color/context';\nimport { ColorPicker } from '../ColorPicker';\n\nimport type { RadioGroupState } from 'react-stately';\n\n/** A swatch: a color, and optionally a name to announce instead of the color. */\nexport type CubeColorSwatchItem = string | { color: string; label?: string };\n\n/**\n * Two rings drawn inside the swatch, as React Aria marks selection. Outer ring\n * first: earlier shadows paint over later ones, so this reads as 2bw of\n * `#surface-text` at the edge and 2bw of `#surface` within it. Two tones that\n * flip with the scheme stay visible against any color the swatch holds.\n */\nconst SELECTED_RING = 'inset 0 0 0 2bw #surface-text, inset 0 0 0 4bw #surface';\n\n/** The swatch edge in px, per size. `Item` takes an exact number. */\nconst SWATCH_PX: Record<string, number> = {\n small: 16,\n medium: 20,\n large: 24,\n};\n\n/**\n * The trailing picker is a button wrapping a swatch, which would otherwise read\n * as a box inside a box. Stripping its chrome leaves just the swatch, so it\n * sits in the row as one of them.\n */\nconst CUSTOM_TRIGGER_STYLES: Styles = {\n // `size` sets the control's height; the box is pinned here as well so a flex\n // row cannot let the button size itself to its content instead.\n width: '$swatch-size $swatch-size',\n height: '$swatch-size $swatch-size',\n padding: 0,\n radius: '1r',\n border: 0,\n position: 'relative',\n};\n\n/**\n * The swatch is docked over the whole button rather than placed inside it.\n * `Item` lays its icon out in a grid that reserves room for a label even when\n * there is none, which left the swatch a pixel off centre.\n */\nconst CUSTOM_SWATCH_STYLES: Styles = {\n position: 'absolute',\n inset: 0,\n width: 'auto',\n height: 'auto',\n radius: '1r',\n};\n\n/**\n * The ring goes on the swatch, not on the button around it: an inset shadow\n * paints under child content, and the swatch covers the button edge to edge.\n */\nconst CUSTOM_SWATCH_SELECTED_STYLES: Styles = {\n ...CUSTOM_SWATCH_STYLES,\n shadow: SELECTED_RING,\n};\n\nconst GroupElement = tasty({\n qa: 'ColorSwatchGroup',\n styles: {\n // Wrapping is the better default: it is a single row wherever there is\n // room, and folds instead of overflowing where there is not. A fixed\n // `columns` switches to a grid, sized to the swatches rather than to the\n // container — `1fr` tracks would stretch them apart.\n display: {\n '': 'flex',\n columns: 'grid',\n },\n flow: {\n '': 'row wrap',\n columns: 'row',\n },\n gap: '.5x',\n placeItems: {\n '': 'center start',\n columns: 'stretch',\n },\n width: {\n '': 'auto',\n columns: 'max-content',\n },\n gridColumns: 'repeat($columns, max-content)',\n\n // 20px, 16px and 24px — 1x is 8px.\n '$swatch-size': {\n '': '2.5x',\n 'size=small': '2x',\n 'size=large': '3x',\n },\n },\n});\n\n/**\n * Only the swatches belong to the radiogroup. The custom picker is a button,\n * and inside `role=\"radiogroup\"` it both misreports what the palette holds and\n * hands arrow keys to React Aria's radio walker — pressing one while the picker\n * is focused jumps into a swatch and changes the color. The box is dropped so\n * the swatches remain direct children of the group's own layout.\n */\nconst RadiosElement = tasty({\n styles: { display: 'contents' },\n});\n\nconst SwatchElement = tasty({\n as: 'label',\n qa: 'ColorSwatchOption',\n styles: {\n display: 'grid',\n placeItems: 'stretch',\n position: 'relative',\n radius: '1r',\n cursor: {\n '': 'pointer',\n disabled: 'default',\n },\n width: '$swatch-size $swatch-size',\n height: '$swatch-size $swatch-size',\n fill: '(#color-swatch, #clear)',\n opacity: {\n '': 1,\n disabled: '$disabled-opacity',\n },\n // A ring at one border-width's distance, so the color area stays whole —\n // the inner ring is the surface showing through as the gap. `outline` is\n // deliberately left to the focus ring.\n shadow: {\n '': 'inset 0 0 0 1bw #dark.15',\n selected: SELECTED_RING,\n },\n // A 1bw offset keeps the ring clear of the 4px gap to its neighbours.\n outline: {\n '': '2bw #focus.0 / 1bw',\n focused: '2bw #focus / 1bw',\n },\n transition: 'theme',\n },\n});\n\nexport interface CubeColorSwatchGroupProps\n extends BaseProps,\n OuterStyleProps,\n BlockStyleProps,\n FieldBaseProps<string | null | undefined> {\n /** The colors to offer. Duplicates of the same color are dropped. */\n colors?: CubeColorSwatchItem[];\n /** The selected color (controlled). */\n value?: string | null;\n /** The selected color (uncontrolled). */\n defaultValue?: string | null;\n /** Called with the chosen color, written in `format`. */\n onChange?: (value: string | null) => void;\n /** Notation the value is written in. */\n format?: ColorFormat;\n /** How many swatches per row. Defaults to a single row. */\n columns?: number;\n /**\n * Append a `ColorPicker` for colors outside the set. Ignored inside a color\n * popover, which is where that picker would otherwise recurse.\n */\n allowCustom?: boolean;\n /** The size of each swatch. */\n size?: 'small' | 'medium' | 'large' | (string & {});\n styles?: Styles;\n /** Styles of an individual swatch. */\n swatchStyles?: Styles;\n 'aria-label'?: string;\n}\n\ninterface SwatchProps {\n colorKey: string;\n label: string;\n state: RadioGroupState;\n isDisabled?: boolean;\n size?: string;\n styles?: Styles;\n mods?: Record<string, boolean | undefined>;\n}\n\nfunction Swatch({\n colorKey,\n label,\n state,\n isDisabled,\n size,\n styles,\n mods,\n}: SwatchProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const {\n inputProps,\n isSelected,\n isDisabled: isRadioDisabled,\n } = useRadio(\n { value: colorKey, 'aria-label': label, isDisabled },\n state,\n inputRef,\n );\n // `useRadio` reports selection but not focus, and the swatch is the only\n // thing a keyboard user can see — without this the ring never appears.\n const { isFocused, focusProps } = useFocus(true);\n\n return (\n <SwatchElement\n data-size={size}\n mods={{\n selected: isSelected,\n disabled: isRadioDisabled,\n focused: isFocused,\n ...mods,\n }}\n styles={styles}\n style={{ '--color-swatch-color': colorKey }}\n >\n <HiddenInput\n {...mergeProps(inputProps, focusProps)}\n ref={inputRef}\n qa=\"ColorSwatchInput\"\n mods={{ button: true, disabled: isRadioDisabled }}\n />\n </SwatchElement>\n );\n}\n\n/**\n * A grid of color swatches, one of which can be selected — the palette half of\n * choosing a color, where `ColorPicker` is the freeform half.\n *\n * Swatches are keyed by their canonical hex, so the same color written two ways\n * collapses into one entry. Equivalent colors would otherwise make selection\n * ambiguous.\n */\nexport const ColorSwatchGroup = forwardRef(function ColorSwatchGroup(\n allProps: CubeColorSwatchGroupProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n const { t } = useI18n();\n const props = useFieldProps(allProps, {\n defaultValidationTrigger: 'onChange',\n valuePropsMapper: ({ value, onChange }) => ({\n value: value as string | null | undefined,\n onChange,\n }),\n });\n\n const {\n qa,\n colors = [],\n value,\n defaultValue,\n onChange,\n format = 'hex',\n columns,\n allowCustom,\n size = 'medium',\n isDisabled,\n isInvalid,\n isValid,\n swatchStyles,\n 'aria-label': ariaLabel,\n } = props;\n\n const styles = extractStyles(props, [...OUTER_STYLES, ...BLOCK_STYLES]);\n const isInsidePopover = useIsInsideColorPopover();\n // A custom picker inside a color popover would open a popover of its own.\n const showCustom = allowCustom && !isInsidePopover;\n\n /** Keyed by canonical hex so the same color written two ways is one swatch. */\n const swatches = useMemo(() => {\n const seen = new Map<string, { key: string; label: string }>();\n\n for (const entry of colors) {\n const raw = typeof entry === 'string' ? entry : entry.color;\n const parsed = parseColor(raw);\n\n if (!parsed) continue;\n\n const key = toHex(parsed);\n\n if (seen.has(key)) continue;\n\n seen.set(key, {\n key,\n label:\n (typeof entry === 'string' ? undefined : entry.label) ??\n formatColor(parsed, format),\n });\n }\n\n return [...seen.values()];\n }, [colors, format]);\n\n const [internalValue, setInternalValue] = useState<string | null>(\n () => defaultValue ?? null,\n );\n const currentValue = value !== undefined ? value : internalValue;\n\n const selectedColor = parseColor((currentValue ?? '').toString());\n const selectedKey = selectedColor ? toHex(selectedColor) : null;\n const isCustom =\n !!selectedKey && !swatches.some((s) => s.key === selectedKey);\n\n const publish = useEvent((next: string | null) => {\n if (value === undefined) setInternalValue(next);\n\n onChange?.(next);\n });\n\n // `null` arrives from React Aria's native form reset of a group that\n // mounted with no value.\n const handleChange = useEvent((nextKey: string | null) => {\n const parsed = nextKey == null ? null : parseColor(nextKey);\n\n publish(parsed ? formatColor(parsed, format) : null);\n });\n\n const state = useRadioGroupState({\n value: selectedKey ?? null,\n isDisabled,\n isReadOnly: props.isReadOnly,\n // Becomes the group's `aria-invalid`, which is what says the field is\n // invalid to a screen reader; the red outline says it only to the eye.\n isInvalid,\n onChange: handleChange,\n });\n\n // `useFocusableRef` wants the ref of a real focusable control to forward to,\n // and a group of radios has no single one — `RadioGroup` takes the same\n // approach for the same reason.\n const domRef = useObjectRef(ref);\n const { radioGroupProps, labelProps } = useRadioGroup(\n {\n ...props,\n // React Aria hands `form` to every swatch's input as the id of its\n // `<form>`, so the form instance would render as `form=\"[object Object]\"`.\n form: undefined,\n // Only name the group here when nothing else does: an `aria-label` set\n // unconditionally would outrank the visible label React Aria wires up.\n 'aria-label': props.label\n ? undefined\n : ariaLabel ?? t('colorSwatchGroup.colors', 'Colors'),\n orientation: 'horizontal',\n },\n state,\n );\n\n const group = (\n <GroupElement\n ref={domRef}\n qa={qa || 'ColorSwatchGroup'}\n data-size={size}\n data-input-type=\"colorswatchgroup\"\n styles={styles}\n mods={{\n ...getValidationMods({ isInvalid, isValid }),\n columns: !!columns,\n }}\n style={columns ? { '--columns': String(columns) } : undefined}\n >\n <RadiosElement {...radioGroupProps}>\n {swatches.map((swatch) => (\n <Swatch\n key={swatch.key}\n colorKey={swatch.key}\n label={swatch.label}\n state={state}\n isDisabled={isDisabled}\n size={size}\n styles={swatchStyles}\n />\n ))}\n </RadiosElement>\n {showCustom ? (\n <ColorPicker\n aria-label={t('colorSwatchGroup.customColor', 'Custom color')}\n qa=\"ColorSwatchGroupCustom\"\n format={format}\n type=\"clear\"\n size={SWATCH_PX[size] ?? SWATCH_PX.medium}\n value={isCustom ? currentValue ?? null : null}\n isDisabled={isDisabled}\n isReadOnly={props.isReadOnly}\n triggerStyles={CUSTOM_TRIGGER_STYLES}\n swatchStyles={\n isCustom ? CUSTOM_SWATCH_SELECTED_STYLES : CUSTOM_SWATCH_STYLES\n }\n onChange={publish}\n >\n {null}\n </ColorPicker>\n ) : null}\n </GroupElement>\n );\n\n return wrapWithField(group, domRef, {\n ...props,\n labelProps: mergeProps(props.labelProps, labelProps),\n });\n});\n\n(ColorSwatchGroup as any).cubeInputType = 'Picker';\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { useLayoutEffect as useLayoutEffect$1 } from "../../../utils/react/useLayoutEffect.js";
|
|
4
4
|
import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
|
|
@@ -294,16 +294,17 @@ function useComboBoxKeyboard(t0) {
|
|
|
294
294
|
return t8;
|
|
295
295
|
}
|
|
296
296
|
const ComboBoxInput = forwardRef(function ComboBoxInput(t0, ref) {
|
|
297
|
-
const $ = c(
|
|
298
|
-
const { qa, inputRef, id, value, placeholder, isDisabled, isReadOnly, isRequired, autoFocus, autoComplete, size, mods, inputStyles, keyboardProps, focusProps, onChange, onFocus, isPopoverOpen, hasResults, comboBoxId, activeDescendant } = t0;
|
|
297
|
+
const $ = c(24);
|
|
298
|
+
const { qa, inputRef, id, value, placeholder, isDisabled, isReadOnly, isRequired, autoFocus, autoComplete, size, mods, inputStyles, keyboardProps, focusProps, onChange, onFocus, isPopoverOpen, hasResults, comboBoxId, activeDescendant, ariaProps, isInvalid } = t0;
|
|
299
299
|
const combinedRef = useCombinedRefs(ref, inputRef);
|
|
300
300
|
const t1 = autoFocus ? "" : void 0;
|
|
301
301
|
const t2 = isRequired || void 0;
|
|
302
302
|
const t3 = isPopoverOpen && hasResults;
|
|
303
303
|
const t4 = isPopoverOpen && hasResults ? `ComboBoxListBox-${comboBoxId}` : void 0;
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
const t5 = isInvalid || void 0;
|
|
305
|
+
let t6;
|
|
306
|
+
if ($[0] !== activeDescendant || $[1] !== ariaProps || $[2] !== autoComplete || $[3] !== autoFocus || $[4] !== combinedRef || $[5] !== focusProps.onBlur || $[6] !== id || $[7] !== inputStyles || $[8] !== isDisabled || $[9] !== isReadOnly || $[10] !== keyboardProps || $[11] !== mods || $[12] !== onChange || $[13] !== onFocus || $[14] !== placeholder || $[15] !== qa || $[16] !== size || $[17] !== t1 || $[18] !== t2 || $[19] !== t3 || $[20] !== t4 || $[21] !== t5 || $[22] !== value) {
|
|
307
|
+
t6 = /* @__PURE__ */ jsx(InputElement, {
|
|
307
308
|
ref: combinedRef,
|
|
308
309
|
qa,
|
|
309
310
|
id,
|
|
@@ -328,32 +329,36 @@ const ComboBoxInput = forwardRef(function ComboBoxInput(t0, ref) {
|
|
|
328
329
|
"aria-expanded": t3,
|
|
329
330
|
"aria-haspopup": "listbox",
|
|
330
331
|
"aria-controls": t4,
|
|
331
|
-
"aria-activedescendant": activeDescendant
|
|
332
|
+
"aria-activedescendant": activeDescendant,
|
|
333
|
+
"aria-invalid": t5,
|
|
334
|
+
...ariaProps
|
|
332
335
|
});
|
|
333
336
|
$[0] = activeDescendant;
|
|
334
|
-
$[1] =
|
|
335
|
-
$[2] =
|
|
336
|
-
$[3] =
|
|
337
|
-
$[4] =
|
|
338
|
-
$[5] =
|
|
339
|
-
$[6] =
|
|
340
|
-
$[7] =
|
|
341
|
-
$[8] =
|
|
342
|
-
$[9] =
|
|
343
|
-
$[10] =
|
|
344
|
-
$[11] =
|
|
345
|
-
$[12] =
|
|
346
|
-
$[13] =
|
|
347
|
-
$[14] =
|
|
348
|
-
$[15] =
|
|
349
|
-
$[16] =
|
|
350
|
-
$[17] =
|
|
351
|
-
$[18] =
|
|
352
|
-
$[19] =
|
|
353
|
-
$[20] =
|
|
337
|
+
$[1] = ariaProps;
|
|
338
|
+
$[2] = autoComplete;
|
|
339
|
+
$[3] = autoFocus;
|
|
340
|
+
$[4] = combinedRef;
|
|
341
|
+
$[5] = focusProps.onBlur;
|
|
342
|
+
$[6] = id;
|
|
343
|
+
$[7] = inputStyles;
|
|
344
|
+
$[8] = isDisabled;
|
|
345
|
+
$[9] = isReadOnly;
|
|
346
|
+
$[10] = keyboardProps;
|
|
347
|
+
$[11] = mods;
|
|
348
|
+
$[12] = onChange;
|
|
349
|
+
$[13] = onFocus;
|
|
350
|
+
$[14] = placeholder;
|
|
351
|
+
$[15] = qa;
|
|
352
|
+
$[16] = size;
|
|
353
|
+
$[17] = t1;
|
|
354
|
+
$[18] = t2;
|
|
355
|
+
$[19] = t3;
|
|
356
|
+
$[20] = t4;
|
|
354
357
|
$[21] = t5;
|
|
355
|
-
|
|
356
|
-
|
|
358
|
+
$[22] = value;
|
|
359
|
+
$[23] = t6;
|
|
360
|
+
} else t6 = $[23];
|
|
361
|
+
return t6;
|
|
357
362
|
});
|
|
358
363
|
const ComboBox = forwardRef(function ComboBox(props, ref) {
|
|
359
364
|
props = useFieldProps(props, { valuePropsMapper: ({ value, onChange }) => {
|
|
@@ -774,7 +779,13 @@ const ComboBox = forwardRef(function ComboBox(props, ref) {
|
|
|
774
779
|
comboBoxId,
|
|
775
780
|
activeDescendant: shouldShowPopover && activeOptionKey != null ? getListBoxOptionId(`ComboBoxListBox-${comboBoxId}`, activeOptionKey) : void 0,
|
|
776
781
|
onChange: handleInputChange,
|
|
777
|
-
onFocus: handleInputFocus
|
|
782
|
+
onFocus: handleInputFocus,
|
|
783
|
+
ariaProps: {
|
|
784
|
+
"aria-label": props["aria-label"],
|
|
785
|
+
"aria-labelledby": props["aria-labelledby"],
|
|
786
|
+
"aria-describedby": props["aria-describedby"]
|
|
787
|
+
},
|
|
788
|
+
isInvalid
|
|
778
789
|
}),
|
|
779
790
|
/* @__PURE__ */ jsxs("div", {
|
|
780
791
|
"data-element": "Suffix",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboBox.js","names":["KeyboardEvent","AriaKeyboardEvent","CollectionChildren","FocusableRef","Key","BASE_STYLES","BasePropsWithoutChildren","BaseStyleProps","COLOR_STYLES","ColorStyleProps","OUTER_STYLES","OuterStyleProps","Styles","tasty","React","ForwardedRef","forwardRef","ReactElement","ReactNode","RefObject","useCallback","useEffect","useMemo","useRef","useState","useFilter","useKeyboard","Section","BaseSection","useListState","useEvent","useI18n","CloseIcon","DirectionIcon","LoadingIcon","FieldBaseProps","TextFieldKeyboardProps","generateRandomId","useCombinedRefs","useLayoutEffect","useFocus","usePopoverSync","extractStyles","CollectionItem","Item","getValidationIcon","getValidationMods","useFieldProps","wrapWithField","getListBoxOptionId","filterCollectionNodes","getEdgeVisibleKey","getNextVisibleKey","ListBoxPopover","ListStateLike","markKeyboardFocus","useCompositeFocus","DEFAULT_INPUT_STYLES","INPUT_WRAPPER_STYLES","FilterFn","textValue","inputValue","PopoverTriggerAction","ComboBoxWrapperElement","qa","styles","InputElement","as","CubeComboBoxProps","selectedKey","defaultSelectedKey","onSelectionChange","key","defaultInputValue","onInputChange","value","placeholder","autoFocus","autoComplete","onFocus","onBlur","onKeyDown","popoverTrigger","items","Iterable","T","children","item","filter","allowsCustomValue","shouldCommitOnBlur","clearOnBlur","isClearable","onClear","icon","prefix","suffix","hideTrigger","size","inputRef","HTMLInputElement","wrapperRef","HTMLDivElement","listBoxRef","popoverRef","triggerRef","HTMLButtonElement","inputStyles","triggerStyles","listBoxStyles","overlayStyles","optionStyles","sectionStyles","headingStyles","listGap","isDisabled","isLoading","disabledKeys","shouldFlip","direction","overlayOffset","containerPadding","isReadOnly","suffixPosition","sortSelectedToTop","onOpenChange","isOpen","PROP_STYLES","UseComboBoxStateProps","comboBoxId","HTMLElement","UseComboBoxStateReturn","effectiveSelectedKey","effectiveInputValue","isPopoverOpen","setIsPopoverOpen","open","setInternalSelectedKey","setInternalInputValue","isControlledKey","isControlledInput","useComboBoxState","t0","$","_c","internalSelectedKey","internalInputValue","undefined","t1","Symbol","for","t2","menuId","onClose","containerRef","t3","UseComboBoxFilteringProps","UseComboBoxFilteringReturn","filterFn","nodes","isFilterActive","setIsFilterActive","active","useComboBoxFiltering","sensitivity","contains","_temp","textFilterFn","term","trim","t4","UseComboBoxKeyboardProps","listStateRef","hasResults","selection","onClearValue","onOpenPopover","onClosePopover","onVirtualFocus","useComboBoxKeyboard","listState","selectionManager","setFocusedKey","focusOption","e","preventDefault","listState_0","current","handleArrowKey","e_0","commitWithoutResults","e_1","listState_1","focusedKey","select","focus","handleEnterKey","t5","e_2","handleEscapeKey","t6","e_3","listState_2","handleEdgeKey","t7","e_4","isDefaultPrevented","bb97","keyboardProps","t8","ComboBoxInputProps","id","isRequired","mods","Record","focusProps","onChange","ChangeEvent","FocusEvent","activeDescendant","ComboBoxInput","ref","combinedRef","ComboBox","props","valuePropsMapper","val","t","label","extra","labelStyles","necessityIndicator","isInvalid","isValid","message","description","labelSuffix","renderChildren","externalOnSelectionChange","sortSelectedToTopProp","form","otherProps","sortSelectedToTopExplicit","cachedItemsOrder","selectionWhenClosed","getSortedItems","console","warn","itemsArray","Array","isArray","from","selectedItem","find","String","sorted","sortedItems","renderFn","map","idx","rendered","it","isValidElement","cloneElement","localCollectionState","selectionMode","isFocused","checkInputValidity","isInputValid","singleMatchKey","filteredCount","filteredNodes","collection","filteredItems","node","type","childNodes","child","push","length","exactMatch","toLowerCase","setSelectedKey","setInputText","clearSelectionAndInput","restoreSelectedLabel","getItemLabel","settleCustomValueOnBlur","settleOptionOnBlur","handleCompositeBlur","compositeFocusProps","validationIcon","focusInitAttemptsRef","activeOptionKey","setActiveOptionKey","getItem","handleSelectionChange","setTimeout","lastSyncedSelectedKey","selectionClearedByTyping","handleInputChange","target","trimmed","hasInitialized","setHasInitialized","preserveTypedInput","expectedLabel","handleInputFocus","handleInputBlur","hasValue","showClearButton","resultArray","flatMap","clearValue","disabled","hovered","focused","loading","clearable","comboBoxWidth","offsetWidth","shouldShowPopover","Boolean","ensureInitialFocus","lastFocusSourceRef","collectFirstKey","has","currentFocusedKey","needsRefocus","focusedItemExists","keyToFocus","tick","requestAnimationFrame","comboBoxField","zIndex","pressed","willOpen","_","propsWithoutChildren","Omit","Object","defineProperty","enumerable","configurable"],"sources":["../../../../src/components/fields/ComboBox/ComboBox.tsx"],"sourcesContent":["import {\n KeyboardEvent as AriaKeyboardEvent,\n CollectionChildren,\n FocusableRef,\n Key,\n} from '@react-types/shared';\nimport {\n BASE_STYLES,\n BasePropsWithoutChildren,\n BaseStyleProps,\n COLOR_STYLES,\n ColorStyleProps,\n OUTER_STYLES,\n OuterStyleProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useFilter, useKeyboard } from 'react-aria';\nimport { Section as BaseSection, useListState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal';\nimport { useI18n } from '../../../i18n';\nimport { CloseIcon } from '../../../icons/CloseIcon';\nimport { DirectionIcon } from '../../../icons/DirectionIcon';\nimport { LoadingIcon } from '../../../icons/LoadingIcon';\nimport { FieldBaseProps, TextFieldKeyboardProps } from '../../../shared';\nimport { generateRandomId } from '../../../utils/random';\nimport { useCombinedRefs, useLayoutEffect } from '../../../utils/react';\nimport { useFocus } from '../../../utils/react/interactions';\nimport { usePopoverSync } from '../../../utils/react/usePopoverSync';\nimport { extractStyles } from '../../../utils/styles';\nimport { CollectionItem as Item } from '../../CollectionItem';\nimport {\n getValidationIcon,\n getValidationMods,\n useFieldProps,\n wrapWithField,\n} from '../../form';\nimport { getListBoxOptionId } from '../ListBox/optionId';\nimport {\n filterCollectionNodes,\n getEdgeVisibleKey,\n getNextVisibleKey,\n ListBoxPopover,\n ListStateLike,\n markKeyboardFocus,\n useCompositeFocus,\n} from '../ListBoxPopover';\nimport {\n DEFAULT_INPUT_STYLES,\n INPUT_WRAPPER_STYLES,\n} from '../TextInput/TextInputBase';\n\ntype FilterFn = (textValue: string, inputValue: string) => boolean;\n\nexport type PopoverTriggerAction = 'focus' | 'input' | 'manual';\n\nconst ComboBoxWrapperElement = tasty({\n qa: 'ComboBoxWrapper',\n styles: INPUT_WRAPPER_STYLES,\n});\n\nconst InputElement = tasty({\n as: 'input',\n styles: DEFAULT_INPUT_STYLES,\n});\n\nexport interface CubeComboBoxProps<T>\n extends BasePropsWithoutChildren,\n BaseStyleProps,\n OuterStyleProps,\n ColorStyleProps,\n FieldBaseProps<string | null | undefined> {\n /** The selected key in controlled mode */\n selectedKey?: string | null;\n /** The default selected key in uncontrolled mode */\n defaultSelectedKey?: string | null;\n /** Callback fired when selection changes */\n onSelectionChange?: (key: string | null) => void;\n\n /** The input value in controlled mode */\n inputValue?: string;\n /** The default input value in uncontrolled mode */\n defaultInputValue?: string;\n /** Callback fired when input value changes */\n onInputChange?: (value: string) => void;\n /** Placeholder text for the input */\n placeholder?: string;\n /** Whether the input should have autofocus */\n autoFocus?: boolean;\n /** HTML autocomplete attribute for the input */\n autoComplete?: string;\n /** Callback fired when focus enters the component (input, trigger, or popover). Does not receive event object. */\n onFocus?: () => void;\n /** Callback fired when focus leaves the component entirely. Does not receive event object. */\n onBlur?: () => void;\n /**\n * Callback fired when a key is pressed on the input, before the built-in\n * key handling. Receives React Aria's keyboard event: `e.preventDefault()`\n * skips the built-in handling for the key, and propagation stops at the\n * input unless the handler calls `e.continuePropagation()`.\n */\n onKeyDown?: TextFieldKeyboardProps['onKeyDown'];\n\n /** Popover trigger behavior: 'focus', 'input', or 'manual'. Defaults to 'input' */\n popoverTrigger?: PopoverTriggerAction;\n\n /** Items for the listbox (alternative to children) */\n items?: Iterable<T>;\n /** Children for the listbox (static items or render function) */\n children?: ReactNode | ((item: T) => ReactElement);\n\n /**\n * Custom filter function for determining if an option should be included.\n * Pass `false` to disable internal filtering completely.\n */\n filter?: FilterFn | false;\n\n /** Whether to allow entering custom values that are not in the predefined options */\n allowsCustomValue?: boolean;\n /** Whether to commit custom value on blur in allowsCustomValue mode (default: true) */\n shouldCommitOnBlur?: boolean;\n /** Whether to clear selection and input on blur (default: false, only applies to non-custom-value mode) */\n clearOnBlur?: boolean;\n /** Whether the combobox is clearable using ESC key or clear button */\n isClearable?: boolean;\n /** Callback called when the clear button is pressed */\n onClear?: () => void;\n\n /** Left input icon */\n icon?: ReactElement;\n /** Input decoration before the main input */\n prefix?: ReactNode;\n /** Input decoration after the main input */\n suffix?: ReactNode;\n /** Whether to hide the trigger button */\n hideTrigger?: boolean;\n /** Size of the combobox */\n size?: 'small' | 'medium' | 'large' | (string & {});\n\n /** Ref for accessing the input element */\n inputRef?: RefObject<HTMLInputElement>;\n /** Ref for accessing the wrapper element */\n wrapperRef?: RefObject<HTMLDivElement>;\n /** Ref for accessing the listbox element */\n listBoxRef?: RefObject<HTMLDivElement>;\n /** Ref for accessing the popover element */\n popoverRef?: RefObject<HTMLDivElement>;\n /** Ref for accessing the trigger button element */\n triggerRef?: FocusableRef<HTMLButtonElement>;\n\n /** Custom styles for the input */\n inputStyles?: Styles;\n /** Custom styles for the trigger button */\n triggerStyles?: Styles;\n /** Custom styles for the listbox */\n listBoxStyles?: Styles;\n /** Custom styles for the popover overlay */\n overlayStyles?: Styles;\n /** Custom styles for individual options */\n optionStyles?: Styles;\n /** Custom styles for sections */\n sectionStyles?: Styles;\n /** Custom styles for section headings */\n headingStyles?: Styles;\n /** Space between options, in pixels. Defaults to a hairline (`1bw`). */\n listGap?: number;\n\n /** Whether the combobox is disabled */\n isDisabled?: boolean;\n /** Whether the combobox is in loading state */\n isLoading?: boolean;\n /** Keys of disabled items */\n disabledKeys?: Iterable<Key>;\n /** Whether to flip the popover placement */\n shouldFlip?: boolean;\n /** Placement direction for the popover */\n direction?: 'bottom' | 'top';\n /** Offset for the popover */\n overlayOffset?: number;\n /** Minimum padding in pixels between the popover and viewport edges */\n containerPadding?: number;\n /** Whether the combobox is read-only */\n isReadOnly?: boolean;\n /** Suffix position goes before or after the validation and loading statuses */\n suffixPosition?: 'before' | 'after';\n /**\n * Sort selected item to the top when the popover opens.\n * Only works when using the `items` prop (data-driven mode).\n * Ignored when using JSX children.\n * @default true when items are provided, false when using JSX children\n */\n sortSelectedToTop?: boolean;\n /** Callback called when the popover open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n}\n\nconst PROP_STYLES = [...BASE_STYLES, ...OUTER_STYLES, ...COLOR_STYLES];\n\n// ============================================================================\n// Hook: useComboBoxState\n// ============================================================================\ninterface UseComboBoxStateProps {\n selectedKey?: string | null;\n defaultSelectedKey?: string | null;\n inputValue?: string;\n defaultInputValue?: string;\n comboBoxId: string;\n triggerRef?: RefObject<HTMLElement | null>;\n popoverRef?: RefObject<HTMLElement | null>;\n}\n\ninterface UseComboBoxStateReturn {\n effectiveSelectedKey: Key | null;\n effectiveInputValue: string;\n isPopoverOpen: boolean;\n setIsPopoverOpen: (open: boolean) => void;\n setInternalSelectedKey: (key: Key | null) => void;\n setInternalInputValue: (value: string) => void;\n isControlledKey: boolean;\n isControlledInput: boolean;\n}\n\nfunction useComboBoxState({\n selectedKey,\n defaultSelectedKey,\n inputValue,\n defaultInputValue,\n comboBoxId,\n triggerRef,\n popoverRef,\n}: UseComboBoxStateProps): UseComboBoxStateReturn {\n // Internal state for uncontrolled mode\n const [internalSelectedKey, setInternalSelectedKey] = useState<Key | null>(\n defaultSelectedKey ?? null,\n );\n const [internalInputValue, setInternalInputValue] = useState(\n defaultInputValue ?? '',\n );\n\n const isControlledKey = selectedKey !== undefined;\n const isControlledInput = inputValue !== undefined;\n\n const effectiveSelectedKey = isControlledKey\n ? selectedKey\n : internalSelectedKey;\n const effectiveInputValue = isControlledInput\n ? inputValue\n : internalInputValue;\n\n // Popover state\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n\n usePopoverSync({\n menuId: comboBoxId,\n isOpen: isPopoverOpen,\n onClose: () => setIsPopoverOpen(false),\n triggerRef,\n containerRef: popoverRef,\n });\n\n return {\n effectiveSelectedKey,\n effectiveInputValue,\n isPopoverOpen,\n setIsPopoverOpen,\n setInternalSelectedKey,\n setInternalInputValue,\n isControlledKey,\n isControlledInput,\n };\n}\n\n// ============================================================================\n// Hook: useComboBoxFiltering\n// ============================================================================\ninterface UseComboBoxFilteringProps {\n effectiveInputValue: string;\n filter: FilterFn | false | undefined;\n}\n\ninterface UseComboBoxFilteringReturn {\n filterFn: (nodes: Iterable<any>) => Iterable<any>;\n isFilterActive: boolean;\n setIsFilterActive: (active: boolean) => void;\n}\n\nfunction useComboBoxFiltering({\n effectiveInputValue,\n filter,\n}: UseComboBoxFilteringProps): UseComboBoxFilteringReturn {\n const [isFilterActive, setIsFilterActive] = useState(false);\n\n const { contains } = useFilter({ sensitivity: 'base' });\n\n const textFilterFn: FilterFn =\n filter === false ? () => true : filter || contains;\n\n // Create a filter function for collection nodes\n const filterFn = (nodes: Iterable<any>) => {\n const term = effectiveInputValue.trim();\n\n // Don't filter if not active or no search term\n if (!isFilterActive || !term) {\n return nodes;\n }\n\n return filterCollectionNodes(nodes, term, textFilterFn);\n };\n\n return {\n filterFn,\n isFilterActive,\n setIsFilterActive,\n };\n}\n\n// ============================================================================\n// Hook: useComboBoxKeyboard\n// ============================================================================\ninterface UseComboBoxKeyboardProps {\n isPopoverOpen: boolean;\n listStateRef: RefObject<any>;\n hasResults: boolean;\n allowsCustomValue?: boolean;\n effectiveInputValue: string;\n isClearable?: boolean;\n onSelectionChange: (selection: Key | Key[] | null) => void;\n onClearValue: () => void;\n onOpenPopover: () => void;\n onClosePopover: () => void;\n inputRef: RefObject<HTMLInputElement>;\n setIsFilterActive: (active: boolean) => void;\n /** Called with the option the arrow keys moved virtual focus to. */\n onVirtualFocus: (key: Key) => void;\n onKeyDown?: TextFieldKeyboardProps['onKeyDown'];\n}\n\nfunction useComboBoxKeyboard({\n isPopoverOpen,\n listStateRef,\n hasResults,\n allowsCustomValue,\n effectiveInputValue,\n isClearable,\n onSelectionChange,\n onClearValue,\n onOpenPopover,\n onClosePopover,\n inputRef,\n setIsFilterActive,\n onVirtualFocus,\n onKeyDown,\n}: UseComboBoxKeyboardProps) {\n // Moves the virtual focus to `key`, if there is one, and scrolls it into view.\n const focusOption = (listState: ListStateLike, key: Key | null) => {\n if (key == null) return;\n\n markKeyboardFocus(listState);\n listState.selectionManager.setFocusedKey(key);\n onVirtualFocus(key);\n };\n\n const handleArrowKey = (e: AriaKeyboardEvent) => {\n e.preventDefault();\n\n // Open popover if closed\n if (!isPopoverOpen) {\n // If opening with no filtered results, disable filter to show all items\n if (!hasResults) setIsFilterActive(false);\n onOpenPopover();\n\n return;\n }\n\n const listState = listStateRef.current;\n\n if (listState) {\n focusOption(\n listState,\n getNextVisibleKey(listState, e.key === 'ArrowDown' ? 1 : -1),\n );\n }\n };\n\n // With no results, Enter commits the typed text as a custom value or clears\n // the selection.\n const commitWithoutResults = (e: AriaKeyboardEvent) => {\n if (!allowsCustomValue) {\n e.preventDefault();\n onSelectionChange(null);\n\n return;\n }\n\n const value = effectiveInputValue.trim();\n\n // Commit the custom value\n onSelectionChange((value as unknown as Key) ?? (null as unknown as Key));\n\n // If popover is closed and we have a value, allow Enter to propagate for form submission\n // If popover is open OR value is empty, prevent default to avoid premature submission\n if (isPopoverOpen || !value) e.preventDefault();\n };\n\n const handleEnterKey = (e: AriaKeyboardEvent) => {\n const listState = isPopoverOpen ? listStateRef.current : null;\n const focusedKey = listState?.selectionManager.focusedKey;\n\n if (focusedKey != null) {\n // If popover is open, select the focused item first\n e.preventDefault();\n listState.selectionManager.select(focusedKey, e);\n // Ensure the popover closes even if selection stays the same\n onClosePopover();\n inputRef.current?.focus();\n } else if (!hasResults) {\n // If no results, handle empty input or custom values\n commitWithoutResults(e);\n } else if ((effectiveInputValue || '').trim() === '') {\n // Clear selection if input is empty and popover is closed (or no focused item)\n e.preventDefault();\n onSelectionChange(null);\n }\n };\n\n const handleEscapeKey = (e: AriaKeyboardEvent) => {\n if (isPopoverOpen) {\n e.preventDefault();\n onClosePopover();\n inputRef.current?.focus();\n } else if (effectiveInputValue && isClearable) {\n e.preventDefault();\n onClearValue();\n }\n };\n\n const handleEdgeKey = (e: AriaKeyboardEvent) => {\n if (!isPopoverOpen) return;\n\n e.preventDefault();\n\n const listState = listStateRef.current;\n\n if (listState) {\n focusOption(\n listState,\n getEdgeVisibleKey(listState, e.key === 'Home' ? 'first' : 'last'),\n );\n }\n };\n\n const { keyboardProps } = useKeyboard({\n onKeyDown: (e) => {\n // The user's handler runs first, and a key it prevents is theirs: skip\n // the built-in handling. Read `isDefaultPrevented()`, not\n // `defaultPrevented` — `useKeyboard` hands over a copy of the event whose\n // `defaultPrevented` field is fixed at the moment it was made.\n onKeyDown?.(e);\n\n if (e.isDefaultPrevented()) return;\n\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n handleArrowKey(e);\n break;\n case 'Enter':\n handleEnterKey(e);\n break;\n case 'Escape':\n handleEscapeKey(e);\n break;\n case 'Home':\n case 'End':\n handleEdgeKey(e);\n break;\n }\n },\n });\n\n return { keyboardProps };\n}\n\n// ============================================================================\n// Component: ComboBoxInput\n// ============================================================================\ninterface ComboBoxInputProps {\n qa?: string;\n inputRef: RefObject<HTMLInputElement>;\n id?: string;\n value: string;\n placeholder?: string;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n autoFocus?: boolean;\n autoComplete?: string;\n size: string;\n mods: Record<string, any>;\n inputStyles?: Styles;\n keyboardProps: any;\n focusProps: any;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onFocus: (e: React.FocusEvent<HTMLInputElement>) => void;\n isPopoverOpen: boolean;\n hasResults: boolean;\n comboBoxId: string;\n /** The id of the option under virtual focus, while the popover is open. */\n activeDescendant?: string;\n}\n\nconst ComboBoxInput = forwardRef<HTMLInputElement, ComboBoxInputProps>(\n function ComboBoxInput(\n {\n qa,\n inputRef,\n id,\n value,\n placeholder,\n isDisabled,\n isReadOnly,\n isRequired,\n autoFocus,\n autoComplete,\n size,\n mods,\n inputStyles,\n keyboardProps,\n focusProps,\n onChange,\n onFocus,\n isPopoverOpen,\n hasResults,\n comboBoxId,\n activeDescendant,\n },\n ref,\n ) {\n const combinedRef = useCombinedRefs(ref, inputRef);\n\n return (\n <InputElement\n ref={combinedRef}\n qa={qa}\n id={id}\n type=\"text\"\n value={value}\n placeholder={placeholder}\n isDisabled={isDisabled}\n readOnly={isReadOnly}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n data-autofocus={autoFocus ? '' : undefined}\n onChange={onChange}\n onFocus={onFocus}\n onBlur={focusProps.onBlur}\n {...keyboardProps}\n styles={inputStyles}\n mods={mods}\n data-size={size}\n data-input-type=\"combobox\"\n role=\"combobox\"\n // `ComboBox` builds its own trigger rather than going through a\n // react-aria field hook, so nothing else would announce that the field\n // is mandatory — the label marker alone is not exposed to assistive\n // technology.\n aria-required={isRequired || undefined}\n aria-expanded={isPopoverOpen && hasResults}\n aria-haspopup=\"listbox\"\n aria-controls={\n isPopoverOpen && hasResults\n ? `ComboBoxListBox-${comboBoxId}`\n : undefined\n }\n aria-activedescendant={activeDescendant}\n />\n );\n },\n);\n\n// ============================================================================\n// Main Component: ComboBox\n// ============================================================================\nexport const ComboBox = forwardRef(function ComboBox<T extends object>(\n props: CubeComboBoxProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n props = useFieldProps(props, {\n valuePropsMapper: ({ value, onChange }) => {\n return {\n // Form value maps to selectedKey (the committed value) in both modes\n selectedKey: value ?? null,\n onSelectionChange(val: string | null) {\n // Commit selection changes to the form\n onChange(val);\n },\n };\n },\n });\n\n const { t } = useI18n();\n\n let {\n qa,\n label,\n extra,\n labelStyles,\n isRequired,\n necessityIndicator,\n isInvalid,\n isValid,\n id,\n icon,\n prefix,\n isDisabled,\n autoFocus,\n autoComplete = 'off',\n wrapperRef,\n inputRef,\n triggerRef,\n popoverRef,\n listBoxRef,\n isLoading,\n inputStyles,\n optionStyles,\n triggerStyles,\n listBoxStyles,\n overlayStyles,\n suffix,\n hideTrigger,\n message,\n description,\n size = 'medium',\n direction = 'bottom',\n shouldFlip = true,\n popoverTrigger = 'input',\n suffixPosition = 'before',\n filter,\n styles,\n labelSuffix,\n selectedKey,\n defaultSelectedKey,\n inputValue,\n defaultInputValue,\n onInputChange,\n isClearable,\n onClear,\n placeholder,\n allowsCustomValue,\n shouldCommitOnBlur = true,\n clearOnBlur,\n items,\n children: renderChildren,\n sectionStyles,\n headingStyles,\n listGap,\n isReadOnly,\n overlayOffset = 8,\n containerPadding = 8,\n onSelectionChange: externalOnSelectionChange,\n sortSelectedToTop: sortSelectedToTopProp,\n onOpenChange,\n onFocus,\n onBlur,\n onKeyDown,\n form,\n ...otherProps\n } = props;\n\n // Generate a unique ID for this combobox instance\n const comboBoxId = useMemo(() => generateRandomId(), []);\n\n // Hoist the wrapper/popover ref normalization above `useComboBoxState` so\n // the popover-sync inside it sees stable, attached refs. Other ref combines\n // happen below alongside the legacy ordering.\n wrapperRef = useCombinedRefs(wrapperRef);\n popoverRef = useCombinedRefs(popoverRef);\n\n // State management hook\n const {\n effectiveSelectedKey,\n effectiveInputValue,\n isPopoverOpen,\n setIsPopoverOpen,\n setInternalSelectedKey,\n setInternalInputValue,\n isControlledKey,\n isControlledInput,\n } = useComboBoxState({\n selectedKey,\n defaultSelectedKey,\n inputValue,\n defaultInputValue,\n comboBoxId,\n triggerRef: wrapperRef as RefObject<HTMLElement | null>,\n popoverRef: popoverRef as RefObject<HTMLElement | null>,\n });\n\n // Track if sortSelectedToTop was explicitly provided\n const sortSelectedToTopExplicit = sortSelectedToTopProp !== undefined;\n // Default to true if items are provided, false otherwise\n const sortSelectedToTop = sortSelectedToTopProp ?? (items ? true : false);\n\n // Cache for sorted items array when using `items` prop\n const cachedItemsOrder = useRef<T[] | null>(null);\n const selectionWhenClosed = useRef<string | null>(null);\n\n styles = extractStyles(otherProps, PROP_STYLES, styles);\n\n ref = useCombinedRefs(ref);\n inputRef = useCombinedRefs(inputRef);\n triggerRef = useCombinedRefs(triggerRef);\n listBoxRef = useCombinedRefs(listBoxRef);\n\n // Sort items with selected on top if enabled\n const getSortedItems = useCallback((): typeof items => {\n if (!items) return items;\n\n if (!sortSelectedToTop) return items;\n\n // Reuse cached order if available\n if (cachedItemsOrder.current) {\n return cachedItemsOrder.current;\n }\n\n // Warn if explicitly requested but not supported\n if (sortSelectedToTopExplicit && !items) {\n console.warn(\n 'ComboBox: sortSelectedToTop only works with the items prop. ' +\n 'Sorting will be skipped when using JSX children.',\n );\n return items;\n }\n\n const selectedKey = isPopoverOpen\n ? effectiveSelectedKey\n : selectionWhenClosed.current;\n\n if (!selectedKey) return items;\n\n const itemsArray = Array.isArray(items) ? items : Array.from(items);\n const selectedItem = itemsArray.find((item) => {\n const key = (item as any)?.key ?? (item as any)?.id;\n return key != null && String(key) === String(selectedKey);\n });\n\n if (!selectedItem) return items;\n\n const sorted = [\n selectedItem,\n ...itemsArray.filter((item) => {\n const key = (item as any)?.key ?? (item as any)?.id;\n return key == null || String(key) !== String(selectedKey);\n }),\n ] as T[];\n\n if (isPopoverOpen) {\n cachedItemsOrder.current = sorted;\n }\n\n return sorted;\n }, [\n items,\n sortSelectedToTop,\n sortSelectedToTopExplicit,\n effectiveSelectedKey,\n isPopoverOpen,\n ]);\n\n const sortedItems = getSortedItems();\n\n // Preserve the original `children` (may be a render function) before we\n // potentially overwrite it.\n let children: ReactNode = renderChildren as ReactNode;\n\n const renderFn = renderChildren as unknown;\n\n if (sortedItems && typeof renderFn === 'function') {\n try {\n const itemsArray = Array.from(sortedItems as Iterable<any>);\n children = itemsArray.map((item, idx) => {\n const rendered = (renderFn as (it: any) => ReactNode)(item);\n if (\n React.isValidElement(rendered) &&\n (rendered as ReactElement).key == null\n ) {\n return React.cloneElement(rendered as ReactElement, {\n key: (rendered as any)?.key ?? item?.key ?? idx,\n });\n }\n\n return rendered as ReactNode;\n });\n } catch {\n // If conversion fails, proceed with the original children\n }\n }\n\n // Invalidate cached sorting whenever items change\n useEffect(() => {\n cachedItemsOrder.current = null;\n }, [items]);\n\n // Capture selection when popover closes\n useEffect(() => {\n if (!isPopoverOpen) {\n selectionWhenClosed.current =\n effectiveSelectedKey != null ? String(effectiveSelectedKey) : null;\n cachedItemsOrder.current = null;\n }\n }, [isPopoverOpen, effectiveSelectedKey]);\n\n // Call onOpenChange when popover state changes\n useEffect(() => {\n onOpenChange?.(isPopoverOpen);\n }, [isPopoverOpen]);\n\n // Filtering hook\n const { filterFn, isFilterActive, setIsFilterActive } = useComboBoxFiltering({\n effectiveInputValue,\n filter,\n });\n\n // Create local collection state for reading item data (labels, etc.)\n // This allows us to read item labels even before the popover opens\n const localCollectionState = useListState({\n children: children as CollectionChildren<T>,\n items: sortedItems,\n selectionMode: 'none', // Don't manage selection in this state\n });\n\n const { isFocused, focusProps } = useFocus();\n\n // Helper to check if current input value is valid\n const checkInputValidity = useCallback(() => {\n if (!effectiveInputValue.trim()) {\n return { isInputValid: false, singleMatchKey: null, filteredCount: 0 };\n }\n\n // Get filtered collection based on current input\n const filteredNodes = filterFn(localCollectionState.collection);\n const filteredItems: Array<{ key: Key; textValue: string }> = [];\n\n // Flatten filtered nodes (handle sections)\n for (const node of filteredNodes) {\n if (node.type === 'section' && node.childNodes) {\n for (const child of node.childNodes) {\n if (child.type === 'item') {\n filteredItems.push({\n key: child.key,\n textValue: child.textValue || '',\n });\n }\n }\n } else if (node.type === 'item') {\n filteredItems.push({\n key: node.key,\n textValue: node.textValue || '',\n });\n }\n }\n\n const filteredCount = filteredItems.length;\n\n // Check for exact match\n const exactMatch = filteredItems.find(\n (item) =>\n item.textValue.toLowerCase() ===\n effectiveInputValue.trim().toLowerCase(),\n );\n\n if (exactMatch) {\n return {\n isInputValid: true,\n singleMatchKey: exactMatch.key,\n filteredCount,\n };\n }\n\n // If exactly one filtered result, consider it valid\n if (filteredCount === 1) {\n return {\n isInputValid: true,\n singleMatchKey: filteredItems[0].key,\n filteredCount,\n };\n }\n\n return { isInputValid: false, singleMatchKey: null, filteredCount };\n }, [effectiveInputValue, filterFn, localCollectionState.collection]);\n\n // ---- blur ---------------------------------------------------------------\n // Writes the selected key, unless it is controlled. Unlike `setInputText` it\n // does not report: each blur outcome calls `onSelectionChange` itself, in\n // the order it has always fired relative to `onInputChange`.\n const setSelectedKey = (key: Key | null) => {\n if (!isControlledKey) setInternalSelectedKey(key);\n };\n\n // Writes the input text, unless it is controlled, and reports it.\n const setInputText = (value: string) => {\n if (!isControlledInput) setInternalInputValue(value);\n onInputChange?.(value);\n };\n\n const clearSelectionAndInput = () => {\n externalOnSelectionChange?.(null);\n setSelectedKey(null);\n setInputText('');\n };\n\n // Reset input to show current selection (or empty if none)\n const restoreSelectedLabel = () => {\n setInputText(\n effectiveSelectedKey != null ? getItemLabel(effectiveSelectedKey) : '',\n );\n };\n\n // In allowsCustomValue mode: commit the input value if it's non-empty and\n // nothing is selected, clear the selection if the input is empty.\n const settleCustomValueOnBlur = () => {\n if (\n shouldCommitOnBlur &&\n effectiveInputValue &&\n effectiveSelectedKey == null\n ) {\n externalOnSelectionChange?.(effectiveInputValue as string);\n setSelectedKey(effectiveInputValue as Key);\n } else if (!String(effectiveInputValue).trim()) {\n clearSelectionAndInput();\n } else {\n restoreSelectedLabel();\n }\n };\n\n // In non-custom-value mode: auto-select the exact match, or the only filtered\n // result; clear invalid input (no exact match, not a single result) when\n // clearOnBlur is set or the input is empty.\n const settleOptionOnBlur = () => {\n const { isInputValid, singleMatchKey } = checkInputValidity();\n\n if (\n isInputValid &&\n singleMatchKey != null &&\n singleMatchKey !== effectiveSelectedKey\n ) {\n const label = getItemLabel(singleMatchKey);\n\n setSelectedKey(singleMatchKey);\n setInputText(label);\n externalOnSelectionChange?.(singleMatchKey as string | null);\n } else if (!isInputValid && (clearOnBlur || !effectiveInputValue.trim())) {\n clearSelectionAndInput();\n } else {\n restoreSelectedLabel();\n }\n };\n\n // Composite blur handler - fires when focus leaves the entire component\n const handleCompositeBlur = useEvent(() => {\n setIsPopoverOpen(false);\n\n if (allowsCustomValue) {\n settleCustomValueOnBlur();\n } else {\n settleOptionOnBlur();\n }\n\n onBlur?.();\n // Only now: the validity check above needs the filter still active.\n setIsFilterActive(false);\n });\n\n // Composite focus hook - handles focus tracking across wrapper and portaled popover\n const { compositeFocusProps } = useCompositeFocus({\n wrapperRef,\n popoverRef,\n onFocus,\n onBlur: handleCompositeBlur,\n isDisabled,\n });\n\n let validationIcon = getValidationIcon({ isInvalid, isValid });\n\n // Ref to access internal ListBox state\n const listStateRef = useRef<any>(null);\n const focusInitAttemptsRef = useRef(0);\n // The option under virtual focus, mirrored in state for the input's\n // `aria-activedescendant`: the listbox's own state update does not re-render\n // this component.\n const [activeOptionKey, setActiveOptionKey] = useState<Key | null>(null);\n\n // Helper to get label from local collection\n const getItemLabel = useCallback(\n (key: Key): string => {\n const item = localCollectionState?.collection?.getItem(key);\n return item?.textValue || String(key);\n },\n [localCollectionState?.collection],\n );\n\n // Selection change handler\n const handleSelectionChange = useEvent((selection: Key | Key[] | null) => {\n // Extract single key from selection (we only support single selection)\n const key = Array.isArray(selection) ? selection[0] : selection;\n\n // Update selected key\n if (!isControlledKey) {\n setInternalSelectedKey(key ?? null);\n }\n\n // Update input value to show selected item label\n if (key != null) {\n setIsFilterActive(false);\n\n const label = getItemLabel(key);\n\n if (!isControlledInput) {\n setInternalInputValue(label);\n }\n onInputChange?.(label);\n } else {\n // Clear input when selection is cleared\n if (!isControlledInput) {\n setInternalInputValue('');\n }\n onInputChange?.('');\n setIsFilterActive(false);\n }\n\n externalOnSelectionChange?.(key as string | null);\n\n // Close popover after selection\n setIsPopoverOpen(false);\n\n // Focus input\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n });\n\n const lastSyncedSelectedKey = useRef<Key | null | undefined>(undefined);\n const selectionClearedByTyping = useRef(false);\n\n // Input change handler\n const handleInputChange = useEvent(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n\n // Update input value\n if (!isControlledInput) {\n setInternalInputValue(value);\n }\n onInputChange?.(value);\n\n const trimmed = value.trim();\n setIsFilterActive(trimmed.length > 0);\n\n // Only clear selection in allowsCustomValue mode\n // In normal mode, typing just filters - selection stays until explicitly changed\n if (allowsCustomValue && effectiveSelectedKey != null) {\n selectionClearedByTyping.current = true;\n if (!isControlledKey) {\n setInternalSelectedKey(null);\n }\n externalOnSelectionChange?.(null);\n }\n\n // Open popover based on trigger\n if (popoverTrigger !== 'manual' && value && !isPopoverOpen) {\n setIsPopoverOpen(true);\n }\n },\n );\n\n // Initialize input value from defaultInputValue or defaultSelectedKey (uncontrolled mode only, one-time)\n const [hasInitialized, setHasInitialized] = useState(false);\n\n useEffect(() => {\n // Only initialize once, in uncontrolled input mode\n if (hasInitialized || isControlledInput) return;\n\n // Priority 1: defaultInputValue takes precedence\n if (defaultInputValue !== undefined) {\n setInternalInputValue(defaultInputValue);\n setHasInitialized(true);\n return;\n }\n\n // Priority 2: fall back to defaultSelectedKey's label\n if (defaultSelectedKey) {\n const label = getItemLabel(defaultSelectedKey);\n\n setInternalInputValue(label);\n setHasInitialized(true);\n }\n }, [\n hasInitialized,\n isControlledInput,\n defaultInputValue,\n defaultSelectedKey,\n getItemLabel,\n children,\n ]);\n\n // Sync input value with controlled selectedKey\n useEffect(() => {\n const preserveTypedInput = selectionClearedByTyping.current;\n selectionClearedByTyping.current = false;\n // Only run when selectedKey is controlled but inputValue is uncontrolled\n if (!isControlledKey || isControlledInput) return;\n\n // Skip if the key hasn't actually changed (prevents unnecessary resets when collection rebuilds)\n if (\n lastSyncedSelectedKey.current !== undefined &&\n lastSyncedSelectedKey.current === effectiveSelectedKey\n ) {\n return;\n }\n\n lastSyncedSelectedKey.current = effectiveSelectedKey;\n\n // Acknowledging the selection cleared by this edit must not erase the\n // text that caused it. Later external clears still reset the input.\n if (preserveTypedInput && effectiveSelectedKey == null) return;\n\n // Get the expected label for the current selection\n const expectedLabel =\n effectiveSelectedKey != null ? getItemLabel(effectiveSelectedKey) : '';\n\n // Update the input value to match the selected key's label\n setInternalInputValue(expectedLabel);\n }, [\n isControlledKey,\n isControlledInput,\n effectiveSelectedKey,\n effectiveInputValue,\n getItemLabel,\n ]);\n\n // Input focus handler\n const handleInputFocus = useEvent((e: React.FocusEvent<HTMLInputElement>) => {\n // Call focus props handler if it exists\n focusProps.onFocus?.(e as any);\n\n if (popoverTrigger === 'focus' && !isPopoverOpen) {\n setIsPopoverOpen(true);\n }\n });\n\n // Input blur handler - just handles internal focus props\n const handleInputBlur = useEvent((e: React.FocusEvent<HTMLInputElement>) => {\n focusProps.onBlur?.(e as any);\n });\n\n // Clear button logic\n let hasValue = allowsCustomValue\n ? effectiveInputValue !== ''\n : effectiveSelectedKey != null;\n let showClearButton = isClearable && hasValue && !isDisabled && !isReadOnly;\n\n // Check if there are any results after filtering\n const hasResults = useMemo(() => {\n if (!children) return false;\n if (!Array.isArray(children) && children === null) return false;\n\n // If we have a collection, check if filtering will produce any results\n if (localCollectionState?.collection) {\n const filteredNodes = filterFn(localCollectionState.collection);\n const resultArray = Array.from(filteredNodes).flatMap((node: any) => {\n if (node.type === 'section' && node.childNodes) {\n return [...node.childNodes];\n }\n\n return [node];\n });\n return resultArray.length > 0;\n }\n\n // Fallback: check if children exists\n return Array.isArray(children) ? children.length > 0 : true;\n }, [children, localCollectionState?.collection, filterFn]);\n\n // Clear function\n let clearValue = useEvent(() => {\n // Clear input\n if (!isControlledInput) {\n setInternalInputValue('');\n }\n onInputChange?.('');\n\n // Clear selection\n if (!isControlledKey) {\n setInternalSelectedKey(null);\n }\n externalOnSelectionChange?.(null);\n\n // Close popover\n if (isPopoverOpen) {\n setIsPopoverOpen(false);\n }\n\n // Focus input\n inputRef.current?.focus();\n\n onClear?.();\n });\n\n // Keyboard navigation hook\n const { keyboardProps } = useComboBoxKeyboard({\n isPopoverOpen,\n listStateRef,\n hasResults,\n allowsCustomValue,\n effectiveInputValue,\n isClearable,\n onSelectionChange: handleSelectionChange,\n onClearValue: clearValue,\n onOpenPopover: () => setIsPopoverOpen(true),\n onClosePopover: () => setIsPopoverOpen(false),\n inputRef,\n setIsFilterActive,\n onVirtualFocus: setActiveOptionKey,\n onKeyDown,\n });\n\n if (icon) {\n icon = <div data-element=\"InputIcon\">{icon}</div>;\n\n if (prefix) {\n prefix = (\n <>\n {icon}\n {prefix}\n </>\n );\n } else {\n prefix = icon;\n }\n }\n\n let mods = useMemo(\n () => ({\n ...getValidationMods({ isInvalid, isValid }),\n disabled: isDisabled,\n hovered: false,\n focused: isFocused,\n loading: isLoading,\n prefix: !!prefix,\n suffix: true,\n clearable: showClearButton,\n }),\n [\n isInvalid,\n isValid,\n isDisabled,\n isFocused,\n isLoading,\n prefix,\n showClearButton,\n ],\n );\n\n const comboBoxWidth = wrapperRef?.current?.offsetWidth;\n\n const shouldShowPopover = Boolean(isPopoverOpen && hasResults);\n\n // Close popover if no results\n useEffect(() => {\n if (isPopoverOpen && !hasResults) {\n setIsPopoverOpen(false);\n }\n }, [isPopoverOpen, hasResults]);\n\n const ensureInitialFocus = useCallback(() => {\n if (!shouldShowPopover) return;\n\n const listState = listStateRef.current;\n if (!listState) return;\n\n const { selectionManager, collection, disabledKeys, lastFocusSourceRef } =\n listState;\n if (!selectionManager || !collection) return;\n\n const collectFirstKey = (): Key | null => {\n for (const node of collection) {\n if (node.type === 'item') {\n if (!disabledKeys?.has(node.key)) return node.key;\n } else if (node.childNodes) {\n for (const child of node.childNodes) {\n if (child.type === 'item' && !disabledKeys?.has(child.key)) {\n return child.key;\n }\n }\n }\n }\n return null;\n };\n\n if (lastFocusSourceRef) lastFocusSourceRef.current = 'keyboard';\n\n // Check if we need to set or update focus\n const currentFocusedKey = selectionManager.focusedKey;\n let needsRefocus = false;\n\n if (currentFocusedKey == null) {\n // No focus at all - need to set initial focus\n needsRefocus = true;\n } else {\n // Check if currently focused key still exists in the collection\n const focusedItemExists = collection.getItem(currentFocusedKey) != null;\n if (!focusedItemExists) {\n // Focused item was filtered out - need to refocus\n needsRefocus = true;\n }\n }\n\n if (!needsRefocus) {\n setActiveOptionKey(currentFocusedKey);\n } else {\n let keyToFocus: Key | null = null;\n\n // First try to focus on the selected key if it exists in the collection\n if (\n effectiveSelectedKey != null &&\n collection.getItem(effectiveSelectedKey) != null\n ) {\n keyToFocus = effectiveSelectedKey;\n } else {\n // Fall back to the first key in the collection\n keyToFocus = collectFirstKey();\n }\n\n if (keyToFocus != null) {\n selectionManager.setFocusedKey(keyToFocus);\n setActiveOptionKey(keyToFocus);\n }\n }\n }, [shouldShowPopover, effectiveSelectedKey, setActiveOptionKey]);\n\n useLayoutEffect(() => {\n if (!shouldShowPopover) return;\n focusInitAttemptsRef.current = 0;\n\n const tick = () => {\n if (!shouldShowPopover) return;\n ensureInitialFocus();\n focusInitAttemptsRef.current += 1;\n // Try a few frames to wait for collection to mount\n if (\n focusInitAttemptsRef.current < 8 &&\n listStateRef.current?.selectionManager?.focusedKey == null\n ) {\n requestAnimationFrame(tick);\n }\n };\n\n requestAnimationFrame(() => requestAnimationFrame(tick));\n }, [shouldShowPopover, ensureInitialFocus]);\n\n const comboBoxField = (\n <ComboBoxWrapperElement\n ref={wrapperRef}\n mods={mods}\n styles={styles}\n style={{\n zIndex: isFocused ? 1 : 'initial',\n }}\n data-size={size}\n {...compositeFocusProps}\n >\n {prefix ? <div data-element=\"Prefix\">{prefix}</div> : null}\n <ComboBoxInput\n qa={qa || 'ComboBox'}\n inputRef={inputRef}\n id={id}\n value={effectiveInputValue}\n placeholder={placeholder}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n size={size}\n mods={mods}\n inputStyles={inputStyles}\n keyboardProps={keyboardProps}\n focusProps={{ ...focusProps, onBlur: handleInputBlur }}\n isPopoverOpen={isPopoverOpen}\n hasResults={hasResults}\n comboBoxId={comboBoxId}\n activeDescendant={\n shouldShowPopover && activeOptionKey != null\n ? getListBoxOptionId(\n `ComboBoxListBox-${comboBoxId}`,\n activeOptionKey,\n )\n : undefined\n }\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n />\n <div data-element=\"Suffix\">\n {suffixPosition === 'before' ? suffix : null}\n {isLoading ? <LoadingIcon data-element=\"InputIcon\" /> : validationIcon}\n {suffixPosition === 'after' ? suffix : null}\n {showClearButton && (\n <Item.Action\n icon={<CloseIcon />}\n size={size}\n // No `theme` — the default `current` type inherits the input's own\n // text color, which is already validation-tinted, so the button\n // matches the text beside it exactly instead of using the fixed\n // `danger.clear` palette.\n qa=\"ComboBoxClearButton\"\n data-no-trigger={hideTrigger ? '' : undefined}\n data-popover-dismiss=\"\"\n aria-label={t('comboBox.clearValue', 'Clear value')}\n onPress={clearValue}\n />\n )}\n {!hideTrigger ? (\n <Item.Action\n ref={triggerRef}\n data-popover-trigger\n icon={<DirectionIcon to={isPopoverOpen ? 'up' : 'down'} />}\n qa=\"ComboBoxTrigger\"\n mods={{\n pressed: isPopoverOpen,\n disabled: isDisabled,\n loading: isLoading,\n }}\n data-size={size}\n isDisabled={isDisabled}\n styles={triggerStyles}\n aria-expanded={isPopoverOpen}\n aria-haspopup=\"listbox\"\n aria-label={t('comboBox.showOptions', 'Show options')}\n onPress={() => {\n if (!isDisabled) {\n const willOpen = !isPopoverOpen;\n setIsPopoverOpen(willOpen);\n if (willOpen) {\n inputRef.current?.focus();\n // If opening with no filtered results, disable filter to show all items\n if (!hasResults) {\n setIsFilterActive(false);\n }\n }\n }\n }}\n />\n ) : null}\n </div>\n <ListBoxPopover\n isOpen={shouldShowPopover}\n triggerRef={wrapperRef as RefObject<HTMLElement>}\n popoverRef={popoverRef}\n listBoxRef={listBoxRef}\n direction={direction}\n shouldFlip={shouldFlip}\n overlayOffset={overlayOffset}\n containerPadding={containerPadding}\n comboBoxWidth={comboBoxWidth}\n listBoxId={`ComboBoxListBox-${comboBoxId}`}\n overlayStyles={overlayStyles}\n listBoxStyles={listBoxStyles}\n optionStyles={optionStyles}\n sectionStyles={sectionStyles}\n headingStyles={headingStyles}\n listGap={listGap}\n selectedKey={effectiveSelectedKey}\n isDisabled={isDisabled}\n disabledKeys={props.disabledKeys}\n items={sortedItems}\n listStateRef={listStateRef}\n label={label}\n ariaLabel={(props as any)['aria-label']}\n compositeFocusProps={compositeFocusProps}\n filter={filterFn}\n size={size}\n onSelectionChange={handleSelectionChange}\n onClose={() => setIsPopoverOpen(false)}\n >\n {children}\n </ListBoxPopover>\n </ComboBoxWrapperElement>\n );\n\n const { children: _, ...propsWithoutChildren } = props;\n\n return wrapWithField<Omit<CubeComboBoxProps<T>, 'children'>>(\n comboBoxField,\n ref,\n propsWithoutChildren,\n );\n}) as unknown as (<T>(\n props: CubeComboBoxProps<T> & { ref?: ForwardedRef<HTMLDivElement> },\n) => ReactElement) & { Item: typeof Item; Section: typeof BaseSection };\n\nComboBox.Item = Item;\n\nComboBox.Section = BaseSection;\n\nObject.defineProperty(ComboBox, 'cubeInputType', {\n value: 'ComboBox',\n enumerable: false,\n configurable: false,\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ComboBox.js","names":["KeyboardEvent","AriaKeyboardEvent","AriaLabelingProps","CollectionChildren","FocusableRef","Key","BASE_STYLES","BasePropsWithoutChildren","BaseStyleProps","COLOR_STYLES","ColorStyleProps","OUTER_STYLES","OuterStyleProps","Styles","tasty","React","ForwardedRef","forwardRef","ReactElement","ReactNode","RefObject","useCallback","useEffect","useMemo","useRef","useState","useFilter","useKeyboard","Section","BaseSection","useListState","useEvent","useI18n","CloseIcon","DirectionIcon","LoadingIcon","FieldBaseProps","TextFieldKeyboardProps","generateRandomId","useCombinedRefs","useLayoutEffect","useFocus","usePopoverSync","extractStyles","CollectionItem","Item","getValidationIcon","getValidationMods","useFieldProps","wrapWithField","getListBoxOptionId","filterCollectionNodes","getEdgeVisibleKey","getNextVisibleKey","ListBoxPopover","ListStateLike","markKeyboardFocus","useCompositeFocus","DEFAULT_INPUT_STYLES","INPUT_WRAPPER_STYLES","FilterFn","textValue","inputValue","PopoverTriggerAction","ComboBoxWrapperElement","qa","styles","InputElement","as","CubeComboBoxProps","selectedKey","defaultSelectedKey","onSelectionChange","key","defaultInputValue","onInputChange","value","placeholder","autoFocus","autoComplete","onFocus","onBlur","onKeyDown","popoverTrigger","items","Iterable","T","children","item","filter","allowsCustomValue","shouldCommitOnBlur","clearOnBlur","isClearable","onClear","icon","prefix","suffix","hideTrigger","size","inputRef","HTMLInputElement","wrapperRef","HTMLDivElement","listBoxRef","popoverRef","triggerRef","HTMLButtonElement","inputStyles","triggerStyles","listBoxStyles","overlayStyles","optionStyles","sectionStyles","headingStyles","listGap","isDisabled","isLoading","disabledKeys","shouldFlip","direction","overlayOffset","containerPadding","isReadOnly","suffixPosition","sortSelectedToTop","onOpenChange","isOpen","PROP_STYLES","UseComboBoxStateProps","comboBoxId","HTMLElement","UseComboBoxStateReturn","effectiveSelectedKey","effectiveInputValue","isPopoverOpen","setIsPopoverOpen","open","setInternalSelectedKey","setInternalInputValue","isControlledKey","isControlledInput","useComboBoxState","t0","$","_c","internalSelectedKey","internalInputValue","undefined","t1","Symbol","for","t2","menuId","onClose","containerRef","t3","UseComboBoxFilteringProps","UseComboBoxFilteringReturn","filterFn","nodes","isFilterActive","setIsFilterActive","active","useComboBoxFiltering","sensitivity","contains","_temp","textFilterFn","term","trim","t4","UseComboBoxKeyboardProps","listStateRef","hasResults","selection","onClearValue","onOpenPopover","onClosePopover","onVirtualFocus","useComboBoxKeyboard","listState","selectionManager","setFocusedKey","focusOption","e","preventDefault","listState_0","current","handleArrowKey","e_0","commitWithoutResults","e_1","listState_1","focusedKey","select","focus","handleEnterKey","t5","e_2","handleEscapeKey","t6","e_3","listState_2","handleEdgeKey","t7","e_4","isDefaultPrevented","bb97","keyboardProps","t8","ComboBoxInputProps","id","isRequired","mods","Record","focusProps","onChange","ChangeEvent","FocusEvent","activeDescendant","ariaProps","isInvalid","ComboBoxInput","ref","combinedRef","ComboBox","props","valuePropsMapper","val","t","label","extra","labelStyles","necessityIndicator","isValid","message","description","labelSuffix","renderChildren","externalOnSelectionChange","sortSelectedToTopProp","form","otherProps","sortSelectedToTopExplicit","cachedItemsOrder","selectionWhenClosed","getSortedItems","console","warn","itemsArray","Array","isArray","from","selectedItem","find","String","sorted","sortedItems","renderFn","map","idx","rendered","it","isValidElement","cloneElement","localCollectionState","selectionMode","isFocused","checkInputValidity","isInputValid","singleMatchKey","filteredCount","filteredNodes","collection","filteredItems","node","type","childNodes","child","push","length","exactMatch","toLowerCase","setSelectedKey","setInputText","clearSelectionAndInput","restoreSelectedLabel","getItemLabel","settleCustomValueOnBlur","settleOptionOnBlur","handleCompositeBlur","compositeFocusProps","validationIcon","focusInitAttemptsRef","activeOptionKey","setActiveOptionKey","getItem","handleSelectionChange","setTimeout","lastSyncedSelectedKey","selectionClearedByTyping","handleInputChange","target","trimmed","hasInitialized","setHasInitialized","preserveTypedInput","expectedLabel","handleInputFocus","handleInputBlur","hasValue","showClearButton","resultArray","flatMap","clearValue","disabled","hovered","focused","loading","clearable","comboBoxWidth","offsetWidth","shouldShowPopover","Boolean","ensureInitialFocus","lastFocusSourceRef","collectFirstKey","has","currentFocusedKey","needsRefocus","focusedItemExists","keyToFocus","tick","requestAnimationFrame","comboBoxField","zIndex","pressed","willOpen","_","propsWithoutChildren","Omit","Object","defineProperty","enumerable","configurable"],"sources":["../../../../src/components/fields/ComboBox/ComboBox.tsx"],"sourcesContent":["import {\n KeyboardEvent as AriaKeyboardEvent,\n AriaLabelingProps,\n CollectionChildren,\n FocusableRef,\n Key,\n} from '@react-types/shared';\nimport {\n BASE_STYLES,\n BasePropsWithoutChildren,\n BaseStyleProps,\n COLOR_STYLES,\n ColorStyleProps,\n OUTER_STYLES,\n OuterStyleProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport React, {\n ForwardedRef,\n forwardRef,\n ReactElement,\n ReactNode,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useFilter, useKeyboard } from 'react-aria';\nimport { Section as BaseSection, useListState } from 'react-stately';\n\nimport { useEvent } from '../../../_internal';\nimport { useI18n } from '../../../i18n';\nimport { CloseIcon } from '../../../icons/CloseIcon';\nimport { DirectionIcon } from '../../../icons/DirectionIcon';\nimport { LoadingIcon } from '../../../icons/LoadingIcon';\nimport { FieldBaseProps, TextFieldKeyboardProps } from '../../../shared';\nimport { generateRandomId } from '../../../utils/random';\nimport { useCombinedRefs, useLayoutEffect } from '../../../utils/react';\nimport { useFocus } from '../../../utils/react/interactions';\nimport { usePopoverSync } from '../../../utils/react/usePopoverSync';\nimport { extractStyles } from '../../../utils/styles';\nimport { CollectionItem as Item } from '../../CollectionItem';\nimport {\n getValidationIcon,\n getValidationMods,\n useFieldProps,\n wrapWithField,\n} from '../../form';\nimport { getListBoxOptionId } from '../ListBox/optionId';\nimport {\n filterCollectionNodes,\n getEdgeVisibleKey,\n getNextVisibleKey,\n ListBoxPopover,\n ListStateLike,\n markKeyboardFocus,\n useCompositeFocus,\n} from '../ListBoxPopover';\nimport {\n DEFAULT_INPUT_STYLES,\n INPUT_WRAPPER_STYLES,\n} from '../TextInput/TextInputBase';\n\ntype FilterFn = (textValue: string, inputValue: string) => boolean;\n\nexport type PopoverTriggerAction = 'focus' | 'input' | 'manual';\n\nconst ComboBoxWrapperElement = tasty({\n qa: 'ComboBoxWrapper',\n styles: INPUT_WRAPPER_STYLES,\n});\n\nconst InputElement = tasty({\n as: 'input',\n styles: DEFAULT_INPUT_STYLES,\n});\n\nexport interface CubeComboBoxProps<T>\n extends BasePropsWithoutChildren,\n BaseStyleProps,\n OuterStyleProps,\n ColorStyleProps,\n FieldBaseProps<string | null | undefined> {\n /** The selected key in controlled mode */\n selectedKey?: string | null;\n /** The default selected key in uncontrolled mode */\n defaultSelectedKey?: string | null;\n /** Callback fired when selection changes */\n onSelectionChange?: (key: string | null) => void;\n\n /** The input value in controlled mode */\n inputValue?: string;\n /** The default input value in uncontrolled mode */\n defaultInputValue?: string;\n /** Callback fired when input value changes */\n onInputChange?: (value: string) => void;\n /** Placeholder text for the input */\n placeholder?: string;\n /** Whether the input should have autofocus */\n autoFocus?: boolean;\n /** HTML autocomplete attribute for the input */\n autoComplete?: string;\n /** Callback fired when focus enters the component (input, trigger, or popover). Does not receive event object. */\n onFocus?: () => void;\n /** Callback fired when focus leaves the component entirely. Does not receive event object. */\n onBlur?: () => void;\n /**\n * Callback fired when a key is pressed on the input, before the built-in\n * key handling. Receives React Aria's keyboard event: `e.preventDefault()`\n * skips the built-in handling for the key, and propagation stops at the\n * input unless the handler calls `e.continuePropagation()`.\n */\n onKeyDown?: TextFieldKeyboardProps['onKeyDown'];\n\n /** Popover trigger behavior: 'focus', 'input', or 'manual'. Defaults to 'input' */\n popoverTrigger?: PopoverTriggerAction;\n\n /** Items for the listbox (alternative to children) */\n items?: Iterable<T>;\n /** Children for the listbox (static items or render function) */\n children?: ReactNode | ((item: T) => ReactElement);\n\n /**\n * Custom filter function for determining if an option should be included.\n * Pass `false` to disable internal filtering completely.\n */\n filter?: FilterFn | false;\n\n /** Whether to allow entering custom values that are not in the predefined options */\n allowsCustomValue?: boolean;\n /** Whether to commit custom value on blur in allowsCustomValue mode (default: true) */\n shouldCommitOnBlur?: boolean;\n /** Whether to clear selection and input on blur (default: false, only applies to non-custom-value mode) */\n clearOnBlur?: boolean;\n /** Whether the combobox is clearable using ESC key or clear button */\n isClearable?: boolean;\n /** Callback called when the clear button is pressed */\n onClear?: () => void;\n\n /** Left input icon */\n icon?: ReactElement;\n /** Input decoration before the main input */\n prefix?: ReactNode;\n /** Input decoration after the main input */\n suffix?: ReactNode;\n /** Whether to hide the trigger button */\n hideTrigger?: boolean;\n /** Size of the combobox */\n size?: 'small' | 'medium' | 'large' | (string & {});\n\n /** Ref for accessing the input element */\n inputRef?: RefObject<HTMLInputElement>;\n /** Ref for accessing the wrapper element */\n wrapperRef?: RefObject<HTMLDivElement>;\n /** Ref for accessing the listbox element */\n listBoxRef?: RefObject<HTMLDivElement>;\n /** Ref for accessing the popover element */\n popoverRef?: RefObject<HTMLDivElement>;\n /** Ref for accessing the trigger button element */\n triggerRef?: FocusableRef<HTMLButtonElement>;\n\n /** Custom styles for the input */\n inputStyles?: Styles;\n /** Custom styles for the trigger button */\n triggerStyles?: Styles;\n /** Custom styles for the listbox */\n listBoxStyles?: Styles;\n /** Custom styles for the popover overlay */\n overlayStyles?: Styles;\n /** Custom styles for individual options */\n optionStyles?: Styles;\n /** Custom styles for sections */\n sectionStyles?: Styles;\n /** Custom styles for section headings */\n headingStyles?: Styles;\n /** Space between options, in pixels. Defaults to a hairline (`1bw`). */\n listGap?: number;\n\n /** Whether the combobox is disabled */\n isDisabled?: boolean;\n /** Whether the combobox is in loading state */\n isLoading?: boolean;\n /** Keys of disabled items */\n disabledKeys?: Iterable<Key>;\n /** Whether to flip the popover placement */\n shouldFlip?: boolean;\n /** Placement direction for the popover */\n direction?: 'bottom' | 'top';\n /** Offset for the popover */\n overlayOffset?: number;\n /** Minimum padding in pixels between the popover and viewport edges */\n containerPadding?: number;\n /** Whether the combobox is read-only */\n isReadOnly?: boolean;\n /** Suffix position goes before or after the validation and loading statuses */\n suffixPosition?: 'before' | 'after';\n /**\n * Sort selected item to the top when the popover opens.\n * Only works when using the `items` prop (data-driven mode).\n * Ignored when using JSX children.\n * @default true when items are provided, false when using JSX children\n */\n sortSelectedToTop?: boolean;\n /** Callback called when the popover open state changes */\n onOpenChange?: (isOpen: boolean) => void;\n}\n\nconst PROP_STYLES = [...BASE_STYLES, ...OUTER_STYLES, ...COLOR_STYLES];\n\n// ============================================================================\n// Hook: useComboBoxState\n// ============================================================================\ninterface UseComboBoxStateProps {\n selectedKey?: string | null;\n defaultSelectedKey?: string | null;\n inputValue?: string;\n defaultInputValue?: string;\n comboBoxId: string;\n triggerRef?: RefObject<HTMLElement | null>;\n popoverRef?: RefObject<HTMLElement | null>;\n}\n\ninterface UseComboBoxStateReturn {\n effectiveSelectedKey: Key | null;\n effectiveInputValue: string;\n isPopoverOpen: boolean;\n setIsPopoverOpen: (open: boolean) => void;\n setInternalSelectedKey: (key: Key | null) => void;\n setInternalInputValue: (value: string) => void;\n isControlledKey: boolean;\n isControlledInput: boolean;\n}\n\nfunction useComboBoxState({\n selectedKey,\n defaultSelectedKey,\n inputValue,\n defaultInputValue,\n comboBoxId,\n triggerRef,\n popoverRef,\n}: UseComboBoxStateProps): UseComboBoxStateReturn {\n // Internal state for uncontrolled mode\n const [internalSelectedKey, setInternalSelectedKey] = useState<Key | null>(\n defaultSelectedKey ?? null,\n );\n const [internalInputValue, setInternalInputValue] = useState(\n defaultInputValue ?? '',\n );\n\n const isControlledKey = selectedKey !== undefined;\n const isControlledInput = inputValue !== undefined;\n\n const effectiveSelectedKey = isControlledKey\n ? selectedKey\n : internalSelectedKey;\n const effectiveInputValue = isControlledInput\n ? inputValue\n : internalInputValue;\n\n // Popover state\n const [isPopoverOpen, setIsPopoverOpen] = useState(false);\n\n usePopoverSync({\n menuId: comboBoxId,\n isOpen: isPopoverOpen,\n onClose: () => setIsPopoverOpen(false),\n triggerRef,\n containerRef: popoverRef,\n });\n\n return {\n effectiveSelectedKey,\n effectiveInputValue,\n isPopoverOpen,\n setIsPopoverOpen,\n setInternalSelectedKey,\n setInternalInputValue,\n isControlledKey,\n isControlledInput,\n };\n}\n\n// ============================================================================\n// Hook: useComboBoxFiltering\n// ============================================================================\ninterface UseComboBoxFilteringProps {\n effectiveInputValue: string;\n filter: FilterFn | false | undefined;\n}\n\ninterface UseComboBoxFilteringReturn {\n filterFn: (nodes: Iterable<any>) => Iterable<any>;\n isFilterActive: boolean;\n setIsFilterActive: (active: boolean) => void;\n}\n\nfunction useComboBoxFiltering({\n effectiveInputValue,\n filter,\n}: UseComboBoxFilteringProps): UseComboBoxFilteringReturn {\n const [isFilterActive, setIsFilterActive] = useState(false);\n\n const { contains } = useFilter({ sensitivity: 'base' });\n\n const textFilterFn: FilterFn =\n filter === false ? () => true : filter || contains;\n\n // Create a filter function for collection nodes\n const filterFn = (nodes: Iterable<any>) => {\n const term = effectiveInputValue.trim();\n\n // Don't filter if not active or no search term\n if (!isFilterActive || !term) {\n return nodes;\n }\n\n return filterCollectionNodes(nodes, term, textFilterFn);\n };\n\n return {\n filterFn,\n isFilterActive,\n setIsFilterActive,\n };\n}\n\n// ============================================================================\n// Hook: useComboBoxKeyboard\n// ============================================================================\ninterface UseComboBoxKeyboardProps {\n isPopoverOpen: boolean;\n listStateRef: RefObject<any>;\n hasResults: boolean;\n allowsCustomValue?: boolean;\n effectiveInputValue: string;\n isClearable?: boolean;\n onSelectionChange: (selection: Key | Key[] | null) => void;\n onClearValue: () => void;\n onOpenPopover: () => void;\n onClosePopover: () => void;\n inputRef: RefObject<HTMLInputElement>;\n setIsFilterActive: (active: boolean) => void;\n /** Called with the option the arrow keys moved virtual focus to. */\n onVirtualFocus: (key: Key) => void;\n onKeyDown?: TextFieldKeyboardProps['onKeyDown'];\n}\n\nfunction useComboBoxKeyboard({\n isPopoverOpen,\n listStateRef,\n hasResults,\n allowsCustomValue,\n effectiveInputValue,\n isClearable,\n onSelectionChange,\n onClearValue,\n onOpenPopover,\n onClosePopover,\n inputRef,\n setIsFilterActive,\n onVirtualFocus,\n onKeyDown,\n}: UseComboBoxKeyboardProps) {\n // Moves the virtual focus to `key`, if there is one, and scrolls it into view.\n const focusOption = (listState: ListStateLike, key: Key | null) => {\n if (key == null) return;\n\n markKeyboardFocus(listState);\n listState.selectionManager.setFocusedKey(key);\n onVirtualFocus(key);\n };\n\n const handleArrowKey = (e: AriaKeyboardEvent) => {\n e.preventDefault();\n\n // Open popover if closed\n if (!isPopoverOpen) {\n // If opening with no filtered results, disable filter to show all items\n if (!hasResults) setIsFilterActive(false);\n onOpenPopover();\n\n return;\n }\n\n const listState = listStateRef.current;\n\n if (listState) {\n focusOption(\n listState,\n getNextVisibleKey(listState, e.key === 'ArrowDown' ? 1 : -1),\n );\n }\n };\n\n // With no results, Enter commits the typed text as a custom value or clears\n // the selection.\n const commitWithoutResults = (e: AriaKeyboardEvent) => {\n if (!allowsCustomValue) {\n e.preventDefault();\n onSelectionChange(null);\n\n return;\n }\n\n const value = effectiveInputValue.trim();\n\n // Commit the custom value\n onSelectionChange((value as unknown as Key) ?? (null as unknown as Key));\n\n // If popover is closed and we have a value, allow Enter to propagate for form submission\n // If popover is open OR value is empty, prevent default to avoid premature submission\n if (isPopoverOpen || !value) e.preventDefault();\n };\n\n const handleEnterKey = (e: AriaKeyboardEvent) => {\n const listState = isPopoverOpen ? listStateRef.current : null;\n const focusedKey = listState?.selectionManager.focusedKey;\n\n if (focusedKey != null) {\n // If popover is open, select the focused item first\n e.preventDefault();\n listState.selectionManager.select(focusedKey, e);\n // Ensure the popover closes even if selection stays the same\n onClosePopover();\n inputRef.current?.focus();\n } else if (!hasResults) {\n // If no results, handle empty input or custom values\n commitWithoutResults(e);\n } else if ((effectiveInputValue || '').trim() === '') {\n // Clear selection if input is empty and popover is closed (or no focused item)\n e.preventDefault();\n onSelectionChange(null);\n }\n };\n\n const handleEscapeKey = (e: AriaKeyboardEvent) => {\n if (isPopoverOpen) {\n e.preventDefault();\n onClosePopover();\n inputRef.current?.focus();\n } else if (effectiveInputValue && isClearable) {\n e.preventDefault();\n onClearValue();\n }\n };\n\n const handleEdgeKey = (e: AriaKeyboardEvent) => {\n if (!isPopoverOpen) return;\n\n e.preventDefault();\n\n const listState = listStateRef.current;\n\n if (listState) {\n focusOption(\n listState,\n getEdgeVisibleKey(listState, e.key === 'Home' ? 'first' : 'last'),\n );\n }\n };\n\n const { keyboardProps } = useKeyboard({\n onKeyDown: (e) => {\n // The user's handler runs first, and a key it prevents is theirs: skip\n // the built-in handling. Read `isDefaultPrevented()`, not\n // `defaultPrevented` — `useKeyboard` hands over a copy of the event whose\n // `defaultPrevented` field is fixed at the moment it was made.\n onKeyDown?.(e);\n\n if (e.isDefaultPrevented()) return;\n\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n handleArrowKey(e);\n break;\n case 'Enter':\n handleEnterKey(e);\n break;\n case 'Escape':\n handleEscapeKey(e);\n break;\n case 'Home':\n case 'End':\n handleEdgeKey(e);\n break;\n }\n },\n });\n\n return { keyboardProps };\n}\n\n// ============================================================================\n// Component: ComboBoxInput\n// ============================================================================\ninterface ComboBoxInputProps {\n qa?: string;\n inputRef: RefObject<HTMLInputElement>;\n id?: string;\n value: string;\n placeholder?: string;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n autoFocus?: boolean;\n autoComplete?: string;\n size: string;\n mods: Record<string, any>;\n inputStyles?: Styles;\n keyboardProps: any;\n focusProps: any;\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onFocus: (e: React.FocusEvent<HTMLInputElement>) => void;\n isPopoverOpen: boolean;\n hasResults: boolean;\n comboBoxId: string;\n /** The id of the option under virtual focus, while the popover is open. */\n activeDescendant?: string;\n /**\n * The caller's naming and the field's description and message. The input is\n * the control, so they belong on it rather than on the wrapper.\n */\n ariaProps: AriaLabelingProps;\n isInvalid?: boolean;\n}\n\nconst ComboBoxInput = forwardRef<HTMLInputElement, ComboBoxInputProps>(\n function ComboBoxInput(\n {\n qa,\n inputRef,\n id,\n value,\n placeholder,\n isDisabled,\n isReadOnly,\n isRequired,\n autoFocus,\n autoComplete,\n size,\n mods,\n inputStyles,\n keyboardProps,\n focusProps,\n onChange,\n onFocus,\n isPopoverOpen,\n hasResults,\n comboBoxId,\n activeDescendant,\n ariaProps,\n isInvalid,\n },\n ref,\n ) {\n const combinedRef = useCombinedRefs(ref, inputRef);\n\n return (\n <InputElement\n ref={combinedRef}\n qa={qa}\n id={id}\n type=\"text\"\n value={value}\n placeholder={placeholder}\n isDisabled={isDisabled}\n readOnly={isReadOnly}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n data-autofocus={autoFocus ? '' : undefined}\n onChange={onChange}\n onFocus={onFocus}\n onBlur={focusProps.onBlur}\n {...keyboardProps}\n styles={inputStyles}\n mods={mods}\n data-size={size}\n data-input-type=\"combobox\"\n role=\"combobox\"\n // `ComboBox` builds its own trigger rather than going through a\n // react-aria field hook, so nothing else would announce that the field\n // is mandatory — the label marker alone is not exposed to assistive\n // technology.\n aria-required={isRequired || undefined}\n aria-expanded={isPopoverOpen && hasResults}\n aria-haspopup=\"listbox\"\n aria-controls={\n isPopoverOpen && hasResults\n ? `ComboBoxListBox-${comboBoxId}`\n : undefined\n }\n aria-activedescendant={activeDescendant}\n aria-invalid={isInvalid || undefined}\n {...ariaProps}\n />\n );\n },\n);\n\n// ============================================================================\n// Main Component: ComboBox\n// ============================================================================\nexport const ComboBox = forwardRef(function ComboBox<T extends object>(\n props: CubeComboBoxProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n props = useFieldProps(props, {\n valuePropsMapper: ({ value, onChange }) => {\n return {\n // Form value maps to selectedKey (the committed value) in both modes\n selectedKey: value ?? null,\n onSelectionChange(val: string | null) {\n // Commit selection changes to the form\n onChange(val);\n },\n };\n },\n });\n\n const { t } = useI18n();\n\n let {\n qa,\n label,\n extra,\n labelStyles,\n isRequired,\n necessityIndicator,\n isInvalid,\n isValid,\n id,\n icon,\n prefix,\n isDisabled,\n autoFocus,\n autoComplete = 'off',\n wrapperRef,\n inputRef,\n triggerRef,\n popoverRef,\n listBoxRef,\n isLoading,\n inputStyles,\n optionStyles,\n triggerStyles,\n listBoxStyles,\n overlayStyles,\n suffix,\n hideTrigger,\n message,\n description,\n size = 'medium',\n direction = 'bottom',\n shouldFlip = true,\n popoverTrigger = 'input',\n suffixPosition = 'before',\n filter,\n styles,\n labelSuffix,\n selectedKey,\n defaultSelectedKey,\n inputValue,\n defaultInputValue,\n onInputChange,\n isClearable,\n onClear,\n placeholder,\n allowsCustomValue,\n shouldCommitOnBlur = true,\n clearOnBlur,\n items,\n children: renderChildren,\n sectionStyles,\n headingStyles,\n listGap,\n isReadOnly,\n overlayOffset = 8,\n containerPadding = 8,\n onSelectionChange: externalOnSelectionChange,\n sortSelectedToTop: sortSelectedToTopProp,\n onOpenChange,\n onFocus,\n onBlur,\n onKeyDown,\n form,\n ...otherProps\n } = props;\n\n // Generate a unique ID for this combobox instance\n const comboBoxId = useMemo(() => generateRandomId(), []);\n\n // Hoist the wrapper/popover ref normalization above `useComboBoxState` so\n // the popover-sync inside it sees stable, attached refs. Other ref combines\n // happen below alongside the legacy ordering.\n wrapperRef = useCombinedRefs(wrapperRef);\n popoverRef = useCombinedRefs(popoverRef);\n\n // State management hook\n const {\n effectiveSelectedKey,\n effectiveInputValue,\n isPopoverOpen,\n setIsPopoverOpen,\n setInternalSelectedKey,\n setInternalInputValue,\n isControlledKey,\n isControlledInput,\n } = useComboBoxState({\n selectedKey,\n defaultSelectedKey,\n inputValue,\n defaultInputValue,\n comboBoxId,\n triggerRef: wrapperRef as RefObject<HTMLElement | null>,\n popoverRef: popoverRef as RefObject<HTMLElement | null>,\n });\n\n // Track if sortSelectedToTop was explicitly provided\n const sortSelectedToTopExplicit = sortSelectedToTopProp !== undefined;\n // Default to true if items are provided, false otherwise\n const sortSelectedToTop = sortSelectedToTopProp ?? (items ? true : false);\n\n // Cache for sorted items array when using `items` prop\n const cachedItemsOrder = useRef<T[] | null>(null);\n const selectionWhenClosed = useRef<string | null>(null);\n\n styles = extractStyles(otherProps, PROP_STYLES, styles);\n\n ref = useCombinedRefs(ref);\n inputRef = useCombinedRefs(inputRef);\n triggerRef = useCombinedRefs(triggerRef);\n listBoxRef = useCombinedRefs(listBoxRef);\n\n // Sort items with selected on top if enabled\n const getSortedItems = useCallback((): typeof items => {\n if (!items) return items;\n\n if (!sortSelectedToTop) return items;\n\n // Reuse cached order if available\n if (cachedItemsOrder.current) {\n return cachedItemsOrder.current;\n }\n\n // Warn if explicitly requested but not supported\n if (sortSelectedToTopExplicit && !items) {\n console.warn(\n 'ComboBox: sortSelectedToTop only works with the items prop. ' +\n 'Sorting will be skipped when using JSX children.',\n );\n return items;\n }\n\n const selectedKey = isPopoverOpen\n ? effectiveSelectedKey\n : selectionWhenClosed.current;\n\n if (!selectedKey) return items;\n\n const itemsArray = Array.isArray(items) ? items : Array.from(items);\n const selectedItem = itemsArray.find((item) => {\n const key = (item as any)?.key ?? (item as any)?.id;\n return key != null && String(key) === String(selectedKey);\n });\n\n if (!selectedItem) return items;\n\n const sorted = [\n selectedItem,\n ...itemsArray.filter((item) => {\n const key = (item as any)?.key ?? (item as any)?.id;\n return key == null || String(key) !== String(selectedKey);\n }),\n ] as T[];\n\n if (isPopoverOpen) {\n cachedItemsOrder.current = sorted;\n }\n\n return sorted;\n }, [\n items,\n sortSelectedToTop,\n sortSelectedToTopExplicit,\n effectiveSelectedKey,\n isPopoverOpen,\n ]);\n\n const sortedItems = getSortedItems();\n\n // Preserve the original `children` (may be a render function) before we\n // potentially overwrite it.\n let children: ReactNode = renderChildren as ReactNode;\n\n const renderFn = renderChildren as unknown;\n\n if (sortedItems && typeof renderFn === 'function') {\n try {\n const itemsArray = Array.from(sortedItems as Iterable<any>);\n children = itemsArray.map((item, idx) => {\n const rendered = (renderFn as (it: any) => ReactNode)(item);\n if (\n React.isValidElement(rendered) &&\n (rendered as ReactElement).key == null\n ) {\n return React.cloneElement(rendered as ReactElement, {\n key: (rendered as any)?.key ?? item?.key ?? idx,\n });\n }\n\n return rendered as ReactNode;\n });\n } catch {\n // If conversion fails, proceed with the original children\n }\n }\n\n // Invalidate cached sorting whenever items change\n useEffect(() => {\n cachedItemsOrder.current = null;\n }, [items]);\n\n // Capture selection when popover closes\n useEffect(() => {\n if (!isPopoverOpen) {\n selectionWhenClosed.current =\n effectiveSelectedKey != null ? String(effectiveSelectedKey) : null;\n cachedItemsOrder.current = null;\n }\n }, [isPopoverOpen, effectiveSelectedKey]);\n\n // Call onOpenChange when popover state changes\n useEffect(() => {\n onOpenChange?.(isPopoverOpen);\n }, [isPopoverOpen]);\n\n // Filtering hook\n const { filterFn, isFilterActive, setIsFilterActive } = useComboBoxFiltering({\n effectiveInputValue,\n filter,\n });\n\n // Create local collection state for reading item data (labels, etc.)\n // This allows us to read item labels even before the popover opens\n const localCollectionState = useListState({\n children: children as CollectionChildren<T>,\n items: sortedItems,\n selectionMode: 'none', // Don't manage selection in this state\n });\n\n const { isFocused, focusProps } = useFocus();\n\n // Helper to check if current input value is valid\n const checkInputValidity = useCallback(() => {\n if (!effectiveInputValue.trim()) {\n return { isInputValid: false, singleMatchKey: null, filteredCount: 0 };\n }\n\n // Get filtered collection based on current input\n const filteredNodes = filterFn(localCollectionState.collection);\n const filteredItems: Array<{ key: Key; textValue: string }> = [];\n\n // Flatten filtered nodes (handle sections)\n for (const node of filteredNodes) {\n if (node.type === 'section' && node.childNodes) {\n for (const child of node.childNodes) {\n if (child.type === 'item') {\n filteredItems.push({\n key: child.key,\n textValue: child.textValue || '',\n });\n }\n }\n } else if (node.type === 'item') {\n filteredItems.push({\n key: node.key,\n textValue: node.textValue || '',\n });\n }\n }\n\n const filteredCount = filteredItems.length;\n\n // Check for exact match\n const exactMatch = filteredItems.find(\n (item) =>\n item.textValue.toLowerCase() ===\n effectiveInputValue.trim().toLowerCase(),\n );\n\n if (exactMatch) {\n return {\n isInputValid: true,\n singleMatchKey: exactMatch.key,\n filteredCount,\n };\n }\n\n // If exactly one filtered result, consider it valid\n if (filteredCount === 1) {\n return {\n isInputValid: true,\n singleMatchKey: filteredItems[0].key,\n filteredCount,\n };\n }\n\n return { isInputValid: false, singleMatchKey: null, filteredCount };\n }, [effectiveInputValue, filterFn, localCollectionState.collection]);\n\n // ---- blur ---------------------------------------------------------------\n // Writes the selected key, unless it is controlled. Unlike `setInputText` it\n // does not report: each blur outcome calls `onSelectionChange` itself, in\n // the order it has always fired relative to `onInputChange`.\n const setSelectedKey = (key: Key | null) => {\n if (!isControlledKey) setInternalSelectedKey(key);\n };\n\n // Writes the input text, unless it is controlled, and reports it.\n const setInputText = (value: string) => {\n if (!isControlledInput) setInternalInputValue(value);\n onInputChange?.(value);\n };\n\n const clearSelectionAndInput = () => {\n externalOnSelectionChange?.(null);\n setSelectedKey(null);\n setInputText('');\n };\n\n // Reset input to show current selection (or empty if none)\n const restoreSelectedLabel = () => {\n setInputText(\n effectiveSelectedKey != null ? getItemLabel(effectiveSelectedKey) : '',\n );\n };\n\n // In allowsCustomValue mode: commit the input value if it's non-empty and\n // nothing is selected, clear the selection if the input is empty.\n const settleCustomValueOnBlur = () => {\n if (\n shouldCommitOnBlur &&\n effectiveInputValue &&\n effectiveSelectedKey == null\n ) {\n externalOnSelectionChange?.(effectiveInputValue as string);\n setSelectedKey(effectiveInputValue as Key);\n } else if (!String(effectiveInputValue).trim()) {\n clearSelectionAndInput();\n } else {\n restoreSelectedLabel();\n }\n };\n\n // In non-custom-value mode: auto-select the exact match, or the only filtered\n // result; clear invalid input (no exact match, not a single result) when\n // clearOnBlur is set or the input is empty.\n const settleOptionOnBlur = () => {\n const { isInputValid, singleMatchKey } = checkInputValidity();\n\n if (\n isInputValid &&\n singleMatchKey != null &&\n singleMatchKey !== effectiveSelectedKey\n ) {\n const label = getItemLabel(singleMatchKey);\n\n setSelectedKey(singleMatchKey);\n setInputText(label);\n externalOnSelectionChange?.(singleMatchKey as string | null);\n } else if (!isInputValid && (clearOnBlur || !effectiveInputValue.trim())) {\n clearSelectionAndInput();\n } else {\n restoreSelectedLabel();\n }\n };\n\n // Composite blur handler - fires when focus leaves the entire component\n const handleCompositeBlur = useEvent(() => {\n setIsPopoverOpen(false);\n\n if (allowsCustomValue) {\n settleCustomValueOnBlur();\n } else {\n settleOptionOnBlur();\n }\n\n onBlur?.();\n // Only now: the validity check above needs the filter still active.\n setIsFilterActive(false);\n });\n\n // Composite focus hook - handles focus tracking across wrapper and portaled popover\n const { compositeFocusProps } = useCompositeFocus({\n wrapperRef,\n popoverRef,\n onFocus,\n onBlur: handleCompositeBlur,\n isDisabled,\n });\n\n let validationIcon = getValidationIcon({ isInvalid, isValid });\n\n // Ref to access internal ListBox state\n const listStateRef = useRef<any>(null);\n const focusInitAttemptsRef = useRef(0);\n // The option under virtual focus, mirrored in state for the input's\n // `aria-activedescendant`: the listbox's own state update does not re-render\n // this component.\n const [activeOptionKey, setActiveOptionKey] = useState<Key | null>(null);\n\n // Helper to get label from local collection\n const getItemLabel = useCallback(\n (key: Key): string => {\n const item = localCollectionState?.collection?.getItem(key);\n return item?.textValue || String(key);\n },\n [localCollectionState?.collection],\n );\n\n // Selection change handler\n const handleSelectionChange = useEvent((selection: Key | Key[] | null) => {\n // Extract single key from selection (we only support single selection)\n const key = Array.isArray(selection) ? selection[0] : selection;\n\n // Update selected key\n if (!isControlledKey) {\n setInternalSelectedKey(key ?? null);\n }\n\n // Update input value to show selected item label\n if (key != null) {\n setIsFilterActive(false);\n\n const label = getItemLabel(key);\n\n if (!isControlledInput) {\n setInternalInputValue(label);\n }\n onInputChange?.(label);\n } else {\n // Clear input when selection is cleared\n if (!isControlledInput) {\n setInternalInputValue('');\n }\n onInputChange?.('');\n setIsFilterActive(false);\n }\n\n externalOnSelectionChange?.(key as string | null);\n\n // Close popover after selection\n setIsPopoverOpen(false);\n\n // Focus input\n setTimeout(() => {\n inputRef.current?.focus();\n }, 0);\n });\n\n const lastSyncedSelectedKey = useRef<Key | null | undefined>(undefined);\n const selectionClearedByTyping = useRef(false);\n\n // Input change handler\n const handleInputChange = useEvent(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n\n // Update input value\n if (!isControlledInput) {\n setInternalInputValue(value);\n }\n onInputChange?.(value);\n\n const trimmed = value.trim();\n setIsFilterActive(trimmed.length > 0);\n\n // Only clear selection in allowsCustomValue mode\n // In normal mode, typing just filters - selection stays until explicitly changed\n if (allowsCustomValue && effectiveSelectedKey != null) {\n selectionClearedByTyping.current = true;\n if (!isControlledKey) {\n setInternalSelectedKey(null);\n }\n externalOnSelectionChange?.(null);\n }\n\n // Open popover based on trigger\n if (popoverTrigger !== 'manual' && value && !isPopoverOpen) {\n setIsPopoverOpen(true);\n }\n },\n );\n\n // Initialize input value from defaultInputValue or defaultSelectedKey (uncontrolled mode only, one-time)\n const [hasInitialized, setHasInitialized] = useState(false);\n\n useEffect(() => {\n // Only initialize once, in uncontrolled input mode\n if (hasInitialized || isControlledInput) return;\n\n // Priority 1: defaultInputValue takes precedence\n if (defaultInputValue !== undefined) {\n setInternalInputValue(defaultInputValue);\n setHasInitialized(true);\n return;\n }\n\n // Priority 2: fall back to defaultSelectedKey's label\n if (defaultSelectedKey) {\n const label = getItemLabel(defaultSelectedKey);\n\n setInternalInputValue(label);\n setHasInitialized(true);\n }\n }, [\n hasInitialized,\n isControlledInput,\n defaultInputValue,\n defaultSelectedKey,\n getItemLabel,\n children,\n ]);\n\n // Sync input value with controlled selectedKey\n useEffect(() => {\n const preserveTypedInput = selectionClearedByTyping.current;\n selectionClearedByTyping.current = false;\n // Only run when selectedKey is controlled but inputValue is uncontrolled\n if (!isControlledKey || isControlledInput) return;\n\n // Skip if the key hasn't actually changed (prevents unnecessary resets when collection rebuilds)\n if (\n lastSyncedSelectedKey.current !== undefined &&\n lastSyncedSelectedKey.current === effectiveSelectedKey\n ) {\n return;\n }\n\n lastSyncedSelectedKey.current = effectiveSelectedKey;\n\n // Acknowledging the selection cleared by this edit must not erase the\n // text that caused it. Later external clears still reset the input.\n if (preserveTypedInput && effectiveSelectedKey == null) return;\n\n // Get the expected label for the current selection\n const expectedLabel =\n effectiveSelectedKey != null ? getItemLabel(effectiveSelectedKey) : '';\n\n // Update the input value to match the selected key's label\n setInternalInputValue(expectedLabel);\n }, [\n isControlledKey,\n isControlledInput,\n effectiveSelectedKey,\n effectiveInputValue,\n getItemLabel,\n ]);\n\n // Input focus handler\n const handleInputFocus = useEvent((e: React.FocusEvent<HTMLInputElement>) => {\n // Call focus props handler if it exists\n focusProps.onFocus?.(e as any);\n\n if (popoverTrigger === 'focus' && !isPopoverOpen) {\n setIsPopoverOpen(true);\n }\n });\n\n // Input blur handler - just handles internal focus props\n const handleInputBlur = useEvent((e: React.FocusEvent<HTMLInputElement>) => {\n focusProps.onBlur?.(e as any);\n });\n\n // Clear button logic\n let hasValue = allowsCustomValue\n ? effectiveInputValue !== ''\n : effectiveSelectedKey != null;\n let showClearButton = isClearable && hasValue && !isDisabled && !isReadOnly;\n\n // Check if there are any results after filtering\n const hasResults = useMemo(() => {\n if (!children) return false;\n if (!Array.isArray(children) && children === null) return false;\n\n // If we have a collection, check if filtering will produce any results\n if (localCollectionState?.collection) {\n const filteredNodes = filterFn(localCollectionState.collection);\n const resultArray = Array.from(filteredNodes).flatMap((node: any) => {\n if (node.type === 'section' && node.childNodes) {\n return [...node.childNodes];\n }\n\n return [node];\n });\n return resultArray.length > 0;\n }\n\n // Fallback: check if children exists\n return Array.isArray(children) ? children.length > 0 : true;\n }, [children, localCollectionState?.collection, filterFn]);\n\n // Clear function\n let clearValue = useEvent(() => {\n // Clear input\n if (!isControlledInput) {\n setInternalInputValue('');\n }\n onInputChange?.('');\n\n // Clear selection\n if (!isControlledKey) {\n setInternalSelectedKey(null);\n }\n externalOnSelectionChange?.(null);\n\n // Close popover\n if (isPopoverOpen) {\n setIsPopoverOpen(false);\n }\n\n // Focus input\n inputRef.current?.focus();\n\n onClear?.();\n });\n\n // Keyboard navigation hook\n const { keyboardProps } = useComboBoxKeyboard({\n isPopoverOpen,\n listStateRef,\n hasResults,\n allowsCustomValue,\n effectiveInputValue,\n isClearable,\n onSelectionChange: handleSelectionChange,\n onClearValue: clearValue,\n onOpenPopover: () => setIsPopoverOpen(true),\n onClosePopover: () => setIsPopoverOpen(false),\n inputRef,\n setIsFilterActive,\n onVirtualFocus: setActiveOptionKey,\n onKeyDown,\n });\n\n if (icon) {\n icon = <div data-element=\"InputIcon\">{icon}</div>;\n\n if (prefix) {\n prefix = (\n <>\n {icon}\n {prefix}\n </>\n );\n } else {\n prefix = icon;\n }\n }\n\n let mods = useMemo(\n () => ({\n ...getValidationMods({ isInvalid, isValid }),\n disabled: isDisabled,\n hovered: false,\n focused: isFocused,\n loading: isLoading,\n prefix: !!prefix,\n suffix: true,\n clearable: showClearButton,\n }),\n [\n isInvalid,\n isValid,\n isDisabled,\n isFocused,\n isLoading,\n prefix,\n showClearButton,\n ],\n );\n\n const comboBoxWidth = wrapperRef?.current?.offsetWidth;\n\n const shouldShowPopover = Boolean(isPopoverOpen && hasResults);\n\n // Close popover if no results\n useEffect(() => {\n if (isPopoverOpen && !hasResults) {\n setIsPopoverOpen(false);\n }\n }, [isPopoverOpen, hasResults]);\n\n const ensureInitialFocus = useCallback(() => {\n if (!shouldShowPopover) return;\n\n const listState = listStateRef.current;\n if (!listState) return;\n\n const { selectionManager, collection, disabledKeys, lastFocusSourceRef } =\n listState;\n if (!selectionManager || !collection) return;\n\n const collectFirstKey = (): Key | null => {\n for (const node of collection) {\n if (node.type === 'item') {\n if (!disabledKeys?.has(node.key)) return node.key;\n } else if (node.childNodes) {\n for (const child of node.childNodes) {\n if (child.type === 'item' && !disabledKeys?.has(child.key)) {\n return child.key;\n }\n }\n }\n }\n return null;\n };\n\n if (lastFocusSourceRef) lastFocusSourceRef.current = 'keyboard';\n\n // Check if we need to set or update focus\n const currentFocusedKey = selectionManager.focusedKey;\n let needsRefocus = false;\n\n if (currentFocusedKey == null) {\n // No focus at all - need to set initial focus\n needsRefocus = true;\n } else {\n // Check if currently focused key still exists in the collection\n const focusedItemExists = collection.getItem(currentFocusedKey) != null;\n if (!focusedItemExists) {\n // Focused item was filtered out - need to refocus\n needsRefocus = true;\n }\n }\n\n if (!needsRefocus) {\n setActiveOptionKey(currentFocusedKey);\n } else {\n let keyToFocus: Key | null = null;\n\n // First try to focus on the selected key if it exists in the collection\n if (\n effectiveSelectedKey != null &&\n collection.getItem(effectiveSelectedKey) != null\n ) {\n keyToFocus = effectiveSelectedKey;\n } else {\n // Fall back to the first key in the collection\n keyToFocus = collectFirstKey();\n }\n\n if (keyToFocus != null) {\n selectionManager.setFocusedKey(keyToFocus);\n setActiveOptionKey(keyToFocus);\n }\n }\n }, [shouldShowPopover, effectiveSelectedKey, setActiveOptionKey]);\n\n useLayoutEffect(() => {\n if (!shouldShowPopover) return;\n focusInitAttemptsRef.current = 0;\n\n const tick = () => {\n if (!shouldShowPopover) return;\n ensureInitialFocus();\n focusInitAttemptsRef.current += 1;\n // Try a few frames to wait for collection to mount\n if (\n focusInitAttemptsRef.current < 8 &&\n listStateRef.current?.selectionManager?.focusedKey == null\n ) {\n requestAnimationFrame(tick);\n }\n };\n\n requestAnimationFrame(() => requestAnimationFrame(tick));\n }, [shouldShowPopover, ensureInitialFocus]);\n\n const comboBoxField = (\n <ComboBoxWrapperElement\n ref={wrapperRef}\n mods={mods}\n styles={styles}\n style={{\n zIndex: isFocused ? 1 : 'initial',\n }}\n data-size={size}\n {...compositeFocusProps}\n >\n {prefix ? <div data-element=\"Prefix\">{prefix}</div> : null}\n <ComboBoxInput\n qa={qa || 'ComboBox'}\n inputRef={inputRef}\n id={id}\n value={effectiveInputValue}\n placeholder={placeholder}\n isDisabled={isDisabled}\n isReadOnly={isReadOnly}\n isRequired={isRequired}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n size={size}\n mods={mods}\n inputStyles={inputStyles}\n keyboardProps={keyboardProps}\n focusProps={{ ...focusProps, onBlur: handleInputBlur }}\n isPopoverOpen={isPopoverOpen}\n hasResults={hasResults}\n comboBoxId={comboBoxId}\n activeDescendant={\n shouldShowPopover && activeOptionKey != null\n ? getListBoxOptionId(\n `ComboBoxListBox-${comboBoxId}`,\n activeOptionKey,\n )\n : undefined\n }\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n ariaProps={{\n 'aria-label': (props as AriaLabelingProps)['aria-label'],\n 'aria-labelledby': (props as AriaLabelingProps)['aria-labelledby'],\n 'aria-describedby': (props as AriaLabelingProps)['aria-describedby'],\n }}\n isInvalid={isInvalid}\n />\n <div data-element=\"Suffix\">\n {suffixPosition === 'before' ? suffix : null}\n {isLoading ? <LoadingIcon data-element=\"InputIcon\" /> : validationIcon}\n {suffixPosition === 'after' ? suffix : null}\n {showClearButton && (\n <Item.Action\n icon={<CloseIcon />}\n size={size}\n // No `theme` — the default `current` type inherits the input's own\n // text color, which is already validation-tinted, so the button\n // matches the text beside it exactly instead of using the fixed\n // `danger.clear` palette.\n qa=\"ComboBoxClearButton\"\n data-no-trigger={hideTrigger ? '' : undefined}\n data-popover-dismiss=\"\"\n aria-label={t('comboBox.clearValue', 'Clear value')}\n onPress={clearValue}\n />\n )}\n {!hideTrigger ? (\n <Item.Action\n ref={triggerRef}\n data-popover-trigger\n icon={<DirectionIcon to={isPopoverOpen ? 'up' : 'down'} />}\n qa=\"ComboBoxTrigger\"\n mods={{\n pressed: isPopoverOpen,\n disabled: isDisabled,\n loading: isLoading,\n }}\n data-size={size}\n isDisabled={isDisabled}\n styles={triggerStyles}\n aria-expanded={isPopoverOpen}\n aria-haspopup=\"listbox\"\n aria-label={t('comboBox.showOptions', 'Show options')}\n onPress={() => {\n if (!isDisabled) {\n const willOpen = !isPopoverOpen;\n setIsPopoverOpen(willOpen);\n if (willOpen) {\n inputRef.current?.focus();\n // If opening with no filtered results, disable filter to show all items\n if (!hasResults) {\n setIsFilterActive(false);\n }\n }\n }\n }}\n />\n ) : null}\n </div>\n <ListBoxPopover\n isOpen={shouldShowPopover}\n triggerRef={wrapperRef as RefObject<HTMLElement>}\n popoverRef={popoverRef}\n listBoxRef={listBoxRef}\n direction={direction}\n shouldFlip={shouldFlip}\n overlayOffset={overlayOffset}\n containerPadding={containerPadding}\n comboBoxWidth={comboBoxWidth}\n listBoxId={`ComboBoxListBox-${comboBoxId}`}\n overlayStyles={overlayStyles}\n listBoxStyles={listBoxStyles}\n optionStyles={optionStyles}\n sectionStyles={sectionStyles}\n headingStyles={headingStyles}\n listGap={listGap}\n selectedKey={effectiveSelectedKey}\n isDisabled={isDisabled}\n disabledKeys={props.disabledKeys}\n items={sortedItems}\n listStateRef={listStateRef}\n label={label}\n ariaLabel={(props as any)['aria-label']}\n compositeFocusProps={compositeFocusProps}\n filter={filterFn}\n size={size}\n onSelectionChange={handleSelectionChange}\n onClose={() => setIsPopoverOpen(false)}\n >\n {children}\n </ListBoxPopover>\n </ComboBoxWrapperElement>\n );\n\n const { children: _, ...propsWithoutChildren } = props;\n\n return wrapWithField<Omit<CubeComboBoxProps<T>, 'children'>>(\n comboBoxField,\n ref,\n propsWithoutChildren,\n );\n}) as unknown as (<T>(\n props: CubeComboBoxProps<T> & { ref?: ForwardedRef<HTMLDivElement> },\n) => ReactElement) & { Item: typeof Item; Section: typeof BaseSection };\n\nComboBox.Item = Item;\n\nComboBox.Section = BaseSection;\n\nObject.defineProperty(ComboBox, 'cubeInputType', {\n value: 'ComboBox',\n enumerable: false,\n configurable: false,\n});\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.194.0 | Cube Dev Team */
|
|
2
2
|
import { mergeStyleLayers } from "../../../utils/styles.js";
|
|
3
3
|
import { chain } from "../../../utils/react/chain.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.194.0 | Cube Dev Team */
|
|
2
2
|
import { getCaretRect } from "./caretPosition.js";
|
|
3
3
|
import { c } from "react/compiler-runtime";
|
|
4
4
|
import { useEffect, useLayoutEffect, useRef } from "react";
|