@cube-dev/ui-kit 0.169.1 → 0.170.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 (588) hide show
  1. package/README.md +1 -1
  2. package/dist/CHANGELOG.md +18 -0
  3. package/dist/README.md +1 -1
  4. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  5. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  6. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  7. package/dist/_internal/hooks/use-event.js +1 -1
  8. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  9. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  10. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  11. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  12. package/dist/_internal/hooks/use-warn.js +1 -1
  13. package/dist/components/Block.js +1 -1
  14. package/dist/components/CollectionItem.js +1 -1
  15. package/dist/components/GlobalStyles.js +5 -5
  16. package/dist/components/GlobalStyles.js.map +1 -1
  17. package/dist/components/GridProvider.js +1 -1
  18. package/dist/components/HiddenInput.js +1 -1
  19. package/dist/components/Root.js +3 -5
  20. package/dist/components/Root.js.map +1 -1
  21. package/dist/components/actions/Action/Action.js +1 -1
  22. package/dist/components/actions/Banner/Banner.js +1 -1
  23. package/dist/components/actions/Banner/Banner.js.map +1 -1
  24. package/dist/components/actions/Button/Button.js +1 -1
  25. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  26. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  27. package/dist/components/actions/ButtonSplit/context.js +1 -1
  28. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  29. package/dist/components/actions/CommandMenu/styled.js +1 -1
  30. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  31. package/dist/components/actions/ItemActionContext.js +1 -1
  32. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  33. package/dist/components/actions/Link/Link.js +1 -1
  34. package/dist/components/actions/Menu/Menu.js +1 -1
  35. package/dist/components/actions/Menu/MenuItem.js +1 -1
  36. package/dist/components/actions/Menu/MenuSection.js +1 -1
  37. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  38. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  39. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  40. package/dist/components/actions/Menu/context.js +1 -1
  41. package/dist/components/actions/Menu/styled.js +1 -1
  42. package/dist/components/actions/Menu/styled.js.map +1 -1
  43. package/dist/components/actions/index.js +1 -1
  44. package/dist/components/actions/use-action.js +1 -1
  45. package/dist/components/actions/use-anchored-menu.js +1 -1
  46. package/dist/components/actions/use-context-menu.js +1 -1
  47. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  48. package/dist/components/content/Alert/Alert.js +1 -1
  49. package/dist/components/content/Alert/use-alert.js +1 -1
  50. package/dist/components/content/Avatar/Avatar.js +1 -1
  51. package/dist/components/content/Badge/Badge.js +1 -1
  52. package/dist/components/content/Card/Card.js +1 -1
  53. package/dist/components/content/Content.js +1 -1
  54. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  55. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  56. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  57. package/dist/components/content/Divider.js +1 -1
  58. package/dist/components/content/Footer.js +1 -1
  59. package/dist/components/content/Header.js +1 -1
  60. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  61. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  62. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  63. package/dist/components/content/Item/Item.js +1 -1
  64. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  65. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  66. package/dist/components/content/Layout/GridLayout.js +1 -1
  67. package/dist/components/content/Layout/Layout.js +1 -1
  68. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  69. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  70. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  71. package/dist/components/content/Layout/LayoutContent.js +1 -1
  72. package/dist/components/content/Layout/LayoutContext.js +1 -1
  73. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  74. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  75. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  76. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  77. package/dist/components/content/Layout/LayoutPane.js +1 -1
  78. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  79. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  80. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  81. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  82. package/dist/components/content/Layout/index.js +1 -1
  83. package/dist/components/content/Layout/utils.js +1 -1
  84. package/dist/components/content/Paragraph.js +1 -1
  85. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  86. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  87. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  88. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  89. package/dist/components/content/Result/Result.js +1 -1
  90. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  91. package/dist/components/content/Tag/Tag.js +1 -1
  92. package/dist/components/content/Text.js +1 -1
  93. package/dist/components/content/TextItem/TextItem.js +1 -1
  94. package/dist/components/content/Title.js +1 -1
  95. package/dist/components/content/Tree/Tree.js +1 -1
  96. package/dist/components/content/Tree/TreeNode.js +1 -1
  97. package/dist/components/content/Tree/styled.js +1 -1
  98. package/dist/components/content/Tree/tree-index.js +1 -1
  99. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  100. package/dist/components/content/Tree/use-load-data.js +1 -1
  101. package/dist/components/content/highlightText.js +1 -1
  102. package/dist/components/content/use-auto-tooltip.js +1 -1
  103. package/dist/components/data/DataTable/DataTable.js +1 -1
  104. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  105. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  106. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  107. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  108. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  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 +1 -1
  113. package/dist/components/data/TableBase/TableView.js +1 -1
  114. package/dist/components/data/TableBase/column-menu.js +1 -1
  115. package/dist/components/data/TableBase/column-tint.js +2 -2
  116. package/dist/components/data/TableBase/column-tint.js.map +1 -1
  117. package/dist/components/data/TableBase/row-menu.js +1 -1
  118. package/dist/components/data/TableBase/styled.js +1 -1
  119. package/dist/components/data/TableBase/table-tree.js +1 -1
  120. package/dist/components/data/TableBase/types.d.ts +3 -3
  121. package/dist/components/data/TableBase/types.js +1 -1
  122. package/dist/components/data/TableBase/types.js.map +1 -1
  123. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  124. package/dist/components/data/TableBase/use-column-order.js +1 -1
  125. package/dist/components/data/TableBase/use-container-width.js +1 -1
  126. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  127. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  128. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  129. package/dist/components/data/TableBase/use-table-search.js +1 -1
  130. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  131. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  132. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  133. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  134. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  135. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  136. package/dist/components/fields/Checkbox/Checkbox.js.map +1 -1
  137. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  138. package/dist/components/fields/Checkbox/context.js +1 -1
  139. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  140. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  141. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  142. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +2 -2
  143. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -1
  144. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  145. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  146. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  147. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  148. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  149. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  150. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  151. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  152. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  153. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  154. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  155. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  156. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  157. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  158. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  159. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  160. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  161. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  162. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  163. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  164. package/dist/components/fields/DatePicker/period.js +1 -1
  165. package/dist/components/fields/DatePicker/props.js +1 -1
  166. package/dist/components/fields/DatePicker/utils.js +1 -1
  167. package/dist/components/fields/FileInput/FileInput.js +1 -1
  168. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  169. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  170. package/dist/components/fields/Input/Input.js +1 -1
  171. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  172. package/dist/components/fields/ListBox/ListBox.js +1 -1
  173. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  174. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  175. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  176. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  177. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  178. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  179. package/dist/components/fields/Picker/Picker.js +1 -1
  180. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  181. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  182. package/dist/components/fields/RadioGroup/context.js +1 -1
  183. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  184. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  185. package/dist/components/fields/Select/Select.js +1 -1
  186. package/dist/components/fields/Select/Select.js.map +1 -1
  187. package/dist/components/fields/Slider/Gradation.js +1 -1
  188. package/dist/components/fields/Slider/HueSlider.js +1 -1
  189. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  190. package/dist/components/fields/Slider/Slider.js +1 -1
  191. package/dist/components/fields/Slider/SliderBase.js +1 -1
  192. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  193. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  194. package/dist/components/fields/Slider/elements.js +1 -1
  195. package/dist/components/fields/Slider/index.js +1 -1
  196. package/dist/components/fields/Switch/Switch.js +1 -1
  197. package/dist/components/fields/TextArea/TextArea.js +1 -1
  198. package/dist/components/fields/TextInput/TextInput.js +1 -1
  199. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  200. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  201. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  202. package/dist/components/fields/color/ColorPanel.js +1 -1
  203. package/dist/components/fields/color/channels.js +1 -1
  204. package/dist/components/fields/color/color.js +2 -2
  205. package/dist/components/fields/color/color.js.map +1 -1
  206. package/dist/components/fields/color/context.js +1 -1
  207. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  208. package/dist/components/form/Form/Field.js +1 -1
  209. package/dist/components/form/Form/Form.js +1 -1
  210. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  211. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  212. package/dist/components/form/Form/SubmitError.js +1 -1
  213. package/dist/components/form/Form/index.js +1 -1
  214. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  215. package/dist/components/form/Form/use-field/use-field.js +1 -1
  216. package/dist/components/form/Form/use-form.js +1 -1
  217. package/dist/components/form/Form/validation.js +1 -1
  218. package/dist/components/form/Label.js +1 -1
  219. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  220. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  221. package/dist/components/form/validation/use-validation-props.js +1 -1
  222. package/dist/components/form/wrapper.js +1 -1
  223. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  224. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  225. package/dist/components/layout/Board/Board.js +2 -1
  226. package/dist/components/layout/Board/Board.js.map +1 -1
  227. package/dist/components/layout/Board/BoardProvider.js +1 -1
  228. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  229. package/dist/components/layout/Board/Widget.js +1 -1
  230. package/dist/components/layout/Board/WidgetHost.js +42 -7
  231. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  232. package/dist/components/layout/Board/board-context.js +1 -1
  233. package/dist/components/layout/Board/board-store.js +1 -1
  234. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  235. package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
  236. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  237. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  238. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  239. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  240. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  241. package/dist/components/layout/Board/grid-core/placement.js +1 -1
  242. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  243. package/dist/components/layout/Board/index.js +1 -1
  244. package/dist/components/layout/Board/responsive-utils.js +1 -1
  245. package/dist/components/layout/Board/use-board-layout.js +1 -1
  246. package/dist/components/layout/Board/use-board-registry.js +1 -1
  247. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  248. package/dist/components/layout/Board/use-board-selection.js +1 -1
  249. package/dist/components/layout/Flex.js +1 -1
  250. package/dist/components/layout/Flow.js +1 -1
  251. package/dist/components/layout/Grid.js +1 -1
  252. package/dist/components/layout/Panel.js +1 -1
  253. package/dist/components/layout/Prefix.js +1 -1
  254. package/dist/components/layout/ResizablePanel.js +1 -1
  255. package/dist/components/layout/Space.js +1 -1
  256. package/dist/components/layout/Suffix.js +1 -1
  257. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  258. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  259. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  260. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  261. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  262. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  263. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  264. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  265. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  266. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  267. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  268. package/dist/components/navigation/Tabs/styled.js +1 -1
  269. package/dist/components/navigation/Tabs/types.js +1 -1
  270. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  271. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  272. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  273. package/dist/components/other/Calendar/Calendar.js +1 -1
  274. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  275. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  276. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  277. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  278. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  279. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  280. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  281. package/dist/components/other/Calendar/styled.js +1 -1
  282. package/dist/components/other/CubeLogo/CubeLogo.d.ts +2 -2
  283. package/dist/components/other/CubeLogo/CubeLogo.js +12 -12
  284. package/dist/components/other/CubeLogo/CubeLogo.js.map +1 -1
  285. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  286. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  287. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  288. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  289. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  290. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  291. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  292. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  293. package/dist/components/overlays/Dialog/context.js +1 -1
  294. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  295. package/dist/components/overlays/Modal/Modal.js +1 -1
  296. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  297. package/dist/components/overlays/Modal/Overlay.js +1 -1
  298. package/dist/components/overlays/Modal/Popover.js +1 -1
  299. package/dist/components/overlays/Modal/Tray.js +1 -1
  300. package/dist/components/overlays/Modal/Underlay.js +1 -1
  301. package/dist/components/overlays/Notifications/Notification.js +1 -1
  302. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  303. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  304. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  305. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  306. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  307. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  308. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  309. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  310. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  311. package/dist/components/overlays/Notifications/index.js +1 -1
  312. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  313. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  314. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  315. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  316. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  317. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  318. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  319. package/dist/components/overlays/Toast/index.js +1 -1
  320. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  321. package/dist/components/overlays/Toast/useToast.js +1 -1
  322. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  323. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  324. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  325. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  326. package/dist/components/overlays/Tooltip/context.js +1 -1
  327. package/dist/components/portal/Portal.js +1 -1
  328. package/dist/components/portal/PortalProvider.js +1 -1
  329. package/dist/components/portal/usePortal.js +1 -1
  330. package/dist/components/shared/DraggableCollection.js +1 -1
  331. package/dist/components/shared/InvalidIcon.js +1 -1
  332. package/dist/components/shared/ValidIcon.js +1 -1
  333. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  334. package/dist/components/status/Spin/Cube.js +1 -1
  335. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  336. package/dist/components/status/Spin/Spin.js +1 -1
  337. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  338. package/dist/data/item-themes.js +1 -1
  339. package/dist/data/item-themes.js.map +1 -1
  340. package/dist/data/themes.js +1 -1
  341. package/dist/data/themes.js.map +1 -1
  342. package/dist/eslint-plugin/defaults.generated.js +1 -1
  343. package/dist/eslint-plugin/index.js +1 -1
  344. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  345. package/dist/i18n/I18nProvider.js +1 -1
  346. package/dist/i18n/createFormatter.js +1 -1
  347. package/dist/i18n/index.js +1 -1
  348. package/dist/i18n/instance.js +1 -1
  349. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  350. package/dist/i18n/locales/en-US/uikit.js +1 -1
  351. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  352. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  353. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  354. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  355. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  356. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  357. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  358. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  359. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  360. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  361. package/dist/i18n/locales.js +1 -1
  362. package/dist/i18n/useFormatter.js +1 -1
  363. package/dist/i18n/useI18n.js +1 -1
  364. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  365. package/dist/icons/AdjustmentsIcon.js +1 -1
  366. package/dist/icons/AiIcon.js +1 -1
  367. package/dist/icons/AreaChartIcon.js +1 -1
  368. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  369. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  370. package/dist/icons/BackwardIcon.js +1 -1
  371. package/dist/icons/BarChartIcon.js +1 -1
  372. package/dist/icons/BellFilledIcon.js +1 -1
  373. package/dist/icons/BellIcon.js +1 -1
  374. package/dist/icons/BooleanIcon.js +1 -1
  375. package/dist/icons/CalendarEditIcon.js +1 -1
  376. package/dist/icons/CalendarIcon.js +1 -1
  377. package/dist/icons/CaretDownIcon.js +1 -1
  378. package/dist/icons/CaretUpIcon.js +1 -1
  379. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  380. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  381. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  382. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  383. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  384. package/dist/icons/ChartBarLineIcon.js +1 -1
  385. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  386. package/dist/icons/ChartBarStackedIcon.js +1 -1
  387. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  388. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  389. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  390. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  391. package/dist/icons/ChartBubbleIcon.js +1 -1
  392. package/dist/icons/ChartDonut2Icon.js +1 -1
  393. package/dist/icons/ChartFunnelIcon.js +1 -1
  394. package/dist/icons/ChartHeatmapIcon.js +1 -1
  395. package/dist/icons/ChartKPIIcon.js +1 -1
  396. package/dist/icons/ChartPie2Icon.js +1 -1
  397. package/dist/icons/ChartScatterIcon.js +1 -1
  398. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  399. package/dist/icons/CheckCircleIcon.js +1 -1
  400. package/dist/icons/CheckIcon.js +1 -1
  401. package/dist/icons/CircleFilledIcon.js +1 -1
  402. package/dist/icons/ClearIcon.js +1 -1
  403. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  404. package/dist/icons/CloseCircleIcon.js +1 -1
  405. package/dist/icons/CloseIcon.js +1 -1
  406. package/dist/icons/CodeIcon.js +1 -1
  407. package/dist/icons/ColumnTotalIcon.js +1 -1
  408. package/dist/icons/CopyIcon.js +1 -1
  409. package/dist/icons/CountIcon.js +1 -1
  410. package/dist/icons/CubeIcon.js +1 -1
  411. package/dist/icons/CubePauseIcon.js +1 -1
  412. package/dist/icons/CubePlayIcon.js +1 -1
  413. package/dist/icons/CurrencyDollarIcon.js +1 -1
  414. package/dist/icons/DangerIcon.js +1 -1
  415. package/dist/icons/DashboardIcon.js +1 -1
  416. package/dist/icons/DatabaseIcon.js +1 -1
  417. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  418. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  419. package/dist/icons/DirectionIcon.js +1 -1
  420. package/dist/icons/DonutIcon.js +1 -1
  421. package/dist/icons/DownIcon.js +1 -1
  422. package/dist/icons/EditIcon.js +1 -1
  423. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  424. package/dist/icons/ExclamationCircleIcon.js +1 -1
  425. package/dist/icons/ExclamationIcon.js +1 -1
  426. package/dist/icons/EyeIcon.js +1 -1
  427. package/dist/icons/EyeInvisibleIcon.js +1 -1
  428. package/dist/icons/FilterIcon.js +1 -1
  429. package/dist/icons/FolderFilledIcon.js +1 -1
  430. package/dist/icons/FolderIcon.js +1 -1
  431. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  432. package/dist/icons/FolderOpenIcon.js +1 -1
  433. package/dist/icons/ForwardIcon.js +1 -1
  434. package/dist/icons/GripVerticalIcon.js +1 -1
  435. package/dist/icons/HierarchyIcon.js +1 -1
  436. package/dist/icons/HierarchyOpenIcon.js +1 -1
  437. package/dist/icons/Icon.js +1 -1
  438. package/dist/icons/InfoCircleIcon.js +1 -1
  439. package/dist/icons/InfoIcon.js +1 -1
  440. package/dist/icons/KeyIcon.js +1 -1
  441. package/dist/icons/LeftIcon.js +1 -1
  442. package/dist/icons/LineChartIcon.js +1 -1
  443. package/dist/icons/LoadingIcon.js +1 -1
  444. package/dist/icons/LockFilledIcon.js +1 -1
  445. package/dist/icons/LockIcon.js +1 -1
  446. package/dist/icons/MoreIcon.js +1 -1
  447. package/dist/icons/NotAllowedIcon.js +1 -1
  448. package/dist/icons/Number123Icon.js +1 -1
  449. package/dist/icons/NumberIcon.js +1 -1
  450. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  451. package/dist/icons/PauseCircleIcon.js +1 -1
  452. package/dist/icons/PauseIcon.js +1 -1
  453. package/dist/icons/PercentageIcon.js +1 -1
  454. package/dist/icons/PieChartIcon.js +1 -1
  455. package/dist/icons/PipetteIcon.js +1 -1
  456. package/dist/icons/PlayCircleIcon.js +1 -1
  457. package/dist/icons/PlayIcon.js +1 -1
  458. package/dist/icons/PlusIcon.js +1 -1
  459. package/dist/icons/ProgressBarIcon.js +1 -1
  460. package/dist/icons/ReloadIcon.js +1 -1
  461. package/dist/icons/ReportIcon.js +1 -1
  462. package/dist/icons/ReturnIcon.js +1 -1
  463. package/dist/icons/RightIcon.js +1 -1
  464. package/dist/icons/RowTotalsIcon.js +1 -1
  465. package/dist/icons/SchemeIcon.js +1 -1
  466. package/dist/icons/SearchIcon.js +1 -1
  467. package/dist/icons/SemanticQueryIcon.js +1 -1
  468. package/dist/icons/SettingsIcon.js +1 -1
  469. package/dist/icons/ShieldFilledIcon.js +1 -1
  470. package/dist/icons/ShieldIcon.js +1 -1
  471. package/dist/icons/SlashIcon.js +1 -1
  472. package/dist/icons/SparklesIcon.js +1 -1
  473. package/dist/icons/SqlIcon.js +1 -1
  474. package/dist/icons/StatsIcon.js +1 -1
  475. package/dist/icons/StopIcon.js +1 -1
  476. package/dist/icons/StringIcon.js +1 -1
  477. package/dist/icons/SubtotalsIcon.js +1 -1
  478. package/dist/icons/SwitchIcon.js +1 -1
  479. package/dist/icons/TableIcon.js +1 -1
  480. package/dist/icons/ThumbsDownIcon.js +1 -1
  481. package/dist/icons/ThumbsUpIcon.js +1 -1
  482. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  483. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  484. package/dist/icons/ThunderboltIcon.js +1 -1
  485. package/dist/icons/TimeIcon.js +1 -1
  486. package/dist/icons/TrashIcon.js +1 -1
  487. package/dist/icons/UnlockIcon.js +1 -1
  488. package/dist/icons/UpIcon.js +1 -1
  489. package/dist/icons/UserGroupIcon.js +1 -1
  490. package/dist/icons/UserIcon.js +1 -1
  491. package/dist/icons/UserLockIcon.js +1 -1
  492. package/dist/icons/ViewIcon.js +1 -1
  493. package/dist/icons/WarningFilledIcon.js +1 -1
  494. package/dist/icons/WarningIcon.js +1 -1
  495. package/dist/icons/wrap-icon.js +1 -1
  496. package/dist/index.d.ts +2 -1
  497. package/dist/index.js +3 -2
  498. package/dist/index.js.map +1 -1
  499. package/dist/probe/canonicalize.js +1 -1
  500. package/dist/probe/css.js +1 -1
  501. package/dist/probe/index.js +1 -1
  502. package/dist/provider.js +1 -1
  503. package/dist/providers/TrackingProvider.js +1 -1
  504. package/dist/providers/navigationAdapter.default.js +1 -1
  505. package/dist/tokens/all-tokens.js +1 -1
  506. package/dist/tokens/base.js +1 -1
  507. package/dist/tokens/color-seed.js +1 -1
  508. package/dist/tokens/color-theme.d.ts +2 -2
  509. package/dist/tokens/color-theme.js +2 -2
  510. package/dist/tokens/color-theme.js.map +1 -1
  511. package/dist/tokens/colors.d.ts +3 -3
  512. package/dist/tokens/colors.js +4 -4
  513. package/dist/tokens/colors.js.map +1 -1
  514. package/dist/tokens/layout.js +1 -1
  515. package/dist/tokens/lazy-styles.js +1 -1
  516. package/dist/tokens/palette-config.d.ts +1 -1
  517. package/dist/tokens/palette-config.js +1 -1
  518. package/dist/tokens/palette-config.js.map +1 -1
  519. package/dist/tokens/palette.d.ts +5 -5
  520. package/dist/tokens/palette.js +11 -11
  521. package/dist/tokens/palette.js.map +1 -1
  522. package/dist/tokens/resolve.d.ts +1 -1
  523. package/dist/tokens/resolve.js +12 -31
  524. package/dist/tokens/resolve.js.map +1 -1
  525. package/dist/tokens/shadows.d.ts +1 -1
  526. package/dist/tokens/shadows.js +2 -2
  527. package/dist/tokens/shadows.js.map +1 -1
  528. package/dist/tokens/sizes.js +1 -1
  529. package/dist/tokens/spacing.js +1 -1
  530. package/dist/tokens/typography.js +1 -1
  531. package/dist/utils/ResizeSensor.js +1 -1
  532. package/dist/utils/index.d.ts +1 -0
  533. package/dist/utils/is-dev-env.js +1 -1
  534. package/dist/utils/modules.js +1 -1
  535. package/dist/utils/promise.js +1 -1
  536. package/dist/utils/raf.js +1 -1
  537. package/dist/utils/random.js +1 -1
  538. package/dist/utils/range.js +1 -1
  539. package/dist/utils/react/RenderCache.js +1 -1
  540. package/dist/utils/react/Slots.js +1 -1
  541. package/dist/utils/react/chain.js +1 -1
  542. package/dist/utils/react/disabledProps.js +1 -1
  543. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  544. package/dist/utils/react/index.d.ts +1 -0
  545. package/dist/utils/react/index.js +2 -1
  546. package/dist/utils/react/interactions.js +1 -1
  547. package/dist/utils/react/isTextOnly.js +1 -1
  548. package/dist/utils/react/mapProps.js +1 -1
  549. package/dist/utils/react/mergeProps.js +1 -1
  550. package/dist/utils/react/nullableValue.js +1 -1
  551. package/dist/utils/react/resolveIcon.js +1 -1
  552. package/dist/utils/react/sharedStore.js +1 -1
  553. package/dist/utils/react/useBufferedValue.js +1 -1
  554. package/dist/utils/react/useCombinedRefs.js +1 -1
  555. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  556. package/dist/utils/react/useEventBus.js +1 -1
  557. package/dist/utils/react/useId.js +1 -1
  558. package/dist/utils/react/useIsDarwin.js +1 -1
  559. package/dist/utils/react/useKeySymbols.js +1 -1
  560. package/dist/utils/react/useLayoutEffect.js +1 -1
  561. package/dist/utils/react/useLocalStorage.js +1 -1
  562. package/dist/utils/react/useMergeStyles.js +1 -1
  563. package/dist/utils/react/usePopoverSync.js +1 -1
  564. package/dist/utils/react/useQaProps.js +1 -1
  565. package/dist/utils/react/useSchema.d.ts +58 -0
  566. package/dist/utils/react/useSchema.js +182 -0
  567. package/dist/utils/react/useSchema.js.map +1 -0
  568. package/dist/utils/react/useViewportSize.js +1 -1
  569. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  570. package/dist/utils/selection.js +1 -1
  571. package/dist/utils/styles.js +1 -1
  572. package/dist/utils/tree.js +1 -1
  573. package/dist/utils/warnings.js +1 -1
  574. package/dist/version.js +2 -2
  575. package/docs/Colors.md +2 -2
  576. package/docs/Introduction.md +1 -1
  577. package/docs/Theming.md +29 -12
  578. package/docs/Usage.md +28 -11
  579. package/docs/components/content/ItemCard.md +1 -1
  580. package/docs/components/content/PrismCode.md +2 -2
  581. package/docs/components/data/DataTable.md +1 -1
  582. package/docs/components/fields/Picker.md +1 -1
  583. package/docs/components/layout/Board.md +147 -36
  584. package/docs/components/organisms/StatsCard.md +1 -1
  585. package/docs/components/other/CubeLogo.md +9 -9
  586. package/docs/components/overlays/Tooltip.md +2 -2
  587. package/docs/components/overlays/TooltipProvider.md +1 -1
  588. package/package.json +1 -1
