@cube-dev/ui-kit 0.0.0-canary-1f0dd2c → 0.0.0-canary-1d27aa0

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 (625) hide show
  1. package/README.md +7 -4
  2. package/dist/README.md +7 -4
  3. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  4. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  5. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  6. package/dist/_internal/hooks/use-event.js +1 -1
  7. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  8. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  9. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  10. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  11. package/dist/_internal/hooks/use-warn.js +1 -1
  12. package/dist/components/Block.js +1 -1
  13. package/dist/components/CollectionItem.js +1 -1
  14. package/dist/components/GlobalStyles.js +1 -1
  15. package/dist/components/GridProvider.js +1 -1
  16. package/dist/components/HiddenInput.js +1 -1
  17. package/dist/components/Root.js +1 -1
  18. package/dist/components/actions/Action/Action.js +1 -1
  19. package/dist/components/actions/Banner/Banner.js +1 -1
  20. package/dist/components/actions/Button/Button.d.ts +0 -1
  21. package/dist/components/actions/Button/Button.js +1 -1
  22. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  23. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  24. package/dist/components/actions/ButtonSplit/context.js +1 -1
  25. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  28. package/dist/components/actions/ItemActionContext.js +1 -1
  29. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  30. package/dist/components/actions/Link/Link.js +1 -1
  31. package/dist/components/actions/Menu/Menu.js +1 -1
  32. package/dist/components/actions/Menu/MenuItem.js +1 -1
  33. package/dist/components/actions/Menu/MenuSection.js +1 -1
  34. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  36. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  37. package/dist/components/actions/Menu/context.js +1 -1
  38. package/dist/components/actions/Menu/styled.js +1 -1
  39. package/dist/components/actions/index.js +1 -1
  40. package/dist/components/actions/use-action.js +1 -1
  41. package/dist/components/actions/use-anchored-menu.js +1 -1
  42. package/dist/components/actions/use-context-menu.js +1 -1
  43. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  44. package/dist/components/content/Alert/Alert.js +1 -1
  45. package/dist/components/content/Alert/use-alert.js +1 -1
  46. package/dist/components/content/Avatar/Avatar.js +1 -1
  47. package/dist/components/content/Badge/Badge.js +1 -1
  48. package/dist/components/content/Card/Card.js +1 -1
  49. package/dist/components/content/Content.js +1 -1
  50. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  51. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  52. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  53. package/dist/components/content/Divider.js +1 -1
  54. package/dist/components/content/Footer.js +1 -1
  55. package/dist/components/content/Header.js +1 -1
  56. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  57. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  58. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  59. package/dist/components/content/Item/Item.js +1 -1
  60. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  61. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  62. package/dist/components/content/Layout/GridLayout.js +1 -1
  63. package/dist/components/content/Layout/Layout.js +1 -1
  64. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  65. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  66. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  67. package/dist/components/content/Layout/LayoutContent.js +1 -1
  68. package/dist/components/content/Layout/LayoutContext.js +1 -1
  69. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  70. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  71. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  72. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  73. package/dist/components/content/Layout/LayoutPane.js +1 -1
  74. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  75. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  76. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  77. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  78. package/dist/components/content/Layout/index.js +1 -1
  79. package/dist/components/content/Layout/utils.js +1 -1
  80. package/dist/components/content/Paragraph.js +1 -1
  81. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  82. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  83. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  84. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  85. package/dist/components/content/Result/Result.js +1 -1
  86. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  87. package/dist/components/content/Tag/Tag.js +1 -1
  88. package/dist/components/content/Text.d.ts +14 -14
  89. package/dist/components/content/Text.js +1 -1
  90. package/dist/components/content/TextItem/TextItem.js +1 -1
  91. package/dist/components/content/Title.js +1 -1
  92. package/dist/components/content/Tree/Tree.js +1 -1
  93. package/dist/components/content/Tree/TreeNode.js +1 -1
  94. package/dist/components/content/Tree/styled.js +1 -1
  95. package/dist/components/content/Tree/tree-index.js +1 -1
  96. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  97. package/dist/components/content/Tree/use-load-data.js +1 -1
  98. package/dist/components/content/highlightText.js +1 -1
  99. package/dist/components/content/use-auto-tooltip.js +1 -1
  100. package/dist/components/data/DataTable/DataTable.js +1 -1
  101. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  102. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  103. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  104. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  105. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  106. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  107. package/dist/components/data/TableBase/RowCollection.js +1 -1
  108. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  109. package/dist/components/data/TableBase/TableRow.js +1 -1
  110. package/dist/components/data/TableBase/TableView.js +1 -1
  111. package/dist/components/data/TableBase/column-menu.js +1 -1
  112. package/dist/components/data/TableBase/column-tint.js +1 -1
  113. package/dist/components/data/TableBase/row-menu.js +1 -1
  114. package/dist/components/data/TableBase/styled.d.ts +1 -2
  115. package/dist/components/data/TableBase/styled.js +1 -1
  116. package/dist/components/data/TableBase/table-tree.js +1 -1
  117. package/dist/components/data/TableBase/types.js +1 -1
  118. package/dist/components/data/TableBase/use-cell-selection.d.ts +0 -1
  119. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  120. package/dist/components/data/TableBase/use-column-order.js +1 -1
  121. package/dist/components/data/TableBase/use-container-width.js +1 -1
  122. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  123. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  124. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  125. package/dist/components/data/TableBase/use-table-search.js +1 -1
  126. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  127. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  128. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  129. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  130. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  131. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  132. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  133. package/dist/components/fields/Checkbox/context.js +1 -1
  134. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  135. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  136. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  137. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  138. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  139. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  140. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  141. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  142. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  143. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  144. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  145. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  146. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  147. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  148. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  149. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  150. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  151. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  152. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  153. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  154. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  155. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  156. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  157. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  158. package/dist/components/fields/DatePicker/period.js +1 -1
  159. package/dist/components/fields/DatePicker/props.js +1 -1
  160. package/dist/components/fields/DatePicker/utils.js +1 -1
  161. package/dist/components/fields/FileInput/FileInput.js +1 -1
  162. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  163. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  164. package/dist/components/fields/Input/Input.js +1 -1
  165. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  166. package/dist/components/fields/ListBox/ListBox.js +1 -1
  167. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  168. package/dist/components/fields/ListBoxPopover/index.d.ts +0 -1
  169. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  170. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  171. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  172. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  173. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  174. package/dist/components/fields/Picker/Picker.js +1 -1
  175. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  176. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  177. package/dist/components/fields/RadioGroup/context.js +1 -1
  178. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  179. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  180. package/dist/components/fields/Select/Select.js +1 -1
  181. package/dist/components/fields/Slider/Gradation.js +1 -1
  182. package/dist/components/fields/Slider/HueSlider.js +1 -1
  183. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  184. package/dist/components/fields/Slider/Slider.js +1 -1
  185. package/dist/components/fields/Slider/SliderBase.js +1 -1
  186. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  187. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  188. package/dist/components/fields/Slider/elements.js +1 -1
  189. package/dist/components/fields/Slider/index.js +1 -1
  190. package/dist/components/fields/Switch/Switch.js +1 -1
  191. package/dist/components/fields/TextArea/TextArea.js +1 -1
  192. package/dist/components/fields/TextInput/TextInput.js +1 -1
  193. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  194. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  195. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  196. package/dist/components/fields/color/ColorPanel.js +1 -1
  197. package/dist/components/fields/color/channels.js +1 -1
  198. package/dist/components/fields/color/color.js +1 -1
  199. package/dist/components/fields/color/context.js +1 -1
  200. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  201. package/dist/components/form/Form/Field.js +1 -1
  202. package/dist/components/form/Form/Form.js +1 -1
  203. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  204. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  205. package/dist/components/form/Form/SubmitError.js +1 -1
  206. package/dist/components/form/Form/index.js +1 -1
  207. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  208. package/dist/components/form/Form/use-field/use-field.js +1 -1
  209. package/dist/components/form/Form/use-form.js +1 -1
  210. package/dist/components/form/Form/validation.js +1 -1
  211. package/dist/components/form/Label.js +1 -1
  212. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  213. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  214. package/dist/components/form/validation/use-validation-props.js +1 -1
  215. package/dist/components/form/wrapper.js +1 -1
  216. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  217. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  218. package/dist/components/layout/Board/Board.js +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 +1 -1
  227. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  228. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  229. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  230. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  231. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  232. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  233. package/dist/components/layout/Board/index.js +1 -1
  234. package/dist/components/layout/Board/responsive-utils.js +1 -1
  235. package/dist/components/layout/Board/use-board-layout.js +1 -1
  236. package/dist/components/layout/Board/use-board-registry.js +1 -1
  237. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  238. package/dist/components/layout/Board/use-board-selection.js +1 -1
  239. package/dist/components/layout/Flex.js +1 -1
  240. package/dist/components/layout/Flow.js +1 -1
  241. package/dist/components/layout/Grid.js +1 -1
  242. package/dist/components/layout/Panel.js +1 -1
  243. package/dist/components/layout/Prefix.js +1 -1
  244. package/dist/components/layout/ResizablePanel.js +1 -1
  245. package/dist/components/layout/Space.js +1 -1
  246. package/dist/components/layout/Suffix.js +1 -1
  247. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  248. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  249. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  250. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  251. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  252. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  253. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  254. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  255. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  256. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  257. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  258. package/dist/components/navigation/Tabs/styled.js +1 -1
  259. package/dist/components/navigation/Tabs/types.js +1 -1
  260. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  261. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  262. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  263. package/dist/components/other/Calendar/Calendar.js +1 -1
  264. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  265. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  266. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  267. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  268. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  269. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  270. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  271. package/dist/components/other/Calendar/styled.js +1 -1
  272. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  273. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  274. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  275. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  276. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  277. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  278. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  279. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  280. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  281. package/dist/components/overlays/Dialog/context.js +1 -1
  282. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  283. package/dist/components/overlays/Modal/Modal.d.ts +1 -2
  284. package/dist/components/overlays/Modal/Modal.js +1 -1
  285. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  286. package/dist/components/overlays/Modal/Overlay.d.ts +0 -1
  287. package/dist/components/overlays/Modal/Overlay.js +1 -1
  288. package/dist/components/overlays/Modal/Popover.js +1 -1
  289. package/dist/components/overlays/Modal/Tray.js +1 -1
  290. package/dist/components/overlays/Modal/Underlay.js +1 -1
  291. package/dist/components/overlays/Modal/types.d.ts +0 -1
  292. package/dist/components/overlays/Notifications/Notification.js +1 -1
  293. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  294. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  295. package/dist/components/overlays/Notifications/NotificationContext.d.ts +0 -2
  296. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  297. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  298. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  299. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  300. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  301. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  302. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  303. package/dist/components/overlays/Notifications/index.js +1 -1
  304. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  305. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  306. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  307. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  308. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  309. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  310. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  311. package/dist/components/overlays/Toast/index.js +1 -1
  312. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  313. package/dist/components/overlays/Toast/useToast.js +1 -1
  314. package/dist/components/overlays/Tooltip/Tooltip.js +2 -1
  315. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  316. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  317. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  318. package/dist/components/overlays/Tooltip/context.js +1 -1
  319. package/dist/components/portal/Portal.js +1 -1
  320. package/dist/components/portal/PortalProvider.js +1 -1
  321. package/dist/components/portal/index.d.ts +0 -1
  322. package/dist/components/portal/usePortal.js +1 -1
  323. package/dist/components/shared/DraggableCollection.js +1 -1
  324. package/dist/components/shared/InvalidIcon.js +1 -1
  325. package/dist/components/shared/ValidIcon.js +1 -1
  326. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  327. package/dist/components/status/Spin/Cube.js +1 -1
  328. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  329. package/dist/components/status/Spin/Spin.js +1 -1
  330. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  331. package/dist/data/item-themes.js +1 -1
  332. package/dist/data/themes.js +1 -1
  333. package/dist/eslint-plugin/defaults.generated.js +1 -13
  334. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  335. package/dist/eslint-plugin/index.js +1 -1
  336. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  337. package/dist/i18n/I18nProvider.js +1 -1
  338. package/dist/i18n/createFormatter.js +1 -1
  339. package/dist/i18n/index.js +1 -1
  340. package/dist/i18n/instance.js +1 -1
  341. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  342. package/dist/i18n/locales/en-US/uikit.js +1 -1
  343. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  344. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  345. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  346. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  347. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  348. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  349. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  350. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  351. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  352. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  353. package/dist/i18n/locales.js +1 -1
  354. package/dist/i18n/useFormatter.js +1 -1
  355. package/dist/i18n/useI18n.js +1 -1
  356. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  357. package/dist/icons/AdjustmentsIcon.js +1 -1
  358. package/dist/icons/AiIcon.js +1 -1
  359. package/dist/icons/AreaChartIcon.js +1 -1
  360. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  361. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  362. package/dist/icons/BackwardIcon.js +1 -1
  363. package/dist/icons/BarChartIcon.js +1 -1
  364. package/dist/icons/BellFilledIcon.js +1 -1
  365. package/dist/icons/BellIcon.js +1 -1
  366. package/dist/icons/BooleanIcon.js +1 -1
  367. package/dist/icons/CalendarEditIcon.js +1 -1
  368. package/dist/icons/CalendarIcon.js +1 -1
  369. package/dist/icons/CaretDownIcon.js +1 -1
  370. package/dist/icons/CaretUpIcon.js +1 -1
  371. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  372. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  373. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  374. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  375. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  376. package/dist/icons/ChartBarLineIcon.js +1 -1
  377. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  378. package/dist/icons/ChartBarStackedIcon.js +1 -1
  379. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  380. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  381. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  382. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  383. package/dist/icons/ChartBubbleIcon.js +1 -1
  384. package/dist/icons/ChartDonut2Icon.js +1 -1
  385. package/dist/icons/ChartFunnelIcon.js +1 -1
  386. package/dist/icons/ChartHeatmapIcon.js +1 -1
  387. package/dist/icons/ChartKPIIcon.js +1 -1
  388. package/dist/icons/ChartPie2Icon.js +1 -1
  389. package/dist/icons/ChartScatterIcon.js +1 -1
  390. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  391. package/dist/icons/CheckCircleIcon.js +1 -1
  392. package/dist/icons/CheckIcon.js +1 -1
  393. package/dist/icons/CircleFilledIcon.js +1 -1
  394. package/dist/icons/ClearIcon.js +1 -1
  395. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  396. package/dist/icons/CloseCircleIcon.js +1 -1
  397. package/dist/icons/CloseIcon.js +1 -1
  398. package/dist/icons/CodeIcon.js +1 -1
  399. package/dist/icons/ColumnTotalIcon.js +1 -1
  400. package/dist/icons/CopyIcon.js +1 -1
  401. package/dist/icons/CountIcon.js +1 -1
  402. package/dist/icons/CubeIcon.js +1 -1
  403. package/dist/icons/CubePauseIcon.js +1 -1
  404. package/dist/icons/CubePlayIcon.js +1 -1
  405. package/dist/icons/CurrencyDollarIcon.js +1 -1
  406. package/dist/icons/DangerIcon.js +1 -1
  407. package/dist/icons/DashboardIcon.js +1 -1
  408. package/dist/icons/DatabaseIcon.js +1 -1
  409. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  410. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  411. package/dist/icons/DirectionIcon.js +1 -1
  412. package/dist/icons/DonutIcon.js +1 -1
  413. package/dist/icons/DownIcon.js +1 -1
  414. package/dist/icons/EditIcon.js +1 -1
  415. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  416. package/dist/icons/ExclamationCircleIcon.js +1 -1
  417. package/dist/icons/ExclamationIcon.js +1 -1
  418. package/dist/icons/EyeIcon.js +1 -1
  419. package/dist/icons/EyeInvisibleIcon.js +1 -1
  420. package/dist/icons/FilterIcon.js +1 -1
  421. package/dist/icons/FolderFilledIcon.js +1 -1
  422. package/dist/icons/FolderIcon.js +1 -1
  423. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  424. package/dist/icons/FolderOpenIcon.js +1 -1
  425. package/dist/icons/ForwardIcon.js +1 -1
  426. package/dist/icons/GripVerticalIcon.js +1 -1
  427. package/dist/icons/HierarchyIcon.js +1 -1
  428. package/dist/icons/HierarchyOpenIcon.js +1 -1
  429. package/dist/icons/Icon.js +1 -1
  430. package/dist/icons/InfoCircleIcon.js +1 -1
  431. package/dist/icons/InfoIcon.js +1 -1
  432. package/dist/icons/KeyIcon.js +1 -1
  433. package/dist/icons/LeftIcon.js +1 -1
  434. package/dist/icons/LineChartIcon.js +1 -1
  435. package/dist/icons/LoadingIcon.js +1 -1
  436. package/dist/icons/LockFilledIcon.js +1 -1
  437. package/dist/icons/LockIcon.js +1 -1
  438. package/dist/icons/MoreIcon.js +1 -1
  439. package/dist/icons/NotAllowedIcon.js +1 -1
  440. package/dist/icons/Number123Icon.js +1 -1
  441. package/dist/icons/NumberIcon.js +1 -1
  442. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  443. package/dist/icons/PauseCircleIcon.js +1 -1
  444. package/dist/icons/PauseIcon.js +1 -1
  445. package/dist/icons/PercentageIcon.js +1 -1
  446. package/dist/icons/PieChartIcon.js +1 -1
  447. package/dist/icons/PipetteIcon.js +1 -1
  448. package/dist/icons/PlayCircleIcon.js +1 -1
  449. package/dist/icons/PlayIcon.js +1 -1
  450. package/dist/icons/PlusIcon.js +1 -1
  451. package/dist/icons/ProgressBarIcon.js +1 -1
  452. package/dist/icons/ReloadIcon.js +1 -1
  453. package/dist/icons/ReportIcon.js +1 -1
  454. package/dist/icons/ReturnIcon.js +1 -1
  455. package/dist/icons/RightIcon.js +1 -1
  456. package/dist/icons/RowTotalsIcon.js +1 -1
  457. package/dist/icons/SchemeIcon.js +1 -1
  458. package/dist/icons/SearchIcon.js +1 -1
  459. package/dist/icons/SemanticQueryIcon.js +1 -1
  460. package/dist/icons/SettingsIcon.js +1 -1
  461. package/dist/icons/ShieldFilledIcon.js +1 -1
  462. package/dist/icons/ShieldIcon.js +1 -1
  463. package/dist/icons/SlashIcon.js +1 -1
  464. package/dist/icons/SparklesIcon.js +1 -1
  465. package/dist/icons/SqlIcon.js +1 -1
  466. package/dist/icons/StatsIcon.js +1 -1
  467. package/dist/icons/StopIcon.js +1 -1
  468. package/dist/icons/StringIcon.js +1 -1
  469. package/dist/icons/SubtotalsIcon.js +1 -1
  470. package/dist/icons/SwitchIcon.js +1 -1
  471. package/dist/icons/TableIcon.js +1 -1
  472. package/dist/icons/ThumbsDownIcon.js +1 -1
  473. package/dist/icons/ThumbsUpIcon.js +1 -1
  474. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  475. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  476. package/dist/icons/ThunderboltIcon.js +1 -1
  477. package/dist/icons/TimeIcon.js +1 -1
  478. package/dist/icons/TrashIcon.js +1 -1
  479. package/dist/icons/UnlockIcon.js +1 -1
  480. package/dist/icons/UpIcon.js +1 -1
  481. package/dist/icons/UserGroupIcon.js +1 -1
  482. package/dist/icons/UserIcon.js +1 -1
  483. package/dist/icons/UserLockIcon.js +1 -1
  484. package/dist/icons/ViewIcon.js +1 -1
  485. package/dist/icons/WarningFilledIcon.js +1 -1
  486. package/dist/icons/WarningIcon.js +1 -1
  487. package/dist/icons/wrap-icon.js +1 -1
  488. package/dist/index.js +1 -1
  489. package/dist/probe/canonicalize.js +1 -1
  490. package/dist/probe/css.js +1 -1
  491. package/dist/probe/index.js +1 -1
  492. package/dist/provider.js +1 -1
  493. package/dist/providers/TrackingProvider.js +1 -1
  494. package/dist/providers/navigationAdapter.default.js +1 -1
  495. package/dist/tokens/base.js +1 -1
  496. package/dist/tokens/color-seed.js +1 -1
  497. package/dist/tokens/color-theme.js +1 -1
  498. package/dist/tokens/colors.js +1 -1
  499. package/dist/tokens/index.js +1 -1
  500. package/dist/tokens/layout.js +1 -1
  501. package/dist/tokens/lazy-styles.js +1 -1
  502. package/dist/tokens/palette-config.js +1 -1
  503. package/dist/tokens/palette.js +1 -1
  504. package/dist/tokens/shadows.js +1 -1
  505. package/dist/tokens/sizes.js +1 -1
  506. package/dist/tokens/spacing.js +1 -1
  507. package/dist/tokens/typography.js +1 -1
  508. package/dist/utils/ResizeSensor.js +1 -1
  509. package/dist/utils/is-dev-env.js +1 -1
  510. package/dist/utils/modules.js +1 -1
  511. package/dist/utils/promise.js +1 -1
  512. package/dist/utils/raf.js +1 -1
  513. package/dist/utils/random.js +1 -1
  514. package/dist/utils/range.js +1 -1
  515. package/dist/utils/react/RenderCache.js +1 -1
  516. package/dist/utils/react/Slots.js +1 -1
  517. package/dist/utils/react/chain.js +1 -1
  518. package/dist/utils/react/disabledProps.js +1 -1
  519. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  520. package/dist/utils/react/index.js +1 -1
  521. package/dist/utils/react/interactions.js +1 -1
  522. package/dist/utils/react/isTextOnly.js +1 -1
  523. package/dist/utils/react/mapProps.js +1 -1
  524. package/dist/utils/react/mergeProps.js +1 -1
  525. package/dist/utils/react/nullableValue.js +1 -1
  526. package/dist/utils/react/resolveIcon.js +1 -1
  527. package/dist/utils/react/sharedStore.js +1 -1
  528. package/dist/utils/react/useBufferedValue.js +1 -1
  529. package/dist/utils/react/useCombinedRefs.js +1 -1
  530. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  531. package/dist/utils/react/useEventBus.js +1 -1
  532. package/dist/utils/react/useId.js +1 -1
  533. package/dist/utils/react/useIsDarwin.js +1 -1
  534. package/dist/utils/react/useKeySymbols.js +1 -1
  535. package/dist/utils/react/useLayoutEffect.js +1 -1
  536. package/dist/utils/react/useLocalStorage.js +1 -1
  537. package/dist/utils/react/useMergeStyles.js +1 -1
  538. package/dist/utils/react/usePopoverSync.js +1 -1
  539. package/dist/utils/react/useQaProps.js +1 -1
  540. package/dist/utils/react/useViewportSize.js +1 -1
  541. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  542. package/dist/utils/selection.js +1 -1
  543. package/dist/utils/styles.js +1 -1
  544. package/dist/utils/tree.js +1 -1
  545. package/dist/utils/warnings.js +1 -1
  546. package/dist/version.js +3 -3
  547. package/docs/Colors.md +40 -16
  548. package/docs/ComplexLayout.md +0 -8
  549. package/docs/CreateComponent.md +8 -15
  550. package/docs/Introduction.md +36 -15
  551. package/docs/RenderCache.md +6 -8
  552. package/docs/Theming.md +497 -164
  553. package/docs/Usage.md +138 -108
  554. package/docs/Utilities.md +2 -2
  555. package/docs/components/CollectionItem.md +0 -1
  556. package/docs/components/actions/Banner.md +0 -1
  557. package/docs/components/actions/Button.md +36 -8
  558. package/docs/components/actions/ButtonSplit.md +0 -2
  559. package/docs/components/actions/CommandMenu.md +8 -8
  560. package/docs/components/actions/ItemButton.md +20 -6
  561. package/docs/components/actions/Link.md +5 -10
  562. package/docs/components/actions/Menu.md +11 -24
  563. package/docs/components/actions/MenuTrigger.md +12 -3
  564. package/docs/components/actions/use-anchored-menu.md +2 -2
  565. package/docs/components/actions/use-context-menu.md +2 -5
  566. package/docs/components/content/Badge.md +0 -3
  567. package/docs/components/content/HotKeys.md +14 -21
  568. package/docs/components/content/InlineInput.md +14 -14
  569. package/docs/components/content/Item.md +17 -25
  570. package/docs/components/content/ItemCard.md +0 -1
  571. package/docs/components/content/Layout.md +1 -12
  572. package/docs/components/content/PrismCode.md +18 -13
  573. package/docs/components/content/Tag.md +1 -1
  574. package/docs/components/content/TextItem.md +3 -5
  575. package/docs/components/content/Tree.md +154 -69
  576. package/docs/components/data/DataTable.md +168 -56
  577. package/docs/components/data/ItemTable.md +485 -182
  578. package/docs/components/fields/Checkbox.md +0 -2
  579. package/docs/components/fields/ColorInput.md +79 -38
  580. package/docs/components/fields/ColorPicker.md +39 -17
  581. package/docs/components/fields/ColorSwatch.md +30 -11
  582. package/docs/components/fields/ColorSwatchGroup.md +42 -18
  583. package/docs/components/fields/ComboBox.md +1 -13
  584. package/docs/components/fields/CommandTextArea.md +37 -10
  585. package/docs/components/fields/DatePicker.md +0 -3
  586. package/docs/components/fields/FileInput.md +0 -3
  587. package/docs/components/fields/FilterListBox.md +14 -34
  588. package/docs/components/fields/FilterPicker.md +16 -33
  589. package/docs/components/fields/HueSlider.md +5 -5
  590. package/docs/components/fields/ListBox.md +9 -35
  591. package/docs/components/fields/NumberInput.md +0 -3
  592. package/docs/components/fields/PasswordInput.md +0 -3
  593. package/docs/components/fields/PeriodPicker.md +17 -7
  594. package/docs/components/fields/Picker.md +29 -54
  595. package/docs/components/fields/RadioGroup.md +5 -13
  596. package/docs/components/fields/SearchComboBox.md +0 -3
  597. package/docs/components/fields/SearchInput.md +2 -4
  598. package/docs/components/fields/Select.md +13 -23
  599. package/docs/components/fields/Switch.md +0 -3
  600. package/docs/components/fields/TextInput.md +0 -3
  601. package/docs/components/fields/TextInputMapper.md +2 -1
  602. package/docs/components/form/Field.md +2 -5
  603. package/docs/components/form/Form.md +0 -5
  604. package/docs/components/form/FormInstance.md +1 -1
  605. package/docs/components/helpers/DisplayTransition.md +6 -10
  606. package/docs/components/helpers/IconSwitch.md +0 -1
  607. package/docs/components/layout/Board.md +190 -50
  608. package/docs/components/navigation/Pagination.md +75 -36
  609. package/docs/components/navigation/Tabs.md +15 -3
  610. package/docs/components/other/Calendar.md +39 -22
  611. package/docs/components/other/CubeLogo.md +1 -1
  612. package/docs/components/overlays/Dialog.md +0 -3
  613. package/docs/components/overlays/DialogContainer.md +0 -2
  614. package/docs/components/overlays/DialogForm.md +2 -6
  615. package/docs/components/overlays/DialogTrigger.md +2 -4
  616. package/docs/components/overlays/Notifications.md +0 -7
  617. package/docs/components/overlays/Toast.md +8 -12
  618. package/docs/components/overlays/Tooltip.md +12 -6
  619. package/docs/components/overlays/UseDialogContainer.md +10 -16
  620. package/docs/components/status/LoadingAnimation.md +9 -3
  621. package/docs/tasty/configuration.md +0 -127
  622. package/docs/tasty/injector.md +0 -11
  623. package/package.json +4 -4
  624. package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +0 -2
  625. package/dist/components/portal/PortalProvider.d.ts +0 -2
