@cube-dev/ui-kit 0.0.0-canary-3cf647a → 0.0.0-canary-ea72271

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 (449) hide show
  1. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  2. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  3. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  4. package/dist/_internal/hooks/use-event.js +1 -1
  5. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  6. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  7. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  8. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  9. package/dist/_internal/hooks/use-warn.js +1 -1
  10. package/dist/components/Block.js +1 -1
  11. package/dist/components/CollectionItem.js +1 -1
  12. package/dist/components/GlobalStyles.js +1 -1
  13. package/dist/components/GridProvider.js +1 -1
  14. package/dist/components/HiddenInput.js +1 -1
  15. package/dist/components/Root.js +1 -1
  16. package/dist/components/actions/Action/Action.js +1 -1
  17. package/dist/components/actions/Banner/Banner.js +1 -1
  18. package/dist/components/actions/Button/Button.js +1 -1
  19. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  20. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  21. package/dist/components/actions/ButtonSplit/context.js +1 -1
  22. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  23. package/dist/components/actions/CommandMenu/styled.js +1 -1
  24. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  25. package/dist/components/actions/ItemActionContext.js +1 -1
  26. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  27. package/dist/components/actions/Link/Link.js +1 -1
  28. package/dist/components/actions/Menu/Menu.js +1 -1
  29. package/dist/components/actions/Menu/MenuItem.js +1 -1
  30. package/dist/components/actions/Menu/MenuSection.js +1 -1
  31. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  32. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  34. package/dist/components/actions/Menu/context.js +1 -1
  35. package/dist/components/actions/Menu/styled.js +1 -1
  36. package/dist/components/actions/index.js +1 -1
  37. package/dist/components/actions/use-action.js +1 -1
  38. package/dist/components/actions/use-anchored-menu.js +1 -1
  39. package/dist/components/actions/use-context-menu.js +1 -1
  40. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  41. package/dist/components/content/Alert/Alert.js +1 -1
  42. package/dist/components/content/Alert/use-alert.js +1 -1
  43. package/dist/components/content/Avatar/Avatar.js +1 -1
  44. package/dist/components/content/Badge/Badge.js +1 -1
  45. package/dist/components/content/Card/Card.js +1 -1
  46. package/dist/components/content/Content.js +1 -1
  47. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  48. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  49. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  50. package/dist/components/content/Divider.js +1 -1
  51. package/dist/components/content/Footer.js +1 -1
  52. package/dist/components/content/Header.js +1 -1
  53. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  54. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  55. package/dist/components/content/Item/Item.js +1 -1
  56. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  57. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  58. package/dist/components/content/Layout/GridLayout.js +1 -1
  59. package/dist/components/content/Layout/Layout.js +1 -1
  60. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  61. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  62. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  63. package/dist/components/content/Layout/LayoutContent.js +1 -1
  64. package/dist/components/content/Layout/LayoutContext.js +1 -1
  65. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  66. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  67. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  68. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  69. package/dist/components/content/Layout/LayoutPane.js +1 -1
  70. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  71. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  72. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  73. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  74. package/dist/components/content/Layout/index.js +1 -1
  75. package/dist/components/content/Layout/utils.js +1 -1
  76. package/dist/components/content/Paragraph.js +1 -1
  77. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  78. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  79. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  80. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  81. package/dist/components/content/Result/Result.js +1 -1
  82. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  83. package/dist/components/content/Tag/Tag.js +1 -1
  84. package/dist/components/content/Text.js +1 -1
  85. package/dist/components/content/TextItem/TextItem.js +1 -1
  86. package/dist/components/content/Title.js +1 -1
  87. package/dist/components/content/Tree/Tree.js +1 -1
  88. package/dist/components/content/Tree/TreeNode.js +1 -1
  89. package/dist/components/content/Tree/styled.js +1 -1
  90. package/dist/components/content/Tree/tree-index.js +1 -1
  91. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  92. package/dist/components/content/Tree/use-load-data.js +1 -1
  93. package/dist/components/content/highlightText.js +1 -1
  94. package/dist/components/content/use-auto-tooltip.js +1 -1
  95. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  96. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  97. package/dist/components/fields/Checkbox/context.js +1 -1
  98. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  99. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  100. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  101. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  102. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  103. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  104. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  105. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  106. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  107. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  108. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  109. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  110. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  111. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  112. package/dist/components/fields/DatePicker/intl.js +1 -1
  113. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  114. package/dist/components/fields/DatePicker/props.js +1 -1
  115. package/dist/components/fields/DatePicker/utils.js +1 -1
  116. package/dist/components/fields/FileInput/FileInput.js +1 -1
  117. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  118. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  119. package/dist/components/fields/Input/Input.js +1 -1
  120. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  121. package/dist/components/fields/ListBox/ListBox.js +1 -1
  122. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  123. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  124. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  125. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  126. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  127. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  128. package/dist/components/fields/Picker/Picker.js +1 -1
  129. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  130. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  131. package/dist/components/fields/RadioGroup/context.js +1 -1
  132. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  133. package/dist/components/fields/Select/Select.js +1 -1
  134. package/dist/components/fields/Slider/Gradation.js +1 -1
  135. package/dist/components/fields/Slider/HueSlider.js +1 -1
  136. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  137. package/dist/components/fields/Slider/Slider.js +1 -1
  138. package/dist/components/fields/Slider/SliderBase.js +1 -1
  139. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  140. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  141. package/dist/components/fields/Slider/elements.js +1 -1
  142. package/dist/components/fields/Slider/index.js +1 -1
  143. package/dist/components/fields/Switch/Switch.js +1 -1
  144. package/dist/components/fields/TextArea/TextArea.js +1 -1
  145. package/dist/components/fields/TextInput/TextInput.js +1 -1
  146. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  147. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  148. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  149. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  150. package/dist/components/form/Form/Field.js +1 -1
  151. package/dist/components/form/Form/Form.js +1 -1
  152. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  153. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  154. package/dist/components/form/Form/SubmitError.js +1 -1
  155. package/dist/components/form/Form/index.js +1 -1
  156. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  157. package/dist/components/form/Form/use-field/use-field.js +1 -1
  158. package/dist/components/form/Form/use-form.js +1 -1
  159. package/dist/components/form/Form/validation.js +1 -1
  160. package/dist/components/form/Label.js +1 -1
  161. package/dist/components/form/wrapper.js +1 -1
  162. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  163. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  164. package/dist/components/layout/Board/Board.d.ts +9 -0
  165. package/dist/components/layout/Board/Board.js +128 -52
  166. package/dist/components/layout/Board/Board.js.map +1 -1
  167. package/dist/components/layout/Board/BoardProvider.js +1 -1
  168. package/dist/components/layout/Board/Widget.d.ts +6 -0
  169. package/dist/components/layout/Board/Widget.js +4 -3
  170. package/dist/components/layout/Board/Widget.js.map +1 -1
  171. package/dist/components/layout/Board/WidgetHost.js +36 -13
  172. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  173. package/dist/components/layout/Board/board-context.js +10 -2
  174. package/dist/components/layout/Board/board-context.js.map +1 -1
  175. package/dist/components/layout/Board/board-store.js +2 -2
  176. package/dist/components/layout/Board/board-store.js.map +1 -1
  177. package/dist/components/layout/Board/grid-core/calculate.js +2 -2
  178. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  179. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  180. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  181. package/dist/components/layout/Board/grid-core/layout.js +23 -2
  182. package/dist/components/layout/Board/grid-core/layout.js.map +1 -1
  183. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  184. package/dist/components/layout/Board/index.js +1 -1
  185. package/dist/components/layout/Board/use-board-layout.js +1 -1
  186. package/dist/components/layout/Board/use-board-registry.js +11 -2
  187. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  188. package/dist/components/layout/Flex.js +1 -1
  189. package/dist/components/layout/Flow.js +1 -1
  190. package/dist/components/layout/Grid.js +1 -1
  191. package/dist/components/layout/Panel.js +1 -1
  192. package/dist/components/layout/Prefix.js +1 -1
  193. package/dist/components/layout/ResizablePanel.js +1 -1
  194. package/dist/components/layout/Space.js +1 -1
  195. package/dist/components/layout/Suffix.js +1 -1
  196. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  197. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  198. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  199. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  200. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  201. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  202. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  203. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  204. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  205. package/dist/components/navigation/Tabs/styled.js +1 -1
  206. package/dist/components/navigation/Tabs/types.js +1 -1
  207. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  208. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  209. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  210. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  211. package/dist/components/other/Calendar/Calendar.js +1 -1
  212. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  213. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  214. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  215. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  216. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  217. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  218. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  219. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  220. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  221. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  222. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  223. package/dist/components/overlays/Dialog/context.js +1 -1
  224. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  225. package/dist/components/overlays/Modal/Modal.js +1 -1
  226. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  227. package/dist/components/overlays/Modal/Overlay.js +1 -1
  228. package/dist/components/overlays/Modal/Popover.js +1 -1
  229. package/dist/components/overlays/Modal/Tray.js +1 -1
  230. package/dist/components/overlays/Modal/Underlay.js +1 -1
  231. package/dist/components/overlays/Notifications/Notification.js +1 -1
  232. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  233. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  234. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  235. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  236. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  237. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  238. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  239. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  240. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  241. package/dist/components/overlays/Notifications/index.js +1 -1
  242. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  243. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  244. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  245. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  246. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  247. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  248. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  249. package/dist/components/overlays/Toast/index.js +1 -1
  250. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  251. package/dist/components/overlays/Toast/useToast.js +1 -1
  252. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  253. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  254. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  255. package/dist/components/overlays/Tooltip/context.js +1 -1
  256. package/dist/components/portal/Portal.js +1 -1
  257. package/dist/components/portal/PortalProvider.js +1 -1
  258. package/dist/components/portal/usePortal.js +1 -1
  259. package/dist/components/shared/DraggableCollection.js +1 -1
  260. package/dist/components/shared/InvalidIcon.js +1 -1
  261. package/dist/components/shared/ValidIcon.js +1 -1
  262. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  263. package/dist/components/status/Spin/Cube.js +1 -1
  264. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  265. package/dist/components/status/Spin/Spin.js +1 -1
  266. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  267. package/dist/data/item-themes.js +1 -1
  268. package/dist/data/themes.js +1 -1
  269. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  270. package/dist/icons/AdjustmentsIcon.js +1 -1
  271. package/dist/icons/AiIcon.js +1 -1
  272. package/dist/icons/AreaChartIcon.js +1 -1
  273. package/dist/icons/BackwardIcon.js +1 -1
  274. package/dist/icons/BarChartIcon.js +1 -1
  275. package/dist/icons/BellFilledIcon.js +1 -1
  276. package/dist/icons/BellIcon.js +1 -1
  277. package/dist/icons/BooleanIcon.js +1 -1
  278. package/dist/icons/CalendarEditIcon.js +1 -1
  279. package/dist/icons/CalendarIcon.js +1 -1
  280. package/dist/icons/CaretDownIcon.js +1 -1
  281. package/dist/icons/CaretUpIcon.js +1 -1
  282. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  283. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  284. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  285. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  286. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  287. package/dist/icons/ChartBarLineIcon.js +1 -1
  288. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  289. package/dist/icons/ChartBarStackedIcon.js +1 -1
  290. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  291. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  292. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  293. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  294. package/dist/icons/ChartBubbleIcon.js +1 -1
  295. package/dist/icons/ChartDonut2Icon.js +1 -1
  296. package/dist/icons/ChartFunnelIcon.js +1 -1
  297. package/dist/icons/ChartHeatmapIcon.js +1 -1
  298. package/dist/icons/ChartKPIIcon.js +1 -1
  299. package/dist/icons/ChartPie2Icon.js +1 -1
  300. package/dist/icons/ChartScatterIcon.js +1 -1
  301. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  302. package/dist/icons/CheckCircleIcon.js +1 -1
  303. package/dist/icons/CheckIcon.js +1 -1
  304. package/dist/icons/CircleFilledIcon.js +1 -1
  305. package/dist/icons/ClearIcon.js +1 -1
  306. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  307. package/dist/icons/CloseCircleIcon.js +1 -1
  308. package/dist/icons/CloseIcon.js +1 -1
  309. package/dist/icons/CodeIcon.js +1 -1
  310. package/dist/icons/ColumnTotalIcon.js +1 -1
  311. package/dist/icons/CopyIcon.js +1 -1
  312. package/dist/icons/CountIcon.js +1 -1
  313. package/dist/icons/CubeIcon.js +1 -1
  314. package/dist/icons/CubePauseIcon.js +1 -1
  315. package/dist/icons/CubePlayIcon.js +1 -1
  316. package/dist/icons/CurrencyDollarIcon.js +1 -1
  317. package/dist/icons/DangerIcon.js +1 -1
  318. package/dist/icons/DashboardIcon.js +1 -1
  319. package/dist/icons/DatabaseIcon.js +1 -1
  320. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  321. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  322. package/dist/icons/DirectionIcon.js +1 -1
  323. package/dist/icons/DonutIcon.js +1 -1
  324. package/dist/icons/DownIcon.js +1 -1
  325. package/dist/icons/EditIcon.js +1 -1
  326. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  327. package/dist/icons/ExclamationCircleIcon.js +1 -1
  328. package/dist/icons/ExclamationIcon.js +1 -1
  329. package/dist/icons/EyeIcon.js +1 -1
  330. package/dist/icons/EyeInvisibleIcon.js +1 -1
  331. package/dist/icons/FilterIcon.js +1 -1
  332. package/dist/icons/FolderFilledIcon.js +1 -1
  333. package/dist/icons/FolderIcon.js +1 -1
  334. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  335. package/dist/icons/FolderOpenIcon.js +1 -1
  336. package/dist/icons/ForwardIcon.js +1 -1
  337. package/dist/icons/GripVerticalIcon.js +1 -1
  338. package/dist/icons/HierarchyIcon.js +1 -1
  339. package/dist/icons/HierarchyOpenIcon.js +1 -1
  340. package/dist/icons/Icon.js +1 -1
  341. package/dist/icons/InfoCircleIcon.js +1 -1
  342. package/dist/icons/InfoIcon.js +1 -1
  343. package/dist/icons/KeyIcon.js +1 -1
  344. package/dist/icons/LeftIcon.js +1 -1
  345. package/dist/icons/LineChartIcon.js +1 -1
  346. package/dist/icons/LoadingIcon.js +1 -1
  347. package/dist/icons/LockFilledIcon.js +1 -1
  348. package/dist/icons/LockIcon.js +1 -1
  349. package/dist/icons/MoreIcon.js +1 -1
  350. package/dist/icons/NotAllowedIcon.js +1 -1
  351. package/dist/icons/Number123Icon.js +1 -1
  352. package/dist/icons/NumberIcon.js +1 -1
  353. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  354. package/dist/icons/PauseCircleIcon.js +1 -1
  355. package/dist/icons/PauseIcon.js +1 -1
  356. package/dist/icons/PercentageIcon.js +1 -1
  357. package/dist/icons/PieChartIcon.js +1 -1
  358. package/dist/icons/PlayCircleIcon.js +1 -1
  359. package/dist/icons/PlayIcon.js +1 -1
  360. package/dist/icons/PlusIcon.js +1 -1
  361. package/dist/icons/ProgressBarIcon.js +1 -1
  362. package/dist/icons/ReloadIcon.js +1 -1
  363. package/dist/icons/ReportIcon.js +1 -1
  364. package/dist/icons/ReturnIcon.js +1 -1
  365. package/dist/icons/RightIcon.js +1 -1
  366. package/dist/icons/RowTotalsIcon.js +1 -1
  367. package/dist/icons/SchemeIcon.js +1 -1
  368. package/dist/icons/SearchIcon.js +1 -1
  369. package/dist/icons/SemanticQueryIcon.js +1 -1
  370. package/dist/icons/SettingsIcon.js +1 -1
  371. package/dist/icons/ShieldFilledIcon.js +1 -1
  372. package/dist/icons/ShieldIcon.js +1 -1
  373. package/dist/icons/SlashIcon.js +1 -1
  374. package/dist/icons/SparklesIcon.js +1 -1
  375. package/dist/icons/SqlIcon.js +1 -1
  376. package/dist/icons/StatsIcon.js +1 -1
  377. package/dist/icons/StopIcon.js +1 -1
  378. package/dist/icons/StringIcon.js +1 -1
  379. package/dist/icons/SubtotalsIcon.js +1 -1
  380. package/dist/icons/SwitchIcon.js +1 -1
  381. package/dist/icons/TableIcon.js +1 -1
  382. package/dist/icons/ThumbsDownIcon.js +1 -1
  383. package/dist/icons/ThumbsUpIcon.js +1 -1
  384. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  385. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  386. package/dist/icons/ThunderboltIcon.js +1 -1
  387. package/dist/icons/TimeIcon.js +1 -1
  388. package/dist/icons/TrashIcon.js +1 -1
  389. package/dist/icons/UnlockIcon.js +1 -1
  390. package/dist/icons/UpIcon.js +1 -1
  391. package/dist/icons/UserGroupIcon.js +1 -1
  392. package/dist/icons/UserIcon.js +1 -1
  393. package/dist/icons/UserLockIcon.js +1 -1
  394. package/dist/icons/ViewIcon.js +1 -1
  395. package/dist/icons/WarningFilledIcon.js +1 -1
  396. package/dist/icons/WarningIcon.js +1 -1
  397. package/dist/icons/wrap-icon.js +1 -1
  398. package/dist/index.js +1 -1
  399. package/dist/provider.js +1 -1
  400. package/dist/providers/TrackingProvider.js +1 -1
  401. package/dist/providers/navigationAdapter.default.js +1 -1
  402. package/dist/tokens/base.js +1 -1
  403. package/dist/tokens/colors.js +1 -1
  404. package/dist/tokens/index.js +1 -1
  405. package/dist/tokens/layout.js +1 -1
  406. package/dist/tokens/palette.js +1 -1
  407. package/dist/tokens/shadows.js +1 -1
  408. package/dist/tokens/sizes.js +1 -1
  409. package/dist/tokens/spacing.js +1 -1
  410. package/dist/tokens/typography.js +1 -1
  411. package/dist/utils/ResizeSensor.js +1 -1
  412. package/dist/utils/is-dev-env.js +1 -1
  413. package/dist/utils/modules.js +1 -1
  414. package/dist/utils/promise.js +1 -1
  415. package/dist/utils/raf.js +1 -1
  416. package/dist/utils/random.js +1 -1
  417. package/dist/utils/range.js +1 -1
  418. package/dist/utils/react/RenderCache.js +1 -1
  419. package/dist/utils/react/Slots.js +1 -1
  420. package/dist/utils/react/chain.js +1 -1
  421. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  422. package/dist/utils/react/index.js +1 -1
  423. package/dist/utils/react/interactions.js +1 -1
  424. package/dist/utils/react/isTextOnly.js +1 -1
  425. package/dist/utils/react/mapProps.js +1 -1
  426. package/dist/utils/react/mergeProps.js +1 -1
  427. package/dist/utils/react/nullableValue.js +1 -1
  428. package/dist/utils/react/resolveIcon.js +1 -1
  429. package/dist/utils/react/sharedStore.js +1 -1
  430. package/dist/utils/react/useCombinedRefs.js +1 -1
  431. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  432. package/dist/utils/react/useEventBus.js +1 -1
  433. package/dist/utils/react/useId.js +1 -1
  434. package/dist/utils/react/useIsDarwin.js +1 -1
  435. package/dist/utils/react/useKeySymbols.js +1 -1
  436. package/dist/utils/react/useLayoutEffect.js +1 -1
  437. package/dist/utils/react/useLocalStorage.js +1 -1
  438. package/dist/utils/react/useMergeStyles.js +1 -1
  439. package/dist/utils/react/usePopoverSync.js +1 -1
  440. package/dist/utils/react/useQaProps.js +1 -1
  441. package/dist/utils/react/useViewportSize.js +1 -1
  442. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  443. package/dist/utils/selection.js +1 -1
  444. package/dist/utils/styles.js +1 -1
  445. package/dist/utils/tree.js +1 -1
  446. package/dist/utils/warnings.js +1 -1
  447. package/dist/version.js +2 -2
  448. package/docs/components/layout/Board.md +13 -0
  449. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { validate } from "email-validator";
