@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
@@ -0,0 +1,295 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ 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; } } }; }
4
+ 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; } }
5
+ 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; }
6
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
8
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
9
+ import { bind } from 'bind-event-listener';
10
+ import { calculateLayoutAreaStates } from './calculate-layout-area-states';
11
+ import { LayoutAreaSizingContext } from './layout-area-sizing-context';
12
+ import { layoutAreaStateContexts } from './layout-area-state-contexts';
13
+ import { useOccupiedLayoutWidth } from './use-occupied-layout-width';
14
+ var defaultMainMinWidth = 320;
15
+ function useStableAreaState(state) {
16
+ var _ref = state !== null && state !== void 0 ? state : {},
17
+ mode = _ref.mode,
18
+ width = _ref.width,
19
+ minWidth = _ref.minWidth;
20
+ return useMemo(function () {
21
+ return mode !== undefined && width !== undefined && minWidth !== undefined ? {
22
+ mode: mode,
23
+ width: width,
24
+ minWidth: minWidth
25
+ } : undefined;
26
+ }, [mode, width, minWidth]);
27
+ }
28
+ export function LayoutAreaSizingProvider(_ref2) {
29
+ var children = _ref2.children,
30
+ layoutRef = _ref2.layoutRef;
31
+ var occupiedWidth = useOccupiedLayoutWidth(layoutRef);
32
+ var _useState = useState(null),
33
+ _useState2 = _slicedToArray(_useState, 2),
34
+ dimensions = _useState2[0],
35
+ setDimensions = _useState2[1];
36
+ var _useState3 = useState(defaultMainMinWidth),
37
+ _useState4 = _slicedToArray(_useState3, 2),
38
+ mainMinWidth = _useState4[0],
39
+ setMainMinWidth = _useState4[1];
40
+ var _useState5 = useState({}),
41
+ _useState6 = _slicedToArray(_useState5, 2),
42
+ areas = _useState6[0],
43
+ setAreas = _useState6[1];
44
+ var _useState7 = useState(null),
45
+ _useState8 = _slicedToArray(_useState7, 2),
46
+ resizeSession = _useState8[0],
47
+ setResizeSession = _useState8[1];
48
+ var areaStatesRef = React.useRef({});
49
+ var configsRef = React.useRef({});
50
+ var openSequence = React.useRef(0);
51
+ useEffect(function () {
52
+ setResizeSession(null);
53
+ }, [mainMinWidth, occupiedWidth]);
54
+ useEffect(function () {
55
+ var root = layoutRef === null || layoutRef === void 0 ? void 0 : layoutRef.current;
56
+ var previous = null;
57
+ // Match the actual rem-based grid breakpoint, including browser font settings.
58
+ var inlineChatQuery = window.matchMedia('(min-width: 40rem)');
59
+ var inlineSideNavQuery = window.matchMedia('(min-width: 64rem)');
60
+ var updateDimensions = function updateDimensions(contentWidth) {
61
+ var _style$paddingLeft, _style$paddingRight, _previous;
62
+ var style = root && contentWidth === undefined ? getComputedStyle(root) : null;
63
+ var layoutWidth = contentWidth !== null && contentWidth !== void 0 ? contentWidth : root ? Math.max(0, root.clientWidth - (parseFloat((_style$paddingLeft = style === null || style === void 0 ? void 0 : style.paddingLeft) !== null && _style$paddingLeft !== void 0 ? _style$paddingLeft : '') || 0) - (parseFloat((_style$paddingRight = style === null || style === void 0 ? void 0 : style.paddingRight) !== null && _style$paddingRight !== void 0 ? _style$paddingRight : '') || 0)) : window.innerWidth;
64
+ var next = {
65
+ viewportWidth: window.innerWidth,
66
+ layoutWidth: layoutWidth,
67
+ isChatPanelOverlay: !inlineChatQuery.matches,
68
+ isSideNavOverlay: !inlineSideNavQuery.matches
69
+ };
70
+ if (((_previous = previous) === null || _previous === void 0 ? void 0 : _previous.viewportWidth) === next.viewportWidth && previous.layoutWidth === next.layoutWidth && previous.isChatPanelOverlay === next.isChatPanelOverlay && previous.isSideNavOverlay === next.isSideNavOverlay) {
71
+ return;
72
+ }
73
+ previous = next;
74
+ setDimensions(next);
75
+ setResizeSession(null);
76
+ };
77
+ updateDimensions();
78
+ var observer = new ResizeObserver(function (entries) {
79
+ var entry = entries.find(function (entry) {
80
+ return entry.target === root;
81
+ });
82
+ if (entry) {
83
+ updateDimensions(entry.contentRect.width);
84
+ }
85
+ });
86
+ if (root) {
87
+ observer.observe(root);
88
+ }
89
+ var unbindResize = bind(window, {
90
+ type: 'resize',
91
+ listener: function listener() {
92
+ return updateDimensions();
93
+ }
94
+ });
95
+ var unbindQuery = bind(inlineChatQuery, {
96
+ type: 'change',
97
+ listener: function listener() {
98
+ return updateDimensions();
99
+ }
100
+ });
101
+ var unbindSideNavQuery = bind(inlineSideNavQuery, {
102
+ type: 'change',
103
+ listener: function listener() {
104
+ return updateDimensions();
105
+ }
106
+ });
107
+ return function () {
108
+ observer.disconnect();
109
+ unbindResize();
110
+ unbindQuery();
111
+ unbindSideNavQuery();
112
+ };
113
+ }, [layoutRef]);
114
+ var registerArea = useCallback(function (area, config) {
115
+ var previous = configsRef.current[area];
116
+ configsRef.current[area] = config;
117
+ setResizeSession(function (current) {
118
+ // A changed layout/configuration needs a fresh allocation. A controlled
119
+ // acknowledgement for the resized area keeps its siblings fixed.
120
+ return (previous === null || previous === void 0 ? void 0 : previous.isOpen) === config.isOpen && previous.minWidth === config.minWidth && previous.maxWidth === config.maxWidth && previous.defaultWidth === config.defaultWidth && previous.compactDefaultWidth === config.compactDefaultWidth && (previous.requestedWidth === config.requestedWidth || (current === null || current === void 0 ? void 0 : current.area) === area) ? current : null;
121
+ });
122
+ // Allocate once per registration, outside the updater React may replay. Gaps are
123
+ // harmless: only relative ordering of closed-to-open transitions is significant.
124
+ var openedAt = ++openSequence.current;
125
+ setAreas(function (current) {
126
+ var existing = current[area];
127
+ return _objectSpread(_objectSpread({}, current), {}, _defineProperty({}, area, _objectSpread(_objectSpread(_objectSpread({}, existing), config), {}, {
128
+ liveResize: config.isOpen ? existing === null || existing === void 0 ? void 0 : existing.liveResize : undefined,
129
+ openedAt: config.isOpen && !(existing !== null && existing !== void 0 && existing.isOpen) ? openedAt : existing === null || existing === void 0 ? void 0 : existing.openedAt
130
+ })));
131
+ });
132
+ }, []);
133
+ var unregisterArea = useCallback(function (area) {
134
+ delete configsRef.current[area];
135
+ setResizeSession(null);
136
+ setAreas(function (current) {
137
+ if (!current[area]) {
138
+ return current;
139
+ }
140
+ // Closing uses isOpen: false and retains preferences. Unregistering means
141
+ // the owning component unmounted; a replacement must start with its own defaults.
142
+ var next = _objectSpread({}, current);
143
+ delete next[area];
144
+ return next;
145
+ });
146
+ }, []);
147
+ var freezeSiblingWidths = useCallback(function (area) {
148
+ var baselineWidths = {};
149
+ var _iterator = _createForOfIteratorHelper(['side-nav', 'panel', 'chat-panel']),
150
+ _step;
151
+ try {
152
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
153
+ var areaName = _step.value;
154
+ var state = areaStatesRef.current[areaName];
155
+ if ((state === null || state === void 0 ? void 0 : state.mode) === 'inline') {
156
+ baselineWidths[areaName] = state.width;
157
+ }
158
+ }
159
+ // Keep the same siblings fixed after completion, including while a controlled
160
+ // consumer rejects or asynchronously accepts the requested width.
161
+ } catch (err) {
162
+ _iterator.e(err);
163
+ } finally {
164
+ _iterator.f();
165
+ }
166
+ setResizeSession({
167
+ area: area,
168
+ baselineWidths: baselineWidths
169
+ });
170
+ }, []);
171
+ var startResize = useCallback(function (area, mode) {
172
+ if (mode !== 'inline') {
173
+ return;
174
+ }
175
+ freezeSiblingWidths(area);
176
+
177
+ // Start from the effective width, which may already be compressed below the preferred width.
178
+ // Reapplying the preferred width here would move the splitter away from the pointer.
179
+ var renderedState = areaStatesRef.current[area];
180
+ if ((renderedState === null || renderedState === void 0 ? void 0 : renderedState.mode) === 'inline') {
181
+ setAreas(function (current) {
182
+ var existing = current[area];
183
+ return existing ? _objectSpread(_objectSpread({}, current), {}, _defineProperty({}, area, _objectSpread(_objectSpread({}, existing), {}, {
184
+ liveResize: {
185
+ mode: mode,
186
+ width: renderedState.width
187
+ }
188
+ }))) : current;
189
+ });
190
+ }
191
+ }, [freezeSiblingWidths]);
192
+ var resize = useCallback(function (area, mode, width) {
193
+ setAreas(function (current) {
194
+ var _existing$liveResize;
195
+ var existing = current[area];
196
+ if ((existing === null || existing === void 0 || (_existing$liveResize = existing.liveResize) === null || _existing$liveResize === void 0 ? void 0 : _existing$liveResize.mode) === mode && existing.liveResize.width === width) {
197
+ return current;
198
+ }
199
+ return existing ? _objectSpread(_objectSpread({}, current), {}, _defineProperty({}, area, _objectSpread(_objectSpread({}, existing), {}, {
200
+ liveResize: {
201
+ mode: mode,
202
+ width: width
203
+ }
204
+ }))) : current;
205
+ });
206
+ }, []);
207
+ var completeResize = useCallback(function (area, mode, width) {
208
+ if (mode === 'inline') {
209
+ // Keyboard resizing completes without a preceding pointer-drag session.
210
+ freezeSiblingWidths(area);
211
+ }
212
+ setAreas(function (current) {
213
+ var existing = current[area];
214
+ if (!existing) {
215
+ return current;
216
+ }
217
+ if (mode === 'overlay') {
218
+ return _objectSpread(_objectSpread({}, current), {}, _defineProperty({}, area, _objectSpread(_objectSpread({}, existing), {}, {
219
+ liveResize: undefined,
220
+ preferredOverlayWidth: width
221
+ })));
222
+ }
223
+ return _objectSpread(_objectSpread({}, current), {}, _defineProperty({}, area, _objectSpread(_objectSpread({}, existing), {}, {
224
+ liveResize: undefined,
225
+ preferredInlineWidth: width
226
+ })));
227
+ });
228
+ }, [freezeSiblingWidths]);
229
+ var areaStates = useMemo(function () {
230
+ return dimensions === null ? {} : calculateLayoutAreaStates(_objectSpread(_objectSpread({}, dimensions), {}, {
231
+ occupiedWidth: occupiedWidth,
232
+ mainMinWidth: mainMinWidth,
233
+ areas: areas,
234
+ resizeSession: resizeSession
235
+ }));
236
+ }, [areas, mainMinWidth, resizeSession, dimensions, occupiedWidth]);
237
+ useEffect(function () {
238
+ areaStatesRef.current = areaStates;
239
+ }, [areaStates]);
240
+ useEffect(function () {
241
+ var _areaStates$sideNav, _areaStates$chatPane, _sideNav$openedAt, _chatPanel$openedAt;
242
+ if (((_areaStates$sideNav = areaStates['side-nav']) === null || _areaStates$sideNav === void 0 ? void 0 : _areaStates$sideNav.mode) !== 'overlay' || ((_areaStates$chatPane = areaStates['chat-panel']) === null || _areaStates$chatPane === void 0 ? void 0 : _areaStates$chatPane.mode) !== 'overlay') {
243
+ return;
244
+ }
245
+ var sideNav = areas['side-nav'];
246
+ var chatPanel = areas['chat-panel'];
247
+ if (!(sideNav !== null && sideNav !== void 0 && sideNav.isOpen) || !(chatPanel !== null && chatPanel !== void 0 && chatPanel.isOpen)) {
248
+ return;
249
+ }
250
+ if (((_sideNav$openedAt = sideNav.openedAt) !== null && _sideNav$openedAt !== void 0 ? _sideNav$openedAt : 0) > ((_chatPanel$openedAt = chatPanel.openedAt) !== null && _chatPanel$openedAt !== void 0 ? _chatPanel$openedAt : 0)) {
251
+ var _chatPanel$onRequestC;
252
+ (_chatPanel$onRequestC = chatPanel.onRequestClose) === null || _chatPanel$onRequestC === void 0 || _chatPanel$onRequestC.call(chatPanel);
253
+ } else {
254
+ var _sideNav$onRequestClo;
255
+ (_sideNav$onRequestClo = sideNav.onRequestClose) === null || _sideNav$onRequestClo === void 0 || _sideNav$onRequestClo.call(sideNav);
256
+ }
257
+ }, [areas, areaStates]);
258
+
259
+ // Read bounds lazily: changing a sibling's capacity must not publish new render
260
+ // state or recreate drag listeners for a region whose own width did not change.
261
+ var getResizeBounds = useCallback(function (area) {
262
+ var _areaStatesRef$curren;
263
+ var bounds = (_areaStatesRef$curren = areaStatesRef.current[area]) === null || _areaStatesRef$curren === void 0 ? void 0 : _areaStatesRef$curren.resizeBounds;
264
+ return bounds ? {
265
+ min: "".concat(bounds.min, "px"),
266
+ max: "".concat(bounds.max, "px")
267
+ } : undefined;
268
+ }, []);
269
+ var value = useMemo(function () {
270
+ return {
271
+ getResizeBounds: getResizeBounds,
272
+ registerArea: registerArea,
273
+ unregisterArea: unregisterArea,
274
+ startResize: startResize,
275
+ resize: resize,
276
+ completeResize: completeResize,
277
+ setMainMinWidth: setMainMinWidth
278
+ };
279
+ }, [completeResize, getResizeBounds, registerArea, resize, startResize, unregisterArea]);
280
+ var sideNavState = useStableAreaState(areaStates['side-nav']);
281
+ var panelState = useStableAreaState(areaStates.panel);
282
+ var chatPanelState = useStableAreaState(areaStates['chat-panel']);
283
+ var SideNavStateProvider = layoutAreaStateContexts['side-nav'].Provider;
284
+ var PanelStateProvider = layoutAreaStateContexts.panel.Provider;
285
+ var ChatPanelStateProvider = layoutAreaStateContexts['chat-panel'].Provider;
286
+ return /*#__PURE__*/React.createElement(LayoutAreaSizingContext.Provider, {
287
+ value: value
288
+ }, /*#__PURE__*/React.createElement(SideNavStateProvider, {
289
+ value: sideNavState
290
+ }, /*#__PURE__*/React.createElement(PanelStateProvider, {
291
+ value: panelState
292
+ }, /*#__PURE__*/React.createElement(ChatPanelStateProvider, {
293
+ value: chatPanelState
294
+ }, children))));
295
+ }
@@ -0,0 +1,7 @@
1
+ import { createContext } from 'react';
2
+ // Width changes should notify only the affected region, not every sizing consumer.
3
+ export var layoutAreaStateContexts = {
4
+ 'side-nav': /*#__PURE__*/createContext(undefined),
5
+ panel: /*#__PURE__*/createContext(undefined),
6
+ 'chat-panel': /*#__PURE__*/createContext(undefined)
7
+ };
@@ -5,7 +5,10 @@ import { ax, ix } from "@compiled/react/runtime";
5
5
  import { Fragment } from 'react';
