@cube-dev/ui-kit 0.164.0 → 0.166.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (583) hide show
  1. package/dist/CHANGELOG.md +32 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +1 -1
  20. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  21. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  22. package/dist/components/actions/ButtonSplit/context.js +1 -1
  23. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  24. package/dist/components/actions/CommandMenu/styled.js +1 -1
  25. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  26. package/dist/components/actions/ItemActionContext.js +1 -1
  27. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  28. package/dist/components/actions/Link/Link.js +1 -1
  29. package/dist/components/actions/Menu/Menu.js +1 -1
  30. package/dist/components/actions/Menu/MenuItem.js +1 -1
  31. package/dist/components/actions/Menu/MenuSection.js +1 -1
  32. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  34. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  35. package/dist/components/actions/Menu/context.js +1 -1
  36. package/dist/components/actions/Menu/styled.js +1 -1
  37. package/dist/components/actions/index.js +1 -1
  38. package/dist/components/actions/use-action.js +1 -1
  39. package/dist/components/actions/use-anchored-menu.js +1 -1
  40. package/dist/components/actions/use-context-menu.js +1 -1
  41. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  42. package/dist/components/content/Alert/Alert.js +1 -1
  43. package/dist/components/content/Alert/use-alert.js +1 -1
  44. package/dist/components/content/Avatar/Avatar.js +1 -1
  45. package/dist/components/content/Badge/Badge.js +1 -1
  46. package/dist/components/content/Card/Card.js +1 -1
  47. package/dist/components/content/Content.js +1 -1
  48. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  49. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  50. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  51. package/dist/components/content/Divider.js +1 -1
  52. package/dist/components/content/Footer.js +1 -1
  53. package/dist/components/content/Header.js +1 -1
  54. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  55. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  56. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  57. package/dist/components/content/Item/Item.js +1 -1
  58. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  59. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  60. package/dist/components/content/Layout/GridLayout.js +1 -1
  61. package/dist/components/content/Layout/Layout.js +1 -1
  62. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  63. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  64. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  65. package/dist/components/content/Layout/LayoutContent.js +1 -1
  66. package/dist/components/content/Layout/LayoutContext.js +1 -1
  67. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  68. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  69. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  70. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  71. package/dist/components/content/Layout/LayoutPane.js +1 -1
  72. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  73. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  74. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  75. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  76. package/dist/components/content/Layout/index.js +1 -1
  77. package/dist/components/content/Layout/utils.js +1 -1
  78. package/dist/components/content/Paragraph.js +1 -1
  79. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  80. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  81. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  82. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  83. package/dist/components/content/Result/Result.js +1 -1
  84. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  85. package/dist/components/content/Tag/Tag.js +1 -1
  86. package/dist/components/content/Text.d.ts +28 -28
  87. package/dist/components/content/Text.js +1 -1
  88. package/dist/components/content/TextItem/TextItem.js +1 -1
  89. package/dist/components/content/Title.js +1 -1
  90. package/dist/components/content/Tree/Tree.js +1 -1
  91. package/dist/components/content/Tree/TreeNode.js +1 -1
  92. package/dist/components/content/Tree/styled.js +1 -1
  93. package/dist/components/content/Tree/tree-index.js +1 -1
  94. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  95. package/dist/components/content/Tree/use-load-data.js +1 -1
  96. package/dist/components/content/highlightText.js +1 -1
  97. package/dist/components/content/use-auto-tooltip.js +1 -1
  98. package/dist/components/data/DataTable/DataTable.js +140 -21
  99. package/dist/components/data/DataTable/DataTable.js.map +1 -1
  100. package/dist/components/data/DataTable/index.d.ts +1 -1
  101. package/dist/components/data/DataTable/types.d.ts +19 -4
  102. package/dist/components/data/ItemTable/ItemTable.js +169 -25
  103. package/dist/components/data/ItemTable/ItemTable.js.map +1 -1
  104. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  105. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  106. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  107. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  108. package/dist/components/data/ItemTable/types.d.ts +7 -2
  109. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  110. package/dist/components/data/TableBase/RowCollection.js +1 -1
  111. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  112. package/dist/components/data/TableBase/TableRow.js +30 -5
  113. package/dist/components/data/TableBase/TableRow.js.map +1 -1
  114. package/dist/components/data/TableBase/TableView.d.ts +2 -1
  115. package/dist/components/data/TableBase/TableView.js +299 -75
  116. package/dist/components/data/TableBase/TableView.js.map +1 -1
  117. package/dist/components/data/TableBase/column-menu.js +1 -1
  118. package/dist/components/data/TableBase/column-tint.js +1 -1
  119. package/dist/components/data/TableBase/index.d.ts +1 -1
  120. package/dist/components/data/TableBase/row-menu.js +1 -1
  121. package/dist/components/data/TableBase/styled.js +75 -2
  122. package/dist/components/data/TableBase/styled.js.map +1 -1
  123. package/dist/components/data/TableBase/table-tree.js +129 -0
  124. package/dist/components/data/TableBase/table-tree.js.map +1 -0
  125. package/dist/components/data/TableBase/types.d.ts +46 -1
  126. package/dist/components/data/TableBase/types.js +1 -1
  127. package/dist/components/data/TableBase/types.js.map +1 -1
  128. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  129. package/dist/components/data/TableBase/use-column-order.js +1 -1
  130. package/dist/components/data/TableBase/use-container-width.js +1 -1
  131. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  132. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  133. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  134. package/dist/components/data/TableBase/use-table-search.js +4 -4
  135. package/dist/components/data/TableBase/use-table-search.js.map +1 -1
  136. package/dist/components/data/TableBase/use-table-selection.js +124 -24
  137. package/dist/components/data/TableBase/use-table-selection.js.map +1 -1
  138. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  139. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  140. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  141. package/dist/components/data/TableBase/use-table-tree-state.js +107 -0
  142. package/dist/components/data/TableBase/use-table-tree-state.js.map +1 -0
  143. package/dist/components/data/index.d.ts +2 -2
  144. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  145. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  146. package/dist/components/fields/Checkbox/context.js +1 -1
  147. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  148. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  149. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  150. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  151. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  152. package/dist/components/fields/CommandTextArea/CommandTextArea.js +8 -25
  153. package/dist/components/fields/CommandTextArea/CommandTextArea.js.map +1 -1
  154. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  155. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  156. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  157. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  158. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  159. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  160. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  161. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  162. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  163. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  164. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  165. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  166. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  167. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  168. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  169. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  170. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  171. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  172. package/dist/components/fields/DatePicker/period.js +1 -1
  173. package/dist/components/fields/DatePicker/props.js +1 -1
  174. package/dist/components/fields/DatePicker/utils.js +1 -1
  175. package/dist/components/fields/FileInput/FileInput.js +1 -1
  176. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  177. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  178. package/dist/components/fields/Input/Input.js +1 -1
  179. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  180. package/dist/components/fields/ListBox/ListBox.js +1 -1
  181. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  182. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  183. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  184. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  185. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  186. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  187. package/dist/components/fields/Picker/Picker.js +1 -1
  188. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  189. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  190. package/dist/components/fields/RadioGroup/context.js +1 -1
  191. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  192. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  193. package/dist/components/fields/Select/Select.js +1 -1
  194. package/dist/components/fields/Slider/Gradation.js +1 -1
  195. package/dist/components/fields/Slider/HueSlider.js +1 -1
  196. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  197. package/dist/components/fields/Slider/Slider.js +1 -1
  198. package/dist/components/fields/Slider/SliderBase.js +1 -1
  199. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  200. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  201. package/dist/components/fields/Slider/elements.js +1 -1
  202. package/dist/components/fields/Slider/index.js +1 -1
  203. package/dist/components/fields/Switch/Switch.js +1 -1
  204. package/dist/components/fields/TextArea/TextArea.js +10 -29
  205. package/dist/components/fields/TextArea/TextArea.js.map +1 -1
  206. package/dist/components/fields/TextInput/TextInput.js +1 -1
  207. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  208. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +146 -0
  209. package/dist/components/fields/TextInput/useAutoSizeTextArea.js.map +1 -0
  210. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  211. package/dist/components/fields/color/ColorPanel.js +1 -1
  212. package/dist/components/fields/color/channels.js +1 -1
  213. package/dist/components/fields/color/color.js +1 -1
  214. package/dist/components/fields/color/context.js +1 -1
  215. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  216. package/dist/components/form/Form/Field.js +1 -1
  217. package/dist/components/form/Form/Form.js +1 -1
  218. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  219. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  220. package/dist/components/form/Form/SubmitError.js +1 -1
  221. package/dist/components/form/Form/index.js +1 -1
  222. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  223. package/dist/components/form/Form/use-field/use-field.js +1 -1
  224. package/dist/components/form/Form/use-form.js +1 -1
  225. package/dist/components/form/Form/validation.js +1 -1
  226. package/dist/components/form/Label.js +1 -1
  227. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  228. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  229. package/dist/components/form/validation/use-validation-props.js +1 -1
  230. package/dist/components/form/wrapper.js +1 -1
  231. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  232. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  233. package/dist/components/layout/Board/Board.d.ts +30 -7
  234. package/dist/components/layout/Board/Board.js +16 -6
  235. package/dist/components/layout/Board/Board.js.map +1 -1
  236. package/dist/components/layout/Board/BoardProvider.js +1 -1
  237. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  238. package/dist/components/layout/Board/Widget.d.ts +9 -0
  239. package/dist/components/layout/Board/Widget.js +3 -2
  240. package/dist/components/layout/Board/Widget.js.map +1 -1
  241. package/dist/components/layout/Board/WidgetHost.js +4 -3
  242. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  243. package/dist/components/layout/Board/board-context.js +1 -1
  244. package/dist/components/layout/Board/board-store.js +2 -2
  245. package/dist/components/layout/Board/board-store.js.map +1 -1
  246. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  247. package/dist/components/layout/Board/grid-core/collision-modes.js +7 -4
  248. package/dist/components/layout/Board/grid-core/collision-modes.js.map +1 -1
  249. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  250. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  251. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  252. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  253. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  254. package/dist/components/layout/Board/grid-core/placement.d.ts +58 -0
  255. package/dist/components/layout/Board/grid-core/placement.js +153 -0
  256. package/dist/components/layout/Board/grid-core/placement.js.map +1 -0
  257. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  258. package/dist/components/layout/Board/grid-core/types.d.ts +6 -4
  259. package/dist/components/layout/Board/index.d.ts +1 -0
  260. package/dist/components/layout/Board/index.js +2 -1
  261. package/dist/components/layout/Board/index.js.map +1 -1
  262. package/dist/components/layout/Board/responsive-utils.js +1 -1
  263. package/dist/components/layout/Board/use-board-layout.js +1 -1
  264. package/dist/components/layout/Board/use-board-registry.js +91 -100
  265. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  266. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  267. package/dist/components/layout/Board/use-board-selection.js +1 -1
  268. package/dist/components/layout/Flex.js +1 -1
  269. package/dist/components/layout/Flow.js +1 -1
  270. package/dist/components/layout/Grid.js +1 -1
  271. package/dist/components/layout/Panel.js +1 -1
  272. package/dist/components/layout/Prefix.js +1 -1
  273. package/dist/components/layout/ResizablePanel.js +1 -1
  274. package/dist/components/layout/Space.js +1 -1
  275. package/dist/components/layout/Suffix.js +1 -1
  276. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  277. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  278. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  279. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  280. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  281. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  282. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  283. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  284. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  285. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  286. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  287. package/dist/components/navigation/Tabs/styled.js +1 -1
  288. package/dist/components/navigation/Tabs/types.js +1 -1
  289. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  290. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  291. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  292. package/dist/components/other/Calendar/Calendar.js +1 -1
  293. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  294. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  295. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  296. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  297. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  298. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  299. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  300. package/dist/components/other/Calendar/styled.js +1 -1
  301. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  302. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  303. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  304. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  305. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  306. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  307. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  308. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  309. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  310. package/dist/components/overlays/Dialog/context.js +1 -1
  311. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  312. package/dist/components/overlays/Modal/Modal.js +1 -1
  313. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  314. package/dist/components/overlays/Modal/Overlay.js +1 -1
  315. package/dist/components/overlays/Modal/Popover.js +1 -1
  316. package/dist/components/overlays/Modal/Tray.js +1 -1
  317. package/dist/components/overlays/Modal/Underlay.js +1 -1
  318. package/dist/components/overlays/Notifications/Notification.js +1 -1
  319. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  320. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  321. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  322. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  323. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  324. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  325. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  326. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  327. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  328. package/dist/components/overlays/Notifications/index.js +1 -1
  329. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  330. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  331. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  332. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  333. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  334. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  335. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  336. package/dist/components/overlays/Toast/index.js +1 -1
  337. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  338. package/dist/components/overlays/Toast/useToast.js +1 -1
  339. package/dist/components/overlays/Tooltip/Tooltip.js +2 -1
  340. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  341. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  342. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  343. package/dist/components/overlays/Tooltip/context.js +1 -1
  344. package/dist/components/portal/Portal.js +1 -1
  345. package/dist/components/portal/PortalProvider.js +1 -1
  346. package/dist/components/portal/usePortal.js +1 -1
  347. package/dist/components/shared/DraggableCollection.js +1 -1
  348. package/dist/components/shared/InvalidIcon.js +1 -1
  349. package/dist/components/shared/ValidIcon.js +1 -1
  350. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  351. package/dist/components/status/Spin/Cube.js +1 -1
  352. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  353. package/dist/components/status/Spin/Spin.js +1 -1
  354. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  355. package/dist/data/item-themes.js +1 -1
  356. package/dist/data/themes.js +1 -1
  357. package/dist/eslint-plugin/defaults.generated.js +17 -1
  358. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  359. package/dist/eslint-plugin/index.js +1 -1
  360. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  361. package/dist/i18n/I18nProvider.js +1 -1
  362. package/dist/i18n/createFormatter.js +1 -1
  363. package/dist/i18n/index.js +1 -1
  364. package/dist/i18n/instance.js +1 -1
  365. package/dist/i18n/locales/de-DE/uikit.js +2 -1
  366. package/dist/i18n/locales/en-US/uikit.js +2 -1
  367. package/dist/i18n/locales/en-US/uikit.json.d.ts +1 -0
  368. package/dist/i18n/locales/es-ES/uikit.js +2 -1
  369. package/dist/i18n/locales/es-MX/uikit.js +2 -1
  370. package/dist/i18n/locales/fr-FR/uikit.js +2 -1
  371. package/dist/i18n/locales/it-IT/uikit.js +2 -1
  372. package/dist/i18n/locales/ja-JP/uikit.js +2 -1
  373. package/dist/i18n/locales/nb-NO/uikit.js +2 -1
  374. package/dist/i18n/locales/pt-BR/uikit.js +2 -1
  375. package/dist/i18n/locales/pt-PT/uikit.js +2 -1
  376. package/dist/i18n/locales/sv-SE/uikit.js +2 -1
  377. package/dist/i18n/locales/vi-VN/uikit.js +2 -1
  378. package/dist/i18n/locales.js +1 -1
  379. package/dist/i18n/useFormatter.js +1 -1
  380. package/dist/i18n/useI18n.js +1 -1
  381. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  382. package/dist/icons/AdjustmentsIcon.js +1 -1
  383. package/dist/icons/AiIcon.js +1 -1
  384. package/dist/icons/AreaChartIcon.js +1 -1
  385. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  386. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  387. package/dist/icons/BackwardIcon.js +1 -1
  388. package/dist/icons/BarChartIcon.js +1 -1
  389. package/dist/icons/BellFilledIcon.js +1 -1
  390. package/dist/icons/BellIcon.js +1 -1
  391. package/dist/icons/BooleanIcon.js +1 -1
  392. package/dist/icons/CalendarEditIcon.js +1 -1
  393. package/dist/icons/CalendarIcon.js +1 -1
  394. package/dist/icons/CaretDownIcon.js +1 -1
  395. package/dist/icons/CaretUpIcon.js +1 -1
  396. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  397. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  398. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  399. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  400. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  401. package/dist/icons/ChartBarLineIcon.js +1 -1
  402. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  403. package/dist/icons/ChartBarStackedIcon.js +1 -1
  404. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  405. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  406. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  407. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  408. package/dist/icons/ChartBubbleIcon.js +1 -1
  409. package/dist/icons/ChartDonut2Icon.js +1 -1
  410. package/dist/icons/ChartFunnelIcon.js +1 -1
  411. package/dist/icons/ChartHeatmapIcon.js +1 -1
  412. package/dist/icons/ChartKPIIcon.js +1 -1
  413. package/dist/icons/ChartPie2Icon.js +1 -1
  414. package/dist/icons/ChartScatterIcon.js +1 -1
  415. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  416. package/dist/icons/CheckCircleIcon.js +1 -1
  417. package/dist/icons/CheckIcon.js +1 -1
  418. package/dist/icons/CircleFilledIcon.js +1 -1
  419. package/dist/icons/ClearIcon.js +1 -1
  420. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  421. package/dist/icons/CloseCircleIcon.js +1 -1
  422. package/dist/icons/CloseIcon.js +1 -1
  423. package/dist/icons/CodeIcon.js +1 -1
  424. package/dist/icons/ColumnTotalIcon.js +1 -1
  425. package/dist/icons/CopyIcon.js +1 -1
  426. package/dist/icons/CountIcon.js +1 -1
  427. package/dist/icons/CubeIcon.js +1 -1
  428. package/dist/icons/CubePauseIcon.js +1 -1
  429. package/dist/icons/CubePlayIcon.js +1 -1
  430. package/dist/icons/CurrencyDollarIcon.js +1 -1
  431. package/dist/icons/DangerIcon.js +1 -1
  432. package/dist/icons/DashboardIcon.js +1 -1
  433. package/dist/icons/DatabaseIcon.js +1 -1
  434. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  435. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  436. package/dist/icons/DirectionIcon.js +1 -1
  437. package/dist/icons/DonutIcon.js +1 -1
  438. package/dist/icons/DownIcon.js +1 -1
  439. package/dist/icons/EditIcon.js +1 -1
  440. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  441. package/dist/icons/ExclamationCircleIcon.js +1 -1
  442. package/dist/icons/ExclamationIcon.js +1 -1
  443. package/dist/icons/EyeIcon.js +1 -1
  444. package/dist/icons/EyeInvisibleIcon.js +1 -1
  445. package/dist/icons/FilterIcon.js +1 -1
  446. package/dist/icons/FolderFilledIcon.js +1 -1
  447. package/dist/icons/FolderIcon.js +1 -1
  448. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  449. package/dist/icons/FolderOpenIcon.js +1 -1
  450. package/dist/icons/ForwardIcon.js +1 -1
  451. package/dist/icons/GripVerticalIcon.js +1 -1
  452. package/dist/icons/HierarchyIcon.js +1 -1
  453. package/dist/icons/HierarchyOpenIcon.js +1 -1
  454. package/dist/icons/Icon.js +1 -1
  455. package/dist/icons/InfoCircleIcon.js +1 -1
  456. package/dist/icons/InfoIcon.js +1 -1
  457. package/dist/icons/KeyIcon.js +1 -1
  458. package/dist/icons/LeftIcon.js +1 -1
  459. package/dist/icons/LineChartIcon.js +1 -1
  460. package/dist/icons/LoadingIcon.js +1 -1
  461. package/dist/icons/LockFilledIcon.js +1 -1
  462. package/dist/icons/LockIcon.js +1 -1
  463. package/dist/icons/MoreIcon.js +1 -1
  464. package/dist/icons/NotAllowedIcon.js +1 -1
  465. package/dist/icons/Number123Icon.js +1 -1
  466. package/dist/icons/NumberIcon.js +1 -1
  467. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  468. package/dist/icons/PauseCircleIcon.js +1 -1
  469. package/dist/icons/PauseIcon.js +1 -1
  470. package/dist/icons/PercentageIcon.js +1 -1
  471. package/dist/icons/PieChartIcon.js +1 -1
  472. package/dist/icons/PipetteIcon.js +1 -1
  473. package/dist/icons/PlayCircleIcon.js +1 -1
  474. package/dist/icons/PlayIcon.js +1 -1
  475. package/dist/icons/PlusIcon.js +1 -1
  476. package/dist/icons/ProgressBarIcon.js +1 -1
  477. package/dist/icons/ReloadIcon.js +1 -1
  478. package/dist/icons/ReportIcon.js +1 -1
  479. package/dist/icons/ReturnIcon.js +1 -1
  480. package/dist/icons/RightIcon.js +1 -1
  481. package/dist/icons/RowTotalsIcon.js +1 -1
  482. package/dist/icons/SchemeIcon.js +1 -1
  483. package/dist/icons/SearchIcon.js +1 -1
  484. package/dist/icons/SemanticQueryIcon.js +1 -1
  485. package/dist/icons/SettingsIcon.js +1 -1
  486. package/dist/icons/ShieldFilledIcon.js +1 -1
  487. package/dist/icons/ShieldIcon.js +1 -1
  488. package/dist/icons/SlashIcon.js +1 -1
  489. package/dist/icons/SparklesIcon.js +1 -1
  490. package/dist/icons/SqlIcon.js +1 -1
  491. package/dist/icons/StatsIcon.js +1 -1
  492. package/dist/icons/StopIcon.js +1 -1
  493. package/dist/icons/StringIcon.js +1 -1
  494. package/dist/icons/SubtotalsIcon.js +1 -1
  495. package/dist/icons/SwitchIcon.js +1 -1
  496. package/dist/icons/TableIcon.js +1 -1
  497. package/dist/icons/ThumbsDownIcon.js +1 -1
  498. package/dist/icons/ThumbsUpIcon.js +1 -1
  499. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  500. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  501. package/dist/icons/ThunderboltIcon.js +1 -1
  502. package/dist/icons/TimeIcon.js +1 -1
  503. package/dist/icons/TrashIcon.js +1 -1
  504. package/dist/icons/UnlockIcon.js +1 -1
  505. package/dist/icons/UpIcon.js +1 -1
  506. package/dist/icons/UserGroupIcon.js +1 -1
  507. package/dist/icons/UserIcon.js +1 -1
  508. package/dist/icons/UserLockIcon.js +1 -1
  509. package/dist/icons/ViewIcon.js +1 -1
  510. package/dist/icons/WarningFilledIcon.js +1 -1
  511. package/dist/icons/WarningIcon.js +1 -1
  512. package/dist/icons/wrap-icon.js +1 -1
  513. package/dist/index.d.ts +4 -3
  514. package/dist/index.js +3 -2
  515. package/dist/index.js.map +1 -1
  516. package/dist/probe/canonicalize.js +1 -1
  517. package/dist/probe/css.js +1 -1
  518. package/dist/probe/index.js +1 -1
  519. package/dist/provider.js +1 -1
  520. package/dist/providers/TrackingProvider.js +1 -1
  521. package/dist/providers/navigationAdapter.default.js +1 -1
  522. package/dist/tokens/base.js +1 -1
  523. package/dist/tokens/color-seed.js +1 -1
  524. package/dist/tokens/color-theme.js +1 -1
  525. package/dist/tokens/colors.js +1 -1
  526. package/dist/tokens/index.js +1 -1
  527. package/dist/tokens/layout.js +1 -1
  528. package/dist/tokens/lazy-styles.js +1 -1
  529. package/dist/tokens/palette-config.js +1 -1
  530. package/dist/tokens/palette.js +1 -1
  531. package/dist/tokens/shadows.js +1 -1
  532. package/dist/tokens/sizes.js +1 -1
  533. package/dist/tokens/spacing.js +1 -1
  534. package/dist/tokens/typography.js +1 -1
  535. package/dist/utils/ResizeSensor.js +1 -1
  536. package/dist/utils/is-dev-env.js +1 -1
  537. package/dist/utils/modules.js +1 -1
  538. package/dist/utils/promise.js +1 -1
  539. package/dist/utils/raf.js +1 -1
  540. package/dist/utils/random.js +1 -1
  541. package/dist/utils/range.js +1 -1
  542. package/dist/utils/react/RenderCache.js +1 -1
  543. package/dist/utils/react/Slots.js +1 -1
  544. package/dist/utils/react/chain.js +1 -1
  545. package/dist/utils/react/disabledProps.js +1 -1
  546. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  547. package/dist/utils/react/index.js +1 -1
  548. package/dist/utils/react/interactions.js +1 -1
  549. package/dist/utils/react/isTextOnly.js +1 -1
  550. package/dist/utils/react/mapProps.js +1 -1
  551. package/dist/utils/react/mergeProps.js +1 -1
  552. package/dist/utils/react/nullableValue.js +1 -1
  553. package/dist/utils/react/resolveIcon.js +1 -1
  554. package/dist/utils/react/sharedStore.js +1 -1
  555. package/dist/utils/react/useBufferedValue.js +1 -1
  556. package/dist/utils/react/useCombinedRefs.js +1 -1
  557. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  558. package/dist/utils/react/useEventBus.js +1 -1
  559. package/dist/utils/react/useId.js +1 -1
  560. package/dist/utils/react/useIsDarwin.js +1 -1
  561. package/dist/utils/react/useKeySymbols.js +1 -1
  562. package/dist/utils/react/useLayoutEffect.js +1 -1
  563. package/dist/utils/react/useLocalStorage.js +1 -1
  564. package/dist/utils/react/useMergeStyles.js +1 -1
  565. package/dist/utils/react/usePopoverSync.js +1 -1
  566. package/dist/utils/react/useQaProps.js +1 -1
  567. package/dist/utils/react/useViewportSize.js +1 -1
  568. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  569. package/dist/utils/selection.js +1 -1
  570. package/dist/utils/styles.js +1 -1
  571. package/dist/utils/tree.js +1 -1
  572. package/dist/utils/warnings.js +1 -1
  573. package/dist/version.js +3 -3
  574. package/docs/Introduction.md +85 -97
  575. package/docs/Usage.md +26 -0
  576. package/docs/components/data/DataTable.md +110 -11
  577. package/docs/components/data/ItemTable.md +63 -1
  578. package/docs/components/layout/Board.md +37 -6
  579. package/docs/components/overlays/Tooltip.md +12 -0
  580. package/docs/tasty/configuration.md +10 -6
  581. package/docs/tasty/dsl.md +99 -2
  582. package/docs/tasty/styles.md +3 -1
  583. package/package.json +2 -2
