@atlaskit/navigation-system 2.1.3 → 2.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 (28) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +3 -1
  3. package/dist/cjs/ui/page-layout/side-nav/side-nav.js +48 -24
  4. package/dist/cjs/ui/page-layout/side-nav/toggle-button.js +3 -1
  5. package/dist/cjs/ui/page-layout/side-nav/use-expand-side-nav.js +8 -3
  6. package/dist/cjs/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +53 -19
  7. package/dist/cjs/ui/page-layout/side-nav/use-toggle-side-nav.js +9 -4
  8. package/dist/es2019/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +3 -1
  9. package/dist/es2019/ui/page-layout/side-nav/side-nav.js +44 -20
  10. package/dist/es2019/ui/page-layout/side-nav/toggle-button.js +3 -1
  11. package/dist/es2019/ui/page-layout/side-nav/use-expand-side-nav.js +8 -4
  12. package/dist/es2019/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +53 -19
  13. package/dist/es2019/ui/page-layout/side-nav/use-toggle-side-nav.js +9 -5
  14. package/dist/esm/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +3 -1
  15. package/dist/esm/ui/page-layout/side-nav/side-nav.js +48 -24
  16. package/dist/esm/ui/page-layout/side-nav/toggle-button.js +3 -1
  17. package/dist/esm/ui/page-layout/side-nav/use-expand-side-nav.js +8 -3
  18. package/dist/esm/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +53 -19
  19. package/dist/esm/ui/page-layout/side-nav/use-toggle-side-nav.js +9 -4
  20. package/dist/types/ui/page-layout/side-nav/types.d.ts +19 -0
  21. package/dist/types/ui/page-layout/side-nav/use-expand-side-nav.d.ts +5 -1
  22. package/dist/types/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.d.ts +4 -1
  23. package/dist/types/ui/page-layout/side-nav/use-toggle-side-nav.d.ts +6 -2
  24. package/dist/types-ts4.5/ui/page-layout/side-nav/types.d.ts +19 -0
  25. package/dist/types-ts4.5/ui/page-layout/side-nav/use-expand-side-nav.d.ts +5 -1
  26. package/dist/types-ts4.5/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.d.ts +4 -1
  27. package/dist/types-ts4.5/ui/page-layout/side-nav/use-toggle-side-nav.d.ts +6 -2
  28. package/package.json +4 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @atlassian/navigation-system
2
2
 
3
+ ## 2.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`cf5e597de761c`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/cf5e597de761c) -
8
+ Adds a trigger value to the side nav's `onExpand` and `onCollapse` callbacks, allowing consumers
9
+ to identify the method used to expand or collapse the side nav. Also adds the ability to define
10
+ the trigger value when using the `useToggleSideNav` and `useExpandSideNav` hooks. This change is
11
+ behind the `navx-full-height-sidebar` feature gate.
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies
16
+
3
17
  ## 2.1.3
4
18
 
5
19
  ### Patch Changes
@@ -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 toggleVisibility = (0, _useToggleSideNav.useToggleSideNav)();
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
- onExpand === null || onExpand === void 0 || onExpand({
254
- screen: screen
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
- onCollapse === null || onCollapse === void 0 || onCollapse({
264
- screen: screen
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
- toggleVisibility();
310
+ toggleVisibilityByScreenResize();
287
311
  }
288
312
  }
289
313
  }
290
314
  });
291
- }, [toggleVisibility, isExpandedOnDesktop, isExpandedOnMobile]);
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
- toggleVisibility();
372
+ toggleVisibilityByClickOutsideOnMobile();
349
373
  }
350
374
  });
351
- }, [id, isExpandedOnMobile, toggleButtonElement, toggleVisibility]);
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
- var _onExpandRef$current;
40
- (_onExpandRef$current = onExpandRef.current) === null || _onExpandRef$current === void 0 || _onExpandRef$current.call(onExpandRef, {
41
- screen: 'desktop'
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
- var _onCollapseRef$curren;
45
- (_onCollapseRef$curren = onCollapseRef.current) === null || _onCollapseRef$curren === void 0 || _onCollapseRef$curren.call(onCollapseRef, {
46
- screen: 'desktop'
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
- var _onExpandRef$current2;
64
- (_onExpandRef$current2 = onExpandRef.current) === null || _onExpandRef$current2 === void 0 || _onExpandRef$current2.call(onExpandRef, {
65
- screen: 'mobile'
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
- var _onCollapseRef$curren2;
69
- (_onCollapseRef$curren2 = onCollapseRef.current) === null || _onCollapseRef$curren2 === void 0 || _onCollapseRef$curren2.call(onCollapseRef, {
70
- screen: 'mobile'
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 `useShowSideNav` instead.
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
  }
@@ -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
- desktop: currentState.desktop,
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
- desktop: currentState.desktop,
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 toggleVisibility = useToggleSideNav();
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
- onExpand === null || onExpand === void 0 ? void 0 : onExpand({
238
- screen
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
- onCollapse === null || onCollapse === void 0 ? void 0 : onCollapse({
249
- screen
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
- toggleVisibility();
295
+ toggleVisibilityByScreenResize();
272
296
  }
273
297
  }
274
298
  }
275
299
  });
276
- }, [toggleVisibility, isExpandedOnDesktop, isExpandedOnMobile]);
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
- toggleVisibility();
357
+ toggleVisibilityByClickOutsideOnMobile();
334
358
  }
335
359
  });
336
- }, [id, isExpandedOnMobile, toggleButtonElement, toggleVisibility]);
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
  }