@cube-dev/ui-kit 0.116.3 → 0.118.0

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 (581) hide show
  1. package/dist/CHANGELOG.md +22 -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/_virtual/_rolldown/runtime.js +1 -1
  12. package/dist/chunks/cacheKey.js +1 -1
  13. package/dist/chunks/definitions.js +1 -1
  14. package/dist/chunks/renderChunk.js +1 -1
  15. package/dist/components/Block.js +1 -1
  16. package/dist/components/CollectionItem.js +1 -1
  17. package/dist/components/GlobalStyles.js +1 -55
  18. package/dist/components/GlobalStyles.js.map +1 -1
  19. package/dist/components/GridProvider.js +1 -1
  20. package/dist/components/HiddenInput.js +1 -1
  21. package/dist/components/Root.js +1 -1
  22. package/dist/components/actions/Action/Action.js +1 -1
  23. package/dist/components/actions/Banner/Banner.d.ts +1 -1
  24. package/dist/components/actions/Banner/Banner.js +4 -4
  25. package/dist/components/actions/Banner/Banner.js.map +1 -1
  26. package/dist/components/actions/Button/Button.d.ts +0 -1
  27. package/dist/components/actions/Button/Button.js +1 -1
  28. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  29. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  30. package/dist/components/actions/CommandMenu/styled.js +1 -1
  31. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  32. package/dist/components/actions/ItemActionContext.js +1 -1
  33. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  34. package/dist/components/actions/Link/Link.js +1 -1
  35. package/dist/components/actions/Menu/Menu.js +1 -1
  36. package/dist/components/actions/Menu/MenuItem.js +1 -1
  37. package/dist/components/actions/Menu/MenuSection.js +1 -1
  38. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  39. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  40. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  41. package/dist/components/actions/Menu/context.js +1 -1
  42. package/dist/components/actions/Menu/styled.js +1 -1
  43. package/dist/components/actions/index.js +1 -1
  44. package/dist/components/actions/use-action.js +1 -1
  45. package/dist/components/actions/use-anchored-menu.js +1 -1
  46. package/dist/components/actions/use-context-menu.js +1 -1
  47. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  48. package/dist/components/content/Alert/Alert.js +1 -1
  49. package/dist/components/content/Alert/use-alert.js +1 -1
  50. package/dist/components/content/Avatar/Avatar.js +1 -1
  51. package/dist/components/content/Badge/Badge.js +1 -1
  52. package/dist/components/content/Card/Card.js +1 -1
  53. package/dist/components/content/Content.js +1 -1
  54. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  55. package/dist/components/content/CopySnippet/CopySnippet.js +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/Item/Item.js +1 -1
  62. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  63. package/dist/components/content/Layout/GridLayout.js +1 -1
  64. package/dist/components/content/Layout/Layout.d.ts +2 -0
  65. package/dist/components/content/Layout/Layout.js +12 -3
  66. package/dist/components/content/Layout/Layout.js.map +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 +17 -5
  72. package/dist/components/content/Layout/LayoutContext.js.map +1 -1
  73. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  74. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  75. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  76. package/dist/components/content/Layout/LayoutHeader.d.ts +2 -0
  77. package/dist/components/content/Layout/LayoutHeader.js +24 -6
  78. package/dist/components/content/Layout/LayoutHeader.js.map +1 -1
  79. package/dist/components/content/Layout/LayoutPane.js +1 -1
  80. package/dist/components/content/Layout/LayoutPanel.js +54 -7
  81. package/dist/components/content/Layout/LayoutPanel.js.map +1 -1
  82. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  83. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  84. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  85. package/dist/components/content/Layout/index.js +1 -1
  86. package/dist/components/content/Layout/utils.js +36 -4
  87. package/dist/components/content/Layout/utils.js.map +1 -1
  88. package/dist/components/content/Paragraph.js +1 -1
  89. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  90. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  91. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  92. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  93. package/dist/components/content/Result/Result.js +1 -1
  94. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  95. package/dist/components/content/Tag/Tag.js +1 -1
  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/highlightText.js +1 -1
  100. package/dist/components/content/use-auto-tooltip.js +1 -1
  101. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  102. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  103. package/dist/components/fields/Checkbox/context.js +1 -1
  104. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  105. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  106. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  107. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  108. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  109. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  110. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  111. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  112. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  113. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  114. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  115. package/dist/components/fields/DatePicker/intl.js +1 -1
  116. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  117. package/dist/components/fields/DatePicker/props.js +1 -1
  118. package/dist/components/fields/DatePicker/utils.js +1 -1
  119. package/dist/components/fields/FileInput/FileInput.js +1 -1
  120. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  121. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  122. package/dist/components/fields/Input/Input.js +1 -1
  123. package/dist/components/fields/ListBox/ListBox.js +1 -1
  124. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  125. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  126. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  127. package/dist/components/fields/Picker/Picker.js +1 -1
  128. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  129. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  130. package/dist/components/fields/RadioGroup/context.js +1 -1
  131. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  132. package/dist/components/fields/Select/Select.js +1 -1
  133. package/dist/components/fields/Slider/Gradation.js +1 -1
  134. package/dist/components/fields/Slider/HueSlider.js +1 -1
  135. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  136. package/dist/components/fields/Slider/Slider.js +1 -1
  137. package/dist/components/fields/Slider/SliderBase.js +1 -1
  138. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  139. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  140. package/dist/components/fields/Slider/elements.js +1 -1
  141. package/dist/components/fields/Slider/index.js +1 -1
  142. package/dist/components/fields/Switch/Switch.js +1 -1
  143. package/dist/components/fields/TextArea/TextArea.js +1 -1
  144. package/dist/components/fields/TextInput/TextInput.js +1 -1
  145. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  146. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  147. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  148. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  149. package/dist/components/form/Form/Field.js +1 -1
  150. package/dist/components/form/Form/Form.js +1 -1
  151. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  152. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  153. package/dist/components/form/Form/SubmitError.js +1 -1
  154. package/dist/components/form/Form/index.js +1 -1
  155. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  156. package/dist/components/form/Form/use-field/use-field.js +1 -1
  157. package/dist/components/form/Form/use-form.js +1 -1
  158. package/dist/components/form/Form/validation.js +1 -1
  159. package/dist/components/form/Label.js +1 -1
  160. package/dist/components/form/wrapper.js +1 -1
  161. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  162. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  163. package/dist/components/layout/Flex.js +1 -1
  164. package/dist/components/layout/Flow.js +1 -1
  165. package/dist/components/layout/Grid.js +1 -1
  166. package/dist/components/layout/Panel.js +1 -1
  167. package/dist/components/layout/Prefix.js +1 -1
  168. package/dist/components/layout/ResizablePanel.js +1 -1
  169. package/dist/components/layout/Space.js +1 -1
  170. package/dist/components/layout/Suffix.js +1 -1
  171. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  172. package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
  173. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  174. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  175. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  176. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  177. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  178. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  179. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  180. package/dist/components/navigation/Tabs/styled.js +1 -1
  181. package/dist/components/navigation/Tabs/types.js +1 -1
  182. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  183. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  184. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  185. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  186. package/dist/components/other/Calendar/Calendar.js +1 -1
  187. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  188. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  189. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  190. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  191. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  192. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  193. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  194. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  195. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  196. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  197. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  198. package/dist/components/overlays/Dialog/context.js +1 -1
  199. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  200. package/dist/components/overlays/Modal/Modal.d.ts +1 -2
  201. package/dist/components/overlays/Modal/Modal.js +1 -1
  202. package/dist/components/overlays/Modal/OpenTransition.js +1 -1
  203. package/dist/components/overlays/Modal/Overlay.d.ts +0 -1
  204. package/dist/components/overlays/Modal/Overlay.js +1 -1
  205. package/dist/components/overlays/Modal/Popover.js +1 -1
  206. package/dist/components/overlays/Modal/Tray.js +1 -1
  207. package/dist/components/overlays/Modal/Underlay.js +1 -1
  208. package/dist/components/overlays/Notifications/Notification.js +2 -2
  209. package/dist/components/overlays/Notifications/Notification.js.map +1 -1
  210. package/dist/components/overlays/Notifications/NotificationAction.js +10 -4
  211. package/dist/components/overlays/Notifications/NotificationAction.js.map +1 -1
  212. package/dist/components/overlays/Notifications/NotificationCard.d.ts +5 -2
  213. package/dist/components/overlays/Notifications/NotificationCard.js +8 -6
  214. package/dist/components/overlays/Notifications/NotificationCard.js.map +1 -1
  215. package/dist/components/overlays/Notifications/NotificationContext.d.ts +0 -2
  216. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  217. package/dist/components/overlays/Notifications/NotificationItem.d.ts +3 -1
  218. package/dist/components/overlays/Notifications/NotificationItem.js +7 -6
  219. package/dist/components/overlays/Notifications/NotificationItem.js.map +1 -1
  220. package/dist/components/overlays/Notifications/OverlayContainer.js +5 -4
  221. package/dist/components/overlays/Notifications/OverlayContainer.js.map +1 -1
  222. package/dist/components/overlays/Notifications/OverlayProvider.js +2 -1
  223. package/dist/components/overlays/Notifications/OverlayProvider.js.map +1 -1
  224. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +2 -2
  225. package/dist/components/overlays/Notifications/PersistentNotificationsList.js.map +1 -1
  226. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  227. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  228. package/dist/components/overlays/Notifications/index.js +1 -1
  229. package/dist/components/overlays/Notifications/types.d.ts +4 -2
  230. package/dist/components/overlays/Notifications/use-notification-state.js +48 -2
  231. package/dist/components/overlays/Notifications/use-notification-state.js.map +1 -1
  232. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  233. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  234. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  235. package/dist/components/overlays/Notifications/use-persistent-state.js +8 -1
  236. package/dist/components/overlays/Notifications/use-persistent-state.js.map +1 -1
  237. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  238. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  239. package/dist/components/overlays/Toast/index.js +1 -1
  240. package/dist/components/overlays/Toast/types.d.ts +2 -0
  241. package/dist/components/overlays/Toast/useProgressToast.js +49 -21
  242. package/dist/components/overlays/Toast/useProgressToast.js.map +1 -1
  243. package/dist/components/overlays/Toast/useToast.js +1 -1
  244. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  245. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  246. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  247. package/dist/components/overlays/Tooltip/context.js +1 -1
  248. package/dist/components/portal/Portal.js +1 -1
  249. package/dist/components/portal/PortalProvider.js +1 -1
  250. package/dist/components/portal/index.d.ts +0 -1
  251. package/dist/components/portal/usePortal.js +1 -1
  252. package/dist/components/shared/InvalidIcon.js +1 -1
  253. package/dist/components/shared/ValidIcon.js +1 -1
  254. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  255. package/dist/components/status/Spin/Cube.js +1 -1
  256. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  257. package/dist/components/status/Spin/Spin.js +1 -1
  258. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  259. package/dist/config.js +1 -1
  260. package/dist/css-writer.js +1 -1
  261. package/dist/data/item-themes.js +1 -1
  262. package/dist/data/themes.js +1 -1
  263. package/dist/extractor.js +1 -1
  264. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  265. package/dist/icons/AdjustmentsIcon.js +1 -1
  266. package/dist/icons/AiIcon.js +1 -1
  267. package/dist/icons/AreaChartIcon.js +1 -1
  268. package/dist/icons/BackwardIcon.js +1 -1
  269. package/dist/icons/BarChartIcon.js +1 -1
  270. package/dist/icons/BellFilledIcon.js +1 -1
  271. package/dist/icons/BellIcon.js +1 -1
  272. package/dist/icons/BooleanIcon.js +1 -1
  273. package/dist/icons/CalendarEditIcon.js +1 -1
  274. package/dist/icons/CalendarIcon.js +1 -1
  275. package/dist/icons/CaretDownIcon.js +1 -1
  276. package/dist/icons/CaretUpIcon.js +1 -1
  277. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  278. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  279. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  280. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  281. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  282. package/dist/icons/ChartBarLineIcon.js +1 -1
  283. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  284. package/dist/icons/ChartBarStackedIcon.js +1 -1
  285. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  286. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  287. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  288. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  289. package/dist/icons/ChartBubbleIcon.js +1 -1
  290. package/dist/icons/ChartDonut2Icon.js +1 -1
  291. package/dist/icons/ChartFunnelIcon.js +1 -1
  292. package/dist/icons/ChartHeatmapIcon.js +1 -1
  293. package/dist/icons/ChartKPIIcon.js +1 -1
  294. package/dist/icons/ChartPie2Icon.js +1 -1
  295. package/dist/icons/ChartScatterIcon.js +1 -1
  296. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  297. package/dist/icons/CheckCircleIcon.js +1 -1
  298. package/dist/icons/CheckIcon.js +1 -1
  299. package/dist/icons/CircleFilledIcon.js +1 -1
  300. package/dist/icons/ClearIcon.js +1 -1
  301. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  302. package/dist/icons/CloseCircleIcon.js +1 -1
  303. package/dist/icons/CloseIcon.js +1 -1
  304. package/dist/icons/CodeIcon.js +1 -1
  305. package/dist/icons/ColumnTotalIcon.js +1 -1
  306. package/dist/icons/CopyIcon.js +1 -1
  307. package/dist/icons/CountIcon.js +1 -1
  308. package/dist/icons/CubeIcon.js +1 -1
  309. package/dist/icons/CubePauseIcon.js +1 -1
  310. package/dist/icons/CubePlayIcon.js +1 -1
  311. package/dist/icons/CurrencyDollarIcon.js +1 -1
  312. package/dist/icons/DangerIcon.js +1 -1
  313. package/dist/icons/DashboardIcon.js +1 -1
  314. package/dist/icons/DatabaseIcon.js +1 -1
  315. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  316. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  317. package/dist/icons/DirectionIcon.js +1 -1
  318. package/dist/icons/DonutIcon.js +1 -1
  319. package/dist/icons/DownIcon.js +1 -1
  320. package/dist/icons/EditIcon.js +1 -1
  321. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  322. package/dist/icons/ExclamationCircleIcon.js +1 -1
  323. package/dist/icons/ExclamationIcon.js +1 -1
  324. package/dist/icons/EyeIcon.js +1 -1
  325. package/dist/icons/EyeInvisibleIcon.js +1 -1
  326. package/dist/icons/FilterIcon.js +1 -1
  327. package/dist/icons/FolderFilledIcon.js +1 -1
  328. package/dist/icons/FolderIcon.js +1 -1
  329. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  330. package/dist/icons/FolderOpenIcon.js +1 -1
  331. package/dist/icons/ForwardIcon.js +1 -1
  332. package/dist/icons/HierarchyIcon.js +1 -1
  333. package/dist/icons/HierarchyOpenIcon.js +1 -1
  334. package/dist/icons/Icon.js +1 -1
  335. package/dist/icons/InfoCircleIcon.js +1 -1
  336. package/dist/icons/InfoIcon.js +1 -1
  337. package/dist/icons/KeyIcon.js +1 -1
  338. package/dist/icons/LeftIcon.js +1 -1
  339. package/dist/icons/LineChartIcon.js +1 -1
  340. package/dist/icons/LoadingIcon.js +1 -1
  341. package/dist/icons/LockFilledIcon.js +1 -1
  342. package/dist/icons/LockIcon.js +1 -1
  343. package/dist/icons/MoreIcon.js +1 -1
  344. package/dist/icons/NotAllowedIcon.js +1 -1
  345. package/dist/icons/Number123Icon.js +1 -1
  346. package/dist/icons/NumberIcon.js +1 -1
  347. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  348. package/dist/icons/PauseCircleIcon.js +1 -1
  349. package/dist/icons/PauseIcon.js +1 -1
  350. package/dist/icons/PercentageIcon.js +1 -1
  351. package/dist/icons/PieChartIcon.js +1 -1
  352. package/dist/icons/PlayCircleIcon.js +1 -1
  353. package/dist/icons/PlayIcon.js +1 -1
  354. package/dist/icons/PlusIcon.js +1 -1
  355. package/dist/icons/ProgressBarIcon.js +1 -1
  356. package/dist/icons/ReloadIcon.js +1 -1
  357. package/dist/icons/ReportIcon.js +1 -1
  358. package/dist/icons/ReturnIcon.js +1 -1
  359. package/dist/icons/RightIcon.js +1 -1
  360. package/dist/icons/RowTotalsIcon.js +1 -1
  361. package/dist/icons/SchemeIcon.js +1 -1
  362. package/dist/icons/SearchIcon.js +1 -1
  363. package/dist/icons/SemanticQueryIcon.js +1 -1
  364. package/dist/icons/SettingsIcon.js +1 -1
  365. package/dist/icons/ShieldFilledIcon.js +1 -1
  366. package/dist/icons/ShieldIcon.js +1 -1
  367. package/dist/icons/SlashIcon.js +1 -1
  368. package/dist/icons/SparklesIcon.js +1 -1
  369. package/dist/icons/SqlIcon.js +1 -1
  370. package/dist/icons/StatsIcon.js +1 -1
  371. package/dist/icons/StopIcon.js +1 -1
  372. package/dist/icons/StringIcon.js +1 -1
  373. package/dist/icons/SubtotalsIcon.js +1 -1
  374. package/dist/icons/SwitchIcon.js +1 -1
  375. package/dist/icons/TableIcon.js +1 -1
  376. package/dist/icons/ThumbsDownIcon.js +1 -1
  377. package/dist/icons/ThumbsUpIcon.js +1 -1
  378. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  379. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  380. package/dist/icons/ThunderboltIcon.js +1 -1
  381. package/dist/icons/TimeIcon.js +1 -1
  382. package/dist/icons/TrashIcon.js +1 -1
  383. package/dist/icons/UnlockIcon.js +1 -1
  384. package/dist/icons/UpIcon.js +1 -1
  385. package/dist/icons/UserGroupIcon.js +1 -1
  386. package/dist/icons/UserIcon.js +1 -1
  387. package/dist/icons/UserLockIcon.js +1 -1
  388. package/dist/icons/ViewIcon.js +1 -1
  389. package/dist/icons/WarningFilledIcon.js +1 -1
  390. package/dist/icons/WarningIcon.js +1 -1
  391. package/dist/icons/wrap-icon.js +1 -1
  392. package/dist/index.js +1 -1
  393. package/dist/injector/injector.js +1 -1
  394. package/dist/injector/sheet-manager.js +1 -1
  395. package/dist/keyframes/index.js +1 -1
  396. package/dist/parser/classify.js +1 -1
  397. package/dist/parser/const.js +1 -1
  398. package/dist/parser/lru.js +1 -1
  399. package/dist/parser/parser.js +1 -1
  400. package/dist/parser/tokenizer.js +1 -1
  401. package/dist/parser/types.js +1 -1
  402. package/dist/pipeline/conditions.js +1 -1
  403. package/dist/pipeline/exclusive.js +1 -1
  404. package/dist/pipeline/index.js +1 -1
  405. package/dist/pipeline/materialize.js +1 -1
  406. package/dist/pipeline/parseStateKey.js +1 -1
  407. package/dist/pipeline/simplify.js +1 -1
  408. package/dist/plugins/okhsl-plugin.js +1 -1
  409. package/dist/properties/index.js +1 -1
  410. package/dist/provider.js +1 -1
  411. package/dist/providers/TrackingProvider.js +1 -1
  412. package/dist/providers/navigationAdapter.default.js +1 -1
  413. package/dist/states/index.js +1 -1
  414. package/dist/styles/align.js +1 -1
  415. package/dist/styles/border.js +1 -1
  416. package/dist/styles/color.js +1 -1
  417. package/dist/styles/createStyle.js +1 -1
  418. package/dist/styles/dimension.js +1 -1
  419. package/dist/styles/display.js +1 -1
  420. package/dist/styles/fade.js +1 -1
  421. package/dist/styles/fill.js +1 -1
  422. package/dist/styles/flow.js +1 -1
  423. package/dist/styles/gap.js +1 -1
  424. package/dist/styles/height.js +1 -1
  425. package/dist/styles/index.js +1 -1
  426. package/dist/styles/inset.js +1 -1
  427. package/dist/styles/justify.js +1 -1
  428. package/dist/styles/margin.js +1 -1
  429. package/dist/styles/outline.js +1 -1
  430. package/dist/styles/padding.js +1 -1
  431. package/dist/styles/predefined.js +1 -1
  432. package/dist/styles/preset.js +1 -1
  433. package/dist/styles/radius.js +1 -1
  434. package/dist/styles/scrollbar.js +1 -1
  435. package/dist/styles/shadow.js +1 -1
  436. package/dist/styles/styledScrollbar.js +1 -1
  437. package/dist/styles/transition.js +1 -1
  438. package/dist/styles/width.js +1 -1
  439. package/dist/tasty/chunks/cacheKey.js +1 -1
  440. package/dist/tasty/chunks/definitions.js +1 -1
  441. package/dist/tasty/chunks/renderChunk.js +1 -1
  442. package/dist/tasty/config.js +1 -1
  443. package/dist/tasty/debug.js +1 -1
  444. package/dist/tasty/hooks/useGlobalStyles.js +1 -1
  445. package/dist/tasty/hooks/useKeyframes.js +1 -1
  446. package/dist/tasty/hooks/useProperty.js +1 -1
  447. package/dist/tasty/hooks/useRawCSS.js +1 -1
  448. package/dist/tasty/hooks/useStyles.js +1 -1
  449. package/dist/tasty/index.d.ts +0 -3
  450. package/dist/tasty/injector/index.js +1 -1
  451. package/dist/tasty/injector/injector.js +1 -1
  452. package/dist/tasty/injector/sheet-manager.js +1 -1
  453. package/dist/tasty/keyframes/index.js +1 -1
  454. package/dist/tasty/parser/classify.js +1 -1
  455. package/dist/tasty/parser/const.js +1 -1
  456. package/dist/tasty/parser/lru.js +1 -1
  457. package/dist/tasty/parser/parser.js +1 -1
  458. package/dist/tasty/parser/tokenizer.js +1 -1
  459. package/dist/tasty/parser/types.js +1 -1
  460. package/dist/tasty/pipeline/conditions.js +1 -1
  461. package/dist/tasty/pipeline/exclusive.js +1 -1
  462. package/dist/tasty/pipeline/index.d.ts +0 -2
  463. package/dist/tasty/pipeline/index.js +1 -1
  464. package/dist/tasty/pipeline/materialize.js +1 -1
  465. package/dist/tasty/pipeline/parseStateKey.js +1 -1
  466. package/dist/tasty/pipeline/simplify.js +1 -1
  467. package/dist/tasty/plugins/okhsl-plugin.js +1 -1
  468. package/dist/tasty/properties/index.js +1 -1
  469. package/dist/tasty/states/index.d.ts +0 -2
  470. package/dist/tasty/states/index.js +1 -1
  471. package/dist/tasty/static/index.js +1 -1
  472. package/dist/tasty/static/tastyStatic.js +1 -1
  473. package/dist/tasty/static/types.js +1 -1
  474. package/dist/tasty/styles/align.js +1 -1
  475. package/dist/tasty/styles/border.js +1 -1
  476. package/dist/tasty/styles/color.js +1 -1
  477. package/dist/tasty/styles/createStyle.js +1 -1
  478. package/dist/tasty/styles/dimension.js +1 -1
  479. package/dist/tasty/styles/display.js +1 -1
  480. package/dist/tasty/styles/fade.js +1 -1
  481. package/dist/tasty/styles/fill.js +1 -1
  482. package/dist/tasty/styles/flow.js +1 -1
  483. package/dist/tasty/styles/gap.js +1 -1
  484. package/dist/tasty/styles/height.js +1 -1
  485. package/dist/tasty/styles/index.js +1 -1
  486. package/dist/tasty/styles/inset.js +1 -1
  487. package/dist/tasty/styles/justify.js +1 -1
  488. package/dist/tasty/styles/list.js +1 -1
  489. package/dist/tasty/styles/margin.js +1 -1
  490. package/dist/tasty/styles/outline.js +1 -1
  491. package/dist/tasty/styles/padding.js +1 -1
  492. package/dist/tasty/styles/predefined.d.ts +0 -1
  493. package/dist/tasty/styles/predefined.js +1 -1
  494. package/dist/tasty/styles/preset.js +1 -1
  495. package/dist/tasty/styles/radius.js +1 -1
  496. package/dist/tasty/styles/scrollbar.js +1 -1
  497. package/dist/tasty/styles/shadow.js +1 -1
  498. package/dist/tasty/styles/styledScrollbar.js +1 -1
  499. package/dist/tasty/styles/transition.js +1 -1
  500. package/dist/tasty/styles/width.js +1 -1
  501. package/dist/tasty/tasty.d.ts +0 -1
  502. package/dist/tasty/tasty.js +1 -1
  503. package/dist/tasty/utils/cache-wrapper.js +1 -1
  504. package/dist/tasty/utils/case-converter.js +1 -1
  505. package/dist/tasty/utils/colors.js +1 -1
  506. package/dist/tasty/utils/dotize.js +1 -1
  507. package/dist/tasty/utils/filter-base-props.js +1 -1
  508. package/dist/tasty/utils/get-display-name.js +1 -1
  509. package/dist/tasty/utils/hsl-to-rgb.js +1 -1
  510. package/dist/tasty/utils/is-dev-env.js +1 -1
  511. package/dist/tasty/utils/merge-styles.js +1 -1
  512. package/dist/tasty/utils/mod-attrs.js +1 -1
  513. package/dist/tasty/utils/okhsl-to-rgb.js +1 -1
  514. package/dist/tasty/utils/process-tokens.js +1 -1
  515. package/dist/tasty/utils/resolve-recipes.js +1 -1
  516. package/dist/tasty/utils/string.js +1 -1
  517. package/dist/tasty/utils/styles.js +1 -1
  518. package/dist/tasty/utils/typography.js +1 -1
  519. package/dist/tasty/utils/warnings.js +1 -1
  520. package/dist/tasty/zero/babel.js +1 -1
  521. package/dist/tasty/zero/index.js +1 -1
  522. package/dist/tasty/zero/next.js +1 -1
  523. package/dist/tokens/base.js +1 -1
  524. package/dist/tokens/colors.js +1 -1
  525. package/dist/tokens/index.js +1 -1
  526. package/dist/tokens/layout.js +1 -1
  527. package/dist/tokens/shadows.js +1 -1
  528. package/dist/tokens/sizes.js +1 -1
  529. package/dist/tokens/spacing.js +1 -1
  530. package/dist/tokens/typography.js +1 -1
  531. package/dist/utils/ResizeSensor.js +1 -1
  532. package/dist/utils/cache-wrapper.js +1 -1
  533. package/dist/utils/case-converter.js +1 -1
  534. package/dist/utils/hsl-to-rgb.js +1 -1
  535. package/dist/utils/is-dev-env.js +1 -1
  536. package/dist/utils/merge-styles.js +1 -1
  537. package/dist/utils/modules.js +1 -1
  538. package/dist/utils/okhsl-to-rgb.js +1 -1
  539. package/dist/utils/process-tokens.js +1 -1
  540. package/dist/utils/promise.js +1 -1
  541. package/dist/utils/raf.js +1 -1
  542. package/dist/utils/random.js +1 -1
  543. package/dist/utils/range.js +1 -1
  544. package/dist/utils/react/RenderCache.js +1 -1
  545. package/dist/utils/react/Slots.js +1 -1
  546. package/dist/utils/react/chain.js +1 -1
  547. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  548. package/dist/utils/react/interactions.js +1 -1
  549. package/dist/utils/react/isTextOnly.js +1 -1
  550. package/dist/utils/react/mapProps.js +1 -1
  551. package/dist/utils/react/mergeProps.js +1 -1
  552. package/dist/utils/react/nullableValue.js +1 -1
  553. package/dist/utils/react/resolveIcon.js +1 -1
  554. package/dist/utils/react/sharedStore.js +1 -1
  555. package/dist/utils/react/useCombinedRefs.js +1 -1
  556. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  557. package/dist/utils/react/useEventBus.js +1 -1
  558. package/dist/utils/react/useId.js +1 -1
  559. package/dist/utils/react/useIsDarwin.js +1 -1
  560. package/dist/utils/react/useKeySymbols.js +1 -1
  561. package/dist/utils/react/useLayoutEffect.js +1 -1
  562. package/dist/utils/react/useLocalStorage.js +1 -1
  563. package/dist/utils/react/useMergeStyles.js +1 -1
  564. package/dist/utils/react/useQaProps.js +1 -1
  565. package/dist/utils/react/useViewportSize.js +1 -1
  566. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  567. package/dist/utils/resolve-recipes.js +1 -1
  568. package/dist/utils/string.js +1 -1
  569. package/dist/utils/styles.js +1 -1
  570. package/dist/utils/tree.js +1 -1
  571. package/dist/utils/warnings.js +1 -1
  572. package/dist/version.js +2 -2
  573. package/package.json +1 -1
  574. package/dist/components/portal/PortalProvider.d.ts +0 -2
  575. package/dist/tasty/chunks/cacheKey.d.ts +0 -2
  576. package/dist/tasty/chunks/index.d.ts +0 -4
  577. package/dist/tasty/chunks/renderChunk.d.ts +0 -3
  578. package/dist/tasty/hooks/index.d.ts +0 -6
  579. package/dist/tasty/pipeline/exclusive.d.ts +0 -2
  580. package/dist/tasty/pipeline/parseStateKey.d.ts +0 -2
  581. package/dist/tasty/plugins/index.d.ts +0 -3
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../tasty/utils/styles.js";
3
3
  import { CONTAINER_STYLES, TEXT_STYLES } from "../../tasty/styles/list.js";
