@atlaskit/navigation-system 11.3.1 → 11.3.3

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 (53) hide show
  1. package/CHANGELOG.md +18 -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/panel.js +10 -3
  11. package/dist/cjs/ui/page-layout/root.compiled.css +14 -3
  12. package/dist/cjs/ui/page-layout/root.js +43 -17
  13. package/dist/cjs/ui/page-layout/side-nav/side-nav.js +14 -3
  14. package/dist/cjs/ui/page-layout/use-css-layout-area-states.js +117 -0
  15. package/dist/cjs/ui/page-layout/use-layout-area-sizing.js +3 -1
  16. package/dist/es2019/ui/page-layout/calculate-layout-area-states.js +51 -17
  17. package/dist/es2019/ui/page-layout/chat-panel.js +29 -5
  18. package/dist/es2019/ui/page-layout/layout-area-sizing-context.js +2 -2
  19. package/dist/es2019/ui/page-layout/layout-area-sizing-provider.js +171 -241
  20. package/dist/es2019/ui/page-layout/layout-area-sizing-runtime.js +419 -0
  21. package/dist/es2019/ui/page-layout/main/main.js +2 -2
  22. package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.js +60 -10
  23. package/dist/es2019/ui/page-layout/panel-splitter/provider.js +3 -1
  24. package/dist/es2019/ui/page-layout/panel.js +10 -3
  25. package/dist/es2019/ui/page-layout/root.compiled.css +14 -3
  26. package/dist/es2019/ui/page-layout/root.js +30 -3
  27. package/dist/es2019/ui/page-layout/side-nav/side-nav.js +23 -3
  28. package/dist/es2019/ui/page-layout/use-css-layout-area-states.js +73 -0
  29. package/dist/es2019/ui/page-layout/use-layout-area-sizing.js +3 -1
  30. package/dist/esm/ui/page-layout/calculate-layout-area-states.js +75 -37
  31. package/dist/esm/ui/page-layout/chat-panel.js +7 -4
  32. package/dist/esm/ui/page-layout/layout-area-sizing-context.js +2 -2
  33. package/dist/esm/ui/page-layout/layout-area-sizing-provider.js +243 -248
  34. package/dist/esm/ui/page-layout/layout-area-sizing-runtime.js +459 -0
  35. package/dist/esm/ui/page-layout/main/main.js +2 -2
  36. package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.js +238 -98
  37. package/dist/esm/ui/page-layout/panel-splitter/provider.js +3 -1
  38. package/dist/esm/ui/page-layout/panel.js +10 -3
  39. package/dist/esm/ui/page-layout/root.compiled.css +14 -3
  40. package/dist/esm/ui/page-layout/root.js +42 -16
  41. package/dist/esm/ui/page-layout/side-nav/side-nav.js +14 -3
  42. package/dist/esm/ui/page-layout/use-css-layout-area-states.js +110 -0
  43. package/dist/esm/ui/page-layout/use-layout-area-sizing.js +3 -1
  44. package/dist/types/ui/page-layout/calculate-layout-area-states.d.ts +7 -2
  45. package/dist/types/ui/page-layout/layout-area-sizing-context.d.ts +10 -3
  46. package/dist/types/ui/page-layout/layout-area-sizing-provider.d.ts +6 -0
  47. package/dist/types/ui/page-layout/layout-area-sizing-runtime.d.ts +8 -0
  48. package/dist/types/ui/page-layout/panel-splitter/panel-splitter-context.d.ts +4 -0
  49. package/dist/types/ui/page-layout/panel-splitter/provider.d.ts +1 -1
  50. package/dist/types/ui/page-layout/root.d.ts +2 -0
  51. package/dist/types/ui/page-layout/use-css-layout-area-states.d.ts +8 -0
  52. package/dist/types/ui/page-layout/use-layout-area-sizing.d.ts +2 -0
  53. package/package.json +11 -6
@@ -6,299 +6,295 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.LayoutAreaSizingProvider = LayoutAreaSizingProvider;
9
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
10
  var _react = _interopRequireWildcard(require("react"));
