@atlaskit/navigation-system 11.0.0 → 11.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/cjs/entry-points/layout/chat-panel.js +12 -0
- package/dist/cjs/entry-points/layout/layout-sizing.js +44 -0
- package/dist/cjs/ui/page-layout/calculate-layout-area-states.js +179 -0
- package/dist/cjs/ui/page-layout/chat-panel.compiled.css +27 -0
- package/dist/cjs/ui/page-layout/chat-panel.js +216 -0
- package/dist/cjs/ui/page-layout/constants.js +6 -1
- package/dist/cjs/ui/page-layout/layout-area-sizing-context.js +13 -0
- package/dist/cjs/ui/page-layout/layout-area-sizing-provider.js +304 -0
- package/dist/cjs/ui/page-layout/layout-area-state-contexts.js +13 -0
- package/dist/cjs/ui/page-layout/main/main.js +11 -2
- package/dist/cjs/ui/page-layout/panel-splitter/panel-splitter.js +73 -7
- package/dist/cjs/ui/page-layout/panel-splitter/provider.js +7 -1
- package/dist/cjs/ui/page-layout/resolve-layout-width.js +13 -0
- package/dist/cjs/ui/page-layout/ribbon.js +1 -0
- package/dist/cjs/ui/page-layout/root.compiled.css +4 -2
- package/dist/cjs/ui/page-layout/root.js +10 -4
- package/dist/cjs/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
- package/dist/cjs/ui/page-layout/side-nav/side-nav.js +152 -14
- package/dist/cjs/ui/page-layout/use-layout-area-sizing.js +73 -0
- package/dist/cjs/ui/page-layout/use-layout-main-sizing.js +15 -0
- package/dist/cjs/ui/page-layout/use-occupied-layout-width.js +111 -0
- package/dist/es2019/entry-points/layout/chat-panel.js +1 -0
- package/dist/es2019/entry-points/layout/layout-sizing.js +3 -0
- package/dist/es2019/ui/page-layout/calculate-layout-area-states.js +128 -0
- package/dist/es2019/ui/page-layout/chat-panel.compiled.css +27 -0
- package/dist/es2019/ui/page-layout/chat-panel.js +199 -0
- package/dist/es2019/ui/page-layout/constants.js +5 -0
- package/dist/es2019/ui/page-layout/layout-area-sizing-context.js +8 -0
- package/dist/es2019/ui/page-layout/layout-area-sizing-provider.js +279 -0
- package/dist/es2019/ui/page-layout/layout-area-state-contexts.js +7 -0
- package/dist/es2019/ui/page-layout/main/main.js +10 -2
- package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.js +68 -8
- package/dist/es2019/ui/page-layout/panel-splitter/provider.js +7 -1
- package/dist/es2019/ui/page-layout/resolve-layout-width.js +7 -0
- package/dist/es2019/ui/page-layout/ribbon.js +1 -0
- package/dist/es2019/ui/page-layout/root.compiled.css +4 -2
- package/dist/es2019/ui/page-layout/root.js +10 -4
- package/dist/es2019/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
- package/dist/es2019/ui/page-layout/side-nav/side-nav.js +142 -14
- package/dist/es2019/ui/page-layout/use-layout-area-sizing.js +58 -0
- package/dist/es2019/ui/page-layout/use-layout-main-sizing.js +7 -0
- package/dist/es2019/ui/page-layout/use-occupied-layout-width.js +67 -0
- package/dist/esm/entry-points/layout/chat-panel.js +1 -0
- package/dist/esm/entry-points/layout/layout-sizing.js +3 -0
- package/dist/esm/ui/page-layout/calculate-layout-area-states.js +173 -0
- package/dist/esm/ui/page-layout/chat-panel.compiled.css +27 -0
- package/dist/esm/ui/page-layout/chat-panel.js +207 -0
- package/dist/esm/ui/page-layout/constants.js +5 -0
- package/dist/esm/ui/page-layout/layout-area-sizing-context.js +8 -0
- package/dist/esm/ui/page-layout/layout-area-sizing-provider.js +295 -0
- package/dist/esm/ui/page-layout/layout-area-state-contexts.js +7 -0
- package/dist/esm/ui/page-layout/main/main.js +11 -2
- package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.js +74 -8
- package/dist/esm/ui/page-layout/panel-splitter/provider.js +7 -1
- package/dist/esm/ui/page-layout/resolve-layout-width.js +7 -0
- package/dist/esm/ui/page-layout/ribbon.js +1 -0
- package/dist/esm/ui/page-layout/root.compiled.css +4 -2
- package/dist/esm/ui/page-layout/root.js +10 -4
- package/dist/esm/ui/page-layout/side-nav/side-nav.compiled.css +2 -1
- package/dist/esm/ui/page-layout/side-nav/side-nav.js +153 -15
- package/dist/esm/ui/page-layout/use-layout-area-sizing.js +67 -0
- package/dist/esm/ui/page-layout/use-layout-main-sizing.js +9 -0
- package/dist/esm/ui/page-layout/use-occupied-layout-width.js +105 -0
- package/dist/types/entry-points/layout/chat-panel.d.ts +1 -0
- package/dist/types/entry-points/layout/layout-sizing.d.ts +4 -0
- package/dist/types/ui/page-layout/calculate-layout-area-states.d.ts +20 -0
- package/dist/types/ui/page-layout/chat-panel.d.ts +48 -0
- package/dist/types/ui/page-layout/constants.d.ts +4 -0
- package/dist/types/ui/page-layout/layout-area-sizing-context.d.ts +55 -0
- package/dist/types/ui/page-layout/layout-area-sizing-provider.d.ts +5 -0
- package/dist/types/ui/page-layout/layout-area-state-contexts.d.ts +3 -0
- package/dist/types/ui/page-layout/main/main.d.ts +5 -1
- package/dist/types/ui/page-layout/panel-splitter/panel-splitter-context.d.ts +15 -1
- package/dist/types/ui/page-layout/panel-splitter/provider.d.ts +1 -1
- package/dist/types/ui/page-layout/resolve-layout-width.d.ts +2 -0
- package/dist/types/ui/page-layout/side-nav/side-nav.d.ts +11 -2
- package/dist/types/ui/page-layout/use-layout-area-sizing.d.ts +12 -0
- package/dist/types/ui/page-layout/use-layout-main-sizing.d.ts +2 -0
- package/dist/types/ui/page-layout/use-occupied-layout-width.d.ts +8 -0
- package/layout/chat-panel/package.json +10 -0
- package/layout/layout-sizing/package.json +10 -0
- package/package.json +11 -3
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { bind } from 'bind-event-listener';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Measures the existing Root slots that are not managed by the chat-layout allocator.
|
|
6
|
+
* Only count separate inline columns: Aside stacks below Main on mobile, and the
|
|
7
|
+
* legacy Panel spans other areas while overlaying. Read the grid rather than duplicating
|
|
8
|
+
* its responsive breakpoints. Border boxes include slot borders and live splitter widths.
|
|
9
|
+
*/
|
|
10
|
+
export function useOccupiedLayoutWidth(layoutRef) {
|
|
11
|
+
const [width, setWidth] = useState(0);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const root = layoutRef === null || layoutRef === void 0 ? void 0 : layoutRef.current;
|
|
14
|
+
if (!root) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let occupiedSlots = [];
|
|
18
|
+
const measure = () => {
|
|
19
|
+
var _getComputedStyle$gri, _rows$map$find;
|
|
20
|
+
if (occupiedSlots.length === 0) {
|
|
21
|
+
setWidth(0);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const rows = (_getComputedStyle$gri = getComputedStyle(root).gridTemplateAreas.match(/"[^"]+"/g)) !== null && _getComputedStyle$gri !== void 0 ? _getComputedStyle$gri : [];
|
|
25
|
+
const mainRow = (_rows$map$find = rows.map(row => row.replace(/"/g, '').split(/\s+/)).find(row => row.includes('main'))) !== null && _rows$map$find !== void 0 ? _rows$map$find : [];
|
|
26
|
+
let occupiedWidth = 0;
|
|
27
|
+
for (const child of occupiedSlots) {
|
|
28
|
+
const style = getComputedStyle(child);
|
|
29
|
+
const area = style.gridArea.split('/').map(part => part.trim());
|
|
30
|
+
const slot = area[0];
|
|
31
|
+
if (['ribbon', 'aside', 'panel'].includes(slot) && area.every(part => part === slot) && mainRow.includes(slot) && style.display !== 'none' && style.position !== 'absolute' && style.position !== 'fixed') {
|
|
32
|
+
occupiedWidth += child.getBoundingClientRect().width;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
setWidth(occupiedWidth);
|
|
36
|
+
};
|
|
37
|
+
const resizeObserver = new ResizeObserver(measure);
|
|
38
|
+
const observeSlots = () => {
|
|
39
|
+
resizeObserver.disconnect();
|
|
40
|
+
resizeObserver.observe(root);
|
|
41
|
+
// Managed regions resize on every drag frame but cannot consume extra tracks.
|
|
42
|
+
// Keep them out of both the observer and the measurement loop. Slot identity,
|
|
43
|
+
// unlike gridArea, remains stable when a region switches to overlay mode.
|
|
44
|
+
// TopNav and Banner also span columns rather than consuming independent tracks.
|
|
45
|
+
occupiedSlots = Array.from(root.children).filter(child => child instanceof HTMLElement && child.hasAttribute('data-layout-slot') && !child.matches('nav, header, [role="main"], [data-layout-chat-panel]') && getComputedStyle(child).gridArea.split('/')[0].trim() !== 'banner');
|
|
46
|
+
for (const child of occupiedSlots) {
|
|
47
|
+
resizeObserver.observe(child);
|
|
48
|
+
}
|
|
49
|
+
measure();
|
|
50
|
+
};
|
|
51
|
+
const mutationObserver = new MutationObserver(observeSlots);
|
|
52
|
+
mutationObserver.observe(root, {
|
|
53
|
+
childList: true
|
|
54
|
+
});
|
|
55
|
+
observeSlots();
|
|
56
|
+
const unbind = bind(window, {
|
|
57
|
+
type: 'resize',
|
|
58
|
+
listener: measure
|
|
59
|
+
});
|
|
60
|
+
return () => {
|
|
61
|
+
unbind();
|
|
62
|
+
resizeObserver.disconnect();
|
|
63
|
+
mutationObserver.disconnect();
|
|
64
|
+
};
|
|
65
|
+
}, [layoutRef]);
|
|
66
|
+
return width;
|
|
67
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ChatPanel } from '../../ui/page-layout/chat-panel';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { contentHeightWhenFixed, contentInsetBlockStart, mainMinimumWidthVar, sideNavLiveWidthVar } from '../../ui/page-layout/constants';
|
|
2
|
+
export { useLayoutAreaSizing as UNSAFE_useLayoutAreaSizing } from '../../ui/page-layout/use-layout-area-sizing';
|
|
3
|
+
export { resolveLayoutWidth as UNSAFE_resolveLayoutWidth } from '../../ui/page-layout/resolve-layout-width';
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
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; } } }; }
|
|
2
|
+
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; } }
|
|
3
|
+
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; }
|
|
4
|
+
import { resolveLayoutWidth } from './resolve-layout-width';
|
|
5
|
+
function clampTargetWidth(_ref) {
|
|
6
|
+
var target = _ref.target,
|
|
7
|
+
min = _ref.min,
|
|
8
|
+
max = _ref.max;
|
|
9
|
+
return Math.max(min, Math.min(target, max));
|
|
10
|
+
}
|
|
11
|
+
function getTargetWidth(area, isSideNavOverlay) {
|
|
12
|
+
var _area$compactDefaultW, _area$liveResize, _ref2, _area$requestedWidth;
|
|
13
|
+
var defaultWidth = isSideNavOverlay ? (_area$compactDefaultW = area.compactDefaultWidth) !== null && _area$compactDefaultW !== void 0 ? _area$compactDefaultW : area.defaultWidth : area.defaultWidth;
|
|
14
|
+
return ((_area$liveResize = area.liveResize) === null || _area$liveResize === void 0 ? void 0 : _area$liveResize.mode) === 'inline' ? area.liveResize.width : (_ref2 = (_area$requestedWidth = area.requestedWidth) !== null && _area$requestedWidth !== void 0 ? _area$requestedWidth : area.preferredInlineWidth) !== null && _ref2 !== void 0 ? _ref2 : defaultWidth;
|
|
15
|
+
}
|
|
16
|
+
function getOverlayTargetWidth(area, isSideNavOverlay) {
|
|
17
|
+
var _area$compactDefaultW2, _area$liveResize2, _ref3, _area$requestedWidth2;
|
|
18
|
+
var defaultWidth = isSideNavOverlay ? (_area$compactDefaultW2 = area.compactDefaultWidth) !== null && _area$compactDefaultW2 !== void 0 ? _area$compactDefaultW2 : area.defaultWidth : area.defaultWidth;
|
|
19
|
+
return ((_area$liveResize2 = area.liveResize) === null || _area$liveResize2 === void 0 ? void 0 : _area$liveResize2.mode) === 'overlay' ? area.liveResize.width : (_ref3 = (_area$requestedWidth2 = area.requestedWidth) !== null && _area$requestedWidth2 !== void 0 ? _area$requestedWidth2 : area.preferredOverlayWidth) !== null && _ref3 !== void 0 ? _ref3 : defaultWidth;
|
|
20
|
+
}
|
|
21
|
+
export function calculateLayoutAreaStates(_ref4) {
|
|
22
|
+
var _states$sideNav$widt, _states$sideNav, _states$chatPanel$wi, _states$chatPanel;
|
|
23
|
+
var viewportWidth = _ref4.viewportWidth,
|
|
24
|
+
_ref4$layoutWidth = _ref4.layoutWidth,
|
|
25
|
+
layoutWidth = _ref4$layoutWidth === void 0 ? viewportWidth : _ref4$layoutWidth,
|
|
26
|
+
isChatPanelOverlay = _ref4.isChatPanelOverlay,
|
|
27
|
+
isSideNavOverlay = _ref4.isSideNavOverlay,
|
|
28
|
+
_ref4$occupiedWidth = _ref4.occupiedWidth,
|
|
29
|
+
occupiedWidth = _ref4$occupiedWidth === void 0 ? 0 : _ref4$occupiedWidth,
|
|
30
|
+
mainMinWidthBound = _ref4.mainMinWidth,
|
|
31
|
+
areas = _ref4.areas,
|
|
32
|
+
resizeSession = _ref4.resizeSession;
|
|
33
|
+
var mainMinWidth = resolveLayoutWidth(mainMinWidthBound, viewportWidth);
|
|
34
|
+
var availableWidth = Math.max(0, layoutWidth - occupiedWidth);
|
|
35
|
+
var sideNav = areas['side-nav'];
|
|
36
|
+
var panel = areas.panel;
|
|
37
|
+
var chatPanel = areas['chat-panel'];
|
|
38
|
+
var sideNavMinWidth = sideNav ? resolveLayoutWidth(sideNav.minWidth, viewportWidth) : 0;
|
|
39
|
+
var panelMinWidth = panel ? resolveLayoutWidth(panel.minWidth, viewportWidth) : 0;
|
|
40
|
+
var chatPanelMinWidth = chatPanel ? resolveLayoutWidth(chatPanel.minWidth, viewportWidth) : 0;
|
|
41
|
+
var isSideNavOpenInline = Boolean((sideNav === null || sideNav === void 0 ? void 0 : sideNav.isOpen) && !isSideNavOverlay && availableWidth >= mainMinWidth + sideNavMinWidth);
|
|
42
|
+
var isChatPanelOpenInline = Boolean((chatPanel === null || chatPanel === void 0 ? void 0 : chatPanel.isOpen) && !isChatPanelOverlay && availableWidth >= mainMinWidth + chatPanelMinWidth + (isSideNavOpenInline ? sideNavMinWidth : 0));
|
|
43
|
+
var isPanelInline = Boolean((panel === null || panel === void 0 ? void 0 : panel.isOpen) && availableWidth >= mainMinWidth + panelMinWidth + (isChatPanelOpenInline ? chatPanelMinWidth : 0) + (isSideNavOpenInline ? sideNavMinWidth : 0));
|
|
44
|
+
var inlineAreas = [isSideNavOpenInline && 'side-nav', isPanelInline && 'panel', isChatPanelOpenInline && 'chat-panel'].filter(function (area) {
|
|
45
|
+
return Boolean(area);
|
|
46
|
+
});
|
|
47
|
+
var widths = new Map();
|
|
48
|
+
var minimums = new Map();
|
|
49
|
+
var _iterator = _createForOfIteratorHelper(inlineAreas),
|
|
50
|
+
_step;
|
|
51
|
+
try {
|
|
52
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
53
|
+
var areaName = _step.value;
|
|
54
|
+
var area = areas[areaName];
|
|
55
|
+
if (!area) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
var min = resolveLayoutWidth(area.minWidth, viewportWidth);
|
|
59
|
+
var max = area.maxWidth ? resolveLayoutWidth(area.maxWidth, viewportWidth) : Number.POSITIVE_INFINITY;
|
|
60
|
+
var baselineWidth = resizeSession === null || resizeSession === void 0 ? void 0 : resizeSession.baselineWidths[areaName];
|
|
61
|
+
var requestedTarget = resizeSession && areaName !== resizeSession.area && baselineWidth !== undefined ? baselineWidth : getTargetWidth(area, isSideNavOverlay);
|
|
62
|
+
var target = clampTargetWidth({
|
|
63
|
+
target: requestedTarget,
|
|
64
|
+
min: min,
|
|
65
|
+
max: max
|
|
66
|
+
});
|
|
67
|
+
minimums.set(areaName, min);
|
|
68
|
+
widths.set(areaName, target);
|
|
69
|
+
}
|
|
70
|
+
} catch (err) {
|
|
71
|
+
_iterator.e(err);
|
|
72
|
+
} finally {
|
|
73
|
+
_iterator.f();
|
|
74
|
+
}
|
|
75
|
+
var overflow = Math.max(0, Array.from(widths.values()).reduce(function (total, width) {
|
|
76
|
+
return total + width;
|
|
77
|
+
}, 0) - (availableWidth - mainMinWidth));
|
|
78
|
+
var compressionOrder = ['panel', 'chat-panel', 'side-nav'];
|
|
79
|
+
// User resizing consumes only Main's spare width. Viewport changes clear the
|
|
80
|
+
// snapshot and retain the normal automatic compression order.
|
|
81
|
+
var shrinkOrder = resizeSession ? [resizeSession.area] : compressionOrder;
|
|
82
|
+
var _iterator2 = _createForOfIteratorHelper(shrinkOrder),
|
|
83
|
+
_step2;
|
|
84
|
+
try {
|
|
85
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
86
|
+
var _widths$get, _minimums$get;
|
|
87
|
+
var _areaName = _step2.value;
|
|
88
|
+
if (overflow <= 0) {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
var width = (_widths$get = widths.get(_areaName)) !== null && _widths$get !== void 0 ? _widths$get : 0;
|
|
92
|
+
var _min = (_minimums$get = minimums.get(_areaName)) !== null && _minimums$get !== void 0 ? _minimums$get : 0;
|
|
93
|
+
var reduction = Math.min(overflow, Math.max(0, width - _min));
|
|
94
|
+
widths.set(_areaName, width - reduction);
|
|
95
|
+
overflow -= reduction;
|
|
96
|
+
}
|
|
97
|
+
} catch (err) {
|
|
98
|
+
_iterator2.e(err);
|
|
99
|
+
} finally {
|
|
100
|
+
_iterator2.f();
|
|
101
|
+
}
|
|
102
|
+
var totalInlineWidth = Array.from(widths.values()).reduce(function (total, width) {
|
|
103
|
+
return total + width;
|
|
104
|
+
}, 0);
|
|
105
|
+
var states = {};
|
|
106
|
+
var _iterator3 = _createForOfIteratorHelper(inlineAreas),
|
|
107
|
+
_step3;
|
|
108
|
+
try {
|
|
109
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
110
|
+
var _widths$get2, _minimums$get2, _areas$_areaName;
|
|
111
|
+
var _areaName2 = _step3.value;
|
|
112
|
+
var _width = (_widths$get2 = widths.get(_areaName2)) !== null && _widths$get2 !== void 0 ? _widths$get2 : 0;
|
|
113
|
+
var _min2 = (_minimums$get2 = minimums.get(_areaName2)) !== null && _minimums$get2 !== void 0 ? _minimums$get2 : 0;
|
|
114
|
+
var maxWidth = (_areas$_areaName = areas[_areaName2]) === null || _areas$_areaName === void 0 ? void 0 : _areas$_areaName.maxWidth;
|
|
115
|
+
var configuredMax = maxWidth !== undefined ? resolveLayoutWidth(maxWidth, viewportWidth) : Number.POSITIVE_INFINITY;
|
|
116
|
+
states[_areaName2] = {
|
|
117
|
+
mode: 'inline',
|
|
118
|
+
width: _width,
|
|
119
|
+
minWidth: _min2,
|
|
120
|
+
resizeBounds: {
|
|
121
|
+
min: _min2,
|
|
122
|
+
max: Math.max(_min2, Math.min(configuredMax, availableWidth - mainMinWidth - totalInlineWidth + _width))
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
} catch (err) {
|
|
127
|
+
_iterator3.e(err);
|
|
128
|
+
} finally {
|
|
129
|
+
_iterator3.f();
|
|
130
|
+
}
|
|
131
|
+
var inlineSideNavWidth = (_states$sideNav$widt = (_states$sideNav = states['side-nav']) === null || _states$sideNav === void 0 ? void 0 : _states$sideNav.width) !== null && _states$sideNav$widt !== void 0 ? _states$sideNav$widt : 0;
|
|
132
|
+
var inlineChatPanelWidth = (_states$chatPanel$wi = (_states$chatPanel = states['chat-panel']) === null || _states$chatPanel === void 0 ? void 0 : _states$chatPanel.width) !== null && _states$chatPanel$wi !== void 0 ? _states$chatPanel$wi : 0;
|
|
133
|
+
var mainAreaWidth = Math.max(0, availableWidth - inlineSideNavWidth - inlineChatPanelWidth);
|
|
134
|
+
var _iterator4 = _createForOfIteratorHelper(['side-nav', 'panel', 'chat-panel']),
|
|
135
|
+
_step4;
|
|
136
|
+
try {
|
|
137
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
138
|
+
var _states$_areaName;
|
|
139
|
+
var _areaName3 = _step4.value;
|
|
140
|
+
var _area = areas[_areaName3];
|
|
141
|
+
if (!(_area !== null && _area !== void 0 && _area.isOpen) || ((_states$_areaName = states[_areaName3]) === null || _states$_areaName === void 0 ? void 0 : _states$_areaName.mode) === 'inline') {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
var _min3 = resolveLayoutWidth(_area.minWidth, viewportWidth);
|
|
145
|
+
var _configuredMax = _area.maxWidth ? resolveLayoutWidth(_area.maxWidth, viewportWidth) : Number.POSITIVE_INFINITY;
|
|
146
|
+
// Chat covers Root; SideNav and the local panel overlay Main's grid track.
|
|
147
|
+
// Occupied tracks and inline chat are not part of that covered region.
|
|
148
|
+
var layoutMax = (_areaName3 === 'chat-panel' ? layoutWidth : mainAreaWidth) * 0.9;
|
|
149
|
+
var _max = Math.max(0, Math.min(_configuredMax, layoutMax));
|
|
150
|
+
var effectiveMin = Math.min(_min3, _max);
|
|
151
|
+
var _target = getOverlayTargetWidth(_area, isSideNavOverlay);
|
|
152
|
+
var _width2 = clampTargetWidth({
|
|
153
|
+
target: _target,
|
|
154
|
+
min: effectiveMin,
|
|
155
|
+
max: _max
|
|
156
|
+
});
|
|
157
|
+
states[_areaName3] = {
|
|
158
|
+
mode: 'overlay',
|
|
159
|
+
width: _width2,
|
|
160
|
+
minWidth: effectiveMin,
|
|
161
|
+
resizeBounds: {
|
|
162
|
+
min: effectiveMin,
|
|
163
|
+
max: _max
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
} catch (err) {
|
|
168
|
+
_iterator4.e(err);
|
|
169
|
+
} finally {
|
|
170
|
+
_iterator4.f();
|
|
171
|
+
}
|
|
172
|
+
return states;
|
|
173
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
._12xt1ym0._12xt1ym0{grid-area:chat-panel}
|
|
2
|
+
._12xtquub._12xtquub{grid-area:2/1/-1/-1}
|
|
3
|
+
._nd5lquub{grid-area:2/1/-1/-1}
|
|
4
|
+
._191wglyw{border-inline-start:none}
|
|
5
|
+
._i8luglyw._i8luglyw{border-inline-start:none}
|
|
6
|
+
._i8luia51._i8luia51{border-inline-start:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}._10fph9n0{justify-self:end}
|
|
7
|
+
._152t1nws{inset-block-start:var(--n_bnrM,0)}
|
|
8
|
+
._16hg1bhr._16hg1bhr{background-color:var(--ds-surface-overlay,#fff)}
|
|
9
|
+
._16hgvuon._16hgvuon{background-color:var(--ds-surface,#fff)}
|
|
10
|
+
._16qs130s{box-shadow:var(--ds-shadow-overlay,0 8px 9pt #1e1f2126,0 0 1px #1e1f214f)}
|
|
11
|
+
._18m91wug{overflow-y:auto}
|
|
12
|
+
._1bsb1ky5{width:var(--n_cPnlRsz,var(--n_cPnlOverlayW))}
|
|
13
|
+
._1pbyqfx8{z-index:5}
|
|
14
|
+
._1reo1wug{overflow-x:auto}
|
|
15
|
+
._4t3i1osq{height:100%}
|
|
16
|
+
._4t3i56xv{height:calc(100vh - var(--n_bnrM, 0px))}
|
|
17
|
+
._bfhk1bhr{background-color:var(--ds-surface-overlay,#fff)}
|
|
18
|
+
._kqsw1if8{position:sticky}
|
|
19
|
+
._p12f1osq{max-width:100%}
|
|
20
|
+
._qo371wug._qo371wug{z-index:auto}
|
|
21
|
+
._qo37qfx8._qo37qfx8{z-index:5}
|
|
22
|
+
._so1e130s._so1e130s{box-shadow:var(--ds-shadow-overlay,0 8px 9pt #1e1f2126,0 0 1px #1e1f214f)}
|
|
23
|
+
._so1eglyw._so1eglyw{box-shadow:none}
|
|
24
|
+
._vchhusvi{box-sizing:border-box}
|
|
25
|
+
._w1ap1ky5._w1ap1ky5{width:var(--n_cPnlRsz,var(--n_cPnlOverlayW))}
|
|
26
|
+
._w1ap8rg1._w1ap8rg1{width:var(--n_cPnlRsz,var(--n_cPnlW))}
|
|
27
|
+
@media (min-width:40rem){._19dmia51{border-inline-start:var(--ds-border-width,1px) solid var(--ds-border,#0b120e24)}._1ao7glyw{box-shadow:none}._qhdr1ym0{grid-area:chat-panel}._m5h51wug{z-index:auto}._1ttbvuon{background-color:var(--ds-surface,#fff)}._1mxh8rg1{width:var(--n_cPnlRsz,var(--n_cPnlW))}}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/* chat-panel.tsx generated by @compiled/babel-plugin v3.0.2 */
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
|
+
import "./chat-panel.compiled.css";
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
7
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
8
|
+
import { bind } from 'bind-event-listener';
|
|
9
|
+
import { fg } from '@atlaskit/platform-feature-flags/fg';
|
|
10
|
+
import { useSkipLinkInternal } from '../../context/skip-links/use-skip-link-internal';
|
|
11
|
+
import { chatPanelLiveWidthVar, chatPanelVar, localSlotLayers, mainMinimumWidthVar } from './constants';
|
|
12
|
+
import { convertResizeBoundToPixels } from './panel-splitter/convert-resize-bound-to-pixels';
|
|
13
|
+
import { PanelSplitterProvider } from './panel-splitter/provider';
|
|
14
|
+
import { resolveLayoutWidth } from './resolve-layout-width';
|
|
15
|
+
import { gridRootId } from './root';
|
|
16
|
+
import { useLayoutAreaSizing } from './use-layout-area-sizing';
|
|
17
|
+
import { useLayoutId } from './use-layout-id';
|
|
18
|
+
import { useResizingWidthCssVarOnRootElement } from './use-resizing-width-css-var-on-root-element';
|
|
19
|
+
import { useSafeDefaultWidth } from './use-safe-default-width';
|
|
20
|
+
var chatPanelPanelSplitterId = Symbol('ChatPanel PanelSplitter');
|
|
21
|
+
var panelSplitterResizingVar = '--n_cPnlRsz';
|
|
22
|
+
var chatPanelOverlayWidthVar = '--n_cPnlOverlayW';
|
|
23
|
+
var fallbackDefaultWidth = 400;
|
|
24
|
+
var fallbackCompactDefaultWidth = 320;
|
|
25
|
+
var fallbackMinWidth = '320px';
|
|
26
|
+
var inlineMediaQuery = '(min-width: 40rem)';
|
|
27
|
+
function getPixelCustomProperty(element, propertyName, fallback) {
|
|
28
|
+
var raw = getComputedStyle(element).getPropertyValue(propertyName).trim();
|
|
29
|
+
var value = Number.parseFloat(raw);
|
|
30
|
+
return Number.isFinite(value) ? resolveLayoutWidth(raw.endsWith('vw') ? "".concat(value, "vw") : value, window.innerWidth) : fallback;
|
|
31
|
+
}
|
|
32
|
+
var styles = {
|
|
33
|
+
root: "_nd5lquub _10fph9n0 _vchhusvi _p12f1osq _1pbyqfx8 _4t3i56xv _kqsw1if8 _152t1nws _bfhk1bhr _1bsb1ky5 _qhdr1ym0 _m5h51wug _1ttbvuon _1mxh8rg1",
|
|
34
|
+
managedInline: "_12xt1ym0 _qo371wug _16hgvuon _w1ap8rg1",
|
|
35
|
+
managedOverlay: "_12xtquub _qo37qfx8 _16hg1bhr _w1ap1ky5",
|
|
36
|
+
scrollContainer: "_1reo1wug _18m91wug _4t3i1osq",
|
|
37
|
+
border: "_191wglyw _16qs130s _19dmia51 _1ao7glyw",
|
|
38
|
+
managedInlineBorder: "_i8luia51 _so1eglyw",
|
|
39
|
+
managedOverlayBorder: "_i8luglyw _so1e130s"
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The ChatPanel layout area is rendered below the banner and to the right (inline end) of the app.
|
|
44
|
+
*
|
|
45
|
+
* Below 40rem it overlays the app. At 40rem and above it is rendered as the final
|
|
46
|
+
* full-height column in the page layout grid.
|
|
47
|
+
*
|
|
48
|
+
* You can optionally render a `PanelSplitter` as a child to make the chat panel resizable.
|
|
49
|
+
*/
|
|
50
|
+
export function ChatPanel(_ref) {
|
|
51
|
+
var _managedSizing$mode, _managedSizing$width;
|
|
52
|
+
var children = _ref.children,
|
|
53
|
+
defaultWidthProp = _ref.defaultWidth,
|
|
54
|
+
_ref$minWidth = _ref.minWidth,
|
|
55
|
+
minWidth = _ref$minWidth === void 0 ? fallbackMinWidth : _ref$minWidth,
|
|
56
|
+
maxWidth = _ref.maxWidth,
|
|
57
|
+
_ref$label = _ref.label,
|
|
58
|
+
label = _ref$label === void 0 ? 'Chat panel' : _ref$label,
|
|
59
|
+
_ref$skipLinkLabel = _ref.skipLinkLabel,
|
|
60
|
+
skipLinkLabel = _ref$skipLinkLabel === void 0 ? label : _ref$skipLinkLabel,
|
|
61
|
+
testId = _ref.testId,
|
|
62
|
+
providedId = _ref.id,
|
|
63
|
+
xcss = _ref.xcss,
|
|
64
|
+
_ref$hasBorder = _ref.hasBorder,
|
|
65
|
+
hasBorder = _ref$hasBorder === void 0 ? true : _ref$hasBorder,
|
|
66
|
+
onClose = _ref.onClose;
|
|
67
|
+
var id = useLayoutId({
|
|
68
|
+
providedId: providedId
|
|
69
|
+
});
|
|
70
|
+
var defaultWidth = useSafeDefaultWidth({
|
|
71
|
+
defaultWidthProp: defaultWidthProp !== null && defaultWidthProp !== void 0 ? defaultWidthProp : fallbackDefaultWidth,
|
|
72
|
+
fallbackDefaultWidth: fallbackDefaultWidth,
|
|
73
|
+
slotName: 'ChatPanel'
|
|
74
|
+
});
|
|
75
|
+
var compactDefaultWidth = defaultWidthProp === undefined ? fallbackCompactDefaultWidth : defaultWidth;
|
|
76
|
+
useSkipLinkInternal({
|
|
77
|
+
id: id,
|
|
78
|
+
label: skipLinkLabel,
|
|
79
|
+
isHidden: defaultWidth === 0 || fg('platform_dst_nav4_skip_link_a11y_1')
|
|
80
|
+
});
|
|
81
|
+
var ref = useRef(null);
|
|
82
|
+
var _useState = useState(defaultWidth),
|
|
83
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
84
|
+
inlineWidth = _useState2[0],
|
|
85
|
+
setInlineWidth = _useState2[1];
|
|
86
|
+
var _useState3 = useState(compactDefaultWidth),
|
|
87
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
88
|
+
overlayWidth = _useState4[0],
|
|
89
|
+
setOverlayWidth = _useState4[1];
|
|
90
|
+
var _useState5 = useState(false),
|
|
91
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
92
|
+
isInline = _useState6[0],
|
|
93
|
+
setIsInline = _useState6[1];
|
|
94
|
+
var _useLayoutAreaSizing = useLayoutAreaSizing({
|
|
95
|
+
area: 'chat-panel',
|
|
96
|
+
config: {
|
|
97
|
+
defaultWidth: defaultWidth,
|
|
98
|
+
compactDefaultWidth: compactDefaultWidth,
|
|
99
|
+
minWidth: minWidth,
|
|
100
|
+
maxWidth: maxWidth,
|
|
101
|
+
isOpen: true,
|
|
102
|
+
onRequestClose: onClose
|
|
103
|
+
}
|
|
104
|
+
}),
|
|
105
|
+
managedSizing = _useLayoutAreaSizing.state,
|
|
106
|
+
getManagedResizeBounds = _useLayoutAreaSizing.getResizeBounds,
|
|
107
|
+
startResize = _useLayoutAreaSizing.startResize,
|
|
108
|
+
resize = _useLayoutAreaSizing.resize,
|
|
109
|
+
completeResize = _useLayoutAreaSizing.completeResize;
|
|
110
|
+
useEffect(function () {
|
|
111
|
+
var mediaQuery = window.matchMedia(inlineMediaQuery);
|
|
112
|
+
setIsInline(mediaQuery.matches);
|
|
113
|
+
var onChange = function onChange(event) {
|
|
114
|
+
setIsInline(event.matches);
|
|
115
|
+
};
|
|
116
|
+
return bind(mediaQuery, {
|
|
117
|
+
type: 'change',
|
|
118
|
+
listener: onChange
|
|
119
|
+
});
|
|
120
|
+
}, []);
|
|
121
|
+
var mode = (_managedSizing$mode = managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.mode) !== null && _managedSizing$mode !== void 0 ? _managedSizing$mode : isInline ? 'inline' : 'overlay';
|
|
122
|
+
var renderedWidth = (_managedSizing$width = managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.width) !== null && _managedSizing$width !== void 0 ? _managedSizing$width : mode === 'inline' ? inlineWidth : overlayWidth;
|
|
123
|
+
useResizingWidthCssVarOnRootElement({
|
|
124
|
+
isEnabled: !managedSizing,
|
|
125
|
+
cssVar: panelSplitterResizingVar,
|
|
126
|
+
panelId: chatPanelPanelSplitterId
|
|
127
|
+
});
|
|
128
|
+
var getResizeBounds = useCallback(function () {
|
|
129
|
+
var managedBounds = getManagedResizeBounds();
|
|
130
|
+
if (managedBounds) {
|
|
131
|
+
return managedBounds;
|
|
132
|
+
}
|
|
133
|
+
var chatPanel = ref.current;
|
|
134
|
+
var layoutRoot = chatPanel === null || chatPanel === void 0 ? void 0 : chatPanel.parentElement;
|
|
135
|
+
var main = layoutRoot === null || layoutRoot === void 0 ? void 0 : layoutRoot.querySelector(':scope > [data-layout-slot][role="main"]');
|
|
136
|
+
if (!chatPanel || !main || getComputedStyle(chatPanel).gridArea !== 'chat-panel') {
|
|
137
|
+
return {
|
|
138
|
+
min: minWidth,
|
|
139
|
+
max: maxWidth !== null && maxWidth !== void 0 ? maxWidth : '90vw'
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
var chatPanelWidth = chatPanel.getBoundingClientRect().width;
|
|
143
|
+
var mainWidth = main.getBoundingClientRect().width;
|
|
144
|
+
if (chatPanelWidth === 0 || mainWidth === 0) {
|
|
145
|
+
return {
|
|
146
|
+
min: minWidth,
|
|
147
|
+
max: maxWidth !== null && maxWidth !== void 0 ? maxWidth : '90vw'
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
var localPanel = main.querySelector('[data-layout-with-panel-slot]');
|
|
151
|
+
var isLocalPanelInline = localPanel && getComputedStyle(localPanel).gridArea === 'panel';
|
|
152
|
+
var localPanelWidth = isLocalPanelInline ? localPanel.getBoundingClientRect().width : 0;
|
|
153
|
+
var mainMinimumWidth = getPixelCustomProperty(main, mainMinimumWidthVar, 320);
|
|
154
|
+
var mainContentWidth = mainWidth - localPanelWidth;
|
|
155
|
+
var availableWidth = Math.max(0, mainContentWidth - mainMinimumWidth);
|
|
156
|
+
var availableInlineWidth = Math.floor(chatPanelWidth + availableWidth);
|
|
157
|
+
var constrainedMaxWidth = maxWidth ? Math.min(convertResizeBoundToPixels(maxWidth), availableInlineWidth) : availableInlineWidth;
|
|
158
|
+
return {
|
|
159
|
+
min: minWidth,
|
|
160
|
+
max: "".concat(Math.max(convertResizeBoundToPixels(minWidth), constrainedMaxWidth), "px")
|
|
161
|
+
};
|
|
162
|
+
}, [getManagedResizeBounds, maxWidth, minWidth]);
|
|
163
|
+
var configuredMaxWidth = maxWidth !== null && maxWidth !== void 0 ? maxWidth : '100vw';
|
|
164
|
+
var chatPanelVariableWidth = managedSizing ? "".concat(renderedWidth, "px") : "clamp(".concat(minWidth, ", ").concat(inlineWidth, "px, ").concat(configuredMaxWidth, ")");
|
|
165
|
+
var chatPanelOverlayVariableWidth = managedSizing ? "".concat(renderedWidth, "px") : "clamp(".concat(minWidth, ", ").concat(overlayWidth, "px, min(90vw, ").concat(configuredMaxWidth, "))");
|
|
166
|
+
var onCompleteResize = useCallback(function (finalWidth) {
|
|
167
|
+
if (mode === 'inline') {
|
|
168
|
+
setInlineWidth(finalWidth);
|
|
169
|
+
} else {
|
|
170
|
+
setOverlayWidth(finalWidth);
|
|
171
|
+
}
|
|
172
|
+
completeResize(mode, finalWidth);
|
|
173
|
+
}, [completeResize, mode]);
|
|
174
|
+
var onResizeStartInternal = useCallback(function () {
|
|
175
|
+
startResize(mode);
|
|
176
|
+
}, [mode, startResize]);
|
|
177
|
+
var onResizeInternal = useCallback(function (width) {
|
|
178
|
+
return resize(mode, width);
|
|
179
|
+
}, [mode, resize]);
|
|
180
|
+
return /*#__PURE__*/React.createElement("section", {
|
|
181
|
+
id: id,
|
|
182
|
+
"data-layout-slot": true,
|
|
183
|
+
"aria-label": label,
|
|
184
|
+
className: ax([styles.root, hasBorder && styles.border, (managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.mode) === 'inline' && styles.managedInline, (managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.mode) === 'overlay' && styles.managedOverlay, hasBorder && (managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.mode) === 'inline' && styles.managedInlineBorder, hasBorder && (managedSizing === null || managedSizing === void 0 ? void 0 : managedSizing.mode) === 'overlay' && styles.managedOverlayBorder, xcss]),
|
|
185
|
+
style: _defineProperty(_defineProperty({}, chatPanelVar, chatPanelVariableWidth), chatPanelOverlayWidthVar, chatPanelOverlayVariableWidth),
|
|
186
|
+
"data-testid": testId,
|
|
187
|
+
"data-layout-chat-panel": "",
|
|
188
|
+
ref: ref
|
|
189
|
+
},
|
|
190
|
+
/*#__PURE__*/
|
|
191
|
+
// Hoist the committed or actively resizing inline width so SideNav can yield
|
|
192
|
+
// space to ChatPanel without allowing the page layout to overflow.
|
|
193
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-global-styles
|
|
194
|
+
React.createElement("style", null, "\n#".concat(gridRootId, " { ").concat(chatPanelLiveWidthVar, ": var(").concat(panelSplitterResizingVar, ", ").concat(chatPanelVariableWidth, "); }\n")), /*#__PURE__*/React.createElement(PanelSplitterProvider, {
|
|
195
|
+
panelId: chatPanelPanelSplitterId,
|
|
196
|
+
panelRef: ref,
|
|
197
|
+
panelWidth: renderedWidth,
|
|
198
|
+
onCompleteResize: onCompleteResize,
|
|
199
|
+
onResizeStartInternal: managedSizing ? onResizeStartInternal : undefined,
|
|
200
|
+
onResizeInternal: managedSizing ? onResizeInternal : undefined,
|
|
201
|
+
getResizeBounds: getResizeBounds,
|
|
202
|
+
resizingCssVar: panelSplitterResizingVar,
|
|
203
|
+
position: "start"
|
|
204
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
205
|
+
className: ax([styles.scrollContainer])
|
|
206
|
+
}, children)));
|
|
207
|
+
}
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
export var sideNavVar = '--n_sNvw';
|
|
9
9
|
export var asideVar = '--n_asDw';
|
|
10
10
|
export var panelVar = '--n_pnlW';
|
|
11
|
+
export var chatPanelVar = '--n_cPnlW';
|
|
12
|
+
export var chatPanelLiveWidthVar = '--n_cPnlLw';
|
|
13
|
+
export var mainMinimumWidthVar = '--n_mainMinW';
|
|
11
14
|
export var bannerMountedVar = '--n_bnrM';
|
|
12
15
|
export var topNavMountedVar = '--n_tNvM';
|
|
13
16
|
export var ribbonVar = '--n_rbnW';
|
|
@@ -53,6 +56,8 @@ export var UNSAFE_MAIN_INLINE_END_FOR_LEGACY_PAGES_ONLY = "calc(var(".concat(UNS
|
|
|
53
56
|
*/
|
|
54
57
|
// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
|
|
55
58
|
export var localSlotLayers = {
|
|
59
|
+
// Chat overlays the app, including TopNav and SideNav, below the banner.
|
|
60
|
+
chatPanelOverlay: 5,
|
|
56
61
|
ribbon: 4,
|
|
57
62
|
// The side nav panel splitter is layered above the top nav when FHS is enabled.
|
|
58
63
|
// It has the same z-index value, but is rendered after the top nav in the DOM so is stacked above.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Effective sibling widths held fixed during and after a user resize, until the
|
|
5
|
+
* layout dimensions or configuration change. This is not a resize history.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export var LayoutAreaSizingContext = /*#__PURE__*/createContext(null);
|