@@ -0,0 +1,58 @@
1
+
2
+ import { Layout, LayoutItem } from "./types.js";
3
+
4
+ //#region src/components/layout/Board/grid-core/placement.d.ts
5
+ /**
6
+ * The first position at or below the preferred cell where `item` fits without
7
+ * overlapping any of `others` (which must themselves be overlap-free), scanning
8
+ * left-to-right then top-to-bottom and never past `maxRows`; if the band below
9
+ * is full, upward toward the top.
10
+ *
11
+ * This is the rule the board itself applies when it has to land a widget that
12
+ * cannot stay where it was dropped, so using it for a programmatic add is what
13
+ * makes the two agree.
14
+ *
15
+ * A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path
16
+ * applies (`clamp(y, 0, maxRows - h)`): the item's bottom edge stays within the
17
+ * row limit even when the landing cell is blocked, so the downward scan cannot
18
+ * push it off the board. If the whole valid band is full the item is clamped to
19
+ * the limit — bounds win over overlap, exactly as `gridBounds` does. With an
20
+ * unbounded `maxRows` there is always a free slot below every existing item, so
21
+ * the downward scan terminates on its own.
22
+ *
23
+ * The returned item is a copy; `item` is not mutated. Its `w` is capped to
24
+ * `cols`, and no other dimension is changed — this never resizes to fit.
25
+ */
26
+ declare function placeInFreeSlot(others: Layout, item: LayoutItem, cols: number, maxRows?: number): LayoutItem;
27
+ /**
28
+ * Tile every item evenly across both axes of a `cols × rows` grid, keeping the
29
+ * row structure the layout already has: items are grouped into visual rows by
30
+ * their current `y`, `rows` is divided across those groups, and `cols` across
31
+ * each group's members.
32
+ *
33
+ * So three items on one line become three equal full-height columns; move one
34
+ * below and the top line becomes two half-width cells while the lower item
35
+ * spans the full width at half height. Grouping by `y` rather than reflowing
36
+ * from scratch is what makes the result recognisably the user's arrangement
37
+ * instead of an arbitrary repack.
38
+ *
39
+ * A visual row holding more items than the grid is wide is wrapped into
40
+ * sub-rows of at most `cols`, so nothing tiles past the right edge. That can
41
+ * take the result past `rows`; the caller decides whether to grow the grid or
42
+ * let its bounds clip.
43
+ *
44
+ * This is the one operation that deliberately GROWS items — every gesture-driven
45
+ * path refuses to, because growing on a move is a surprise. Here it is the whole
46
+ * point, which is why it is a call the app makes rather than a mode the board is
47
+ * in. Returns new items in the input's order; the input is not mutated.
48
+ */
49
+ declare function distributeEvenly(layout: Layout, {
50
+ cols,
51
+ rows
52
+ }: {
53
+ cols: number;
54
+ rows: number;
55
+ }): LayoutItem[];
56
+ //#endregion
57
+ export { distributeEvenly, placeInFreeSlot };
58
+ //# sourceMappingURL=placement.d.ts.map
@@ -0,0 +1,153 @@
1
+ /** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
2
+ import { collides } from "./collision.js";
3
+
4
+ //#region src/components/layout/Board/grid-core/placement.ts
5
+ /**
6
+ * Placing items into a grid without dragging them there.
7
+ *
8
+ * A board's own gestures resolve placement through the compactor and the
9
+ * collision resolver. An app that adds a widget programmatically — a toolbar
10
+ * drop, a widget moved between boards by code, an "arrange these for me"
11
+ * command — has to answer the same question with no gesture in hand, and had no
12
+ * way to ask the engine for the answer. Left to solve it themselves, apps
13
+ * re-implement the scan, and the same drop lands in two different cells
14
+ * depending on whether a pointer or a code path served it.
15
+ *
16
+ * Original UI Kit code (not vendored from react-grid-layout).
17
+ */
18
+ /**
19
+ * The first position at or below the preferred cell where `item` fits without
20
+ * overlapping any of `others` (which must themselves be overlap-free), scanning
21
+ * left-to-right then top-to-bottom and never past `maxRows`; if the band below
22
+ * is full, upward toward the top.
23
+ *
24
+ * This is the rule the board itself applies when it has to land a widget that
25
+ * cannot stay where it was dropped, so using it for a programmatic add is what
26
+ * makes the two agree.
27
+ *
28
+ * A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path
29
+ * applies (`clamp(y, 0, maxRows - h)`): the item's bottom edge stays within the
30
+ * row limit even when the landing cell is blocked, so the downward scan cannot
31
+ * push it off the board. If the whole valid band is full the item is clamped to
32
+ * the limit — bounds win over overlap, exactly as `gridBounds` does. With an
33
+ * unbounded `maxRows` there is always a free slot below every existing item, so
34
+ * the downward scan terminates on its own.
35
+ *
36
+ * The returned item is a copy; `item` is not mutated. Its `w` is capped to
37
+ * `cols`, and no other dimension is changed — this never resizes to fit.
38
+ */
39
+ function placeInFreeSlot(others, item, cols, maxRows = Infinity) {
40
+ const w = Math.min(item.w, cols);
41
+ const maxY = Number.isFinite(maxRows) ? Math.max(0, maxRows - item.h) : Infinity;
42
+ const fits = (x, y) => !others.some((o) => collides(o, {
43
+ ...item,
44
+ x,
45
+ y,
46
+ w
47
+ }));
48
+ const preferX = Math.min(Math.max(0, item.x), cols - w);
49
+ const startY = Math.min(Math.max(0, item.y), maxY);
50
+ if (fits(preferX, startY)) return {
51
+ ...item,
52
+ x: preferX,
53
+ y: startY,
54
+ w
55
+ };
56
+ const scanBottom = Number.isFinite(maxRows) ? maxY : startY + others.reduce((m, o) => Math.max(m, o.y + o.h), 0) + 1;
57
+ for (let y = startY; y <= scanBottom; y++) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
58
+ ...item,
59
+ x,
60
+ y,
61
+ w
62
+ };
63
+ for (let y = startY - 1; y >= 0; y--) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
64
+ ...item,
65
+ x,
66
+ y,
67
+ w
68
+ };
69
+ return {
70
+ ...item,
71
+ x: preferX,
72
+ y: startY,
73
+ w
74
+ };
75
+ }
76
+ /**
77
+ * Split `total` cells across `parts` groups as evenly as possible: each group
78
+ * gets at least one, and the first `total % parts` groups get one extra so the
79
+ * pieces sum to `total`. With more groups than cells every group still gets one
80
+ * and the sum overflows, which the grid's own bounds then clip — the best
81
+ * available answer when there is less than a cell to go round.
82
+ */
83
+ function splitEvenly(total, parts) {
84
+ if (parts <= 0) return [];
85
+ const base = Math.max(1, Math.floor(total / parts));
86
+ const remainder = base * parts >= total ? 0 : total - base * parts;
87
+ return Array.from({ length: parts }, (_, i) => base + (i < remainder ? 1 : 0));
88
+ }
89
+ /**
90
+ * Tile every item evenly across both axes of a `cols × rows` grid, keeping the
91
+ * row structure the layout already has: items are grouped into visual rows by
92
+ * their current `y`, `rows` is divided across those groups, and `cols` across
93
+ * each group's members.
94
+ *
95
+ * So three items on one line become three equal full-height columns; move one
96
+ * below and the top line becomes two half-width cells while the lower item
97
+ * spans the full width at half height. Grouping by `y` rather than reflowing
98
+ * from scratch is what makes the result recognisably the user's arrangement
99
+ * instead of an arbitrary repack.
100
+ *
101
+ * A visual row holding more items than the grid is wide is wrapped into
102
+ * sub-rows of at most `cols`, so nothing tiles past the right edge. That can
103
+ * take the result past `rows`; the caller decides whether to grow the grid or
104
+ * let its bounds clip.
105
+ *
106
+ * This is the one operation that deliberately GROWS items — every gesture-driven
107
+ * path refuses to, because growing on a move is a surprise. Here it is the whole
108
+ * point, which is why it is a call the app makes rather than a mode the board is
109
+ * in. Returns new items in the input's order; the input is not mutated.
110
+ */
111
+ function distributeEvenly(layout, { cols, rows }) {
112
+ if (layout.length === 0) return [];
113
+ const gridCols = Math.max(1, cols);
114
+ const gridRows = Math.max(1, rows);
115
+ const sorted = [...layout].sort((a, b) => a.y !== b.y ? a.y - b.y : a.x - b.x);
116
+ const groups = [];
117
+ let lastY = null;
118
+ for (const item of sorted) {
119
+ if (lastY === null || item.y !== lastY) {
120
+ groups.push([]);
121
+ lastY = item.y;
122
+ }
123
+ groups[groups.length - 1].push(item);
124
+ }
125
+ const rowGroups = [];
126
+ for (const group of groups) if (group.length <= gridCols) rowGroups.push(group);
127
+ else for (let i = 0; i < group.length; i += gridCols) rowGroups.push(group.slice(i, i + gridCols));
128
+ const rowHeights = splitEvenly(gridRows, rowGroups.length);
129
+ const placed = /* @__PURE__ */ new Map();
130
+ let y = 0;
131
+ rowGroups.forEach((group, gi) => {
132
+ const h = rowHeights[gi];
133
+ const widths = splitEvenly(gridCols, group.length);
134
+ let x = 0;
135
+ group.forEach((item, ci) => {
136
+ const w = widths[ci];
137
+ placed.set(item.i, {
138
+ ...item,
139
+ x,
140
+ y,
141
+ w,
142
+ h
143
+ });
144
+ x += w;
145
+ });
146
+ y += h;
147
+ });
148
+ return layout.map((item) => placed.get(item.i) ?? item);
149
+ }
150
+
151
+ //#endregion
152
+ export { distributeEvenly, placeInFreeSlot };
153
+ //# sourceMappingURL=placement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placement.js","names":[],"sources":["../../../../../src/components/layout/Board/grid-core/placement.ts"],"sourcesContent":["/**\n * Placing items into a grid without dragging them there.\n *\n * A board's own gestures resolve placement through the compactor and the\n * collision resolver. An app that adds a widget programmatically — a toolbar\n * drop, a widget moved between boards by code, an \"arrange these for me\"\n * command — has to answer the same question with no gesture in hand, and had no\n * way to ask the engine for the answer. Left to solve it themselves, apps\n * re-implement the scan, and the same drop lands in two different cells\n * depending on whether a pointer or a code path served it.\n *\n * Original UI Kit code (not vendored from react-grid-layout).\n */\n\nimport { collides } from './collision';\n\nimport type { Layout, LayoutItem } from './types';\n\n/**\n * The first position at or below the preferred cell where `item` fits without\n * overlapping any of `others` (which must themselves be overlap-free), scanning\n * left-to-right then top-to-bottom and never past `maxRows`; if the band below\n * is full, upward toward the top.\n *\n * This is the rule the board itself applies when it has to land a widget that\n * cannot stay where it was dropped, so using it for a programmatic add is what\n * makes the two agree.\n *\n * A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path\n * applies (`clamp(y, 0, maxRows - h)`): the item's bottom edge stays within the\n * row limit even when the landing cell is blocked, so the downward scan cannot\n * push it off the board. If the whole valid band is full the item is clamped to\n * the limit — bounds win over overlap, exactly as `gridBounds` does. With an\n * unbounded `maxRows` there is always a free slot below every existing item, so\n * the downward scan terminates on its own.\n *\n * The returned item is a copy; `item` is not mutated. Its `w` is capped to\n * `cols`, and no other dimension is changed — this never resizes to fit.\n */\nexport function placeInFreeSlot(\n others: Layout,\n item: LayoutItem,\n cols: number,\n maxRows = Infinity,\n): LayoutItem {\n const w = Math.min(item.w, cols);\n const maxY = Number.isFinite(maxRows)\n ? Math.max(0, maxRows - item.h)\n : Infinity;\n const fits = (x: number, y: number) =>\n !others.some((o) => collides(o, { ...item, x, y, w }));\n const preferX = Math.min(Math.max(0, item.x), cols - w);\n const startY = Math.min(Math.max(0, item.y), maxY);\n if (fits(preferX, startY)) return { ...item, x: preferX, y: startY, w };\n const scanBottom = Number.isFinite(maxRows)\n ? maxY\n : startY + others.reduce((m, o) => Math.max(m, o.y + o.h), 0) + 1;\n for (let y = startY; y <= scanBottom; y++) {\n for (let x = 0; x <= cols - w; x++) {\n if (fits(x, y)) return { ...item, x, y, w };\n }\n }\n // The landing row (clamped to the limit) and everything below it were full;\n // look upward for a free slot still inside the board before giving up.\n for (let y = startY - 1; y >= 0; y--) {\n for (let x = 0; x <= cols - w; x++) {\n if (fits(x, y)) return { ...item, x, y, w };\n }\n }\n return { ...item, x: preferX, y: startY, w };\n}\n\n/**\n * Split `total` cells across `parts` groups as evenly as possible: each group\n * gets at least one, and the first `total % parts` groups get one extra so the\n * pieces sum to `total`. With more groups than cells every group still gets one\n * and the sum overflows, which the grid's own bounds then clip — the best\n * available answer when there is less than a cell to go round.\n */\nfunction splitEvenly(total: number, parts: number): number[] {\n if (parts <= 0) return [];\n const base = Math.max(1, Math.floor(total / parts));\n const remainder = base * parts >= total ? 0 : total - base * parts;\n return Array.from(\n { length: parts },\n (_, i) => base + (i < remainder ? 1 : 0),\n );\n}\n\n/**\n * Tile every item evenly across both axes of a `cols × rows` grid, keeping the\n * row structure the layout already has: items are grouped into visual rows by\n * their current `y`, `rows` is divided across those groups, and `cols` across\n * each group's members.\n *\n * So three items on one line become three equal full-height columns; move one\n * below and the top line becomes two half-width cells while the lower item\n * spans the full width at half height. Grouping by `y` rather than reflowing\n * from scratch is what makes the result recognisably the user's arrangement\n * instead of an arbitrary repack.\n *\n * A visual row holding more items than the grid is wide is wrapped into\n * sub-rows of at most `cols`, so nothing tiles past the right edge. That can\n * take the result past `rows`; the caller decides whether to grow the grid or\n * let its bounds clip.\n *\n * This is the one operation that deliberately GROWS items — every gesture-driven\n * path refuses to, because growing on a move is a surprise. Here it is the whole\n * point, which is why it is a call the app makes rather than a mode the board is\n * in. Returns new items in the input's order; the input is not mutated.\n */\nexport function distributeEvenly(\n layout: Layout,\n { cols, rows }: { cols: number; rows: number },\n): LayoutItem[] {\n if (layout.length === 0) return [];\n\n const gridCols = Math.max(1, cols);\n const gridRows = Math.max(1, rows);\n\n const sorted = [...layout].sort((a, b) =>\n a.y !== b.y ? a.y - b.y : a.x - b.x,\n );\n\n const groups: LayoutItem[][] = [];\n let lastY: number | null = null;\n for (const item of sorted) {\n if (lastY === null || item.y !== lastY) {\n groups.push([]);\n lastY = item.y;\n }\n groups[groups.length - 1].push(item);\n }\n\n const rowGroups: LayoutItem[][] = [];\n for (const group of groups) {\n if (group.length <= gridCols) {\n rowGroups.push(group);\n } else {\n for (let i = 0; i < group.length; i += gridCols) {\n rowGroups.push(group.slice(i, i + gridCols));\n }\n }\n }\n\n const rowHeights = splitEvenly(gridRows, rowGroups.length);\n const placed = new Map<string, LayoutItem>();\n let y = 0;\n rowGroups.forEach((group, gi) => {\n const h = rowHeights[gi];\n const widths = splitEvenly(gridCols, group.length);\n let x = 0;\n group.forEach((item, ci) => {\n const w = widths[ci];\n placed.set(item.i, { ...item, x, y, w, h });\n x += w;\n });\n y += h;\n });\n\n // Emit in the caller's order, not the sort's: a layout is keyed by `i`, and\n // reordering it would churn every consumer that diffs the array positionally.\n return layout.map((item) => placed.get(item.i) ?? item);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAAgB,gBACd,QACA,MACA,MACA,UAAU,UACE;CACZ,MAAM,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK;CAChC,MAAM,OAAO,OAAO,SAAS,QAAQ,GACjC,KAAK,IAAI,GAAG,UAAU,KAAK,EAAE,GAC7B;CACJ,MAAM,QAAQ,GAAW,MACvB,CAAC,OAAO,MAAM,MAAM,SAAS,GAAG;EAAE,GAAG;EAAM;EAAG;EAAG;EAAG,CAAC,CAAC;CACxD,MAAM,UAAU,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE;CACvD,MAAM,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,EAAE,EAAE,KAAK;AAClD,KAAI,KAAK,SAAS,OAAO,CAAE,QAAO;EAAE,GAAG;EAAM,GAAG;EAAS,GAAG;EAAQ;EAAG;CACvE,MAAM,aAAa,OAAO,SAAS,QAAQ,GACvC,OACA,SAAS,OAAO,QAAQ,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG;AAClE,MAAK,IAAI,IAAI,QAAQ,KAAK,YAAY,IACpC,MAAK,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAC7B,KAAI,KAAK,GAAG,EAAE,CAAE,QAAO;EAAE,GAAG;EAAM;EAAG;EAAG;EAAG;AAK/C,MAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,IAC/B,MAAK,IAAI,IAAI,GAAG,KAAK,OAAO,GAAG,IAC7B,KAAI,KAAK,GAAG,EAAE,CAAE,QAAO;EAAE,GAAG;EAAM;EAAG;EAAG;EAAG;AAG/C,QAAO;EAAE,GAAG;EAAM,GAAG;EAAS,GAAG;EAAQ;EAAG;;;;;;;;;AAU9C,SAAS,YAAY,OAAe,OAAyB;AAC3D,KAAI,SAAS,EAAG,QAAO,EAAE;CACzB,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,MAAM,CAAC;CACnD,MAAM,YAAY,OAAO,SAAS,QAAQ,IAAI,QAAQ,OAAO;AAC7D,QAAO,MAAM,KACX,EAAE,QAAQ,OAAO,GAChB,GAAG,MAAM,QAAQ,IAAI,YAAY,IAAI,GACvC;;;;;;;;;;;;;;;;;;;;;;;;AAyBH,SAAgB,iBACd,QACA,EAAE,MAAM,QACM;AACd,KAAI,OAAO,WAAW,EAAG,QAAO,EAAE;CAElC,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK;CAClC,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK;CAElC,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,MAClC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EACnC;CAED,MAAM,SAAyB,EAAE;CACjC,IAAI,QAAuB;AAC3B,MAAK,MAAM,QAAQ,QAAQ;AACzB,MAAI,UAAU,QAAQ,KAAK,MAAM,OAAO;AACtC,UAAO,KAAK,EAAE,CAAC;AACf,WAAQ,KAAK;;AAEf,SAAO,OAAO,SAAS,GAAG,KAAK,KAAK;;CAGtC,MAAM,YAA4B,EAAE;AACpC,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,UAAU,SAClB,WAAU,KAAK,MAAM;KAErB,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,SACrC,WAAU,KAAK,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;CAKlD,MAAM,aAAa,YAAY,UAAU,UAAU,OAAO;CAC1D,MAAM,yBAAS,IAAI,KAAyB;CAC5C,IAAI,IAAI;AACR,WAAU,SAAS,OAAO,OAAO;EAC/B,MAAM,IAAI,WAAW;EACrB,MAAM,SAAS,YAAY,UAAU,MAAM,OAAO;EAClD,IAAI,IAAI;AACR,QAAM,SAAS,MAAM,OAAO;GAC1B,MAAM,IAAI,OAAO;AACjB,UAAO,IAAI,KAAK,GAAG;IAAE,GAAG;IAAM;IAAG;IAAG;IAAG;IAAG,CAAC;AAC3C,QAAK;IACL;AACF,OAAK;GACL;AAIF,QAAO,OAAO,KAAK,SAAS,OAAO,IAAI,KAAK,EAAE,IAAI,KAAK"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
2
2
  //#region src/components/layout/Board/grid-core/sort.ts
