@cube-dev/ui-kit 0.0.0-canary-34ce1a4 → 0.0.0-canary-7dc6906
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/_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.d.ts +14 -14
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +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 +24 -82
- package/dist/components/data/DataTable/DataTable.js.map +1 -1
- package/dist/components/data/DataTable/types.d.ts +1 -56
- package/dist/components/data/ItemTable/ItemTable.js +5 -13
- 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 +0 -19
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +3 -5
- package/dist/components/data/TableBase/RowCollection.js.map +1 -1
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +31 -192
- package/dist/components/data/TableBase/TableView.js.map +1 -1
- package/dist/components/data/TableBase/index.d.ts +2 -3
- package/dist/components/data/TableBase/row-menu.js +6 -11
- package/dist/components/data/TableBase/row-menu.js.map +1 -1
- package/dist/components/data/TableBase/styled.js +11 -44
- package/dist/components/data/TableBase/styled.js.map +1 -1
- package/dist/components/data/TableBase/types.d.ts +6 -104
- 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-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 +2 -24
- 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 +1 -20
- package/dist/components/data/TableBase/use-table-sort.js.map +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -40
- 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 +2 -6
- package/dist/components/data/TableBase/use-table-storage.js.map +1 -1
- package/dist/components/data/index.d.ts +1 -2
- 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 +1 -13
- 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 +1 -5
- package/dist/i18n/locales/en-US/uikit.js +1 -5
- package/dist/i18n/locales/en-US/uikit.json.d.ts +0 -4
- package/dist/i18n/locales/es-ES/uikit.js +1 -5
- package/dist/i18n/locales/es-MX/uikit.js +1 -5
- package/dist/i18n/locales/fr-FR/uikit.js +1 -5
- package/dist/i18n/locales/it-IT/uikit.js +1 -5
- package/dist/i18n/locales/ja-JP/uikit.js +1 -5
- package/dist/i18n/locales/nb-NO/uikit.js +1 -5
- package/dist/i18n/locales/pt-BR/uikit.js +1 -5
- package/dist/i18n/locales/pt-PT/uikit.js +1 -5
- package/dist/i18n/locales/sv-SE/uikit.js +1 -5
- package/dist/i18n/locales/vi-VN/uikit.js +1 -5
- 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/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PipetteIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.d.ts +0 -1
- package/dist/tokens/index.js +1 -2
- 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 +2 -44
- 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 +2 -118
- package/docs/components/data/ItemTable.md +5 -37
- package/package.json +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +0 -115
- package/dist/components/data/TableBase/TableHeaderCell.js.map +0 -1
- package/dist/components/data/TableBase/column-menu.d.ts +0 -36
- package/dist/components/data/TableBase/column-menu.js +0 -104
- package/dist/components/data/TableBase/column-menu.js.map +0 -1
- package/dist/components/data/TableBase/column-tint.js +0 -168
- package/dist/components/data/TableBase/column-tint.js.map +0 -1
- package/dist/components/data/TableBase/use-column-order.js +0 -100
- package/dist/components/data/TableBase/use-column-order.js.map +0 -1
- package/dist/tokens/color-theme.d.ts +0 -86
- package/dist/tokens/color-theme.js +0 -156
- package/dist/tokens/color-theme.js.map +0 -1
|
@@ -189,14 +189,6 @@ pivots, totals. Use `ListBox` when there is only one column.
|
|
|
189
189
|
- **`defaultColumnWidths`** `Record<string, number>` — Initial widths.
|
|
190
190
|
- **`onColumnResize`** `(columnKey, width, all) => void` — Fires once the
|
|
191
191
|
gesture ends, not on every pixel.
|
|
192
|
-
- **`columnContextMenu`** `boolean | 'context-only'` (default: `true`) — Where a
|
|
193
|
-
column's `header.menu` is exposed: a `⋮` trigger plus right-click and
|
|
194
|
-
Shift+F10, right-click only, or nowhere.
|
|
195
|
-
- **`onColumnMenuAction`** `(action, columnKey) => void` — The pressed
|
|
196
|
-
`Menu.Item` key, as written. Fires for the reserved sort keys too, after the
|
|
197
|
-
table has applied them.
|
|
198
|
-
- **`columnMenuTriggerProps`** `Record<string, any>` — Props for the `⋮` trigger.
|
|
199
|
-
- **`columnMenuProps`** `Record<string, any>` — Props for the `Menu`.
|
|
200
192
|
- **`storageKey`** `string` — Persists the table's own state under
|
|
201
193
|
`cube-ui-kit:table:${storageKey}`. Controlled state is never stored — a
|
|
202
194
|
controlled `pageSize` or `sort` belongs to the page, and restoring it would
|
|
@@ -233,7 +225,7 @@ interface CubeItemTableColumn<T> {
|
|
|
233
225
|
cellProps?: (ctx) => Record<string, any> | undefined;
|
|
234
226
|
|
|
235
227
|
align?: 'start' | 'center' | 'end';
|
|
236
|
-
isSortable?: boolean;
|
|
228
|
+
isSortable?: boolean;
|
|
237
229
|
isSearchable?: boolean; // include in the built-in search (default true)
|
|
238
230
|
isCopyable?: boolean; // include in TSV copy (default true)
|
|
239
231
|
autoHeight?: boolean; // wrap text and let the row grow
|
|
@@ -413,11 +405,10 @@ search sets it for you.
|
|
|
413
405
|
|
|
414
406
|
### Sorting
|
|
415
407
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
cycle; set `disallowSortRemoval` on a column to reduce it to `asc ↔ desc`.
|
|
408
|
+
Mark columns `isSortable` and clicking a header cycles
|
|
409
|
+
`ascending → descending → unsorted`. The third state matters whenever the source
|
|
410
|
+
order is meaningful, which is why it is the default cycle; set
|
|
411
|
+
`disallowSortRemoval` on a column to reduce it to `asc ↔ desc`.
|
|
421
412
|
|
|
422
413
|
```jsx
|
|
423
414
|
<ItemTable
|
|
@@ -431,29 +422,6 @@ cycle; set `disallowSortRemoval` on a column to reduce it to `asc ↔ desc`.
|
|
|
431
422
|
/>
|
|
432
423
|
```
|
|
433
424
|
|
|
434
|
-
#### A fixed order the user cannot change
|
|
435
|
-
|
|
436
|
-
For a list that arrives in a meaningful order — most of them — leave every column
|
|
437
|
-
alone and pass the order you want. `sortMode="client"` keeps the engine sorting
|
|
438
|
-
while the headers stay inert, so nothing is clickable and no header takes a tab
|
|
439
|
-
stop:
|
|
440
|
-
|
|
441
|
-
```jsx
|
|
442
|
-
<ItemTable
|
|
443
|
-
data={rows}
|
|
444
|
-
columns={[{ key: 'name', title: 'Name' }]}
|
|
445
|
-
sortMode="client"
|
|
446
|
-
sort={{ columnKey: 'name', direction: 'asc' }}
|
|
447
|
-
/>
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
The sorted column still carries `aria-sort`, so a screen reader announces the
|
|
451
|
-
order even though the header cannot be operated. It is **not** drawn — the sort
|
|
452
|
-
arrow belongs to the clickable affordance — so add your own marker through
|
|
453
|
-
`header.suffix` if sighted users need to see which column the order follows.
|
|
454
|
-
|
|
455
|
-
Data already in the right order needs none of this: pass it and set nothing.
|
|
456
|
-
|
|
457
425
|
Client-side sorting compares raw `getValue` results — numerically for numbers,
|
|
458
426
|
chronologically for dates — and falls back to a locale-aware collator over the
|
|
459
427
|
column's display text, so a formatted column sorts the way it reads. `compare`
|
package/package.json
CHANGED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-34ce1a4 | Cube Dev Team */
|
|
2
|
-
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
|
-
import { useEffect, useRef, useState } from "react";
|
|
4
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import { useDraggableItem, useDropIndicator } from "react-aria";
|
|
6
|
-
|
|
7
|
-
//#region src/components/data/TableBase/TableHeaderCell.tsx
|
|
8
|
-
/**
|
|
9
|
-
* Controls inside the header that own their own press, and must never start a
|
|
10
|
-
* column drag.
|
|
11
|
-
*
|
|
12
|
-
* Drag-source resolution walks the DOM tree, not the React event path, so
|
|
13
|
-
* `Item`'s `Actions` slot calling `stopPropagation` does nothing here — the
|
|
14
|
-
* `<th>` is still the drag source as far as the browser is concerned. Only
|
|
15
|
-
* `preventDefault` on `dragstart` stops it, which is what the capture handler
|
|
16
|
-
* below does.
|
|
17
|
-
*/
|
|
18
|
-
const NO_DRAG_SELECTOR = "[data-element=\"Resizer\"], [data-element=\"Actions\"], a, button, input, select, textarea, [role=\"button\"], [role=\"menuitem\"]";
|
|
19
|
-
function HeaderCell(props) {
|
|
20
|
-
const { cellProps, extra, children } = props;
|
|
21
|
-
return /* @__PURE__ */ jsx("th", {
|
|
22
|
-
...cellProps,
|
|
23
|
-
...extra,
|
|
24
|
-
children
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* A header cell inside a collection that accepts drags.
|
|
29
|
-
*
|
|
30
|
-
* Split from the plain one so the drag hooks can be called unconditionally —
|
|
31
|
-
* they are hooks, and whether a table reorders its columns is a prop.
|
|
32
|
-
*/
|
|
33
|
-
function DraggableHeaderCell(props) {
|
|
34
|
-
const { columnKey, hasAction, isLastDraggable, dragState, dropState } = props;
|
|
35
|
-
const { dragProps, isDragging } = useDraggableItem({
|
|
36
|
-
key: columnKey,
|
|
37
|
-
hasAction
|
|
38
|
-
}, dragState);
|
|
39
|
-
return /* @__PURE__ */ jsxs(HeaderCell, {
|
|
40
|
-
...props,
|
|
41
|
-
extra: {
|
|
42
|
-
...mergeProps$1(props.cellProps, dragProps, { onDragStartCapture: (event) => {
|
|
43
|
-
if (event.target?.closest?.(NO_DRAG_SELECTOR)) {
|
|
44
|
-
event.preventDefault();
|
|
45
|
-
event.stopPropagation();
|
|
46
|
-
}
|
|
47
|
-
} }),
|
|
48
|
-
"data-draggable": "",
|
|
49
|
-
"data-dragging": isDragging ? "" : void 0
|
|
50
|
-
},
|
|
51
|
-
children: [
|
|
52
|
-
/* @__PURE__ */ jsx(ColumnDropIndicator, {
|
|
53
|
-
columnKey,
|
|
54
|
-
dropPosition: "before",
|
|
55
|
-
dropState
|
|
56
|
-
}),
|
|
57
|
-
props.children,
|
|
58
|
-
isLastDraggable ? /* @__PURE__ */ jsx(ColumnDropIndicator, {
|
|
59
|
-
columnKey,
|
|
60
|
-
dropPosition: "after",
|
|
61
|
-
dropState
|
|
62
|
-
}) : null
|
|
63
|
-
]
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
function TableHeaderCell(props) {
|
|
67
|
-
return props.dragState && props.dropState ? /* @__PURE__ */ jsx(DraggableHeaderCell, { ...props }) : /* @__PURE__ */ jsx(HeaderCell, { ...props });
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* The line showing where a dragged column would land.
|
|
71
|
-
*
|
|
72
|
-
* Lives INSIDE the `<th>`, absolutely positioned on one of its edges — a `<tr>`
|
|
73
|
-
* may only contain `<th>`/`<td>`, so there is nowhere between two header cells
|
|
74
|
-
* to put it. Being absolute also means mounting one cannot shift the layout,
|
|
75
|
-
* which is the bug class the row indicator had to be careful about.
|
|
76
|
-
*
|
|
77
|
-
* `useDropIndicator` reports `isHidden` unless this is the active target, so a
|
|
78
|
-
* table merely capable of reordering keeps its exact DOM until a drag starts.
|
|
79
|
-
*/
|
|
80
|
-
function ColumnDropIndicator({ columnKey, dropPosition, dropState }) {
|
|
81
|
-
const ref = useRef(null);
|
|
82
|
-
const { dropIndicatorProps, isHidden, isDropTarget } = useDropIndicator({ target: {
|
|
83
|
-
type: "item",
|
|
84
|
-
key: columnKey,
|
|
85
|
-
dropPosition
|
|
86
|
-
} }, dropState, ref);
|
|
87
|
-
/**
|
|
88
|
-
* Re-register the drop targets when the header's geometry changes.
|
|
89
|
-
*
|
|
90
|
-
* React Aria's `ListDropTargetDelegate` measures every `[data-key]` at the
|
|
91
|
-
* moment a drag starts. A column resized mid-drag — or a scrollbar appearing —
|
|
92
|
-
* leaves those rects stale, and the drop lands in the wrong place. Same trick
|
|
93
|
-
* `TabDropIndicator` uses.
|
|
94
|
-
*/
|
|
95
|
-
const [, forceUpdate] = useState(0);
|
|
96
|
-
useEffect(() => {
|
|
97
|
-
const row = ref.current?.closest("[data-element=\"HeadRow\"]");
|
|
98
|
-
if (!row || typeof ResizeObserver === "undefined") return;
|
|
99
|
-
const observer = new ResizeObserver(() => forceUpdate((n) => n + 1));
|
|
100
|
-
observer.observe(row);
|
|
101
|
-
return () => observer.disconnect();
|
|
102
|
-
}, []);
|
|
103
|
-
if (isHidden) return null;
|
|
104
|
-
return /* @__PURE__ */ jsx("div", {
|
|
105
|
-
...dropIndicatorProps,
|
|
106
|
-
ref,
|
|
107
|
-
"data-element": "ColumnDropIndicator",
|
|
108
|
-
"data-position": dropPosition,
|
|
109
|
-
"data-drop-target": isDropTarget ? "" : void 0
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
//#endregion
|
|
114
|
-
export { TableHeaderCell };
|
|
115
|
-
//# sourceMappingURL=TableHeaderCell.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TableHeaderCell.js","names":["mergeProps"],"sources":["../../../../src/components/data/TableBase/TableHeaderCell.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useDraggableItem, useDropIndicator } from 'react-aria';\n\nimport { mergeProps } from '../../../utils/react';\n\nimport type { ReactNode } from 'react';\nimport type {\n DraggableCollectionState,\n DroppableCollectionState,\n} from 'react-stately';\n\n/**\n * Controls inside the header that own their own press, and must never start a\n * column drag.\n *\n * Drag-source resolution walks the DOM tree, not the React event path, so\n * `Item`'s `Actions` slot calling `stopPropagation` does nothing here — the\n * `<th>` is still the drag source as far as the browser is concerned. Only\n * `preventDefault` on `dragstart` stops it, which is what the capture handler\n * below does.\n */\nconst NO_DRAG_SELECTOR =\n '[data-element=\"Resizer\"], [data-element=\"Actions\"], a, button, input, select, textarea, [role=\"button\"], [role=\"menuitem\"]';\n\nexport interface TableHeaderCellProps {\n columnKey: string;\n /** Everything the renderer already computed: mods, ARIA, handlers, styles. */\n cellProps: Record<string, any>;\n /** Whether the header itself responds to Enter — i.e. it sorts. */\n hasAction: boolean;\n isLastDraggable: boolean;\n dragState?: DraggableCollectionState;\n dropState?: DroppableCollectionState;\n children: ReactNode;\n}\n\nfunction HeaderCell(\n props: TableHeaderCellProps & { extra?: Record<string, any> },\n) {\n const { cellProps, extra, children } = props;\n\n return (\n <th {...cellProps} {...extra}>\n {children}\n </th>\n );\n}\n\n/**\n * A header cell inside a collection that accepts drags.\n *\n * Split from the plain one so the drag hooks can be called unconditionally —\n * they are hooks, and whether a table reorders its columns is a prop.\n */\nfunction DraggableHeaderCell(props: TableHeaderCellProps) {\n const { columnKey, hasAction, isLastDraggable, dragState, dropState } = props;\n\n const { dragProps, isDragging } = useDraggableItem(\n // `hasAction` re-gates React Aria's Enter/Space capture behind Alt, so plain\n // Enter still reaches the header's own sort handler instead of starting a\n // keyboard drag session.\n { key: columnKey, hasAction },\n dragState as DraggableCollectionState,\n );\n\n return (\n <HeaderCell\n {...props}\n extra={{\n // `dragProps` last for `draggable`, which is a value rather than a\n // handler — `mergeProps` chains handlers but takes the later value. The\n // sort `onClick` survives: `useDraggableItem` only deletes its own.\n ...mergeProps(props.cellProps, dragProps, {\n // Capture, so this runs before React Aria's own `onDragStart` on the\n // same node and can cancel it.\n onDragStartCapture: (event: any) => {\n if ((event.target as HTMLElement)?.closest?.(NO_DRAG_SELECTOR)) {\n event.preventDefault();\n event.stopPropagation();\n }\n },\n }),\n 'data-draggable': '',\n 'data-dragging': isDragging ? '' : undefined,\n }}\n >\n <ColumnDropIndicator\n columnKey={columnKey}\n dropPosition=\"before\"\n dropState={dropState as DroppableCollectionState}\n />\n {props.children}\n {isLastDraggable ? (\n <ColumnDropIndicator\n columnKey={columnKey}\n dropPosition=\"after\"\n dropState={dropState as DroppableCollectionState}\n />\n ) : null}\n </HeaderCell>\n );\n}\n\nexport function TableHeaderCell(props: TableHeaderCellProps) {\n return props.dragState && props.dropState ? (\n <DraggableHeaderCell {...props} />\n ) : (\n <HeaderCell {...props} />\n );\n}\n\ninterface ColumnDropIndicatorProps {\n columnKey: string;\n dropPosition: 'before' | 'after';\n dropState: DroppableCollectionState;\n}\n\n/**\n * The line showing where a dragged column would land.\n *\n * Lives INSIDE the `<th>`, absolutely positioned on one of its edges — a `<tr>`\n * may only contain `<th>`/`<td>`, so there is nowhere between two header cells\n * to put it. Being absolute also means mounting one cannot shift the layout,\n * which is the bug class the row indicator had to be careful about.\n *\n * `useDropIndicator` reports `isHidden` unless this is the active target, so a\n * table merely capable of reordering keeps its exact DOM until a drag starts.\n */\nfunction ColumnDropIndicator({\n columnKey,\n dropPosition,\n dropState,\n}: ColumnDropIndicatorProps) {\n const ref = useRef<HTMLDivElement>(null);\n const { dropIndicatorProps, isHidden, isDropTarget } = useDropIndicator(\n { target: { type: 'item', key: columnKey, dropPosition } },\n dropState,\n ref,\n );\n\n /**\n * Re-register the drop targets when the header's geometry changes.\n *\n * React Aria's `ListDropTargetDelegate` measures every `[data-key]` at the\n * moment a drag starts. A column resized mid-drag — or a scrollbar appearing —\n * leaves those rects stale, and the drop lands in the wrong place. Same trick\n * `TabDropIndicator` uses.\n */\n const [, forceUpdate] = useState(0);\n\n useEffect(() => {\n const row = ref.current?.closest('[data-element=\"HeadRow\"]');\n\n if (!row || typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(() => forceUpdate((n) => n + 1));\n\n observer.observe(row);\n\n return () => observer.disconnect();\n }, []);\n\n if (isHidden) return null;\n\n return (\n <div\n {...dropIndicatorProps}\n ref={ref}\n data-element=\"ColumnDropIndicator\"\n data-position={dropPosition}\n data-drop-target={isDropTarget ? '' : undefined}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAqBA,MAAM,mBACJ;AAcF,SAAS,WACP,OACA;CACA,MAAM,EAAE,WAAW,OAAO,aAAa;AAEvC,QACE,oBAAC;EAAG,GAAI;EAAW,GAAI;EACpB;GACE;;;;;;;;AAUT,SAAS,oBAAoB,OAA6B;CACxD,MAAM,EAAE,WAAW,WAAW,iBAAiB,WAAW,cAAc;CAExE,MAAM,EAAE,WAAW,eAAe,iBAIhC;EAAE,KAAK;EAAW;EAAW,EAC7B,UACD;AAED,QACE,qBAAC;EACC,GAAI;EACJ,OAAO;GAIL,GAAGA,aAAW,MAAM,WAAW,WAAW,EAGxC,qBAAqB,UAAe;AAClC,QAAK,MAAM,QAAwB,UAAU,iBAAiB,EAAE;AAC9D,WAAM,gBAAgB;AACtB,WAAM,iBAAiB;;MAG5B,CAAC;GACF,kBAAkB;GAClB,iBAAiB,aAAa,KAAK;GACpC;;GAED,oBAAC;IACY;IACX,cAAa;IACF;KACX;GACD,MAAM;GACN,kBACC,oBAAC;IACY;IACX,cAAa;IACF;KACX,GACA;;GACO;;AAIjB,SAAgB,gBAAgB,OAA6B;AAC3D,QAAO,MAAM,aAAa,MAAM,YAC9B,oBAAC,uBAAoB,GAAI,QAAS,GAElC,oBAAC,cAAW,GAAI,QAAS;;;;;;;;;;;;;AAqB7B,SAAS,oBAAoB,EAC3B,WACA,cACA,aAC2B;CAC3B,MAAM,MAAM,OAAuB,KAAK;CACxC,MAAM,EAAE,oBAAoB,UAAU,iBAAiB,iBACrD,EAAE,QAAQ;EAAE,MAAM;EAAQ,KAAK;EAAW;EAAc,EAAE,EAC1D,WACA,IACD;;;;;;;;;CAUD,MAAM,GAAG,eAAe,SAAS,EAAE;AAEnC,iBAAgB;EACd,MAAM,MAAM,IAAI,SAAS,QAAQ,6BAA2B;AAE5D,MAAI,CAAC,OAAO,OAAO,mBAAmB,YAAa;EAEnD,MAAM,WAAW,IAAI,qBAAqB,aAAa,MAAM,IAAI,EAAE,CAAC;AAEpE,WAAS,QAAQ,IAAI;AAErB,eAAa,SAAS,YAAY;IACjC,EAAE,CAAC;AAEN,KAAI,SAAU,QAAO;AAErB,QACE,oBAAC;EACC,GAAI;EACC;EACL,gBAAa;EACb,iBAAe;EACf,oBAAkB,eAAe,KAAK;GACtC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import "./types.js";
|
|
3
|
-
import { ReactNode } from "react";
|
|
4
|
-
|
|
5
|
-
//#region src/components/data/TableBase/column-menu.d.ts
|
|
6
|
-
/**
|
|
7
|
-
* Menu keys the table itself honours.
|
|
8
|
-
*
|
|
9
|
-
* Sorting is the only capability the table owns, so it is the only thing that
|
|
10
|
-
* can be a reserved key. `pin` and `hide` deliberately are not: `column.pin` and
|
|
11
|
-
* `column.isHidden` are read-only declarative inputs with no controlled state
|
|
12
|
-
* behind them, and reserving those keys would fix an API in string literals
|
|
13
|
-
* before the state that backs it exists. They stay ordinary consumer keys and
|
|
14
|
-
* are reported through `onColumnMenuAction` like anything else.
|
|
15
|
-
*/
|
|
16
|
-
declare const COLUMN_MENU_SORT_KEYS: readonly ["sort-asc", "sort-desc", "clear-sort"];
|
|
17
|
-
type CubeColumnMenuSortKey = (typeof COLUMN_MENU_SORT_KEYS)[number];
|
|
18
|
-
/**
|
|
19
|
-
* The reserved sort items, ready to drop into `header.menu`.
|
|
20
|
-
*
|
|
21
|
-
* ```tsx
|
|
22
|
-
* header: { menu: <>{columnSortMenu()}<Menu.Item key="pin">Pin</Menu.Item></> }
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* Exists because `Menu.Item` requires `children` — it comes from react-stately's
|
|
26
|
-
* `ItemProps` — so `<Menu.Item key="sort-asc" />` does not typecheck, and a
|
|
27
|
-
* consumer filling the label in by hand would hardcode one language and lose the
|
|
28
|
-
* translated one the table supplies. Passing `null` satisfies the type and reads
|
|
29
|
-
* as "the table fills this in", which `processColumnMenuItems` then does.
|
|
30
|
-
*
|
|
31
|
-
* Hand-written keys still work — this is a convenience, not the only route.
|
|
32
|
-
*/
|
|
33
|
-
declare function columnSortMenu(keys?: readonly CubeColumnMenuSortKey[]): ReactNode;
|
|
34
|
-
//#endregion
|
|
35
|
-
export { COLUMN_MENU_SORT_KEYS, CubeColumnMenuSortKey, columnSortMenu };
|
|
36
|
-
//# sourceMappingURL=column-menu.d.ts.map
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-34ce1a4 | 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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-34ce1a4 | 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
|
|
@@ -1 +0,0 @@
|
|
|
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,100 +0,0 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.0.0-canary-34ce1a4 | Cube Dev Team */
|
|
2
|
-
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
|
-
import { useMemo, useState } from "react";
|
|
4
|
-
import { useControlledState } from "@react-stately/utils";
|
|
5
|
-
|
|
6
|
-
//#region src/components/data/TableBase/use-column-order.ts
|
|
7
|
-
/**
|
|
8
|
-
* Reorders the source columns to match `order`.
|
|
9
|
-
*
|
|
10
|
-
* Rank-based rather than filter-then-concat, because `order` is routinely
|
|
11
|
-
* *stale*: it was persisted or lifted into page state before the current
|
|
12
|
-
* `columns` array existed. A column missing from it inherits the rank of the
|
|
13
|
-
* nearest preceding known column plus a half step, so it lands immediately after
|
|
14
|
-
* the neighbour it had in the source array instead of being swept to the end. A
|
|
15
|
-
* new leading column keeps its lead.
|
|
16
|
-
*
|
|
17
|
-
* Applied to the SOURCE array, before `useTableColumns` — so hidden-column
|
|
18
|
-
* filtering, structural injection, pinned hoisting and `aria-colindex` all still
|
|
19
|
-
* happen downstream, and `columnOrder` can never fight `pin`.
|
|
20
|
-
*/
|
|
21
|
-
function applyColumnOrder(columns, order) {
|
|
22
|
-
if (!order?.length) return columns;
|
|
23
|
-
const present = new Set(columns.map((column) => column.key));
|
|
24
|
-
const rank = /* @__PURE__ */ new Map();
|
|
25
|
-
order.forEach((key, index) => {
|
|
26
|
-
if (present.has(key) && !rank.has(key)) rank.set(key, index);
|
|
27
|
-
});
|
|
28
|
-
if (!rank.size) return columns;
|
|
29
|
-
let carried = -1;
|
|
30
|
-
return columns.map((column, sourceIndex) => {
|
|
31
|
-
const own = rank.get(column.key);
|
|
32
|
-
if (own != null) carried = own;
|
|
33
|
-
return {
|
|
34
|
-
column,
|
|
35
|
-
sourceIndex,
|
|
36
|
-
rank: own ?? carried + .5
|
|
37
|
-
};
|
|
38
|
-
}).sort((a, b) => a.rank - b.rank || a.sourceIndex - b.sourceIndex).map((entry) => entry.column);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Whether a column can be picked up and moved.
|
|
42
|
-
*
|
|
43
|
-
* The single shared predicate: `DataTable` builds the draggable key list from
|
|
44
|
-
* it and `TableView` decides which `<th>` is a drag source from it, so the two
|
|
45
|
-
* cannot drift. A renderer disagreeing with the state behind it is exactly how
|
|
46
|
-
* the drop indicator that never matched its selector happened.
|
|
47
|
-
*
|
|
48
|
-
* Pinned columns are excluded, for three reasons that all point the same way: a
|
|
49
|
-
* pinned `<th>` is `position: sticky`, so under horizontal scroll its rect sits
|
|
50
|
-
* on top of columns it is nowhere near and React Aria's drop-target binary
|
|
51
|
-
* search goes wrong; `use-table-columns` hoists pinned columns to the edges
|
|
52
|
-
* regardless of source order, so a cross-boundary drop would be undone
|
|
53
|
-
* immediately; and `pin` is already the ordering authority there. What that buys
|
|
54
|
-
* is a draggable set that is one contiguous, non-sticky run — every permutation
|
|
55
|
-
* of which stays monotonic, which is what the delegate needs.
|
|
56
|
-
*/
|
|
57
|
-
function isColumnDraggable(column, isEnabled) {
|
|
58
|
-
return isEnabled && !column.isStructural && column.pin == null && (column.isReorderable ?? true);
|
|
59
|
-
}
|
|
60
|
-
function getDraggableColumnKeys(columns, isEnabled) {
|
|
61
|
-
return columns.filter((column) => isColumnDraggable(column, isEnabled)).map((column) => column.key);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Folds a permutation of the draggable subset back into the full order.
|
|
65
|
-
*
|
|
66
|
-
* Only the slots the draggable keys already occupy are rewritten, so a hidden
|
|
67
|
-
* column, a pinned one, or one that opted out keeps its absolute index and
|
|
68
|
-
* cannot be displaced by a drag it took no part in.
|
|
69
|
-
*
|
|
70
|
-
* The visible consequence, worth knowing: a hidden column between two draggable
|
|
71
|
-
* ones keeps its slot rather than following a neighbour, so it may come back
|
|
72
|
-
* between different columns than it left. Predictable beats clever.
|
|
73
|
-
*/
|
|
74
|
-
function projectReorder(fullOrder, nextDraggable) {
|
|
75
|
-
const draggable = new Set(nextDraggable);
|
|
76
|
-
const next = [...fullOrder];
|
|
77
|
-
let cursor = 0;
|
|
78
|
-
for (let slot = 0; slot < next.length; slot++) if (draggable.has(next[slot])) next[slot] = nextDraggable[cursor++];
|
|
79
|
-
return next;
|
|
80
|
-
}
|
|
81
|
-
const EMPTY_ORDER = [];
|
|
82
|
-
function useColumnOrder({ columns, columnOrder, defaultColumnOrder, onColumnOrderChange, storage }) {
|
|
83
|
-
const [storedOrder] = useState(() => columnOrder === void 0 && storage.has("columnOrder") ? storage.initial.columnOrder : void 0);
|
|
84
|
-
const [order, setOrder] = useControlledState(columnOrder, defaultColumnOrder ?? storedOrder ?? EMPTY_ORDER, onColumnOrderChange);
|
|
85
|
-
const ordered = useMemo(() => applyColumnOrder(columns, order), [columns, order]);
|
|
86
|
-
const fullOrder = useMemo(() => ordered.map((column) => column.key), [ordered]);
|
|
87
|
-
return {
|
|
88
|
-
columns: ordered,
|
|
89
|
-
order: fullOrder,
|
|
90
|
-
reorder: useEvent((nextDraggable) => {
|
|
91
|
-
const next = projectReorder(fullOrder, nextDraggable);
|
|
92
|
-
setOrder(next);
|
|
93
|
-
if (columnOrder === void 0) storage.write({ columnOrder: next });
|
|
94
|
-
})
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
//#endregion
|
|
99
|
-
export { getDraggableColumnKeys, isColumnDraggable, useColumnOrder };
|
|
100
|
-
//# sourceMappingURL=use-column-order.js.map
|