3
3
  import validUrl from "valid-url";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useProviderProps } from "../../provider.js";
4
4
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { mergeProps } from "../../utils/react/mergeProps.js";
3
3
  import { FieldWrapper } from "./FieldWrapper/FieldWrapper.js";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { useCallback, useLayoutEffect, useRef, useState } from "react";
3
3
 
4
4
  //#region src/components/helpers/DisplayTransition/DisplayTransition.tsx
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { DisplayTransition } from "../DisplayTransition/DisplayTransition.js";
3
3
  import { tasty } from "@tenphi/tasty";
4
4
  import { isValidElement, useCallback, useLayoutEffect, useRef, useState } from "react";
@@ -37,6 +37,15 @@ interface CubeBoardProps extends Omit<AllBaseProps, 'children'>, Omit<ContainerS
37
37
  isDroppable?: boolean;
38
38
  /** Which resize handles to show. @default ['se'] */
39
39
  resizeHandles?: ResizeHandleAxis[];
40
+ /**
41
+ * Align this board's grid with an ancestor `Board`'s layout. Only takes
42
+ * effect when the board is nested inside another `Board`'s widget. When set,
43
+ * the board inherits the parent's column pitch (deriving its own column count
44
+ * from its measured width so cells stay parent-sized) and inherits the
45
+ * parent's row height as a target, shrinking rows slightly when needed to fit
46
+ * the height the container widget grants it. @default false
47
+ */
48
+ isAligned?: boolean;
40
49
  /** Grid/item layout constraints. */
