@cube-dev/ui-kit 0.0.0-canary-6be6cbe → 0.0.0-canary-7ec55ba

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 (542) 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 +3 -4
  16. package/dist/components/Root.js.map +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +2 -4
  19. package/dist/components/actions/Banner/Banner.js.map +1 -1
  20. package/dist/components/actions/Button/Button.js +1 -1
  21. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  22. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  23. package/dist/components/actions/ButtonSplit/context.js +1 -1
  24. package/dist/components/actions/CommandMenu/CommandMenu.js +2 -4
  25. package/dist/components/actions/CommandMenu/CommandMenu.js.map +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  28. package/dist/components/actions/ItemActionContext.js +1 -1
  29. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  30. package/dist/components/actions/Link/Link.js +1 -1
  31. package/dist/components/actions/Menu/Menu.js +1 -1
  32. package/dist/components/actions/Menu/MenuItem.js +1 -1
  33. package/dist/components/actions/Menu/MenuSection.js +1 -1
  34. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  36. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  37. package/dist/components/actions/Menu/context.js +1 -1
  38. package/dist/components/actions/Menu/styled.js +1 -1
  39. package/dist/components/actions/index.js +1 -1
  40. package/dist/components/actions/use-action.js +1 -1
  41. package/dist/components/actions/use-anchored-menu.js +3 -6
  42. package/dist/components/actions/use-anchored-menu.js.map +1 -1
  43. package/dist/components/actions/use-context-menu.js +3 -6
  44. package/dist/components/actions/use-context-menu.js.map +1 -1
  45. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  46. package/dist/components/content/Alert/Alert.js +1 -1
  47. package/dist/components/content/Alert/use-alert.js +1 -1
  48. package/dist/components/content/Avatar/Avatar.js +1 -1
  49. package/dist/components/content/Badge/Badge.js +1 -1
  50. package/dist/components/content/Card/Card.js +1 -1
  51. package/dist/components/content/Content.js +1 -1
  52. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +6 -7
  53. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js.map +1 -1
  54. package/dist/components/content/CopySnippet/CopySnippet.js +9 -9
  55. package/dist/components/content/CopySnippet/CopySnippet.js.map +1 -1
  56. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  57. package/dist/components/content/Divider.js +1 -1
  58. package/dist/components/content/Footer.js +1 -1
  59. package/dist/components/content/Header.js +1 -1
  60. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  61. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  62. package/dist/components/content/Item/Item.js +1 -1
  63. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  64. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  65. package/dist/components/content/Layout/GridLayout.js +1 -1
  66. package/dist/components/content/Layout/Layout.js +1 -1
  67. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  68. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  69. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  70. package/dist/components/content/Layout/LayoutContent.js +1 -1
  71. package/dist/components/content/Layout/LayoutContext.js +1 -1
  72. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  73. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  74. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  75. package/dist/components/content/Layout/LayoutHeader.js +2 -4
  76. package/dist/components/content/Layout/LayoutHeader.js.map +1 -1
  77. package/dist/components/content/Layout/LayoutPane.js +1 -1
  78. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  79. package/dist/components/content/Layout/LayoutPanelHeader.js +6 -9
  80. package/dist/components/content/Layout/LayoutPanelHeader.js.map +1 -1
  81. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  82. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  83. package/dist/components/content/Layout/index.js +1 -1
  84. package/dist/components/content/Layout/utils.js +1 -1
  85. package/dist/components/content/Paragraph.js +1 -1
  86. package/dist/components/content/Placeholder/Placeholder.js +2 -4
  87. package/dist/components/content/Placeholder/Placeholder.js.map +1 -1
  88. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  89. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  90. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  91. package/dist/components/content/Result/Result.js +1 -1
  92. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  93. package/dist/components/content/Tag/Tag.js +2 -4
  94. package/dist/components/content/Tag/Tag.js.map +1 -1
  95. package/dist/components/content/Text.d.ts +7 -7
  96. package/dist/components/content/Text.js +1 -1
  97. package/dist/components/content/TextItem/TextItem.js +1 -1
  98. package/dist/components/content/Title.js +1 -1
  99. package/dist/components/content/Tree/Tree.js +1 -1
  100. package/dist/components/content/Tree/TreeNode.js +2 -4
  101. package/dist/components/content/Tree/TreeNode.js.map +1 -1
  102. package/dist/components/content/Tree/styled.js +1 -1
  103. package/dist/components/content/Tree/tree-index.js +1 -1
  104. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  105. package/dist/components/content/Tree/use-load-data.js +1 -1
  106. package/dist/components/content/highlightText.js +1 -1
  107. package/dist/components/content/use-auto-tooltip.js +1 -1
  108. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  109. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  110. package/dist/components/fields/Checkbox/context.js +1 -1
  111. package/dist/components/fields/ComboBox/ComboBox.js +3 -5
  112. package/dist/components/fields/ComboBox/ComboBox.js.map +1 -1
  113. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  114. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  115. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  116. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  117. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  118. package/dist/components/fields/DatePicker/DatePicker.js +3 -4
  119. package/dist/components/fields/DatePicker/DatePicker.js.map +1 -1
  120. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  121. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  122. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  123. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  124. package/dist/components/fields/DatePicker/DateRangePicker.js +4 -5
  125. package/dist/components/fields/DatePicker/DateRangePicker.js.map +1 -1
  126. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +5 -6
  127. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js.map +1 -1
  128. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  129. package/dist/components/fields/DatePicker/intl.js +11 -0
  130. package/dist/components/fields/DatePicker/intl.js.map +1 -0
  131. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  132. package/dist/components/fields/DatePicker/props.js +1 -1
  133. package/dist/components/fields/DatePicker/utils.js +1 -1
  134. package/dist/components/fields/FileInput/FileInput.js +3 -5
  135. package/dist/components/fields/FileInput/FileInput.js.map +1 -1
  136. package/dist/components/fields/FilterListBox/FilterListBox.js +6 -9
  137. package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
  138. package/dist/components/fields/FilterPicker/FilterPicker.js +3 -5
  139. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  140. package/dist/components/fields/Input/Input.js +1 -1
  141. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  142. package/dist/components/fields/ListBox/ListBox.js +5 -9
  143. package/dist/components/fields/ListBox/ListBox.js.map +1 -1
  144. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +2 -4
  145. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js.map +1 -1
  146. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  147. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  148. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  149. package/dist/components/fields/NumberInput/StepButton.js +2 -5
  150. package/dist/components/fields/NumberInput/StepButton.js.map +1 -1
  151. package/dist/components/fields/PasswordInput/PasswordInput.js +2 -4
  152. package/dist/components/fields/PasswordInput/PasswordInput.js.map +1 -1
  153. package/dist/components/fields/Picker/Picker.js +3 -5
  154. package/dist/components/fields/Picker/Picker.js.map +1 -1
  155. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  156. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  157. package/dist/components/fields/RadioGroup/context.js +1 -1
  158. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  159. package/dist/components/fields/Select/Select.js +1 -1
  160. package/dist/components/fields/Slider/Gradation.js +1 -1
  161. package/dist/components/fields/Slider/HueSlider.js +1 -1
  162. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  163. package/dist/components/fields/Slider/Slider.js +1 -1
  164. package/dist/components/fields/Slider/SliderBase.js +1 -1
  165. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  166. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  167. package/dist/components/fields/Slider/elements.js +1 -1
  168. package/dist/components/fields/Slider/index.js +1 -1
  169. package/dist/components/fields/Switch/Switch.js +1 -1
  170. package/dist/components/fields/TextArea/TextArea.js +1 -1
  171. package/dist/components/fields/TextInput/TextInput.js +1 -1
  172. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  173. package/dist/components/fields/TextInputMapper/TextInputMapper.js +5 -7
  174. package/dist/components/fields/TextInputMapper/TextInputMapper.js.map +1 -1
  175. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  176. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  177. package/dist/components/form/Form/Field.js +1 -1
  178. package/dist/components/form/Form/Form.js +1 -1
  179. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  180. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  181. package/dist/components/form/Form/SubmitError.js +2 -4
  182. package/dist/components/form/Form/SubmitError.js.map +1 -1
  183. package/dist/components/form/Form/index.js +1 -1
  184. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  185. package/dist/components/form/Form/use-field/use-field.js +1 -1
  186. package/dist/components/form/Form/use-form.js +1 -1
  187. package/dist/components/form/Form/validation.js +1 -1
  188. package/dist/components/form/Label.js +8 -6
  189. package/dist/components/form/Label.js.map +1 -1
  190. package/dist/components/form/wrapper.js +1 -1
  191. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  192. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  193. package/dist/components/layout/Board/Board.d.ts +24 -5
  194. package/dist/components/layout/Board/Board.js +84 -61
  195. package/dist/components/layout/Board/Board.js.map +1 -1
  196. package/dist/components/layout/Board/BoardProvider.js +1 -1
  197. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  198. package/dist/components/layout/Board/Widget.d.ts +23 -3
  199. package/dist/components/layout/Board/Widget.js +28 -2
  200. package/dist/components/layout/Board/Widget.js.map +1 -1
  201. package/dist/components/layout/Board/WidgetHost.js +22 -13
  202. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  203. package/dist/components/layout/Board/board-context.js +12 -2
  204. package/dist/components/layout/Board/board-context.js.map +1 -1
  205. package/dist/components/layout/Board/board-store.js +2 -2
  206. package/dist/components/layout/Board/board-store.js.map +1 -1
  207. package/dist/components/layout/Board/grid-core/calculate.js +2 -2
  208. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  209. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  210. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  211. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  212. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  213. package/dist/components/layout/Board/index.d.ts +1 -1
  214. package/dist/components/layout/Board/index.js +1 -1
  215. package/dist/components/layout/Board/responsive-utils.js +1 -1
  216. package/dist/components/layout/Board/use-board-layout.js +1 -1
  217. package/dist/components/layout/Board/use-board-registry.js +3 -2
  218. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  219. package/dist/components/layout/Flex.js +1 -1
  220. package/dist/components/layout/Flow.js +1 -1
  221. package/dist/components/layout/Grid.js +1 -1
  222. package/dist/components/layout/Panel.js +1 -1
  223. package/dist/components/layout/Prefix.js +1 -1
  224. package/dist/components/layout/ResizablePanel.js +1 -1
  225. package/dist/components/layout/Space.js +1 -1
  226. package/dist/components/layout/Suffix.js +1 -1
  227. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  228. package/dist/components/navigation/Tabs/TabButton.js +4 -7
  229. package/dist/components/navigation/Tabs/TabButton.js.map +1 -1
  230. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  231. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  232. package/dist/components/navigation/Tabs/TabPicker.js +3 -5
  233. package/dist/components/navigation/Tabs/TabPicker.js.map +1 -1
  234. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  235. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  236. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  237. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  238. package/dist/components/navigation/Tabs/styled.js +1 -1
  239. package/dist/components/navigation/Tabs/types.js +1 -1
  240. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  241. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  242. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  243. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  244. package/dist/components/other/Calendar/Calendar.js +1 -1
  245. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  246. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  247. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  248. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  249. package/dist/components/overlays/AlertDialog/AlertDialog.js +6 -8
  250. package/dist/components/overlays/AlertDialog/AlertDialog.js.map +1 -1
  251. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  252. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  253. package/dist/components/overlays/Dialog/Dialog.js +8 -5
  254. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  255. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  256. package/dist/components/overlays/Dialog/DialogForm.js +3 -5
  257. package/dist/components/overlays/Dialog/DialogForm.js.map +1 -1
  258. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  259. package/dist/components/overlays/Dialog/context.js +1 -1
  260. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  261. package/dist/components/overlays/Modal/Modal.js +1 -1
  262. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  263. package/dist/components/overlays/Modal/Overlay.js +1 -1
  264. package/dist/components/overlays/Modal/Popover.js +1 -1
  265. package/dist/components/overlays/Modal/Tray.js +1 -1
  266. package/dist/components/overlays/Modal/Underlay.js +1 -1
  267. package/dist/components/overlays/Notifications/Notification.js +1 -1
  268. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  269. package/dist/components/overlays/Notifications/NotificationCard.js +2 -4
  270. package/dist/components/overlays/Notifications/NotificationCard.js.map +1 -1
  271. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  272. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  273. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  274. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  275. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +8 -17
  276. package/dist/components/overlays/Notifications/PersistentNotificationsList.js.map +1 -1
  277. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  278. package/dist/components/overlays/Notifications/format-relative-time.d.ts +3 -9
  279. package/dist/components/overlays/Notifications/format-relative-time.js +12 -20
  280. package/dist/components/overlays/Notifications/format-relative-time.js.map +1 -1
  281. package/dist/components/overlays/Notifications/index.js +1 -1
  282. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  283. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  284. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  285. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  286. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  287. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  288. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  289. package/dist/components/overlays/Toast/index.js +1 -1
  290. package/dist/components/overlays/Toast/useProgressToast.js +3 -6
  291. package/dist/components/overlays/Toast/useProgressToast.js.map +1 -1
  292. package/dist/components/overlays/Toast/useToast.js +1 -1
  293. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  294. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  295. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  296. package/dist/components/overlays/Tooltip/context.js +1 -1
  297. package/dist/components/portal/Portal.js +1 -1
  298. package/dist/components/portal/PortalProvider.js +1 -1
  299. package/dist/components/portal/usePortal.js +1 -1
  300. package/dist/components/shared/DraggableCollection.js +1 -1
  301. package/dist/components/shared/InvalidIcon.js +1 -1
  302. package/dist/components/shared/ValidIcon.js +1 -1
  303. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +2 -4
  304. package/dist/components/status/LoadingAnimation/LoadingAnimation.js.map +1 -1
  305. package/dist/components/status/Spin/Cube.js +1 -1
  306. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  307. package/dist/components/status/Spin/Spin.js +1 -1
  308. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  309. package/dist/data/item-themes.js +1 -1
  310. package/dist/data/themes.js +1 -1
  311. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  312. package/dist/icons/AdjustmentsIcon.js +1 -1
  313. package/dist/icons/AiIcon.js +1 -1
  314. package/dist/icons/AreaChartIcon.js +1 -1
  315. package/dist/icons/BackwardIcon.js +1 -1
  316. package/dist/icons/BarChartIcon.js +1 -1
  317. package/dist/icons/BellFilledIcon.js +1 -1
  318. package/dist/icons/BellIcon.js +1 -1
  319. package/dist/icons/BooleanIcon.js +1 -1
  320. package/dist/icons/CalendarEditIcon.js +1 -1
  321. package/dist/icons/CalendarIcon.js +1 -1
  322. package/dist/icons/CaretDownIcon.js +1 -1
  323. package/dist/icons/CaretUpIcon.js +1 -1
  324. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  325. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  326. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  327. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  328. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  329. package/dist/icons/ChartBarLineIcon.js +1 -1
  330. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  331. package/dist/icons/ChartBarStackedIcon.js +1 -1
  332. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  333. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  334. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  335. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  336. package/dist/icons/ChartBubbleIcon.js +1 -1
  337. package/dist/icons/ChartDonut2Icon.js +1 -1
  338. package/dist/icons/ChartFunnelIcon.js +1 -1
  339. package/dist/icons/ChartHeatmapIcon.js +1 -1
  340. package/dist/icons/ChartKPIIcon.js +1 -1
  341. package/dist/icons/ChartPie2Icon.js +1 -1
  342. package/dist/icons/ChartScatterIcon.js +1 -1
  343. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  344. package/dist/icons/CheckCircleIcon.js +1 -1
  345. package/dist/icons/CheckIcon.js +1 -1
  346. package/dist/icons/CircleFilledIcon.js +1 -1
  347. package/dist/icons/ClearIcon.js +1 -1
  348. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  349. package/dist/icons/CloseCircleIcon.js +1 -1
  350. package/dist/icons/CloseIcon.js +1 -1
  351. package/dist/icons/CodeIcon.js +1 -1
  352. package/dist/icons/ColumnTotalIcon.js +1 -1
  353. package/dist/icons/CopyIcon.js +1 -1
  354. package/dist/icons/CountIcon.js +1 -1
  355. package/dist/icons/CubeIcon.js +1 -1
  356. package/dist/icons/CubePauseIcon.js +1 -1
  357. package/dist/icons/CubePlayIcon.js +1 -1
  358. package/dist/icons/CurrencyDollarIcon.js +1 -1
  359. package/dist/icons/DangerIcon.js +1 -1
  360. package/dist/icons/DashboardIcon.js +1 -1
  361. package/dist/icons/DatabaseIcon.js +1 -1
  362. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  363. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  364. package/dist/icons/DirectionIcon.js +1 -1
  365. package/dist/icons/DonutIcon.js +1 -1
  366. package/dist/icons/DownIcon.js +1 -1
  367. package/dist/icons/EditIcon.js +1 -1
  368. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  369. package/dist/icons/ExclamationCircleIcon.js +1 -1
  370. package/dist/icons/ExclamationIcon.js +1 -1
  371. package/dist/icons/EyeIcon.js +1 -1
  372. package/dist/icons/EyeInvisibleIcon.js +1 -1
  373. package/dist/icons/FilterIcon.js +1 -1
  374. package/dist/icons/FolderFilledIcon.js +1 -1
  375. package/dist/icons/FolderIcon.js +1 -1
  376. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  377. package/dist/icons/FolderOpenIcon.js +1 -1
  378. package/dist/icons/ForwardIcon.js +1 -1
  379. package/dist/icons/GripVerticalIcon.js +1 -1
  380. package/dist/icons/HierarchyIcon.js +1 -1
  381. package/dist/icons/HierarchyOpenIcon.js +1 -1
  382. package/dist/icons/Icon.js +1 -1
  383. package/dist/icons/InfoCircleIcon.js +1 -1
  384. package/dist/icons/InfoIcon.js +1 -1
  385. package/dist/icons/KeyIcon.js +1 -1
  386. package/dist/icons/LeftIcon.js +1 -1
  387. package/dist/icons/LineChartIcon.js +1 -1
  388. package/dist/icons/LoadingIcon.js +1 -1
  389. package/dist/icons/LockFilledIcon.js +1 -1
  390. package/dist/icons/LockIcon.js +1 -1
  391. package/dist/icons/MoreIcon.js +1 -1
  392. package/dist/icons/NotAllowedIcon.js +1 -1
  393. package/dist/icons/Number123Icon.js +1 -1
  394. package/dist/icons/NumberIcon.js +1 -1
  395. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  396. package/dist/icons/PauseCircleIcon.js +1 -1
  397. package/dist/icons/PauseIcon.js +1 -1
  398. package/dist/icons/PercentageIcon.js +1 -1
  399. package/dist/icons/PieChartIcon.js +1 -1
  400. package/dist/icons/PlayCircleIcon.js +1 -1
  401. package/dist/icons/PlayIcon.js +1 -1
  402. package/dist/icons/PlusIcon.js +1 -1
  403. package/dist/icons/ProgressBarIcon.js +1 -1
  404. package/dist/icons/ReloadIcon.js +1 -1
  405. package/dist/icons/ReportIcon.js +1 -1
  406. package/dist/icons/ReturnIcon.js +1 -1
  407. package/dist/icons/RightIcon.js +1 -1
  408. package/dist/icons/RowTotalsIcon.js +1 -1
  409. package/dist/icons/SchemeIcon.js +1 -1
  410. package/dist/icons/SearchIcon.js +1 -1
  411. package/dist/icons/SemanticQueryIcon.js +1 -1
  412. package/dist/icons/SettingsIcon.js +1 -1
  413. package/dist/icons/ShieldFilledIcon.js +1 -1
  414. package/dist/icons/ShieldIcon.js +1 -1
  415. package/dist/icons/SlashIcon.js +1 -1
  416. package/dist/icons/SparklesIcon.js +1 -1
  417. package/dist/icons/SqlIcon.js +1 -1
  418. package/dist/icons/StatsIcon.js +1 -1
  419. package/dist/icons/StopIcon.js +1 -1
  420. package/dist/icons/StringIcon.js +1 -1
  421. package/dist/icons/SubtotalsIcon.js +1 -1
  422. package/dist/icons/SwitchIcon.js +1 -1
  423. package/dist/icons/TableIcon.js +1 -1
  424. package/dist/icons/ThumbsDownIcon.js +1 -1
  425. package/dist/icons/ThumbsUpIcon.js +1 -1
  426. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  427. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  428. package/dist/icons/ThunderboltIcon.js +1 -1
  429. package/dist/icons/TimeIcon.js +1 -1
  430. package/dist/icons/TrashIcon.js +1 -1
  431. package/dist/icons/UnlockIcon.js +1 -1
  432. package/dist/icons/UpIcon.js +1 -1
  433. package/dist/icons/UserGroupIcon.js +1 -1
  434. package/dist/icons/UserIcon.js +1 -1
  435. package/dist/icons/UserLockIcon.js +1 -1
  436. package/dist/icons/ViewIcon.js +1 -1
  437. package/dist/icons/WarningFilledIcon.js +1 -1
  438. package/dist/icons/WarningIcon.js +1 -1
  439. package/dist/icons/wrap-icon.js +1 -1
  440. package/dist/index.d.ts +2 -12
  441. package/dist/index.js +2 -12
  442. package/dist/index.js.map +1 -1
  443. package/dist/provider.js +1 -1
  444. package/dist/providers/TrackingProvider.js +1 -1
  445. package/dist/providers/navigationAdapter.default.js +1 -1
  446. package/dist/tokens/base.js +1 -1
  447. package/dist/tokens/colors.js +1 -1
  448. package/dist/tokens/index.js +1 -1
  449. package/dist/tokens/layout.js +1 -1
  450. package/dist/tokens/palette.js +1 -1
  451. package/dist/tokens/shadows.js +1 -1
  452. package/dist/tokens/sizes.js +1 -1
  453. package/dist/tokens/spacing.js +1 -1
  454. package/dist/tokens/typography.js +1 -1
  455. package/dist/utils/ResizeSensor.js +1 -1
  456. package/dist/utils/is-dev-env.js +1 -1
  457. package/dist/utils/modules.js +1 -1
  458. package/dist/utils/promise.js +1 -1
  459. package/dist/utils/raf.js +1 -1
  460. package/dist/utils/random.js +1 -1
  461. package/dist/utils/range.js +1 -1
  462. package/dist/utils/react/RenderCache.js +1 -1
  463. package/dist/utils/react/Slots.js +1 -1
  464. package/dist/utils/react/chain.js +1 -1
  465. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  466. package/dist/utils/react/index.js +1 -1
  467. package/dist/utils/react/interactions.js +1 -1
  468. package/dist/utils/react/isTextOnly.js +1 -1
  469. package/dist/utils/react/mapProps.js +1 -1
  470. package/dist/utils/react/mergeProps.js +1 -1
  471. package/dist/utils/react/nullableValue.js +1 -1
  472. package/dist/utils/react/resolveIcon.js +1 -1
  473. package/dist/utils/react/sharedStore.js +1 -1
  474. package/dist/utils/react/useCombinedRefs.js +1 -1
  475. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  476. package/dist/utils/react/useEventBus.js +1 -1
  477. package/dist/utils/react/useId.js +1 -1
  478. package/dist/utils/react/useIsDarwin.js +1 -1
  479. package/dist/utils/react/useKeySymbols.js +1 -1
  480. package/dist/utils/react/useLayoutEffect.js +1 -1
  481. package/dist/utils/react/useLocalStorage.js +1 -1
  482. package/dist/utils/react/useMergeStyles.js +1 -1
  483. package/dist/utils/react/usePopoverSync.js +1 -1
  484. package/dist/utils/react/useQaProps.js +1 -1
  485. package/dist/utils/react/useViewportSize.js +1 -1
  486. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  487. package/dist/utils/selection.js +1 -1
  488. package/dist/utils/styles.js +1 -1
  489. package/dist/utils/tree.js +1 -1
  490. package/dist/utils/warnings.js +1 -1
  491. package/dist/version.js +2 -2
  492. package/docs/components/layout/Board.md +35 -12
  493. package/package.json +1 -3
  494. package/dist/i18n/I18nProvider.d.ts +0 -39
  495. package/dist/i18n/I18nProvider.js +0 -43
  496. package/dist/i18n/I18nProvider.js.map +0 -1
  497. package/dist/i18n/createFormatter.d.ts +0 -59
  498. package/dist/i18n/createFormatter.js +0 -148
  499. package/dist/i18n/createFormatter.js.map +0 -1
  500. package/dist/i18n/formatting-locale.d.ts +0 -9
  501. package/dist/i18n/formatting-locale.js +0 -29
  502. package/dist/i18n/formatting-locale.js.map +0 -1
  503. package/dist/i18n/index.d.ts +0 -19
  504. package/dist/i18n/index.js +0 -22
  505. package/dist/i18n/index.js.map +0 -1
  506. package/dist/i18n/instance.d.ts +0 -14
  507. package/dist/i18n/instance.js +0 -64
  508. package/dist/i18n/instance.js.map +0 -1
  509. package/dist/i18n/locales/de-DE/uikit.js +0 -112
  510. package/dist/i18n/locales/de-DE/uikit.js.map +0 -1
  511. package/dist/i18n/locales/en-US/uikit.js +0 -112
  512. package/dist/i18n/locales/en-US/uikit.js.map +0 -1
  513. package/dist/i18n/locales/en-US/uikit.json.d.ts +0 -140
  514. package/dist/i18n/locales/es-ES/uikit.js +0 -112
  515. package/dist/i18n/locales/es-ES/uikit.js.map +0 -1
  516. package/dist/i18n/locales/es-MX/uikit.js +0 -112
  517. package/dist/i18n/locales/es-MX/uikit.js.map +0 -1
  518. package/dist/i18n/locales/fr-FR/uikit.js +0 -112
  519. package/dist/i18n/locales/fr-FR/uikit.js.map +0 -1
  520. package/dist/i18n/locales/it-IT/uikit.js +0 -112
  521. package/dist/i18n/locales/it-IT/uikit.js.map +0 -1
  522. package/dist/i18n/locales/ja-JP/uikit.js +0 -112
  523. package/dist/i18n/locales/ja-JP/uikit.js.map +0 -1
  524. package/dist/i18n/locales/nb-NO/uikit.js +0 -112
  525. package/dist/i18n/locales/nb-NO/uikit.js.map +0 -1
  526. package/dist/i18n/locales/pt-BR/uikit.js +0 -112
  527. package/dist/i18n/locales/pt-BR/uikit.js.map +0 -1
  528. package/dist/i18n/locales/pt-PT/uikit.js +0 -112
  529. package/dist/i18n/locales/pt-PT/uikit.js.map +0 -1
  530. package/dist/i18n/locales/sv-SE/uikit.js +0 -112
  531. package/dist/i18n/locales/sv-SE/uikit.js.map +0 -1
  532. package/dist/i18n/locales/vi-VN/uikit.js +0 -112
  533. package/dist/i18n/locales/vi-VN/uikit.js.map +0 -1
  534. package/dist/i18n/locales.d.ts +0 -17
  535. package/dist/i18n/locales.js +0 -45
  536. package/dist/i18n/locales.js.map +0 -1
  537. package/dist/i18n/useFormatter.d.ts +0 -33
  538. package/dist/i18n/useFormatter.js +0 -59
  539. package/dist/i18n/useFormatter.js.map +0 -1
  540. package/dist/i18n/useI18n.d.ts +0 -2
  541. package/dist/i18n/useI18n.js +0 -19
  542. package/dist/i18n/useI18n.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
 
