@cube-dev/ui-kit 0.145.2 → 0.145.3

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 (445) hide show
  1. package/dist/CHANGELOG.md +6 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +1 -1
  20. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  21. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  22. package/dist/components/actions/ButtonSplit/context.js +1 -1
  23. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  24. package/dist/components/actions/CommandMenu/styled.js +1 -1
  25. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  26. package/dist/components/actions/ItemActionContext.js +1 -1
  27. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  28. package/dist/components/actions/Link/Link.js +1 -1
  29. package/dist/components/actions/Menu/Menu.js +1 -1
  30. package/dist/components/actions/Menu/MenuItem.js +1 -1
  31. package/dist/components/actions/Menu/MenuSection.js +1 -1
  32. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  34. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  35. package/dist/components/actions/Menu/context.js +1 -1
  36. package/dist/components/actions/Menu/styled.js +1 -1
  37. package/dist/components/actions/index.js +1 -1
  38. package/dist/components/actions/use-action.js +1 -1
  39. package/dist/components/actions/use-anchored-menu.js +1 -1
  40. package/dist/components/actions/use-context-menu.js +1 -1
  41. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  42. package/dist/components/content/Alert/Alert.js +1 -1
  43. package/dist/components/content/Alert/use-alert.js +1 -1
  44. package/dist/components/content/Avatar/Avatar.js +1 -1
  45. package/dist/components/content/Badge/Badge.js +1 -1
  46. package/dist/components/content/Card/Card.js +1 -1
  47. package/dist/components/content/Content.js +1 -1
  48. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  49. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  50. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  51. package/dist/components/content/Divider.js +1 -1
  52. package/dist/components/content/Footer.js +1 -1
  53. package/dist/components/content/Header.js +1 -1
  54. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  55. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  56. package/dist/components/content/Item/Item.js +1 -1
  57. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  58. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  59. package/dist/components/content/Layout/GridLayout.js +1 -1
  60. package/dist/components/content/Layout/Layout.js +1 -1
  61. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  62. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  63. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  64. package/dist/components/content/Layout/LayoutContent.js +1 -1
  65. package/dist/components/content/Layout/LayoutContext.js +1 -1
  66. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  67. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  68. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  69. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  70. package/dist/components/content/Layout/LayoutPane.js +1 -1
  71. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  72. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  73. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  74. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  75. package/dist/components/content/Layout/index.js +1 -1
  76. package/dist/components/content/Layout/utils.js +1 -1
  77. package/dist/components/content/Paragraph.js +1 -1
  78. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  79. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  80. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  81. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  82. package/dist/components/content/Result/Result.js +1 -1
  83. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  84. package/dist/components/content/Tag/Tag.js +1 -1
  85. package/dist/components/content/Text.d.ts +7 -7
  86. package/dist/components/content/Text.js +1 -1
  87. package/dist/components/content/TextItem/TextItem.js +1 -1
  88. package/dist/components/content/Title.js +1 -1
  89. package/dist/components/content/Tree/Tree.js +1 -1
  90. package/dist/components/content/Tree/TreeNode.js +1 -1
  91. package/dist/components/content/Tree/styled.js +1 -1
  92. package/dist/components/content/Tree/tree-index.js +1 -1
  93. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  94. package/dist/components/content/Tree/use-load-data.js +1 -1
  95. package/dist/components/content/highlightText.js +1 -1
  96. package/dist/components/content/use-auto-tooltip.js +1 -1
  97. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  98. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  99. package/dist/components/fields/Checkbox/context.js +1 -1
  100. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  101. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  102. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  103. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  104. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  105. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  106. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  107. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  108. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  109. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  110. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  111. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  112. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  113. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  114. package/dist/components/fields/DatePicker/intl.js +1 -1
  115. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  116. package/dist/components/fields/DatePicker/props.js +1 -1
  117. package/dist/components/fields/DatePicker/utils.js +1 -1
  118. package/dist/components/fields/FileInput/FileInput.js +1 -1
  119. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  120. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  121. package/dist/components/fields/Input/Input.js +1 -1
  122. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  123. package/dist/components/fields/ListBox/ListBox.js +1 -1
  124. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  125. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  126. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  127. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  128. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  129. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  130. package/dist/components/fields/Picker/Picker.js +1 -1
  131. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  132. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  133. package/dist/components/fields/RadioGroup/context.js +1 -1
  134. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  135. package/dist/components/fields/Select/Select.js +1 -1
  136. package/dist/components/fields/Slider/Gradation.js +1 -1
  137. package/dist/components/fields/Slider/HueSlider.js +1 -1
  138. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  139. package/dist/components/fields/Slider/Slider.js +1 -1
  140. package/dist/components/fields/Slider/SliderBase.js +1 -1
  141. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  142. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  143. package/dist/components/fields/Slider/elements.js +1 -1
  144. package/dist/components/fields/Slider/index.js +1 -1
  145. package/dist/components/fields/Switch/Switch.js +1 -1
  146. package/dist/components/fields/TextArea/TextArea.js +1 -1
  147. package/dist/components/fields/TextInput/TextInput.js +1 -1
  148. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  149. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  150. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  151. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  152. package/dist/components/form/Form/Field.js +1 -1
  153. package/dist/components/form/Form/Form.js +1 -1
  154. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  155. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  156. package/dist/components/form/Form/SubmitError.js +1 -1
  157. package/dist/components/form/Form/index.js +1 -1
  158. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  159. package/dist/components/form/Form/use-field/use-field.js +1 -1
  160. package/dist/components/form/Form/use-form.js +1 -1
  161. package/dist/components/form/Form/validation.js +1 -1
  162. package/dist/components/form/Label.js +1 -1
  163. package/dist/components/form/wrapper.js +1 -1
  164. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  165. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  166. package/dist/components/layout/Board/Board.js +1 -1
  167. package/dist/components/layout/Board/BoardProvider.js +1 -1
  168. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  169. package/dist/components/layout/Board/Widget.js +1 -1
  170. package/dist/components/layout/Board/WidgetHost.js +16 -7
  171. package/dist/components/layout/Board/WidgetHost.js.map +1 -1
  172. package/dist/components/layout/Board/board-context.js +1 -1
  173. package/dist/components/layout/Board/board-store.js +1 -1
  174. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  175. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  176. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  177. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  178. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  179. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  180. package/dist/components/layout/Board/index.js +1 -1
  181. package/dist/components/layout/Board/responsive-utils.js +1 -1
  182. package/dist/components/layout/Board/use-board-layout.js +1 -1
  183. package/dist/components/layout/Board/use-board-registry.js +62 -3
  184. package/dist/components/layout/Board/use-board-registry.js.map +1 -1
  185. package/dist/components/layout/Flex.js +1 -1
  186. package/dist/components/layout/Flow.js +1 -1
  187. package/dist/components/layout/Grid.js +1 -1
  188. package/dist/components/layout/Panel.js +1 -1
  189. package/dist/components/layout/Prefix.js +1 -1
  190. package/dist/components/layout/ResizablePanel.js +1 -1
  191. package/dist/components/layout/Space.js +1 -1
  192. package/dist/components/layout/Suffix.js +1 -1
  193. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  194. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  195. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  196. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  197. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  198. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  199. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  200. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  201. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  202. package/dist/components/navigation/Tabs/styled.js +1 -1
  203. package/dist/components/navigation/Tabs/types.js +1 -1
  204. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  205. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  206. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  207. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  208. package/dist/components/other/Calendar/Calendar.js +1 -1
  209. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  210. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  211. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  212. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  213. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  214. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  215. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  216. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  217. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  218. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  219. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  220. package/dist/components/overlays/Dialog/context.js +1 -1
  221. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  222. package/dist/components/overlays/Modal/Modal.js +1 -1
  223. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  224. package/dist/components/overlays/Modal/Overlay.js +1 -1
  225. package/dist/components/overlays/Modal/Popover.js +1 -1
  226. package/dist/components/overlays/Modal/Tray.js +1 -1
  227. package/dist/components/overlays/Modal/Underlay.js +1 -1
  228. package/dist/components/overlays/Notifications/Notification.js +1 -1
  229. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  230. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  231. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  232. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  233. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  234. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  235. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  236. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  237. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  238. package/dist/components/overlays/Notifications/index.js +1 -1
  239. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  240. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  241. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  242. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  243. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  244. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  245. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  246. package/dist/components/overlays/Toast/index.js +1 -1
  247. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  248. package/dist/components/overlays/Toast/useToast.js +1 -1
  249. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  250. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  251. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  252. package/dist/components/overlays/Tooltip/context.js +1 -1
  253. package/dist/components/portal/Portal.js +1 -1
  254. package/dist/components/portal/PortalProvider.js +1 -1
  255. package/dist/components/portal/usePortal.js +1 -1
  256. package/dist/components/shared/DraggableCollection.js +1 -1
  257. package/dist/components/shared/InvalidIcon.js +1 -1
  258. package/dist/components/shared/ValidIcon.js +1 -1
  259. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  260. package/dist/components/status/Spin/Cube.js +1 -1
  261. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  262. package/dist/components/status/Spin/Spin.js +1 -1
  263. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  264. package/dist/data/item-themes.js +1 -1
  265. package/dist/data/themes.js +1 -1
  266. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  267. package/dist/icons/AdjustmentsIcon.js +1 -1
  268. package/dist/icons/AiIcon.js +1 -1
  269. package/dist/icons/AreaChartIcon.js +1 -1
  270. package/dist/icons/BackwardIcon.js +1 -1
  271. package/dist/icons/BarChartIcon.js +1 -1
  272. package/dist/icons/BellFilledIcon.js +1 -1
  273. package/dist/icons/BellIcon.js +1 -1
  274. package/dist/icons/BooleanIcon.js +1 -1
  275. package/dist/icons/CalendarEditIcon.js +1 -1
  276. package/dist/icons/CalendarIcon.js +1 -1
  277. package/dist/icons/CaretDownIcon.js +1 -1
  278. package/dist/icons/CaretUpIcon.js +1 -1
  279. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  280. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  281. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  282. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  283. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  284. package/dist/icons/ChartBarLineIcon.js +1 -1
  285. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  286. package/dist/icons/ChartBarStackedIcon.js +1 -1
  287. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  288. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  289. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  290. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  291. package/dist/icons/ChartBubbleIcon.js +1 -1
  292. package/dist/icons/ChartDonut2Icon.js +1 -1
  293. package/dist/icons/ChartFunnelIcon.js +1 -1
  294. package/dist/icons/ChartHeatmapIcon.js +1 -1
  295. package/dist/icons/ChartKPIIcon.js +1 -1
  296. package/dist/icons/ChartPie2Icon.js +1 -1
  297. package/dist/icons/ChartScatterIcon.js +1 -1
  298. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  299. package/dist/icons/CheckCircleIcon.js +1 -1
  300. package/dist/icons/CheckIcon.js +1 -1
  301. package/dist/icons/CircleFilledIcon.js +1 -1
  302. package/dist/icons/ClearIcon.js +1 -1
  303. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  304. package/dist/icons/CloseCircleIcon.js +1 -1
  305. package/dist/icons/CloseIcon.js +1 -1
  306. package/dist/icons/CodeIcon.js +1 -1
  307. package/dist/icons/ColumnTotalIcon.js +1 -1
  308. package/dist/icons/CopyIcon.js +1 -1
  309. package/dist/icons/CountIcon.js +1 -1
  310. package/dist/icons/CubeIcon.js +1 -1
  311. package/dist/icons/CubePauseIcon.js +1 -1
  312. package/dist/icons/CubePlayIcon.js +1 -1
  313. package/dist/icons/CurrencyDollarIcon.js +1 -1
  314. package/dist/icons/DangerIcon.js +1 -1
  315. package/dist/icons/DashboardIcon.js +1 -1
  316. package/dist/icons/DatabaseIcon.js +1 -1
  317. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  318. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  319. package/dist/icons/DirectionIcon.js +1 -1
  320. package/dist/icons/DonutIcon.js +1 -1
  321. package/dist/icons/DownIcon.js +1 -1
  322. package/dist/icons/EditIcon.js +1 -1
  323. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  324. package/dist/icons/ExclamationCircleIcon.js +1 -1
  325. package/dist/icons/ExclamationIcon.js +1 -1
  326. package/dist/icons/EyeIcon.js +1 -1
  327. package/dist/icons/EyeInvisibleIcon.js +1 -1
  328. package/dist/icons/FilterIcon.js +1 -1
  329. package/dist/icons/FolderFilledIcon.js +1 -1
  330. package/dist/icons/FolderIcon.js +1 -1
  331. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  332. package/dist/icons/FolderOpenIcon.js +1 -1
  333. package/dist/icons/ForwardIcon.js +1 -1
  334. package/dist/icons/GripVerticalIcon.js +1 -1
  335. package/dist/icons/HierarchyIcon.js +1 -1
  336. package/dist/icons/HierarchyOpenIcon.js +1 -1
  337. package/dist/icons/Icon.js +1 -1
  338. package/dist/icons/InfoCircleIcon.js +1 -1
  339. package/dist/icons/InfoIcon.js +1 -1
  340. package/dist/icons/KeyIcon.js +1 -1
  341. package/dist/icons/LeftIcon.js +1 -1
  342. package/dist/icons/LineChartIcon.js +1 -1
  343. package/dist/icons/LoadingIcon.js +1 -1
  344. package/dist/icons/LockFilledIcon.js +1 -1
  345. package/dist/icons/LockIcon.js +1 -1
  346. package/dist/icons/MoreIcon.js +1 -1
  347. package/dist/icons/NotAllowedIcon.js +1 -1
  348. package/dist/icons/Number123Icon.js +1 -1
  349. package/dist/icons/NumberIcon.js +1 -1
  350. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  351. package/dist/icons/PauseCircleIcon.js +1 -1
  352. package/dist/icons/PauseIcon.js +1 -1
  353. package/dist/icons/PercentageIcon.js +1 -1
  354. package/dist/icons/PieChartIcon.js +1 -1
  355. package/dist/icons/PlayCircleIcon.js +1 -1
  356. package/dist/icons/PlayIcon.js +1 -1
  357. package/dist/icons/PlusIcon.js +1 -1
  358. package/dist/icons/ProgressBarIcon.js +1 -1
  359. package/dist/icons/ReloadIcon.js +1 -1
  360. package/dist/icons/ReportIcon.js +1 -1
  361. package/dist/icons/ReturnIcon.js +1 -1
  362. package/dist/icons/RightIcon.js +1 -1
  363. package/dist/icons/RowTotalsIcon.js +1 -1
  364. package/dist/icons/SchemeIcon.js +1 -1
  365. package/dist/icons/SearchIcon.js +1 -1
  366. package/dist/icons/SemanticQueryIcon.js +1 -1
  367. package/dist/icons/SettingsIcon.js +1 -1
  368. package/dist/icons/ShieldFilledIcon.js +1 -1
  369. package/dist/icons/ShieldIcon.js +1 -1
  370. package/dist/icons/SlashIcon.js +1 -1
  371. package/dist/icons/SparklesIcon.js +1 -1
  372. package/dist/icons/SqlIcon.js +1 -1
  373. package/dist/icons/StatsIcon.js +1 -1
  374. package/dist/icons/StopIcon.js +1 -1
  375. package/dist/icons/StringIcon.js +1 -1
  376. package/dist/icons/SubtotalsIcon.js +1 -1
  377. package/dist/icons/SwitchIcon.js +1 -1
  378. package/dist/icons/TableIcon.js +1 -1
  379. package/dist/icons/ThumbsDownIcon.js +1 -1
  380. package/dist/icons/ThumbsUpIcon.js +1 -1
  381. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  382. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  383. package/dist/icons/ThunderboltIcon.js +1 -1
  384. package/dist/icons/TimeIcon.js +1 -1
  385. package/dist/icons/TrashIcon.js +1 -1
  386. package/dist/icons/UnlockIcon.js +1 -1
  387. package/dist/icons/UpIcon.js +1 -1
  388. package/dist/icons/UserGroupIcon.js +1 -1
  389. package/dist/icons/UserIcon.js +1 -1
  390. package/dist/icons/UserLockIcon.js +1 -1
  391. package/dist/icons/ViewIcon.js +1 -1
  392. package/dist/icons/WarningFilledIcon.js +1 -1
  393. package/dist/icons/WarningIcon.js +1 -1
  394. package/dist/icons/wrap-icon.js +1 -1
  395. package/dist/index.js +1 -1
  396. package/dist/provider.js +1 -1
  397. package/dist/providers/TrackingProvider.js +1 -1
  398. package/dist/providers/navigationAdapter.default.js +1 -1
  399. package/dist/tokens/base.js +1 -1
  400. package/dist/tokens/colors.js +1 -1
  401. package/dist/tokens/index.js +1 -1
  402. package/dist/tokens/layout.js +1 -1
  403. package/dist/tokens/palette.js +1 -1
  404. package/dist/tokens/shadows.js +1 -1
  405. package/dist/tokens/sizes.js +1 -1
  406. package/dist/tokens/spacing.js +1 -1
  407. package/dist/tokens/typography.js +1 -1
  408. package/dist/utils/ResizeSensor.js +1 -1
  409. package/dist/utils/is-dev-env.js +1 -1
  410. package/dist/utils/modules.js +1 -1
  411. package/dist/utils/promise.js +1 -1
  412. package/dist/utils/raf.js +1 -1
  413. package/dist/utils/random.js +1 -1
  414. package/dist/utils/range.js +1 -1
  415. package/dist/utils/react/RenderCache.js +1 -1
  416. package/dist/utils/react/Slots.js +1 -1
  417. package/dist/utils/react/chain.js +1 -1
  418. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  419. package/dist/utils/react/index.js +1 -1
  420. package/dist/utils/react/interactions.js +1 -1
  421. package/dist/utils/react/isTextOnly.js +1 -1
  422. package/dist/utils/react/mapProps.js +1 -1
  423. package/dist/utils/react/mergeProps.js +1 -1
  424. package/dist/utils/react/nullableValue.js +1 -1
  425. package/dist/utils/react/resolveIcon.js +1 -1
  426. package/dist/utils/react/sharedStore.js +1 -1
  427. package/dist/utils/react/useCombinedRefs.js +1 -1
  428. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  429. package/dist/utils/react/useEventBus.js +1 -1
  430. package/dist/utils/react/useId.js +1 -1
  431. package/dist/utils/react/useIsDarwin.js +1 -1
  432. package/dist/utils/react/useKeySymbols.js +1 -1
  433. package/dist/utils/react/useLayoutEffect.js +1 -1
  434. package/dist/utils/react/useLocalStorage.js +1 -1
  435. package/dist/utils/react/useMergeStyles.js +1 -1
  436. package/dist/utils/react/usePopoverSync.js +1 -1
  437. package/dist/utils/react/useQaProps.js +1 -1
  438. package/dist/utils/react/useViewportSize.js +1 -1
  439. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  440. package/dist/utils/selection.js +1 -1
  441. package/dist/utils/styles.js +1 -1
  442. package/dist/utils/tree.js +1 -1
  443. package/dist/utils/warnings.js +1 -1
  444. package/dist/version.js +2 -2
  445. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { mergeProps } from "../../../utils/react/mergeProps.js";