41
50
  constraints?: LayoutConstraint[];
42
51
  /**
@@ -1,11 +1,11 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
4
4
  import { useEvent } from "../../../_internal/hooks/use-event.js";
5
- import { useBoardRegistry } from "./board-context.js";
6
- import { bottom, getLayoutItem, modifyLayout } from "./grid-core/layout.js";
5
+ import { BoardMetricsContext, useBoardHost, useBoardMetrics, useBoardRegistry } from "./board-context.js";
6
+ import { bottom, cloneLayout, correctBounds, getLayoutItem, modifyLayout } from "./grid-core/layout.js";
7
7
  import { getCompactor } from "./grid-core/compactors.js";
8
- import { calcGridItemPosition, calcWH } from "./grid-core/calculate.js";
8
+ import { calcGridColWidth, calcGridItemPosition, calcWH, clamp } from "./grid-core/calculate.js";
9
9
  import { applySizeConstraints, defaultConstraints } from "./grid-core/constraints.js";
10
10
  import { BoardProvider } from "./BoardProvider.js";
11
11
  import { useBoardLayout } from "./use-board-layout.js";
@@ -47,22 +47,34 @@ const PlaceholderElement = tasty({
47
47
  boxSizing: "border-box"
48
48
  }
49
49
  });
50
+ /**
51
+ * Lower bound for the reduced row height used by an aligned nested board, so a
52
+ * very short container can never collapse its rows to zero.
53
+ */
54
+ const MIN_ALIGNED_ROW_HEIGHT = 24;
50
55
  function compactTypeToCore(compact) {
51
56
  if (compact === "free") return null;
52
57
  return compact;
53
58
  }
