@cube-dev/ui-kit 0.170.0 → 0.171.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 (555) hide show
  1. package/dist/CHANGELOG.md +20 -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.d.ts +0 -1
  20. package/dist/components/actions/Button/Button.js +1 -1
  21. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  22. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  23. package/dist/components/actions/ButtonSplit/context.js +1 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  25. package/dist/components/actions/CommandMenu/styled.js +1 -1
  26. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  27. package/dist/components/actions/ItemActionContext.js +1 -1
  28. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  29. package/dist/components/actions/Link/Link.js +1 -1
  30. package/dist/components/actions/Menu/Menu.js +1 -1
  31. package/dist/components/actions/Menu/MenuItem.js +1 -1
  32. package/dist/components/actions/Menu/MenuSection.js +1 -1
  33. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  34. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  36. package/dist/components/actions/Menu/context.js +1 -1
  37. package/dist/components/actions/Menu/styled.js +1 -1
  38. package/dist/components/actions/index.js +1 -1
  39. package/dist/components/actions/use-action.js +1 -1
  40. package/dist/components/actions/use-anchored-menu.js +1 -1
  41. package/dist/components/actions/use-context-menu.js +1 -1
  42. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  43. package/dist/components/content/Alert/Alert.js +1 -1
  44. package/dist/components/content/Alert/use-alert.js +1 -1
  45. package/dist/components/content/Avatar/Avatar.js +1 -1
  46. package/dist/components/content/Badge/Badge.js +1 -1
  47. package/dist/components/content/Card/Card.js +1 -1
  48. package/dist/components/content/Content.js +1 -1
  49. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  50. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  51. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  52. package/dist/components/content/Divider.js +1 -1
  53. package/dist/components/content/Footer.js +1 -1
  54. package/dist/components/content/Header.js +1 -1
  55. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  56. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  57. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  58. package/dist/components/content/Item/Item.js +1 -1
  59. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  60. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  61. package/dist/components/content/Layout/GridLayout.js +1 -1
  62. package/dist/components/content/Layout/Layout.js +1 -1
  63. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  64. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  65. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  66. package/dist/components/content/Layout/LayoutContent.js +1 -1
  67. package/dist/components/content/Layout/LayoutContext.js +1 -1
  68. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  69. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  70. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  71. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  72. package/dist/components/content/Layout/LayoutPane.js +1 -1
  73. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  74. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  75. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  76. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  77. package/dist/components/content/Layout/index.js +1 -1
  78. package/dist/components/content/Layout/utils.js +1 -1
  79. package/dist/components/content/Paragraph.js +1 -1
  80. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  81. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  82. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  83. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  84. package/dist/components/content/Result/Result.js +1 -1
  85. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  86. package/dist/components/content/Tag/Tag.js +1 -1
  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 +1 -1
  99. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  100. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  101. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  102. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  103. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  104. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  105. package/dist/components/data/TableBase/RowCollection.js +1 -1
  106. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  107. package/dist/components/data/TableBase/TableRow.js +1 -1
  108. package/dist/components/data/TableBase/TableView.js +1 -1
  109. package/dist/components/data/TableBase/column-menu.js +1 -1
  110. package/dist/components/data/TableBase/column-tint.js +1 -1
  111. package/dist/components/data/TableBase/row-menu.js +1 -1
  112. package/dist/components/data/TableBase/styled.d.ts +1 -2
  113. package/dist/components/data/TableBase/styled.js +1 -1
  114. package/dist/components/data/TableBase/table-tree.js +1 -1
  115. package/dist/components/data/TableBase/types.js +1 -1
  116. package/dist/components/data/TableBase/use-cell-selection.d.ts +0 -1
  117. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  118. package/dist/components/data/TableBase/use-column-order.js +1 -1
  119. package/dist/components/data/TableBase/use-container-width.js +1 -1
  120. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  121. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  122. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  123. package/dist/components/data/TableBase/use-table-search.js +1 -1
  124. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  125. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  126. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  127. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  128. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  129. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  130. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  131. package/dist/components/fields/Checkbox/context.js +1 -1
  132. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  133. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  134. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  135. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  136. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  137. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  138. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  139. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  140. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  141. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  142. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  143. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  144. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  145. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  146. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  147. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  148. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  149. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  150. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  151. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  152. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  153. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  154. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  155. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  156. package/dist/components/fields/DatePicker/period.js +1 -1
  157. package/dist/components/fields/DatePicker/props.js +1 -1
  158. package/dist/components/fields/DatePicker/utils.js +1 -1
  159. package/dist/components/fields/FileInput/FileInput.js +1 -1
  160. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  161. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  162. package/dist/components/fields/Input/Input.js +1 -1
  163. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  164. package/dist/components/fields/ListBox/ListBox.js +1 -1
  165. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  166. package/dist/components/fields/ListBoxPopover/index.d.ts +0 -1
  167. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  168. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  169. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  170. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  171. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  172. package/dist/components/fields/Picker/Picker.js +1 -1
  173. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  174. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  175. package/dist/components/fields/RadioGroup/context.js +1 -1
  176. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  177. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  178. package/dist/components/fields/Select/Select.js +1 -1
  179. package/dist/components/fields/Slider/Gradation.js +1 -1
  180. package/dist/components/fields/Slider/HueSlider.js +1 -1
  181. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  182. package/dist/components/fields/Slider/Slider.js +1 -1
  183. package/dist/components/fields/Slider/SliderBase.js +1 -1
  184. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  185. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  186. package/dist/components/fields/Slider/elements.js +1 -1
  187. package/dist/components/fields/Slider/index.js +1 -1
  188. package/dist/components/fields/Switch/Switch.js +1 -1
  189. package/dist/components/fields/TextArea/TextArea.js +1 -1
  190. package/dist/components/fields/TextInput/TextInput.js +1 -1
  191. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  192. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  193. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  194. package/dist/components/fields/color/ColorPanel.js +1 -1
  195. package/dist/components/fields/color/channels.js +1 -1
  196. package/dist/components/fields/color/color.js +1 -1
  197. package/dist/components/fields/color/context.js +1 -1
  198. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  199. package/dist/components/form/Form/Field.js +1 -1
  200. package/dist/components/form/Form/Form.js +1 -1
  201. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  202. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  203. package/dist/components/form/Form/SubmitError.js +1 -1
  204. package/dist/components/form/Form/index.js +1 -1
  205. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  206. package/dist/components/form/Form/use-field/use-field.js +1 -1
  207. package/dist/components/form/Form/use-form.js +1 -1
  208. package/dist/components/form/Form/validation.js +1 -1
  209. package/dist/components/form/Label.js +1 -1
  210. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  211. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  212. package/dist/components/form/validation/use-validation-props.js +1 -1
  213. package/dist/components/form/wrapper.js +1 -1
  214. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  215. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  216. package/dist/components/layout/Board/Board.d.ts +6 -4
  217. package/dist/components/layout/Board/Board.js +1 -1
  218. package/dist/components/layout/Board/Board.js.map +1 -1
  219. package/dist/components/layout/Board/BoardProvider.js +1 -1
  220. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  221. package/dist/components/layout/Board/Widget.js +1 -1
  222. package/dist/components/layout/Board/WidgetHost.js +1 -1
  223. package/dist/components/layout/Board/board-context.js +1 -1
  224. package/dist/components/layout/Board/board-store.js +1 -1
  225. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  226. package/dist/components/layout/Board/grid-core/collision-modes.js +75 -7
  227. package/dist/components/layout/Board/grid-core/collision-modes.js.map +1 -1
  228. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  229. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  230. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  231. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  232. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  233. package/dist/components/layout/Board/grid-core/placement.js +1 -1
  234. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  235. package/dist/components/layout/Board/index.js +1 -1
  236. package/dist/components/layout/Board/responsive-utils.js +1 -1
  237. package/dist/components/layout/Board/use-board-layout.js +1 -1
  238. package/dist/components/layout/Board/use-board-registry.js +95 -88
  239. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  240. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  241. package/dist/components/layout/Board/use-board-selection.js +1 -1
  242. package/dist/components/layout/Flex.js +1 -1
  243. package/dist/components/layout/Flow.js +1 -1
  244. package/dist/components/layout/Grid.js +1 -1
  245. package/dist/components/layout/Panel.js +1 -1
  246. package/dist/components/layout/Prefix.js +1 -1
  247. package/dist/components/layout/ResizablePanel.js +1 -1
  248. package/dist/components/layout/Space.js +1 -1
  249. package/dist/components/layout/Suffix.js +1 -1
  250. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  251. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  252. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  253. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  254. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  255. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  256. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  257. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  258. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  259. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  260. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  261. package/dist/components/navigation/Tabs/styled.js +1 -1
  262. package/dist/components/navigation/Tabs/types.js +1 -1
  263. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  264. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  265. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  266. package/dist/components/other/Calendar/Calendar.js +1 -1
  267. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  268. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  269. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  270. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  271. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  272. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  273. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  274. package/dist/components/other/Calendar/styled.js +1 -1
  275. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  276. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  277. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  278. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  279. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  280. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  281. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  282. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  283. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  284. package/dist/components/overlays/Dialog/context.js +1 -1
  285. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  286. package/dist/components/overlays/Modal/Modal.d.ts +1 -2
  287. package/dist/components/overlays/Modal/Modal.js +1 -1
  288. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  289. package/dist/components/overlays/Modal/Overlay.d.ts +0 -1
  290. package/dist/components/overlays/Modal/Overlay.js +1 -1
  291. package/dist/components/overlays/Modal/Popover.js +1 -1
  292. package/dist/components/overlays/Modal/Tray.js +1 -1
  293. package/dist/components/overlays/Modal/Underlay.js +1 -1
  294. package/dist/components/overlays/Modal/types.d.ts +0 -1
  295. package/dist/components/overlays/Notifications/Notification.js +1 -1
  296. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  297. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  298. package/dist/components/overlays/Notifications/NotificationContext.d.ts +0 -2
  299. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  300. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  301. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  302. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  303. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  304. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  305. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  306. package/dist/components/overlays/Notifications/index.js +1 -1
  307. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  308. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  309. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  310. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  311. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  312. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  313. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  314. package/dist/components/overlays/Toast/index.js +1 -1
  315. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  316. package/dist/components/overlays/Toast/useToast.js +1 -1
  317. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  318. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  319. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  320. package/dist/components/overlays/Tooltip/context.js +1 -1
  321. package/dist/components/portal/Portal.js +1 -1
  322. package/dist/components/portal/PortalProvider.js +1 -1
  323. package/dist/components/portal/index.d.ts +0 -1
  324. package/dist/components/portal/usePortal.js +1 -1
  325. package/dist/components/shared/DraggableCollection.js +1 -1
  326. package/dist/components/shared/InvalidIcon.js +1 -1
  327. package/dist/components/shared/ValidIcon.js +1 -1
  328. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  329. package/dist/components/status/Spin/Cube.js +1 -1
  330. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  331. package/dist/components/status/Spin/Spin.js +1 -1
  332. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  333. package/dist/data/item-themes.js +1 -1
  334. package/dist/data/themes.js +1 -1
  335. package/dist/eslint-plugin/defaults.generated.js +1 -1
  336. package/dist/eslint-plugin/index.js +1 -1
  337. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  338. package/dist/i18n/I18nProvider.js +1 -1
  339. package/dist/i18n/createFormatter.js +1 -1
  340. package/dist/i18n/index.js +1 -1
  341. package/dist/i18n/instance.js +1 -1
  342. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  343. package/dist/i18n/locales/en-US/uikit.js +1 -1
  344. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  345. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  346. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  347. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  348. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  349. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  350. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  351. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  352. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  353. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  354. package/dist/i18n/locales.js +1 -1
  355. package/dist/i18n/useFormatter.js +1 -1
  356. package/dist/i18n/useI18n.js +1 -1
  357. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  358. package/dist/icons/AdjustmentsIcon.js +1 -1
  359. package/dist/icons/AiIcon.js +1 -1
  360. package/dist/icons/AreaChartIcon.js +1 -1
  361. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  362. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  363. package/dist/icons/BackwardIcon.js +1 -1
  364. package/dist/icons/BarChartIcon.js +1 -1
  365. package/dist/icons/BellFilledIcon.js +1 -1
  366. package/dist/icons/BellIcon.js +1 -1
  367. package/dist/icons/BooleanIcon.js +1 -1
  368. package/dist/icons/CalendarEditIcon.js +1 -1
  369. package/dist/icons/CalendarIcon.js +1 -1
  370. package/dist/icons/CaretDownIcon.js +1 -1
  371. package/dist/icons/CaretUpIcon.js +1 -1
  372. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  373. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  374. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  375. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  376. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  377. package/dist/icons/ChartBarLineIcon.js +1 -1
  378. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  379. package/dist/icons/ChartBarStackedIcon.js +1 -1
  380. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  381. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  382. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  383. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  384. package/dist/icons/ChartBubbleIcon.js +1 -1
  385. package/dist/icons/ChartDonut2Icon.js +1 -1
  386. package/dist/icons/ChartFunnelIcon.js +1 -1
  387. package/dist/icons/ChartHeatmapIcon.js +1 -1
  388. package/dist/icons/ChartKPIIcon.js +1 -1
  389. package/dist/icons/ChartPie2Icon.js +1 -1
  390. package/dist/icons/ChartScatterIcon.js +1 -1
  391. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  392. package/dist/icons/CheckCircleIcon.js +1 -1
  393. package/dist/icons/CheckIcon.js +1 -1
  394. package/dist/icons/CircleFilledIcon.js +1 -1
  395. package/dist/icons/ClearIcon.js +1 -1
  396. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  397. package/dist/icons/CloseCircleIcon.js +1 -1
  398. package/dist/icons/CloseIcon.js +1 -1
  399. package/dist/icons/CodeIcon.js +1 -1
  400. package/dist/icons/ColumnTotalIcon.js +1 -1
  401. package/dist/icons/CopyIcon.js +1 -1
  402. package/dist/icons/CountIcon.js +1 -1
  403. package/dist/icons/CubeIcon.js +1 -1
  404. package/dist/icons/CubePauseIcon.js +1 -1
  405. package/dist/icons/CubePlayIcon.js +1 -1
  406. package/dist/icons/CurrencyDollarIcon.js +1 -1
  407. package/dist/icons/DangerIcon.js +1 -1
  408. package/dist/icons/DashboardIcon.js +1 -1
  409. package/dist/icons/DatabaseIcon.js +1 -1
  410. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  411. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  412. package/dist/icons/DirectionIcon.js +1 -1
  413. package/dist/icons/DonutIcon.js +1 -1
  414. package/dist/icons/DownIcon.js +1 -1
  415. package/dist/icons/EditIcon.js +1 -1
  416. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  417. package/dist/icons/ExclamationCircleIcon.js +1 -1
  418. package/dist/icons/ExclamationIcon.js +1 -1
  419. package/dist/icons/EyeIcon.js +1 -1
  420. package/dist/icons/EyeInvisibleIcon.js +1 -1
  421. package/dist/icons/FilterIcon.js +1 -1
  422. package/dist/icons/FolderFilledIcon.js +1 -1
  423. package/dist/icons/FolderIcon.js +1 -1
  424. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  425. package/dist/icons/FolderOpenIcon.js +1 -1
  426. package/dist/icons/ForwardIcon.js +1 -1
  427. package/dist/icons/GripVerticalIcon.js +1 -1
  428. package/dist/icons/HierarchyIcon.js +1 -1
  429. package/dist/icons/HierarchyOpenIcon.js +1 -1
  430. package/dist/icons/Icon.js +1 -1
  431. package/dist/icons/InfoCircleIcon.js +1 -1
  432. package/dist/icons/InfoIcon.js +1 -1
  433. package/dist/icons/KeyIcon.js +1 -1
  434. package/dist/icons/LeftIcon.js +1 -1
  435. package/dist/icons/LineChartIcon.js +1 -1
  436. package/dist/icons/LoadingIcon.js +1 -1
  437. package/dist/icons/LockFilledIcon.js +1 -1
  438. package/dist/icons/LockIcon.js +1 -1
  439. package/dist/icons/MoreIcon.js +1 -1
  440. package/dist/icons/NotAllowedIcon.js +1 -1
  441. package/dist/icons/Number123Icon.js +1 -1
  442. package/dist/icons/NumberIcon.js +1 -1
  443. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  444. package/dist/icons/PauseCircleIcon.js +1 -1
  445. package/dist/icons/PauseIcon.js +1 -1
  446. package/dist/icons/PercentageIcon.js +1 -1
  447. package/dist/icons/PieChartIcon.js +1 -1
  448. package/dist/icons/PipetteIcon.js +1 -1
  449. package/dist/icons/PlayCircleIcon.js +1 -1
  450. package/dist/icons/PlayIcon.js +1 -1
  451. package/dist/icons/PlusIcon.js +1 -1
  452. package/dist/icons/ProgressBarIcon.js +1 -1
  453. package/dist/icons/ReloadIcon.js +1 -1
  454. package/dist/icons/ReportIcon.js +1 -1
  455. package/dist/icons/ReturnIcon.js +1 -1
  456. package/dist/icons/RightIcon.js +1 -1
  457. package/dist/icons/RowTotalsIcon.js +1 -1
  458. package/dist/icons/SchemeIcon.js +1 -1
  459. package/dist/icons/SearchIcon.js +1 -1
  460. package/dist/icons/SemanticQueryIcon.js +1 -1
  461. package/dist/icons/SettingsIcon.js +1 -1
  462. package/dist/icons/ShieldFilledIcon.js +1 -1
  463. package/dist/icons/ShieldIcon.js +1 -1
  464. package/dist/icons/SlashIcon.js +1 -1
  465. package/dist/icons/SparklesIcon.js +1 -1
  466. package/dist/icons/SqlIcon.js +1 -1
  467. package/dist/icons/StatsIcon.js +1 -1
  468. package/dist/icons/StopIcon.js +1 -1
  469. package/dist/icons/StringIcon.js +1 -1
  470. package/dist/icons/SubtotalsIcon.js +1 -1
  471. package/dist/icons/SwitchIcon.js +1 -1
  472. package/dist/icons/TableIcon.js +1 -1
  473. package/dist/icons/ThumbsDownIcon.js +1 -1
  474. package/dist/icons/ThumbsUpIcon.js +1 -1
  475. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  476. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  477. package/dist/icons/ThunderboltIcon.js +1 -1
  478. package/dist/icons/TimeIcon.js +1 -1
  479. package/dist/icons/TrashIcon.js +1 -1
  480. package/dist/icons/UnlockIcon.js +1 -1
  481. package/dist/icons/UpIcon.js +1 -1
  482. package/dist/icons/UserGroupIcon.js +1 -1
  483. package/dist/icons/UserIcon.js +1 -1
  484. package/dist/icons/UserLockIcon.js +1 -1
  485. package/dist/icons/ViewIcon.js +1 -1
  486. package/dist/icons/WarningFilledIcon.js +1 -1
  487. package/dist/icons/WarningIcon.js +1 -1
  488. package/dist/icons/wrap-icon.js +1 -1
  489. package/dist/index.js +1 -1
  490. package/dist/probe/canonicalize.js +1 -1
  491. package/dist/probe/css.js +1 -1
  492. package/dist/probe/index.js +1 -1
  493. package/dist/provider.js +1 -1
  494. package/dist/providers/TrackingProvider.js +1 -1
  495. package/dist/providers/navigationAdapter.default.js +1 -1
  496. package/dist/tokens/all-tokens.js +1 -1
  497. package/dist/tokens/base.js +1 -1
  498. package/dist/tokens/color-seed.js +1 -1
  499. package/dist/tokens/color-theme.js +1 -1
  500. package/dist/tokens/colors.js +1 -1
  501. package/dist/tokens/layout.js +1 -1
  502. package/dist/tokens/lazy-styles.js +1 -1
  503. package/dist/tokens/palette-config.js +1 -1
  504. package/dist/tokens/palette.js +1 -1
  505. package/dist/tokens/resolve.js +1 -1
  506. package/dist/tokens/shadows.js +1 -1
  507. package/dist/tokens/sizes.js +1 -1
  508. package/dist/tokens/spacing.js +1 -1
  509. package/dist/tokens/typography.js +1 -1
  510. package/dist/utils/ResizeSensor.js +1 -1
  511. package/dist/utils/is-dev-env.js +1 -1
  512. package/dist/utils/modules.js +1 -1
  513. package/dist/utils/promise.js +1 -1
  514. package/dist/utils/raf.js +1 -1
  515. package/dist/utils/random.js +1 -1
  516. package/dist/utils/range.js +1 -1
  517. package/dist/utils/react/RenderCache.js +1 -1
  518. package/dist/utils/react/Slots.js +1 -1
  519. package/dist/utils/react/chain.js +1 -1
  520. package/dist/utils/react/disabledProps.js +1 -1
  521. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  522. package/dist/utils/react/index.js +1 -1
  523. package/dist/utils/react/interactions.js +1 -1
  524. package/dist/utils/react/isTextOnly.js +1 -1
  525. package/dist/utils/react/mapProps.js +1 -1
  526. package/dist/utils/react/mergeProps.js +1 -1
  527. package/dist/utils/react/nullableValue.js +1 -1
  528. package/dist/utils/react/resolveIcon.js +1 -1
  529. package/dist/utils/react/sharedStore.js +1 -1
  530. package/dist/utils/react/useBufferedValue.js +1 -1
  531. package/dist/utils/react/useCombinedRefs.js +1 -1
  532. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  533. package/dist/utils/react/useEventBus.js +1 -1
  534. package/dist/utils/react/useId.js +1 -1
  535. package/dist/utils/react/useIsDarwin.js +1 -1
  536. package/dist/utils/react/useKeySymbols.js +1 -1
  537. package/dist/utils/react/useLayoutEffect.js +1 -1
  538. package/dist/utils/react/useLocalStorage.js +1 -1
  539. package/dist/utils/react/useMergeStyles.js +1 -1
  540. package/dist/utils/react/usePopoverSync.js +1 -1
  541. package/dist/utils/react/useQaProps.js +1 -1
  542. package/dist/utils/react/useSchema.js +1 -1
  543. package/dist/utils/react/useViewportSize.js +1 -1
  544. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  545. package/dist/utils/selection.js +1 -1
  546. package/dist/utils/styles.js +1 -1
  547. package/dist/utils/tree.js +1 -1
  548. package/dist/utils/warnings.js +1 -1
  549. package/dist/version.js +2 -2
  550. package/docs/components/fields/RadioGroup.md +28 -8
  551. package/docs/components/layout/Board.md +2 -2
  552. package/docs/components/navigation/Tabs.md +1 -1
  553. package/package.json +2 -2
  554. package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +0 -2
  555. package/dist/components/portal/PortalProvider.d.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"collision-modes.js","names":[],"sources":["../../../../../src/components/layout/Board/grid-core/collision-modes.ts"],"sourcesContent":["/**\n * Collision resolution strategies for a grid that prevents collisions.\n *\n * Original UI Kit code (not vendored from react-grid-layout): the upstream\n * engine only ever reverts a blocked move.\n *\n * When `preventCollision` is on, `moveElement` refuses any placement that\n * overlaps an existing item and snaps the dragged item back. That is the right\n * default, but a free grid often wants the placement *resolved* instead of\n * refused - shrunk into whatever room is actually there, or exchanged with the\n * widget already sitting in the target slot. These strategies produce such a\n * resolution, and every resolution they return is overlap-free, so the caller's\n * own overlap guards keep working unchanged.\n */\n\nimport { collides } from './collision';\n\nimport type {\n CollisionMode,\n CollisionResolver,\n CollisionResolverOptions,\n Layout,\n LayoutItem,\n} from './types';\n\n/** Whether a single grid cell is free of every item in `others`. */\nfunction cellFree(others: Layout, x: number, y: number): boolean {\n for (let i = 0; i < others.length; i++) {\n const o = others[i];\n if (\n o !== undefined &&\n x >= o.x &&\n x < o.x + o.w &&\n y >= o.y &&\n y < o.y + o.h\n ) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * The largest rectangle anchored at `anchor` that fits without overlapping\n * `others`, growing rightward and downward only.\n *\n * Never larger than `desired` (a drag must never *upscale* a widget - growing\n * things is an explicit, opt-in operation like \"distribute evenly\", not a side\n * effect of moving them), never smaller than the item's own `minW`/`minH`, and\n * never past `cols` / `maxRows`. Among the candidates the largest-area rectangle\n * wins, breaking ties on width: a grid is read left to right, so a wide-and-flat\n * result is the less surprising of two equal-area fits.\n *\n * Returns `null` when not even the minimum size fits, which the callers treat as\n * \"no resolution\" and fall back to reverting.\n */\nexport function maxFreeRectAt(\n others: Layout,\n anchor: { x: number; y: number },\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n mins?: { minW?: number; minH?: number },\n): { w: number; h: number } | null {\n if (anchor.x < 0 || anchor.y < 0) return null;\n\n const minW = Math.max(1, mins?.minW ?? 1);\n const minH = Math.max(1, mins?.minH ?? 1);\n const maxRows = limits.maxRows ?? Infinity;\n const maxW = Math.min(desired.w, limits.cols - anchor.x);\n const maxH = Math.min(\n desired.h,\n Number.isFinite(maxRows) ? maxRows - anchor.y : desired.h,\n );\n\n if (maxW < minW || maxH < minH) return null;\n\n // Free height available in each column of the candidate band, measured down\n // from the anchor row and capped at the tallest useful height.\n const free: number[] = [];\n for (let dx = 0; dx < maxW; dx++) {\n let h = 0;\n while (h < maxH && cellFree(others, anchor.x + dx, anchor.y + h)) h++;\n free.push(h);\n // A column with no room at all caps every wider candidate, so stop early.\n if (h === 0) break;\n }\n\n let best: { w: number; h: number } | null = null;\n let bestArea = 0;\n let limit = maxH;\n for (let w = 1; w <= free.length; w++) {\n limit = Math.min(limit, free[w - 1]!);\n if (limit < minH) break;\n if (w < minW) continue;\n const area = w * limit;\n // `>=` so the widest of several equal-area fits wins: `w` only grows here, so\n // the last match is the widest one.\n if (area >= bestArea) {\n best = { w, h: limit };\n bestArea = area;\n }\n }\n\n return best;\n}\n\n/**\n * Shrink the placement to the room actually available at the cell it was\n * dropped on.\n */\nfunction downscaleInPlace(\n layout: Layout,\n item: LayoutItem,\n others: Layout,\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n): LayoutItem[] | null {\n const fit = maxFreeRectAt(\n others,\n { x: item.x, y: item.y },\n desired,\n limits,\n item,\n );\n if (!fit) return null;\n // Nothing to resolve: the requested size already fits, so the collision was\n // not a sizing problem and reverting is still the honest answer.\n if (fit.w === item.w && fit.h === item.h) return null;\n\n return layout.map((l) =>\n l.i === item.i ? { ...l, w: fit.w, h: fit.h, moved: true } : l,\n );\n}\n\n/** Number of cells two items share. Zero when they do not overlap at all. */\nfunction overlapArea(a: LayoutItem, b: LayoutItem): number {\n const w = Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x);\n const h = Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y);\n return w > 0 && h > 0 ? w * h : 0;\n}\n\n/**\n * Exchange the placement with one of the widgets under it.\n *\n * The dragged widget takes the other's cell and the other takes the cell the\n * dragged widget came from. Each keeps as much of its own size as fits there -\n * that cell plus any free space adjacent to it - and neither ever grows.\n *\n * `from` is whatever the caller's layout says, so it is the caller that decides\n * what \"came from\" means. A pointer drag resolves every frame against the\n * arrangement the gesture started with, making it the cell the drag began at, and\n * keeping the result a pure function of where the pointer is; chaining frames off\n * each other instead would exchange with every widget swept over.\n * The slot the dragged widget is leaving is reserved for the displaced widget\n * while the dragged one is sized, so the two can never claim the same cells: the\n * result is overlap-free by construction, not by a follow-up check.\n */\nfunction exchangeWithCollision(\n layout: Layout,\n item: LayoutItem,\n collisions: LayoutItem[],\n from: { x: number; y: number },\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n): LayoutItem[] | null {\n // Nothing to trade if the widget has not actually left a slot behind - a\n // cross-board drop, where it never had one on this board.\n if (from.x === item.x && from.y === item.y) return null;\n\n // A drop that spans a boundary covers two widgets at once, and refusing those\n // frames would leave a band mid-drag where nothing is swapped at all: the\n // placeholder snaps back to the origin, then jumps to the far swap once the drop\n // clears the first widget. Trade with the one the drop covers most instead, so\n // the swap only ever changes which partner it is - never blinks away. Ties go to\n // the widget earlier in reading order, so the choice is deterministic. Exactly\n // one widget is ever displaced, whichever is picked.\n const candidates = collisions\n .filter((c) => !c.static)\n .map((c) => ({ c, area: overlapArea(item, c) }))\n .sort((p, q) => q.area - p.area || p.c.y - q.c.y || p.c.x - q.c.x)\n .map(({ c }) => c);\n\n for (const other of candidates) {\n const exchanged = exchangeWith(layout, item, other, from, desired, limits);\n if (exchanged) return exchanged;\n }\n return null;\n}\n\n/** One concrete two-widget exchange, or `null` if either side cannot fit. */\nfunction exchangeWith(\n layout: Layout,\n item: LayoutItem,\n other: LayoutItem,\n from: { x: number; y: number },\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n): LayoutItem[] | null {\n const rest = layout.filter((l) => l.i !== item.i && l.i !== other.i);\n // The slot being vacated, held back so the dragged widget cannot grow into the\n // space the displaced one is about to need. Ids are never compared here (the\n // scan works cell by cell), so this placeholder cannot clash with a real one.\n const originSlot: LayoutItem = {\n i: 'origin-slot-reservation',\n x: from.x,\n y: from.y,\n w: desired.w,\n h: desired.h,\n };\n\n const movedFit = maxFreeRectAt(\n [...rest, originSlot],\n { x: other.x, y: other.y },\n desired,\n limits,\n item,\n );\n if (!movedFit) return null;\n const moved: LayoutItem = {\n ...item,\n x: other.x,\n y: other.y,\n w: movedFit.w,\n h: movedFit.h,\n moved: true,\n };\n\n const displacedFit = maxFreeRectAt(\n [...rest, moved],\n { x: from.x, y: from.y },\n { w: other.w, h: other.h },\n limits,\n other,\n );\n if (!displacedFit) return null;\n const displaced: LayoutItem = {\n ...other,\n x: from.x,\n y: from.y,\n w: displacedFit.w,\n h: displacedFit.h,\n moved: true,\n };\n\n return layout.map((l) =>\n l.i === item.i ? moved : l.i === other.i ? displaced : l,\n );\n}\n\n/**\n * Build the resolver `moveElement` consults instead of reverting a blocked move,\n * or `undefined` for `'revert'` (and for an unset mode), which keeps the engine\n * on its original path with no added work.\n *\n * For an in-board drag, `'swap'` is an escalation ladder: exchange with one of\n * the widgets under the drop, else downscale at the drop cell, else revert. A\n * dense grid stays draggable that way - refusing everything that is not a clean\n * one-to-one trade would make the mode feel broken exactly where it is needed.\n * Cross-board callers pass `allowExchange: false`, which turns the same mode into\n * empty-anchor downscaling; the registry cancels the transfer if that resolution\n * cannot occupy the requested cell.\n */\nexport function createCollisionResolver(\n mode: CollisionMode | undefined,\n options: CollisionResolverOptions,\n): CollisionResolver | undefined {\n if (!mode || mode === 'revert') return undefined;\n\n const limits = { cols: options.cols, maxRows: options.maxRows };\n\n return ({ layout, item, collisions, from }) => {\n const others = layout.filter((l) => l.i !== item.i);\n const desired = options.desired ?? { w: item.w, h: item.h };\n\n if (mode === 'swap' && options.allowExchange !== false) {\n const exchanged = exchangeWithCollision(\n layout,\n item,\n collisions,\n from,\n desired,\n limits,\n );\n if (exchanged) return exchanged;\n }\n\n return downscaleInPlace(layout, item, others, desired, limits);\n };\n}\n\n/**\n * Whether a layout holds no overlapping pair. A resolution is only ever accepted\n * when this holds, so the specs assert it directly.\n */\nexport function isOverlapFree(layout: Layout): boolean {\n for (let i = 0; i < layout.length; i++) {\n for (let j = i + 1; j < layout.length; j++) {\n if (collides(layout[i]!, layout[j]!)) return false;\n }\n }\n return true;\n}\n"],"mappings":";;;AA0BA,SAAS,SAAS,QAAgB,GAAW,GAAoB;AAC/D,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;EACtC,MAAM,IAAI,OAAO;AACjB,MACE,MAAM,UACN,KAAK,EAAE,KACP,IAAI,EAAE,IAAI,EAAE,KACZ,KAAK,EAAE,KACP,IAAI,EAAE,IAAI,EAAE,EAEZ,QAAO;;AAGX,QAAO;;;;;;;;;;;;;;;;AAiBT,SAAgB,cACd,QACA,QACA,SACA,QACA,MACiC;AACjC,KAAI,OAAO,IAAI,KAAK,OAAO,IAAI,EAAG,QAAO;CAEzC,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,QAAQ,EAAE;CACzC,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,QAAQ,EAAE;CACzC,MAAM,UAAU,OAAO,WAAW;CAClC,MAAM,OAAO,KAAK,IAAI,QAAQ,GAAG,OAAO,OAAO,OAAO,EAAE;CACxD,MAAM,OAAO,KAAK,IAChB,QAAQ,GACR,OAAO,SAAS,QAAQ,GAAG,UAAU,OAAO,IAAI,QAAQ,EACzD;AAED,KAAI,OAAO,QAAQ,OAAO,KAAM,QAAO;CAIvC,MAAM,OAAiB,EAAE;AACzB,MAAK,IAAI,KAAK,GAAG,KAAK,MAAM,MAAM;EAChC,IAAI,IAAI;AACR,SAAO,IAAI,QAAQ,SAAS,QAAQ,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE,CAAE;AAClE,OAAK,KAAK,EAAE;AAEZ,MAAI,MAAM,EAAG;;CAGf,IAAI,OAAwC;CAC5C,IAAI,WAAW;CACf,IAAI,QAAQ;AACZ,MAAK,IAAI,IAAI,GAAG,KAAK,KAAK,QAAQ,KAAK;AACrC,UAAQ,KAAK,IAAI,OAAO,KAAK,IAAI,GAAI;AACrC,MAAI,QAAQ,KAAM;AAClB,MAAI,IAAI,KAAM;EACd,MAAM,OAAO,IAAI;AAGjB,MAAI,QAAQ,UAAU;AACpB,UAAO;IAAE;IAAG,GAAG;IAAO;AACtB,cAAW;;;AAIf,QAAO;;;;;;AAOT,SAAS,iBACP,QACA,MACA,QACA,SACA,QACqB;CACrB,MAAM,MAAM,cACV,QACA;EAAE,GAAG,KAAK;EAAG,GAAG,KAAK;EAAG,EACxB,SACA,QACA,KACD;AACD,KAAI,CAAC,IAAK,QAAO;AAGjB,KAAI,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,EAAG,QAAO;AAEjD,QAAO,OAAO,KAAK,MACjB,EAAE,MAAM,KAAK,IAAI;EAAE,GAAG;EAAG,GAAG,IAAI;EAAG,GAAG,IAAI;EAAG,OAAO;EAAM,GAAG,EAC9D;;;AAIH,SAAS,YAAY,GAAe,GAAuB;CACzD,MAAM,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE;CAC7D,MAAM,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE;AAC7D,QAAO,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI;;;;;;;;;;;;;;;;;;AAmBlC,SAAS,sBACP,QACA,MACA,YACA,MACA,SACA,QACqB;AAGrB,KAAI,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,KAAK,EAAG,QAAO;CASnD,MAAM,aAAa,WAChB,QAAQ,MAAM,CAAC,EAAE,OAAO,CACxB,KAAK,OAAO;EAAE;EAAG,MAAM,YAAY,MAAM,EAAE;EAAE,EAAE,CAC/C,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CACjE,KAAK,EAAE,QAAQ,EAAE;AAEpB,MAAK,MAAM,SAAS,YAAY;EAC9B,MAAM,YAAY,aAAa,QAAQ,MAAM,OAAO,MAAM,SAAS,OAAO;AAC1E,MAAI,UAAW,QAAO;;AAExB,QAAO;;;AAIT,SAAS,aACP,QACA,MACA,OACA,MACA,SACA,QACqB;CACrB,MAAM,OAAO,OAAO,QAAQ,MAAM,EAAE,MAAM,KAAK,KAAK,EAAE,MAAM,MAAM,EAAE;CAIpE,MAAM,aAAyB;EAC7B,GAAG;EACH,GAAG,KAAK;EACR,GAAG,KAAK;EACR,GAAG,QAAQ;EACX,GAAG,QAAQ;EACZ;CAED,MAAM,WAAW,cACf,CAAC,GAAG,MAAM,WAAW,EACrB;EAAE,GAAG,MAAM;EAAG,GAAG,MAAM;EAAG,EAC1B,SACA,QACA,KACD;AACD,KAAI,CAAC,SAAU,QAAO;CACtB,MAAM,QAAoB;EACxB,GAAG;EACH,GAAG,MAAM;EACT,GAAG,MAAM;EACT,GAAG,SAAS;EACZ,GAAG,SAAS;EACZ,OAAO;EACR;CAED,MAAM,eAAe,cACnB,CAAC,GAAG,MAAM,MAAM,EAChB;EAAE,GAAG,KAAK;EAAG,GAAG,KAAK;EAAG,EACxB;EAAE,GAAG,MAAM;EAAG,GAAG,MAAM;EAAG,EAC1B,QACA,MACD;AACD,KAAI,CAAC,aAAc,QAAO;CAC1B,MAAM,YAAwB;EAC5B,GAAG;EACH,GAAG,KAAK;EACR,GAAG,KAAK;EACR,GAAG,aAAa;EAChB,GAAG,aAAa;EAChB,OAAO;EACR;AAED,QAAO,OAAO,KAAK,MACjB,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,MAAM,MAAM,IAAI,YAAY,EACxD;;;;;;;;;;;;;;;AAgBH,SAAgB,wBACd,MACA,SAC+B;AAC/B,KAAI,CAAC,QAAQ,SAAS,SAAU,QAAO;CAEvC,MAAM,SAAS;EAAE,MAAM,QAAQ;EAAM,SAAS,QAAQ;EAAS;AAE/D,SAAQ,EAAE,QAAQ,MAAM,YAAY,WAAW;EAC7C,MAAM,SAAS,OAAO,QAAQ,MAAM,EAAE,MAAM,KAAK,EAAE;EACnD,MAAM,UAAU,QAAQ,WAAW;GAAE,GAAG,KAAK;GAAG,GAAG,KAAK;GAAG;AAE3D,MAAI,SAAS,UAAU,QAAQ,kBAAkB,OAAO;GACtD,MAAM,YAAY,sBAChB,QACA,MACA,YACA,MACA,SACA,OACD;AACD,OAAI,UAAW,QAAO;;AAGxB,SAAO,iBAAiB,QAAQ,MAAM,QAAQ,SAAS,OAAO"}