6
6
  import { fg } from '@atlaskit/platform-feature-flags/fg';
7
7
  import { useSkipLink } from '../../../context/skip-links/use-skip-link';
8
+ import { mainMinimumWidthVar } from '../constants';
9
+ import { gridRootId } from '../root';
8
10
  import { useLayoutId } from '../use-layout-id';
11
+ import { useLayoutMainSizing } from '../use-layout-main-sizing';
9
12
  var contentInsetBlockStartStatic = "calc(var(--n_bnrM, 0px) + var(--n_tNvM, 0px))";
10
13
  var contentHeightWhenFixedStatic = "calc(100vh - var(--n_bnrM, 0px) - var(--n_tNvM, 0px))";
11
14
  var mainElementStyles = {
@@ -21,12 +24,18 @@ export function Main(_ref) {
21
24
  _ref$skipLinkLabel = _ref.skipLinkLabel,
22
25
  skipLinkLabel = _ref$skipLinkLabel === void 0 ? fg('platform_dst_nav4_skip_link_a11y_1') ? 'Main content' : 'Main Content' : _ref$skipLinkLabel,
23
26
  testId = _ref.testId,
24
- providedId = _ref.id;
27
+ providedId = _ref.id,
28
+ _ref$minWidth = _ref.minWidth,
29
+ minWidth = _ref$minWidth === void 0 ? 320 : _ref$minWidth;
25
30
  var id = useLayoutId({
26
31
  providedId: providedId
27
32
  });
33
+ useLayoutMainSizing(minWidth);
28
34
  useSkipLink(id, skipLinkLabel);
29
- return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("div", {
35
+ return /*#__PURE__*/React.createElement(Fragment, null, fg('platform-dst-chat-panel-layout') &&
36
+ /*#__PURE__*/
37
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-global-styles
38
+ React.createElement("style", null, "#".concat(gridRootId, " { ").concat(mainMinimumWidthVar, ": ").concat(minWidth, "px; }")), /*#__PURE__*/React.createElement("div", {
30
39
  id: id,
31
40
  "data-layout-slot": true,
32
41
  className: ax([mainElementStyles.root, xcss]),
@@ -10,7 +10,7 @@ import { ax, ix } from "@compiled/react/runtime";
10
10
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
11
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
12
  import { forwardRef, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
13
- import { createPortal } from 'react-dom';
13
+ import { createPortal, flushSync } from 'react-dom';
14
14
  import { bind } from 'bind-event-listener';
15
15
  import invariant from 'tiny-invariant';
16
16
  import { useId } from '@atlaskit/ds-lib/use-id';
@@ -137,10 +137,13 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref3) {
137
137
  panelId = _ref3.panelId,
138
138
  panelWidth = _ref3.panelWidth,
139
139
  onCompleteResize = _ref3.onCompleteResize,
140
+ onResizeStartInternal = _ref3.onResizeStartInternal,
141
+ onResizeInternal = _ref3.onResizeInternal,
140
142
  getResizeBounds = _ref3.getResizeBounds,
141
143
  panel = _ref3.panel,
142
144
  portal = _ref3.portal,
143
145
  resizingCssVar = _ref3.resizingCssVar,
146
+ resizingElementRef = _ref3.resizingElementRef,
144
147
  position = _ref3.position,
145
148
  tooltipContent = _ref3.tooltipContent,
146
149
  shortcut = _ref3.shortcut;
@@ -178,9 +181,13 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref3) {
178
181
  // Storing the initial `clientX` on `mousedown` events, to workaround a bug caused by some browser extensions
179
182
  // where the `dragstart` event incorrectly returns `0` for the `clientX` location.
180
183
  var initialClientXRef = useRef(null);
184
+ // Live allocation changes panelWidth on every frame. Only the legacy path should
185
+ // rebind the drag listeners when this value changes.
186
+ var legacyPanelWidth = fg('platform-dst-chat-panel-layout') ? undefined : panelWidth;
181
187
  useEffect(function () {
182
188
  var splitter = splitterRef.current;
183
189
  invariant(splitter, 'Splitter ref must be set');
190
+ var lastManagedResizeWidth;
184
191
  return combine(blockDraggingToIFrames({
185
192
  element: splitter
186
193
  }),
@@ -239,9 +246,18 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref3) {
239
246
  * because some browser extensions can cause the event properties to incorrectly return 0.
240
247
  */
241
248
  invariant(isPanelSplitterDragData(source.data));
242
- onResizeStart === null || onResizeStart === void 0 || onResizeStart({
249
+ var resizeStartData = {
243
250
  initialWidth: source.data.initialWidth
244
- });
251
+ };
252
+ // The layout allocation system needs to know which area is actively being
253
+ // resized before the first drag update. Committing this synchronously keeps
254
+ // the actively dragged area protected from automatic compression.
255
+ if (onResizeStartInternal) {
256
+ flushSync(function () {
257
+ return onResizeStartInternal(resizeStartData);
258
+ });
259
+ }
260
+ onResizeStart === null || onResizeStart === void 0 || onResizeStart(resizeStartData);
245
261
 
246
262
  // Close any open layers when the user starts resizing
247
263
  openLayerObserver === null || openLayerObserver === void 0 || openLayerObserver.closeLayers();
@@ -274,23 +290,54 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref3) {
274
290
  position: position
275
291
  });
276
292
  var resizingWidth = "clamp(".concat(resizeBounds.min, ", ").concat(targetWidth, "px, ").concat(resizeBounds.max, ")");
277
- panel.style.setProperty(resizingCssVar, resizingWidth);
293
+ if (fg('platform-dst-chat-panel-layout') && onResizeInternal) {
294
+ // Let the sizing provider constrain the width against Main's available space.
295
+ var width = Math.max(convertResizeBoundToPixels(resizeBounds.min), Math.min(targetWidth, convertResizeBoundToPixels(resizeBounds.max)));
296
+ if (width !== lastManagedResizeWidth) {
297
+ lastManagedResizeWidth = width;
298
+ onResizeInternal(width);
299
+ }
300
+ } else {
301
+ var _resizingElementRef$c;
302
+ panel.style.setProperty(resizingCssVar, resizingWidth);
303
+ resizingElementRef === null || resizingElementRef === void 0 || (_resizingElementRef$c = resizingElementRef.current) === null || _resizingElementRef$c === void 0 || _resizingElementRef$c.style.setProperty(resizingCssVar, resizingWidth);
304
+ }
278
305
  source.data.resizingWidth = resizingWidth;
279
306
  },
280
307
  onDrop: function onDrop(_ref7) {
308
+ var _resizingElementRef$c2;
281
309
  var source = _ref7.source;
282
310
  invariant(isPanelSplitterDragData(source.data));
283
311
  preventUnhandled.stop();
312
+
313
+ // PDD may deliver its final throttled drag update immediately before drop.
314
+ // Commit that update once before measuring; do not persist a previous frame.
315
+ if (onResizeInternal && lastManagedResizeWidth !== undefined) {
316
+ var width = lastManagedResizeWidth;
317
+ flushSync(function () {
318
+ return onResizeInternal(width);
319
+ });
320
+ lastManagedResizeWidth = undefined;
321
+ }
284
322
  var finalWidth = getPixelWidth(panel);
285
- onCompleteResize(finalWidth);
323
+ // Persist the final preferred width before removing the imperative drag
324
+ // variable, so the rendered width is continuous across pointer release.
325
+ if (fg('platform-dst-chat-panel-layout')) {
326
+ flushSync(function () {
327
+ return onCompleteResize(finalWidth);
328
+ });
329
+ } else {
330
+ onCompleteResize(finalWidth);
331
+ }
286
332
  onResizeEnd === null || onResizeEnd === void 0 || onResizeEnd({
287
333
  initialWidth: source.data.initialWidth,
288
334
  finalWidth: finalWidth
289
335
  });
290
336
  panel.style.removeProperty(resizingCssVar);
337
+ resizingElementRef === null || resizingElementRef === void 0 || (_resizingElementRef$c2 = resizingElementRef.current) === null || _resizingElementRef$c2 === void 0 || _resizingElementRef$c2.style.removeProperty(resizingCssVar);
291
338
  }
292
339
  }));
293
- }, [onCompleteResize, onResizeStart, onResizeEnd, panel, resizingCssVar, panelWidth, position, openLayerObserver, panelId, getResizeBounds]);
340
+ }, [onCompleteResize, onResizeStartInternal, onResizeInternal, onResizeStart, onResizeEnd, panel, resizingCssVar, resizingElementRef, legacyPanelWidth, position, openLayerObserver, panelId, getResizeBounds]);
294
341
  var onResizeStartStableRef = useStableRef(onResizeStart);
295
342
  var onResizeEndStableRef = useStableRef(onResizeEnd);
296
343
  var _useState5 = useState(function () {
@@ -316,7 +363,20 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref3) {
316
363
  _useState6 = _slicedToArray(_useState5, 1),
317
364
  keyboardResizeManager = _useState6[0];
318
365
  var handleSliderInputChange = useCallback(function (event) {
319
- var value = parseInt(event.target.value);
366
+ var isManagedResize = fg('platform-dst-chat-panel-layout') && onResizeInternal;
367
+ var value = isManagedResize ? parseFloat(event.target.value) : parseInt(event.target.value);
368
+ if (isManagedResize) {
369
+ // The available region may have changed since focus, including without a
370
+ // window resize. Use the allocator's current bounds for the public payload.
371
+ var bounds = getResizeBounds();
372
+ var min = convertResizeBoundToPixels(bounds.min);
373
+ var max = convertResizeBoundToPixels(bounds.max);
374
+ value = Math.max(min, Math.min(value, max));
375
+ setRangeInputBounds({
376
+ min: min,
377
+ max: max
378
+ });
379
+ }
320
380
  setRangeInputValue(value);
321
381
 
322
382
  /**
@@ -328,7 +388,7 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref3) {
328
388
  initialWidth: panelWidth,
329
389
  finalWidth: value
330
390
  });
331
- }, [onCompleteResize, panelWidth, keyboardResizeManager]);
391
+ }, [getResizeBounds, onCompleteResize, onResizeInternal, panelWidth, keyboardResizeManager]);
332
392
  var resizeEventListenerCleanupFn = useRef(null);
333
393
  var handleSliderFocus = useCallback(function () {
334
394
  var _resizeEventListenerC;
@@ -453,8 +513,11 @@ export var PanelSplitter = function PanelSplitter(_ref8) {
453
513
  panelId = context.panelId,
454
514
  panelWidth = context.panelWidth,
455
515
  onCompleteResize = context.onCompleteResize,
516
+ onResizeStartInternal = context.onResizeStartInternal,
517
+ onResizeInternal = context.onResizeInternal,
456
518
  getResizeBounds = context.getResizeBounds,
457
519
  resizingCssVar = context.resizingCssVar,
520
+ resizingElementRef = context.resizingElementRef,
458
521
  position = context.position,
459
522
  shortcut = context.shortcut;
460
523
 
@@ -549,8 +612,11 @@ export var PanelSplitter = function PanelSplitter(_ref8) {
549
612
  portal: portal,
550
613
  panelWidth: panelWidth,
551
614
  onCompleteResize: onCompleteResize,
615
+ onResizeStartInternal: onResizeStartInternal,
616
+ onResizeInternal: onResizeInternal,
552
617
  getResizeBounds: getResizeBounds,
553
618
  resizingCssVar: resizingCssVar,
619
+ resizingElementRef: resizingElementRef,
554
620
  position: position,
555
621
  tooltipContent: tooltipContent,
556
622
  shortcut: shortcut
@@ -9,9 +9,12 @@ export var PanelSplitterProvider = function PanelSplitterProvider(_ref) {
9
9
  var panelId = _ref.panelId,
10
10
  panelWidth = _ref.panelWidth,
11
11
  onCompleteResize = _ref.onCompleteResize,
12
+ onResizeStartInternal = _ref.onResizeStartInternal,
13
+ onResizeInternal = _ref.onResizeInternal,
12
14
  getResizeBounds = _ref.getResizeBounds,
13
15
  resizingCssVar = _ref.resizingCssVar,
14
16
  panelRef = _ref.panelRef,
17
+ resizingElementRef = _ref.resizingElementRef,
15
18
  providedPortalRef = _ref.portalRef,
16
19
  _ref$position = _ref.position,
17
20
  position = _ref$position === void 0 ? 'end' : _ref$position,
@@ -25,15 +28,18 @@ export var PanelSplitterProvider = function PanelSplitterProvider(_ref) {
25
28
  panelId: panelId,
26
29
  panelWidth: panelWidth,
27
30
  onCompleteResize: onCompleteResize,
31
+ onResizeStartInternal: onResizeStartInternal,
32
+ onResizeInternal: onResizeInternal,
28
33
  getResizeBounds: getResizeBounds,
29
34
  resizingCssVar: resizingCssVar,
30
35
  position: position,
31
36
  panelRef: panelRef,
37
+ resizingElementRef: resizingElementRef,
32
38
  isEnabled: isEnabled,
33
39
  portalRef: typeof providedPortalRef !== 'undefined' ? providedPortalRef : portalRef,
34
40
  shortcut: shortcut
35
41
  };
36
- }, [panelId, panelWidth, onCompleteResize, getResizeBounds, resizingCssVar, position, panelRef, isEnabled, providedPortalRef, shortcut]);
42
+ }, [panelId, panelWidth, onCompleteResize, onResizeStartInternal, onResizeInternal, getResizeBounds, resizingCssVar, position, panelRef, resizingElementRef, isEnabled, providedPortalRef, shortcut]);
37
43
  return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(PanelSplitterContext.Provider, {
38
44
  value: context
39
45
  }, children), typeof providedPortalRef !== 'undefined' ? null : /*#__PURE__*/React.createElement("div", {
@@ -0,0 +1,7 @@
1
+ export function resolveLayoutWidth(bound, viewportWidth) {
2
+ if (typeof bound === 'number') {
3
+ return bound;
4
+ }
5
+ var value = Number.parseFloat(bound);
6
+ return bound.endsWith('vw') ? viewportWidth * value / 100 : value;
7
+ }
@@ -8,6 +8,7 @@ import { DangerouslyHoistCssVarToDocumentRoot } from './dangerously-hoist-css-va
8
8
  import { DangerouslyHoistSlotSizes } from './hoist-slot-sizes-context';
9
9
  import { useLayoutId } from './use-layout-id';
10
10
  var localSlotLayersStatic = {
11
+ chatPanelOverlay: 5,
11
12
  ribbon: 4,
12
13
  // The side nav panel splitter is layered above the top nav when FHS is enabled.
13
14
  // It has the same z-index value, but is rendered after the top nav in the DOM so is stacked above.
@@ -1,5 +1,6 @@
1
1
  ._18m9zryt{overflow-y:clip}
2
2
  ._1ciragmp >:not([data-layout-slot]){display:none!important}
3
+ ._1cwmtye8{--n_mainMinW:20rem}
3
4
  ._1e0c11p5{display:grid}
4
5
  ._1lmcq9em{grid-template-areas:"banner" "top-bar" "main" "aside"}
5
6
  ._1reozryt{overflow-x:clip}
@@ -7,5 +8,6 @@
7
8
  ._1tvnagmp >:not([data-layout-slot]):not(dialog):not([popover]){display:none!important}
8
9
  ._2z0516ab{grid-template-rows:auto auto 1fr auto}
9
10
  ._yv0ei47z{grid-template-columns:minmax(0,1fr)}
10
- @media (min-width:64rem){._12fk1aio{grid-template-areas:"banner banner banner banner" "ribbon top-bar top-bar top-bar" "ribbon side-nav main aside"}._12qzrxre{grid-template-rows:auto auto 3fr}._1rqteala{grid-template-columns:auto auto minmax(0,1fr) auto}}
11
- @media (min-width:90rem){._xkmgks3h{grid-template-areas:"banner banner banner banner banner" "ribbon top-bar top-bar top-bar top-bar" "ribbon side-nav main aside panel"}._jbc7rxre{grid-template-rows:auto auto 3fr}._tyve1nco{grid-template-columns:auto auto minmax(0,1fr) auto auto}}
11
+ @media (min-width:40rem){._12ag50j2{grid-template-areas:"banner banner" "top-bar chat-panel" "main chat-panel" "aside chat-panel"}._71dlqwpl{grid-template-columns:minmax(var(--n_mainMinW),1fr) minmax(0,max-content)}}
12
+ @media (min-width:64rem){._12fk1aio{grid-template-areas:"banner banner banner banner" "ribbon top-bar top-bar top-bar" "ribbon side-nav main aside"}._12qzrxre{grid-template-rows:auto auto 3fr}._1rqteala{grid-template-columns:auto auto minmax(0,1fr) auto}._12fkqmyk{grid-template-areas:"banner banner banner banner banner" "ribbon top-bar top-bar top-bar chat-panel" "ribbon side-nav main aside chat-panel"}._1rqt8mqp{grid-template-columns:auto auto minmax(var(--n_mainMinW),1fr) auto minmax(0,max-content)}}
13
+ @media (min-width:90rem){._xkmggc7l{grid-template-areas:"banner banner banner banner banner banner" "ribbon top-bar top-bar top-bar top-bar chat-panel" "ribbon side-nav main aside panel chat-panel"}._tyve1i18{grid-template-columns:auto auto minmax(var(--n_mainMinW),1fr) auto auto minmax(0,max-content)}._xkmgks3h{grid-template-areas:"banner banner banner banner banner" "ribbon top-bar top-bar top-bar top-bar" "ribbon side-nav main aside panel"}._jbc7rxre{grid-template-rows:auto auto 3fr}._tyve1nco{grid-template-columns:auto auto minmax(0,1fr) auto auto}}
@@ -7,6 +7,7 @@ import { fg } from '@atlaskit/platform-feature-flags/fg';
7
7
  import { SkipLinksProvider } from '../../context/skip-links/skip-links-provider';
8
8
  import { TopNavStartProvider } from '../../context/top-nav-start/top-nav-start-context-provider';
9
9
  import { DangerouslyHoistSlotSizes } from './hoist-slot-sizes-context';
10
+ import { LayoutAreaSizingProvider } from './layout-area-sizing-provider';
10
11
  import { IsSideNavShortcutEnabledProvider } from './side-nav/is-side-nav-shortcut-enabled-provider';
11
12
  import { SideNavElementProvider } from './side-nav/side-nav-element-provider';
12
13
  import { SideNavToggleButtonProvider } from './side-nav/toggle-button-provider';
@@ -15,7 +16,8 @@ import { SideNavVisibilityProvider } from './side-nav/visibility-provider';
15
16
  // ID of the root element that the banner and top bar slots hoist their sizes to. Only internally exported.
16
17
  export var gridRootId = 'unsafe-design-system-page-layout-root';
17
18
  var styles = {
18
- root: "_1e0c11p5 _1tke1kxc _1lmcq9em _yv0ei47z _2z0516ab _12fk1aio _12qzrxre _1rqteala _xkmgks3h _jbc7rxre _tyve1nco",
19
+ legacyRoot: "_1e0c11p5 _1tke1kxc _1lmcq9em _yv0ei47z _2z0516ab _12fk1aio _12qzrxre _1rqteala _xkmgks3h _jbc7rxre _tyve1nco",
20
+ root: "_1cwmtye8 _1e0c11p5 _1tke1kxc _1lmcq9em _yv0ei47z _2z0516ab _12ag50j2 _71dlqwpl _12fkqmyk _12qzrxre _1rqt8mqp _xkmggc7l _tyve1i18",
19
21
  safetyRail: "_1ciragmp",
20
22
  safetyRailWithTopLayer: "_1tvnagmp",
21
23
  panelUplift: "_1reozryt _18m9zryt"
@@ -39,6 +41,8 @@ export function Root(_ref) {
39
41
  _ref$isSideNavShortcu = _ref.isSideNavShortcutEnabled,
40
42
  isSideNavShortcutEnabled = _ref$isSideNavShortcu === void 0 ? false : _ref$isSideNavShortcu;
41
43
  var ref = useRef(null);
44
+ var isChatPanelLayoutEnabled = fg('platform-dst-chat-panel-layout');
45
+ var LayoutProvider = isChatPanelLayoutEnabled ? LayoutAreaSizingProvider : React.Fragment;
42
46
  useEffect(function () {
43
47
  if (process.env.NODE_ENV !== 'production') {
44
48
  var IGNORED_ELEMENTS = ['SCRIPT', 'STYLE'];
@@ -59,7 +63,9 @@ export function Root(_ref) {
59
63
  defaultCollapsed: defaultSideNavCollapsed
60
64
  }, /*#__PURE__*/React.createElement(SideNavToggleButtonProvider, null, /*#__PURE__*/React.createElement(SideNavElementProvider, null, /*#__PURE__*/React.createElement(IsSideNavShortcutEnabledProvider, {
61
65
  isSideNavShortcutEnabled: isSideNavShortcutEnabled
62
- }, /*#__PURE__*/React.createElement(TopNavStartProvider, null, /*#__PURE__*/React.createElement(OpenLayerObserver, null, /*#__PURE__*/React.createElement(DangerouslyHoistSlotSizes.Provider, {
66
+ }, /*#__PURE__*/React.createElement(TopNavStartProvider, null, /*#__PURE__*/React.createElement(LayoutProvider, isChatPanelLayoutEnabled ? {
67
+ layoutRef: ref
68
+ } : {}, /*#__PURE__*/React.createElement(OpenLayerObserver, null, /*#__PURE__*/React.createElement(DangerouslyHoistSlotSizes.Provider, {
63
69
  value: UNSAFE_dangerouslyHoistSlotSizes
64
70
  }, /*#__PURE__*/React.createElement(SkipLinksProvider, {
65
71
  label: skipLinksLabel,
@@ -67,8 +73,8 @@ export function Root(_ref) {
67
73
  testId: testId
68
74
  }, /*#__PURE__*/React.createElement("div", {
69
75
  ref: ref,
70
- className: ax([styles.root, fg('platform-dst-motion-uplift-panel') && styles.panelUplift, fg('platform-dst-top-layer') ? styles.safetyRailWithTopLayer : styles.safetyRail, xcss]),
76
+ className: ax([isChatPanelLayoutEnabled ? styles.root : styles.legacyRoot, fg('platform-dst-motion-uplift-panel') && styles.panelUplift, fg('platform-dst-top-layer') ? styles.safetyRailWithTopLayer : styles.safetyRail, xcss]),
71
77
  id: gridRootId,
72
78
  "data-testid": testId
73
- }, children)))))))));
79
+ }, children))))))))));
74
80
  }
@@ -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}}