@@ -1,8 +1,14 @@
1
1
  # Board
2
2
 
3
- A draggable and resizable widget grid for building dashboards. Widgets are declared with `Board.Widget` and positioned via a `layout` (grid units). Wrap multiple boards in a `BoardProvider` (`Board.Provider`) to drag widgets between them, including out of a nested board into its parent.
3
+ A draggable and resizable widget grid for building dashboards. Widgets are
4
+ declared with `Board.Widget` and positioned via a `layout` (grid units). Wrap
5
+ multiple boards in a `BoardProvider` (`Board.Provider`) to drag widgets between
6
+ them, including out of a nested board into its parent.
4
7
 
5
- Dragging and resizing are powered by React Aria's `useMove`, so they work with mouse, touch, and keyboard (focus a widget and use the arrow keys). While a widget is dragged with a pointer it renders into a fixed overlay so it is never clipped by an ancestor's `overflow: hidden`.
8
+ Dragging and resizing are powered by React Aria's `useMove`, so they work with
9
+ mouse, touch, and keyboard (focus a widget and use the arrow keys). While a
10
+ widget is dragged with a pointer it renders into a fixed overlay so it is never
11
+ clipped by an ancestor's `overflow: hidden`.
6
12
 
7
13
  ## When to Use
8
14
 