4
4
  import { tasty } from "../../tasty/tasty.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../tasty/utils/styles.js";
3
3
  import { CONTAINER_STYLES, TEXT_STYLES } from "../../tasty/styles/list.js";
4
4
  import { tasty } from "../../tasty/tasty.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../tasty/utils/styles.js";
3
3
  import { CONTAINER_STYLES } from "../../../tasty/styles/list.js";
4
4
  import { tasty } from "../../../tasty/tasty.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { CONTAINER_STYLES } from "../../../tasty/styles/list.js";
3
3
  import { tasty } from "../../../tasty/tasty.js";
4
4
  import { mergeProps } from "../../../utils/react/mergeProps.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { tasty } from "../../../tasty/tasty.js";
3
3
  import { mergeProps } from "../../../utils/react/mergeProps.js";
4
4
  import { TooltipProvider } from "../../overlays/Tooltip/TooltipProvider.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { tasty } from "../../../tasty/tasty.js";
3
3
  import { _Layout } from "./Layout.js";
4
4
  import { _LayoutContent } from "./LayoutContent.js";
@@ -18,6 +18,8 @@ interface CubeLayoutProps extends BaseProps, OuterStyleProps, BlockStyleProps, C
18
18
  contentPadding?: Styles['padding'];
19
19
  /** Enable transition animation for Inner content when panels open/close */