1
+ {"version":3,"file":"collision-modes.js","names":[],"sources":["../../../../../src/components/layout/Board/grid-core/collision-modes.ts"],"sourcesContent":["/**\n * Collision resolution strategies for a grid that prevents collisions.\n *\n * Original UI Kit code (not vendored from react-grid-layout): the upstream\n * engine only ever reverts a blocked move.\n *\n * When `preventCollision` is on, `moveElement` refuses any placement that\n * overlaps an existing item and snaps the dragged item back. That is the right\n * default, but a free grid often wants the placement *resolved* instead of\n * refused - shrunk into whatever room is actually there, or exchanged with the\n * widget already sitting in the target slot. These strategies produce such a\n * resolution, and every resolution they return is overlap-free, so the caller's\n * own overlap guards keep working unchanged.\n */\n\nimport { collides } from './collision';\n\nimport type {\n CollisionMode,\n CollisionResolver,\n CollisionResolverOptions,\n Layout,\n LayoutItem,\n} from './types';\n\n/** Whether a single grid cell is free of every item in `others`. */\nfunction cellFree(others: Layout, x: number, y: number): boolean {\n for (let i = 0; i < others.length; i++) {\n const o = others[i];\n if (\n o !== undefined &&\n x >= o.x &&\n x < o.x + o.w &&\n y >= o.y &&\n y < o.y + o.h\n ) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * The largest rectangle anchored at `anchor` that fits without overlapping\n * `others`, growing rightward and downward only.\n *\n * Never larger than `desired` (a drag must never *upscale* a widget - growing\n * things is an explicit, opt-in operation like \"distribute evenly\", not a side\n * effect of moving them), never smaller than the item's own `minW`/`minH`, and\n * never past `cols` / `maxRows`. Among the candidates the largest-area rectangle\n * wins, breaking ties on width: a grid is read left to right, so a wide-and-flat\n * result is the less surprising of two equal-area fits.\n *\n * Returns `null` when not even the minimum size fits, which the callers treat as\n * \"no resolution\" and fall back to reverting.\n */\nexport function maxFreeRectAt(\n others: Layout,\n anchor: { x: number; y: number },\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n mins?: { minW?: number; minH?: number },\n): { w: number; h: number } | null {\n if (anchor.x < 0 || anchor.y < 0) return null;\n\n const minW = Math.max(1, mins?.minW ?? 1);\n const minH = Math.max(1, mins?.minH ?? 1);\n const maxRows = limits.maxRows ?? Infinity;\n const maxW = Math.min(desired.w, limits.cols - anchor.x);\n const maxH = Math.min(\n desired.h,\n Number.isFinite(maxRows) ? maxRows - anchor.y : desired.h,\n );\n\n if (maxW < minW || maxH < minH) return null;\n\n // Free height available in each column of the candidate band, measured down\n // from the anchor row and capped at the tallest useful height.\n const free: number[] = [];\n for (let dx = 0; dx < maxW; dx++) {\n let h = 0;\n while (h < maxH && cellFree(others, anchor.x + dx, anchor.y + h)) h++;\n free.push(h);\n // A column with no room at all caps every wider candidate, so stop early.\n if (h === 0) break;\n }\n\n let best: { w: number; h: number } | null = null;\n let bestArea = 0;\n let limit = maxH;\n for (let w = 1; w <= free.length; w++) {\n limit = Math.min(limit, free[w - 1]!);\n if (limit < minH) break;\n if (w < minW) continue;\n const area = w * limit;\n // `>=` so the widest of several equal-area fits wins: `w` only grows here, so\n // the last match is the widest one.\n if (area >= bestArea) {\n best = { w, h: limit };\n bestArea = area;\n }\n }\n\n return best;\n}\n\n/**\n * The cells beyond a pinned anchor that a drag could never ask for.\n *\n * `gridBounds` clamps a drag anchor to `cols - w` (and `maxRows - h`), which\n * assumes the widget keeps the size it started with. So when the blocker is to\n * the LEFT of the free room and that room is narrower than the widget, every\n * anchor a pointer can produce lands inside the blocker - and the mode whose\n * whole job is to shrink the widget into that room never gets offered it. The\n * drop just reverts. The mirror case has no such problem, because the anchor at\n * column 0 is always reachable: that asymmetry is why downscaling into room on\n * the left has always worked and room on the right has not. The row axis clamps\n * the same way, so a board with a finite `maxRows` has the same blind spot below\n * a blocker.\n *\n * Nothing is offered unless the anchor is sitting ON the limit, pinned against\n * the far edge with the pointer unable to push it further. An anchor short of the\n * limit is the pointer's own choice - every cell between it and the limit was\n * available to ask for - so a blocked drop there still just reverts, exactly as\n * before. Without that gate a widget dropped on an occupied cell would skip over\n * free cells the pointer could perfectly well have aimed at.\n *\n * A pinned anchor's span ends at the last row/column of the grid, so every cell\n * returned - and every rectangle that can be measured from one - lies inside the\n * footprint the widget is already covering.\n */\nfunction clampedOutAnchors(\n item: LayoutItem,\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n): { x: number; y: number }[] {\n const maxRows = limits.maxRows ?? Infinity;\n const bounded = Number.isFinite(maxRows);\n const xLimit = Math.max(0, limits.cols - desired.w);\n const yLimit = bounded ? Math.max(0, maxRows - desired.h) : Infinity;\n\n const anchors: { x: number; y: number }[] = [];\n // Each axis is clamped on its own, so each recovers on its own: slide along\n // the one the limit actually pinned, never diagonally into open grid.\n if (item.x === xLimit) {\n const lastX = Math.min(item.x + desired.w - 1, limits.cols - 1);\n for (let x = item.x + 1; x <= lastX; x++) anchors.push({ x, y: item.y });\n }\n if (bounded && item.y === yLimit) {\n const lastY = Math.min(item.y + desired.h - 1, maxRows - 1);\n for (let y = item.y + 1; y <= lastY; y++) anchors.push({ x: item.x, y });\n }\n return anchors;\n}\n\n/**\n * Shrink the placement to the room actually available at the cell it was\n * dropped on, or - when that cell cannot take the widget at any size and the\n * anchor is pinned against the grid edge - at a cell the clamp hid from the\n * pointer (see `clampedOutAnchors`). The largest fit among those wins, so the\n * widget takes as much of the room it is already hovering as there is.\n */\nfunction downscaleInPlace(\n layout: Layout,\n item: LayoutItem,\n others: Layout,\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n): LayoutItem[] | null {\n const fitAt = (anchor: { x: number; y: number }) =>\n maxFreeRectAt(others, anchor, desired, limits, item);\n\n let anchor = { x: item.x, y: item.y };\n let fit = fitAt(anchor);\n\n if (!fit) {\n let bestArea = 0;\n for (const candidate of clampedOutAnchors(item, desired, limits)) {\n const candidateFit = fitAt(candidate);\n if (!candidateFit) continue;\n const area = candidateFit.w * candidateFit.h;\n // `>` keeps the first of several equal-area fits, and the scan runs in\n // reading order from the drop cell, so that is the closest one to it.\n if (area > bestArea) {\n bestArea = area;\n fit = candidateFit;\n anchor = candidate;\n }\n }\n }\n\n if (!fit) return null;\n // Nothing to resolve: the requested cell takes the requested size, so the\n // collision was not a sizing problem and reverting is still the honest answer.\n if (\n fit.w === item.w &&\n fit.h === item.h &&\n anchor.x === item.x &&\n anchor.y === item.y\n ) {\n return null;\n }\n\n return layout.map((l) =>\n l.i === item.i\n ? { ...l, x: anchor.x, y: anchor.y, w: fit!.w, h: fit!.h, moved: true }\n : l,\n );\n}\n\n/** Number of cells two items share. Zero when they do not overlap at all. */\nfunction overlapArea(a: LayoutItem, b: LayoutItem): number {\n const w = Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x);\n const h = Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y);\n return w > 0 && h > 0 ? w * h : 0;\n}\n\n/**\n * Exchange the placement with one of the widgets under it.\n *\n * The dragged widget takes the other's cell and the other takes the cell the\n * dragged widget came from. Each keeps as much of its own size as fits there -\n * that cell plus any free space adjacent to it - and neither ever grows.\n *\n * `from` is whatever the caller's layout says, so it is the caller that decides\n * what \"came from\" means. A pointer drag resolves every frame against the\n * arrangement the gesture started with, making it the cell the drag began at, and\n * keeping the result a pure function of where the pointer is; chaining frames off\n * each other instead would exchange with every widget swept over.\n * The slot the dragged widget is leaving is reserved for the displaced widget\n * while the dragged one is sized, so the two can never claim the same cells: the\n * result is overlap-free by construction, not by a follow-up check.\n */\nfunction exchangeWithCollision(\n layout: Layout,\n item: LayoutItem,\n collisions: LayoutItem[],\n from: { x: number; y: number },\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n): LayoutItem[] | null {\n // Nothing to trade if the widget has not actually left a slot behind - a\n // cross-board drop, where it never had one on this board.\n if (from.x === item.x && from.y === item.y) return null;\n\n // A drop that spans a boundary covers two widgets at once, and refusing those\n // frames would leave a band mid-drag where nothing is swapped at all: the\n // placeholder snaps back to the origin, then jumps to the far swap once the drop\n // clears the first widget. Trade with the one the drop covers most instead, so\n // the swap only ever changes which partner it is - never blinks away. Ties go to\n // the widget earlier in reading order, so the choice is deterministic. Exactly\n // one widget is ever displaced, whichever is picked.\n const candidates = collisions\n .filter((c) => !c.static)\n .map((c) => ({ c, area: overlapArea(item, c) }))\n .sort((p, q) => q.area - p.area || p.c.y - q.c.y || p.c.x - q.c.x)\n .map(({ c }) => c);\n\n for (const other of candidates) {\n const exchanged = exchangeWith(layout, item, other, from, desired, limits);\n if (exchanged) return exchanged;\n }\n return null;\n}\n\n/** One concrete two-widget exchange, or `null` if either side cannot fit. */\nfunction exchangeWith(\n layout: Layout,\n item: LayoutItem,\n other: LayoutItem,\n from: { x: number; y: number },\n desired: { w: number; h: number },\n limits: { cols: number; maxRows?: number },\n): LayoutItem[] | null {\n const rest = layout.filter((l) => l.i !== item.i && l.i !== other.i);\n // The slot being vacated, held back so the dragged widget cannot grow into the\n // space the displaced one is about to need. Ids are never compared here (the\n // scan works cell by cell), so this placeholder cannot clash with a real one.\n const originSlot: LayoutItem = {\n i: 'origin-slot-reservation',\n x: from.x,\n y: from.y,\n w: desired.w,\n h: desired.h,\n };\n\n const movedFit = maxFreeRectAt(\n [...rest, originSlot],\n { x: other.x, y: other.y },\n desired,\n limits,\n item,\n );\n if (!movedFit) return null;\n const moved: LayoutItem = {\n ...item,\n x: other.x,\n y: other.y,\n w: movedFit.w,\n h: movedFit.h,\n moved: true,\n };\n\n const displacedFit = maxFreeRectAt(\n [...rest, moved],\n { x: from.x, y: from.y },\n { w: other.w, h: other.h },\n limits,\n other,\n );\n if (!displacedFit) return null;\n const displaced: LayoutItem = {\n ...other,\n x: from.x,\n y: from.y,\n w: displacedFit.w,\n h: displacedFit.h,\n moved: true,\n };\n\n return layout.map((l) =>\n l.i === item.i ? moved : l.i === other.i ? displaced : l,\n );\n}\n\n/**\n * Build the resolver `moveElement` consults instead of reverting a blocked move,\n * or `undefined` for `'revert'` (and for an unset mode), which keeps the engine\n * on its original path with no added work.\n *\n * For an in-board drag, `'swap'` is an escalation ladder: exchange with one of\n * the widgets under the drop, else downscale at the drop cell, else revert. A\n * dense grid stays draggable that way - refusing everything that is not a clean\n * one-to-one trade would make the mode feel broken exactly where it is needed.\n * Cross-board callers pass `allowExchange: false`, which turns the same mode into\n * downscaling at the drop cell - there is no slot on the destination to trade\n * back, and a transfer that cannot resolve is placed in a free cell rather than\n * refused, since a widget dropped somewhere has to end up somewhere.\n */\nexport function createCollisionResolver(\n mode: CollisionMode | undefined,\n options: CollisionResolverOptions,\n): CollisionResolver | undefined {\n if (!mode || mode === 'revert') return undefined;\n\n const limits = { cols: options.cols, maxRows: options.maxRows };\n\n return ({ layout, item, collisions, from }) => {\n const others = layout.filter((l) => l.i !== item.i);\n const desired = options.desired ?? { w: item.w, h: item.h };\n\n if (mode === 'swap' && options.allowExchange !== false) {\n const exchanged = exchangeWithCollision(\n layout,\n item,\n collisions,\n from,\n desired,\n limits,\n );\n if (exchanged) return exchanged;\n }\n\n return downscaleInPlace(layout, item, others, desired, limits);\n };\n}\n\n/**\n * Whether a layout holds no overlapping pair. A resolution is only ever accepted\n * when this holds, so the specs assert it directly.\n */\nexport function isOverlapFree(layout: Layout): boolean {\n for (let i = 0; i < layout.length; i++) {\n for (let j = i + 1; j < layout.length; j++) {\n if (collides(layout[i]!, layout[j]!)) return false;\n }\n }\n return true;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.0 | Cube Dev Team */
2
2
  //#region src/components/layout/Board/grid-core/collision.ts
3
3
  /**
4
4
  * Check if two layout items collide (overlap).
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.0 | Cube Dev Team */
2
2
  import { collides, getFirstCollision } from "./collision.js";
3
3
  import { sortLayoutItemsByColRow, sortLayoutItemsByRowCol } from "./sort.js";
4
4
  import { bottom, cloneLayout, cloneLayoutItem, getStatics } from "./layout.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.0 | Cube Dev Team */
2
2
  //#region src/components/layout/Board/grid-core/constraints.ts
3
3
  function clamp(value, min, max) {
4
4
  return Math.max(min, Math.min(max, value));
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.0 | Cube Dev Team */
2
2
  import { collides, getFirstCollision } from "./collision.js";
3
3
  import { sortLayoutItemsByColRow, sortLayoutItemsByRowCol } from "./sort.js";
4
4
  import { bottom, cloneLayout, cloneLayoutItem, getStatics } from "./layout.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.0 | Cube Dev Team */
2
2
  import { getAllCollisions, getFirstCollision } from "./collision.js";
3
3
  import { sortLayoutItems } from "./sort.js";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.0 | Cube Dev Team */
2
2
  import { collides } from "./collision.js";
3
3
 
4
4
  //#region src/components/layout/Board/grid-core/placement.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.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.
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.0 | Cube Dev Team */
2
2
  import { distributeEvenly, placeInFreeSlot } from "./grid-core/placement.js";
3
3
  import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
4
4
  import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.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.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.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,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.170.0 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.171.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";
@@ -70,6 +70,41 @@ function hasNewOverlap(before, after) {
70
70
  return false;
71
71
  }
72
72
  /**
73
+ * Where a cross-board arrival ends up when the destination refuses the very first
74
+ * cell it was offered.
75
+ *
76
+ * `moveElement` answers a refused placement by restoring the item to where it
77
+ * came from. Every frame after the first has a real cell to go back to - the one
78
+ * the previous frame settled on - so the preview simply holds there, which is
79
+ * what keeps the placeholder from jumping about as the pointer sweeps across an
80
+ * occupied widget. The *first* frame on a board has no such cell: its origin is
81
+ * the synthetic seed one row above (or column left of) the anchor, which sits off
82
+ * the board entirely whenever the anchor is in row 0 or column 0. Holding that
83
+ * would preview - and commit - a widget outside the grid.
84
+ *
85
+ * So only that first frame relocates, to the nearest cell that can hold the
86
+ * widget. The destination's own widgets are the fixed `others`: an arrival is
87
+ * placed around them and never displaces one.
88
+ *
89
+ * A refusal is read off `origin` - the seed itself - rather than off the
90
+ * requested cell, because a resolver is allowed to place the widget somewhere
91
+ * other than the exact cell asked for (downscaling into room the anchor clamp hid
92
+ * from the pointer does exactly that). Only an item sitting back on its origin was
93
+ * actually refused; anything else is a resolution and stands.
94
+ */
95
+ function landIncoming(layout, others, itemId, origin, landing, cols, maxRows) {
96
+ const placed = getLayoutItem(layout, itemId);
97
+ if (!placed || placed.x !== origin.x || placed.y !== origin.y) return layout;
98
+ const landed = placeInFreeSlot(others, {
99
+ ...placed,
100
+ ...landing
101
+ }, cols, maxRows);
102
+ return layout.map((l) => l.i === itemId ? {
103
+ ...l,
104
+ ...landed
105
+ } : l);
106
+ }
107
+ /**
73
108
  * Whether any item in `after` has a different size than it had in `before`.
74
109
  */
75
110
  function resizesAnything(before, after) {
@@ -89,7 +124,6 @@ function useBoardRegistry(options) {
89
124
  const sourceSnapshotRef = useRef([]);
90
125
  const targetSnapshotsRef = useRef(/* @__PURE__ */ new Map());
91
126
  const previewRef = useRef(null);
92
- const targetLandingRef = useRef(null);
93
127
  const frozenRectsRef = useRef(/* @__PURE__ */ new Map());
94
128
  const nestedInDraggedRef = useRef(/* @__PURE__ */ new Set());
95
129
  const lastLandingRef = useRef(null);
@@ -204,7 +238,6 @@ function useBoardRegistry(options) {
204
238
  affectedRef.current = new Set([boardId]);
205
239
  sourceSnapshotRef.current = cloneLayout(entry.getLayout());
206
240
  previewRef.current = null;
207
- targetLandingRef.current = null;
208
241
  lastLandingRef.current = {
209
242
  x: item.x,
210
243
  y: item.y
@@ -436,7 +469,6 @@ function useBoardRegistry(options) {
436
469
  const previewOnTarget = useCallback((target, item, x, y) => {
437
470
  const pp = target.getPositionParams();
438
471
  const compactor = target.getCompactor();
439
- const strictIncomingSwap = compactor.preventCollision === true && !compactor.allowOverlap && target.getCollisionMode() === "swap";
440
472
  const carried = previewRef.current?.boardId === target.id ? previewRef.current.working : null;
441
473
  const base = cloneLayout(carried ?? targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== item.i);
442
474
  const prevItem = carried ? getLayoutItem(carried, item.i) : void 0;
@@ -453,7 +485,12 @@ function useBoardRegistry(options) {
453
485
  x,
454
486
  y: Math.max(0, y) - 1
455
487
  };
456
- const moved = moveElement([...base, dragged], dragged, x, y, true, compactor.preventCollision, compactor.type, pp.cols, compactor.allowOverlap, { resolveCollision: compactor.preventCollision ? createCollisionResolver(target.getCollisionMode(), {
488
+ const working = [...base, dragged];
489
+ const origin = {
490
+ x: dragged.x,
491
+ y: dragged.y
492
+ };
493
+ const moved = moveElement(working, dragged, x, y, true, compactor.preventCollision, compactor.type, pp.cols, compactor.allowOverlap, { resolveCollision: compactor.preventCollision ? createCollisionResolver(target.getCollisionMode(), {
457
494
  cols: pp.cols,
458
495
  maxRows: target.getMaxRows(),
459
496
  desired: {
@@ -462,40 +499,16 @@ function useBoardRegistry(options) {
462
499
  },
463
500
  allowExchange: false
464
501
  }) : void 0 });
465
- const compacted = strictIncomingSwap ? cloneLayout(moved) : [...compactor.compact(moved, pp.cols)];
502
+ const compacted = [...compactor.compact(prevItem ? moved : landIncoming(moved, base, item.i, origin, {
503
+ x,
504
+ y
505
+ }, pp.cols, target.getMaxRows()), pp.cols)];
466
506
  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
- }
507
+ if (!compactor.allowOverlap && hasNewOverlap(overlappingPairs(base), compacted)) return;
491
508
  previewRef.current = {
492
509
  boardId: target.id,
493
510
  working: compacted
494
511
  };
495
- targetLandingRef.current = {
496
- boardId: target.id,
497
- valid: true
498
- };
499
512
  const previewItem = landed ?? {
500
513
  ...item,
501
514
  x,
@@ -547,7 +560,6 @@ function useBoardRegistry(options) {
547
560
  if (snap) prev?.applyLayout(cloneLayout(snap), false);
548
561
  prev?.setPlaceholders([]);
549
562
  previewRef.current = null;
550
- targetLandingRef.current = null;
551
563
  }
552
564
  if (isGroup) moveGroupWithinBoard(target, ds, x - ds.item.x, y - ds.item.y);
553
565
  else moveWithinBoard(target, ds.item, x, y);
@@ -567,7 +579,6 @@ function useBoardRegistry(options) {
567
579
  }
568
580
  prev?.setPlaceholders([]);
569
581
  previewRef.current = null;
570
- targetLandingRef.current = null;
571
582
  if (!targetSnapshotsRef.current.has(target.id)) targetSnapshotsRef.current.set(target.id, cloneLayout(target.getLayout()));
572
583
  }
573
584
  previewOnTarget(target, ds.item, x, y);
@@ -598,61 +609,58 @@ function useBoardRegistry(options) {
598
609
  };
599
610
  const tp = target.getPositionParams();
600
611
  const tc = target.getCompactor();
601
- const strictIncomingSwap = tc.preventCollision === true && !tc.allowOverlap && target.getCollisionMode() === "swap";
602
612
  const carried = previewRef.current?.boardId === target.id && getLayoutItem(previewRef.current.working, ds.itemId) ? previewRef.current.working : null;
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, "transfer");
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, {
613
+ if (source) {
614
+ const sp = source.getPositionParams();
615
+ const sc = source.getCompactor();
616
+ const remaining = source.getLayout().filter((l) => l.i !== ds.itemId);
617
+ source.applyLayout([...sc.compact(remaining, sp.cols)], true, "transfer");
618
+ }
619
+ let finalLayout;
620
+ if (carried) finalLayout = [...tc.compact(cloneLayout(carried), tp.cols)];
621
+ else {
622
+ const newItem = tc.type === "horizontal" ? {
640
623
  ...ds.item,
641
- x: landing.x,
624
+ x: Math.max(0, landing.x) - 1,
642
625
  y: landing.y
643
- }, tp.cols, tp.maxRows)];
644
- target.applyLayout(finalLayout, true, "transfer");
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
- });
626
+ } : {
627
+ ...ds.item,
628
+ x: landing.x,
629
+ y: Math.max(0, landing.y) - 1
630
+ };
631
+ const base = [...cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId)), newItem];
632
+ const seed = {
633
+ x: newItem.x,
634
+ y: newItem.y
635
+ };
636
+ const moved = moveElement(base, newItem, landing.x, landing.y, true, tc.preventCollision, tc.type, tp.cols, tc.allowOverlap, { resolveCollision: createCollisionResolver(target.getCollisionMode(), {
637
+ cols: tp.cols,
638
+ maxRows: tp.maxRows,
639
+ desired: {
640
+ w: ds.item.w,
641
+ h: ds.item.h
642
+ },
643
+ allowExchange: false
644
+ }) });
645
+ finalLayout = [...tc.compact(landIncoming(moved, base.filter((l) => l.i !== ds.itemId), ds.itemId, seed, landing, tp.cols, tp.maxRows), tp.cols)];
655
646
  }
647
+ const targetOthers = cloneLayout((targetSnapshotsRef.current.get(target.id) ?? target.getLayout()).filter((l) => l.i !== ds.itemId));
648
+ if (!tc.allowOverlap && hasNewOverlap(overlappingPairs(targetOthers), finalLayout)) finalLayout = [...targetOthers, placeInFreeSlot(targetOthers, {
649
+ ...ds.item,
650
+ x: landing.x,
651
+ y: landing.y
652
+ }, tp.cols, tp.maxRows)];
653
+ target.applyLayout(finalLayout, true, "transfer");
654
+ onTransferRef.current?.({
655
+ widgetId: ds.itemId,
656
+ fromBoardId: ds.sourceBoardId,
657
+ toBoardId: target.id,
658
+ item: getLayoutItem(finalLayout, ds.itemId) ?? {
659
+ ...ds.item,
660
+ x: landing.x,
661
+ y: landing.y
662
+ }
663
+ });
656
664
  }
657
665
  const ids = new Set(affectedRef.current);
658
666
  ids.add(ds.sourceBoardId);
@@ -664,7 +672,6 @@ function useBoardRegistry(options) {
664
672
  frozenRectsRef.current.clear();
665
673
  nestedInDraggedRef.current = /* @__PURE__ */ new Set();
666
674
  previewRef.current = null;
667
- targetLandingRef.current = null;
668
675
  lastLandingRef.current = null;
669
676
  setDragState(null);
670
677
  });