@cube-dev/ui-kit 0.145.2 → 0.145.4
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 +12 -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/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.js +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/BoardResponsive.js +1 -1
- package/dist/components/layout/Board/Widget.js +1 -1
- package/dist/components/layout/Board/WidgetHost.js +16 -7
- 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 +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +162 -5
- package/dist/components/layout/Board/use-board-registry.js.map +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/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/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.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/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/package.json +1 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { BoardWidgetStore } from "./board-store.js";
|
|
4
|
-
import {
|
|
4
|
+
import { collides } from "./grid-core/collision.js";
|
|
5
|
+
import { bottom, cloneLayout, getLayoutItem, moveElement } from "./grid-core/layout.js";
|
|
5
6
|
import { calcXYRaw } from "./grid-core/calculate.js";
|
|
6
7
|
import { applyPositionConstraints } from "./grid-core/constraints.js";
|
|
7
8
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -28,6 +29,95 @@ function rectCenter(rect) {
|
|
|
28
29
|
y: rect.top + rect.height / 2
|
|
29
30
|
};
|
|
30
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Canonical key for the unordered pair `{id1, id2}`. Widget ids are unrestricted
|
|
34
|
+
* strings, so a naive `` `${id1}|${id2}` `` join is ambiguous - an id containing
|
|
35
|
+
* the delimiter lets two different pairs collide (e.g. `{"a|b","c"}` and
|
|
36
|
+
* `{"a","b|c"}` both yield `"a|b|c"`). `JSON.stringify` of the sorted tuple
|
|
37
|
+
* quotes and escapes each id, so distinct pairs always produce distinct keys.
|
|
38
|
+
*/
|
|
39
|
+
function pairKey(id1, id2) {
|
|
40
|
+
return id1 < id2 ? JSON.stringify([id1, id2]) : JSON.stringify([id2, id1]);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Keys of every overlapping pair in the layout (see `pairKey`), so two layouts'
|
|
44
|
+
* overlap sets can be compared to tell which overlaps a move *introduced* versus
|
|
45
|
+
* which already existed.
|
|
46
|
+
*/
|
|
47
|
+
function overlappingPairs(layout) {
|
|
48
|
+
const pairs = /* @__PURE__ */ new Set();
|
|
49
|
+
for (let i = 0; i < layout.length; i++) for (let j = i + 1; j < layout.length; j++) {
|
|
50
|
+
const a = layout[i];
|
|
51
|
+
const b = layout[j];
|
|
52
|
+
if (collides(a, b)) pairs.add(pairKey(a.i, b.i));
|
|
53
|
+
}
|
|
54
|
+
return pairs;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Whether `after` contains an overlapping pair that `before` did not. Used to
|
|
58
|
+
* reject only moves that *create* a new stack. A board may already hold
|
|
59
|
+
* overlapping widgets - a `compact={null}` layout is never gap-compacted, and an
|
|
60
|
+
* app can supply overlapping items directly (or toggle `allowOverlap` off after
|
|
61
|
+
* stacking) - and those pre-existing overlaps must not freeze every subsequent
|
|
62
|
+
* move by making a whole-layout collision check always true.
|
|
63
|
+
*/
|
|
64
|
+
function hasNewOverlap(before, after) {
|
|
65
|
+
const afterPairs = overlappingPairs(after);
|
|
66
|
+
for (const key of afterPairs) if (!before.has(key)) return true;
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* First position at or below the preferred cell where `item` fits without
|
|
71
|
+
* overlapping any of `others` (assumed overlap-free), scanning left-to-right
|
|
72
|
+
* then top-to-bottom, never past `maxRows`. Last-resort placement for a legacy
|
|
73
|
+
* (no-op compaction) cross-board drop that would otherwise stack widgets.
|
|
74
|
+
*
|
|
75
|
+
* A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path
|
|
76
|
+
* applies (`clamp(y, 0, maxRows - h)`): the widget's bottom edge (`y + h`) stays
|
|
77
|
+
* within the row limit even when the landing cell is blocked, so the downward
|
|
78
|
+
* scan can't push it off the board. Rows are searched from the (clamped) landing
|
|
79
|
+
* row down to the limit first, then upward toward the top; if the whole valid
|
|
80
|
+
* band is full the widget is clamped to the limit (bounds win over overlap, as
|
|
81
|
+
* `gridBounds` does). With an unbounded `maxRows` there is always a free slot
|
|
82
|
+
* below every existing item, so the downward scan terminates on its own.
|
|
83
|
+
*/
|
|
84
|
+
function placeInFreeSlot(others, item, cols, maxRows = Infinity) {
|
|
85
|
+
const w = Math.min(item.w, cols);
|
|
86
|
+
const maxY = Number.isFinite(maxRows) ? Math.max(0, maxRows - item.h) : Infinity;
|
|
87
|
+
const fits = (x, y) => !others.some((o) => collides(o, {
|
|
88
|
+
...item,
|
|
89
|
+
x,
|
|
90
|
+
y,
|
|
91
|
+
w
|
|
92
|
+
}));
|
|
93
|
+
const preferX = Math.min(Math.max(0, item.x), cols - w);
|
|
94
|
+
const startY = Math.min(Math.max(0, item.y), maxY);
|
|
95
|
+
if (fits(preferX, startY)) return {
|
|
96
|
+
...item,
|
|
97
|
+
x: preferX,
|
|
98
|
+
y: startY,
|
|
99
|
+
w
|
|
100
|
+
};
|
|
101
|
+
const scanBottom = Number.isFinite(maxRows) ? maxY : startY + others.reduce((m, o) => Math.max(m, o.y + o.h), 0) + 1;
|
|
102
|
+
for (let y = startY; y <= scanBottom; y++) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
|
|
103
|
+
...item,
|
|
104
|
+
x,
|
|
105
|
+
y,
|
|
106
|
+
w
|
|
107
|
+
};
|
|
108
|
+
for (let y = startY - 1; y >= 0; y--) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
|
|
109
|
+
...item,
|
|
110
|
+
x,
|
|
111
|
+
y,
|
|
112
|
+
w
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
...item,
|
|
116
|
+
x: preferX,
|
|
117
|
+
y: startY,
|
|
118
|
+
w
|
|
119
|
+
};
|
|
120
|
+
}
|
|
31
121
|
function useBoardRegistry(options) {
|
|
32
122
|
const store = useMemo(() => new BoardWidgetStore(), []);
|
|
33
123
|
const onTransferRef = useRef(options?.onWidgetTransfer);
|
|
@@ -170,7 +260,7 @@ function useBoardRegistry(options) {
|
|
|
170
260
|
const pp = entry.getPositionParams();
|
|
171
261
|
const compactor = entry.getCompactor();
|
|
172
262
|
const layout = entry.getLayout();
|
|
173
|
-
const working = getLayoutItem(layout, item.i) ?
|
|
263
|
+
const working = getLayoutItem(layout, item.i) ? cloneLayout(layout) : [...cloneLayout(layout), {
|
|
174
264
|
...item,
|
|
175
265
|
x,
|
|
176
266
|
y
|
|
@@ -179,10 +269,65 @@ function useBoardRegistry(options) {
|
|
|
179
269
|
if (!target) return;
|
|
180
270
|
const moved = moveElement(working, target, x, y, true, compactor.preventCollision, compactor.type, pp.cols, compactor.allowOverlap);
|
|
181
271
|
const compacted = [...compactor.compact(moved, pp.cols)];
|
|
272
|
+
if (!compactor.allowOverlap && hasNewOverlap(overlappingPairs(layout), compacted)) return;
|
|
182
273
|
entry.applyLayout(compacted, false);
|
|
183
274
|
entry.setPlaceholder(getLayoutItem(compacted, item.i) ?? null);
|
|
184
275
|
}, []);
|
|
185
276
|
/**
|
|
277
|
+
* Move a widget by one logical keyboard step. Unlike pointer movement, this
|
|
278
|
+
* starts from the live grid coordinates rather than DOM geometry and scans
|
|
279
|
+
* farther in the requested direction when the adjacent slot cannot produce a
|
|
280
|
+
* valid move.
|
|
281
|
+
*/
|
|
282
|
+
const moveWithKeyboard = useCallback((entry, item, deltaX, deltaY) => {
|
|
283
|
+
const pp = entry.getPositionParams();
|
|
284
|
+
const compactor = entry.getCompactor();
|
|
285
|
+
const layout = entry.getLayout();
|
|
286
|
+
const live = getLayoutItem(layout, item.i);
|
|
287
|
+
if (!live) return;
|
|
288
|
+
const directionX = Math.sign(deltaX);
|
|
289
|
+
const directionY = Math.sign(deltaY);
|
|
290
|
+
if (directionX === 0 && directionY === 0) return;
|
|
291
|
+
const maxRows = entry.getMaxRows();
|
|
292
|
+
const attempts = directionX < 0 ? live.x : directionX > 0 ? Math.max(0, pp.cols - live.w - live.x) : directionY < 0 ? live.y : Number.isFinite(maxRows) ? Math.max(0, maxRows - live.h - live.y) : Math.max(1, bottom(layout) - live.y);
|
|
293
|
+
const seen = /* @__PURE__ */ new Set();
|
|
294
|
+
const beforePairs = overlappingPairs(layout);
|
|
295
|
+
for (let distance = 1; distance <= attempts; distance++) {
|
|
296
|
+
const rawX = live.x + directionX * distance;
|
|
297
|
+
const rawY = live.y + directionY * distance;
|
|
298
|
+
const candidate = applyPositionConstraints(entry.getConstraints(), item, rawX, rawY, {
|
|
299
|
+
cols: pp.cols,
|
|
300
|
+
maxRows,
|
|
301
|
+
containerWidth: pp.containerWidth,
|
|
302
|
+
containerHeight: entry.getContainerHeight(),
|
|
303
|
+
rowHeight: pp.rowHeight,
|
|
304
|
+
margin: pp.margin,
|
|
305
|
+
layout
|
|
306
|
+
});
|
|
307
|
+
const candidateKey = `${candidate.x}:${candidate.y}`;
|
|
308
|
+
if (seen.has(candidateKey)) continue;
|
|
309
|
+
seen.add(candidateKey);
|
|
310
|
+
if (directionX !== 0 && (Math.sign(candidate.x - live.x) !== directionX || candidate.y !== live.y) || directionY !== 0 && (Math.sign(candidate.y - live.y) !== directionY || candidate.x !== live.x)) continue;
|
|
311
|
+
const working = cloneLayout(layout);
|
|
312
|
+
const target = getLayoutItem(working, item.i);
|
|
313
|
+
if (!target) return;
|
|
314
|
+
const moved = moveElement(working, target, candidate.x, candidate.y, true, compactor.preventCollision, compactor.type, pp.cols, compactor.allowOverlap);
|
|
315
|
+
const compacted = [...compactor.compact(moved, pp.cols)];
|
|
316
|
+
const landed = getLayoutItem(compacted, item.i);
|
|
317
|
+
if (!landed) continue;
|
|
318
|
+
const advanced = directionX !== 0 ? Math.sign(landed.x - live.x) === directionX && landed.y === live.y : Math.sign(landed.y - live.y) === directionY && landed.x === live.x;
|
|
319
|
+
const overlaps = !compactor.allowOverlap && hasNewOverlap(beforePairs, compacted);
|
|
320
|
+
if (!advanced || overlaps) continue;
|
|
321
|
+
entry.applyLayout(compacted, false);
|
|
322
|
+
entry.setPlaceholder(landed);
|
|
323
|
+
lastLandingRef.current = {
|
|
324
|
+
x: landed.x,
|
|
325
|
+
y: landed.y
|
|
326
|
+
};
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
}, []);
|
|
330
|
+
/**
|
|
186
331
|
* Live cross-board reflow preview. Pushes the target board's *other* widgets
|
|
187
332
|
* aside to make room for the incoming item, without ever adding the dragged
|
|
188
333
|
* item's host to the target (it stays visualized as a placeholder + overlay
|
|
@@ -200,7 +345,7 @@ function useBoardRegistry(options) {
|
|
|
200
345
|
const pp = target.getPositionParams();
|
|
201
346
|
const compactor = target.getCompactor();
|
|
202
347
|
const carried = previewRef.current?.boardId === target.id ? previewRef.current.working : null;
|
|
203
|
-
const base = (carried ??
|
|
348
|
+
const base = cloneLayout(carried ?? targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== item.i);
|
|
204
349
|
const prevItem = carried ? getLayoutItem(carried, item.i) : void 0;
|
|
205
350
|
const dragged = prevItem ? { ...prevItem } : compactor.type === "horizontal" ? {
|
|
206
351
|
...item,
|
|
@@ -213,6 +358,7 @@ function useBoardRegistry(options) {
|
|
|
213
358
|
};
|
|
214
359
|
const moved = moveElement([...base, dragged], dragged, x, y, true, compactor.preventCollision, compactor.type, pp.cols, compactor.allowOverlap);
|
|
215
360
|
const compacted = [...compactor.compact(moved, pp.cols)];
|
|
361
|
+
if (!compactor.allowOverlap && hasNewOverlap(overlappingPairs(base), compacted)) return;
|
|
216
362
|
previewRef.current = {
|
|
217
363
|
boardId: target.id,
|
|
218
364
|
working: compacted
|
|
@@ -225,9 +371,14 @@ function useBoardRegistry(options) {
|
|
|
225
371
|
target.applyLayout(compacted.filter((l) => l.i !== item.i), false);
|
|
226
372
|
target.setPlaceholder({ ...landed });
|
|
227
373
|
}, []);
|
|
228
|
-
const onDragMove = useEvent((deltaX, deltaY,
|
|
374
|
+
const onDragMove = useEvent((deltaX, deltaY, pointerType) => {
|
|
229
375
|
const ds = dragStateRef.current;
|
|
230
376
|
if (!ds) return;
|
|
377
|
+
if (pointerType === "keyboard") {
|
|
378
|
+
const source = boardsRef.current.get(ds.sourceBoardId);
|
|
379
|
+
if (source) moveWithKeyboard(source, ds.item, deltaX, deltaY);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
231
382
|
const newRect = {
|
|
232
383
|
...ds.rect,
|
|
233
384
|
left: ds.rect.left + deltaX,
|
|
@@ -330,6 +481,12 @@ function useBoardRegistry(options) {
|
|
|
330
481
|
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);
|
|
331
482
|
finalLayout = [...tc.compact(moved, tp.cols)];
|
|
332
483
|
}
|
|
484
|
+
const targetOthers = cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId));
|
|
485
|
+
if (!tc.allowOverlap && hasNewOverlap(overlappingPairs(targetOthers), finalLayout)) finalLayout = [...targetOthers, placeInFreeSlot(targetOthers, {
|
|
486
|
+
...ds.item,
|
|
487
|
+
x: landing.x,
|
|
488
|
+
y: landing.y
|
|
489
|
+
}, tp.cols, tp.maxRows)];
|
|
333
490
|
target.applyLayout(finalLayout, true);
|
|
334
491
|
onTransferRef.current?.({
|
|
335
492
|
widgetId: ds.itemId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-board-registry.js","names":[],"sources":["../../../../src/components/layout/Board/use-board-registry.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nimport {\n BoardDragState,\n BoardEntry,\n BoardRegistryContextValue,\n ViewportRect,\n WidgetTransferInfo,\n} from './board-context';\nimport { BoardWidgetStore } from './board-store';\nimport {\n applyPositionConstraints,\n calcXYRaw,\n cloneLayout,\n getLayoutItem,\n LayoutItem,\n moveElement,\n} from './grid-core';\n\n/**\n * The dragged widget's center in viewport coordinates.\n *\n * This is the anchor the drop-target hit-test uses to pick which board a drag is\n * over, so a board (including an empty one) opens as soon as the widget's center\n * enters it rather than only once its whole top-left corner is inside.\n *\n * The landing itself stays anchored to the grabbed top-left (`rect.left/top` in\n * `computeLanding`): that point is this center offset by the widget's own fixed\n * pixel size, so the resolved landing cell keeps corresponding to where the\n * floating overlay clone is drawn (see `WidgetHost`) and the placeholder keeps\n * tracking the ghost. The only unavoidable divergence is while the widget\n * physically overhangs a board edge - a placeholder cannot render outside row 0\n * / column 0 - which is the accepted tradeoff for opening on the center.\n */\nfunction rectCenter(rect: ViewportRect): { x: number; y: number } {\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n}\n\n/**\n * Cross-board drag orchestration.\n *\n * Owns the shared widget-content store, the drag overlay ref, and the registry\n * of boards. Handles moving an item inside a board and transferring it between\n * boards (including nested ones) by hit-testing the pointer against each board's\n * content rectangle.\n */\nexport interface UseBoardRegistryOptions {\n /** Fired when a widget is dropped from one board into another. */\n onWidgetTransfer?: (info: WidgetTransferInfo) => void;\n}\n\nexport function useBoardRegistry(\n options?: UseBoardRegistryOptions,\n): BoardRegistryContextValue {\n const store = useMemo(() => new BoardWidgetStore(), []);\n // Latest transfer callback, read from a ref so the stable `onDragEnd` handler\n // always calls the current one without re-creating the registry.\n const onTransferRef = useRef(options?.onWidgetTransfer);\n onTransferRef.current = options?.onWidgetTransfer;\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const boardsRef = useRef<Map<string, BoardEntry>>(new Map());\n const dragStateRef = useRef<BoardDragState | null>(null);\n const affectedRef = useRef<Set<string>>(new Set());\n // Snapshot of the source board's layout at drag start, used to restore the\n // source when the pointer leaves it (the dragged item is never removed from\n // the source mid-drag, so its gesture host stays mounted).\n const sourceSnapshotRef = useRef<LayoutItem[]>([]);\n // Snapshot of each visited target board's layout at the moment the pointer\n // first entered it. Used to restore a board when the pointer leaves it, and as\n // the clean seed for the reflow preview on (re-)entry. Never mutated.\n const targetSnapshotsRef = useRef<Map<string, LayoutItem[]>>(new Map());\n // The current target board's live working layout (including the incoming\n // item). Carried across frames so small pointer movements reflow the board\n // incrementally - exactly like an in-board drag - instead of recomputing from\n // scratch each frame (which lets collision resolution sink the item to the\n // bottom of an occupied column).\n const previewRef = useRef<{ boardId: string; working: LayoutItem[] } | null>(\n null,\n );\n // Board content rects captured at drag start. Reading geometry from here (not\n // live getBoundingClientRect) means the live-reflow preview can't move the\n // rects that selection/landing depend on -> no feedback loop.\n const frozenRectsRef = useRef<Map<string, DOMRect>>(new Map());\n // Ids of boards nested inside the dragged widget, captured at drag start.\n // Such a board must never be a drop target: dropping a widget into a board\n // nested within itself removes it from the tree that renders that board.\n // The overlay-containment check in `hitTest` only catches these once the\n // dragged widget has floated into the overlay, but `useMove` fires the first\n // `onMove` synchronously with `onMoveStart` (before React relocates the\n // widget into the overlay), so on a tiny one-move drag the nested board is\n // still in-grid and would be selected. Excluding these ids for the whole\n // gesture closes that window.\n const nestedInDraggedRef = useRef<Set<string>>(new Set());\n // Last landing position computed for the current target board (grid units).\n const lastLandingRef = useRef<{ x: number; y: number } | null>(null);\n // Live pointer position (viewport coords) tracked for the whole drag via a\n // window listener. `useMove` only reports deltas, but the ancestor-handoff gate\n // needs the actual cursor (not the dragged widget's top-left anchor, which sits\n // above the cursor by the grab offset) so a nested board hands off to its\n // ancestor only once the *pointer* truly leaves the container widget. Null for\n // keyboard drags (no pointer) and until the first pointer move.\n const pointerPosRef = useRef<{ x: number; y: number } | null>(null);\n const [dragState, setDragStateInternal] = useState<BoardDragState | null>(\n null,\n );\n\n const setDragState = useCallback((next: BoardDragState | null) => {\n dragStateRef.current = next;\n setDragStateInternal(next);\n }, []);\n\n // Record the live cursor for the ancestor-handoff gate (see `pointerPosRef`).\n // Capture phase so it lands before `useMove`'s own window listeners drive the\n // frame's `onDragMove`.\n const trackPointer = useCallback((e: PointerEvent) => {\n pointerPosRef.current = { x: e.clientX, y: e.clientY };\n }, []);\n\n // Safety net: drop the window listener if the hook unmounts mid-drag.\n useEffect(\n () => () => window.removeEventListener('pointermove', trackPointer, true),\n [trackPointer],\n );\n\n const registerBoard = useCallback((entry: BoardEntry) => {\n boardsRef.current.set(entry.id, entry);\n return () => {\n // Only remove if a newer board instance hasn't already taken over this id\n // (boards can remount when their host widget is relocated, e.g. dragged).\n if (boardsRef.current.get(entry.id) === entry) {\n boardsRef.current.delete(entry.id);\n }\n };\n }, []);\n\n // Geometry frozen at drag start; falls back to the live rect for boards that\n // mount (or become visible) mid-drag. A board hidden at drag start - e.g. a\n // board inside an inactive tab - has a degenerate (0x0) frozen rect; ignore\n // it and read the live rect instead, freezing that first real measurement so\n // later frames stay stable (no preview feedback loop). This lets a tab board\n // revealed by a spring-loaded tab switch become a valid drop/landing target.\n const getBoardRect = useCallback((entry: BoardEntry): DOMRect | null => {\n const frozen = frozenRectsRef.current.get(entry.id);\n if (frozen && frozen.width > 0 && frozen.height > 0) return frozen;\n\n const live = entry.getContentRect();\n if (live && live.width > 0 && live.height > 0) {\n frozenRectsRef.current.set(entry.id, live);\n return live;\n }\n\n return frozen ?? live;\n }, []);\n\n /** True when board `outer` DOM-contains board `inner` (outer is an ancestor). */\n const isAncestorBoard = useCallback(\n (outer: BoardEntry, inner: BoardEntry): boolean => {\n const outerNode = outer.getContentNode();\n const innerNode = inner.getContentNode();\n return !!outerNode && !!innerNode && outerNode.contains(innerNode);\n },\n [],\n );\n\n /**\n * Viewport rect of the widget host a nested board lives in, or null for a\n * top-level board. Lets a drag stay anchored to a nested board while the anchor\n * is still within its container widget (e.g. over a Tabs header sitting above\n * the board), so an ancestor board does not reflow prematurely.\n */\n const getBoardContainerRect = useCallback(\n (entry: BoardEntry): DOMRect | null => {\n const host = entry\n .getContentNode()\n ?.parentElement?.closest<HTMLElement>('[data-board-widget-host]');\n return host?.getBoundingClientRect() ?? null;\n },\n [],\n );\n\n /** Whether a point falls within a rect (inclusive of edges). */\n const pointInRect = useCallback(\n (point: { x: number; y: number }, rect: DOMRect): boolean =>\n point.x >= rect.left &&\n point.x <= rect.right &&\n point.y >= rect.top &&\n point.y <= rect.bottom,\n [],\n );\n\n /** Find the most-nested droppable board whose content rect contains a point. */\n const hitTest = useCallback(\n (point: { x: number; y: number }): BoardEntry | null => {\n let best: BoardEntry | null = null;\n let bestArea = Infinity;\n\n // During a pointer drag the dragged widget (and any board nested inside it)\n // lives in the overlay portal. Such boards must never be drop targets -\n // dropping a widget into a board nested within itself would remove it from\n // the tree that renders that board.\n const overlay = overlayRef.current;\n\n boardsRef.current.forEach((entry) => {\n if (!entry.isDroppable()) return;\n if (nestedInDraggedRef.current.has(entry.id)) return;\n if (overlay && overlay.contains(entry.getContentNode())) return;\n // Skip boards that are currently hidden - e.g. the board inside an\n // inactive tab after a spring-loaded tab switch. Such a board keeps the\n // frozen rect it had while visible, which would otherwise shadow the\n // sibling board now shown in the exact same screen area (tabs share it),\n // trapping the drag in the hidden board. A hidden element reports a\n // zero-sized live rect, so use that as the visibility gate while still\n // reading geometry from the frozen rect (no preview feedback loop).\n const liveRect = entry.getContentRect();\n if (!liveRect || liveRect.width === 0 || liveRect.height === 0) return;\n const rect = getBoardRect(entry);\n if (!rect) return;\n if (\n point.x >= rect.left &&\n point.x <= rect.right &&\n point.y >= rect.top &&\n point.y <= rect.bottom\n ) {\n const area = rect.width * rect.height;\n if (area < bestArea) {\n bestArea = area;\n best = entry;\n }\n }\n });\n\n return best;\n },\n [getBoardRect],\n );\n\n const onDragStart = useEvent(\n (\n boardId: string,\n itemId: string,\n rect: ViewportRect,\n pointerType: string,\n widgetNode: HTMLElement | null,\n ) => {\n const entry = boardsRef.current.get(boardId);\n const item = entry ? getLayoutItem(entry.getLayout(), itemId) : undefined;\n if (!entry || !item) return;\n\n // Record boards nested inside the dragged widget so they are never picked\n // as a drop target (dropping a widget into a board nested within itself\n // would unmount it). Computed here, before the widget floats into the\n // overlay, while its nested boards are still in-grid descendants.\n const nested = new Set<string>();\n if (widgetNode) {\n boardsRef.current.forEach((e) => {\n const node = e.getContentNode();\n if (node && widgetNode.contains(node)) nested.add(e.id);\n });\n }\n nestedInDraggedRef.current = nested;\n\n // Freeze every board's geometry for the whole gesture so live-reflow\n // preview writes can't move the rects selection/landing read.\n const frozen = new Map<string, DOMRect>();\n boardsRef.current.forEach((e) => {\n const r = e.getContentRect();\n if (r) frozen.set(e.id, r);\n });\n frozenRectsRef.current = frozen;\n\n affectedRef.current = new Set([boardId]);\n sourceSnapshotRef.current = cloneLayout(entry.getLayout());\n previewRef.current = null;\n lastLandingRef.current = { x: item.x, y: item.y };\n // Start tracking the live cursor for the ancestor-handoff gate. Keyboard\n // drags have no pointer, so the gate falls back to the widget anchor.\n pointerPosRef.current = null;\n if (pointerType !== 'keyboard') {\n window.addEventListener('pointermove', trackPointer, true);\n }\n // Layout-item constraints win; otherwise fall back to the ones declared on\n // the owning `Board.Widget` so position constraints apply during drag.\n const draggedItem: LayoutItem = {\n ...item,\n constraints: item.constraints ?? store.get(itemId)?.constraints,\n };\n const next: BoardDragState = {\n sourceBoardId: boardId,\n currentBoardId: boardId,\n itemId,\n item: draggedItem,\n rect,\n pointerType,\n nestedBoardIds: nested,\n };\n setDragState(next);\n entry.setPlaceholder({ ...item });\n },\n );\n\n /** Compute the constrained landing position of an item on a target board. */\n const computeLanding = useCallback(\n (\n target: BoardEntry,\n item: LayoutItem,\n rect: ViewportRect,\n ): { x: number; y: number } => {\n const pp = target.getPositionParams();\n const contentRect = getBoardRect(target);\n const localLeft = rect.left - (contentRect?.left ?? 0);\n const localTop = rect.top - (contentRect?.top ?? 0);\n const raw = calcXYRaw(pp, localTop, localLeft);\n\n return applyPositionConstraints(\n target.getConstraints(),\n item,\n raw.x,\n raw.y,\n {\n cols: pp.cols,\n maxRows: target.getMaxRows(),\n containerWidth: pp.containerWidth,\n containerHeight: target.getContainerHeight(),\n rowHeight: pp.rowHeight,\n margin: pp.margin,\n layout: target.getLayout(),\n },\n );\n },\n [getBoardRect],\n );\n\n const moveWithinBoard = useCallback(\n (entry: BoardEntry, item: LayoutItem, x: number, y: number) => {\n const pp = entry.getPositionParams();\n const compactor = entry.getCompactor();\n const layout = entry.getLayout();\n const live = getLayoutItem(layout, item.i);\n const working = live ? [...layout] : [...layout, { ...item, x, y }];\n const target = getLayoutItem(working, item.i);\n if (!target) return;\n\n const moved = moveElement(\n working,\n target,\n x,\n y,\n true,\n compactor.preventCollision,\n compactor.type,\n pp.cols,\n compactor.allowOverlap,\n );\n const compacted = [...compactor.compact(moved, pp.cols)];\n entry.applyLayout(compacted, false);\n entry.setPlaceholder(getLayoutItem(compacted, item.i) ?? null);\n },\n [],\n );\n\n /**\n * Live cross-board reflow preview. Pushes the target board's *other* widgets\n * aside to make room for the incoming item, without ever adding the dragged\n * item's host to the target (it stays visualized as a placeholder + overlay\n * clone, and its gesture host remains mounted in the source board).\n *\n * Continuity: the working layout (including the incoming item) is carried\n * across frames via `previewRef`, so a small pointer movement moves the item\n * one step and reflows the neighbours incrementally - identical to an in-board\n * drag. Recomputing from the clean snapshot every frame instead lets\n * `moveElement`/compaction sink the item to the bottom of an occupied column\n * (the \"pushed too far below\" bug). On (re-)entry the working layout is seeded\n * from a *clone* of the snapshot so the stored snapshot is never mutated.\n */\n const previewOnTarget = useCallback(\n (target: BoardEntry, item: LayoutItem, x: number, y: number) => {\n const pp = target.getPositionParams();\n const compactor = target.getCompactor();\n\n const carried =\n previewRef.current?.boardId === target.id\n ? previewRef.current.working\n : null;\n const base = (\n carried ??\n cloneLayout(\n targetSnapshotsRef.current.get(target.id) ?? target.getLayout(),\n )\n ).filter((l) => l.i !== item.i);\n\n // Reuse the item's carried position as the move origin (continuity). On\n // first entry there is none, so seed it just above (or left of) its target\n // cell: that makes the first `moveElement` an *active* placement (never a\n // no-op) that pushes colliding widgets aside instead of the item sinking.\n const prevItem = carried ? getLayoutItem(carried, item.i) : undefined;\n const dragged: LayoutItem = prevItem\n ? { ...prevItem }\n : compactor.type === 'horizontal'\n ? { ...item, x: Math.max(0, x) - 1, y }\n : { ...item, x, y: Math.max(0, y) - 1 };\n const working = [...base, dragged];\n\n const moved = moveElement(\n working,\n dragged,\n x,\n y,\n true,\n compactor.preventCollision,\n compactor.type,\n pp.cols,\n compactor.allowOverlap,\n );\n const compacted = [...compactor.compact(moved, pp.cols)];\n previewRef.current = { boardId: target.id, working: compacted };\n\n const landed = getLayoutItem(compacted, item.i) ?? { ...item, x, y };\n // Apply only the other widgets so the dragged item is never rendered as a\n // host on the target board.\n target.applyLayout(\n compacted.filter((l) => l.i !== item.i),\n false,\n );\n target.setPlaceholder({ ...landed });\n },\n [],\n );\n\n const onDragMove = useEvent(\n (deltaX: number, deltaY: number, _pointerType: string) => {\n const ds = dragStateRef.current;\n if (!ds) return;\n\n const newRect: ViewportRect = {\n ...ds.rect,\n left: ds.rect.left + deltaX,\n top: ds.rect.top + deltaY,\n };\n\n const source = boardsRef.current.get(ds.sourceBoardId);\n // Hit-test with the widget's center so a board opens as soon as the center\n // enters it (see `rectCenter`). The landing still resolves from the grabbed\n // top-left, which is this center offset by the widget's own size, so the\n // placeholder keeps tracking the floating overlay. Fall back to the source\n // board so a pointer outside every board keeps the widget anchored to where\n // it came from. Frozen rects make this deterministic (no preview-induced\n // flip-flop).\n const anchor = rectCenter(newRect);\n let target = hitTest(anchor) ?? source ?? null;\n\n // Keep the drag on a nested source board while the cursor is still within\n // the widget that hosts it, instead of handing off to an ancestor board.\n // Hit-testing anchors on the dragged widget's top-left corner, which sits\n // above the cursor by the grab offset, so nudging a widget up inside a\n // nested board (e.g. toward a Tabs header above it) pushes that anchor into\n // the ancestor's area while the pointer is still over the container. Gating\n // on the real cursor (not the anchor) means the ancestor only reflows once\n // the pointer truly leaves the container widget - no transient shift.\n // Cross-tab / sibling boards are unaffected: they are not ancestors of the\n // source, so a real move out still hands off normally.\n if (\n target &&\n source &&\n target.id !== source.id &&\n isAncestorBoard(target, source)\n ) {\n const containerRect = getBoardContainerRect(source);\n const gatePoint = pointerPosRef.current ?? anchor;\n if (containerRect && pointInRect(gatePoint, containerRect)) {\n target = source;\n }\n }\n\n if (!target) {\n setDragState({ ...ds, rect: newRect });\n return;\n }\n\n const { x, y } = computeLanding(target, ds.item, newRect);\n lastLandingRef.current = { x, y };\n\n // Same board: run the live in-board preview (item stays owned by the\n // source, so its gesture host is never unmounted).\n if (target.id === ds.sourceBoardId) {\n if (ds.currentBoardId !== ds.sourceBoardId) {\n // Returning from another board: restore that board's pushed widgets\n // to their pre-hover arrangement and clear its placeholder.\n const prev = boardsRef.current.get(ds.currentBoardId);\n const snap = targetSnapshotsRef.current.get(ds.currentBoardId);\n if (snap) prev?.applyLayout(cloneLayout(snap), false);\n prev?.setPlaceholder(null);\n previewRef.current = null;\n }\n moveWithinBoard(target, ds.item, x, y);\n setDragState({\n ...ds,\n currentBoardId: ds.sourceBoardId,\n rect: newRect,\n });\n return;\n }\n\n // Cross-board: preview the transfer live by pushing the target board's\n // other widgets aside (see `previewOnTarget`). The dragged item's host\n // stays mounted in the source board for the entire drag; the actual\n // transfer is committed on drop.\n if (ds.currentBoardId !== target.id) {\n const prev = boardsRef.current.get(ds.currentBoardId);\n if (ds.currentBoardId === ds.sourceBoardId) {\n // Leaving the source: restore it to its pre-drag arrangement.\n prev?.applyLayout(cloneLayout(sourceSnapshotRef.current), false);\n } else {\n // Leaving another target board: restore its pushed widgets.\n const snap = targetSnapshotsRef.current.get(ds.currentBoardId);\n if (snap) prev?.applyLayout(cloneLayout(snap), false);\n }\n prev?.setPlaceholder(null);\n // Drop the carried working layout so the newly entered target seeds a\n // fresh preview from its own clean snapshot.\n previewRef.current = null;\n\n // Snapshot the newly entered target once, as the stable base for its\n // reflow preview.\n if (!targetSnapshotsRef.current.has(target.id)) {\n targetSnapshotsRef.current.set(\n target.id,\n cloneLayout(target.getLayout()),\n );\n }\n }\n\n previewOnTarget(target, ds.item, x, y);\n affectedRef.current.add(target.id);\n setDragState({ ...ds, currentBoardId: target.id, rect: newRect });\n },\n );\n\n const onDragEnd = useEvent(() => {\n window.removeEventListener('pointermove', trackPointer, true);\n pointerPosRef.current = null;\n const ds = dragStateRef.current;\n if (!ds) return;\n\n const source = boardsRef.current.get(ds.sourceBoardId);\n const target = boardsRef.current.get(ds.currentBoardId);\n const droppedInSource = !target || target.id === ds.sourceBoardId;\n\n if (droppedInSource) {\n // Commit a freshly compacted source so the result never depends on the\n // last preview frame (which may have been mid-reflow).\n if (source) {\n const sp = source.getPositionParams();\n const sc = source.getCompactor();\n source.applyLayout([...sc.compact(source.getLayout(), sp.cols)], true);\n }\n } else {\n const landing = lastLandingRef.current ?? { x: ds.item.x, y: ds.item.y };\n\n // Remove the item from the source board and compact.\n if (source) {\n const sp = source.getPositionParams();\n const sc = source.getCompactor();\n const remaining = source.getLayout().filter((l) => l.i !== ds.itemId);\n source.applyLayout([...sc.compact(remaining, sp.cols)], true);\n }\n\n const tp = target!.getPositionParams();\n const tc = target!.getCompactor();\n\n // Prefer committing the exact arrangement the user was previewing (item\n // already placed with the neighbours reflowed around it via continuity).\n const carried =\n previewRef.current?.boardId === target!.id &&\n getLayoutItem(previewRef.current.working, ds.itemId)\n ? previewRef.current.working\n : null;\n\n let finalLayout: LayoutItem[];\n if (carried) {\n finalLayout = [...tc.compact(cloneLayout(carried), tp.cols)];\n } else {\n // No preview frame ran (e.g. a teleport drop). Seed the item just above\n // (or left of) its landing cell so `moveElement` actively places it\n // rather than no-opping and letting compaction sink it to the bottom.\n const newItem: LayoutItem =\n tc.type === 'horizontal'\n ? { ...ds.item, x: Math.max(0, landing.x) - 1, y: landing.y }\n : { ...ds.item, x: landing.x, y: Math.max(0, landing.y) - 1 };\n const base = [\n ...cloneLayout(\n (\n targetSnapshotsRef.current.get(target!.id) ?? target!.getLayout()\n ).filter((l) => l.i !== ds.itemId),\n ),\n newItem,\n ];\n const moved = moveElement(\n base,\n newItem,\n landing.x,\n landing.y,\n true,\n tc.preventCollision,\n tc.type,\n tp.cols,\n tc.allowOverlap,\n );\n finalLayout = [...tc.compact(moved, tp.cols)];\n }\n target!.applyLayout(finalLayout, true);\n\n // Signal the transfer so a controlled app can move the widget's\n // declaration into the destination container (positions are already\n // reported via each board's onLayoutChange).\n onTransferRef.current?.({\n widgetId: ds.itemId,\n fromBoardId: ds.sourceBoardId,\n toBoardId: target!.id,\n item: getLayoutItem(finalLayout, ds.itemId) ?? {\n ...ds.item,\n x: landing.x,\n y: landing.y,\n },\n });\n }\n\n const ids = new Set(affectedRef.current);\n ids.add(ds.sourceBoardId);\n ids.add(ds.currentBoardId);\n ids.forEach((id) => boardsRef.current.get(id)?.setPlaceholder(null));\n\n affectedRef.current.clear();\n sourceSnapshotRef.current = [];\n targetSnapshotsRef.current.clear();\n frozenRectsRef.current.clear();\n nestedInDraggedRef.current = new Set();\n previewRef.current = null;\n lastLandingRef.current = null;\n setDragState(null);\n });\n\n return useMemo(\n () => ({\n store,\n overlayRef,\n registerBoard,\n onDragStart,\n onDragMove,\n onDragEnd,\n dragState,\n }),\n [store, registerBoard, onDragStart, onDragMove, onDragEnd, dragState],\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-board-registry.js","names":[],"sources":["../../../../src/components/layout/Board/use-board-registry.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nimport {\n BoardDragState,\n BoardEntry,\n BoardRegistryContextValue,\n ViewportRect,\n WidgetTransferInfo,\n} from './board-context';\nimport { BoardWidgetStore } from './board-store';\nimport {\n applyPositionConstraints,\n bottom,\n calcXYRaw,\n cloneLayout,\n collides,\n getLayoutItem,\n LayoutItem,\n moveElement,\n} from './grid-core';\n\n/**\n * The dragged widget's center in viewport coordinates.\n *\n * This is the anchor the drop-target hit-test uses to pick which board a drag is\n * over, so a board (including an empty one) opens as soon as the widget's center\n * enters it rather than only once its whole top-left corner is inside.\n *\n * The landing itself stays anchored to the grabbed top-left (`rect.left/top` in\n * `computeLanding`): that point is this center offset by the widget's own fixed\n * pixel size, so the resolved landing cell keeps corresponding to where the\n * floating overlay clone is drawn (see `WidgetHost`) and the placeholder keeps\n * tracking the ghost. The only unavoidable divergence is while the widget\n * physically overhangs a board edge - a placeholder cannot render outside row 0\n * / column 0 - which is the accepted tradeoff for opening on the center.\n */\nfunction rectCenter(rect: ViewportRect): { x: number; y: number } {\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n}\n\n/**\n * Canonical key for the unordered pair `{id1, id2}`. Widget ids are unrestricted\n * strings, so a naive `` `${id1}|${id2}` `` join is ambiguous - an id containing\n * the delimiter lets two different pairs collide (e.g. `{\"a|b\",\"c\"}` and\n * `{\"a\",\"b|c\"}` both yield `\"a|b|c\"`). `JSON.stringify` of the sorted tuple\n * quotes and escapes each id, so distinct pairs always produce distinct keys.\n */\nfunction pairKey(id1: string, id2: string): string {\n return id1 < id2 ? JSON.stringify([id1, id2]) : JSON.stringify([id2, id1]);\n}\n\n/**\n * Keys of every overlapping pair in the layout (see `pairKey`), so two layouts'\n * overlap sets can be compared to tell which overlaps a move *introduced* versus\n * which already existed.\n */\nfunction overlappingPairs(layout: LayoutItem[]): Set<string> {\n const pairs = new Set<string>();\n for (let i = 0; i < layout.length; i++) {\n for (let j = i + 1; j < layout.length; j++) {\n const a = layout[i];\n const b = layout[j];\n if (collides(a, b)) {\n pairs.add(pairKey(a.i, b.i));\n }\n }\n }\n return pairs;\n}\n\n/**\n * Whether `after` contains an overlapping pair that `before` did not. Used to\n * reject only moves that *create* a new stack. A board may already hold\n * overlapping widgets - a `compact={null}` layout is never gap-compacted, and an\n * app can supply overlapping items directly (or toggle `allowOverlap` off after\n * stacking) - and those pre-existing overlaps must not freeze every subsequent\n * move by making a whole-layout collision check always true.\n */\nfunction hasNewOverlap(before: Set<string>, after: LayoutItem[]): boolean {\n const afterPairs = overlappingPairs(after);\n for (const key of afterPairs) {\n if (!before.has(key)) return true;\n }\n return false;\n}\n\n/**\n * First position at or below the preferred cell where `item` fits without\n * overlapping any of `others` (assumed overlap-free), scanning left-to-right\n * then top-to-bottom, never past `maxRows`. Last-resort placement for a legacy\n * (no-op compaction) cross-board drop that would otherwise stack widgets.\n *\n * A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path\n * applies (`clamp(y, 0, maxRows - h)`): the widget's bottom edge (`y + h`) stays\n * within the row limit even when the landing cell is blocked, so the downward\n * scan can't push it off the board. Rows are searched from the (clamped) landing\n * row down to the limit first, then upward toward the top; if the whole valid\n * band is full the widget is clamped to the limit (bounds win over overlap, as\n * `gridBounds` does). With an unbounded `maxRows` there is always a free slot\n * below every existing item, so the downward scan terminates on its own.\n */\nfunction placeInFreeSlot(\n others: LayoutItem[],\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 * Cross-board drag orchestration.\n *\n * Owns the shared widget-content store, the drag overlay ref, and the registry\n * of boards. Handles moving an item inside a board and transferring it between\n * boards (including nested ones) by hit-testing the pointer against each board's\n * content rectangle.\n */\nexport interface UseBoardRegistryOptions {\n /** Fired when a widget is dropped from one board into another. */\n onWidgetTransfer?: (info: WidgetTransferInfo) => void;\n}\n\nexport function useBoardRegistry(\n options?: UseBoardRegistryOptions,\n): BoardRegistryContextValue {\n const store = useMemo(() => new BoardWidgetStore(), []);\n // Latest transfer callback, read from a ref so the stable `onDragEnd` handler\n // always calls the current one without re-creating the registry.\n const onTransferRef = useRef(options?.onWidgetTransfer);\n onTransferRef.current = options?.onWidgetTransfer;\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const boardsRef = useRef<Map<string, BoardEntry>>(new Map());\n const dragStateRef = useRef<BoardDragState | null>(null);\n const affectedRef = useRef<Set<string>>(new Set());\n // Snapshot of the source board's layout at drag start, used to restore the\n // source when the pointer leaves it (the dragged item is never removed from\n // the source mid-drag, so its gesture host stays mounted).\n const sourceSnapshotRef = useRef<LayoutItem[]>([]);\n // Snapshot of each visited target board's layout at the moment the pointer\n // first entered it. Used to restore a board when the pointer leaves it, and as\n // the clean seed for the reflow preview on (re-)entry. Never mutated.\n const targetSnapshotsRef = useRef<Map<string, LayoutItem[]>>(new Map());\n // The current target board's live working layout (including the incoming\n // item). Carried across frames so small pointer movements reflow the board\n // incrementally - exactly like an in-board drag - instead of recomputing from\n // scratch each frame (which lets collision resolution sink the item to the\n // bottom of an occupied column).\n const previewRef = useRef<{ boardId: string; working: LayoutItem[] } | null>(\n null,\n );\n // Board content rects captured at drag start. Reading geometry from here (not\n // live getBoundingClientRect) means the live-reflow preview can't move the\n // rects that selection/landing depend on -> no feedback loop.\n const frozenRectsRef = useRef<Map<string, DOMRect>>(new Map());\n // Ids of boards nested inside the dragged widget, captured at drag start.\n // Such a board must never be a drop target: dropping a widget into a board\n // nested within itself removes it from the tree that renders that board.\n // The overlay-containment check in `hitTest` only catches these once the\n // dragged widget has floated into the overlay, but `useMove` fires the first\n // `onMove` synchronously with `onMoveStart` (before React relocates the\n // widget into the overlay), so on a tiny one-move drag the nested board is\n // still in-grid and would be selected. Excluding these ids for the whole\n // gesture closes that window.\n const nestedInDraggedRef = useRef<Set<string>>(new Set());\n // Last landing position computed for the current target board (grid units).\n const lastLandingRef = useRef<{ x: number; y: number } | null>(null);\n // Live pointer position (viewport coords) tracked for the whole drag via a\n // window listener. `useMove` only reports deltas, but the ancestor-handoff gate\n // needs the actual cursor (not the dragged widget's top-left anchor, which sits\n // above the cursor by the grab offset) so a nested board hands off to its\n // ancestor only once the *pointer* truly leaves the container widget. Null for\n // keyboard drags (no pointer) and until the first pointer move.\n const pointerPosRef = useRef<{ x: number; y: number } | null>(null);\n const [dragState, setDragStateInternal] = useState<BoardDragState | null>(\n null,\n );\n\n const setDragState = useCallback((next: BoardDragState | null) => {\n dragStateRef.current = next;\n setDragStateInternal(next);\n }, []);\n\n // Record the live cursor for the ancestor-handoff gate (see `pointerPosRef`).\n // Capture phase so it lands before `useMove`'s own window listeners drive the\n // frame's `onDragMove`.\n const trackPointer = useCallback((e: PointerEvent) => {\n pointerPosRef.current = { x: e.clientX, y: e.clientY };\n }, []);\n\n // Safety net: drop the window listener if the hook unmounts mid-drag.\n useEffect(\n () => () => window.removeEventListener('pointermove', trackPointer, true),\n [trackPointer],\n );\n\n const registerBoard = useCallback((entry: BoardEntry) => {\n boardsRef.current.set(entry.id, entry);\n return () => {\n // Only remove if a newer board instance hasn't already taken over this id\n // (boards can remount when their host widget is relocated, e.g. dragged).\n if (boardsRef.current.get(entry.id) === entry) {\n boardsRef.current.delete(entry.id);\n }\n };\n }, []);\n\n // Geometry frozen at drag start; falls back to the live rect for boards that\n // mount (or become visible) mid-drag. A board hidden at drag start - e.g. a\n // board inside an inactive tab - has a degenerate (0x0) frozen rect; ignore\n // it and read the live rect instead, freezing that first real measurement so\n // later frames stay stable (no preview feedback loop). This lets a tab board\n // revealed by a spring-loaded tab switch become a valid drop/landing target.\n const getBoardRect = useCallback((entry: BoardEntry): DOMRect | null => {\n const frozen = frozenRectsRef.current.get(entry.id);\n if (frozen && frozen.width > 0 && frozen.height > 0) return frozen;\n\n const live = entry.getContentRect();\n if (live && live.width > 0 && live.height > 0) {\n frozenRectsRef.current.set(entry.id, live);\n return live;\n }\n\n return frozen ?? live;\n }, []);\n\n /** True when board `outer` DOM-contains board `inner` (outer is an ancestor). */\n const isAncestorBoard = useCallback(\n (outer: BoardEntry, inner: BoardEntry): boolean => {\n const outerNode = outer.getContentNode();\n const innerNode = inner.getContentNode();\n return !!outerNode && !!innerNode && outerNode.contains(innerNode);\n },\n [],\n );\n\n /**\n * Viewport rect of the widget host a nested board lives in, or null for a\n * top-level board. Lets a drag stay anchored to a nested board while the anchor\n * is still within its container widget (e.g. over a Tabs header sitting above\n * the board), so an ancestor board does not reflow prematurely.\n */\n const getBoardContainerRect = useCallback(\n (entry: BoardEntry): DOMRect | null => {\n const host = entry\n .getContentNode()\n ?.parentElement?.closest<HTMLElement>('[data-board-widget-host]');\n return host?.getBoundingClientRect() ?? null;\n },\n [],\n );\n\n /** Whether a point falls within a rect (inclusive of edges). */\n const pointInRect = useCallback(\n (point: { x: number; y: number }, rect: DOMRect): boolean =>\n point.x >= rect.left &&\n point.x <= rect.right &&\n point.y >= rect.top &&\n point.y <= rect.bottom,\n [],\n );\n\n /** Find the most-nested droppable board whose content rect contains a point. */\n const hitTest = useCallback(\n (point: { x: number; y: number }): BoardEntry | null => {\n let best: BoardEntry | null = null;\n let bestArea = Infinity;\n\n // During a pointer drag the dragged widget (and any board nested inside it)\n // lives in the overlay portal. Such boards must never be drop targets -\n // dropping a widget into a board nested within itself would remove it from\n // the tree that renders that board.\n const overlay = overlayRef.current;\n\n boardsRef.current.forEach((entry) => {\n if (!entry.isDroppable()) return;\n if (nestedInDraggedRef.current.has(entry.id)) return;\n if (overlay && overlay.contains(entry.getContentNode())) return;\n // Skip boards that are currently hidden - e.g. the board inside an\n // inactive tab after a spring-loaded tab switch. Such a board keeps the\n // frozen rect it had while visible, which would otherwise shadow the\n // sibling board now shown in the exact same screen area (tabs share it),\n // trapping the drag in the hidden board. A hidden element reports a\n // zero-sized live rect, so use that as the visibility gate while still\n // reading geometry from the frozen rect (no preview feedback loop).\n const liveRect = entry.getContentRect();\n if (!liveRect || liveRect.width === 0 || liveRect.height === 0) return;\n const rect = getBoardRect(entry);\n if (!rect) return;\n if (\n point.x >= rect.left &&\n point.x <= rect.right &&\n point.y >= rect.top &&\n point.y <= rect.bottom\n ) {\n const area = rect.width * rect.height;\n if (area < bestArea) {\n bestArea = area;\n best = entry;\n }\n }\n });\n\n return best;\n },\n [getBoardRect],\n );\n\n const onDragStart = useEvent(\n (\n boardId: string,\n itemId: string,\n rect: ViewportRect,\n pointerType: string,\n widgetNode: HTMLElement | null,\n ) => {\n const entry = boardsRef.current.get(boardId);\n const item = entry ? getLayoutItem(entry.getLayout(), itemId) : undefined;\n if (!entry || !item) return;\n\n // Record boards nested inside the dragged widget so they are never picked\n // as a drop target (dropping a widget into a board nested within itself\n // would unmount it). Computed here, before the widget floats into the\n // overlay, while its nested boards are still in-grid descendants.\n const nested = new Set<string>();\n if (widgetNode) {\n boardsRef.current.forEach((e) => {\n const node = e.getContentNode();\n if (node && widgetNode.contains(node)) nested.add(e.id);\n });\n }\n nestedInDraggedRef.current = nested;\n\n // Freeze every board's geometry for the whole gesture so live-reflow\n // preview writes can't move the rects selection/landing read.\n const frozen = new Map<string, DOMRect>();\n boardsRef.current.forEach((e) => {\n const r = e.getContentRect();\n if (r) frozen.set(e.id, r);\n });\n frozenRectsRef.current = frozen;\n\n affectedRef.current = new Set([boardId]);\n sourceSnapshotRef.current = cloneLayout(entry.getLayout());\n previewRef.current = null;\n lastLandingRef.current = { x: item.x, y: item.y };\n // Start tracking the live cursor for the ancestor-handoff gate. Keyboard\n // drags have no pointer, so the gate falls back to the widget anchor.\n pointerPosRef.current = null;\n if (pointerType !== 'keyboard') {\n window.addEventListener('pointermove', trackPointer, true);\n }\n // Layout-item constraints win; otherwise fall back to the ones declared on\n // the owning `Board.Widget` so position constraints apply during drag.\n const draggedItem: LayoutItem = {\n ...item,\n constraints: item.constraints ?? store.get(itemId)?.constraints,\n };\n const next: BoardDragState = {\n sourceBoardId: boardId,\n currentBoardId: boardId,\n itemId,\n item: draggedItem,\n rect,\n pointerType,\n nestedBoardIds: nested,\n };\n setDragState(next);\n entry.setPlaceholder({ ...item });\n },\n );\n\n /** Compute the constrained landing position of an item on a target board. */\n const computeLanding = useCallback(\n (\n target: BoardEntry,\n item: LayoutItem,\n rect: ViewportRect,\n ): { x: number; y: number } => {\n const pp = target.getPositionParams();\n const contentRect = getBoardRect(target);\n const localLeft = rect.left - (contentRect?.left ?? 0);\n const localTop = rect.top - (contentRect?.top ?? 0);\n const raw = calcXYRaw(pp, localTop, localLeft);\n\n return applyPositionConstraints(\n target.getConstraints(),\n item,\n raw.x,\n raw.y,\n {\n cols: pp.cols,\n maxRows: target.getMaxRows(),\n containerWidth: pp.containerWidth,\n containerHeight: target.getContainerHeight(),\n rowHeight: pp.rowHeight,\n margin: pp.margin,\n layout: target.getLayout(),\n },\n );\n },\n [getBoardRect],\n );\n\n const moveWithinBoard = useCallback(\n (entry: BoardEntry, item: LayoutItem, x: number, y: number) => {\n const pp = entry.getPositionParams();\n const compactor = entry.getCompactor();\n const layout = entry.getLayout();\n const live = getLayoutItem(layout, item.i);\n // Deep-clone so `moveElement` (which mutates item objects in place) never\n // touches the live layout's items. A shallow copy shares those objects, so\n // rejecting a frame below would still leave the live layout mutated into\n // the overlapping arrangement (committed on drop). `moveWithKeyboard`\n // clones for the same reason.\n const working = live\n ? cloneLayout(layout)\n : [...cloneLayout(layout), { ...item, x, y }];\n const target = getLayoutItem(working, item.i);\n if (!target) return;\n\n const moved = moveElement(\n working,\n target,\n x,\n y,\n true,\n compactor.preventCollision,\n compactor.type,\n pp.cols,\n compactor.allowOverlap,\n );\n const compacted = [...compactor.compact(moved, pp.cols)];\n // Never commit a frame that *creates* a stack. In the legacy\n // (`compact={null}`) mode `moveElement` pushes colliding neighbours but the\n // no-op compactor leaves any residual overlap in place, so a push can drop\n // a neighbour on top of another widget. Skipping such frames keeps the\n // dragged widget at its last valid arrangement until the pointer reaches a\n // slot where the move (and any push) resolves cleanly - matching the\n // keyboard path. Only *newly introduced* overlaps block: pre-existing ones\n // (an app-supplied stacked layout) must not freeze the drag. `allowOverlap`\n // opts out entirely.\n if (\n !compactor.allowOverlap &&\n hasNewOverlap(overlappingPairs(layout), compacted)\n ) {\n return;\n }\n entry.applyLayout(compacted, false);\n entry.setPlaceholder(getLayoutItem(compacted, item.i) ?? null);\n },\n [],\n );\n\n /**\n * Move a widget by one logical keyboard step. Unlike pointer movement, this\n * starts from the live grid coordinates rather than DOM geometry and scans\n * farther in the requested direction when the adjacent slot cannot produce a\n * valid move.\n */\n const moveWithKeyboard = useCallback(\n (entry: BoardEntry, item: LayoutItem, deltaX: number, deltaY: number) => {\n const pp = entry.getPositionParams();\n const compactor = entry.getCompactor();\n const layout = entry.getLayout();\n const live = getLayoutItem(layout, item.i);\n if (!live) return;\n\n const directionX = Math.sign(deltaX);\n const directionY = Math.sign(deltaY);\n if (directionX === 0 && directionY === 0) return;\n\n const maxRows = entry.getMaxRows();\n const attempts =\n directionX < 0\n ? live.x\n : directionX > 0\n ? Math.max(0, pp.cols - live.w - live.x)\n : directionY < 0\n ? live.y\n : Number.isFinite(maxRows)\n ? Math.max(0, maxRows - live.h - live.y)\n : Math.max(1, bottom(layout) - live.y);\n const seen = new Set<string>();\n // Overlaps already present before the move: a candidate is only rejected\n // for a *new* pair, never for one the board already had (see\n // `hasNewOverlap`). Computed once - the baseline is constant across the\n // directional scan.\n const beforePairs = overlappingPairs(layout);\n\n for (let distance = 1; distance <= attempts; distance++) {\n const rawX = live.x + directionX * distance;\n const rawY = live.y + directionY * distance;\n const candidate = applyPositionConstraints(\n entry.getConstraints(),\n item,\n rawX,\n rawY,\n {\n cols: pp.cols,\n maxRows,\n containerWidth: pp.containerWidth,\n containerHeight: entry.getContainerHeight(),\n rowHeight: pp.rowHeight,\n margin: pp.margin,\n layout,\n },\n );\n const candidateKey = `${candidate.x}:${candidate.y}`;\n if (seen.has(candidateKey)) continue;\n seen.add(candidateKey);\n\n // A custom constraint may jump farther than one cell. It is still a\n // valid candidate only when it advances in the requested direction and\n // does not introduce movement on the orthogonal axis.\n if (\n (directionX !== 0 &&\n (Math.sign(candidate.x - live.x) !== directionX ||\n candidate.y !== live.y)) ||\n (directionY !== 0 &&\n (Math.sign(candidate.y - live.y) !== directionY ||\n candidate.x !== live.x))\n ) {\n continue;\n }\n\n const working = cloneLayout(layout);\n const target = getLayoutItem(working, item.i);\n if (!target) return;\n const moved = moveElement(\n working,\n target,\n candidate.x,\n candidate.y,\n true,\n compactor.preventCollision,\n compactor.type,\n pp.cols,\n compactor.allowOverlap,\n );\n const compacted = [...compactor.compact(moved, pp.cols)];\n const landed = getLayoutItem(compacted, item.i);\n if (!landed) continue;\n\n const advanced =\n directionX !== 0\n ? Math.sign(landed.x - live.x) === directionX && landed.y === live.y\n : Math.sign(landed.y - live.y) === directionY &&\n landed.x === live.x;\n // Reject a candidate that *introduces* an overlapping pair. Checking\n // only the moved widget is not enough: in the legacy (`compact={null}`)\n // and `preventCollision` modes the compactor does not resolve overlaps,\n // so a *pushed neighbour* can land on top of another widget even when the\n // moved widget itself is clear. Comparing the whole layout's overlap set\n // against the pre-move baseline keeps arrow moves from creating a stack\n // while still allowing movement around overlaps the board already had.\n // The pointer path enforces the same invariant (see `moveWithinBoard`),\n // so both inputs push/swap when clean and block otherwise. `allowOverlap`\n // opts out entirely.\n const overlaps =\n !compactor.allowOverlap && hasNewOverlap(beforePairs, compacted);\n if (!advanced || overlaps) continue;\n\n entry.applyLayout(compacted, false);\n entry.setPlaceholder(landed);\n lastLandingRef.current = { x: landed.x, y: landed.y };\n return;\n }\n },\n [],\n );\n\n /**\n * Live cross-board reflow preview. Pushes the target board's *other* widgets\n * aside to make room for the incoming item, without ever adding the dragged\n * item's host to the target (it stays visualized as a placeholder + overlay\n * clone, and its gesture host remains mounted in the source board).\n *\n * Continuity: the working layout (including the incoming item) is carried\n * across frames via `previewRef`, so a small pointer movement moves the item\n * one step and reflows the neighbours incrementally - identical to an in-board\n * drag. Recomputing from the clean snapshot every frame instead lets\n * `moveElement`/compaction sink the item to the bottom of an occupied column\n * (the \"pushed too far below\" bug). On (re-)entry the working layout is seeded\n * from a *clone* of the snapshot so the stored snapshot is never mutated.\n */\n const previewOnTarget = useCallback(\n (target: BoardEntry, item: LayoutItem, x: number, y: number) => {\n const pp = target.getPositionParams();\n const compactor = target.getCompactor();\n\n const carried =\n previewRef.current?.boardId === target.id\n ? previewRef.current.working\n : null;\n // Deep-clone the base: `moveElement` mutates item objects in place, and a\n // rejected frame (see the overlap guard below) must not leave the carried\n // preview or the target's live layout mutated into an overlapping state.\n const base = cloneLayout(\n carried ??\n targetSnapshotsRef.current.get(target.id) ??\n target.getLayout(),\n ).filter((l) => l.i !== item.i);\n\n // Reuse the item's carried position as the move origin (continuity). On\n // first entry there is none, so seed it just above (or left of) its target\n // cell: that makes the first `moveElement` an *active* placement (never a\n // no-op) that pushes colliding widgets aside instead of the item sinking.\n const prevItem = carried ? getLayoutItem(carried, item.i) : undefined;\n const dragged: LayoutItem = prevItem\n ? { ...prevItem }\n : compactor.type === 'horizontal'\n ? { ...item, x: Math.max(0, x) - 1, y }\n : { ...item, x, y: Math.max(0, y) - 1 };\n const working = [...base, dragged];\n\n const moved = moveElement(\n working,\n dragged,\n x,\n y,\n true,\n compactor.preventCollision,\n compactor.type,\n pp.cols,\n compactor.allowOverlap,\n );\n const compacted = [...compactor.compact(moved, pp.cols)];\n // Skip a frame that would *newly* stack widgets on the target (see the same\n // guard in `moveWithinBoard`): keep the last valid preview instead of\n // committing an overlap the no-op compactor cannot resolve. The baseline is\n // the target's own widgets (`base`), so overlaps the target already had do\n // not block the incoming widget. `allowOverlap` opts out.\n if (\n !compactor.allowOverlap &&\n hasNewOverlap(overlappingPairs(base), compacted)\n ) {\n return;\n }\n previewRef.current = { boardId: target.id, working: compacted };\n\n const landed = getLayoutItem(compacted, item.i) ?? { ...item, x, y };\n // Apply only the other widgets so the dragged item is never rendered as a\n // host on the target board.\n target.applyLayout(\n compacted.filter((l) => l.i !== item.i),\n false,\n );\n target.setPlaceholder({ ...landed });\n },\n [],\n );\n\n const onDragMove = useEvent(\n (deltaX: number, deltaY: number, pointerType: string) => {\n const ds = dragStateRef.current;\n if (!ds) return;\n\n if (pointerType === 'keyboard') {\n const source = boardsRef.current.get(ds.sourceBoardId);\n if (source) moveWithKeyboard(source, ds.item, deltaX, deltaY);\n return;\n }\n\n const newRect: ViewportRect = {\n ...ds.rect,\n left: ds.rect.left + deltaX,\n top: ds.rect.top + deltaY,\n };\n\n const source = boardsRef.current.get(ds.sourceBoardId);\n // Hit-test with the widget's center so a board opens as soon as the center\n // enters it (see `rectCenter`). The landing still resolves from the grabbed\n // top-left, which is this center offset by the widget's own size, so the\n // placeholder keeps tracking the floating overlay. Fall back to the source\n // board so a pointer outside every board keeps the widget anchored to where\n // it came from. Frozen rects make this deterministic (no preview-induced\n // flip-flop).\n const anchor = rectCenter(newRect);\n let target = hitTest(anchor) ?? source ?? null;\n\n // Keep the drag on a nested source board while the cursor is still within\n // the widget that hosts it, instead of handing off to an ancestor board.\n // Hit-testing anchors on the dragged widget's top-left corner, which sits\n // above the cursor by the grab offset, so nudging a widget up inside a\n // nested board (e.g. toward a Tabs header above it) pushes that anchor into\n // the ancestor's area while the pointer is still over the container. Gating\n // on the real cursor (not the anchor) means the ancestor only reflows once\n // the pointer truly leaves the container widget - no transient shift.\n // Cross-tab / sibling boards are unaffected: they are not ancestors of the\n // source, so a real move out still hands off normally.\n if (\n target &&\n source &&\n target.id !== source.id &&\n isAncestorBoard(target, source)\n ) {\n const containerRect = getBoardContainerRect(source);\n const gatePoint = pointerPosRef.current ?? anchor;\n if (containerRect && pointInRect(gatePoint, containerRect)) {\n target = source;\n }\n }\n\n if (!target) {\n setDragState({ ...ds, rect: newRect });\n return;\n }\n\n const { x, y } = computeLanding(target, ds.item, newRect);\n lastLandingRef.current = { x, y };\n\n // Same board: run the live in-board preview (item stays owned by the\n // source, so its gesture host is never unmounted).\n if (target.id === ds.sourceBoardId) {\n if (ds.currentBoardId !== ds.sourceBoardId) {\n // Returning from another board: restore that board's pushed widgets\n // to their pre-hover arrangement and clear its placeholder.\n const prev = boardsRef.current.get(ds.currentBoardId);\n const snap = targetSnapshotsRef.current.get(ds.currentBoardId);\n if (snap) prev?.applyLayout(cloneLayout(snap), false);\n prev?.setPlaceholder(null);\n previewRef.current = null;\n }\n moveWithinBoard(target, ds.item, x, y);\n setDragState({\n ...ds,\n currentBoardId: ds.sourceBoardId,\n rect: newRect,\n });\n return;\n }\n\n // Cross-board: preview the transfer live by pushing the target board's\n // other widgets aside (see `previewOnTarget`). The dragged item's host\n // stays mounted in the source board for the entire drag; the actual\n // transfer is committed on drop.\n if (ds.currentBoardId !== target.id) {\n const prev = boardsRef.current.get(ds.currentBoardId);\n if (ds.currentBoardId === ds.sourceBoardId) {\n // Leaving the source: restore it to its pre-drag arrangement.\n prev?.applyLayout(cloneLayout(sourceSnapshotRef.current), false);\n } else {\n // Leaving another target board: restore its pushed widgets.\n const snap = targetSnapshotsRef.current.get(ds.currentBoardId);\n if (snap) prev?.applyLayout(cloneLayout(snap), false);\n }\n prev?.setPlaceholder(null);\n // Drop the carried working layout so the newly entered target seeds a\n // fresh preview from its own clean snapshot.\n previewRef.current = null;\n\n // Snapshot the newly entered target once, as the stable base for its\n // reflow preview.\n if (!targetSnapshotsRef.current.has(target.id)) {\n targetSnapshotsRef.current.set(\n target.id,\n cloneLayout(target.getLayout()),\n );\n }\n }\n\n previewOnTarget(target, ds.item, x, y);\n affectedRef.current.add(target.id);\n setDragState({ ...ds, currentBoardId: target.id, rect: newRect });\n },\n );\n\n const onDragEnd = useEvent(() => {\n window.removeEventListener('pointermove', trackPointer, true);\n pointerPosRef.current = null;\n const ds = dragStateRef.current;\n if (!ds) return;\n\n const source = boardsRef.current.get(ds.sourceBoardId);\n const target = boardsRef.current.get(ds.currentBoardId);\n const droppedInSource = !target || target.id === ds.sourceBoardId;\n\n if (droppedInSource) {\n // Commit a freshly compacted source so the result never depends on the\n // last preview frame (which may have been mid-reflow).\n if (source) {\n const sp = source.getPositionParams();\n const sc = source.getCompactor();\n source.applyLayout([...sc.compact(source.getLayout(), sp.cols)], true);\n }\n } else {\n const landing = lastLandingRef.current ?? { x: ds.item.x, y: ds.item.y };\n\n // Remove the item from the source board and compact.\n if (source) {\n const sp = source.getPositionParams();\n const sc = source.getCompactor();\n const remaining = source.getLayout().filter((l) => l.i !== ds.itemId);\n source.applyLayout([...sc.compact(remaining, sp.cols)], true);\n }\n\n const tp = target!.getPositionParams();\n const tc = target!.getCompactor();\n\n // Prefer committing the exact arrangement the user was previewing (item\n // already placed with the neighbours reflowed around it via continuity).\n const carried =\n previewRef.current?.boardId === target!.id &&\n getLayoutItem(previewRef.current.working, ds.itemId)\n ? previewRef.current.working\n : null;\n\n let finalLayout: LayoutItem[];\n if (carried) {\n finalLayout = [...tc.compact(cloneLayout(carried), tp.cols)];\n } else {\n // No preview frame ran (e.g. a teleport drop). Seed the item just above\n // (or left of) its landing cell so `moveElement` actively places it\n // rather than no-opping and letting compaction sink it to the bottom.\n const newItem: LayoutItem =\n tc.type === 'horizontal'\n ? { ...ds.item, x: Math.max(0, landing.x) - 1, y: landing.y }\n : { ...ds.item, x: landing.x, y: Math.max(0, landing.y) - 1 };\n const base = [\n ...cloneLayout(\n (\n targetSnapshotsRef.current.get(target!.id) ?? target!.getLayout()\n ).filter((l) => l.i !== ds.itemId),\n ),\n newItem,\n ];\n const moved = moveElement(\n base,\n newItem,\n landing.x,\n landing.y,\n true,\n tc.preventCollision,\n tc.type,\n tp.cols,\n tc.allowOverlap,\n );\n finalLayout = [...tc.compact(moved, tp.cols)];\n }\n // Never commit a drop that *creates* a stack. When the compactor cannot\n // resolve overlaps (`compact={null}` / `preventCollision`) a teleport drop\n // into an occupied region would otherwise land the item on top of another\n // widget; place it in the first free slot instead so the pointer path\n // matches the keyboard path. Overlaps the target already had do not trigger\n // the reshuffle (they are preserved as-is). `allowOverlap` opts out.\n const targetOthers = cloneLayout(\n (\n targetSnapshotsRef.current.get(target!.id) ?? target!.getLayout()\n ).filter((l) => l.i !== ds.itemId),\n );\n if (\n !tc.allowOverlap &&\n hasNewOverlap(overlappingPairs(targetOthers), finalLayout)\n ) {\n finalLayout = [\n ...targetOthers,\n placeInFreeSlot(\n targetOthers,\n { ...ds.item, x: landing.x, y: landing.y },\n tp.cols,\n tp.maxRows,\n ),\n ];\n }\n target!.applyLayout(finalLayout, true);\n\n // Signal the transfer so a controlled app can move the widget's\n // declaration into the destination container (positions are already\n // reported via each board's onLayoutChange).\n onTransferRef.current?.({\n widgetId: ds.itemId,\n fromBoardId: ds.sourceBoardId,\n toBoardId: target!.id,\n item: getLayoutItem(finalLayout, ds.itemId) ?? {\n ...ds.item,\n x: landing.x,\n y: landing.y,\n },\n });\n }\n\n const ids = new Set(affectedRef.current);\n ids.add(ds.sourceBoardId);\n ids.add(ds.currentBoardId);\n ids.forEach((id) => boardsRef.current.get(id)?.setPlaceholder(null));\n\n affectedRef.current.clear();\n sourceSnapshotRef.current = [];\n targetSnapshotsRef.current.clear();\n frozenRectsRef.current.clear();\n nestedInDraggedRef.current = new Set();\n previewRef.current = null;\n lastLandingRef.current = null;\n setDragState(null);\n });\n\n return useMemo(\n () => ({\n store,\n overlayRef,\n registerBoard,\n onDragStart,\n onDragMove,\n onDragEnd,\n dragState,\n }),\n [store, registerBoard, onDragStart, onDragMove, onDragEnd, dragState],\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
|
|
4
4
|
import { forwardRef } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
|
|
4
4
|
import { forwardRef } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
|
|
4
4
|
import { forwardRef } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { BASE_STYLES, BLOCK_STYLES, COLOR_STYLES, DIMENSION_STYLES, OUTER_STYLES, tasty } from "@tenphi/tasty";
|
|
3
3
|
import { forwardRef, useMemo } from "react";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { useLayoutEffect as useLayoutEffect$1 } from "../../utils/react/useLayoutEffect.js";
|
|
4
4
|
import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../utils/react/mergeProps.js";
|
|
3
3
|
import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
|
|
4
4
|
import { useEvent } from "../../_internal/hooks/use-event.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
|
|
4
4
|
import { forwardRef } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../utils/styles.js";
|
|
3
3
|
import { useCombinedRefs } from "../../utils/react/useCombinedRefs.js";
|
|
4
4
|
import { CONTAINER_STYLES, filterBaseProps, parseStyle, tasty } from "@tenphi/tasty";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
3
3
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { ItemActionProvider } from "../../actions/ItemActionContext.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { DropIndicatorElement } from "./styled.js";
|
|
3
3
|
import { useTabsContext } from "./TabsContext.js";
|
|
4
4
|
import { useEffect, useRef, useState } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { TabPanelElement } from "./styled.js";
|
|
3
3
|
import { useEffect, useMemo, useRef } from "react";
|
|
4
4
|
import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { ItemAction } from "../../actions/ItemAction/ItemAction.js";
|
|
3
3
|
import { CloseIcon } from "../../../icons/CloseIcon.js";
|
|
4
4
|
import { MoreIcon } from "../../../icons/MoreIcon.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
|
|
4
4
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { _ItemButton } from "../../actions/ItemButton/ItemButton.js";
|
|
3
3
|
import { useOptionalTabsContext } from "./TabsContext.js";
|
|
4
4
|
import { tasty } from "@tenphi/tasty";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
//#region src/components/navigation/Tabs/popover-placement.ts
|
|
3
3
|
/**
|
|
4
4
|
* Maps the parent Tabs `placement` to the popover placement for menus and
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { useLayoutEffect as useLayoutEffect$1 } from "../../../utils/react/useLayoutEffect.js";
|
|
3
3
|
import { Block } from "../../Block.js";
|
|
4
4
|
import { Space } from "../../layout/Space.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { _Text } from "../../content/Text.js";
|
|
3
3
|
import { _Title } from "../../content/Title.js";
|
|
4
4
|
import { Card } from "../../content/Card/Card.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.145.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.145.4 | Cube Dev Team */
|
|
2
2
|
import { _Title } from "../../content/Title.js";
|
|
3
3
|
import { useProviderProps } from "../../../provider.js";
|
|
4
4
|
import { Space } from "../../layout/Space.js";
|