@atlaskit/page-layout 1.0.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +3 -3
  3. package/__perf__/utils/perf-example.tsx +27 -18
  4. package/__perf__/utils/product-integration/Create.tsx +5 -1
  5. package/__perf__/utils/product-integration/NotificationsPopup.tsx +6 -5
  6. package/__perf__/utils/product-integration/SampleFooter.tsx +14 -13
  7. package/dist/cjs/common/constants.js +1 -1
  8. package/dist/cjs/common/hooks/index.js +23 -0
  9. package/dist/cjs/common/hooks/use-is-sidebar-collapsing.js +46 -0
  10. package/dist/cjs/common/hooks/use-is-sidebar-dragging.js +46 -0
  11. package/dist/cjs/common/utils.js +3 -3
  12. package/dist/cjs/components/index.js +22 -22
  13. package/dist/cjs/components/resize-control/grab-area.js +43 -5
  14. package/dist/cjs/components/resize-control/index.js +24 -22
  15. package/dist/cjs/components/resize-control/resize-button.js +61 -5
  16. package/dist/cjs/components/resize-control/shadow.js +48 -0
  17. package/dist/cjs/components/skip-links/index.js +4 -4
  18. package/dist/cjs/components/skip-links/skip-link-components.js +53 -9
  19. package/dist/cjs/components/slots/banner.js +27 -11
  20. package/dist/cjs/components/slots/content.js +9 -2
  21. package/dist/cjs/components/slots/internal/left-sidebar-inner.js +65 -0
  22. package/dist/cjs/components/slots/internal/left-sidebar-outer.js +100 -0
  23. package/dist/cjs/components/slots/internal/resizable-children-wrapper.js +63 -0
  24. package/dist/cjs/components/slots/internal/slot-focus-ring.js +61 -0
  25. package/dist/cjs/components/slots/left-panel.js +26 -11
  26. package/dist/cjs/components/slots/left-sidebar-without-resize.js +10 -10
  27. package/dist/cjs/components/slots/left-sidebar.js +23 -18
  28. package/dist/cjs/components/slots/main.js +53 -6
  29. package/dist/cjs/components/slots/page-layout.js +10 -3
  30. package/dist/cjs/components/slots/right-panel.js +26 -11
  31. package/dist/cjs/components/slots/right-sidebar.js +57 -13
  32. package/dist/cjs/components/slots/top-navigation.js +27 -11
  33. package/dist/cjs/controllers/index.js +14 -14
  34. package/dist/cjs/controllers/sidebar-resize-context.js +8 -5
  35. package/dist/cjs/controllers/sidebar-resize-controller.js +10 -5
  36. package/dist/cjs/controllers/skip-link-context.js +1 -1
  37. package/dist/cjs/index.js +34 -34
  38. package/dist/cjs/version.json +1 -1
  39. package/dist/es2019/common/hooks/index.js +2 -0
  40. package/dist/es2019/common/hooks/use-is-sidebar-collapsing.js +29 -0
  41. package/dist/es2019/common/hooks/use-is-sidebar-dragging.js +29 -0
  42. package/dist/es2019/components/resize-control/grab-area.js +46 -4
  43. package/dist/es2019/components/resize-control/index.js +12 -9
  44. package/dist/es2019/components/resize-control/resize-button.js +61 -4
  45. package/dist/es2019/components/resize-control/shadow.js +43 -0
  46. package/dist/es2019/components/skip-links/skip-link-components.js +47 -5
  47. package/dist/es2019/components/slots/banner.js +21 -7
  48. package/dist/es2019/components/slots/content.js +8 -2
  49. package/dist/es2019/components/slots/internal/left-sidebar-inner.js +52 -0
  50. package/dist/es2019/components/slots/internal/left-sidebar-outer.js +79 -0
  51. package/dist/es2019/components/slots/internal/resizable-children-wrapper.js +49 -0
  52. package/dist/es2019/components/slots/internal/slot-focus-ring.js +50 -0
  53. package/dist/es2019/components/slots/left-panel.js +20 -7
  54. package/dist/es2019/components/slots/left-sidebar-without-resize.js +10 -11
  55. package/dist/es2019/components/slots/left-sidebar.js +20 -17
  56. package/dist/es2019/components/slots/main.js +46 -6
  57. package/dist/es2019/components/slots/page-layout.js +15 -3
  58. package/dist/es2019/components/slots/right-panel.js +20 -7
  59. package/dist/es2019/components/slots/right-sidebar.js +50 -8
  60. package/dist/es2019/components/slots/top-navigation.js +21 -7
  61. package/dist/es2019/controllers/sidebar-resize-context.js +2 -1
  62. package/dist/es2019/controllers/sidebar-resize-controller.js +10 -5
  63. package/dist/es2019/version.json +1 -1
  64. package/dist/esm/common/hooks/index.js +2 -0
  65. package/dist/esm/common/hooks/use-is-sidebar-collapsing.js +34 -0
  66. package/dist/esm/common/hooks/use-is-sidebar-dragging.js +34 -0
  67. package/dist/esm/common/utils.js +2 -2
  68. package/dist/esm/components/resize-control/grab-area.js +44 -5
  69. package/dist/esm/components/resize-control/index.js +25 -22
  70. package/dist/esm/components/resize-control/resize-button.js +59 -5
  71. package/dist/esm/components/resize-control/shadow.js +37 -0
  72. package/dist/esm/components/skip-links/skip-link-components.js +49 -7
  73. package/dist/esm/components/slots/banner.js +27 -12
  74. package/dist/esm/components/slots/content.js +8 -2
  75. package/dist/esm/components/slots/internal/left-sidebar-inner.js +53 -0
  76. package/dist/esm/components/slots/internal/left-sidebar-outer.js +82 -0
  77. package/dist/esm/components/slots/internal/resizable-children-wrapper.js +51 -0
  78. package/dist/esm/components/slots/internal/slot-focus-ring.js +51 -0
  79. package/dist/esm/components/slots/left-panel.js +26 -12
  80. package/dist/esm/components/slots/left-sidebar-without-resize.js +10 -10
  81. package/dist/esm/components/slots/left-sidebar.js +22 -18
  82. package/dist/esm/components/slots/main.js +49 -8
  83. package/dist/esm/components/slots/page-layout.js +12 -3
  84. package/dist/esm/components/slots/right-panel.js +26 -12
  85. package/dist/esm/components/slots/right-sidebar.js +57 -14
  86. package/dist/esm/components/slots/top-navigation.js +27 -12
  87. package/dist/esm/controllers/sidebar-resize-context.js +6 -4
  88. package/dist/esm/controllers/sidebar-resize-controller.js +10 -5
  89. package/dist/esm/version.json +1 -1
  90. package/dist/types/common/hooks/index.d.ts +2 -0
  91. package/dist/types/common/hooks/use-is-sidebar-collapsing.d.ts +2 -0
  92. package/dist/types/common/hooks/use-is-sidebar-dragging.d.ts +2 -0
  93. package/dist/types/components/resize-control/index.d.ts +1 -0
  94. package/dist/types/components/resize-control/resize-button.d.ts +1 -0
  95. package/dist/types/components/resize-control/shadow.d.ts +6 -0
  96. package/dist/types/components/slots/banner.d.ts +1 -0
  97. package/dist/types/components/slots/internal/left-sidebar-inner.d.ts +9 -0
  98. package/dist/types/components/slots/internal/left-sidebar-outer.d.ts +13 -0
  99. package/dist/types/components/slots/internal/resizable-children-wrapper.d.ts +10 -0
  100. package/dist/types/components/slots/internal/slot-focus-ring.d.ts +19 -0
  101. package/dist/types/components/slots/left-panel.d.ts +1 -0
  102. package/dist/types/components/slots/left-sidebar-without-resize.d.ts +1 -0
  103. package/dist/types/components/slots/left-sidebar.d.ts +1 -0
  104. package/dist/types/components/slots/main.d.ts +1 -0
  105. package/dist/types/components/slots/page-layout.d.ts +1 -0
  106. package/dist/types/components/slots/right-panel.d.ts +1 -0
  107. package/dist/types/components/slots/right-sidebar.d.ts +1 -0
  108. package/dist/types/components/slots/slot-dimensions.d.ts +1 -0
  109. package/dist/types/components/slots/top-navigation.d.ts +1 -0
  110. package/dist/types/controllers/sidebar-resize-context.d.ts +1 -0
  111. package/package.json +25 -20
  112. package/dist/cjs/components/resize-control/styles.js +0 -156
  113. package/dist/cjs/components/skip-links/styles.js +0 -58
  114. package/dist/cjs/components/slots/left-sidebar-styles.js +0 -116
  115. package/dist/cjs/components/slots/styles.js +0 -154
  116. package/dist/es2019/components/resize-control/styles.js +0 -136
  117. package/dist/es2019/components/skip-links/styles.js +0 -41
  118. package/dist/es2019/components/slots/left-sidebar-styles.js +0 -96
  119. package/dist/es2019/components/slots/styles.js +0 -130
  120. package/dist/esm/components/resize-control/styles.js +0 -131
  121. package/dist/esm/components/skip-links/styles.js +0 -45
  122. package/dist/esm/components/slots/left-sidebar-styles.js +0 -94
  123. package/dist/esm/components/slots/styles.js +0 -117
  124. package/dist/types/components/resize-control/styles.d.ts +0 -41
  125. package/dist/types/components/skip-links/styles.d.ts +0 -2
  126. package/dist/types/components/slots/left-sidebar-styles.d.ts +0 -5
  127. package/dist/types/components/slots/styles.d.ts +0 -23
