@atlaskit/navigation-system 2.7.0 → 2.9.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 (163) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cjs/components/badge-container.js +1 -1
  3. package/dist/cjs/components/list-item.js +1 -1
  4. package/dist/cjs/components/list.js +1 -1
  5. package/dist/cjs/components/skip-links/skip-link.js +1 -1
  6. package/dist/cjs/components/skip-links/skip-links-container.js +1 -1
  7. package/dist/cjs/ui/menu-item/container-avatar.js +1 -1
  8. package/dist/cjs/ui/menu-item/drag-and-drop/drag-preview.js +1 -1
  9. package/dist/cjs/ui/menu-item/drag-and-drop/use-menu-item-drag-and-drop.js +1 -1
  10. package/dist/cjs/ui/menu-item/drag-handle.js +1 -1
  11. package/dist/cjs/ui/menu-item/expandable-menu-item/expandable-menu-item-content.js +1 -1
  12. package/dist/cjs/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.compiled.css +3 -5
  13. package/dist/cjs/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.js +1 -1
  14. package/dist/cjs/ui/menu-item/expandable-menu-item/expandable-menu-item.js +1 -1
  15. package/dist/cjs/ui/menu-item/flyout-menu-item/flyout-menu-item-content.js +1 -1
  16. package/dist/cjs/ui/menu-item/flyout-menu-item/flyout-menu-item-trigger.js +1 -1
  17. package/dist/cjs/ui/menu-item/link-menu-item.js +1 -1
  18. package/dist/cjs/ui/menu-item/menu-item.compiled.css +5 -10
  19. package/dist/cjs/ui/menu-item/menu-item.js +1 -1
  20. package/dist/cjs/ui/menu-item/top-level-spacer.js +1 -1
  21. package/dist/cjs/ui/menu-section/divider.compiled.css +1 -1
  22. package/dist/cjs/ui/menu-section/divider.js +5 -2
  23. package/dist/cjs/ui/menu-section/menu-section-heading.js +1 -1
  24. package/dist/cjs/ui/page-layout/aside.js +1 -1
  25. package/dist/cjs/ui/page-layout/banner.js +1 -1
  26. package/dist/cjs/ui/page-layout/main/main-sticky-header.js +1 -1
  27. package/dist/cjs/ui/page-layout/main/main.js +1 -1
  28. package/dist/cjs/ui/page-layout/panel-splitter/panel-splitter.compiled.css +3 -6
  29. package/dist/cjs/ui/page-layout/panel-splitter/panel-splitter.js +1 -1
  30. package/dist/cjs/ui/page-layout/panel.compiled.css +0 -1
  31. package/dist/cjs/ui/page-layout/panel.js +6 -9
  32. package/dist/cjs/ui/page-layout/root.js +1 -1
  33. package/dist/cjs/ui/page-layout/side-nav/side-nav-content.js +1 -1
  34. package/dist/cjs/ui/page-layout/side-nav/side-nav-footer.js +1 -1
  35. package/dist/cjs/ui/page-layout/side-nav/side-nav-header.js +1 -1
  36. package/dist/cjs/ui/page-layout/side-nav/side-nav.js +1 -1
  37. package/dist/cjs/ui/page-layout/side-nav/toggle-button-context.js +7 -2
  38. package/dist/cjs/ui/page-layout/side-nav/toggle-button-provider.js +13 -1
  39. package/dist/cjs/ui/page-layout/side-nav/toggle-button.compiled.css +2 -1
  40. package/dist/cjs/ui/page-layout/side-nav/toggle-button.js +19 -2
  41. package/dist/cjs/ui/page-layout/top-nav/top-nav-end.js +1 -1
  42. package/dist/cjs/ui/page-layout/top-nav/top-nav-middle.js +1 -1
  43. package/dist/cjs/ui/page-layout/top-nav/top-nav-start.compiled.css +1 -2
  44. package/dist/cjs/ui/page-layout/top-nav/top-nav-start.js +46 -6
  45. package/dist/cjs/ui/page-layout/top-nav/top-nav.js +1 -1
  46. package/dist/cjs/ui/top-nav-items/custom-title.js +1 -1
  47. package/dist/cjs/ui/top-nav-items/nav-logo/app-logo.compiled.css +2 -0
  48. package/dist/cjs/ui/top-nav-items/nav-logo/app-logo.js +11 -7
  49. package/dist/cjs/ui/top-nav-items/nav-logo/custom-logo.js +1 -1
  50. package/dist/cjs/ui/top-nav-items/nav-logo/logo-renderer.js +1 -1
  51. package/dist/cjs/ui/top-nav-items/search.js +1 -1
  52. package/dist/cjs/ui/top-nav-items/themed/button.compiled.css +8 -18
  53. package/dist/cjs/ui/top-nav-items/themed/button.js +1 -1
  54. package/dist/es2019/components/badge-container.js +1 -1
  55. package/dist/es2019/components/list-item.js +1 -1
  56. package/dist/es2019/components/list.js +1 -1
  57. package/dist/es2019/components/skip-links/skip-link.js +1 -1
  58. package/dist/es2019/components/skip-links/skip-links-container.js +1 -1
  59. package/dist/es2019/ui/menu-item/container-avatar.js +1 -1
  60. package/dist/es2019/ui/menu-item/drag-and-drop/drag-preview.js +1 -1
  61. package/dist/es2019/ui/menu-item/drag-and-drop/use-menu-item-drag-and-drop.js +1 -1
  62. package/dist/es2019/ui/menu-item/drag-handle.js +1 -1
  63. package/dist/es2019/ui/menu-item/expandable-menu-item/expandable-menu-item-content.js +1 -1
  64. package/dist/es2019/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.compiled.css +3 -5
  65. package/dist/es2019/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.js +1 -1
  66. package/dist/es2019/ui/menu-item/expandable-menu-item/expandable-menu-item.js +1 -1
  67. package/dist/es2019/ui/menu-item/flyout-menu-item/flyout-menu-item-content.js +1 -1
  68. package/dist/es2019/ui/menu-item/flyout-menu-item/flyout-menu-item-trigger.js +1 -1
  69. package/dist/es2019/ui/menu-item/link-menu-item.js +1 -1
  70. package/dist/es2019/ui/menu-item/menu-item.compiled.css +5 -10
  71. package/dist/es2019/ui/menu-item/menu-item.js +1 -1
  72. package/dist/es2019/ui/menu-item/top-level-spacer.js +1 -1
  73. package/dist/es2019/ui/menu-section/divider.js +1 -1
  74. package/dist/es2019/ui/menu-section/menu-section-heading.js +1 -1
  75. package/dist/es2019/ui/page-layout/aside.js +1 -1
  76. package/dist/es2019/ui/page-layout/banner.js +1 -1
  77. package/dist/es2019/ui/page-layout/main/main-sticky-header.js +1 -1
  78. package/dist/es2019/ui/page-layout/main/main.js +1 -1
  79. package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.compiled.css +3 -6
  80. package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.js +1 -1
  81. package/dist/es2019/ui/page-layout/panel.compiled.css +0 -1
  82. package/dist/es2019/ui/page-layout/panel.js +6 -9
  83. package/dist/es2019/ui/page-layout/root.js +1 -1
  84. package/dist/es2019/ui/page-layout/side-nav/side-nav-content.js +1 -1
  85. package/dist/es2019/ui/page-layout/side-nav/side-nav-footer.js +1 -1
  86. package/dist/es2019/ui/page-layout/side-nav/side-nav-header.js +1 -1
  87. package/dist/es2019/ui/page-layout/side-nav/side-nav.js +1 -1
  88. package/dist/es2019/ui/page-layout/side-nav/toggle-button-context.js +6 -1
  89. package/dist/es2019/ui/page-layout/side-nav/toggle-button-provider.js +14 -1
  90. package/dist/es2019/ui/page-layout/side-nav/toggle-button.compiled.css +2 -1
  91. package/dist/es2019/ui/page-layout/side-nav/toggle-button.js +20 -3
  92. package/dist/es2019/ui/page-layout/top-nav/top-nav-end.js +1 -1
  93. package/dist/es2019/ui/page-layout/top-nav/top-nav-middle.js +1 -1
  94. package/dist/es2019/ui/page-layout/top-nav/top-nav-start.compiled.css +1 -2
  95. package/dist/es2019/ui/page-layout/top-nav/top-nav-start.js +42 -7
  96. package/dist/es2019/ui/page-layout/top-nav/top-nav.js +1 -1
  97. package/dist/es2019/ui/top-nav-items/custom-title.js +1 -1
  98. package/dist/es2019/ui/top-nav-items/nav-logo/app-logo.compiled.css +2 -0
  99. package/dist/es2019/ui/top-nav-items/nav-logo/app-logo.js +11 -7
  100. package/dist/es2019/ui/top-nav-items/nav-logo/custom-logo.js +1 -1
  101. package/dist/es2019/ui/top-nav-items/nav-logo/logo-renderer.js +1 -1
  102. package/dist/es2019/ui/top-nav-items/search.js +1 -1
  103. package/dist/es2019/ui/top-nav-items/themed/button.compiled.css +8 -18
  104. package/dist/es2019/ui/top-nav-items/themed/button.js +1 -1
  105. package/dist/esm/components/badge-container.js +1 -1
  106. package/dist/esm/components/list-item.js +1 -1
  107. package/dist/esm/components/list.js +1 -1
  108. package/dist/esm/components/skip-links/skip-link.js +1 -1
  109. package/dist/esm/components/skip-links/skip-links-container.js +1 -1
  110. package/dist/esm/ui/menu-item/container-avatar.js +1 -1
  111. package/dist/esm/ui/menu-item/drag-and-drop/drag-preview.js +1 -1
  112. package/dist/esm/ui/menu-item/drag-and-drop/use-menu-item-drag-and-drop.js +1 -1
  113. package/dist/esm/ui/menu-item/drag-handle.js +1 -1
  114. package/dist/esm/ui/menu-item/expandable-menu-item/expandable-menu-item-content.js +1 -1
  115. package/dist/esm/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.compiled.css +3 -5
  116. package/dist/esm/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.js +1 -1
  117. package/dist/esm/ui/menu-item/expandable-menu-item/expandable-menu-item.js +1 -1
  118. package/dist/esm/ui/menu-item/flyout-menu-item/flyout-menu-item-content.js +1 -1
  119. package/dist/esm/ui/menu-item/flyout-menu-item/flyout-menu-item-trigger.js +1 -1
  120. package/dist/esm/ui/menu-item/link-menu-item.js +1 -1
  121. package/dist/esm/ui/menu-item/menu-item.compiled.css +5 -10
  122. package/dist/esm/ui/menu-item/menu-item.js +1 -1
  123. package/dist/esm/ui/menu-item/top-level-spacer.js +1 -1
  124. package/dist/esm/ui/menu-section/divider.compiled.css +1 -1
  125. package/dist/esm/ui/menu-section/divider.js +5 -2
  126. package/dist/esm/ui/menu-section/menu-section-heading.js +1 -1
  127. package/dist/esm/ui/page-layout/aside.js +1 -1
  128. package/dist/esm/ui/page-layout/banner.js +1 -1
  129. package/dist/esm/ui/page-layout/main/main-sticky-header.js +1 -1
  130. package/dist/esm/ui/page-layout/main/main.js +1 -1
  131. package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.compiled.css +3 -6
  132. package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.js +1 -1
  133. package/dist/esm/ui/page-layout/panel.compiled.css +0 -1
  134. package/dist/esm/ui/page-layout/panel.js +6 -9
  135. package/dist/esm/ui/page-layout/root.js +1 -1
  136. package/dist/esm/ui/page-layout/side-nav/side-nav-content.js +1 -1
  137. package/dist/esm/ui/page-layout/side-nav/side-nav-footer.js +1 -1
  138. package/dist/esm/ui/page-layout/side-nav/side-nav-header.js +1 -1
  139. package/dist/esm/ui/page-layout/side-nav/side-nav.js +1 -1
  140. package/dist/esm/ui/page-layout/side-nav/toggle-button-context.js +6 -1
  141. package/dist/esm/ui/page-layout/side-nav/toggle-button-provider.js +13 -1
  142. package/dist/esm/ui/page-layout/side-nav/toggle-button.compiled.css +2 -1
  143. package/dist/esm/ui/page-layout/side-nav/toggle-button.js +20 -3
  144. package/dist/esm/ui/page-layout/top-nav/top-nav-end.js +1 -1
  145. package/dist/esm/ui/page-layout/top-nav/top-nav-middle.js +1 -1
  146. package/dist/esm/ui/page-layout/top-nav/top-nav-start.compiled.css +1 -2
  147. package/dist/esm/ui/page-layout/top-nav/top-nav-start.js +46 -7
  148. package/dist/esm/ui/page-layout/top-nav/top-nav.js +1 -1
  149. package/dist/esm/ui/top-nav-items/custom-title.js +1 -1
  150. package/dist/esm/ui/top-nav-items/nav-logo/app-logo.compiled.css +2 -0
  151. package/dist/esm/ui/top-nav-items/nav-logo/app-logo.js +11 -7
  152. package/dist/esm/ui/top-nav-items/nav-logo/custom-logo.js +1 -1
  153. package/dist/esm/ui/top-nav-items/nav-logo/logo-renderer.js +1 -1
  154. package/dist/esm/ui/top-nav-items/search.js +1 -1
  155. package/dist/esm/ui/top-nav-items/themed/button.compiled.css +8 -18
  156. package/dist/esm/ui/top-nav-items/themed/button.js +1 -1
  157. package/dist/types/ui/page-layout/side-nav/toggle-button-context.d.ts +4 -0
  158. package/dist/types/ui/page-layout/side-nav/toggle-button-provider.d.ts +8 -0
  159. package/dist/types/ui/page-layout/top-nav/top-nav-start.d.ts +12 -1
  160. package/dist/types-ts4.5/ui/page-layout/side-nav/toggle-button-context.d.ts +4 -0
  161. package/dist/types-ts4.5/ui/page-layout/side-nav/toggle-button-provider.d.ts +8 -0
  162. package/dist/types-ts4.5/ui/page-layout/top-nav/top-nav-start.d.ts +12 -1
  163. package/package.json +5 -5
