@atlaskit/navigation-system 11.0.0 → 11.1.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 (83) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/entry-points/layout/chat-panel.js +12 -0
  3. package/dist/cjs/entry-points/layout/layout-sizing.js +44 -0
  4. package/dist/cjs/ui/page-layout/calculate-layout-area-states.js +179 -0
  5. package/dist/cjs/ui/page-layout/chat-panel.compiled.css +27 -0
  6. package/dist/cjs/ui/page-layout/chat-panel.js +216 -0
  7. package/dist/cjs/ui/page-layout/constants.js +6 -1
  8. package/dist/cjs/ui/page-layout/layout-area-sizing-context.js +13 -0
  9. package/dist/cjs/ui/page-layout/layout-area-sizing-provider.js +304 -0
  10. package/dist/cjs/ui/page-layout/layout-area-state-contexts.js +13 -0
  11. package/dist/cjs/ui/page-layout/main/main.js +11 -2
  12. package/dist/cjs/ui/page-layout/panel-splitter/panel-splitter.js +73 -7
  13. package/dist/cjs/ui/page-layout/panel-splitter/provider.js +7 -1
  14. package/dist/cjs/ui/page-layout/resolve-layout-width.js +13 -0
  15. package/dist/cjs/ui/page-layout/ribbon.js +1 -0
  16. package/dist/cjs/ui/page-layout/root.compiled.css +4 -2
  17. package/dist/cjs/ui/page-layout/root.js +10 -4
  18. package/dist/cjs/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
  19. package/dist/cjs/ui/page-layout/side-nav/side-nav.js +152 -14
  20. package/dist/cjs/ui/page-layout/use-layout-area-sizing.js +73 -0
  21. package/dist/cjs/ui/page-layout/use-layout-main-sizing.js +15 -0
  22. package/dist/cjs/ui/page-layout/use-occupied-layout-width.js +111 -0
  23. package/dist/es2019/entry-points/layout/chat-panel.js +1 -0
  24. package/dist/es2019/entry-points/layout/layout-sizing.js +3 -0
  25. package/dist/es2019/ui/page-layout/calculate-layout-area-states.js +128 -0
  26. package/dist/es2019/ui/page-layout/chat-panel.compiled.css +27 -0
  27. package/dist/es2019/ui/page-layout/chat-panel.js +199 -0
  28. package/dist/es2019/ui/page-layout/constants.js +5 -0
  29. package/dist/es2019/ui/page-layout/layout-area-sizing-context.js +8 -0
  30. package/dist/es2019/ui/page-layout/layout-area-sizing-provider.js +279 -0
  31. package/dist/es2019/ui/page-layout/layout-area-state-contexts.js +7 -0
  32. package/dist/es2019/ui/page-layout/main/main.js +10 -2
  33. package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.js +68 -8
  34. package/dist/es2019/ui/page-layout/panel-splitter/provider.js +7 -1
  35. package/dist/es2019/ui/page-layout/resolve-layout-width.js +7 -0
  36. package/dist/es2019/ui/page-layout/ribbon.js +1 -0
  37. package/dist/es2019/ui/page-layout/root.compiled.css +4 -2
  38. package/dist/es2019/ui/page-layout/root.js +10 -4
  39. package/dist/es2019/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
  40. package/dist/es2019/ui/page-layout/side-nav/side-nav.js +142 -14
  41. package/dist/es2019/ui/page-layout/use-layout-area-sizing.js +58 -0
  42. package/dist/es2019/ui/page-layout/use-layout-main-sizing.js +7 -0
  43. package/dist/es2019/ui/page-layout/use-occupied-layout-width.js +67 -0
  44. package/dist/esm/entry-points/layout/chat-panel.js +1 -0
  45. package/dist/esm/entry-points/layout/layout-sizing.js +3 -0
  46. package/dist/esm/ui/page-layout/calculate-layout-area-states.js +173 -0
  47. package/dist/esm/ui/page-layout/chat-panel.compiled.css +27 -0
  48. package/dist/esm/ui/page-layout/chat-panel.js +207 -0
  49. package/dist/esm/ui/page-layout/constants.js +5 -0
  50. package/dist/esm/ui/page-layout/layout-area-sizing-context.js +8 -0
  51. package/dist/esm/ui/page-layout/layout-area-sizing-provider.js +295 -0
  52. package/dist/esm/ui/page-layout/layout-area-state-contexts.js +7 -0
  53. package/dist/esm/ui/page-layout/main/main.js +11 -2
  54. package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.js +74 -8
  55. package/dist/esm/ui/page-layout/panel-splitter/provider.js +7 -1
  56. package/dist/esm/ui/page-layout/resolve-layout-width.js +7 -0
  57. package/dist/esm/ui/page-layout/ribbon.js +1 -0
  58. package/dist/esm/ui/page-layout/root.compiled.css +4 -2
  59. package/dist/esm/ui/page-layout/root.js +10 -4
  60. package/dist/esm/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
  61. package/dist/esm/ui/page-layout/side-nav/side-nav.js +153 -15
  62. package/dist/esm/ui/page-layout/use-layout-area-sizing.js +67 -0
  63. package/dist/esm/ui/page-layout/use-layout-main-sizing.js +9 -0
  64. package/dist/esm/ui/page-layout/use-occupied-layout-width.js +105 -0
  65. package/dist/types/entry-points/layout/chat-panel.d.ts +1 -0
  66. package/dist/types/entry-points/layout/layout-sizing.d.ts +4 -0
  67. package/dist/types/ui/page-layout/calculate-layout-area-states.d.ts +20 -0
  68. package/dist/types/ui/page-layout/chat-panel.d.ts +48 -0
  69. package/dist/types/ui/page-layout/constants.d.ts +4 -0
  70. package/dist/types/ui/page-layout/layout-area-sizing-context.d.ts +55 -0
  71. package/dist/types/ui/page-layout/layout-area-sizing-provider.d.ts +5 -0
  72. package/dist/types/ui/page-layout/layout-area-state-contexts.d.ts +3 -0
  73. package/dist/types/ui/page-layout/main/main.d.ts +5 -1
  74. package/dist/types/ui/page-layout/panel-splitter/panel-splitter-context.d.ts +15 -1
  75. package/dist/types/ui/page-layout/panel-splitter/provider.d.ts +1 -1
  76. package/dist/types/ui/page-layout/resolve-layout-width.d.ts +2 -0
  77. package/dist/types/ui/page-layout/side-nav/side-nav.d.ts +11 -2
  78. package/dist/types/ui/page-layout/use-layout-area-sizing.d.ts +12 -0
  79. package/dist/types/ui/page-layout/use-layout-main-sizing.d.ts +2 -0
  80. package/dist/types/ui/page-layout/use-occupied-layout-width.d.ts +8 -0
  81. package/layout/chat-panel/package.json +10 -0
  82. package/layout/layout-sizing/package.json +10 -0
  83. package/package.json +11 -3
