@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.
- package/CHANGELOG.md +12 -0
- package/dist/cjs/entry-points/layout/chat-panel.js +12 -0
- package/dist/cjs/entry-points/layout/layout-sizing.js +44 -0
- package/dist/cjs/ui/page-layout/calculate-layout-area-states.js +179 -0
- package/dist/cjs/ui/page-layout/chat-panel.compiled.css +27 -0
- package/dist/cjs/ui/page-layout/chat-panel.js +216 -0
- package/dist/cjs/ui/page-layout/constants.js +6 -1
- package/dist/cjs/ui/page-layout/layout-area-sizing-context.js +13 -0
- package/dist/cjs/ui/page-layout/layout-area-sizing-provider.js +304 -0
- package/dist/cjs/ui/page-layout/layout-area-state-contexts.js +13 -0
- package/dist/cjs/ui/page-layout/main/main.js +11 -2
- package/dist/cjs/ui/page-layout/panel-splitter/panel-splitter.js +73 -7
- package/dist/cjs/ui/page-layout/panel-splitter/provider.js +7 -1
- package/dist/cjs/ui/page-layout/resolve-layout-width.js +13 -0
- package/dist/cjs/ui/page-layout/ribbon.js +1 -0
- package/dist/cjs/ui/page-layout/root.compiled.css +4 -2
- package/dist/cjs/ui/page-layout/root.js +10 -4
- package/dist/cjs/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
- package/dist/cjs/ui/page-layout/side-nav/side-nav.js +152 -14
- package/dist/cjs/ui/page-layout/use-layout-area-sizing.js +73 -0
- package/dist/cjs/ui/page-layout/use-layout-main-sizing.js +15 -0
- package/dist/cjs/ui/page-layout/use-occupied-layout-width.js +111 -0
- package/dist/es2019/entry-points/layout/chat-panel.js +1 -0
- package/dist/es2019/entry-points/layout/layout-sizing.js +3 -0
- package/dist/es2019/ui/page-layout/calculate-layout-area-states.js +128 -0
- package/dist/es2019/ui/page-layout/chat-panel.compiled.css +27 -0
- package/dist/es2019/ui/page-layout/chat-panel.js +199 -0
- package/dist/es2019/ui/page-layout/constants.js +5 -0
- package/dist/es2019/ui/page-layout/layout-area-sizing-context.js +8 -0
- package/dist/es2019/ui/page-layout/layout-area-sizing-provider.js +279 -0
- package/dist/es2019/ui/page-layout/layout-area-state-contexts.js +7 -0
- package/dist/es2019/ui/page-layout/main/main.js +10 -2
- package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.js +68 -8
- package/dist/es2019/ui/page-layout/panel-splitter/provider.js +7 -1
- package/dist/es2019/ui/page-layout/resolve-layout-width.js +7 -0
- package/dist/es2019/ui/page-layout/ribbon.js +1 -0
- package/dist/es2019/ui/page-layout/root.compiled.css +4 -2
- package/dist/es2019/ui/page-layout/root.js +10 -4
- package/dist/es2019/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
- package/dist/es2019/ui/page-layout/side-nav/side-nav.js +142 -14
- package/dist/es2019/ui/page-layout/use-layout-area-sizing.js +58 -0
- package/dist/es2019/ui/page-layout/use-layout-main-sizing.js +7 -0
- package/dist/es2019/ui/page-layout/use-occupied-layout-width.js +67 -0
- package/dist/esm/entry-points/layout/chat-panel.js +1 -0
- package/dist/esm/entry-points/layout/layout-sizing.js +3 -0
- package/dist/esm/ui/page-layout/calculate-layout-area-states.js +173 -0
- package/dist/esm/ui/page-layout/chat-panel.compiled.css +27 -0
- package/dist/esm/ui/page-layout/chat-panel.js +207 -0
- package/dist/esm/ui/page-layout/constants.js +5 -0
- package/dist/esm/ui/page-layout/layout-area-sizing-context.js +8 -0
- package/dist/esm/ui/page-layout/layout-area-sizing-provider.js +295 -0
- package/dist/esm/ui/page-layout/layout-area-state-contexts.js +7 -0
- package/dist/esm/ui/page-layout/main/main.js +11 -2
- package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.js +74 -8
- package/dist/esm/ui/page-layout/panel-splitter/provider.js +7 -1
- package/dist/esm/ui/page-layout/resolve-layout-width.js +7 -0
- package/dist/esm/ui/page-layout/ribbon.js +1 -0
- package/dist/esm/ui/page-layout/root.compiled.css +4 -2
- package/dist/esm/ui/page-layout/root.js +10 -4
- package/dist/esm/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
- package/dist/esm/ui/page-layout/side-nav/side-nav.js +153 -15
- package/dist/esm/ui/page-layout/use-layout-area-sizing.js +67 -0
- package/dist/esm/ui/page-layout/use-layout-main-sizing.js +9 -0
- package/dist/esm/ui/page-layout/use-occupied-layout-width.js +105 -0
- package/dist/types/entry-points/layout/chat-panel.d.ts +1 -0
- package/dist/types/entry-points/layout/layout-sizing.d.ts +4 -0
- package/dist/types/ui/page-layout/calculate-layout-area-states.d.ts +20 -0
- package/dist/types/ui/page-layout/chat-panel.d.ts +48 -0
- package/dist/types/ui/page-layout/constants.d.ts +4 -0
- package/dist/types/ui/page-layout/layout-area-sizing-context.d.ts +55 -0
- package/dist/types/ui/page-layout/layout-area-sizing-provider.d.ts +5 -0
- package/dist/types/ui/page-layout/layout-area-state-contexts.d.ts +3 -0
- package/dist/types/ui/page-layout/main/main.d.ts +5 -1
- package/dist/types/ui/page-layout/panel-splitter/panel-splitter-context.d.ts +15 -1
- package/dist/types/ui/page-layout/panel-splitter/provider.d.ts +1 -1
- package/dist/types/ui/page-layout/resolve-layout-width.d.ts +2 -0
- package/dist/types/ui/page-layout/side-nav/side-nav.d.ts +11 -2
- package/dist/types/ui/page-layout/use-layout-area-sizing.d.ts +12 -0
- package/dist/types/ui/page-layout/use-layout-main-sizing.d.ts +2 -0
- package/dist/types/ui/page-layout/use-occupied-layout-width.d.ts +8 -0
- package/layout/chat-panel/package.json +10 -0
- package/layout/layout-sizing/package.json +10 -0
- 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
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
225
|
-
|
|
226
|
-
var
|
|
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:
|
|
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:
|
|
810
|
-
onCompleteResize:
|
|
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
|
+
}
|