@@ -21,11 +21,22 @@ var _utils = require("../../common/utils");
21
21
 
22
22
  var _controllers = require("../../controllers");
23
23
 
24
- var _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
24
+ var _slotFocusRing = _interopRequireDefault(require("./internal/slot-focus-ring"));
25
25
 
26
- var _styles = require("./styles");
26
+ var _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
27
27
 
28
28
  /** @jsx jsx */
29
+ var leftPanelStyles = (0, _core.css)({
30
+ gridArea: _constants.LEFT_PANEL
31
+ });
32
+ var leftPanelFixedStyles = (0, _core.css)({
33
+ width: _constants.LEFT_PANEL_WIDTH,
34
+ position: 'fixed',
35
+ top: 0,
36
+ bottom: 0,
37
+ left: 0
38
+ });
39
+
29
40
  var LeftPanel = function LeftPanel(props) {
30
41
  var children = props.children,
31
42
  isFixed = props.isFixed,
@@ -40,17 +51,21 @@ var LeftPanel = function LeftPanel(props) {
40
51
  (0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_LEFT_PANEL_WIDTH, leftPanelWidth));
41
52
  return function () {
42
53
  (0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_LEFT_PANEL_WIDTH, 0));
43
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
54
+ };
44
55
  }, [leftPanelWidth]);