20
20
  hasTransition?: boolean;
21
+ /** Minimum size reserved for the content area between panels. Default: 320 */
22
+ minContentSize?: number;
21
23
  /** Styles for wrapper and Inner sub-element */
22
24
  styles?: Styles;
23
25
  children?: ReactNode;
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../tasty/utils/styles.js";
3
3
  import { isDevEnv } from "../../../tasty/utils/is-dev-env.js";
4
4
  import { mergeStyles } from "../../../tasty/utils/merge-styles.js";
@@ -10,6 +10,7 @@ import { Alert } from "../Alert/Alert.js";
10
10
  import { LayoutProvider, useLayoutActionsContext, useLayoutRefsContext, useLayoutStateContext } from "./LayoutContext.js";
11
11
  import { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from "react";
12
12
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
13
+ import { useResizeObserver } from "@react-aria/utils";
13
14
 
14
15
  //#region src/components/content/Layout/Layout.tsx
15
16
  const LayoutElement = tasty({
@@ -58,8 +59,15 @@ function LayoutInner(props) {
58
59
  const localRef = useRef(null);
59
60
  const [isAutoHeight, setIsAutoHeight] = useState(false);
60
61
  const [isCollapsed, setIsCollapsed] = useState(false);
61
- const { isGrid, columns, rows, template, contentPadding, hasTransition = false, styles, children, style, forwardedRef, innerRef: innerRefProp, innerProps, _forceShowDevWarning, doNotOverflow, ...otherProps } = props;
62
+ const { isGrid, columns, rows, template, contentPadding, hasTransition = false, minContentSize, styles, children, style, forwardedRef, innerRef: innerRefProp, innerProps, _forceShowDevWarning, doNotOverflow, ...otherProps } = props;
62
63
  const combinedInnerRef = useCombinedRefs(innerRefProp);
64
+ const updateContainerSize = layoutActions?.updateContainerSize;
65
+ useResizeObserver({
66
+ ref: localRef,
67
+ onResize: useCallback(() => {
68
+ if (localRef.current) updateContainerSize?.(localRef.current.offsetWidth, localRef.current.offsetHeight);
69
+ }, [updateContainerSize])
70
+ });
63
71
  const outerStyles = extractStyles(otherProps, OUTER_STYLES);
64
72
  const innerStyles = extractStyles(otherProps, INNER_STYLES);
65
73
  const isVertical = useMemo(() => {
@@ -201,9 +209,10 @@ function LayoutInner(props) {
201
209
  * Uses a two-element architecture (wrapper + content) to ensure content never overflows.
202
210
  */
203
211
  function Layout(props, ref) {
204
- const { hasTransition } = props;
212
+ const { hasTransition, minContentSize } = props;
205
213
  return /* @__PURE__ */ jsx(LayoutProvider, {
206
214
  hasTransition,
215
+ minContentSize,
207
216
  children: /* @__PURE__ */ jsx(LayoutInner, {
208
217
  ...props,
209
218
  forwardedRef: ref
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.js","names":[],"sources":["../../../../src/components/content/Layout/Layout.tsx"],"sourcesContent":["import {\n CSSProperties,\n FocusEvent,\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {\n BaseProps,\n BlockStyleProps,\n ColorStyleProps,\n extractStyles,\n filterBaseProps,\n FlowStyleProps,\n INNER_STYLES,\n mergeStyles,\n OUTER_STYLES,\n OuterStyleProps,\n Styles,\n tasty,\n} from '../../../tasty';\nimport { isDevEnv } from '../../../tasty/utils/is-dev-env';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { Alert } from '../Alert';\n\nimport {\n LayoutProvider,\n useLayoutActionsContext,\n useLayoutRefsContext,\n useLayoutStateContext,\n} from './LayoutContext';\n\nconst LayoutElement = tasty({\n as: 'div',\n qa: 'Layout',\n styles: {\n position: 'relative',\n display: 'block',\n overflow: {\n '': 'visible',\n 'do-not-overflow': 'hidden',\n },\n flexGrow: 1,\n placeSelf: 'stretch',\n height: {\n '': 'auto',\n 'auto-height': 'fixed 100%',\n collapsed: '6x',\n },\n\n '$content-padding': '1x',\n // Auto-border size for sub-components (set when layout is vertical)\n '$layout-border-size': {\n '': '0',\n vertical: '1bw',\n },\n\n Inner: {\n // .base-class[data-hover] > [data-element=\"Inner\"] { ...}\n // Direct child selector required for nested layouts\n $: '>',\n container: 'layout / inline-size',\n position: 'absolute',\n inset: '$inset-top $inset-right $inset-bottom $inset-left',\n display: 'flex',\n flow: 'column',\n placeContent: 'stretch',\n placeItems: 'stretch',\n // Disable transition during panel resize for snappy feedback\n // Also disable transition when not ready to prevent initial animation\n // Only animate when has-transition is enabled (and not dragging/not-ready)\n transition: {\n '': 'none',\n 'has-transition': 'inset $transition ease-out',\n 'dragging | not-ready': 'none',\n },\n },\n },\n});\n\nexport interface CubeLayoutProps\n extends BaseProps,\n OuterStyleProps,\n BlockStyleProps,\n ColorStyleProps,\n FlowStyleProps {\n /** Switch to grid display mode */\n isGrid?: boolean;\n /** Grid template columns (when isGrid=true) */\n columns?: Styles['gridColumns'];\n /** Grid template rows (when isGrid=true) */\n rows?: Styles['gridRows'];\n /** Grid template shorthand */\n template?: Styles['gridTemplate'];\n /** Padding for content areas (Layout.Content components). Default: '1x' */\n contentPadding?: Styles['padding'];\n /** Enable transition animation for Inner content when panels open/close */\n hasTransition?: boolean;\n /** Styles for wrapper and Inner sub-element */\n styles?: Styles;\n children?: ReactNode;\n /** Ref for the inner content element */\n innerRef?: ForwardedRef<HTMLDivElement>;\n /** Props to spread on the Inner sub-element */\n innerProps?: HTMLAttributes<HTMLDivElement>;\n /**\n * @internal Force show dev warning even in production (for storybook testing)\n */\n _forceShowDevWarning?: boolean;\n /**\n * When true, applies overflow: hidden to the root element.\n * By default, overflow is visible.\n */\n doNotOverflow?: boolean;\n}\n\nfunction LayoutInner(\n props: CubeLayoutProps & { forwardedRef?: ForwardedRef<HTMLDivElement> },\n) {\n const layoutActions = useLayoutActionsContext();\n const layoutState = useLayoutStateContext();\n const layoutRefs = useLayoutRefsContext();\n const localRef = useRef<HTMLDivElement>(null);\n const [isAutoHeight, setIsAutoHeight] = useState(false);\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n const {\n isGrid,\n columns,\n rows,\n template,\n contentPadding,\n hasTransition = false,\n styles,\n children,\n style,\n forwardedRef,\n innerRef: innerRefProp,\n innerProps,\n _forceShowDevWarning,\n doNotOverflow,\n ...otherProps\n } = props;\n\n const combinedInnerRef = useCombinedRefs(innerRefProp);\n\n // Extract outer wrapper styles and inner content styles\n const outerStyles = extractStyles(otherProps, OUTER_STYLES);\n const innerStyles = extractStyles(otherProps, INNER_STYLES);\n\n // Calculate if the layout flow is vertical (for auto-border feature)\n // Default flow is 'column' (vertical), only horizontal when explicitly set to 'row'\n const isVertical = useMemo(() => {\n const flowFromProp = innerStyles?.flow;\n const flowFromStyles = (styles?.Inner as Record<string, unknown>)?.flow;\n const flowValue = flowFromProp ?? flowFromStyles;\n\n return typeof flowValue !== 'string' || !flowValue.startsWith('row');\n }, [innerStyles?.flow, styles?.Inner]);\n\n // Merge styles using the same pattern as LayoutPane\n const finalStyles = useMemo(() => {\n // Handle grid mode and grid properties\n const gridStyles: Styles = {};\n\n if (isGrid) {\n gridStyles.display = 'grid';\n }\n\n if (columns) {\n gridStyles.gridColumns = columns;\n }\n\n if (rows) {\n gridStyles.gridRows = rows;\n }\n\n if (template) {\n gridStyles.gridTemplate = template;\n }\n\n return mergeStyles(\n outerStyles,\n contentPadding != null ? { '$content-padding': contentPadding } : null,\n styles,\n { Inner: mergeStyles(innerStyles, gridStyles, styles?.Inner as Styles) },\n );\n }, [\n outerStyles,\n innerStyles,\n contentPadding,\n styles,\n isGrid,\n columns,\n rows,\n template,\n ]);\n\n // Calculate inset values from panel sizes\n const panelSizes = layoutState?.panelSizes ?? {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n };\n\n const isDragging = layoutState?.isDragging ?? false;\n const isReady = layoutState?.isReady ?? true;\n const markReady = layoutActions?.markReady;\n const dismissOverlayPanels = layoutActions?.dismissOverlayPanels;\n const hasOverlayPanels = layoutState?.hasOverlayPanels ?? false;\n\n // Mark layout as ready after first paint\n // Using useEffect + requestAnimationFrame ensures:\n // 1. Panels register in useLayoutEffect → correct insets before first paint\n // 2. First paint with not-ready=true (transition disabled)\n // 3. After paint completes → enables transitions for subsequent changes\n useEffect(() => {\n const frameId = requestAnimationFrame(() => {\n markReady?.();\n });\n\n return () => cancelAnimationFrame(frameId);\n }, [markReady]);\n\n // Auto-height detection: if layout collapses to 0 height after initialization,\n // automatically set height to 100% to prevent invisible layout\n useEffect(() => {\n if (isReady && localRef.current && localRef.current.offsetHeight === 0) {\n setIsAutoHeight(true);\n }\n }, [isReady]);\n\n // Second check: if still 0 height after auto-height was applied,\n // show collapsed state with warning\n useEffect(() => {\n if (isAutoHeight && localRef.current) {\n // Use requestAnimationFrame to check after styles have been applied\n const frameId = requestAnimationFrame(() => {\n if (localRef.current && localRef.current.offsetHeight === 0) {\n setIsCollapsed(true);\n }\n });\n\n return () => cancelAnimationFrame(frameId);\n }\n }, [isAutoHeight]);\n\n const insetStyle = useMemo(() => {\n const baseStyle: Record<string, string> = {\n '--inset-top': `${panelSizes.top}px`,\n '--inset-right': `${panelSizes.right}px`,\n '--inset-bottom': `${panelSizes.bottom}px`,\n '--inset-left': `${panelSizes.left}px`,\n };\n\n if (style) {\n return { ...baseStyle, ...style } as CSSProperties;\n }\n\n return baseStyle as CSSProperties;\n }, [panelSizes, style]);\n\n const mods = useMemo(\n () => ({\n dragging: isDragging,\n 'not-ready': !isReady,\n 'has-transition': hasTransition,\n 'auto-height': isAutoHeight && !isCollapsed,\n collapsed: isCollapsed,\n vertical: isVertical,\n 'do-not-overflow': doNotOverflow,\n }),\n [\n isDragging,\n isReady,\n hasTransition,\n isAutoHeight,\n isCollapsed,\n isVertical,\n doNotOverflow,\n ],\n );\n\n // Combine local ref with forwarded ref\n const setRefs = (element: HTMLDivElement | null) => {\n localRef.current = element;\n\n if (typeof forwardedRef === 'function') {\n forwardedRef(element);\n } else if (forwardedRef) {\n forwardedRef.current = element;\n }\n };\n\n // Show dev warning when collapsed and in dev mode (or forced for stories)\n const showDevWarning = isCollapsed && (_forceShowDevWarning || isDevEnv());\n\n // Handle focus entering the Inner element - dismiss overlay panels\n const handleInnerFocus = useCallback(\n (e: FocusEvent<HTMLDivElement>) => {\n // Only dismiss if there are overlay panels\n if (!hasOverlayPanels) return;\n\n // Check if focus is coming from outside the Inner element\n const inner = e.currentTarget;\n const relatedTarget = e.relatedTarget as Node | null;\n\n // If relatedTarget is null or not inside the Inner element,\n // focus is entering from outside - dismiss overlay panels\n if (!relatedTarget || !inner.contains(relatedTarget)) {\n dismissOverlayPanels?.();\n }\n },\n [hasOverlayPanels, dismissOverlayPanels],\n );\n\n // Handle Escape key anywhere in the Layout - dismiss overlay panels\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (hasOverlayPanels && e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n dismissOverlayPanels?.();\n }\n },\n [hasOverlayPanels, dismissOverlayPanels],\n );\n\n return (\n <LayoutElement\n ref={setRefs}\n {...filterBaseProps(otherProps, { eventProps: true })}\n mods={mods}\n styles={finalStyles}\n style={insetStyle}\n onKeyDown={hasOverlayPanels ? handleKeyDown : undefined}\n >\n {showDevWarning ? (\n <Alert theme=\"danger\">\n <b>UIKit:</b> <b>&lt;Layout/&gt;</b> has collapsed to <b>0</b> height.\n Ensure the parent container has a defined height or use the{' '}\n <b>height</b> prop on <b>&lt;Layout/&gt;</b>.\n </Alert>\n ) : (\n <>\n {/* All children go inside the Inner element - panels will portal themselves out */}\n <div\n ref={combinedInnerRef}\n data-element=\"Inner\"\n onFocus={handleInnerFocus}\n {...innerProps}\n >\n {children}\n </div>\n {/* Container for panels to portal into - rendered after Inner so panels paint on top via DOM order */}\n <div\n ref={layoutRefs?.setPanelContainer}\n data-element=\"PanelContainer\"\n />\n </>\n )}\n </LayoutElement>\n );\n}\n\n/**\n * Layout component provides a vertical flex layout with overflow-safe content.\n * Uses a two-element architecture (wrapper + content) to ensure content never overflows.\n */\nfunction Layout(props: CubeLayoutProps, ref: ForwardedRef<HTMLDivElement>) {\n const { hasTransition } = props;\n\n return (\n <LayoutProvider hasTransition={hasTransition}>\n <LayoutInner {...props} forwardedRef={ref} />\n </LayoutProvider>\n );\n}\n\nconst _Layout = forwardRef(Layout);\n\n_Layout.displayName = 'Layout';\n\nexport { _Layout as Layout };\n"],"mappings":"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"}
1
+ {"version":3,"file":"Layout.js","names":[],"sources":["../../../../src/components/content/Layout/Layout.tsx"],"sourcesContent":["import { useResizeObserver } from '@react-aria/utils';\nimport {\n CSSProperties,\n FocusEvent,\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n KeyboardEvent,\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {\n BaseProps,\n BlockStyleProps,\n ColorStyleProps,\n extractStyles,\n filterBaseProps,\n FlowStyleProps,\n INNER_STYLES,\n mergeStyles,\n OUTER_STYLES,\n OuterStyleProps,\n Styles,\n tasty,\n} from '../../../tasty';\nimport { isDevEnv } from '../../../tasty/utils/is-dev-env';\nimport { useCombinedRefs } from '../../../utils/react';\nimport { Alert } from '../Alert';\n\nimport {\n LayoutProvider,\n useLayoutActionsContext,\n useLayoutRefsContext,\n useLayoutStateContext,\n} from './LayoutContext';\n\nconst LayoutElement = tasty({\n as: 'div',\n qa: 'Layout',\n styles: {\n position: 'relative',\n display: 'block',\n overflow: {\n '': 'visible',\n 'do-not-overflow': 'hidden',\n },\n flexGrow: 1,\n placeSelf: 'stretch',\n height: {\n '': 'auto',\n 'auto-height': 'fixed 100%',\n collapsed: '6x',\n },\n\n '$content-padding': '1x',\n // Auto-border size for sub-components (set when layout is vertical)\n '$layout-border-size': {\n '': '0',\n vertical: '1bw',\n },\n\n Inner: {\n // .base-class[data-hover] > [data-element=\"Inner\"] { ...}\n // Direct child selector required for nested layouts\n $: '>',\n container: 'layout / inline-size',\n position: 'absolute',\n inset: '$inset-top $inset-right $inset-bottom $inset-left',\n display: 'flex',\n flow: 'column',\n placeContent: 'stretch',\n placeItems: 'stretch',\n // Disable transition during panel resize for snappy feedback\n // Also disable transition when not ready to prevent initial animation\n // Only animate when has-transition is enabled (and not dragging/not-ready)\n transition: {\n '': 'none',\n 'has-transition': 'inset $transition ease-out',\n 'dragging | not-ready': 'none',\n },\n },\n },\n});\n\nexport interface CubeLayoutProps\n extends BaseProps,\n OuterStyleProps,\n BlockStyleProps,\n ColorStyleProps,\n FlowStyleProps {\n /** Switch to grid display mode */\n isGrid?: boolean;\n /** Grid template columns (when isGrid=true) */\n columns?: Styles['gridColumns'];\n /** Grid template rows (when isGrid=true) */\n rows?: Styles['gridRows'];\n /** Grid template shorthand */\n template?: Styles['gridTemplate'];\n /** Padding for content areas (Layout.Content components). Default: '1x' */\n contentPadding?: Styles['padding'];\n /** Enable transition animation for Inner content when panels open/close */\n hasTransition?: boolean;\n /** Minimum size reserved for the content area between panels. Default: 320 */\n minContentSize?: number;\n /** Styles for wrapper and Inner sub-element */\n styles?: Styles;\n children?: ReactNode;\n /** Ref for the inner content element */\n innerRef?: ForwardedRef<HTMLDivElement>;\n /** Props to spread on the Inner sub-element */\n innerProps?: HTMLAttributes<HTMLDivElement>;\n /**\n * @internal Force show dev warning even in production (for storybook testing)\n */\n _forceShowDevWarning?: boolean;\n /**\n * When true, applies overflow: hidden to the root element.\n * By default, overflow is visible.\n */\n doNotOverflow?: boolean;\n}\n\nfunction LayoutInner(\n props: CubeLayoutProps & { forwardedRef?: ForwardedRef<HTMLDivElement> },\n) {\n const layoutActions = useLayoutActionsContext();\n const layoutState = useLayoutStateContext();\n const layoutRefs = useLayoutRefsContext();\n const localRef = useRef<HTMLDivElement>(null);\n const [isAutoHeight, setIsAutoHeight] = useState(false);\n const [isCollapsed, setIsCollapsed] = useState(false);\n\n const {\n isGrid,\n columns,\n rows,\n template,\n contentPadding,\n hasTransition = false,\n minContentSize,\n styles,\n children,\n style,\n forwardedRef,\n innerRef: innerRefProp,\n innerProps,\n _forceShowDevWarning,\n doNotOverflow,\n ...otherProps\n } = props;\n\n const combinedInnerRef = useCombinedRefs(innerRefProp);\n const updateContainerSize = layoutActions?.updateContainerSize;\n\n useResizeObserver({\n ref: localRef,\n onResize: useCallback(() => {\n if (localRef.current) {\n updateContainerSize?.(\n localRef.current.offsetWidth,\n localRef.current.offsetHeight,\n );\n }\n }, [updateContainerSize]),\n });\n\n // Extract outer wrapper styles and inner content styles\n const outerStyles = extractStyles(otherProps, OUTER_STYLES);\n const innerStyles = extractStyles(otherProps, INNER_STYLES);\n\n // Calculate if the layout flow is vertical (for auto-border feature)\n // Default flow is 'column' (vertical), only horizontal when explicitly set to 'row'\n const isVertical = useMemo(() => {\n const flowFromProp = innerStyles?.flow;\n const flowFromStyles = (styles?.Inner as Record<string, unknown>)?.flow;\n const flowValue = flowFromProp ?? flowFromStyles;\n\n return typeof flowValue !== 'string' || !flowValue.startsWith('row');\n }, [innerStyles?.flow, styles?.Inner]);\n\n // Merge styles using the same pattern as LayoutPane\n const finalStyles = useMemo(() => {\n // Handle grid mode and grid properties\n const gridStyles: Styles = {};\n\n if (isGrid) {\n gridStyles.display = 'grid';\n }\n\n if (columns) {\n gridStyles.gridColumns = columns;\n }\n\n if (rows) {\n gridStyles.gridRows = rows;\n }\n\n if (template) {\n gridStyles.gridTemplate = template;\n }\n\n return mergeStyles(\n outerStyles,\n contentPadding != null ? { '$content-padding': contentPadding } : null,\n styles,\n { Inner: mergeStyles(innerStyles, gridStyles, styles?.Inner as Styles) },\n );\n }, [\n outerStyles,\n innerStyles,\n contentPadding,\n styles,\n isGrid,\n columns,\n rows,\n template,\n ]);\n\n // Calculate inset values from panel sizes\n const panelSizes = layoutState?.panelSizes ?? {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n };\n\n const isDragging = layoutState?.isDragging ?? false;\n const isReady = layoutState?.isReady ?? true;\n const markReady = layoutActions?.markReady;\n const dismissOverlayPanels = layoutActions?.dismissOverlayPanels;\n const hasOverlayPanels = layoutState?.hasOverlayPanels ?? false;\n\n // Mark layout as ready after first paint\n // Using useEffect + requestAnimationFrame ensures:\n // 1. Panels register in useLayoutEffect → correct insets before first paint\n // 2. First paint with not-ready=true (transition disabled)\n // 3. After paint completes → enables transitions for subsequent changes\n useEffect(() => {\n const frameId = requestAnimationFrame(() => {\n markReady?.();\n });\n\n return () => cancelAnimationFrame(frameId);\n }, [markReady]);\n\n // Auto-height detection: if layout collapses to 0 height after initialization,\n // automatically set height to 100% to prevent invisible layout\n useEffect(() => {\n if (isReady && localRef.current && localRef.current.offsetHeight === 0) {\n setIsAutoHeight(true);\n }\n }, [isReady]);\n\n // Second check: if still 0 height after auto-height was applied,\n // show collapsed state with warning\n useEffect(() => {\n if (isAutoHeight && localRef.current) {\n // Use requestAnimationFrame to check after styles have been applied\n const frameId = requestAnimationFrame(() => {\n if (localRef.current && localRef.current.offsetHeight === 0) {\n setIsCollapsed(true);\n }\n });\n\n return () => cancelAnimationFrame(frameId);\n }\n }, [isAutoHeight]);\n\n const insetStyle = useMemo(() => {\n const baseStyle: Record<string, string> = {\n '--inset-top': `${panelSizes.top}px`,\n '--inset-right': `${panelSizes.right}px`,\n '--inset-bottom': `${panelSizes.bottom}px`,\n '--inset-left': `${panelSizes.left}px`,\n };\n\n if (style) {\n return { ...baseStyle, ...style } as CSSProperties;\n }\n\n return baseStyle as CSSProperties;\n }, [panelSizes, style]);\n\n const mods = useMemo(\n () => ({\n dragging: isDragging,\n 'not-ready': !isReady,\n 'has-transition': hasTransition,\n 'auto-height': isAutoHeight && !isCollapsed,\n collapsed: isCollapsed,\n vertical: isVertical,\n 'do-not-overflow': doNotOverflow,\n }),\n [\n isDragging,\n isReady,\n hasTransition,\n isAutoHeight,\n isCollapsed,\n isVertical,\n doNotOverflow,\n ],\n );\n\n // Combine local ref with forwarded ref\n const setRefs = (element: HTMLDivElement | null) => {\n localRef.current = element;\n\n if (typeof forwardedRef === 'function') {\n forwardedRef(element);\n } else if (forwardedRef) {\n forwardedRef.current = element;\n }\n };\n\n // Show dev warning when collapsed and in dev mode (or forced for stories)\n const showDevWarning = isCollapsed && (_forceShowDevWarning || isDevEnv());\n\n // Handle focus entering the Inner element - dismiss overlay panels\n const handleInnerFocus = useCallback(\n (e: FocusEvent<HTMLDivElement>) => {\n // Only dismiss if there are overlay panels\n if (!hasOverlayPanels) return;\n\n // Check if focus is coming from outside the Inner element\n const inner = e.currentTarget;\n const relatedTarget = e.relatedTarget as Node | null;\n\n // If relatedTarget is null or not inside the Inner element,\n // focus is entering from outside - dismiss overlay panels\n if (!relatedTarget || !inner.contains(relatedTarget)) {\n dismissOverlayPanels?.();\n }\n },\n [hasOverlayPanels, dismissOverlayPanels],\n );\n\n // Handle Escape key anywhere in the Layout - dismiss overlay panels\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (hasOverlayPanels && e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n dismissOverlayPanels?.();\n }\n },\n [hasOverlayPanels, dismissOverlayPanels],\n );\n\n return (\n <LayoutElement\n ref={setRefs}\n {...filterBaseProps(otherProps, { eventProps: true })}\n mods={mods}\n styles={finalStyles}\n style={insetStyle}\n onKeyDown={hasOverlayPanels ? handleKeyDown : undefined}\n >\n {showDevWarning ? (\n <Alert theme=\"danger\">\n <b>UIKit:</b> <b>&lt;Layout/&gt;</b> has collapsed to <b>0</b> height.\n Ensure the parent container has a defined height or use the{' '}\n <b>height</b> prop on <b>&lt;Layout/&gt;</b>.\n </Alert>\n ) : (\n <>\n {/* All children go inside the Inner element - panels will portal themselves out */}\n <div\n ref={combinedInnerRef}\n data-element=\"Inner\"\n onFocus={handleInnerFocus}\n {...innerProps}\n >\n {children}\n </div>\n {/* Container for panels to portal into - rendered after Inner so panels paint on top via DOM order */}\n <div\n ref={layoutRefs?.setPanelContainer}\n data-element=\"PanelContainer\"\n />\n </>\n )}\n </LayoutElement>\n );\n}\n\n/**\n * Layout component provides a vertical flex layout with overflow-safe content.\n * Uses a two-element architecture (wrapper + content) to ensure content never overflows.\n */\nfunction Layout(props: CubeLayoutProps, ref: ForwardedRef<HTMLDivElement>) {\n const { hasTransition, minContentSize } = props;\n\n return (\n <LayoutProvider\n hasTransition={hasTransition}\n minContentSize={minContentSize}\n >\n <LayoutInner {...props} forwardedRef={ref} />\n </LayoutProvider>\n );\n}\n\nconst _Layout = forwardRef(Layout);\n\n_Layout.displayName = 'Layout';\n\nexport { _Layout as Layout };\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { tasty } from "../../../tasty/tasty.js";
3
3
  import { _LayoutContent } from "./LayoutContent.js";
4
4
  import { forwardRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { tasty } from "../../../tasty/tasty.js";
3
3
  import { _LayoutContainer } from "./LayoutContainer.js";
4
4
  import { forwardRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../tasty/utils/styles.js";
3
3
  import { mergeStyles } from "../../../tasty/utils/merge-styles.js";
4
4
  import { CONTAINER_STYLES } from "../../../tasty/styles/list.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../tasty/utils/styles.js";
3
3
  import { mergeStyles } from "../../../tasty/utils/merge-styles.js";
4
4
  import { INNER_STYLES, OUTER_STYLES } from "../../../tasty/styles/list.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { useEvent } from "../../../_internal/hooks/use-event.js";
3
3
  import { createContext, useContext, useMemo, useRef, useState } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -16,7 +16,7 @@ function useLayoutActionsContext() {
16
16
  function useLayoutStateContext() {
17
17
  return useContext(LayoutStateContext);
18
18
  }
19
- function LayoutProvider({ children, hasTransition = false }) {
19
+ function LayoutProvider({ children, hasTransition = false, minContentSize = 320 }) {
20
20
  const registeredPanels = useRef(/* @__PURE__ */ new Set());
21
21
  const overlayPanelCallbacks = useRef(/* @__PURE__ */ new Set());
22
22
  const panelContainerRef = useRef(null);
@@ -34,6 +34,8 @@ function LayoutProvider({ children, hasTransition = false }) {
34
34
  const [isDragging, setIsDragging] = useState(false);
35
35
  const [isReady, setIsReady] = useState(false);
36
36
  const [hasOverlayPanels, setHasOverlayPanels] = useState(false);
37
+ const [containerWidth, setContainerWidth] = useState(0);
38
+ const [containerHeight, setContainerHeight] = useState(0);
37
39
  const updatePanelSize = useEvent((side, size) => {
38
40
  setPanelSizes((prev) => {
39
41
  if (prev[side] === size) return prev;
@@ -71,26 +73,36 @@ function LayoutProvider({ children, hasTransition = false }) {
71
73
  const dismissOverlayPanels = useEvent(() => {
72
74
  overlayPanelCallbacks.current.forEach((dismiss) => dismiss());
73
75
  });
76
+ const updateContainerSize = useEvent((width, height) => {
77
+ setContainerWidth((prev) => prev === width ? prev : width);
78
+ setContainerHeight((prev) => prev === height ? prev : height);
79
+ });
74
80
  const actionsValue = useMemo(() => ({
75
81
  registerPanel,
76
82
  unregisterPanel,
77
83
  updatePanelSize,
78
84
  setDragging,
79
85
  markReady,
86
+ updateContainerSize,
80
87
  hasTransition,
88
+ minContentSize,
81
89
  registerOverlayPanel,
82
90
  dismissOverlayPanels
83
- }), [hasTransition]);
91
+ }), [hasTransition, minContentSize]);
84
92
  const stateValue = useMemo(() => ({
85
93
  panelSizes,
86
94
  isDragging,
87
95
  isReady,
88
- hasOverlayPanels
96
+ hasOverlayPanels,
97
+ containerWidth,
98
+ containerHeight
89
99
  }), [
90
100
  panelSizes,
91
101
  isDragging,
92
102
  isReady,
93
- hasOverlayPanels
103
+ hasOverlayPanels,
104
+ containerWidth,
105
+ containerHeight
94
106
  ]);
95
107
  const refsValue = useMemo(() => ({
96
108
  panelContainerRef,
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutContext.js","names":[],"sources":["../../../../src/components/content/Layout/LayoutContext.tsx"],"sourcesContent":["import {\n createContext,\n MutableRefObject,\n ReactNode,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nexport type Side = 'left' | 'top' | 'right' | 'bottom';\n\n/**\n * Refs context - stable refs that don't change and don't trigger re-renders.\n * Provides portal container ref for panels to render into.\n */\nexport interface LayoutRefsContextValue {\n /** Container element ref for panels to portal into */\n panelContainerRef: MutableRefObject<HTMLDivElement | null>;\n /** Whether the panel container is mounted and ready for portals */\n isPanelContainerReady: boolean;\n /** Callback ref to set on the panel container element */\n setPanelContainer: (element: HTMLDivElement | null) => void;\n}\n\nexport const LayoutRefsContext = createContext<LayoutRefsContextValue | null>(\n null,\n);\n\nexport function useLayoutRefsContext(): LayoutRefsContextValue | null {\n return useContext(LayoutRefsContext);\n}\n\n/** Callback to dismiss an overlay panel */\nexport type OverlayDismissCallback = () => void;\n\n/**\n * Actions context - stable functions and configuration that don't change.\n * Separating these from state prevents unnecessary re-renders when only state changes.\n */\nexport interface LayoutActionsContextValue {\n /** Register a panel on a specific side with initial size */\n registerPanel: (side: Side, size: number) => void;\n /** Unregister a panel from a specific side */\n unregisterPanel: (side: Side) => void;\n /** Update the size of a registered panel */\n updatePanelSize: (side: Side, size: number) => void;\n /** Set global dragging state (when any panel is being resized) */\n setDragging: (isDragging: boolean) => void;\n /** Mark the layout as ready (after initial mount) */\n markReady: () => void;\n /** Register an overlay panel's dismiss callback. Returns unregister function. */\n registerOverlayPanel: (dismiss: OverlayDismissCallback) => () => void;\n /** Dismiss all overlay panels */\n dismissOverlayPanels: () => void;\n /** Whether transitions are enabled for panels (stable config value) */\n hasTransition: boolean;\n}\n\n/** State context - reactive state that triggers re-renders */\nexport interface LayoutStateContextValue {\n panelSizes: Record<Side, number>;\n isDragging: boolean;\n isReady: boolean;\n hasOverlayPanels: boolean;\n}\n\nexport const LayoutActionsContext =\n createContext<LayoutActionsContextValue | null>(null);\nexport const LayoutStateContext = createContext<LayoutStateContextValue | null>(\n null,\n);\n\nexport function useLayoutActionsContext(): LayoutActionsContextValue | null {\n return useContext(LayoutActionsContext);\n}\n\nexport function useLayoutStateContext(): LayoutStateContextValue | null {\n return useContext(LayoutStateContext);\n}\n\n/** Combined layout context value for convenience */\nexport interface LayoutContextValue\n extends LayoutActionsContextValue,\n LayoutStateContextValue,\n LayoutRefsContextValue {}\n\n/**\n * Combined hook that returns all layout context values.\n * Convenience wrapper around the individual context hooks.\n * Returns null if used outside of a Layout component.\n */\nexport function useLayoutContext(): LayoutContextValue | null {\n const actions = useLayoutActionsContext();\n const state = useLayoutStateContext();\n const refs = useLayoutRefsContext();\n\n if (!actions || !state || !refs) {\n return null;\n }\n\n return { ...actions, ...state, ...refs };\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n /** Whether transitions are enabled for panels */\n hasTransition?: boolean;\n}\n\nexport function LayoutProvider({\n children,\n hasTransition = false,\n}: LayoutProviderProps) {\n const registeredPanels = useRef<Set<Side>>(new Set());\n const overlayPanelCallbacks = useRef<Set<OverlayDismissCallback>>(new Set());\n const panelContainerRef = useRef<HTMLDivElement | null>(null);\n const [isPanelContainerReady, setIsPanelContainerReady] = useState(false);\n\n // Callback ref for panel container - triggers re-render when container mounts\n const setPanelContainer = useEvent((element: HTMLDivElement | null) => {\n panelContainerRef.current = element;\n setIsPanelContainerReady(element !== null);\n });\n\n const [panelSizes, setPanelSizes] = useState<Record<Side, number>>({\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const [hasOverlayPanels, setHasOverlayPanels] = useState(false);\n\n const updatePanelSize = useEvent((side: Side, size: number) => {\n setPanelSizes((prev) => {\n if (prev[side] === size) return prev;\n return { ...prev, [side]: size };\n });\n });\n\n const registerPanel = useEvent((side: Side, size: number) => {\n if (registeredPanels.current.has(side)) {\n throw new Error(\n `Layout: Only one panel per side is allowed. ` +\n `A panel is already registered on the \"${side}\" side.`,\n );\n }\n\n // Check for axis conflict\n const isHorizontal = side === 'left' || side === 'right';\n const conflictingSides: Side[] = isHorizontal\n ? ['top', 'bottom']\n : ['left', 'right'];\n\n for (const conflictSide of conflictingSides) {\n if (registeredPanels.current.has(conflictSide)) {\n throw new Error(\n `Layout: Panels from different axes cannot be combined. ` +\n `Cannot register \"${side}\" panel when \"${conflictSide}\" panel exists. ` +\n `Use either horizontal (left/right) or vertical (top/bottom) panels.`,\n );\n }\n }\n\n registeredPanels.current.add(side);\n updatePanelSize(side, size);\n });\n\n const unregisterPanel = useEvent((side: Side) => {\n registeredPanels.current.delete(side);\n updatePanelSize(side, 0);\n });\n\n const setDragging = useEvent((dragging: boolean) => {\n setIsDragging(dragging);\n });\n\n const markReady = useEvent(() => {\n setIsReady(true);\n });\n\n const registerOverlayPanel = useEvent((dismiss: OverlayDismissCallback) => {\n overlayPanelCallbacks.current.add(dismiss);\n setHasOverlayPanels(true);\n\n // Return unregister function\n return () => {\n overlayPanelCallbacks.current.delete(dismiss);\n setHasOverlayPanels(overlayPanelCallbacks.current.size > 0);\n };\n });\n\n const dismissOverlayPanels = useEvent(() => {\n overlayPanelCallbacks.current.forEach((dismiss) => dismiss());\n });\n\n // Actions context - stable because all callbacks use useEvent\n const actionsValue = useMemo(\n () => ({\n registerPanel,\n unregisterPanel,\n updatePanelSize,\n setDragging,\n markReady,\n hasTransition,\n registerOverlayPanel,\n dismissOverlayPanels,\n }),\n // Only hasTransition can change - all other values are stable useEvent callbacks\n [hasTransition],\n );\n\n // State context - changes when state updates\n const stateValue = useMemo(\n () => ({\n panelSizes,\n isDragging,\n isReady,\n hasOverlayPanels,\n }),\n [panelSizes, isDragging, isReady, hasOverlayPanels],\n );\n\n // Refs context - includes container ready state\n const refsValue = useMemo(\n () => ({\n panelContainerRef,\n isPanelContainerReady,\n setPanelContainer,\n }),\n [isPanelContainerReady],\n );\n\n return (\n <LayoutRefsContext.Provider value={refsValue}>\n <LayoutActionsContext.Provider value={actionsValue}>\n <LayoutStateContext.Provider value={stateValue}>\n {children}\n </LayoutStateContext.Provider>\n </LayoutActionsContext.Provider>\n </LayoutRefsContext.Provider>\n );\n}\n\n/**\n * Provider that resets the layout context for sub-components.\n * Used to prevent panels in nested Layouts from affecting parent layouts.\n */\nexport function LayoutContextReset({ children }: { children: ReactNode }) {\n return (\n <LayoutRefsContext.Provider value={null}>\n <LayoutActionsContext.Provider value={null}>\n <LayoutStateContext.Provider value={null}>\n {children}\n </LayoutStateContext.Provider>\n </LayoutActionsContext.Provider>\n </LayoutRefsContext.Provider>\n );\n}\n\n// Panel context - provides panel-level callbacks to child components\nexport interface LayoutPanelContextValue {\n /** Callback to change the panel's open state */\n onOpenChange: (isOpen: boolean) => void;\n /** Current open state of the panel */\n isOpen: boolean;\n}\n\nexport const LayoutPanelContext = createContext<LayoutPanelContextValue | null>(\n null,\n);\n\nexport function useLayoutPanelContext(): LayoutPanelContextValue | null {\n return useContext(LayoutPanelContext);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LayoutContext.js","names":[],"sources":["../../../../src/components/content/Layout/LayoutContext.tsx"],"sourcesContent":["import {\n createContext,\n MutableRefObject,\n ReactNode,\n useContext,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useEvent } from '../../../_internal/hooks';\n\nexport type Side = 'left' | 'top' | 'right' | 'bottom';\n\n/**\n * Refs context - stable refs that don't change and don't trigger re-renders.\n * Provides portal container ref for panels to render into.\n */\nexport interface LayoutRefsContextValue {\n /** Container element ref for panels to portal into */\n panelContainerRef: MutableRefObject<HTMLDivElement | null>;\n /** Whether the panel container is mounted and ready for portals */\n isPanelContainerReady: boolean;\n /** Callback ref to set on the panel container element */\n setPanelContainer: (element: HTMLDivElement | null) => void;\n}\n\nexport const LayoutRefsContext = createContext<LayoutRefsContextValue | null>(\n null,\n);\n\nexport function useLayoutRefsContext(): LayoutRefsContextValue | null {\n return useContext(LayoutRefsContext);\n}\n\n/** Callback to dismiss an overlay panel */\nexport type OverlayDismissCallback = () => void;\n\n/**\n * Actions context - stable functions and configuration that don't change.\n * Separating these from state prevents unnecessary re-renders when only state changes.\n */\nexport interface LayoutActionsContextValue {\n /** Register a panel on a specific side with initial size */\n registerPanel: (side: Side, size: number) => void;\n /** Unregister a panel from a specific side */\n unregisterPanel: (side: Side) => void;\n /** Update the size of a registered panel */\n updatePanelSize: (side: Side, size: number) => void;\n /** Set global dragging state (when any panel is being resized) */\n setDragging: (isDragging: boolean) => void;\n /** Mark the layout as ready (after initial mount) */\n markReady: () => void;\n /** Update the container dimensions (called from ResizeObserver) */\n updateContainerSize: (width: number, height: number) => void;\n /** Register an overlay panel's dismiss callback. Returns unregister function. */\n registerOverlayPanel: (dismiss: OverlayDismissCallback) => () => void;\n /** Dismiss all overlay panels */\n dismissOverlayPanels: () => void;\n /** Whether transitions are enabled for panels (stable config value) */\n hasTransition: boolean;\n /** Minimum size reserved for the content area between panels */\n minContentSize: number;\n}\n\n/** State context - reactive state that triggers re-renders */\nexport interface LayoutStateContextValue {\n panelSizes: Record<Side, number>;\n isDragging: boolean;\n isReady: boolean;\n hasOverlayPanels: boolean;\n containerWidth: number;\n containerHeight: number;\n}\n\nexport const LayoutActionsContext =\n createContext<LayoutActionsContextValue | null>(null);\nexport const LayoutStateContext = createContext<LayoutStateContextValue | null>(\n null,\n);\n\nexport function useLayoutActionsContext(): LayoutActionsContextValue | null {\n return useContext(LayoutActionsContext);\n}\n\nexport function useLayoutStateContext(): LayoutStateContextValue | null {\n return useContext(LayoutStateContext);\n}\n\n/** Combined layout context value for convenience */\nexport interface LayoutContextValue\n extends LayoutActionsContextValue,\n LayoutStateContextValue,\n LayoutRefsContextValue {}\n\n/**\n * Combined hook that returns all layout context values.\n * Convenience wrapper around the individual context hooks.\n * Returns null if used outside of a Layout component.\n */\nexport function useLayoutContext(): LayoutContextValue | null {\n const actions = useLayoutActionsContext();\n const state = useLayoutStateContext();\n const refs = useLayoutRefsContext();\n\n if (!actions || !state || !refs) {\n return null;\n }\n\n return { ...actions, ...state, ...refs };\n}\n\nexport interface LayoutProviderProps {\n children: ReactNode;\n /** Whether transitions are enabled for panels */\n hasTransition?: boolean;\n /** Minimum size reserved for the content area between panels. Default: 320 */\n minContentSize?: number;\n}\n\nexport function LayoutProvider({\n children,\n hasTransition = false,\n minContentSize = 320,\n}: LayoutProviderProps) {\n const registeredPanels = useRef<Set<Side>>(new Set());\n const overlayPanelCallbacks = useRef<Set<OverlayDismissCallback>>(new Set());\n const panelContainerRef = useRef<HTMLDivElement | null>(null);\n const [isPanelContainerReady, setIsPanelContainerReady] = useState(false);\n\n // Callback ref for panel container - triggers re-render when container mounts\n const setPanelContainer = useEvent((element: HTMLDivElement | null) => {\n panelContainerRef.current = element;\n setIsPanelContainerReady(element !== null);\n });\n\n const [panelSizes, setPanelSizes] = useState<Record<Side, number>>({\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n });\n const [isDragging, setIsDragging] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const [hasOverlayPanels, setHasOverlayPanels] = useState(false);\n const [containerWidth, setContainerWidth] = useState(0);\n const [containerHeight, setContainerHeight] = useState(0);\n\n const updatePanelSize = useEvent((side: Side, size: number) => {\n setPanelSizes((prev) => {\n if (prev[side] === size) return prev;\n return { ...prev, [side]: size };\n });\n });\n\n const registerPanel = useEvent((side: Side, size: number) => {\n if (registeredPanels.current.has(side)) {\n throw new Error(\n `Layout: Only one panel per side is allowed. ` +\n `A panel is already registered on the \"${side}\" side.`,\n );\n }\n\n // Check for axis conflict\n const isHorizontal = side === 'left' || side === 'right';\n const conflictingSides: Side[] = isHorizontal\n ? ['top', 'bottom']\n : ['left', 'right'];\n\n for (const conflictSide of conflictingSides) {\n if (registeredPanels.current.has(conflictSide)) {\n throw new Error(\n `Layout: Panels from different axes cannot be combined. ` +\n `Cannot register \"${side}\" panel when \"${conflictSide}\" panel exists. ` +\n `Use either horizontal (left/right) or vertical (top/bottom) panels.`,\n );\n }\n }\n\n registeredPanels.current.add(side);\n updatePanelSize(side, size);\n });\n\n const unregisterPanel = useEvent((side: Side) => {\n registeredPanels.current.delete(side);\n updatePanelSize(side, 0);\n });\n\n const setDragging = useEvent((dragging: boolean) => {\n setIsDragging(dragging);\n });\n\n const markReady = useEvent(() => {\n setIsReady(true);\n });\n\n const registerOverlayPanel = useEvent((dismiss: OverlayDismissCallback) => {\n overlayPanelCallbacks.current.add(dismiss);\n setHasOverlayPanels(true);\n\n // Return unregister function\n return () => {\n overlayPanelCallbacks.current.delete(dismiss);\n setHasOverlayPanels(overlayPanelCallbacks.current.size > 0);\n };\n });\n\n const dismissOverlayPanels = useEvent(() => {\n overlayPanelCallbacks.current.forEach((dismiss) => dismiss());\n });\n\n const updateContainerSize = useEvent((width: number, height: number) => {\n setContainerWidth((prev) => (prev === width ? prev : width));\n setContainerHeight((prev) => (prev === height ? prev : height));\n });\n\n // Actions context - stable because all callbacks use useEvent\n const actionsValue = useMemo(\n () => ({\n registerPanel,\n unregisterPanel,\n updatePanelSize,\n setDragging,\n markReady,\n updateContainerSize,\n hasTransition,\n minContentSize,\n registerOverlayPanel,\n dismissOverlayPanels,\n }),\n // Only hasTransition and minContentSize can change - all other values are stable useEvent callbacks\n [hasTransition, minContentSize],\n );\n\n // State context - changes when state updates\n const stateValue = useMemo(\n () => ({\n panelSizes,\n isDragging,\n isReady,\n hasOverlayPanels,\n containerWidth,\n containerHeight,\n }),\n [\n panelSizes,\n isDragging,\n isReady,\n hasOverlayPanels,\n containerWidth,\n containerHeight,\n ],\n );\n\n // Refs context - includes container ready state\n const refsValue = useMemo(\n () => ({\n panelContainerRef,\n isPanelContainerReady,\n setPanelContainer,\n }),\n [isPanelContainerReady],\n );\n\n return (\n <LayoutRefsContext.Provider value={refsValue}>\n <LayoutActionsContext.Provider value={actionsValue}>\n <LayoutStateContext.Provider value={stateValue}>\n {children}\n </LayoutStateContext.Provider>\n </LayoutActionsContext.Provider>\n </LayoutRefsContext.Provider>\n );\n}\n\n/**\n * Provider that resets the layout context for sub-components.\n * Used to prevent panels in nested Layouts from affecting parent layouts.\n */\nexport function LayoutContextReset({ children }: { children: ReactNode }) {\n return (\n <LayoutRefsContext.Provider value={null}>\n <LayoutActionsContext.Provider value={null}>\n <LayoutStateContext.Provider value={null}>\n {children}\n </LayoutStateContext.Provider>\n </LayoutActionsContext.Provider>\n </LayoutRefsContext.Provider>\n );\n}\n\n// Panel context - provides panel-level callbacks to child components\nexport interface LayoutPanelContextValue {\n /** Callback to change the panel's open state */\n onOpenChange: (isOpen: boolean) => void;\n /** Current open state of the panel */\n isOpen: boolean;\n}\n\nexport const LayoutPanelContext = createContext<LayoutPanelContextValue | null>(\n null,\n);\n\nexport function useLayoutPanelContext(): LayoutPanelContextValue | null {\n return useContext(LayoutPanelContext);\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { tasty } from "../../../tasty/tasty.js";
3
3
  import { _LayoutContent } from "./LayoutContent.js";
4
4
  import { forwardRef } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { tasty } from "../../../tasty/tasty.js";
3
3
  import { _LayoutContent } from "./LayoutContent.js";
4
4
  import { forwardRef, useMemo } from "react";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { tasty } from "../../../tasty/tasty.js";
3
3
  import { _LayoutContent } from "./LayoutContent.js";
4
4
  import { forwardRef } from "react";
@@ -20,6 +20,8 @@ interface CubeLayoutHeaderProps extends CubeLayoutContentProps {
20
20
  * Uses Link component which integrates with the navigation provider.
21
21
  */
22
22
  breadcrumbs?: Array<[label: string, href: string]>;
23
+ /** Callback for the back button. When provided, a back arrow button is rendered to the left of the title. */
24
+ onBack?: () => void;
23
25
  }
24
26
  declare const _LayoutHeader: react.ForwardRefExoticComponent<CubeLayoutHeaderProps & react.RefAttributes<HTMLDivElement>>;
25
27
  //#endregion
@@ -1,11 +1,13 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { tasty } from "../../../tasty/tasty.js";
3
3
  import { useAutoTooltip } from "../use-auto-tooltip.js";
4
4
  import { SlashIcon } from "../../../icons/SlashIcon.js";
5
+ import { Button } from "../../actions/Button/Button.js";
5
6
  import { Link } from "../../actions/Link/Link.js";
6
7
  import { _LayoutContent } from "./LayoutContent.js";
7
8
  import { Fragment, forwardRef } from "react";
8
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { IconArrowLeft } from "@tabler/icons-react";
9
11
 
10
12
  //#region src/components/content/Layout/LayoutHeader.tsx
11
13
  const HeaderElement = tasty(_LayoutContent, {
@@ -20,15 +22,22 @@ const HeaderElement = tasty(_LayoutContent, {
20
22
  $: ">",
21
23
  display: "grid",
22
24
  gridTemplate: `
23
- "breadcrumbs breadcrumbs breadcrumbs" auto
24
- "title suffix extra" 1fr
25
- "subtitle subtitle extra" auto
26
- / max-content 1fr minmax(0, auto)
25
+ "breadcrumbs breadcrumbs breadcrumbs breadcrumbs" auto
26
+ "back title suffix extra" 1fr
27
+ ".. subtitle subtitle extra" auto
28
+ / auto max-content 1fr minmax(0, auto)
27
29
  `,
28
30
  gap: 0,
29
31
  placeContent: "stretch",
30
32
  placeItems: "center stretch"
31
33
  },
34
+ Back: {
35
+ $: "> Inner >",
36
+ gridArea: "back",
37
+ display: "flex",
38
+ placeItems: "center",
39
+ margin: ".5x right"
40
+ },
32
41
  Breadcrumbs: {
33
42
  $: "> Inner >",
34
43
  gridArea: "breadcrumbs",
@@ -81,7 +90,7 @@ const HeaderElement = tasty(_LayoutContent, {
81
90
  }
82
91
  });
83
92
  function LayoutHeader(props, ref) {
84
- const { title, level = 3, suffix, extra, subtitle, breadcrumbs, scrollbar = "tiny", children, mods, ...otherProps } = props;
93
+ const { title, level = 3, suffix, extra, subtitle, breadcrumbs, onBack, scrollbar = "tiny", children, mods, ...otherProps } = props;
85
94
  const { labelRef, renderWithTooltip } = useAutoTooltip({
86
95
  tooltip: true,
87
96
  children: typeof title === "string" ? title : void 0
@@ -120,6 +129,15 @@ function LayoutHeader(props, ref) {
120
129
  scrollbar,
121
130
  children: [
122
131
  renderBreadcrumbs(),
132
+ onBack && /* @__PURE__ */ jsx("div", {
133
+ "data-element": "Back",
134
+ children: /* @__PURE__ */ jsx(Button, {
135
+ type: "neutral",
136
+ icon: /* @__PURE__ */ jsx(IconArrowLeft, {}),
137
+ "aria-label": "Go back",
138
+ onPress: onBack
139
+ })
140
+ }),
123
141
  renderWithTooltip(renderTitle, "bottom"),
124
142
  suffix && /* @__PURE__ */ jsx("div", {
125
143
  "data-element": "Suffix",
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutHeader.js","names":["LayoutContent"],"sources":["../../../../src/components/content/Layout/LayoutHeader.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactNode,\n Ref,\n RefCallback,\n} from 'react';\n\nimport { SlashIcon } from '../../../icons/SlashIcon';\nimport { tasty } from '../../../tasty';\nimport { Link } from '../../actions/Link/Link';\nimport { useAutoTooltip } from '../use-auto-tooltip';\n\nimport { CubeLayoutContentProps, LayoutContent } from './LayoutContent';\n\nconst HeaderElement = tasty(LayoutContent, {\n as: 'header',\n qa: 'LayoutHeader',\n styles: {\n container: 'none',\n // Header always has bottom border (inherent style)\n border: 'bottom',\n flexShrink: 0,\n flexGrow: 0,\n\n Inner: {\n $: '>',\n display: 'grid',\n gridTemplate: `\n \"breadcrumbs breadcrumbs breadcrumbs\" auto\n \"title suffix extra\" 1fr\n \"subtitle subtitle extra\" auto\n / max-content 1fr minmax(0, auto)\n `,\n gap: 0,\n placeContent: 'stretch',\n placeItems: 'center stretch',\n },\n\n Breadcrumbs: {\n $: '> Inner >',\n gridArea: 'breadcrumbs',\n display: 'flex',\n flow: 'row nowrap',\n placeItems: 'center start',\n gap: '1bw',\n preset: 't3 strong',\n color: '#dark-02',\n },\n\n Title: {\n $: '> Inner >',\n gridArea: 'title',\n preset: {\n '': 'h3',\n 'level=1': 'h1',\n 'level=2': 'h2',\n 'level=3': 'h3',\n 'level=4': 'h4',\n 'level=5': 'h5',\n 'level=6': 'h6',\n },\n color: '#dark',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n\n Suffix: {\n $: '> Inner >',\n gridArea: 'suffix',\n display: 'flex',\n placeItems: 'center',\n },\n\n Extra: {\n $: '> Inner >',\n gridArea: 'extra',\n display: 'flex',\n placeItems: 'center',\n placeSelf: 'end',\n gap: '1x',\n width: 'max 100%',\n },\n\n Subtitle: {\n $: '> Inner >',\n gridArea: 'subtitle',\n preset: 't3',\n color: '#dark-02',\n },\n },\n});\n\nexport interface CubeLayoutHeaderProps extends CubeLayoutContentProps {\n /** Page/section title */\n title?: ReactNode;\n /** Title heading level (1-6) */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** Content next to the title */\n suffix?: ReactNode;\n /** Content on the right side */\n extra?: ReactNode;\n /** Text below the title */\n subtitle?: ReactNode;\n /**\n * Navigation breadcrumbs (max 3 items recommended).\n * Uses Link component which integrates with the navigation provider.\n */\n breadcrumbs?: Array<[label: string, href: string]>;\n}\n\nfunction LayoutHeader(\n props: CubeLayoutHeaderProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n title,\n level = 3,\n suffix,\n extra,\n subtitle,\n breadcrumbs,\n scrollbar = 'tiny',\n children,\n mods,\n ...otherProps\n } = props;\n\n // Use auto tooltip for title overflow detection\n const { labelRef, renderWithTooltip } = useAutoTooltip({\n tooltip: true,\n children: typeof title === 'string' ? title : undefined,\n });\n\n const hasBreadcrumbs = breadcrumbs && breadcrumbs.length > 0;\n\n const renderBreadcrumbs = () => {\n if (!hasBreadcrumbs) return null;\n\n return (\n <div data-element=\"Breadcrumbs\">\n {breadcrumbs.map(([label, href], index) => (\n <Fragment key={href}>\n <Link to={href}>{label}</Link>\n <SlashIcon />\n </Fragment>\n ))}\n </div>\n );\n };\n\n const renderTitle = (\n tooltipProps?: HTMLAttributes<HTMLElement>,\n tooltipRef?: Ref<HTMLElement>,\n ) => {\n if (!title) return null;\n\n const TitleTag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\n return (\n <TitleTag\n ref={tooltipRef as Ref<HTMLHeadingElement>}\n data-element=\"Title\"\n data-level={level}\n {...tooltipProps}\n >\n <span ref={labelRef as RefCallback<HTMLSpanElement>}>{title}</span>\n </TitleTag>\n );\n };\n\n return (\n <HeaderElement\n {...otherProps}\n ref={ref}\n mods={{ ...mods, level }}\n scrollbar={scrollbar}\n >\n {renderBreadcrumbs()}\n {renderWithTooltip(renderTitle, 'bottom')}\n {suffix && <div data-element=\"Suffix\">{suffix}</div>}\n {extra && <div data-element=\"Extra\">{extra}</div>}\n {subtitle && <div data-element=\"Subtitle\">{subtitle}</div>}\n {children}\n </HeaderElement>\n );\n}\n\nconst _LayoutHeader = forwardRef(LayoutHeader);\n\n_LayoutHeader.displayName = 'Layout.Header';\n\nexport { _LayoutHeader as LayoutHeader };\n"],"mappings":";;;;;;;;;;AAiBA,MAAM,gBAAgB,MAAMA,gBAAe;CACzC,IAAI;CACJ,IAAI;CACJ,QAAQ;EACN,WAAW;EAEX,QAAQ;EACR,YAAY;EACZ,UAAU;EAEV,OAAO;GACL,GAAG;GACH,SAAS;GACT,cAAc;;;;;;GAMd,KAAK;GACL,cAAc;GACd,YAAY;GACb;EAED,aAAa;GACX,GAAG;GACH,UAAU;GACV,SAAS;GACT,MAAM;GACN,YAAY;GACZ,KAAK;GACL,QAAQ;GACR,OAAO;GACR;EAED,OAAO;GACL,GAAG;GACH,UAAU;GACV,QAAQ;IACN,IAAI;IACJ,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACZ;GACD,OAAO;GACP,QAAQ;GACR,UAAU;GACV,cAAc;GACd,YAAY;GACb;EAED,QAAQ;GACN,GAAG;GACH,UAAU;GACV,SAAS;GACT,YAAY;GACb;EAED,OAAO;GACL,GAAG;GACH,UAAU;GACV,SAAS;GACT,YAAY;GACZ,WAAW;GACX,KAAK;GACL,OAAO;GACR;EAED,UAAU;GACR,GAAG;GACH,UAAU;GACV,QAAQ;GACR,OAAO;GACR;EACF;CACF,CAAC;AAoBF,SAAS,aACP,OACA,KACA;CACA,MAAM,EACJ,OACA,QAAQ,GACR,QACA,OACA,UACA,aACA,YAAY,QACZ,UACA,MACA,GAAG,eACD;CAGJ,MAAM,EAAE,UAAU,sBAAsB,eAAe;EACrD,SAAS;EACT,UAAU,OAAO,UAAU,WAAW,QAAQ;EAC/C,CAAC;CAEF,MAAM,iBAAiB,eAAe,YAAY,SAAS;CAE3D,MAAM,0BAA0B;AAC9B,MAAI,CAAC,eAAgB,QAAO;AAE5B,SACE,oBAAC;GAAI,gBAAa;aACf,YAAY,KAAK,CAAC,OAAO,OAAO,UAC/B,qBAAC,uBACC,oBAAC;IAAK,IAAI;cAAO;KAAa,EAC9B,oBAAC,cAAY,KAFA,KAGJ,CACX;IACE;;CAIV,MAAM,eACJ,cACA,eACG;AACH,MAAI,CAAC,MAAO,QAAO;AAInB,SACE,oBAHe,IAAI;GAIjB,KAAK;GACL,gBAAa;GACb,cAAY;GACZ,GAAI;aAEJ,oBAAC;IAAK,KAAK;cAA2C;KAAa;IAC1D;;AAIf,QACE,qBAAC;EACC,GAAI;EACC;EACL,MAAM;GAAE,GAAG;GAAM;GAAO;EACb;;GAEV,mBAAmB;GACnB,kBAAkB,aAAa,SAAS;GACxC,UAAU,oBAAC;IAAI,gBAAa;cAAU;KAAa;GACnD,SAAS,oBAAC;IAAI,gBAAa;cAAS;KAAY;GAChD,YAAY,oBAAC;IAAI,gBAAa;cAAY;KAAe;GACzD;;GACa;;AAIpB,MAAM,gBAAgB,WAAW,aAAa;AAE9C,cAAc,cAAc"}
1
+ {"version":3,"file":"LayoutHeader.js","names":["LayoutContent"],"sources":["../../../../src/components/content/Layout/LayoutHeader.tsx"],"sourcesContent":["import { IconArrowLeft } from '@tabler/icons-react';\nimport {\n ForwardedRef,\n forwardRef,\n Fragment,\n HTMLAttributes,\n ReactNode,\n Ref,\n RefCallback,\n} from 'react';\n\nimport { SlashIcon } from '../../../icons/SlashIcon';\nimport { tasty } from '../../../tasty';\nimport { Button } from '../../actions/Button/Button';\nimport { Link } from '../../actions/Link/Link';\nimport { useAutoTooltip } from '../use-auto-tooltip';\n\nimport { CubeLayoutContentProps, LayoutContent } from './LayoutContent';\n\nconst HeaderElement = tasty(LayoutContent, {\n as: 'header',\n qa: 'LayoutHeader',\n styles: {\n container: 'none',\n // Header always has bottom border (inherent style)\n border: 'bottom',\n flexShrink: 0,\n flexGrow: 0,\n\n Inner: {\n $: '>',\n display: 'grid',\n gridTemplate: `\n \"breadcrumbs breadcrumbs breadcrumbs breadcrumbs\" auto\n \"back title suffix extra\" 1fr\n \".. subtitle subtitle extra\" auto\n / auto max-content 1fr minmax(0, auto)\n `,\n gap: 0,\n placeContent: 'stretch',\n placeItems: 'center stretch',\n },\n\n Back: {\n $: '> Inner >',\n gridArea: 'back',\n display: 'flex',\n placeItems: 'center',\n margin: '.5x right',\n },\n\n Breadcrumbs: {\n $: '> Inner >',\n gridArea: 'breadcrumbs',\n display: 'flex',\n flow: 'row nowrap',\n placeItems: 'center start',\n gap: '1bw',\n preset: 't3 strong',\n color: '#dark-02',\n },\n\n Title: {\n $: '> Inner >',\n gridArea: 'title',\n preset: {\n '': 'h3',\n 'level=1': 'h1',\n 'level=2': 'h2',\n 'level=3': 'h3',\n 'level=4': 'h4',\n 'level=5': 'h5',\n 'level=6': 'h6',\n },\n color: '#dark',\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n\n Suffix: {\n $: '> Inner >',\n gridArea: 'suffix',\n display: 'flex',\n placeItems: 'center',\n },\n\n Extra: {\n $: '> Inner >',\n gridArea: 'extra',\n display: 'flex',\n placeItems: 'center',\n placeSelf: 'end',\n gap: '1x',\n width: 'max 100%',\n },\n\n Subtitle: {\n $: '> Inner >',\n gridArea: 'subtitle',\n preset: 't3',\n color: '#dark-02',\n },\n },\n});\n\nexport interface CubeLayoutHeaderProps extends CubeLayoutContentProps {\n /** Page/section title */\n title?: ReactNode;\n /** Title heading level (1-6) */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** Content next to the title */\n suffix?: ReactNode;\n /** Content on the right side */\n extra?: ReactNode;\n /** Text below the title */\n subtitle?: ReactNode;\n /**\n * Navigation breadcrumbs (max 3 items recommended).\n * Uses Link component which integrates with the navigation provider.\n */\n breadcrumbs?: Array<[label: string, href: string]>;\n /** Callback for the back button. When provided, a back arrow button is rendered to the left of the title. */\n onBack?: () => void;\n}\n\nfunction LayoutHeader(\n props: CubeLayoutHeaderProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const {\n title,\n level = 3,\n suffix,\n extra,\n subtitle,\n breadcrumbs,\n onBack,\n scrollbar = 'tiny',\n children,\n mods,\n ...otherProps\n } = props;\n\n // Use auto tooltip for title overflow detection\n const { labelRef, renderWithTooltip } = useAutoTooltip({\n tooltip: true,\n children: typeof title === 'string' ? title : undefined,\n });\n\n const hasBreadcrumbs = breadcrumbs && breadcrumbs.length > 0;\n\n const renderBreadcrumbs = () => {\n if (!hasBreadcrumbs) return null;\n\n return (\n <div data-element=\"Breadcrumbs\">\n {breadcrumbs.map(([label, href], index) => (\n <Fragment key={href}>\n <Link to={href}>{label}</Link>\n <SlashIcon />\n </Fragment>\n ))}\n </div>\n );\n };\n\n const renderTitle = (\n tooltipProps?: HTMLAttributes<HTMLElement>,\n tooltipRef?: Ref<HTMLElement>,\n ) => {\n if (!title) return null;\n\n const TitleTag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\n return (\n <TitleTag\n ref={tooltipRef as Ref<HTMLHeadingElement>}\n data-element=\"Title\"\n data-level={level}\n {...tooltipProps}\n >\n <span ref={labelRef as RefCallback<HTMLSpanElement>}>{title}</span>\n </TitleTag>\n );\n };\n\n return (\n <HeaderElement\n {...otherProps}\n ref={ref}\n mods={{ ...mods, level }}\n scrollbar={scrollbar}\n >\n {renderBreadcrumbs()}\n {onBack && (\n <div data-element=\"Back\">\n <Button\n type=\"neutral\"\n icon={<IconArrowLeft />}\n aria-label=\"Go back\"\n onPress={onBack}\n />\n </div>\n )}\n {renderWithTooltip(renderTitle, 'bottom')}\n {suffix && <div data-element=\"Suffix\">{suffix}</div>}\n {extra && <div data-element=\"Extra\">{extra}</div>}\n {subtitle && <div data-element=\"Subtitle\">{subtitle}</div>}\n {children}\n </HeaderElement>\n );\n}\n\nconst _LayoutHeader = forwardRef(LayoutHeader);\n\n_LayoutHeader.displayName = 'Layout.Header';\n\nexport { _LayoutHeader as LayoutHeader };\n"],"mappings":";;;;;;;;;;;;AAmBA,MAAM,gBAAgB,MAAMA,gBAAe;CACzC,IAAI;CACJ,IAAI;CACJ,QAAQ;EACN,WAAW;EAEX,QAAQ;EACR,YAAY;EACZ,UAAU;EAEV,OAAO;GACL,GAAG;GACH,SAAS;GACT,cAAc;;;;;;GAMd,KAAK;GACL,cAAc;GACd,YAAY;GACb;EAED,MAAM;GACJ,GAAG;GACH,UAAU;GACV,SAAS;GACT,YAAY;GACZ,QAAQ;GACT;EAED,aAAa;GACX,GAAG;GACH,UAAU;GACV,SAAS;GACT,MAAM;GACN,YAAY;GACZ,KAAK;GACL,QAAQ;GACR,OAAO;GACR;EAED,OAAO;GACL,GAAG;GACH,UAAU;GACV,QAAQ;IACN,IAAI;IACJ,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACZ;GACD,OAAO;GACP,QAAQ;GACR,UAAU;GACV,cAAc;GACd,YAAY;GACb;EAED,QAAQ;GACN,GAAG;GACH,UAAU;GACV,SAAS;GACT,YAAY;GACb;EAED,OAAO;GACL,GAAG;GACH,UAAU;GACV,SAAS;GACT,YAAY;GACZ,WAAW;GACX,KAAK;GACL,OAAO;GACR;EAED,UAAU;GACR,GAAG;GACH,UAAU;GACV,QAAQ;GACR,OAAO;GACR;EACF;CACF,CAAC;AAsBF,SAAS,aACP,OACA,KACA;CACA,MAAM,EACJ,OACA,QAAQ,GACR,QACA,OACA,UACA,aACA,QACA,YAAY,QACZ,UACA,MACA,GAAG,eACD;CAGJ,MAAM,EAAE,UAAU,sBAAsB,eAAe;EACrD,SAAS;EACT,UAAU,OAAO,UAAU,WAAW,QAAQ;EAC/C,CAAC;CAEF,MAAM,iBAAiB,eAAe,YAAY,SAAS;CAE3D,MAAM,0BAA0B;AAC9B,MAAI,CAAC,eAAgB,QAAO;AAE5B,SACE,oBAAC;GAAI,gBAAa;aACf,YAAY,KAAK,CAAC,OAAO,OAAO,UAC/B,qBAAC,uBACC,oBAAC;IAAK,IAAI;cAAO;KAAa,EAC9B,oBAAC,cAAY,KAFA,KAGJ,CACX;IACE;;CAIV,MAAM,eACJ,cACA,eACG;AACH,MAAI,CAAC,MAAO,QAAO;AAInB,SACE,oBAHe,IAAI;GAIjB,KAAK;GACL,gBAAa;GACb,cAAY;GACZ,GAAI;aAEJ,oBAAC;IAAK,KAAK;cAA2C;KAAa;IAC1D;;AAIf,QACE,qBAAC;EACC,GAAI;EACC;EACL,MAAM;GAAE,GAAG;GAAM;GAAO;EACb;;GAEV,mBAAmB;GACnB,UACC,oBAAC;IAAI,gBAAa;cAChB,oBAAC;KACC,MAAK;KACL,MAAM,oBAAC,kBAAgB;KACvB,cAAW;KACX,SAAS;MACT;KACE;GAEP,kBAAkB,aAAa,SAAS;GACxC,UAAU,oBAAC;IAAI,gBAAa;cAAU;KAAa;GACnD,SAAS,oBAAC;IAAI,gBAAa;cAAS;KAAY;GAChD,YAAY,oBAAC;IAAI,gBAAa;cAAY;KAAe;GACzD;;GACa;;AAIpB,MAAM,gBAAgB,WAAW,aAAa;AAE9C,cAAc,cAAc"}
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../tasty/utils/styles.js";
3
3
  import { mergeStyles } from "../../../tasty/utils/merge-styles.js";
4
4
  import { INNER_STYLES, OUTER_STYLES } from "../../../tasty/styles/list.js";
@@ -1,4 +1,4 @@
1
- /** @license MIT | @cube-dev/ui-kit v0.116.3 | Cube Dev Team */
1
+ /** @license MIT | @cube-dev/ui-kit v0.118.0 | Cube Dev Team */
2
2
  import { extractStyles } from "../../../tasty/utils/styles.js";
3
3
  import { mergeStyles } from "../../../tasty/utils/merge-styles.js";
4
4
  import { CONTAINER_STYLES } from "../../../tasty/styles/list.js";
@@ -12,7 +12,7 @@ import { useDebouncedValue } from "../../../_internal/hooks/use-debounced-value.
12
12
  import { DialogContainer } from "../../overlays/Dialog/DialogContainer.js";
13
13
  import { Dialog } from "../../overlays/Dialog/Dialog.js";
14
14
  import { LayoutContextReset, LayoutPanelContext, useLayoutActionsContext, useLayoutRefsContext, useLayoutStateContext } from "./LayoutContext.js";
15
- import { clampSize } from "./utils.js";
15
+ import { clampSize, getOppositeSide, resolveCssSize } from "./utils.js";
16
16
  import { forwardRef, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
17
17
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
18
18
  import { useFocusRing, useHover, useMove } from "react-aria";
@@ -51,12 +51,12 @@ const PanelElement = tasty({
51
51
  "side=right": "initial"
52
52
  },
53
53
  width: {
54
- "": "$panel-size",
54
+ "": "$min-size $panel-size $max-size",
55
55
  "side=top | side=bottom": "100%"
56
56
  },
57
57
  height: {
58
58
  "": "100%",
59
- "side=top | side=bottom": "$panel-size"
59
+ "side=top | side=bottom": "$min-size $panel-size $max-size"
60
60
  },
61
61
  border: {
62
62
  "side=left": "right",
@@ -269,6 +269,18 @@ function LayoutPanel(props, ref) {
269
269
  const combinedRef = useCombinedRefs(ref);
270
270
  const prevProvidedSizeRef = useRef(providedSize);
271
271
  const isHorizontal = side === "left" || side === "right";
272
+ const { containerWidth, containerHeight } = layoutState;
273
+ const { minContentSize } = layoutActions;
274
+ const containerDimension = isHorizontal ? containerWidth : containerHeight;
275
+ const oppositeSide = getOppositeSide(side);
276
+ const oppositePanelSize = layoutState.panelSizes[oppositeSide];
277
+ const ownInsetOffset = isResizable ? RESIZABLE_INSET_OFFSET : 0;
278
+ const naturalMax = useMemo(() => containerDimension > 0 ? Math.max(0, containerDimension - oppositePanelSize - minContentSize - ownInsetOffset) : Infinity, [
279
+ containerDimension,
280
+ oppositePanelSize,
281
+ minContentSize,
282
+ ownInsetOffset
283
+ ]);
272
284
  const [internalIsOpen, setInternalIsOpen] = useState(defaultIsOpen);
273
285
  const isOpen = providedIsOpen ?? internalIsOpen;
274
286
  const [internalIsDialogOpen, setInternalIsDialogOpen] = useState(defaultIsDialogOpen);
@@ -284,7 +296,17 @@ function LayoutPanel(props, ref) {
284
296
  contentPadding,
285
297
  styles
286
298
  ]);
287
- const clampValue = useCallback((value) => clampSize(value, minSize, maxSize), [minSize, maxSize]);
299
+ const resolvedMax = useMemo(() => {
300
+ if (typeof maxSize === "number") return maxSize;
301
+ if (typeof maxSize === "string" && containerDimension > 0) return resolveCssSize(maxSize, containerDimension);
302
+ }, [maxSize, containerDimension]);
303
+ const effectiveMax = useMemo(() => {
304
+ const values = [];
305
+ if (resolvedMax != null) values.push(resolvedMax);
306
+ if (Number.isFinite(naturalMax)) values.push(naturalMax);
307
+ return values.length > 0 ? Math.min(...values) : void 0;
308
+ }, [resolvedMax, naturalMax]);
309
+ const clampValue = useCallback((value) => clampSize(value, minSize, void 0, effectiveMax), [minSize, effectiveMax]);
288
310
  const setContextDragging = layoutActions.setDragging;
289
311
  const { moveProps } = useMove({
290
312
  onMoveStart() {
@@ -324,6 +346,20 @@ function LayoutPanel(props, ref) {
324
346
  isDragging,
325
347
  clampValue
326
348
  ]);
349
+ useEffect(() => {
350
+ if (!isDragging && containerDimension > 0) setSize((prev) => {
351
+ const clamped = clampValue(prev);
352
+ if (clamped !== prev) {
353
+ onSizeChange?.(Math.round(clamped));
354
+ setStoredSize(Math.round(clamped));
355
+ }
356
+ return clamped;
357
+ });
358
+ }, [
359
+ isDragging,
360
+ clampValue,
361
+ containerDimension
362
+ ]);
327
363
  const effectivePanelSize = isOpen && mode === "default" ? size : 0;
328
364
  const effectiveInsetSize = Math.round(effectivePanelSize + (isResizable && effectivePanelSize > 0 ? RESIZABLE_INSET_OFFSET : 0));
329
365
  const { registerPanel, unregisterPanel, updatePanelSize } = layoutActions;
@@ -392,14 +428,25 @@ function LayoutPanel(props, ref) {
392
428
  isReady,
393
429
  mods
394
430
  ]);
431
+ const maxSizeCss = useMemo(() => {
432
+ const parts = [];
433
+ if (maxSize != null) parts.push(typeof maxSize === "number" ? `${maxSize}px` : maxSize);
434
+ if (containerDimension > 0 && Number.isFinite(naturalMax)) parts.push(`${naturalMax}px`);
435
+ if (parts.length === 0) return void 0;
436
+ return parts.length === 1 ? parts[0] : `min(${parts.join(", ")})`;
437
+ }, [
438
+ maxSize,
439
+ naturalMax,
440
+ containerDimension
441
+ ]);
395
442
  const panelStyle = useMemo(() => ({
396
443
  "--panel-size": `${size}px`,
397
444
  "--min-size": typeof minSize === "number" ? `${minSize}px` : minSize,
398
- "--max-size": maxSize != null ? typeof maxSize === "number" ? `${maxSize}px` : maxSize : void 0
445
+ "--max-size": maxSizeCss
399
446
  }), [
400
447
  size,
401
448
  minSize,
402
- maxSize
449
+ maxSizeCss
403
450
  ]);
404
451
  const panelRefCallback = useCallback((node, transitionRef) => {
405
452
  combinedRef.current = node;