@@ -1,6 +1,6 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import React, { useState } from 'react';
3
- import { SideNavToggleButtonAttachRef, SideNavToggleButtonElement } from './toggle-button-context';
3
+ import { SideNavToggleButtonAttachRef, SideNavToggleButtonElement, SideNavToggleButtonSlotContext } from './toggle-button-context';
4
4
 
5
5
  /**
6
6
  * Provider for the side nav toggle button contexts.
@@ -26,4 +26,16 @@ export var SideNavToggleButtonProvider = function SideNavToggleButtonProvider(_r
26
26
  }, /*#__PURE__*/React.createElement(SideNavToggleButtonAttachRef.Provider, {
27
27
  value: setElement
28
28
  }, children));
29
+ };
30
+
31
+ /**
32
+ * Provider for the side nav toggle button slot.
33
+ *
34
+ * This allows us to determine if the toggle button is rendered inside or outside of its slot.
35
+ */
36
+ export var SideNavToggleButtonSlotProvider = function SideNavToggleButtonSlotProvider(_ref2) {
37
+ var children = _ref2.children;
38
+ return /*#__PURE__*/React.createElement(SideNavToggleButtonSlotContext.Provider, {
39
+ value: true
40
+ }, children);
29
41
  };
@@ -1,2 +1,3 @@
1
1
  ._1e0c1bgi{display:contents}
