@cube-dev/ui-kit 0.162.0 → 0.164.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/CHANGELOG.md +420 -0
- package/dist/README.md +1 -1
- package/dist/_internal/hooks/use-chained-callback.js +1 -1
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.d.ts +3 -2
- package/dist/components/Root.js +1 -1
- package/dist/components/Root.js.map +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +2 -5
- package/dist/components/actions/Banner/Banner.js.map +1 -1
- package/dist/components/actions/Button/Button.d.ts +3 -2
- package/dist/components/actions/Button/Button.js +8 -5
- package/dist/components/actions/Button/Button.js.map +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.d.ts +2 -2
- package/dist/components/actions/ItemAction/ItemAction.js +15 -6
- package/dist/components/actions/ItemAction/ItemAction.js.map +1 -1
- package/dist/components/actions/ItemActionContext.d.ts +14 -0
- package/dist/components/actions/ItemActionContext.js +2 -2
- package/dist/components/actions/ItemActionContext.js.map +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +56 -46
- package/dist/components/actions/ItemButton/ItemButton.js.map +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.d.ts +13 -0
- package/dist/components/actions/Menu/MenuTrigger.js +27 -15
- package/dist/components/actions/Menu/MenuTrigger.js.map +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 -2
- package/dist/components/actions/use-anchored-menu.js.map +1 -1
- package/dist/components/actions/use-context-menu.js +1 -2
- package/dist/components/actions/use-context-menu.js.map +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.d.ts +10 -0
- package/dist/components/content/CopySnippet/CopySnippet.js +7 -4
- package/dist/components/content/CopySnippet/CopySnippet.js.map +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js +1 -1
- package/dist/components/content/InlineInput/InlineInput.js.map +1 -1
- package/dist/components/content/Item/Item.d.ts +2 -2
- package/dist/components/content/Item/Item.js +13 -58
- package/dist/components/content/Item/Item.js.map +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.d.ts +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +7 -4
- package/dist/components/content/ItemBadge/ItemBadge.js.map +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.d.ts +6 -0
- package/dist/components/content/PrismCode/PrismCode.js +12 -3
- package/dist/components/content/PrismCode/PrismCode.js.map +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.d.ts +28 -28
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.js +1 -1
- package/dist/components/content/Tree/TreeNode.js +1 -1
- package/dist/components/content/Tree/styled.js +1 -1
- package/dist/components/content/Tree/tree-index.js +1 -1
- package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
- package/dist/components/content/Tree/use-load-data.js +1 -1
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/data/DataTable/DataTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTable.js +1 -1
- package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
- package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
- package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
- package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -2
- package/dist/components/data/ItemTable/ItemTableToolbar.js.map +1 -1
- package/dist/components/data/TableBase/ColumnResizer.js +1 -1
- package/dist/components/data/TableBase/RowCollection.js +1 -1
- package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
- package/dist/components/data/TableBase/TableRow.js +1 -1
- package/dist/components/data/TableBase/TableView.js +2 -2
- package/dist/components/data/TableBase/TableView.js.map +1 -1
- package/dist/components/data/TableBase/column-menu.js +1 -1
- package/dist/components/data/TableBase/column-tint.js +12 -2
- package/dist/components/data/TableBase/column-tint.js.map +1 -1
- package/dist/components/data/TableBase/row-menu.js +1 -1
- package/dist/components/data/TableBase/styled.js +1 -1
- package/dist/components/data/TableBase/types.js +1 -1
- package/dist/components/data/TableBase/use-cell-selection.js +0 -0
- package/dist/components/data/TableBase/use-column-order.js +1 -1
- package/dist/components/data/TableBase/use-container-width.js +1 -1
- package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
- package/dist/components/data/TableBase/use-scrollability.js +1 -1
- package/dist/components/data/TableBase/use-table-columns.js +1 -1
- package/dist/components/data/TableBase/use-table-search.js +1 -1
- package/dist/components/data/TableBase/use-table-selection.js +1 -1
- package/dist/components/data/TableBase/use-table-sort.js +1 -1
- package/dist/components/data/TableBase/use-table-sorts.js +1 -1
- package/dist/components/data/TableBase/use-table-storage.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ColorInput/ColorInput.js +12 -7
- package/dist/components/fields/ColorInput/ColorInput.js.map +1 -1
- package/dist/components/fields/ColorPicker/ColorPicker.js +3 -2
- package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.d.ts +8 -2
- package/dist/components/fields/{color → ColorSwatch}/ColorSwatch.js +14 -6
- package/dist/components/fields/ColorSwatch/ColorSwatch.js.map +1 -0
- package/dist/components/fields/ColorSwatch/index.d.ts +2 -0
- package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +2 -6
- package/dist/components/fields/ComboBox/ComboBox.js.map +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 +32 -2
- package/dist/components/fields/DatePicker/DatePickerButton.js.map +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
- package/dist/components/fields/DatePicker/PeriodPicker.js +3 -2
- package/dist/components/fields/DatePicker/PeriodPicker.js.map +1 -1
- package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
- package/dist/components/fields/DatePicker/YearPicker.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/period.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +1 -2
- package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.js +1 -2
- package/dist/components/fields/FilterPicker/FilterPicker.js.map +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 -4
- package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +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 +9 -6
- package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
- package/dist/components/fields/Picker/Picker.js +1 -3
- package/dist/components/fields/Picker/Picker.js.map +1 -1
- package/dist/components/fields/RadioGroup/Radio.d.ts +31 -9
- package/dist/components/fields/RadioGroup/Radio.js +57 -14
- package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js +2 -1
- package/dist/components/fields/RadioGroup/RadioGroup.js.map +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchComboBox/SearchComboBox.js +2 -6
- package/dist/components/fields/SearchComboBox/SearchComboBox.js.map +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +18 -16
- package/dist/components/fields/SearchInput/SearchInput.js.map +1 -1
- package/dist/components/fields/Select/Select.js +3 -6
- package/dist/components/fields/Select/Select.js.map +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +15 -4
- package/dist/components/fields/Slider/HueSlider.js.map +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +1 -1
- package/dist/components/fields/TextInput/TextInput.js +1 -1
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/fields/color/ColorPanel.js +1 -1
- package/dist/components/fields/color/channels.js +1 -1
- package/dist/components/fields/color/color.js +4 -4
- package/dist/components/fields/color/color.js.map +1 -1
- package/dist/components/fields/color/context.js +1 -1
- package/dist/components/fields/color/index.d.ts +0 -1
- package/dist/components/fields/index.d.ts +2 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/validation/ValidationIndicator.js +1 -1
- package/dist/components/form/validation/resolve-validation-props.js +1 -1
- package/dist/components/form/validation/use-validation-props.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Board/Board.d.ts +35 -5
- package/dist/components/layout/Board/Board.js +11 -5
- package/dist/components/layout/Board/Board.js.map +1 -1
- package/dist/components/layout/Board/BoardProvider.js +1 -1
- package/dist/components/layout/Board/BoardResponsive.js +1 -1
- package/dist/components/layout/Board/Widget.d.ts +16 -1
- package/dist/components/layout/Board/Widget.js +3 -2
- package/dist/components/layout/Board/Widget.js.map +1 -1
- package/dist/components/layout/Board/WidgetHost.js +92 -17
- package/dist/components/layout/Board/WidgetHost.js.map +1 -1
- package/dist/components/layout/Board/board-context.js +5 -5
- package/dist/components/layout/Board/board-context.js.map +1 -1
- package/dist/components/layout/Board/board-store.d.ts +1 -0
- package/dist/components/layout/Board/board-store.js +2 -2
- package/dist/components/layout/Board/board-store.js.map +1 -1
- package/dist/components/layout/Board/grid-core/calculate.js +1 -1
- package/dist/components/layout/Board/grid-core/collision-modes.js +183 -0
- package/dist/components/layout/Board/grid-core/collision-modes.js.map +1 -0
- package/dist/components/layout/Board/grid-core/collision.js +1 -1
- package/dist/components/layout/Board/grid-core/compactors.js +1 -1
- package/dist/components/layout/Board/grid-core/constraints.js +1 -1
- package/dist/components/layout/Board/grid-core/group-move.js +1 -1
- package/dist/components/layout/Board/grid-core/layout.js +12 -2
- package/dist/components/layout/Board/grid-core/layout.js.map +1 -1
- package/dist/components/layout/Board/grid-core/sort.js +1 -1
- package/dist/components/layout/Board/grid-core/types.d.ts +17 -1
- package/dist/components/layout/Board/index.d.ts +2 -2
- package/dist/components/layout/Board/index.js +1 -1
- package/dist/components/layout/Board/index.js.map +1 -1
- package/dist/components/layout/Board/responsive-utils.js +1 -1
- package/dist/components/layout/Board/use-board-layout.js +1 -1
- package/dist/components/layout/Board/use-board-registry.js +57 -9
- package/dist/components/layout/Board/use-board-registry.js.map +1 -1
- package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
- package/dist/components/layout/Board/use-board-selection.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Pagination/Pagination.js +1 -1
- package/dist/components/navigation/Pagination/use-pagination.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +2 -29
- package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -2
- package/dist/components/navigation/Tabs/TabPicker.js.map +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/popover-placement.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/CalendarHeader.js +1 -1
- package/dist/components/other/Calendar/CalendarPanel.js +1 -1
- package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
- package/dist/components/other/Calendar/PeriodGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/Calendar/styled.js +1 -1
- package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
- package/dist/components/other/NoDataIcon/NoDataIcon.d.ts +37 -0
- package/dist/components/other/NoDataIcon/NoDataIcon.js +56 -0
- package/dist/components/other/NoDataIcon/NoDataIcon.js.map +1 -0
- package/dist/components/other/NoDataIcon/index.d.ts +2 -0
- 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 +4 -3
- package/dist/components/overlays/Dialog/Dialog.js.map +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.d.ts +13 -0
- package/dist/components/overlays/Dialog/DialogTrigger.js +24 -5
- package/dist/components/overlays/Dialog/DialogTrigger.js.map +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/context.js.map +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 -2
- package/dist/components/overlays/Modal/Overlay.js.map +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 -2
- package/dist/components/overlays/Notifications/OverlayContainer.js.map +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/LoadingAnimation/LoadingAnimation.js.map +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.d.ts +1 -1
- package/dist/data/item-themes.js +247 -47
- package/dist/data/item-themes.js.map +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/eslint-plugin/defaults.generated.js +2022 -1970
- package/dist/eslint-plugin/defaults.generated.js.map +1 -1
- package/dist/eslint-plugin/index.d.ts +6 -0
- package/dist/eslint-plugin/index.js +9 -5
- package/dist/eslint-plugin/index.js.map +1 -1
- package/dist/eslint-plugin/rules/no-redundant-default-prop.d.ts +17 -0
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js +17 -11
- package/dist/eslint-plugin/rules/no-redundant-default-prop.js.map +1 -1
- package/dist/eslint-plugin/types.d.ts +22 -3
- package/dist/i18n/I18nProvider.js +1 -1
- package/dist/i18n/createFormatter.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/instance.js +1 -1
- package/dist/i18n/locales/de-DE/uikit.js +1 -1
- package/dist/i18n/locales/en-US/uikit.js +1 -1
- package/dist/i18n/locales/es-ES/uikit.js +1 -1
- package/dist/i18n/locales/es-MX/uikit.js +1 -1
- package/dist/i18n/locales/fr-FR/uikit.js +1 -1
- package/dist/i18n/locales/it-IT/uikit.js +1 -1
- package/dist/i18n/locales/ja-JP/uikit.js +1 -1
- package/dist/i18n/locales/nb-NO/uikit.js +1 -1
- package/dist/i18n/locales/pt-BR/uikit.js +1 -1
- package/dist/i18n/locales/pt-PT/uikit.js +1 -1
- package/dist/i18n/locales/sv-SE/uikit.js +1 -1
- package/dist/i18n/locales/vi-VN/uikit.js +1 -1
- package/dist/i18n/locales.js +1 -1
- package/dist/i18n/useFormatter.js +1 -1
- package/dist/i18n/useI18n.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/ArrowNarrowDownIcon.js +1 -1
- package/dist/icons/ArrowNarrowUpIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/GripVerticalIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PipetteIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/probe/canonicalize.js +1 -1
- package/dist/probe/css.js +1 -1
- package/dist/probe/index.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/color-seed.d.ts +44 -0
- package/dist/tokens/color-seed.js +48 -0
- package/dist/tokens/color-seed.js.map +1 -0
- package/dist/tokens/color-theme.d.ts +9 -1
- package/dist/tokens/color-theme.js +20 -7
- package/dist/tokens/color-theme.js.map +1 -1
- package/dist/tokens/colors.js +20 -3
- package/dist/tokens/colors.js.map +1 -1
- package/dist/tokens/index.d.ts +2 -1
- package/dist/tokens/index.js +3 -2
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/lazy-styles.js +1 -1
- package/dist/tokens/palette-config.d.ts +304 -77
- package/dist/tokens/palette-config.js +188 -49
- package/dist/tokens/palette-config.js.map +1 -1
- package/dist/tokens/palette.js +617 -163
- package/dist/tokens/palette.js.map +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/disabledProps.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useBufferedValue.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/usePopoverSync.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +3 -3
- package/docs/Theming.md +471 -83
- package/docs/Usage.md +37 -2
- package/docs/components/Root.md +1 -1
- package/docs/components/actions/Button.md +9 -3
- package/docs/components/actions/ItemAction.md +3 -3
- package/docs/components/actions/MenuTrigger.md +54 -2
- package/docs/components/actions/SubMenuTrigger.md +2 -2
- package/docs/components/content/CopySnippet.md +5 -5
- package/docs/components/content/InlineInput.md +1 -1
- package/docs/components/content/Item.md +10 -10
- package/docs/components/content/ItemBadge.md +2 -2
- package/docs/components/content/PrismCode.md +1 -0
- package/docs/components/fields/ColorSwatch.md +155 -0
- package/docs/components/fields/RadioGroup.md +39 -5
- package/docs/components/layout/Board.md +20 -2
- package/docs/components/other/NoDataIcon.md +48 -0
- package/docs/components/overlays/DialogTrigger.md +3 -2
- package/docs/components/status/LoadingAnimation.md +12 -0
- package/docs/glaze/api.md +155 -47
- package/docs/glaze/methodology.md +15 -13
- package/docs/glaze/migration.md +36 -0
- package/docs/glaze/okhst.md +4 -0
- package/docs/tasty/ai-agents.md +3 -0
- package/docs/tasty/configuration.md +1 -0
- package/package.json +6 -3
- package/dist/components/fields/color/ColorSwatch.js.map +0 -1
|
@@ -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 bottom,\n calcXYRaw,\n cloneLayout,\n collides,\n getLayoutItem,\n LayoutItem,\n moveElement,\n moveElements,\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 const getDragState = useCallback(() => dragStateRef.current, []);\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 layoutAtStart = entry?.getLayout() ?? [];\n const item = entry ? getLayoutItem(layoutAtStart, itemId) : undefined;\n if (!entry || !item) return;\n\n // ---- Resolve the gesture's membership --------------------------------\n //\n // This is the ONE place a group drag is decided. Everything downstream\n // branches on `itemIds.length`, never on the selection itself, which is\n // what keeps the single-widget path provably untouched.\n //\n // Three rules, all enforced here:\n // 1. The grabbed widget must already be in the selection. Grabbing an\n // unselected widget is an ordinary drag and never moves the selection\n // — whether the grab should *replace* the selection is app policy.\n // 2. Members are resolved against this board's own layout, so a nested\n // board's ids can never leak into another board's group.\n // 3. A static widget is never a member, matching `moveElement`'s guard.\n const selected = entry.getSelectedKeys();\n const memberIds =\n selected && selected.has(itemId)\n ? layoutAtStart\n .filter(\n (l) =>\n l.i !== itemId &&\n selected.has(l.i) &&\n (!l.static || l.isDraggable === true),\n )\n .map((l) => l.i)\n : [];\n const itemIds = [itemId, ...memberIds];\n\n // Host nodes of every member, needed both to exclude nested boards and to\n // measure the float rects below. Ids are unique per provider and `itemIds`\n // only holds ids from this board, so the query cannot pick up a nested\n // board's widgets.\n const memberNodes: HTMLElement[] = widgetNode ? [widgetNode] : [];\n const memberRects = new Map<string, ViewportRect>();\n\n if (memberIds.length > 0) {\n const contentNode = entry.getContentNode();\n const idSet = new Set(itemIds);\n\n contentNode\n ?.querySelectorAll<HTMLElement>('[data-board-widget-id]')\n .forEach((el) => {\n const id = el.dataset.boardWidgetId;\n if (!id || !idSet.has(id)) return;\n if (id !== itemId) memberNodes.push(el);\n const r = el.getBoundingClientRect();\n memberRects.set(id, {\n left: r.left,\n top: r.top,\n width: r.width,\n height: r.height,\n });\n });\n }\n\n // Record boards nested inside the dragged widget(s) so they are never\n // picked as a drop target (dropping a widget into a board nested within\n // itself would unmount it). Computed here, before the widget floats into\n // the overlay, while its nested boards are still in-grid descendants.\n const nested = new Set<string>();\n if (memberNodes.length > 0) {\n boardsRef.current.forEach((e) => {\n const node = e.getContentNode();\n if (node && memberNodes.some((host) => host.contains(node))) {\n nested.add(e.id);\n }\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 items = itemIds\n .map((id) =>\n id === itemId ? draggedItem : getLayoutItem(layoutAtStart, id),\n )\n .filter((it): it is LayoutItem => it !== undefined);\n const next: BoardDragState = {\n sourceBoardId: boardId,\n currentBoardId: boardId,\n itemId,\n item: draggedItem,\n itemIds,\n items,\n rect,\n startRect: rect,\n memberRects,\n pointerType,\n nestedBoardIds: nested,\n };\n setDragState(next);\n entry.setPlaceholders(items.map((it) => ({ ...it })));\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.setPlaceholders(\n [getLayoutItem(compacted, item.i)].filter(\n (it): it is LayoutItem => it !== undefined,\n ),\n );\n },\n [],\n );\n\n /**\n * Move the whole selection rigidly to an absolute delta.\n *\n * Unlike the single-widget path, each frame is recomputed from the drag-start\n * snapshot rather than from the previous frame. A rigid group at an absolute\n * delta is a pure function of that delta, so dragging back retraces the\n * arrangement exactly, pushed neighbours never accumulate, and there is no\n * hysteresis. The single path's frame-to-frame continuity exists to stop\n * `moveElement` sinking a no-op placement to the bottom of a column;\n * `moveElements` places the group explicitly, so that does not apply here.\n */\n const moveGroupWithinBoard = useCallback(\n (entry: BoardEntry, ds: BoardDragState, dx: number, dy: number) => {\n const pp = entry.getPositionParams();\n const result = moveElements(\n sourceSnapshotRef.current,\n new Set(ds.itemIds),\n dx,\n dy,\n {\n compactor: entry.getCompactor(),\n cols: pp.cols,\n maxRows: entry.getMaxRows(),\n },\n );\n\n if (!result.moved) return;\n\n entry.applyLayout(result.layout, false);\n entry.setPlaceholders(\n ds.itemIds\n .map((id) => getLayoutItem(result.layout, id))\n .filter((it): it is LayoutItem => it !== undefined),\n );\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.setPlaceholders([landed]);\n lastLandingRef.current = { x: landed.x, y: landed.y };\n return;\n }\n },\n [],\n );\n\n /**\n * Keyboard equivalent of `moveGroupWithinBoard`: scan outward for the nearest\n * whole-group delta that resolves cleanly.\n *\n * Constraints are resolved through the **grabbed** widget only, and the delta\n * it yields is applied to the rest. `applyPositionConstraints` returns an\n * absolute position, so running it per member would shear the group apart\n * under `snapToGrid` or any app constraint — and the grabbed widget is the one\n * the user is aiming with.\n *\n * Unlike the pointer path this steps from the live layout, not the drag-start\n * snapshot, because keyboard moves accumulate one cell at a time.\n */\n const moveGroupWithKeyboard = useCallback(\n (entry: BoardEntry, ds: BoardDragState, deltaX: number, deltaY: number) => {\n const pp = entry.getPositionParams();\n const compactor = entry.getCompactor();\n const layout = entry.getLayout();\n const live = getLayoutItem(layout, ds.itemId);\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 ids = new Set(ds.itemIds);\n const members = layout.filter((l) => ids.has(l.i));\n if (members.length === 0) return;\n\n // Headroom of the whole block, so the scan never proposes a delta that is\n // clamped back to a no-op.\n const attempts =\n directionX < 0\n ? Math.min(...members.map((l) => l.x))\n : directionX > 0\n ? Math.min(...members.map((l) => pp.cols - l.w - l.x))\n : directionY < 0\n ? Math.min(...members.map((l) => l.y))\n : Number.isFinite(maxRows)\n ? Math.min(...members.map((l) => maxRows - l.h - l.y))\n : Math.max(1, bottom(layout) - live.y);\n const seen = new Set<string>();\n const beforePairs = overlappingPairs(layout);\n\n for (let distance = 1; distance <= Math.max(0, attempts); distance++) {\n const candidate = applyPositionConstraints(\n entry.getConstraints(),\n ds.item,\n live.x + directionX * distance,\n live.y + directionY * distance,\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 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 result = moveElements(\n layout,\n ids,\n candidate.x - live.x,\n candidate.y - live.y,\n { compactor, cols: pp.cols, maxRows },\n );\n if (!result.moved) continue;\n\n const landed = getLayoutItem(result.layout, ds.itemId);\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 if (\n !advanced ||\n (!compactor.allowOverlap && hasNewOverlap(beforePairs, result.layout))\n ) {\n continue;\n }\n\n entry.applyLayout(result.layout, false);\n entry.setPlaceholders(\n ds.itemIds\n .map((id) => getLayoutItem(result.layout, id))\n .filter((it): it is LayoutItem => it !== undefined),\n );\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.setPlaceholders([{ ...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 isGroup = ds.itemIds.length > 1;\n\n if (pointerType === 'keyboard') {\n const source = boardsRef.current.get(ds.sourceBoardId);\n if (!source) return;\n if (isGroup) {\n moveGroupWithKeyboard(source, ds, deltaX, deltaY);\n } else {\n moveWithKeyboard(source, ds.item, deltaX, deltaY);\n }\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 // A group drag never leaves its source board. Cross-board transfer is\n // single-item throughout (`WidgetTransferInfo`, the carried preview, the\n // free-slot fallback), and degrading a group to a single-widget transfer\n // would silently split a selection the user deliberately made. Pinning the\n // target keeps the whole gesture in-board and makes the limit testable.\n let target = isGroup ? source : 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?.setPlaceholders([]);\n previewRef.current = null;\n }\n if (isGroup) {\n // The group moves by the delta the grabbed widget travelled from its\n // drag-start position — an absolute delta, recomputed from the\n // snapshot each frame.\n moveGroupWithinBoard(target, ds, x - ds.item.x, y - ds.item.y);\n } else {\n moveWithinBoard(target, ds.item, x, y);\n }\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?.setPlaceholders([]);\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)?.setPlaceholders([]));\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 getDragState,\n }),\n [\n store,\n registerBoard,\n onDragStart,\n onDragMove,\n onDragEnd,\n dragState,\n getDragState,\n ],\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 createCollisionResolver,\n getLayoutItem,\n LayoutItem,\n moveElement,\n moveElements,\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 * Whether any item in `after` has a different size than it had in `before`.\n */\nfunction resizesAnything(before: LayoutItem[], after: LayoutItem[]): boolean {\n return after.some((a) => {\n const b = before.find((it) => it.i === a.i);\n return !!b && (b.w !== a.w || b.h !== a.h);\n });\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 const getDragState = useCallback(() => dragStateRef.current, []);\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 layoutAtStart = entry?.getLayout() ?? [];\n const item = entry ? getLayoutItem(layoutAtStart, itemId) : undefined;\n if (!entry || !item) return;\n\n // ---- Resolve the gesture's membership --------------------------------\n //\n // This is the ONE place a group drag is decided. Everything downstream\n // branches on `itemIds.length`, never on the selection itself, which is\n // what keeps the single-widget path provably untouched.\n //\n // Three rules, all enforced here:\n // 1. The grabbed widget must already be in the selection. Grabbing an\n // unselected widget is an ordinary drag and never moves the selection\n // — whether the grab should *replace* the selection is app policy.\n // 2. Members are resolved against this board's own layout, so a nested\n // board's ids can never leak into another board's group.\n // 3. A static widget is never a member, matching `moveElement`'s guard.\n const selected = entry.getSelectedKeys();\n const memberIds =\n selected && selected.has(itemId)\n ? layoutAtStart\n .filter(\n (l) =>\n l.i !== itemId &&\n selected.has(l.i) &&\n (!l.static || l.isDraggable === true),\n )\n .map((l) => l.i)\n : [];\n const itemIds = [itemId, ...memberIds];\n\n // Host nodes of every member, needed both to exclude nested boards and to\n // measure the float rects below. Ids are unique per provider and `itemIds`\n // only holds ids from this board, so the query cannot pick up a nested\n // board's widgets.\n const memberNodes: HTMLElement[] = widgetNode ? [widgetNode] : [];\n const memberRects = new Map<string, ViewportRect>();\n\n if (memberIds.length > 0) {\n const contentNode = entry.getContentNode();\n const idSet = new Set(itemIds);\n\n contentNode\n ?.querySelectorAll<HTMLElement>('[data-board-widget-id]')\n .forEach((el) => {\n const id = el.dataset.boardWidgetId;\n if (!id || !idSet.has(id)) return;\n if (id !== itemId) memberNodes.push(el);\n const r = el.getBoundingClientRect();\n memberRects.set(id, {\n left: r.left,\n top: r.top,\n width: r.width,\n height: r.height,\n });\n });\n }\n\n // Record boards nested inside the dragged widget(s) so they are never\n // picked as a drop target (dropping a widget into a board nested within\n // itself would unmount it). Computed here, before the widget floats into\n // the overlay, while its nested boards are still in-grid descendants.\n const nested = new Set<string>();\n if (memberNodes.length > 0) {\n boardsRef.current.forEach((e) => {\n const node = e.getContentNode();\n if (node && memberNodes.some((host) => host.contains(node))) {\n nested.add(e.id);\n }\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 items = itemIds\n .map((id) =>\n id === itemId ? draggedItem : getLayoutItem(layoutAtStart, id),\n )\n .filter((it): it is LayoutItem => it !== undefined);\n const next: BoardDragState = {\n sourceBoardId: boardId,\n currentBoardId: boardId,\n itemId,\n item: draggedItem,\n itemIds,\n items,\n rect,\n startRect: rect,\n memberRects,\n pointerType,\n nestedBoardIds: nested,\n };\n setDragState(next);\n entry.setPlaceholders(items.map((it) => ({ ...it })));\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 // A resolution only replaces the engine's revert, so a mode is only live\n // where a collision would actually block the move.\n const collisionMode = compactor.preventCollision\n ? entry.getCollisionMode()\n : 'revert';\n\n // Which arrangement this frame resolves against.\n //\n // Normally it is the live layout: frame-to-frame continuity is what stops\n // `moveElement` sinking a no-op placement to the bottom of an occupied\n // column. But a *resolution* edits other widgets - a swap moves its partner,\n // and sizes it down to fit - and those edits are committed to the preview.\n // Chaining frames off each other then accumulates them: sweeping across two\n // neighbours exchanges with both, so widgets shuffle continuously under the\n // pointer, and each displaced widget shrinks a little more every time it is\n // displaced again. Resolving from the arrangement the gesture started with\n // makes a frame a pure function of the landing cell instead: one exchange,\n // the partner goes to where the drag began, dragging back retraces exactly,\n // and nothing accumulates. `moveGroupWithinBoard` recomputes from the\n // snapshot for the same reason.\n const startLayout = sourceSnapshotRef.current;\n const base =\n collisionMode !== 'revert' && getLayoutItem(startLayout, item.i)\n ? startLayout\n : layout;\n const live = getLayoutItem(base, 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(base)\n : [...cloneLayout(base), { ...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 resolveCollision: createCollisionResolver(collisionMode, {\n cols: pp.cols,\n maxRows: entry.getMaxRows(),\n // The size it has in `base` - the gesture's start size when a\n // resolution is live, so a frame that shrank the widget can never\n // become the next frame's starting point.\n desired: { w: target.w, h: target.h },\n }),\n },\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(base), compacted)\n ) {\n return;\n }\n entry.applyLayout(compacted, false);\n entry.setPlaceholders(\n [getLayoutItem(compacted, item.i)].filter(\n (it): it is LayoutItem => it !== undefined,\n ),\n );\n },\n [],\n );\n\n /**\n * Move the whole selection rigidly to an absolute delta.\n *\n * Unlike the single-widget path, each frame is recomputed from the drag-start\n * snapshot rather than from the previous frame. A rigid group at an absolute\n * delta is a pure function of that delta, so dragging back retraces the\n * arrangement exactly, pushed neighbours never accumulate, and there is no\n * hysteresis. The single path's frame-to-frame continuity exists to stop\n * `moveElement` sinking a no-op placement to the bottom of a column;\n * `moveElements` places the group explicitly, so that does not apply here.\n */\n const moveGroupWithinBoard = useCallback(\n (entry: BoardEntry, ds: BoardDragState, dx: number, dy: number) => {\n const pp = entry.getPositionParams();\n const result = moveElements(\n sourceSnapshotRef.current,\n new Set(ds.itemIds),\n dx,\n dy,\n {\n compactor: entry.getCompactor(),\n cols: pp.cols,\n maxRows: entry.getMaxRows(),\n },\n );\n\n if (!result.moved) return;\n\n entry.applyLayout(result.layout, false);\n entry.setPlaceholders(\n ds.itemIds\n .map((id) => getLayoutItem(result.layout, id))\n .filter((it): it is LayoutItem => it !== undefined),\n );\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 // The same resolution policy as the pointer path, so an arrow key can reach\n // the arrangements a drop can (the invariant the overlap checks below are\n // written around) - with one limit enforced after the fact: see\n // `resizesAnything`.\n const resolveCollision = compactor.preventCollision\n ? createCollisionResolver(entry.getCollisionMode(), {\n cols: pp.cols,\n maxRows,\n desired: { w: live.w, h: live.h },\n })\n : undefined;\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 { resolveCollision },\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 // An arrow key moves widgets; it never resizes them. Unlike a pointer\n // drag - one gesture, which can always re-measure from the size it began\n // with - each press is a gesture of its own, so a resolution that shrank\n // something would become the next press's starting size and ratchet it\n // smaller with nothing left to restore from. So `swap` can exchange two\n // widgets that fit each other's slots outright, and anything needing a\n // resize is refused here and blocks as usual.\n if (!advanced || overlaps || resizesAnything(layout, compacted)) {\n continue;\n }\n\n entry.applyLayout(compacted, false);\n entry.setPlaceholders([landed]);\n lastLandingRef.current = { x: landed.x, y: landed.y };\n return;\n }\n },\n [],\n );\n\n /**\n * Keyboard equivalent of `moveGroupWithinBoard`: scan outward for the nearest\n * whole-group delta that resolves cleanly.\n *\n * Constraints are resolved through the **grabbed** widget only, and the delta\n * it yields is applied to the rest. `applyPositionConstraints` returns an\n * absolute position, so running it per member would shear the group apart\n * under `snapToGrid` or any app constraint — and the grabbed widget is the one\n * the user is aiming with.\n *\n * Unlike the pointer path this steps from the live layout, not the drag-start\n * snapshot, because keyboard moves accumulate one cell at a time.\n */\n const moveGroupWithKeyboard = useCallback(\n (entry: BoardEntry, ds: BoardDragState, deltaX: number, deltaY: number) => {\n const pp = entry.getPositionParams();\n const compactor = entry.getCompactor();\n const layout = entry.getLayout();\n const live = getLayoutItem(layout, ds.itemId);\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 ids = new Set(ds.itemIds);\n const members = layout.filter((l) => ids.has(l.i));\n if (members.length === 0) return;\n\n // Headroom of the whole block, so the scan never proposes a delta that is\n // clamped back to a no-op.\n const attempts =\n directionX < 0\n ? Math.min(...members.map((l) => l.x))\n : directionX > 0\n ? Math.min(...members.map((l) => pp.cols - l.w - l.x))\n : directionY < 0\n ? Math.min(...members.map((l) => l.y))\n : Number.isFinite(maxRows)\n ? Math.min(...members.map((l) => maxRows - l.h - l.y))\n : Math.max(1, bottom(layout) - live.y);\n const seen = new Set<string>();\n const beforePairs = overlappingPairs(layout);\n\n for (let distance = 1; distance <= Math.max(0, attempts); distance++) {\n const candidate = applyPositionConstraints(\n entry.getConstraints(),\n ds.item,\n live.x + directionX * distance,\n live.y + directionY * distance,\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 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 result = moveElements(\n layout,\n ids,\n candidate.x - live.x,\n candidate.y - live.y,\n { compactor, cols: pp.cols, maxRows },\n );\n if (!result.moved) continue;\n\n const landed = getLayoutItem(result.layout, ds.itemId);\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 if (\n !advanced ||\n (!compactor.allowOverlap && hasNewOverlap(beforePairs, result.layout))\n ) {\n continue;\n }\n\n entry.applyLayout(result.layout, false);\n entry.setPlaceholders(\n ds.itemIds\n .map((id) => getLayoutItem(result.layout, id))\n .filter((it): it is LayoutItem => it !== undefined),\n );\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 ? // The carried frame supplies continuity of *position*; size comes from\n // the gesture's start whenever the cell changes, so a resolution that\n // shrank the widget on an earlier frame cannot ratchet it down (see\n // `moveWithinBoard` for both halves of this).\n prevItem.x === x && prevItem.y === y\n ? { ...prevItem }\n : { ...prevItem, w: item.w, h: item.h }\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 // No exchange across boards: the displaced widget would have to be\n // pushed back the other way, and a transfer moves one widget only. A\n // widget arriving from elsewhere has no slot here to trade, so `'swap'`\n // resolves as `'downscale'`.\n resolveCollision: compactor.preventCollision\n ? createCollisionResolver(target.getCollisionMode(), {\n cols: pp.cols,\n maxRows: target.getMaxRows(),\n desired: { w: item.w, h: item.h },\n allowExchange: false,\n })\n : undefined,\n },\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.setPlaceholders([{ ...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 isGroup = ds.itemIds.length > 1;\n\n if (pointerType === 'keyboard') {\n const source = boardsRef.current.get(ds.sourceBoardId);\n if (!source) return;\n if (isGroup) {\n moveGroupWithKeyboard(source, ds, deltaX, deltaY);\n } else {\n moveWithKeyboard(source, ds.item, deltaX, deltaY);\n }\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 // A group drag never leaves its source board. Cross-board transfer is\n // single-item throughout (`WidgetTransferInfo`, the carried preview, the\n // free-slot fallback), and degrading a group to a single-widget transfer\n // would silently split a selection the user deliberately made. Pinning the\n // target keeps the whole gesture in-board and makes the limit testable.\n let target = isGroup ? source : 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?.setPlaceholders([]);\n previewRef.current = null;\n }\n if (isGroup) {\n // The group moves by the delta the grabbed widget travelled from its\n // drag-start position — an absolute delta, recomputed from the\n // snapshot each frame.\n moveGroupWithinBoard(target, ds, x - ds.item.x, y - ds.item.y);\n } else {\n moveWithinBoard(target, ds.item, x, y);\n }\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?.setPlaceholders([]);\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 // Cross-board, so no exchange (see `previewOnTarget`). `newItem` is\n // built from the drag-start item, so its size is already the one to\n // measure against.\n resolveCollision: createCollisionResolver(\n target!.getCollisionMode(),\n {\n cols: tp.cols,\n maxRows: tp.maxRows,\n desired: { w: ds.item.w, h: ds.item.h },\n allowExchange: false,\n },\n ),\n },\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)?.setPlaceholders([]));\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 getDragState,\n }),\n [\n store,\n registerBoard,\n onDragStart,\n onDragMove,\n onDragEnd,\n dragState,\n getDragState,\n ],\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
|
|
2
2
|
import { useIsDarwin } from "../../../utils/react/useIsDarwin.js";
|
|
3
3
|
|
|
4
4
|
//#region src/components/layout/Board/use-board-select-modifier-key.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { useI18n } from "../../../i18n/useI18n.js";
|
|
4
4
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
|
|
2
2
|
import { extractStyles } from "../../../utils/styles.js";
|
|
3
3
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
4
4
|
import { useI18n } from "../../../i18n/useI18n.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
|
|
2
2
|
import { useEvent } from "../../../_internal/hooks/use-event.js";
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { useControlledState } from "@react-stately/utils";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license MIT | @cube-dev/ui-kit v0.
|
|
1
|
+
/** @license MIT | @cube-dev/ui-kit v0.164.0 | 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";
|
|
@@ -185,37 +185,10 @@ function TabButton({ item, tabData, isLastTab }) {
|
|
|
185
185
|
const handleEditingChange = useEvent((editing) => {
|
|
186
186
|
if (editing && !isEditing) handleStartEditing();
|
|
187
187
|
});
|
|
188
|
-
const renameInputSelector = `input[aria-label="${editTabTitleLabel.replace(/["\\]/g, "\\$&")}"]`;
|
|
189
|
-
const scheduleRenameRefocus = useEvent(() => {
|
|
190
|
-
let seenEditingInput = false;
|
|
191
|
-
let cancelled = false;
|
|
192
|
-
const timers = [];
|
|
193
|
-
const findEditingInput = () => ref.current?.querySelector(renameInputSelector) ?? null;
|
|
194
|
-
const tick = () => {
|
|
195
|
-
if (cancelled) return;
|
|
196
|
-
const editingInput = findEditingInput();
|
|
197
|
-
if (editingInput) {
|
|
198
|
-
seenEditingInput = true;
|
|
199
|
-
if (document.activeElement !== editingInput) inlineInputRef.current?.focus();
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
if (seenEditingInput) {
|
|
203
|
-
cancelled = true;
|
|
204
|
-
for (const t of timers) clearTimeout(t);
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
requestAnimationFrame(tick);
|
|
208
|
-
timers.push(window.setTimeout(tick, 50));
|
|
209
|
-
timers.push(window.setTimeout(tick, 200));
|
|
210
|
-
timers.push(window.setTimeout(tick, 400));
|
|
211
|
-
});
|
|
212
188
|
const handleMenuAction = useEvent((action) => {
|
|
213
189
|
const actionStr = String(action);
|
|
214
190
|
const normalizedAction = actionStr.startsWith(".$") ? actionStr.slice(2) : actionStr;
|
|
215
|
-
if (normalizedAction === "rename" && effectiveIsEditable)
|
|
216
|
-
inlineInputRef.current?.startEditing();
|
|
217
|
-
scheduleRenameRefocus();
|
|
218
|
-
}
|
|
191
|
+
if (normalizedAction === "rename" && effectiveIsEditable) inlineInputRef.current?.startEditing();
|
|
219
192
|
if (normalizedAction === "delete" && isDeletable) onDelete?.(itemKeyStr);
|
|
220
193
|
tabData.onAction?.(normalizedAction);
|
|
221
194
|
parentOnAction?.(normalizedAction, itemKeyStr);
|