@@ -4,6 +4,7 @@
4
4
  ._16qs130s{box-shadow:var(--ds-shadow-overlay,0 8px 9pt #1e1f2126,0 0 1px #1e1f214f)}
5
5
  ._1bah1yb4{justify-content:space-between}
6
6
  ._1bsb1ego{width:min(90%,20pc)}
7
+ ._1bsbhc79{width:var(--n_snvRsz,var(--n_sNvw))}
7
8
  ._1e0c1txw{display:flex}
8
9
  ._1e0cglyw{display:none}
9
10
  ._1p2s1vfh{--exit-animation:var(--ds-sidenav-exit-left,200ms cubic-bezier(0,0.4,0,1) SlideOut100PercentLeft)}
@@ -24,7 +25,7 @@
24
25
  [dir=rtl] ._65m41mrw{--animation-direction:-1}
25
26
  @media (prefers-reduced-motion:no-preference){._10t81t0s{transition-property:display}._1vrh1a5r{transition-behavior:allow-discrete}._xrrpi9qs{transition-duration:var(--ds-duration-medium,.2s)}._10t88iot{transition-property:transform,display}._xrrpfnf5{transition-duration:.2s}._1lh81gzg{grid-area:main}._1xq51mm8{transition-timing-function:cubic-bezier(0,.4,0,1)}._k1affm5y{animation:var(--exit-animation)}@starting-style{._1nu51p9u{transform:translateX(calc(-100%*var(--animation-direction)))}}._1xq51ku9{transition-timing-function:cubic-bezier(.6,0,0,1)}._k1af10ed{animation:var(--enter-animation)}}
26
27
  @media (min-width:48rem){._14b5hc79{width:var(--n_snvRsz,var(--n_sNvw))}}
27
- @media (min-width:64rem){._165t56xv{height:calc(100vh - var(--n_bnrM, 0px))}._p0az1elq{transform:translateX(calc(var(--n_snvRsz, var(--n_snvW, 0px)) - var(--ds-border-width, 1px)))}._dm2518uv{display:initial}._dm25glyw{display:none}._qiln1gzg{grid-area:main}._p5clglyw{border-inline-end:none}._4ap31bhr{background-color:var(--ds-surface-overlay,#fff)}._scbp130s{box-shadow:var(--ds-shadow-overlay,0 8px 9pt #1e1f2126,0 0 1px #1e1f214f)}._qilnk0mc{grid-area:side-nav}._p5clia51{border-inline-end:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}._4ap3vuon{background-color:var(--ds-surface,#fff)}._scbpglyw{box-shadow:none}}
28
+ @media (min-width:64rem){._165t56xv{height:calc(100vh - var(--n_bnrM, 0px))}._p0az1elq{transform:translateX(calc(var(--n_snvRsz, var(--n_snvW, 0px)) - var(--ds-border-width, 1px)))}._cpcf1gzg._cpcf1gzg{grid-area:main}._6kttglyw._6kttglyw{border-inline-end:none}._w8v11bhr._w8v11bhr{background-color:var(--ds-surface-overlay,#fff)}._1jug130s._1jug130s{box-shadow:var(--ds-shadow-overlay,0 8px 9pt #1e1f2126,0 0 1px #1e1f214f)}._dm2518uv{display:initial}._dm25glyw{display:none}._qiln1gzg{grid-area:main}._p5clglyw{border-inline-end:none}._4ap31bhr{background-color:var(--ds-surface-overlay,#fff)}._scbp130s{box-shadow:var(--ds-shadow-overlay,0 8px 9pt #1e1f2126,0 0 1px #1e1f214f)}._qilnk0mc{grid-area:side-nav}._p5clia51{border-inline-end:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}._4ap3vuon{background-color:var(--ds-surface,#fff)}._scbpglyw{box-shadow:none}}
28
29
  @media (prefers-reduced-motion:no-preference) and (min-width:64rem){._17ly8iot{transition-property:transform,display}._177m1a5r{transition-behavior:allow-discrete}._1sg81gzg{grid-area:main}._n2infm5y{animation:var(--exit-animation)}._17ly1wzp{transition-property:grid-area,display}._hjoi1wsm{transition-duration:var(--ds-duration-instant,0ms),var(--ds-duration-medium,.2s)}._1wxo1cio{transition-delay:19ms,var(--ds-duration-instant,0ms)}._vgub1mm8{transition-timing-function:cubic-bezier(0,.4,0,1)}._hh1u1p9u{transform:translateX(calc(-100%*var(--animation-direction)))}@starting-style{._1xpz1gzg{grid-area:main}}._1sg8k0mc{grid-area:side-nav}._n2in10ed{animation:var(--enter-animation)}._17ly1q8v{transition-property:grid-area}._hjoi147i{transition-duration:var(--ds-duration-instant,0ms)}._1wxo4so3{transition-delay:24ms}@starting-style{._s2eg1p9u{transform:translateX(calc(-100%*var(--animation-direction)))}}._vgub1ku9{transition-timing-function:cubic-bezier(.6,0,0,1)}._hjoifnf5{transition-duration:.2s}._hjoi1mzy{transition-duration:var(--ds-duration-long,.25s)}._hjoii9qs{transition-duration:var(--ds-duration-medium,.2s)}}
29
30
  @media (prefers-reduced-motion:no-preference) and (not (min-width:64rem)){._aadi1p9u{transform:translateX(calc(-100%*var(--animation-direction)))}}
30
31
  @media not (min-width:64rem){._89fi1b6c{grid-area:main/aside/aside/aside}}
@@ -29,7 +29,10 @@ var _useIsFhsEnabled = require("../../fhs-rollout/use-is-fhs-enabled");
29
29
  var _constants = require("../constants");
30
30
  var _dangerouslyHoistCssVarToDocumentRoot = require("../dangerously-hoist-css-var-to-document-root");
31
31
  var _hoistSlotSizesContext = require("../hoist-slot-sizes-context");
32
+ var _convertResizeBoundToPixels = require("../panel-splitter/convert-resize-bound-to-pixels");
32
33
  var _provider = require("../panel-splitter/provider");
34
+ var _resolveLayoutWidth = require("../resolve-layout-width");
35
+ var _useLayoutAreaSizing2 = require("../use-layout-area-sizing");
33
36
  var _useLayoutId = require("../use-layout-id");
34
37
  var _useResizingWidthCssVarOnRootElement = require("../use-resizing-width-css-var-on-root-element");
35
38
  var _useSafeDefaultWidth = require("../use-safe-default-width");
@@ -52,12 +55,11 @@ var panelSplitterResizingVar = '--n_snvRsz';
52
55
  // Used to share the side nav width with the panel splitter, which is rendered outside the side nav element
53
56
  // but positioned to stay at its right edge.
54
57
  var sideNavClampedWidthVar = '--n_snvW';
55
- var widthResizeBounds = {
56
- min: '240px',
57
- max: '50vw'
58
- };
59
- function getResizeBounds() {
60
- return widthResizeBounds;
58
+ var fallbackMinWidth = '240px';
59
+ function getPixelCustomProperty(element, propertyName, fallback) {
60
+ var raw = getComputedStyle(element).getPropertyValue(propertyName).trim();
61
+ var value = Number.parseFloat(raw);
62
+ return Number.isFinite(value) ? (0, _resolveLayoutWidth.resolveLayoutWidth)(raw.endsWith('vw') ? "".concat(value, "vw") : value, window.innerWidth) : fallback;
61
63
  }
62
64
 
63
65
  /**
@@ -71,6 +73,8 @@ var panelSplitterPortalTargetStyles = {
71
73
  };
72
74
  var styles = {
73
75
  root: "_191wglyw _t51zglyw _bfhk1bhr _16qs130s _vchhusvi _4t3ieqxy _152timx3 _kqsw1if8 _1bsb1ego _1pbycs5v _14b5hc79 _qilnk0mc _p5clia51 _4ap3vuon _scbpglyw _89fi1b6c",
76
+ chatPanelSizing: "_1bsbhc79",
77
+ managedOverlay: "_cpcf1gzg _6kttglyw _w8v11bhr _1jug130s",
74
78
  flyoutOpen: "_qiln1gzg _p5clglyw _4ap31bhr _scbp130s _139f8iot _1tpvfnf5 _sylc1a5r _oyeijq3t",
75
79
  flyoutAnimateClosed: "_1e0cglyw _qiln1gzg _139f8iot _1tpvfnf5 _sylc1a5r _1uwsjq3t",
76
80
  animationRTLSupport: "_15yekb7n _65m41mrw",
@@ -120,11 +124,14 @@ var onPeekStartDelayMs = exports.onPeekStartDelayMs = 500;
120
124
  * context value.
121
125
  */
122
126
  function SideNavInternal(_ref) {
123
- var _sideNavState$lastTri;
127
+ var _managedSizing$mode, _managedSizing$width, _sideNavState$lastTri;
124
128
  var children = _ref.children,
125
129
  defaultCollapsed = _ref.defaultCollapsed,
126
130
  _ref$defaultWidth = _ref.defaultWidth,
127
131
  defaultWidthProp = _ref$defaultWidth === void 0 ? fallbackDefaultWidth : _ref$defaultWidth,
132
+ _ref$minWidth = _ref.minWidth,
133
+ minWidth = _ref$minWidth === void 0 ? fallbackMinWidth : _ref$minWidth,
134
+ maxWidth = _ref.maxWidth,
128
135
  testId = _ref.testId,
129
136
  _ref$label = _ref.label,
130
137
  label = _ref$label === void 0 ? 'Sidebar' : _ref$label,
@@ -136,6 +143,7 @@ function SideNavInternal(_ref) {
136
143
  onPeekEnd = _ref.onPeekEnd,
137
144
  providedId = _ref.id,
138
145
  canToggleWithShortcut = _ref.canToggleWithShortcut;
146
+ var isChatPanelLayoutEnabled = (0, _fg.fg)('platform-dst-chat-panel-layout');
139
147
  var isFhsEnabled = (0, _useIsFhsEnabled.useIsFhsEnabled)();
140
148
  var id = (0, _useLayoutId.useLayoutId)({
141
149
  providedId: providedId
@@ -221,18 +229,142 @@ function SideNavInternal(_ref) {
221
229
  });
222
230
  var _useState5 = (0, _react.useState)(defaultWidth),
223
231
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
224
- width = _useState6[0],
225
- setWidth = _useState6[1];
226
- var clampedWidth = "clamp(".concat(widthResizeBounds.min, ", ").concat(width, "px, ").concat(widthResizeBounds.max, ")");
232
+ inlineWidth = _useState6[0],
233
+ setInlineWidth = _useState6[1];
234
+ var _useState7 = (0, _react.useState)(defaultWidth),
235
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
236
+ overlayWidth = _useState8[0],
237
+ setOverlayWidth = _useState8[1];
238
+ var _useState9 = (0, _react.useState)(false),
239
+ _useState0 = (0, _slicedToArray2.default)(_useState9, 2),
240
+ isInline = _useState0[0],
241
+ setIsInline = _useState0[1];
242
+ (0, _react.useEffect)(function () {
243
+ if (!isChatPanelLayoutEnabled) {
244
+ return;
245
+ }
246
+ var mediaQuery = window.matchMedia('(min-width: 64rem)');
247
+ setIsInline(mediaQuery.matches);
248
+ var onChange = function onChange(event) {
249
+ return setIsInline(event.matches);
250
+ };
251
+ return (0, _bindEventListener.bind)(mediaQuery, {
252
+ type: 'change',
253
+ listener: onChange
254
+ });
255
+ }, [isChatPanelLayoutEnabled]);
256
+ var toggleVisibilityForChatPanel = (0, _useToggleSideNav.useToggleSideNav)({
257
+ trigger: 'programmatic'
258
+ });
259
+ var closeOverlayForChatPanel = (0, _react.useCallback)(function () {
260
+ // Allocation can overlay an expanded desktop nav when other slots consume
261
+ // its space. Dismiss the visibility state selected by the viewport, not the mode.
262
+ var isDesktop = window.matchMedia('(min-width: 64rem)').matches;
263
+ if (isDesktop ? isExpandedOnDesktop : isExpandedOnMobile) {
264
+ toggleVisibilityForChatPanel();
265
+ }
266
+ }, [isExpandedOnDesktop, isExpandedOnMobile, toggleVisibilityForChatPanel]);
267
+ var _useLayoutAreaSizing = (0, _useLayoutAreaSizing2.useLayoutAreaSizing)({
268
+ area: 'side-nav',
269
+ config: {
270
+ defaultWidth: defaultWidth,
271
+ minWidth: minWidth,
272
+ maxWidth: maxWidth,
273
+ isOpen: isInline ? isExpandedOnDesktop : isExpandedOnMobile,
274
+ onRequestClose: closeOverlayForChatPanel
275
+ }
276
+ }),
277
+ managedSizing = _useLayoutAreaSizing.state,
278
+ getManagedResizeBounds = _useLayoutAreaSizing.getResizeBounds,
279
+ startResize = _useLayoutAreaSizing.startResize,
280
+ resize = _useLayoutAreaSizing.resize,
281
+ completeResize = _useLayoutAreaSizing.completeResize;
282
+ var mode = (_managedSizing$mode = managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.mode) !== null && _managedSizing$mode !== void 0 ? _managedSizing$mode : isInline ? 'inline' : 'overlay';
283
+ var renderedWidth = isChatPanelLayoutEnabled ? (_managedSizing$width = managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.width) !== null && _managedSizing$width !== void 0 ? _managedSizing$width : mode === 'inline' ? inlineWidth : overlayWidth : inlineWidth;
284
+ var configuredMaxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : '100vw';
285
+ var clampedWidth = !isChatPanelLayoutEnabled ? "clamp(240px, ".concat(inlineWidth, "px, 50vw)") : managedSizing ? "".concat(renderedWidth, "px") : "clamp(".concat(minWidth, ", ").concat(renderedWidth, "px, ").concat(configuredMaxWidth, ")");
227
286
  var dangerouslyHoistSlotSizes = (0, _react.useContext)(_hoistSlotSizesContext.DangerouslyHoistSlotSizes);
228
287
  var navRef = (0, _react.useRef)(null);
229
288
  var panelSplitterPortalTargetRef = (0, _react.useRef)(null);
289
+ var getResizeBounds = (0, _react.useCallback)(function () {
290
+ if (!isChatPanelLayoutEnabled) {
291
+ return {
292
+ min: '240px',
293
+ max: '50vw'
294
+ };
295
+ }
296
+ var managedBounds = getManagedResizeBounds();
297
+ if (managedBounds) {
298
+ return managedBounds;
299
+ }
300
+ var sideNav = navRef.current;
301
+ var layoutRoot = sideNav === null || sideNav === void 0 ? void 0 : sideNav.parentElement;
302
+ var main = layoutRoot === null || layoutRoot === void 0 ? void 0 : layoutRoot.querySelector(':scope > [data-layout-slot][role="main"]');
303
+ var fallbackMaxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : mode === 'inline' ? '100vw' : '90vw';
304
+ if (!sideNav || mode === 'overlay') {
305
+ var chatPanel = layoutRoot === null || layoutRoot === void 0 ? void 0 : layoutRoot.querySelector(':scope > [data-layout-chat-panel]');
306
+ var inlineChatPanelWidth = chatPanel && getComputedStyle(chatPanel).gridArea === 'chat-panel' ? chatPanel.getBoundingClientRect().width : 0;
307
+ var overlayMaxWidth = Math.floor((window.innerWidth - inlineChatPanelWidth) * 0.9);
308
+ var _constrainedMaxWidth = maxWidth ? Math.min((0, _convertResizeBoundToPixels.convertResizeBoundToPixels)(maxWidth), overlayMaxWidth) : overlayMaxWidth;
309
+ return {
310
+ min: minWidth,
311
+ max: "".concat(Math.max((0, _convertResizeBoundToPixels.convertResizeBoundToPixels)(minWidth), _constrainedMaxWidth), "px")
312
+ };
313
+ }
314
+ if (!main) {
315
+ return {
316
+ min: minWidth,
317
+ max: fallbackMaxWidth
318
+ };
319
+ }
320
+ var sideNavWidth = sideNav.getBoundingClientRect().width;
321
+ var mainWidth = main.getBoundingClientRect().width;
322
+
323
+ // JSDOM does not perform layout, so retain the static fallback in unit tests and other
324
+ // environments where used widths cannot be measured.
325
+ if (sideNavWidth === 0 || mainWidth === 0) {
326
+ return {
327
+ min: minWidth,
328
+ max: fallbackMaxWidth
329
+ };
330
+ }
331
+ var localPanel = main.querySelector('[data-layout-with-panel-slot]');
332
+ var isLocalPanelInline = localPanel && getComputedStyle(localPanel).gridArea === 'panel';
333
+ var localPanelWidth = isLocalPanelInline ? localPanel.getBoundingClientRect().width : 0;
334
+ var mainContentWidth = mainWidth - localPanelWidth;
335
+ var mainMinimumWidth = getPixelCustomProperty(main, _constants.mainMinimumWidthVar, 320);
336
+ var availableWidth = Math.max(0, mainContentWidth - mainMinimumWidth);
337
+ var availableInlineWidth = Math.floor(sideNavWidth + availableWidth);
338
+ var constrainedMaxWidth = maxWidth ? Math.min((0, _convertResizeBoundToPixels.convertResizeBoundToPixels)(maxWidth), availableInlineWidth) : availableInlineWidth;
339
+ return {
340
+ min: minWidth,
341
+ max: "".concat(Math.max((0, _convertResizeBoundToPixels.convertResizeBoundToPixels)(minWidth), constrainedMaxWidth), "px")
342
+ };
343
+ }, [getManagedResizeBounds, isChatPanelLayoutEnabled, maxWidth, minWidth, mode]);
230
344
  /**
231
345
  * Used to share the side nav element with the `Panel`,
232
346
  * which observes the side nav to determine its maximum width.
233
347
  */
234
348
  var sharedRef = (0, _useSideNavRef.useSideNavRef)();
235
349
  var mergedRef = (0, _mergeRefs.default)([navRef, sharedRef]);
350
+ var onCompleteResize = (0, _react.useCallback)(function (finalWidth) {
351
+ if (!isChatPanelLayoutEnabled) {
352
+ setInlineWidth(finalWidth);
353
+ return;
354
+ }
355
+ if (mode === 'inline') {
356
+ setInlineWidth(finalWidth);
357
+ } else {
358
+ setOverlayWidth(finalWidth);
359
+ }
360
+ completeResize(mode, finalWidth);
361
+ }, [completeResize, isChatPanelLayoutEnabled, mode]);
362
+ var onResizeStartInternal = (0, _react.useCallback)(function () {
363
+ startResize(mode);
364
+ }, [mode, startResize]);
365
+ var onResizeInternal = (0, _react.useCallback)(function (width) {
366
+ return resize(mode, width);
367
+ }, [mode, resize]);
236
368
  var toggleButtonElement = (0, _react.useContext)(_sideNavToggleButtonElement.SideNavToggleButtonElement);
237
369
  var topNavStartElement = (0, _react.useContext)(_topNavStartElement.TopNavStartElement);
238
370
  var devTimeOnlyAttributes = {};
@@ -724,7 +856,7 @@ function SideNavInternal(_ref) {
724
856
  // Used to conditionally display the keyboard shortcut in the SideNavPanelSplitter tooltip.
725
857
  var isShortcutEnabled = (0, _useIsSideNavShortcutEnabled.useIsSideNavShortcutEnabled)();
726
858
  (0, _useResizingWidthCssVarOnRootElement.useResizingWidthCssVarOnRootElement)({
727
- isEnabled: true,
859
+ isEnabled: !isChatPanelLayoutEnabled || !managedSizing,
728
860
  cssVar: panelSplitterResizingVar,
729
861
  panelId: _constants.sideNavPanelSplitterId
730
862
  });
@@ -786,7 +918,7 @@ function SideNavInternal(_ref) {
786
918
  style: (0, _defineProperty2.default)({}, _constants.sideNavVar, clampedWidth),
787
919
  ref: mergedRef,
788
920
  "data-testid": testId,
789
- className: (0, _runtime.ax)([styles.root, isExpandedOnDesktop && !isExpandedOnMobile && !isFlyoutVisible && styles.hiddenMobileOnly, !isExpandedOnDesktop && isExpandedOnMobile && !isFlyoutVisible && styles.hiddenDesktopOnly, !isExpandedOnDesktop && !isExpandedOnMobile && !isFlyoutVisible && styles.hiddenMobileAndDesktop, isMotionUpliftEnabled && motionUpliftStyles.animationRTLSupport, !isMotionUpliftEnabled && isFhsEnabled && styles.animationRTLSupport, shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.animationBaseStyles, shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.animationBaseStyles, isExpandedOnMobile && shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.expandAnimationMobile, isExpandedOnMobile && shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.expandAnimationMobile, !isExpandedOnMobile && shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.collapseAnimationMobile, !isExpandedOnMobile && shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.collapseAnimationMobile, isExpandedOnDesktop && shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.expandAnimationDesktop, isExpandedOnDesktop && shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.expandAnimationDesktop, !isExpandedOnDesktop && shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.collapseAnimationDesktop, !isExpandedOnDesktop && shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.collapseAnimationDesktop, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' && !isFhsEnabled && isMotionUpliftEnabled && motionUpliftStyles.flyoutOpen, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' && !isFhsEnabled && !isMotionUpliftEnabled && styles.flyoutOpen, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close' && !isFhsEnabled && isMotionUpliftEnabled && motionUpliftStyles.flyoutAnimateClosed, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close' && !isFhsEnabled && !isMotionUpliftEnabled && styles.flyoutAnimateClosed, ((sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' || (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close') && !isFirefox && isFhsEnabled && styles.flyoutBaseStylesFullHeightSidebar, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' && !isFirefox && isFhsEnabled && isMotionUpliftEnabled && motionUpliftStyles.flyoutOpenFullHeightSidebar, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' && !isFirefox && isFhsEnabled && !isMotionUpliftEnabled && styles.flyoutOpenFullHeightSidebar, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close' && !isFirefox && isFhsEnabled && isMotionUpliftEnabled && motionUpliftStyles.flyoutAnimateClosedFullHeightSidebar, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close' && !isFirefox && isFhsEnabled && !isMotionUpliftEnabled && styles.flyoutAnimateClosedFullHeightSidebar])
921
+ className: (0, _runtime.ax)([styles.root, isChatPanelLayoutEnabled && styles.chatPanelSizing, isChatPanelLayoutEnabled && (managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.mode) === 'overlay' && styles.managedOverlay, isExpandedOnDesktop && !isExpandedOnMobile && !isFlyoutVisible && styles.hiddenMobileOnly, !isExpandedOnDesktop && isExpandedOnMobile && !isFlyoutVisible && styles.hiddenDesktopOnly, !isExpandedOnDesktop && !isExpandedOnMobile && !isFlyoutVisible && styles.hiddenMobileAndDesktop, isMotionUpliftEnabled && motionUpliftStyles.animationRTLSupport, !isMotionUpliftEnabled && isFhsEnabled && styles.animationRTLSupport, shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.animationBaseStyles, shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.animationBaseStyles, isExpandedOnMobile && shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.expandAnimationMobile, isExpandedOnMobile && shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.expandAnimationMobile, !isExpandedOnMobile && shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.collapseAnimationMobile, !isExpandedOnMobile && shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.collapseAnimationMobile, isExpandedOnDesktop && shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.expandAnimationDesktop, isExpandedOnDesktop && shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.expandAnimationDesktop, !isExpandedOnDesktop && shouldShowSidebarToggleAnimation && isMotionUpliftEnabled && motionUpliftStyles.collapseAnimationDesktop, !isExpandedOnDesktop && shouldShowSidebarToggleAnimation && !isMotionUpliftEnabled && styles.collapseAnimationDesktop, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' && !isFhsEnabled && isMotionUpliftEnabled && motionUpliftStyles.flyoutOpen, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' && !isFhsEnabled && !isMotionUpliftEnabled && styles.flyoutOpen, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close' && !isFhsEnabled && isMotionUpliftEnabled && motionUpliftStyles.flyoutAnimateClosed, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close' && !isFhsEnabled && !isMotionUpliftEnabled && styles.flyoutAnimateClosed, ((sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' || (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close') && !isFirefox && isFhsEnabled && styles.flyoutBaseStylesFullHeightSidebar, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' && !isFirefox && isFhsEnabled && isMotionUpliftEnabled && motionUpliftStyles.flyoutOpenFullHeightSidebar, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'open' && !isFirefox && isFhsEnabled && !isMotionUpliftEnabled && styles.flyoutOpenFullHeightSidebar, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close' && !isFirefox && isFhsEnabled && isMotionUpliftEnabled && motionUpliftStyles.flyoutAnimateClosedFullHeightSidebar, (sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.flyout) === 'triggered-animate-close' && !isFirefox && isFhsEnabled && !isMotionUpliftEnabled && styles.flyoutAnimateClosedFullHeightSidebar])
790
922
  }), /*#__PURE__*/_react.default.createElement(_dangerouslyHoistCssVarToDocumentRoot.DangerouslyHoistCssVarToDocumentRoot, {
791
923
  variableName: _constants.sideNavLiveWidthVar,
792
924
  value: "0px",
@@ -806,8 +938,10 @@ function SideNavInternal(_ref) {
806
938
  panelId: _constants.sideNavPanelSplitterId,
807
939
  panelRef: navRef,
808
940
  portalRef: isFhsEnabled ? panelSplitterPortalTargetRef : undefined,
809
- panelWidth: width,
810
- onCompleteResize: setWidth,
941
+ panelWidth: renderedWidth,
942
+ onCompleteResize: onCompleteResize,
943
+ onResizeStartInternal: isChatPanelLayoutEnabled && managedSizing ? onResizeStartInternal : undefined,
944
+ onResizeInternal: isChatPanelLayoutEnabled && managedSizing ? onResizeInternal : undefined,
811
945
  getResizeBounds: getResizeBounds,
812
946
  resizingCssVar: panelSplitterResizingVar
813
947
  // Not resizable when in peek (flyout) mode.
@@ -837,6 +971,8 @@ function SideNav(_ref9) {
837
971
  defaultCollapsed = _ref9.defaultCollapsed,
838
972
  _ref9$defaultWidth = _ref9.defaultWidth,
839
973
  defaultWidth = _ref9$defaultWidth === void 0 ? 320 : _ref9$defaultWidth,
974
+ minWidth = _ref9.minWidth,
975
+ maxWidth = _ref9.maxWidth,
840
976
  testId = _ref9.testId,
841
977
  label = _ref9.label,
842
978
  _ref9$skipLinkLabel = _ref9.skipLinkLabel,
@@ -852,6 +988,8 @@ function SideNav(_ref9) {
852
988
  }, /*#__PURE__*/_react.default.createElement(SideNavInternal, {
853
989
  defaultCollapsed: defaultCollapsed,
854
990
  defaultWidth: defaultWidth,
991
+ minWidth: minWidth,
992
+ maxWidth: maxWidth,
855
993
  testId: testId,
856
994
  label: label,
857
995
  skipLinkLabel: skipLinkLabel,
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useLayoutAreaSizing = useLayoutAreaSizing;
7
+ var _react = require("react");
8
+ var _layoutAreaSizingContext = require("./layout-area-sizing-context");
9
+ var _layoutAreaStateContexts = require("./layout-area-state-contexts");
10
+ function useLayoutAreaSizing(_ref) {
11
+ var area = _ref.area,
12
+ config = _ref.config;
13
+ var context = (0, _react.useContext)(_layoutAreaSizingContext.LayoutAreaSizingContext);
14
+ var requestedWidth = config.requestedWidth,
15
+ defaultWidth = config.defaultWidth,
16
+ compactDefaultWidth = config.compactDefaultWidth,
17
+ minWidth = config.minWidth,
18
+ maxWidth = config.maxWidth,
19
+ isOpen = config.isOpen,
20
+ onRequestClose = config.onRequestClose;
21
+ var registerArea = context === null || context === void 0 ? void 0 : context.registerArea;
22
+ var unregisterArea = context === null || context === void 0 ? void 0 : context.unregisterArea;
23
+ var startAreaResize = context === null || context === void 0 ? void 0 : context.startResize;
24
+ var resizeArea = context === null || context === void 0 ? void 0 : context.resize;
25
+ var completeAreaResize = context === null || context === void 0 ? void 0 : context.completeResize;
26
+ var getAreaResizeBounds = context === null || context === void 0 ? void 0 : context.getResizeBounds;
27
+ var state = (0, _react.useContext)(_layoutAreaStateContexts.layoutAreaStateContexts[area]);
28
+ // Dismissal is not a sizing input. Register a stable delegate while keeping
29
+ // the consumer's latest committed callback outside allocation state.
30
+ var onRequestCloseRef = (0, _react.useRef)(onRequestClose);
31
+ (0, _react.useEffect)(function () {
32
+ onRequestCloseRef.current = onRequestClose;
33
+ }, [onRequestClose]);
34
+ var requestClose = (0, _react.useCallback)(function () {
35
+ var _onRequestCloseRef$cu;
36
+ return (_onRequestCloseRef$cu = onRequestCloseRef.current) === null || _onRequestCloseRef$cu === void 0 ? void 0 : _onRequestCloseRef$cu.call(onRequestCloseRef);
37
+ }, []);
38
+ (0, _react.useEffect)(function () {
39
+ registerArea === null || registerArea === void 0 || registerArea(area, {
40
+ requestedWidth: requestedWidth,
41
+ defaultWidth: defaultWidth,
42
+ compactDefaultWidth: compactDefaultWidth,
43
+ minWidth: minWidth,
44
+ maxWidth: maxWidth,
45
+ isOpen: isOpen,
46
+ onRequestClose: requestClose
47
+ });
48
+ }, [area, compactDefaultWidth, defaultWidth, isOpen, maxWidth, minWidth, registerArea, requestClose, requestedWidth]);
49
+ (0, _react.useEffect)(function () {
50
+ return function () {
51
+ return unregisterArea === null || unregisterArea === void 0 ? void 0 : unregisterArea(area);
52
+ };
53
+ }, [area, unregisterArea]);
54
+ var startResize = (0, _react.useCallback)(function (mode) {
55
+ return startAreaResize === null || startAreaResize === void 0 ? void 0 : startAreaResize(area, mode);
56
+ }, [area, startAreaResize]);
57
+ var resize = (0, _react.useCallback)(function (mode, width) {
58
+ return resizeArea === null || resizeArea === void 0 ? void 0 : resizeArea(area, mode, width);
59
+ }, [area, resizeArea]);
60
+ var completeResize = (0, _react.useCallback)(function (mode, width) {
61
+ return completeAreaResize === null || completeAreaResize === void 0 ? void 0 : completeAreaResize(area, mode, width);
62
+ }, [area, completeAreaResize]);
63
+ var getResizeBounds = (0, _react.useCallback)(function () {
64
+ return getAreaResizeBounds === null || getAreaResizeBounds === void 0 ? void 0 : getAreaResizeBounds(area);
65
+ }, [area, getAreaResizeBounds]);
66
+ return {
67
+ state: state,
68
+ startResize: startResize,
69
+ resize: resize,
70
+ completeResize: completeResize,
71
+ getResizeBounds: getResizeBounds
72
+ };
73
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useLayoutMainSizing = useLayoutMainSizing;
7
+ var _react = require("react");
8
+ var _layoutAreaSizingContext = require("./layout-area-sizing-context");
9
+ function useLayoutMainSizing(minWidth) {
10
+ var context = (0, _react.useContext)(_layoutAreaSizingContext.LayoutAreaSizingContext);
11
+ var setMainMinWidth = context === null || context === void 0 ? void 0 : context.setMainMinWidth;
12
+ (0, _react.useEffect)(function () {
13
+ return setMainMinWidth === null || setMainMinWidth === void 0 ? void 0 : setMainMinWidth(minWidth);
14
+ }, [minWidth, setMainMinWidth]);
15
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useOccupiedLayoutWidth = useOccupiedLayoutWidth;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _react = require("react");
10
+ var _bindEventListener = require("bind-event-listener");
11
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
12
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
13
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
14
+ /**
15
+ * Measures the existing Root slots that are not managed by the chat-layout allocator.
16
+ * Only count separate inline columns: Aside stacks below Main on mobile, and the
17
+ * legacy Panel spans other areas while overlaying. Read the grid rather than duplicating
18
+ * its responsive breakpoints. Border boxes include slot borders and live splitter widths.
19
+ */
20
+ function useOccupiedLayoutWidth(layoutRef) {
21
+ var _useState = (0, _react.useState)(0),
22
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
23
+ width = _useState2[0],
24
+ setWidth = _useState2[1];
25
+ (0, _react.useEffect)(function () {
26
+ var root = layoutRef === null || layoutRef === void 0 ? void 0 : layoutRef.current;
27
+ if (!root) {
28
+ return;
29
+ }
30
+ var occupiedSlots = [];
31
+ var measure = function measure() {
32
+ var _getComputedStyle$gri, _rows$map$find;
33
+ if (occupiedSlots.length === 0) {
34
+ setWidth(0);
35
+ return;
36
+ }
37
+ var rows = (_getComputedStyle$gri = getComputedStyle(root).gridTemplateAreas.match(/"[^"]+"/g)) !== null && _getComputedStyle$gri !== void 0 ? _getComputedStyle$gri : [];
38
+ var mainRow = (_rows$map$find = rows.map(function (row) {
39
+ return row.replace(/"/g, '').split(/\s+/);
40
+ }).find(function (row) {
41
+ return row.includes('main');
42
+ })) !== null && _rows$map$find !== void 0 ? _rows$map$find : [];
43
+ var occupiedWidth = 0;
44
+ var _iterator = _createForOfIteratorHelper(occupiedSlots),
45
+ _step;
46
+ try {
47
+ var _loop = function _loop() {
48
+ var child = _step.value;
49
+ var style = getComputedStyle(child);
50
+ var area = style.gridArea.split('/').map(function (part) {
51
+ return part.trim();
52
+ });
53
+ var slot = area[0];
54
+ if (['ribbon', 'aside', 'panel'].includes(slot) && area.every(function (part) {
55
+ return part === slot;
56
+ }) && mainRow.includes(slot) && style.display !== 'none' && style.position !== 'absolute' && style.position !== 'fixed') {
57
+ occupiedWidth += child.getBoundingClientRect().width;
58
+ }
59
+ };
60
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
61
+ _loop();
62
+ }
63
+ } catch (err) {
64
+ _iterator.e(err);
65
+ } finally {
66
+ _iterator.f();
67
+ }
68
+ setWidth(occupiedWidth);
69
+ };
70
+ var resizeObserver = new ResizeObserver(measure);
71
+ var observeSlots = function observeSlots() {
72
+ resizeObserver.disconnect();
73
+ resizeObserver.observe(root);
74
+ // Managed regions resize on every drag frame but cannot consume extra tracks.
75
+ // Keep them out of both the observer and the measurement loop. Slot identity,
76
+ // unlike gridArea, remains stable when a region switches to overlay mode.
77
+ // TopNav and Banner also span columns rather than consuming independent tracks.
78
+ occupiedSlots = Array.from(root.children).filter(function (child) {
79
+ return child instanceof HTMLElement && child.hasAttribute('data-layout-slot') && !child.matches('nav, header, [role="main"], [data-layout-chat-panel]') && getComputedStyle(child).gridArea.split('/')[0].trim() !== 'banner';
80
+ });
81
+ var _iterator2 = _createForOfIteratorHelper(occupiedSlots),
82
+ _step2;
83
+ try {
84
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
85
+ var child = _step2.value;
86
+ resizeObserver.observe(child);
87
+ }
88
+ } catch (err) {
89
+ _iterator2.e(err);
90
+ } finally {
91
+ _iterator2.f();
92
+ }
93
+ measure();
94
+ };
95
+ var mutationObserver = new MutationObserver(observeSlots);
96
+ mutationObserver.observe(root, {
97
+ childList: true
98
+ });
99
+ observeSlots();
100
+ var unbind = (0, _bindEventListener.bind)(window, {
101
+ type: 'resize',
102
+ listener: measure
103
+ });
104
+ return function () {
105
+ unbind();
106
+ resizeObserver.disconnect();
107
+ mutationObserver.disconnect();
108
+ };
109
+ }, [layoutRef]);
110
+ return width;
111
+ }
@@ -0,0 +1 @@
1
+ export { ChatPanel } from '../../ui/page-layout/chat-panel';
@@ -0,0 +1,3 @@
1
+ export { contentHeightWhenFixed, contentInsetBlockStart, mainMinimumWidthVar, sideNavLiveWidthVar } from '../../ui/page-layout/constants';
2
+ export { useLayoutAreaSizing as UNSAFE_useLayoutAreaSizing } from '../../ui/page-layout/use-layout-area-sizing';
3
+ export { resolveLayoutWidth as UNSAFE_resolveLayoutWidth } from '../../ui/page-layout/resolve-layout-width';
@@ -0,0 +1,128 @@
1
+ import { resolveLayoutWidth } from './resolve-layout-width';
2
+ function clampTargetWidth({
3
+ target,
4
+ min,
5
+ max
6
+ }) {
7
+ return Math.max(min, Math.min(target, max));
8
+ }
9
+ function getTargetWidth(area, isSideNavOverlay) {
10
+ var _area$compactDefaultW, _area$liveResize, _ref, _area$requestedWidth;
11
+ const defaultWidth = isSideNavOverlay ? (_area$compactDefaultW = area.compactDefaultWidth) !== null && _area$compactDefaultW !== void 0 ? _area$compactDefaultW : area.defaultWidth : area.defaultWidth;
12
+ return ((_area$liveResize = area.liveResize) === null || _area$liveResize === void 0 ? void 0 : _area$liveResize.mode) === 'inline' ? area.liveResize.width : (_ref = (_area$requestedWidth = area.requestedWidth) !== null && _area$requestedWidth !== void 0 ? _area$requestedWidth : area.preferredInlineWidth) !== null && _ref !== void 0 ? _ref : defaultWidth;
13
+ }
14
+ function getOverlayTargetWidth(area, isSideNavOverlay) {
15
+ var _area$compactDefaultW2, _area$liveResize2, _ref2, _area$requestedWidth2;
16
+ const defaultWidth = isSideNavOverlay ? (_area$compactDefaultW2 = area.compactDefaultWidth) !== null && _area$compactDefaultW2 !== void 0 ? _area$compactDefaultW2 : area.defaultWidth : area.defaultWidth;
17
+ return ((_area$liveResize2 = area.liveResize) === null || _area$liveResize2 === void 0 ? void 0 : _area$liveResize2.mode) === 'overlay' ? area.liveResize.width : (_ref2 = (_area$requestedWidth2 = area.requestedWidth) !== null && _area$requestedWidth2 !== void 0 ? _area$requestedWidth2 : area.preferredOverlayWidth) !== null && _ref2 !== void 0 ? _ref2 : defaultWidth;
18
+ }
19
+ export function calculateLayoutAreaStates({
20
+ viewportWidth,
21
+ layoutWidth = viewportWidth,
22
+ isChatPanelOverlay,
23
+ isSideNavOverlay,
24
+ occupiedWidth = 0,
25
+ mainMinWidth: mainMinWidthBound,
26
+ areas,
27
+ resizeSession
28
+ }) {
29
+ var _states$sideNav$widt, _states$sideNav, _states$chatPanel$wi, _states$chatPanel;
30
+ const mainMinWidth = resolveLayoutWidth(mainMinWidthBound, viewportWidth);
31
+ const availableWidth = Math.max(0, layoutWidth - occupiedWidth);
32
+ const sideNav = areas['side-nav'];
33
+ const panel = areas.panel;
34
+ const chatPanel = areas['chat-panel'];
35
+ const sideNavMinWidth = sideNav ? resolveLayoutWidth(sideNav.minWidth, viewportWidth) : 0;
36
+ const panelMinWidth = panel ? resolveLayoutWidth(panel.minWidth, viewportWidth) : 0;
37
+ const chatPanelMinWidth = chatPanel ? resolveLayoutWidth(chatPanel.minWidth, viewportWidth) : 0;
38
+ const isSideNavOpenInline = Boolean((sideNav === null || sideNav === void 0 ? void 0 : sideNav.isOpen) && !isSideNavOverlay && availableWidth >= mainMinWidth + sideNavMinWidth);
39
+ const isChatPanelOpenInline = Boolean((chatPanel === null || chatPanel === void 0 ? void 0 : chatPanel.isOpen) && !isChatPanelOverlay && availableWidth >= mainMinWidth + chatPanelMinWidth + (isSideNavOpenInline ? sideNavMinWidth : 0));
40
+ const isPanelInline = Boolean((panel === null || panel === void 0 ? void 0 : panel.isOpen) && availableWidth >= mainMinWidth + panelMinWidth + (isChatPanelOpenInline ? chatPanelMinWidth : 0) + (isSideNavOpenInline ? sideNavMinWidth : 0));
41
+ const inlineAreas = [isSideNavOpenInline && 'side-nav', isPanelInline && 'panel', isChatPanelOpenInline && 'chat-panel'].filter(area => Boolean(area));
42
+ const widths = new Map();
43
+ const minimums = new Map();
44
+ for (const areaName of inlineAreas) {
45
+ const area = areas[areaName];
46
+ if (!area) {
47
+ continue;
48
+ }
49
+ const min = resolveLayoutWidth(area.minWidth, viewportWidth);
50
+ const max = area.maxWidth ? resolveLayoutWidth(area.maxWidth, viewportWidth) : Number.POSITIVE_INFINITY;
51
+ const baselineWidth = resizeSession === null || resizeSession === void 0 ? void 0 : resizeSession.baselineWidths[areaName];
52
+ const requestedTarget = resizeSession && areaName !== resizeSession.area && baselineWidth !== undefined ? baselineWidth : getTargetWidth(area, isSideNavOverlay);
53
+ const target = clampTargetWidth({
54
+ target: requestedTarget,
55
+ min,
56
+ max
57
+ });
58
+ minimums.set(areaName, min);
59
+ widths.set(areaName, target);
60
+ }
61
+ let overflow = Math.max(0, Array.from(widths.values()).reduce((total, width) => total + width, 0) - (availableWidth - mainMinWidth));
62
+ const compressionOrder = ['panel', 'chat-panel', 'side-nav'];
63
+ // User resizing consumes only Main's spare width. Viewport changes clear the
64
+ // snapshot and retain the normal automatic compression order.
65
+ const shrinkOrder = resizeSession ? [resizeSession.area] : compressionOrder;
66
+ for (const areaName of shrinkOrder) {
67
+ var _widths$get, _minimums$get;
68
+ if (overflow <= 0) {
69
+ break;
70
+ }
71
+ const width = (_widths$get = widths.get(areaName)) !== null && _widths$get !== void 0 ? _widths$get : 0;
72
+ const min = (_minimums$get = minimums.get(areaName)) !== null && _minimums$get !== void 0 ? _minimums$get : 0;
73
+ const reduction = Math.min(overflow, Math.max(0, width - min));
74
+ widths.set(areaName, width - reduction);
75
+ overflow -= reduction;
76
+ }
77
+ const totalInlineWidth = Array.from(widths.values()).reduce((total, width) => total + width, 0);
78
+ const states = {};
79
+ for (const areaName of inlineAreas) {
80
+ var _widths$get2, _minimums$get2, _areas$areaName;
81
+ const width = (_widths$get2 = widths.get(areaName)) !== null && _widths$get2 !== void 0 ? _widths$get2 : 0;
82
+ const min = (_minimums$get2 = minimums.get(areaName)) !== null && _minimums$get2 !== void 0 ? _minimums$get2 : 0;
83
+ const maxWidth = (_areas$areaName = areas[areaName]) === null || _areas$areaName === void 0 ? void 0 : _areas$areaName.maxWidth;
84
+ const configuredMax = maxWidth !== undefined ? resolveLayoutWidth(maxWidth, viewportWidth) : Number.POSITIVE_INFINITY;
85
+ states[areaName] = {
86
+ mode: 'inline',
87
+ width,
88
+ minWidth: min,
89
+ resizeBounds: {
90
+ min,
91
+ max: Math.max(min, Math.min(configuredMax, availableWidth - mainMinWidth - totalInlineWidth + width))
92
+ }
93
+ };
94
+ }
95
+ const inlineSideNavWidth = (_states$sideNav$widt = (_states$sideNav = states['side-nav']) === null || _states$sideNav === void 0 ? void 0 : _states$sideNav.width) !== null && _states$sideNav$widt !== void 0 ? _states$sideNav$widt : 0;
96
+ const inlineChatPanelWidth = (_states$chatPanel$wi = (_states$chatPanel = states['chat-panel']) === null || _states$chatPanel === void 0 ? void 0 : _states$chatPanel.width) !== null && _states$chatPanel$wi !== void 0 ? _states$chatPanel$wi : 0;
97
+ const mainAreaWidth = Math.max(0, availableWidth - inlineSideNavWidth - inlineChatPanelWidth);
98
+ for (const areaName of ['side-nav', 'panel', 'chat-panel']) {
99
+ var _states$areaName;
100
+ const area = areas[areaName];
101
+ if (!(area !== null && area !== void 0 && area.isOpen) || ((_states$areaName = states[areaName]) === null || _states$areaName === void 0 ? void 0 : _states$areaName.mode) === 'inline') {
102
+ continue;
103
+ }
104
+ const min = resolveLayoutWidth(area.minWidth, viewportWidth);
105
+ const configuredMax = area.maxWidth ? resolveLayoutWidth(area.maxWidth, viewportWidth) : Number.POSITIVE_INFINITY;
106
+ // Chat covers Root; SideNav and the local panel overlay Main's grid track.
107
+ // Occupied tracks and inline chat are not part of that covered region.
108
+ const layoutMax = (areaName === 'chat-panel' ? layoutWidth : mainAreaWidth) * 0.9;
109
+ const max = Math.max(0, Math.min(configuredMax, layoutMax));
110
+ const effectiveMin = Math.min(min, max);
111
+ const target = getOverlayTargetWidth(area, isSideNavOverlay);
112
+ const width = clampTargetWidth({
113
+ target,
114
+ min: effectiveMin,
115
+ max
116
+ });
117
+ states[areaName] = {
118
+ mode: 'overlay',
119
+ width,
120
+ minWidth: effectiveMin,
121
+ resizeBounds: {
122
+ min: effectiveMin,
123
+ max
124
+ }
125
+ };
126
+ }
127
+ return states;
128
+ }