2
- ._lcxvglyw{pointer-events:none}
2
+ ._lcxvglyw{pointer-events:none}
3
+ @media (min-width:64rem){._3l1a1wug{margin-inline-start:auto}}
@@ -1,4 +1,4 @@
1
- /* toggle-button.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* toggle-button.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
3
  import "./toggle-button.compiled.css";
4
4
  import { ax, ix } from "@compiled/react/runtime";
@@ -8,7 +8,7 @@ import SidebarCollapseIcon from '@atlaskit/icon/core/sidebar-collapse';
8
8
  import SidebarExpandIcon from '@atlaskit/icon/core/sidebar-expand';
9
9
  import { fg } from '@atlaskit/platform-feature-flags';
10
10
  import { IconButton } from '../../top-nav-items/themed/migration';
11
- import { SideNavToggleButtonAttachRef } from './toggle-button-context';
11
+ import { SideNavToggleButtonAttachRef, SideNavToggleButtonSlotContext } from './toggle-button-context';
12
12
  import { useSideNavVisibility } from './use-side-nav-visibility';
13
13
  import { useToggleSideNav } from './use-toggle-side-nav';
14
14
  var toggleButtonTooltipOptions = {
@@ -20,6 +20,12 @@ var toggleButtonTooltipOptions = {
20
20
  // For duplicate "mouseenter" issue when changing icons (see below)
21
21
  var silentIconStyles = null;
22
22
 
23
+ /**
24
+ * Wrapper styles to align the toggle button to the end of `TopNavStart`
25
+ * when FHS is expanded.
26
+ */
27
+ var fullHeightSidebarExpandedWrapperStyles = null;
28
+
23
29
  /**
24
30
  * __SideNavToggleButton__
25
31
  *
@@ -93,7 +99,7 @@ export var SideNavToggleButton = function SideNavToggleButton(_ref) {
93
99
  className: ax(["_1e0c1bgi _lcxvglyw"])
94
100
  }, isSideNavExpanded ? /*#__PURE__*/React.createElement(SidebarCollapseIcon, props) : /*#__PURE__*/React.createElement(SidebarExpandIcon, props));