@@ -17,78 +17,177 @@ Dragging and resizing are powered by React Aria's `useMove`, so they work with m
17
17
 
18
18
  ## Concepts
19
19
 
20
- - **Layout** — an array of items `{ i, x, y, w, h }` in grid units. `i` matches a `Board.Widget` `id`.
20
+ - **Layout** — an array of items in grid units. `i` matches a `Board.Widget` `id`; a widget whose `id` has no layout item is not rendered at all. Beyond `{ i, x, y, w, h }` an item may carry `minW`/`maxW`/`minH`/`maxH`, `constraints`, `resizeHandles`, `isDraggable`, `isResizable` and `static` — all of which outrank the same options declared on `Board.Widget` (see [How props interact](#how-props-interact)). `static` pins an item: it cannot be dragged, resized or swapped, and compaction flows around it.
21
21
  - **Content vs. position** — `Board.Widget` declares content; the owning `Board` positions it. This decoupling is what lets a widget be transferred between boards.
22
- - **Compaction** — `vertical` (default), `horizontal`, or `free`. In `free` mode a widget is placed exactly where you drop it and its neighbours are never pushed or swapped; without `allowOverlap` a drop onto an occupied cell is blocked, and with `allowOverlap` widgets may stack for a fully free canvas.
22
+ - **Compaction** — `vertical` (default), `horizontal`, `free`, or `null`. In `free` mode a widget is placed exactly where you drop it and its neighbours are never pushed or swapped; without `allowOverlap` a drop onto an occupied cell is blocked, and with `allowOverlap` widgets may stack for a fully free canvas. `allowOverlap` also switches compaction off in the reflowing modes — see [How props interact](#how-props-interact).
23
23
  - **Selection** — off by default. Pressing a widget selects it and arms a drag of the selection: selecting and grabbing are one gesture, so move the pointer and it drags, stay still and it was just a selection. <kbd>Shift</kbd> (or <kbd>Cmd</kbd>/<kbd>Ctrl</kbd>) toggles a widget's membership. Keys are layout item ids, scoped to a single board, and always reported in layout order.
24
24
  - **Selection is focus-like** — it tracks what the user is working with, and touching anything else moves it on: pressing another widget makes _that_ the selection, pressing a control inside a widget drops it, and so does focus leaving the board. With `'multiple'`, pressing an already-selected widget keeps the selection so a drag moves the whole block.
25
25
 
26
+ ## How props interact
27
+
28
+ Several props override, gate, or switch each other off. This is the full set of those relations.
29
+
30
+ ### Grid sizing
31
+
32
+ | Props | Relation |
33
+ | --- | --- |
34
+ | `rows` + `extraRows` | `rows` wins outright. A fixed matrix renders exactly `rows` rows, so `extraRows` — which only pads a board that hugs its content — has no effect. |
35
+ | `rows` + `maxRows` | `rows` implies a `maxRows` of the same value, but an explicit `maxRows` still wins over that implication. |
36
+ | `rowHeight="stretch"` | Requires `rows`, and a measured height. Without either the board falls back to the default `100`px row rather than collapsing. |
37
+ | `width` | Disables width measurement. An `isAligned` board derives its column count from the measured width, so pass a real value if you use both. |
38
+ | `extraRows` + `maxRows` | `extraRows` is clamped by `maxRows`. |
39
+ | `margin` | The grid gap, not a CSS margin — `Board` deliberately drops `margin` from its style props. `Board.Widget` still accepts it as an ordinary style prop. |
40
+
41
+ ### Collision and compaction
42
+
43
+ Three props decide what happens when a widget lands on an occupied cell, and they are resolved in this order:
44
+
45
+ 1. **`allowOverlap` wins outright.** It replaces the compactor with a no-op, so `compact="vertical"` / `"horizontal"` **stop reflowing** as well: widgets stay where they are put and may stack. `preventCollision` and `collisionMode` are both dead while it is on, because nothing is ever refused.
46
+ 2. **`compact="free"` ignores the `preventCollision` prop entirely.** Free mode derives blocking from `allowOverlap` instead — `free` without `allowOverlap` always blocks, `free` with it always stacks. `preventCollision` only reaches `'vertical'`, `'horizontal'` and `null`.
47
+ 3. **`collisionMode` is consulted only where a collision would otherwise refuse the move** — `compact="free"` without `allowOverlap`, or an explicit `preventCollision` on one of the other modes. On a compacting board it does nothing, because there a collision pushes neighbours rather than blocking.
48
+
49
+ `'swap'` never trades with an item marked `static`, and falls back to `'downscale'`, then `'revert'`, when no exchange fits. A resize is blocked by a collision in exactly the modes above; on a compacting board a resize pushes its neighbours the way a drag does.
50
+
51
+ ### `constraints` replaces the defaults
52
+
53
+ `constraints` on `Board` is a **replacement**, not an addition. The default is `[gridBounds, minMaxSize]`, so passing your own array turns off grid-bounds clamping _and_ min/max enforcement — `minW`/`maxW`/`minH`/`maxH` (on the layout item, on `Board.Widget`, or in `widgetProps`) stop being applied. Re-include the built-ins to keep them:
54
+
55
+ ```jsx
56
+ import { aspectRatio, Board, gridBounds, minMaxSize } from '@cube-dev/ui-kit';
57
+
58
+ <Board constraints={[gridBounds, minMaxSize, aspectRatio(16 / 9)]} />;
59
+ ```
60
+
61
+ Per-item and per-widget `constraints` work the other way round: they are applied **in addition** to the board's, and after them. Between those two sources, a layout item's `constraints` replace the widget's rather than adding to them.
62
+
63
+ Built-ins exported alongside `Board`: `gridBounds`, `minMaxSize`, `containerBounds`, `boundedX`, `boundedY`, `aspectRatio`, `snapToGrid`, `minSize`, `maxSize`.
64
+
65
+ ### Per-widget overrides
66
+
67
+ Two different shapes, and it matters which one a prop uses.
68
+
69
+ **Booleans that can only take away.** The board's value is a ceiling:
70
+
71
+ - **`isDraggable`** — a widget is draggable only when the board's `isDraggable` is `true` **and** neither `Board.Widget` nor `widgetProps` set it to `false` **and** the layout item's `isDraggable` is not `false` **and** the item is not `static`. `isDraggable={false}` on the board cannot be re-enabled per widget.
72
+ - **`isResizable`** — the same chain.
73
+ - **`isSelectable`** — only meaningful while `selectionMode` is not `'none'`; a widget can opt out, never opt in.
74
+
75
+ **Values with a precedence chain.** The first source that sets it wins:
76
+
77
+ | Prop | Precedence |
78
+ | --- | --- |
79
+ | `resizeHandles` | layout item → `Board.Widget` → `widgetProps` → `Board` |
80
+ | `minW` / `maxW` / `minH` / `maxH` | layout item → `Board.Widget` → `widgetProps` |
81
+ | `constraints` | layout item → `Board.Widget` → `widgetProps`, then _added_ to the board's |
82
+ | `resizeGripPlacement`, `dragCancel`, `dragHandle`, `selectionCancel` | `Board.Widget` → `widgetProps` → `Board` |
83
+ | `isCard`, `hoverRing`, `isAutoHeight`, `qa` | `Board.Widget` → `widgetProps` (no board-level prop) |
84
+ | `styles`, `mods` | merged, not replaced: `widgetProps` underneath, `Board.Widget` on top, key by key |
85
+
86
+ `resizeHandles` is the one case where the **layout item outranks `Board.Widget`**. Board's own modifiers always win over `mods`, so a custom modifier can never shadow `selected`, `drag` and the rest.
87
+
88
+ ### Drag guards
89
+
90
+ `dragHandle` and `dragCancel` both apply — they are not alternatives. A press starts a drag only when it is inside `dragHandle` (if set) _and_ outside `dragCancel`. `dragCancel` already defaults to the interactive-descendant set, so widgets hosting controls need no configuration; pass `''` to let a drag start from anywhere. On a board with `selectionMode` on, `selectionCancel` acts as a third guard; on a board with `selectionMode="none"` it does nothing at all and `dragCancel` is the only guard. None of the three affects keyboard moves — those only run when the widget host itself is focused.
91
+
92
+ `isAutoHeight` raises the widget's resize floor above `minH`: you cannot drag it shorter than the height its content currently needs.
93
+
94
+ ### Selection
95
+
96
+ `selectionMode="none"` (the default) switches the whole feature off: `selectedKeys`, `defaultSelectedKeys`, `onSelectionChange`, `selectionCancel`, `allowMarqueeSelection`, `onWidgetsDelete`, and the selection key bindings (<kbd>Space</kbd>, <kbd>Escape</kbd>, <kbd>Delete</kbd>) all do nothing.
97
+
98
+ | Props | Relation |
99
+ | --- | --- |
100
+ | `selectedKeys` + `defaultSelectedKeys` | `selectedKeys` wins. Keys with no matching layout item are ignored — no error, no flash — so removing a widget needs no selection cleanup. |
101
+ | Controlled vs. uncontrolled | An uncontrolled board prunes keys of removed widgets and reports that through `onSelectionChange`; a controlled board does not, since you own the state. |
102
+ | `allowMarqueeSelection` | Requires `selectionMode="multiple"`. Setting it `true` under `'single'` does nothing. |
103
+ | `selectionMode="single"` | Any multi-key selection collapses to the first key in layout order. |
104
+ | `onWidgetsDelete` | <kbd>Delete</kbd>/<kbd>Backspace</kbd> are only handled when this is set. Board never removes widgets itself. |
105
+ | `extraRows` | Effectively required for the marquee on a board that hugs its content: with no spare rows there is no empty canvas to lasso from. |
106
+
107
+ ### Nested boards
108
+
109
+ `isAligned` only takes effect inside another `Board`'s widget; on a top-level board it is ignored. Where it does take effect it overrides the board's own grid metrics:
110
+
111
+ | Prop | Under `isAligned` |
112
+ | --- | --- |
113
+ | `rowHeight` | Ignored — the parent's row height is used verbatim, `'stretch'` included. |
114
+ | `margin` | Ignored — the parent's gap is inherited so widget edges line up. |
115
+ | `cols` | Ignored once the board has been measured; the column count is derived from the measured width at the parent's column pitch. Serves only as the pre-measurement fallback. |
116
+ | `containerPadding` | Defaults to `[0, 0]` instead of `margin`, so the grid origin sits flush. An explicit value still wins. |
117
+
118
+ An aligned board never shrinks its rows, so pair it with `isAutoHeight` on the container `Board.Widget` or its content is clipped.
119
+
120
+ `showGridLines` is inherited by a nested board that does not set it, but only in drag-scoped form: an ancestor's `true` reaches descendants as `'drag'` (lines during a drag, not permanently), while `'any-drag'` is inherited verbatim. An explicit `false` opts out of the inheritance; omitting it does not.
121
+
122
+ `isDroppable={false}` only refuses widgets arriving from _other_ boards; dragging within the board still works.
123
+
26
124
  ## Properties
27
125
 
28
126
  ### Board
29
127
 
30
- - **`layout`** `LayoutItem[]` — Controlled layout.
31
- - **`defaultLayout`** `LayoutItem[]` — Initial layout for uncontrolled usage.
128
+ - **`id`** `string` — Stable board id, used for cross-board drag and exposed as `data-board-id`. Auto-generated when omitted; set it when you need to address a specific board (tests, `onWidgetTransfer` bookkeeping).
129
+ - **`layout`** `LayoutItem[]` — Controlled layout. Wins over `defaultLayout`, and re-seeds the board only when the array reference changes: mutating it in place does nothing, and a gesture previews and commits locally regardless, so pass a new array back from `onLayoutChange` to stay authoritative.
130
+ - **`defaultLayout`** `LayoutItem[]` — Initial layout for uncontrolled usage. Ignored when `layout` is set.
32
131
  - **`onLayoutChange`** `(layout: LayoutItem[], info: { reason }) => void` — Called when the layout is committed. `reason` is `'drag'`, `'resize'`, `'transfer'` (a widget arrived from or left for another board) or `'normalize'` (no gesture — a reflow for a changed column count, or an auto-height widget growing). See [Knowing why the layout changed](#knowing-why-the-layout-changed).
33
132
  - **`onDragStart` / `onDrag` / `onDragStop`** `(info: BoardInteractionInfo) => void` — Drag lifecycle callbacks. `onDrag` fires on every step; `onDragStop` fires after the layout is committed.
34
133
  - **`onResizeStart` / `onResize` / `onResizeStop`** `(info: BoardInteractionInfo) => void` — Resize lifecycle callbacks, mirroring the drag ones.
35
- - **`cols`** `number` (default: `12`) — Number of columns.
36
- - **`rows`** `number` — Render exactly this many rows, whatever the content needs — a fixed `cols × rows` matrix rather than a grid that hugs its widgets. Implies a `maxRows` of the same value, so `gridBounds` keeps every drag and resize inside the matrix without a per-widget `maxH`.
37
- - **`rowHeight`** `number | 'stretch'` (default: `100`) — Row height in pixels, or `'stretch'` to divide the board's own measured height into its rows. `'stretch'` is what makes a fixed `rows × cols` matrix fill the box it is given: the board takes its parent's height and each cell an equal share of it, so resizing the container resizes the cells instead of adding or removing them. Requires `rows`: without a declared row count there is no matrix to fill, and dividing by the content extent instead would resize every cell whenever a widget landed on a new row. Unset, or before the parent's height is known, the board keeps its ordinary content-hugging behaviour at the default row height rather than collapsing.
38
- - **`margin`** `[number, number]` (default: `[8, 8]`) — Horizontal/vertical gap between widgets.
134
+ - **`cols`** `number` (default: `12`) — Number of columns. On an `isAligned` nested board this is only the pre-measurement fallback — the real count is derived from the measured width.
135
+ - **`rows`** `number` — Render exactly this many rows, whatever the content needs — a fixed `cols × rows` matrix rather than a grid that hugs its widgets. Implies a `maxRows` of the same value (an explicit `maxRows` still wins), so `gridBounds` keeps every drag and resize inside the matrix without a per-widget `maxH`. Overrides `extraRows`, which only pads a content-hugging board.
136
+ - **`rowHeight`** `number | 'stretch'` (default: `100`) — Row height in pixels, or `'stretch'` to divide the board's own measured height into its rows. `'stretch'` is what makes a fixed `rows × cols` matrix fill the box it is given: the board takes its parent's height and each cell an equal share of it, so resizing the container resizes the cells instead of adding or removing them. Requires `rows`: without a declared row count there is no matrix to fill, and dividing by the content extent instead would resize every cell whenever a widget landed on a new row. Unset, or before the parent's height is known, the board keeps its ordinary content-hugging behaviour at the default row height rather than collapsing. Ignored entirely on an `isAligned` nested board, which uses the parent's row height.
137
+ - **`margin`** `[number, number]` (default: `[8, 8]`) — Horizontal/vertical gap between widgets. This is the grid gap, not a CSS margin: `Board` does not accept `margin` as a style prop. Ignored on an `isAligned` nested board, which inherits the parent's gap.
39
138
  - **`containerPadding`** `[number, number]` — Inner padding. Defaults to `margin`, or to `[0, 0]` for an aligned nested board (`isAligned`) so its grid lines up with the ancestor board's.
40
- - **`maxRows`** `number` (default: `Infinity`) — Maximum number of rows.
41
- - **`extraRows`** `number` (default: `0`) — Empty grid rows kept below the content. The board renders this many rows taller than its widgets need, so there is always somewhere to start a marquee and somewhere to drop a widget past the end. A board hugs its content by default, so on a full grid it has neither. Clamped by `maxRows`.
139
+ - **`maxRows`** `number` (default: `Infinity`) — Maximum number of rows. Defaults to `rows` when that is set; an explicit value overrides that.
140
+ - **`extraRows`** `number` (default: `0`) — Empty grid rows kept below the content. The board renders this many rows taller than its widgets need, so there is always somewhere to start a marquee and somewhere to drop a widget past the end. A board hugs its content by default, so on a full grid it has neither. Clamped by `maxRows`, and ignored entirely when `rows` fixes the matrix.
42
141
  - **`compact`** `'vertical' | 'horizontal' | 'free' | null` (default: `'vertical'`) — Compaction behavior. `'vertical'`/`'horizontal'` reflow widgets to remove gaps; `'free'` places each widget exactly where dropped and never pushes its neighbours (blocked from occupied cells unless `allowOverlap`); `null` disables compaction but still resolves collisions the legacy react-grid-layout way.
43
- - **`allowOverlap`** `boolean` (default: `false`) — Allow widgets to overlap (stack). In `'free'` mode this is what distinguishes stacking from blocking a drop onto an occupied cell.
44
- - **`preventCollision`** `boolean` (default: `false`) — Block movement into occupied cells instead of pushing.
142
+ - **`allowOverlap`** `boolean` (default: `false`) — Allow widgets to overlap (stack). It also **switches compaction off**: with it on, `compact="vertical"`/`"horizontal"` no longer reflow, and `preventCollision`/`collisionMode` have no effect at all, since nothing is ever refused. In `'free'` mode it is what distinguishes stacking from blocking a drop onto an occupied cell.
143
+ - **`preventCollision`** `boolean` (default: `false`) — Block movement into occupied cells instead of pushing. Applies to `'vertical'`, `'horizontal'` and `null` only: `compact="free"` derives blocking from `allowOverlap` and ignores this prop, and `allowOverlap` overrides it everywhere.
45
144
  - **`collisionMode`** `'revert' | 'downscale' | 'swap'` (default: `'revert'`) — How to resolve a drop the grid would otherwise refuse. Only applies where a collision _blocks_ a move — `compact="free"` (which prevents collisions) or an explicit `preventCollision` — and never under `allowOverlap`, where nothing is blocked. `'revert'` snaps the widget back. `'downscale'` shrinks it into the free space at the drop cell, growing rightward and downward, floored at its `minW`/`minH` (below that it reverts). Within one board, `'swap'` trades places with **one** widget — the one the drop covers most — which takes the cell the drag began at, each keeping as much of its own size as fits there. It never displaces more than that one widget. A drop straddling two widgets trades with one of them rather than refusing, so the swap never blinks away as you sweep across a boundary; ties go to the widget earlier in reading order. Dragging back retraces the original arrangement exactly. For a widget arriving from another board (including a nested board entering its parent), the destination board's `'swap'` mode becomes strict insertion: the requested anchor cell must be empty, the incoming widget keeps its size when possible or downscales into the available room to its right and below, and existing destination widgets are neither exchanged nor reflowed. Releasing over an occupied anchor or where `minW`/`minH` cannot fit cancels the transfer and restores both boards; it does not reuse the last valid preview or search for another slot. No mode ever _grows_ a widget. Applies to single-widget drags. Arrow keys honour it too but never resize anything — each press is a gesture of its own, so a press that shrank a widget would have nothing to restore from, and only an exchange that fits outright is allowed. A multi-widget selection still only moves where it fits outright, and a resize is still blocked by a collision.
46
- - **`isDraggable`** `boolean` (default: `true`) — Enable dragging for all widgets.
47
- - **`isResizable`** `boolean` (default: `true`) — Enable resizing for all widgets.
48
- - **`isDroppable`** `boolean` (default: `true`) — Whether the board accepts widgets dropped from other boards.
145
+ - **`isDraggable`** `boolean` (default: `true`) — Enable dragging for all widgets. A ceiling, not a default: `false` here cannot be re-enabled by a widget, and a `static` layout item is never draggable regardless.
146
+ - **`isResizable`** `boolean` (default: `true`) — Enable resizing for all widgets. Same ceiling semantics as `isDraggable`.
147
+ - **`isDroppable`** `boolean` (default: `true`) — Whether the board accepts widgets dropped from _other_ boards. `false` does not affect dragging within the board.
49
148
  - **`resizeHandles`** `ResizeHandleAxis[]` (default: `['se']`) — Which resize handles to show. Corner handles (`ne`/`nw`/`se`/`sw`) show an angle grip; edge handles (`n`/`s`/`e`/`w`) show a dotted grip. Both are revealed on hover/focus/resize. A single edge (e.g. `['e']` or `['s']`) gives a horizontally- or vertically-only resizable widget.
50
149
  - **`resizeGripPlacement`** `'inside' | 'corner'` (default: `'inside'`) — Where the corner grips sit. `'inside'` tucks each one into the widget box; `'corner'` centres it on the widget's corner, so it lines up with a control centred on the opposite corner. Only affects corner handles — a dotted edge grip always stays inside. A corner-placed grip is drawn _outside_ the widget (a widget clips its own content, which would otherwise cut the grip in half), so it needs the board to have at least half a grip's worth of `containerPadding` to show in full against the board's edge. Its hit-zone moves out with it and overhangs by the same half-grip, so the whole visible grip is grabbable and hovering it keeps it revealed — the trade is a ~5px band just outside each corner where a press starts a resize rather than a marquee. Can be overridden per widget.
51
150
  - **`dragCancel`** `string` (default: `BOARD_SELECTION_CANCEL`) — CSS selector for elements that must not start a pointer drag. Defaults to the same set `selectionCancel` uses, because a control inside a widget has to keep its own press whether or not the board supports selection — a board hosting interactive content needs no configuration for buttons, inputs, links and the common ARIA widget roles to stay usable. Pass your own selector to narrow or widen it, or `''` to let a drag start from anywhere. Does not affect keyboard moves. Can be overridden per widget.
52
- - **`dragHandle`** `string` — CSS selector for the only elements from which a pointer drag may start. Can be overridden per widget.
53
- - **`showGridLines`** `boolean | 'drag' | 'any-drag'` (default: `false`) — Show grid lines behind the widgets. `true` always; `false` never; `'drag'` only while _this_ board is part of the active gesture — it owns the drag (as its source, or as the board the widget is currently over) or one of its own widgets is being resized; `'any-drag'` while any drag is in flight anywhere under a shared `Board.Provider`, so every board advertises itself as somewhere the widget could land. Under one `Board.Provider`, `'drag'` keeps boards a widget cannot land in quiet, and `'any-drag'` is the opt-in for the noisier, more informative version. A nested board that does not set this inherits an enabled ancestor's setting, at the ancestor's own scope.
54
- - **`isAligned`** `boolean` (default: `false`) — Align a nested board with its ancestor `Board`'s layout. Only takes effect when the board is nested inside another `Board`'s widget. When set, every cell matches the parent's cell size exactly: the board inherits the parent's column pitch (deriving its own column count from its measured width so cells stay parent-sized as the container is resized) and uses the parent's row height verbatim. It never shrinks rows to fit pair it with an `isAutoHeight` container so the widget grows to fit its rows at that height. `cols`/`rowHeight` then act as fallbacks used only until the parent metrics resolve.
151
+ - **`dragHandle`** `string` — CSS selector for the only elements from which a pointer drag may start. Combines with `dragCancel` rather than replacing it: a drag needs a target inside `dragHandle` _and_ outside `dragCancel`. Can be overridden per widget.
152
+ - **`showGridLines`** `boolean | 'drag' | 'any-drag'` (default: `false`) — Show grid lines behind the widgets. `true` always; `false` never; `'drag'` only while _this_ board is part of the active gesture — it owns the drag (as its source, or as the board the widget is currently over) or one of its own widgets is being resized; `'any-drag'` while any drag is in flight anywhere under a shared `Board.Provider`, so every board advertises itself as somewhere the widget could land. Under one `Board.Provider`, `'drag'` keeps boards a widget cannot land in quiet, and `'any-drag'` is the opt-in for the noisier, more informative version. A nested board that does not set this inherits an enabled ancestor's setting in drag-scoped form: an ancestor's `true` arrives as `'drag'` (a nested board shows lines during a drag, not permanently), while `'any-drag'` is inherited verbatim. An explicit `false` opts out of the inheritance.
153
+ - **`isAligned`** `boolean` (default: `false`) — Align a nested board with its ancestor `Board`'s layout. Only takes effect when the board is nested inside another `Board`'s widget. When set, every cell matches the parent's cell size exactly, which means it takes over three of the board's own metrics: `rowHeight` and `margin` are ignored in favour of the parent's, and `cols` is ignored once the board has been measured (the column count is derived from the measured width at the parent's column pitch, so cells stay parent-sized as the container is resized) `cols` only serves as the pre-measurement fallback. It never shrinks rows to fit, so pair it with an `isAutoHeight` container so the widget grows to fit its rows at that height.
55
154
  - **`selectionMode`** `'none' | 'single' | 'multiple'` (default: `'none'`) — Whether widgets can be selected, and how many at a time. `'multiple'` also enables the marquee and rigid group movement.
56
- - **`selectedKeys`** `string[]` — Controlled selection. Keys are layout item ids (`LayoutItem.i`).
57
- - **`defaultSelectedKeys`** `string[]` — Initial selection for uncontrolled usage.
155
+ - **`selectedKeys`** `string[]` — Controlled selection. Keys are layout item ids (`LayoutItem.i`); keys with no matching layout item are silently ignored. Requires `selectionMode` other than `'none'`.
156
+ - **`defaultSelectedKeys`** `string[]` — Initial selection for uncontrolled usage. Ignored when `selectedKeys` is set. An uncontrolled board also prunes keys of removed widgets and reports that through `onSelectionChange`; a controlled board leaves that to you.
58
157
  - **`onSelectionChange`** `(keys: string[]) => void` — Called when the selection changes. Keys are deduped and returned in the board's layout order, never in click order.
59
- - **`selectionCancel`** `string` (default: `BOARD_SELECTION_CANCEL`) — CSS selector marking interactive descendants. A press on one never selects and never starts a drag, so the control keeps its own click _and_ its native focus; it also drops the selection, since interacting with a widget's content means the user has moved on. On a selectable board this doubles as the drag guard, so form controls stay usable without also configuring `dragCancel`. The default covers native form controls, links, and the common ARIA widget roles, plus `[data-no-select]` as an escape hatch. Pass `''` to disable the guard. Can be overridden per widget.
60
- - **`allowMarqueeSelection`** `boolean` (default: `selectionMode === 'multiple'`) — Draw a rubber-band selection when a drag starts on empty board space. A press on a widget selects and drags instead, so the lasso owns empty canvas only. Hold <kbd>Shift</kbd> or <kbd>Cmd</kbd>/<kbd>Ctrl</kbd> to add to the existing selection rather than replacing it. A board sized to its content has no empty space left once the grid fills up, which makes the lasso undiscoverable — use `extraRows` to keep a band of it.
158
+ - **`selectionCancel`** `string` (default: `BOARD_SELECTION_CANCEL`) — CSS selector marking interactive descendants. Only active while `selectionMode` is not `'none'`; on a non-selectable board `dragCancel` is the guard instead. A press on one never selects and never starts a drag, so the control keeps its own click _and_ its native focus; it also drops the selection, since interacting with a widget's content means the user has moved on — and that holds however the control handles the press, including one that stops propagation or renders in a portal (a menu opened from a widget's toolbar). On a selectable board this doubles as the drag guard, so form controls stay usable without also configuring `dragCancel`. The default covers native form controls, links, and the common ARIA widget roles, plus `[data-no-select]` as an escape hatch. Pass `''` to disable the guard. Can be overridden per widget.
159
+ - **`allowMarqueeSelection`** `boolean` (default: `selectionMode === 'multiple'`) — Draw a rubber-band selection when a drag starts on empty board space. Requires `selectionMode="multiple"` — setting it `true` under `'single'` or `'none'` does nothing. A press on a widget selects and drags instead, so the lasso owns empty canvas only. Hold <kbd>Shift</kbd> or <kbd>Cmd</kbd>/<kbd>Ctrl</kbd> to add to the existing selection rather than replacing it. A board sized to its content has no empty space left once the grid fills up, which makes the lasso undiscoverable — use `extraRows` to keep a band of it.
61
160
  - **`onWidgetsDelete`** `(keys: string[]) => void` — Called when <kbd>Delete</kbd>/<kbd>Backspace</kbd> is pressed with a non-empty selection and focus is not in an editable field. **Board never mutates the layout itself** — removing the widgets is yours to do, which is what lets you make it undoable. Board only handles these keys when this handler is set.
62
- - **`constraints`** `LayoutConstraint[]` — Grid/item layout constraints.
161
+ - **`constraints`** `LayoutConstraint[]` (default: `[gridBounds, minMaxSize]`) — Grid layout constraints. **Replaces** the defaults rather than extending them, so a custom array turns off bounds clamping and `minW`/`maxW`/`minH`/`maxH` enforcement unless you re-include the built-ins. Per-item and per-widget `constraints` are additive on top of these. See [How props interact](#how-props-interact).
63
162
  - **`width`** `number` — Explicit width, which **disables the board's own measurement**. Only needed for SSR, tests, or a forced-size export — see [Sizing](#sizing); a board in the document measures itself and does not need this.
64
- - **`widgetProps`** `Partial<Board.Widget props>` — Default props applied to every widget this board hosts (per-widget `Board.Widget` props override these). Use it to add a card border to every widget (`widgetProps={{ isCard: true }}`) or set shared `styles`/sizing defaults without repeating them on each widget.
163
+ - **`widgetProps`** `Partial<Board.Widget props>` — Default props applied to every widget this board hosts, excluding `id` and `children` (per-widget `Board.Widget` props override these; `styles` and `mods` are merged rather than replaced). Use it to add a card border to every widget (`widgetProps={{ isCard: true }}`) or set shared `styles`/sizing defaults without repeating them on each widget.
65
164
  - **`place`** `Styles['place']` — Style prop shorthand for `place-items`/`place-content`.
66
165
  - **`scrollMargin`** `Styles['scrollMargin']` — Style prop for scroll margin.
67
166
 
68
167
  ### Board.Widget
69
168
 
70
- - **`id`** `string` (required) — Must match the `i` of a layout item.
169
+ - **`id`** `string` (required) — Must match the `i` of a layout item. A widget whose `id` has no layout item is not rendered; `Board.Widget` itself renders nothing, it only registers content and options with the owning `Board`.
71
170
  - **`cornerChrome`** `ReactNode` — A control anchored to one corner of the widget and centred on it — a settings button, a badge, a remove affordance. Drawn in the same layer as the corner resize grips, which is the layer that escapes the widget's own clip: chrome hung off the corner from _inside_ a widget is cropped in half by that clip, or by an ancestor's scroll container when the widget sits in the first row. It is also outside the drag gesture, so a press on it can never start a drag and needs no `dragCancel` entry.
72
171
  - **`cornerChromePlacement`** `'ne' | 'nw' | 'se' | 'sw'` (default: `'ne'`) — Which corner the chrome sits on. Pair it with a `resizeGripPlacement="corner"` grip on the opposite corner and the two line up.
73
172
  - **`mods`** `Record<string, boolean | string | undefined>` — App-defined modifiers for this widget, merged into the ones the board sets, so a `styles` map can match on app state: `mods={{ editing: true }}` with `styles={{ shadow: { editing: '0 0 0 1bw #primary' } }}`. Board's own modifiers always win, so a custom one can never shadow `selected`, `drag` and the rest. Board-level `widgetProps.mods` merge underneath, so a shared default can be set once and overridden per widget — and every modifier rides along on the clone that floats during a drag.
74
173
  - **`hoverRing`** `boolean` (default: `true`) — Whether the widget shows the resting ring on hover — the affordance that says it can be picked up. Turn it off for a widget that is scenery rather than a thing to grab (a chromeless layout container, a spacer), where the ring advertises an interaction the widget does not really offer. Selection and drag treatments are unaffected. Can be set for the whole board via `widgetProps`.
75
174
  - **`isCard`** `boolean` (default: `false`) — Render this widget as a card by adding a border. Widgets are always filled (`#surface-2`) and rounded (`1cr`); `isCard` adds the border on top. Defaults to `false` (borderless) unless the owning `Board`'s `widgetProps.isCard` opts in; set it per widget to override that default.
76
- - **`isDraggable`** `boolean` — Disable dragging for this widget.
77
- - **`isResizable`** `boolean` — Disable resizing for this widget.
78
- - **`resizeHandles`** `ResizeHandleAxis[]` — Override the board's handles.
175
+ - **`isDraggable`** `boolean` — Disable dragging for this widget. Can only take away: it cannot re-enable dragging on a board with `isDraggable={false}`, nor on a `static` layout item.
176
+ - **`isResizable`** `boolean` — Disable resizing for this widget. Same one-way semantics as `isDraggable`.
177
+ - **`resizeHandles`** `ResizeHandleAxis[]` — Override the board's handles. Overridden in turn by the layout item's own `resizeHandles` — the one option where the layout item outranks `Board.Widget`.
79
178
  - **`resizeGripPlacement`** `'inside' | 'corner'` — Override the board's grip placement.
80
179
  - **`minW`** `number` — Minimum width in grid columns. Used when the layout item omits `minW`; the resize handle stops here.
81
180
  - **`maxW`** `number` — Maximum width in grid columns. Used when the layout item omits `maxW`.
82
181
  - **`minH`** `number` — Minimum height in grid rows. Used when the layout item omits `minH`.
83
182
  - **`maxH`** `number` — Maximum height in grid rows. Used when the layout item omits `maxH`.
84
- - **`constraints`** `LayoutConstraint[]` — Per-widget constraints.
183
+ - **`constraints`** `LayoutConstraint[]` — Per-widget constraints, applied _in addition_ to the board's (unlike the board's own `constraints`, which replace the defaults). A layout item's `constraints` replace these.
85
184
  - **`qa`** `string` — Test id for the rendered widget element.
86
185
  - **`styles`** `Styles` — Style overrides for the rendered widget element.
87
186
  - **Style properties** — `Board.Widget` also accepts container style props directly (e.g. `fill`, `padding`, `radius`, `border`, `shadow`, `color`, `flow`, `gap`), just like `Board`. They are merged into `styles` (a direct prop wins over the same key in the `styles` object). Shared `widgetProps.styles` from the owning `Board` are merged underneath, so a per-widget style only overrides the matching keys instead of replacing the whole default.
88
- - **`isAutoHeight`** `boolean` (default: `false`) — Grow this widget's height in its board to fit its content (only ever increases, never shrinks). Pair it with a nested `Board isAligned` so the container expands until the inner board's rows fit at the parent's row height. It also pins the widget's resize floor: you cannot drag the widget shorter than the height its content currently needs.
187
+ - **`isAutoHeight`** `boolean` (default: `false`) — Grow this widget's height in its board to fit its content (only ever increases, never shrinks). Pair it with a nested `Board isAligned` so the container expands until the inner board's rows fit at the parent's row height. It also pins the widget's resize floor above `minH`: you cannot drag the widget shorter than the height its content currently needs. A grow commits, so it fires the board's `onLayoutChange` with `reason: 'normalize'`.
89
188
  - **`dragCancel`** `string` — Override the board's `dragCancel` selector for this widget.
90
189
  - **`dragHandle`** `string` — Override the board's `dragHandle` selector for this widget.
91
- - **`isSelectable`** `boolean` — Disable selection for this widget while the board's `selectionMode` is on.
190
+ - **`isSelectable`** `boolean` — Disable selection for this widget while the board's `selectionMode` is on. Cannot opt a widget in on a board with `selectionMode="none"`.
92
191
  - **`selectionCancel`** `string` — Override the board's `selectionCancel` selector for this widget.
93
192
  - **`aria-label`** `string` — Accessible name for the widget. Falls back to `qa`, then the layout item id — both developer-facing, so set this whenever the widget is user-visible. Also what the selection announcement reads out.
94
193
 
@@ -104,7 +203,7 @@ Dragging a widget across a container that can unmount (for example, out of an in
104
203
 
105
204
  ### Board.Responsive
106
205
 
107
- A wrapper around `Board` that selects a layout and column count based on the container's measured width, mirroring react-grid-layout's `Responsive` + `WidthProvider`. It accepts all `Board` props except `layout`, `defaultLayout`, `cols`, `onLayoutChange`, and `width` (which it manages), plus:
206
+ A wrapper around `Board` that selects a layout and column count based on the container's measured width, mirroring react-grid-layout's `Responsive` + `WidthProvider`. It accepts every `Board` prop, with five of them re-shaped or taken over: `layout` and `defaultLayout` are replaced by `layouts`/`defaultLayouts`, `cols` becomes a per-breakpoint map, `onLayoutChange` gains a second argument, and `width` stays available but defaults to the wrapper's own measurement. `breakpoints` and `cols` are required; the rest:
108
207
 
109
208
  - **`breakpoints`** `Record<string, number>` — Breakpoint name to minimum container width (px).
110
209
  - **`cols`** `Record<string, number>` — Breakpoint name to column count.
@@ -168,7 +267,7 @@ Supports [Base properties](../../BaseProperties.md).
168
267
  These properties allow direct style application without using the `styles` prop:
169
268
 
170
269
  - **Base:** `display`, `font`, `preset`, `hide`, `whiteSpace`, `opacity`, `transition`
171
- - **Position:** `gridArea`, `order`, `gridColumn`, `gridRow`, `placeSelf`, `alignSelf`, `justifySelf`, `zIndex`, `margin`, `inset`, `position`, `scrollMargin`
270
+ - **Position:** `gridArea`, `order`, `gridColumn`, `gridRow`, `placeSelf`, `alignSelf`, `justifySelf`, `zIndex`, `inset`, `position`, `scrollMargin`
172
271
  - **Dimension:** `width`, `height`, `flexBasis`, `flexGrow`, `flexShrink`, `flex`
173
272
  - **Block:** `border`, `radius`, `shadow`, `outline`, `padding`, `paddingInline`, `paddingBlock`, `overflow`, `scrollbar`, `textAlign`
174
273
  - **Color:** `color`, `fill`, `fade`, `image`
@@ -194,6 +293,14 @@ Add `allowOverlap` to let widgets stack on top of each other instead of being bl
194
293
 
195
294
  ### Non-resizable
196
295
 
296
+ ### Read-only
297
+
298
+ `isDraggable={false}` together with `isResizable={false}` makes the whole board read-only. Because the board never installs its drag handlers, widget content stays fully interactive — text inside a widget can still be selected.
299
+
300
+ ### Single-axis resize
301
+
302
+ Set a widget's `resizeHandles` to a single edge to constrain resizing to one axis: `['e']` for horizontal only, `['s']` for vertical only. Edge handles draw a dotted grip revealed on hover, focus, or while resizing.
303
+
197
304
  ### Min/max widget size
198
305
 
199
306
  Bound resizing with per-widget `minW`/`maxW` (columns) and `minH`/`maxH` (rows).
@@ -202,6 +309,10 @@ Bound resizing with per-widget `minW`/`maxW` (columns) and `minH`/`maxH` (rows).
202
309
 
203
310
  Show grid lines behind the widgets while dragging or resizing (or always). With several boards under one `Board.Provider`, `'drag'` lights up only the board the drag belongs to; `'any-drag'` lights up all of them.
204
311
 
312
+ ### Scoped grid lines
313
+
314
+ Two boards under one `Board.Provider`. With `showGridLines="drag"` only the board taking part in the gesture lights up — the source, plus whichever board the widget is currently over. Switch to `'any-drag'` to light up both from the first pixel of any drag.
315
+
205
316
  ### Corner chrome
206
317
 
207
318
  A control centred on a widget's corner with `cornerChrome`, drawn outside the widget's clip so nothing crops it. With a `resizeGripPlacement="corner"` grip on the opposite corner, the two line up.
@@ -292,11 +403,11 @@ So a consumer that mirrors this — measuring the box itself, feeding the result
292
403
  | Key | Action |
293
404
  | --- | --- |
294
405
  | <kbd>Tab</kbd> | Move focus to the next widget. |
295
- | <kbd>Arrow</kbd> keys | Move the focused widget one cell. With a selection, moves the whole selection. |
406
+ | <kbd>Arrow</kbd> keys | Move the focused widget to the next valid cell in that direction — usually one cell, but it scans further when the adjacent cell cannot produce a valid move. With a selection, moves the whole selection. Honours `collisionMode`, but never resizes anything. |
296
407
  | <kbd>Space</kbd> | Toggle the focused widget's selection (`selectionMode` only). |
297
408
  | <kbd>Shift</kbd> / <kbd>Cmd</kbd> / <kbd>Ctrl</kbd> + press | Add or remove a widget from the selection. |
298
- | <kbd>Escape</kbd> | Clear the selection. |
299
- | <kbd>Delete</kbd> / <kbd>Backspace</kbd> | Request deletion of the selection via `onWidgetsDelete`. |
409
+ | <kbd>Escape</kbd> | Clear the selection. Only consumed when something is selected. |
410
+ | <kbd>Delete</kbd> / <kbd>Backspace</kbd> | Request deletion of the selection via `onWidgetsDelete`. Only consumed when that handler is set and the selection is non-empty. |
300
411
 
301
412
  Arrow keys and <kbd>Space</kbd> only act when the widget host **itself** is focused, never when focus is inside a nested control, so an `input`, `textarea`, or `button` inside a widget keeps every key it needs. Board's own keys are handled on the board element rather than on `document`, and are only consumed when they actually do something — an <kbd>Escape</kbd> with nothing selected still reaches an ancestor Dialog, and <kbd>Backspace</kbd> stays available for text editing and browser-back.
302
413
 
@@ -22,7 +22,7 @@ Extends Card with:
22
22
  - `placeContent` — `space-between`
23
23
  - `gap` — `1x`
24
24
  - `border` — none
25
- - `shadow` — `$shadow` (design-system elevation token, scheme-aware via `#shadow-md`)
25
+ - `shadow` — `$shadow` (design-system elevation token, schema-aware via `#shadow-md`)
26
26
  - `padding` — `2.5x`
27
27
 
28
28
  ### Base Properties
@@ -37,35 +37,35 @@ Every path is drawn with `currentColor`. Inheriting is the default and usually c
37
37
  <CubeFullLogo color="#dark" />
38
38
  ```
39
39
 
40
- There are **no baked-in brand hexes**, which is what lets the marks work on any surface and in any scheme.
40
+ There are **no baked-in brand hexes**, which is what lets the marks work on any surface and in any schema.
41
41
 
42
- ## Light and dark schemes
42
+ ## Light and dark schemas
43
43
 
44
44
  The mark is two different drawings rather than one drawing recoloured — the dark variant is filled differently so it holds its weight against a dark surface. Both are rendered, and the `@dark` state swaps them in CSS.
45
45
 
46
46
  That means the swap costs no re-render, is correct during SSR and before hydration, and needs no prop in the normal case. It also means a snapshot of the DOM always contains both paths; assert on `[data-element="LightMark"]` / `[data-element="DarkMark"]` rather than on a single `path`.
47
47
 
48
- ### Pinning a scheme
48
+ ### Pinning a schema
49
49
 
50
- `@dark` is a _state_, and it is resolved against the **document**. Where the background is known but the document scheme does not describe it, pass `scheme` to pin one mark:
50
+ `@dark` is a _state_, and it is resolved against the **document**. Where the background is known but the document schema does not describe it, pass `schema` to pin one mark:
51
51
 
52
52
  ```jsx
53
53
  {/* A fixed-dark panel inside a light app */}
54
54
  <Block fill="#surface-inverse">
55
- <CubeFullLogo scheme="dark" color="#white" />
55
+ <CubeFullLogo schema="dark" color="#white" />
56
56
  </Block>
57
57
 
58
58
  {/* A themed region — `tokens` overrides token *values*, so it cannot reach a state */}
59
- <Block tokens={renderColorTokens({ scheme: 'dark' })} fill="#surface">
60
- <CubeFullLogo scheme="dark" />
59
+ <Block tokens={renderColorTokens({ schema: 'dark' })} fill="#surface">
60
+ <CubeFullLogo schema="dark" />
61
61
  </Block>
62
62
  ```
63
63
 
64
- Use it only when you know the surface. Omitting it is the right default: a pinned scheme stops following the user's own light/dark preference.
64
+ Use it only when you know the surface. Omitting it is the right default: a pinned schema stops following the user's own light/dark preference.
65
65
 
66
66
  ## Properties
67
67
 
68
- - **`scheme`** `'light' | 'dark'` — Pin one mark instead of letting the `@dark` state pick. Omit it unless you know the surface; see [Pinning a scheme](#pinning-a-scheme)
68
+ - **`schema`** `'light' | 'dark'` — Pin one mark instead of letting the `@dark` state pick. Omit it unless you know the surface; see [Pinning a schema](#pinning-a-schema)
69
69
  - **`size`** — Maps onto `font-size`. Both axes on `CubeLogo`, height only on `CubeFullLogo`
70
70
  - **`color`** — Any color token. Both marks are drawn with `currentColor`, so this is inherited by default
71
71
 
@@ -42,7 +42,7 @@ Display container for tooltip content. Has a directional arrow dependent on its
42
42
  - **`showIcon`** `boolean` — Controls whether an icon should be displayed in the tooltip
43
43
  - **`placement`** `PlacementAxis` (default: `'top'`) — Position of the tooltip relative to its trigger. Options: `top`, `bottom`, `left`, `right`
44
44
  - **`isMaterial`** `boolean` — Enables material-style tooltip with auto pointer events
45
- - **`isLight`** `boolean` — Uses light color scheme for the tooltip
45
+ - **`isLight`** `boolean` — Uses light color schema for the tooltip
46
46
  - **`isOpen`** `boolean` — Controlled open state of the tooltip
47
47
  - **`defaultOpen`** `boolean` — Whether the tooltip is open by default (uncontrolled)
48
48
  - **`onOpenChange`** `(isOpen: boolean) => void` — Callback when the tooltip open state changes
@@ -78,7 +78,7 @@ These properties allow direct style application without using the `styles` prop:
78
78
  The `mods` property on the tooltip accepts the following modifiers you can override:
79
79
 
80
80
  - **`material`** `boolean` — Enables material-style tooltip with pointer events
81
- - **`light`** `boolean` — Uses light color scheme instead of dark
81
+ - **`light`** `boolean` — Uses light color schema instead of dark
82
82
  - **`open`** `boolean` — Indicates whether the tooltip is currently visible
83
83
 
84
84
  ## Usage Patterns
@@ -19,7 +19,7 @@ A convenience wrapper that combines `TooltipTrigger` and `Tooltip` into a single
19
19
  - **`delay`** `number` (default: `250`) — The delay time in ms for the tooltip to show up
20
20
  - **`closeDelay`** `number` (default: `500`) — The delay time in ms for the tooltip to close
21
21
  - **`isMaterial`** `boolean` — Enables material-style tooltip with auto pointer events
22
- - **`isLight`** `boolean` — Uses light color scheme for the tooltip
22
+ - **`isLight`** `boolean` — Uses light color schema for the tooltip
23
23
  - **`isOpen`** `boolean` — Controlled open state of the tooltip
24
24
  - **`defaultOpen`** `boolean` — Whether the tooltip is open by default (uncontrolled)
25
25
  - **`onOpenChange`** `(isOpen: boolean) => void` — Callback when the tooltip open state changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cube-dev/ui-kit",
3
- "version": "0.169.1",
3
+ "version": "0.170.0",
4
4
  "type": "module",
5
5
  "description": "UIKit for Cube Projects",
6
6
  "repository": {