3
3
  import { warn } from "../../../utils/warnings.js";
4
4
  import { FieldWrapper } from "../FieldWrapper/FieldWrapper.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
4
4
  import { Provider, useProviderProps } from "../../../provider.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { mergeProps } from "../../../../utils/react/mergeProps.js";
3
3
  import { useEvent } from "../../../../_internal/hooks/use-event.js";
4
4
  import { useProviderProps } from "../../../../provider.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { useProviderProps } from "../../../../provider.js";
3
3
  import { Button } from "../../../actions/Button/Button.js";
4
4
  import { useFormProps } from "../Form.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { FormContext } from "./Form.js";
3
3
  import { Alert } from "../../content/Alert/Alert.js";
4
4
  import { forwardRef, isValidElement, useContext } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { useForm } from "./use-form.js";
3
3
  import { FormContext, _Form, useFormProps } from "./Form.js";
4
4
  import { useField } from "./use-field/use-field.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { mergeProps } from "../../../../utils/react/mergeProps.js";
3
3
  import { useEvent } from "../../../../_internal/hooks/use-event.js";
4
4
  import { warn } from "../../../../utils/warnings.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { useEvent } from "../../../../_internal/hooks/use-event.js";
3
3
  import { useIsFirstRender } from "../../../../_internal/hooks/use-is-first-render.js";