95
101
  };
96
- return /*#__PURE__*/React.createElement(IconButton, {
102
+ var iconButton = /*#__PURE__*/React.createElement(IconButton, {
97
103
  appearance: "subtle",
98
104
  label: isSideNavExpanded ? collapseLabel : expandLabel,
99
105
  icon: icon,
@@ -104,4 +110,15 @@ export var SideNavToggleButton = function SideNavToggleButton(_ref) {
104
110
  ref: fg('platform_fix_component_state_update_for_suspense') ? elementRef : ref,
105
111
  tooltip: toggleButtonTooltipOptions
106
112
  });
113
+ var isInsideSlot = useContext(SideNavToggleButtonSlotContext);
114
+
115
+ // Checking `isInsideSlot` in case an app isn't using the slot
116
+ // We don't want to break existing non-slot usage with the left margin
117
+ // This check can be removed in the future, after slot is required for a while.
118
+ if (isInsideSlot && fg('navx-full-height-sidebar')) {
119
+ return /*#__PURE__*/React.createElement("div", {
120
+ className: ax([isSideNavExpandedOnDesktop && "_3l1a1wug"])
121
+ }, iconButton);
122
+ }
123
+ return iconButton;
107
124
  };
@@ -1,4 +1,4 @@
1
- /* top-nav-end.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* top-nav-end.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import _extends from "@babel/runtime/helpers/extends";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  import "./top-nav-end.compiled.css";
@@ -1,4 +1,4 @@
1
- /* top-nav-middle.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* top-nav-middle.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import "./top-nav-middle.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
4
  import React from 'react';
@@ -5,5 +5,4 @@
5
5
  ._4t3i1osq{height:100%}
6
6
  ._bozgutpp{padding-inline-start:var(--ds-space-150,9pt)}
7
7
  ._lcxv1wug{pointer-events:auto}
8
- ._p12fnau3{max-width:calc(100% - var(--ds-space-200, 1pc))}
9
- @media (min-width:64rem){._15rin7od{min-width:unset}._glte1ris{width:max-content}._15ri1mjv{min-width:300px}._1gs5usvi{box-sizing:border-box}}
8
+ @media (min-width:64rem){._15rin7od{min-width:unset}._glte1osq{width:100%}._10jxnau3{max-width:calc(100% - var(--ds-space-200, 1pc))}._glte1ris{width:max-content}._15ri1mjv{min-width:300px}._1gs5usvi{box-sizing:border-box}}
@@ -1,16 +1,27 @@
1
- /* top-nav-start.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* top-nav-start.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
3
  import "./top-nav-start.compiled.css";
3
4
  import { ax, ix } from "@compiled/react/runtime";
4
- import React, { useContext, useEffect, useRef } from 'react';
5
+ import React, { useContext, useEffect, useLayoutEffect, useRef, useState } from 'react';
5
6
  import { fg } from '@atlaskit/platform-feature-flags';
7
+ import { UNSAFE_useMediaQuery } from '@atlaskit/primitives/compiled';
6
8
  import { TopNavStartAttachRef } from '../../../context/top-nav-start/top-nav-start-context';
9
+ import { SideNavToggleButtonSlotProvider } from '../side-nav/toggle-button-provider';
7
10
  import { useSideNavVisibility } from '../side-nav/use-side-nav-visibility';
8
11
  var styles = {
9
12
  root: "_zulp1b66 _yyhykb7n _4t3i1osq _4cvr1h6o _1e0c1txw _glte1ris _15ri1mjv _1gs5usvi",
10
- fullHeightSidebar: "_p12fnau3 _bozgutpp _lcxv1wug",
11
- fullHeightSidebarExpanded: "_15rin7od"
13
+ fullHeightSidebar: "_bozgutpp _lcxv1wug",
14
+ fullHeightSidebarExpanded: "_15rin7od _glte1osq _10jxnau3"
12
15
  };
13
16
 
17
+ /**
18
+ * The consistent key used for the side nav toggle button to ensure it does not get remounted
19
+ * when it is reordered.
20
+ *
21
+ * This ensures we get focus restoration for free.
22
+ */
23
+ var sideNavToggleButtonKey = 'side-nav-toggle-button';
24
+
14
25
  /**
15
26
  * __TopNavStart__
16
27
  *
@@ -18,7 +29,8 @@ var styles = {
18
29
  */
19
30
  export function TopNavStart(_ref) {
20
31
  var children = _ref.children,
21
- testId = _ref.testId;
32
+ testId = _ref.testId,
33
+ sideNavToggleButton = _ref.sideNavToggleButton;
22
34
  var ref = useContext(TopNavStartAttachRef);
23
35
  var elementRef = useRef(null);
24
36
  useEffect(function () {
@@ -27,14 +39,41 @@ export function TopNavStart(_ref) {
27
39
  }
28
40
  }, [elementRef, ref]);
29
41
 
30
- // Need to use `{ defaultCollapsed: true }` otherwise when there is no side nav mounted this never becomes false
42
+ // This needs the real `defaultCollapsed` state or will not SSR properly
43
+ // TODO: lift `defaultCollapsed` state to `Root` (DSP-23683)
44
+ // then context value will be correct in SSR / from initial render
31
45
  var _useSideNavVisibility = useSideNavVisibility({
32
46
  defaultCollapsed: true
33
47
  }),
34
48
  isExpandedOnDesktop = _useSideNavVisibility.isExpandedOnDesktop;
49
+
50
+ // For SSR assume desktop
51
+ var _useState = useState(true),
52
+ _useState2 = _slicedToArray(_useState, 2),
53
+ isDesktop = _useState2[0],
54
+ setIsDesktop = _useState2[1];
55
+ // Set state to real value on client
56
+ // This could result in some visible shift on mobile when hydrating SSR
57
+ // TODO: review and improve SSR behavior as necessary (DSP-23817)
58
+ useLayoutEffect(function () {
59
+ // Checking this to avoid breaking tests when `matchMedia` is not mocked
60
+ // Ideally we wouldn't cater to test environments, but this avoids introducing unnecessary friction
61
+ if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {
62
+ setIsDesktop(window.matchMedia('(min-width: 64rem)').matches);
63
+ }
64
+ }, []);
65
+ UNSAFE_useMediaQuery('above.md', function (event) {
66
+ setIsDesktop(event.matches);
67
+ });
35
68
  return /*#__PURE__*/React.createElement("div", {
36
69
  ref: fg('platform_fix_component_state_update_for_suspense') ? elementRef : ref,
37
70
  "data-testid": testId,
38
71
  className: ax([styles.root, fg('navx-full-height-sidebar') && styles.fullHeightSidebar, isExpandedOnDesktop && fg('navx-full-height-sidebar') && styles.fullHeightSidebarExpanded])
39
- }, children);
72
+ }, !fg('navx-full-height-sidebar') && /*#__PURE__*/React.createElement(SideNavToggleButtonSlotProvider, {
73
+ key: sideNavToggleButtonKey
74
+ }, sideNavToggleButton), sideNavToggleButton && (!isDesktop || !isExpandedOnDesktop) && fg('navx-full-height-sidebar') && /*#__PURE__*/React.createElement(SideNavToggleButtonSlotProvider, {
75
+ key: sideNavToggleButtonKey
76
+ }, sideNavToggleButton), children, sideNavToggleButton && isDesktop && isExpandedOnDesktop && fg('navx-full-height-sidebar') && /*#__PURE__*/React.createElement(SideNavToggleButtonSlotProvider, {
77
+ key: sideNavToggleButtonKey
78
+ }, sideNavToggleButton));
40
79
  }
