@cube-dev/ui-kit 0.143.1 → 0.144.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/README.md +1 -1
- package/dist/CHANGELOG.md +6 -0
- package/dist/README.md +1 -1
- 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/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.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/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/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/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/intl.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.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/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/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/FieldWrapper/extract-field-wrapper-props.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/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 +110 -0
- package/dist/components/layout/Board/Board.js +455 -0
- package/dist/components/layout/Board/Board.js.map +1 -0
- package/dist/components/layout/Board/BoardProvider.d.ts +28 -0
- package/dist/components/layout/Board/BoardProvider.js +47 -0
- package/dist/components/layout/Board/BoardProvider.js.map +1 -0
- package/dist/components/layout/Board/BoardResponsive.d.ts +52 -0
- package/dist/components/layout/Board/BoardResponsive.js +101 -0
- package/dist/components/layout/Board/BoardResponsive.js.map +1 -0
- package/dist/components/layout/Board/Widget.d.ts +49 -0
- package/dist/components/layout/Board/Widget.js +42 -0
- package/dist/components/layout/Board/Widget.js.map +1 -0
- package/dist/components/layout/Board/WidgetHost.js +423 -0
- package/dist/components/layout/Board/WidgetHost.js.map +1 -0
- package/dist/components/layout/Board/board-context.d.ts +16 -0
- package/dist/components/layout/Board/board-context.js +32 -0
- package/dist/components/layout/Board/board-context.js.map +1 -0
- package/dist/components/layout/Board/board-store.d.ts +3 -0
- package/dist/components/layout/Board/board-store.js +49 -0
- package/dist/components/layout/Board/board-store.js.map +1 -0
- package/dist/components/layout/Board/grid-core/calculate.js +90 -0
- package/dist/components/layout/Board/grid-core/calculate.js.map +1 -0
- package/dist/components/layout/Board/grid-core/collision.js +35 -0
- package/dist/components/layout/Board/grid-core/collision.js.map +1 -0
- package/dist/components/layout/Board/grid-core/compactors.d.ts +23 -0
- package/dist/components/layout/Board/grid-core/compactors.js +166 -0
- package/dist/components/layout/Board/grid-core/compactors.js.map +1 -0
- package/dist/components/layout/Board/grid-core/constraints.d.ts +35 -0
- package/dist/components/layout/Board/grid-core/constraints.js +155 -0
- package/dist/components/layout/Board/grid-core/constraints.js.map +1 -0
- package/dist/components/layout/Board/grid-core/layout.js +176 -0
- package/dist/components/layout/Board/grid-core/layout.js.map +1 -0
- package/dist/components/layout/Board/grid-core/sort.js +37 -0
- package/dist/components/layout/Board/grid-core/sort.js.map +1 -0
- package/dist/components/layout/Board/grid-core/types.d.ts +168 -0
- package/dist/components/layout/Board/index.d.ts +21 -0
- package/dist/components/layout/Board/index.js +18 -0
- package/dist/components/layout/Board/index.js.map +1 -0
- package/dist/components/layout/Board/responsive-utils.d.ts +13 -0
- package/dist/components/layout/Board/responsive-utils.js +55 -0
- package/dist/components/layout/Board/responsive-utils.js.map +1 -0
- package/dist/components/layout/Board/use-board-layout.js +52 -0
- package/dist/components/layout/Board/use-board-layout.js.map +1 -0
- package/dist/components/layout/Board/use-board-registry.js +372 -0
- package/dist/components/layout/Board/use-board-registry.js.map +1 -0
- 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/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +36 -4
- package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +6 -3
- package/dist/components/navigation/Tabs/Tabs.js.map +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 +3 -2
- package/dist/components/navigation/Tabs/styled.js.map +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/FileTabs/FileTabs.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/RangeCalendar.js +1 -1
- package/dist/components/other/CloudLogo/CloudLogo.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/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/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 +12 -2
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.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/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/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/layout/Board.md +224 -0
- package/docs/components/navigation/Tabs.md +18 -2
- package/package.json +3 -3
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.144.0 | Cube Dev Team */
|
|
2
|
+
import { getAllCollisions, getFirstCollision } from "./collision.js";
|
|
3
|
+
import { sortLayoutItems } from "./sort.js";
|
|
4
|
+
|
|
5
|
+
//#region src/components/layout/Board/grid-core/layout.ts
|
|
6
|
+
/**
|
|
7
|
+
* Core layout manipulation utilities.
|
|
8
|
+
*
|
|
9
|
+
* Vendored from react-grid-layout v2 (`src/core/layout.ts`).
|
|
10
|
+
* See ./NOTICE.md for attribution and license.
|
|
11
|
+
*
|
|
12
|
+
* These functions create, modify, and query grid layouts. Most functions treat
|
|
13
|
+
* layouts as immutable and return new arrays/objects, but a few mutate items in
|
|
14
|
+
* place for performance (documented per function).
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Get the bottom-most Y coordinate of the layout (max of y + h).
|
|
18
|
+
*/
|
|
19
|
+
function bottom(layout) {
|
|
20
|
+
let max = 0;
|
|
21
|
+
for (let i = 0; i < layout.length; i++) {
|
|
22
|
+
const item = layout[i];
|
|
23
|
+
if (item !== void 0) {
|
|
24
|
+
const bottomY = item.y + item.h;
|
|
25
|
+
if (bottomY > max) max = bottomY;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return max;
|
|
29
|
+
}
|
|
30
|
+
/** Get a layout item by its ID. */
|
|
31
|
+
function getLayoutItem(layout, id) {
|
|
32
|
+
for (let i = 0; i < layout.length; i++) {
|
|
33
|
+
const item = layout[i];
|
|
34
|
+
if (item !== void 0 && item.i === id) return item;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Get all static items from the layout. */
|
|
38
|
+
function getStatics(layout) {
|
|
39
|
+
return layout.filter((l) => l.static === true);
|
|
40
|
+
}
|
|
41
|
+
/** Clone a layout item (shallow copy, boolean flags normalized). */
|
|
42
|
+
function cloneLayoutItem(layoutItem) {
|
|
43
|
+
return {
|
|
44
|
+
i: layoutItem.i,
|
|
45
|
+
x: layoutItem.x,
|
|
46
|
+
y: layoutItem.y,
|
|
47
|
+
w: layoutItem.w,
|
|
48
|
+
h: layoutItem.h,
|
|
49
|
+
minW: layoutItem.minW,
|
|
50
|
+
maxW: layoutItem.maxW,
|
|
51
|
+
minH: layoutItem.minH,
|
|
52
|
+
maxH: layoutItem.maxH,
|
|
53
|
+
moved: Boolean(layoutItem.moved),
|
|
54
|
+
static: Boolean(layoutItem.static),
|
|
55
|
+
isDraggable: layoutItem.isDraggable,
|
|
56
|
+
isResizable: layoutItem.isResizable,
|
|
57
|
+
resizeHandles: layoutItem.resizeHandles,
|
|
58
|
+
constraints: layoutItem.constraints,
|
|
59
|
+
isBounded: layoutItem.isBounded
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Clone an entire layout. */
|
|
63
|
+
function cloneLayout(layout) {
|
|
64
|
+
const newLayout = new Array(layout.length);
|
|
65
|
+
for (let i = 0; i < layout.length; i++) {
|
|
66
|
+
const item = layout[i];
|
|
67
|
+
if (item !== void 0) newLayout[i] = cloneLayoutItem(item);
|
|
68
|
+
}
|
|
69
|
+
return newLayout;
|
|
70
|
+
}
|
|
71
|
+
/** Replace a layout item in a layout (matched by `i`). Other items untouched. */
|
|
72
|
+
function modifyLayout(layout, layoutItem) {
|
|
73
|
+
const newLayout = new Array(layout.length);
|
|
74
|
+
for (let i = 0; i < layout.length; i++) {
|
|
75
|
+
const item = layout[i];
|
|
76
|
+
if (item !== void 0) if (layoutItem.i === item.i) newLayout[i] = layoutItem;
|
|
77
|
+
else newLayout[i] = item;
|
|
78
|
+
}
|
|
79
|
+
return newLayout;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Ensure all layout items fit within the grid bounds.
|
|
83
|
+
*
|
|
84
|
+
* **IMPORTANT**: mutates the layout items in place for performance. Clone the
|
|
85
|
+
* layout first (e.g. with `cloneLayout()`) if you need immutability.
|
|
86
|
+
*/
|
|
87
|
+
function correctBounds(layout, bounds) {
|
|
88
|
+
const collidesWith = getStatics(layout);
|
|
89
|
+
for (let i = 0; i < layout.length; i++) {
|
|
90
|
+
const l = layout[i];
|
|
91
|
+
if (l === void 0) continue;
|
|
92
|
+
if (l.x + l.w > bounds.cols) l.x = bounds.cols - l.w;
|
|
93
|
+
if (l.x < 0) {
|
|
94
|
+
l.x = 0;
|
|
95
|
+
l.w = bounds.cols;
|
|
96
|
+
}
|
|
97
|
+
if (!l.static) collidesWith.push(l);
|
|
98
|
+
else while (getFirstCollision(collidesWith, l)) l.y++;
|
|
99
|
+
}
|
|
100
|
+
return layout;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Move a layout element to a new position.
|
|
104
|
+
*
|
|
105
|
+
* Handles collision detection and cascading movements. Does not compact the
|
|
106
|
+
* layout - call the compactor separately.
|
|
107
|
+
*
|
|
108
|
+
* **Note**: mutates the `l` parameter directly for performance.
|
|
109
|
+
*/
|
|
110
|
+
function moveElement(layout, l, x, y, isUserAction, preventCollision, compactType, cols, allowOverlap) {
|
|
111
|
+
if (l.static && l.isDraggable !== true) return [...layout];
|
|
112
|
+
if (l.y === y && l.x === x) return [...layout];
|
|
113
|
+
const oldX = l.x;
|
|
114
|
+
const oldY = l.y;
|
|
115
|
+
if (typeof x === "number") l.x = x;
|
|
116
|
+
if (typeof y === "number") l.y = y;
|
|
117
|
+
l.moved = true;
|
|
118
|
+
let sorted = sortLayoutItems(layout, compactType);
|
|
119
|
+
if (compactType === "vertical" && typeof y === "number" ? oldY >= y : compactType === "horizontal" && typeof x === "number" ? oldX >= x : false) sorted = sorted.reverse();
|
|
120
|
+
const collisions = getAllCollisions(sorted, l);
|
|
121
|
+
const hasCollisions = collisions.length > 0;
|
|
122
|
+
if (hasCollisions && allowOverlap) return cloneLayout(layout);
|
|
123
|
+
if (hasCollisions && preventCollision) {
|
|
124
|
+
l.x = oldX;
|
|
125
|
+
l.y = oldY;
|
|
126
|
+
l.moved = false;
|
|
127
|
+
return layout;
|
|
128
|
+
}
|
|
129
|
+
let resultLayout = [...layout];
|
|
130
|
+
for (let i = 0; i < collisions.length; i++) {
|
|
131
|
+
const collision = collisions[i];
|
|
132
|
+
if (collision === void 0) continue;
|
|
133
|
+
if (collision.moved) continue;
|
|
134
|
+
if (collision.static) resultLayout = moveElementAwayFromCollision(resultLayout, collision, l, isUserAction, compactType, cols);
|
|
135
|
+
else resultLayout = moveElementAwayFromCollision(resultLayout, l, collision, isUserAction, compactType, cols);
|
|
136
|
+
}
|
|
137
|
+
return resultLayout;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Move an item away from a collision. Attempts to move up/left first if there's
|
|
141
|
+
* room, otherwise moves it down/right.
|
|
142
|
+
*/
|
|
143
|
+
function moveElementAwayFromCollision(layout, collidesWith, itemToMove, isUserAction, compactType, cols) {
|
|
144
|
+
const compactH = compactType === "horizontal";
|
|
145
|
+
const compactV = compactType === "vertical";
|
|
146
|
+
const preventCollision = collidesWith.static;
|
|
147
|
+
if (isUserAction) {
|
|
148
|
+
isUserAction = false;
|
|
149
|
+
const fakeItem = {
|
|
150
|
+
x: compactH ? Math.max(collidesWith.x - itemToMove.w, 0) : itemToMove.x,
|
|
151
|
+
y: compactV ? Math.max(collidesWith.y - itemToMove.h, 0) : itemToMove.y,
|
|
152
|
+
w: itemToMove.w,
|
|
153
|
+
h: itemToMove.h,
|
|
154
|
+
i: "-1"
|
|
155
|
+
};
|
|
156
|
+
const firstCollision = getFirstCollision(layout, fakeItem);
|
|
157
|
+
const collisionNorth = firstCollision !== void 0 && firstCollision.y + firstCollision.h > collidesWith.y;
|
|
158
|
+
const collisionWest = firstCollision !== void 0 && collidesWith.x + collidesWith.w > firstCollision.x;
|
|
159
|
+
if (!firstCollision) return moveElement(layout, itemToMove, compactH ? fakeItem.x : void 0, compactV ? fakeItem.y : void 0, isUserAction, preventCollision, compactType, cols);
|
|
160
|
+
if (collisionNorth && compactV) return moveElement(layout, itemToMove, void 0, itemToMove.y + 1, isUserAction, preventCollision, compactType, cols);
|
|
161
|
+
if (collisionNorth && compactType === null) {
|
|
162
|
+
collidesWith.y = itemToMove.y;
|
|
163
|
+
itemToMove.y = itemToMove.y + itemToMove.h;
|
|
164
|
+
return [...layout];
|
|
165
|
+
}
|
|
166
|
+
if (collisionWest && compactH) return moveElement(layout, collidesWith, itemToMove.x, void 0, isUserAction, preventCollision, compactType, cols);
|
|
167
|
+
}
|
|
168
|
+
const newX = compactH ? itemToMove.x + 1 : void 0;
|
|
169
|
+
const newY = compactV ? itemToMove.y + 1 : void 0;
|
|
170
|
+
if (newX === void 0 && newY === void 0) return [...layout];
|
|
171
|
+
return moveElement(layout, itemToMove, newX, newY, isUserAction, preventCollision, compactType, cols);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
//#endregion
|
|
175
|
+
export { bottom, cloneLayout, cloneLayoutItem, correctBounds, getLayoutItem, getStatics, modifyLayout, moveElement };
|
|
176
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","names":[],"sources":["../../../../../src/components/layout/Board/grid-core/layout.ts"],"sourcesContent":["/**\n * Core layout manipulation utilities.\n *\n * Vendored from react-grid-layout v2 (`src/core/layout.ts`).\n * See ./NOTICE.md for attribution and license.\n *\n * These functions create, modify, and query grid layouts. Most functions treat\n * layouts as immutable and return new arrays/objects, but a few mutate items in\n * place for performance (documented per function).\n */\n\nimport { getAllCollisions, getFirstCollision } from './collision';\nimport { sortLayoutItems } from './sort';\n\nimport type { CompactType, Layout, LayoutItem, Mutable } from './types';\n\n// ============================================================================\n// Layout Queries\n// ============================================================================\n\n/**\n * Get the bottom-most Y coordinate of the layout (max of y + h).\n */\nexport function bottom(layout: Layout): number {\n let max = 0;\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined) {\n const bottomY = item.y + item.h;\n if (bottomY > max) max = bottomY;\n }\n }\n return max;\n}\n\n/** Get a layout item by its ID. */\nexport function getLayoutItem(\n layout: Layout,\n id: string,\n): LayoutItem | undefined {\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined && item.i === id) {\n return item;\n }\n }\n return undefined;\n}\n\n/** Get all static items from the layout. */\nexport function getStatics(layout: Layout): LayoutItem[] {\n return layout.filter((l): l is LayoutItem => l.static === true);\n}\n\n// ============================================================================\n// Layout Cloning\n// ============================================================================\n\n/** Clone a layout item (shallow copy, boolean flags normalized). */\nexport function cloneLayoutItem(layoutItem: LayoutItem): LayoutItem {\n return {\n i: layoutItem.i,\n x: layoutItem.x,\n y: layoutItem.y,\n w: layoutItem.w,\n h: layoutItem.h,\n minW: layoutItem.minW,\n maxW: layoutItem.maxW,\n minH: layoutItem.minH,\n maxH: layoutItem.maxH,\n moved: Boolean(layoutItem.moved),\n static: Boolean(layoutItem.static),\n isDraggable: layoutItem.isDraggable,\n isResizable: layoutItem.isResizable,\n resizeHandles: layoutItem.resizeHandles,\n constraints: layoutItem.constraints,\n isBounded: layoutItem.isBounded,\n };\n}\n\n/** Clone an entire layout. */\nexport function cloneLayout(layout: Layout): LayoutItem[] {\n const newLayout: LayoutItem[] = new Array(layout.length);\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined) {\n newLayout[i] = cloneLayoutItem(item);\n }\n }\n return newLayout;\n}\n\n// ============================================================================\n// Layout Modification\n// ============================================================================\n\n/** Replace a layout item in a layout (matched by `i`). Other items untouched. */\nexport function modifyLayout(\n layout: Layout,\n layoutItem: LayoutItem,\n): LayoutItem[] {\n const newLayout: LayoutItem[] = new Array(layout.length);\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined) {\n if (layoutItem.i === item.i) {\n newLayout[i] = layoutItem;\n } else {\n newLayout[i] = item;\n }\n }\n }\n return newLayout;\n}\n\n/**\n * Apply a transformation to a layout item. Finds the item by key, clones it,\n * applies the callback, and returns [new layout, modified item | null].\n */\nexport function withLayoutItem(\n layout: Layout,\n itemKey: string,\n cb: (item: LayoutItem) => LayoutItem,\n): [LayoutItem[], LayoutItem | null] {\n let item = getLayoutItem(layout, itemKey);\n if (!item) {\n return [[...layout], null];\n }\n\n item = cb(cloneLayoutItem(item));\n const newLayout = modifyLayout(layout, item);\n\n return [newLayout, item];\n}\n\n// ============================================================================\n// Bounds Correction\n// ============================================================================\n\n/**\n * Ensure all layout items fit within the grid bounds.\n *\n * **IMPORTANT**: mutates the layout items in place for performance. Clone the\n * layout first (e.g. with `cloneLayout()`) if you need immutability.\n */\nexport function correctBounds(\n layout: Mutable<LayoutItem>[],\n bounds: { cols: number },\n): LayoutItem[] {\n const collidesWith = getStatics(layout);\n\n for (let i = 0; i < layout.length; i++) {\n const l = layout[i];\n if (l === undefined) continue;\n\n // Overflows right\n if (l.x + l.w > bounds.cols) {\n l.x = bounds.cols - l.w;\n }\n\n // Overflows left\n if (l.x < 0) {\n l.x = 0;\n l.w = bounds.cols;\n }\n\n if (!l.static) {\n collidesWith.push(l);\n } else {\n // Static items that collide with other statics must be moved down\n while (getFirstCollision(collidesWith, l)) {\n l.y++;\n }\n }\n }\n\n return layout;\n}\n\n// ============================================================================\n// Move Operations\n// ============================================================================\n\n/**\n * Move a layout element to a new position.\n *\n * Handles collision detection and cascading movements. Does not compact the\n * layout - call the compactor separately.\n *\n * **Note**: mutates the `l` parameter directly for performance.\n */\nexport function moveElement(\n layout: Layout,\n l: LayoutItem,\n x: number | undefined,\n y: number | undefined,\n isUserAction: boolean | undefined,\n preventCollision: boolean | undefined,\n compactType: CompactType,\n cols: number,\n allowOverlap?: boolean,\n): LayoutItem[] {\n // Static items can't be moved unless explicitly draggable\n if (l.static && l.isDraggable !== true) {\n return [...layout];\n }\n\n // Short-circuit if position unchanged\n if (l.y === y && l.x === x) {\n return [...layout];\n }\n\n const oldX = l.x;\n const oldY = l.y;\n\n // Update position (mutates l directly - see JSDoc note)\n if (typeof x === 'number') (l as Mutable<LayoutItem>).x = x;\n if (typeof y === 'number') (l as Mutable<LayoutItem>).y = y;\n (l as Mutable<LayoutItem>).moved = true;\n\n // Sort for proper collision detection order\n let sorted = sortLayoutItems(layout, compactType);\n const movingUp =\n compactType === 'vertical' && typeof y === 'number'\n ? oldY >= y\n : compactType === 'horizontal' && typeof x === 'number'\n ? oldX >= x\n : false;\n\n if (movingUp) {\n sorted = sorted.reverse();\n }\n\n const collisions = getAllCollisions(sorted, l);\n const hasCollisions = collisions.length > 0;\n\n // Handle overlap mode - just clone and return\n if (hasCollisions && allowOverlap) {\n return cloneLayout(layout);\n }\n\n // Handle prevent collision mode - revert position.\n // Return same reference to signal no change occurred.\n if (hasCollisions && preventCollision) {\n (l as Mutable<LayoutItem>).x = oldX;\n (l as Mutable<LayoutItem>).y = oldY;\n (l as Mutable<LayoutItem>).moved = false;\n return layout as LayoutItem[];\n }\n\n // Resolve collisions by moving other items\n let resultLayout: LayoutItem[] = [...layout];\n for (let i = 0; i < collisions.length; i++) {\n const collision = collisions[i];\n if (collision === undefined) continue;\n\n // Skip already-moved items to prevent infinite loops\n if (collision.moved) continue;\n\n // Static items can't be moved - move the dragged item instead\n if (collision.static) {\n resultLayout = moveElementAwayFromCollision(\n resultLayout,\n collision,\n l,\n isUserAction,\n compactType,\n cols,\n );\n } else {\n resultLayout = moveElementAwayFromCollision(\n resultLayout,\n l,\n collision,\n isUserAction,\n compactType,\n cols,\n );\n }\n }\n\n return resultLayout;\n}\n\n/**\n * Move an item away from a collision. Attempts to move up/left first if there's\n * room, otherwise moves it down/right.\n */\nexport function moveElementAwayFromCollision(\n layout: Layout,\n collidesWith: LayoutItem,\n itemToMove: LayoutItem,\n isUserAction: boolean | undefined,\n compactType: CompactType,\n cols: number,\n): LayoutItem[] {\n const compactH = compactType === 'horizontal';\n const compactV = compactType === 'vertical';\n const preventCollision = collidesWith.static;\n\n // Try to move up/left first (only on primary collision from user action)\n if (isUserAction) {\n isUserAction = false; // Only try this once\n\n // Create a fake item to test if there's room above/left\n const fakeItem: LayoutItem = {\n x: compactH ? Math.max(collidesWith.x - itemToMove.w, 0) : itemToMove.x,\n y: compactV ? Math.max(collidesWith.y - itemToMove.h, 0) : itemToMove.y,\n w: itemToMove.w,\n h: itemToMove.h,\n i: '-1',\n };\n\n const firstCollision = getFirstCollision(layout, fakeItem);\n const collisionNorth =\n firstCollision !== undefined &&\n firstCollision.y + firstCollision.h > collidesWith.y;\n const collisionWest =\n firstCollision !== undefined &&\n collidesWith.x + collidesWith.w > firstCollision.x;\n\n // No collision above/left - we can move there\n if (!firstCollision) {\n return moveElement(\n layout,\n itemToMove,\n compactH ? fakeItem.x : undefined,\n compactV ? fakeItem.y : undefined,\n isUserAction,\n preventCollision,\n compactType,\n cols,\n );\n }\n\n // Handle specific collision cases\n if (collisionNorth && compactV) {\n return moveElement(\n layout,\n itemToMove,\n undefined,\n itemToMove.y + 1,\n isUserAction,\n preventCollision,\n compactType,\n cols,\n );\n }\n\n if (collisionNorth && compactType === null) {\n // Swap positions in free-form mode\n (collidesWith as Mutable<LayoutItem>).y = itemToMove.y;\n (itemToMove as Mutable<LayoutItem>).y = itemToMove.y + itemToMove.h;\n return [...layout];\n }\n\n if (collisionWest && compactH) {\n return moveElement(\n layout,\n collidesWith,\n itemToMove.x,\n undefined,\n isUserAction,\n preventCollision,\n compactType,\n cols,\n );\n }\n }\n\n // Default: move down/right by 1\n const newX = compactH ? itemToMove.x + 1 : undefined;\n const newY = compactV ? itemToMove.y + 1 : undefined;\n\n if (newX === undefined && newY === undefined) {\n return [...layout];\n }\n\n return moveElement(\n layout,\n itemToMove,\n newX,\n newY,\n isUserAction,\n preventCollision,\n compactType,\n cols,\n );\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/** Validate that a layout has the required numeric properties. */\nexport function validateLayout(\n layout: Layout,\n contextName: string = 'Layout',\n): void {\n const requiredProps = ['x', 'y', 'w', 'h'] as const;\n\n if (!Array.isArray(layout)) {\n throw new Error(`${contextName} must be an array!`);\n }\n\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item === undefined) continue;\n\n for (const key of requiredProps) {\n const value = item[key];\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new Error(\n `Board: ${contextName}[${i}].${key} must be a number! ` +\n `Received: ${String(value)} (${typeof value})`,\n );\n }\n }\n\n if (item.i !== undefined && typeof item.i !== 'string') {\n throw new Error(\n `Board: ${contextName}[${i}].i must be a string! ` +\n `Received: ${String(item.i)} (${typeof item.i})`,\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.144.0 | Cube Dev Team */
|
|
2
|
+
//#region src/components/layout/Board/grid-core/sort.ts
|
|
3
|
+
/**
|
|
4
|
+
* Sort layout items based on the compaction type.
|
|
5
|
+
*
|
|
6
|
+
* - Vertical compaction: sort by row (y) then column (x)
|
|
7
|
+
* - Horizontal compaction: sort by column (x) then row (y)
|
|
8
|
+
* - No compaction (null): return original order
|
|
9
|
+
*/
|
|
10
|
+
function sortLayoutItems(layout, compactType) {
|
|
11
|
+
if (compactType === "horizontal") return sortLayoutItemsByColRow(layout);
|
|
12
|
+
if (compactType === "vertical") return sortLayoutItemsByRowCol(layout);
|
|
13
|
+
if (compactType === "wrap") return sortLayoutItemsByRowCol(layout);
|
|
14
|
+
return [...layout];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Sort layout items by row ascending, then column ascending.
|
|
18
|
+
*/
|
|
19
|
+
function sortLayoutItemsByRowCol(layout) {
|
|
20
|
+
return [...layout].sort((a, b) => {
|
|
21
|
+
if (a.y !== b.y) return a.y - b.y;
|
|
22
|
+
return a.x - b.x;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Sort layout items by column ascending, then row ascending.
|
|
27
|
+
*/
|
|
28
|
+
function sortLayoutItemsByColRow(layout) {
|
|
29
|
+
return [...layout].sort((a, b) => {
|
|
30
|
+
if (a.x !== b.x) return a.x - b.x;
|
|
31
|
+
return a.y - b.y;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { sortLayoutItems, sortLayoutItemsByColRow, sortLayoutItemsByRowCol };
|
|
37
|
+
//# sourceMappingURL=sort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort.js","names":[],"sources":["../../../../../src/components/layout/Board/grid-core/sort.ts"],"sourcesContent":["/**\n * Sorting utilities for grid layouts.\n *\n * Vendored from react-grid-layout v2 (`src/core/sort.ts`).\n * See ./NOTICE.md for attribution and license.\n */\n\nimport type { CompactType, Layout, LayoutItem } from './types';\n\n/**\n * Sort layout items based on the compaction type.\n *\n * - Vertical compaction: sort by row (y) then column (x)\n * - Horizontal compaction: sort by column (x) then row (y)\n * - No compaction (null): return original order\n */\nexport function sortLayoutItems(\n layout: Layout,\n compactType: CompactType,\n): LayoutItem[] {\n if (compactType === 'horizontal') {\n return sortLayoutItemsByColRow(layout);\n }\n if (compactType === 'vertical') {\n return sortLayoutItemsByRowCol(layout);\n }\n if (compactType === 'wrap') {\n // Wrap mode uses row-col order (reading order: left-to-right, top-to-bottom)\n return sortLayoutItemsByRowCol(layout);\n }\n // No compaction - return a copy to maintain immutability\n return [...layout];\n}\n\n/**\n * Sort layout items by row ascending, then column ascending.\n */\nexport function sortLayoutItemsByRowCol(layout: Layout): LayoutItem[] {\n return [...layout].sort((a, b) => {\n if (a.y !== b.y) {\n return a.y - b.y;\n }\n return a.x - b.x;\n });\n}\n\n/**\n * Sort layout items by column ascending, then row ascending.\n */\nexport function sortLayoutItemsByColRow(layout: Layout): LayoutItem[] {\n return [...layout].sort((a, b) => {\n if (a.x !== b.x) {\n return a.x - b.x;\n }\n return a.y - b.y;\n });\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,gBACd,QACA,aACc;AACd,KAAI,gBAAgB,aAClB,QAAO,wBAAwB,OAAO;AAExC,KAAI,gBAAgB,WAClB,QAAO,wBAAwB,OAAO;AAExC,KAAI,gBAAgB,OAElB,QAAO,wBAAwB,OAAO;AAGxC,QAAO,CAAC,GAAG,OAAO;;;;;AAMpB,SAAgB,wBAAwB,QAA8B;AACpE,QAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM;AAChC,MAAI,EAAE,MAAM,EAAE,EACZ,QAAO,EAAE,IAAI,EAAE;AAEjB,SAAO,EAAE,IAAI,EAAE;GACf;;;;;AAMJ,SAAgB,wBAAwB,QAA8B;AACpE,QAAO,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM;AAChC,MAAI,EAAE,MAAM,EAAE,EACZ,QAAO,EAAE,IAAI,EAAE;AAEjB,SAAO,EAAE,IAAI,EAAE;GACf"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/components/layout/Board/grid-core/types.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Core types for the grid layout engine.
|
|
5
|
+
*
|
|
6
|
+
* Vendored and trimmed from react-grid-layout v2 (`src/core/types.ts`).
|
|
7
|
+
* See ./NOTICE.md for attribution and license.
|
|
8
|
+
*
|
|
9
|
+
* These types are framework-agnostic and describe the data structures used by
|
|
10
|
+
* the layout algorithms.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Axis identifiers for resize handles.
|
|
14
|
+
* - Cardinal: 'n', 's', 'e', 'w' (north, south, east, west)
|
|
15
|
+
* - Diagonal: 'ne', 'nw', 'se', 'sw'
|
|
16
|
+
*/
|
|
17
|
+
type ResizeHandleAxis = 's' | 'w' | 'e' | 'n' | 'sw' | 'nw' | 'se' | 'ne';
|
|
18
|
+
/**
|
|
19
|
+
* A single item in the grid layout.
|
|
20
|
+
*
|
|
21
|
+
* Position (x, y) is in grid units, not pixels. Size (w, h) is in grid units.
|
|
22
|
+
*/
|
|
23
|
+
interface LayoutItem {
|
|
24
|
+
/** Unique identifier for this item */
|
|
25
|
+
i: string;
|
|
26
|
+
/** X position in grid units (0-indexed from left) */
|
|
27
|
+
x: number;
|
|
28
|
+
/** Y position in grid units (0-indexed from top) */
|
|
29
|
+
y: number;
|
|
30
|
+
/** Width in grid units */
|
|
31
|
+
w: number;
|
|
32
|
+
/** Height in grid units */
|
|
33
|
+
h: number;
|
|
34
|
+
/** Minimum width in grid units */
|
|
35
|
+
minW?: number;
|
|
36
|
+
/** Minimum height in grid units */
|
|
37
|
+
minH?: number;
|
|
38
|
+
/** Maximum width in grid units */
|
|
39
|
+
maxW?: number;
|
|
40
|
+
/** Maximum height in grid units */
|
|
41
|
+
maxH?: number;
|
|
42
|
+
/**
|
|
43
|
+
* If true, item cannot be dragged or resized, and other items will move
|
|
44
|
+
* around it during compaction.
|
|
45
|
+
*/
|
|
46
|
+
static?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* If false, item cannot be dragged (but may still be resizable).
|
|
49
|
+
* Overrides grid-level isDraggable for this item.
|
|
50
|
+
*/
|
|
51
|
+
isDraggable?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* If false, item cannot be resized (but may still be draggable).
|
|
54
|
+
* Overrides grid-level isResizable for this item.
|
|
55
|
+
*/
|
|
56
|
+
isResizable?: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Which resize handles to show for this item.
|
|
59
|
+
* Overrides grid-level resizeHandles for this item.
|
|
60
|
+
*/
|
|
61
|
+
resizeHandles?: ResizeHandleAxis[];
|
|
62
|
+
/**
|
|
63
|
+
* If true, item is constrained to the grid container bounds.
|
|
64
|
+
* Overrides grid-level isBounded for this item.
|
|
65
|
+
*/
|
|
66
|
+
isBounded?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Internal flag set during drag/resize operations to indicate the item has
|
|
69
|
+
* moved from its original position.
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
moved?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Per-item layout constraints. Applied in addition to grid-level constraints.
|
|
75
|
+
*/
|
|
76
|
+
constraints?: LayoutConstraint[];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A layout is a readonly array of layout items. Treat layouts as immutable.
|
|
80
|
+
*/
|
|
81
|
+
type Layout = readonly LayoutItem[];
|
|
82
|
+
/**
|
|
83
|
+
* Type of compaction to apply to the layout.
|
|
84
|
+
* - 'vertical': Items compact upward (default)
|
|
85
|
+
* - 'horizontal': Items compact leftward
|
|
86
|
+
* - 'wrap': Items arranged in wrapped-paragraph style (like words in text)
|
|
87
|
+
* - null: No compaction (free-form positioning)
|
|
88
|
+
*/
|
|
89
|
+
type CompactType = 'horizontal' | 'vertical' | 'wrap' | null;
|
|
90
|
+
/**
|
|
91
|
+
* Interface for layout compaction strategies.
|
|
92
|
+
*
|
|
93
|
+
* Implement this interface to create custom compaction algorithms.
|
|
94
|
+
*/
|
|
95
|
+
interface Compactor {
|
|
96
|
+
/** Compaction type identifier */
|
|
97
|
+
readonly type: CompactType;
|
|
98
|
+
/**
|
|
99
|
+
* Whether items can overlap (stack on top of each other).
|
|
100
|
+
*
|
|
101
|
+
* When true items can be placed on top of other items, dragging into another
|
|
102
|
+
* item does NOT push it away, and compaction is skipped after drag/resize.
|
|
103
|
+
*/
|
|
104
|
+
readonly allowOverlap: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Whether to block movement that would cause collision.
|
|
107
|
+
*
|
|
108
|
+
* When true (and allowOverlap is false) dragging into another item is blocked
|
|
109
|
+
* (item snaps back) and other items are NOT pushed away. Only affects
|
|
110
|
+
* drag/resize, not compaction. Has no effect when allowOverlap is true.
|
|
111
|
+
*/
|
|
112
|
+
readonly preventCollision?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Compact the layout.
|
|
115
|
+
*
|
|
116
|
+
* @param layout - The layout to compact
|
|
117
|
+
* @param cols - Number of columns in the grid
|
|
118
|
+
* @returns The compacted layout
|
|
119
|
+
*/
|
|
120
|
+
compact(layout: Layout, cols: number): Layout;
|
|
121
|
+
}
|
|
122
|
+
/** Context provided to constraint functions during drag/resize operations. */
|
|
123
|
+
interface ConstraintContext {
|
|
124
|
+
/** Number of columns in the grid */
|
|
125
|
+
cols: number;
|
|
126
|
+
/** Maximum number of rows (Infinity if unbounded) */
|
|
127
|
+
maxRows: number;
|
|
128
|
+
/** Container width in pixels */
|
|
129
|
+
containerWidth: number;
|
|
130
|
+
/** Container height in pixels (may be 0 if auto-height) */
|
|
131
|
+
containerHeight: number;
|
|
132
|
+
/** Row height in pixels */
|
|
133
|
+
rowHeight: number;
|
|
134
|
+
/** Margin between items [x, y] in pixels */
|
|
135
|
+
margin: readonly [number, number];
|
|
136
|
+
/** Current layout state */
|
|
137
|
+
layout: Layout;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Interface for layout constraints.
|
|
141
|
+
*
|
|
142
|
+
* Implement this interface to create custom position/size constraints.
|
|
143
|
+
* Built-in constraints: gridBounds, minMaxSize, containerBounds, boundedX,
|
|
144
|
+
* boundedY.
|
|
145
|
+
*/
|
|
146
|
+
interface LayoutConstraint {
|
|
147
|
+
/** Constraint identifier for debugging */
|
|
148
|
+
readonly name: string;
|
|
149
|
+
/**
|
|
150
|
+
* Constrain position during drag operations. Called after grid unit
|
|
151
|
+
* conversion, before layout update.
|
|
152
|
+
*/
|
|
153
|
+
constrainPosition?(item: LayoutItem, x: number, y: number, context: ConstraintContext): {
|
|
154
|
+
x: number;
|
|
155
|
+
y: number;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Constrain size during resize operations. Called after grid unit conversion,
|
|
159
|
+
* before layout update.
|
|
160
|
+
*/
|
|
161
|
+
constrainSize?(item: LayoutItem, w: number, h: number, handle: ResizeHandleAxis, context: ConstraintContext): {
|
|
162
|
+
w: number;
|
|
163
|
+
h: number;
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
//#endregion
|
|
167
|
+
export { CompactType, Compactor, Layout, LayoutConstraint, LayoutItem, ResizeHandleAxis };
|
|
168
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
|
|
2
|
+
import { Compactor, Layout, LayoutConstraint, LayoutItem, ResizeHandleAxis } from "./grid-core/types.js";
|
|
3
|
+
import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
|
|
4
|
+
import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
|
|
5
|
+
import { BoardCompactType, BoardGridLines, BoardInteractionInfo, CubeBoardProps } from "./Board.js";
|
|
6
|
+
import { BreakpointCols, Breakpoints, ResponsiveLayouts } from "./responsive-utils.js";
|
|
7
|
+
import { BoardResponsive, CubeBoardResponsiveProps } from "./BoardResponsive.js";
|
|
8
|
+
import { WidgetTransferInfo } from "./board-context.js";
|
|
9
|
+
import { BoardProvider, CubeBoardProviderProps } from "./BoardProvider.js";
|
|
10
|
+
import { CubeBoardWidgetProps, Widget } from "./Widget.js";
|
|
11
|
+
import * as react from "react";
|
|
12
|
+
|
|
13
|
+
//#region src/components/layout/Board/index.d.ts
|
|
14
|
+
declare const Board: react.ForwardRefExoticComponent<CubeBoardProps & react.RefAttributes<HTMLDivElement>> & {
|
|
15
|
+
Widget: typeof Widget;
|
|
16
|
+
Provider: typeof BoardProvider;
|
|
17
|
+
Responsive: react.ForwardRefExoticComponent<CubeBoardResponsiveProps & react.RefAttributes<HTMLDivElement>>;
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
export { Board };
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.144.0 | Cube Dev Team */
|
|
2
|
+
import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
|
|
3
|
+
import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
|
|
4
|
+
import { BoardProvider } from "./BoardProvider.js";
|
|
5
|
+
import { Board as Board$1 } from "./Board.js";
|
|
6
|
+
import { BoardResponsive } from "./BoardResponsive.js";
|
|
7
|
+
import { Widget } from "./Widget.js";
|
|
8
|
+
|
|
9
|
+
//#region src/components/layout/Board/index.tsx
|
|
10
|
+
const Board = Object.assign(Board$1, {
|
|
11
|
+
Widget,
|
|
12
|
+
Provider: BoardProvider,
|
|
13
|
+
Responsive: BoardResponsive
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { Board };
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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 };\n\nexport type {\n CubeBoardProps,\n BoardCompactType,\n BoardGridLines,\n BoardInteractionInfo,\n} from './Board';\nexport type { CubeBoardResponsiveProps } from './BoardResponsive';\nexport type { CubeBoardWidgetProps } 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 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":";;;;;;;;;AAKA,MAAM,QAAQ,OAAO,OAAOA,SAAW;CACrC;CACA,UAAU;CACV,YAAY;CACb,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
import { LayoutItem } from "./grid-core/types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/layout/Board/responsive-utils.d.ts
|
|
5
|
+
/** Map of breakpoint name -> minimum container width (px). */
|
|
6
|
+
type Breakpoints = Record<string, number>;
|
|
7
|
+
/** Map of breakpoint name -> column count. */
|
|
8
|
+
type BreakpointCols = Record<string, number>;
|
|
9
|
+
/** Map of breakpoint name -> layout. */
|
|
10
|
+
type ResponsiveLayouts = Record<string, LayoutItem[]>;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { BreakpointCols, Breakpoints, ResponsiveLayouts };
|
|
13
|
+
//# sourceMappingURL=responsive-utils.d.ts.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.144.0 | Cube Dev Team */
|
|
2
|
+
import { cloneLayout, correctBounds } from "./grid-core/layout.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/layout/Board/responsive-utils.ts
|
|
5
|
+
/**
|
|
6
|
+
* Responsive helpers for `Board.Responsive`.
|
|
7
|
+
*
|
|
8
|
+
* Framework-agnostic breakpoint math adapted (MIT) from react-grid-layout's
|
|
9
|
+
* `responsiveUtils`, rewritten to use this package's grid-core primitives. See
|
|
10
|
+
* ./grid-core/NOTICE.md for the upstream attribution and license.
|
|
11
|
+
*/
|
|
12
|
+
/** Breakpoint names sorted ascending by their minimum width. */
|
|
13
|
+
function sortBreakpoints(breakpoints) {
|
|
14
|
+
return Object.keys(breakpoints).sort((a, b) => breakpoints[a] - breakpoints[b]);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The largest breakpoint whose minimum width is at or below `width`. Falls back
|
|
18
|
+
* to the smallest breakpoint when `width` is narrower than all of them.
|
|
19
|
+
*/
|
|
20
|
+
function getBreakpointFromWidth(breakpoints, width) {
|
|
21
|
+
const sorted = sortBreakpoints(breakpoints);
|
|
22
|
+
let matching = sorted[0];
|
|
23
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
24
|
+
const name = sorted[i];
|
|
25
|
+
if (width >= breakpoints[name]) matching = name;
|
|
26
|
+
}
|
|
27
|
+
return matching;
|
|
28
|
+
}
|
|
29
|
+
/** Column count for a breakpoint. */
|
|
30
|
+
function getColsFromBreakpoint(breakpoint, cols) {
|
|
31
|
+
const value = cols[breakpoint];
|
|
32
|
+
if (value == null) throw new Error(`Board.Responsive: no columns defined for breakpoint "${breakpoint}".`);
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The layout for `breakpoint`, or one synthesized from the nearest available
|
|
37
|
+
* breakpoint (preferring `lastBreakpoint`, then breakpoints at or above the
|
|
38
|
+
* target) corrected into bounds and compacted for the target column count.
|
|
39
|
+
*/
|
|
40
|
+
function findOrGenerateResponsiveLayout(layouts, breakpoints, breakpoint, lastBreakpoint, cols, compactor) {
|
|
41
|
+
if (layouts[breakpoint]) return cloneLayout(layouts[breakpoint]);
|
|
42
|
+
let layout = layouts[lastBreakpoint];
|
|
43
|
+
const sorted = sortBreakpoints(breakpoints);
|
|
44
|
+
const above = sorted.slice(sorted.indexOf(breakpoint));
|
|
45
|
+
for (const name of above) if (layouts[name]) {
|
|
46
|
+
layout = layouts[name];
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
layout = cloneLayout(layout || []);
|
|
50
|
+
return [...compactor.compact(correctBounds(layout, { cols }), cols)];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
export { findOrGenerateResponsiveLayout, getBreakpointFromWidth, getColsFromBreakpoint };
|
|
55
|
+
//# sourceMappingURL=responsive-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responsive-utils.js","names":[],"sources":["../../../../src/components/layout/Board/responsive-utils.ts"],"sourcesContent":["/**\n * Responsive helpers for `Board.Responsive`.\n *\n * Framework-agnostic breakpoint math adapted (MIT) from react-grid-layout's\n * `responsiveUtils`, rewritten to use this package's grid-core primitives. See\n * ./grid-core/NOTICE.md for the upstream attribution and license.\n */\nimport { cloneLayout, Compactor, correctBounds, LayoutItem } from './grid-core';\n\n/** Map of breakpoint name -> minimum container width (px). */\nexport type Breakpoints = Record<string, number>;\n/** Map of breakpoint name -> column count. */\nexport type BreakpointCols = Record<string, number>;\n/** Map of breakpoint name -> layout. */\nexport type ResponsiveLayouts = Record<string, LayoutItem[]>;\n\n/** Breakpoint names sorted ascending by their minimum width. */\nexport function sortBreakpoints(breakpoints: Breakpoints): string[] {\n return Object.keys(breakpoints).sort(\n (a, b) => breakpoints[a] - breakpoints[b],\n );\n}\n\n/**\n * The largest breakpoint whose minimum width is at or below `width`. Falls back\n * to the smallest breakpoint when `width` is narrower than all of them.\n */\nexport function getBreakpointFromWidth(\n breakpoints: Breakpoints,\n width: number,\n): string {\n const sorted = sortBreakpoints(breakpoints);\n let matching = sorted[0];\n for (let i = 1; i < sorted.length; i++) {\n const name = sorted[i];\n if (width >= breakpoints[name]) matching = name;\n }\n return matching;\n}\n\n/** Column count for a breakpoint. */\nexport function getColsFromBreakpoint(\n breakpoint: string,\n cols: BreakpointCols,\n): number {\n const value = cols[breakpoint];\n if (value == null) {\n throw new Error(\n `Board.Responsive: no columns defined for breakpoint \"${breakpoint}\".`,\n );\n }\n return value;\n}\n\n/**\n * The layout for `breakpoint`, or one synthesized from the nearest available\n * breakpoint (preferring `lastBreakpoint`, then breakpoints at or above the\n * target) corrected into bounds and compacted for the target column count.\n */\nexport function findOrGenerateResponsiveLayout(\n layouts: ResponsiveLayouts,\n breakpoints: Breakpoints,\n breakpoint: string,\n lastBreakpoint: string,\n cols: number,\n compactor: Compactor,\n): LayoutItem[] {\n if (layouts[breakpoint]) return cloneLayout(layouts[breakpoint]);\n\n let layout = layouts[lastBreakpoint];\n const sorted = sortBreakpoints(breakpoints);\n const above = sorted.slice(sorted.indexOf(breakpoint));\n for (const name of above) {\n if (layouts[name]) {\n layout = layouts[name];\n break;\n }\n }\n\n layout = cloneLayout(layout || []);\n return [...compactor.compact(correctBounds(layout, { cols }), cols)];\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,SAAgB,gBAAgB,aAAoC;AAClE,QAAO,OAAO,KAAK,YAAY,CAAC,MAC7B,GAAG,MAAM,YAAY,KAAK,YAAY,GACxC;;;;;;AAOH,SAAgB,uBACd,aACA,OACQ;CACR,MAAM,SAAS,gBAAgB,YAAY;CAC3C,IAAI,WAAW,OAAO;AACtB,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACtC,MAAM,OAAO,OAAO;AACpB,MAAI,SAAS,YAAY,MAAO,YAAW;;AAE7C,QAAO;;;AAIT,SAAgB,sBACd,YACA,MACQ;CACR,MAAM,QAAQ,KAAK;AACnB,KAAI,SAAS,KACX,OAAM,IAAI,MACR,wDAAwD,WAAW,IACpE;AAEH,QAAO;;;;;;;AAQT,SAAgB,+BACd,SACA,aACA,YACA,gBACA,MACA,WACc;AACd,KAAI,QAAQ,YAAa,QAAO,YAAY,QAAQ,YAAY;CAEhE,IAAI,SAAS,QAAQ;CACrB,MAAM,SAAS,gBAAgB,YAAY;CAC3C,MAAM,QAAQ,OAAO,MAAM,OAAO,QAAQ,WAAW,CAAC;AACtD,MAAK,MAAM,QAAQ,MACjB,KAAI,QAAQ,OAAO;AACjB,WAAS,QAAQ;AACjB;;AAIJ,UAAS,YAAY,UAAU,EAAE,CAAC;AAClC,QAAO,CAAC,GAAG,UAAU,QAAQ,cAAc,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.144.0 | Cube Dev Team */
|
|
2
|
+
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
|
+
import { cloneLayout } from "./grid-core/layout.js";
|
|
4
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/components/layout/Board/use-board-layout.ts
|
|
7
|
+
/**
|
|
8
|
+
* Headless layout state for a single board.
|
|
9
|
+
*
|
|
10
|
+
* Supports both controlled (`layout`) and uncontrolled (`defaultLayout`) usage.
|
|
11
|
+
* Intermediate drag/resize previews always update local state; only committed
|
|
12
|
+
* changes call `onLayoutChange`.
|
|
13
|
+
*/
|
|
14
|
+
function useBoardLayout(options) {
|
|
15
|
+
const { layout: controlledLayout, defaultLayout, onLayoutChange } = options;
|
|
16
|
+
const isControlled = controlledLayout !== void 0;
|
|
17
|
+
const [layout, setLayout] = useState(() => cloneLayout(controlledLayout ?? defaultLayout ?? []));
|
|
18
|
+
const layoutRef = useRef(layout);
|
|
19
|
+
layoutRef.current = layout;
|
|
20
|
+
const [placeholder, setPlaceholderState] = useState(null);
|
|
21
|
+
const placeholderRef = useRef(null);
|
|
22
|
+
const setPlaceholder = useCallback((item) => {
|
|
23
|
+
placeholderRef.current = item;
|
|
24
|
+
setPlaceholderState(item);
|
|
25
|
+
}, []);
|
|
26
|
+
const onLayoutChangeEvent = useEvent((next) => onLayoutChange?.(next));
|
|
27
|
+
const prevControlledRef = useRef(controlledLayout);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
if (isControlled && controlledLayout !== prevControlledRef.current) {
|
|
30
|
+
prevControlledRef.current = controlledLayout;
|
|
31
|
+
const next = cloneLayout(controlledLayout ?? []);
|
|
32
|
+
layoutRef.current = next;
|
|
33
|
+
setLayout(next);
|
|
34
|
+
}
|
|
35
|
+
}, [controlledLayout, isControlled]);
|
|
36
|
+
return {
|
|
37
|
+
layout,
|
|
38
|
+
layoutRef,
|
|
39
|
+
placeholder,
|
|
40
|
+
placeholderRef,
|
|
41
|
+
setPlaceholder,
|
|
42
|
+
applyLayout: useCallback((next, commit) => {
|
|
43
|
+
layoutRef.current = next;
|
|
44
|
+
setLayout(next);
|
|
45
|
+
if (commit) onLayoutChangeEvent(next);
|
|
46
|
+
}, [onLayoutChangeEvent])
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { useBoardLayout };
|
|
52
|
+
//# sourceMappingURL=use-board-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-board-layout.js","names":[],"sources":["../../../../src/components/layout/Board/use-board-layout.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nimport { cloneLayout, LayoutItem } from './grid-core';\n\nexport interface UseBoardLayoutOptions {\n /** Controlled layout. */\n layout?: LayoutItem[];\n /** Initial layout for uncontrolled usage. */\n defaultLayout?: LayoutItem[];\n onLayoutChange?: (layout: LayoutItem[]) => void;\n}\n\nexport interface UseBoardLayoutResult {\n layout: LayoutItem[];\n layoutRef: React.MutableRefObject<LayoutItem[]>;\n placeholder: LayoutItem | null;\n /**\n * Synchronously-updated mirror of `placeholder`. `setPlaceholder` only\n * schedules a re-render, so consumers that run in the same tick as a\n * `setPlaceholder` call (e.g. drag lifecycle callbacks fired right after the\n * registry updates the placeholder) must read the ref to see the live value.\n */\n placeholderRef: React.MutableRefObject<LayoutItem | null>;\n setPlaceholder: (item: LayoutItem | null) => void;\n /** Update the layout. `commit` fires `onLayoutChange`. */\n applyLayout: (layout: LayoutItem[], commit: boolean) => void;\n}\n\n/**\n * Headless layout state for a single board.\n *\n * Supports both controlled (`layout`) and uncontrolled (`defaultLayout`) usage.\n * Intermediate drag/resize previews always update local state; only committed\n * changes call `onLayoutChange`.\n */\nexport function useBoardLayout(\n options: UseBoardLayoutOptions,\n): UseBoardLayoutResult {\n const { layout: controlledLayout, defaultLayout, onLayoutChange } = options;\n const isControlled = controlledLayout !== undefined;\n\n const [layout, setLayout] = useState<LayoutItem[]>(() =>\n cloneLayout(controlledLayout ?? defaultLayout ?? []),\n );\n const layoutRef = useRef<LayoutItem[]>(layout);\n layoutRef.current = layout;\n\n const [placeholder, setPlaceholderState] = useState<LayoutItem | null>(null);\n const placeholderRef = useRef<LayoutItem | null>(null);\n const setPlaceholder = useCallback((item: LayoutItem | null) => {\n placeholderRef.current = item;\n setPlaceholderState(item);\n }, []);\n\n const onLayoutChangeEvent = useEvent((next: LayoutItem[]) =>\n onLayoutChange?.(next),\n );\n\n // Sync controlled prop into local state when it changes by reference.\n const prevControlledRef = useRef(controlledLayout);\n useEffect(() => {\n if (isControlled && controlledLayout !== prevControlledRef.current) {\n prevControlledRef.current = controlledLayout;\n const next = cloneLayout(controlledLayout ?? []);\n layoutRef.current = next;\n setLayout(next);\n }\n }, [controlledLayout, isControlled]);\n\n const applyLayout = useCallback(\n (next: LayoutItem[], commit: boolean) => {\n layoutRef.current = next;\n setLayout(next);\n if (commit) {\n onLayoutChangeEvent(next);\n }\n },\n [onLayoutChangeEvent],\n );\n\n return {\n layout,\n layoutRef,\n placeholder,\n placeholderRef,\n setPlaceholder,\n applyLayout,\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAqCA,SAAgB,eACd,SACsB;CACtB,MAAM,EAAE,QAAQ,kBAAkB,eAAe,mBAAmB;CACpE,MAAM,eAAe,qBAAqB;CAE1C,MAAM,CAAC,QAAQ,aAAa,eAC1B,YAAY,oBAAoB,iBAAiB,EAAE,CAAC,CACrD;CACD,MAAM,YAAY,OAAqB,OAAO;AAC9C,WAAU,UAAU;CAEpB,MAAM,CAAC,aAAa,uBAAuB,SAA4B,KAAK;CAC5E,MAAM,iBAAiB,OAA0B,KAAK;CACtD,MAAM,iBAAiB,aAAa,SAA4B;AAC9D,iBAAe,UAAU;AACzB,sBAAoB,KAAK;IACxB,EAAE,CAAC;CAEN,MAAM,sBAAsB,UAAU,SACpC,iBAAiB,KAAK,CACvB;CAGD,MAAM,oBAAoB,OAAO,iBAAiB;AAClD,iBAAgB;AACd,MAAI,gBAAgB,qBAAqB,kBAAkB,SAAS;AAClE,qBAAkB,UAAU;GAC5B,MAAM,OAAO,YAAY,oBAAoB,EAAE,CAAC;AAChD,aAAU,UAAU;AACpB,aAAU,KAAK;;IAEhB,CAAC,kBAAkB,aAAa,CAAC;AAapC,QAAO;EACL;EACA;EACA;EACA;EACA;EACA,aAjBkB,aACjB,MAAoB,WAAoB;AACvC,aAAU,UAAU;AACpB,aAAU,KAAK;AACf,OAAI,OACF,qBAAoB,KAAK;KAG7B,CAAC,oBAAoB,CACtB;EASA"}
|