45
56
  (0, _controllers.useSkipLink)(id, skipLinkTitle);
46
- return (0, _core.jsx)("div", (0, _extends2.default)({
47
- css: (0, _styles.leftPanelStyles)(isFixed),
48
- "data-testid": testId,
49
- id: id
50
- }, (0, _utils.getPageLayoutSlotSelector)('left-panel')), (0, _core.jsx)(_slotDimensions.default, {
51
- variableName: _constants.VAR_LEFT_PANEL_WIDTH,
52
- value: leftPanelWidth
53
- }), children);
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: [leftPanelStyles, isFixed && leftPanelFixedStyles],
61
+ className: className,
62
+ "data-testid": testId,
63
+ id: id
64
+ }, (0, _utils.getPageLayoutSlotSelector)('left-panel')), (0, _core.jsx)(_slotDimensions.default, {
65
+ variableName: _constants.VAR_LEFT_PANEL_WIDTH,
66
+ value: leftPanelWidth
67
+ }), children);
68
+ });
54
69
  };
55
70
 
56
71
  var _default = LeftPanel;
@@ -7,8 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
 
10
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
-
12
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
11
 
14
12
  var _react = require("react");
@@ -21,7 +19,9 @@ var _utils = require("../../common/utils");
21
19
 
22
20
  var _controllers = require("../../controllers");
23
21
 
24
- var _leftSidebarStyles = require("./left-sidebar-styles");
22
+ var _leftSidebarInner = _interopRequireDefault(require("./internal/left-sidebar-inner"));
23
+
24
+ var _leftSidebarOuter = _interopRequireDefault(require("./internal/left-sidebar-outer"));
25
25
 
26
26
  var _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
27
27
 
@@ -39,18 +39,18 @@ var LeftSidebarWithoutResize = function LeftSidebarWithoutResize(props) {
39
39
  (0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_LEFT_SIDEBAR_WIDTH, leftSidebarWidth));
