@cube-dev/ui-kit 0.185.3 → 0.186.1
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 +30 -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.js +1 -1
- package/dist/components/GlobalStyles.js +23 -21
- package/dist/components/GlobalStyles.js.map +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/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 +128 -66
- 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.js +451 -280
- 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 +57 -93
- package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemActionsWrapper.js +1 -1
- package/dist/components/actions/ItemActionsWrapper.js.map +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +49 -69
- package/dist/components/actions/Menu/Menu.js.map +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/actions-run.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +5 -2
- package/dist/components/content/Badge/Badge.js.map +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js.map +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +44 -60
- package/dist/components/content/Disclosure/Disclosure.js.map +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +39 -65
- package/dist/components/content/InlineInput/InlineInput.js.map +1 -1
- package/dist/components/content/Item/Item.js +208 -263
- package/dist/components/content/Item/Item.js.map +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +70 -145
- package/dist/components/content/ItemBadge/ItemBadge.js.map +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 +39 -18
- package/dist/components/content/Layout/LayoutContainer.js.map +1 -1
- package/dist/components/content/Layout/LayoutContent.js +100 -48
- package/dist/components/content/Layout/LayoutContent.js.map +1 -1
- package/dist/components/content/Layout/LayoutContext.js +211 -95
- package/dist/components/content/Layout/LayoutContext.js.map +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/LayoutFooter.js.map +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 +240 -123
- package/dist/components/content/Layout/LayoutPane.js.map +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js.map +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/hooks/useTinyScrollbar.js.map +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +28 -48
- package/dist/components/content/Result/Result.js.map +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.d.ts +14 -14
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +9 -17
- package/dist/components/content/TextItem/TextItem.js.map +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +1 -1
- package/dist/components/content/Tree/TreeNode.js +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/use-checkbox-tree.js +68 -105
- package/dist/components/content/Tree/use-checkbox-tree.js.map +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 +106 -138
- package/dist/components/content/use-auto-tooltip.js.map +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/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 +1 -1
- package/dist/components/data/TableBase/column-menu.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.js +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-order.js +30 -31
- package/dist/components/data/TableBase/use-column-order.js.map +1 -1
- 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 +38 -42
- package/dist/components/data/TableBase/use-table-sort.js.map +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +19 -57
- package/dist/components/data/TableBase/use-table-sorts.js.map +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.js +55 -64
- package/dist/components/data/TableBase/use-table-tree-state.js.map +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
- package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- 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 +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +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 +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/ListBox/optionId.js +1 -1
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +111 -108
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +1 -1
- package/dist/components/fields/ListBoxPopover/listNavigation.js +4 -3
- package/dist/components/fields/ListBoxPopover/listNavigation.js.map +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +1 -1
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +109 -69
- package/dist/components/fields/ListBoxPopover/useCompositeFocus.js.map +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/PasswordInput/PasswordInput.js.map +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js.map +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.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js.map +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/SliderThumb.js.map +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js.map +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.d.ts +9 -2
- package/dist/components/fields/TagInput/TagInput.js +911 -1157
- package/dist/components/fields/TagInput/TagInput.js.map +1 -1
- package/dist/components/fields/TagInput/TagList.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 +1 -1
- package/dist/components/fields/TriggerActions.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +1 -1
- 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.js +1 -1
- package/dist/components/form/Form/Field.js +10 -15
- package/dist/components/form/Form/Field.js.map +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/react.js.map +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 +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/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 +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Board/Board.js +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/BoardResponsive.js +1 -1
- package/dist/components/layout/Board/Widget.js +1 -1
- package/dist/components/layout/Board/WidgetHost.js +1 -1
- package/dist/components/layout/Board/board-context.js +1 -1
- package/dist/components/layout/Board/board-store.js +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/placement.js +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +1 -1
- package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
- package/dist/components/layout/Board/use-board-selection.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 +129 -48
- package/dist/components/layout/Panel.js.map +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 +227 -347
- package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js.map +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/TabButton.js.map +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/TabsAction.js.map +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js.map +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/CalendarGrid.js.map +1 -1
- package/dist/components/other/Calendar/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +497 -515
- package/dist/components/other/Calendar/CalendarPanel.js.map +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js.map +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/Dialog.js.map +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/use-content-overflow.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +266 -161
- package/dist/components/overlays/Notifications/OverlayContainer.js.map +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 +18 -9
- package/dist/components/overlays/Notifications/use-persistent-notifications.js.map +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/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 +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 +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/instance.js +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +1 -1
- package/dist/i18n/locales/en-US/uikit.js +1 -1
- package/dist/i18n/locales/es-ES/uikit.js +1 -1
- package/dist/i18n/locales/es-MX/uikit.js +1 -1
- package/dist/i18n/locales/fr-FR/uikit.js +1 -1
- package/dist/i18n/locales/it-IT/uikit.js +1 -1
- package/dist/i18n/locales/ja-JP/uikit.js +1 -1
- package/dist/i18n/locales/nb-NO/uikit.js +1 -1
- package/dist/i18n/locales/pt-BR/uikit.js +1 -1
- package/dist/i18n/locales/pt-PT/uikit.js +1 -1
- package/dist/i18n/locales/sv-SE/uikit.js +1 -1
- package/dist/i18n/locales/vi-VN/uikit.js +1 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useFormatter.js.map +1 -1
- package/dist/i18n/useI18n.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/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.js +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 +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- 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/escapePropagation.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/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/useKeySymbols.js.map +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/usePopoverSync.js.map +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 +3 -3
- package/docs/CreateComponent.md +3 -1
- package/docs/components/fields/TagInput.md +8 -8
- package/docs/tasty/ai-agents.md +21 -2
- package/docs/tasty/dsl.md +4 -2
- package/docs/tasty/getting-started.md +13 -11
- package/docs/tasty/methodology.md +2 -2
- package/docs/tasty/pipeline.md +29 -8
- package/docs/tasty/plugins.md +1 -1
- package/docs/tasty/styles.md +23 -5
- package/docs/tasty/tasty-static.md +1 -1
- package/package.json +3 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.186.1 | Cube Dev Team */
|
|
2
2
|
//#region src/utils/react/nullableValue.ts
|
|
3
3
|
function castNullableStringValue(props) {
|
|
4
4
|
return castNullableField(props, ["value", "defaultValue"], "string", (v) => String(v));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.186.1 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../_internal/hooks/use-event.js";
|
|
3
3
|
import { isDevEnv } from "../is-dev-env.js";
|
|
4
4
|
import { c } from "react-compiler-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.186.1 | Cube Dev Team */
|
|
2
2
|
import { c } from "react-compiler-runtime";
|
|
3
3
|
import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef } from "react";
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.186.1 | Cube Dev Team */
|
|
2
2
|
import { useLayoutEffect as useLayoutEffect$1 } from "./useLayoutEffect.js";
|
|
3
3
|
import { c } from "react-compiler-runtime";
|
|
4
4
|
import { useEffect, useRef, useState } from "react";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeySymbols.js","names":["
|
|
1
|
+
{"version":3,"file":"useKeySymbols.js","names":["useIsDarwin","COMMON","Record","esc","escape","enter","return","space","backspace","delete","up","arrowup","down","arrowdown","left","arrowleft","right","arrowright","MAC","mod","meta","cmd","command","ctrl","control","alt","option","shift","PC","win","windows","useKeySymbols","combo","$","_c","isDarwin","modifiers","t0","t1","alternative","split","map","part","key","trim","toUpperCase","_temp","filter","Boolean","raw","toLowerCase"],"sources":["../../../src/utils/react/useKeySymbols.ts"],"sourcesContent":["import { useIsDarwin } from './useIsDarwin';\n\n/* symbols that are identical on every OS */\nconst COMMON: Record<string, string> = {\n esc: 'Esc',\n escape: 'Esc',\n enter: '⏎',\n return: '⏎',\n space: '␣',\n backspace: '⌫',\n delete: '⌦',\n up: '↑',\n arrowup: '↑',\n down: '↓',\n arrowdown: '↓',\n left: '←',\n arrowleft: '←',\n right: '→',\n arrowright: '→',\n};\n\n/* modifiers for macOS / iOS */\nconst MAC: Record<string, string> = {\n mod: '⌘',\n meta: '⌘',\n cmd: '⌘',\n command: '⌘',\n ctrl: '⌃',\n control: '⌃',\n alt: '⌥',\n option: '⌥',\n shift: '⇧',\n};\n\n/* modifiers for Windows / Linux */\nconst PC: Record<string, string> = {\n mod: 'Ctrl',\n ctrl: 'Ctrl',\n control: 'Ctrl',\n meta: 'Win',\n win: 'Win',\n windows: 'Win',\n cmd: 'Win',\n command: 'Win',\n alt: '⎇',\n option: '⎇',\n shift: '⇧',\n};\n\n/**\n * useKeySymbols\n * -------------\n * Turns an author string such as\n * \"mod+k, ctrl+k\"\n * into\n * [[\"⌘\", \"K\"], [\"Ctrl\", \"K\"]]\n */\nexport function useKeySymbols(combo: string): string[][] {\n const isDarwin = useIsDarwin(); // ⌘ by default during SSR\n const modifiers = isDarwin ? MAC : PC;\n\n /** split on commas, trim each alternative */\n return combo\n .split(',')\n .map((raw) => raw.trim().toLowerCase())\n .filter(Boolean) // drop empty fragments\n .map((alternative) =>\n alternative.split('+').map((part) => {\n const key = part.trim();\n return (\n modifiers[key] ?? // platform-specific modifier\n COMMON[key] ?? // shared glyphs\n part.toUpperCase() // plain key\n );\n }),\n );\n}\n"],"mappings":";;;;;AAGA,MAAMC,SAAiC;CACrCE,KAAK;CACLC,QAAQ;CACRC,OAAO;CACPC,QAAQ;CACRC,OAAO;CACPC,WAAW;CACXC,QAAQ;CACRC,IAAI;CACJC,SAAS;CACTC,MAAM;CACNC,WAAW;CACXC,MAAM;CACNC,WAAW;CACXC,OAAO;CACPC,YAAY;CACb;AAGD,MAAMC,MAA8B;CAClCC,KAAK;CACLC,MAAM;CACNC,KAAK;CACLC,SAAS;CACTC,MAAM;CACNC,SAAS;CACTC,KAAK;CACLC,QAAQ;CACRC,OAAO;CACR;AAGD,MAAMC,KAA6B;CACjCT,KAAK;CACLI,MAAM;CACNC,SAAS;CACTJ,MAAM;CACNS,KAAK;CACLC,SAAS;CACTT,KAAK;CACLC,SAAS;CACTG,KAAK;CACLC,QAAQ;CACRC,OAAO;CACR;;;;;;;;;AAUD,SAAOI,cAAAC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAEL,MAAAE,YADiBpC,aAAa,GACZkB,MAAAU;CAAoB,IAAAS;AAAA,KAAAJ,EAAA,OAAAD,SAAAC,EAAA,OAAAG,WAAA;EAAA,IAAAE;AAAA,MAAAL,EAAA,OAAAG,WAAA;AAO/BE,SAAAC,gBACHA,YAAWC,MAAO,IAAI,CAAAC,KAAKC,SAAA;IACzB,MAAAC,MAAYD,KAAIE,MAAO;AAAC,WAEtBR,UAAUO,QACV1C,OAAO0C,QACPD,KAAIG,aAAc;KAEpB;AAAAZ,KAAA,KAAAG;AAAAH,KAAA,KAAAK;QAAAA,MAAAL,EAAA;AAZCI,OAAAL,MAAKQ,MACH,IAAI,CAAAC,IACNK,MAAkC,CAAAC,OAC/BC,QAAQ,CAAAP,IACXH,GASJ;AAAAL,IAAA,KAAAD;AAAAC,IAAA,KAAAG;AAAAH,IAAA,KAAAI;OAAAA,MAAAJ,EAAA;AAAA,QAbII;;AALF,SAAAS,MAAAG,KAAA;AAAA,QAOWA,IAAGL,MAAO,CAAAM,aAAc"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.186.1 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../_internal/hooks/use-event.js";
|
|
3
3
|
import { c } from "react-compiler-runtime";
|
|
4
4
|
import { useSyncExternalStore } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.186.1 | Cube Dev Team */
|
|
2
2
|
import { EventBusContext, useEventBus } from "./useEventBus.js";
|
|
3
3
|
import { c } from "react-compiler-runtime";
|
|
4
4
|
import { useContext, useEffect, useRef } from "react";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePopoverSync.js","names":["RefObject","useCallback","useContext","useEffect","useRef","EventBusContext","useEventBus","UsePopoverSyncOptions","menuId","isOpen","onClose","enabled","triggerRef","HTMLElement","containerRef","dismissOnInnerButtonPress","closeOnPeerOpen","PopoverOpenPayload","triggerEl","Element","PopoverDismissAncestorPayload","from","PopoverRegistryEntry","getContainerEl","getTriggerEl","openPopovers","Map","findOwningPopover","target","entry","contains","isLogicalDescendantOf","ancestorMenuId","ancestorContainer","cur","visited","Set","owner","id","has","add","usePopoverSync","t0","$","_c","t1","t2","t3","undefined","emit","on","isOpenRef","t4","t5","current","onCloseRef","t6","t7","containerRefRef","t8","t9","triggerRefRef","t10","t11","t12","t13","offOpen","data","container","offDismiss","data_0","container_0","wasOpenRef","t14","t15","delete","set","t16","t17","useDismissParentPopover","bus"],"sources":["../../../src/utils/react/usePopoverSync.ts"],"sourcesContent":["import { RefObject, useCallback, useContext, useEffect, useRef } from 'react';\n\nimport { EventBusContext, useEventBus } from './useEventBus';\n\nexport interface UsePopoverSyncOptions {\n /** Stable identifier for this popover instance (typically a generateRandomId() memo). */\n menuId: string;\n /** Current open state of this popover. */\n isOpen: boolean;\n /** Called when another popover opens while this one is open. */\n onClose: () => void;\n /**\n * When `false`, this popover does not participate in the sync (no listening,\n * no emitting). Useful for \"dummy\" triggers that proxy a real one (see\n * `MenuTrigger`'s `isDummy`). Defaults to `true`.\n */\n enabled?: boolean;\n /**\n * Ref to the popover's trigger element. When provided, the element is\n * included in the `popover:open` emit payload so peers can detect whether\n * the new opener is nested inside their own overlay (and skip closing in\n * that case). Optional — omitting it preserves the legacy \"always close on\n * peer open\" behaviour.\n */\n triggerRef?: RefObject<HTMLElement | null>;\n /**\n * Ref to the overlay/container element that hosts this popover's content.\n * When provided, the listener performs a DOM `contains()` check on incoming\n * peer triggers: peers whose trigger lives inside this container are\n * considered nested children and do NOT close us.\n */\n containerRef?: RefObject<HTMLElement | null>;\n /**\n * Whether this overlay closes when a Button/ItemButton inside its container\n * is pressed. Defaults to `true` (popover semantics — popovers are transient\n * surfaces and any action inside them should dismiss them). Set to `false`\n * for modals/trays/fullscreen dialogs — buttons inside a Dialog should not\n * auto-close it. Requires `containerRef` to be set; without it the listener\n * has no way to determine whether the dispatching button is \"inside\" this\n * overlay and is effectively a no-op.\n */\n dismissOnInnerButtonPress?: boolean;\n /**\n * Whether this overlay closes when a peer popover opens. Defaults to `true`\n * (popover semantics — only one popover open at a time). Set to `false` for\n * modals/trays/fullscreen dialogs so a peer popover opening cannot bypass\n * the dialog's own `isDismissable` / `onClose` handling and yank it shut.\n *\n * The host still EMITS `popover:open` regardless of this flag, so opening a\n * modal/tray correctly dismisses any peer popover that was open before.\n */\n closeOnPeerOpen?: boolean;\n}\n\ninterface PopoverOpenPayload {\n menuId: string;\n triggerEl: Element | null;\n}\n\ninterface PopoverDismissAncestorPayload {\n /** The DOM node of the button that requested the dismiss. */\n from: Element | null;\n}\n\ninterface PopoverRegistryEntry {\n getContainerEl: () => Element | null;\n getTriggerEl: () => Element | null;\n}\n\n/**\n * Module-level registry of currently open popovers. Lets us resolve the\n * LOGICAL parent of an arbitrary element across portal boundaries.\n *\n * Popover content is portaled to a shared root (`document.body` by default —\n * see `Overlay.tsx`), so a grandchild popover's trigger lives inside a\n * sibling portal rather than physically inside its grandparent's container.\n * A naive `container.contains(triggerEl)` check therefore misses the\n * relationship and closes the grandparent — the bug that surfaces with 3+\n * levels of `SubMenuTrigger` nesting.\n *\n * The registry stores closures over the host's refs so reads always see the\n * latest `.current` value without forcing a re-register per render.\n */\nconst openPopovers = new Map<string, PopoverRegistryEntry>();\n\n/**\n * Find the open popover whose container directly contains `target`. Returns\n * `null` for elements that live outside every registered popover (e.g. a\n * top-level trigger button rendered next to its overlay root).\n */\nfunction findOwningPopover(\n target: Element | null,\n): [string, PopoverRegistryEntry] | null {\n if (!target) return null;\n for (const entry of openPopovers) {\n if (entry[1].getContainerEl()?.contains(target)) {\n return entry;\n }\n }\n return null;\n}\n\n/**\n * Returns `true` when `target` is nested inside the overlay identified by\n * `ancestorMenuId` — either as a direct DOM descendant of `ancestorContainer`\n * or as a descendant of a chain of popovers whose triggers eventually land\n * inside it. Used by `popover:open` peers to avoid closing themselves when a\n * grand-child overlay opens through a portal.\n */\nfunction isLogicalDescendantOf(\n target: Element | null,\n ancestorMenuId: string,\n ancestorContainer: Element | null,\n): boolean {\n if (ancestorContainer && target && ancestorContainer.contains(target)) {\n return true;\n }\n let cur: Element | null = target;\n const visited = new Set<string>();\n while (cur) {\n const owner = findOwningPopover(cur);\n if (!owner) return false;\n const [id, entry] = owner;\n if (visited.has(id)) return false;\n visited.add(id);\n if (id === ancestorMenuId) return true;\n cur = entry.getTriggerEl();\n }\n return false;\n}\n\n/**\n * Coordinates the \"only one popover open at a time\" invariant via the EventBus.\n *\n * - When `isOpen` flips `false -> true`, emits `popover:open` once.\n * - While open, listens for peers' `popover:open` events and calls `onClose`.\n *\n * Implementation notes (ALL of these matter — losing any one re-introduces a\n * race that surfaces only under rapid trigger switching, which is hard to\n * reproduce in tests):\n *\n * 1. `isOpen` and `onClose` are read through refs inside the listener, so the\n * subscription effect's dep array does NOT include `isOpen`/`onClose`. This\n * keeps the listener identity stable across open/close transitions and\n * avoids the unsubscribe-emit-resubscribe window where an emit can be\n * delivered to a stale listener (or no listener).\n * 2. The emit fires only on the `false -> true` transition, gated by\n * `wasOpenRef`. A re-render where `isOpen` is still `true` must NOT\n * re-emit, otherwise it could re-trigger listeners on peers that just\n * opened in the same render flush.\n * 3. The `enabled` flag short-circuits both effects symmetrically. When it\n * flips off, `wasOpenRef` is reset so re-enabling later still emits if\n * `isOpen` is true at that moment.\n */\nexport function usePopoverSync({\n menuId,\n isOpen,\n onClose,\n enabled = true,\n triggerRef,\n containerRef,\n dismissOnInnerButtonPress = true,\n closeOnPeerOpen = true,\n}: UsePopoverSyncOptions): void {\n const { emit, on } = useEventBus();\n\n const isOpenRef = useRef(isOpen);\n useEffect(() => {\n isOpenRef.current = isOpen;\n }, [isOpen]);\n\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n }, [onClose]);\n\n // Track the latest containerRef via a stable ref-of-refs so the listener\n // never resubscribes when callers pass freshly-created ref wrappers across\n // renders. Same pattern as `onCloseRef` above — without this the listener's\n // effect would churn for any caller that doesn't memoize its refs.\n const containerRefRef = useRef(containerRef);\n useEffect(() => {\n containerRefRef.current = containerRef;\n }, [containerRef]);\n\n const triggerRefRef = useRef(triggerRef);\n useEffect(() => {\n triggerRefRef.current = triggerRef;\n }, [triggerRef]);\n\n useEffect(() => {\n if (!enabled) return;\n\n // `popover:open` listener — gated on `closeOnPeerOpen`. Modals/trays opt\n // out so a peer popover opening cannot bypass the dialog's\n // `isDismissable` / `onClose` handling and call `state.close()` directly.\n // Note: the EMIT side (lower in this hook) still fires regardless, so\n // opening a modal still correctly dismisses peer popovers.\n const offOpen = closeOnPeerOpen\n ? on('popover:open', (data: PopoverOpenPayload) => {\n if (data.menuId === menuId || !isOpenRef.current) return;\n const container = containerRefRef.current?.current ?? null;\n // Nested-popover guard: stay open when the opening peer's trigger is\n // a LOGICAL descendant of our overlay. Direct DOM containment only\n // covers the first level — for grand-child popovers the trigger lives\n // in a sibling portal, so we walk the registered popover chain back\n // up via each parent's trigger element. Without this, opening a\n // third-level `SubMenuTrigger` would close every ancestor menu.\n if (isLogicalDescendantOf(data.triggerEl, menuId, container)) return;\n onCloseRef.current();\n })\n : null;\n\n // `popover:dismiss-ancestor` is emitted by `Button` / `ItemButton` (and any\n // consumer using `useDismissParentPopover`) after their `onPress` runs.\n // Only popover-type overlays subscribe; modals/trays opt out via\n // `dismissOnInnerButtonPress: false` so a Button inside a Dialog content\n // does NOT auto-close the Dialog.\n const offDismiss = dismissOnInnerButtonPress\n ? on(\n 'popover:dismiss-ancestor',\n (data: PopoverDismissAncestorPayload) => {\n if (!isOpenRef.current) return;\n const container = containerRefRef.current?.current;\n const from = data?.from;\n // Require both a container and an originating element so we can do\n // the contains-check. Hosts without `containerRef` (e.g.\n // `use-anchored-menu`, `use-context-menu`) are silently no-op.\n if (!container || !from) return;\n if (container.contains(from)) onCloseRef.current();\n },\n )\n : null;\n\n return () => {\n offOpen?.();\n offDismiss?.();\n };\n }, [on, menuId, enabled, dismissOnInnerButtonPress, closeOnPeerOpen]);\n\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (!enabled) {\n if (wasOpenRef.current) {\n openPopovers.delete(menuId);\n }\n wasOpenRef.current = false;\n return;\n }\n if (isOpen && !wasOpenRef.current) {\n wasOpenRef.current = true;\n // Register BEFORE emitting so peers' listeners (deferred via the\n // bus's `setTimeout(0)`) can already see us in the registry when\n // they walk the logical chain.\n openPopovers.set(menuId, {\n getContainerEl: () => containerRefRef.current?.current ?? null,\n getTriggerEl: () => triggerRefRef.current?.current ?? null,\n });\n emit<PopoverOpenPayload>('popover:open', {\n menuId,\n triggerEl: triggerRefRef.current?.current ?? null,\n });\n } else if (!isOpen && wasOpenRef.current) {\n wasOpenRef.current = false;\n openPopovers.delete(menuId);\n }\n }, [isOpen, emit, menuId, enabled]);\n\n // Final cleanup on unmount: covers the case where a host unmounts while\n // still flagged open (e.g. a parent unmount tears down a child popover\n // before its close transition runs).\n useEffect(() => {\n return () => {\n openPopovers.delete(menuId);\n };\n }, [menuId]);\n}\n\n/**\n * Hook that returns a dispatcher to close the popover that contains a given\n * DOM element. Used by `Button` / `ItemButton` to implement the default\n * \"press inside a popover closes the popover\" behaviour. Custom (non-Cube)\n * interactive controls can call this directly:\n *\n * ```tsx\n * const dismiss = useDismissParentPopover();\n * <MyCustomPressable onPress={(e) => { doThing(); dismiss(e.currentTarget); }} />\n * ```\n *\n * The actual dismiss is dispatched through the EventBus, which defers via\n * `setTimeout(0)` — so the user's synchronous handler (and any React state\n * updates it triggers) flushes BEFORE the popover closes. This is critical\n * for the \"open a hoisted modal from a popover footer\" case: the modal\n * mounts first, then the popover closes.\n *\n * Only popover-type containers (those that pass `dismissOnInnerButtonPress`\n * as `true`, the default) react to the event. Modal/tray/fullscreen Dialog\n * containers explicitly opt out so a Button inside their content does not\n * auto-close them.\n *\n * When called outside an `EventBusProvider` (e.g. in unit tests that render\n * a Button without wrapping in `<Root>`), the returned function is a no-op —\n * the dismiss flow gracefully degrades rather than throwing.\n */\nexport function useDismissParentPopover() {\n // Read context defensively: `Button` / `ItemButton` use this hook\n // unconditionally, but tests (and standalone usages outside `<Root>`) may\n // mount them without an `EventBusProvider`. A throw would crash every\n // Button render in those cases.\n const bus = useContext(EventBusContext);\n const emit = bus?.emit;\n return useCallback(\n (from: Element | null) => {\n if (!from || !emit) return;\n emit<PopoverDismissAncestorPayload>('popover:dismiss-ancestor', { from });\n },\n [emit],\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"usePopoverSync.js","names":["RefObject","useContext","useEffect","useRef","EventBusContext","useEventBus","UsePopoverSyncOptions","menuId","isOpen","onClose","enabled","triggerRef","HTMLElement","containerRef","dismissOnInnerButtonPress","closeOnPeerOpen","PopoverOpenPayload","triggerEl","Element","PopoverDismissAncestorPayload","from","PopoverRegistryEntry","getContainerEl","getTriggerEl","openPopovers","Map","findOwningPopover","target","entry","contains","isLogicalDescendantOf","ancestorMenuId","ancestorContainer","cur","visited","Set","owner","id","has","add","usePopoverSync","t0","$","_c","t1","t2","t3","undefined","emit","on","isOpenRef","t4","t5","current","onCloseRef","t6","t7","containerRefRef","t8","t9","triggerRefRef","t10","t11","t12","t13","offOpen","data","container","offDismiss","data_0","container_0","wasOpenRef","t14","t15","delete","set","t16","t17","useDismissParentPopover","bus"],"sources":["../../../src/utils/react/usePopoverSync.ts"],"sourcesContent":["import { RefObject, useContext, useEffect, useRef } from 'react';\n\nimport { EventBusContext, useEventBus } from './useEventBus';\n\nexport interface UsePopoverSyncOptions {\n /** Stable identifier for this popover instance (typically a generateRandomId() memo). */\n menuId: string;\n /** Current open state of this popover. */\n isOpen: boolean;\n /** Called when another popover opens while this one is open. */\n onClose: () => void;\n /**\n * When `false`, this popover does not participate in the sync (no listening,\n * no emitting). Useful for \"dummy\" triggers that proxy a real one (see\n * `MenuTrigger`'s `isDummy`). Defaults to `true`.\n */\n enabled?: boolean;\n /**\n * Ref to the popover's trigger element. When provided, the element is\n * included in the `popover:open` emit payload so peers can detect whether\n * the new opener is nested inside their own overlay (and skip closing in\n * that case). Optional — omitting it preserves the legacy \"always close on\n * peer open\" behaviour.\n */\n triggerRef?: RefObject<HTMLElement | null>;\n /**\n * Ref to the overlay/container element that hosts this popover's content.\n * When provided, the listener performs a DOM `contains()` check on incoming\n * peer triggers: peers whose trigger lives inside this container are\n * considered nested children and do NOT close us.\n */\n containerRef?: RefObject<HTMLElement | null>;\n /**\n * Whether this overlay closes when a Button/ItemButton inside its container\n * is pressed. Defaults to `true` (popover semantics — popovers are transient\n * surfaces and any action inside them should dismiss them). Set to `false`\n * for modals/trays/fullscreen dialogs — buttons inside a Dialog should not\n * auto-close it. Requires `containerRef` to be set; without it the listener\n * has no way to determine whether the dispatching button is \"inside\" this\n * overlay and is effectively a no-op.\n */\n dismissOnInnerButtonPress?: boolean;\n /**\n * Whether this overlay closes when a peer popover opens. Defaults to `true`\n * (popover semantics — only one popover open at a time). Set to `false` for\n * modals/trays/fullscreen dialogs so a peer popover opening cannot bypass\n * the dialog's own `isDismissable` / `onClose` handling and yank it shut.\n *\n * The host still EMITS `popover:open` regardless of this flag, so opening a\n * modal/tray correctly dismisses any peer popover that was open before.\n */\n closeOnPeerOpen?: boolean;\n}\n\ninterface PopoverOpenPayload {\n menuId: string;\n triggerEl: Element | null;\n}\n\ninterface PopoverDismissAncestorPayload {\n /** The DOM node of the button that requested the dismiss. */\n from: Element | null;\n}\n\ninterface PopoverRegistryEntry {\n getContainerEl: () => Element | null;\n getTriggerEl: () => Element | null;\n}\n\n/**\n * Module-level registry of currently open popovers. Lets us resolve the\n * LOGICAL parent of an arbitrary element across portal boundaries.\n *\n * Popover content is portaled to a shared root (`document.body` by default —\n * see `Overlay.tsx`), so a grandchild popover's trigger lives inside a\n * sibling portal rather than physically inside its grandparent's container.\n * A naive `container.contains(triggerEl)` check therefore misses the\n * relationship and closes the grandparent — the bug that surfaces with 3+\n * levels of `SubMenuTrigger` nesting.\n *\n * The registry stores closures over the host's refs so reads always see the\n * latest `.current` value without forcing a re-register per render.\n */\nconst openPopovers = new Map<string, PopoverRegistryEntry>();\n\n/**\n * Find the open popover whose container directly contains `target`. Returns\n * `null` for elements that live outside every registered popover (e.g. a\n * top-level trigger button rendered next to its overlay root).\n */\nfunction findOwningPopover(\n target: Element | null,\n): [string, PopoverRegistryEntry] | null {\n if (!target) return null;\n for (const entry of openPopovers) {\n if (entry[1].getContainerEl()?.contains(target)) {\n return entry;\n }\n }\n return null;\n}\n\n/**\n * Returns `true` when `target` is nested inside the overlay identified by\n * `ancestorMenuId` — either as a direct DOM descendant of `ancestorContainer`\n * or as a descendant of a chain of popovers whose triggers eventually land\n * inside it. Used by `popover:open` peers to avoid closing themselves when a\n * grand-child overlay opens through a portal.\n */\nfunction isLogicalDescendantOf(\n target: Element | null,\n ancestorMenuId: string,\n ancestorContainer: Element | null,\n): boolean {\n if (ancestorContainer && target && ancestorContainer.contains(target)) {\n return true;\n }\n let cur: Element | null = target;\n const visited = new Set<string>();\n while (cur) {\n const owner = findOwningPopover(cur);\n if (!owner) return false;\n const [id, entry] = owner;\n if (visited.has(id)) return false;\n visited.add(id);\n if (id === ancestorMenuId) return true;\n cur = entry.getTriggerEl();\n }\n return false;\n}\n\n/**\n * Coordinates the \"only one popover open at a time\" invariant via the EventBus.\n *\n * - When `isOpen` flips `false -> true`, emits `popover:open` once.\n * - While open, listens for peers' `popover:open` events and calls `onClose`.\n *\n * Implementation notes (ALL of these matter — losing any one re-introduces a\n * race that surfaces only under rapid trigger switching, which is hard to\n * reproduce in tests):\n *\n * 1. `isOpen` and `onClose` are read through refs inside the listener, so the\n * subscription effect's dep array does NOT include `isOpen`/`onClose`. This\n * keeps the listener identity stable across open/close transitions and\n * avoids the unsubscribe-emit-resubscribe window where an emit can be\n * delivered to a stale listener (or no listener).\n * 2. The emit fires only on the `false -> true` transition, gated by\n * `wasOpenRef`. A re-render where `isOpen` is still `true` must NOT\n * re-emit, otherwise it could re-trigger listeners on peers that just\n * opened in the same render flush.\n * 3. The `enabled` flag short-circuits both effects symmetrically. When it\n * flips off, `wasOpenRef` is reset so re-enabling later still emits if\n * `isOpen` is true at that moment.\n */\nexport function usePopoverSync({\n menuId,\n isOpen,\n onClose,\n enabled = true,\n triggerRef,\n containerRef,\n dismissOnInnerButtonPress = true,\n closeOnPeerOpen = true,\n}: UsePopoverSyncOptions): void {\n const { emit, on } = useEventBus();\n\n const isOpenRef = useRef(isOpen);\n useEffect(() => {\n isOpenRef.current = isOpen;\n }, [isOpen]);\n\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n }, [onClose]);\n\n // Track the latest containerRef via a stable ref-of-refs so the listener\n // never resubscribes when callers pass freshly-created ref wrappers across\n // renders. Same pattern as `onCloseRef` above — without this the listener's\n // effect would churn for any caller that doesn't memoize its refs.\n const containerRefRef = useRef(containerRef);\n useEffect(() => {\n containerRefRef.current = containerRef;\n }, [containerRef]);\n\n const triggerRefRef = useRef(triggerRef);\n useEffect(() => {\n triggerRefRef.current = triggerRef;\n }, [triggerRef]);\n\n useEffect(() => {\n if (!enabled) return;\n\n // `popover:open` listener — gated on `closeOnPeerOpen`. Modals/trays opt\n // out so a peer popover opening cannot bypass the dialog's\n // `isDismissable` / `onClose` handling and call `state.close()` directly.\n // Note: the EMIT side (lower in this hook) still fires regardless, so\n // opening a modal still correctly dismisses peer popovers.\n const offOpen = closeOnPeerOpen\n ? on('popover:open', (data: PopoverOpenPayload) => {\n if (data.menuId === menuId || !isOpenRef.current) return;\n const container = containerRefRef.current?.current ?? null;\n // Nested-popover guard: stay open when the opening peer's trigger is\n // a LOGICAL descendant of our overlay. Direct DOM containment only\n // covers the first level — for grand-child popovers the trigger lives\n // in a sibling portal, so we walk the registered popover chain back\n // up via each parent's trigger element. Without this, opening a\n // third-level `SubMenuTrigger` would close every ancestor menu.\n if (isLogicalDescendantOf(data.triggerEl, menuId, container)) return;\n onCloseRef.current();\n })\n : null;\n\n // `popover:dismiss-ancestor` is emitted by `Button` / `ItemButton` (and any\n // consumer using `useDismissParentPopover`) after their `onPress` runs.\n // Only popover-type overlays subscribe; modals/trays opt out via\n // `dismissOnInnerButtonPress: false` so a Button inside a Dialog content\n // does NOT auto-close the Dialog.\n const offDismiss = dismissOnInnerButtonPress\n ? on(\n 'popover:dismiss-ancestor',\n (data: PopoverDismissAncestorPayload) => {\n if (!isOpenRef.current) return;\n const container = containerRefRef.current?.current;\n const from = data?.from;\n // Require both a container and an originating element so we can do\n // the contains-check. Hosts without `containerRef` (e.g.\n // `use-anchored-menu`, `use-context-menu`) are silently no-op.\n if (!container || !from) return;\n if (container.contains(from)) onCloseRef.current();\n },\n )\n : null;\n\n return () => {\n offOpen?.();\n offDismiss?.();\n };\n }, [on, menuId, enabled, dismissOnInnerButtonPress, closeOnPeerOpen]);\n\n const wasOpenRef = useRef(false);\n useEffect(() => {\n if (!enabled) {\n if (wasOpenRef.current) {\n openPopovers.delete(menuId);\n }\n wasOpenRef.current = false;\n return;\n }\n if (isOpen && !wasOpenRef.current) {\n wasOpenRef.current = true;\n // Register BEFORE emitting so peers' listeners (deferred via the\n // bus's `setTimeout(0)`) can already see us in the registry when\n // they walk the logical chain.\n openPopovers.set(menuId, {\n getContainerEl: () => containerRefRef.current?.current ?? null,\n getTriggerEl: () => triggerRefRef.current?.current ?? null,\n });\n emit<PopoverOpenPayload>('popover:open', {\n menuId,\n triggerEl: triggerRefRef.current?.current ?? null,\n });\n } else if (!isOpen && wasOpenRef.current) {\n wasOpenRef.current = false;\n openPopovers.delete(menuId);\n }\n }, [isOpen, emit, menuId, enabled]);\n\n // Final cleanup on unmount: covers the case where a host unmounts while\n // still flagged open (e.g. a parent unmount tears down a child popover\n // before its close transition runs).\n useEffect(() => {\n return () => {\n openPopovers.delete(menuId);\n };\n }, [menuId]);\n}\n\n/**\n * Hook that returns a dispatcher to close the popover that contains a given\n * DOM element. Used by `Button` / `ItemButton` to implement the default\n * \"press inside a popover closes the popover\" behaviour. Custom (non-Cube)\n * interactive controls can call this directly:\n *\n * ```tsx\n * const dismiss = useDismissParentPopover();\n * <MyCustomPressable onPress={(e) => { doThing(); dismiss(e.currentTarget); }} />\n * ```\n *\n * The actual dismiss is dispatched through the EventBus, which defers via\n * `setTimeout(0)` — so the user's synchronous handler (and any React state\n * updates it triggers) flushes BEFORE the popover closes. This is critical\n * for the \"open a hoisted modal from a popover footer\" case: the modal\n * mounts first, then the popover closes.\n *\n * Only popover-type containers (those that pass `dismissOnInnerButtonPress`\n * as `true`, the default) react to the event. Modal/tray/fullscreen Dialog\n * containers explicitly opt out so a Button inside their content does not\n * auto-close them.\n *\n * When called outside an `EventBusProvider` (e.g. in unit tests that render\n * a Button without wrapping in `<Root>`), the returned function is a no-op —\n * the dismiss flow gracefully degrades rather than throwing.\n */\nexport function useDismissParentPopover() {\n // Read context defensively: `Button` / `ItemButton` use this hook\n // unconditionally, but tests (and standalone usages outside `<Root>`) may\n // mount them without an `EventBusProvider`. A throw would crash every\n // Button render in those cases.\n const bus = useContext(EventBusContext);\n const emit = bus?.emit;\n return (from: Element | null) => {\n if (!from || !emit) return;\n emit<PopoverDismissAncestorPayload>('popover:dismiss-ancestor', { from });\n };\n}\n"],"mappings":"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"}
|
package/dist/utils/selection.js
CHANGED
package/dist/utils/styles.js
CHANGED
package/dist/utils/tree.js
CHANGED
package/dist/utils/warnings.js
CHANGED
package/dist/version.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.186.1 | Cube Dev Team */
|
|
2
2
|
//#region src/version.ts
|
|
3
|
-
const VERSION = "0.
|
|
4
|
-
const TASTY_VERSION = "3.9.
|
|
3
|
+
const VERSION = "0.186.1";
|
|
4
|
+
const TASTY_VERSION = "3.9.3";
|
|
5
5
|
if (typeof window !== "undefined") {
|
|
6
6
|
const version = VERSION;
|
|
7
7
|
const tastyVersion = TASTY_VERSION;
|
package/docs/CreateComponent.md
CHANGED
|
@@ -446,7 +446,9 @@ For input components that need to integrate with forms, see the [Field documenta
|
|
|
446
446
|
|
|
447
447
|
7. **Keep it simple when appropriate**: Not every component needs all features - use what makes sense for your use case
|
|
448
448
|
|
|
449
|
-
8. **Use named React imports**: Import `
|
|
449
|
+
8. **Use named React imports**: Import `useState`, `useRef`, `forwardRef` etc. directly from `'react'` instead of using `React.useState(...)`.
|
|
450
|
+
|
|
451
|
+
**Skip `useMemo` and `useCallback` for performance.** React Compiler memoizes compiled components and hooks at build time, so derived values, `mods` objects, context values and handlers are plain expressions. Keep a manual memo only where identity is part of the contract: a callback ref, an effect dependency, a `useSyncExternalStore` subscription, or a value created once per mount.
|
|
450
452
|
|
|
451
453
|
9. **Use `useEvent` for stable callbacks**: When a callback doesn't need to trigger re-renders, prefer `useEvent` from `src/_internal/hooks/use-event` for a stable identity that always calls the latest implementation:
|
|
452
454
|
|
|
@@ -27,7 +27,7 @@ A multi-value field. The user types a value into a single-line input and commits
|
|
|
27
27
|
- **`defaultValue`** `string[]` — The initial values in uncontrolled mode
|
|
28
28
|
- **`inputValue`** `string` — The text being typed, in controlled mode
|
|
29
29
|
- **`defaultInputValue`** `string` — The initial text being typed, in uncontrolled mode
|
|
30
|
-
- **`allowsCustomValue`** `boolean` (default: `false`) — Whether typed values that are not among the options are accepted. Only applies when options are given
|
|
30
|
+
- **`allowsCustomValue`** `boolean` (default: `false`) — Whether typed values that are not among the options are accepted. Only applies when options are given. Text that matches an option only in case or accents is then added as typed
|
|
31
31
|
- **`delimiters`** `string[]` (default: `[',']`) — Characters that commit the typed text and split pasted text. Pasted text is also split on line breaks
|
|
32
32
|
- **`validateTag`** `(value: string) => boolean | string | null | undefined` — Checks one value before it becomes a chip. Return `false` or a message to reject it
|
|
33
33
|
- **`normalizeTag`** `(value: string) => string` — Rewrites a typed value before it is checked and added. Return an empty string to drop it
|
|
@@ -51,16 +51,16 @@ A multi-value field. The user types a value into a single-line input and commits
|
|
|
51
51
|
- **`onClear`** `() => void` — Called when the clear button is pressed
|
|
52
52
|
- **`onOpenChange`** `(isOpen: boolean) => void` — Called when the suggestions popover opens or closes
|
|
53
53
|
- **`onFocus`** `() => void` — Called when focus enters the component: the input, a chip or the popover
|
|
54
|
-
- **`onBlur`** `() => void` — Called when focus leaves the component entirely
|
|
54
|
+
- **`onBlur`** `() => void` — Called when focus leaves the component entirely, after the typed text is committed and before the press that moved focus is handled, so a Save click sees the new value
|
|
55
55
|
- **`onKeyDown`** `(e: KeyboardEvent) => void` — Called when a key is pressed in the input, before the component handles it. Call `e.preventDefault()` to stop the built-in handling
|
|
56
56
|
- **`inputRef`**, **`wrapperRef`**, **`popoverRef`**, **`listBoxRef`** `RefObject` — Refs to the input, the bordered input box, the popover and its listbox. The forwarded `ref` points at the root, which holds the input and the chips
|
|
57
57
|
- **`mods`** `Record<string, boolean>` — Modifiers for the bordered input box, see [Modifiers](#modifiers)
|
|
58
58
|
|
|
59
59
|
#### Notable Properties
|
|
60
60
|
|
|
61
|
-
**delimiters** - Typing a delimiter commits the text before it, and pasting splits the text on every delimiter and line break, so a column copied from a spreadsheet or a comma-separated list becomes one chip per entry. A single pasted value is inserted as plain text for the user to finish. Pass `[]` when a value may contain a comma: only Enter and pasted line breaks separate values then.
|
|
61
|
+
**delimiters** - Typing a delimiter commits the text before it, and pasting splits the text on every delimiter and line break, so a column copied from a spreadsheet or a comma-separated list becomes one chip per entry. A single pasted value is inserted as plain text for the user to finish. Pass `[]` when a value may contain a comma: only Enter and pasted line breaks separate values then. Refused values go back to the input joined by the first delimiter, so they split into the same values again; with `[]` nothing can separate them in one line, so only the first refused value stays there, with its message.
|
|
62
62
|
|
|
63
|
-
**validateTag** - Runs on every value about to become a chip. A rejected value stays in the input, the field turns invalid and the message shows below it until the text is edited. A value picked from the options is not checked. Values already in `value` that fail the check are drawn in the danger theme and carry the message as their description, so an invalid entry loaded from the server stands out. Duplicates are always refused, with a message of their own.
|
|
63
|
+
**validateTag** - Runs on every value about to become a chip. A rejected value stays in the input, the field turns invalid and the message shows below it until the text is edited. A value picked from the options is not checked. Values already in `value` that fail the check are drawn in the danger theme and carry the message as their description, so an invalid entry loaded from the server stands out. Duplicates are always refused, with a message of their own, and leave the input: the value is there already, as a chip. When a paste mixes the two, the message is the one for the text left in the input. A message is cleared by Escape, and by leaving the field once nothing is left in the input, so a refused duplicate does not leave an empty field marked invalid.
|
|
64
64
|
|
|
65
65
|
**normalizeTag** - Runs on typed text before anything else looks at it, so the duplicate check, `validateTag` and the new chip all see the rewritten value: lowercase an email address, strip thousands separators, write a number one way. The rejected text that stays in the input is what the user typed. Picked options keep their keys.
|
|
66
66
|
|
|
@@ -68,7 +68,7 @@ A multi-value field. The user types a value into a single-line input and commits
|
|
|
68
68
|
|
|
69
69
|
**tagProps** - Called per value. Return a theme, an icon or `qa` for the chip. A string `children` replaces the chip's text and also names the value in the input's description and in the "Added"/"Removed" announcements, for values whose label does not come from the options. `isDisabled: true` locks the chip: it has no remove button, the keyboard skips it, and its option cannot be unpicked. An invalid chip stays in the danger theme whatever theme it asks for.
|
|
70
70
|
|
|
71
|
-
**children / items** - Options turn the input into a combobox. Typing filters them and focuses the option
|
|
71
|
+
**children / items** - Options turn the input into a combobox. Typing filters them and focuses the option the typed text names, or else the first match. Enter or a click toggles the focused option, and the popover stays open so the user can pick several in a row. A picked option is added as its own key, whatever other options its text resembles. Typed text means "add": pressing Enter on an option that is already a chip refuses it as a duplicate, and unpicking it takes the arrow keys, a click, or an empty input. A picked option shows a checked box. Typed text names an option by its exact label, then by its key, anywhere in the list, before any looser match counts, so `active` finds `active` even when `Active` comes first. Enter, a delimiter, a paste and blur all go by the same rule, and the option the text names stays listed and focused even when the filter would hide it, as when a key is typed, so they always add the same option. Without `allowsCustomValue`, typed text must name an option, and a label in another case or without its accents counts too: `production` adds `Production`. On blur a query that names nothing is dropped. With `allowsCustomValue`, only an exact match counts: `paris` next to an option `Paris` is a value of its own, offered and focused as its own row and added as typed, since a case-sensitive filter treats the two apart. A press on a control outside while the popover shows (a button, a link, another field) is not taken by it: it reaches the control, so a Save button saves on the first click, with the typed text already committed. A press anywhere else, such as the backdrop of a dialog the field sits in, only closes the popover, and the dialog stays open. The typed text is offered as its own option after the matches, the same way [FilterListBox](./FilterListBox.md) does, and custom values already added are listed there too, checked and sorted, so they can be unpicked from the list as well as from their chips. One unpicked in the list stays there, unchecked, until focus leaves the field, so it can be picked back. An option in `disabledKeys` is refused however it is entered. A chip for an option shows the option's label, while the value holds its key. The label is remembered, so it survives server-side filtering (`filter={false}` with changing `items`).
|
|
72
72
|
|
|
73
73
|
### Base Properties
|
|
74
74
|
|
|
@@ -185,7 +185,7 @@ const EMAIL = /^[^\s@,]+@[^\s@,]+\.[^\s@,]+$/;
|
|
|
185
185
|
|
|
186
186
|
### Pasting a List
|
|
187
187
|
|
|
188
|
-
Pasted text is split on delimiters and line breaks. Accepted entries become chips, rejected ones stay in the input with the message from `validateTag
|
|
188
|
+
Pasted text is split on delimiters and line breaks. Accepted entries become chips, rejected ones stay in the input with the message from `validateTag`, and duplicates of existing chips are dropped with a message of their own.
|
|
189
189
|
|
|
190
190
|
### Picking from Suggestions
|
|
191
191
|
|
|
@@ -359,9 +359,9 @@ const [recipients, setRecipients] = useState(['ana@acme.com']);
|
|
|
359
359
|
|
|
360
360
|
- `Tab` - Moves focus from the input to the chips, then out of the field. The chips are one Tab stop; the popover trigger and the clear button are not Tab stops. Tabbing away closes the popover and commits the typed text
|
|
361
361
|
- `Shift+Tab` - Moves back from the chips to the input
|
|
362
|
-
- `Enter` - Commits the typed text. With the popover open, toggles the focused option, the one `aria-activedescendant` announces; with text typed, an option that is already a chip is refused as a duplicate rather than removed. Never submits a surrounding form, even with nothing typed, so one Enter too many after the last value does not send a half-filled dialog
|
|
362
|
+
- `Enter` - Commits the typed text. With the popover open, toggles the focused option, the one `aria-activedescendant` announces; with text typed, an option that is already a chip is refused as a duplicate rather than removed, and the text is cleared. Never submits a surrounding form, even with nothing typed, so one Enter too many after the last value does not send a half-filled dialog
|
|
363
363
|
- `,` (or another delimiter) - Commits the text before the caret and keeps the rest typed
|
|
364
|
-
- `Escape` - Closes the popover, or clears the typed text when it is closed
|
|
364
|
+
- `Escape` - Closes the popover, or clears the typed text when it is closed. Either way it clears a message about the text, even once the input is empty
|
|
365
365
|
- `Backspace` in the empty input - Moves focus to the last chip without removing it, and closes the popover. A Backspace held down to clear the text stops at the empty input
|
|
366
366
|
- `ArrowDown` / `ArrowUp` - Opens the popover or moves through the options
|
|
367
367
|
- `Home` / `End` - Moves to the first or last option while the popover is open
|
package/docs/tasty/ai-agents.md
CHANGED
|
@@ -22,6 +22,12 @@ tastyStatic('.card', { … }); // b
|
|
|
22
22
|
- Wrap, don't pass styles per instance: ❌ `<Box styles={{ padding: '2x' }} />` → ✅ `const Box = tasty({ styles: { padding: '2x' } })`.
|
|
23
23
|
- Style values are **static**. Route anything conditional through a state map plus `mods` (or `tokens` / `styleProps`):
|
|
24
24
|
❌ `fill: isOpen ? '#primary' : '#surface'` → ✅ `fill: { '': '#surface', open: '#primary' }` with `mods={{ open: isOpen }}`.
|
|
25
|
+
- Keep JavaScript identifiers, calls, computed keys, and interpolated templates
|
|
26
|
+
out of style values. Use token references inside strings for values supplied
|
|
27
|
+
at runtime. Spell out style properties rather than spreading objects; if a
|
|
28
|
+
runtime spread is unavoidable, add a
|
|
29
|
+
`// eslint-disable-next-line tasty/no-style-spread -- reason` comment directly
|
|
30
|
+
above it. `tastyStatic()` cannot use spreads.
|
|
25
31
|
|
|
26
32
|
## 2. Property names
|
|
27
33
|
|
|
@@ -128,7 +134,19 @@ Value-only properties reject both colors and modifiers: `gap`, `columnGap`, `row
|
|
|
128
134
|
|
|
129
135
|
Use semantic names, not CSS property names: `fade` `fill` `color` `theme` `border` `radius` `shadow` `outline` `preset` `text` `gap` `opacity` `translate` `rotate` `scale` `filter` `image` `background` `width` `height` `zIndex` `inset` `flow` `dimension`.
|
|
130
136
|
|
|
131
|
-
❌ `transition: 'background-color 0.2s'` → ✅ `transition: 'fill
|
|
137
|
+
❌ `transition: 'background-color 0.2s'` → ✅ `transition: 'fill'`
|
|
138
|
+
|
|
139
|
+
Omit the duration to use `$fill-transition` with `$transition` as fallback, or
|
|
140
|
+
use a duration token explicitly (`transition: 'fill $transition'`). Avoid raw
|
|
141
|
+
time values in duration slots. An explicit zero can be useful to disable motion.
|
|
142
|
+
|
|
143
|
+
Use `transition` when defining a complete transition, and the native CSS
|
|
144
|
+
`animation` shorthand when defining a complete animation. Tasty accepts
|
|
145
|
+
`animation` directly and tracks local keyframes referenced by it; no special
|
|
146
|
+
animation handler is needed. Use duration tokens in either form. Keep
|
|
147
|
+
`transitionDuration`, `animationDuration`, and other motion longhands when a
|
|
148
|
+
state or extension changes only one part of an existing effect. A shorthand
|
|
149
|
+
resets omitted parts, including an animation's timeline and range.
|
|
132
150
|
|
|
133
151
|
## 4. State maps
|
|
134
152
|
|
|
@@ -155,7 +173,8 @@ Rules:
|
|
|
155
173
|
3. **`_` is standalone-only** and always first (with `''` right after it, if present). `_` is a never-negated fallback floor for cases where a higher-priority branch may be _unknown_ (`@supports`, container queries). If a map contains only `_` and `''`, drop the `''`.
|
|
156
174
|
4. **No nested maps:** ❌ `{ hovered: { pressed: 'x' } }` → ✅ `{ 'hovered & pressed': 'x' }`
|
|
157
175
|
5. **State keys never sit at the top level** of a styles object — `:hover`, `.active`, `[open]` belong inside a property value.
|
|
158
|
-
6. **
|
|
176
|
+
6. **Write keys Tasty can fully read.** Names start with a letter (a single letter is fine: `x` → `[data-x]`); join states with an operator (`hovered & focused`, not `hovered focused`); no space between `@media` and `(`. Tasty warns (`INVALID_STATE_KEY`) and skips what it cannot read.
|
|
177
|
+
7. **Prefer automatic native states:** use `disabled` and `checked` in Tasty component styles instead of `[disabled]` and `[checked]`. The concise states track the corresponding native prop or attribute automatically.
|
|
159
178
|
|
|
160
179
|
```jsx
|
|
161
180
|
color: { '': '#text', hovered: '#accent', disabled: '#text.40' }
|
package/docs/tasty/dsl.md
CHANGED
|
@@ -54,6 +54,8 @@ fill: {
|
|
|
54
54
|
}
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
Modifier and class names start with a letter and may be a single letter (`x` → `[data-x]`, `.x`). Tasty emits an `INVALID_STATE_KEY` warning for a key it cannot fully read and skips the unreadable parts. That covers characters outside the notation (`1st`, or `@media (w < 600px)` with a space before the parenthesis), an operator missing a state (`hovered &`), and two states with no operator between them (`hovered focused`). A partly read key can apply in states you did not mean, so fix the key rather than rely on what it produces.
|
|
58
|
+
|
|
57
59
|
#### Default State Ordering
|
|
58
60
|
|
|
59
61
|
Key order sets priority — later keys win and turn off earlier ones via negation. The bare default (`''`) is the lowest-priority state, so it **must be the first key**. If it appears after other states, Tasty moves it to the front and emits a dev warning (`MISPLACED_DEFAULT_STATE`); otherwise it would override every state above it.
|
|
@@ -701,7 +703,7 @@ const FadeIn = tasty({
|
|
|
701
703
|
styles: {
|
|
702
704
|
opacity: { '': '1', '@starting': '0' },
|
|
703
705
|
transform: { '': 'scale(1)', '@starting': 'scale(0.95)' },
|
|
704
|
-
transition: 'opacity
|
|
706
|
+
transition: 'opacity, translate',
|
|
705
707
|
},
|
|
706
708
|
});
|
|
707
709
|
```
|
|
@@ -833,7 +835,7 @@ const AnimatedGradient = tasty({
|
|
|
833
835
|
'$gradient-angle': '0deg',
|
|
834
836
|
'#theme': 'okhst(280 80% 50%)',
|
|
835
837
|
image: 'linear-gradient($gradient-angle, #theme, #clear)',
|
|
836
|
-
transition: '$$gradient-angle
|
|
838
|
+
transition: '$$gradient-angle, ##theme',
|
|
837
839
|
},
|
|
838
840
|
});
|
|
839
841
|
```
|
|
@@ -169,20 +169,22 @@ export default [
|
|
|
169
169
|
|
|
170
170
|
### What `recommended` catches
|
|
171
171
|
|
|
172
|
-
The `recommended` config
|
|
173
|
-
|
|
174
|
-
| Category | Rules | Examples
|
|
175
|
-
| ------------------- | ------------------------------------------------------------------------------------------------------ |
|
|
176
|
-
| Property validation | `known-property`, `valid-boolean-property`, `valid-sub-element` | Flags typos like `pading` or invalid boolean usage
|
|
177
|
-
| Value validation | `valid-value`, `valid-color-token`, `valid-custom-unit` | Catches `#nonexistent` tokens, bad unit syntax
|
|
178
|
-
| State validation | `valid-state-key`, `no-nested-state-map`, `require-default-state` | Validates state key syntax, ensures `''` default exists
|
|
179
|
-
| Structure | `valid-styles-structure`, `no-important`, `no-nested-selector` | Prevents `!important`, invalid nesting
|
|
180
|
-
| Static mode | `static-no-dynamic-values`, `static-valid-selector` | Enforces build-time constraints in `tastyStatic()`
|
|
181
|
-
| Style properties | `valid-preset`, `valid-recipe`, `valid-transition`, `valid-directional-modifier`, `valid-radius-shape` | Validates preset names, recipe references, transition syntax
|
|
172
|
+
The `recommended` config covers common correctness and style issues:
|
|
173
|
+
|
|
174
|
+
| Category | Rules | Examples |
|
|
175
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------- |
|
|
176
|
+
| Property validation | `known-property`, `valid-boolean-property`, `valid-sub-element` | Flags typos like `pading` or invalid boolean usage |
|
|
177
|
+
| Value validation | `valid-value`, `valid-color-token`, `valid-custom-unit` | Catches `#nonexistent` tokens, bad unit syntax |
|
|
178
|
+
| State validation | `valid-state-key`, `no-nested-state-map`, `require-default-state` | Validates state key syntax, ensures `''` default exists |
|
|
179
|
+
| Structure | `valid-styles-structure`, `no-important`, `no-nested-selector` | Prevents `!important`, invalid nesting |
|
|
180
|
+
| Static mode | `static-no-dynamic-values`, `static-valid-selector` | Enforces build-time constraints in `tastyStatic()` |
|
|
181
|
+
| Style properties | `valid-preset`, `valid-recipe`, `valid-transition`, `valid-directional-modifier`, `valid-radius-shape` | Validates preset names, recipe references, transition syntax |
|
|
182
|
+
| Motion guidance | `no-raw-transition-duration` | Suggests timing tokens or the default timing for transition durations |
|
|
183
|
+
| Dynamic styles | `no-runtime-styles-mutation`, `no-style-spread` | Warns on JavaScript values and spreads inside runtime style objects |
|
|
182
184
|
|
|
183
185
|
### Strict config
|
|
184
186
|
|
|
185
|
-
For stricter governance, use `tasty.configs.strict`. It adds rules that
|
|
187
|
+
For stricter governance, use `tasty.configs.strict`. It adds rules that flag direct `styles` prop usage and other patterns:
|
|
186
188
|
|
|
187
189
|
```js
|
|
188
190
|
export default [tasty.configs.strict];
|
|
@@ -236,7 +236,7 @@ const ProgressBar = tasty({
|
|
|
236
236
|
width: '$progress',
|
|
237
237
|
height: '100%',
|
|
238
238
|
fill: '#primary',
|
|
239
|
-
transition: 'width
|
|
239
|
+
transition: 'width',
|
|
240
240
|
},
|
|
241
241
|
},
|
|
242
242
|
elements: { Bar: 'div' },
|
|
@@ -534,7 +534,7 @@ See [Configuration](configuration.md) for the full `configure()` API.
|
|
|
534
534
|
|
|
535
535
|
- **Create styled wrappers** instead of passing `styles` directly — faster, composable, inspectable
|
|
536
536
|
- **Use design tokens and custom units** (`#text`, `2x`, `1r`) instead of raw CSS values
|
|
537
|
-
- **Use semantic transition names** (`transition: 'theme
|
|
537
|
+
- **Use semantic transition names** (`transition: 'theme'`) instead of listing CSS properties; omit the duration to use the motion tokens
|
|
538
538
|
- **Use `elements` prop** to declare typed sub-components for compound components
|
|
539
539
|
- **Use `styleProps`** to define what product engineers can customize
|
|
540
540
|
- **Use `modProps`** to expose known modifier states as clean component props
|