@atlaskit/page-layout 1.0.7 → 1.2.1
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 +30 -0
- package/README.md +3 -3
- package/__perf__/utils/perf-example.tsx +27 -18
- package/__perf__/utils/product-integration/Create.tsx +5 -1
- package/__perf__/utils/product-integration/NotificationsPopup.tsx +6 -5
- package/__perf__/utils/product-integration/SampleFooter.tsx +14 -13
- package/dist/cjs/common/hooks/index.js +23 -0
- package/dist/cjs/common/hooks/use-is-sidebar-collapsing.js +46 -0
- package/dist/cjs/common/hooks/use-is-sidebar-dragging.js +46 -0
- package/dist/cjs/components/resize-control/grab-area.js +42 -4
- package/dist/cjs/components/resize-control/index.js +22 -20
- package/dist/cjs/components/resize-control/resize-button.js +59 -4
- package/dist/cjs/components/resize-control/shadow.js +48 -0
- package/dist/cjs/components/skip-links/skip-link-components.js +49 -5
- package/dist/cjs/components/slots/banner.js +27 -11
- package/dist/cjs/components/slots/content.js +9 -2
- package/dist/cjs/components/slots/internal/left-sidebar-inner.js +65 -0
- package/dist/cjs/components/slots/internal/left-sidebar-outer.js +100 -0
- package/dist/cjs/components/slots/internal/resizable-children-wrapper.js +63 -0
- package/dist/cjs/components/slots/internal/slot-focus-ring.js +61 -0
- package/dist/cjs/components/slots/left-panel.js +26 -11
- package/dist/cjs/components/slots/left-sidebar-without-resize.js +10 -10
- package/dist/cjs/components/slots/left-sidebar.js +21 -16
- package/dist/cjs/components/slots/main.js +53 -6
- package/dist/cjs/components/slots/page-layout.js +10 -3
- package/dist/cjs/components/slots/right-panel.js +26 -11
- package/dist/cjs/components/slots/right-sidebar.js +57 -13
- package/dist/cjs/components/slots/top-navigation.js +27 -11
- package/dist/cjs/controllers/sidebar-resize-context.js +2 -1
- package/dist/cjs/controllers/sidebar-resize-controller.js +10 -5
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/common/hooks/index.js +2 -0
- package/dist/es2019/common/hooks/use-is-sidebar-collapsing.js +29 -0
- package/dist/es2019/common/hooks/use-is-sidebar-dragging.js +29 -0
- package/dist/es2019/components/resize-control/grab-area.js +46 -4
- package/dist/es2019/components/resize-control/index.js +12 -9
- package/dist/es2019/components/resize-control/resize-button.js +61 -4
- package/dist/es2019/components/resize-control/shadow.js +43 -0
- package/dist/es2019/components/skip-links/skip-link-components.js +47 -5
- package/dist/es2019/components/slots/banner.js +21 -7
- package/dist/es2019/components/slots/content.js +8 -2
- package/dist/es2019/components/slots/internal/left-sidebar-inner.js +52 -0
- package/dist/es2019/components/slots/internal/left-sidebar-outer.js +79 -0
- package/dist/es2019/components/slots/internal/resizable-children-wrapper.js +49 -0
- package/dist/es2019/components/slots/internal/slot-focus-ring.js +50 -0
- package/dist/es2019/components/slots/left-panel.js +20 -7
- package/dist/es2019/components/slots/left-sidebar-without-resize.js +10 -11
- package/dist/es2019/components/slots/left-sidebar.js +20 -17
- package/dist/es2019/components/slots/main.js +46 -6
- package/dist/es2019/components/slots/page-layout.js +15 -3
- package/dist/es2019/components/slots/right-panel.js +20 -7
- package/dist/es2019/components/slots/right-sidebar.js +50 -8
- package/dist/es2019/components/slots/top-navigation.js +21 -7
- package/dist/es2019/controllers/sidebar-resize-context.js +2 -1
- package/dist/es2019/controllers/sidebar-resize-controller.js +10 -5
- package/dist/es2019/version.json +1 -1
- package/dist/esm/common/hooks/index.js +2 -0
- package/dist/esm/common/hooks/use-is-sidebar-collapsing.js +34 -0
- package/dist/esm/common/hooks/use-is-sidebar-dragging.js +34 -0
- package/dist/esm/components/resize-control/grab-area.js +42 -4
- package/dist/esm/components/resize-control/index.js +23 -20
- package/dist/esm/components/resize-control/resize-button.js +57 -4
- package/dist/esm/components/resize-control/shadow.js +37 -0
- package/dist/esm/components/skip-links/skip-link-components.js +47 -5
- package/dist/esm/components/slots/banner.js +27 -12
- package/dist/esm/components/slots/content.js +8 -2
- package/dist/esm/components/slots/internal/left-sidebar-inner.js +53 -0
- package/dist/esm/components/slots/internal/left-sidebar-outer.js +82 -0
- package/dist/esm/components/slots/internal/resizable-children-wrapper.js +51 -0
- package/dist/esm/components/slots/internal/slot-focus-ring.js +51 -0
- package/dist/esm/components/slots/left-panel.js +26 -12
- package/dist/esm/components/slots/left-sidebar-without-resize.js +10 -10
- package/dist/esm/components/slots/left-sidebar.js +20 -16
- package/dist/esm/components/slots/main.js +49 -8
- package/dist/esm/components/slots/page-layout.js +12 -3
- package/dist/esm/components/slots/right-panel.js +26 -12
- package/dist/esm/components/slots/right-sidebar.js +57 -14
- package/dist/esm/components/slots/top-navigation.js +27 -12
- package/dist/esm/controllers/sidebar-resize-context.js +2 -1
- package/dist/esm/controllers/sidebar-resize-controller.js +10 -5
- package/dist/esm/version.json +1 -1
- package/dist/types/common/hooks/index.d.ts +2 -0
- package/dist/types/common/hooks/use-is-sidebar-collapsing.d.ts +2 -0
- package/dist/types/common/hooks/use-is-sidebar-dragging.d.ts +2 -0
- package/dist/types/components/resize-control/shadow.d.ts +6 -0
- package/dist/types/components/slots/internal/left-sidebar-inner.d.ts +9 -0
- package/dist/types/components/slots/internal/left-sidebar-outer.d.ts +13 -0
- package/dist/types/components/slots/internal/resizable-children-wrapper.d.ts +10 -0
- package/dist/types/components/slots/internal/slot-focus-ring.d.ts +19 -0
- package/dist/types/controllers/sidebar-resize-context.d.ts +1 -0
- package/package.json +14 -9
- package/dist/cjs/components/resize-control/styles.js +0 -156
- package/dist/cjs/components/skip-links/styles.js +0 -58
- package/dist/cjs/components/slots/left-sidebar-styles.js +0 -116
- package/dist/cjs/components/slots/styles.js +0 -154
- package/dist/es2019/components/resize-control/styles.js +0 -136
- package/dist/es2019/components/skip-links/styles.js +0 -41
- package/dist/es2019/components/slots/left-sidebar-styles.js +0 -96
- package/dist/es2019/components/slots/styles.js +0 -130
- package/dist/esm/components/resize-control/styles.js +0 -131
- package/dist/esm/components/skip-links/styles.js +0 -45
- package/dist/esm/components/slots/left-sidebar-styles.js +0 -94
- package/dist/esm/components/slots/styles.js +0 -117
- package/dist/types/components/resize-control/styles.d.ts +0 -41
- package/dist/types/components/skip-links/styles.d.ts +0 -2
- package/dist/types/components/slots/left-sidebar-styles.d.ts +0 -5
- package/dist/types/components/slots/styles.d.ts +0 -23
|
@@ -9,26 +9,73 @@ exports.default = void 0;
|
|
|
9
9
|
|
|
10
10
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
11
11
|
|
|
12
|
+
var _react = require("react");
|
|
13
|
+
|
|
12
14
|
var _core = require("@emotion/core");
|
|
13
15
|
|
|
16
|
+
var _accessibility = require("@atlaskit/motion/accessibility");
|
|
17
|
+
|
|
18
|
+
var _curves = require("@atlaskit/motion/curves");
|
|
19
|
+
|
|
20
|
+
var _constants = require("../../common/constants");
|
|
21
|
+
|
|
22
|
+
var _hooks = require("../../common/hooks");
|
|
23
|
+
|
|
14
24
|
var _utils = require("../../common/utils");
|
|
15
25
|
|
|
16
26
|
var _controllers = require("../../controllers");
|
|
17
27
|
|
|
18
|
-
var
|
|
28
|
+
var _slotFocusRing = _interopRequireDefault(require("./internal/slot-focus-ring"));
|
|
19
29
|
|
|
20
30
|
/** @jsx jsx */
|
|
31
|
+
// eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
|
|
32
|
+
var prefersReducedMotionStyles = (0, _core.css)((0, _accessibility.prefersReducedMotion)());
|
|
33
|
+
var mainStyles = (0, _core.css)({
|
|
34
|
+
minWidth: 0,
|
|
35
|
+
marginLeft: 0,
|
|
36
|
+
// Prevent flex container from blowing up when there's super wide content.
|
|
37
|
+
flexGrow: 1,
|
|
38
|
+
// Transition negative margin on main in sync with the increase in width of leftSidebar.
|
|
39
|
+
transition: "margin-left ".concat(_constants.TRANSITION_DURATION, "ms ").concat(_curves.easeOut, " 0s")
|
|
40
|
+
});
|
|
41
|
+
var draggingStyles = (0, _core.css)({
|
|
42
|
+
cursor: 'ew-resize',
|
|
43
|
+
// Make sure drag to resize remains snappy.
|
|
44
|
+
transition: 'none'
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Adds a negative left margin to main,
|
|
48
|
+
* which transitions at the same speed as the left sidebar's width increase.
|
|
49
|
+
* This give an illusion that the flyout is appearing on top of the main content,
|
|
50
|
+
* while main remains in place.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
var flyoutStyles = (0, _core.css)({
|
|
54
|
+
marginLeft: "calc(-1 * var(--".concat(_constants.VAR_LEFT_SIDEBAR_FLYOUT, ", ").concat(_constants.DEFAULT_LEFT_SIDEBAR_FLYOUT_WIDTH, "px) + ").concat(_constants.COLLAPSED_LEFT_SIDEBAR_WIDTH, "px)")
|
|
55
|
+
});
|
|
56
|
+
|
|
21
57
|
var Main = function Main(props) {
|
|
22
58
|
var children = props.children,
|
|
23
59
|
testId = props.testId,
|
|
24
60
|
id = props.id,
|
|
25
61
|
skipLinkTitle = props.skipLinkTitle;
|
|
26
62
|
(0, _controllers.useSkipLink)(id, skipLinkTitle);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
63
|
+
var isDragging = (0, _hooks.useIsSidebarDragging)();
|
|
64
|
+
|
|
65
|
+
var _useContext = (0, _react.useContext)(_controllers.SidebarResizeContext),
|
|
66
|
+
_useContext$leftSideb = _useContext.leftSidebarState,
|
|
67
|
+
isFlyoutOpen = _useContext$leftSideb.isFlyoutOpen,
|
|
68
|
+
isFixed = _useContext$leftSideb.isFixed;
|
|
69
|
+
|
|
70
|
+
return (0, _core.jsx)(_slotFocusRing.default, null, function (_ref) {
|
|
71
|
+
var className = _ref.className;
|
|
72
|
+
return (0, _core.jsx)("div", (0, _extends2.default)({
|
|
73
|
+
"data-testid": testId,
|
|
74
|
+
css: [mainStyles, isDragging && draggingStyles, isFlyoutOpen && !isFixed && flyoutStyles, prefersReducedMotionStyles],
|
|
75
|
+
className: className,
|
|
76
|
+
id: id
|
|
77
|
+
}, (0, _utils.getPageLayoutSlotSelector)('main')), children);
|
|
78
|
+
});
|
|
32
79
|
};
|
|
33
80
|
|
|
34
81
|
var _default = Main;
|
|
@@ -21,10 +21,17 @@ var _controllers = require("../../controllers");
|
|
|
21
21
|
|
|
22
22
|
var _skipLinks = require("../skip-links");
|
|
23
23
|
|
|
24
|
-
var _styles = require("./styles");
|
|
25
|
-
|
|
26
24
|
/** @jsx jsx */
|
|
27
25
|
var pageLayoutSelector = (0, _defineProperty2.default)({}, _constants.PAGE_LAYOUT_CONTAINER_SELECTOR, true);
|
|
26
|
+
var gridTemplateAreas = "\n \"".concat(_constants.LEFT_PANEL, " ").concat(_constants.BANNER, " ").concat(_constants.RIGHT_PANEL, "\"\n \"").concat(_constants.LEFT_PANEL, " ").concat(_constants.TOP_NAVIGATION, " ").concat(_constants.RIGHT_PANEL, "\"\n \"").concat(_constants.LEFT_PANEL, " ").concat(_constants.CONTENT, " ").concat(_constants.RIGHT_PANEL, "\"\n ");
|
|
27
|
+
var gridStyles = (0, _core.css)({
|
|
28
|
+
display: 'grid',
|
|
29
|
+
height: '100%',
|
|
30
|
+
gridTemplateAreas: gridTemplateAreas,
|
|
31
|
+
gridTemplateColumns: "".concat(_constants.LEFT_PANEL_WIDTH, " minmax(0, 1fr) ").concat(_constants.RIGHT_PANEL_WIDTH),
|
|
32
|
+
gridTemplateRows: "".concat(_constants.BANNER_HEIGHT, " ").concat(_constants.TOP_NAVIGATION_HEIGHT, " auto"),
|
|
33
|
+
outline: 'none'
|
|
34
|
+
});
|
|
28
35
|
|
|
29
36
|
var PageLayout = function PageLayout(_ref) {
|
|
30
37
|
var _ref$skipLinksLabel = _ref.skipLinksLabel,
|
|
@@ -37,7 +44,7 @@ var PageLayout = function PageLayout(_ref) {
|
|
|
37
44
|
skipLinksLabel: skipLinksLabel
|
|
38
45
|
}), (0, _core.jsx)("div", (0, _extends2.default)({}, pageLayoutSelector, {
|
|
39
46
|
"data-testid": testId,
|
|
40
|
-
css:
|
|
47
|
+
css: gridStyles,
|
|
41
48
|
tabIndex: -1
|
|
42
49
|
}), (0, _core.jsx)(_controllers.SidebarResizeController, {
|
|
43
50
|
onLeftSidebarCollapse: onLeftSidebarCollapse,
|
|
@@ -21,11 +21,22 @@ var _utils = require("../../common/utils");
|
|
|
21
21
|
|
|
22
22
|
var _controllers = require("../../controllers");
|
|
23
23
|
|
|
24
|
-
var
|
|
24
|
+
var _slotFocusRing = _interopRequireDefault(require("./internal/slot-focus-ring"));
|
|
25
25
|
|
|
26
|
-
var
|
|
26
|
+
var _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
|
|
27
27
|
|
|
28
28
|
/** @jsx jsx */
|
|
29
|
+
var baseStyles = (0, _core.css)({
|
|
30
|
+
gridArea: _constants.RIGHT_PANEL
|
|
31
|
+
});
|
|
32
|
+
var fixedStyles = (0, _core.css)({
|
|
33
|
+
width: _constants.RIGHT_PANEL_WIDTH,
|
|
34
|
+
position: 'fixed',
|
|
35
|
+
top: 0,
|
|
36
|
+
right: 0,
|
|
37
|
+
bottom: 0
|
|
38
|
+
});
|
|
39
|
+
|
|
29
40
|
var RightPanel = function RightPanel(props) {
|
|
30
41
|
var children = props.children,
|
|
31
42
|
isFixed = props.isFixed,
|
|
@@ -40,17 +51,21 @@ var RightPanel = function RightPanel(props) {
|
|
|
40
51
|
(0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_RIGHT_PANEL_WIDTH, rightPanelWidth));
|
|
41
52
|
return function () {
|
|
42
53
|
(0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_RIGHT_PANEL_WIDTH, 0));
|
|
43
|
-
};
|
|
54
|
+
};
|
|
44
55
|
}, [rightPanelWidth]);
|
|
45
56
|
(0, _controllers.useSkipLink)(id, skipLinkTitle);
|
|
46
|
-
return (0, _core.jsx)(
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
return (0, _core.jsx)(_slotFocusRing.default, null, function (_ref) {
|
|
58
|
+
var className = _ref.className;
|
|
59
|
+
return (0, _core.jsx)("div", (0, _extends2.default)({
|
|
60
|
+
css: [baseStyles, isFixed && fixedStyles],
|
|
61
|
+
className: className,
|
|
62
|
+
"data-testid": testId,
|
|
63
|
+
id: id
|
|
64
|
+
}, (0, _utils.getPageLayoutSlotSelector)('right-panel')), (0, _core.jsx)(_slotDimensions.default, {
|
|
65
|
+
variableName: _constants.VAR_RIGHT_PANEL_WIDTH,
|
|
66
|
+
value: rightPanelWidth
|
|
67
|
+
}), children);
|
|
68
|
+
});
|
|
54
69
|
};
|
|
55
70
|
|
|
56
71
|
var _default = RightPanel;
|
|
@@ -21,11 +21,49 @@ var _utils = require("../../common/utils");
|
|
|
21
21
|
|
|
22
22
|
var _controllers = require("../../controllers");
|
|
23
23
|
|
|
24
|
-
var
|
|
24
|
+
var _slotFocusRing = _interopRequireDefault(require("./internal/slot-focus-ring"));
|
|
25
25
|
|
|
26
|
-
var
|
|
26
|
+
var _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
|
|
27
27
|
|
|
28
28
|
/** @jsx jsx */
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* This inner wrapper is required to allow the sidebar to be `position: fixed`.
|
|
32
|
+
*
|
|
33
|
+
* If we were to apply `position: fixed` to the outer wrapper, it will be popped
|
|
34
|
+
* out of its flex container and Main would stretch to occupy all the space.
|
|
35
|
+
*/
|
|
36
|
+
var fixedInnerStyles = (0, _core.css)({
|
|
37
|
+
/**
|
|
38
|
+
* This width on the inner wrapper is required when it is using fixed
|
|
39
|
+
* positioning. Otherwise its width is slightly off.
|
|
40
|
+
*/
|
|
41
|
+
width: _constants.RIGHT_SIDEBAR_WIDTH,
|
|
42
|
+
position: 'fixed',
|
|
43
|
+
top: "calc(".concat(_constants.BANNER_HEIGHT, " + ").concat(_constants.TOP_NAVIGATION_HEIGHT, ")"),
|
|
44
|
+
right: "calc(".concat(_constants.RIGHT_PANEL_WIDTH, ")"),
|
|
45
|
+
bottom: 0
|
|
46
|
+
});
|
|
47
|
+
var staticInnerStyles = (0, _core.css)({
|
|
48
|
+
height: '100%'
|
|
49
|
+
});
|
|
50
|
+
var outerStyles = (0, _core.css)({
|
|
51
|
+
width: _constants.RIGHT_SIDEBAR_WIDTH
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* In fixed mode this element's child is taken out of the document flow.
|
|
55
|
+
* It doesn't take up the width as expected,
|
|
56
|
+
* so the pseudo element forces it to take up the necessary width.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
var fixedOuterStyles = (0, _core.css)({
|
|
60
|
+
'&::after': {
|
|
61
|
+
display: 'inline-block',
|
|
62
|
+
width: _constants.RIGHT_SIDEBAR_WIDTH,
|
|
63
|
+
content: "''"
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
29
67
|
var RightSidebar = function RightSidebar(props) {
|
|
30
68
|
var children = props.children,
|
|
31
69
|
_props$width = props.width,
|
|
@@ -40,19 +78,25 @@ var RightSidebar = function RightSidebar(props) {
|
|
|
40
78
|
(0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_RIGHT_SIDEBAR_WIDTH, rightSidebarWidth));
|
|
41
79
|
return function () {
|
|
42
80
|
(0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_RIGHT_SIDEBAR_WIDTH, 0));
|
|
43
|
-
};
|
|
81
|
+
};
|
|
44
82
|
}, [rightSidebarWidth, id]);
|
|
45
83
|
(0, _controllers.useSkipLink)(id, skipLinkTitle);
|
|
46
|
-
return (0, _core.jsx)(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
84
|
+
return (0, _core.jsx)(_slotFocusRing.default, {
|
|
85
|
+
isSidebar: true
|
|
86
|
+
}, function (_ref) {
|
|
87
|
+
var className = _ref.className;
|
|
88
|
+
return (0, _core.jsx)("div", (0, _extends2.default)({
|
|
89
|
+
"data-testid": testId,
|
|
90
|
+
css: [outerStyles, isFixed && fixedOuterStyles],
|
|
91
|
+
className: className,
|
|
92
|
+
id: id
|
|
93
|
+
}, (0, _utils.getPageLayoutSlotSelector)('right-sidebar')), (0, _core.jsx)(_slotDimensions.default, {
|
|
94
|
+
variableName: _constants.VAR_RIGHT_SIDEBAR_WIDTH,
|
|
95
|
+
value: rightSidebarWidth
|
|
96
|
+
}), (0, _core.jsx)("div", {
|
|
97
|
+
css: [isFixed && fixedInnerStyles, !isFixed && staticInnerStyles]
|
|
98
|
+
}, children));
|
|
99
|
+
});
|
|
56
100
|
};
|
|
57
101
|
|
|
58
102
|
var _default = RightSidebar;
|
|
@@ -21,11 +21,23 @@ var _utils = require("../../common/utils");
|
|
|
21
21
|
|
|
22
22
|
var _controllers = require("../../controllers");
|
|
23
23
|
|
|
24
|
-
var
|
|
24
|
+
var _slotFocusRing = _interopRequireDefault(require("./internal/slot-focus-ring"));
|
|
25
25
|
|
|
26
|
-
var
|
|
26
|
+
var _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
|
|
27
27
|
|
|
28
28
|
/** @jsx jsx */
|
|
29
|
+
var topNavigationStyles = (0, _core.css)({
|
|
30
|
+
height: _constants.TOP_NAVIGATION_HEIGHT,
|
|
31
|
+
gridArea: _constants.TOP_NAVIGATION
|
|
32
|
+
});
|
|
33
|
+
var fixedStyles = (0, _core.css)({
|
|
34
|
+
position: 'fixed',
|
|
35
|
+
zIndex: 2,
|
|
36
|
+
top: _constants.BANNER_HEIGHT,
|
|
37
|
+
right: _constants.RIGHT_PANEL_WIDTH,
|
|
38
|
+
left: _constants.LEFT_PANEL_WIDTH
|
|
39
|
+
});
|
|
40
|
+
|
|
29
41
|
var TopNavigation = function TopNavigation(props) {
|
|
30
42
|
var children = props.children,
|
|
31
43
|
_props$height = props.height,
|
|
@@ -41,17 +53,21 @@ var TopNavigation = function TopNavigation(props) {
|
|
|
41
53
|
(0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_TOP_NAVIGATION_HEIGHT, topNavigationHeight));
|
|
42
54
|
return function () {
|
|
43
55
|
(0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_TOP_NAVIGATION_HEIGHT, 0));
|
|
44
|
-
};
|
|
56
|
+
};
|
|
45
57
|
}, [topNavigationHeight]);
|
|
46
58
|
(0, _controllers.useSkipLink)(id, skipLinkTitle);
|
|
47
|
-
return (0, _core.jsx)(
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
59
|
+
return (0, _core.jsx)(_slotFocusRing.default, null, function (_ref) {
|
|
60
|
+
var className = _ref.className;
|
|
61
|
+
return (0, _core.jsx)("div", (0, _extends2.default)({
|
|
62
|
+
css: [topNavigationStyles, isFixed && fixedStyles],
|
|
63
|
+
className: className,
|
|
64
|
+
"data-testid": testId,
|
|
65
|
+
id: id
|
|
66
|
+
}, (0, _utils.getPageLayoutSlotSelector)('top-navigation')), (0, _core.jsx)(_slotDimensions.default, {
|
|
67
|
+
variableName: _constants.VAR_TOP_NAVIGATION_HEIGHT,
|
|
68
|
+
value: topNavigationHeight
|
|
69
|
+
}), children);
|
|
70
|
+
});
|
|
55
71
|
};
|
|
56
72
|
|
|
57
73
|
var _default = TopNavigation;
|
|
@@ -27,7 +27,8 @@ var leftSidebarState = {
|
|
|
27
27
|
isLeftSidebarCollapsed: false,
|
|
28
28
|
leftSidebarWidth: 0,
|
|
29
29
|
lastLeftSidebarWidth: 0,
|
|
30
|
-
flyoutLockCount: 0
|
|
30
|
+
flyoutLockCount: 0,
|
|
31
|
+
isFixed: true
|
|
31
32
|
};
|
|
32
33
|
var SidebarResizeContext = /*#__PURE__*/(0, _react.createContext)({
|
|
33
34
|
isLeftSidebarCollapsed: false,
|
|
@@ -46,7 +46,8 @@ var SidebarResizeController = function SidebarResizeController(_ref) {
|
|
|
46
46
|
isLeftSidebarCollapsed: false,
|
|
47
47
|
leftSidebarWidth: 0,
|
|
48
48
|
lastLeftSidebarWidth: 0,
|
|
49
|
-
flyoutLockCount: 0
|
|
49
|
+
flyoutLockCount: 0,
|
|
50
|
+
isFixed: true
|
|
50
51
|
}),
|
|
51
52
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
52
53
|
leftSidebarState = _useState2[0],
|
|
@@ -74,7 +75,8 @@ var SidebarResizeController = function SidebarResizeController(_ref) {
|
|
|
74
75
|
var expandLeftSidebar = (0, _react.useCallback)(function () {
|
|
75
76
|
var lastLeftSidebarWidth = leftSidebarState.lastLeftSidebarWidth,
|
|
76
77
|
isResizing = leftSidebarState.isResizing,
|
|
77
|
-
flyoutLockCount = leftSidebarState.flyoutLockCount
|
|
78
|
+
flyoutLockCount = leftSidebarState.flyoutLockCount,
|
|
79
|
+
isFixed = leftSidebarState.isFixed;
|
|
78
80
|
|
|
79
81
|
if (isResizing) {
|
|
80
82
|
return;
|
|
@@ -87,7 +89,8 @@ var SidebarResizeController = function SidebarResizeController(_ref) {
|
|
|
87
89
|
leftSidebarWidth: width,
|
|
88
90
|
lastLeftSidebarWidth: lastLeftSidebarWidth,
|
|
89
91
|
isResizing: isResizing,
|
|
90
|
-
flyoutLockCount: flyoutLockCount
|
|
92
|
+
flyoutLockCount: flyoutLockCount,
|
|
93
|
+
isFixed: isFixed
|
|
91
94
|
};
|
|
92
95
|
setLeftSidebarState(updatedLeftSidebarState); // onTransitionEnd isn't triggered when a user prefers reduced motion
|
|
93
96
|
|
|
@@ -98,7 +101,8 @@ var SidebarResizeController = function SidebarResizeController(_ref) {
|
|
|
98
101
|
var collapseLeftSidebar = (0, _react.useCallback)(function (event, collapseWithoutTransition) {
|
|
99
102
|
var leftSidebarWidth = leftSidebarState.leftSidebarWidth,
|
|
100
103
|
isResizing = leftSidebarState.isResizing,
|
|
101
|
-
flyoutLockCount = leftSidebarState.flyoutLockCount
|
|
104
|
+
flyoutLockCount = leftSidebarState.flyoutLockCount,
|
|
105
|
+
isFixed = leftSidebarState.isFixed;
|
|
102
106
|
|
|
103
107
|
if (isResizing) {
|
|
104
108
|
return;
|
|
@@ -113,7 +117,8 @@ var SidebarResizeController = function SidebarResizeController(_ref) {
|
|
|
113
117
|
leftSidebarWidth: _constants.COLLAPSED_LEFT_SIDEBAR_WIDTH,
|
|
114
118
|
lastLeftSidebarWidth: leftSidebarWidth,
|
|
115
119
|
isResizing: isResizing,
|
|
116
|
-
flyoutLockCount: flyoutLockCount
|
|
120
|
+
flyoutLockCount: flyoutLockCount,
|
|
121
|
+
isFixed: isFixed
|
|
117
122
|
};
|
|
118
123
|
setLeftSidebarState(updatedLeftSidebarState); // onTransitionEnd isn't triggered when a user prefers reduced motion
|
|
119
124
|
|
package/dist/cjs/version.json
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { IS_SIDEBAR_COLLAPSING } from '../constants';
|
|
3
|
+
|
|
4
|
+
const getIsCollapsing = () => {
|
|
5
|
+
// SSR bail-out because document is undefined on the server
|
|
6
|
+
if (typeof document === 'undefined') {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return document.documentElement.getAttribute(IS_SIDEBAR_COLLAPSING) === 'true';
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const useIsSidebarCollapsing = () => {
|
|
14
|
+
const [isCollapsing, setIsCollapsing] = useState(getIsCollapsing);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const observer = new MutationObserver(() => {
|
|
17
|
+
setIsCollapsing(getIsCollapsing);
|
|
18
|
+
});
|
|
19
|
+
observer.observe(document.documentElement, {
|
|
20
|
+
attributeFilter: [IS_SIDEBAR_COLLAPSING]
|
|
21
|
+
});
|
|
22
|
+
return () => {
|
|
23
|
+
observer.disconnect();
|
|
24
|
+
};
|
|
25
|
+
}, []);
|
|
26
|
+
return isCollapsing;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default useIsSidebarCollapsing;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { IS_SIDEBAR_DRAGGING } from '../constants';
|
|
3
|
+
|
|
4
|
+
const getIsDragging = () => {
|
|
5
|
+
// SSR bail-out because document is undefined on the server
|
|
6
|
+
if (typeof document === 'undefined') {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return document.documentElement.getAttribute(IS_SIDEBAR_DRAGGING) === 'true';
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const useIsSidebarDragging = () => {
|
|
14
|
+
const [isDragging, setIsDragging] = useState(getIsDragging);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const observer = new MutationObserver(() => {
|
|
17
|
+
setIsDragging(getIsDragging);
|
|
18
|
+
});
|
|
19
|
+
observer.observe(document.documentElement, {
|
|
20
|
+
attributeFilter: [IS_SIDEBAR_DRAGGING]
|
|
21
|
+
});
|
|
22
|
+
return () => {
|
|
23
|
+
observer.disconnect();
|
|
24
|
+
};
|
|
25
|
+
}, []);
|
|
26
|
+
return isDragging;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default useIsSidebarDragging;
|
|
@@ -1,9 +1,51 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
2
|
|
|
3
3
|
/** @jsx jsx */
|
|
4
|
-
import { jsx } from '@emotion/core';
|
|
4
|
+
import { css, jsx } from '@emotion/core';
|
|
5
|
+
import { B100, B200 } from '@atlaskit/theme/colors';
|
|
5
6
|
import { GRAB_AREA_LINE_SELECTOR, GRAB_AREA_SELECTOR } from '../../common/constants';
|
|
6
|
-
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Determines the color of the grab line.
|
|
10
|
+
*
|
|
11
|
+
* Used on internal leaf node, so naming collisions won't matter.
|
|
12
|
+
*/
|
|
13
|
+
const varLineColor = '--ds-line';
|
|
14
|
+
const grabAreaStyles = css({
|
|
15
|
+
width: 24,
|
|
16
|
+
height: '100%',
|
|
17
|
+
padding: 0,
|
|
18
|
+
backgroundColor: 'transparent',
|
|
19
|
+
border: 0,
|
|
20
|
+
cursor: 'ew-resize',
|
|
21
|
+
'&::-moz-focus-inner': {
|
|
22
|
+
border: 0
|
|
23
|
+
},
|
|
24
|
+
':focus': {
|
|
25
|
+
outline: 0
|
|
26
|
+
},
|
|
27
|
+
':enabled': {
|
|
28
|
+
':hover': {
|
|
29
|
+
[varLineColor]: `var(--ds-border-selected, ${B100})`
|
|
30
|
+
},
|
|
31
|
+
':active, :focus': {
|
|
32
|
+
[varLineColor]: `var(--ds-border-selected, ${B200})`
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const grabAreaCollapsedStyles = css({
|
|
37
|
+
padding: 0,
|
|
38
|
+
backgroundColor: 'transparent',
|
|
39
|
+
border: 0,
|
|
40
|
+
cursor: 'default'
|
|
41
|
+
});
|
|
42
|
+
const lineStyles = css({
|
|
43
|
+
display: 'block',
|
|
44
|
+
width: 2,
|
|
45
|
+
height: '100%',
|
|
46
|
+
backgroundColor: `var(${varLineColor})`,
|
|
47
|
+
transition: 'background-color 200ms'
|
|
48
|
+
});
|
|
7
49
|
const grabAreaLineSelector = {
|
|
8
50
|
[GRAB_AREA_LINE_SELECTOR]: true
|
|
9
51
|
};
|
|
@@ -18,9 +60,9 @@ const GrabArea = ({
|
|
|
18
60
|
}) => jsx("button", _extends({}, grabAreaSelector, {
|
|
19
61
|
"data-testid": testId,
|
|
20
62
|
type: "button",
|
|
21
|
-
css:
|
|
63
|
+
css: [grabAreaStyles, isLeftSidebarCollapsed && grabAreaCollapsedStyles]
|
|
22
64
|
}, rest), jsx("span", _extends({
|
|
23
|
-
css:
|
|
65
|
+
css: lineStyles
|
|
24
66
|
}, grabAreaLineSelector)));
|
|
25
67
|
|
|
26
68
|
export default GrabArea;
|
|
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
|
|
|
2
2
|
|
|
3
3
|
/** @jsx jsx */
|
|
4
4
|
import { useCallback, useContext, useMemo, useRef, useState } from 'react';
|
|
5
|
-
import { jsx } from '@emotion/core';
|
|
5
|
+
import { css, jsx } from '@emotion/core';
|
|
6
6
|
import rafSchd from 'raf-schd';
|
|
7
7
|
import { COLLAPSED_LEFT_SIDEBAR_WIDTH, DEFAULT_LEFT_SIDEBAR_WIDTH, IS_SIDEBAR_DRAGGING, MIN_LEFT_SIDEBAR_DRAG_THRESHOLD, RESIZE_BUTTON_SELECTOR, RESIZE_CONTROL_SELECTOR, VAR_LEFT_SIDEBAR_WIDTH } from '../../common/constants';
|
|
8
8
|
import { getLeftPanelWidth, getLeftSidebarPercentage } from '../../common/utils';
|
|
@@ -11,16 +11,19 @@ import { SidebarResizeContext } from '../../controllers/sidebar-resize-context';
|
|
|
11
11
|
|
|
12
12
|
import GrabArea from './grab-area';
|
|
13
13
|
import ResizeButton from './resize-button';
|
|
14
|
-
import
|
|
14
|
+
import Shadow from './shadow';
|
|
15
15
|
const cssSelector = {
|
|
16
16
|
[RESIZE_CONTROL_SELECTOR]: true
|
|
17
17
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
const resizeControlStyles = css({
|
|
19
|
+
position: 'absolute',
|
|
20
|
+
top: 0,
|
|
21
|
+
bottom: 0,
|
|
22
|
+
left: '100%',
|
|
23
|
+
outline: 'none'
|
|
24
|
+
});
|
|
25
|
+
const showResizeButtonStyles = css({
|
|
26
|
+
'--ds--resize-button--opacity': 1
|
|
24
27
|
});
|
|
25
28
|
|
|
26
29
|
const ResizeControl = ({
|
|
@@ -236,7 +239,7 @@ const ResizeControl = ({
|
|
|
236
239
|
/* eslint-disable jsx-a11y/role-supports-aria-props */
|
|
237
240
|
|
|
238
241
|
return jsx("div", _extends({}, cssSelector, {
|
|
239
|
-
css:
|
|
242
|
+
css: [resizeControlStyles, (isGrabAreaFocused || isLeftSidebarCollapsed) && showResizeButtonStyles]
|
|
240
243
|
}), jsx(Shadow, {
|
|
241
244
|
testId: testId && `${testId}-shadow`
|
|
242
245
|
}), jsx(GrabArea, {
|
|
@@ -1,10 +1,67 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
2
|
|
|
3
3
|
/** @jsx jsx */
|
|
4
|
-
import { jsx } from '@emotion/core';
|
|
4
|
+
import { css, jsx } from '@emotion/core';
|
|
5
5
|
import ChevronRight from '@atlaskit/icon/glyph/chevron-right';
|
|
6
|
+
import { easeOut } from '@atlaskit/motion/curves';
|
|
7
|
+
import { mediumDurationMs, smallDurationMs } from '@atlaskit/motion/durations';
|
|
8
|
+
import { B100, B200, N0, N200, N30A } from '@atlaskit/theme/colors';
|
|
6
9
|
import { RESIZE_BUTTON_SELECTOR } from '../../common/constants';
|
|
7
|
-
|
|
10
|
+
const increaseHitAreaStyles = css({
|
|
11
|
+
position: 'absolute',
|
|
12
|
+
top: -8,
|
|
13
|
+
right: -12,
|
|
14
|
+
bottom: -8,
|
|
15
|
+
left: -8
|
|
16
|
+
});
|
|
17
|
+
const resizeIconButtonStyles = css({
|
|
18
|
+
width: 24,
|
|
19
|
+
height: 24,
|
|
20
|
+
padding: 0,
|
|
21
|
+
position: 'absolute',
|
|
22
|
+
top: 32,
|
|
23
|
+
left: 0,
|
|
24
|
+
backgroundColor: `var(--ds-surface-overlay, ${N0})`,
|
|
25
|
+
border: 0,
|
|
26
|
+
borderRadius: '50%',
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* TODO: https://product-fabric.atlassian.net/browse/DSP-3392
|
|
30
|
+
* This shadow needs further investigation,
|
|
31
|
+
* along with the hover and active background colors.
|
|
32
|
+
*/
|
|
33
|
+
// eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
|
|
34
|
+
boxShadow: `0 0 0 1px ${N30A}, 0 2px 4px 1px ${N30A}`,
|
|
35
|
+
color: `var(--ds-text-subtle, ${N200})`,
|
|
36
|
+
cursor: 'pointer',
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The fallback value of 0 ensures that the button is hidden by default,
|
|
40
|
+
* unless some parent (or the button itself) overrides it.
|
|
41
|
+
*/
|
|
42
|
+
opacity: `var(--ds--resize-button--opacity,0)`,
|
|
43
|
+
outline: 0,
|
|
44
|
+
transform: 'translateX(-50%)',
|
|
45
|
+
transition: `
|
|
46
|
+
background-color ${smallDurationMs}ms linear,
|
|
47
|
+
color ${smallDurationMs}ms linear,
|
|
48
|
+
opacity ${mediumDurationMs}ms ${easeOut}
|
|
49
|
+
`,
|
|
50
|
+
':hover': {
|
|
51
|
+
backgroundColor: `var(--ds-background-selected-bold, ${B100})`,
|
|
52
|
+
color: `var(--ds-text-inverse, ${N0})`,
|
|
53
|
+
opacity: 1
|
|
54
|
+
},
|
|
55
|
+
':active, :focus': {
|
|
56
|
+
backgroundColor: `var(--ds-background-selected-bold-hovered, ${B200})`,
|
|
57
|
+
color: `var(--ds-text-inverse, ${N0})`,
|
|
58
|
+
opacity: 1
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const resizeIconButtonExpandedStyles = css({
|
|
62
|
+
transform: 'rotate(180deg)',
|
|
63
|
+
transformOrigin: 7
|
|
64
|
+
});
|
|
8
65
|
|
|
9
66
|
const preventDefault = event => event.preventDefault();
|
|
10
67
|
|
|
@@ -22,7 +79,7 @@ const ResizeButton = ({
|
|
|
22
79
|
"aria-expanded": !isLeftSidebarCollapsed,
|
|
23
80
|
"aria-label": label,
|
|
24
81
|
type: "button",
|
|
25
|
-
css:
|
|
82
|
+
css: [resizeIconButtonStyles, !isLeftSidebarCollapsed && resizeIconButtonExpandedStyles],
|
|
26
83
|
"data-testid": testId // Prevents focus staying attached to the button
|
|
27
84
|
// when pressed
|
|
28
85
|
,
|
|
@@ -30,7 +87,7 @@ const ResizeButton = ({
|
|
|
30
87
|
}, props), jsx(ChevronRight, {
|
|
31
88
|
label: ""
|
|
32
89
|
}), jsx("div", {
|
|
33
|
-
css:
|
|
90
|
+
css: increaseHitAreaStyles
|
|
34
91
|
}));
|
|
35
92
|
|
|
36
93
|
export default ResizeButton;
|