4
4
  import { delayValidationRule } from "../validation.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { applyRules } from "./validation.js";
3
3
  import { dotize } from "@tenphi/tasty";
4
4
  import { useRef, useState } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { validate } from "email-validator";
3
3
  import validUrl from "valid-url";
4
4
 
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { extractStyles } from "../../utils/styles.js";
3
3
  import { useProviderProps } from "../../provider.js";
4
4
  import { CONTAINER_STYLES, filterBaseProps, tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { mergeProps } from "../../utils/react/mergeProps.js";
3
3
  import { FieldWrapper } from "./FieldWrapper/FieldWrapper.js";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { useCallback, useLayoutEffect, useRef, useState } from "react";
3
3
 
4
4
  //#region src/components/helpers/DisplayTransition/DisplayTransition.tsx
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { DisplayTransition } from "../DisplayTransition/DisplayTransition.js";
3
3
  import { tasty } from "@tenphi/tasty";
4
4
  import { isValidElement, useCallback, useLayoutEffect, useRef, useState } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
4
4
  import { useEvent } from "../../../_internal/hooks/use-event.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { BoardDragActiveContext, BoardRegistryContext } from "./board-context.js";
3
3
  import { useBoardRegistry } from "./use-board-registry.js";
4
4
  import { tasty } from "@tenphi/tasty";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { useCombinedRefs } from "../../../utils/react/useCombinedRefs.js";
3
3
  import { useEvent } from "../../../_internal/hooks/use-event.js";
4
4
  import { getCompactor } from "./grid-core/compactors.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../utils/styles.js";
3
3
  import { useLayoutEffect as useLayoutEffect$1 } from "../../../utils/react/useLayoutEffect.js";
4
4
  import { useBoardRegistry } from "./board-context.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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";
@@ -6,7 +6,7 @@ import { calcGridColWidth, calcGridItemPosition } from "./grid-core/calculate.js
6
6
  import { tasty } from "@tenphi/tasty";
7
7
  import { useMemo, useRef, useState } from "react";
8
8
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
- import { useFocusWithin, useHover, useMove } from "react-aria";
9
+ import { useFocusRing, useFocusWithin, useHover, useMove } from "react-aria";
10
10
  import { createPortal } from "react-dom";
11
11
 
12
12
  //#region src/components/layout/Board/WidgetHost.tsx
@@ -32,6 +32,11 @@ const WidgetElement = tasty({
32
32
  "hovered & !card & (draggable | resizing)": "0 0 0 1bw #border",
33
33
  "drag | resizing": "$dialog-shadow"
34
34
  },
35
+ outline: {
36
+ "": "1bw #primary-text.0",
37
+ "focus-visible": "1bw #primary-text"
38
+ },
39
+ outlineOffset: "1bw",
35
40
  zIndex: {
36
41
  "": 1,
37
42
  "drag | resizing": 10
@@ -42,7 +47,7 @@ const WidgetElement = tasty({
42
47
  },
43
48
  transition: {
44
49
  "": "theme, shadow, opacity",
45
- settled: "theme, shadow, opacity, inset",
50
+ settled: "theme, shadow, opacity, inset, width, height",
46
51
  "drag | floating | resizing": "theme, shadow, opacity"
47
52
  },
48
53
  boxSizing: "border-box",
@@ -272,6 +277,7 @@ function WidgetHost(props) {
272
277
  const [isResizing, setIsResizing] = useState(false);
273
278
  const [isFocusWithin, setIsFocusWithin] = useState(false);
274
279
  const { hoverProps, isHovered } = useHover({ isDisabled: isActiveDrag });
280
+ const { focusProps, isFocusVisible } = useFocusRing();
275
281
  const { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setIsFocusWithin });
276
282
  const gripsRevealed = isResizable && !item.static && !isActiveDrag && (isHovered || isFocusWithin || isResizing);
277
283
  const { moveProps } = useMove({
@@ -326,21 +332,23 @@ function WidgetHost(props) {
326
332
  if (dragHandle && !target.closest(dragHandle)) return true;
327
333
  return !!(dragCancel && target.closest(dragCancel));
328
334
  };
329
- const gatedMoveProps = !isDraggable ? {} : dragHandle || dragCancel ? {
335
+ const gatedMoveProps = !isDraggable ? {} : {
330
336
  ...moveProps,
331
337
  ...moveProps.onPointerDown && { onPointerDown: (e) => {
332
338
  if (shouldGateDrag(e.target)) return;
339
+ hostRef.current?.focus({ preventScroll: true });
333
340
  moveProps.onPointerDown(e);
334
341
  } },
335
342
  ...moveProps.onMouseDown && { onMouseDown: (e) => {
336
343
  if (shouldGateDrag(e.target)) return;
344
+ hostRef.current?.focus({ preventScroll: true });
337
345
  moveProps.onMouseDown(e);
338
346
  } },
339
347
  ...moveProps.onTouchStart && { onTouchStart: (e) => {
340
348
  if (shouldGateDrag(e.target)) return;
341
349
  moveProps.onTouchStart(e);
342
350
  } }
343
- } : moveProps;
351
+ };
344
352
  const handleResize = (axis, phase, dx, dy) => {
345
353
  if (phase === "start") setIsResizing(true);
346
354
  else if (phase === "end") setIsResizing(false);
@@ -352,7 +360,8 @@ function WidgetHost(props) {
352
360
  static: !!item.static,
353
361
  resizing: isResizing,
354
362
  card: isCard,
355
- hovered: isHovered
363
+ hovered: isHovered,
364
+ "focus-visible": isFocusVisible
356
365
  };
357
366
  const content = /* @__PURE__ */ jsxs(BoardHostContext.Provider, {
358
367
  value: hostValue,
@@ -404,7 +413,7 @@ function WidgetHost(props) {
404
413
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(WidgetElement, {
405
414
  ref: hostRef,
406
415
  "data-board-widget-host": "",
407
- ...mergeProps$1(gatedMoveProps, stopBubbleProps, hoverProps, focusWithinProps, a11yProps, { style: hostStyle }),
416
+ ...mergeProps$1(gatedMoveProps, stopBubbleProps, hoverProps, focusProps, focusWithinProps, a11yProps, { style: hostStyle }),
408
417
  qa,
409
418
  mods: hostMods,
410
419
  styles: widgetStyles,
@@ -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 // 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 // `inset` is also dropped until the board reports `settled`: on init widgets\n // jump to their first measured positions, and without this gate they would\n // slide in from their default (0, 0) spot. The board lifts the gate after\n // the first positioned paint so subsequent reflows animate normally.\n transition: {\n '': 'theme, shadow, opacity',\n settled: '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 /**\n * Whether the owning board has settled its widgets' initial positions. While\n * false, the widget does not animate `inset` (left/top) so the first\n * positioned paint isn't seen as a transition. Lifted after the board's first\n * measured render.\n */\n settled?: boolean;\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 settled,\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, settled };\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
+ {"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 { useFocusRing, 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 outline: {\n '': '1bw #primary-text.0',\n 'focus-visible': '1bw #primary-text',\n },\n outlineOffset: '1bw',\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 and size. The actively\n // dragged/resized element - and the floating overlay clone - must track the\n // pointer with no lag, so they drop geometry from the list. Geometry is also\n // dropped until the board reports `settled`: on init widgets jump to their\n // first measured positions, and without this gate they would slide/grow in\n // from their default box. The board lifts the gate after the first\n // positioned paint so subsequent reflows animate normally.\n transition: {\n '': 'theme, shadow, opacity',\n settled: 'theme, shadow, opacity, inset, width, height',\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 /**\n * Whether the owning board has settled its widgets' initial positions. While\n * false, the widget does not animate `inset` (left/top) so the first\n * positioned paint isn't seen as a transition. Lifted after the board's first\n * measured render.\n */\n settled?: boolean;\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 settled,\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 { focusProps, isFocusVisible } = useFocusRing();\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 : {\n ...moveProps,\n ...(moveProps.onPointerDown && {\n onPointerDown: (e: React.PointerEvent<HTMLDivElement>) => {\n if (shouldGateDrag(e.target)) return;\n hostRef.current?.focus({ preventScroll: true });\n moveProps.onPointerDown!(e);\n },\n }),\n ...(moveProps.onMouseDown && {\n onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => {\n if (shouldGateDrag(e.target)) return;\n hostRef.current?.focus({ preventScroll: true });\n moveProps.onMouseDown!(e);\n },\n }),\n ...(moveProps.onTouchStart && {\n onTouchStart: (e: React.TouchEvent<HTMLDivElement>) => {\n if (shouldGateDrag(e.target)) return;\n moveProps.onTouchStart!(e);\n },\n }),\n };\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 'focus-visible': isFocusVisible,\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, settled };\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 focusProps,\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.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { createContext, useContext } from "react";
3
3
 
4
4
  //#region src/components/layout/Board/board-context.tsx
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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.
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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) {
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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.
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | 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,7 +1,8 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.145.2 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.145.3 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { BoardWidgetStore } from "./board-store.js";
4
- import { cloneLayout, getLayoutItem, moveElement } from "./grid-core/layout.js";
4
+ import { getAllCollisions } from "./grid-core/collision.js";
5
+ import { bottom, cloneLayout, getLayoutItem, moveElement } from "./grid-core/layout.js";
5
6
  import { calcXYRaw } from "./grid-core/calculate.js";
6
7
  import { applyPositionConstraints } from "./grid-core/constraints.js";
7
8
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -183,6 +184,59 @@ function useBoardRegistry(options) {
183
184
  entry.setPlaceholder(getLayoutItem(compacted, item.i) ?? null);
184
185
  }, []);
185
186
  /**
187
+ * Move a widget by one logical keyboard step. Unlike pointer movement, this
188
+ * starts from the live grid coordinates rather than DOM geometry and scans
189
+ * farther in the requested direction when the adjacent slot cannot produce a
190
+ * valid move.
191
+ */
192
+ const moveWithKeyboard = useCallback((entry, item, deltaX, deltaY) => {
193
+ const pp = entry.getPositionParams();
194
+ const compactor = entry.getCompactor();
195
+ const layout = entry.getLayout();
196
+ const live = getLayoutItem(layout, item.i);
197
+ if (!live) return;
198
+ const directionX = Math.sign(deltaX);
199
+ const directionY = Math.sign(deltaY);
200
+ if (directionX === 0 && directionY === 0) return;
201
+ const maxRows = entry.getMaxRows();
202
+ const attempts = directionX < 0 ? live.x : directionX > 0 ? Math.max(0, pp.cols - live.w - live.x) : directionY < 0 ? live.y : Number.isFinite(maxRows) ? Math.max(0, maxRows - live.h - live.y) : Math.max(1, bottom(layout) - live.y);
203
+ const seen = /* @__PURE__ */ new Set();
204
+ for (let distance = 1; distance <= attempts; distance++) {
205
+ const rawX = live.x + directionX * distance;
206
+ const rawY = live.y + directionY * distance;
207
+ const candidate = applyPositionConstraints(entry.getConstraints(), item, rawX, rawY, {
208
+ cols: pp.cols,
209
+ maxRows,
210
+ containerWidth: pp.containerWidth,
211
+ containerHeight: entry.getContainerHeight(),
212
+ rowHeight: pp.rowHeight,
213
+ margin: pp.margin,
214
+ layout
215
+ });
216
+ const candidateKey = `${candidate.x}:${candidate.y}`;
217
+ if (seen.has(candidateKey)) continue;
218
+ seen.add(candidateKey);
219
+ if (directionX !== 0 && (Math.sign(candidate.x - live.x) !== directionX || candidate.y !== live.y) || directionY !== 0 && (Math.sign(candidate.y - live.y) !== directionY || candidate.x !== live.x)) continue;
220
+ const working = cloneLayout(layout);
221
+ const target = getLayoutItem(working, item.i);
222
+ if (!target) return;
223
+ const moved = moveElement(working, target, candidate.x, candidate.y, true, compactor.preventCollision, compactor.type, pp.cols, compactor.allowOverlap);
224
+ const compacted = [...compactor.compact(moved, pp.cols)];
225
+ const landed = getLayoutItem(compacted, item.i);
226
+ if (!landed) continue;
227
+ const advanced = directionX !== 0 ? Math.sign(landed.x - live.x) === directionX && landed.y === live.y : Math.sign(landed.y - live.y) === directionY && landed.x === live.x;
228
+ const overlaps = !compactor.allowOverlap && getAllCollisions(compacted, landed).some((other) => other.i !== landed.i);
229
+ if (!advanced || overlaps) continue;
230
+ entry.applyLayout(compacted, false);
231
+ entry.setPlaceholder(landed);
232
+ lastLandingRef.current = {
233
+ x: landed.x,
234
+ y: landed.y
235
+ };
236
+ return;
237
+ }
238
+ }, []);
239
+ /**
186
240
  * Live cross-board reflow preview. Pushes the target board's *other* widgets
187
241
  * aside to make room for the incoming item, without ever adding the dragged
188
242
  * item's host to the target (it stays visualized as a placeholder + overlay
@@ -225,9 +279,14 @@ function useBoardRegistry(options) {
225
279
  target.applyLayout(compacted.filter((l) => l.i !== item.i), false);
226
280
  target.setPlaceholder({ ...landed });
227
281
  }, []);
228
- const onDragMove = useEvent((deltaX, deltaY, _pointerType) => {
282
+ const onDragMove = useEvent((deltaX, deltaY, pointerType) => {
229
283
  const ds = dragStateRef.current;
230
284
  if (!ds) return;
285
+ if (pointerType === "keyboard") {
286
+ const source = boardsRef.current.get(ds.sourceBoardId);
287
+ if (source) moveWithKeyboard(source, ds.item, deltaX, deltaY);
288
+ return;
289
+ }
231
290
  const newRect = {
232
291
  ...ds.rect,
233
292
  left: ds.rect.left + deltaX,