@@ -17,11 +23,25 @@ Dragging and resizing are powered by React Aria's `useMove`, so they work with m
17
23
 
18
24
  ## Concepts
19
25
 
20
- - **Layout** — an array of items `{ i, x, y, w, h }` in grid units. `i` matches a `Board.Widget` `id`.
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.
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
- - **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.
26
+ - **Layout** — an array of items `{ i, x, y, w, h }` in grid units. `i` matches a
27
+ `Board.Widget` `id`.
28
+ - **Content vs. position** — `Board.Widget` declares content; the owning `Board`
29
+ positions it. This decoupling is what lets a widget be transferred between
30
+ boards.
31
+ - **Compaction** — `vertical` (default), `horizontal`, or `free`. In `free` mode a
32
+ widget is placed exactly where you drop it and its neighbours are never pushed
33
+ or swapped; without `allowOverlap` a drop onto an occupied cell is blocked, and
34
+ with `allowOverlap` widgets may stack for a fully free canvas.
35
+ - **Selection** — off by default. Pressing a widget selects it and arms a drag
36
+ of the selection: selecting and grabbing are one gesture, so move the pointer
37
+ and it drags, stay still and it was just a selection. <kbd>Shift</kbd> (or
38
+ <kbd>Cmd</kbd>/<kbd>Ctrl</kbd>) toggles a widget's membership. Keys are layout
39
+ item ids, scoped to a single board, and always reported in layout order.
40
+ - **Selection is focus-like** — it tracks what the user is working with, and
41
+ touching anything else moves it on: pressing another widget makes *that* the
42
+ selection, pressing a control inside a widget drops it, and so does focus
43
+ leaving the board. With `'multiple'`, pressing an already-selected widget
44
+ keeps the selection so a drag moves the whole block.
25
45
 