12
11
  var _bindEventListener = require("bind-event-listener");
13
- var _calculateLayoutAreaStates = require("./calculate-layout-area-states");
14
12
  var _layoutAreaSizingContext = require("./layout-area-sizing-context");
15
13
  var _layoutAreaStateContexts = require("./layout-area-state-contexts");
16
- var _useOccupiedLayoutWidth = require("./use-occupied-layout-width");
17
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
+ var _useCssLayoutAreaStates = require("./use-css-layout-area-states");
18
15
  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; } } }; }
19
16
  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; } }
20
17
  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; }
21
- 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; }
22
- 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) { (0, _defineProperty2.default)(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; }
23
- var defaultMainMinWidth = 320;
24
- function useStableAreaState(state) {
25
- var _ref = state !== null && state !== void 0 ? state : {},
26
- mode = _ref.mode,
27
- width = _ref.width,
28
- minWidth = _ref.minWidth;
29
- return (0, _react.useMemo)(function () {
30
- return mode !== undefined && width !== undefined && minWidth !== undefined ? {
31
- mode: mode,
32
- width: width,
33
- minWidth: minWidth
34
- } : undefined;
35
- }, [mode, width, minWidth]);
36
- }
37
- function LayoutAreaSizingProvider(_ref2) {
38
- var children = _ref2.children,
39
- layoutRef = _ref2.layoutRef;
40
- var occupiedWidth = (0, _useOccupiedLayoutWidth.useOccupiedLayoutWidth)(layoutRef);
18
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
19
+ /**
20
+ * Stable, synchronous boundary for SSR content. The drag/cascade implementation
21
+ * is a sibling, not a replacement wrapper, so loading it cannot remount the app.
22
+ * CSS handles initial and responsive geometry; only splitter interaction requests
23
+ * the asynchronous chunk. The eager observer reads modes without changing widths.
24
+ */
25
+ function LayoutAreaSizingProvider(_ref) {
26
+ var _states$sideNav$mode, _states$sideNav, _states$chatPanel$mo, _states$chatPanel;
27
+ var children = _ref.children,
28
+ layoutRef = _ref.layoutRef;
41
29
  var _useState = (0, _react.useState)(null),
42
30
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
43
- dimensions = _useState2[0],
44
- setDimensions = _useState2[1];
45
- var _useState3 = (0, _react.useState)(defaultMainMinWidth),
31
+ Runtime = _useState2[0],
32
+ setRuntime = _useState2[1];
33
+ var _useState3 = (0, _react.useState)({}),
46
34
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
47
- mainMinWidth = _useState4[0],
48
- setMainMinWidth = _useState4[1];
49
- var _useState5 = (0, _react.useState)({}),
35
+ states = _useState4[0],
36
+ setStates = _useState4[1];
37
+ var actions = (0, _react.useRef)(null);
38
+ var configs = (0, _react.useRef)({});
39
+ var _useState5 = (0, _react.useState)(null),
50
40
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
51
- areas = _useState6[0],
52
- setAreas = _useState6[1];
53
- var _useState7 = (0, _react.useState)(null),
41
+ lastOpenedOverlay = _useState6[0],
42
+ setLastOpenedOverlay = _useState6[1];
43
+ var _useState7 = (0, _react.useState)(0),
54
44
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
55
- resizeSession = _useState8[0],
56
- setResizeSession = _useState8[1];
57
- var areaStatesRef = _react.default.useRef({});
58
- var configsRef = _react.default.useRef({});
59
- var openSequence = _react.default.useRef(0);
60
- (0, _react.useEffect)(function () {
61
- setResizeSession(null);
62
- }, [mainMinWidth, occupiedWidth]);
45
+ configRevision = _useState8[0],
46
+ setConfigRevision = _useState8[1];
47
+ var cssModes = (0, _useCssLayoutAreaStates.useCssLayoutAreaStates)(layoutRef, configRevision, Runtime === null);
48
+ 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'];
49
+ 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'];
50
+
51
+ // Overlay dismissal is available before the sizing chunk loads. Keep the open
52
+ // order here too: replaying registrations into the runtime loses that order.
63
53
  (0, _react.useEffect)(function () {
64
- var root = layoutRef === null || layoutRef === void 0 ? void 0 : layoutRef.current;
65
- var previous = null;
66
- // Match the actual rem-based grid breakpoint, including browser font settings.
67
54
  var inlineChatQuery = window.matchMedia('(min-width: 40rem)');
68
- var inlineSideNavQuery = window.matchMedia('(min-width: 64rem)');
69
- var updateDimensions = function updateDimensions(contentWidth) {
70
- var _style$paddingLeft, _style$paddingRight, _previous;
71
- var style = root && contentWidth === undefined ? getComputedStyle(root) : null;
72
- 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;
73
- var next = {
74
- viewportWidth: window.innerWidth,
75
- layoutWidth: layoutWidth,
76
- isChatPanelOverlay: !inlineChatQuery.matches,
77
- isSideNavOverlay: !inlineSideNavQuery.matches
78
- };
79
- 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) {
55
+ var dismissOlderOverlay = function dismissOlderOverlay() {
56
+ var _olderOverlay$onReque;
57
+ var sideNav = configs.current['side-nav'];
58
+ var chatPanel = configs.current['chat-panel'];
59
+ if (!(sideNav !== null && sideNav !== void 0 && sideNav.isOpen) || !(chatPanel !== null && chatPanel !== void 0 && chatPanel.isOpen) || !lastOpenedOverlay) {
80
60
  return;
81
61
  }
82
- previous = next;
83
- setDimensions(next);
84
- setResizeSession(null);
85
- };
86
- updateDimensions();
87
- var observer = new ResizeObserver(function (entries) {
88
- var entry = entries.find(function (entry) {
89
- return entry.target === root;
90
- });
91
- if (entry) {
92
- updateDimensions(entry.contentRect.width);
62
+ // Before allocation, CSS puts both areas in overlay below 40rem. Once
63
+ // sizing is active, also honour overlays caused by custom widths/slots.
64
+ if (inlineChatQuery.matches && (sideNavMode !== 'overlay' || chatPanelMode !== 'overlay')) {
65
+ return;
93
66
  }
67
+ var olderOverlay = lastOpenedOverlay === 'side-nav' ? chatPanel : sideNav;
68
+ (_olderOverlay$onReque = olderOverlay.onRequestClose) === null || _olderOverlay$onReque === void 0 || _olderOverlay$onReque.call(olderOverlay);
69
+ };
70
+ dismissOlderOverlay();
71
+ return (0, _bindEventListener.bind)(inlineChatQuery, {
72
+ type: 'change',
73
+ listener: dismissOlderOverlay
94
74
  });
95
- if (root) {
96
- observer.observe(root);
75
+ }, [chatPanelMode, lastOpenedOverlay, sideNavMode]);
76
+ var mainMinWidth = (0, _react.useRef)(320);
77
+ var loadRef = (0, _react.useRef)(function () {});
78
+ var ready = (0, _react.useRef)(false);
79
+ var waiting = (0, _react.useRef)([]);
80
+ var pending = (0, _react.useRef)([]);
81
+ var prepareResize = (0, _react.useCallback)(function () {
82
+ if (ready.current) {
83
+ return Promise.resolve(true);
97
84
  }
98
- var unbindResize = (0, _bindEventListener.bind)(window, {
99
- type: 'resize',
100
- listener: function listener() {
101
- return updateDimensions();
102
- }
85
+ return new Promise(function (resolve) {
86
+ waiting.current.push(resolve);
87
+ loadRef.current();
103
88
  });
104
- var unbindQuery = (0, _bindEventListener.bind)(inlineChatQuery, {
105
- type: 'change',
106
- listener: function listener() {
107
- return updateDimensions();
89
+ }, []);
90
+ (0, _react.useEffect)(function () {
91
+ var root = layoutRef === null || layoutRef === void 0 ? void 0 : layoutRef.current;
92
+ if (!root) {
93
+ return;
94
+ }
95
+ var cancelled = false;
96
+ var loading = false;
97
+ var waitingForRuntime = waiting.current;
98
+ var load = function load() {
99
+ if (loading) {
100
+ return;
108
101
  }
109
- });
110
- var unbindSideNavQuery = (0, _bindEventListener.bind)(inlineSideNavQuery, {
111
- type: 'change',
112
- listener: function listener() {
113
- return updateDimensions();
102
+ loading = true;
103
+ void Promise.resolve().then(function () {
104
+ return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_navigation-layout-sizing" */'./layout-area-sizing-runtime'));
105
+ }).then(function (_ref2) {
106
+ var LayoutAreaSizingRuntime = _ref2.LayoutAreaSizingRuntime;
107
+ if (!cancelled) {
108
+ setRuntime(function () {
109
+ return LayoutAreaSizingRuntime;
110
+ });
111
+ }
112
+ }, function () {
113
+ loading = false;
114
+ pending.current = [];
115
+ var _iterator = _createForOfIteratorHelper(waitingForRuntime.splice(0)),
116
+ _step;
117
+ try {
118
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
119
+ var resolve = _step.value;
120
+ resolve(false);
121
+ }
122
+ } catch (err) {
123
+ _iterator.e(err);
124
+ } finally {
125
+ _iterator.f();
126
+ }
127
+ });
128
+ };
129
+ loadRef.current = load;
130
+ var loadForSplitter = function loadForSplitter(event) {
131
+ if (event.target instanceof Element && event.target.closest('[data-panel-splitter]')) {
132
+ load();
114
133
  }
115
- });
134
+ };
135
+ var unbindRoot = (0, _bindEventListener.bindAll)(root, [{
136
+ type: 'pointerover',
137
+ listener: loadForSplitter,
138
+ options: {
139
+ passive: true
140
+ }
141
+ }, {
142
+ type: 'focusin',
143
+ listener: loadForSplitter
144
+ }, {
145
+ type: 'pointerdown',
146
+ listener: loadForSplitter,
147
+ options: {
148
+ passive: true
149
+ }
150
+ }]);
116
151
  return function () {
117
- observer.disconnect();
118
- unbindResize();
119
- unbindQuery();
120
- unbindSideNavQuery();
152
+ cancelled = true;
153
+ ready.current = false;
154
+ pending.current = [];
155
+ var _iterator2 = _createForOfIteratorHelper(waitingForRuntime.splice(0)),
156
+ _step2;
157
+ try {
158
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
159
+ var resolve = _step2.value;
160
+ resolve(false);
161
+ }
162
+ } catch (err) {
163
+ _iterator2.e(err);
164
+ } finally {
165
+ _iterator2.f();
166
+ }
167
+ loadRef.current = function () {};
168
+ unbindRoot();
121
169
  };
122
170
  }, [layoutRef]);
123
- var registerArea = (0, _react.useCallback)(function (area, config) {
124
- var previous = configsRef.current[area];
125
- configsRef.current[area] = config;
126
- setResizeSession(function (current) {
127
- // A changed layout/configuration needs a fresh allocation. A controlled
128
- // acknowledgement for the resized area keeps its siblings fixed.
129
- 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;
130
- });
131
- // Allocate once per registration, outside the updater React may replay. Gaps are
132
- // harmless: only relative ordering of closed-to-open transitions is significant.
133
- var openedAt = ++openSequence.current;
134
- setAreas(function (current) {
135
- var existing = current[area];
136
- return _objectSpread(_objectSpread({}, current), {}, (0, _defineProperty2.default)({}, area, _objectSpread(_objectSpread(_objectSpread({}, existing), config), {}, {
137
- liveResize: config.isOpen ? existing === null || existing === void 0 ? void 0 : existing.liveResize : undefined,
138
- openedAt: config.isOpen && !(existing !== null && existing !== void 0 && existing.isOpen) ? openedAt : existing === null || existing === void 0 ? void 0 : existing.openedAt
139
- })));
140
- });
141
- }, []);
142
- var unregisterArea = (0, _react.useCallback)(function (area) {
143
- delete configsRef.current[area];
144
- setResizeSession(null);
145
- setAreas(function (current) {
146
- if (!current[area]) {
147
- return current;
148
- }
149
- // Closing uses isOpen: false and retains preferences. Unregistering means
150
- // the owning component unmounted; a replacement must start with its own defaults.
151
- var next = _objectSpread({}, current);
152
- delete next[area];
153
- return next;
154
- });
155
- }, []);
156
- var freezeSiblingWidths = (0, _react.useCallback)(function (area) {
157
- var baselineWidths = {};
158
- var _iterator = _createForOfIteratorHelper(['side-nav', 'panel', 'chat-panel']),
159
- _step;
160
- try {
161
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
162
- var areaName = _step.value;
163
- var state = areaStatesRef.current[areaName];
164
- if ((state === null || state === void 0 ? void 0 : state.mode) === 'inline') {
165
- baselineWidths[areaName] = state.width;
171
+ var onReady = (0, _react.useCallback)(function (runtime) {
172
+ actions.current = runtime;
173
+ if (runtime) {
174
+ runtime.setMainMinWidth(mainMinWidth.current);
175
+ var _iterator3 = _createForOfIteratorHelper(['side-nav', 'panel', 'chat-panel']),
176
+ _step3;
177
+ try {
178
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
179
+ var area = _step3.value;
180
+ var config = configs.current[area];
181
+ if (config) {
182
+ runtime.registerArea(area, config);
183
+ }
166
184
  }
185
+ } catch (err) {
186
+ _iterator3.e(err);
187
+ } finally {
188
+ _iterator3.f();
167
189
  }
168
- // Keep the same siblings fixed after completion, including while a controlled
169
- // consumer rejects or asynchronously accepts the requested width.
170
- } catch (err) {
171
- _iterator.e(err);
172
- } finally {
173
- _iterator.f();
174
190
  }
175
- setResizeSession({
176
- area: area,
177
- baselineWidths: baselineWidths
178
- });
179
191
  }, []);
180
- var startResize = (0, _react.useCallback)(function (area, mode) {
181
- if (mode !== 'inline') {
182
- return;
183
- }
184
- freezeSiblingWidths(area);
185
-
186
- // Start from the effective width, which may already be compressed below the preferred width.
187
- // Reapplying the preferred width here would move the splitter away from the pointer.
188
- var renderedState = areaStatesRef.current[area];
189
- if ((renderedState === null || renderedState === void 0 ? void 0 : renderedState.mode) === 'inline') {
190
- setAreas(function (current) {
191
- var existing = current[area];
192
- return existing ? _objectSpread(_objectSpread({}, current), {}, (0, _defineProperty2.default)({}, area, _objectSpread(_objectSpread({}, existing), {}, {
193
- liveResize: {
194
- mode: mode,
195
- width: renderedState.width
196
- }
197
- }))) : current;
198
- });
199
- }
200
- }, [freezeSiblingWidths]);
201
- var resize = (0, _react.useCallback)(function (area, mode, width) {
202
- setAreas(function (current) {
203
- var _existing$liveResize;
204
- var existing = current[area];
205
- 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) {
206
- return current;
207
- }
208
- return existing ? _objectSpread(_objectSpread({}, current), {}, (0, _defineProperty2.default)({}, area, _objectSpread(_objectSpread({}, existing), {}, {
209
- liveResize: {
210
- mode: mode,
211
- width: width
192
+ var onUpdate = (0, _react.useCallback)(function (next) {
193
+ setStates(next);
194
+ var runtime = actions.current;
195
+ if (runtime && Object.values(next).some(Boolean)) {
196
+ ready.current = true;
197
+ var _iterator4 = _createForOfIteratorHelper(pending.current.splice(0)),
198
+ _step4;
199
+ try {
200
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
201
+ var action = _step4.value;
202
+ action(runtime);
212
203
  }
213
- }))) : current;
214
- });
215
- }, []);
216
- var completeResize = (0, _react.useCallback)(function (area, mode, width) {
217
- if (mode === 'inline') {
218
- // Keyboard resizing completes without a preceding pointer-drag session.
219
- freezeSiblingWidths(area);
220
- }
221
- setAreas(function (current) {
222
- var existing = current[area];
223
- if (!existing) {
224
- return current;
204
+ } catch (err) {
205
+ _iterator4.e(err);
206
+ } finally {
207
+ _iterator4.f();
225
208
  }
226
- if (mode === 'overlay') {
227
- return _objectSpread(_objectSpread({}, current), {}, (0, _defineProperty2.default)({}, area, _objectSpread(_objectSpread({}, existing), {}, {
228
- liveResize: undefined,
229
- preferredOverlayWidth: width
230
- })));
209
+ var _iterator5 = _createForOfIteratorHelper(waiting.current.splice(0)),
210
+ _step5;
211
+ try {
212
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
213
+ var resolve = _step5.value;
214
+ resolve(true);
215
+ }
216
+ } catch (err) {
217
+ _iterator5.e(err);
218
+ } finally {
219
+ _iterator5.f();
231
220
  }
232
- return _objectSpread(_objectSpread({}, current), {}, (0, _defineProperty2.default)({}, area, _objectSpread(_objectSpread({}, existing), {}, {
233
- liveResize: undefined,
234
- preferredInlineWidth: width
235
- })));
236
- });
237
- }, [freezeSiblingWidths]);
238
- var areaStates = (0, _react.useMemo)(function () {
239
- return dimensions === null ? {} : (0, _calculateLayoutAreaStates.calculateLayoutAreaStates)(_objectSpread(_objectSpread({}, dimensions), {}, {
240
- occupiedWidth: occupiedWidth,
241
- mainMinWidth: mainMinWidth,
242
- areas: areas,
243
- resizeSession: resizeSession
244
- }));
245
- }, [areas, mainMinWidth, resizeSession, dimensions, occupiedWidth]);
246
- (0, _react.useEffect)(function () {
247
- areaStatesRef.current = areaStates;
248
- }, [areaStates]);
249
- (0, _react.useEffect)(function () {
250
- var _areaStates$sideNav, _areaStates$chatPane, _sideNav$openedAt, _chatPanel$openedAt;
251
- 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') {
252
- return;
253
221
  }
254
- var sideNav = areas['side-nav'];
255
- var chatPanel = areas['chat-panel'];
256
- if (!(sideNav !== null && sideNav !== void 0 && sideNav.isOpen) || !(chatPanel !== null && chatPanel !== void 0 && chatPanel.isOpen)) {
257
- return;
258
- }
259
- 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)) {
260
- var _chatPanel$onRequestC;
261
- (_chatPanel$onRequestC = chatPanel.onRequestClose) === null || _chatPanel$onRequestC === void 0 || _chatPanel$onRequestC.call(chatPanel);
222
+ }, []);
223
+ var dispatch = (0, _react.useCallback)(function (action) {
224
+ if (ready.current && actions.current) {
225
+ action(actions.current);
262
226
  } else {
263
- var _sideNav$onRequestClo;
264
- (_sideNav$onRequestClo = sideNav.onRequestClose) === null || _sideNav$onRequestClo === void 0 || _sideNav$onRequestClo.call(sideNav);
227
+ pending.current.push(action);
228
+ loadRef.current();
265
229
  }
266
- }, [areas, areaStates]);
267
-
268
- // Read bounds lazily: changing a sibling's capacity must not publish new render
269
- // state or recreate drag listeners for a region whose own width did not change.
270
- var getResizeBounds = (0, _react.useCallback)(function (area) {
271
- var _areaStatesRef$curren;
272
- var bounds = (_areaStatesRef$curren = areaStatesRef.current[area]) === null || _areaStatesRef$curren === void 0 ? void 0 : _areaStatesRef$curren.resizeBounds;
273
- return bounds ? {
274
- min: "".concat(bounds.min, "px"),
275
- max: "".concat(bounds.max, "px")
276
- } : undefined;
277
230
  }, []);
278
231
  var value = (0, _react.useMemo)(function () {
279
232
  return {
280
- getResizeBounds: getResizeBounds,
281
- registerArea: registerArea,
282
- unregisterArea: unregisterArea,
283
- startResize: startResize,
284
- resize: resize,
285
- completeResize: completeResize,
286
- setMainMinWidth: setMainMinWidth
233
+ prepareResize: prepareResize,
234
+ registerArea: function registerArea(area, config) {
235
+ var _configs$current$area, _actions$current;
236
+ if (area !== 'panel' && config.isOpen && !((_configs$current$area = configs.current[area]) !== null && _configs$current$area !== void 0 && _configs$current$area.isOpen)) {
237
+ setLastOpenedOverlay(area);
238
+ }
239
+ configs.current[area] = config;
240
+ setConfigRevision(function (revision) {
241
+ return revision + 1;
242
+ });
243
+ (_actions$current = actions.current) === null || _actions$current === void 0 || _actions$current.registerArea(area, config);
244
+ },
245
+ unregisterArea: function unregisterArea(area) {
246
+ var _actions$current2;
247
+ delete configs.current[area];
248
+ setConfigRevision(function (revision) {
249
+ return revision + 1;
250
+ });
251
+ (_actions$current2 = actions.current) === null || _actions$current2 === void 0 || _actions$current2.unregisterArea(area);
252
+ },
253
+ setMainMinWidth: function setMainMinWidth(width) {
254
+ var _actions$current3;
255
+ if (mainMinWidth.current !== width) {
256
+ setConfigRevision(function (revision) {
257
+ return revision + 1;
258
+ });
259
+ }
260
+ mainMinWidth.current = width;
261
+ (_actions$current3 = actions.current) === null || _actions$current3 === void 0 || _actions$current3.setMainMinWidth(width);
262
+ },
263
+ getResizeBounds: function getResizeBounds(area) {
264
+ var _actions$current4;
265
+ return (_actions$current4 = actions.current) === null || _actions$current4 === void 0 ? void 0 : _actions$current4.getResizeBounds(area);
266
+ },
267
+ startResize: function startResize(area, mode) {
268
+ return dispatch(function (runtime) {
269
+ return runtime.startResize(area, mode);
270
+ });
271
+ },
272
+ resize: function resize(area, mode, width) {
273
+ return dispatch(function (runtime) {
274
+ return runtime.resize(area, mode, width);
275
+ });
276
+ },
277
+ completeResize: function completeResize(area, mode, width) {
278
+ return dispatch(function (runtime) {
279
+ return runtime.completeResize(area, mode, width);
280
+ });
281
+ }
287
282
  };
288
- }, [completeResize, getResizeBounds, registerArea, resize, startResize, unregisterArea]);
289
- var sideNavState = useStableAreaState(areaStates['side-nav']);
290
- var panelState = useStableAreaState(areaStates.panel);
291
- var chatPanelState = useStableAreaState(areaStates['chat-panel']);
283
+ }, [dispatch, prepareResize]);
292
284
  var SideNavStateProvider = _layoutAreaStateContexts.layoutAreaStateContexts['side-nav'].Provider;
293
285
  var PanelStateProvider = _layoutAreaStateContexts.layoutAreaStateContexts.panel.Provider;
294
286
  var ChatPanelStateProvider = _layoutAreaStateContexts.layoutAreaStateContexts['chat-panel'].Provider;
295
287
  return /*#__PURE__*/_react.default.createElement(_layoutAreaSizingContext.LayoutAreaSizingContext.Provider, {
296
288
  value: value
297
289
  }, /*#__PURE__*/_react.default.createElement(SideNavStateProvider, {
298
- value: sideNavState
290
+ value: states['side-nav']
299
291
  }, /*#__PURE__*/_react.default.createElement(PanelStateProvider, {
300
- value: panelState
292
+ value: states.panel
301
293
  }, /*#__PURE__*/_react.default.createElement(ChatPanelStateProvider, {
302
- value: chatPanelState
303
- }, children))));
294
+ value: states['chat-panel']
295
+ }, children))), Runtime && /*#__PURE__*/_react.default.createElement(Runtime, {
296
+ layoutRef: layoutRef,
297
+ onReady: onReady,
298
+ onUpdate: onUpdate
299
+ }));
304
300
  }