@cube-dev/ui-kit 0.164.0 → 0.166.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 +32 -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 +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.js +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 +28 -28
- 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 +1 -1
- package/dist/components/data/DataTable/DataTable.js +140 -21
- package/dist/components/data/DataTable/DataTable.js.map +1 -1
- package/dist/components/data/DataTable/index.d.ts +1 -1
- package/dist/components/data/DataTable/types.d.ts +19 -4
- package/dist/components/data/ItemTable/ItemTable.js +169 -25
- package/dist/components/data/ItemTable/ItemTable.js.map +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
- package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
- package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
- package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
- package/dist/components/data/ItemTable/types.d.ts +7 -2
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
- package/dist/components/data/TableBase/TableRow.js +30 -5
- package/dist/components/data/TableBase/TableRow.js.map +1 -1
- package/dist/components/data/TableBase/TableView.d.ts +2 -1
- package/dist/components/data/TableBase/TableView.js +299 -75
- package/dist/components/data/TableBase/TableView.js.map +1 -1
- package/dist/components/data/TableBase/column-menu.js +1 -1
- package/dist/components/data/TableBase/column-tint.js +1 -1
- package/dist/components/data/TableBase/index.d.ts +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.js +75 -2
- package/dist/components/data/TableBase/styled.js.map +1 -1
- package/dist/components/data/TableBase/table-tree.js +129 -0
- package/dist/components/data/TableBase/table-tree.js.map +1 -0
- package/dist/components/data/TableBase/types.d.ts +46 -1
- 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 +1 -1
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +4 -4
- package/dist/components/data/TableBase/use-table-search.js.map +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +124 -24
- package/dist/components/data/TableBase/use-table-selection.js.map +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/data/TableBase/use-table-tree-state.js +107 -0
- package/dist/components/data/TableBase/use-table-tree-state.js.map +1 -0
- package/dist/components/data/index.d.ts +2 -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/ColorSwatch/ColorSwatch.js +1 -1
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/CommandTextArea/CommandTextArea.js +8 -25
- package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +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 +10 -29
- package/dist/components/fields/TextArea/TextArea.js.map +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInput/useAutoSizeTextArea.js +146 -0
- package/dist/components/fields/TextInput/useAutoSizeTextArea.js.map +1 -0
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/color/ColorPanel.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.d.ts +30 -7
- package/dist/components/layout/Board/Board.js +16 -6
- package/dist/components/layout/Board/Board.js.map +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.d.ts +9 -0
- package/dist/components/layout/Board/Widget.js +3 -2
- package/dist/components/layout/Board/Widget.js.map +1 -1
- package/dist/components/layout/Board/WidgetHost.js +4 -3
- package/dist/components/layout/Board/WidgetHost.js.map +1 -1
- package/dist/components/layout/Board/board-context.js +1 -1
- package/dist/components/layout/Board/board-store.js +2 -2
- package/dist/components/layout/Board/board-store.js.map +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision-modes.js +7 -4
- package/dist/components/layout/Board/grid-core/collision-modes.js.map +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/placement.d.ts +58 -0
- package/dist/components/layout/Board/grid-core/placement.js +153 -0
- package/dist/components/layout/Board/grid-core/placement.js.map +1 -0
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/grid-core/types.d.ts +6 -4
- package/dist/components/layout/Board/index.d.ts +1 -0
- package/dist/components/layout/Board/index.js +2 -1
- package/dist/components/layout/Board/index.js.map +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 +91 -100
- package/dist/components/layout/Board/use-board-registry.js.map +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/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/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 +2 -1
- package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/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 +17 -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 +2 -1
- package/dist/i18n/locales/en-US/uikit.js +2 -1
- package/dist/i18n/locales/en-US/uikit.json.d.ts +1 -0
- package/dist/i18n/locales/es-ES/uikit.js +2 -1
- package/dist/i18n/locales/es-MX/uikit.js +2 -1
- package/dist/i18n/locales/fr-FR/uikit.js +2 -1
- package/dist/i18n/locales/it-IT/uikit.js +2 -1
- package/dist/i18n/locales/ja-JP/uikit.js +2 -1
- package/dist/i18n/locales/nb-NO/uikit.js +2 -1
- package/dist/i18n/locales/pt-BR/uikit.js +2 -1
- package/dist/i18n/locales/pt-PT/uikit.js +2 -1
- package/dist/i18n/locales/sv-SE/uikit.js +2 -1
- package/dist/i18n/locales/vi-VN/uikit.js +2 -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.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PipetteIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/index.js +1 -1
- package/dist/provider.js +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-seed.js +1 -1
- package/dist/tokens/color-theme.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/palette-config.js +1 -1
- package/dist/tokens/palette.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/disabledProps.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/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 +3 -3
- package/docs/Introduction.md +85 -97
- package/docs/Usage.md +26 -0
- package/docs/components/data/DataTable.md +110 -11
- package/docs/components/data/ItemTable.md +63 -1
- package/docs/components/layout/Board.md +37 -6
- package/docs/components/overlays/Tooltip.md +12 -0
- package/docs/tasty/configuration.md +10 -6
- package/docs/tasty/dsl.md +99 -2
- package/docs/tasty/styles.md +3 -1
- package/package.json +2 -2
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
|
|
2
|
+
import { Layout, LayoutItem } from "./types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/layout/Board/grid-core/placement.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* The first position at or below the preferred cell where `item` fits without
|
|
7
|
+
* overlapping any of `others` (which must themselves be overlap-free), scanning
|
|
8
|
+
* left-to-right then top-to-bottom and never past `maxRows`; if the band below
|
|
9
|
+
* is full, upward toward the top.
|
|
10
|
+
*
|
|
11
|
+
* This is the rule the board itself applies when it has to land a widget that
|
|
12
|
+
* cannot stay where it was dropped, so using it for a programmatic add is what
|
|
13
|
+
* makes the two agree.
|
|
14
|
+
*
|
|
15
|
+
* A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path
|
|
16
|
+
* applies (`clamp(y, 0, maxRows - h)`): the item's bottom edge stays within the
|
|
17
|
+
* row limit even when the landing cell is blocked, so the downward scan cannot
|
|
18
|
+
* push it off the board. If the whole valid band is full the item is clamped to
|
|
19
|
+
* the limit — bounds win over overlap, exactly as `gridBounds` does. With an
|
|
20
|
+
* unbounded `maxRows` there is always a free slot below every existing item, so
|
|
21
|
+
* the downward scan terminates on its own.
|
|
22
|
+
*
|
|
23
|
+
* The returned item is a copy; `item` is not mutated. Its `w` is capped to
|
|
24
|
+
* `cols`, and no other dimension is changed — this never resizes to fit.
|
|
25
|
+
*/
|
|
26
|
+
declare function placeInFreeSlot(others: Layout, item: LayoutItem, cols: number, maxRows?: number): LayoutItem;
|
|
27
|
+
/**
|
|
28
|
+
* Tile every item evenly across both axes of a `cols × rows` grid, keeping the
|
|
29
|
+
* row structure the layout already has: items are grouped into visual rows by
|
|
30
|
+
* their current `y`, `rows` is divided across those groups, and `cols` across
|
|
31
|
+
* each group's members.
|
|
32
|
+
*
|
|
33
|
+
* So three items on one line become three equal full-height columns; move one
|
|
34
|
+
* below and the top line becomes two half-width cells while the lower item
|
|
35
|
+
* spans the full width at half height. Grouping by `y` rather than reflowing
|
|
36
|
+
* from scratch is what makes the result recognisably the user's arrangement
|
|
37
|
+
* instead of an arbitrary repack.
|
|
38
|
+
*
|
|
39
|
+
* A visual row holding more items than the grid is wide is wrapped into
|
|
40
|
+
* sub-rows of at most `cols`, so nothing tiles past the right edge. That can
|
|
41
|
+
* take the result past `rows`; the caller decides whether to grow the grid or
|
|
42
|
+
* let its bounds clip.
|
|
43
|
+
*
|
|
44
|
+
* This is the one operation that deliberately GROWS items — every gesture-driven
|
|
45
|
+
* path refuses to, because growing on a move is a surprise. Here it is the whole
|
|
46
|
+
* point, which is why it is a call the app makes rather than a mode the board is
|
|
47
|
+
* in. Returns new items in the input's order; the input is not mutated.
|
|
48
|
+
*/
|
|
49
|
+
declare function distributeEvenly(layout: Layout, {
|
|
50
|
+
cols,
|
|
51
|
+
rows
|
|
52
|
+
}: {
|
|
53
|
+
cols: number;
|
|
54
|
+
rows: number;
|
|
55
|
+
}): LayoutItem[];
|
|
56
|
+
//#endregion
|
|
57
|
+
export { distributeEvenly, placeInFreeSlot };
|
|
58
|
+
//# sourceMappingURL=placement.d.ts.map
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
|
|
2
|
+
import { collides } from "./collision.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/layout/Board/grid-core/placement.ts
|
|
5
|
+
/**
|
|
6
|
+
* Placing items into a grid without dragging them there.
|
|
7
|
+
*
|
|
8
|
+
* A board's own gestures resolve placement through the compactor and the
|
|
9
|
+
* collision resolver. An app that adds a widget programmatically — a toolbar
|
|
10
|
+
* drop, a widget moved between boards by code, an "arrange these for me"
|
|
11
|
+
* command — has to answer the same question with no gesture in hand, and had no
|
|
12
|
+
* way to ask the engine for the answer. Left to solve it themselves, apps
|
|
13
|
+
* re-implement the scan, and the same drop lands in two different cells
|
|
14
|
+
* depending on whether a pointer or a code path served it.
|
|
15
|
+
*
|
|
16
|
+
* Original UI Kit code (not vendored from react-grid-layout).
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* The first position at or below the preferred cell where `item` fits without
|
|
20
|
+
* overlapping any of `others` (which must themselves be overlap-free), scanning
|
|
21
|
+
* left-to-right then top-to-bottom and never past `maxRows`; if the band below
|
|
22
|
+
* is full, upward toward the top.
|
|
23
|
+
*
|
|
24
|
+
* This is the rule the board itself applies when it has to land a widget that
|
|
25
|
+
* cannot stay where it was dropped, so using it for a programmatic add is what
|
|
26
|
+
* makes the two agree.
|
|
27
|
+
*
|
|
28
|
+
* A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path
|
|
29
|
+
* applies (`clamp(y, 0, maxRows - h)`): the item's bottom edge stays within the
|
|
30
|
+
* row limit even when the landing cell is blocked, so the downward scan cannot
|
|
31
|
+
* push it off the board. If the whole valid band is full the item is clamped to
|
|
32
|
+
* the limit — bounds win over overlap, exactly as `gridBounds` does. With an
|
|
33
|
+
* unbounded `maxRows` there is always a free slot below every existing item, so
|
|
34
|
+
* the downward scan terminates on its own.
|
|
35
|
+
*
|
|
36
|
+
* The returned item is a copy; `item` is not mutated. Its `w` is capped to
|
|
37
|
+
* `cols`, and no other dimension is changed — this never resizes to fit.
|
|
38
|
+
*/
|
|
39
|
+
function placeInFreeSlot(others, item, cols, maxRows = Infinity) {
|
|
40
|
+
const w = Math.min(item.w, cols);
|
|
41
|
+
const maxY = Number.isFinite(maxRows) ? Math.max(0, maxRows - item.h) : Infinity;
|
|
42
|
+
const fits = (x, y) => !others.some((o) => collides(o, {
|
|
43
|
+
...item,
|
|
44
|
+
x,
|
|
45
|
+
y,
|
|
46
|
+
w
|
|
47
|
+
}));
|
|
48
|
+
const preferX = Math.min(Math.max(0, item.x), cols - w);
|
|
49
|
+
const startY = Math.min(Math.max(0, item.y), maxY);
|
|
50
|
+
if (fits(preferX, startY)) return {
|
|
51
|
+
...item,
|
|
52
|
+
x: preferX,
|
|
53
|
+
y: startY,
|
|
54
|
+
w
|
|
55
|
+
};
|
|
56
|
+
const scanBottom = Number.isFinite(maxRows) ? maxY : startY + others.reduce((m, o) => Math.max(m, o.y + o.h), 0) + 1;
|
|
57
|
+
for (let y = startY; y <= scanBottom; y++) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
|
|
58
|
+
...item,
|
|
59
|
+
x,
|
|
60
|
+
y,
|
|
61
|
+
w
|
|
62
|
+
};
|
|
63
|
+
for (let y = startY - 1; y >= 0; y--) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
|
|
64
|
+
...item,
|
|
65
|
+
x,
|
|
66
|
+
y,
|
|
67
|
+
w
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
...item,
|
|
71
|
+
x: preferX,
|
|
72
|
+
y: startY,
|
|
73
|
+
w
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Split `total` cells across `parts` groups as evenly as possible: each group
|
|
78
|
+
* gets at least one, and the first `total % parts` groups get one extra so the
|
|
79
|
+
* pieces sum to `total`. With more groups than cells every group still gets one
|
|
80
|
+
* and the sum overflows, which the grid's own bounds then clip — the best
|
|
81
|
+
* available answer when there is less than a cell to go round.
|
|
82
|
+
*/
|
|
83
|
+
function splitEvenly(total, parts) {
|
|
84
|
+
if (parts <= 0) return [];
|
|
85
|
+
const base = Math.max(1, Math.floor(total / parts));
|
|
86
|
+
const remainder = base * parts >= total ? 0 : total - base * parts;
|
|
87
|
+
return Array.from({ length: parts }, (_, i) => base + (i < remainder ? 1 : 0));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Tile every item evenly across both axes of a `cols × rows` grid, keeping the
|
|
91
|
+
* row structure the layout already has: items are grouped into visual rows by
|
|
92
|
+
* their current `y`, `rows` is divided across those groups, and `cols` across
|
|
93
|
+
* each group's members.
|
|
94
|
+
*
|
|
95
|
+
* So three items on one line become three equal full-height columns; move one
|
|
96
|
+
* below and the top line becomes two half-width cells while the lower item
|
|
97
|
+
* spans the full width at half height. Grouping by `y` rather than reflowing
|
|
98
|
+
* from scratch is what makes the result recognisably the user's arrangement
|
|
99
|
+
* instead of an arbitrary repack.
|
|
100
|
+
*
|
|
101
|
+
* A visual row holding more items than the grid is wide is wrapped into
|
|
102
|
+
* sub-rows of at most `cols`, so nothing tiles past the right edge. That can
|
|
103
|
+
* take the result past `rows`; the caller decides whether to grow the grid or
|
|
104
|
+
* let its bounds clip.
|
|
105
|
+
*
|
|
106
|
+
* This is the one operation that deliberately GROWS items — every gesture-driven
|
|
107
|
+
* path refuses to, because growing on a move is a surprise. Here it is the whole
|
|
108
|
+
* point, which is why it is a call the app makes rather than a mode the board is
|
|
109
|
+
* in. Returns new items in the input's order; the input is not mutated.
|
|
110
|
+
*/
|
|
111
|
+
function distributeEvenly(layout, { cols, rows }) {
|
|
112
|
+
if (layout.length === 0) return [];
|
|
113
|
+
const gridCols = Math.max(1, cols);
|
|
114
|
+
const gridRows = Math.max(1, rows);
|
|
115
|
+
const sorted = [...layout].sort((a, b) => a.y !== b.y ? a.y - b.y : a.x - b.x);
|
|
116
|
+
const groups = [];
|
|
117
|
+
let lastY = null;
|
|
118
|
+
for (const item of sorted) {
|
|
119
|
+
if (lastY === null || item.y !== lastY) {
|
|
120
|
+
groups.push([]);
|
|
121
|
+
lastY = item.y;
|
|
122
|
+
}
|
|
123
|
+
groups[groups.length - 1].push(item);
|
|
124
|
+
}
|
|
125
|
+
const rowGroups = [];
|
|
126
|
+
for (const group of groups) if (group.length <= gridCols) rowGroups.push(group);
|
|
127
|
+
else for (let i = 0; i < group.length; i += gridCols) rowGroups.push(group.slice(i, i + gridCols));
|
|
128
|
+
const rowHeights = splitEvenly(gridRows, rowGroups.length);
|
|
129
|
+
const placed = /* @__PURE__ */ new Map();
|
|
130
|
+
let y = 0;
|
|
131
|
+
rowGroups.forEach((group, gi) => {
|
|
132
|
+
const h = rowHeights[gi];
|
|
133
|
+
const widths = splitEvenly(gridCols, group.length);
|
|
134
|
+
let x = 0;
|
|
135
|
+
group.forEach((item, ci) => {
|
|
136
|
+
const w = widths[ci];
|
|
137
|
+
placed.set(item.i, {
|
|
138
|
+
...item,
|
|
139
|
+
x,
|
|
140
|
+
y,
|
|
141
|
+
w,
|
|
142
|
+
h
|
|
143
|
+
});
|
|
144
|
+
x += w;
|
|
145
|
+
});
|
|
146
|
+
y += h;
|
|
147
|
+
});
|
|
148
|
+
return layout.map((item) => placed.get(item.i) ?? item);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
//#endregion
|
|
152
|
+
export { distributeEvenly, placeInFreeSlot };
|
|
153
|
+
//# sourceMappingURL=placement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placement.js","names":[],"sources":["../../../../../src/components/layout/Board/grid-core/placement.ts"],"sourcesContent":["/**\n * Placing items into a grid without dragging them there.\n *\n * A board's own gestures resolve placement through the compactor and the\n * collision resolver. An app that adds a widget programmatically — a toolbar\n * drop, a widget moved between boards by code, an \"arrange these for me\"\n * command — has to answer the same question with no gesture in hand, and had no\n * way to ask the engine for the answer. Left to solve it themselves, apps\n * re-implement the scan, and the same drop lands in two different cells\n * depending on whether a pointer or a code path served it.\n *\n * Original UI Kit code (not vendored from react-grid-layout).\n */\n\nimport { collides } from './collision';\n\nimport type { Layout, LayoutItem } from './types';\n\n/**\n * The first position at or below the preferred cell where `item` fits without\n * overlapping any of `others` (which must themselves be overlap-free), scanning\n * left-to-right then top-to-bottom and never past `maxRows`; if the band below\n * is full, upward toward the top.\n *\n * This is the rule the board itself applies when it has to land a widget that\n * cannot stay where it was dropped, so using it for a programmatic add is what\n * makes the two agree.\n *\n * A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path\n * applies (`clamp(y, 0, maxRows - h)`): the item's bottom edge stays within the\n * row limit even when the landing cell is blocked, so the downward scan cannot\n * push it off the board. If the whole valid band is full the item is clamped to\n * the limit — bounds win over overlap, exactly as `gridBounds` does. With an\n * unbounded `maxRows` there is always a free slot below every existing item, so\n * the downward scan terminates on its own.\n *\n * The returned item is a copy; `item` is not mutated. Its `w` is capped to\n * `cols`, and no other dimension is changed — this never resizes to fit.\n */\nexport function placeInFreeSlot(\n others: Layout,\n item: LayoutItem,\n cols: number,\n maxRows = Infinity,\n): LayoutItem {\n const w = Math.min(item.w, cols);\n const maxY = Number.isFinite(maxRows)\n ? Math.max(0, maxRows - item.h)\n : Infinity;\n const fits = (x: number, y: number) =>\n !others.some((o) => collides(o, { ...item, x, y, w }));\n const preferX = Math.min(Math.max(0, item.x), cols - w);\n const startY = Math.min(Math.max(0, item.y), maxY);\n if (fits(preferX, startY)) return { ...item, x: preferX, y: startY, w };\n const scanBottom = Number.isFinite(maxRows)\n ? maxY\n : startY + others.reduce((m, o) => Math.max(m, o.y + o.h), 0) + 1;\n for (let y = startY; y <= scanBottom; y++) {\n for (let x = 0; x <= cols - w; x++) {\n if (fits(x, y)) return { ...item, x, y, w };\n }\n }\n // The landing row (clamped to the limit) and everything below it were full;\n // look upward for a free slot still inside the board before giving up.\n for (let y = startY - 1; y >= 0; y--) {\n for (let x = 0; x <= cols - w; x++) {\n if (fits(x, y)) return { ...item, x, y, w };\n }\n }\n return { ...item, x: preferX, y: startY, w };\n}\n\n/**\n * Split `total` cells across `parts` groups as evenly as possible: each group\n * gets at least one, and the first `total % parts` groups get one extra so the\n * pieces sum to `total`. With more groups than cells every group still gets one\n * and the sum overflows, which the grid's own bounds then clip — the best\n * available answer when there is less than a cell to go round.\n */\nfunction splitEvenly(total: number, parts: number): number[] {\n if (parts <= 0) return [];\n const base = Math.max(1, Math.floor(total / parts));\n const remainder = base * parts >= total ? 0 : total - base * parts;\n return Array.from(\n { length: parts },\n (_, i) => base + (i < remainder ? 1 : 0),\n );\n}\n\n/**\n * Tile every item evenly across both axes of a `cols × rows` grid, keeping the\n * row structure the layout already has: items are grouped into visual rows by\n * their current `y`, `rows` is divided across those groups, and `cols` across\n * each group's members.\n *\n * So three items on one line become three equal full-height columns; move one\n * below and the top line becomes two half-width cells while the lower item\n * spans the full width at half height. Grouping by `y` rather than reflowing\n * from scratch is what makes the result recognisably the user's arrangement\n * instead of an arbitrary repack.\n *\n * A visual row holding more items than the grid is wide is wrapped into\n * sub-rows of at most `cols`, so nothing tiles past the right edge. That can\n * take the result past `rows`; the caller decides whether to grow the grid or\n * let its bounds clip.\n *\n * This is the one operation that deliberately GROWS items — every gesture-driven\n * path refuses to, because growing on a move is a surprise. Here it is the whole\n * point, which is why it is a call the app makes rather than a mode the board is\n * in. Returns new items in the input's order; the input is not mutated.\n */\nexport function distributeEvenly(\n layout: Layout,\n { cols, rows }: { cols: number; rows: number },\n): LayoutItem[] {\n if (layout.length === 0) return [];\n\n const gridCols = Math.max(1, cols);\n const gridRows = Math.max(1, rows);\n\n const sorted = [...layout].sort((a, b) =>\n a.y !== b.y ? a.y - b.y : a.x - b.x,\n );\n\n const groups: LayoutItem[][] = [];\n let lastY: number | null = null;\n for (const item of sorted) {\n if (lastY === null || item.y !== lastY) {\n groups.push([]);\n lastY = item.y;\n }\n groups[groups.length - 1].push(item);\n }\n\n const rowGroups: LayoutItem[][] = [];\n for (const group of groups) {\n if (group.length <= gridCols) {\n rowGroups.push(group);\n } else {\n for (let i = 0; i < group.length; i += gridCols) {\n rowGroups.push(group.slice(i, i + gridCols));\n }\n }\n }\n\n const rowHeights = splitEvenly(gridRows, rowGroups.length);\n const placed = new Map<string, LayoutItem>();\n let y = 0;\n rowGroups.forEach((group, gi) => {\n const h = rowHeights[gi];\n const widths = splitEvenly(gridCols, group.length);\n let x = 0;\n group.forEach((item, ci) => {\n const w = widths[ci];\n placed.set(item.i, { ...item, x, y, w, h });\n x += w;\n });\n y += h;\n });\n\n // Emit in the caller's order, not the sort's: a layout is keyed by `i`, and\n // reordering it would churn every consumer that diffs the array positionally.\n return layout.map((item) => placed.get(item.i) ?? item);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAAgB,gBACd,QACA,MACA,MACA,UAAU,UACE;CACZ,MAAM,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK;CAChC,MAAM,OAAO,OAAO,SAAS,QAAQ,GACjC,KAAK,IAAI,GAAG,UAAU,KAAK,EAAE,GAC7B;CACJ,MAAM,QAAQ,GAAW,MACvB,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;EAAE,GAAG;EAAM;EAAG;EAAG;EAAG,CAAC,CAAC;CACxD,MAAM,UAAU,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE;CACvD,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,EAAE,EAAE,KAAK;AAClD,KAAI,KAAK,SAAS,OAAO,CAAE,QAAO;EAAE,GAAG;EAAM,GAAG;EAAS,GAAG;EAAQ;EAAG;CACvE,MAAM,aAAa,OAAO,SAAS,QAAQ,GACvC,OACA,SAAS,OAAO,QAAQ,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG;AAClE,MAAK,IAAI,IAAI,QAAQ,KAAK,YAAY,IACpC,MAAK,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAC7B,KAAI,KAAK,GAAG,EAAE,CAAE,QAAO;EAAE,GAAG;EAAM;EAAG;EAAG;EAAG;AAK/C,MAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,IAC/B,MAAK,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAC7B,KAAI,KAAK,GAAG,EAAE,CAAE,QAAO;EAAE,GAAG;EAAM;EAAG;EAAG;EAAG;AAG/C,QAAO;EAAE,GAAG;EAAM,GAAG;EAAS,GAAG;EAAQ;EAAG;;;;;;;;;AAU9C,SAAS,YAAY,OAAe,OAAyB;AAC3D,KAAI,SAAS,EAAG,QAAO,EAAE;CACzB,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,MAAM,CAAC;CACnD,MAAM,YAAY,OAAO,SAAS,QAAQ,IAAI,QAAQ,OAAO;AAC7D,QAAO,MAAM,KACX,EAAE,QAAQ,OAAO,GAChB,GAAG,MAAM,QAAQ,IAAI,YAAY,IAAI,GACvC;;;;;;;;;;;;;;;;;;;;;;;;AAyBH,SAAgB,iBACd,QACA,EAAE,MAAM,QACM;AACd,KAAI,OAAO,WAAW,EAAG,QAAO,EAAE;CAElC,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK;CAClC,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK;CAElC,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,MAClC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EACnC;CAED,MAAM,SAAyB,EAAE;CACjC,IAAI,QAAuB;AAC3B,MAAK,MAAM,QAAQ,QAAQ;AACzB,MAAI,UAAU,QAAQ,KAAK,MAAM,OAAO;AACtC,UAAO,KAAK,EAAE,CAAC;AACf,WAAQ,KAAK;;AAEf,SAAO,OAAO,SAAS,GAAG,KAAK,KAAK;;CAGtC,MAAM,YAA4B,EAAE;AACpC,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,UAAU,SAClB,WAAU,KAAK,MAAM;KAErB,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,SACrC,WAAU,KAAK,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;CAKlD,MAAM,aAAa,YAAY,UAAU,UAAU,OAAO;CAC1D,MAAM,yBAAS,IAAI,KAAyB;CAC5C,IAAI,IAAI;AACR,WAAU,SAAS,OAAO,OAAO;EAC/B,MAAM,IAAI,WAAW;EACrB,MAAM,SAAS,YAAY,UAAU,MAAM,OAAO;EAClD,IAAI,IAAI;AACR,QAAM,SAAS,MAAM,OAAO;GAC1B,MAAM,IAAI,OAAO;AACjB,UAAO,IAAI,KAAK,GAAG;IAAE,GAAG;IAAM;IAAG;IAAG;IAAG;IAAG,CAAC;AAC3C,QAAK;IACL;AACF,OAAK;GACL;AAIF,QAAO,OAAO,KAAK,SAAS,OAAO,IAAI,KAAK,EAAE,IAAI,KAAK"}
|
|
@@ -93,10 +93,12 @@ type CompactType = 'horizontal' | 'vertical' | 'wrap' | null;
|
|
|
93
93
|
* - `'revert'` - snap the item back to where it was (the engine's own default).
|
|
94
94
|
* - `'downscale'` - shrink the item into the free space at the cell it was
|
|
95
95
|
* dropped on, growing rightward and downward. Never upscales.
|
|
96
|
-
* - `'swap'` - exchange with one widget: the dragged widget
|
|
97
|
-
* widget the drop covers most, and that widget takes the
|
|
98
|
-
* came from, each keeping as much of its own size as fits
|
|
99
|
-
*
|
|
96
|
+
* - `'swap'` - inside one board, exchange with one widget: the dragged widget
|
|
97
|
+
* takes the cell of the widget the drop covers most, and that widget takes the
|
|
98
|
+
* cell the dragged one came from, each keeping as much of its own size as fits
|
|
99
|
+
* there. Across boards, insert only at an empty anchor and downscale without
|
|
100
|
+
* exchanging or reflowing destination widgets; an invalid landing cancels the
|
|
101
|
+
* transfer. Never displaces more than one widget. Else downscale, else revert.
|
|
100
102
|
*
|
|
101
103
|
* Only consulted where a move would otherwise be refused, so it has no effect in
|
|
102
104
|
* the compacting modes (a collision pushes neighbours there) or under
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
import { CollisionMode, Compactor, Layout, LayoutConstraint, LayoutItem, ResizeHandleAxis } from "./grid-core/types.js";
|
|
3
|
+
import { distributeEvenly, placeInFreeSlot } from "./grid-core/placement.js";
|
|
3
4
|
import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
|
|
4
5
|
import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
|
|
5
6
|
import { BoardSelectionMode } from "./use-board-selection.js";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
|
|
2
|
+
import { distributeEvenly, placeInFreeSlot } from "./grid-core/placement.js";
|
|
2
3
|
import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
|
|
3
4
|
import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
|
|
4
5
|
import { BoardProvider } from "./BoardProvider.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["BoardBase"],"sources":["../../../../src/components/layout/Board/index.tsx"],"sourcesContent":["import { Board as BoardBase } from './Board';\nimport { BoardProvider } from './BoardProvider';\nimport { BoardResponsive } from './BoardResponsive';\nimport { Widget } from './Widget';\n\nconst Board = Object.assign(BoardBase, {\n Widget,\n Provider: BoardProvider,\n Responsive: BoardResponsive,\n});\n\nexport { Board };\nexport { BoardProvider };\nexport { BoardResponsive };\nexport { Widget as BoardWidget };\nexport { BOARD_SELECTION_CANCEL } from './Board';\n\nexport type {\n CubeBoardProps,\n BoardCompactType,\n BoardGridLines,\n BoardInteractionInfo,\n} from './Board';\nexport type { BoardSelectionMode } from './use-board-selection';\nexport type { CubeBoardResponsiveProps } from './BoardResponsive';\nexport type { CubeBoardWidgetProps, BoardResizeGripPlacement } from './Widget';\nexport type { CubeBoardProviderProps } from './BoardProvider';\nexport type { WidgetTransferInfo } from './board-context';\nexport type {\n Breakpoints as BoardBreakpoints,\n BreakpointCols as BoardBreakpointCols,\n ResponsiveLayouts as BoardResponsiveLayouts,\n} from './responsive-utils';\n\nexport type {\n Layout,\n LayoutItem,\n ResizeHandleAxis,\n CollisionMode,\n Compactor,\n LayoutConstraint,\n PositionParams,\n} from './grid-core';\n\nexport {\n verticalCompactor,\n horizontalCompactor,\n noCompactor,\n getCompactor,\n gridBounds,\n minMaxSize,\n containerBounds,\n boundedX,\n boundedY,\n aspectRatio,\n snapToGrid,\n minSize,\n maxSize,\n} from './grid-core';\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":["BoardBase"],"sources":["../../../../src/components/layout/Board/index.tsx"],"sourcesContent":["import { Board as BoardBase } from './Board';\nimport { BoardProvider } from './BoardProvider';\nimport { BoardResponsive } from './BoardResponsive';\nimport { Widget } from './Widget';\n\nconst Board = Object.assign(BoardBase, {\n Widget,\n Provider: BoardProvider,\n Responsive: BoardResponsive,\n});\n\nexport { Board };\nexport { BoardProvider };\nexport { BoardResponsive };\nexport { Widget as BoardWidget };\nexport { BOARD_SELECTION_CANCEL } from './Board';\n\nexport type {\n CubeBoardProps,\n BoardCompactType,\n BoardGridLines,\n BoardInteractionInfo,\n} from './Board';\nexport type { BoardSelectionMode } from './use-board-selection';\nexport type { CubeBoardResponsiveProps } from './BoardResponsive';\nexport type { CubeBoardWidgetProps, BoardResizeGripPlacement } from './Widget';\nexport type { CubeBoardProviderProps } from './BoardProvider';\nexport type { WidgetTransferInfo } from './board-context';\nexport type {\n Breakpoints as BoardBreakpoints,\n BreakpointCols as BoardBreakpointCols,\n ResponsiveLayouts as BoardResponsiveLayouts,\n} from './responsive-utils';\n\nexport type {\n Layout,\n LayoutItem,\n ResizeHandleAxis,\n CollisionMode,\n Compactor,\n LayoutConstraint,\n PositionParams,\n} from './grid-core';\n\nexport { placeInFreeSlot, distributeEvenly } from './grid-core';\n\nexport {\n verticalCompactor,\n horizontalCompactor,\n noCompactor,\n getCompactor,\n gridBounds,\n minMaxSize,\n containerBounds,\n boundedX,\n boundedY,\n aspectRatio,\n snapToGrid,\n minSize,\n maxSize,\n} from './grid-core';\n"],"mappings":";;;;;;;;;;AAKA,MAAM,QAAQ,OAAO,OAAOA,SAAW;CACrC;CACA,UAAU;CACV,YAAY;CACb,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { cloneLayout } from "./grid-core/layout.js";
|
|
4
4
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { BoardWidgetStore } from "./board-store.js";
|
|
4
4
|
import { collides } from "./grid-core/collision.js";
|
|
5
5
|
import { createCollisionResolver } from "./grid-core/collision-modes.js";
|
|
6
|
+
import { placeInFreeSlot } from "./grid-core/placement.js";
|
|
6
7
|
import { bottom, cloneLayout, getLayoutItem, moveElement } from "./grid-core/layout.js";
|
|
7
8
|
import { moveElements } from "./grid-core/group-move.js";
|
|
8
9
|
import { calcXYRaw } from "./grid-core/calculate.js";
|
|
@@ -77,58 +78,6 @@ function resizesAnything(before, after) {
|
|
|
77
78
|
return !!b && (b.w !== a.w || b.h !== a.h);
|
|
78
79
|
});
|
|
79
80
|
}
|
|
80
|
-
/**
|
|
81
|
-
* First position at or below the preferred cell where `item` fits without
|
|
82
|
-
* overlapping any of `others` (assumed overlap-free), scanning left-to-right
|
|
83
|
-
* then top-to-bottom, never past `maxRows`. Last-resort placement for a legacy
|
|
84
|
-
* (no-op compaction) cross-board drop that would otherwise stack widgets.
|
|
85
|
-
*
|
|
86
|
-
* A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path
|
|
87
|
-
* applies (`clamp(y, 0, maxRows - h)`): the widget's bottom edge (`y + h`) stays
|
|
88
|
-
* within the row limit even when the landing cell is blocked, so the downward
|
|
89
|
-
* scan can't push it off the board. Rows are searched from the (clamped) landing
|
|
90
|
-
* row down to the limit first, then upward toward the top; if the whole valid
|
|
91
|
-
* band is full the widget is clamped to the limit (bounds win over overlap, as
|
|
92
|
-
* `gridBounds` does). With an unbounded `maxRows` there is always a free slot
|
|
93
|
-
* below every existing item, so the downward scan terminates on its own.
|
|
94
|
-
*/
|
|
95
|
-
function placeInFreeSlot(others, item, cols, maxRows = Infinity) {
|
|
96
|
-
const w = Math.min(item.w, cols);
|
|
97
|
-
const maxY = Number.isFinite(maxRows) ? Math.max(0, maxRows - item.h) : Infinity;
|
|
98
|
-
const fits = (x, y) => !others.some((o) => collides(o, {
|
|
99
|
-
...item,
|
|
100
|
-
x,
|
|
101
|
-
y,
|
|
102
|
-
w
|
|
103
|
-
}));
|
|
104
|
-
const preferX = Math.min(Math.max(0, item.x), cols - w);
|
|
105
|
-
const startY = Math.min(Math.max(0, item.y), maxY);
|
|
106
|
-
if (fits(preferX, startY)) return {
|
|
107
|
-
...item,
|
|
108
|
-
x: preferX,
|
|
109
|
-
y: startY,
|
|
110
|
-
w
|
|
111
|
-
};
|
|
112
|
-
const scanBottom = Number.isFinite(maxRows) ? maxY : startY + others.reduce((m, o) => Math.max(m, o.y + o.h), 0) + 1;
|
|
113
|
-
for (let y = startY; y <= scanBottom; y++) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
|
|
114
|
-
...item,
|
|
115
|
-
x,
|
|
116
|
-
y,
|
|
117
|
-
w
|
|
118
|
-
};
|
|
119
|
-
for (let y = startY - 1; y >= 0; y--) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
|
|
120
|
-
...item,
|
|
121
|
-
x,
|
|
122
|
-
y,
|
|
123
|
-
w
|
|
124
|
-
};
|
|
125
|
-
return {
|
|
126
|
-
...item,
|
|
127
|
-
x: preferX,
|
|
128
|
-
y: startY,
|
|
129
|
-
w
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
81
|
function useBoardRegistry(options) {
|
|
133
82
|
const store = useMemo(() => new BoardWidgetStore(), []);
|
|
134
83
|
const onTransferRef = useRef(options?.onWidgetTransfer);
|
|
@@ -140,6 +89,7 @@ function useBoardRegistry(options) {
|
|
|
140
89
|
const sourceSnapshotRef = useRef([]);
|
|
141
90
|
const targetSnapshotsRef = useRef(/* @__PURE__ */ new Map());
|
|
142
91
|
const previewRef = useRef(null);
|
|
92
|
+
const targetLandingRef = useRef(null);
|
|
143
93
|
const frozenRectsRef = useRef(/* @__PURE__ */ new Map());
|
|
144
94
|
const nestedInDraggedRef = useRef(/* @__PURE__ */ new Set());
|
|
145
95
|
const lastLandingRef = useRef(null);
|
|
@@ -254,6 +204,7 @@ function useBoardRegistry(options) {
|
|
|
254
204
|
affectedRef.current = new Set([boardId]);
|
|
255
205
|
sourceSnapshotRef.current = cloneLayout(entry.getLayout());
|
|
256
206
|
previewRef.current = null;
|
|
207
|
+
targetLandingRef.current = null;
|
|
257
208
|
lastLandingRef.current = {
|
|
258
209
|
x: item.x,
|
|
259
210
|
y: item.y
|
|
@@ -485,6 +436,7 @@ function useBoardRegistry(options) {
|
|
|
485
436
|
const previewOnTarget = useCallback((target, item, x, y) => {
|
|
486
437
|
const pp = target.getPositionParams();
|
|
487
438
|
const compactor = target.getCompactor();
|
|
439
|
+
const strictIncomingSwap = compactor.preventCollision === true && !compactor.allowOverlap && target.getCollisionMode() === "swap";
|
|
488
440
|
const carried = previewRef.current?.boardId === target.id ? previewRef.current.working : null;
|
|
489
441
|
const base = cloneLayout(carried ?? targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== item.i);
|
|
490
442
|
const prevItem = carried ? getLayoutItem(carried, item.i) : void 0;
|
|
@@ -510,19 +462,47 @@ function useBoardRegistry(options) {
|
|
|
510
462
|
},
|
|
511
463
|
allowExchange: false
|
|
512
464
|
}) : void 0 });
|
|
513
|
-
const compacted = [...compactor.compact(moved, pp.cols)];
|
|
514
|
-
|
|
465
|
+
const compacted = strictIncomingSwap ? cloneLayout(moved) : [...compactor.compact(moved, pp.cols)];
|
|
466
|
+
const landed = getLayoutItem(compacted, item.i);
|
|
467
|
+
if (!compactor.allowOverlap && hasNewOverlap(overlappingPairs(base), compacted)) {
|
|
468
|
+
if (strictIncomingSwap) {
|
|
469
|
+
const snapshot = targetSnapshotsRef.current.get(target.id);
|
|
470
|
+
if (snapshot) target.applyLayout(cloneLayout(snapshot), false);
|
|
471
|
+
target.setPlaceholders([]);
|
|
472
|
+
previewRef.current = null;
|
|
473
|
+
targetLandingRef.current = {
|
|
474
|
+
boardId: target.id,
|
|
475
|
+
valid: false
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
if (strictIncomingSwap && (!landed || landed.x !== x || landed.y !== y)) {
|
|
481
|
+
const snapshot = targetSnapshotsRef.current.get(target.id);
|
|
482
|
+
if (snapshot) target.applyLayout(cloneLayout(snapshot), false);
|
|
483
|
+
target.setPlaceholders([]);
|
|
484
|
+
previewRef.current = null;
|
|
485
|
+
targetLandingRef.current = {
|
|
486
|
+
boardId: target.id,
|
|
487
|
+
valid: false
|
|
488
|
+
};
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
515
491
|
previewRef.current = {
|
|
516
492
|
boardId: target.id,
|
|
517
493
|
working: compacted
|
|
518
494
|
};
|
|
519
|
-
|
|
495
|
+
targetLandingRef.current = {
|
|
496
|
+
boardId: target.id,
|
|
497
|
+
valid: true
|
|
498
|
+
};
|
|
499
|
+
const previewItem = landed ?? {
|
|
520
500
|
...item,
|
|
521
501
|
x,
|
|
522
502
|
y
|
|
523
503
|
};
|
|
524
504
|
target.applyLayout(compacted.filter((l) => l.i !== item.i), false);
|
|
525
|
-
target.setPlaceholders([{ ...
|
|
505
|
+
target.setPlaceholders([{ ...previewItem }]);
|
|
526
506
|
}, []);
|
|
527
507
|
const onDragMove = useEvent((deltaX, deltaY, pointerType) => {
|
|
528
508
|
const ds = dragStateRef.current;
|
|
@@ -567,6 +547,7 @@ function useBoardRegistry(options) {
|
|
|
567
547
|
if (snap) prev?.applyLayout(cloneLayout(snap), false);
|
|
568
548
|
prev?.setPlaceholders([]);
|
|
569
549
|
previewRef.current = null;
|
|
550
|
+
targetLandingRef.current = null;
|
|
570
551
|
}
|
|
571
552
|
if (isGroup) moveGroupWithinBoard(target, ds, x - ds.item.x, y - ds.item.y);
|
|
572
553
|
else moveWithinBoard(target, ds.item, x, y);
|
|
@@ -586,6 +567,7 @@ function useBoardRegistry(options) {
|
|
|
586
567
|
}
|
|
587
568
|
prev?.setPlaceholders([]);
|
|
588
569
|
previewRef.current = null;
|
|
570
|
+
targetLandingRef.current = null;
|
|
589
571
|
if (!targetSnapshotsRef.current.has(target.id)) targetSnapshotsRef.current.set(target.id, cloneLayout(target.getLayout()));
|
|
590
572
|
}
|
|
591
573
|
previewOnTarget(target, ds.item, x, y);
|
|
@@ -614,55 +596,63 @@ function useBoardRegistry(options) {
|
|
|
614
596
|
x: ds.item.x,
|
|
615
597
|
y: ds.item.y
|
|
616
598
|
};
|
|
617
|
-
if (source) {
|
|
618
|
-
const sp = source.getPositionParams();
|
|
619
|
-
const sc = source.getCompactor();
|
|
620
|
-
const remaining = source.getLayout().filter((l) => l.i !== ds.itemId);
|
|
621
|
-
source.applyLayout([...sc.compact(remaining, sp.cols)], true);
|
|
622
|
-
}
|
|
623
599
|
const tp = target.getPositionParams();
|
|
624
600
|
const tc = target.getCompactor();
|
|
601
|
+
const strictIncomingSwap = tc.preventCollision === true && !tc.allowOverlap && target.getCollisionMode() === "swap";
|
|
625
602
|
const carried = previewRef.current?.boardId === target.id && getLayoutItem(previewRef.current.working, ds.itemId) ? previewRef.current.working : null;
|
|
626
|
-
|
|
627
|
-
if (
|
|
628
|
-
|
|
629
|
-
const
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
603
|
+
const hasValidStrictLanding = targetLandingRef.current?.boardId === target.id && targetLandingRef.current.valid && carried != null;
|
|
604
|
+
if (strictIncomingSwap && !hasValidStrictLanding) {
|
|
605
|
+
if (source) source.applyLayout(cloneLayout(sourceSnapshotRef.current), false);
|
|
606
|
+
const targetSnapshot = targetSnapshotsRef.current.get(target.id);
|
|
607
|
+
if (targetSnapshot) target.applyLayout(cloneLayout(targetSnapshot), false);
|
|
608
|
+
} else {
|
|
609
|
+
if (source) {
|
|
610
|
+
const sp = source.getPositionParams();
|
|
611
|
+
const sc = source.getCompactor();
|
|
612
|
+
const remaining = source.getLayout().filter((l) => l.i !== ds.itemId);
|
|
613
|
+
source.applyLayout([...sc.compact(remaining, sp.cols)], true);
|
|
614
|
+
}
|
|
615
|
+
let finalLayout;
|
|
616
|
+
if (carried) finalLayout = strictIncomingSwap ? cloneLayout(carried) : [...tc.compact(cloneLayout(carried), tp.cols)];
|
|
617
|
+
else {
|
|
618
|
+
const newItem = tc.type === "horizontal" ? {
|
|
619
|
+
...ds.item,
|
|
620
|
+
x: Math.max(0, landing.x) - 1,
|
|
621
|
+
y: landing.y
|
|
622
|
+
} : {
|
|
623
|
+
...ds.item,
|
|
624
|
+
x: landing.x,
|
|
625
|
+
y: Math.max(0, landing.y) - 1
|
|
626
|
+
};
|
|
627
|
+
const moved = moveElement([...cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId)), newItem], newItem, landing.x, landing.y, true, tc.preventCollision, tc.type, tp.cols, tc.allowOverlap, { resolveCollision: createCollisionResolver(target.getCollisionMode(), {
|
|
628
|
+
cols: tp.cols,
|
|
629
|
+
maxRows: tp.maxRows,
|
|
630
|
+
desired: {
|
|
631
|
+
w: ds.item.w,
|
|
632
|
+
h: ds.item.h
|
|
633
|
+
},
|
|
634
|
+
allowExchange: false
|
|
635
|
+
}) });
|
|
636
|
+
finalLayout = [...tc.compact(moved, tp.cols)];
|
|
637
|
+
}
|
|
638
|
+
const targetOthers = cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId));
|
|
639
|
+
if (!tc.allowOverlap && hasNewOverlap(overlappingPairs(targetOthers), finalLayout)) finalLayout = [...targetOthers, placeInFreeSlot(targetOthers, {
|
|
661
640
|
...ds.item,
|
|
662
641
|
x: landing.x,
|
|
663
642
|
y: landing.y
|
|
664
|
-
}
|
|
665
|
-
|
|
643
|
+
}, tp.cols, tp.maxRows)];
|
|
644
|
+
target.applyLayout(finalLayout, true);
|
|
645
|
+
onTransferRef.current?.({
|
|
646
|
+
widgetId: ds.itemId,
|
|
647
|
+
fromBoardId: ds.sourceBoardId,
|
|
648
|
+
toBoardId: target.id,
|
|
649
|
+
item: getLayoutItem(finalLayout, ds.itemId) ?? {
|
|
650
|
+
...ds.item,
|
|
651
|
+
x: landing.x,
|
|
652
|
+
y: landing.y
|
|
653
|
+
}
|
|
654
|
+
});
|
|
655
|
+
}
|
|
666
656
|
}
|
|
667
657
|
const ids = new Set(affectedRef.current);
|
|
668
658
|
ids.add(ds.sourceBoardId);
|
|
@@ -674,6 +664,7 @@ function useBoardRegistry(options) {
|
|
|
674
664
|
frozenRectsRef.current.clear();
|
|
675
665
|
nestedInDraggedRef.current = /* @__PURE__ */ new Set();
|
|
676
666
|
previewRef.current = null;
|
|
667
|
+
targetLandingRef.current = null;
|
|
677
668
|
lastLandingRef.current = null;
|
|
678
669
|
setDragState(null);
|
|
679
670
|
});
|