26
46
  ## Properties
27
47
 
@@ -41,21 +61,21 @@ Dragging and resizing are powered by React Aria's `useMove`, so they work with m
41
61
  - **`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.
42
62
  - **`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.
43
63
  - **`preventCollision`** `boolean` (default: `false`) — Block movement into occupied cells instead of pushing.
44
- - **`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.
64
+ - **`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.
45
65
  - **`isDraggable`** `boolean` (default: `true`) — Enable dragging for all widgets.
46
66
  - **`isResizable`** `boolean` (default: `true`) — Enable resizing for all widgets.
47
67
  - **`isDroppable`** `boolean` (default: `true`) — Whether the board accepts widgets dropped from other boards.
48
68
  - **`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.
49
- - **`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.
69
+ - **`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.
50
70
  - **`dragCancel`** `string` — CSS selector for elements that must not start a pointer drag (e.g. form controls inside a widget: `"input,textarea,button,a,.no-drag"`). Does not affect keyboard moves — those only run when the widget host itself is focused. Can be overridden per widget.
51
71
  - **`dragHandle`** `string` — CSS selector for the only elements from which a pointer drag may start. Can be overridden per widget.
52
- - **`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.
72
+ - **`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.
53
73
  - **`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.
54
74
  - **`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.
55
75
  - **`selectedKeys`** `string[]` — Controlled selection. Keys are layout item ids (`LayoutItem.i`).
56
76
  - **`defaultSelectedKeys`** `string[]` — Initial selection for uncontrolled usage.
57
77
  - **`onSelectionChange`** `(keys: string[]) => void` — Called when the selection changes. Keys are deduped and returned in the board's layout order, never in click order.
58
- - **`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.
78
+ - **`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.
59
79
  - **`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.
60
80
  - **`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.
61
81
  - **`constraints`** `LayoutConstraint[]` — Grid/item layout constraints.
@@ -87,19 +107,35 @@ Dragging and resizing are powered by React Aria's `useMove`, so they work with m
87
107
  - **`selectionCancel`** `string` — Override the board's `selectionCancel` selector for this widget.
88
108
  - **`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.
89
109
 
