@atlaskit/navigation-system 11.3.0 → 11.3.2

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 (50) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/ui/page-layout/calculate-layout-area-states.js +76 -37
  3. package/dist/cjs/ui/page-layout/chat-panel.js +6 -3
  4. package/dist/cjs/ui/page-layout/layout-area-sizing-context.js +2 -2
  5. package/dist/cjs/ui/page-layout/layout-area-sizing-provider.js +243 -247
  6. package/dist/cjs/ui/page-layout/layout-area-sizing-runtime.js +468 -0
  7. package/dist/cjs/ui/page-layout/main/main.js +1 -1
  8. package/dist/cjs/ui/page-layout/panel-splitter/panel-splitter.js +239 -99
  9. package/dist/cjs/ui/page-layout/panel-splitter/provider.js +3 -1
  10. package/dist/cjs/ui/page-layout/root.compiled.css +14 -3
  11. package/dist/cjs/ui/page-layout/root.js +43 -17
  12. package/dist/cjs/ui/page-layout/side-nav/side-nav.js +14 -3
  13. package/dist/cjs/ui/page-layout/use-css-layout-area-states.js +117 -0
  14. package/dist/cjs/ui/page-layout/use-layout-area-sizing.js +3 -1
  15. package/dist/es2019/ui/page-layout/calculate-layout-area-states.js +51 -17
  16. package/dist/es2019/ui/page-layout/chat-panel.js +29 -5
  17. package/dist/es2019/ui/page-layout/layout-area-sizing-context.js +2 -2
  18. package/dist/es2019/ui/page-layout/layout-area-sizing-provider.js +171 -241
  19. package/dist/es2019/ui/page-layout/layout-area-sizing-runtime.js +419 -0
  20. package/dist/es2019/ui/page-layout/main/main.js +2 -2
  21. package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.js +60 -10
  22. package/dist/es2019/ui/page-layout/panel-splitter/provider.js +3 -1
  23. package/dist/es2019/ui/page-layout/root.compiled.css +14 -3
  24. package/dist/es2019/ui/page-layout/root.js +30 -3
  25. package/dist/es2019/ui/page-layout/side-nav/side-nav.js +23 -3
  26. package/dist/es2019/ui/page-layout/use-css-layout-area-states.js +73 -0
  27. package/dist/es2019/ui/page-layout/use-layout-area-sizing.js +3 -1
  28. package/dist/esm/ui/page-layout/calculate-layout-area-states.js +75 -37
  29. package/dist/esm/ui/page-layout/chat-panel.js +7 -4
  30. package/dist/esm/ui/page-layout/layout-area-sizing-context.js +2 -2
  31. package/dist/esm/ui/page-layout/layout-area-sizing-provider.js +243 -248
  32. package/dist/esm/ui/page-layout/layout-area-sizing-runtime.js +459 -0
  33. package/dist/esm/ui/page-layout/main/main.js +2 -2
  34. package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.js +238 -98
  35. package/dist/esm/ui/page-layout/panel-splitter/provider.js +3 -1
  36. package/dist/esm/ui/page-layout/root.compiled.css +14 -3
  37. package/dist/esm/ui/page-layout/root.js +42 -16
  38. package/dist/esm/ui/page-layout/side-nav/side-nav.js +14 -3
  39. package/dist/esm/ui/page-layout/use-css-layout-area-states.js +110 -0
  40. package/dist/esm/ui/page-layout/use-layout-area-sizing.js +3 -1
  41. package/dist/types/ui/page-layout/calculate-layout-area-states.d.ts +7 -2
  42. package/dist/types/ui/page-layout/layout-area-sizing-context.d.ts +10 -3
  43. package/dist/types/ui/page-layout/layout-area-sizing-provider.d.ts +6 -0
  44. package/dist/types/ui/page-layout/layout-area-sizing-runtime.d.ts +8 -0
  45. package/dist/types/ui/page-layout/panel-splitter/panel-splitter-context.d.ts +4 -0
  46. package/dist/types/ui/page-layout/panel-splitter/provider.d.ts +1 -1
  47. package/dist/types/ui/page-layout/root.d.ts +2 -0
  48. package/dist/types/ui/page-layout/use-css-layout-area-states.d.ts +8 -0
  49. package/dist/types/ui/page-layout/use-layout-area-sizing.d.ts +2 -0
  50. package/package.json +12 -6
@@ -1,295 +1,290 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
2
  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
3
  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
4
  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';
5
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ import { bind, bindAll } from 'bind-event-listener';
11
7
  import { LayoutAreaSizingContext } from './layout-area-sizing-context';
12
8
  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);
