@cube-dev/ui-kit 0.0.0-canary-73fed1d → 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 (457) 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 +130 -52
  166. package/dist/components/layout/Board/Board.js.map +1 -1
  167. package/dist/components/layout/Board/BoardProvider.d.ts +7 -0
  168. package/dist/components/layout/Board/BoardProvider.js +3 -3
  169. package/dist/components/layout/Board/BoardProvider.js.map +1 -1
  170. package/dist/components/layout/Board/Widget.d.ts +6 -0
  171. package/dist/components/layout/Board/Widget.js +4 -3
  172. package/dist/components/layout/Board/Widget.js.map +1 -1
  173. package/dist/components/layout/Board/WidgetHost.js +71 -39
  174. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  175. package/dist/components/layout/Board/board-context.d.ts +16 -0
  176. package/dist/components/layout/Board/board-context.js +10 -2
  177. package/dist/components/layout/Board/board-context.js.map +1 -1
  178. package/dist/components/layout/Board/board-store.d.ts +3 -0
  179. package/dist/components/layout/Board/board-store.js +2 -2
  180. package/dist/components/layout/Board/board-store.js.map +1 -1
  181. package/dist/components/layout/Board/grid-core/calculate.js +2 -2
  182. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  183. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  184. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  185. package/dist/components/layout/Board/grid-core/layout.js +23 -2
  186. package/dist/components/layout/Board/grid-core/layout.js.map +1 -1
  187. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  188. package/dist/components/layout/Board/index.d.ts +1 -0
  189. package/dist/components/layout/Board/index.js +1 -1
  190. package/dist/components/layout/Board/index.js.map +1 -1
  191. package/dist/components/layout/Board/use-board-layout.js +1 -1
  192. package/dist/components/layout/Board/use-board-registry.js +123 -31
  193. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  194. package/dist/components/layout/Flex.js +1 -1
  195. package/dist/components/layout/Flow.js +1 -1
  196. package/dist/components/layout/Grid.js +1 -1
  197. package/dist/components/layout/Panel.js +1 -1
  198. package/dist/components/layout/Prefix.js +1 -1
  199. package/dist/components/layout/ResizablePanel.js +1 -1
  200. package/dist/components/layout/Space.js +1 -1
  201. package/dist/components/layout/Suffix.js +1 -1
  202. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  203. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  204. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  205. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  206. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  207. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  208. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  209. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  210. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  211. package/dist/components/navigation/Tabs/styled.js +1 -1
  212. package/dist/components/navigation/Tabs/types.js +1 -1
  213. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  214. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  215. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  216. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  217. package/dist/components/other/Calendar/Calendar.js +1 -1
  218. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  219. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  220. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  221. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  222. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  223. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  224. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  225. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  226. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  227. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  228. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  229. package/dist/components/overlays/Dialog/context.js +1 -1
  230. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  231. package/dist/components/overlays/Modal/Modal.js +1 -1
  232. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  233. package/dist/components/overlays/Modal/Overlay.js +1 -1
  234. package/dist/components/overlays/Modal/Popover.js +1 -1
  235. package/dist/components/overlays/Modal/Tray.js +1 -1
  236. package/dist/components/overlays/Modal/Underlay.js +1 -1
  237. package/dist/components/overlays/Notifications/Notification.js +1 -1
  238. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  239. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  240. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  241. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  242. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  243. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  244. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  245. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  246. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  247. package/dist/components/overlays/Notifications/index.js +1 -1
  248. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  249. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  250. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  251. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  252. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  253. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  254. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  255. package/dist/components/overlays/Toast/index.js +1 -1
  256. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  257. package/dist/components/overlays/Toast/useToast.js +1 -1
  258. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  259. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  260. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  261. package/dist/components/overlays/Tooltip/context.js +1 -1
  262. package/dist/components/portal/Portal.js +1 -1
  263. package/dist/components/portal/PortalProvider.js +1 -1
  264. package/dist/components/portal/usePortal.js +1 -1
  265. package/dist/components/shared/DraggableCollection.js +1 -1
  266. package/dist/components/shared/InvalidIcon.js +1 -1
  267. package/dist/components/shared/ValidIcon.js +1 -1
  268. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  269. package/dist/components/status/Spin/Cube.js +1 -1
  270. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  271. package/dist/components/status/Spin/Spin.js +1 -1
  272. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  273. package/dist/data/item-themes.js +1 -1
  274. package/dist/data/themes.js +1 -1
  275. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  276. package/dist/icons/AdjustmentsIcon.js +1 -1
  277. package/dist/icons/AiIcon.js +1 -1
  278. package/dist/icons/AreaChartIcon.js +1 -1
  279. package/dist/icons/BackwardIcon.js +1 -1
  280. package/dist/icons/BarChartIcon.js +1 -1
  281. package/dist/icons/BellFilledIcon.js +1 -1
  282. package/dist/icons/BellIcon.js +1 -1
  283. package/dist/icons/BooleanIcon.js +1 -1
  284. package/dist/icons/CalendarEditIcon.js +1 -1
  285. package/dist/icons/CalendarIcon.js +1 -1
  286. package/dist/icons/CaretDownIcon.js +1 -1
  287. package/dist/icons/CaretUpIcon.js +1 -1
  288. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  289. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  290. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  291. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  292. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  293. package/dist/icons/ChartBarLineIcon.js +1 -1
  294. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  295. package/dist/icons/ChartBarStackedIcon.js +1 -1
  296. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  297. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  298. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  299. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  300. package/dist/icons/ChartBubbleIcon.js +1 -1
  301. package/dist/icons/ChartDonut2Icon.js +1 -1
  302. package/dist/icons/ChartFunnelIcon.js +1 -1
  303. package/dist/icons/ChartHeatmapIcon.js +1 -1
  304. package/dist/icons/ChartKPIIcon.js +1 -1
  305. package/dist/icons/ChartPie2Icon.js +1 -1
  306. package/dist/icons/ChartScatterIcon.js +1 -1
  307. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  308. package/dist/icons/CheckCircleIcon.js +1 -1
  309. package/dist/icons/CheckIcon.js +1 -1
  310. package/dist/icons/CircleFilledIcon.js +1 -1
  311. package/dist/icons/ClearIcon.js +1 -1
  312. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  313. package/dist/icons/CloseCircleIcon.js +1 -1
  314. package/dist/icons/CloseIcon.js +1 -1
  315. package/dist/icons/CodeIcon.js +1 -1
  316. package/dist/icons/ColumnTotalIcon.js +1 -1
  317. package/dist/icons/CopyIcon.js +1 -1
  318. package/dist/icons/CountIcon.js +1 -1
  319. package/dist/icons/CubeIcon.js +1 -1
  320. package/dist/icons/CubePauseIcon.js +1 -1
  321. package/dist/icons/CubePlayIcon.js +1 -1
  322. package/dist/icons/CurrencyDollarIcon.js +1 -1
  323. package/dist/icons/DangerIcon.js +1 -1
  324. package/dist/icons/DashboardIcon.js +1 -1
  325. package/dist/icons/DatabaseIcon.js +1 -1
  326. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  327. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  328. package/dist/icons/DirectionIcon.js +1 -1
  329. package/dist/icons/DonutIcon.js +1 -1
  330. package/dist/icons/DownIcon.js +1 -1
  331. package/dist/icons/EditIcon.js +1 -1
  332. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  333. package/dist/icons/ExclamationCircleIcon.js +1 -1
  334. package/dist/icons/ExclamationIcon.js +1 -1
  335. package/dist/icons/EyeIcon.js +1 -1
  336. package/dist/icons/EyeInvisibleIcon.js +1 -1
  337. package/dist/icons/FilterIcon.js +1 -1
  338. package/dist/icons/FolderFilledIcon.js +1 -1
  339. package/dist/icons/FolderIcon.js +1 -1
  340. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  341. package/dist/icons/FolderOpenIcon.js +1 -1
  342. package/dist/icons/ForwardIcon.js +1 -1
  343. package/dist/icons/GripVerticalIcon.js +1 -1
  344. package/dist/icons/HierarchyIcon.js +1 -1
  345. package/dist/icons/HierarchyOpenIcon.js +1 -1
  346. package/dist/icons/Icon.js +1 -1
  347. package/dist/icons/InfoCircleIcon.js +1 -1
  348. package/dist/icons/InfoIcon.js +1 -1
  349. package/dist/icons/KeyIcon.js +1 -1
  350. package/dist/icons/LeftIcon.js +1 -1
  351. package/dist/icons/LineChartIcon.js +1 -1
  352. package/dist/icons/LoadingIcon.js +1 -1
  353. package/dist/icons/LockFilledIcon.js +1 -1
  354. package/dist/icons/LockIcon.js +1 -1
  355. package/dist/icons/MoreIcon.js +1 -1
  356. package/dist/icons/NotAllowedIcon.js +1 -1
  357. package/dist/icons/Number123Icon.js +1 -1
  358. package/dist/icons/NumberIcon.js +1 -1
  359. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  360. package/dist/icons/PauseCircleIcon.js +1 -1
  361. package/dist/icons/PauseIcon.js +1 -1
  362. package/dist/icons/PercentageIcon.js +1 -1
  363. package/dist/icons/PieChartIcon.js +1 -1
  364. package/dist/icons/PlayCircleIcon.js +1 -1
  365. package/dist/icons/PlayIcon.js +1 -1
  366. package/dist/icons/PlusIcon.js +1 -1
  367. package/dist/icons/ProgressBarIcon.js +1 -1
  368. package/dist/icons/ReloadIcon.js +1 -1
  369. package/dist/icons/ReportIcon.js +1 -1
  370. package/dist/icons/ReturnIcon.js +1 -1
  371. package/dist/icons/RightIcon.js +1 -1
  372. package/dist/icons/RowTotalsIcon.js +1 -1
  373. package/dist/icons/SchemeIcon.js +1 -1
  374. package/dist/icons/SearchIcon.js +1 -1
  375. package/dist/icons/SemanticQueryIcon.js +1 -1
  376. package/dist/icons/SettingsIcon.js +1 -1
  377. package/dist/icons/ShieldFilledIcon.js +1 -1
  378. package/dist/icons/ShieldIcon.js +1 -1
  379. package/dist/icons/SlashIcon.js +1 -1
  380. package/dist/icons/SparklesIcon.js +1 -1
  381. package/dist/icons/SqlIcon.js +1 -1
  382. package/dist/icons/StatsIcon.js +1 -1
  383. package/dist/icons/StopIcon.js +1 -1
  384. package/dist/icons/StringIcon.js +1 -1
  385. package/dist/icons/SubtotalsIcon.js +1 -1
  386. package/dist/icons/SwitchIcon.js +1 -1
  387. package/dist/icons/TableIcon.js +1 -1
  388. package/dist/icons/ThumbsDownIcon.js +1 -1
  389. package/dist/icons/ThumbsUpIcon.js +1 -1
  390. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  391. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  392. package/dist/icons/ThunderboltIcon.js +1 -1
  393. package/dist/icons/TimeIcon.js +1 -1
  394. package/dist/icons/TrashIcon.js +1 -1
  395. package/dist/icons/UnlockIcon.js +1 -1
  396. package/dist/icons/UpIcon.js +1 -1
  397. package/dist/icons/UserGroupIcon.js +1 -1
  398. package/dist/icons/UserIcon.js +1 -1
  399. package/dist/icons/UserLockIcon.js +1 -1
  400. package/dist/icons/ViewIcon.js +1 -1
  401. package/dist/icons/WarningFilledIcon.js +1 -1
  402. package/dist/icons/WarningIcon.js +1 -1
  403. package/dist/icons/wrap-icon.js +1 -1
  404. package/dist/index.d.ts +2 -1
  405. package/dist/index.js +1 -1
  406. package/dist/index.js.map +1 -1
  407. package/dist/provider.js +1 -1
  408. package/dist/providers/TrackingProvider.js +1 -1
  409. package/dist/providers/navigationAdapter.default.js +1 -1
  410. package/dist/tokens/base.js +1 -1
  411. package/dist/tokens/colors.js +1 -1
  412. package/dist/tokens/index.js +1 -1
  413. package/dist/tokens/layout.js +1 -1
  414. package/dist/tokens/palette.js +1 -1
  415. package/dist/tokens/shadows.js +1 -1
  416. package/dist/tokens/sizes.js +1 -1
  417. package/dist/tokens/spacing.js +1 -1
  418. package/dist/tokens/typography.js +1 -1
  419. package/dist/utils/ResizeSensor.js +1 -1
  420. package/dist/utils/is-dev-env.js +1 -1
  421. package/dist/utils/modules.js +1 -1
  422. package/dist/utils/promise.js +1 -1
  423. package/dist/utils/raf.js +1 -1
  424. package/dist/utils/random.js +1 -1
  425. package/dist/utils/range.js +1 -1
  426. package/dist/utils/react/RenderCache.js +1 -1
  427. package/dist/utils/react/Slots.js +1 -1
  428. package/dist/utils/react/chain.js +1 -1
  429. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  430. package/dist/utils/react/index.js +1 -1
  431. package/dist/utils/react/interactions.js +1 -1
  432. package/dist/utils/react/isTextOnly.js +1 -1
  433. package/dist/utils/react/mapProps.js +1 -1
  434. package/dist/utils/react/mergeProps.js +1 -1
  435. package/dist/utils/react/nullableValue.js +1 -1
  436. package/dist/utils/react/resolveIcon.js +1 -1
  437. package/dist/utils/react/sharedStore.js +1 -1
  438. package/dist/utils/react/useCombinedRefs.js +1 -1
  439. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  440. package/dist/utils/react/useEventBus.js +1 -1
  441. package/dist/utils/react/useId.js +1 -1
  442. package/dist/utils/react/useIsDarwin.js +1 -1
  443. package/dist/utils/react/useKeySymbols.js +1 -1
  444. package/dist/utils/react/useLayoutEffect.js +1 -1
  445. package/dist/utils/react/useLocalStorage.js +1 -1
  446. package/dist/utils/react/useMergeStyles.js +1 -1
  447. package/dist/utils/react/usePopoverSync.js +1 -1
  448. package/dist/utils/react/useQaProps.js +1 -1
  449. package/dist/utils/react/useViewportSize.js +1 -1
  450. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  451. package/dist/utils/selection.js +1 -1
  452. package/dist/utils/styles.js +1 -1
  453. package/dist/utils/tree.js +1 -1
  454. package/dist/utils/warnings.js +1 -1
  455. package/dist/version.js +2 -2
  456. package/docs/components/layout/Board.md +28 -1
  457. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-73fed1d | 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-73fed1d | 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-73fed1d | 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-73fed1d | 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-73fed1d | 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-73fed1d | 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";