40
40
  return function () {
41
41
  (0, _controllers.publishGridState)((0, _defineProperty2.default)({}, _constants.VAR_LEFT_SIDEBAR_WIDTH, 0));
42
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
42
+ };
43
43
  }, [leftSidebarWidth]);
44
44
  (0, _controllers.useSkipLink)(id, skipLinkTitle);
45
- return (0, _core.jsx)("div", (0, _extends2.default)({
45
+ return (0, _core.jsx)(_leftSidebarOuter.default, {
46
46
  id: id,
47
- "data-testid": testId,
48
- css: (0, _leftSidebarStyles.leftSidebarStyles)(isFixed)
49
- }, (0, _utils.getPageLayoutSlotSelector)('left-sidebar')), (0, _core.jsx)(_slotDimensions.default, {
47
+ testId: testId,
48
+ isFixed: isFixed
49
+ }, (0, _core.jsx)(_slotDimensions.default, {
50
50
  variableName: _constants.VAR_LEFT_SIDEBAR_WIDTH,
51
51
  value: leftSidebarWidth
52
- }), (0, _core.jsx)("div", {
53
- css: (0, _leftSidebarStyles.fixedLeftSidebarInnerStyles)(isFixed)
52
+ }), (0, _core.jsx)(_leftSidebarInner.default, {
53
+ isFixed: isFixed
54
54
  }, children));
55
55
  };
56
56
 
@@ -7,8 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
 
10
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
-
12
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
11
 
14
12
  var _react = require("react");
@@ -23,13 +21,17 @@ var _controllers = require("../../controllers");
23
21
 
24
22
  var _resizeControl = _interopRequireDefault(require("../resize-control"));
25
23
 
26
- var _leftSidebarStyles = require("./left-sidebar-styles");
24
+ var _leftSidebarInner = _interopRequireDefault(require("./internal/left-sidebar-inner"));
25
+
26
+ var _leftSidebarOuter = _interopRequireDefault(require("./internal/left-sidebar-outer"));
27
+
28
+ var _resizableChildrenWrapper = _interopRequireDefault(require("./internal/resizable-children-wrapper"));
27
29
 
28
30
  var _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
29
31
 
30
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
32
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
31
33
 
32
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
34
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
33
35
 
34
36
  var LeftSidebar = function LeftSidebar(props) {
35
37
  var children = props.children,
@@ -131,7 +133,8 @@ var LeftSidebar = function LeftSidebar(props) {
131
133
  isLeftSidebarCollapsed: cachedCollapsedState,
132
134
  leftSidebarWidth: leftSidebarWidth,
133
135
  lastLeftSidebarWidth: lastLeftSidebarWidth,
134
- flyoutLockCount: 0
136
+ flyoutLockCount: 0,
137
+ isFixed: isFixed
135
138
  }); // eslint-disable-next-line react-hooks/exhaustive-deps
136
139
  }, []); // Every time other than mount,
137
140
  // update the local storage and css variables.
@@ -226,23 +229,25 @@ var LeftSidebar = function LeftSidebar(props) {
226
229
  };
227
230
 