9
+ import { useCssLayoutAreaStates } from './use-css-layout-area-states';
10
+
11
+ /**
12
+ * Stable, synchronous boundary for SSR content. The drag/cascade implementation
13
+ * is a sibling, not a replacement wrapper, so loading it cannot remount the app.
14
+ * CSS handles initial and responsive geometry; only splitter interaction requests
15
+ * the asynchronous chunk. The eager observer reads modes without changing widths.
16
+ */
17
+ export function LayoutAreaSizingProvider(_ref) {
18
+ var _states$sideNav$mode, _states$sideNav, _states$chatPanel$mo, _states$chatPanel;
19
+ var children = _ref.children,
20
+ layoutRef = _ref.layoutRef;
32
21
  var _useState = useState(null),
33
22
  _useState2 = _slicedToArray(_useState, 2),
34
- dimensions = _useState2[0],
35
- setDimensions = _useState2[1];
36
- var _useState3 = useState(defaultMainMinWidth),
23
+ Runtime = _useState2[0],
24
+ setRuntime = _useState2[1];
25
+ var _useState3 = useState({}),
37
26
  _useState4 = _slicedToArray(_useState3, 2),
38
- mainMinWidth = _useState4[0],
39
- setMainMinWidth = _useState4[1];
40
- var _useState5 = useState({}),
27
+ states = _useState4[0],
28
+ setStates = _useState4[1];
29
+ var actions = useRef(null);
30
+ var configs = useRef({});
31
+ var _useState5 = useState(null),
41
32
  _useState6 = _slicedToArray(_useState5, 2),
42
- areas = _useState6[0],
43
- setAreas = _useState6[1];
44
- var _useState7 = useState(null),
33
+ lastOpenedOverlay = _useState6[0],
34
+ setLastOpenedOverlay = _useState6[1];
35
+ var _useState7 = useState(0),
45
36
  _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]);
37
+ configRevision = _useState8[0],
38
+ setConfigRevision = _useState8[1];
39
+ var cssModes = useCssLayoutAreaStates(layoutRef, configRevision, Runtime === null);
40
+ var sideNavMode = (_states$sideNav$mode = (_states$sideNav = states['side-nav']) === null || _states$sideNav === void 0 ? void 0 : _states$sideNav.mode) !== null && _states$sideNav$mode !== void 0 ? _states$sideNav$mode : cssModes['side-nav'];
41
+ var chatPanelMode = (_states$chatPanel$mo = (_states$chatPanel = states['chat-panel']) === null || _states$chatPanel === void 0 ? void 0 : _states$chatPanel.mode) !== null && _states$chatPanel$mo !== void 0 ? _states$chatPanel$mo : cssModes['chat-panel'];
42
+
43
+ // Overlay dismissal is available before the sizing chunk loads. Keep the open
44
+ // order here too: replaying registrations into the runtime loses that order.
54
45
  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
46
  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) {
47
+ var dismissOlderOverlay = function dismissOlderOverlay() {
48
+ var _olderOverlay$onReque;
49
+ var sideNav = configs.current['side-nav'];
50
+ var chatPanel = configs.current['chat-panel'];
51
+ if (!(sideNav !== null && sideNav !== void 0 && sideNav.isOpen) || !(chatPanel !== null && chatPanel !== void 0 && chatPanel.isOpen) || !lastOpenedOverlay) {
71
52
  return;
72
53
  }
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);
54
+ // Before allocation, CSS puts both areas in overlay below 40rem. Once
55
+ // sizing is active, also honour overlays caused by custom widths/slots.
56
+ if (inlineChatQuery.matches && (sideNavMode !== 'overlay' || chatPanelMode !== 'overlay')) {
57
+ return;
84
58
  }
59
+ var olderOverlay = lastOpenedOverlay === 'side-nav' ? chatPanel : sideNav;
60
+ (_olderOverlay$onReque = olderOverlay.onRequestClose) === null || _olderOverlay$onReque === void 0 || _olderOverlay$onReque.call(olderOverlay);
61
+ };
62
+ dismissOlderOverlay();
63
+ return bind(inlineChatQuery, {
64
+ type: 'change',
65
+ listener: dismissOlderOverlay
85
66
  });