90
- A widget clips its content to its grid cell, card or not — otherwise a nested board with more rows than currently fit, or a mid-drag reflow, would paint over its neighbours. The cost is that a descendant's `outline` is cropped at the edge (an outline is clipped by an _ancestor's_ overflow, not its own), so a widget whose content must paint outside — a control drawing its own active ring — sets `overflow="visible"`, or draws the ring inset with a negative `outlineOffset`.
110
+ A widget clips its content to its grid cell, card or not — otherwise a nested
111
+ board with more rows than currently fit, or a mid-drag reflow, would paint over
112
+ its neighbours. The cost is that a descendant's `outline` is cropped at the edge
113
+ (an outline is clipped by an *ancestor's* overflow, not its own), so a widget
114
+ whose content must paint outside — a control drawing its own active ring — sets
115
+ `overflow="visible"`, or draws the ring inset with a negative `outlineOffset`.
91
116
 
92
117
  ### Board.Provider
93
118
 
94
- Shares one drag context across multiple boards. A standalone `Board` provides its own automatically; only use `Board.Provider` when you need cross-board dragging.
119
+ Shares one drag context across multiple boards. A standalone `Board` provides its
120
+ own automatically; only use `Board.Provider` when you need cross-board dragging.
95
121
 
96
- - **`onWidgetTransfer`** `(info: { widgetId, fromBoardId, toBoardId, item }) => void` — Fired when a widget is dropped from one board into another.
122
+ - **`onWidgetTransfer`** `(info: { widgetId, fromBoardId, toBoardId, item }) => void` —
123
+ Fired when a widget is dropped from one board into another.
97
124
 
98
- Dragging a widget across a container that can unmount (for example, out of an inactive `Tab`) requires controlled ownership: a widget's content is declared by its `Board.Widget`, so if that declaration unmounts the content is lost. Keep each board's `layout` controlled and, in response to `onWidgetTransfer`, move the `Board.Widget` declaration into the destination container so the content follows the widget. The [Boards inside Tabs](#boards-inside-tabs) example shows the pattern.
125
+ Dragging a widget across a container that can unmount (for example, out of an
126
+ inactive `Tab`) requires controlled ownership: a widget's content is declared by
127
+ its `Board.Widget`, so if that declaration unmounts the content is lost. Keep
128
+ each board's `layout` controlled and, in response to `onWidgetTransfer`, move the
129
+ `Board.Widget` declaration into the destination container so the content follows
130
+ the widget. The [Boards inside Tabs](#boards-inside-tabs) example shows the
131
+ pattern.
99
132
 
100
133
  ### Board.Responsive
101
134
 
102
- 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:
135
+ A wrapper around `Board` that selects a layout and column count based on the
136
+ container's measured width, mirroring react-grid-layout's `Responsive` +
137
+ `WidthProvider`. It accepts all `Board` props except `layout`, `defaultLayout`,
138
+ `cols`, `onLayoutChange`, and `width` (which it manages), plus:
103
139
 
104
140
  - **`breakpoints`** `Record<string, number>` — Breakpoint name to minimum container width (px).
105
141
  - **`cols`** `Record<string, number>` — Breakpoint name to column count.
@@ -111,14 +147,17 @@ A wrapper around `Board` that selects a layout and column count based on the con
111
147
  - **`breakpoint`** `string` — Force a specific breakpoint regardless of width (e.g. for a fixed-size screenshot or PDF export).
112
148
  - **`width`** `number` — Explicit width; disables measurement (SSR/tests/forced-size exports).
113
149
 
114
- A breakpoint with no layout is synthesized from the nearest available one, corrected into bounds and compacted for the target column count.
150
+ A breakpoint with no layout is synthesized from the nearest available one,
151
+ corrected into bounds and compacted for the target column count.
115
152
 
116
153
  ### Modifiers
117
154
 
118
- Every widget host exposes these as `data-*` attributes, and any style map passed through `widgetProps.styles` or a per-widget `styles` resolves against them.
155
+ Every widget host exposes these as `data-*` attributes, and any style map passed
156
+ through `widgetProps.styles` or a per-widget `styles` resolves against them.
119
157
 
120
158
  - **`selected`** — the widget is in the board's selection.
121
- - **`pre-selected`** — a live marquee covers the widget, so releasing the pointer will select it. Never set at the same time as `selected`.
159
+ - **`pre-selected`** — a live marquee covers the widget, so releasing the pointer
160
+ will select it. Never set at the same time as `selected`.
122
161
  - **`card`** — the widget draws a card border (`isCard`).
123
162
  - **`draggable`** — the widget can be dragged and no drag is in flight.
124
163
  - **`drag`** — the widget is being dragged.
@@ -128,7 +167,13 @@ Every widget host exposes these as `data-*` attributes, and any style map passed
128
167
  - **`hovered`**, **`focus-visible`** — pointer and keyboard-focus states.
129
168
  - **`settled`** — the board has painted its widgets once, so position changes animate.
130
169
 
131
- Selection is an _edge_ treatment — a `#primary-border` border plus a `#primary` ring — because it reads as a focus-like state rather than a fill. `outline` stays reserved for the real focus ring, which is what keeps the two legible together: they use different tokens and the focus outline sits one border-width further out. `pre-selected` draws the same edge with the ring dimmed, so committing a lasso only changes the strength of something already on screen. To restyle either, override the same keys:
170
+ Selection is an *edge* treatment — a `#primary-border` border plus a `#primary`
171
+ ring — because it reads as a focus-like state rather than a fill. `outline` stays
172
+ reserved for the real focus ring, which is what keeps the two legible together:
173
+ they use different tokens and the focus outline sits one border-width further
174
+ out. `pre-selected` draws the same edge with the ring dimmed, so committing a
175
+ lasso only changes the strength of something already on screen. To restyle
176
+ either, override the same keys:
132
177
 
133
178
  ```jsx
134
179
  <Board
@@ -159,7 +204,9 @@ Supports [Base properties](../../BaseProperties.md).
159
204
 
160
205
  ### Style Properties
161
206
 
162
- These properties allow direct style application without using the `styles` prop. Note: `margin` is repurposed as the grid gap (see Properties above) rather than a CSS margin.
207
+ These properties allow direct style application without using the `styles` prop.
208
+ Note: `margin` is repurposed as the grid gap (see Properties above) rather than a
209
+ CSS margin.
163
210
 
164
211
  - **Base:** `display`, `font`, `preset`, `hide`, `whiteSpace`, `opacity`, `transition`
165
212
  - **Position:** `gridArea`, `order`, `gridColumn`, `gridRow`, `placeSelf`, `alignSelf`, `justifySelf`, `zIndex`, `margin`, `inset`, `position`, `scrollMargin`
@@ -174,11 +221,14 @@ These properties allow direct style application without using the `styles` prop.
174
221
 
175
222
  ### Free positioning
176
223
 
177
- A widget stays exactly where you drop it and never shuffles its neighbours. Dropping onto an occupied cell is blocked, so the widget stays at its last free spot.
224
+ A widget stays exactly where you drop it and never shuffles its neighbours.
225
+ Dropping onto an occupied cell is blocked, so the widget stays at its last free
226
+ spot.
178
227
 
179
228
  ### Free positioning (overlap)
180
229
 
181
- Add `allowOverlap` to let widgets stack on top of each other instead of being blocked from occupied cells.
230
+ Add `allowOverlap` to let widgets stack on top of each other instead of being
231
+ blocked from occupied cells.
182
232
 
183
233
  ### Horizontal compaction
184
234
 
@@ -190,23 +240,34 @@ Bound resizing with per-widget `minW`/`maxW` (columns) and `minH`/`maxH` (rows).
190
240
 
191
241
  ### Grid lines
192
242
 
193
- 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.
243
+ Show grid lines behind the widgets while dragging or resizing (or always). With
244
+ several boards under one `Board.Provider`, `'drag'` lights up only the board the
245
+ drag belongs to; `'any-drag'` lights up all of them.
194
246
 
195
247
  ### Corner resize grip
196
248
 
197
- Centre the resize grip on the widget's corner with `resizeGripPlacement="corner"`, so it lines up with a control centred on the opposite corner.
249
+ Centre the resize grip on the widget's corner with `resizeGripPlacement="corner"`,
250
+ so it lines up with a control centred on the opposite corner.
198
251
 
199
252
  ### Resolving a blocked drop
200
253
 
201
- On a free grid a drop onto occupied cells is refused. `collisionMode` resolves it instead: `'downscale'` shrinks the widget into whatever room is at the drop cell. Within one board, `'swap'` trades places with the widget already there. Across boards, the same mode inserts only at an empty anchor and downscales without moving destination widgets; an invalid release cancels the transfer. None of these paths ever grows a widget. The examples below show all three behaviors.
254
+ On a free grid a drop onto occupied cells is refused. `collisionMode` resolves it
255
+ instead: `'downscale'` shrinks the widget into whatever room is at the drop cell.
256
+ Within one board, `'swap'` trades places with the widget already there. Across
257
+ boards, the same mode inserts only at an empty anchor and downscales without
258
+ moving destination widgets; an invalid release cancels the transfer. None of
259
+ these paths ever grows a widget. The examples below show all three behaviors.
202
260
 
203
261
  ### Card widgets
204
262
 
205
- Widgets are filled (`#surface-2`) and rounded by default, but borderless. Add a card border per widget with `isCard`, or for the whole board at once with `widgetProps={{ isCard: true }}`. Per-widget `isCard` overrides the board default.
263
+ Widgets are filled (`#surface-2`) and rounded by default, but borderless. Add a
264
+ card border per widget with `isCard`, or for the whole board at once with
265
+ `widgetProps={{ isCard: true }}`. Per-widget `isCard` overrides the board default.
206
266
 
207
267
  ### Drag cancel
208
268
 
209
- Keep interactive controls inside a widget clickable by excluding them from the drag gesture with `dragCancel`.
269
+ Keep interactive controls inside a widget clickable by excluding them from the
270
+ drag gesture with `dragCancel`.
210
271
 
211
272
  ### Responsive
212
273
 
@@ -218,27 +279,63 @@ Wrap boards in `Board.Provider` to drag widgets between them.
218
279
 
219
280
  ### Nested boards
220
281
 
221
- A `Board` can be placed inside a `Board.Widget`, making the whole container draggable while its children can be dragged out into sibling boards.
282
+ A `Board` can be placed inside a `Board.Widget`, making the whole container
283
+ draggable while its children can be dragged out into sibling boards.
222
284
 
223
- Set `isAligned` on the nested board to align it with the surrounding layout: every cell matches the parent's cell size exactly. Its columns keep the parent's pixel pitch (so resizing the container adds or removes columns instead of stretching them) and its rows use the parent's row height verbatim.
285
+ Set `isAligned` on the nested board to align it with the surrounding layout:
286
+ every cell matches the parent's cell size exactly. Its columns keep the parent's
287
+ pixel pitch (so resizing the container adds or removes columns instead of
288
+ stretching them) and its rows use the parent's row height verbatim.
224
289
 
225
- Because an aligned board never shrinks its rows to fit, add `isAutoHeight` to the container `Board.Widget` so it grows (only ever taller) until the inner board's rows fit at the parent's row height. It also stops the container's resize handle at that height, so you can't drag it shorter than the inner board needs.
290
+ Because an aligned board never shrinks its rows to fit, add `isAutoHeight` to the
291
+ container `Board.Widget` so it grows (only ever taller) until the inner board's
292
+ rows fit at the parent's row height. It also stops the container's resize handle
293
+ at that height, so you can't drag it shorter than the inner board needs.
226
294
 
227
295
  ### Aligned nested boards
228
296
 
229
- A nested `Board` with `isAligned` and no padding, fill, border, or radius of its own — only a header above the grid — inherits the parent column pitch with zero offset, so its columns line up exactly with the outer board. Grid lines are shown on both boards while dragging to verify the alignment.
297
+ A nested `Board` with `isAligned` and no padding, fill, border, or radius of its
298
+ own — only a header above the grid — inherits the parent column pitch with zero
299
+ offset, so its columns line up exactly with the outer board. Grid lines are
300
+ shown on both boards while dragging to verify the alignment.
230
301
 
231
302
  ### Boards inside Tabs
232
303
 
233
- A `Board.Widget` can host a `Tabs` where each tab renders its own `Board`, all under a shared `Board.Provider` so widgets can be dragged between tabs and out into the surrounding board. Because an inactive tab unmounts, this example is fully controlled: each board's `layout` is controlled and `onWidgetTransfer` moves a widget's declaration into the destination container so its content survives dragging out of (and switching away from) a tab.
234
-
235
- When a `Tabs` sits inside a `Board`, tab switching becomes "spring-loaded" automatically: while you drag a widget, hovering a tab header for a moment opens that tab so you can drop into it (or move a widget between tabs). This needs no setup - `Tabs` detects the active Board drag and, for its duration, keeps panels mounted so the tab a widget is dragged out of (and the board owning the in-flight drag) is not unmounted mid-gesture. Spring-loading works with mouse and pen; touch drags capture the pointer, so they do not trigger it.
304
+ A `Board.Widget` can host a `Tabs` where each tab renders its own `Board`, all
305
+ under a shared `Board.Provider` so widgets can be dragged between tabs and out
306
+ into the surrounding board. Because an inactive tab unmounts, this example is
307
+ fully controlled: each board's `layout` is controlled and `onWidgetTransfer`
308
+ moves a widget's declaration into the destination container so its content
309
+ survives dragging out of (and switching away from) a tab.
310
+
311
+ When a `Tabs` sits inside a `Board`, tab switching becomes "spring-loaded"
312
+ automatically: while you drag a widget, hovering a tab header for a moment opens
313
+ that tab so you can drop into it (or move a widget between tabs). This needs no
314
+ setup - `Tabs` detects the active Board drag and, for its duration, keeps panels
315
+ mounted so the tab a widget is dragged out of (and the board owning the in-flight
316
+ drag) is not unmounted mid-gesture. Spring-loading works with mouse and pen;
317
+ touch drags capture the pointer, so they do not trigger it.
236
318
 
237
319
  ### Selection
238
320
 
239
- Press a widget to select it, <kbd>Shift</kbd>-press to add or remove one, and drag from empty board space to lasso. Because the press both selects and arms the drag, grabbing a widget you have not selected simply makes it the selection and moves it; grabbing one that _is_ selected moves the whole block rigidly — keeping its shape, clamping against the grid edge as a unit rather than collapsing, and committing once. While the band is out, the widgets it covers show a dimmed version of the selected edge (`pre-selected`), and no text can be selected under it.
240
-
241
- A group reflows like a single widget — it is compacted by the same rules, so on a `vertical` board it can no more be parked in empty space than one widget can, and the widgets around it close the gap in the same frame — but it does so as one block. Its members keep their exact offsets for the whole drag, and the widgets standing where it lands move out of its way rather than being packed between its members — whether it is dragged against the compaction axis or across it. When the drag ends the board compacts normally, so a group whose members could each float further settles on release. Under `compact="free"` (or `null`) nothing compacts, so the block stays precisely where it was dropped.
321
+ Press a widget to select it, <kbd>Shift</kbd>-press to add or remove one, and
322
+ drag from empty board space to lasso. Because the press both selects and arms the
323
+ drag, grabbing a widget you have not selected simply makes it the selection and
324
+ moves it; grabbing one that *is* selected moves the whole block rigidly — keeping
325
+ its shape, clamping against the grid edge as a unit rather than collapsing, and
326
+ committing once. While the band is out, the widgets it covers show a dimmed
327
+ version of the selected edge (`pre-selected`), and no text can be selected under
328
+ it.
329
+
330
+ A group reflows like a single widget — it is compacted by the same rules, so on a
331
+ `vertical` board it can no more be parked in empty space than one widget can, and
332
+ the widgets around it close the gap in the same frame — but it does so as one
333
+ block. Its members keep their exact offsets for the whole drag, and the widgets
334
+ standing where it lands move out of its way rather than being packed between its
335
+ members — whether it is dragged against the compaction axis or across it. When
336
+ the drag ends the board compacts normally, so a group whose members could each
337
+ float further settles on release. Under `compact="free"` (or `null`) nothing compacts,
338
+ so the block stays precisely where it was dropped.
242
339
 
243
340
  ### Interactive content keeps its clicks
244
341
 
@@ -259,30 +356,73 @@ A group reflows like a single widget — it is compacted by the same rules, so o
259
356
  | <kbd>Escape</kbd> | Clear the selection. |
260
357
  | <kbd>Delete</kbd> / <kbd>Backspace</kbd> | Request deletion of the selection via `onWidgetsDelete`. |
261
358
 
262
- 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.
359
+ Arrow keys and <kbd>Space</kbd> only act when the widget host **itself** is
360
+ focused, never when focus is inside a nested control, so an `input`,
361
+ `textarea`, or `button` inside a widget keeps every key it needs. Board's own
362
+ keys are handled on the board element rather than on `document`, and are only
363
+ consumed when they actually do something — an <kbd>Escape</kbd> with nothing
364
+ selected still reaches an ancestor Dialog, and <kbd>Backspace</kbd> stays
365
+ available for text editing and browser-back.
263
366
 
264
- Every draggable or selectable widget is its own tab stop. Roving tabindex would be an improvement on a large board, but arrow keys are already claimed for movement, so it needs a navigation key set of its own — see below.
367
+ Every draggable or selectable widget is its own tab stop. Roving tabindex would
368
+ be an improvement on a large board, but arrow keys are already claimed for
369
+ movement, so it needs a navigation key set of its own — see below.
265
370
 
266
371
  ### Screen Reader Support
267
372
 
268
- Each widget host is a `group` with an accessible name, taken from `aria-label`, then `qa`, then the layout item id — set `aria-label` on any user-visible widget, since the other two are developer-facing. Draggable widgets carry a localized `aria-roledescription`, and selectable ones advertise `aria-keyshortcuts="Space"`.
373
+ Each widget host is a `group` with an accessible name, taken from
374
+ `aria-label`, then `qa`, then the layout item id — set `aria-label` on any
375
+ user-visible widget, since the other two are developer-facing. Draggable widgets
376
+ carry a localized `aria-roledescription`, and selectable ones advertise
377
+ `aria-keyshortcuts="Space"`.
269
378
 
270
- Selection state is conveyed two ways: a selected widget is described as "Selected" via `aria-describedby`, and every selection change is announced through a polite live region owned by the board ("Revenue selected", "3 widgets selected", "Selection cleared"). A marquee announces once, on release — not once per pointer frame.
379
+ Selection state is conveyed two ways: a selected widget is described as
380
+ "Selected" via `aria-describedby`, and every selection change is announced
381
+ through a polite live region owned by the board ("Revenue selected", "3 widgets
382
+ selected", "Selection cleared"). A marquee announces once, on release — not once
383
+ per pointer frame.
271
384
 
272
385
  ### ARIA Properties
273
386
 
274
- Board deliberately does **not** use a collection role. `aria-selected` is only valid on `option`, `gridcell`, `row`, `treeitem` and friends, and every one of those requires presentational children — but a Board widget hosts arbitrary interactive content (nested boards, tabs, inputs), and a `grid`'s keyboard model would fight `useMove`'s arrow keys. Rather than ship ARIA that lies about the structure, selection is exposed through the name, description, and live region described above. Set `aria-label` on your widgets and this reads correctly.
387
+ Board deliberately does **not** use a collection role. `aria-selected` is only
388
+ valid on `option`, `gridcell`, `row`, `treeitem` and friends, and every one of
389
+ those requires presentational children — but a Board widget hosts arbitrary
390
+ interactive content (nested boards, tabs, inputs), and a `grid`'s keyboard model
391
+ would fight `useMove`'s arrow keys. Rather than ship ARIA that lies about the
392
+ structure, selection is exposed through the name, description, and live region
393
+ described above. Set `aria-label` on your widgets and this reads correctly.
275
394
 
276
395
  ## Not yet supported
277
396
 
278
- - **External drag-in from a palette** — dragging a brand-new widget from an element outside any board into the grid (react-grid-layout's `isDroppable`/`onDrop`/`droppingItem`) is not implemented. Board's drag engine is built entirely on React Aria's `useMove` over registered widgets; drag-in is a separate HTML5 drag-and-drop modality (pixel-to-grid mapping, a dropping placeholder, and new `onDrop`/`droppingItem` props). Add widgets programmatically (render a new `Board.Widget` and add its layout item), or drag between boards with `Board.Provider`.
279
- - **Cross-board group transfer** — a group drag never leaves its source board. Cross-board transfer is single-item throughout (`WidgetTransferInfo`, the carried preview, the free-slot fallback), and landing a group on a board with a different column count has no obvious right answer. Degrading to a single-widget transfer would silently split a selection the user made, so the gesture is confined instead. Drag widgets across one at a time.
280
- - **Collection ARIA semantics** — `role="grid"`/`option`, `aria-selected` and `aria-multiselectable`, for the reason above.
281
- - **Roving tabindex** — needs a widget-navigation key set that does not collide with `useMove`'s arrow keys.
397
+ - **External drag-in from a palette** — dragging a brand-new widget from an
398
+ element outside any board into the grid (react-grid-layout's
399
+ `isDroppable`/`onDrop`/`droppingItem`) is not implemented. Board's drag engine
400
+ is built entirely on React Aria's `useMove` over registered widgets; drag-in
401
+ is a separate HTML5 drag-and-drop modality (pixel-to-grid mapping, a dropping
402
+ placeholder, and new `onDrop`/`droppingItem` props). Add widgets
403
+ programmatically (render a new `Board.Widget` and add its layout item), or drag
404
+ between boards with `Board.Provider`.
405
+ - **Cross-board group transfer** — a group drag never leaves its source board.
406
+ Cross-board transfer is single-item throughout (`WidgetTransferInfo`, the
407
+ carried preview, the free-slot fallback), and landing a group on a board with a
408
+ different column count has no obvious right answer. Degrading to a
409
+ single-widget transfer would silently split a selection the user made, so the
410
+ gesture is confined instead. Drag widgets across one at a time.
411
+ - **Collection ARIA semantics** — `role="grid"`/`option`, `aria-selected` and
412
+ `aria-multiselectable`, for the reason above.
413
+ - **Roving tabindex** — needs a widget-navigation key set that does not collide
414
+ with `useMove`'s arrow keys.
282
415
  - **<kbd>Cmd/Ctrl</kbd>+<kbd>A</kbd>** — select all.
283
- - **Cross-board marquee and cross-board selection** — selection is per board; a `Board.Provider` shares drag, not selection.
284
- - **Windows High Contrast Mode** — no component in the kit styles for `forced-colors` yet. The selected state uses a tint, a border _and_ an extra ring, so it does not rely on hue alone, but a full forced-colors pass is a system-wide change.
416
+ - **Cross-board marquee and cross-board selection** — selection is per board; a
417
+ `Board.Provider` shares drag, not selection.
418
+ - **Windows High Contrast Mode** — no component in the kit styles for
419
+ `forced-colors` yet. The selected state uses a tint, a border *and* an extra
420
+ ring, so it does not rely on hue alone, but a full forced-colors pass is a
421
+ system-wide change.
285
422
 
286
423
  ## Attribution
287
424
 
288
- The layout engine in `grid-core/` is a vendored, trimmed copy of [react-grid-layout](https://github.com/react-grid-layout/react-grid-layout) (MIT). The React layer is a UI Kit-native reimplementation on top of tasty and React Aria. See `grid-core/NOTICE.md`.
425
+ The layout engine in `grid-core/` is a vendored, trimmed copy of
426
+ [react-grid-layout](https://github.com/react-grid-layout/react-grid-layout)
427
+ (MIT). The React layer is a UI Kit-native reimplementation on top of tasty and
428
+ React Aria. See `grid-core/NOTICE.md`.
@@ -1,40 +1,71 @@
1
1
  # Pagination
2
2
 
3
- Pagination is the control for moving through a paged collection. It renders a bounded run of page buttons, optional first/last jumps, an optional page-size selector, and an optional item-range summary.
3
+ Pagination is the control for moving through a paged collection. It renders a
4
+ bounded run of page buttons, optional first/last jumps, an optional page-size
5
+ selector, and an optional item-range summary.
4
6
 
5
- It is a pure control: it owns no data. Client-side slicing lives in the companion `usePagination` hook, and `ItemTable` composes the two.
7
+ It is a pure control: it owns no data. Client-side slicing lives in the
8
+ companion `usePagination` hook, and `ItemTable` composes the two.
6
9
 
7
10
  ## When to Use
8
11
 
9
- - Paging through a list, table, or grid where the user needs to jump around rather than scroll.
10
- - Cursor pagination with an unknown total — supply `hasNextPage` and omit `total`/`totalPages`, and the control degrades to prev/next.
12
+ - Paging through a list, table, or grid where the user needs to jump around
13
+ rather than scroll.
14
+ - Cursor pagination with an unknown total — supply `hasNextPage` and omit
15
+ `total`/`totalPages`, and the control degrades to prev/next.
11
16
  - Anywhere you need a page-size selector wired to the same state.
12
17
 
13
- Prefer infinite scroll when the collection is a feed the user skims, and pagination when they need stable, addressable positions.
18
+ Prefer infinite scroll when the collection is a feed the user skims, and
19
+ pagination when they need stable, addressable positions.
14
20
 
15
21
  ## Component
16
22
 
17
23
  ### Properties
18
24
 
19
- - **`page`** `number` — Controlled current page, 1-based. Pair with `onPageChange`.
20
- - **`defaultPage`** `number` (default: `1`) — Initial page for uncontrolled usage.
21
- - **`onPageChange`** `(page: number) => void` — Never fires with a page outside `1…totalPages` when the total is known.
22
- - **`total`** `number` — Total items across all pages. Preferred over `totalPages`; it also powers the range summary and the `select` type's range labels.
23
- - **`totalPages`** `number` — Total pages. Only needed when the item count is genuinely unavailable. Wins over the value derived from `total` + `pageSize`.
25
+ - **`page`** `number` — Controlled current page, 1-based. Pair with
26
+ `onPageChange`.
27
+ - **`defaultPage`** `number` (default: `1`) — Initial page for uncontrolled
28
+ usage.
29
+ - **`onPageChange`** `(page: number) => void` — Never fires with a page outside
30
+ `1…totalPages` when the total is known.
31
+ - **`total`** `number` — Total items across all pages. Preferred over
32
+ `totalPages`; it also powers the range summary and the `select` type's range
33
+ labels.
34
+ - **`totalPages`** `number` — Total pages. Only needed when the item count is
35
+ genuinely unavailable. Wins over the value derived from `total` + `pageSize`.
24
36
  - **`pageSize`** `number` — Controlled page size.
25
- - **`defaultPageSize`** `number` (default: `50`) — Initial page size for uncontrolled usage.
26
- - **`onPageSizeChange`** `(pageSize: number) => void` — Changing the size also resets to page 1, because the old page index no longer refers to the same items.
27
- - **`pageSizeOptions`** `number[]` — Supplying this **and** `onPageSizeChange` renders the size selector.
28
- - **`type`** `'numbers' | 'select' | 'compact'` (default: `'numbers'`) — How the page control is rendered. `numbers` is the default because it is the only mode whose rendered element count is independent of the page count; `select` materializes one entry per page, so above a safety cap the component falls back to `compact` on its own.
29
- - **`siblingCount`** `number` (default: `1`) — Page buttons either side of the current page.
30
- - **`boundaryCount`** `number` (default: `1`) — Page buttons pinned at each end. Together with `siblingCount` this bounds the rendered count at `boundaryCount * 2 + siblingCount * 2 + 3`.
37
+ - **`defaultPageSize`** `number` (default: `50`) — Initial page size for
38
+ uncontrolled usage.
39
+ - **`onPageSizeChange`** `(pageSize: number) => void` — Changing the size also
40
+ resets to page 1, because the old page index no longer refers to the same
41
+ items.
42
+ - **`pageSizeOptions`** `number[]` — Supplying this **and** `onPageSizeChange`
43
+ renders the size selector.
44
+ - **`type`** `'numbers' | 'select' | 'compact'` (default: `'numbers'`) — How the
45
+ page control is rendered. `numbers` is the default because it is the only mode
46
+ whose rendered element count is independent of the page count; `select`
47
+ materializes one entry per page, so above a safety cap the component falls
48
+ back to `compact` on its own.
49
+ - **`siblingCount`** `number` (default: `1`) — Page buttons either side of the
50
+ current page.
51
+ - **`boundaryCount`** `number` (default: `1`) — Page buttons pinned at each end.
52
+ Together with `siblingCount` this bounds the rendered count at
53
+ `boundaryCount * 2 + siblingCount * 2 + 3`.
31
54
  - **`size`** `'small' | 'medium'` (default: `'small'`) — Control size.
32
55
  - **`isDisabled`** `boolean` — Disable every control.
33
- - **`hasNextPage`** `boolean` — Keeps "next" enabled when the total is unknown. Ignored once `total` or `totalPages` is supplied — a known total is always authoritative.
34
- - **`isCompact`** `boolean` (default: `false`) — Hide the first/last jump buttons.
35
- - **`summary`** `boolean | ((info: CubeTablePageInfo) => ReactNode)` (default: `false`) — `true` renders the localized `1–50 of 1,204`, with numbers formatted for the active locale. Pass a function for full control.
36
- - **`labelFormatter`** `(info: CubeTablePageInfo) => ReactNode` — Labels the entries of `type="select"`. Receives the page info with `page` set to the entry being labelled.
37
- - **`ariaLabel`** `string` — Labels the `<nav>` landmark. Defaults to the localized "Pagination".
56
+ - **`hasNextPage`** `boolean` — Keeps "next" enabled when the total is unknown.
57
+ Ignored once `total` or `totalPages` is supplied — a known total is always
58
+ authoritative.
59
+ - **`isCompact`** `boolean` (default: `false`) — Hide the first/last jump
60
+ buttons.
61
+ - **`summary`** `boolean | ((info: CubeTablePageInfo) => ReactNode)` (default:
62
+ `false`) — `true` renders the localized `1–50 of 1,204`, with numbers
63
+ formatted for the active locale. Pass a function for full control.
64
+ - **`labelFormatter`** `(info: CubeTablePageInfo) => ReactNode` — Labels the
65
+ entries of `type="select"`. Receives the page info with `page` set to the
66
+ entry being labelled.
67
+ - **`ariaLabel`** `string` — Labels the `<nav>` landmark. Defaults to the
68
+ localized "Pagination".
38
69
 
39
70
  #### `CubeTablePageInfo`
40
71
 
@@ -81,9 +112,9 @@ These properties allow direct style application without using the `styles` prop:
81
112
 
82
113
  ### Modifiers
83
114
 
84
- | Modifier | Type | Description |
85
- | -------- | --------------------- | ------------ |
86
- | `size` | `'small' \| 'medium'` | Control size |
115
+ | Modifier | Type | Description |
116
+ | -------- | ---- | ----------- |
117
+ | `size` | `'small' \| 'medium'` | Control size |
87
118
 
88
119
  ## Examples
89
120
 
@@ -173,26 +204,34 @@ Every control is a real `<button>`, so there is nothing bespoke to learn.
173
204
 
174
205
  ### Screen Reader Support
175
206
 
176
- - The root is a `<nav>` landmark labelled "Pagination" (override with `ariaLabel`).
207
+ - The root is a `<nav>` landmark labelled "Pagination" (override with
208
+ `ariaLabel`).
177
209
  - The current page button carries `aria-current="page"`.
178
- - Every button has an explicit `aria-label` — "Page 3", "Next page", and so on — so an icon-only button is never announced as unlabelled.
210
+ - Every button has an explicit `aria-label` — "Page 3", "Next page", and so on
211
+ — so an icon-only button is never announced as unlabelled.
179
212
  - The `…` gap is `aria-hidden`; it conveys nothing a screen reader user needs.
180
213
 
181
214
  ### ARIA Properties
182
215
 
183
- | Property | Applied to |
184
- | --------------------- | ---------------------------- |
185
- | `aria-label` | The `<nav>` and every button |
186
- | `aria-current="page"` | The current page button |
187
- | `aria-hidden="true"` | The `…` gap |
216
+ | Property | Applied to |
217
+ | -------- | ---------- |
218
+ | `aria-label` | The `<nav>` and every button |
219
+ | `aria-current="page"` | The current page button |
220
+ | `aria-hidden="true"` | The `…` gap |
188
221
 
189
222
  ## Best Practices
190
223
 
191
- - Do: pass `total` rather than `totalPages` when you know the item count — the summary and range labels both need it.
192
- - Do: use `type="numbers"` (the default) for anything that can grow. It is the only mode whose cost does not scale with the page count.
193
- - Do: reset to page 1 whenever the underlying query changes (a new search term, a new filter). A stale page index against a smaller result set shows an empty page.
194
- - Don't: render `type="select"` over a large page count. It builds one collection item per page.
195
- - Don't: pass both `hasNextPage` and a known total and expect the former to win — it doesn't.
224
+ - Do: pass `total` rather than `totalPages` when you know the item count — the
225
+ summary and range labels both need it.
226
+ - Do: use `type="numbers"` (the default) for anything that can grow. It is the
227
+ only mode whose cost does not scale with the page count.
228
+ - Do: reset to page 1 whenever the underlying query changes (a new search term,
229
+ a new filter). A stale page index against a smaller result set shows an empty
230
+ page.
231
+ - Don't: render `type="select"` over a large page count. It builds one
232
+ collection item per page.
233
+ - Don't: pass both `hasNextPage` and a known total and expect the former to win
234
+ — it doesn't.
196
235
 
197
236
  ## Suggested Improvements
198
237
 
@@ -142,7 +142,9 @@ DOM order is always "bar then panels" — visual order is controlled internally
142
142
 
143
143
  #### Vertical tabs across types
144
144
 
145
- `narrow` only makes sense for a horizontal strip (it collapses horizontal label padding for a denser row). When `placement` is `'left'` or `'right'`, `type="narrow"` is coerced to `type="default"`.
145
+ `narrow` only makes sense for a horizontal strip (it collapses horizontal
146
+ label padding for a denser row). When `placement` is `'left'` or `'right'`,
147
+ `type="narrow"` is coerced to `type="default"`.
146
148
 
147
149
  ## Compound Components
148
150
 
@@ -742,7 +744,9 @@ Override per-tab/panel:
742
744
 
743
745
  ### Optimized Lazy Rendering with `renderPanel`
744
746
 
745
- For tabs with expensive content, use the `renderPanel` prop for optimized lazy rendering. This prevents content from being evaluated on every parent render - only the active tab's content is computed, while inactive tabs use cached content.
747
+ For tabs with expensive content, use the `renderPanel` prop for optimized lazy rendering.
748
+ This prevents content from being evaluated on every parent render - only the active tab's
749
+ content is computed, while inactive tabs use cached content.
746
750
 
747
751
  ```jsx
748
752
  <Tabs
@@ -829,7 +833,15 @@ Tabs work seamlessly inside Layout components. When placed in a `Layout` or `Lay
829
833
 
830
834
  ### Inside a Board (spring-loaded switching)
831
835
 
832
- When `Tabs` is rendered inside a [`Board`](../layout/Board.md), tab switching becomes spring-loaded automatically: while a Board widget is being dragged, hovering a tab header for a moment opens that tab, so a widget can be dropped into it or moved between tabs. This requires no configuration - `Tabs` detects the active Board drag and, for its duration, keeps panels mounted so the tab a widget is dragged out of (and the board owning the in-flight gesture) is not unmounted mid-drag. Spring-loading works with mouse and pen; touch drags capture the pointer and do not trigger it. Outside a `Board` this behavior is inert.
836
+ When `Tabs` is rendered inside a [`Board`](../layout/Board.md), tab
837
+ switching becomes spring-loaded automatically: while a Board widget is being
838
+ dragged, hovering a tab header for a moment opens that tab, so a widget can be
839
+ dropped into it or moved between tabs. This requires no configuration - `Tabs`
840
+ detects the active Board drag and, for its duration, keeps panels mounted so the
841
+ tab a widget is dragged out of (and the board owning the in-flight gesture) is
842
+ not unmounted mid-drag. Spring-loading works with mouse and pen; touch drags
843
+ capture the pointer and do not trigger it. Outside a `Board` this behavior is
844
+ inert.
833
845
 
834
846
  ## Accessibility
835
847