3
3
  /**
4
4
  * Sort layout items based on the compaction type.
@@ -93,10 +93,12 @@ type CompactType = 'horizontal' | 'vertical' | 'wrap' | null;
93
93
  * - `'revert'` - snap the item back to where it was (the engine's own default).
94
94
  * - `'downscale'` - shrink the item into the free space at the cell it was
95
95
  * dropped on, growing rightward and downward. Never upscales.
96
- * - `'swap'` - exchange with one widget: the dragged widget takes the cell of the
97
- * widget the drop covers most, and that widget takes the cell the dragged one
98
- * came from, each keeping as much of its own size as fits there. Never displaces
99
- * more than that one widget. Else downscale, else revert.
96
+ * - `'swap'` - inside one board, exchange with one widget: the dragged widget
97
+ * takes the cell of the widget the drop covers most, and that widget takes the
98
+ * cell the dragged one came from, each keeping as much of its own size as fits
99
+ * there. Across boards, insert only at an empty anchor and downscale without
100
+ * exchanging or reflowing destination widgets; an invalid landing cancels the
101
+ * transfer. Never displaces more than one widget. Else downscale, else revert.
100
102
  *
101
103
  * Only consulted where a move would otherwise be refused, so it has no effect in
102
104
  * the compacting modes (a collision pushes neighbours there) or under
@@ -1,5 +1,6 @@
1
1
 
2
2
  import { CollisionMode, Compactor, Layout, LayoutConstraint, LayoutItem, ResizeHandleAxis } from "./grid-core/types.js";
3
+ import { distributeEvenly, placeInFreeSlot } from "./grid-core/placement.js";
3
4
  import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
4
5
  import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
5
6
  import { BoardSelectionMode } from "./use-board-selection.js";
@@ -1,4 +1,5 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
2
+ import { distributeEvenly, placeInFreeSlot } from "./grid-core/placement.js";
2
3
  import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
3
4
  import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
4
5
  import { BoardProvider } from "./BoardProvider.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["BoardBase"],"sources":["../../../../src/components/layout/Board/index.tsx"],"sourcesContent":["import { Board as BoardBase } from './Board';\nimport { BoardProvider } from './BoardProvider';\nimport { BoardResponsive } from './BoardResponsive';\nimport { Widget } from './Widget';\n\nconst Board = Object.assign(BoardBase, {\n Widget,\n Provider: BoardProvider,\n Responsive: BoardResponsive,\n});\n\nexport { Board };\nexport { BoardProvider };\nexport { BoardResponsive };\nexport { Widget as BoardWidget };\nexport { BOARD_SELECTION_CANCEL } from './Board';\n\nexport type {\n CubeBoardProps,\n BoardCompactType,\n BoardGridLines,\n BoardInteractionInfo,\n} from './Board';\nexport type { BoardSelectionMode } from './use-board-selection';\nexport type { CubeBoardResponsiveProps } from './BoardResponsive';\nexport type { CubeBoardWidgetProps, BoardResizeGripPlacement } from './Widget';\nexport type { CubeBoardProviderProps } from './BoardProvider';\nexport type { WidgetTransferInfo } from './board-context';\nexport type {\n Breakpoints as BoardBreakpoints,\n BreakpointCols as BoardBreakpointCols,\n ResponsiveLayouts as BoardResponsiveLayouts,\n} from './responsive-utils';\n\nexport type {\n Layout,\n LayoutItem,\n ResizeHandleAxis,\n CollisionMode,\n Compactor,\n LayoutConstraint,\n PositionParams,\n} from './grid-core';\n\nexport {\n verticalCompactor,\n horizontalCompactor,\n noCompactor,\n getCompactor,\n gridBounds,\n minMaxSize,\n containerBounds,\n boundedX,\n boundedY,\n aspectRatio,\n snapToGrid,\n minSize,\n maxSize,\n} from './grid-core';\n"],"mappings":";;;;;;;;;AAKA,MAAM,QAAQ,OAAO,OAAOA,SAAW;CACrC;CACA,UAAU;CACV,YAAY;CACb,CAAC"}
1
+ {"version":3,"file":"index.js","names":["BoardBase"],"sources":["../../../../src/components/layout/Board/index.tsx"],"sourcesContent":["import { Board as BoardBase } from './Board';\nimport { BoardProvider } from './BoardProvider';\nimport { BoardResponsive } from './BoardResponsive';\nimport { Widget } from './Widget';\n\nconst Board = Object.assign(BoardBase, {\n Widget,\n Provider: BoardProvider,\n Responsive: BoardResponsive,\n});\n\nexport { Board };\nexport { BoardProvider };\nexport { BoardResponsive };\nexport { Widget as BoardWidget };\nexport { BOARD_SELECTION_CANCEL } from './Board';\n\nexport type {\n CubeBoardProps,\n BoardCompactType,\n BoardGridLines,\n BoardInteractionInfo,\n} from './Board';\nexport type { BoardSelectionMode } from './use-board-selection';\nexport type { CubeBoardResponsiveProps } from './BoardResponsive';\nexport type { CubeBoardWidgetProps, BoardResizeGripPlacement } from './Widget';\nexport type { CubeBoardProviderProps } from './BoardProvider';\nexport type { WidgetTransferInfo } from './board-context';\nexport type {\n Breakpoints as BoardBreakpoints,\n BreakpointCols as BoardBreakpointCols,\n ResponsiveLayouts as BoardResponsiveLayouts,\n} from './responsive-utils';\n\nexport type {\n Layout,\n LayoutItem,\n ResizeHandleAxis,\n CollisionMode,\n Compactor,\n LayoutConstraint,\n PositionParams,\n} from './grid-core';\n\nexport { placeInFreeSlot, distributeEvenly } from './grid-core';\n\nexport {\n verticalCompactor,\n horizontalCompactor,\n noCompactor,\n getCompactor,\n gridBounds,\n minMaxSize,\n containerBounds,\n boundedX,\n boundedY,\n aspectRatio,\n snapToGrid,\n minSize,\n maxSize,\n} from './grid-core';\n"],"mappings":";;;;;;;;;;AAKA,MAAM,QAAQ,OAAO,OAAOA,SAAW;CACrC;CACA,UAAU;CACV,YAAY;CACb,CAAC"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
2
2
  import { cloneLayout, correctBounds } from "./grid-core/layout.js";
3
3
 
4
4
  //#region src/components/layout/Board/responsive-utils.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { cloneLayout } from "./grid-core/layout.js";
4
4
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -1,8 +1,9 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.164.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.166.0 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { BoardWidgetStore } from "./board-store.js";
4
4
  import { collides } from "./grid-core/collision.js";
5
5
  import { createCollisionResolver } from "./grid-core/collision-modes.js";
6
+ import { placeInFreeSlot } from "./grid-core/placement.js";
6
7
  import { bottom, cloneLayout, getLayoutItem, moveElement } from "./grid-core/layout.js";
7
8
  import { moveElements } from "./grid-core/group-move.js";
8
9
  import { calcXYRaw } from "./grid-core/calculate.js";
@@ -77,58 +78,6 @@ function resizesAnything(before, after) {
77
78
  return !!b && (b.w !== a.w || b.h !== a.h);
78
79
  });
79
80
  }
80
- /**
81
- * First position at or below the preferred cell where `item` fits without
82
- * overlapping any of `others` (assumed overlap-free), scanning left-to-right
83
- * then top-to-bottom, never past `maxRows`. Last-resort placement for a legacy
84
- * (no-op compaction) cross-board drop that would otherwise stack widgets.
85
- *
86
- * A finite `maxRows` mirrors the `gridBounds` constraint the normal landing path
87
- * applies (`clamp(y, 0, maxRows - h)`): the widget's bottom edge (`y + h`) stays
88
- * within the row limit even when the landing cell is blocked, so the downward
89
- * scan can't push it off the board. Rows are searched from the (clamped) landing
90
- * row down to the limit first, then upward toward the top; if the whole valid
91
- * band is full the widget is clamped to the limit (bounds win over overlap, as
92
- * `gridBounds` does). With an unbounded `maxRows` there is always a free slot
93
- * below every existing item, so the downward scan terminates on its own.
94
- */
95
- function placeInFreeSlot(others, item, cols, maxRows = Infinity) {
96
- const w = Math.min(item.w, cols);
97
- const maxY = Number.isFinite(maxRows) ? Math.max(0, maxRows - item.h) : Infinity;
98
- const fits = (x, y) => !others.some((o) => collides(o, {
99
- ...item,
100
- x,
101
- y,
102
- w
103
- }));
104
- const preferX = Math.min(Math.max(0, item.x), cols - w);
105
- const startY = Math.min(Math.max(0, item.y), maxY);
106
- if (fits(preferX, startY)) return {
107
- ...item,
108
- x: preferX,
109
- y: startY,
110
- w
111
- };
112
- const scanBottom = Number.isFinite(maxRows) ? maxY : startY + others.reduce((m, o) => Math.max(m, o.y + o.h), 0) + 1;
113
- for (let y = startY; y <= scanBottom; y++) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
114
- ...item,
115
- x,
116
- y,
117
- w
118
- };
119
- for (let y = startY - 1; y >= 0; y--) for (let x = 0; x <= cols - w; x++) if (fits(x, y)) return {
120
- ...item,
121
- x,
122
- y,
123
- w
124
- };
125
- return {
126
- ...item,
127
- x: preferX,
128
- y: startY,
129
- w
130
- };
131
- }
132
81
  function useBoardRegistry(options) {
133
82
  const store = useMemo(() => new BoardWidgetStore(), []);
134
83
  const onTransferRef = useRef(options?.onWidgetTransfer);
@@ -140,6 +89,7 @@ function useBoardRegistry(options) {
140
89
  const sourceSnapshotRef = useRef([]);
141
90
  const targetSnapshotsRef = useRef(/* @__PURE__ */ new Map());
142
91
  const previewRef = useRef(null);
92
+ const targetLandingRef = useRef(null);
143
93
  const frozenRectsRef = useRef(/* @__PURE__ */ new Map());
144
94
  const nestedInDraggedRef = useRef(/* @__PURE__ */ new Set());
145
95
  const lastLandingRef = useRef(null);
@@ -254,6 +204,7 @@ function useBoardRegistry(options) {
254
204
  affectedRef.current = new Set([boardId]);
255
205
  sourceSnapshotRef.current = cloneLayout(entry.getLayout());
256
206
  previewRef.current = null;
207
+ targetLandingRef.current = null;
257
208
  lastLandingRef.current = {
258
209
  x: item.x,
259
210
  y: item.y
@@ -485,6 +436,7 @@ function useBoardRegistry(options) {
485
436
  const previewOnTarget = useCallback((target, item, x, y) => {
486
437
  const pp = target.getPositionParams();
487
438
  const compactor = target.getCompactor();
439
+ const strictIncomingSwap = compactor.preventCollision === true && !compactor.allowOverlap && target.getCollisionMode() === "swap";
488
440
  const carried = previewRef.current?.boardId === target.id ? previewRef.current.working : null;
489
441
  const base = cloneLayout(carried ?? targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== item.i);
490
442
  const prevItem = carried ? getLayoutItem(carried, item.i) : void 0;
@@ -510,19 +462,47 @@ function useBoardRegistry(options) {
510
462
  },
511
463
  allowExchange: false
512
464
  }) : void 0 });
513
- const compacted = [...compactor.compact(moved, pp.cols)];
514
- if (!compactor.allowOverlap && hasNewOverlap(overlappingPairs(base), compacted)) return;
465
+ const compacted = strictIncomingSwap ? cloneLayout(moved) : [...compactor.compact(moved, pp.cols)];
466
+ const landed = getLayoutItem(compacted, item.i);
467
+ if (!compactor.allowOverlap && hasNewOverlap(overlappingPairs(base), compacted)) {
468
+ if (strictIncomingSwap) {
469
+ const snapshot = targetSnapshotsRef.current.get(target.id);
470
+ if (snapshot) target.applyLayout(cloneLayout(snapshot), false);
471
+ target.setPlaceholders([]);
472
+ previewRef.current = null;
473
+ targetLandingRef.current = {
474
+ boardId: target.id,
475
+ valid: false
476
+ };
477
+ }
478
+ return;
479
+ }
480
+ if (strictIncomingSwap && (!landed || landed.x !== x || landed.y !== y)) {
481
+ const snapshot = targetSnapshotsRef.current.get(target.id);
482
+ if (snapshot) target.applyLayout(cloneLayout(snapshot), false);
483
+ target.setPlaceholders([]);
484
+ previewRef.current = null;
485
+ targetLandingRef.current = {
486
+ boardId: target.id,
487
+ valid: false
488
+ };
489
+ return;
490
+ }
515
491
  previewRef.current = {
516
492
  boardId: target.id,
517
493
  working: compacted
518
494
  };
519
- const landed = getLayoutItem(compacted, item.i) ?? {
495
+ targetLandingRef.current = {
496
+ boardId: target.id,
497
+ valid: true
498
+ };
499
+ const previewItem = landed ?? {
520
500
  ...item,
521
501
  x,
522
502
  y
523
503
  };
524
504
  target.applyLayout(compacted.filter((l) => l.i !== item.i), false);
525
- target.setPlaceholders([{ ...landed }]);
505
+ target.setPlaceholders([{ ...previewItem }]);
526
506
  }, []);
527
507
  const onDragMove = useEvent((deltaX, deltaY, pointerType) => {
528
508
  const ds = dragStateRef.current;
@@ -567,6 +547,7 @@ function useBoardRegistry(options) {
567
547
  if (snap) prev?.applyLayout(cloneLayout(snap), false);
568
548
  prev?.setPlaceholders([]);
569
549
  previewRef.current = null;
550
+ targetLandingRef.current = null;
570
551
  }
571
552
  if (isGroup) moveGroupWithinBoard(target, ds, x - ds.item.x, y - ds.item.y);
572
553
  else moveWithinBoard(target, ds.item, x, y);
@@ -586,6 +567,7 @@ function useBoardRegistry(options) {
586
567
  }
587
568
  prev?.setPlaceholders([]);
588
569
  previewRef.current = null;
570
+ targetLandingRef.current = null;
589
571
  if (!targetSnapshotsRef.current.has(target.id)) targetSnapshotsRef.current.set(target.id, cloneLayout(target.getLayout()));
590
572
  }
591
573
  previewOnTarget(target, ds.item, x, y);
@@ -614,55 +596,63 @@ function useBoardRegistry(options) {
614
596
  x: ds.item.x,
615
597
  y: ds.item.y
616
598
  };
617
- if (source) {
618
- const sp = source.getPositionParams();
619
- const sc = source.getCompactor();
620
- const remaining = source.getLayout().filter((l) => l.i !== ds.itemId);
621
- source.applyLayout([...sc.compact(remaining, sp.cols)], true);
622
- }
623
599
  const tp = target.getPositionParams();
624
600
  const tc = target.getCompactor();
601
+ const strictIncomingSwap = tc.preventCollision === true && !tc.allowOverlap && target.getCollisionMode() === "swap";
625
602
  const carried = previewRef.current?.boardId === target.id && getLayoutItem(previewRef.current.working, ds.itemId) ? previewRef.current.working : null;
626
- let finalLayout;
627
- if (carried) finalLayout = [...tc.compact(cloneLayout(carried), tp.cols)];
628
- else {
629
- const newItem = tc.type === "horizontal" ? {
630
- ...ds.item,
631
- x: Math.max(0, landing.x) - 1,
632
- y: landing.y
633
- } : {
634
- ...ds.item,
635
- x: landing.x,
636
- y: Math.max(0, landing.y) - 1
637
- };
638
- const moved = moveElement([...cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId)), newItem], newItem, landing.x, landing.y, true, tc.preventCollision, tc.type, tp.cols, tc.allowOverlap, { resolveCollision: createCollisionResolver(target.getCollisionMode(), {
639
- cols: tp.cols,
640
- maxRows: tp.maxRows,
641
- desired: {
642
- w: ds.item.w,
643
- h: ds.item.h
644
- },
645
- allowExchange: false
646
- }) });
647
- finalLayout = [...tc.compact(moved, tp.cols)];
648
- }
649
- const targetOthers = cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId));
650
- if (!tc.allowOverlap && hasNewOverlap(overlappingPairs(targetOthers), finalLayout)) finalLayout = [...targetOthers, placeInFreeSlot(targetOthers, {
651
- ...ds.item,
652
- x: landing.x,
653
- y: landing.y
654
- }, tp.cols, tp.maxRows)];
655
- target.applyLayout(finalLayout, true);
656
- onTransferRef.current?.({
657
- widgetId: ds.itemId,
658
- fromBoardId: ds.sourceBoardId,
659
- toBoardId: target.id,
660
- item: getLayoutItem(finalLayout, ds.itemId) ?? {
603
+ const hasValidStrictLanding = targetLandingRef.current?.boardId === target.id && targetLandingRef.current.valid && carried != null;
604
+ if (strictIncomingSwap && !hasValidStrictLanding) {
605
+ if (source) source.applyLayout(cloneLayout(sourceSnapshotRef.current), false);
606
+ const targetSnapshot = targetSnapshotsRef.current.get(target.id);
607
+ if (targetSnapshot) target.applyLayout(cloneLayout(targetSnapshot), false);
608
+ } else {
609
+ if (source) {
610
+ const sp = source.getPositionParams();
611
+ const sc = source.getCompactor();
612
+ const remaining = source.getLayout().filter((l) => l.i !== ds.itemId);
613
+ source.applyLayout([...sc.compact(remaining, sp.cols)], true);
614
+ }
615
+ let finalLayout;
616
+ if (carried) finalLayout = strictIncomingSwap ? cloneLayout(carried) : [...tc.compact(cloneLayout(carried), tp.cols)];
617
+ else {
618
+ const newItem = tc.type === "horizontal" ? {
619
+ ...ds.item,
620
+ x: Math.max(0, landing.x) - 1,
621
+ y: landing.y
622
+ } : {
623
+ ...ds.item,
624
+ x: landing.x,
625
+ y: Math.max(0, landing.y) - 1
626
+ };
627
+ const moved = moveElement([...cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId)), newItem], newItem, landing.x, landing.y, true, tc.preventCollision, tc.type, tp.cols, tc.allowOverlap, { resolveCollision: createCollisionResolver(target.getCollisionMode(), {
628
+ cols: tp.cols,
629
+ maxRows: tp.maxRows,
630
+ desired: {
631
+ w: ds.item.w,
632
+ h: ds.item.h
633
+ },
634
+ allowExchange: false
635
+ }) });
636
+ finalLayout = [...tc.compact(moved, tp.cols)];
637
+ }
638
+ const targetOthers = cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId));
639
+ if (!tc.allowOverlap && hasNewOverlap(overlappingPairs(targetOthers), finalLayout)) finalLayout = [...targetOthers, placeInFreeSlot(targetOthers, {
661
640
  ...ds.item,
662
641
  x: landing.x,
663
642
  y: landing.y
664
- }
665
- });
643
+ }, tp.cols, tp.maxRows)];
644
+ target.applyLayout(finalLayout, true);
645
+ onTransferRef.current?.({
646
+ widgetId: ds.itemId,
647
+ fromBoardId: ds.sourceBoardId,
648
+ toBoardId: target.id,
649
+ item: getLayoutItem(finalLayout, ds.itemId) ?? {
650
+ ...ds.item,
651
+ x: landing.x,
652
+ y: landing.y
653
+ }
654
+ });
655
+ }
666
656
  }
667
657
  const ids = new Set(affectedRef.current);
668
658
  ids.add(ds.sourceBoardId);
@@ -674,6 +664,7 @@ function useBoardRegistry(options) {
674
664
  frozenRectsRef.current.clear();
675
665
  nestedInDraggedRef.current = /* @__PURE__ */ new Set();
676
666
  previewRef.current = null;
667
+ targetLandingRef.current = null;
677
668
  lastLandingRef.current = null;
678
669
  setDragState(null);
679
670
  });