@cube-dev/ui-kit 0.158.0 → 0.159.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 +139 -0
- package/dist/_internal/hooks/use-chained-callback.js +1 -1
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.js +10 -4
- package/dist/components/actions/Button/Button.js.map +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/Item/Item.d.ts +7 -0
- package/dist/components/content/Item/Item.js +13 -6
- package/dist/components/content/Item/Item.js.map +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +1 -1
- package/dist/components/content/Tree/TreeNode.js +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 +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 +41 -32
- package/dist/components/content/use-auto-tooltip.js.map +1 -1
- package/dist/components/data/DataTable/DataTable.js +82 -24
- package/dist/components/data/DataTable/DataTable.js.map +1 -1
- package/dist/components/data/DataTable/types.d.ts +56 -1
- package/dist/components/data/ItemTable/ItemTable.js +13 -5
- package/dist/components/data/ItemTable/ItemTable.js.map +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +3 -7
- package/dist/components/data/ItemTable/ItemTableBulkBar.js.map +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/types.d.ts +19 -0
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +5 -3
- package/dist/components/data/TableBase/RowCollection.js.map +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +115 -0
- package/dist/components/data/TableBase/TableHeaderCell.js.map +1 -0
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +195 -33
- package/dist/components/data/TableBase/TableView.js.map +1 -1
- package/dist/components/data/TableBase/column-menu.d.ts +36 -0
- package/dist/components/data/TableBase/column-menu.js +104 -0
- package/dist/components/data/TableBase/column-menu.js.map +1 -0
- package/dist/components/data/TableBase/column-tint.js +168 -0
- package/dist/components/data/TableBase/column-tint.js.map +1 -0
- package/dist/components/data/TableBase/index.d.ts +3 -2
- package/dist/components/data/TableBase/row-menu.js +11 -6
- package/dist/components/data/TableBase/row-menu.js.map +1 -1
- package/dist/components/data/TableBase/styled.js +45 -16
- package/dist/components/data/TableBase/styled.js.map +1 -1
- package/dist/components/data/TableBase/types.d.ts +104 -6
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/types.js.map +1 -1
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-order.js +100 -0
- package/dist/components/data/TableBase/use-column-order.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 +24 -2
- package/dist/components/data/TableBase/use-table-columns.js.map +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 +20 -1
- package/dist/components/data/TableBase/use-table-sort.js.map +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +40 -1
- package/dist/components/data/TableBase/use-table-sorts.js.map +1 -1
- package/dist/components/data/TableBase/use-table-storage.d.ts +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +6 -2
- package/dist/components/data/TableBase/use-table-storage.js.map +1 -1
- package/dist/components/data/index.d.ts +2 -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/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +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/ListBoxPopover/ListBoxPopover.js +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.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/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/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +1 -1
- package/dist/components/fields/color/ColorSwatch.js +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 +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/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.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/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 +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/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/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/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.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 +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/DraggableCollection.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/eslint-plugin/defaults.generated.js +13 -1
- 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 +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 +5 -1
- package/dist/i18n/locales/en-US/uikit.js +5 -1
- package/dist/i18n/locales/en-US/uikit.json.d.ts +4 -0
- package/dist/i18n/locales/es-ES/uikit.js +5 -1
- package/dist/i18n/locales/es-MX/uikit.js +5 -1
- package/dist/i18n/locales/fr-FR/uikit.js +5 -1
- package/dist/i18n/locales/it-IT/uikit.js +5 -1
- package/dist/i18n/locales/ja-JP/uikit.js +5 -1
- package/dist/i18n/locales/nb-NO/uikit.js +5 -1
- package/dist/i18n/locales/pt-BR/uikit.js +5 -1
- package/dist/i18n/locales/pt-PT/uikit.js +5 -1
- package/dist/i18n/locales/sv-SE/uikit.js +5 -1
- package/dist/i18n/locales/vi-VN/uikit.js +5 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +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.d.ts +12 -0
- package/dist/icons/ArrowNarrowDownIcon.js +11 -0
- package/dist/icons/ArrowNarrowDownIcon.js.map +1 -0
- package/dist/icons/ArrowNarrowUpIcon.d.ts +12 -0
- package/dist/icons/ArrowNarrowUpIcon.js +11 -0
- package/dist/icons/ArrowNarrowUpIcon.js.map +1 -0
- 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/index.d.ts +2 -0
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/color-theme.d.ts +86 -0
- package/dist/tokens/color-theme.js +156 -0
- package/dist/tokens/color-theme.js.map +1 -0
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.d.ts +1 -0
- package/dist/tokens/index.js +2 -1
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/palette-config.js +2 -2
- package/dist/tokens/palette.d.ts +1 -1
- package/dist/tokens/palette.js +44 -2
- package/dist/tokens/palette.js.map +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/index.d.ts +1 -0
- 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.d.ts +49 -0
- package/dist/utils/react/disabledProps.js +82 -0
- package/dist/utils/react/disabledProps.js.map +1 -0
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.d.ts +1 -0
- package/dist/utils/react/index.js +2 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/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/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +2 -2
- package/docs/components/actions/Button.md +17 -0
- package/docs/components/content/Item.md +8 -1
- package/docs/components/data/DataTable.md +118 -2
- package/docs/components/data/ItemTable.md +37 -5
- package/package.json +1 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
|
|
2
|
+
import { __Menu } from "../../actions/Menu/Menu.js";
|
|
3
|
+
import { normalizeMenuAction } from "./row-menu.js";
|
|
4
|
+
import { Children, cloneElement, isValidElement } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/components/data/TableBase/column-menu.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Menu keys the table itself honours.
|
|
10
|
+
*
|
|
11
|
+
* Sorting is the only capability the table owns, so it is the only thing that
|
|
12
|
+
* can be a reserved key. `pin` and `hide` deliberately are not: `column.pin` and
|
|
13
|
+
* `column.isHidden` are read-only declarative inputs with no controlled state
|
|
14
|
+
* behind them, and reserving those keys would fix an API in string literals
|
|
15
|
+
* before the state that backs it exists. They stay ordinary consumer keys and
|
|
16
|
+
* are reported through `onColumnMenuAction` like anything else.
|
|
17
|
+
*/
|
|
18
|
+
const COLUMN_MENU_SORT_KEYS = [
|
|
19
|
+
"sort-asc",
|
|
20
|
+
"sort-desc",
|
|
21
|
+
"clear-sort"
|
|
22
|
+
];
|
|
23
|
+
function isColumnMenuSortKey(key) {
|
|
24
|
+
return COLUMN_MENU_SORT_KEYS.includes(key);
|
|
25
|
+
}
|
|
26
|
+
/** The direction a reserved key asks for. `clear-sort` asks for none. */
|
|
27
|
+
const COLUMN_MENU_SORT_DIRECTION = {
|
|
28
|
+
"sort-asc": "asc",
|
|
29
|
+
"sort-desc": "desc",
|
|
30
|
+
"clear-sort": null
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Whether a reserved key would do nothing if pressed.
|
|
34
|
+
*
|
|
35
|
+
* Redundancy is signalled by disabling the item rather than by ticking the
|
|
36
|
+
* active one. A tick would mean `isSelected`, which `MenuItem` only honours when
|
|
37
|
+
* the whole `Menu` runs at `selectionMode !== 'none'` (`MenuItem.tsx:43`) — and
|
|
38
|
+
* switching the menu into a selection mode would turn the consumer's own items
|
|
39
|
+
* into radios too, and could be overridden from `menuProps`. Disabling is local
|
|
40
|
+
* to the item and cannot leak.
|
|
41
|
+
*/
|
|
42
|
+
function isSortKeyRedundant(key, ctx) {
|
|
43
|
+
if (!ctx.isSortable) return true;
|
|
44
|
+
if (key === "clear-sort") return ctx.sort == null || ctx.disallowSortRemoval;
|
|
45
|
+
return ctx.sort === COLUMN_MENU_SORT_DIRECTION[key];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Fills in default labels and disabled state for the reserved sort keys.
|
|
49
|
+
*
|
|
50
|
+
* `Children.forEach` rather than `Children.toArray`, because `toArray` rewrites
|
|
51
|
+
* every key with a `.$` prefix — which breaks `selectedKeys` matching inside
|
|
52
|
+
* `Menu`. Same reason `TabButton` does it this way.
|
|
53
|
+
*
|
|
54
|
+
* A label or an `isDisabled` the consumer wrote always wins; this only supplies
|
|
55
|
+
* what was left out, so `<Menu.Item key="sort-asc" />` is the short form and
|
|
56
|
+
* `<Menu.Item key="sort-asc">Oldest first</Menu.Item>` still says what it says.
|
|
57
|
+
*/
|
|
58
|
+
function processColumnMenuItems(children, ctx) {
|
|
59
|
+
const result = [];
|
|
60
|
+
Children.forEach(children, (child) => {
|
|
61
|
+
if (!isValidElement(child)) {
|
|
62
|
+
result.push(child);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const element = child;
|
|
66
|
+
const childProps = element.props;
|
|
67
|
+
const key = element.key == null ? null : normalizeMenuAction(element.key);
|
|
68
|
+
if (key != null && isColumnMenuSortKey(key)) {
|
|
69
|
+
result.push(cloneElement(element, {
|
|
70
|
+
children: childProps.children ?? ctx.labels[key],
|
|
71
|
+
isDisabled: childProps.isDisabled ?? isSortKeyRedundant(key, ctx)
|
|
72
|
+
}));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (childProps.children != null && typeof childProps.children !== "string" && typeof childProps.children !== "number") {
|
|
76
|
+
result.push(cloneElement(element, { children: processColumnMenuItems(childProps.children, ctx) }));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
result.push(child);
|
|
80
|
+
});
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The reserved sort items, ready to drop into `header.menu`.
|
|
85
|
+
*
|
|
86
|
+
* ```tsx
|
|
87
|
+
* header: { menu: <>{columnSortMenu()}<Menu.Item key="pin">Pin</Menu.Item></> }
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* Exists because `Menu.Item` requires `children` — it comes from react-stately's
|
|
91
|
+
* `ItemProps` — so `<Menu.Item key="sort-asc" />` does not typecheck, and a
|
|
92
|
+
* consumer filling the label in by hand would hardcode one language and lose the
|
|
93
|
+
* translated one the table supplies. Passing `null` satisfies the type and reads
|
|
94
|
+
* as "the table fills this in", which `processColumnMenuItems` then does.
|
|
95
|
+
*
|
|
96
|
+
* Hand-written keys still work — this is a convenience, not the only route.
|
|
97
|
+
*/
|
|
98
|
+
function columnSortMenu(keys = COLUMN_MENU_SORT_KEYS) {
|
|
99
|
+
return keys.map((key) => /* @__PURE__ */ jsx(__Menu.Item, { children: null }, key));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
//#endregion
|
|
103
|
+
export { COLUMN_MENU_SORT_DIRECTION, COLUMN_MENU_SORT_KEYS, columnSortMenu, isColumnMenuSortKey, processColumnMenuItems };
|
|
104
|
+
//# sourceMappingURL=column-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-menu.js","names":["Menu"],"sources":["../../../../src/components/data/TableBase/column-menu.tsx"],"sourcesContent":["import { Children, cloneElement, isValidElement } from 'react';\n\nimport { Menu } from '../../actions/Menu';\n\nimport { normalizeMenuAction } from './row-menu';\n\nimport type { ReactElement, ReactNode } from 'react';\nimport type { CubeTableSortDirection } from './types';\n\n/**\n * Menu keys the table itself honours.\n *\n * Sorting is the only capability the table owns, so it is the only thing that\n * can be a reserved key. `pin` and `hide` deliberately are not: `column.pin` and\n * `column.isHidden` are read-only declarative inputs with no controlled state\n * behind them, and reserving those keys would fix an API in string literals\n * before the state that backs it exists. They stay ordinary consumer keys and\n * are reported through `onColumnMenuAction` like anything else.\n */\nexport const COLUMN_MENU_SORT_KEYS = [\n 'sort-asc',\n 'sort-desc',\n 'clear-sort',\n] as const;\n\nexport type CubeColumnMenuSortKey = (typeof COLUMN_MENU_SORT_KEYS)[number];\n\nexport function isColumnMenuSortKey(key: string): key is CubeColumnMenuSortKey {\n return (COLUMN_MENU_SORT_KEYS as readonly string[]).includes(key);\n}\n\n/** The direction a reserved key asks for. `clear-sort` asks for none. */\nexport const COLUMN_MENU_SORT_DIRECTION: Record<\n CubeColumnMenuSortKey,\n CubeTableSortDirection | null\n> = {\n 'sort-asc': 'asc',\n 'sort-desc': 'desc',\n 'clear-sort': null,\n};\n\nexport interface CubeColumnMenuContext {\n isSortable: boolean;\n /** This column's current direction, or `null` when it is unsorted. */\n sort: CubeTableSortDirection | null;\n disallowSortRemoval: boolean;\n /** Default labels, so `TableView` owns the i18n lookup and this stays pure. */\n labels: Record<CubeColumnMenuSortKey, string>;\n}\n\ninterface MenuItemLikeProps {\n children?: ReactNode;\n isDisabled?: boolean;\n}\n\n/**\n * Whether a reserved key would do nothing if pressed.\n *\n * Redundancy is signalled by disabling the item rather than by ticking the\n * active one. A tick would mean `isSelected`, which `MenuItem` only honours when\n * the whole `Menu` runs at `selectionMode !== 'none'` (`MenuItem.tsx:43`) — and\n * switching the menu into a selection mode would turn the consumer's own items\n * into radios too, and could be overridden from `menuProps`. Disabling is local\n * to the item and cannot leak.\n */\nfunction isSortKeyRedundant(\n key: CubeColumnMenuSortKey,\n ctx: CubeColumnMenuContext,\n): boolean {\n if (!ctx.isSortable) return true;\n\n if (key === 'clear-sort') {\n return ctx.sort == null || ctx.disallowSortRemoval;\n }\n\n return ctx.sort === COLUMN_MENU_SORT_DIRECTION[key];\n}\n\n/**\n * Fills in default labels and disabled state for the reserved sort keys.\n *\n * `Children.forEach` rather than `Children.toArray`, because `toArray` rewrites\n * every key with a `.$` prefix — which breaks `selectedKeys` matching inside\n * `Menu`. Same reason `TabButton` does it this way.\n *\n * A label or an `isDisabled` the consumer wrote always wins; this only supplies\n * what was left out, so `<Menu.Item key=\"sort-asc\" />` is the short form and\n * `<Menu.Item key=\"sort-asc\">Oldest first</Menu.Item>` still says what it says.\n */\nexport function processColumnMenuItems(\n children: ReactNode,\n ctx: CubeColumnMenuContext,\n): ReactNode {\n const result: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n result.push(child);\n\n return;\n }\n\n const element = child as ReactElement<MenuItemLikeProps>;\n const childProps = element.props;\n const key = element.key == null ? null : normalizeMenuAction(element.key);\n\n if (key != null && isColumnMenuSortKey(key)) {\n result.push(\n cloneElement(element, {\n children: childProps.children ?? ctx.labels[key],\n isDisabled: childProps.isDisabled ?? isSortKeyRedundant(key, ctx),\n }),\n );\n\n return;\n }\n\n // A `Menu.Section` holds the items; recurse so a reserved key inside one is\n // still resolved. Guarded on a non-text child so an ordinary item whose\n // label happens to be an element is not walked for no reason.\n if (\n childProps.children != null &&\n typeof childProps.children !== 'string' &&\n typeof childProps.children !== 'number'\n ) {\n result.push(\n cloneElement(element, {\n children: processColumnMenuItems(childProps.children, ctx),\n }),\n );\n\n return;\n }\n\n result.push(child);\n });\n\n // `Children.forEach` preserves order, and each entry keeps the key it was\n // written with — so React still reconciles these by key, not by index.\n return result;\n}\n\n/**\n * The reserved sort items, ready to drop into `header.menu`.\n *\n * ```tsx\n * header: { menu: <>{columnSortMenu()}<Menu.Item key=\"pin\">Pin</Menu.Item></> }\n * ```\n *\n * Exists because `Menu.Item` requires `children` — it comes from react-stately's\n * `ItemProps` — so `<Menu.Item key=\"sort-asc\" />` does not typecheck, and a\n * consumer filling the label in by hand would hardcode one language and lose the\n * translated one the table supplies. Passing `null` satisfies the type and reads\n * as \"the table fills this in\", which `processColumnMenuItems` then does.\n *\n * Hand-written keys still work — this is a convenience, not the only route.\n */\nexport function columnSortMenu(\n keys: readonly CubeColumnMenuSortKey[] = COLUMN_MENU_SORT_KEYS,\n): ReactNode {\n return keys.map((key) => <Menu.Item key={key}>{null}</Menu.Item>);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,MAAa,wBAAwB;CACnC;CACA;CACA;CACD;AAID,SAAgB,oBAAoB,KAA2C;AAC7E,QAAQ,sBAA4C,SAAS,IAAI;;;AAInE,MAAa,6BAGT;CACF,YAAY;CACZ,aAAa;CACb,cAAc;CACf;;;;;;;;;;;AA0BD,SAAS,mBACP,KACA,KACS;AACT,KAAI,CAAC,IAAI,WAAY,QAAO;AAE5B,KAAI,QAAQ,aACV,QAAO,IAAI,QAAQ,QAAQ,IAAI;AAGjC,QAAO,IAAI,SAAS,2BAA2B;;;;;;;;;;;;;AAcjD,SAAgB,uBACd,UACA,KACW;CACX,MAAM,SAAsB,EAAE;AAE9B,UAAS,QAAQ,WAAW,UAAU;AACpC,MAAI,CAAC,eAAe,MAAM,EAAE;AAC1B,UAAO,KAAK,MAAM;AAElB;;EAGF,MAAM,UAAU;EAChB,MAAM,aAAa,QAAQ;EAC3B,MAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,oBAAoB,QAAQ,IAAI;AAEzE,MAAI,OAAO,QAAQ,oBAAoB,IAAI,EAAE;AAC3C,UAAO,KACL,aAAa,SAAS;IACpB,UAAU,WAAW,YAAY,IAAI,OAAO;IAC5C,YAAY,WAAW,cAAc,mBAAmB,KAAK,IAAI;IAClE,CAAC,CACH;AAED;;AAMF,MACE,WAAW,YAAY,QACvB,OAAO,WAAW,aAAa,YAC/B,OAAO,WAAW,aAAa,UAC/B;AACA,UAAO,KACL,aAAa,SAAS,EACpB,UAAU,uBAAuB,WAAW,UAAU,IAAI,EAC3D,CAAC,CACH;AAED;;AAGF,SAAO,KAAK,MAAM;GAClB;AAIF,QAAO;;;;;;;;;;;;;;;;;AAkBT,SAAgB,eACd,OAAyC,uBAC9B;AACX,QAAO,KAAK,KAAK,QAAQ,oBAACA,OAAK,kBAAgB,QAAN,IAAuB,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
|
|
2
|
+
import { getPaletteConfig } from "../../../tokens/palette-config.js";
|
|
3
|
+
import { hashString } from "../../../tokens/color-theme.js";
|
|
4
|
+
|
|
5
|
+
//#region src/components/data/TableBase/column-tint.ts
|
|
6
|
+
const THEMES = new Set([
|
|
7
|
+
"primary",
|
|
8
|
+
"purple",
|
|
9
|
+
"success",
|
|
10
|
+
"danger",
|
|
11
|
+
"warning",
|
|
12
|
+
"note"
|
|
13
|
+
]);
|
|
14
|
+
const DEFAULT_SCOPE = [
|
|
15
|
+
"header",
|
|
16
|
+
"body",
|
|
17
|
+
"totals"
|
|
18
|
+
];
|
|
19
|
+
const EMPTY = {
|
|
20
|
+
slots: /* @__PURE__ */ new Map(),
|
|
21
|
+
scopes: /* @__PURE__ */ new Map(),
|
|
22
|
+
configs: [],
|
|
23
|
+
cellStyles: null,
|
|
24
|
+
headerCellStyles: null
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* A theme name is only a theme name when the palette has one — otherwise the
|
|
28
|
+
* string is a colour. `'note'` is a theme; `'#0ea5e9'` and `'red'` are colours.
|
|
29
|
+
*/
|
|
30
|
+
function isThemeName(value) {
|
|
31
|
+
return THEMES.has(value);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The seed for a palette theme, read from the live palette config so a re-seeded
|
|
35
|
+
* `success` hue moves the columns tinted with it.
|
|
36
|
+
*
|
|
37
|
+
* `primary` and `purple` are the brand itself, which is why they read `hue`
|
|
38
|
+
* rather than a `themes` entry — the palette derives them from the brand hue too.
|
|
39
|
+
*/
|
|
40
|
+
function themeSeed(theme) {
|
|
41
|
+
const config = getPaletteConfig();
|
|
42
|
+
if (theme === "primary" || theme === "purple") return {
|
|
43
|
+
hue: config.hue,
|
|
44
|
+
saturation: config.saturation
|
|
45
|
+
};
|
|
46
|
+
return config.themes[theme];
|
|
47
|
+
}
|
|
48
|
+
/** Normalizes any spec into a theme config, or `null` for the manual form. */
|
|
49
|
+
function tintConfig(color) {
|
|
50
|
+
if (typeof color === "string") return isThemeName(color) ? themeSeed(color) : { hue: color };
|
|
51
|
+
if ("fill" in color) return null;
|
|
52
|
+
return {
|
|
53
|
+
hue: color.hue,
|
|
54
|
+
saturation: color.saturation
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A stable identity for a spec, so two columns asking for the same colour share
|
|
59
|
+
* one slot — and therefore one set of generated rules.
|
|
60
|
+
*
|
|
61
|
+
* For a derived spec that identity is the theme's own content hash, which makes it
|
|
62
|
+
* shared across TABLES as well: the tokens are registered globally under the same
|
|
63
|
+
* name. The manual form has no theme, so it is keyed on its literal values.
|
|
64
|
+
*/
|
|
65
|
+
function manualKey(paint) {
|
|
66
|
+
return `raw-${hashString(`${paint.fill}|${paint.fillBand}|${paint.text}|${paint.headerText}`)}`;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Maps a table's columns onto tint slots and the style maps that paint them.
|
|
70
|
+
*
|
|
71
|
+
* Pure. The colour maths lives in `src/tokens/color-theme.ts`; this is only the
|
|
72
|
+
* mapping from columns to `data-tint` values and tasty state maps.
|
|
73
|
+
*/
|
|
74
|
+
function buildColumnTints(columns, { resolveTheme }) {
|
|
75
|
+
const tinted = columns.filter((column) => !column.isStructural && column.color != null);
|
|
76
|
+
if (!tinted.length) return EMPTY;
|
|
77
|
+
const slots = /* @__PURE__ */ new Map();
|
|
78
|
+
const scopes = /* @__PURE__ */ new Map();
|
|
79
|
+
const configs = [];
|
|
80
|
+
const paints = /* @__PURE__ */ new Map();
|
|
81
|
+
for (const column of tinted) {
|
|
82
|
+
const color = column.color;
|
|
83
|
+
const config = tintConfig(color);
|
|
84
|
+
let slot;
|
|
85
|
+
let paint;
|
|
86
|
+
if (config) {
|
|
87
|
+
const theme = resolveTheme(config);
|
|
88
|
+
slot = theme.name;
|
|
89
|
+
paint = {
|
|
90
|
+
fill: theme.colors.surface,
|
|
91
|
+
fillBand: theme.colors["surface-2"],
|
|
92
|
+
text: theme.colors["surface-2-text"],
|
|
93
|
+
headerText: theme.colors["surface-2-text-soft"]
|
|
94
|
+
};
|
|
95
|
+
if (!paints.has(slot)) configs.push(config);
|
|
96
|
+
} else {
|
|
97
|
+
const manual = color;
|
|
98
|
+
paint = {
|
|
99
|
+
fill: manual.fill,
|
|
100
|
+
fillBand: manual.fillBand ?? manual.fill,
|
|
101
|
+
text: manual.text ?? "#row-text",
|
|
102
|
+
headerText: manual.text ?? "#row-text"
|
|
103
|
+
};
|
|
104
|
+
slot = manualKey(paint);
|
|
105
|
+
}
|
|
106
|
+
slots.set(column.key, slot);
|
|
107
|
+
scopes.set(column.key, column.colorScope ?? DEFAULT_SCOPE);
|
|
108
|
+
paints.set(slot, paint);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
slots,
|
|
112
|
+
scopes,
|
|
113
|
+
configs,
|
|
114
|
+
cellStyles: cellTintStyles(paints),
|
|
115
|
+
headerCellStyles: headerTintStyles(paints)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* `#cell-base` / `#cell-text` for the body.
|
|
120
|
+
*
|
|
121
|
+
* The band and the pinned-total fill share ONE grouped key rather than two
|
|
122
|
+
* entries with the same value: tasty coalesces entries in a state map that
|
|
123
|
+
* serialize identically, promotes them to the group's maximum priority and
|
|
124
|
+
* negates them against everything below — which would silently turn the plain
|
|
125
|
+
* tint branch into `false`. See `src/components/data/AGENTS.md`.
|
|
126
|
+
*/
|
|
127
|
+
function cellTintStyles(paints) {
|
|
128
|
+
const base = { "": "#row-base" };
|
|
129
|
+
const text = { "": "#row-text" };
|
|
130
|
+
for (const [slot, paint] of paints) {
|
|
131
|
+
base[`@own(tint=${slot})`] = paint.fill;
|
|
132
|
+
if (paint.fillBand !== paint.fill) base[`@own(tint=${slot}) & (@own(odd) | @own(pinned))`] = paint.fillBand;
|
|
133
|
+
text[`@own(tint=${slot})`] = paint.text;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
"#cell-base": base,
|
|
137
|
+
"#cell-text": text
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The header takes the deeper band unconditionally, mirroring how the neutral
|
|
142
|
+
* header sits on `#surface-2` rather than `#surface`.
|
|
143
|
+
*/
|
|
144
|
+
function headerTintStyles(paints) {
|
|
145
|
+
const base = { "": "#row-base" };
|
|
146
|
+
const text = { "": "#row-text" };
|
|
147
|
+
for (const [slot, paint] of paints) {
|
|
148
|
+
base[`@own(tint=${slot})`] = paint.fillBand;
|
|
149
|
+
text[`@own(tint=${slot})`] = paint.headerText;
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
"#cell-base": base,
|
|
153
|
+
"#cell-text": text
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The `data-tint` value for one part of a column, or `undefined` when the column
|
|
158
|
+
* is untinted or its scope excludes that part.
|
|
159
|
+
*/
|
|
160
|
+
function tintSlot(tints, columnKey, scope) {
|
|
161
|
+
const slot = tints.slots.get(columnKey);
|
|
162
|
+
if (slot == null) return void 0;
|
|
163
|
+
return tints.scopes.get(columnKey)?.includes(scope) ? slot : void 0;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
//#endregion
|
|
167
|
+
export { buildColumnTints, tintSlot };
|
|
168
|
+
//# sourceMappingURL=column-tint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-tint.js","names":[],"sources":["../../../../src/components/data/TableBase/column-tint.ts"],"sourcesContent":["import { hashString } from '../../../tokens/color-theme';\nimport { getPaletteConfig } from '../../../tokens/palette-config';\n\nimport type { Styles } from '@tenphi/tasty';\nimport type { ColorThemeConfig } from '../../../tokens/color-theme';\nimport type {\n CubeResolvedColumn,\n CubeTableColumnColor,\n CubeTableColumnColorScope,\n CubeTableColumnTheme,\n} from './types';\n\nconst THEMES = new Set<string>([\n 'primary',\n 'purple',\n 'success',\n 'danger',\n 'warning',\n 'note',\n]);\n\nconst DEFAULT_SCOPE: readonly CubeTableColumnColorScope[] = [\n 'header',\n 'body',\n 'totals',\n];\n\n/** The three paint values a tinted cell needs, as tasty colour strings. */\ninterface TintPaint {\n fill: string;\n fillBand: string;\n text: string;\n /** The header's text — muted, to match an untinted header. */\n headerText: string;\n}\n\nexport interface ColumnTints {\n /** `columnKey` → `data-tint` value. Absent means the column is not tinted. */\n slots: Map<string, string>;\n /** Which scopes each column's tint applies to. */\n scopes: Map<string, readonly CubeTableColumnColorScope[]>;\n /**\n * Theme configs to register with `useColorTheme`, one per distinct derived\n * spec. Empty when every column used the `{ fill, text }` escape hatch.\n */\n configs: ColorThemeConfig[];\n /** Merge into `styles.Cell`. */\n cellStyles: Styles | null;\n /** Merge into `styles.HeaderCell`. */\n headerCellStyles: Styles | null;\n}\n\nconst EMPTY: ColumnTints = {\n slots: new Map(),\n scopes: new Map(),\n configs: [],\n cellStyles: null,\n headerCellStyles: null,\n};\n\n/**\n * A theme name is only a theme name when the palette has one — otherwise the\n * string is a colour. `'note'` is a theme; `'#0ea5e9'` and `'red'` are colours.\n */\nfunction isThemeName(value: string): value is CubeTableColumnTheme {\n return THEMES.has(value);\n}\n\n/**\n * The seed for a palette theme, read from the live palette config so a re-seeded\n * `success` hue moves the columns tinted with it.\n *\n * `primary` and `purple` are the brand itself, which is why they read `hue`\n * rather than a `themes` entry — the palette derives them from the brand hue too.\n */\nfunction themeSeed(theme: CubeTableColumnTheme): {\n hue: number;\n saturation: number;\n} {\n const config = getPaletteConfig();\n\n if (theme === 'primary' || theme === 'purple') {\n return { hue: config.hue, saturation: config.saturation };\n }\n\n return config.themes[theme];\n}\n\n/** Normalizes any spec into a theme config, or `null` for the manual form. */\nexport function tintConfig(\n color: CubeTableColumnColor,\n): ColorThemeConfig | null {\n if (typeof color === 'string') {\n return isThemeName(color) ? themeSeed(color) : { hue: color };\n }\n\n if ('fill' in color) return null;\n\n return { hue: color.hue, saturation: color.saturation };\n}\n\n/**\n * A stable identity for a spec, so two columns asking for the same colour share\n * one slot — and therefore one set of generated rules.\n *\n * For a derived spec that identity is the theme's own content hash, which makes it\n * shared across TABLES as well: the tokens are registered globally under the same\n * name. The manual form has no theme, so it is keyed on its literal values.\n */\nfunction manualKey(paint: TintPaint): string {\n // Hashed, not literal: the values contain `#`, `.` and `|`, none of which\n // survive being interpolated into a tasty `@own(tint=…)` state key.\n return `raw-${hashString(\n `${paint.fill}|${paint.fillBand}|${paint.text}|${paint.headerText}`,\n )}`;\n}\n\nexport interface BuildColumnTintsOptions {\n /**\n * Resolves a derived spec to its theme. Injected rather than imported so the\n * caller — which is a component and can run hooks — owns registration, and so\n * this stays a pure function.\n */\n resolveTheme: (config: ColorThemeConfig) => {\n name: string;\n colors: Record<string, string>;\n };\n}\n\n/**\n * Maps a table's columns onto tint slots and the style maps that paint them.\n *\n * Pure. The colour maths lives in `src/tokens/color-theme.ts`; this is only the\n * mapping from columns to `data-tint` values and tasty state maps.\n */\nexport function buildColumnTints<T>(\n columns: readonly CubeResolvedColumn<T>[],\n { resolveTheme }: BuildColumnTintsOptions,\n): ColumnTints {\n const tinted = columns.filter(\n (column) => !column.isStructural && column.color != null,\n );\n\n if (!tinted.length) return EMPTY;\n\n const slots = new Map<string, string>();\n const scopes = new Map<string, readonly CubeTableColumnColorScope[]>();\n const configs: ColorThemeConfig[] = [];\n const paints = new Map<string, TintPaint>();\n\n for (const column of tinted) {\n const color = column.color as CubeTableColumnColor;\n const config = tintConfig(color);\n let slot: string;\n let paint: TintPaint;\n\n if (config) {\n const theme = resolveTheme(config);\n\n slot = theme.name;\n paint = {\n fill: theme.colors.surface,\n fillBand: theme.colors['surface-2'],\n text: theme.colors['surface-2-text'],\n headerText: theme.colors['surface-2-text-soft'],\n };\n\n if (!paints.has(slot)) configs.push(config);\n } else {\n const manual = color as {\n fill: string;\n fillBand?: string;\n text?: string;\n };\n\n paint = {\n fill: manual.fill,\n // Without a band the column simply does not band — the caller asked for\n // exactly these values, so inventing a second one would be a surprise.\n fillBand: manual.fillBand ?? manual.fill,\n text: manual.text ?? '#row-text',\n // The manual form derives nothing, so the header takes the same text.\n headerText: manual.text ?? '#row-text',\n };\n slot = manualKey(paint);\n }\n\n slots.set(column.key, slot);\n scopes.set(column.key, column.colorScope ?? DEFAULT_SCOPE);\n paints.set(slot, paint);\n }\n\n return {\n slots,\n scopes,\n configs,\n cellStyles: cellTintStyles(paints),\n headerCellStyles: headerTintStyles(paints),\n };\n}\n\n/**\n * `#cell-base` / `#cell-text` for the body.\n *\n * The band and the pinned-total fill share ONE grouped key rather than two\n * entries with the same value: tasty coalesces entries in a state map that\n * serialize identically, promotes them to the group's maximum priority and\n * negates them against everything below — which would silently turn the plain\n * tint branch into `false`. See `src/components/data/AGENTS.md`.\n */\nfunction cellTintStyles(paints: Map<string, TintPaint>): Styles {\n const base: Record<string, string> = { '': '#row-base' };\n const text: Record<string, string> = { '': '#row-text' };\n\n for (const [slot, paint] of paints) {\n base[`@own(tint=${slot})`] = paint.fill;\n // Only worth a rule when it differs; an identical value here is exactly what\n // the coalescing trap eats.\n if (paint.fillBand !== paint.fill) {\n base[`@own(tint=${slot}) & (@own(odd) | @own(pinned))`] = paint.fillBand;\n }\n text[`@own(tint=${slot})`] = paint.text;\n }\n\n return { '#cell-base': base, '#cell-text': text };\n}\n\n/**\n * The header takes the deeper band unconditionally, mirroring how the neutral\n * header sits on `#surface-2` rather than `#surface`.\n */\nfunction headerTintStyles(paints: Map<string, TintPaint>): Styles {\n const base: Record<string, string> = { '': '#row-base' };\n const text: Record<string, string> = { '': '#row-text' };\n\n for (const [slot, paint] of paints) {\n base[`@own(tint=${slot})`] = paint.fillBand;\n text[`@own(tint=${slot})`] = paint.headerText;\n }\n\n return { '#cell-base': base, '#cell-text': text };\n}\n\n/**\n * The `data-tint` value for one part of a column, or `undefined` when the column\n * is untinted or its scope excludes that part.\n */\nexport function tintSlot(\n tints: ColumnTints,\n columnKey: string,\n scope: CubeTableColumnColorScope,\n): string | undefined {\n const slot = tints.slots.get(columnKey);\n\n if (slot == null) return undefined;\n\n return tints.scopes.get(columnKey)?.includes(scope) ? slot : undefined;\n}\n"],"mappings":";;;;;AAYA,MAAM,SAAS,IAAI,IAAY;CAC7B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,gBAAsD;CAC1D;CACA;CACA;CACD;AA2BD,MAAM,QAAqB;CACzB,uBAAO,IAAI,KAAK;CAChB,wBAAQ,IAAI,KAAK;CACjB,SAAS,EAAE;CACX,YAAY;CACZ,kBAAkB;CACnB;;;;;AAMD,SAAS,YAAY,OAA8C;AACjE,QAAO,OAAO,IAAI,MAAM;;;;;;;;;AAU1B,SAAS,UAAU,OAGjB;CACA,MAAM,SAAS,kBAAkB;AAEjC,KAAI,UAAU,aAAa,UAAU,SACnC,QAAO;EAAE,KAAK,OAAO;EAAK,YAAY,OAAO;EAAY;AAG3D,QAAO,OAAO,OAAO;;;AAIvB,SAAgB,WACd,OACyB;AACzB,KAAI,OAAO,UAAU,SACnB,QAAO,YAAY,MAAM,GAAG,UAAU,MAAM,GAAG,EAAE,KAAK,OAAO;AAG/D,KAAI,UAAU,MAAO,QAAO;AAE5B,QAAO;EAAE,KAAK,MAAM;EAAK,YAAY,MAAM;EAAY;;;;;;;;;;AAWzD,SAAS,UAAU,OAA0B;AAG3C,QAAO,OAAO,WACZ,GAAG,MAAM,KAAK,GAAG,MAAM,SAAS,GAAG,MAAM,KAAK,GAAG,MAAM,aACxD;;;;;;;;AAqBH,SAAgB,iBACd,SACA,EAAE,gBACW;CACb,MAAM,SAAS,QAAQ,QACpB,WAAW,CAAC,OAAO,gBAAgB,OAAO,SAAS,KACrD;AAED,KAAI,CAAC,OAAO,OAAQ,QAAO;CAE3B,MAAM,wBAAQ,IAAI,KAAqB;CACvC,MAAM,yBAAS,IAAI,KAAmD;CACtE,MAAM,UAA8B,EAAE;CACtC,MAAM,yBAAS,IAAI,KAAwB;AAE3C,MAAK,MAAM,UAAU,QAAQ;EAC3B,MAAM,QAAQ,OAAO;EACrB,MAAM,SAAS,WAAW,MAAM;EAChC,IAAI;EACJ,IAAI;AAEJ,MAAI,QAAQ;GACV,MAAM,QAAQ,aAAa,OAAO;AAElC,UAAO,MAAM;AACb,WAAQ;IACN,MAAM,MAAM,OAAO;IACnB,UAAU,MAAM,OAAO;IACvB,MAAM,MAAM,OAAO;IACnB,YAAY,MAAM,OAAO;IAC1B;AAED,OAAI,CAAC,OAAO,IAAI,KAAK,CAAE,SAAQ,KAAK,OAAO;SACtC;GACL,MAAM,SAAS;AAMf,WAAQ;IACN,MAAM,OAAO;IAGb,UAAU,OAAO,YAAY,OAAO;IACpC,MAAM,OAAO,QAAQ;IAErB,YAAY,OAAO,QAAQ;IAC5B;AACD,UAAO,UAAU,MAAM;;AAGzB,QAAM,IAAI,OAAO,KAAK,KAAK;AAC3B,SAAO,IAAI,OAAO,KAAK,OAAO,cAAc,cAAc;AAC1D,SAAO,IAAI,MAAM,MAAM;;AAGzB,QAAO;EACL;EACA;EACA;EACA,YAAY,eAAe,OAAO;EAClC,kBAAkB,iBAAiB,OAAO;EAC3C;;;;;;;;;;;AAYH,SAAS,eAAe,QAAwC;CAC9D,MAAM,OAA+B,EAAE,IAAI,aAAa;CACxD,MAAM,OAA+B,EAAE,IAAI,aAAa;AAExD,MAAK,MAAM,CAAC,MAAM,UAAU,QAAQ;AAClC,OAAK,aAAa,KAAK,MAAM,MAAM;AAGnC,MAAI,MAAM,aAAa,MAAM,KAC3B,MAAK,aAAa,KAAK,mCAAmC,MAAM;AAElE,OAAK,aAAa,KAAK,MAAM,MAAM;;AAGrC,QAAO;EAAE,cAAc;EAAM,cAAc;EAAM;;;;;;AAOnD,SAAS,iBAAiB,QAAwC;CAChE,MAAM,OAA+B,EAAE,IAAI,aAAa;CACxD,MAAM,OAA+B,EAAE,IAAI,aAAa;AAExD,MAAK,MAAM,CAAC,MAAM,UAAU,QAAQ;AAClC,OAAK,aAAa,KAAK,MAAM,MAAM;AACnC,OAAK,aAAa,KAAK,MAAM,MAAM;;AAGrC,QAAO;EAAE,cAAc;EAAM,cAAc;EAAM;;;;;;AAOnD,SAAgB,SACd,OACA,WACA,OACoB;CACpB,MAAM,OAAO,MAAM,MAAM,IAAI,UAAU;AAEvC,KAAI,QAAQ,KAAM,QAAO;AAEzB,QAAO,MAAM,OAAO,IAAI,UAAU,EAAE,SAAS,MAAM,GAAG,OAAO"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
import { CubeTableAlign, CubeTableCellContext, CubeTableColumn, CubeTableColumnHeader, CubeTableHeaderContext, CubeTableRowContext, CubeTableRowSection, CubeTableSort, CubeTableSortDirection } from "./types.js";
|
|
2
|
+
import { CubeTableAlign, CubeTableCellContext, CubeTableColumn, CubeTableColumnHeader, CubeTableHeaderContext, CubeTableRowContext, CubeTableRowSection, CubeTableRowSize, CubeTableSort, CubeTableSortDirection } from "./types.js";
|
|
3
3
|
import { CubeTableRowRenderProps } from "./TableView.js";
|
|
4
4
|
import "./styled.js";
|
|
5
|
-
import "./use-table-columns.js";
|
|
5
|
+
import "./use-table-columns.js";
|
|
6
|
+
import { COLUMN_MENU_SORT_KEYS, CubeColumnMenuSortKey, columnSortMenu } from "./column-menu.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
2
|
-
import { Children } from "react";
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
|
|
2
|
+
import { Children, Fragment, isValidElement } from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/components/data/TableBase/row-menu.ts
|
|
5
5
|
/**
|
|
@@ -17,14 +17,19 @@ const ROW_MENU_COLUMN_WIDTH = {
|
|
|
17
17
|
xlarge: 52
|
|
18
18
|
};
|
|
19
19
|
/**
|
|
20
|
-
* Whether a resolved
|
|
20
|
+
* Whether a resolved menu actually contains anything.
|
|
21
21
|
*
|
|
22
|
-
* A
|
|
23
|
-
*
|
|
22
|
+
* A resolver returning `null` — or an empty fragment — gets no trigger at all,
|
|
23
|
+
* rather than one that opens an empty popover.
|
|
24
|
+
*
|
|
25
|
+
* Fragments are unwrapped rather than counted. `Children.toArray` drops nullish
|
|
26
|
+
* and boolean children but keeps a fragment as a single node, so
|
|
27
|
+
* `<>{canPin && <Menu.Item/>}</>` read as one item even with nothing in it — and
|
|
28
|
+
* a menu assembled from conditions is the common case, not the exotic one.
|
|
24
29
|
*/
|
|
25
30
|
function isMenuEmpty(menu) {
|
|
26
31
|
if (menu == null || menu === false) return true;
|
|
27
|
-
return Children.toArray(menu).
|
|
32
|
+
return Children.toArray(menu).every((child) => isValidElement(child) && child.type === Fragment && isMenuEmpty(child.props.children));
|
|
28
33
|
}
|
|
29
34
|
/**
|
|
30
35
|
* Strips the `.$` prefix React adds to keys when children pass through
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"row-menu.js","names":[],"sources":["../../../../src/components/data/TableBase/row-menu.ts"],"sourcesContent":["import { Children } from 'react';\n\nimport type { ReactNode } from 'react';\n\n/**\n * Reserved key for the `⋮` trigger column. Prefixed so it cannot collide with\n * a real data key, and structural so the value pipeline, sorting and search all\n * skip it.\n */\nexport const ROW_MENU_COLUMN_KEY = '__cube-row-menu__';\n\n/** Wide enough for one `ItemAction`, with no content width to spare. */\nexport const ROW_MENU_COLUMN_WIDTH: Record<string, number> = {\n xsmall: 32,\n small: 36,\n medium: 44,\n large: 48,\n xlarge: 52,\n};\n\n/**\n * Whether a resolved
|
|
1
|
+
{"version":3,"file":"row-menu.js","names":[],"sources":["../../../../src/components/data/TableBase/row-menu.ts"],"sourcesContent":["import { Children, Fragment, isValidElement } from 'react';\n\nimport type { ReactNode } from 'react';\n\n/**\n * Reserved key for the `⋮` trigger column. Prefixed so it cannot collide with\n * a real data key, and structural so the value pipeline, sorting and search all\n * skip it.\n */\nexport const ROW_MENU_COLUMN_KEY = '__cube-row-menu__';\n\n/** Wide enough for one `ItemAction`, with no content width to spare. */\nexport const ROW_MENU_COLUMN_WIDTH: Record<string, number> = {\n xsmall: 32,\n small: 36,\n medium: 44,\n large: 48,\n xlarge: 52,\n};\n\n/**\n * Whether a resolved menu actually contains anything.\n *\n * A resolver returning `null` — or an empty fragment — gets no trigger at all,\n * rather than one that opens an empty popover.\n *\n * Fragments are unwrapped rather than counted. `Children.toArray` drops nullish\n * and boolean children but keeps a fragment as a single node, so\n * `<>{canPin && <Menu.Item/>}</>` read as one item even with nothing in it — and\n * a menu assembled from conditions is the common case, not the exotic one.\n */\nexport function isMenuEmpty(menu: ReactNode): boolean {\n if (menu == null || menu === false) return true;\n\n // `every` on an empty array is `true`, which is the base case: nothing left\n // after `toArray` pruned the nullish children means nothing to show.\n return Children.toArray(menu).every(\n (child) =>\n isValidElement(child) &&\n child.type === Fragment &&\n isMenuEmpty((child.props as { children?: ReactNode }).children),\n );\n}\n\n/**\n * Strips the `.$` prefix React adds to keys when children pass through\n * `Children.toArray`, so the consumer sees the key it wrote on `Menu.Item`.\n */\nexport function normalizeMenuAction(action: unknown): string {\n const value = String(action);\n\n return value.startsWith('.$') ? value.slice(2) : value;\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,sBAAsB;;AAGnC,MAAa,wBAAgD;CAC3D,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACT;;;;;;;;;;;;AAaD,SAAgB,YAAY,MAA0B;AACpD,KAAI,QAAQ,QAAQ,SAAS,MAAO,QAAO;AAI3C,QAAO,SAAS,QAAQ,KAAK,CAAC,OAC3B,UACC,eAAe,MAAM,IACrB,MAAM,SAAS,YACf,YAAa,MAAM,MAAmC,SAAS,CAClE;;;;;;AAOH,SAAgB,oBAAoB,QAAyB;CAC3D,MAAM,QAAQ,OAAO,OAAO;AAE5B,QAAO,MAAM,WAAW,KAAK,GAAG,MAAM,MAAM,EAAE,GAAG"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.159.0 | Cube Dev Team */
|
|
2
2
|
import { _Item } from "../../content/Item/Item.js";
|
|
3
3
|
import { keyframes, tasty } from "@tenphi/tasty";
|
|
4
4
|
|
|
@@ -49,11 +49,13 @@ const CELL_STYLES = {
|
|
|
49
49
|
"": "$cell-padding-x",
|
|
50
50
|
"@own(kind=selection) | @own(kind=actions)": 0
|
|
51
51
|
},
|
|
52
|
+
"#cell-base": "#row-base",
|
|
53
|
+
"#cell-text": "#row-text",
|
|
52
54
|
fill: {
|
|
53
|
-
"": "#
|
|
54
|
-
"@own(cell-selected)": "#
|
|
55
|
+
"": "#cell-base #row-overlay",
|
|
56
|
+
"@own(cell-selected)": "#cell-base #purple.10"
|
|
55
57
|
},
|
|
56
|
-
color: "#
|
|
58
|
+
color: "#cell-text",
|
|
57
59
|
opacity: "$dim",
|
|
58
60
|
position: {
|
|
59
61
|
"": "static",
|
|
@@ -123,6 +125,8 @@ const TableElement = tasty({
|
|
|
123
125
|
"#row-base": "#surface",
|
|
124
126
|
"#row-overlay": "#clear",
|
|
125
127
|
"#row-text": "#surface-text",
|
|
128
|
+
"#cell-base": "#row-base",
|
|
129
|
+
"#cell-text": "#row-text",
|
|
126
130
|
display: "grid",
|
|
127
131
|
gridRows: "max-content minmax(0, 1fr) max-content",
|
|
128
132
|
gridColumns: "minmax(0, 1fr)",
|
|
@@ -145,6 +149,7 @@ const TableElement = tasty({
|
|
|
145
149
|
gridRow: 2,
|
|
146
150
|
position: "relative",
|
|
147
151
|
overflow: "auto",
|
|
152
|
+
outline: "none",
|
|
148
153
|
scrollbar: "thin stable",
|
|
149
154
|
userSelect: {
|
|
150
155
|
"": "auto",
|
|
@@ -165,8 +170,8 @@ const TableElement = tasty({
|
|
|
165
170
|
},
|
|
166
171
|
maskImage: {
|
|
167
172
|
"": "none",
|
|
168
|
-
stale: "linear-gradient(90deg,
|
|
169
|
-
"@media(prefers-reduced-motion)": "linear-gradient(90deg,
|
|
173
|
+
stale: "linear-gradient(90deg, #black 0%, #black 35%, #black.4 50%, #black 65%, #black 100%)",
|
|
174
|
+
"@media(prefers-reduced-motion)": "linear-gradient(90deg, #black 0%, #black 100%)"
|
|
170
175
|
},
|
|
171
176
|
maskSize: "300% 100%",
|
|
172
177
|
animation: {
|
|
@@ -217,12 +222,18 @@ const TableElement = tasty({
|
|
|
217
222
|
"@own(pin=start | pin=end)": 3
|
|
218
223
|
},
|
|
219
224
|
fill: {
|
|
220
|
-
"": "#
|
|
221
|
-
"@own(sortable) & @own(:hover)": "#
|
|
225
|
+
"": "#cell-base #row-overlay",
|
|
226
|
+
"(@own(sortable) & @own(:hover)) | @own(menu-open)": "#cell-base #surface-text.04"
|
|
222
227
|
},
|
|
223
228
|
cursor: {
|
|
224
229
|
"": "default",
|
|
225
|
-
"@own(sortable)": "pointer"
|
|
230
|
+
"@own(sortable)": "pointer",
|
|
231
|
+
"@own(draggable) & !@own(sortable)": "grab",
|
|
232
|
+
"@own(dragging)": "grabbing"
|
|
233
|
+
},
|
|
234
|
+
opacity: {
|
|
235
|
+
"": 1,
|
|
236
|
+
"@own(dragging)": .4
|
|
226
237
|
},
|
|
227
238
|
userSelect: "none",
|
|
228
239
|
position: {
|
|
@@ -233,6 +244,10 @@ const TableElement = tasty({
|
|
|
233
244
|
"": "hidden",
|
|
234
245
|
"@own(resizable)": "visible"
|
|
235
246
|
},
|
|
247
|
+
"$sort-hint": {
|
|
248
|
+
"": 0,
|
|
249
|
+
"@own(sortable) & (@own(:hover) | @own(:focus-visible))": .4
|
|
250
|
+
},
|
|
236
251
|
"$resizer-offset": {
|
|
237
252
|
"": "-.5x",
|
|
238
253
|
"@own(last-column)": "0px"
|
|
@@ -274,6 +289,24 @@ const TableElement = tasty({
|
|
|
274
289
|
fill: "#resizer-line",
|
|
275
290
|
transition: "theme"
|
|
276
291
|
},
|
|
292
|
+
ColumnDropIndicator: {
|
|
293
|
+
$: "> Scroller > Table > Head > HeadRow > HeaderCell >",
|
|
294
|
+
position: "absolute",
|
|
295
|
+
top: 0,
|
|
296
|
+
bottom: 0,
|
|
297
|
+
width: "2bw",
|
|
298
|
+
insetInlineStart: {
|
|
299
|
+
"": "auto",
|
|
300
|
+
"@own(position=before)": 0
|
|
301
|
+
},
|
|
302
|
+
insetInlineEnd: {
|
|
303
|
+
"": "auto",
|
|
304
|
+
"@own(position=after)": 0
|
|
305
|
+
},
|
|
306
|
+
fill: "#purple",
|
|
307
|
+
radius: "1r",
|
|
308
|
+
zIndex: 4
|
|
309
|
+
},
|
|
277
310
|
RowLink: {
|
|
278
311
|
$: "> Scroller > Table > Body > Row > Cell >",
|
|
279
312
|
position: "absolute",
|
|
@@ -346,14 +379,10 @@ const TableElement = tasty({
|
|
|
346
379
|
height: "2x",
|
|
347
380
|
color: "#surface-text",
|
|
348
381
|
opacity: {
|
|
349
|
-
"":
|
|
382
|
+
"": "$sort-hint",
|
|
350
383
|
"@own(sorted)": 1
|
|
351
384
|
},
|
|
352
|
-
|
|
353
|
-
"": "1 1",
|
|
354
|
-
"@own(dir=desc)": "1 -1"
|
|
355
|
-
},
|
|
356
|
-
transition: "opacity, scale"
|
|
385
|
+
transition: "opacity"
|
|
357
386
|
},
|
|
358
387
|
Body: { $: "> Scroller > Table >" },
|
|
359
388
|
Row: {
|
|
@@ -425,7 +454,7 @@ const TableElement = tasty({
|
|
|
425
454
|
"@own(link)": 600
|
|
426
455
|
},
|
|
427
456
|
color: {
|
|
428
|
-
"": "#
|
|
457
|
+
"": "#cell-text",
|
|
429
458
|
"@own(link)": "#purple-text"
|
|
430
459
|
},
|
|
431
460
|
textDecoration: {
|