54
59
  function BoardInner(props, ref) {
55
- const { id: providedId, layout: controlledLayout, defaultLayout, onLayoutChange, cols = 12, rowHeight = 100, margin = [8, 8], containerPadding, maxRows = Infinity, compact = "vertical", allowOverlap = false, preventCollision = false, isDraggable = true, isResizable = true, isDroppable = true, resizeHandles = ["se"], constraints, width: providedWidth, children, ...otherProps } = props;
60
+ const { id: providedId, layout: controlledLayout, defaultLayout, onLayoutChange, cols = 12, rowHeight = 100, margin = [8, 8], containerPadding, maxRows = Infinity, compact = "vertical", allowOverlap = false, preventCollision = false, isDraggable = true, isResizable = true, isDroppable = true, resizeHandles = ["se"], isAligned = false, constraints, width: providedWidth, children, ...otherProps } = props;
56
61
  const registry = useBoardRegistry();
62
+ const parentMetrics = useBoardMetrics();
63
+ const host = useBoardHost();
64
+ const aligned = isAligned && !!parentMetrics;
57
65
  const generatedId = useId();
58
66
  const boardId = providedId ?? generatedId;
59
67
  const containerRef = useCombinedRefs(ref);
60
68
  const contentRef = useRef(null);
61
69
  const [measuredWidth, setMeasuredWidth] = useState(0);
70
+ const [measuredHeight, setMeasuredHeight] = useState(0);
62
71
  const width = providedWidth ?? measuredWidth;
63
72
  const onResizeContainer = useEvent(() => {
64
73
  const el = containerRef.current;
65
- if (el) setMeasuredWidth(el.offsetWidth);
74
+ if (el) {
75
+ setMeasuredWidth(el.offsetWidth);
76
+ setMeasuredHeight(el.offsetHeight);
77
+ }
66
78
  });
67
79
  useResizeObserver({
68
80
  ref: containerRef,
@@ -77,22 +89,30 @@ function BoardInner(props, ref) {
77
89
  onLayoutChange
78
90
  });
79
91
  useSyncExternalStore(registry.store.subscribe, registry.store.getVersion);
80
- const resolvedPadding = containerPadding ?? margin;
92
+ const effectiveMargin = aligned ? parentMetrics.margin : margin;
93
+ const resolvedPadding = containerPadding ?? effectiveMargin;
94
+ const rows = Math.max(bottom(layout), placeholder ? placeholder.y + placeholder.h : 0);
95
+ const parentColWidth = aligned ? parentMetrics.colWidth : 0;
96
+ const alignedCols = aligned && width > 0 ? Math.max(1, Math.floor((width - resolvedPadding[0] * 2 + effectiveMargin[0]) / (parentColWidth + effectiveMargin[0]))) : cols;
97
+ const effectiveCols = aligned ? alignedCols : cols;
98
+ const effectiveContainerWidth = aligned ? parentColWidth * effectiveCols + effectiveMargin[0] * Math.max(0, effectiveCols - 1) + resolvedPadding[0] * 2 : width;
99
+ const parentRowHeight = aligned ? parentMetrics.rowHeight : rowHeight;
100
+ const effectiveRowHeight = aligned && rows > 0 && measuredHeight > 0 ? clamp((measuredHeight - Math.max(0, rows - 1) * effectiveMargin[1] - resolvedPadding[1] * 2) / rows, MIN_ALIGNED_ROW_HEIGHT, parentRowHeight) : parentRowHeight;
81
101
  const positionParams = useMemo(() => ({
82
- margin,
102
+ margin: effectiveMargin,
83
103
  containerPadding: resolvedPadding,
84
- containerWidth: width,
85
- cols,
86
- rowHeight,
104
+ containerWidth: effectiveContainerWidth,
105
+ cols: effectiveCols,
106
+ rowHeight: effectiveRowHeight,
87
107
  maxRows
88
108
  }), [
89
- margin[0],
90
- margin[1],
109
+ effectiveMargin[0],
110
+ effectiveMargin[1],
91
111
  resolvedPadding[0],
92
112
  resolvedPadding[1],
93
- width,
94
- cols,
95
- rowHeight,
113
+ effectiveContainerWidth,
114
+ effectiveCols,
115
+ effectiveRowHeight,
96
116
  maxRows
97
117
  ]);
98
118
  const compactor = useMemo(() => {
@@ -104,8 +124,8 @@ function BoardInner(props, ref) {
104
124
  preventCollision
105
125
  ]);
106
126
  const resolvedConstraints = constraints ?? defaultConstraints;
107
- const rows = Math.max(bottom(layout), placeholder ? placeholder.y + placeholder.h : 0);
108
- const containerHeight = rows > 0 ? rows * rowHeight + Math.max(0, rows - 1) * margin[1] + resolvedPadding[1] * 2 : rowHeight;
127
+ const computedHeight = rows > 0 ? rows * effectiveRowHeight + Math.max(0, rows - 1) * effectiveMargin[1] + resolvedPadding[1] * 2 : effectiveRowHeight;
128
+ const containerHeight = aligned && measuredHeight > 0 ? measuredHeight : computedHeight;
109
129
  const liveRef = useRef({
110
130
  positionParams,
111
131
  compactor,
@@ -144,7 +164,39 @@ function BoardInner(props, ref) {
144
164
  entry.id = boardId;
145
165
  return registry.registerBoard(entry);
146
166
  }, [boardId]);
167
+ const recompactForCols = useEvent((nextCols) => {
168
+ const corrected = correctBounds(cloneLayout(layoutRef.current), { cols: nextCols });
169
+ applyLayoutEvent([...liveRef.current.compactor.compact(corrected, nextCols)], true);
170
+ });
171
+ const prevAlignedColsRef = useRef(effectiveCols);
172
+ useEffect(() => {
173
+ if (!aligned) {
174
+ prevAlignedColsRef.current = effectiveCols;
175
+ return;
176
+ }
177
+ if (prevAlignedColsRef.current === effectiveCols) return;
178
+ prevAlignedColsRef.current = effectiveCols;
179
+ recompactForCols(effectiveCols);
180
+ }, [
181
+ aligned,
182
+ effectiveCols,
183
+ recompactForCols
184
+ ]);
185
+ const naturalHeight = rows > 0 ? rows * parentRowHeight + Math.max(0, rows - 1) * effectiveMargin[1] + resolvedPadding[1] * 2 : parentRowHeight;
186
+ const requestHeightDeficit = host?.requestHeightDeficit;
187
+ useEffect(() => {
188
+ if (!aligned || !host?.isAutoHeight || !requestHeightDeficit) return;
189
+ if (measuredHeight <= 0) return;
190
+ requestHeightDeficit(naturalHeight - measuredHeight);
191
+ }, [
192
+ aligned,
193
+ host?.isAutoHeight,
194
+ requestHeightDeficit,
195
+ naturalHeight,
196
+ measuredHeight
197
+ ]);
147
198
  const resizeStateRef = useRef(null);
199
+ const autoHeightMinRowsRef = useRef({});
148
200
  const handleResize = useEvent((id, axis, phase, dx, dy) => {
149
201
  const pp = liveRef.current.positionParams;
150
202
  if (phase === "start") {
@@ -194,24 +246,38 @@ function BoardInner(props, ref) {
194
246
  margin: pp.margin,
195
247
  layout: layoutRef.current
196
248
  });
249
+ const floorRows = autoHeightMinRowsRef.current[id] ?? 0;
250
+ const finalW = constrained.w;
251
+ const finalH = Math.max(constrained.h, floorRows);
197
252
  let x = item.x;
198
253
  let y = item.y;
199
- if (handle.includes("w")) x = item.x + item.w - constrained.w;
200
- if (handle.includes("n")) y = item.y + item.h - constrained.h;
254
+ if (handle.includes("w")) x = item.x + item.w - finalW;
255
+ if (handle.includes("n")) y = item.y + item.h - finalH;
201
256
  x = Math.max(0, x);
202
257
  y = Math.max(0, y);
203
258
  const newItem = {
204
259
  ...item,
205
260
  x,
206
261
  y,
207
- w: constrained.w,
208
- h: constrained.h
262
+ w: finalW,
263
+ h: finalH
209
264
  };
210
265
  const working = modifyLayout(layoutRef.current, newItem);
211
266
  const compacted = [...liveRef.current.compactor.compact(working, pp.cols)];
212
267
  applyLayout(compacted, false);
213
268
  setPlaceholder(getLayoutItem(compacted, id) ?? newItem);
214
269
  });
270
+ const handleAutoHeight = useEvent((id, neededRows) => {
271
+ autoHeightMinRowsRef.current[id] = neededRows;
272
+ const current = getLayoutItem(layoutRef.current, id);
273
+ if (!current || neededRows <= current.h) return;
274
+ const pp = liveRef.current.positionParams;
275
+ const working = modifyLayout(layoutRef.current, {
276
+ ...current,
277
+ h: neededRows
278
+ });
279
+ applyLayout([...liveRef.current.compactor.compact(working, pp.cols)], true);
280
+ });
215
281
  const styles = extractStyles(otherProps, CONTAINER_STYLES);
216
282
  const dragState = registry.dragState;
217
283
  const ready = width > 0;
@@ -224,36 +290,46 @@ function BoardInner(props, ref) {
224
290
  };
225
291
  })() : null;
226
292
  const showPlaceholder = placeholder && placeholderStyle;
227
- return /* @__PURE__ */ jsxs(BoardElement, {
228
- ...filterBaseProps(otherProps, { eventProps: true }),
229
- ref: containerRef,
230
- styles,
231
- style: { minHeight: `${containerHeight}px` },
232
- mods: {
233
- dragging: !!dragState,
234
- "drop-target": dragState?.currentBoardId === boardId
235
- },
236
- children: [/* @__PURE__ */ jsxs(ContentLayer, {
237
- ref: contentRef,
238
- children: [ready ? layout.map((item) => {
239
- const registration = registry.store.get(item.i);
240
- return /* @__PURE__ */ jsx(WidgetHost, {
241
- boardId,
242
- item,
243
- positionParams,
244
- registration,
245
- isDraggable: isDraggable && registration?.isDraggable !== false && item.isDraggable !== false && !item.static,
246
- isResizable: isResizable && registration?.isResizable !== false && item.isResizable !== false && !item.static,
247
- resizeHandles: item.resizeHandles ?? registration?.resizeHandles ?? resizeHandles,
248
- registry,
249
- dragState,
250
- onResize: handleResize
251
- }, item.i);
252
- }) : null, showPlaceholder ? /* @__PURE__ */ jsx(PlaceholderElement, {
253
- "aria-hidden": "true",
254
- style: placeholderStyle
255
- }) : null]
256
- }), children]
293
+ const boardMetrics = useMemo(() => ({
294
+ colWidth: calcGridColWidth(positionParams),
295
+ rowHeight: positionParams.rowHeight,
296
+ margin: positionParams.margin,
297
+ containerPadding: positionParams.containerPadding
298
+ }), [positionParams]);
299
+ return /* @__PURE__ */ jsx(BoardMetricsContext.Provider, {
300
+ value: boardMetrics,
301
+ children: /* @__PURE__ */ jsxs(BoardElement, {
302
+ ...filterBaseProps(otherProps, { eventProps: true }),
303
+ ref: containerRef,
304
+ styles,
305
+ style: aligned ? void 0 : { minHeight: `${containerHeight}px` },
306
+ mods: {
307
+ dragging: !!dragState,
308
+ "drop-target": dragState?.currentBoardId === boardId
309
+ },
310
+ children: [/* @__PURE__ */ jsxs(ContentLayer, {
311
+ ref: contentRef,
312
+ children: [ready ? layout.map((item) => {
313
+ const registration = registry.store.get(item.i);
314
+ return /* @__PURE__ */ jsx(WidgetHost, {
315
+ boardId,
316
+ item,
317
+ positionParams,
318
+ registration,
319
+ isDraggable: isDraggable && registration?.isDraggable !== false && item.isDraggable !== false && !item.static,
320
+ isResizable: isResizable && registration?.isResizable !== false && item.isResizable !== false && !item.static,
321
+ resizeHandles: item.resizeHandles ?? registration?.resizeHandles ?? resizeHandles,
322
+ registry,
323
+ dragState,
324
+ onResize: handleResize,
325
+ onAutoHeight: handleAutoHeight
326
+ }, item.i);
327
+ }) : null, showPlaceholder ? /* @__PURE__ */ jsx(PlaceholderElement, {
328
+ "aria-hidden": "true",
329
+ style: placeholderStyle
330
+ }) : null]
331
+ }), children]
332
+ })
257
333
  });
258
334
  }
259
335
  const BoardInnerForwarded = forwardRef(BoardInner);
@@ -1 +1 @@
1
- {"version":3,"file":"Board.js","names":[],"sources":["../../../../src/components/layout/Board/Board.tsx"],"sourcesContent":["import { useResizeObserver } from '@react-aria/utils';\nimport {\n AllBaseProps,\n CONTAINER_STYLES,\n ContainerStyleProps,\n filterBaseProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport {\n forwardRef,\n ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { BoardEntry, useBoardRegistry } from './board-context';\nimport { BoardProvider } from './BoardProvider';\nimport {\n applySizeConstraints,\n bottom,\n calcGridItemPosition,\n calcWH,\n Compactor,\n CompactType,\n defaultConstraints,\n getCompactor,\n getLayoutItem,\n LayoutConstraint,\n LayoutItem,\n modifyLayout,\n Position,\n PositionParams,\n ResizeHandleAxis,\n} from './grid-core';\nimport { useBoardLayout } from './use-board-layout';\nimport { ResizePhase, WidgetHost } from './WidgetHost';\n\nconst BoardElement = tasty({\n qa: 'Board',\n styles: {\n position: 'relative',\n display: 'block',\n width: '100%',\n flexGrow: 1,\n minHeight: '0',\n fill: '#clear',\n boxSizing: 'border-box',\n },\n});\n\nconst ContentLayer = tasty({\n styles: {\n position: 'absolute',\n inset: 0,\n },\n});\n\nconst PlaceholderElement = tasty({\n qa: 'BoardPlaceholder',\n styles: {\n position: 'absolute',\n top: 0,\n left: 0,\n fill: '#purple.10',\n radius: '1cr',\n border: '#purple.40',\n zIndex: 2,\n pointerEvents: 'none',\n transition: 'transform 80ms linear, width 80ms linear, height 80ms linear',\n boxSizing: 'border-box',\n },\n});\n\nexport type BoardCompactType = 'vertical' | 'horizontal' | 'free' | null;\n\nexport interface CubeBoardProps\n extends Omit<AllBaseProps, 'children'>,\n Omit<ContainerStyleProps, 'margin'> {\n /** Stable board id (used for cross-board drag). Auto-generated if omitted. */\n id?: string;\n /** Controlled layout. */\n layout?: LayoutItem[];\n /** Initial layout for uncontrolled usage. */\n defaultLayout?: LayoutItem[];\n onLayoutChange?: (layout: LayoutItem[]) => void;\n /** Number of columns. @default 12 */\n cols?: number;\n /** Row height in pixels. @default 100 */\n rowHeight?: number;\n /** [horizontal, vertical] margin between widgets in pixels. @default [8, 8] */\n margin?: [number, number];\n /** [horizontal, vertical] padding inside the board. Defaults to `margin`. */\n containerPadding?: [number, number];\n /** Maximum number of rows. @default Infinity */\n maxRows?: number;\n /** Compaction behavior. @default 'vertical' */\n compact?: BoardCompactType;\n /** Allow widgets to overlap. @default false */\n allowOverlap?: boolean;\n /** Block movement into occupied cells instead of pushing. @default false */\n preventCollision?: boolean;\n /** Enable dragging for all widgets. @default true */\n isDraggable?: boolean;\n /** Enable resizing for all widgets. @default true */\n isResizable?: boolean;\n /** Whether this board accepts widgets dropped from other boards. @default true */\n isDroppable?: boolean;\n /** Which resize handles to show. @default ['se'] */\n resizeHandles?: ResizeHandleAxis[];\n /** Grid/item layout constraints. */\n constraints?: LayoutConstraint[];\n /**\n * Explicit container width in pixels. When provided, disables automatic width\n * measurement (useful for SSR and tests).\n */\n width?: number;\n children?: ReactNode;\n}\n\nfunction compactTypeToCore(compact: BoardCompactType): CompactType {\n if (compact === 'free') return null;\n return compact;\n}\n\nfunction BoardInner(\n props: CubeBoardProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const {\n id: providedId,\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n cols = 12,\n rowHeight = 100,\n margin = [8, 8],\n containerPadding,\n maxRows = Infinity,\n compact = 'vertical',\n allowOverlap = false,\n preventCollision = false,\n isDraggable = true,\n isResizable = true,\n isDroppable = true,\n resizeHandles = ['se'],\n constraints,\n width: providedWidth,\n children,\n ...otherProps\n } = props;\n\n const registry = useBoardRegistry()!;\n const generatedId = useId();\n const boardId = providedId ?? generatedId;\n\n const containerRef = useCombinedRefs(ref);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [measuredWidth, setMeasuredWidth] = useState<number>(0);\n const width = providedWidth ?? measuredWidth;\n\n const onResizeContainer = useEvent(() => {\n const el = containerRef.current;\n if (el) {\n setMeasuredWidth(el.offsetWidth);\n }\n });\n useResizeObserver({ ref: containerRef, onResize: onResizeContainer });\n useEffect(() => {\n if (providedWidth == null) {\n onResizeContainer();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [providedWidth]);\n\n const { layout, layoutRef, placeholder, setPlaceholder, applyLayout } =\n useBoardLayout({\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n });\n\n // Re-render when any widget's registered content/config changes.\n useSyncExternalStore(registry.store.subscribe, registry.store.getVersion);\n\n const resolvedPadding = containerPadding ?? margin;\n\n const positionParams = useMemo<PositionParams>(\n () => ({\n margin,\n containerPadding: resolvedPadding,\n containerWidth: width,\n cols,\n rowHeight,\n maxRows,\n }),\n [\n margin[0],\n margin[1],\n resolvedPadding[0],\n resolvedPadding[1],\n width,\n cols,\n rowHeight,\n maxRows,\n ],\n );\n\n const compactor = useMemo<Compactor>(() => {\n // 'free' means true free positioning: widgets can overlap and nothing is\n // pushed or recompacted. Force allowOverlap so `moveElement` short-circuits\n // on collision and the (no-op) compactor leaves items exactly where dropped.\n if (compact === 'free') {\n return getCompactor(null, true, preventCollision);\n }\n return getCompactor(\n compactTypeToCore(compact),\n allowOverlap,\n preventCollision,\n );\n }, [compact, allowOverlap, preventCollision]);\n\n const resolvedConstraints = constraints ?? defaultConstraints;\n\n const rows = Math.max(\n bottom(layout),\n placeholder ? placeholder.y + placeholder.h : 0,\n );\n const containerHeight =\n rows > 0\n ? rows * rowHeight +\n Math.max(0, rows - 1) * margin[1] +\n resolvedPadding[1] * 2\n : rowHeight;\n\n // Live refs so the stable registry entry always reads current values.\n const liveRef = useRef({\n positionParams,\n compactor,\n constraints: resolvedConstraints,\n maxRows,\n containerHeight,\n isDroppable,\n });\n liveRef.current = {\n positionParams,\n compactor,\n constraints: resolvedConstraints,\n maxRows,\n containerHeight,\n isDroppable,\n };\n\n const applyLayoutEvent = useEvent(applyLayout);\n const setPlaceholderEvent = useEvent(setPlaceholder);\n\n const entryRef = useRef<BoardEntry | null>(null);\n if (!entryRef.current) {\n entryRef.current = {\n id: boardId,\n getContentRect: () => contentRef.current?.getBoundingClientRect() ?? null,\n getContentNode: () => contentRef.current,\n getPositionParams: () => liveRef.current.positionParams,\n getConstraints: () => liveRef.current.constraints,\n getCompactor: () => liveRef.current.compactor,\n getMaxRows: () => liveRef.current.maxRows,\n getContainerHeight: () => liveRef.current.containerHeight,\n getLayout: () => layoutRef.current,\n applyLayout: (next, commit) => applyLayoutEvent(next, commit),\n setPlaceholder: (item) => setPlaceholderEvent(item),\n isDroppable: () => liveRef.current.isDroppable,\n };\n }\n\n useEffect(() => {\n const entry = entryRef.current!;\n // Keep the entry's id in sync with the (possibly changed) board id before\n // registering. The previous effect's cleanup has already removed the old id,\n // so registering here keys the entry under the current id.\n entry.id = boardId;\n return registry.registerBoard(entry);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [boardId]);\n\n // In-board resize orchestration.\n const resizeStateRef = useRef<{\n id: string;\n axis: ResizeHandleAxis;\n item: LayoutItem;\n origin: Position;\n accX: number;\n accY: number;\n } | null>(null);\n\n const handleResize = useEvent(\n (\n id: string,\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => {\n const pp = liveRef.current.positionParams;\n\n if (phase === 'start') {\n const rawItem = getLayoutItem(layoutRef.current, id);\n if (!rawItem) return;\n // Layout-item constraints win; otherwise fall back to the ones declared\n // on the owning `Board.Widget` so `applySizeConstraints` picks them up.\n const item: LayoutItem = {\n ...rawItem,\n constraints:\n rawItem.constraints ?? registry.store.get(id)?.constraints,\n };\n resizeStateRef.current = {\n id,\n axis,\n item: { ...item },\n origin: calcGridItemPosition(pp, item.x, item.y, item.w, item.h),\n accX: 0,\n accY: 0,\n };\n setPlaceholder({ ...item });\n return;\n }\n\n const rs = resizeStateRef.current;\n if (!rs) return;\n\n if (phase === 'end') {\n applyLayout([...layoutRef.current], true);\n setPlaceholder(null);\n resizeStateRef.current = null;\n return;\n }\n\n rs.accX += dx;\n rs.accY += dy;\n\n const { origin, item, axis: handle } = rs;\n let newW = origin.width;\n let newH = origin.height;\n if (handle.includes('e')) newW = origin.width + rs.accX;\n if (handle.includes('w')) newW = origin.width - rs.accX;\n if (handle.includes('s')) newH = origin.height + rs.accY;\n if (handle.includes('n')) newH = origin.height - rs.accY;\n newW = Math.max(newW, 8);\n newH = Math.max(newH, 8);\n\n const raw = calcWH(pp, newW, newH, item.x, item.y, handle);\n const constrained = applySizeConstraints(\n liveRef.current.constraints,\n item,\n raw.w,\n raw.h,\n handle,\n {\n cols: pp.cols,\n maxRows: liveRef.current.maxRows,\n containerWidth: pp.containerWidth,\n containerHeight: liveRef.current.containerHeight,\n rowHeight: pp.rowHeight,\n margin: pp.margin,\n layout: layoutRef.current,\n },\n );\n\n let x = item.x;\n let y = item.y;\n if (handle.includes('w')) x = item.x + item.w - constrained.w;\n if (handle.includes('n')) y = item.y + item.h - constrained.h;\n x = Math.max(0, x);\n y = Math.max(0, y);\n\n const newItem: LayoutItem = {\n ...item,\n x,\n y,\n w: constrained.w,\n h: constrained.h,\n };\n const working = modifyLayout(layoutRef.current, newItem);\n const compacted = [\n ...liveRef.current.compactor.compact(working, pp.cols),\n ];\n applyLayout(compacted, false);\n setPlaceholder(getLayoutItem(compacted, id) ?? newItem);\n },\n );\n\n const styles: Styles = extractStyles(otherProps, CONTAINER_STYLES);\n\n const dragState = registry.dragState;\n const ready = width > 0;\n\n const placeholderStyle = placeholder\n ? (() => {\n const pos = calcGridItemPosition(\n positionParams,\n placeholder.x,\n placeholder.y,\n placeholder.w,\n placeholder.h,\n );\n return {\n transform: `translate(${pos.left}px, ${pos.top}px)`,\n width: `${pos.width}px`,\n height: `${pos.height}px`,\n };\n })()\n : null;\n\n const showPlaceholder = placeholder && placeholderStyle;\n\n return (\n <BoardElement\n {...filterBaseProps(otherProps, { eventProps: true })}\n ref={containerRef}\n styles={styles}\n // Use min-height (not a fixed height) so the board auto-sizes to its\n // content by default but can still grow to fill a taller parent (e.g. a\n // nested board stretched inside a container widget). Widgets are absolutely\n // positioned, so growing never shifts them, and the content layer\n // (inset: 0) always covers the full board -> the whole board is droppable.\n style={{ minHeight: `${containerHeight}px` }}\n mods={{\n dragging: !!dragState,\n 'drop-target': dragState?.currentBoardId === boardId,\n }}\n >\n <ContentLayer ref={contentRef}>\n {ready\n ? layout.map((item) => {\n const registration = registry.store.get(item.i);\n const widgetDraggable =\n isDraggable &&\n registration?.isDraggable !== false &&\n item.isDraggable !== false &&\n !item.static;\n const widgetResizable =\n isResizable &&\n registration?.isResizable !== false &&\n item.isResizable !== false &&\n !item.static;\n const handles =\n item.resizeHandles ??\n registration?.resizeHandles ??\n resizeHandles;\n\n return (\n <WidgetHost\n key={item.i}\n boardId={boardId}\n item={item}\n positionParams={positionParams}\n registration={registration}\n isDraggable={widgetDraggable}\n isResizable={widgetResizable}\n resizeHandles={handles}\n registry={registry}\n dragState={dragState}\n onResize={handleResize}\n />\n );\n })\n : null}\n {showPlaceholder ? (\n <PlaceholderElement aria-hidden=\"true\" style={placeholderStyle!} />\n ) : null}\n </ContentLayer>\n {children}\n </BoardElement>\n );\n}\n\nconst BoardInnerForwarded = forwardRef(BoardInner);\n\n/**\n * A draggable and resizable widget grid. Widgets are declared with\n * `Board.Widget` and positioned via a `layout`. Wrap multiple boards in a\n * `BoardProvider` to enable dragging widgets between them.\n */\nexport const Board = forwardRef(function Board(\n props: CubeBoardProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const existingRegistry = useBoardRegistry();\n\n if (existingRegistry) {\n return <BoardInnerForwarded {...props} ref={ref} />;\n }\n\n return (\n <BoardProvider>\n <BoardInnerForwarded {...props} ref={ref} />\n </BoardProvider>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"Board.js","names":[],"sources":["../../../../src/components/layout/Board/Board.tsx"],"sourcesContent":["import { useResizeObserver } from '@react-aria/utils';\nimport {\n AllBaseProps,\n CONTAINER_STYLES,\n ContainerStyleProps,\n filterBaseProps,\n Styles,\n tasty,\n} from '@tenphi/tasty';\nimport {\n forwardRef,\n ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport {\n BoardEntry,\n BoardMetrics,\n BoardMetricsContext,\n useBoardHost,\n useBoardMetrics,\n useBoardRegistry,\n} from './board-context';\nimport { BoardProvider } from './BoardProvider';\nimport {\n applySizeConstraints,\n bottom,\n calcGridColWidth,\n calcGridItemPosition,\n calcWH,\n clamp,\n cloneLayout,\n Compactor,\n CompactType,\n correctBounds,\n defaultConstraints,\n getCompactor,\n getLayoutItem,\n LayoutConstraint,\n LayoutItem,\n modifyLayout,\n Position,\n PositionParams,\n ResizeHandleAxis,\n} from './grid-core';\nimport { useBoardLayout } from './use-board-layout';\nimport { ResizePhase, WidgetHost } from './WidgetHost';\n\nconst BoardElement = tasty({\n qa: 'Board',\n styles: {\n position: 'relative',\n display: 'block',\n width: '100%',\n flexGrow: 1,\n minHeight: '0',\n fill: '#clear',\n boxSizing: 'border-box',\n },\n});\n\nconst ContentLayer = tasty({\n styles: {\n position: 'absolute',\n inset: 0,\n },\n});\n\nconst PlaceholderElement = tasty({\n qa: 'BoardPlaceholder',\n styles: {\n position: 'absolute',\n top: 0,\n left: 0,\n fill: '#purple.10',\n radius: '1cr',\n border: '#purple.40',\n zIndex: 2,\n pointerEvents: 'none',\n transition: 'transform 80ms linear, width 80ms linear, height 80ms linear',\n boxSizing: 'border-box',\n },\n});\n\n/**\n * Lower bound for the reduced row height used by an aligned nested board, so a\n * very short container can never collapse its rows to zero.\n */\nconst MIN_ALIGNED_ROW_HEIGHT = 24;\n\nexport type BoardCompactType = 'vertical' | 'horizontal' | 'free' | null;\n\nexport interface CubeBoardProps\n extends Omit<AllBaseProps, 'children'>,\n Omit<ContainerStyleProps, 'margin'> {\n /** Stable board id (used for cross-board drag). Auto-generated if omitted. */\n id?: string;\n /** Controlled layout. */\n layout?: LayoutItem[];\n /** Initial layout for uncontrolled usage. */\n defaultLayout?: LayoutItem[];\n onLayoutChange?: (layout: LayoutItem[]) => void;\n /** Number of columns. @default 12 */\n cols?: number;\n /** Row height in pixels. @default 100 */\n rowHeight?: number;\n /** [horizontal, vertical] margin between widgets in pixels. @default [8, 8] */\n margin?: [number, number];\n /** [horizontal, vertical] padding inside the board. Defaults to `margin`. */\n containerPadding?: [number, number];\n /** Maximum number of rows. @default Infinity */\n maxRows?: number;\n /** Compaction behavior. @default 'vertical' */\n compact?: BoardCompactType;\n /** Allow widgets to overlap. @default false */\n allowOverlap?: boolean;\n /** Block movement into occupied cells instead of pushing. @default false */\n preventCollision?: boolean;\n /** Enable dragging for all widgets. @default true */\n isDraggable?: boolean;\n /** Enable resizing for all widgets. @default true */\n isResizable?: boolean;\n /** Whether this board accepts widgets dropped from other boards. @default true */\n isDroppable?: boolean;\n /** Which resize handles to show. @default ['se'] */\n resizeHandles?: ResizeHandleAxis[];\n /**\n * Align this board's grid with an ancestor `Board`'s layout. Only takes\n * effect when the board is nested inside another `Board`'s widget. When set,\n * the board inherits the parent's column pitch (deriving its own column count\n * from its measured width so cells stay parent-sized) and inherits the\n * parent's row height as a target, shrinking rows slightly when needed to fit\n * the height the container widget grants it. @default false\n */\n isAligned?: boolean;\n /** Grid/item layout constraints. */\n constraints?: LayoutConstraint[];\n /**\n * Explicit container width in pixels. When provided, disables automatic width\n * measurement (useful for SSR and tests).\n */\n width?: number;\n children?: ReactNode;\n}\n\nfunction compactTypeToCore(compact: BoardCompactType): CompactType {\n if (compact === 'free') return null;\n return compact;\n}\n\nfunction BoardInner(\n props: CubeBoardProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const {\n id: providedId,\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n cols = 12,\n rowHeight = 100,\n margin = [8, 8],\n containerPadding,\n maxRows = Infinity,\n compact = 'vertical',\n allowOverlap = false,\n preventCollision = false,\n isDraggable = true,\n isResizable = true,\n isDroppable = true,\n resizeHandles = ['se'],\n isAligned = false,\n constraints,\n width: providedWidth,\n children,\n ...otherProps\n } = props;\n\n const registry = useBoardRegistry()!;\n const parentMetrics = useBoardMetrics();\n const host = useBoardHost();\n const aligned = isAligned && !!parentMetrics;\n const generatedId = useId();\n const boardId = providedId ?? generatedId;\n\n const containerRef = useCombinedRefs(ref);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [measuredWidth, setMeasuredWidth] = useState<number>(0);\n // Rendered height is only needed for aligned nested boards (to fit rows into\n // the space the container grants). It never drives the board's own height, so\n // measuring it cannot create a feedback loop.\n const [measuredHeight, setMeasuredHeight] = useState<number>(0);\n const width = providedWidth ?? measuredWidth;\n\n const onResizeContainer = useEvent(() => {\n const el = containerRef.current;\n if (el) {\n setMeasuredWidth(el.offsetWidth);\n setMeasuredHeight(el.offsetHeight);\n }\n });\n useResizeObserver({ ref: containerRef, onResize: onResizeContainer });\n useEffect(() => {\n if (providedWidth == null) {\n onResizeContainer();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [providedWidth]);\n\n const { layout, layoutRef, placeholder, setPlaceholder, applyLayout } =\n useBoardLayout({\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n });\n\n // Re-render when any widget's registered content/config changes.\n useSyncExternalStore(registry.store.subscribe, registry.store.getVersion);\n\n // In aligned mode the board inherits the parent's gap so widget edges line up\n // with the surrounding layout; otherwise it uses its own `margin`.\n const effectiveMargin: readonly [number, number] = aligned\n ? parentMetrics!.margin\n : margin;\n // The board keeps its own padding (it sits inside the container's chrome);\n // when unspecified it defaults to the effective gap.\n const resolvedPadding: readonly [number, number] =\n containerPadding ?? effectiveMargin;\n\n const rows = Math.max(\n bottom(layout),\n placeholder ? placeholder.y + placeholder.h : 0,\n );\n\n // Derive the aligned column count so each column keeps the parent's pixel\n // pitch: as the container widget is resized, columns are added/removed rather\n // than stretched. `containerWidth` is then back-solved so `calcGridColWidth`\n // returns exactly the parent's column width.\n const parentColWidth = aligned ? parentMetrics!.colWidth : 0;\n const alignedCols =\n aligned && width > 0\n ? Math.max(\n 1,\n Math.floor(\n (width - resolvedPadding[0] * 2 + effectiveMargin[0]) /\n (parentColWidth + effectiveMargin[0]),\n ),\n )\n : cols;\n const effectiveCols = aligned ? alignedCols : cols;\n const effectiveContainerWidth = aligned\n ? parentColWidth * effectiveCols +\n effectiveMargin[0] * Math.max(0, effectiveCols - 1) +\n resolvedPadding[0] * 2\n : width;\n\n // Row height inherits the parent's as the target, but shrinks (never grows\n // beyond it) so the board's rows fit the height the container grants. When\n // the height is unbounded/unmeasured, it stays at the parent's row height.\n const parentRowHeight = aligned ? parentMetrics!.rowHeight : rowHeight;\n const effectiveRowHeight =\n aligned && rows > 0 && measuredHeight > 0\n ? clamp(\n (measuredHeight -\n Math.max(0, rows - 1) * effectiveMargin[1] -\n resolvedPadding[1] * 2) /\n rows,\n MIN_ALIGNED_ROW_HEIGHT,\n parentRowHeight,\n )\n : parentRowHeight;\n\n const positionParams = useMemo<PositionParams>(\n () => ({\n margin: effectiveMargin,\n containerPadding: resolvedPadding,\n containerWidth: effectiveContainerWidth,\n cols: effectiveCols,\n rowHeight: effectiveRowHeight,\n maxRows,\n }),\n [\n effectiveMargin[0],\n effectiveMargin[1],\n resolvedPadding[0],\n resolvedPadding[1],\n effectiveContainerWidth,\n effectiveCols,\n effectiveRowHeight,\n maxRows,\n ],\n );\n\n const compactor = useMemo<Compactor>(() => {\n // 'free' means true free positioning: widgets can overlap and nothing is\n // pushed or recompacted. Force allowOverlap so `moveElement` short-circuits\n // on collision and the (no-op) compactor leaves items exactly where dropped.\n if (compact === 'free') {\n return getCompactor(null, true, preventCollision);\n }\n return getCompactor(\n compactTypeToCore(compact),\n allowOverlap,\n preventCollision,\n );\n }, [compact, allowOverlap, preventCollision]);\n\n const resolvedConstraints = constraints ?? defaultConstraints;\n\n const computedHeight =\n rows > 0\n ? rows * effectiveRowHeight +\n Math.max(0, rows - 1) * effectiveMargin[1] +\n resolvedPadding[1] * 2\n : effectiveRowHeight;\n // An aligned board fills the height the container grants it, so it reports its\n // measured height; otherwise it reports the height its content needs.\n const containerHeight =\n aligned && measuredHeight > 0 ? measuredHeight : computedHeight;\n\n // Live refs so the stable registry entry always reads current values.\n const liveRef = useRef({\n positionParams,\n compactor,\n constraints: resolvedConstraints,\n maxRows,\n containerHeight,\n isDroppable,\n });\n liveRef.current = {\n positionParams,\n compactor,\n constraints: resolvedConstraints,\n maxRows,\n containerHeight,\n isDroppable,\n };\n\n const applyLayoutEvent = useEvent(applyLayout);\n const setPlaceholderEvent = useEvent(setPlaceholder);\n\n const entryRef = useRef<BoardEntry | null>(null);\n if (!entryRef.current) {\n entryRef.current = {\n id: boardId,\n getContentRect: () => contentRef.current?.getBoundingClientRect() ?? null,\n getContentNode: () => contentRef.current,\n getPositionParams: () => liveRef.current.positionParams,\n getConstraints: () => liveRef.current.constraints,\n getCompactor: () => liveRef.current.compactor,\n getMaxRows: () => liveRef.current.maxRows,\n getContainerHeight: () => liveRef.current.containerHeight,\n getLayout: () => layoutRef.current,\n applyLayout: (next, commit) => applyLayoutEvent(next, commit),\n setPlaceholder: (item) => setPlaceholderEvent(item),\n isDroppable: () => liveRef.current.isDroppable,\n };\n }\n\n useEffect(() => {\n const entry = entryRef.current!;\n // Keep the entry's id in sync with the (possibly changed) board id before\n // registering. The previous effect's cleanup has already removed the old id,\n // so registering here keys the entry under the current id.\n entry.id = boardId;\n return registry.registerBoard(entry);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [boardId]);\n\n // When the aligned column count changes (the container was resized), reflow\n // the layout to the new width: clamp items back into bounds and recompact so\n // nothing overflows the narrower/wider grid.\n const recompactForCols = useEvent((nextCols: number) => {\n const corrected = correctBounds(cloneLayout(layoutRef.current), {\n cols: nextCols,\n });\n const compacted = [\n ...liveRef.current.compactor.compact(corrected, nextCols),\n ];\n applyLayoutEvent(compacted, true);\n });\n const prevAlignedColsRef = useRef(effectiveCols);\n useEffect(() => {\n if (!aligned) {\n prevAlignedColsRef.current = effectiveCols;\n return;\n }\n if (prevAlignedColsRef.current === effectiveCols) return;\n prevAlignedColsRef.current = effectiveCols;\n recompactForCols(effectiveCols);\n }, [aligned, effectiveCols, recompactForCols]);\n\n // Natural height this board wants: its rows at the (unshrunk) target row\n // height. When aligned rows are shrunk to fit a short container, this exceeds\n // the measured height by the amount the board was squeezed.\n const naturalHeight =\n rows > 0\n ? rows * parentRowHeight +\n Math.max(0, rows - 1) * effectiveMargin[1] +\n resolvedPadding[1] * 2\n : parentRowHeight;\n\n // Report this aligned board's height deficit to an auto-sizing host so the\n // host can both grow to fit and pin its resize floor. The value is signed:\n // positive when the board is squeezed (needs more height), negative when the\n // container is taller than needed (so the floor can be lowered). The host\n // never shrinks the widget on its own - it only grows and clamps resizing.\n const requestHeightDeficit = host?.requestHeightDeficit;\n useEffect(() => {\n if (!aligned || !host?.isAutoHeight || !requestHeightDeficit) return;\n if (measuredHeight <= 0) return;\n requestHeightDeficit(naturalHeight - measuredHeight);\n }, [\n aligned,\n host?.isAutoHeight,\n requestHeightDeficit,\n naturalHeight,\n measuredHeight,\n ]);\n\n // In-board resize orchestration.\n const resizeStateRef = useRef<{\n id: string;\n axis: ResizeHandleAxis;\n item: LayoutItem;\n origin: Position;\n accX: number;\n accY: number;\n } | null>(null);\n\n // Minimum rows each auto-height widget currently needs to fit its content.\n // Read during resize so a widget can never be dragged shorter than its\n // content, and used to grow the item when the content needs more room.\n const autoHeightMinRowsRef = useRef<Record<string, number>>({});\n\n const handleResize = useEvent(\n (\n id: string,\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => {\n const pp = liveRef.current.positionParams;\n\n if (phase === 'start') {\n const rawItem = getLayoutItem(layoutRef.current, id);\n if (!rawItem) return;\n // Layout-item constraints win; otherwise fall back to the ones declared\n // on the owning `Board.Widget` so `applySizeConstraints` picks them up.\n const item: LayoutItem = {\n ...rawItem,\n constraints:\n rawItem.constraints ?? registry.store.get(id)?.constraints,\n };\n resizeStateRef.current = {\n id,\n axis,\n item: { ...item },\n origin: calcGridItemPosition(pp, item.x, item.y, item.w, item.h),\n accX: 0,\n accY: 0,\n };\n setPlaceholder({ ...item });\n return;\n }\n\n const rs = resizeStateRef.current;\n if (!rs) return;\n\n if (phase === 'end') {\n applyLayout([...layoutRef.current], true);\n setPlaceholder(null);\n resizeStateRef.current = null;\n return;\n }\n\n rs.accX += dx;\n rs.accY += dy;\n\n const { origin, item, axis: handle } = rs;\n let newW = origin.width;\n let newH = origin.height;\n if (handle.includes('e')) newW = origin.width + rs.accX;\n if (handle.includes('w')) newW = origin.width - rs.accX;\n if (handle.includes('s')) newH = origin.height + rs.accY;\n if (handle.includes('n')) newH = origin.height - rs.accY;\n newW = Math.max(newW, 8);\n newH = Math.max(newH, 8);\n\n const raw = calcWH(pp, newW, newH, item.x, item.y, handle);\n const constrained = applySizeConstraints(\n liveRef.current.constraints,\n item,\n raw.w,\n raw.h,\n handle,\n {\n cols: pp.cols,\n maxRows: liveRef.current.maxRows,\n containerWidth: pp.containerWidth,\n containerHeight: liveRef.current.containerHeight,\n rowHeight: pp.rowHeight,\n margin: pp.margin,\n layout: layoutRef.current,\n },\n );\n\n // An auto-height widget cannot be resized shorter than the content it\n // hosts (a nested board) currently needs, so pin its height to the floor.\n const floorRows = autoHeightMinRowsRef.current[id] ?? 0;\n const finalW = constrained.w;\n const finalH = Math.max(constrained.h, floorRows);\n\n let x = item.x;\n let y = item.y;\n if (handle.includes('w')) x = item.x + item.w - finalW;\n if (handle.includes('n')) y = item.y + item.h - finalH;\n x = Math.max(0, x);\n y = Math.max(0, y);\n\n const newItem: LayoutItem = {\n ...item,\n x,\n y,\n w: finalW,\n h: finalH,\n };\n const working = modifyLayout(layoutRef.current, newItem);\n const compacted = [\n ...liveRef.current.compactor.compact(working, pp.cols),\n ];\n applyLayout(compacted, false);\n setPlaceholder(getLayoutItem(compacted, id) ?? newItem);\n },\n );\n\n // Record an auto-height widget's needed rows. Grow the item when its content\n // needs more height (only ever increases); the stored value is also the\n // resize floor enforced in `handleResize`.\n const handleAutoHeight = useEvent((id: string, neededRows: number) => {\n autoHeightMinRowsRef.current[id] = neededRows;\n const current = getLayoutItem(layoutRef.current, id);\n if (!current || neededRows <= current.h) return;\n const pp = liveRef.current.positionParams;\n const working = modifyLayout(layoutRef.current, {\n ...current,\n h: neededRows,\n });\n const compacted = [...liveRef.current.compactor.compact(working, pp.cols)];\n applyLayout(compacted, true);\n });\n\n const styles: Styles = extractStyles(otherProps, CONTAINER_STYLES);\n\n const dragState = registry.dragState;\n const ready = width > 0;\n\n const placeholderStyle = placeholder\n ? (() => {\n const pos = calcGridItemPosition(\n positionParams,\n placeholder.x,\n placeholder.y,\n placeholder.w,\n placeholder.h,\n );\n return {\n transform: `translate(${pos.left}px, ${pos.top}px)`,\n width: `${pos.width}px`,\n height: `${pos.height}px`,\n };\n })()\n : null;\n\n const showPlaceholder = placeholder && placeholderStyle;\n\n // Metrics this board exposes to any aligned boards nested inside its widgets.\n const boardMetrics = useMemo<BoardMetrics>(\n () => ({\n colWidth: calcGridColWidth(positionParams),\n rowHeight: positionParams.rowHeight,\n margin: positionParams.margin,\n containerPadding: positionParams.containerPadding,\n }),\n [positionParams],\n );\n\n return (\n <BoardMetricsContext.Provider value={boardMetrics}>\n <BoardElement\n {...filterBaseProps(otherProps, { eventProps: true })}\n ref={containerRef}\n styles={styles}\n // Non-aligned: use min-height (not a fixed height) so the board\n // auto-sizes to its content by default but can still grow to fill a\n // taller parent. Widgets are absolutely positioned, so growing never\n // shifts them, and the content layer (inset: 0) always covers the full\n // board -> the whole board is droppable. Aligned: omit the inline height\n // so the board fills (and is bounded by) the space the container grants,\n // which is what drives the reduced row height.\n style={aligned ? undefined : { minHeight: `${containerHeight}px` }}\n mods={{\n dragging: !!dragState,\n 'drop-target': dragState?.currentBoardId === boardId,\n }}\n >\n <ContentLayer ref={contentRef}>\n {ready\n ? layout.map((item) => {\n const registration = registry.store.get(item.i);\n const widgetDraggable =\n isDraggable &&\n registration?.isDraggable !== false &&\n item.isDraggable !== false &&\n !item.static;\n const widgetResizable =\n isResizable &&\n registration?.isResizable !== false &&\n item.isResizable !== false &&\n !item.static;\n const handles =\n item.resizeHandles ??\n registration?.resizeHandles ??\n resizeHandles;\n\n return (\n <WidgetHost\n key={item.i}\n boardId={boardId}\n item={item}\n positionParams={positionParams}\n registration={registration}\n isDraggable={widgetDraggable}\n isResizable={widgetResizable}\n resizeHandles={handles}\n registry={registry}\n dragState={dragState}\n onResize={handleResize}\n onAutoHeight={handleAutoHeight}\n />\n );\n })\n : null}\n {showPlaceholder ? (\n <PlaceholderElement aria-hidden=\"true\" style={placeholderStyle!} />\n ) : null}\n </ContentLayer>\n {children}\n </BoardElement>\n </BoardMetricsContext.Provider>\n );\n}\n\nconst BoardInnerForwarded = forwardRef(BoardInner);\n\n/**\n * A draggable and resizable widget grid. Widgets are declared with\n * `Board.Widget` and positioned via a `layout`. Wrap multiple boards in a\n * `BoardProvider` to enable dragging widgets between them.\n */\nexport const Board = forwardRef(function Board(\n props: CubeBoardProps,\n ref: React.ForwardedRef<HTMLDivElement>,\n) {\n const existingRegistry = useBoardRegistry();\n\n if (existingRegistry) {\n return <BoardInnerForwarded {...props} ref={ref} />;\n }\n\n return (\n <BoardProvider>\n <BoardInnerForwarded {...props} ref={ref} />\n </BoardProvider>\n );\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { BoardRegistryContext } from "./board-context.js";
3
3
  import { useBoardRegistry } from "./use-board-registry.js";
4
4
  import { tasty } from "@tenphi/tasty";
@@ -21,6 +21,12 @@ interface CubeBoardWidgetProps {
21
21
  qa?: string;
22
22
  /** Style overrides applied to the rendered widget element. */
23
23
  styles?: Styles;
24
+ /**
25
+ * Grow this widget's height in its board to fit its content (only ever
26
+ * increases). Pair with a nested `Board isAligned` to make the container
27
+ * expand until the inner board's rows fit at the parent's row height.
28
+ */
29
+ isAutoHeight?: boolean;
24
30
  }
25
31
  /**
26
32
  * Declares a widget's content and per-widget options. Rendering and positioning
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { useLayoutEffect as useLayoutEffect$1 } from "../../../utils/react/useLayoutEffect.js";
3
3
  import { useBoardRegistry } from "./board-context.js";
4
4
  import { useEffect, useRef } from "react";
@@ -10,7 +10,7 @@ import { useEffect, useRef } from "react";
10
10
  * which is what allows a widget to be transferred between boards.
11
11
  */
12
12
  function Widget(props) {
13
- const { id, children, isDraggable, isResizable, resizeHandles, constraints, qa, styles } = props;
13
+ const { id, children, isDraggable, isResizable, resizeHandles, constraints, qa, styles, isAutoHeight } = props;
14
14
  const registry = useBoardRegistry();
15
15
  const ownerRef = useRef({});
16
16
  useLayoutEffect$1(() => {
@@ -22,7 +22,8 @@ function Widget(props) {
22
22
  resizeHandles,
23
23
  constraints,
24
24
  qa,
25
- styles
25
+ styles,
26
+ isAutoHeight
26
27
  }, ownerRef.current);
27
28
  });
28
29
  useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"Widget.js","names":[],"sources":["../../../../src/components/layout/Board/Widget.tsx"],"sourcesContent":["import { Styles } from '@tenphi/tasty';\nimport { ReactNode, useEffect, useRef } from 'react';\n\nimport { useLayoutEffect } from '../../../utils/react';\n\nimport { useBoardRegistry } from './board-context';\nimport { LayoutConstraint, ResizeHandleAxis } from './grid-core';\n\nexport interface CubeBoardWidgetProps {\n /** Unique id, must match the `i` of a layout item in a `Board`. */\n id: string;\n /** Widget content. */\n children?: ReactNode;\n /** Disable dragging for this widget. */\n isDraggable?: boolean;\n /** Disable resizing for this widget. */\n isResizable?: boolean;\n /** Which resize handles to show (overrides the board default). */\n resizeHandles?: ResizeHandleAxis[];\n /** Per-widget layout constraints. */\n constraints?: LayoutConstraint[];\n /** Test id applied to the rendered widget element. */\n qa?: string;\n /** Style overrides applied to the rendered widget element. */\n styles?: Styles;\n}\n\n/**\n * Declares a widget's content and per-widget options. Rendering and positioning\n * are performed by the owning `Board` (the component itself renders nothing),\n * which is what allows a widget to be transferred between boards.\n */\nexport function Widget(props: CubeBoardWidgetProps) {\n const {\n id,\n children,\n isDraggable,\n isResizable,\n resizeHandles,\n constraints,\n qa,\n styles,\n } = props;\n const registry = useBoardRegistry();\n\n // Stable per-instance token so a stale unregister (from an unmounting copy of\n // this widget) can't wipe out a newer instance's registration.\n const ownerRef = useRef({});\n\n // Register/update content on every render so content stays fresh in the store.\n useLayoutEffect(() => {\n registry?.store.register(\n {\n id,\n content: children,\n isDraggable,\n isResizable,\n resizeHandles,\n constraints,\n qa,\n styles,\n },\n ownerRef.current,\n );\n });\n\n // Remove from the store on unmount.\n useEffect(() => {\n const owner = ownerRef.current;\n return () => {\n registry?.store.unregister(id, owner);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;AAgCA,SAAgB,OAAO,OAA6B;CAClD,MAAM,EACJ,IACA,UACA,aACA,aACA,eACA,aACA,IACA,WACE;CACJ,MAAM,WAAW,kBAAkB;CAInC,MAAM,WAAW,OAAO,EAAE,CAAC;AAG3B,yBAAsB;AACpB,YAAU,MAAM,SACd;GACE;GACA,SAAS;GACT;GACA;GACA;GACA;GACA;GACA;GACD,EACD,SAAS,QACV;GACD;AAGF,iBAAgB;EACd,MAAM,QAAQ,SAAS;AACvB,eAAa;AACX,aAAU,MAAM,WAAW,IAAI,MAAM;;IAGtC,CAAC,GAAG,CAAC;AAER,QAAO"}
1
+ {"version":3,"file":"Widget.js","names":[],"sources":["../../../../src/components/layout/Board/Widget.tsx"],"sourcesContent":["import { Styles } from '@tenphi/tasty';\nimport { ReactNode, useEffect, useRef } from 'react';\n\nimport { useLayoutEffect } from '../../../utils/react';\n\nimport { useBoardRegistry } from './board-context';\nimport { LayoutConstraint, ResizeHandleAxis } from './grid-core';\n\nexport interface CubeBoardWidgetProps {\n /** Unique id, must match the `i` of a layout item in a `Board`. */\n id: string;\n /** Widget content. */\n children?: ReactNode;\n /** Disable dragging for this widget. */\n isDraggable?: boolean;\n /** Disable resizing for this widget. */\n isResizable?: boolean;\n /** Which resize handles to show (overrides the board default). */\n resizeHandles?: ResizeHandleAxis[];\n /** Per-widget layout constraints. */\n constraints?: LayoutConstraint[];\n /** Test id applied to the rendered widget element. */\n qa?: string;\n /** Style overrides applied to the rendered widget element. */\n styles?: Styles;\n /**\n * Grow this widget's height in its board to fit its content (only ever\n * increases). Pair with a nested `Board isAligned` to make the container\n * expand until the inner board's rows fit at the parent's row height.\n */\n isAutoHeight?: boolean;\n}\n\n/**\n * Declares a widget's content and per-widget options. Rendering and positioning\n * are performed by the owning `Board` (the component itself renders nothing),\n * which is what allows a widget to be transferred between boards.\n */\nexport function Widget(props: CubeBoardWidgetProps) {\n const {\n id,\n children,\n isDraggable,\n isResizable,\n resizeHandles,\n constraints,\n qa,\n styles,\n isAutoHeight,\n } = props;\n const registry = useBoardRegistry();\n\n // Stable per-instance token so a stale unregister (from an unmounting copy of\n // this widget) can't wipe out a newer instance's registration.\n const ownerRef = useRef({});\n\n // Register/update content on every render so content stays fresh in the store.\n useLayoutEffect(() => {\n registry?.store.register(\n {\n id,\n content: children,\n isDraggable,\n isResizable,\n resizeHandles,\n constraints,\n qa,\n styles,\n isAutoHeight,\n },\n ownerRef.current,\n );\n });\n\n // Remove from the store on unmount.\n useEffect(() => {\n const owner = ownerRef.current;\n return () => {\n registry?.store.unregister(id, owner);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;AAsCA,SAAgB,OAAO,OAA6B;CAClD,MAAM,EACJ,IACA,UACA,aACA,aACA,eACA,aACA,IACA,QACA,iBACE;CACJ,MAAM,WAAW,kBAAkB;CAInC,MAAM,WAAW,OAAO,EAAE,CAAC;AAG3B,yBAAsB;AACpB,YAAU,MAAM,SACd;GACE;GACA,SAAS;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACD,EACD,SAAS,QACV;GACD;AAGF,iBAAgB;EACd,MAAM,QAAQ,SAAS;AACvB,eAAa;AACX,aAAU,MAAM,WAAW,IAAI,MAAM;;IAGtC,CAAC,GAAG,CAAC;AAER,QAAO"}
@@ -1,13 +1,20 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-3cf647a | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-ea72271 | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
+ import { useEvent } from "../../../_internal/hooks/use-event.js";
4
+ import { BoardHostContext } from "./board-context.js";
3
5
  import { calcGridColWidth, calcGridItemPosition } from "./grid-core/calculate.js";
4
6
  import { tasty } from "@tenphi/tasty";
5
- import { useRef, useState } from "react";
7
+ import { useMemo, useRef, useState } from "react";
6
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
9
  import { useFocusWithin, useHover, useMove } from "react-aria";
8
10
  import { createPortal } from "react-dom";
9
11
 
10
12
  //#region src/components/layout/Board/WidgetHost.tsx
13
+ /**
14
+ * Slack (px) absorbed when converting an auto-height widget's content height to
15
+ * whole rows, so sub-pixel measurement/rounding noise never bumps an extra row.
16
+ */
17
+ const AUTO_HEIGHT_TOLERANCE = 4;
11
18
  const WidgetElement = tasty({
12
19
  qa: "BoardWidget",
13
20
  styles: {
@@ -19,7 +26,7 @@ const WidgetElement = tasty({
19
26
  border: true,
20
27
  shadow: {
21
28
  "": false,
22
- "drag | resizing": "0 2x 4x #dark.20"
29
+ "drag | resizing": "$dialog-shadow"
23
30
  },
24
31
  zIndex: {
25
32
  "": 1,
@@ -175,9 +182,22 @@ function ResizeHandle({ axis, onResize }) {
175
182
  * renders into the shared overlay portal so it can float outside its board.
176
183
  */
177
184
  function WidgetHost(props) {
178
- const { boardId, item, positionParams, registration, isDraggable, isResizable, resizeHandles, registry, dragState, onResize } = props;
185
+ const { boardId, item, positionParams, registration, isDraggable, isResizable, resizeHandles, registry, dragState, onResize, onAutoHeight } = props;
179
186
  const hostRef = useRef(null);
180
187
  const isActiveDrag = dragState?.itemId === item.i;
188
+ const isAutoHeight = registration?.isAutoHeight === true;
189
+ const requestHeightDeficit = useEvent((deficitPx) => {
190
+ if (!isAutoHeight || isActiveDrag) return;
191
+ const step = positionParams.rowHeight + positionParams.margin[1];
192
+ if (step <= 0) return;
193
+ const neededPx = calcGridItemPosition(positionParams, item.x, item.y, item.w, item.h).height + deficitPx;
194
+ const neededRows = Math.max(1, Math.ceil((neededPx + positionParams.margin[1] - AUTO_HEIGHT_TOLERANCE) / step));
195
+ onAutoHeight(item.i, neededRows);
196
+ });
197
+ const hostValue = useMemo(() => ({
198
+ isAutoHeight,
199
+ requestHeightDeficit
200
+ }), [isAutoHeight, requestHeightDeficit]);
181
201
  const useOverlay = isActiveDrag && dragState?.pointerType !== "keyboard";
182
202
  const [isResizing, setIsResizing] = useState(false);
183
203
  const [isFocusWithin, setIsFocusWithin] = useState(false);
@@ -200,7 +220,7 @@ function WidgetHost(props) {
200
220
  width: pos.width,
201
221
  height: pos.height
202
222
  };
203
- registry.onDragStart(boardId, item.i, vr, e.pointerType);
223
+ registry.onDragStart(boardId, item.i, vr, e.pointerType, hostRef.current);
204
224
  },
205
225
  onMove(e) {
206
226
  if (!isDraggable) return;
@@ -233,14 +253,17 @@ function WidgetHost(props) {
233
253
  static: !!item.static,
234
254
  resizing: isResizing
235
255
  };
236
- const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [registration?.content, isResizable && !item.static ? /* @__PURE__ */ jsxs(Fragment$1, { children: [resizeHandles.map((axis) => /* @__PURE__ */ jsx(ResizeHandle, {
237
- axis,
238
- onResize: handleResize
239
- }, axis)), resizeHandles.filter(isCornerAxis).map((axis) => /* @__PURE__ */ jsx(GripElement, {
240
- "data-axis": axis,
241
- mods: { revealed: gripsRevealed },
242
- "aria-hidden": "true"
243
- }, `grip-${axis}`))] }) : null] });
256
+ const content = /* @__PURE__ */ jsxs(BoardHostContext.Provider, {
257
+ value: hostValue,
258
+ children: [registration?.content, isResizable && !item.static ? /* @__PURE__ */ jsxs(Fragment$1, { children: [resizeHandles.map((axis) => /* @__PURE__ */ jsx(ResizeHandle, {
259
+ axis,
260
+ onResize: handleResize
261
+ }, axis)), resizeHandles.filter(isCornerAxis).map((axis) => /* @__PURE__ */ jsx(GripElement, {
262
+ "data-axis": axis,
263
+ mods: { revealed: gripsRevealed },
264
+ "aria-hidden": "true"
265
+ }, `grip-${axis}`))] }) : null]
266
+ });
244
267
  const pos = calcGridItemPosition(positionParams, item.x, item.y, item.w, item.h);
245
268
  const overlayNode = registry.overlayRef.current;
246
269
  const floatInOverlay = useOverlay && !!overlayNode && !!dragState;