86
- if (root) {
87
- observer.observe(root);
67
+ }, [chatPanelMode, lastOpenedOverlay, sideNavMode]);
68
+ var mainMinWidth = useRef(320);
69
+ var loadRef = useRef(function () {});
70
+ var ready = useRef(false);
71
+ var waiting = useRef([]);
72
+ var pending = useRef([]);
73
+ var prepareResize = useCallback(function () {
74
+ if (ready.current) {
75
+ return Promise.resolve(true);
88
76
  }
89
- var unbindResize = bind(window, {
90
- type: 'resize',
91
- listener: function listener() {
92
- return updateDimensions();
93
- }
77
+ return new Promise(function (resolve) {
78
+ waiting.current.push(resolve);
79
+ loadRef.current();
94
80
  });
95
- var unbindQuery = bind(inlineChatQuery, {
96
- type: 'change',
97
- listener: function listener() {
98
- return updateDimensions();
81
+ }, []);
82
+ useEffect(function () {
83
+ var root = layoutRef === null || layoutRef === void 0 ? void 0 : layoutRef.current;
84
+ if (!root) {
85
+ return;
86
+ }
87
+ var cancelled = false;
88
+ var loading = false;
89
+ var waitingForRuntime = waiting.current;
90
+ var load = function load() {
91
+ if (loading) {
92
+ return;
99
93
  }
100
- });
101
- var unbindSideNavQuery = bind(inlineSideNavQuery, {
102
- type: 'change',
103
- listener: function listener() {
104
- return updateDimensions();
94
+ loading = true;
95
+ void import( /* webpackChunkName: "@atlaskit-internal_navigation-layout-sizing" */'./layout-area-sizing-runtime').then(function (_ref2) {
96
+ var LayoutAreaSizingRuntime = _ref2.LayoutAreaSizingRuntime;
97
+ if (!cancelled) {
98
+ setRuntime(function () {
99
+ return LayoutAreaSizingRuntime;
100
+ });
101
+ }
102
+ }, function () {
103
+ loading = false;
104
+ pending.current = [];
105
+ var _iterator = _createForOfIteratorHelper(waitingForRuntime.splice(0)),
106
+ _step;
107
+ try {
108
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
109
+ var resolve = _step.value;
110
+ resolve(false);
111
+ }
112
+ } catch (err) {
113
+ _iterator.e(err);
114
+ } finally {
115
+ _iterator.f();
116
+ }
117
+ });
118
+ };
119
+ loadRef.current = load;
120
+ var loadForSplitter = function loadForSplitter(event) {
121
+ if (event.target instanceof Element && event.target.closest('[data-panel-splitter]')) {
122
+ load();
105
123
  }
106
- });
124
+ };
125
+ var unbindRoot = bindAll(root, [{
126
+ type: 'pointerover',
127
+ listener: loadForSplitter,
128
+ options: {
129
+ passive: true
130
+ }
131
+ }, {
132
+ type: 'focusin',
133
+ listener: loadForSplitter
134
+ }, {
135
+ type: 'pointerdown',
136
+ listener: loadForSplitter,
137
+ options: {
138
+ passive: true
139
+ }
140
+ }]);
107
141
  return function () {
108
- observer.disconnect();
109
- unbindResize();
110
- unbindQuery();
111
- unbindSideNavQuery();
142
+ cancelled = true;
143
+ ready.current = false;
144
+ pending.current = [];
145
+ var _iterator2 = _createForOfIteratorHelper(waitingForRuntime.splice(0)),
146
+ _step2;
147
+ try {
148
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
149
+ var resolve = _step2.value;
150
+ resolve(false);
151
+ }
152
+ } catch (err) {
153
+ _iterator2.e(err);
154
+ } finally {
155
+ _iterator2.f();
156
+ }
157
+ loadRef.current = function () {};
158
+ unbindRoot();
112
159
  };
113
160
  }, [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;
161
+ var onReady = useCallback(function (runtime) {
162
+ actions.current = runtime;
163
+ if (runtime) {
164
+ runtime.setMainMinWidth(mainMinWidth.current);
165
+ var _iterator3 = _createForOfIteratorHelper(['side-nav', 'panel', 'chat-panel']),
166
+ _step3;
167
+ try {
168
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
169
+ var area = _step3.value;
170
+ var config = configs.current[area];
171
+ if (config) {
172
+ runtime.registerArea(area, config);
173
+ }
157
174
  }
175
+ } catch (err) {
176
+ _iterator3.e(err);
177
+ } finally {
178
+ _iterator3.f();
158
179
  }
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
180
  }
166
- setResizeSession({
167
- area: area,
168
- baselineWidths: baselineWidths
169
- });
170
181
  }, []);
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
182
+ var onUpdate = useCallback(function (next) {
183
+ setStates(next);
184
+ var runtime = actions.current;
185
+ if (runtime && Object.values(next).some(Boolean)) {
186
+ ready.current = true;
187
+ var _iterator4 = _createForOfIteratorHelper(pending.current.splice(0)),
188
+ _step4;
189
+ try {
190
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
191
+ var action = _step4.value;
192
+ action(runtime);
203
193
  }
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;
194
+ } catch (err) {
195
+ _iterator4.e(err);
196
+ } finally {
197
+ _iterator4.f();
216
198
  }
217
- if (mode === 'overlay') {
218
- return _objectSpread(_objectSpread({}, current), {}, _defineProperty({}, area, _objectSpread(_objectSpread({}, existing), {}, {
219
- liveResize: undefined,
220
- preferredOverlayWidth: width
221
- })));
199
+ var _iterator5 = _createForOfIteratorHelper(waiting.current.splice(0)),
200
+ _step5;
201
+ try {
202
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
203
+ var resolve = _step5.value;
204
+ resolve(true);
205
+ }
206
+ } catch (err) {
207
+ _iterator5.e(err);
208
+ } finally {
209
+ _iterator5.f();
222
210
  }
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
211
  }
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);
212
+ }, []);
213
+ var dispatch = useCallback(function (action) {
214
+ if (ready.current && actions.current) {
215
+ action(actions.current);
253
216
  } else {
254
- var _sideNav$onRequestClo;
255
- (_sideNav$onRequestClo = sideNav.onRequestClose) === null || _sideNav$onRequestClo === void 0 || _sideNav$onRequestClo.call(sideNav);
217
+ pending.current.push(action);
218
+ loadRef.current();
256
219
  }
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
220
  }, []);
269
221
  var value = useMemo(function () {
270
222
  return {
271
- getResizeBounds: getResizeBounds,
272
- registerArea: registerArea,
273
- unregisterArea: unregisterArea,
274
- startResize: startResize,
275
- resize: resize,
276
- completeResize: completeResize,
277
- setMainMinWidth: setMainMinWidth
223
+ prepareResize: prepareResize,
224
+ registerArea: function registerArea(area, config) {
225
+ var _configs$current$area, _actions$current;
226
+ if (area !== 'panel' && config.isOpen && !((_configs$current$area = configs.current[area]) !== null && _configs$current$area !== void 0 && _configs$current$area.isOpen)) {
227
+ setLastOpenedOverlay(area);
228
+ }
229
+ configs.current[area] = config;
230
+ setConfigRevision(function (revision) {
231
+ return revision + 1;
232
+ });
233
+ (_actions$current = actions.current) === null || _actions$current === void 0 || _actions$current.registerArea(area, config);
234
+ },
235
+ unregisterArea: function unregisterArea(area) {
236
+ var _actions$current2;
237
+ delete configs.current[area];
238
+ setConfigRevision(function (revision) {
239
+ return revision + 1;
240
+ });
241
+ (_actions$current2 = actions.current) === null || _actions$current2 === void 0 || _actions$current2.unregisterArea(area);
242
+ },
243
+ setMainMinWidth: function setMainMinWidth(width) {
244
+ var _actions$current3;
245
+ if (mainMinWidth.current !== width) {
246
+ setConfigRevision(function (revision) {
247
+ return revision + 1;
248
+ });
249
+ }
250
+ mainMinWidth.current = width;
251
+ (_actions$current3 = actions.current) === null || _actions$current3 === void 0 || _actions$current3.setMainMinWidth(width);
252
+ },
253
+ getResizeBounds: function getResizeBounds(area) {
254
+ var _actions$current4;
255
+ return (_actions$current4 = actions.current) === null || _actions$current4 === void 0 ? void 0 : _actions$current4.getResizeBounds(area);
256
+ },
257
+ startResize: function startResize(area, mode) {
258
+ return dispatch(function (runtime) {
259
+ return runtime.startResize(area, mode);
260
+ });
261
+ },
262
+ resize: function resize(area, mode, width) {
263
+ return dispatch(function (runtime) {
264
+ return runtime.resize(area, mode, width);
265
+ });
266
+ },
267
+ completeResize: function completeResize(area, mode, width) {
268
+ return dispatch(function (runtime) {
269
+ return runtime.completeResize(area, mode, width);
270
+ });
271
+ }
278
272
  };
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']);
273
+ }, [dispatch, prepareResize]);
283
274
  var SideNavStateProvider = layoutAreaStateContexts['side-nav'].Provider;
284
275
  var PanelStateProvider = layoutAreaStateContexts.panel.Provider;
285
276
  var ChatPanelStateProvider = layoutAreaStateContexts['chat-panel'].Provider;
286
277
  return /*#__PURE__*/React.createElement(LayoutAreaSizingContext.Provider, {
287
278
  value: value
288
279
  }, /*#__PURE__*/React.createElement(SideNavStateProvider, {
289
- value: sideNavState
280
+ value: states['side-nav']
290
281
  }, /*#__PURE__*/React.createElement(PanelStateProvider, {
291
- value: panelState
282
+ value: states.panel
292
283
  }, /*#__PURE__*/React.createElement(ChatPanelStateProvider, {
293
- value: chatPanelState
294
- }, children))));
284
+ value: states['chat-panel']
285
+ }, children))), Runtime && /*#__PURE__*/React.createElement(Runtime, {
286
+ layoutRef: layoutRef,
287
+ onReady: onReady,
288
+ onUpdate: onUpdate
289
+ }));
295
290
  }