2
2
  import { LayoutConstraint, ResizeHandleAxis } from "./grid-core/types.js";
3
- import { Styles } from "@tenphi/tasty";
3
+ import { ContainerStyleProps, Styles } from "@tenphi/tasty";
4
4
  import { ReactNode } from "react";
5
5
 
6
6
  //#region src/components/layout/Board/Widget.d.ts
7
- interface CubeBoardWidgetProps {
7
+ interface CubeBoardWidgetProps extends ContainerStyleProps {
8
8
  /** Unique id, must match the `i` of a layout item in a `Board`. */
9
9
  id: string;
10
10
  /** Widget content. */
@@ -15,11 +15,31 @@ interface CubeBoardWidgetProps {
15
15
  isResizable?: boolean;
16
16
  /** Which resize handles to show (overrides the board default). */
17
17
  resizeHandles?: ResizeHandleAxis[];
18
+ /**
19
+ * Render this widget as a card by adding a border. Widgets are always filled
20
+ * (`#surface-2`) and rounded; `isCard` adds the border on top. Defaults to
21
+ * `false` (borderless) unless the owning `Board`'s `widgetProps.isCard` opts
22
+ * in. Override per widget to enable or disable.
23
+ */
24
+ isCard?: boolean;
25
+ /** Minimum width in grid columns (used when the layout item omits `minW`). */
26
+ minW?: number;
27
+ /** Maximum width in grid columns (used when the layout item omits `maxW`). */
28
+ maxW?: number;
29
+ /** Minimum height in grid rows (used when the layout item omits `minH`). */
30
+ minH?: number;
31
+ /** Maximum height in grid rows (used when the layout item omits `maxH`). */
32
+ maxH?: number;
18
33
  /** Per-widget layout constraints. */
19
34
  constraints?: LayoutConstraint[];
20
35
  /** Test id applied to the rendered widget element. */
21
36
  qa?: string;
22
- /** Style overrides applied to the rendered widget element. */
37
+ /**
38
+ * Style overrides applied to the rendered widget element. Individual style
39
+ * props (`fill`, `padding`, `radius`, `border`, ...) can also be passed
40
+ * directly on `Board.Widget`, just like on `Board`; they are merged into
41
+ * these styles (a direct prop wins over the same key in the `styles` object).
42
+ */
23
43
  styles?: Styles;
24
44
  /**
25
45
  * Grow this widget's height in its board to fit its content (only ever
@@ -1,17 +1,38 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
+ import { extractStyles } from "../../../utils/styles.js";
2
3
  import { useLayoutEffect as useLayoutEffect$1 } from "../../../utils/react/useLayoutEffect.js";
3
4
  import { useBoardRegistry } from "./board-context.js";
5
+ import { CONTAINER_STYLES } from "@tenphi/tasty";
4
6
  import { useEffect, useRef } from "react";
5
7
 
6
8
  //#region src/components/layout/Board/Widget.tsx
7
9
  /**
10
+ * Shallow-compare two style maps by their top-level keys. Direct style props
11
+ * (e.g. `fill`) are primitives, so this reliably detects a real change while
12
+ * ignoring the fresh object identity `extractStyles` produces each render.
13
+ */
14
+ function shallowEqualStyles(a, b) {
15
+ if (a === b) return true;
16
+ if (!a || !b) return false;
17
+ const aKeys = Object.keys(a);
18
+ const bKeys = Object.keys(b);
19
+ if (aKeys.length !== bKeys.length) return false;
20
+ for (const key of aKeys) if (a[key] !== b[key]) return false;
21
+ return true;
22
+ }
23
+ /**
8
24
  * Declares a widget's content and per-widget options. Rendering and positioning
9
25
  * are performed by the owning `Board` (the component itself renders nothing),
10
26
  * which is what allows a widget to be transferred between boards.
11
27
  */
12
28
  function Widget(props) {
13
- const { id, children, isDraggable, isResizable, resizeHandles, constraints, qa, styles, isAutoHeight, dragCancel, dragHandle } = props;
29
+ const { id, children, isDraggable, isResizable, resizeHandles, isCard, minW, maxW, minH, maxH, constraints, qa, isAutoHeight, dragCancel, dragHandle } = props;
14
30
  const registry = useBoardRegistry();
31
+ const extractedStyles = extractStyles(props, CONTAINER_STYLES);
32
+ const nextStyles = Object.keys(extractedStyles).length > 0 ? extractedStyles : void 0;
33
+ const stylesRef = useRef(void 0);
34
+ if (!shallowEqualStyles(stylesRef.current, nextStyles)) stylesRef.current = nextStyles;
35
+ const styles = stylesRef.current;
15
36
  const ownerRef = useRef({});
16
37
  useLayoutEffect$1(() => {
17
38
  registry?.store.register({
@@ -20,6 +41,11 @@ function Widget(props) {
20
41
  isDraggable,
21
42
  isResizable,
22
43
  resizeHandles,
44
+ isCard,
45
+ minW,
46
+ maxW,
47
+ minH,
48
+ maxH,
23
49
  constraints,
24
50
  qa,
25
51
  styles,
@@ -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 * 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 * CSS selector for elements that must not start a pointer drag inside this\n * widget (overrides the board's `dragCancel`).\n */\n dragCancel?: string;\n /**\n * CSS selector for the only elements from which a pointer drag may start\n * inside this widget (overrides the board's `dragHandle`).\n */\n dragHandle?: string;\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 dragCancel,\n dragHandle,\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 dragCancel,\n dragHandle,\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":";;;;;;;;;;;AAgDA,SAAgB,OAAO,OAA6B;CAClD,MAAM,EACJ,IACA,UACA,aACA,aACA,eACA,aACA,IACA,QACA,cACA,YACA,eACE;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;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 { CONTAINER_STYLES, ContainerStyleProps, Styles } from '@tenphi/tasty';\nimport { ReactNode, useEffect, useRef } from 'react';\n\nimport { useLayoutEffect } from '../../../utils/react';\nimport { extractStyles } from '../../../utils/styles';\n\nimport { useBoardRegistry } from './board-context';\nimport { LayoutConstraint, ResizeHandleAxis } from './grid-core';\n\nexport interface CubeBoardWidgetProps extends ContainerStyleProps {\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 /**\n * Render this widget as a card by adding a border. Widgets are always filled\n * (`#surface-2`) and rounded; `isCard` adds the border on top. Defaults to\n * `false` (borderless) unless the owning `Board`'s `widgetProps.isCard` opts\n * in. Override per widget to enable or disable.\n */\n isCard?: boolean;\n /** Minimum width in grid columns (used when the layout item omits `minW`). */\n minW?: number;\n /** Maximum width in grid columns (used when the layout item omits `maxW`). */\n maxW?: number;\n /** Minimum height in grid rows (used when the layout item omits `minH`). */\n minH?: number;\n /** Maximum height in grid rows (used when the layout item omits `maxH`). */\n maxH?: number;\n /** Per-widget layout constraints. */\n constraints?: LayoutConstraint[];\n /** Test id applied to the rendered widget element. */\n qa?: string;\n /**\n * Style overrides applied to the rendered widget element. Individual style\n * props (`fill`, `padding`, `radius`, `border`, ...) can also be passed\n * directly on `Board.Widget`, just like on `Board`; they are merged into\n * these styles (a direct prop wins over the same key in the `styles` object).\n */\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 * CSS selector for elements that must not start a pointer drag inside this\n * widget (overrides the board's `dragCancel`).\n */\n dragCancel?: string;\n /**\n * CSS selector for the only elements from which a pointer drag may start\n * inside this widget (overrides the board's `dragHandle`).\n */\n dragHandle?: string;\n}\n\n/**\n * Shallow-compare two style maps by their top-level keys. Direct style props\n * (e.g. `fill`) are primitives, so this reliably detects a real change while\n * ignoring the fresh object identity `extractStyles` produces each render.\n */\nfunction shallowEqualStyles(a?: Styles, b?: Styles): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n if (aKeys.length !== bKeys.length) return false;\n for (const key of aKeys) {\n if (\n (a as Record<string, unknown>)[key] !==\n (b as Record<string, unknown>)[key]\n ) {\n return false;\n }\n }\n return true;\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 isCard,\n minW,\n maxW,\n minH,\n maxH,\n constraints,\n qa,\n isAutoHeight,\n dragCancel,\n dragHandle,\n } = props;\n const registry = useBoardRegistry();\n\n // Collect direct style props (e.g. `fill`, `padding`, `radius`) and merge them\n // with the explicit `styles` prop, mirroring how `Board` extracts its own\n // styles. Fall back to `undefined` when nothing was provided so widgets with\n // no styling keep a stable registration (avoids needless store churn).\n const extractedStyles = extractStyles(props, CONTAINER_STYLES);\n const nextStyles =\n Object.keys(extractedStyles).length > 0 ? extractedStyles : undefined;\n\n // `extractStyles` returns a fresh object every render, so passing it straight\n // to `register` would make the store treat every render as a style change,\n // bump its version, and re-render the hosting board in a loop. Keep a stable\n // reference across renders and only swap it when the shallow style values\n // actually change (direct props are primitives; a `styles` object is compared\n // per top-level key).\n const stylesRef = useRef<Styles | undefined>(undefined);\n if (!shallowEqualStyles(stylesRef.current, nextStyles)) {\n stylesRef.current = nextStyles;\n }\n const styles = stylesRef.current;\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 isCard,\n minW,\n maxW,\n minH,\n maxH,\n constraints,\n qa,\n styles,\n isAutoHeight,\n dragCancel,\n dragHandle,\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":";;;;;;;;;;;;;AAqEA,SAAS,mBAAmB,GAAY,GAAqB;AAC3D,KAAI,MAAM,EAAG,QAAO;AACpB,KAAI,CAAC,KAAK,CAAC,EAAG,QAAO;CACrB,MAAM,QAAQ,OAAO,KAAK,EAAE;CAC5B,MAAM,QAAQ,OAAO,KAAK,EAAE;AAC5B,KAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,MAAK,MAAM,OAAO,MAChB,KACG,EAA8B,SAC9B,EAA8B,KAE/B,QAAO;AAGX,QAAO;;;;;;;AAQT,SAAgB,OAAO,OAA6B;CAClD,MAAM,EACJ,IACA,UACA,aACA,aACA,eACA,QACA,MACA,MACA,MACA,MACA,aACA,IACA,cACA,YACA,eACE;CACJ,MAAM,WAAW,kBAAkB;CAMnC,MAAM,kBAAkB,cAAc,OAAO,iBAAiB;CAC9D,MAAM,aACJ,OAAO,KAAK,gBAAgB,CAAC,SAAS,IAAI,kBAAkB;CAQ9D,MAAM,YAAY,OAA2B,OAAU;AACvD,KAAI,CAAC,mBAAmB,UAAU,SAAS,WAAW,CACpD,WAAU,UAAU;CAEtB,MAAM,SAAS,UAAU;CAIzB,MAAM,WAAW,OAAO,EAAE,CAAC;AAG3B,yBAAsB;AACpB,YAAU,MAAM,SACd;GACE;GACA,SAAS;GACT;GACA;GACA;GACA;GACA;GACA;GACA;GACA;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,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  import { mergeProps as mergeProps$1 } from "../../../utils/react/mergeProps.js";
3
3
  import { useEvent } from "../../../_internal/hooks/use-event.js";
4
4
  import { BoardHostContext } from "./board-context.js";
@@ -21,11 +21,15 @@ const WidgetElement = tasty({
21
21
  position: "absolute",
22
22
  top: 0,
23
23
  left: 0,
24
- fill: "#surface",
24
+ fill: "#surface-2",
25
25
  radius: "1cr",
26
- border: true,
26
+ border: {
27
+ "": false,
28
+ card: true
29
+ },
27
30
  shadow: {
28
31
  "": false,
32
+ "hovered & !card & (draggable | resizing)": "0 0 0 1bw #border",
29
33
  "drag | resizing": "$dialog-shadow"
30
34
  },
31
35
  zIndex: {
@@ -36,7 +40,10 @@ const WidgetElement = tasty({
36
40
  "": 1,
37
41
  floating: .8
38
42
  },
39
- transition: "theme, shadow, opacity",
43
+ transition: {
44
+ "": "theme, shadow, opacity, inset",
45
+ "drag | floating | resizing": "theme, shadow, opacity"
46
+ },
40
47
  boxSizing: "border-box",
41
48
  userSelect: {
42
49
  "": "auto",
@@ -245,10 +252,9 @@ function ResizeHandle({ axis, onResize }) {
245
252
  * renders into the shared overlay portal so it can float outside its board.
246
253
  */
247
254
  function WidgetHost(props) {
248
- const { boardId, item, positionParams, registration, isDraggable, isResizable, resizeHandles, dragCancel, dragHandle, registry, dragState, onResize, onAutoHeight, onDragLifecycle } = props;
255
+ const { boardId, item, positionParams, registration, isCard, styles: widgetStyles, isDraggable, isResizable, resizeHandles, isAutoHeight, qa, dragCancel, dragHandle, registry, dragState, onResize, onAutoHeight, onDragLifecycle } = props;
249
256
  const hostRef = useRef(null);
250
257
  const isActiveDrag = dragState?.itemId === item.i;
251
- const isAutoHeight = registration?.isAutoHeight === true;
252
258
  const requestHeightDeficit = useEvent((deficitPx) => {
253
259
  if (!isAutoHeight || isActiveDrag) return;
254
260
  const step = positionParams.rowHeight + positionParams.margin[1];
@@ -307,7 +313,7 @@ function WidgetHost(props) {
307
313
  const a11yProps = {
308
314
  tabIndex: isDraggable ? 0 : void 0,
309
315
  "aria-roledescription": isDraggable ? "Draggable widget" : void 0,
310
- "aria-label": registration?.qa ?? item.i
316
+ "aria-label": qa ?? item.i
311
317
  };
312
318
  const stopBubbleProps = isDraggable ? {
313
319
  onPointerDown: (e) => e.stopPropagation(),
@@ -319,7 +325,7 @@ function WidgetHost(props) {
319
325
  if (dragHandle && !target.closest(dragHandle)) return true;
320
326
  return !!(dragCancel && target.closest(dragCancel));
321
327
  };
322
- const gatedMoveProps = isDraggable && (dragHandle || dragCancel) ? {
328
+ const gatedMoveProps = !isDraggable ? {} : dragHandle || dragCancel ? {
323
329
  ...moveProps,
324
330
  ...moveProps.onPointerDown && { onPointerDown: (e) => {
325
331
  if (shouldGateDrag(e.target)) return;
@@ -343,7 +349,9 @@ function WidgetHost(props) {
343
349
  drag: isActiveDrag,
344
350
  draggable: isDraggable && !isActiveDrag,
345
351
  static: !!item.static,
346
- resizing: isResizing
352
+ resizing: isResizing,
353
+ card: isCard,
354
+ hovered: isHovered
347
355
  };
348
356
  const content = /* @__PURE__ */ jsxs(BoardHostContext.Provider, {
349
357
  value: hostValue,
@@ -378,7 +386,8 @@ function WidgetHost(props) {
378
386
  const overlayNode = registry.overlayRef.current;
379
387
  const floatInOverlay = useOverlay && !!overlayNode && !!dragState;
380
388
  const hostStyle = {
381
- transform: `translate(${pos.left}px, ${pos.top}px)`,
389
+ left: `${pos.left}px`,
390
+ top: `${pos.top}px`,
382
391
  width: `${pos.width}px`,
383
392
  height: `${pos.height}px`,
384
393
  ...floatInOverlay ? {
@@ -394,9 +403,9 @@ function WidgetHost(props) {
394
403
  ref: hostRef,
395
404
  "data-board-widget-host": "",
396
405
  ...mergeProps$1(gatedMoveProps, stopBubbleProps, hoverProps, focusWithinProps, a11yProps, { style: hostStyle }),
397
- qa: registration?.qa,
406
+ qa,
398
407
  mods: hostMods,
399
- styles: registration?.styles,
408
+ styles: widgetStyles,
400
409
  children: floatInOverlay ? null : content
401
410
  }), floatInOverlay ? createPortal(/* @__PURE__ */ jsx(WidgetElement, {
402
411
  style: {
@@ -412,7 +421,7 @@ function WidgetHost(props) {
412
421
  drag: true,
413
422
  floating: true
414
423
  },
415
- styles: registration?.styles,
424
+ styles: widgetStyles,
416
425
  "aria-hidden": "true",
417
426
  children: content
418
427
  }), overlayNode) : null] });
@@ -1 +1 @@
1
- {"version":3,"file":"WidgetHost.js","names":["mergeProps"],"sources":["../../../../src/components/layout/Board/WidgetHost.tsx"],"sourcesContent":["import { Styles, tasty } from '@tenphi/tasty';\nimport { CSSProperties, useMemo, useRef, useState } from 'react';\nimport { useFocusWithin, useHover, useMove } from 'react-aria';\nimport { createPortal } from 'react-dom';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { mergeProps } from '../../../utils/react';\n\nimport {\n BoardDragState,\n BoardHost,\n BoardHostContext,\n BoardRegistryContextValue,\n ViewportRect,\n} from './board-context';\nimport { WidgetRegistration } from './board-store';\nimport {\n calcGridColWidth,\n calcGridItemPosition,\n LayoutItem,\n PositionParams,\n ResizeHandleAxis,\n} from './grid-core';\n\nexport type ResizePhase = 'start' | 'move' | 'end';\n\n/**\n * Slack (px) absorbed when converting an auto-height widget's content height to\n * whole rows, so sub-pixel measurement/rounding noise never bumps an extra row.\n */\nconst AUTO_HEIGHT_TOLERANCE = 4;\n\nconst WidgetElement = tasty({\n qa: 'BoardWidget',\n styles: {\n position: 'absolute',\n top: 0,\n left: 0,\n fill: '#surface',\n radius: '1cr',\n border: true,\n shadow: {\n '': false,\n // `$dialog-shadow` uses Glaze `#shadow-lg`, which adapts to dark / high-contrast schemes.\n 'drag | resizing': '$dialog-shadow',\n },\n zIndex: {\n '': 1,\n 'drag | resizing': 10,\n },\n // The pointer-drag ghost (the clone that floats in the overlay) is slightly\n // translucent so the user can see through it to whatever it hovers over -\n // e.g. a Tabs header underneath - and land a precise drop / tab switch. The\n // in-place host (keyboard drags, which never float) stays fully opaque.\n opacity: {\n '': 1,\n floating: 0.8,\n },\n transition: 'theme, shadow, opacity',\n boxSizing: 'border-box',\n userSelect: {\n '': 'auto',\n 'drag | resizing': 'none',\n },\n cursor: {\n '': 'auto',\n draggable: 'grab',\n drag: 'grabbing',\n },\n touchAction: 'none',\n overflow: 'hidden',\n },\n});\n\nconst HandleElement = tasty({\n qa: 'BoardResizeHandle',\n styles: {\n position: 'absolute',\n zIndex: 20,\n fill: '#clear',\n // Overhang: how far the hit-zone extends beyond the widget edge.\n '--handle-size': '24px',\n '--handle-overhang': '-8px',\n '--handle-inset': '8px',\n width: {\n '': '$handle-size',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': 'auto',\n },\n height: {\n '': '$handle-size',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': 'auto',\n },\n top: {\n '': 'auto',\n '[data-axis=\"n\"] | [data-axis=\"ne\"] | [data-axis=\"nw\"]':\n '$handle-overhang',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': '$handle-inset',\n },\n bottom: {\n '': 'auto',\n '[data-axis=\"s\"] | [data-axis=\"se\"] | [data-axis=\"sw\"]':\n '$handle-overhang',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': '$handle-inset',\n },\n left: {\n '': 'auto',\n '[data-axis=\"w\"] | [data-axis=\"nw\"] | [data-axis=\"sw\"]':\n '$handle-overhang',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '$handle-inset',\n },\n right: {\n '': 'auto',\n '[data-axis=\"e\"] | [data-axis=\"ne\"] | [data-axis=\"se\"]':\n '$handle-overhang',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '$handle-inset',\n },\n cursor: {\n '': 'default',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': 'ns-resize',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': 'ew-resize',\n '[data-axis=\"ne\"] | [data-axis=\"sw\"]': 'nesw-resize',\n '[data-axis=\"nw\"] | [data-axis=\"se\"]': 'nwse-resize',\n },\n touchAction: 'none',\n },\n});\n\nconst GripElement = tasty({\n qa: 'BoardResizeGrip',\n styles: {\n position: 'absolute',\n width: '10px',\n height: '10px',\n boxSizing: 'border-box',\n pointerEvents: 'none',\n opacity: {\n '': 0,\n revealed: 1,\n },\n transition: 'opacity 120ms ease-in-out',\n borderTop: {\n '': '0',\n '[data-axis=\"ne\"] | [data-axis=\"nw\"]': '2px solid #dark.40',\n },\n borderBottom: {\n '': '0',\n '[data-axis=\"se\"] | [data-axis=\"sw\"]': '2px solid #dark.40',\n },\n borderLeft: {\n '': '0',\n '[data-axis=\"nw\"] | [data-axis=\"sw\"]': '2px solid #dark.40',\n },\n borderRight: {\n '': '0',\n '[data-axis=\"ne\"] | [data-axis=\"se\"]': '2px solid #dark.40',\n },\n radius: {\n '': '0',\n '[data-axis=\"se\"]': '0 0 4px 0',\n '[data-axis=\"sw\"]': '0 0 0 4px',\n '[data-axis=\"ne\"]': '0 4px 0 0',\n '[data-axis=\"nw\"]': '4px 0 0 0',\n },\n top: {\n '': 'auto',\n '[data-axis=\"ne\"] | [data-axis=\"nw\"]': '4px',\n },\n bottom: {\n '': 'auto',\n '[data-axis=\"se\"] | [data-axis=\"sw\"]': '4px',\n },\n left: {\n '': 'auto',\n '[data-axis=\"nw\"] | [data-axis=\"sw\"]': '4px',\n },\n right: {\n '': 'auto',\n '[data-axis=\"ne\"] | [data-axis=\"se\"]': '4px',\n },\n },\n});\n\n// Edge axes (n/s/e/w) get a dotted grip affordance, revealed on\n// hover/focus/resize. The dots line up along the edge (a vertical column for the\n// e/w handles, a horizontal row for n/s), matching the design-system pane grip\n// (see `Layout.Pane`). Purely visual - the interaction still lives on the\n// transparent `HandleElement` hit-zone above.\nconst EdgeGripElement = tasty({\n qa: 'BoardResizeEdgeGrip',\n styles: {\n position: 'absolute',\n display: 'grid',\n gap: '2bw',\n boxSizing: 'border-box',\n pointerEvents: 'none',\n opacity: {\n '': 0,\n revealed: 1,\n },\n transition: 'opacity 120ms ease-in-out',\n // A column of 5 dots for the vertical edges (e/w), a row of 5 for n/s.\n gridColumns: {\n '': '3px',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '3px 3px 3px 3px 3px',\n },\n gridRows: {\n '': '3px 3px 3px 3px 3px',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '3px',\n },\n // Anchor to the relevant edge and center along it.\n top: {\n '': '50%',\n '[data-axis=\"n\"]': '3px',\n '[data-axis=\"s\"]': 'auto',\n },\n bottom: {\n '': 'auto',\n '[data-axis=\"s\"]': '3px',\n },\n left: {\n '': 'auto',\n '[data-axis=\"w\"]': '3px',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '50%',\n },\n right: {\n '': 'auto',\n '[data-axis=\"e\"]': '3px',\n },\n transform: {\n '': 'translate(0, 0)',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': 'translate(0, -50%)',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': 'translate(-50%, 0)',\n },\n\n Dot: {\n width: '3px',\n height: '3px',\n radius: 'round',\n fill: {\n '': '#dark-03',\n resizing: '#dark-02',\n },\n },\n },\n});\n\n/** Corner axes get a visible grip affordance on hover/focus/resize. */\nfunction isCornerAxis(axis: ResizeHandleAxis): boolean {\n return axis.length === 2;\n}\n\n/** Edge axes (n/s/e/w) get a dotted grip affordance. */\nfunction isEdgeAxis(axis: ResizeHandleAxis): boolean {\n return axis.length === 1;\n}\n\ninterface ResizeHandleProps {\n axis: ResizeHandleAxis;\n onResize: (\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => void;\n}\n\nfunction ResizeHandle({ axis, onResize }: ResizeHandleProps) {\n const { moveProps } = useMove({\n onMoveStart() {\n onResize(axis, 'start', 0, 0);\n },\n onMove(e) {\n onResize(axis, 'move', e.deltaX, e.deltaY);\n },\n onMoveEnd() {\n onResize(axis, 'end', 0, 0);\n },\n });\n\n const stopProps = {\n onPointerDown: (e: React.PointerEvent) => e.stopPropagation(),\n onMouseDown: (e: React.MouseEvent) => e.stopPropagation(),\n onTouchStart: (e: React.TouchEvent) => e.stopPropagation(),\n };\n\n return (\n <HandleElement\n data-axis={axis}\n {...mergeProps(stopProps, moveProps)}\n aria-hidden=\"true\"\n />\n );\n}\n\nexport interface WidgetHostProps {\n boardId: string;\n item: LayoutItem;\n positionParams: PositionParams;\n registration: WidgetRegistration | undefined;\n isDraggable: boolean;\n isResizable: boolean;\n resizeHandles: ResizeHandleAxis[];\n /**\n * CSS selector for elements that must not start a pointer drag (e.g. form\n * controls inside the widget). A pointer-down whose target matches this\n * selector never begins a drag.\n */\n dragCancel?: string;\n /**\n * CSS selector for the only elements from which a pointer drag may start. A\n * pointer-down outside a matching element never begins a drag.\n */\n dragHandle?: string;\n registry: BoardRegistryContextValue;\n dragState: BoardDragState | null;\n onResize: (\n id: string,\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => void;\n /**\n * Report the minimum number of rows this widget needs to fit its content\n * (typically a nested board). The owning board grows the item to this height\n * when it is taller than the current one, and treats it as the resize floor\n * so the widget cannot be dragged shorter than its content requires.\n */\n onAutoHeight: (id: string, neededRows: number) => void;\n /**\n * Notify the owning board of a drag gesture's lifecycle so it can emit the\n * public drag callbacks. Fires after the registry has updated drag state.\n */\n onDragLifecycle?: (id: string, phase: ResizePhase) => void;\n}\n\n/**\n * The positioned, interactive wrapper a board renders for each layout item it\n * owns. Content is pulled from the shared store (by id), so any board can host\n * any widget. Dragging uses React Aria `useMove`; during a drag the widget\n * renders into the shared overlay portal so it can float outside its board.\n */\nexport function WidgetHost(props: WidgetHostProps) {\n const {\n boardId,\n item,\n positionParams,\n registration,\n isDraggable,\n isResizable,\n resizeHandles,\n dragCancel,\n dragHandle,\n registry,\n dragState,\n onResize,\n onAutoHeight,\n onDragLifecycle,\n } = props;\n\n const hostRef = useRef<HTMLDivElement | null>(null);\n const isActiveDrag = dragState?.itemId === item.i;\n const isAutoHeight = registration?.isAutoHeight === true;\n\n // Translate a nested board's reported height deficit (signed px: positive when\n // it is squeezed, negative when it has slack) into the absolute number of rows\n // this widget needs, and report it to the owning board. The widget's chrome\n // cancels out: the needed pixel height is the widget's current pixel height\n // plus the deficit. A small tolerance keeps sub-pixel rounding from bumping an\n // extra row. Skipped during a drag (the widget is floating in the overlay).\n const requestHeightDeficit = useEvent((deficitPx: number) => {\n if (!isAutoHeight || isActiveDrag) return;\n const step = positionParams.rowHeight + positionParams.margin[1];\n if (step <= 0) return;\n const current = calcGridItemPosition(\n positionParams,\n item.x,\n item.y,\n item.w,\n item.h,\n );\n const neededPx = current.height + deficitPx;\n const neededRows = Math.max(\n 1,\n Math.ceil(\n (neededPx + positionParams.margin[1] - AUTO_HEIGHT_TOLERANCE) / step,\n ),\n );\n onAutoHeight(item.i, neededRows);\n });\n\n const hostValue = useMemo<BoardHost>(\n () => ({ isAutoHeight, requestHeightDeficit }),\n [isAutoHeight, requestHeightDeficit],\n );\n // Keyboard drags stay in place: moving the focused element into the overlay\n // portal would unmount it and stop arrow-key move events.\n const useOverlay = isActiveDrag && dragState?.pointerType !== 'keyboard';\n\n const [isResizing, setIsResizing] = useState(false);\n const [isFocusWithin, setIsFocusWithin] = useState(false);\n const { hoverProps, isHovered } = useHover({ isDisabled: isActiveDrag });\n const { focusWithinProps } = useFocusWithin({\n onFocusWithinChange: setIsFocusWithin,\n });\n\n // Reveal the resize grips when the widget is interacted with (but not while it\n // is being dragged, where the widget floats in the overlay).\n const gripsRevealed =\n isResizable &&\n !item.static &&\n !isActiveDrag &&\n (isHovered || isFocusWithin || isResizing);\n\n const { moveProps } = useMove({\n onMoveStart(e) {\n if (!isDraggable) return;\n const rect = hostRef.current?.getBoundingClientRect();\n const pos = calcGridItemPosition(\n positionParams,\n item.x,\n item.y,\n item.w,\n item.h,\n );\n const vr: ViewportRect = rect\n ? {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n : {\n left: pos.left,\n top: pos.top,\n width: pos.width,\n height: pos.height,\n };\n registry.onDragStart(boardId, item.i, vr, e.pointerType, hostRef.current);\n onDragLifecycle?.(item.i, 'start');\n },\n onMove(e) {\n if (!isDraggable) return;\n if (e.pointerType === 'keyboard') {\n // Amplify arrow-key steps to a full grid cell so items actually move.\n const colWidth = calcGridColWidth(positionParams);\n const stepX = colWidth + positionParams.margin[0];\n const stepY = positionParams.rowHeight + positionParams.margin[1];\n registry.onDragMove(\n Math.sign(e.deltaX) * stepX,\n Math.sign(e.deltaY) * stepY,\n e.pointerType,\n );\n onDragLifecycle?.(item.i, 'move');\n return;\n }\n registry.onDragMove(e.deltaX, e.deltaY, e.pointerType);\n onDragLifecycle?.(item.i, 'move');\n },\n onMoveEnd() {\n if (!isDraggable) return;\n registry.onDragEnd();\n onDragLifecycle?.(item.i, 'end');\n },\n });\n\n const a11yProps = {\n tabIndex: isDraggable ? 0 : undefined,\n 'aria-roledescription': isDraggable ? 'Draggable widget' : undefined,\n 'aria-label': registration?.qa ?? item.i,\n };\n\n // When this widget is draggable it owns its gesture, so stop the pointer-down\n // from bubbling to an ancestor widget host (e.g. a container widget hosting a\n // nested board / Tabs). Otherwise the ancestor's `useMove` would start a\n // second drag from the same press and the whole parent widget would move too.\n // Non-draggable widgets let the event bubble so their container stays grabbable\n // through their content.\n const stopBubbleProps = isDraggable\n ? {\n onPointerDown: (e: React.PointerEvent) => e.stopPropagation(),\n onMouseDown: (e: React.MouseEvent) => e.stopPropagation(),\n onTouchStart: (e: React.TouchEvent) => e.stopPropagation(),\n }\n : {};\n\n // Gate a pointer drag by `dragHandle` / `dragCancel` selectors. Returns true\n // when the press must NOT start a drag (outside a `dragHandle`, or matching\n // `dragCancel`).\n const shouldGateDrag = (target: EventTarget | null) => {\n if (!(target instanceof Element)) return false;\n if (dragHandle && !target.closest(dragHandle)) return true;\n return !!(dragCancel && target.closest(dragCancel));\n };\n\n // The gate wraps `useMove`'s own pointer-down handlers rather than a separate\n // capture-phase listener. When a press is gated we simply do not forward it to\n // `useMove`, so the drag never begins. This is deliberate: `useMove`'s\n // pointer-down handler calls both `stopPropagation()` and `preventDefault()`.\n // Calling it (or pre-empting it with a capture-phase `stopPropagation()`)\n // would break the very controls `dragCancel` is meant to protect - a\n // `preventDefault()` on pointer-down cancels a native `<input>`'s focus, and a\n // capture-phase `stopPropagation()` swallows a `<button>`'s own press events.\n // Skipping `useMove` entirely leaves the target's default behavior and its own\n // handlers fully intact. Keyboard moves go through `onKeyDown` and are never\n // gated.\n const gatedMoveProps =\n isDraggable && (dragHandle || dragCancel)\n ? {\n ...moveProps,\n ...(moveProps.onPointerDown && {\n onPointerDown: (e: React.PointerEvent) => {\n if (shouldGateDrag(e.target)) return;\n moveProps.onPointerDown!(e);\n },\n }),\n ...(moveProps.onMouseDown && {\n onMouseDown: (e: React.MouseEvent) => {\n if (shouldGateDrag(e.target)) return;\n moveProps.onMouseDown!(e);\n },\n }),\n ...(moveProps.onTouchStart && {\n onTouchStart: (e: React.TouchEvent) => {\n if (shouldGateDrag(e.target)) return;\n moveProps.onTouchStart!(e);\n },\n }),\n }\n : moveProps;\n\n const handleResize = (\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => {\n if (phase === 'start') setIsResizing(true);\n else if (phase === 'end') setIsResizing(false);\n onResize(item.i, axis, phase, dx, dy);\n };\n\n const mods = {\n drag: isActiveDrag,\n draggable: isDraggable && !isActiveDrag,\n static: !!item.static,\n resizing: isResizing,\n };\n\n const content = (\n <BoardHostContext.Provider value={hostValue}>\n {registration?.content}\n {isResizable && !item.static ? (\n <>\n {resizeHandles.map((axis) => (\n <ResizeHandle key={axis} axis={axis} onResize={handleResize} />\n ))}\n {resizeHandles.filter(isCornerAxis).map((axis) => (\n <GripElement\n key={`grip-${axis}`}\n data-axis={axis}\n mods={{ revealed: gripsRevealed }}\n aria-hidden=\"true\"\n />\n ))}\n {resizeHandles.filter(isEdgeAxis).map((axis) => (\n <EdgeGripElement\n key={`edge-grip-${axis}`}\n data-axis={axis}\n mods={{ revealed: gripsRevealed, resizing: isResizing }}\n aria-hidden=\"true\"\n >\n <div data-element=\"Dot\" />\n <div data-element=\"Dot\" />\n <div data-element=\"Dot\" />\n <div data-element=\"Dot\" />\n <div data-element=\"Dot\" />\n </EdgeGripElement>\n ))}\n </>\n ) : null}\n </BoardHostContext.Provider>\n );\n\n const pos = calcGridItemPosition(\n positionParams,\n item.x,\n item.y,\n item.w,\n item.h,\n );\n\n // While dragging with a pointer, the widget's visual floats in the shared\n // overlay so it is never clipped by an ancestor's `overflow: hidden`. The\n // gesture-owning element (the one carrying `moveProps`) must NOT be the node\n // that moves into the overlay: React Aria's `useMove` binds its pointer\n // move/end listeners relative to the node that received `onPointerDown`, and\n // relocating that node into the portal tears it down and mounts a fresh one\n // (inside a `pointerEvents: 'none'` layer), which can drop the in-flight\n // gesture. Instead we keep a stable, always-mounted in-grid host that owns the\n // gesture for its whole lifetime, and portal a separate, non-interactive\n // visual clone into the overlay.\n const overlayNode = registry.overlayRef.current;\n const floatInOverlay = useOverlay && !!overlayNode && !!dragState;\n\n const hostStyle: CSSProperties = {\n transform: `translate(${pos.left}px, ${pos.top}px)`,\n width: `${pos.width}px`,\n height: `${pos.height}px`,\n // Kept mounted but hidden while its clone floats, so the gesture stays live\n // on this node (the pointer listeners never get torn down).\n ...(floatInOverlay ? { opacity: 0, pointerEvents: 'none' } : null),\n };\n\n // The floating clone carries the \"drag\" affordance (raised shadow/z-index);\n // keep the hidden host flat. Keyboard drags (which never float) still\n // highlight the in-grid host, so only suppress `drag` when floating.\n const hostMods = { ...mods, drag: isActiveDrag && !floatInOverlay };\n\n // The host is always rendered first, with a stable element shape, so React\n // reuses the same DOM node across the drag transition (never remounts it).\n const host = (\n <WidgetElement\n ref={hostRef}\n // Marks this element as a board widget host so the registry can find the\n // container widget a nested board lives in (used to keep a drag anchored to\n // a nested board while the anchor is still over its host - e.g. the Tabs\n // header above a nested board - instead of reflowing the ancestor board).\n data-board-widget-host=\"\"\n {...mergeProps(\n gatedMoveProps,\n stopBubbleProps,\n hoverProps,\n focusWithinProps,\n a11yProps,\n { style: hostStyle },\n )}\n qa={registration?.qa}\n mods={hostMods}\n styles={registration?.styles as Styles}\n >\n {floatInOverlay ? null : content}\n </WidgetElement>\n );\n\n const overlayClone = floatInOverlay\n ? createPortal(\n <WidgetElement\n style={{\n position: 'absolute',\n left: `${dragState!.rect.left}px`,\n top: `${dragState!.rect.top}px`,\n width: `${dragState!.rect.width}px`,\n height: `${dragState!.rect.height}px`,\n pointerEvents: 'none',\n }}\n mods={{ ...mods, drag: true, floating: true }}\n styles={registration?.styles as Styles}\n aria-hidden=\"true\"\n >\n {content}\n </WidgetElement>,\n overlayNode!,\n )\n : null;\n\n return (\n <>\n {host}\n {overlayClone}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"WidgetHost.js","names":["mergeProps"],"sources":["../../../../src/components/layout/Board/WidgetHost.tsx"],"sourcesContent":["import { Styles, tasty } from '@tenphi/tasty';\nimport { CSSProperties, useMemo, useRef, useState } from 'react';\nimport { useFocusWithin, useHover, useMove } from 'react-aria';\nimport { createPortal } from 'react-dom';\n\nimport { useEvent } from '../../../_internal/hooks';\nimport { mergeProps } from '../../../utils/react';\n\nimport {\n BoardDragState,\n BoardHost,\n BoardHostContext,\n BoardRegistryContextValue,\n ViewportRect,\n} from './board-context';\nimport { WidgetRegistration } from './board-store';\nimport {\n calcGridColWidth,\n calcGridItemPosition,\n LayoutItem,\n PositionParams,\n ResizeHandleAxis,\n} from './grid-core';\n\nexport type ResizePhase = 'start' | 'move' | 'end';\n\n/**\n * Slack (px) absorbed when converting an auto-height widget's content height to\n * whole rows, so sub-pixel measurement/rounding noise never bumps an extra row.\n */\nconst AUTO_HEIGHT_TOLERANCE = 4;\n\nconst WidgetElement = tasty({\n qa: 'BoardWidget',\n styles: {\n position: 'absolute',\n top: 0,\n left: 0,\n // Widgets always carry a `#surface-2` fill and rounded corners. The `card`\n // modifier (board-level `widgetProps.isCard` or per-widget `isCard`) adds a\n // border on top; a non-card widget is borderless so nested boards can align\n // their columns flush with the parent grid.\n fill: '#surface-2',\n radius: '1cr',\n border: {\n '': false,\n card: true,\n },\n shadow: {\n '': false,\n 'hovered & !card & (draggable | resizing)': '0 0 0 1bw #border',\n // `$dialog-shadow` uses Glaze `#shadow-lg`, which adapts to dark / high-contrast schemes.\n 'drag | resizing': '$dialog-shadow',\n },\n zIndex: {\n '': 1,\n 'drag | resizing': 10,\n },\n // The pointer-drag ghost (the clone that floats in the overlay) is slightly\n // translucent so the user can see through it to whatever it hovers over -\n // e.g. a Tabs header underneath - and land a precise drop / tab switch. The\n // in-place host (keyboard drags, which never float) stays fully opaque.\n opacity: {\n '': 1,\n floating: 0.8,\n },\n // Reflowing widgets animate their position via the `inset` group (left/top).\n // The actively dragged/resized element - and the floating overlay clone -\n // must track the pointer with no lag, so they drop `inset` from the list.\n transition: {\n '': 'theme, shadow, opacity, inset',\n 'drag | floating | resizing': 'theme, shadow, opacity',\n },\n boxSizing: 'border-box',\n userSelect: {\n '': 'auto',\n 'drag | resizing': 'none',\n },\n cursor: {\n '': 'auto',\n draggable: 'grab',\n drag: 'grabbing',\n },\n touchAction: 'none',\n overflow: 'hidden',\n },\n});\n\nconst HandleElement = tasty({\n qa: 'BoardResizeHandle',\n styles: {\n position: 'absolute',\n zIndex: 20,\n fill: '#clear',\n // Overhang: how far the hit-zone extends beyond the widget edge.\n '--handle-size': '24px',\n '--handle-overhang': '-8px',\n '--handle-inset': '8px',\n width: {\n '': '$handle-size',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': 'auto',\n },\n height: {\n '': '$handle-size',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': 'auto',\n },\n top: {\n '': 'auto',\n '[data-axis=\"n\"] | [data-axis=\"ne\"] | [data-axis=\"nw\"]':\n '$handle-overhang',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': '$handle-inset',\n },\n bottom: {\n '': 'auto',\n '[data-axis=\"s\"] | [data-axis=\"se\"] | [data-axis=\"sw\"]':\n '$handle-overhang',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': '$handle-inset',\n },\n left: {\n '': 'auto',\n '[data-axis=\"w\"] | [data-axis=\"nw\"] | [data-axis=\"sw\"]':\n '$handle-overhang',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '$handle-inset',\n },\n right: {\n '': 'auto',\n '[data-axis=\"e\"] | [data-axis=\"ne\"] | [data-axis=\"se\"]':\n '$handle-overhang',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '$handle-inset',\n },\n cursor: {\n '': 'default',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': 'ns-resize',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': 'ew-resize',\n '[data-axis=\"ne\"] | [data-axis=\"sw\"]': 'nesw-resize',\n '[data-axis=\"nw\"] | [data-axis=\"se\"]': 'nwse-resize',\n },\n touchAction: 'none',\n },\n});\n\nconst GripElement = tasty({\n qa: 'BoardResizeGrip',\n styles: {\n position: 'absolute',\n width: '10px',\n height: '10px',\n boxSizing: 'border-box',\n pointerEvents: 'none',\n opacity: {\n '': 0,\n revealed: 1,\n },\n transition: 'opacity 120ms ease-in-out',\n borderTop: {\n '': '0',\n '[data-axis=\"ne\"] | [data-axis=\"nw\"]': '2px solid #dark.40',\n },\n borderBottom: {\n '': '0',\n '[data-axis=\"se\"] | [data-axis=\"sw\"]': '2px solid #dark.40',\n },\n borderLeft: {\n '': '0',\n '[data-axis=\"nw\"] | [data-axis=\"sw\"]': '2px solid #dark.40',\n },\n borderRight: {\n '': '0',\n '[data-axis=\"ne\"] | [data-axis=\"se\"]': '2px solid #dark.40',\n },\n radius: {\n '': '0',\n '[data-axis=\"se\"]': '0 0 4px 0',\n '[data-axis=\"sw\"]': '0 0 0 4px',\n '[data-axis=\"ne\"]': '0 4px 0 0',\n '[data-axis=\"nw\"]': '4px 0 0 0',\n },\n top: {\n '': 'auto',\n '[data-axis=\"ne\"] | [data-axis=\"nw\"]': '4px',\n },\n bottom: {\n '': 'auto',\n '[data-axis=\"se\"] | [data-axis=\"sw\"]': '4px',\n },\n left: {\n '': 'auto',\n '[data-axis=\"nw\"] | [data-axis=\"sw\"]': '4px',\n },\n right: {\n '': 'auto',\n '[data-axis=\"ne\"] | [data-axis=\"se\"]': '4px',\n },\n },\n});\n\n// Edge axes (n/s/e/w) get a dotted grip affordance, revealed on\n// hover/focus/resize. The dots line up along the edge (a vertical column for the\n// e/w handles, a horizontal row for n/s), matching the design-system pane grip\n// (see `Layout.Pane`). Purely visual - the interaction still lives on the\n// transparent `HandleElement` hit-zone above.\nconst EdgeGripElement = tasty({\n qa: 'BoardResizeEdgeGrip',\n styles: {\n position: 'absolute',\n display: 'grid',\n gap: '2bw',\n boxSizing: 'border-box',\n pointerEvents: 'none',\n opacity: {\n '': 0,\n revealed: 1,\n },\n transition: 'opacity 120ms ease-in-out',\n // A column of 5 dots for the vertical edges (e/w), a row of 5 for n/s.\n gridColumns: {\n '': '3px',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '3px 3px 3px 3px 3px',\n },\n gridRows: {\n '': '3px 3px 3px 3px 3px',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '3px',\n },\n // Anchor to the relevant edge and center along it.\n top: {\n '': '50%',\n '[data-axis=\"n\"]': '3px',\n '[data-axis=\"s\"]': 'auto',\n },\n bottom: {\n '': 'auto',\n '[data-axis=\"s\"]': '3px',\n },\n left: {\n '': 'auto',\n '[data-axis=\"w\"]': '3px',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': '50%',\n },\n right: {\n '': 'auto',\n '[data-axis=\"e\"]': '3px',\n },\n transform: {\n '': 'translate(0, 0)',\n '[data-axis=\"e\"] | [data-axis=\"w\"]': 'translate(0, -50%)',\n '[data-axis=\"n\"] | [data-axis=\"s\"]': 'translate(-50%, 0)',\n },\n\n Dot: {\n width: '3px',\n height: '3px',\n radius: 'round',\n fill: {\n '': '#dark-03',\n resizing: '#dark-02',\n },\n },\n },\n});\n\n/** Corner axes get a visible grip affordance on hover/focus/resize. */\nfunction isCornerAxis(axis: ResizeHandleAxis): boolean {\n return axis.length === 2;\n}\n\n/** Edge axes (n/s/e/w) get a dotted grip affordance. */\nfunction isEdgeAxis(axis: ResizeHandleAxis): boolean {\n return axis.length === 1;\n}\n\ninterface ResizeHandleProps {\n axis: ResizeHandleAxis;\n onResize: (\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => void;\n}\n\nfunction ResizeHandle({ axis, onResize }: ResizeHandleProps) {\n const { moveProps } = useMove({\n onMoveStart() {\n onResize(axis, 'start', 0, 0);\n },\n onMove(e) {\n onResize(axis, 'move', e.deltaX, e.deltaY);\n },\n onMoveEnd() {\n onResize(axis, 'end', 0, 0);\n },\n });\n\n const stopProps = {\n onPointerDown: (e: React.PointerEvent) => e.stopPropagation(),\n onMouseDown: (e: React.MouseEvent) => e.stopPropagation(),\n onTouchStart: (e: React.TouchEvent) => e.stopPropagation(),\n };\n\n return (\n <HandleElement\n data-axis={axis}\n {...mergeProps(stopProps, moveProps)}\n aria-hidden=\"true\"\n />\n );\n}\n\nexport interface WidgetHostProps {\n boardId: string;\n item: LayoutItem;\n positionParams: PositionParams;\n registration: WidgetRegistration | undefined;\n /**\n * Whether this widget renders with card chrome (fill/border/radius). Resolved\n * by the owning `Board` from the per-widget `isCard` and the board-level\n * `widgetProps.isCard` default.\n */\n isCard: boolean;\n /**\n * Resolved style overrides for the rendered widget element (per-widget\n * `styles` falling back to the board-level `widgetProps.styles`).\n */\n styles?: Styles;\n isDraggable: boolean;\n isResizable: boolean;\n resizeHandles: ResizeHandleAxis[];\n /**\n * Whether this widget grows to fit its content. Resolved by the owning\n * `Board` from the per-widget `isAutoHeight` and the board-level\n * `widgetProps.isAutoHeight` default.\n */\n isAutoHeight: boolean;\n /**\n * Test id / accessible name for the rendered widget element. Resolved by the\n * owning `Board` from the per-widget `qa` and the board-level `widgetProps.qa`\n * default; falls back to the layout id.\n */\n qa?: string;\n /**\n * CSS selector for elements that must not start a pointer drag (e.g. form\n * controls inside the widget). A pointer-down whose target matches this\n * selector never begins a drag.\n */\n dragCancel?: string;\n /**\n * CSS selector for the only elements from which a pointer drag may start. A\n * pointer-down outside a matching element never begins a drag.\n */\n dragHandle?: string;\n registry: BoardRegistryContextValue;\n dragState: BoardDragState | null;\n onResize: (\n id: string,\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => void;\n /**\n * Report the minimum number of rows this widget needs to fit its content\n * (typically a nested board). The owning board grows the item to this height\n * when it is taller than the current one, and treats it as the resize floor\n * so the widget cannot be dragged shorter than its content requires.\n */\n onAutoHeight: (id: string, neededRows: number) => void;\n /**\n * Notify the owning board of a drag gesture's lifecycle so it can emit the\n * public drag callbacks. Fires after the registry has updated drag state.\n */\n onDragLifecycle?: (id: string, phase: ResizePhase) => void;\n}\n\n/**\n * The positioned, interactive wrapper a board renders for each layout item it\n * owns. Content is pulled from the shared store (by id), so any board can host\n * any widget. Dragging uses React Aria `useMove`; during a drag the widget\n * renders into the shared overlay portal so it can float outside its board.\n */\nexport function WidgetHost(props: WidgetHostProps) {\n const {\n boardId,\n item,\n positionParams,\n registration,\n isCard,\n styles: widgetStyles,\n isDraggable,\n isResizable,\n resizeHandles,\n isAutoHeight,\n qa,\n dragCancel,\n dragHandle,\n registry,\n dragState,\n onResize,\n onAutoHeight,\n onDragLifecycle,\n } = props;\n\n const hostRef = useRef<HTMLDivElement | null>(null);\n const isActiveDrag = dragState?.itemId === item.i;\n\n // Translate a nested board's reported height deficit (signed px: positive when\n // it is squeezed, negative when it has slack) into the absolute number of rows\n // this widget needs, and report it to the owning board. The widget's chrome\n // cancels out: the needed pixel height is the widget's current pixel height\n // plus the deficit. A small tolerance keeps sub-pixel rounding from bumping an\n // extra row. Skipped during a drag (the widget is floating in the overlay).\n const requestHeightDeficit = useEvent((deficitPx: number) => {\n if (!isAutoHeight || isActiveDrag) return;\n const step = positionParams.rowHeight + positionParams.margin[1];\n if (step <= 0) return;\n const current = calcGridItemPosition(\n positionParams,\n item.x,\n item.y,\n item.w,\n item.h,\n );\n const neededPx = current.height + deficitPx;\n const neededRows = Math.max(\n 1,\n Math.ceil(\n (neededPx + positionParams.margin[1] - AUTO_HEIGHT_TOLERANCE) / step,\n ),\n );\n onAutoHeight(item.i, neededRows);\n });\n\n const hostValue = useMemo<BoardHost>(\n () => ({ isAutoHeight, requestHeightDeficit }),\n [isAutoHeight, requestHeightDeficit],\n );\n // Keyboard drags stay in place: moving the focused element into the overlay\n // portal would unmount it and stop arrow-key move events.\n const useOverlay = isActiveDrag && dragState?.pointerType !== 'keyboard';\n\n const [isResizing, setIsResizing] = useState(false);\n const [isFocusWithin, setIsFocusWithin] = useState(false);\n const { hoverProps, isHovered } = useHover({ isDisabled: isActiveDrag });\n const { focusWithinProps } = useFocusWithin({\n onFocusWithinChange: setIsFocusWithin,\n });\n\n // Reveal the resize grips when the widget is interacted with (but not while it\n // is being dragged, where the widget floats in the overlay).\n const gripsRevealed =\n isResizable &&\n !item.static &&\n !isActiveDrag &&\n (isHovered || isFocusWithin || isResizing);\n\n const { moveProps } = useMove({\n onMoveStart(e) {\n if (!isDraggable) return;\n const rect = hostRef.current?.getBoundingClientRect();\n const pos = calcGridItemPosition(\n positionParams,\n item.x,\n item.y,\n item.w,\n item.h,\n );\n const vr: ViewportRect = rect\n ? {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n }\n : {\n left: pos.left,\n top: pos.top,\n width: pos.width,\n height: pos.height,\n };\n registry.onDragStart(boardId, item.i, vr, e.pointerType, hostRef.current);\n onDragLifecycle?.(item.i, 'start');\n },\n onMove(e) {\n if (!isDraggable) return;\n if (e.pointerType === 'keyboard') {\n // Amplify arrow-key steps to a full grid cell so items actually move.\n const colWidth = calcGridColWidth(positionParams);\n const stepX = colWidth + positionParams.margin[0];\n const stepY = positionParams.rowHeight + positionParams.margin[1];\n registry.onDragMove(\n Math.sign(e.deltaX) * stepX,\n Math.sign(e.deltaY) * stepY,\n e.pointerType,\n );\n onDragLifecycle?.(item.i, 'move');\n return;\n }\n registry.onDragMove(e.deltaX, e.deltaY, e.pointerType);\n onDragLifecycle?.(item.i, 'move');\n },\n onMoveEnd() {\n if (!isDraggable) return;\n registry.onDragEnd();\n onDragLifecycle?.(item.i, 'end');\n },\n });\n\n const a11yProps = {\n tabIndex: isDraggable ? 0 : undefined,\n 'aria-roledescription': isDraggable ? 'Draggable widget' : undefined,\n 'aria-label': qa ?? item.i,\n };\n\n // When this widget is draggable it owns its gesture, so stop the pointer-down\n // from bubbling to an ancestor widget host (e.g. a container widget hosting a\n // nested board / Tabs). Otherwise the ancestor's `useMove` would start a\n // second drag from the same press and the whole parent widget would move too.\n // Non-draggable widgets let the event bubble so their container stays grabbable\n // through their content.\n const stopBubbleProps = isDraggable\n ? {\n onPointerDown: (e: React.PointerEvent) => e.stopPropagation(),\n onMouseDown: (e: React.MouseEvent) => e.stopPropagation(),\n onTouchStart: (e: React.TouchEvent) => e.stopPropagation(),\n }\n : {};\n\n // Gate a pointer drag by `dragHandle` / `dragCancel` selectors. Returns true\n // when the press must NOT start a drag (outside a `dragHandle`, or matching\n // `dragCancel`).\n const shouldGateDrag = (target: EventTarget | null) => {\n if (!(target instanceof Element)) return false;\n if (dragHandle && !target.closest(dragHandle)) return true;\n return !!(dragCancel && target.closest(dragCancel));\n };\n\n // The gate wraps `useMove`'s own pointer-down handlers rather than a separate\n // capture-phase listener. When a press is gated we simply do not forward it to\n // `useMove`, so the drag never begins. This is deliberate: `useMove`'s\n // pointer-down handler calls both `stopPropagation()` and `preventDefault()`.\n // Calling it (or pre-empting it with a capture-phase `stopPropagation()`)\n // would break the very controls `dragCancel` is meant to protect - a\n // `preventDefault()` on pointer-down cancels a native `<input>`'s focus, and a\n // capture-phase `stopPropagation()` swallows a `<button>`'s own press events.\n // Skipping `useMove` entirely leaves the target's default behavior and its own\n // handlers fully intact. Keyboard moves go through `onKeyDown` and are never\n // gated.\n //\n // A non-draggable widget must not carry `moveProps` at all: `useMove`'s\n // pointer-down handler calls `preventDefault()`, which cancels native text\n // selection inside the widget. Read-only boards (`isDraggable={false}`) still\n // need selectable content, so we drop the handlers entirely instead of relying\n // on the early-returns inside the `onMove*` callbacks.\n const gatedMoveProps = !isDraggable\n ? {}\n : dragHandle || dragCancel\n ? {\n ...moveProps,\n ...(moveProps.onPointerDown && {\n onPointerDown: (e: React.PointerEvent) => {\n if (shouldGateDrag(e.target)) return;\n moveProps.onPointerDown!(e);\n },\n }),\n ...(moveProps.onMouseDown && {\n onMouseDown: (e: React.MouseEvent) => {\n if (shouldGateDrag(e.target)) return;\n moveProps.onMouseDown!(e);\n },\n }),\n ...(moveProps.onTouchStart && {\n onTouchStart: (e: React.TouchEvent) => {\n if (shouldGateDrag(e.target)) return;\n moveProps.onTouchStart!(e);\n },\n }),\n }\n : moveProps;\n\n const handleResize = (\n axis: ResizeHandleAxis,\n phase: ResizePhase,\n dx: number,\n dy: number,\n ) => {\n if (phase === 'start') setIsResizing(true);\n else if (phase === 'end') setIsResizing(false);\n onResize(item.i, axis, phase, dx, dy);\n };\n\n const mods = {\n drag: isActiveDrag,\n draggable: isDraggable && !isActiveDrag,\n static: !!item.static,\n resizing: isResizing,\n card: isCard,\n hovered: isHovered,\n };\n\n const content = (\n <BoardHostContext.Provider value={hostValue}>\n {registration?.content}\n {isResizable && !item.static ? (\n <>\n {resizeHandles.map((axis) => (\n <ResizeHandle key={axis} axis={axis} onResize={handleResize} />\n ))}\n {resizeHandles.filter(isCornerAxis).map((axis) => (\n <GripElement\n key={`grip-${axis}`}\n data-axis={axis}\n mods={{ revealed: gripsRevealed }}\n aria-hidden=\"true\"\n />\n ))}\n {resizeHandles.filter(isEdgeAxis).map((axis) => (\n <EdgeGripElement\n key={`edge-grip-${axis}`}\n data-axis={axis}\n mods={{ revealed: gripsRevealed, resizing: isResizing }}\n aria-hidden=\"true\"\n >\n <div data-element=\"Dot\" />\n <div data-element=\"Dot\" />\n <div data-element=\"Dot\" />\n <div data-element=\"Dot\" />\n <div data-element=\"Dot\" />\n </EdgeGripElement>\n ))}\n </>\n ) : null}\n </BoardHostContext.Provider>\n );\n\n const pos = calcGridItemPosition(\n positionParams,\n item.x,\n item.y,\n item.w,\n item.h,\n );\n\n // While dragging with a pointer, the widget's visual floats in the shared\n // overlay so it is never clipped by an ancestor's `overflow: hidden`. The\n // gesture-owning element (the one carrying `moveProps`) must NOT be the node\n // that moves into the overlay: React Aria's `useMove` binds its pointer\n // move/end listeners relative to the node that received `onPointerDown`, and\n // relocating that node into the portal tears it down and mounts a fresh one\n // (inside a `pointerEvents: 'none'` layer), which can drop the in-flight\n // gesture. Instead we keep a stable, always-mounted in-grid host that owns the\n // gesture for its whole lifetime, and portal a separate, non-interactive\n // visual clone into the overlay.\n const overlayNode = registry.overlayRef.current;\n const floatInOverlay = useOverlay && !!overlayNode && !!dragState;\n\n const hostStyle: CSSProperties = {\n left: `${pos.left}px`,\n top: `${pos.top}px`,\n width: `${pos.width}px`,\n height: `${pos.height}px`,\n // Kept mounted but hidden while its clone floats, so the gesture stays live\n // on this node (the pointer listeners never get torn down).\n ...(floatInOverlay ? { opacity: 0, pointerEvents: 'none' } : null),\n };\n\n // The floating clone carries the \"drag\" affordance (raised shadow/z-index);\n // keep the hidden host flat. Keyboard drags (which never float) still\n // highlight the in-grid host, so only suppress `drag` when floating.\n const hostMods = { ...mods, drag: isActiveDrag && !floatInOverlay };\n\n // The host is always rendered first, with a stable element shape, so React\n // reuses the same DOM node across the drag transition (never remounts it).\n const host = (\n <WidgetElement\n ref={hostRef}\n // Marks this element as a board widget host so the registry can find the\n // container widget a nested board lives in (used to keep a drag anchored to\n // a nested board while the anchor is still over its host - e.g. the Tabs\n // header above a nested board - instead of reflowing the ancestor board).\n data-board-widget-host=\"\"\n {...mergeProps(\n gatedMoveProps,\n stopBubbleProps,\n hoverProps,\n focusWithinProps,\n a11yProps,\n { style: hostStyle },\n )}\n qa={qa}\n mods={hostMods}\n styles={widgetStyles as Styles}\n >\n {floatInOverlay ? null : content}\n </WidgetElement>\n );\n\n const overlayClone = floatInOverlay\n ? createPortal(\n <WidgetElement\n style={{\n position: 'absolute',\n left: `${dragState!.rect.left}px`,\n top: `${dragState!.rect.top}px`,\n width: `${dragState!.rect.width}px`,\n height: `${dragState!.rect.height}px`,\n pointerEvents: 'none',\n }}\n mods={{ ...mods, drag: true, floating: true }}\n styles={widgetStyles as Styles}\n aria-hidden=\"true\"\n >\n {content}\n </WidgetElement>,\n overlayNode!,\n )\n : null;\n\n return (\n <>\n {host}\n {overlayClone}\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  import { createContext, useContext } from "react";
3
3
 
4
4
  //#region src/components/layout/Board/board-context.tsx
@@ -18,6 +18,16 @@ const BoardDragActiveContext = createContext(false);
18
18
  function useBoardDragActive() {
19
19
  return useContext(BoardDragActiveContext);
20
20
  }
21
+ /**
22
+ * Whether an ancestor `Board` has its grid-line overlay enabled. A nested board
23
+ * that does not set `showGridLines` explicitly reads this to inherit the
24
+ * behaviour, showing its own grid lines while a drag is in progress. Defaults to
25
+ * `false` outside any grid-lined board.
26
+ */
27
+ const BoardGridLinesContext = createContext(false);
28
+ function useBoardGridLines() {
29
+ return useContext(BoardGridLinesContext);
30
+ }
21
31
  const BoardMetricsContext = createContext(null);
22
32
  function useBoardMetrics() {
23
33
  return useContext(BoardMetricsContext);
@@ -28,5 +38,5 @@ function useBoardHost() {
28
38
  }
29
39
 
30
40
  //#endregion
31
- export { BoardDragActiveContext, BoardHostContext, BoardMetricsContext, BoardRegistryContext, useBoardDragActive, useBoardHost, useBoardMetrics, useBoardRegistry };
41
+ export { BoardDragActiveContext, BoardGridLinesContext, BoardHostContext, BoardMetricsContext, BoardRegistryContext, useBoardDragActive, useBoardGridLines, useBoardHost, useBoardMetrics, useBoardRegistry };
32
42
  //# sourceMappingURL=board-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"board-context.js","names":[],"sources":["../../../../src/components/layout/Board/board-context.tsx"],"sourcesContent":["import { createContext, MutableRefObject, useContext } from 'react';\n\nimport type { BoardWidgetStore } from './board-store';\nimport type {\n Compactor,\n LayoutConstraint,\n LayoutItem,\n PositionParams,\n} from './grid-core';\n\n/** A rectangle in viewport (client) coordinates. */\nexport interface ViewportRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Everything the cross-board registry needs to read from / write to a single\n * board. Methods read live refs so a single stable entry can be registered once\n * per board and stay current across renders.\n */\nexport interface BoardEntry {\n id: string;\n /** Viewport rect of the content area where widgets are positioned. */\n getContentRect: () => DOMRect | null;\n /** The DOM node of the content area (used to detect nested-in-drag boards). */\n getContentNode: () => HTMLElement | null;\n getPositionParams: () => PositionParams;\n getConstraints: () => LayoutConstraint[];\n getCompactor: () => Compactor;\n getMaxRows: () => number;\n getContainerHeight: () => number;\n getLayout: () => LayoutItem[];\n /** Update the board layout. `commit` fires `onLayoutChange`. */\n applyLayout: (layout: LayoutItem[], commit: boolean) => void;\n setPlaceholder: (item: LayoutItem | null) => void;\n isDroppable: () => boolean;\n}\n\n/** Emitted when a widget is dropped from one board into another. */\nexport interface WidgetTransferInfo {\n widgetId: string;\n fromBoardId: string;\n toBoardId: string;\n item: LayoutItem;\n}\n\n/** Live drag state, shared across boards for overlay + placeholders. */\nexport interface BoardDragState {\n sourceBoardId: string;\n /** Board currently owning the dragged item (changes as it crosses boards). */\n currentBoardId: string;\n itemId: string;\n /** Snapshot of the dragged item (grid units; w/h preserved across boards). */\n item: LayoutItem;\n /** Dragged widget rect in viewport coordinates (follows the pointer). */\n rect: ViewportRect;\n pointerType: string;\n}\n\nexport interface BoardRegistryContextValue {\n store: BoardWidgetStore;\n overlayRef: MutableRefObject<HTMLDivElement | null>;\n registerBoard: (entry: BoardEntry) => () => void;\n onDragStart: (\n boardId: string,\n itemId: string,\n rect: ViewportRect,\n pointerType: string,\n /** The dragged widget's host node, used to exclude boards nested inside it. */\n widgetNode: HTMLElement | null,\n ) => void;\n onDragMove: (deltaX: number, deltaY: number, pointerType: string) => void;\n onDragEnd: () => void;\n dragState: BoardDragState | null;\n}\n\nexport const BoardRegistryContext =\n createContext<BoardRegistryContextValue | null>(null);\n\nexport function useBoardRegistry(): BoardRegistryContextValue | null {\n return useContext(BoardRegistryContext);\n}\n\n/**\n * A stable boolean signalling whether a Board widget is currently being\n * dragged. Provided by `BoardProvider` (and therefore by any standalone\n * `Board`, which self-wraps in one). Unlike the full `dragState`, this only\n * flips on drag start/end, so components that only care about \"is a drag in\n * progress\" (e.g. `Tabs` spring-loading a tab on hover) can subscribe without\n * re-rendering on every pointer move. Defaults to `false` outside any Board.\n */\nexport const BoardDragActiveContext = createContext<boolean>(false);\n\nexport function useBoardDragActive(): boolean {\n return useContext(BoardDragActiveContext);\n}\n\n/**\n * The resolved grid metrics a `Board` exposes to any boards nested inside its\n * widgets. A nested board with `isAligned` reads these to inherit the parent's\n * column pitch (column width + horizontal margin) and target row height, so its\n * cells line up with the surrounding layout instead of stretching.\n */\nexport interface BoardMetrics {\n /** Resolved pixel width of one parent column. */\n colWidth: number;\n /** Resolved parent row height in pixels (the alignment target). */\n rowHeight: number;\n /** Parent [horizontal, vertical] margin between widgets in pixels. */\n margin: readonly [number, number];\n /** Parent [horizontal, vertical] container padding in pixels. */\n containerPadding: readonly [number, number];\n}\n\nexport const BoardMetricsContext = createContext<BoardMetrics | null>(null);\n\nexport function useBoardMetrics(): BoardMetrics | null {\n return useContext(BoardMetricsContext);\n}\n\n/**\n * Information a `WidgetHost` exposes to the content it renders (including a\n * nested `Board`). Lets a nested board know whether its host widget auto-sizes\n * its height and, if so, ask the host to grow to fit the board's natural size.\n */\nexport interface BoardHost {\n /** Whether the host widget grows its height to fit its content. */\n isAutoHeight: boolean;\n /**\n * Ask the host widget to grow so it provides `px` more content height. Only\n * ever increases the host's height. No-op when the host does not auto-size.\n */\n requestHeightDeficit: (px: number) => void;\n}\n\nexport const BoardHostContext = createContext<BoardHost | null>(null);\n\nexport function useBoardHost(): BoardHost | null {\n return useContext(BoardHostContext);\n}\n"],"mappings":";;;;AA+EA,MAAa,uBACX,cAAgD,KAAK;AAEvD,SAAgB,mBAAqD;AACnE,QAAO,WAAW,qBAAqB;;;;;;;;;;AAWzC,MAAa,yBAAyB,cAAuB,MAAM;AAEnE,SAAgB,qBAA8B;AAC5C,QAAO,WAAW,uBAAuB;;AAoB3C,MAAa,sBAAsB,cAAmC,KAAK;AAE3E,SAAgB,kBAAuC;AACrD,QAAO,WAAW,oBAAoB;;AAkBxC,MAAa,mBAAmB,cAAgC,KAAK;AAErE,SAAgB,eAAiC;AAC/C,QAAO,WAAW,iBAAiB"}
1
+ {"version":3,"file":"board-context.js","names":[],"sources":["../../../../src/components/layout/Board/board-context.tsx"],"sourcesContent":["import { createContext, MutableRefObject, useContext } from 'react';\n\nimport type { BoardWidgetStore } from './board-store';\nimport type {\n Compactor,\n LayoutConstraint,\n LayoutItem,\n PositionParams,\n} from './grid-core';\n\n/** A rectangle in viewport (client) coordinates. */\nexport interface ViewportRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Everything the cross-board registry needs to read from / write to a single\n * board. Methods read live refs so a single stable entry can be registered once\n * per board and stay current across renders.\n */\nexport interface BoardEntry {\n id: string;\n /** Viewport rect of the content area where widgets are positioned. */\n getContentRect: () => DOMRect | null;\n /** The DOM node of the content area (used to detect nested-in-drag boards). */\n getContentNode: () => HTMLElement | null;\n getPositionParams: () => PositionParams;\n getConstraints: () => LayoutConstraint[];\n getCompactor: () => Compactor;\n getMaxRows: () => number;\n getContainerHeight: () => number;\n getLayout: () => LayoutItem[];\n /** Update the board layout. `commit` fires `onLayoutChange`. */\n applyLayout: (layout: LayoutItem[], commit: boolean) => void;\n setPlaceholder: (item: LayoutItem | null) => void;\n isDroppable: () => boolean;\n}\n\n/** Emitted when a widget is dropped from one board into another. */\nexport interface WidgetTransferInfo {\n widgetId: string;\n fromBoardId: string;\n toBoardId: string;\n item: LayoutItem;\n}\n\n/** Live drag state, shared across boards for overlay + placeholders. */\nexport interface BoardDragState {\n sourceBoardId: string;\n /** Board currently owning the dragged item (changes as it crosses boards). */\n currentBoardId: string;\n itemId: string;\n /** Snapshot of the dragged item (grid units; w/h preserved across boards). */\n item: LayoutItem;\n /** Dragged widget rect in viewport coordinates (follows the pointer). */\n rect: ViewportRect;\n pointerType: string;\n /**\n * Ids of boards nested inside the dragged widget, captured at drag start.\n * Such a board is never a drop target, and it suppresses its own grid-line\n * overlay while its host widget is being dragged (the whole widget floats, so\n * the inner grid lines would only add clutter).\n */\n nestedBoardIds: Set<string>;\n}\n\nexport interface BoardRegistryContextValue {\n store: BoardWidgetStore;\n overlayRef: MutableRefObject<HTMLDivElement | null>;\n registerBoard: (entry: BoardEntry) => () => void;\n onDragStart: (\n boardId: string,\n itemId: string,\n rect: ViewportRect,\n pointerType: string,\n /** The dragged widget's host node, used to exclude boards nested inside it. */\n widgetNode: HTMLElement | null,\n ) => void;\n onDragMove: (deltaX: number, deltaY: number, pointerType: string) => void;\n onDragEnd: () => void;\n dragState: BoardDragState | null;\n}\n\nexport const BoardRegistryContext =\n createContext<BoardRegistryContextValue | null>(null);\n\nexport function useBoardRegistry(): BoardRegistryContextValue | null {\n return useContext(BoardRegistryContext);\n}\n\n/**\n * A stable boolean signalling whether a Board widget is currently being\n * dragged. Provided by `BoardProvider` (and therefore by any standalone\n * `Board`, which self-wraps in one). Unlike the full `dragState`, this only\n * flips on drag start/end, so components that only care about \"is a drag in\n * progress\" (e.g. `Tabs` spring-loading a tab on hover) can subscribe without\n * re-rendering on every pointer move. Defaults to `false` outside any Board.\n */\nexport const BoardDragActiveContext = createContext<boolean>(false);\n\nexport function useBoardDragActive(): boolean {\n return useContext(BoardDragActiveContext);\n}\n\n/**\n * Whether an ancestor `Board` has its grid-line overlay enabled. A nested board\n * that does not set `showGridLines` explicitly reads this to inherit the\n * behaviour, showing its own grid lines while a drag is in progress. Defaults to\n * `false` outside any grid-lined board.\n */\nexport const BoardGridLinesContext = createContext<boolean>(false);\n\nexport function useBoardGridLines(): boolean {\n return useContext(BoardGridLinesContext);\n}\n\n/**\n * The resolved grid metrics a `Board` exposes to any boards nested inside its\n * widgets. A nested board with `isAligned` reads these to inherit the parent's\n * column pitch (column width + horizontal margin) and target row height, so its\n * cells line up with the surrounding layout instead of stretching.\n */\nexport interface BoardMetrics {\n /** Resolved pixel width of one parent column. */\n colWidth: number;\n /** Resolved parent row height in pixels (the alignment target). */\n rowHeight: number;\n /** Parent [horizontal, vertical] margin between widgets in pixels. */\n margin: readonly [number, number];\n /** Parent [horizontal, vertical] container padding in pixels. */\n containerPadding: readonly [number, number];\n}\n\nexport const BoardMetricsContext = createContext<BoardMetrics | null>(null);\n\nexport function useBoardMetrics(): BoardMetrics | null {\n return useContext(BoardMetricsContext);\n}\n\n/**\n * Information a `WidgetHost` exposes to the content it renders (including a\n * nested `Board`). Lets a nested board know whether its host widget auto-sizes\n * its height and, if so, ask the host to grow to fit the board's natural size.\n */\nexport interface BoardHost {\n /** Whether the host widget grows its height to fit its content. */\n isAutoHeight: boolean;\n /**\n * Ask the host widget to grow so it provides `px` more content height. Only\n * ever increases the host's height. No-op when the host does not auto-size.\n */\n requestHeightDeficit: (px: number) => void;\n}\n\nexport const BoardHostContext = createContext<BoardHost | null>(null);\n\nexport function useBoardHost(): BoardHost | null {\n return useContext(BoardHostContext);\n}\n"],"mappings":";;;;AAsFA,MAAa,uBACX,cAAgD,KAAK;AAEvD,SAAgB,mBAAqD;AACnE,QAAO,WAAW,qBAAqB;;;;;;;;;;AAWzC,MAAa,yBAAyB,cAAuB,MAAM;AAEnE,SAAgB,qBAA8B;AAC5C,QAAO,WAAW,uBAAuB;;;;;;;;AAS3C,MAAa,wBAAwB,cAAuB,MAAM;AAElE,SAAgB,oBAA6B;AAC3C,QAAO,WAAW,sBAAsB;;AAoB1C,MAAa,sBAAsB,cAAmC,KAAK;AAE3E,SAAgB,kBAAuC;AACrD,QAAO,WAAW,oBAAoB;;AAkBxC,MAAa,mBAAmB,cAAgC,KAAK;AAErE,SAAgB,eAAiC;AAC/C,QAAO,WAAW,iBAAiB"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  //#region src/components/layout/Board/board-store.ts
3
3
  /**
4
4
  * A tiny external store mapping widget id -> registration.
@@ -16,7 +16,7 @@ var BoardWidgetStore = class {
16
16
  const prev = this.map.get(reg.id);
17
17
  this.map.set(reg.id, reg);
18
18
  this.owners.set(reg.id, owner);
19
- if (!prev || prev.content !== reg.content || prev.isDraggable !== reg.isDraggable || prev.isResizable !== reg.isResizable || prev.resizeHandles !== reg.resizeHandles || prev.constraints !== reg.constraints || prev.qa !== reg.qa || prev.styles !== reg.styles || prev.isAutoHeight !== reg.isAutoHeight || prev.dragCancel !== reg.dragCancel || prev.dragHandle !== reg.dragHandle) {
19
+ if (!prev || prev.content !== reg.content || prev.isDraggable !== reg.isDraggable || prev.isResizable !== reg.isResizable || prev.resizeHandles !== reg.resizeHandles || prev.isCard !== reg.isCard || prev.minW !== reg.minW || prev.maxW !== reg.maxW || prev.minH !== reg.minH || prev.maxH !== reg.maxH || prev.constraints !== reg.constraints || prev.qa !== reg.qa || prev.styles !== reg.styles || prev.isAutoHeight !== reg.isAutoHeight || prev.dragCancel !== reg.dragCancel || prev.dragHandle !== reg.dragHandle) {
20
20
  this.version++;
21
21
  this.emit();
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"board-store.js","names":[],"sources":["../../../../src/components/layout/Board/board-store.ts"],"sourcesContent":["import type { Styles } from '@tenphi/tasty';\nimport type { ReactNode } from 'react';\nimport type { LayoutConstraint, ResizeHandleAxis } from './grid-core';\n\n/**\n * Declarative registration for a single widget.\n *\n * Widget *content* is decoupled from widget *position*: content is registered\n * here by `Board.Widget` keyed by id, while positioning/ownership lives in a\n * board's layout state. This decoupling is what allows a widget to be hosted\n * (and transferred) between different boards under the same `BoardProvider`.\n */\nexport interface WidgetRegistration {\n id: string;\n content: ReactNode;\n isDraggable?: boolean;\n isResizable?: boolean;\n resizeHandles?: ResizeHandleAxis[];\n constraints?: LayoutConstraint[];\n qa?: string;\n styles?: Styles;\n /** Grow this widget's height to fit its content (only ever increases). */\n isAutoHeight?: boolean;\n /** Override the board's `dragCancel` selector for this widget. */\n dragCancel?: string;\n /** Override the board's `dragHandle` selector for this widget. */\n dragHandle?: string;\n}\n\n/**\n * A tiny external store mapping widget id -> registration.\n *\n * Boards read from it via `useSyncExternalStore`, so a change to any widget's\n * content or config re-renders the hosting board without prop drilling through\n * the (possibly cross-board) tree.\n */\nexport class BoardWidgetStore {\n private map = new Map<string, WidgetRegistration>();\n // Tracks which mounted `Board.Widget` instance currently owns each id. This\n // guards against a stale unregister from an unmounting instance clobbering a\n // freshly-mounted instance's registration - which happens when a widget's\n // subtree is relocated (e.g. dragging a container widget that hosts a nested\n // board moves it into the overlay portal, remounting the inner widgets).\n private owners = new Map<string, object>();\n private listeners = new Set<() => void>();\n private version = 0;\n\n register(reg: WidgetRegistration, owner: object): void {\n const prev = this.map.get(reg.id);\n this.map.set(reg.id, reg);\n this.owners.set(reg.id, owner);\n\n // Notify on any reference change. The hosting board reads registrations\n // during render, but `Board.Widget` registers in a layout effect (after\n // commit), so a content/config change lands one commit late and would never\n // be shown without an emit. Reference comparison is loop-safe: a board's own\n // re-render reuses the same `children` element references from its\n // (un-rerendered) parent, so `content` only differs on a genuine parent\n // update -> we emit once and then settle.\n const changed =\n !prev ||\n prev.content !== reg.content ||\n prev.isDraggable !== reg.isDraggable ||\n prev.isResizable !== reg.isResizable ||\n prev.resizeHandles !== reg.resizeHandles ||\n prev.constraints !== reg.constraints ||\n prev.qa !== reg.qa ||\n prev.styles !== reg.styles ||\n prev.isAutoHeight !== reg.isAutoHeight ||\n prev.dragCancel !== reg.dragCancel ||\n prev.dragHandle !== reg.dragHandle;\n\n if (changed) {\n this.version++;\n this.emit();\n }\n }\n\n unregister(id: string, owner: object): void {\n // Ignore unregister calls from an instance that no longer owns the id (a\n // newer instance has already taken over).\n if (this.owners.get(id) !== owner) return;\n\n this.owners.delete(id);\n if (this.map.delete(id)) {\n this.version++;\n this.emit();\n }\n }\n\n get(id: string): WidgetRegistration | undefined {\n return this.map.get(id);\n }\n\n getVersion = (): number => this.version;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n private emit(): void {\n this.listeners.forEach((listener) => listener());\n }\n}\n"],"mappings":";;;;;;;;;AAoCA,IAAa,mBAAb,MAA8B;CAC5B,AAAQ,sBAAM,IAAI,KAAiC;CAMnD,AAAQ,yBAAS,IAAI,KAAqB;CAC1C,AAAQ,4BAAY,IAAI,KAAiB;CACzC,AAAQ,UAAU;CAElB,SAAS,KAAyB,OAAqB;EACrD,MAAM,OAAO,KAAK,IAAI,IAAI,IAAI,GAAG;AACjC,OAAK,IAAI,IAAI,IAAI,IAAI,IAAI;AACzB,OAAK,OAAO,IAAI,IAAI,IAAI,MAAM;AAsB9B,MAZE,CAAC,QACD,KAAK,YAAY,IAAI,WACrB,KAAK,gBAAgB,IAAI,eACzB,KAAK,gBAAgB,IAAI,eACzB,KAAK,kBAAkB,IAAI,iBAC3B,KAAK,gBAAgB,IAAI,eACzB,KAAK,OAAO,IAAI,MAChB,KAAK,WAAW,IAAI,UACpB,KAAK,iBAAiB,IAAI,gBAC1B,KAAK,eAAe,IAAI,cACxB,KAAK,eAAe,IAAI,YAEb;AACX,QAAK;AACL,QAAK,MAAM;;;CAIf,WAAW,IAAY,OAAqB;AAG1C,MAAI,KAAK,OAAO,IAAI,GAAG,KAAK,MAAO;AAEnC,OAAK,OAAO,OAAO,GAAG;AACtB,MAAI,KAAK,IAAI,OAAO,GAAG,EAAE;AACvB,QAAK;AACL,QAAK,MAAM;;;CAIf,IAAI,IAA4C;AAC9C,SAAO,KAAK,IAAI,IAAI,GAAG;;CAGzB,mBAA2B,KAAK;CAEhC,aAAa,aAAuC;AAClD,OAAK,UAAU,IAAI,SAAS;AAC5B,eAAa;AACX,QAAK,UAAU,OAAO,SAAS;;;CAInC,AAAQ,OAAa;AACnB,OAAK,UAAU,SAAS,aAAa,UAAU,CAAC"}
1
+ {"version":3,"file":"board-store.js","names":[],"sources":["../../../../src/components/layout/Board/board-store.ts"],"sourcesContent":["import type { Styles } from '@tenphi/tasty';\nimport type { ReactNode } from 'react';\nimport type { LayoutConstraint, ResizeHandleAxis } from './grid-core';\n\n/**\n * Declarative registration for a single widget.\n *\n * Widget *content* is decoupled from widget *position*: content is registered\n * here by `Board.Widget` keyed by id, while positioning/ownership lives in a\n * board's layout state. This decoupling is what allows a widget to be hosted\n * (and transferred) between different boards under the same `BoardProvider`.\n */\nexport interface WidgetRegistration {\n id: string;\n content: ReactNode;\n isDraggable?: boolean;\n isResizable?: boolean;\n resizeHandles?: ResizeHandleAxis[];\n /**\n * Add a card border to this widget (widgets are always filled and rounded).\n * Falls back to the owning board's `widgetProps.isCard` when unset here.\n */\n isCard?: boolean;\n /** Minimum width in grid columns (fallback when the layout item omits `minW`). */\n minW?: number;\n /** Maximum width in grid columns (fallback when the layout item omits `maxW`). */\n maxW?: number;\n /** Minimum height in grid rows (fallback when the layout item omits `minH`). */\n minH?: number;\n /** Maximum height in grid rows (fallback when the layout item omits `maxH`). */\n maxH?: number;\n constraints?: LayoutConstraint[];\n qa?: string;\n styles?: Styles;\n /** Grow this widget's height to fit its content (only ever increases). */\n isAutoHeight?: boolean;\n /** Override the board's `dragCancel` selector for this widget. */\n dragCancel?: string;\n /** Override the board's `dragHandle` selector for this widget. */\n dragHandle?: string;\n}\n\n/**\n * A tiny external store mapping widget id -> registration.\n *\n * Boards read from it via `useSyncExternalStore`, so a change to any widget's\n * content or config re-renders the hosting board without prop drilling through\n * the (possibly cross-board) tree.\n */\nexport class BoardWidgetStore {\n private map = new Map<string, WidgetRegistration>();\n // Tracks which mounted `Board.Widget` instance currently owns each id. This\n // guards against a stale unregister from an unmounting instance clobbering a\n // freshly-mounted instance's registration - which happens when a widget's\n // subtree is relocated (e.g. dragging a container widget that hosts a nested\n // board moves it into the overlay portal, remounting the inner widgets).\n private owners = new Map<string, object>();\n private listeners = new Set<() => void>();\n private version = 0;\n\n register(reg: WidgetRegistration, owner: object): void {\n const prev = this.map.get(reg.id);\n this.map.set(reg.id, reg);\n this.owners.set(reg.id, owner);\n\n // Notify on any reference change. The hosting board reads registrations\n // during render, but `Board.Widget` registers in a layout effect (after\n // commit), so a content/config change lands one commit late and would never\n // be shown without an emit. Reference comparison is loop-safe: a board's own\n // re-render reuses the same `children` element references from its\n // (un-rerendered) parent, so `content` only differs on a genuine parent\n // update -> we emit once and then settle.\n const changed =\n !prev ||\n prev.content !== reg.content ||\n prev.isDraggable !== reg.isDraggable ||\n prev.isResizable !== reg.isResizable ||\n prev.resizeHandles !== reg.resizeHandles ||\n prev.isCard !== reg.isCard ||\n prev.minW !== reg.minW ||\n prev.maxW !== reg.maxW ||\n prev.minH !== reg.minH ||\n prev.maxH !== reg.maxH ||\n prev.constraints !== reg.constraints ||\n prev.qa !== reg.qa ||\n prev.styles !== reg.styles ||\n prev.isAutoHeight !== reg.isAutoHeight ||\n prev.dragCancel !== reg.dragCancel ||\n prev.dragHandle !== reg.dragHandle;\n\n if (changed) {\n this.version++;\n this.emit();\n }\n }\n\n unregister(id: string, owner: object): void {\n // Ignore unregister calls from an instance that no longer owns the id (a\n // newer instance has already taken over).\n if (this.owners.get(id) !== owner) return;\n\n this.owners.delete(id);\n if (this.map.delete(id)) {\n this.version++;\n this.emit();\n }\n }\n\n get(id: string): WidgetRegistration | undefined {\n return this.map.get(id);\n }\n\n getVersion = (): number => this.version;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n private emit(): void {\n this.listeners.forEach((listener) => listener());\n }\n}\n"],"mappings":";;;;;;;;;AAiDA,IAAa,mBAAb,MAA8B;CAC5B,AAAQ,sBAAM,IAAI,KAAiC;CAMnD,AAAQ,yBAAS,IAAI,KAAqB;CAC1C,AAAQ,4BAAY,IAAI,KAAiB;CACzC,AAAQ,UAAU;CAElB,SAAS,KAAyB,OAAqB;EACrD,MAAM,OAAO,KAAK,IAAI,IAAI,IAAI,GAAG;AACjC,OAAK,IAAI,IAAI,IAAI,IAAI,IAAI;AACzB,OAAK,OAAO,IAAI,IAAI,IAAI,MAAM;AA2B9B,MAjBE,CAAC,QACD,KAAK,YAAY,IAAI,WACrB,KAAK,gBAAgB,IAAI,eACzB,KAAK,gBAAgB,IAAI,eACzB,KAAK,kBAAkB,IAAI,iBAC3B,KAAK,WAAW,IAAI,UACpB,KAAK,SAAS,IAAI,QAClB,KAAK,SAAS,IAAI,QAClB,KAAK,SAAS,IAAI,QAClB,KAAK,SAAS,IAAI,QAClB,KAAK,gBAAgB,IAAI,eACzB,KAAK,OAAO,IAAI,MAChB,KAAK,WAAW,IAAI,UACpB,KAAK,iBAAiB,IAAI,gBAC1B,KAAK,eAAe,IAAI,cACxB,KAAK,eAAe,IAAI,YAEb;AACX,QAAK;AACL,QAAK,MAAM;;;CAIf,WAAW,IAAY,OAAqB;AAG1C,MAAI,KAAK,OAAO,IAAI,GAAG,KAAK,MAAO;AAEnC,OAAK,OAAO,OAAO,GAAG;AACtB,MAAI,KAAK,IAAI,OAAO,GAAG,EAAE;AACvB,QAAK;AACL,QAAK,MAAM;;;CAIf,IAAI,IAA4C;AAC9C,SAAO,KAAK,IAAI,IAAI,GAAG;;CAGzB,mBAA2B,KAAK;CAEhC,aAAa,aAAuC;AAClD,OAAK,UAAU,IAAI,SAAS;AAC5B,eAAa;AACX,QAAK,UAAU,OAAO,SAAS;;;CAInC,AAAQ,OAAa;AACnB,OAAK,UAAU,SAAS,aAAa,UAAU,CAAC"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  //#region src/components/layout/Board/grid-core/calculate.ts
3
3
  /** Calculate the width of a single grid column in pixels. */
4
4
  function calcGridColWidth(positionParams) {
@@ -86,5 +86,5 @@ function clamp(num, lowerBound, upperBound) {
86
86
  }
87
87
 
88
88
  //#endregion
89
- export { calcGridColWidth, calcGridItemPosition, calcWH, calcXYRaw, clamp };
89
+ export { calcGridColWidth, calcGridItemPosition, calcWH, calcXYRaw };
90
90
  //# sourceMappingURL=calculate.js.map
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  //#region src/components/layout/Board/grid-core/collision.ts
3
3
  /**
4
4
  * Check if two layout items collide (overlap).
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  import { collides, getFirstCollision } from "./collision.js";
3
3
  import { sortLayoutItemsByColRow, sortLayoutItemsByRowCol } from "./sort.js";
4
4
  import { bottom, cloneLayout, cloneLayoutItem, getStatics } from "./layout.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  //#region src/components/layout/Board/grid-core/constraints.ts
3
3
  function clamp(value, min, max) {
4
4
  return Math.max(min, Math.min(max, value));
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  import { getAllCollisions, getFirstCollision } from "./collision.js";
3
3
  import { sortLayoutItems } from "./sort.js";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  //#region src/components/layout/Board/grid-core/sort.ts
3
3
  /**
4
4
  * Sort layout items based on the compaction type.
@@ -2,12 +2,12 @@
2
2
  import { Compactor, Layout, LayoutConstraint, LayoutItem, ResizeHandleAxis } from "./grid-core/types.js";
3
3
  import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
4
4
  import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
5
+ import { CubeBoardWidgetProps, Widget } from "./Widget.js";
5
6
  import { BoardCompactType, BoardGridLines, BoardInteractionInfo, CubeBoardProps } from "./Board.js";
6
7
  import { BreakpointCols, Breakpoints, ResponsiveLayouts } from "./responsive-utils.js";
7
8
  import { BoardResponsive, CubeBoardResponsiveProps } from "./BoardResponsive.js";
8
9
  import { WidgetTransferInfo } from "./board-context.js";
9
10
  import { BoardProvider, CubeBoardProviderProps } from "./BoardProvider.js";
10
- import { CubeBoardWidgetProps, Widget } from "./Widget.js";
11
11
  import * as react from "react";
12
12
 
13
13
  //#region src/components/layout/Board/index.d.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  import { getCompactor, horizontalCompactor, noCompactor, verticalCompactor } from "./grid-core/compactors.js";
3
3
  import { aspectRatio, boundedX, boundedY, containerBounds, gridBounds, maxSize, minMaxSize, minSize, snapToGrid } from "./grid-core/constraints.js";
4
4
  import { BoardProvider } from "./BoardProvider.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  import { cloneLayout, correctBounds } from "./grid-core/layout.js";
3
3
 
4
4
  //#region src/components/layout/Board/responsive-utils.ts
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { cloneLayout } from "./grid-core/layout.js";
4
4
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-6be6cbe | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.0.0-canary-7ec55ba | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { BoardWidgetStore } from "./board-store.js";
4
4
  import { cloneLayout, getLayoutItem, moveElement } from "./grid-core/layout.js";
@@ -140,7 +140,8 @@ function useBoardRegistry(options) {
140
140
  constraints: item.constraints ?? store.get(itemId)?.constraints
141
141
  },
142
142
  rect,
143
- pointerType
143
+ pointerType,
144
+ nestedBoardIds: nested
144
145
  });
145
146
  entry.setPlaceholder({ ...item });
146
147
  });