228
231
  return (// eslint-disable-next-line jsx-a11y/mouse-events-have-key-events
229
- (0, _core.jsx)("div", (0, _extends2.default)({
232
+ (0, _core.jsx)(_leftSidebarOuter.default, {
230
233
  ref: leftSideBarRef,
231
- css: (0, _leftSidebarStyles.leftSidebarStyles)(isFixed, isFlyoutOpen),
232
- "data-testid": testId,
234
+ testId: testId,
233
235
  onMouseOver: onMouseOver,
234
236
  onMouseLeave: onMouseLeave,
235
- id: id
236
- }, (0, _utils.getPageLayoutSlotSelector)('left-sidebar')), (0, _core.jsx)(_slotDimensions.default, {
237
+ id: id,
238
+ isFixed: isFixed,
239
+ isFlyoutOpen: isFlyoutOpen
240
+ }, (0, _core.jsx)(_slotDimensions.default, {
237
241
  variableName: _constants.VAR_LEFT_SIDEBAR_WIDTH,
238
242
  value: notFirstRun.current ? leftSidebarWidth : leftSidebarWidthOnMount
239
- }), (0, _core.jsx)("div", {
240
- css: (0, _leftSidebarStyles.fixedLeftSidebarInnerStyles)(isFixed, isFlyoutOpen)
241
- }, (0, _core.jsx)("div", {
242
- css: (0, _leftSidebarStyles.resizeableChildrenWrapperStyle)(isFlyoutOpen, isLeftSidebarCollapsed, !notFirstRun.current && collapsedState === 'collapsed')
243
- }, (0, _core.jsx)("div", {
244
- css: _leftSidebarStyles.fixedChildrenWrapperStyle
245
- }, children)), (0, _core.jsx)(_resizeControl.default, {
243
+ }), (0, _core.jsx)(_leftSidebarInner.default, {
244
+ isFixed: isFixed,
245
+ isFlyoutOpen: isFlyoutOpen
246
+ }, (0, _core.jsx)(_resizableChildrenWrapper.default, {
247
+ isFlyoutOpen: isFlyoutOpen,
248
+ isLeftSidebarCollapsed: isLeftSidebarCollapsed,
249
+ hasCollapsedState: !notFirstRun.current && collapsedState === 'collapsed'
250
+ }, children), (0, _core.jsx)(_resizeControl.default, {
246
251
  testId: testId,
247
252
  resizeGrabAreaLabel: resizeGrabAreaLabel,
248
253
  resizeButtonLabel: resizeButtonLabel,
@@ -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 _styles = require("./styles");
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
- return (0, _core.jsx)("div", (0, _extends2.default)({
28
- "data-testid": testId,
29
- css: _styles.mainStyles,
30
- id: id
31
- }, (0, _utils.getPageLayoutSlotSelector)('main')), children);
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: _styles.gridStyles,
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 _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
24
+ var _slotFocusRing = _interopRequireDefault(require("./internal/slot-focus-ring"));
25
25
 
26
- var _styles = require("./styles");
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
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
54
+ };
44
55
  }, [rightPanelWidth]);
45
56
  (0, _controllers.useSkipLink)(id, skipLinkTitle);
46
- return (0, _core.jsx)("div", (0, _extends2.default)({
47
- css: (0, _styles.rightPanelStyles)(isFixed),
48
- "data-testid": testId,
49
- id: id
50
- }, (0, _utils.getPageLayoutSlotSelector)('right-panel')), (0, _core.jsx)(_slotDimensions.default, {
51
- variableName: _constants.VAR_RIGHT_PANEL_WIDTH,
52
- value: rightPanelWidth
53
- }), children);
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 _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
24
+ var _slotFocusRing = _interopRequireDefault(require("./internal/slot-focus-ring"));
25
25
 
26
- var _styles = require("./styles");
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
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
81
+ };
44
82
  }, [rightSidebarWidth, id]);
45
83
  (0, _controllers.useSkipLink)(id, skipLinkTitle);
46
- return (0, _core.jsx)("div", (0, _extends2.default)({
47
- "data-testid": testId,
48
- css: (0, _styles.rightSidebarStyles)(isFixed),
49
- id: id
50
- }, (0, _utils.getPageLayoutSlotSelector)('right-sidebar')), (0, _core.jsx)(_slotDimensions.default, {
51
- variableName: _constants.VAR_RIGHT_SIDEBAR_WIDTH,
52
- value: rightSidebarWidth
53
- }), (0, _core.jsx)("div", {
54
- css: (0, _styles.fixedRightSidebarInnerStyles)(isFixed)
55
- }, children));
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 _slotDimensions = _interopRequireDefault(require("./slot-dimensions"));
24
+ var _slotFocusRing = _interopRequireDefault(require("./internal/slot-focus-ring"));
25
25
 
26
- var _styles = require("./styles");
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
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
56
+ };
45
57
  }, [topNavigationHeight]);
46
58
  (0, _controllers.useSkipLink)(id, skipLinkTitle);