@@ -1,4 +1,4 @@
1
- /* top-nav.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* top-nav.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
3
  var _excluded = ["backgroundColor"];
4
4
  import "./top-nav.compiled.css";
@@ -1,4 +1,4 @@
1
- /* custom-title.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* custom-title.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import "./custom-title.compiled.css";
3
3
  import * as React from 'react';
4
4
  import { ax, ix } from "@compiled/react/runtime";
@@ -5,6 +5,7 @@
5
5
  ._1e0c1txw{display:flex}
6
6
  ._1e0cglyw{display:none}
7
7
  ._1o9zidpf{flex-shrink:0}
8
+ ._1o9zkb7n{flex-shrink:1}
8
9
  ._1reo15vq{overflow-x:hidden}
9
10
  ._1toh1r31._1toh1r31{text-decoration-color:currentColor}
10
11
  ._1w901kw7._1w901kw7{color:inherit}
@@ -13,6 +14,7 @@
13
14
  ._5jyqglyw._5jyqglyw{text-decoration-line:none}
14
15
  ._ahbq1b66{margin-inline-start:var(--ds-space-050,4px)}
15
16
  ._mrqmnqa1._mrqmnqa1{text-decoration-style:solid}
17
+ ._p12f1osq{max-width:100%}
16
18
  ._p12f1tcg{max-width:24px}
17
19
  ._p12fnklw{max-width:20pc}
18
20
  ._uiztglyw{-webkit-user-select:none;-ms-user-select:none;user-select:none}
@@ -1,8 +1,9 @@
1
- /* app-logo.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* app-logo.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import "./app-logo.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
4
  import React, { useCallback, useRef } from 'react';
5
5
  import { cx } from '@compiled/react';
6
+ import { fg } from '@atlaskit/platform-feature-flags';
6
7
  import { componentWithFG } from '@atlaskit/platform-feature-flags-react';
7
8
  import { Anchor as AnchorLegacy, Inline as InlineLegacy, Text as TextLegacy
8
9
  // eslint-disable-next-line @atlaskit/design-system/no-emotion-primitives -- to be migrated to @atlaskit/primitives/compiled – go/akcss
@@ -17,13 +18,16 @@ var Text = componentWithFG('jfp-magma-hydration-harmonise-applogo-classname', Te
17
18
  var anchorStyles = {
18
19
  root: "_2rko19bv _1e0c1txw _4cvr1h6o _4t3izwfg _1o9zidpf _ahbq1b66 _1toh1r31 _5jyqglyw _mrqmnqa1 _1w901kw7",
19
20
  interactionStates: "_irr3166n _1di61wwy",
20
- interactionStatesCustomTheming: "_irr31rps _1di6yhlj"
21
+ interactionStatesCustomTheming: "_irr31rps _1di6yhlj",
22
+ fullHeightSidebar: "_1reo15vq _18m915vq _1o9zkb7n"
21
23
  };
22
24
  var logoWrapperStyles = {
23
- root: "_18zr1b66"
25
+ root: "_18zr1b66",
26
+ fullHeightSidebar: "_p12f1osq"
24
27
  };
25
28
  var iconContainerStyles = {
26
- root: "_1reo15vq _18m915vq _1e0c1txw _p12f1tcg"
29
+ root: "_1reo15vq _18m915vq _1e0c1txw _p12f1tcg",
30
+ fullHeightSidebar: "_1o9zidpf"
27
31
  };
28
32
  var logoTextStyles = {
29
33
  root: "_1bsb1ris _p12fnklw _uiztglyw _y4tiv77o _1e0cglyw _10y418uv"
@@ -65,14 +69,14 @@ export var AppLogo = function AppLogo(_ref) {
65
69
  // @ts-expect-error - non-standard values for `borderRadius` and the custom theming interaction states
66
70
  // eslint-disable-next-line @compiled/no-suppress-xcss
67
71
  ,
68
- xcss: cx(anchorStyles.root, hasCustomTheme ? anchorStyles.interactionStatesCustomTheming : anchorStyles.interactionStates),
72
+ xcss: cx(anchorStyles.root, hasCustomTheme ? anchorStyles.interactionStatesCustomTheming : anchorStyles.interactionStates, fg('navx-full-height-sidebar') && anchorStyles.fullHeightSidebar),
69
73
  onClick: onClick
70
74
  }, /*#__PURE__*/React.createElement(Inline, {
71
75
  space: "space.075",
72
76
  alignBlock: "center",
73
- xcss: logoWrapperStyles.root
77
+ xcss: cx(logoWrapperStyles.root, fg('navx-full-height-sidebar') && logoWrapperStyles.fullHeightSidebar)
74
78
  }, /*#__PURE__*/React.createElement("div", {
75
- className: ax([iconContainerStyles.root])
79
+ className: ax([iconContainerStyles.root, fg('navx-full-height-sidebar') && iconContainerStyles.fullHeightSidebar])
76
80
  }, /*#__PURE__*/React.createElement(LogoRenderer
77
81
  // Top nav always uses the new logo design
78
82
  , {
@@ -1,4 +1,4 @@
1
- /* custom-logo.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* custom-logo.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import "./custom-logo.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
4
  import React, { useEffect, useRef } from 'react';
@@ -1,4 +1,4 @@
1
- /* logo-renderer.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* logo-renderer.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import { ax, ix } from "@compiled/react/runtime";
3
3
  import React, { memo } from 'react';
4
4
  import { fg } from '@atlaskit/platform-feature-flags';
@@ -1,4 +1,4 @@
1
- /* search.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* search.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import "./search.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
4
  import React, { Fragment } from 'react';
@@ -1,4 +1,3 @@
1
-
2
1
  ._11c82smr{font:var(--ds-font-body,normal 400 14px/20px ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
3
2
  ._11q71c9b{background:var(--ds-top-bar-button-disabled-background)}
4
3
  ._11q71qds{background:var(--ds-top-bar-button-selected-background)}
@@ -33,36 +32,27 @@
33
32
  ._syaz1i3i{color:var(--ds-top-bar-button-disabled-text)}
34
33
  ._syaz1r31{color:currentColor}
35
34
  ._syazw5ct{color:var(--ds-top-bar-button-selected-text)}
36
- ._vwz4idpf{line-height:0}._105315o7:visited{color:var(--ds-top-bar-button-primary-text)}
37
- ._10531i3i:visited{color:var(--ds-top-bar-button-disabled-text)}
38
- ._10531r31:visited{color:currentColor}
39
- ._1053w5ct:visited{color:var(--ds-top-bar-button-selected-text)}
40
- ._1a3b1r31:focus{text-decoration-color:currentColor}
41
- ._4fprglyw:focus{text-decoration-line:none}
42
- ._5goinqa1:focus{text-decoration-style:solid}
43
- ._f8pj15o7:focus{color:var(--ds-top-bar-button-primary-text)}
44
- ._f8pj1i3i:focus{color:var(--ds-top-bar-button-disabled-text)}
45
- ._f8pj1r31:focus{color:currentColor}
46
- ._f8pjw5ct:focus{color:var(--ds-top-bar-button-selected-text)}
35
+ ._vwz4idpf{line-height:0}
36
+ ._f8pj15o7:focus, ._105315o7:visited{color:var(--ds-top-bar-button-primary-text)}
37
+ ._f8pj1i3i:focus, ._10531i3i:visited{color:var(--ds-top-bar-button-disabled-text)}
38
+ ._f8pj1r31:focus, ._10531r31:visited{color:currentColor}
39
+ ._f8pjw5ct:focus, ._1053w5ct:visited{color:var(--ds-top-bar-button-selected-text)}
47
40
  ._19lc1c9b:hover{background:var(--ds-top-bar-button-disabled-background)}
48
41
  ._19lc1rps:hover{background:var(--ds-top-bar-button-background-hovered)}
49
42
  ._19lcjrv1:hover{background:var(--ds-top-bar-button-selected-background-hovered)}
50
43
  ._19lcp6hf:hover{background:var(--ds-top-bar-button-primary-background-hovered)}
51
- ._1bnxglyw:hover{text-decoration-line:none}
52
44
  ._30l315o7:hover{color:var(--ds-top-bar-button-primary-text)}
53
45
  ._30l31i3i:hover{color:var(--ds-top-bar-button-disabled-text)}
54
46
  ._30l31r31:hover{color:currentColor}
55
47
  ._30l3w5ct:hover{color:var(--ds-top-bar-button-selected-text)}
56
- ._9oik1r31:hover{text-decoration-color:currentColor}
57
- ._jf4cnqa1:hover{text-decoration-style:solid}
58
48
  ._j6xt1c9b:active{background:var(--ds-top-bar-button-disabled-background)}
59
49
  ._j6xt5sko:active{background:var(--ds-top-bar-button-primary-background-pressed)}
60
50
  ._j6xtnh62:active{background:var(--ds-top-bar-button-selected-background-pressed)}
61
51
  ._j6xtqtgh:active{background:var(--ds-top-bar-button-background-pressed)}
62
- ._1iohnqa1:active{text-decoration-style:solid}
63
- ._1nrm1r31:active{text-decoration-color:currentColor}
52
+ ._1iohnqa1:active, ._5goinqa1:focus, ._jf4cnqa1:hover{text-decoration-style:solid}
53
+ ._1nrm1r31:active, ._1a3b1r31:focus, ._9oik1r31:hover{text-decoration-color:currentColor}
64
54
  ._9h8h15o7:active{color:var(--ds-top-bar-button-primary-text)}
65
55
  ._9h8h1i3i:active{color:var(--ds-top-bar-button-disabled-text)}
66
56
  ._9h8h1r31:active{color:currentColor}
67
57
  ._9h8hw5ct:active{color:var(--ds-top-bar-button-selected-text)}
68
- ._c2waglyw:active{text-decoration-line:none}
58
+ ._c2waglyw:active, ._4fprglyw:focus, ._1bnxglyw:hover{text-decoration-line:none}
@@ -1,4 +1,4 @@
1
- /* button.tsx generated by @compiled/babel-plugin v0.38.1 */
1
+ /* button.tsx generated by @compiled/babel-plugin v0.36.1 */
2
2
  import _extends from "@babel/runtime/helpers/extends";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
4
  var _excluded = ["style", "xcss", "backgroundColor", "padding", "paddingBlock", "paddingBlockStart", "paddingBlockEnd", "paddingInline", "paddingInlineStart", "paddingInlineEnd"],
@@ -14,3 +14,7 @@ export declare const SideNavToggleButtonElement: import("react").Context<HTMLBut
14
14
  * is lazy loaded, which happens in Jira and Confluence), which would prevent the event listeners from being set up.
15
15
  */
16
16
  export declare const SideNavToggleButtonAttachRef: import("react").Context<(newVal: HTMLButtonElement | null) => void>;
17
+ /**
18
+ * Used to check if the SideNavToggleButton is rendered inside of its slot in `TopNavStart`.
19
+ */
20
+ export declare const SideNavToggleButtonSlotContext: import("react").Context<boolean>;
@@ -15,3 +15,11 @@ import React from 'react';
15
15
  export declare const SideNavToggleButtonProvider: ({ children }: {
16
16
  children: React.ReactNode;
17
17
  }) => React.JSX.Element;
18
+ /**
19
+ * Provider for the side nav toggle button slot.
20
+ *
21
+ * This allows us to determine if the toggle button is rendered inside or outside of its slot.
22
+ */
23
+ export declare const SideNavToggleButtonSlotProvider: ({ children }: {
24
+ children: React.ReactNode;
25
+ }) => React.JSX.Element;
@@ -8,7 +8,7 @@ import React from 'react';
8
8
  *
9
9
  * Wrapper for the top navigation actions on the inline-start (left) side of the top navigation.
10
10
  */
11
- export declare function TopNavStart({ children, testId, }: {
11
+ export declare function TopNavStart({ children, testId, sideNavToggleButton, }: {
12
12
  /**
13
13
  * The content of the layout area.
14
14
  *
@@ -19,4 +19,15 @@ export declare function TopNavStart({ children, testId, }: {
19
19
  * A unique string that appears as data attribute `data-testid` in the rendered code, serving as a hook for automated tests.
20
20
  */
21
21
  testId?: string;
22
+ /**
23
+ * Slot for the side nav toggle button.
24
+ *
25
+ * You should only render `<SideNavToggleButton>` inside this slot, not as a child.
26
+ *
27
+ * After `platform_dst_nav4_full_height_sidebar_api_changes` rolls out,
28
+ * this prop will become required.
29
+ *
30
+ * Consumers that do not need a toggle button can explicitly pass `null`.
31
+ */
32
+ sideNavToggleButton?: React.ReactNode;
22
33
  }): JSX.Element;
@@ -14,3 +14,7 @@ export declare const SideNavToggleButtonElement: import("react").Context<HTMLBut
14
14
  * is lazy loaded, which happens in Jira and Confluence), which would prevent the event listeners from being set up.
15
15
  */
16
16
  export declare const SideNavToggleButtonAttachRef: import("react").Context<(newVal: HTMLButtonElement | null) => void>;
17
+ /**
18
+ * Used to check if the SideNavToggleButton is rendered inside of its slot in `TopNavStart`.
19
+ */
20
+ export declare const SideNavToggleButtonSlotContext: import("react").Context<boolean>;
@@ -15,3 +15,11 @@ import React from 'react';
15
15
  export declare const SideNavToggleButtonProvider: ({ children }: {
16
16
  children: React.ReactNode;
17
17
  }) => React.JSX.Element;
18
+ /**
19
+ * Provider for the side nav toggle button slot.
20
+ *
21
+ * This allows us to determine if the toggle button is rendered inside or outside of its slot.
22
+ */
23
+ export declare const SideNavToggleButtonSlotProvider: ({ children }: {
24
+ children: React.ReactNode;
25
+ }) => React.JSX.Element;
@@ -8,7 +8,7 @@ import React from 'react';
8
8
  *
9
9
  * Wrapper for the top navigation actions on the inline-start (left) side of the top navigation.
10
10
  */
11
- export declare function TopNavStart({ children, testId, }: {
11
+ export declare function TopNavStart({ children, testId, sideNavToggleButton, }: {
12
12
  /**
13
13
  * The content of the layout area.
14
14
  *
@@ -19,4 +19,15 @@ export declare function TopNavStart({ children, testId, }: {
19
19
  * A unique string that appears as data attribute `data-testid` in the rendered code, serving as a hook for automated tests.
20
20
  */
21
21
  testId?: string;
22
+ /**
23
+ * Slot for the side nav toggle button.
24
+ *
25
+ * You should only render `<SideNavToggleButton>` inside this slot, not as a child.
26
+ *
27
+ * After `platform_dst_nav4_full_height_sidebar_api_changes` rolls out,
28
+ * this prop will become required.
29
+ *
30
+ * Consumers that do not need a toggle button can explicitly pass `null`.
31
+ */
32
+ sideNavToggleButton?: React.ReactNode;
22
33
  }): JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/navigation-system",
3
- "version": "2.7.0",
3
+ "version": "2.9.0",
4
4
  "description": "The latest navigation system for Atlassian apps.",
5
5
  "repository": "https://bitbucket.org/atlassian/atlassian-frontend-mirror",
6
6
  "author": "Atlassian Pty Ltd",
@@ -76,7 +76,7 @@
76
76
  "@atlaskit/logo": "^19.7.0",
77
77
  "@atlaskit/platform-feature-flags": "^1.1.0",
78
78
  "@atlaskit/platform-feature-flags-react": "^0.3.0",
79
- "@atlaskit/popup": "^4.3.0",
79
+ "@atlaskit/popup": "^4.4.0",
80
80
  "@atlaskit/pragmatic-drag-and-drop": "^1.7.0",
81
81
  "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.1.0",
82
82
  "@atlaskit/pragmatic-drag-and-drop-react-drop-indicator": "^3.2.0",
@@ -162,9 +162,6 @@
162
162
  "platform_fix_component_state_update_for_suspense": {
163
163
  "type": "boolean"
164
164
  },
165
- "platform_design_system_nav4_panel_mobile_width_fix": {
166
- "type": "boolean"
167
- },
168
165
  "jiv-20710-fix-nav-rerender": {
169
166
  "type": "boolean"
170
167
  },
@@ -186,6 +183,9 @@
186
183
  "navx-full-height-sidebar": {
187
184
  "type": "boolean"
188
185
  },
186
+ "platform_dst_nav4_full_height_sidebar_api_changes": {
187
+ "type": "boolean"
188
+ },
189
189
  "platform_dst_nav4_menu_section_heading_a11y": {
190
190
  "type": "boolean"
191
191
  },