@atlaskit/navigation-system 2.1.3 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/dist/cjs/ui/menu-section/menu-section-heading.js +5 -1
- package/dist/cjs/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +3 -1
- package/dist/cjs/ui/page-layout/side-nav/side-nav.js +48 -24
- package/dist/cjs/ui/page-layout/side-nav/toggle-button.js +3 -1
- package/dist/cjs/ui/page-layout/side-nav/use-expand-side-nav.js +8 -3
- package/dist/cjs/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +53 -19
- package/dist/cjs/ui/page-layout/side-nav/use-toggle-side-nav.js +9 -4
- package/dist/es2019/ui/menu-section/menu-section-heading.js +5 -1
- package/dist/es2019/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +3 -1
- package/dist/es2019/ui/page-layout/side-nav/side-nav.js +44 -20
- package/dist/es2019/ui/page-layout/side-nav/toggle-button.js +3 -1
- package/dist/es2019/ui/page-layout/side-nav/use-expand-side-nav.js +8 -4
- package/dist/es2019/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +53 -19
- package/dist/es2019/ui/page-layout/side-nav/use-toggle-side-nav.js +9 -5
- package/dist/esm/ui/menu-section/menu-section-heading.js +5 -1
- package/dist/esm/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +3 -1
- package/dist/esm/ui/page-layout/side-nav/side-nav.js +48 -24
- package/dist/esm/ui/page-layout/side-nav/toggle-button.js +3 -1
- package/dist/esm/ui/page-layout/side-nav/use-expand-side-nav.js +8 -3
- package/dist/esm/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +53 -19
- package/dist/esm/ui/page-layout/side-nav/use-toggle-side-nav.js +9 -4
- package/dist/types/ui/page-layout/side-nav/types.d.ts +19 -0
- package/dist/types/ui/page-layout/side-nav/use-expand-side-nav.d.ts +5 -1
- package/dist/types/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.d.ts +4 -1
- package/dist/types/ui/page-layout/side-nav/use-toggle-side-nav.d.ts +6 -2
- package/dist/types-ts4.5/ui/page-layout/side-nav/types.d.ts +19 -0
- package/dist/types-ts4.5/ui/page-layout/side-nav/use-expand-side-nav.d.ts +5 -1
- package/dist/types-ts4.5/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.d.ts +4 -1
- package/dist/types-ts4.5/ui/page-layout/side-nav/use-toggle-side-nav.d.ts +6 -2
- package/package.json +7 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# @atlassian/navigation-system
|
|
2
2
|
|
|
3
|
+
## 2.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`40dea92e11501`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/40dea92e11501) -
|
|
8
|
+
`MenuSectionHeading` has been updated to use regular text (`p` element) instead of a heading (`h2`
|
|
9
|
+
element). This change is behind a feature flag.
|
|
10
|
+
|
|
11
|
+
This has been done to resolve accessibility issues with the component. It does not need to be a
|
|
12
|
+
heading semantically.
|
|
13
|
+
|
|
14
|
+
## 2.2.0
|
|
15
|
+
|
|
16
|
+
### Minor Changes
|
|
17
|
+
|
|
18
|
+
- [`cf5e597de761c`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/cf5e597de761c) -
|
|
19
|
+
Adds a trigger value to the side nav's `onExpand` and `onCollapse` callbacks, allowing consumers
|
|
20
|
+
to identify the method used to expand or collapse the side nav. Also adds the ability to define
|
|
21
|
+
the trigger value when using the `useToggleSideNav` and `useExpandSideNav` hooks. This change is
|
|
22
|
+
behind the `navx-full-height-sidebar` feature gate.
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- Updated dependencies
|
|
27
|
+
|
|
3
28
|
## 2.1.3
|
|
4
29
|
|
|
5
30
|
### Patch Changes
|
|
@@ -9,6 +9,7 @@ exports.MenuSectionHeading = void 0;
|
|
|
9
9
|
require("./menu-section-heading.compiled.css");
|
|
10
10
|
var React = _interopRequireWildcard(require("react"));
|
|
11
11
|
var _runtime = require("@compiled/react/runtime");
|
|
12
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
12
13
|
var _menuSectionContext = require("./menu-section-context");
|
|
13
14
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
14
15
|
var styles = {
|
|
@@ -23,7 +24,10 @@ var styles = {
|
|
|
23
24
|
var MenuSectionHeading = exports.MenuSectionHeading = function MenuSectionHeading(_ref) {
|
|
24
25
|
var children = _ref.children;
|
|
25
26
|
var id = (0, _menuSectionContext.useMenuSectionContext)();
|
|
26
|
-
return /*#__PURE__*/React.createElement("
|
|
27
|
+
return (0, _platformFeatureFlags.fg)('platform_dst_nav4_menu_section_heading_a11y') ? /*#__PURE__*/React.createElement("p", {
|
|
28
|
+
id: "".concat(id, "-heading"),
|
|
29
|
+
className: (0, _runtime.ax)([styles.root])
|
|
30
|
+
}, children) : /*#__PURE__*/React.createElement("h2", {
|
|
27
31
|
id: "".concat(id, "-heading"),
|
|
28
32
|
className: (0, _runtime.ax)([styles.root])
|
|
29
33
|
}, children);
|
|
@@ -35,7 +35,9 @@ var SideNavPanelSplitter = exports.SideNavPanelSplitter = function SideNavPanelS
|
|
|
35
35
|
shouldCollapseOnDoubleClick = _ref$shouldCollapseOn === void 0 ? true : _ref$shouldCollapseOn;
|
|
36
36
|
var context = (0, _react.useContext)(_context.PanelSplitterContext);
|
|
37
37
|
(0, _tinyInvariant.default)((context === null || context === void 0 ? void 0 : context.panelId) === _constants.sideNavPanelSplitterId, 'SideNavPanelSplitter must be rendered as a child of <SideNav />.');
|
|
38
|
-
var toggleSideNav = (0, _useToggleSideNav.useToggleSideNav)(
|
|
38
|
+
var toggleSideNav = (0, _useToggleSideNav.useToggleSideNav)({
|
|
39
|
+
trigger: 'double-click'
|
|
40
|
+
});
|
|
39
41
|
return /*#__PURE__*/_react.default.createElement(_context.OnDoubleClickContext.Provider, {
|
|
40
42
|
value: shouldCollapseOnDoubleClick ? toggleSideNav : undefined
|
|
41
43
|
}, /*#__PURE__*/_react.default.createElement(_panelSplitter.PanelSplitter, {
|
|
@@ -39,6 +39,8 @@ var _useSideNavVisibilityCallbacks = require("./use-side-nav-visibility-callback
|
|
|
39
39
|
var _useToggleSideNav = require("./use-toggle-side-nav");
|
|
40
40
|
var _visibilityContext = require("./visibility-context");
|
|
41
41
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
42
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
43
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
42
44
|
var panelSplitterResizingVar = '--n_snvRsz';
|
|
43
45
|
var widthResizeBounds = {
|
|
44
46
|
min: '240px',
|
|
@@ -67,6 +69,7 @@ var fallbackDefaultWidth = 320;
|
|
|
67
69
|
* context value.
|
|
68
70
|
*/
|
|
69
71
|
function SideNavInternal(_ref) {
|
|
72
|
+
var _sideNavState$lastTri;
|
|
70
73
|
var children = _ref.children,
|
|
71
74
|
defaultCollapsed = _ref.defaultCollapsed,
|
|
72
75
|
_ref$defaultWidth = _ref.defaultWidth,
|
|
@@ -82,7 +85,9 @@ function SideNavInternal(_ref) {
|
|
|
82
85
|
var id = (0, _idUtils.useLayoutId)({
|
|
83
86
|
providedId: providedId
|
|
84
87
|
});
|
|
85
|
-
var expandSideNav = (0, _useExpandSideNav.useExpandSideNav)(
|
|
88
|
+
var expandSideNav = (0, _useExpandSideNav.useExpandSideNav)({
|
|
89
|
+
trigger: 'skip-link'
|
|
90
|
+
});
|
|
86
91
|
/**
|
|
87
92
|
* Called after clicking on the side nav skip link, and ensures the side nav is expanded so that it is focusable.
|
|
88
93
|
*
|
|
@@ -155,11 +160,9 @@ function SideNavInternal(_ref) {
|
|
|
155
160
|
};
|
|
156
161
|
setSideNavState(function (currentState) {
|
|
157
162
|
if ((currentState === null || currentState === void 0 ? void 0 : currentState.desktop) === 'collapsed' && (currentState === null || currentState === void 0 ? void 0 : currentState.flyout) !== 'open') {
|
|
158
|
-
return {
|
|
159
|
-
desktop: currentState.desktop,
|
|
160
|
-
mobile: currentState.mobile,
|
|
163
|
+
return _objectSpread(_objectSpread({}, currentState), {}, {
|
|
161
164
|
flyout: 'open'
|
|
162
|
-
};
|
|
165
|
+
});
|
|
163
166
|
}
|
|
164
167
|
return currentState;
|
|
165
168
|
});
|
|
@@ -171,11 +174,9 @@ function SideNavInternal(_ref) {
|
|
|
171
174
|
};
|
|
172
175
|
setSideNavState(function (currentState) {
|
|
173
176
|
if ((currentState === null || currentState === void 0 ? void 0 : currentState.desktop) === 'collapsed' && (currentState === null || currentState === void 0 ? void 0 : currentState.flyout) === 'open') {
|
|
174
|
-
return {
|
|
175
|
-
desktop: currentState.desktop,
|
|
176
|
-
mobile: currentState.mobile,
|
|
177
|
+
return _objectSpread(_objectSpread({}, currentState), {}, {
|
|
177
178
|
flyout: 'triggered-animate-close'
|
|
178
|
-
};
|
|
179
|
+
});
|
|
179
180
|
}
|
|
180
181
|
return currentState;
|
|
181
182
|
});
|
|
@@ -238,31 +239,53 @@ function SideNavInternal(_ref) {
|
|
|
238
239
|
}
|
|
239
240
|
};
|
|
240
241
|
}, [openLayerObserver, setSideNavState]);
|
|
241
|
-
var
|
|
242
|
+
var toggleVisibilityByScreenResize = (0, _useToggleSideNav.useToggleSideNav)({
|
|
243
|
+
trigger: 'screen-resize'
|
|
244
|
+
});
|
|
245
|
+
var toggleVisibilityByClickOutsideOnMobile = (0, _useToggleSideNav.useToggleSideNav)({
|
|
246
|
+
trigger: 'click-outside-on-mobile'
|
|
247
|
+
});
|
|
242
248
|
(0, _react.useEffect)(function () {
|
|
243
249
|
// Sync the visibility in context (provided in `<Root>`) with the local `defaultCollapsed` prop provided to `SideNav`
|
|
244
250
|
// after SSR hydration. This should only run once, after the initial render on the client.
|
|
245
251
|
setSideNavState({
|
|
246
252
|
desktop: initialDefaultCollapsed ? 'collapsed' : 'expanded',
|
|
247
253
|
mobile: 'collapsed',
|
|
248
|
-
flyout: 'closed'
|
|
254
|
+
flyout: 'closed',
|
|
255
|
+
lastTrigger: null
|
|
249
256
|
});
|
|
250
257
|
}, [initialDefaultCollapsed, setSideNavState]);
|
|
251
258
|
var handleExpand = (0, _react.useCallback)(function (_ref2) {
|
|
252
|
-
var screen = _ref2.screen
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
259
|
+
var screen = _ref2.screen,
|
|
260
|
+
trigger = _ref2.trigger;
|
|
261
|
+
if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
|
|
262
|
+
onExpand === null || onExpand === void 0 || onExpand({
|
|
263
|
+
screen: screen,
|
|
264
|
+
trigger: trigger
|
|
265
|
+
});
|
|
266
|
+
} else {
|
|
267
|
+
onExpand === null || onExpand === void 0 || onExpand({
|
|
268
|
+
screen: screen
|
|
269
|
+
});
|
|
270
|
+
}
|
|
256
271
|
|
|
257
272
|
// When the side nav gets expanded, we close the flyout to reset it.
|
|
258
273
|
// This prevents the flyout from staying open and ensures we are respecting the user's intent to expand.
|
|
259
274
|
updateFlyoutState('force-close');
|
|
260
275
|
}, [onExpand, updateFlyoutState]);
|
|
261
276
|
var handleCollapse = (0, _react.useCallback)(function (_ref3) {
|
|
262
|
-
var screen = _ref3.screen
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
277
|
+
var screen = _ref3.screen,
|
|
278
|
+
trigger = _ref3.trigger;
|
|
279
|
+
if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
|
|
280
|
+
onCollapse === null || onCollapse === void 0 || onCollapse({
|
|
281
|
+
screen: screen,
|
|
282
|
+
trigger: trigger
|
|
283
|
+
});
|
|
284
|
+
} else {
|
|
285
|
+
onCollapse === null || onCollapse === void 0 || onCollapse({
|
|
286
|
+
screen: screen
|
|
287
|
+
});
|
|
288
|
+
}
|
|
266
289
|
|
|
267
290
|
// When the side nav gets collapsed, we close the flyout to reset it.
|
|
268
291
|
// This prevents the flyout from staying open and ensures we are respecting the user's intent to collapse.
|
|
@@ -272,7 +295,8 @@ function SideNavInternal(_ref) {
|
|
|
272
295
|
onExpand: handleExpand,
|
|
273
296
|
onCollapse: handleCollapse,
|
|
274
297
|
isExpandedOnDesktop: isExpandedOnDesktop,
|
|
275
|
-
isExpandedOnMobile: isExpandedOnMobile
|
|
298
|
+
isExpandedOnMobile: isExpandedOnMobile,
|
|
299
|
+
lastTrigger: (_sideNavState$lastTri = sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.lastTrigger) !== null && _sideNavState$lastTri !== void 0 ? _sideNavState$lastTri : null
|
|
276
300
|
});
|
|
277
301
|
(0, _react.useEffect)(function () {
|
|
278
302
|
var mediaQueryList = window.matchMedia('(min-width: 64rem)');
|
|
@@ -283,12 +307,12 @@ function SideNavInternal(_ref) {
|
|
|
283
307
|
// We're transitioning from tablet to desktop viewport size.
|
|
284
308
|
// We forcibly show the side nav if it was shown on mobile.
|
|
285
309
|
if (isExpandedOnMobile && !isExpandedOnDesktop) {
|
|
286
|
-
|
|
310
|
+
toggleVisibilityByScreenResize();
|
|
287
311
|
}
|
|
288
312
|
}
|
|
289
313
|
}
|
|
290
314
|
});
|
|
291
|
-
}, [
|
|
315
|
+
}, [toggleVisibilityByScreenResize, isExpandedOnDesktop, isExpandedOnMobile]);
|
|
292
316
|
|
|
293
317
|
/**
|
|
294
318
|
* Close the mobile side nav if there is a click outside.
|
|
@@ -345,10 +369,10 @@ function SideNavInternal(_ref) {
|
|
|
345
369
|
// In either case keeping the SideNav expanded makes sense.
|
|
346
370
|
return;
|
|
347
371
|
}
|
|
348
|
-
|
|
372
|
+
toggleVisibilityByClickOutsideOnMobile();
|
|
349
373
|
}
|
|
350
374
|
});
|
|
351
|
-
}, [id, isExpandedOnMobile, toggleButtonElement,
|
|
375
|
+
}, [id, isExpandedOnMobile, toggleButtonElement, toggleVisibilityByClickOutsideOnMobile]);
|
|
352
376
|
(0, _react.useEffect)(function () {
|
|
353
377
|
if (!toggleButtonElement) {
|
|
354
378
|
return;
|
|
@@ -73,7 +73,9 @@ var SideNavToggleButton = exports.SideNavToggleButton = function SideNavToggleBu
|
|
|
73
73
|
}
|
|
74
74
|
});
|
|
75
75
|
}, [isSideNavExpandedOnDesktop, isSideNavExpandedOnMobile]);
|
|
76
|
-
var toggleVisibility = (0, _useToggleSideNav.useToggleSideNav)(
|
|
76
|
+
var toggleVisibility = (0, _useToggleSideNav.useToggleSideNav)({
|
|
77
|
+
trigger: 'toggle-button'
|
|
78
|
+
});
|
|
77
79
|
var handleClick = (0, _react.useCallback)(function (event, analyticsEvent) {
|
|
78
80
|
onClick === null || onClick === void 0 || onClick(event, analyticsEvent, {
|
|
79
81
|
isSideNavVisible: isSideNavExpanded
|
|
@@ -16,6 +16,9 @@ var _visibilityContext = require("./visibility-context");
|
|
|
16
16
|
* If you need a function to toggle the side nav, use `useToggleSideNav` instead.
|
|
17
17
|
*/
|
|
18
18
|
function useExpandSideNav() {
|
|
19
|
+
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
20
|
+
_ref$trigger = _ref.trigger,
|
|
21
|
+
trigger = _ref$trigger === void 0 ? 'programmatic' : _ref$trigger;
|
|
19
22
|
var setSideNavState = (0, _react.useContext)(_visibilityContext.SetSideNavVisibilityState);
|
|
20
23
|
var expandSideNav = (0, _react.useCallback)(function () {
|
|
21
24
|
var _window$matchMedia = window.matchMedia('(min-width: 64rem)'),
|
|
@@ -35,7 +38,8 @@ function useExpandSideNav() {
|
|
|
35
38
|
return {
|
|
36
39
|
mobile: currentState.mobile,
|
|
37
40
|
desktop: 'expanded',
|
|
38
|
-
flyout: 'closed'
|
|
41
|
+
flyout: 'closed',
|
|
42
|
+
lastTrigger: trigger
|
|
39
43
|
};
|
|
40
44
|
});
|
|
41
45
|
} else {
|
|
@@ -53,10 +57,11 @@ function useExpandSideNav() {
|
|
|
53
57
|
return {
|
|
54
58
|
desktop: currentState.desktop,
|
|
55
59
|
mobile: 'expanded',
|
|
56
|
-
flyout: 'closed'
|
|
60
|
+
flyout: 'closed',
|
|
61
|
+
lastTrigger: trigger
|
|
57
62
|
};
|
|
58
63
|
});
|
|
59
64
|
}
|
|
60
|
-
}, [setSideNavState]);
|
|
65
|
+
}, [setSideNavState, trigger]);
|
|
61
66
|
return expandSideNav;
|
|
62
67
|
}
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.useSideNavVisibilityCallbacks = useSideNavVisibilityCallbacks;
|
|
8
8
|
var _react = require("react");
|
|
9
9
|
var _usePreviousValue = _interopRequireDefault(require("@atlaskit/ds-lib/use-previous-value"));
|
|
10
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
10
11
|
/**
|
|
11
12
|
* Calls the `onExpand` and `onCollapse` callbacks as required.
|
|
12
13
|
* This is used for both user-provided callbacks, as well as internal callbacks to respond to visibility state changes.
|
|
@@ -15,7 +16,8 @@ function useSideNavVisibilityCallbacks(_ref) {
|
|
|
15
16
|
var onExpand = _ref.onExpand,
|
|
16
17
|
onCollapse = _ref.onCollapse,
|
|
17
18
|
isExpandedOnDesktop = _ref.isExpandedOnDesktop,
|
|
18
|
-
isExpandedOnMobile = _ref.isExpandedOnMobile
|
|
19
|
+
isExpandedOnMobile = _ref.isExpandedOnMobile,
|
|
20
|
+
lastTrigger = _ref.lastTrigger;
|
|
19
21
|
// Wrapping in refs so we can call them in `useEffect` without changes to them triggering the `useEffect`
|
|
20
22
|
var onExpandRef = (0, _react.useRef)(onExpand);
|
|
21
23
|
var onCollapseRef = (0, _react.useRef)(onCollapse);
|
|
@@ -36,17 +38,33 @@ function useSideNavVisibilityCallbacks(_ref) {
|
|
|
36
38
|
return;
|
|
37
39
|
}
|
|
38
40
|
if (isExpandedOnDesktop) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
|
|
42
|
+
var _onExpandRef$current;
|
|
43
|
+
(_onExpandRef$current = onExpandRef.current) === null || _onExpandRef$current === void 0 || _onExpandRef$current.call(onExpandRef, {
|
|
44
|
+
screen: 'desktop',
|
|
45
|
+
trigger: lastTrigger
|
|
46
|
+
});
|
|
47
|
+
} else {
|
|
48
|
+
var _onExpandRef$current2;
|
|
49
|
+
(_onExpandRef$current2 = onExpandRef.current) === null || _onExpandRef$current2 === void 0 || _onExpandRef$current2.call(onExpandRef, {
|
|
50
|
+
screen: 'desktop'
|
|
51
|
+
});
|
|
52
|
+
}
|
|
43
53
|
} else {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
54
|
+
if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
|
|
55
|
+
var _onCollapseRef$curren;
|
|
56
|
+
(_onCollapseRef$curren = onCollapseRef.current) === null || _onCollapseRef$curren === void 0 || _onCollapseRef$curren.call(onCollapseRef, {
|
|
57
|
+
screen: 'desktop',
|
|
58
|
+
trigger: lastTrigger
|
|
59
|
+
});
|
|
60
|
+
} else {
|
|
61
|
+
var _onCollapseRef$curren2;
|
|
62
|
+
(_onCollapseRef$curren2 = onCollapseRef.current) === null || _onCollapseRef$curren2 === void 0 || _onCollapseRef$curren2.call(onCollapseRef, {
|
|
63
|
+
screen: 'desktop'
|
|
64
|
+
});
|
|
65
|
+
}
|
|
48
66
|
}
|
|
49
|
-
}, [previousIsExpandedOnDesktop, isExpandedOnDesktop]);
|
|
67
|
+
}, [previousIsExpandedOnDesktop, isExpandedOnDesktop, lastTrigger]);
|
|
50
68
|
var previousIsExpandedOnMobile = (0, _usePreviousValue.default)(isExpandedOnMobile);
|
|
51
69
|
(0, _react.useEffect)(function () {
|
|
52
70
|
if (previousIsExpandedOnMobile === undefined || previousIsExpandedOnMobile === isExpandedOnMobile) {
|
|
@@ -60,15 +78,31 @@ function useSideNavVisibilityCallbacks(_ref) {
|
|
|
60
78
|
return;
|
|
61
79
|
}
|
|
62
80
|
if (isExpandedOnMobile) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
81
|
+
if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
|
|
82
|
+
var _onExpandRef$current3;
|
|
83
|
+
(_onExpandRef$current3 = onExpandRef.current) === null || _onExpandRef$current3 === void 0 || _onExpandRef$current3.call(onExpandRef, {
|
|
84
|
+
screen: 'mobile',
|
|
85
|
+
trigger: lastTrigger
|
|
86
|
+
});
|
|
87
|
+
} else {
|
|
88
|
+
var _onExpandRef$current4;
|
|
89
|
+
(_onExpandRef$current4 = onExpandRef.current) === null || _onExpandRef$current4 === void 0 || _onExpandRef$current4.call(onExpandRef, {
|
|
90
|
+
screen: 'mobile'
|
|
91
|
+
});
|
|
92
|
+
}
|
|
67
93
|
} else {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
94
|
+
if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
|
|
95
|
+
var _onCollapseRef$curren3;
|
|
96
|
+
(_onCollapseRef$curren3 = onCollapseRef.current) === null || _onCollapseRef$curren3 === void 0 || _onCollapseRef$curren3.call(onCollapseRef, {
|
|
97
|
+
screen: 'mobile',
|
|
98
|
+
trigger: lastTrigger
|
|
99
|
+
});
|
|
100
|
+
} else {
|
|
101
|
+
var _onCollapseRef$curren4;
|
|
102
|
+
(_onCollapseRef$curren4 = onCollapseRef.current) === null || _onCollapseRef$curren4 === void 0 || _onCollapseRef$curren4.call(onCollapseRef, {
|
|
103
|
+
screen: 'mobile'
|
|
104
|
+
});
|
|
105
|
+
}
|
|
72
106
|
}
|
|
73
|
-
}, [previousIsExpandedOnMobile, isExpandedOnMobile]);
|
|
107
|
+
}, [previousIsExpandedOnMobile, isExpandedOnMobile, lastTrigger]);
|
|
74
108
|
}
|
|
@@ -13,9 +13,12 @@ var _visibilityContext = require("./visibility-context");
|
|
|
13
13
|
*
|
|
14
14
|
* It will toggle the appropriate internal desktop or mobile side nav visibility state based on the current screen size.
|
|
15
15
|
*
|
|
16
|
-
* If you need a function to make the side nav visible, use `
|
|
16
|
+
* If you need a function to make the side nav visible, use `useExpandSideNav` instead.
|
|
17
17
|
*/
|
|
18
18
|
function useToggleSideNav() {
|
|
19
|
+
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
20
|
+
_ref$trigger = _ref.trigger,
|
|
21
|
+
trigger = _ref$trigger === void 0 ? 'programmatic' : _ref$trigger;
|
|
19
22
|
var setSideNavState = (0, _react.useContext)(_visibilityContext.SetSideNavVisibilityState);
|
|
20
23
|
var toggleSideNav = (0, _react.useCallback)(function () {
|
|
21
24
|
var _window$matchMedia = window.matchMedia('(min-width: 64rem)'),
|
|
@@ -30,7 +33,8 @@ function useToggleSideNav() {
|
|
|
30
33
|
return {
|
|
31
34
|
mobile: currentState.mobile,
|
|
32
35
|
desktop: currentState.desktop === 'expanded' ? 'collapsed' : 'expanded',
|
|
33
|
-
flyout: 'closed'
|
|
36
|
+
flyout: 'closed',
|
|
37
|
+
lastTrigger: trigger
|
|
34
38
|
};
|
|
35
39
|
});
|
|
36
40
|
} else {
|
|
@@ -43,10 +47,11 @@ function useToggleSideNav() {
|
|
|
43
47
|
return {
|
|
44
48
|
desktop: currentState.desktop,
|
|
45
49
|
mobile: currentState.mobile === 'expanded' ? 'collapsed' : 'expanded',
|
|
46
|
-
flyout: 'closed'
|
|
50
|
+
flyout: 'closed',
|
|
51
|
+
lastTrigger: trigger
|
|
47
52
|
};
|
|
48
53
|
});
|
|
49
54
|
}
|
|
50
|
-
}, [setSideNavState]);
|
|
55
|
+
}, [setSideNavState, trigger]);
|
|
51
56
|
return toggleSideNav;
|
|
52
57
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import "./menu-section-heading.compiled.css";
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { ax, ix } from "@compiled/react/runtime";
|
|
5
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
5
6
|
import { useMenuSectionContext } from './menu-section-context';
|
|
6
7
|
const styles = {
|
|
7
8
|
root: "_11c81vhk _1rjcu2gc _syaz131l _bozg12x7"
|
|
@@ -16,7 +17,10 @@ export const MenuSectionHeading = ({
|
|
|
16
17
|
children
|
|
17
18
|
}) => {
|
|
18
19
|
const id = useMenuSectionContext();
|
|
19
|
-
return /*#__PURE__*/React.createElement("
|
|
20
|
+
return fg('platform_dst_nav4_menu_section_heading_a11y') ? /*#__PURE__*/React.createElement("p", {
|
|
21
|
+
id: `${id}-heading`,
|
|
22
|
+
className: ax([styles.root])
|
|
23
|
+
}, children) : /*#__PURE__*/React.createElement("h2", {
|
|
20
24
|
id: `${id}-heading`,
|
|
21
25
|
className: ax([styles.root])
|
|
22
26
|
}, children);
|
|
@@ -26,7 +26,9 @@ export const SideNavPanelSplitter = ({
|
|
|
26
26
|
}) => {
|
|
27
27
|
const context = useContext(PanelSplitterContext);
|
|
28
28
|
invariant((context === null || context === void 0 ? void 0 : context.panelId) === sideNavPanelSplitterId, 'SideNavPanelSplitter must be rendered as a child of <SideNav />.');
|
|
29
|
-
const toggleSideNav = useToggleSideNav(
|
|
29
|
+
const toggleSideNav = useToggleSideNav({
|
|
30
|
+
trigger: 'double-click'
|
|
31
|
+
});
|
|
30
32
|
return /*#__PURE__*/React.createElement(OnDoubleClickContext.Provider, {
|
|
31
33
|
value: shouldCollapseOnDoubleClick ? toggleSideNav : undefined
|
|
32
34
|
}, /*#__PURE__*/React.createElement(PanelSplitter, {
|
|
@@ -66,10 +66,13 @@ function SideNavInternal({
|
|
|
66
66
|
onCollapse,
|
|
67
67
|
id: providedId
|
|
68
68
|
}) {
|
|
69
|
+
var _sideNavState$lastTri;
|
|
69
70
|
const id = useLayoutId({
|
|
70
71
|
providedId
|
|
71
72
|
});
|
|
72
|
-
const expandSideNav = useExpandSideNav(
|
|
73
|
+
const expandSideNav = useExpandSideNav({
|
|
74
|
+
trigger: 'skip-link'
|
|
75
|
+
});
|
|
73
76
|
/**
|
|
74
77
|
* Called after clicking on the side nav skip link, and ensures the side nav is expanded so that it is focusable.
|
|
75
78
|
*
|
|
@@ -139,8 +142,7 @@ function SideNavInternal({
|
|
|
139
142
|
setSideNavState(currentState => {
|
|
140
143
|
if ((currentState === null || currentState === void 0 ? void 0 : currentState.desktop) === 'collapsed' && (currentState === null || currentState === void 0 ? void 0 : currentState.flyout) !== 'open') {
|
|
141
144
|
return {
|
|
142
|
-
|
|
143
|
-
mobile: currentState.mobile,
|
|
145
|
+
...currentState,
|
|
144
146
|
flyout: 'open'
|
|
145
147
|
};
|
|
146
148
|
}
|
|
@@ -155,8 +157,7 @@ function SideNavInternal({
|
|
|
155
157
|
setSideNavState(currentState => {
|
|
156
158
|
if ((currentState === null || currentState === void 0 ? void 0 : currentState.desktop) === 'collapsed' && (currentState === null || currentState === void 0 ? void 0 : currentState.flyout) === 'open') {
|
|
157
159
|
return {
|
|
158
|
-
|
|
159
|
-
mobile: currentState.mobile,
|
|
160
|
+
...currentState,
|
|
160
161
|
flyout: 'triggered-animate-close'
|
|
161
162
|
};
|
|
162
163
|
}
|
|
@@ -221,33 +222,55 @@ function SideNavInternal({
|
|
|
221
222
|
}
|
|
222
223
|
};
|
|
223
224
|
}, [openLayerObserver, setSideNavState]);
|
|
224
|
-
const
|
|
225
|
+
const toggleVisibilityByScreenResize = useToggleSideNav({
|
|
226
|
+
trigger: 'screen-resize'
|
|
227
|
+
});
|
|
228
|
+
const toggleVisibilityByClickOutsideOnMobile = useToggleSideNav({
|
|
229
|
+
trigger: 'click-outside-on-mobile'
|
|
230
|
+
});
|
|
225
231
|
useEffect(() => {
|
|
226
232
|
// Sync the visibility in context (provided in `<Root>`) with the local `defaultCollapsed` prop provided to `SideNav`
|
|
227
233
|
// after SSR hydration. This should only run once, after the initial render on the client.
|
|
228
234
|
setSideNavState({
|
|
229
235
|
desktop: initialDefaultCollapsed ? 'collapsed' : 'expanded',
|
|
230
236
|
mobile: 'collapsed',
|
|
231
|
-
flyout: 'closed'
|
|
237
|
+
flyout: 'closed',
|
|
238
|
+
lastTrigger: null
|
|
232
239
|
});
|
|
233
240
|
}, [initialDefaultCollapsed, setSideNavState]);
|
|
234
241
|
const handleExpand = useCallback(({
|
|
235
|
-
screen
|
|
242
|
+
screen,
|
|
243
|
+
trigger
|
|
236
244
|
}) => {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
245
|
+
if (fg('navx-full-height-sidebar')) {
|
|
246
|
+
onExpand === null || onExpand === void 0 ? void 0 : onExpand({
|
|
247
|
+
screen,
|
|
248
|
+
trigger
|
|
249
|
+
});
|
|
250
|
+
} else {
|
|
251
|
+
onExpand === null || onExpand === void 0 ? void 0 : onExpand({
|
|
252
|
+
screen
|
|
253
|
+
});
|
|
254
|
+
}
|
|
240
255
|
|
|
241
256
|
// When the side nav gets expanded, we close the flyout to reset it.
|
|
242
257
|
// This prevents the flyout from staying open and ensures we are respecting the user's intent to expand.
|
|
243
258
|
updateFlyoutState('force-close');
|
|
244
259
|
}, [onExpand, updateFlyoutState]);
|
|
245
260
|
const handleCollapse = useCallback(({
|
|
246
|
-
screen
|
|
261
|
+
screen,
|
|
262
|
+
trigger
|
|
247
263
|
}) => {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
264
|
+
if (fg('navx-full-height-sidebar')) {
|
|
265
|
+
onCollapse === null || onCollapse === void 0 ? void 0 : onCollapse({
|
|
266
|
+
screen,
|
|
267
|
+
trigger
|
|
268
|
+
});
|
|
269
|
+
} else {
|
|
270
|
+
onCollapse === null || onCollapse === void 0 ? void 0 : onCollapse({
|
|
271
|
+
screen
|
|
272
|
+
});
|
|
273
|
+
}
|
|
251
274
|
|
|
252
275
|
// When the side nav gets collapsed, we close the flyout to reset it.
|
|
253
276
|
// This prevents the flyout from staying open and ensures we are respecting the user's intent to collapse.
|
|
@@ -257,7 +280,8 @@ function SideNavInternal({
|
|
|
257
280
|
onExpand: handleExpand,
|
|
258
281
|
onCollapse: handleCollapse,
|
|
259
282
|
isExpandedOnDesktop,
|
|
260
|
-
isExpandedOnMobile
|
|
283
|
+
isExpandedOnMobile,
|
|
284
|
+
lastTrigger: (_sideNavState$lastTri = sideNavState === null || sideNavState === void 0 ? void 0 : sideNavState.lastTrigger) !== null && _sideNavState$lastTri !== void 0 ? _sideNavState$lastTri : null
|
|
261
285
|
});
|
|
262
286
|
useEffect(() => {
|
|
263
287
|
const mediaQueryList = window.matchMedia('(min-width: 64rem)');
|
|
@@ -268,12 +292,12 @@ function SideNavInternal({
|
|
|
268
292
|
// We're transitioning from tablet to desktop viewport size.
|
|
269
293
|
// We forcibly show the side nav if it was shown on mobile.
|
|
270
294
|
if (isExpandedOnMobile && !isExpandedOnDesktop) {
|
|
271
|
-
|
|
295
|
+
toggleVisibilityByScreenResize();
|
|
272
296
|
}
|
|
273
297
|
}
|
|
274
298
|
}
|
|
275
299
|
});
|
|
276
|
-
}, [
|
|
300
|
+
}, [toggleVisibilityByScreenResize, isExpandedOnDesktop, isExpandedOnMobile]);
|
|
277
301
|
|
|
278
302
|
/**
|
|
279
303
|
* Close the mobile side nav if there is a click outside.
|
|
@@ -330,10 +354,10 @@ function SideNavInternal({
|
|
|
330
354
|
// In either case keeping the SideNav expanded makes sense.
|
|
331
355
|
return;
|
|
332
356
|
}
|
|
333
|
-
|
|
357
|
+
toggleVisibilityByClickOutsideOnMobile();
|
|
334
358
|
}
|
|
335
359
|
});
|
|
336
|
-
}, [id, isExpandedOnMobile, toggleButtonElement,
|
|
360
|
+
}, [id, isExpandedOnMobile, toggleButtonElement, toggleVisibilityByClickOutsideOnMobile]);
|
|
337
361
|
useEffect(() => {
|
|
338
362
|
if (!toggleButtonElement) {
|
|
339
363
|
return;
|
|
@@ -62,7 +62,9 @@ export const SideNavToggleButton = ({
|
|
|
62
62
|
}
|
|
63
63
|
});
|
|
64
64
|
}, [isSideNavExpandedOnDesktop, isSideNavExpandedOnMobile]);
|
|
65
|
-
const toggleVisibility = useToggleSideNav(
|
|
65
|
+
const toggleVisibility = useToggleSideNav({
|
|
66
|
+
trigger: 'toggle-button'
|
|
67
|
+
});
|
|
66
68
|
const handleClick = useCallback((event, analyticsEvent) => {
|
|
67
69
|
onClick === null || onClick === void 0 ? void 0 : onClick(event, analyticsEvent, {
|
|
68
70
|
isSideNavVisible: isSideNavExpanded
|
|
@@ -9,7 +9,9 @@ import { SetSideNavVisibilityState } from './visibility-context';
|
|
|
9
9
|
*
|
|
10
10
|
* If you need a function to toggle the side nav, use `useToggleSideNav` instead.
|
|
11
11
|
*/
|
|
12
|
-
export function useExpandSideNav(
|
|
12
|
+
export function useExpandSideNav({
|
|
13
|
+
trigger = 'programmatic'
|
|
14
|
+
} = {}) {
|
|
13
15
|
const setSideNavState = useContext(SetSideNavVisibilityState);
|
|
14
16
|
const expandSideNav = useCallback(() => {
|
|
15
17
|
const {
|
|
@@ -30,7 +32,8 @@ export function useExpandSideNav() {
|
|
|
30
32
|
return {
|
|
31
33
|
mobile: currentState.mobile,
|
|
32
34
|
desktop: 'expanded',
|
|
33
|
-
flyout: 'closed'
|
|
35
|
+
flyout: 'closed',
|
|
36
|
+
lastTrigger: trigger
|
|
34
37
|
};
|
|
35
38
|
});
|
|
36
39
|
} else {
|
|
@@ -48,10 +51,11 @@ export function useExpandSideNav() {
|
|
|
48
51
|
return {
|
|
49
52
|
desktop: currentState.desktop,
|
|
50
53
|
mobile: 'expanded',
|
|
51
|
-
flyout: 'closed'
|
|
54
|
+
flyout: 'closed',
|
|
55
|
+
lastTrigger: trigger
|
|
52
56
|
};
|
|
53
57
|
});
|
|
54
58
|
}
|
|
55
|
-
}, [setSideNavState]);
|
|
59
|
+
}, [setSideNavState, trigger]);
|
|
56
60
|
return expandSideNav;
|
|
57
61
|
}
|