47
- return (0, _core.jsx)("div", (0, _extends2.default)({
48
- css: (0, _styles.topNavigationStyles)(isFixed),
49
- "data-testid": testId,
50
- id: id
51
- }, (0, _utils.getPageLayoutSlotSelector)('top-navigation')), (0, _core.jsx)(_slotDimensions.default, {
52
- variableName: _constants.VAR_TOP_NAVIGATION_HEIGHT,
53
- value: topNavigationHeight
54
- }), children);
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;
@@ -5,40 +5,40 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- Object.defineProperty(exports, "publishGridState", {
8
+ Object.defineProperty(exports, "SidebarResizeContext", {
9
9
  enumerable: true,
10
10
  get: function get() {
11
- return _usePageLayoutGrid.default;
11
+ return _sidebarResizeContext.SidebarResizeContext;
12
12
  }
13
13
  });
14
- Object.defineProperty(exports, "SidebarResizeContext", {
14
+ Object.defineProperty(exports, "SidebarResizeController", {
15
15
  enumerable: true,
16
16
  get: function get() {
17
- return _sidebarResizeContext.SidebarResizeContext;
17
+ return _sidebarResizeController.SidebarResizeController;
18
18
  }
19
19
  });
20
- Object.defineProperty(exports, "usePageLayoutResize", {
20
+ Object.defineProperty(exports, "SkipLinksController", {
21
21
  enumerable: true,
22
22
  get: function get() {
23
- return _sidebarResizeContext.usePageLayoutResize;
23
+ return _skipLinkController.SkipLinksController;
24
24
  }
25
25
  });
26
- Object.defineProperty(exports, "useLeftSidebarFlyoutLock", {
26
+ Object.defineProperty(exports, "publishGridState", {
27
27
  enumerable: true,
28
28
  get: function get() {
29
- return _sidebarResizeContext.useLeftSidebarFlyoutLock;
29
+ return _usePageLayoutGrid.default;
30
30
  }
31
31
  });
32
- Object.defineProperty(exports, "SidebarResizeController", {
32
+ Object.defineProperty(exports, "useLeftSidebarFlyoutLock", {
33
33
  enumerable: true,
34
34
  get: function get() {
35
- return _sidebarResizeController.SidebarResizeController;
35
+ return _sidebarResizeContext.useLeftSidebarFlyoutLock;
36
36
  }
37
37
  });
38
- Object.defineProperty(exports, "useSkipLinks", {
38
+ Object.defineProperty(exports, "usePageLayoutResize", {
39
39
  enumerable: true,
40
40
  get: function get() {
41
- return _skipLinkContext.useSkipLinks;
41
+ return _sidebarResizeContext.usePageLayoutResize;
42
42
  }
43
43
  });
44
44
  Object.defineProperty(exports, "useSkipLink", {
@@ -47,10 +47,10 @@ Object.defineProperty(exports, "useSkipLink", {
47
47
  return _skipLinkContext.useSkipLink;
48
48
  }
49
49
  });
50
- Object.defineProperty(exports, "SkipLinksController", {
50
+ Object.defineProperty(exports, "useSkipLinks", {
51
51
  enumerable: true,
52
52
  get: function get() {
53
- return _skipLinkController.SkipLinksController;
53
+ return _skipLinkContext.useSkipLinks;
54
54
  }
55
55
  });
56
56
 
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.useLeftSidebarFlyoutLock = exports.usePageLayoutResize = exports.SidebarResizeContext = void 0;
8
+ exports.usePageLayoutResize = exports.useLeftSidebarFlyoutLock = exports.SidebarResizeContext = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
@@ -13,9 +13,11 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
13
13
 
14
14
  var _react = require("react");
15
15
 
16
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
16
+ var _excluded = ["setLeftSidebarState"];
17
17
 
18
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
18
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
19
+
20
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
21
 
20
22
  var noop = function noop() {};
21
23
 
@@ -25,7 +27,8 @@ var leftSidebarState = {
25
27
  isLeftSidebarCollapsed: false,
26
28
  leftSidebarWidth: 0,
27
29
  lastLeftSidebarWidth: 0,
28
- flyoutLockCount: 0
30
+ flyoutLockCount: 0,
31
+ isFixed: true
29
32
  };
30
33
  var SidebarResizeContext = /*#__PURE__*/(0, _react.createContext)({
31
34
  isLeftSidebarCollapsed: false,
@@ -39,7 +42,7 @@ exports.SidebarResizeContext = SidebarResizeContext;
39
42
  var usePageLayoutResize = function usePageLayoutResize() {
40
43
  var _useContext = (0, _react.useContext)(SidebarResizeContext),
41
44
  setLeftSidebarState = _useContext.setLeftSidebarState,
42
- context = (0, _objectWithoutProperties2.default)(_useContext, ["setLeftSidebarState"]);
45
+ context = (0, _objectWithoutProperties2.default)(_useContext, _excluded);
43
46
 
44
47
  return context;
45
48
  };
@@ -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