@@ -22,6 +22,8 @@ const BoardElement = tasty({
22
22
  position: "relative",
23
23
  display: "block",
24
24
  width: "100%",
25
+ flexGrow: 1,
26
+ minHeight: "0",
25
27
  fill: "#clear",
26
28
  boxSizing: "border-box"
27
29
  }
@@ -45,22 +47,34 @@ const PlaceholderElement = tasty({
45
47
  boxSizing: "border-box"
46
48
  }
47
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;
48
55
  function compactTypeToCore(compact) {
49
56
  if (compact === "free") return null;
50
57
  return compact;
51
58
  }
52
59
  function BoardInner(props, ref) {
53
- 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;
54
61
  const registry = useBoardRegistry();
62
+ const parentMetrics = useBoardMetrics();
63
+ const host = useBoardHost();
64
+ const aligned = isAligned && !!parentMetrics;
55
65
  const generatedId = useId();
56
66
  const boardId = providedId ?? generatedId;
57
67
  const containerRef = useCombinedRefs(ref);
58
68
  const contentRef = useRef(null);
59
69
  const [measuredWidth, setMeasuredWidth] = useState(0);
70
+ const [measuredHeight, setMeasuredHeight] = useState(0);
60
71
  const width = providedWidth ?? measuredWidth;
61
72
  const onResizeContainer = useEvent(() => {
62
73
  const el = containerRef.current;
63
- if (el) setMeasuredWidth(el.offsetWidth);
74
+ if (el) {
75
+ setMeasuredWidth(el.offsetWidth);
76
+ setMeasuredHeight(el.offsetHeight);
77
+ }
64
78
  });
65
79
  useResizeObserver({
66
80
  ref: containerRef,
@@ -75,22 +89,30 @@ function BoardInner(props, ref) {
75
89
  onLayoutChange
76
90
  });
77
91
  useSyncExternalStore(registry.store.subscribe, registry.store.getVersion);
78
- 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;
79
101
  const positionParams = useMemo(() => ({
80
- margin,
102
+ margin: effectiveMargin,
81
103
  containerPadding: resolvedPadding,
82
- containerWidth: width,
83
- cols,
84
- rowHeight,
104
+ containerWidth: effectiveContainerWidth,
105
+ cols: effectiveCols,
106
+ rowHeight: effectiveRowHeight,
85
107
  maxRows
86
108
  }), [
87
- margin[0],
88
- margin[1],
109
+ effectiveMargin[0],
110
+ effectiveMargin[1],
89
111
  resolvedPadding[0],
90
112
  resolvedPadding[1],
91
- width,
92
- cols,
93
- rowHeight,
113
+ effectiveContainerWidth,
114
+ effectiveCols,
115
+ effectiveRowHeight,
94
116
  maxRows
95
117
  ]);
96
118
  const compactor = useMemo(() => {
@@ -102,8 +124,8 @@ function BoardInner(props, ref) {
102
124
  preventCollision
103
125
  ]);
104
126
  const resolvedConstraints = constraints ?? defaultConstraints;
105
- const rows = Math.max(bottom(layout), placeholder ? placeholder.y + placeholder.h : 0);
106
- 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;
107
129
  const liveRef = useRef({
108
130
  positionParams,
109
131
  compactor,
@@ -142,7 +164,39 @@ function BoardInner(props, ref) {
142
164
  entry.id = boardId;
143
165
  return registry.registerBoard(entry);
144
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
+ ]);
145
198
  const resizeStateRef = useRef(null);
199
+ const autoHeightMinRowsRef = useRef({});
146
200
  const handleResize = useEvent((id, axis, phase, dx, dy) => {
147
201
  const pp = liveRef.current.positionParams;
148
202
  if (phase === "start") {
@@ -192,24 +246,38 @@ function BoardInner(props, ref) {
192
246
  margin: pp.margin,
193
247
  layout: layoutRef.current
194
248
  });
249
+ const floorRows = autoHeightMinRowsRef.current[id] ?? 0;
250
+ const finalW = constrained.w;
251
+ const finalH = Math.max(constrained.h, floorRows);
195
252
  let x = item.x;
196
253
  let y = item.y;
197
- if (handle.includes("w")) x = item.x + item.w - constrained.w;
198
- 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;
199
256
  x = Math.max(0, x);
200
257
  y = Math.max(0, y);
201
258
  const newItem = {
202
259
  ...item,
203
260
  x,
204
261
  y,
205
- w: constrained.w,
206
- h: constrained.h
262
+ w: finalW,
263
+ h: finalH
207
264
  };
208
265
  const working = modifyLayout(layoutRef.current, newItem);
209
266
  const compacted = [...liveRef.current.compactor.compact(working, pp.cols)];
210
267
  applyLayout(compacted, false);
211
268
  setPlaceholder(getLayoutItem(compacted, id) ?? newItem);
212
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
+ });
213
281
  const styles = extractStyles(otherProps, CONTAINER_STYLES);
214
282
  const dragState = registry.dragState;
215
283
  const ready = width > 0;
@@ -222,36 +290,46 @@ function BoardInner(props, ref) {
222
290
  };
223
291
  })() : null;
224
292
  const showPlaceholder = placeholder && placeholderStyle;
225
- return /* @__PURE__ */ jsxs(BoardElement, {
226
- ...filterBaseProps(otherProps, { eventProps: true }),
227
- ref: containerRef,
228
- styles,
229
- style: { minHeight: `${containerHeight}px` },
230
- mods: {
231
- dragging: !!dragState,
232
- "drop-target": dragState?.currentBoardId === boardId
233
- },
234
- children: [/* @__PURE__ */ jsxs(ContentLayer, {
235
- ref: contentRef,
236
- children: [ready ? layout.map((item) => {
237
- const registration = registry.store.get(item.i);
238
- return /* @__PURE__ */ jsx(WidgetHost, {
239
- boardId,
240
- item,
241
- positionParams,
242
- registration,
243
- isDraggable: isDraggable && registration?.isDraggable !== false && item.isDraggable !== false && !item.static,
244
- isResizable: isResizable && registration?.isResizable !== false && item.isResizable !== false && !item.static,
245
- resizeHandles: item.resizeHandles ?? registration?.resizeHandles ?? resizeHandles,
246
- registry,
247
- dragState,
248
- onResize: handleResize
249
- }, item.i);
250
- }) : null, showPlaceholder ? /* @__PURE__ */ jsx(PlaceholderElement, {
251
- "aria-hidden": "true",
252
- style: placeholderStyle
253
- }) : null]
254
- }), 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
+ })
255
333
  });
256
334
  }
257
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 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,10 +1,17 @@
1
1
 
2
+ import { WidgetTransferInfo } from "./board-context.js";
2
3
  import { ReactNode } from "react";
3
4
  import * as react_jsx_runtime0 from "react/jsx-runtime";
4
5
 
5
6
  //#region src/components/layout/Board/BoardProvider.d.ts
6
7
  interface CubeBoardProviderProps {
7
8
  children?: ReactNode;
9
+ /**
10
+ * Fired when a widget is dropped from one board into another. Use it to move
11
+ * the widget's `Board.Widget` declaration into the destination container when
12
+ * the source container can unmount (e.g. an inactive `Tab`).
13
+ */
14
+ onWidgetTransfer?: (info: WidgetTransferInfo) => void;
8
15
  }
9
16
  /**
10
17
  * Shares a single drag context across multiple `Board`s so widgets can be
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-73fed1d | 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";
@@ -28,8 +28,8 @@ const OverlayElement = tasty({
28
28
  * boards in a `BoardProvider` only when you need cross-board dragging.
29
29
  */
30
30
  function BoardProvider(props) {
31
- const { children } = props;
32
- const registry = useBoardRegistry();
31
+ const { children, onWidgetTransfer } = props;
32
+ const registry = useBoardRegistry({ onWidgetTransfer });
33
33
  return /* @__PURE__ */ jsxs(BoardRegistryContext.Provider, {
34
34
  value: registry,
35
35
  children: [children, /* @__PURE__ */ jsx(OverlayElement, {
@@ -1 +1 @@
1
- {"version":3,"file":"BoardProvider.js","names":[],"sources":["../../../../src/components/layout/Board/BoardProvider.tsx"],"sourcesContent":["import { tasty } from '@tenphi/tasty';\nimport { ReactNode } from 'react';\n\nimport { BoardRegistryContext } from './board-context';\nimport { useBoardRegistry } from './use-board-registry';\n\nconst OverlayElement = tasty({\n qa: 'BoardDragOverlay',\n styles: {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 999999,\n pointerEvents: 'none',\n overflow: 'visible',\n },\n});\n\nexport interface CubeBoardProviderProps {\n children?: ReactNode;\n}\n\n/**\n * Shares a single drag context across multiple `Board`s so widgets can be\n * dragged from one board to another (including out of a nested board into its\n * parent). Also hosts the fixed drag overlay used to render the dragged widget\n * above everything, so ancestor `overflow: hidden` never clips it.\n *\n * A standalone `Board` provides its own registry automatically; wrap several\n * boards in a `BoardProvider` only when you need cross-board dragging.\n */\nexport function BoardProvider(props: CubeBoardProviderProps) {\n const { children } = props;\n const registry = useBoardRegistry();\n\n return (\n <BoardRegistryContext.Provider value={registry}>\n {children}\n <OverlayElement ref={registry.overlayRef} aria-hidden=\"true\" />\n </BoardRegistryContext.Provider>\n );\n}\n"],"mappings":";;;;;;;AAMA,MAAM,iBAAiB,MAAM;CAC3B,IAAI;CACJ,QAAQ;EACN,UAAU;EACV,KAAK;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,eAAe;EACf,UAAU;EACX;CACF,CAAC;;;;;;;;;;AAeF,SAAgB,cAAc,OAA+B;CAC3D,MAAM,EAAE,aAAa;CACrB,MAAM,WAAW,kBAAkB;AAEnC,QACE,qBAAC,qBAAqB;EAAS,OAAO;aACnC,UACD,oBAAC;GAAe,KAAK,SAAS;GAAY,eAAY;IAAS;GACjC"}
1
+ {"version":3,"file":"BoardProvider.js","names":[],"sources":["../../../../src/components/layout/Board/BoardProvider.tsx"],"sourcesContent":["import { tasty } from '@tenphi/tasty';\nimport { ReactNode } from 'react';\n\nimport { BoardRegistryContext, WidgetTransferInfo } from './board-context';\nimport { useBoardRegistry } from './use-board-registry';\n\nconst OverlayElement = tasty({\n qa: 'BoardDragOverlay',\n styles: {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 999999,\n pointerEvents: 'none',\n overflow: 'visible',\n },\n});\n\nexport interface CubeBoardProviderProps {\n children?: ReactNode;\n /**\n * Fired when a widget is dropped from one board into another. Use it to move\n * the widget's `Board.Widget` declaration into the destination container when\n * the source container can unmount (e.g. an inactive `Tab`).\n */\n onWidgetTransfer?: (info: WidgetTransferInfo) => void;\n}\n\n/**\n * Shares a single drag context across multiple `Board`s so widgets can be\n * dragged from one board to another (including out of a nested board into its\n * parent). Also hosts the fixed drag overlay used to render the dragged widget\n * above everything, so ancestor `overflow: hidden` never clips it.\n *\n * A standalone `Board` provides its own registry automatically; wrap several\n * boards in a `BoardProvider` only when you need cross-board dragging.\n */\nexport function BoardProvider(props: CubeBoardProviderProps) {\n const { children, onWidgetTransfer } = props;\n const registry = useBoardRegistry({ onWidgetTransfer });\n\n return (\n <BoardRegistryContext.Provider value={registry}>\n {children}\n <OverlayElement ref={registry.overlayRef} aria-hidden=\"true\" />\n </BoardRegistryContext.Provider>\n );\n}\n"],"mappings":";;;;;;;AAMA,MAAM,iBAAiB,MAAM;CAC3B,IAAI;CACJ,QAAQ;EACN,UAAU;EACV,KAAK;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,QAAQ;EACR,eAAe;EACf,UAAU;EACX;CACF,CAAC;;;;;;;;;;AAqBF,SAAgB,cAAc,OAA+B;CAC3D,MAAM,EAAE,UAAU,qBAAqB;CACvC,MAAM,WAAW,iBAAiB,EAAE,kBAAkB,CAAC;AAEvD,QACE,qBAAC,qBAAqB;EAAS,OAAO;aACnC,UACD,oBAAC;GAAe,KAAK,SAAS;GAAY,eAAY;IAAS;GACjC"}
@@ -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-73fed1d | 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"}