@atlaskit/navigation-system 5.2.0 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cjs/ui/menu-item/button-menu-item.js +9 -6
  3. package/dist/cjs/ui/menu-item/menu-item.compiled.css +2 -0
  4. package/dist/cjs/ui/menu-item/menu-item.js +1 -1
  5. package/dist/cjs/ui/page-layout/side-nav/side-nav.js +76 -8
  6. package/dist/cjs/ui/page-layout/side-nav/toggle-button.js +28 -2
  7. package/dist/cjs/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +4 -4
  8. package/dist/cjs/ui/page-layout/side-nav/visibility-provider.js +2 -1
  9. package/dist/es2019/ui/menu-item/button-menu-item.js +34 -30
  10. package/dist/es2019/ui/menu-item/menu-item.compiled.css +2 -0
  11. package/dist/es2019/ui/menu-item/menu-item.js +1 -1
  12. package/dist/es2019/ui/page-layout/side-nav/side-nav.js +71 -4
  13. package/dist/es2019/ui/page-layout/side-nav/toggle-button.js +29 -2
  14. package/dist/es2019/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +4 -4
  15. package/dist/es2019/ui/page-layout/side-nav/visibility-provider.js +2 -1
  16. package/dist/esm/ui/menu-item/button-menu-item.js +9 -7
  17. package/dist/esm/ui/menu-item/menu-item.compiled.css +2 -0
  18. package/dist/esm/ui/menu-item/menu-item.js +1 -1
  19. package/dist/esm/ui/page-layout/side-nav/side-nav.js +76 -8
  20. package/dist/esm/ui/page-layout/side-nav/toggle-button.js +28 -2
  21. package/dist/esm/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +4 -4
  22. package/dist/esm/ui/page-layout/side-nav/visibility-provider.js +2 -1
  23. package/dist/types/ui/menu-item/button-menu-item.d.ts +14 -5
  24. package/dist/types/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.d.ts +0 -4
  25. package/dist/types/ui/menu-item/flyout-menu-item/flyout-menu-item-trigger.d.ts +0 -4
  26. package/dist/types/ui/menu-item/menu-item.d.ts +0 -1
  27. package/dist/types/ui/menu-item/types.d.ts +4 -0
  28. package/dist/types/ui/page-layout/panel-splitter/context.d.ts +1 -1
  29. package/dist/types/ui/page-layout/side-nav/side-nav.d.ts +2 -2
  30. package/dist/types-ts4.5/ui/menu-item/button-menu-item.d.ts +14 -5
  31. package/dist/types-ts4.5/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.d.ts +0 -4
  32. package/dist/types-ts4.5/ui/menu-item/flyout-menu-item/flyout-menu-item-trigger.d.ts +0 -4
  33. package/dist/types-ts4.5/ui/menu-item/menu-item.d.ts +0 -1
  34. package/dist/types-ts4.5/ui/menu-item/types.d.ts +4 -0
  35. package/dist/types-ts4.5/ui/page-layout/panel-splitter/context.d.ts +1 -1
  36. package/dist/types-ts4.5/ui/page-layout/side-nav/side-nav.d.ts +2 -2
  37. package/package.json +12 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @atlassian/navigation-system
2
2
 
3
+ ## 5.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`8f79c1a030071`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/8f79c1a030071) -
8
+ References to the `platform-dst-tooltip-shortcuts` feature flag have been removed from prop
9
+ JSDocs.
10
+ - Updated dependencies
11
+
12
+ ## 5.3.0
13
+
14
+ ### Minor Changes
15
+
16
+ - [`c8cb0a09979c1`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/c8cb0a09979c1) -
17
+ Adds instrumentation to the side navigation behind the `platform_dst_nav4_fhs_instrumentation_1`
18
+ feature gate.
19
+ - [`c8cb0a09979c1`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/c8cb0a09979c1) -
20
+ Changes the `trigger` property in the side nav `onExpand` and `onCollapse` callbacks to be exposed
21
+ behind the `platform_dst_nav4_fhs_instrumentation_1` feature gate instead of the
22
+ `navx-full-height-sidebar` feature gate. The `platform_dst_nav4_fhs_instrumentation_1` feature
23
+ gate is intended to roll out sooner.
24
+ - [`f942d05c8a8f2`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/f942d05c8a8f2) -
25
+ Adds support for selected state in ButtonMenuItem component (under feature gate
26
+ platform-dst-buttonmenuitem-selected-state-support)
27
+
3
28
  ## 5.2.0
4
29
 
5
30
  ### Minor Changes
@@ -6,15 +6,10 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.ButtonMenuItem = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
9
10
  var _menuItem = require("./menu-item");
10
11
  var _menuListItem = require("./menu-list-item");
11
12
  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); }
12
- /**
13
- * We intentionally do not support the `isSelected` prop (which other menu item components
14
- * support) because `ButtonMenuItem`s do not correspond to a "page", so can't be navigated
15
- * to and become in a selected state.
16
- */
17
-
18
13
  /**
19
14
  * __ButtonMenuItem__
20
15
  *
@@ -27,9 +22,13 @@ var ButtonMenuItem = exports.ButtonMenuItem = /*#__PURE__*/(0, _react.forwardRef
27
22
  description = _ref.description,
28
23
  elemAfter = _ref.elemAfter,
29
24
  isDisabled = _ref.isDisabled,
25
+ isSelected = _ref.isSelected,
30
26
  elemBefore = _ref.elemBefore,
31
27
  actionsOnHover = _ref.actionsOnHover,
32
28
  onClick = _ref.onClick,
29
+ ariaControls = _ref['aria-controls'],
30
+ ariaExpanded = _ref['aria-expanded'],
31
+ ariaHasPopup = _ref['aria-haspopup'],
33
32
  interactionName = _ref.interactionName,
34
33
  isContentTooltipDisabled = _ref.isContentTooltipDisabled,
35
34
  visualContentRef = _ref.visualContentRef,
@@ -52,6 +51,10 @@ var ButtonMenuItem = exports.ButtonMenuItem = /*#__PURE__*/(0, _react.forwardRef
52
51
  actions: isDisabled ? undefined : actions,
53
52
  actionsOnHover: isDisabled ? undefined : actionsOnHover,
54
53
  onClick: onClick,
54
+ ariaControls: (0, _platformFeatureFlags.fg)('platform-dst-buttonmenuitem-selected-state-support') ? ariaControls : undefined,
55
+ ariaExpanded: (0, _platformFeatureFlags.fg)('platform-dst-buttonmenuitem-selected-state-support') ? ariaExpanded : undefined,
56
+ ariaHasPopup: (0, _platformFeatureFlags.fg)('platform-dst-buttonmenuitem-selected-state-support') ? ariaHasPopup : undefined,
57
+ isSelected: (0, _platformFeatureFlags.fg)('platform-dst-buttonmenuitem-selected-state-support') ? isSelected : undefined,
55
58
  ref: forwardedRef,
56
59
  visualContentRef: visualContentRef,
57
60
  interactionName: interactionName,
@@ -57,6 +57,7 @@
57
57
  ._bfhk1o0g{background-color:var(--notch-color)}
58
58
  ._bfhkcdhy{background-color:var(--ds-background-neutral-bold,#44546f)}
59
59
  ._bfhkfg4m{background-color:var(--ds-background-selected,#e9f2ff)}
60
+ ._bfhkn7od{background-color:unset}
60
61
  ._bozg12x7{padding-inline-start:var(--ds-space-075,6px)}
61
62
  ._bozg1b66{padding-inline-start:var(--ds-space-050,4px)}
62
63
  ._db801b66{--actions-on-hover-padding:var(--ds-space-050,4px)}
@@ -96,6 +97,7 @@
96
97
  ._11om6b4r:hover{animation-name:k1xyysw3}
97
98
  ._1sjuglyw:hover{--elem-after-display:none}
98
99
  ._1uy01amc:hover{animation-delay:.8s}
100
+ ._30l31lh4:hover{color:var(--ds-text-disabled,#091e424f)}
99
101
  ._30l3aqb7:hover{color:var(--ds-text-selected,#0c66e4)}
100
102
  ._7psyru3m:hover{animation-duration:0s}
101
103
  ._bir2q7pw:hover{animation-fill-mode:forwards}
@@ -154,7 +154,7 @@ var containerStyles = {
154
154
  showHoverActions: "_uomdkb7n _pmxp1wug _db801b66",
155
155
  removeElemAfterOnHoverOrOpenNestedPopup: "_1djyglyw _1mfcglyw _1sjuglyw",
156
156
  selected: "_bfhkfg4m _syazaqb7 _1yyu1fvw _1swvi1yw _30l3aqb7 _irr3i1yw",
157
- disabled: "_syaz1lh4 _irr3n7od",
157
+ disabled: "_syaz1lh4 _bfhkn7od _irr3n7od _30l31lh4",
158
158
  hasDescription: "_4t3i1wto",
159
159
  dragging: "_tzy41ou4"
160
160
  };
@@ -17,6 +17,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
17
17
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
18
18
  var _bindEventListener = require("bind-event-listener");
19
19
  var _reactDom = require("react-dom");
20
+ var _analyticsNext = require("@atlaskit/analytics-next");
20
21
  var _mergeRefs = _interopRequireDefault(require("@atlaskit/ds-lib/merge-refs"));
21
22
  var _useStableRef = _interopRequireDefault(require("@atlaskit/ds-lib/use-stable-ref"));
22
23
  var _openLayerObserver = require("@atlaskit/layering/experimental/open-layer-observer");
@@ -144,15 +145,43 @@ function SideNavInternal(_ref) {
144
145
  var _useState = (0, _react.useState)(defaultCollapsed),
145
146
  _useState2 = (0, _slicedToArray2.default)(_useState, 1),
146
147
  initialDefaultCollapsed = _useState2[0];
148
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
149
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
150
+ var _useState3 = (0, _react.useState)(isExpandedOnDesktop),
151
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 1),
152
+ initialIsExpandedOnDesktop = _useState4[0];
153
+
154
+ /**
155
+ * Captures the initial collapsed/expanded state of the side nav.
156
+ *
157
+ * Only firing on desktop because the nav is never open by default on mobile.
158
+ */
159
+ (0, _react.useEffect)(function () {
160
+ if (initialIsExpandedOnDesktop && (0, _platformFeatureFlags.fg)('platform_dst_nav4_fhs_instrumentation_1')) {
161
+ var isDesktop = window.matchMedia('(min-width: 64rem)').matches;
162
+ if (isDesktop) {
163
+ var navigationAnalyticsEvent = createAnalyticsEvent({
164
+ source: 'topNav',
165
+ actionSubject: 'sideNav',
166
+ action: 'viewed',
167
+ actionSubjectId: 'sideNavMenu',
168
+ attributes: {
169
+ screen: 'desktop'
170
+ }
171
+ });
172
+ navigationAnalyticsEvent.fire('navigation');
173
+ }
174
+ }
175
+ }, [createAnalyticsEvent, initialIsExpandedOnDesktop]);
147
176
  var defaultWidth = (0, _useSafeDefaultWidth.useSafeDefaultWidth)({
148
177
  defaultWidthProp: defaultWidthProp,
149
178
  fallbackDefaultWidth: fallbackDefaultWidth,
150
179
  slotName: 'SideNav'
151
180
  });
152
- var _useState3 = (0, _react.useState)(defaultWidth),
153
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
154
- width = _useState4[0],
155
- setWidth = _useState4[1];
181
+ var _useState5 = (0, _react.useState)(defaultWidth),
182
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
183
+ width = _useState6[0],
184
+ setWidth = _useState6[1];
156
185
  var clampedWidth = "clamp(".concat(widthResizeBounds.min, ", ").concat(width, "px, ").concat(widthResizeBounds.max, ")");
157
186
  var dangerouslyHoistSlotSizes = (0, _react.useContext)(_hoistSlotSizesContext.DangerouslyHoistSlotSizes);
158
187
  var navRef = (0, _react.useRef)(null);
@@ -304,10 +333,29 @@ function SideNavInternal(_ref) {
304
333
  var toggleVisibilityByClickOutsideOnMobile = (0, _useToggleSideNav.useToggleSideNav)({
305
334
  trigger: 'click-outside-on-mobile'
306
335
  });
336
+ (0, _react.useEffect)(function () {
337
+ if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_side_nav_default_collapsed_api')) {
338
+ // This is the old version of the hook, so we skip it when the flag is enabled
339
+ return;
340
+ }
341
+
342
+ // Sync the visibility in context (provided in `<Root>`) with the local `defaultCollapsed` prop provided to `SideNav`
343
+ // after SSR hydration. This should only run once, after the initial render on the client.
344
+ setSideNavState({
345
+ desktop: initialDefaultCollapsed ? 'collapsed' : 'expanded',
346
+ mobile: 'collapsed',
347
+ flyout: 'closed',
348
+ lastTrigger: null
349
+ });
350
+ }, [initialDefaultCollapsed, setSideNavState]);
307
351
 
308
352
  // Moving to `useLayoutEffect` so that there's no visual shift in non-SSR environments when using legacy API
309
353
  // For SSR the new API is still necessary
310
354
  (0, _react.useLayoutEffect)(function () {
355
+ if (!(0, _platformFeatureFlags.fg)('platform_dst_nav4_side_nav_default_collapsed_api')) {
356
+ // This is the new version of the hook, so we skip it when the flag is disabled
357
+ return;
358
+ }
311
359
  if (sideNavState !== null) {
312
360
  // Only need to do an initial sync if it hasn't been initialized from Root
313
361
  return;
@@ -325,11 +373,21 @@ function SideNavInternal(_ref) {
325
373
  var handleExpand = (0, _react.useCallback)(function (_ref2) {
326
374
  var screen = _ref2.screen,
327
375
  trigger = _ref2.trigger;
328
- if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
376
+ if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_fhs_instrumentation_1')) {
329
377
  onExpand === null || onExpand === void 0 || onExpand({
330
378
  screen: screen,
331
379
  trigger: trigger
332
380
  });
381
+ var navigationAnalyticsEvent = createAnalyticsEvent({
382
+ source: 'topNav',
383
+ actionSubject: 'sideNav',
384
+ action: 'expanded',
385
+ actionSubjectId: 'sideNavMenu',
386
+ attributes: {
387
+ trigger: trigger
388
+ }
389
+ });
390
+ navigationAnalyticsEvent.fire('navigation');
333
391
  } else {
334
392
  onExpand === null || onExpand === void 0 || onExpand({
335
393
  screen: screen
@@ -339,15 +397,25 @@ function SideNavInternal(_ref) {
339
397
  // When the side nav gets expanded, we close the flyout to reset it.
340
398
  // This prevents the flyout from staying open and ensures we are respecting the user's intent to expand.
341
399
  updateFlyoutState('force-close');
342
- }, [onExpand, updateFlyoutState]);
400
+ }, [onExpand, updateFlyoutState, createAnalyticsEvent]);
343
401
  var handleCollapse = (0, _react.useCallback)(function (_ref3) {
344
402
  var screen = _ref3.screen,
345
403
  trigger = _ref3.trigger;
346
- if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
404
+ if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_fhs_instrumentation_1')) {
347
405
  onCollapse === null || onCollapse === void 0 || onCollapse({
348
406
  screen: screen,
349
407
  trigger: trigger
350
408
  });
409
+ var navigationAnalyticsEvent = createAnalyticsEvent({
410
+ source: 'topNav',
411
+ actionSubject: 'sideNav',
412
+ action: 'collapsed',
413
+ actionSubjectId: 'sideNavMenu',
414
+ attributes: {
415
+ trigger: trigger
416
+ }
417
+ });
418
+ navigationAnalyticsEvent.fire('navigation');
351
419
  } else {
352
420
  onCollapse === null || onCollapse === void 0 || onCollapse({
353
421
  screen: screen
@@ -357,7 +425,7 @@ function SideNavInternal(_ref) {
357
425
  // When the side nav gets collapsed, we close the flyout to reset it.
358
426
  // This prevents the flyout from staying open and ensures we are respecting the user's intent to collapse.
359
427
  updateFlyoutState('force-close');
360
- }, [onCollapse, updateFlyoutState]);
428
+ }, [onCollapse, updateFlyoutState, createAnalyticsEvent]);
361
429
  (0, _useSideNavVisibilityCallbacks.useSideNavVisibilityCallbacks)({
362
430
  onExpand: handleExpand,
363
431
  onCollapse: handleCollapse,
@@ -13,6 +13,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
13
13
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
  var _bindEventListener = require("bind-event-listener");
16
+ var _analyticsNext = require("@atlaskit/analytics-next");
16
17
  var _sidebarCollapse = _interopRequireDefault(require("@atlaskit/icon/core/sidebar-collapse"));
17
18
  var _sidebarExpand = _interopRequireDefault(require("@atlaskit/icon/core/sidebar-expand"));
18
19
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
@@ -57,7 +58,7 @@ var SideNavToggleButton = exports.SideNavToggleButton = function SideNavToggleBu
57
58
 
58
59
  // When default state is provided to `Root` the state in context will already be
59
60
  // initialized in SSR
60
- var _useState = (0, _react.useState)(sideNavState === null ? !defaultCollapsed : isSideNavExpandedOnDesktop),
61
+ var _useState = (0, _react.useState)(sideNavState === null || !(0, _platformFeatureFlags.fg)('platform_dst_nav4_side_nav_default_collapsed_api') ? !defaultCollapsed : isSideNavExpandedOnDesktop),
61
62
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
62
63
  isSideNavExpanded = _useState2[0],
63
64
  setIsSideNavExpanded = _useState2[1];
@@ -105,12 +106,36 @@ var SideNavToggleButton = exports.SideNavToggleButton = function SideNavToggleBu
105
106
  var toggleVisibility = (0, _useToggleSideNav.useToggleSideNav)({
106
107
  trigger: 'toggle-button'
107
108
  });
109
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
110
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
108
111
  var handleClick = (0, _react.useCallback)(function (event, analyticsEvent) {
109
112
  onClick === null || onClick === void 0 || onClick(event, analyticsEvent, {
110
113
  isSideNavVisible: isSideNavExpanded
111
114
  });
112
115
  toggleVisibility();
113
- }, [onClick, toggleVisibility, isSideNavExpanded]);
116
+ }, [onClick, isSideNavExpanded, toggleVisibility]);
117
+ var handlePointerEnter = (0, _react.useCallback)(function () {
118
+ if (!(0, _platformFeatureFlags.fg)('platform_dst_nav4_fhs_instrumentation_1')) {
119
+ return;
120
+ }
121
+
122
+ // Hovers don't do anything on mobile, so not capturing
123
+ var isDesktop = window.matchMedia('(min-width: 64rem)').matches;
124
+ if (!isDesktop) {
125
+ return;
126
+ }
127
+ var navigationAnalyticsEvent = createAnalyticsEvent({
128
+ source: 'topNav',
129
+ actionSubject: 'sideNav',
130
+ action: 'hovered',
131
+ actionSubjectId: 'sideNavButton',
132
+ attributes: {
133
+ itemState: isSideNavExpanded ? 'expanded' : 'collapsed',
134
+ screen: 'desktop'
135
+ }
136
+ });
137
+ navigationAnalyticsEvent.fire('navigation');
138
+ }, [createAnalyticsEvent, isSideNavExpanded]);
114
139
 
115
140
  /**
116
141
  * ## Behaviour
@@ -145,6 +170,7 @@ var SideNavToggleButton = exports.SideNavToggleButton = function SideNavToggleBu
145
170
  label: isSideNavExpanded ? collapseLabel : expandLabel,
146
171
  icon: icon,
147
172
  onClick: handleClick,
173
+ onPointerEnter: handlePointerEnter,
148
174
  testId: testId,
149
175
  isTooltipDisabled: false,
150
176
  interactionName: interactionName,
@@ -38,7 +38,7 @@ function useSideNavVisibilityCallbacks(_ref) {
38
38
  return;
39
39
  }
40
40
  if (isExpandedOnDesktop) {
41
- if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
41
+ if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_fhs_instrumentation_1')) {
42
42
  var _onExpandRef$current;
43
43
  (_onExpandRef$current = onExpandRef.current) === null || _onExpandRef$current === void 0 || _onExpandRef$current.call(onExpandRef, {
44
44
  screen: 'desktop',
@@ -51,7 +51,7 @@ function useSideNavVisibilityCallbacks(_ref) {
51
51
  });
52
52
  }
53
53
  } else {
54
- if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
54
+ if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_fhs_instrumentation_1')) {
55
55
  var _onCollapseRef$curren;
56
56
  (_onCollapseRef$curren = onCollapseRef.current) === null || _onCollapseRef$curren === void 0 || _onCollapseRef$curren.call(onCollapseRef, {
57
57
  screen: 'desktop',
@@ -78,7 +78,7 @@ function useSideNavVisibilityCallbacks(_ref) {
78
78
  return;
79
79
  }
80
80
  if (isExpandedOnMobile) {
81
- if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
81
+ if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_fhs_instrumentation_1')) {
82
82
  var _onExpandRef$current3;
83
83
  (_onExpandRef$current3 = onExpandRef.current) === null || _onExpandRef$current3 === void 0 || _onExpandRef$current3.call(onExpandRef, {
84
84
  screen: 'mobile',
@@ -91,7 +91,7 @@ function useSideNavVisibilityCallbacks(_ref) {
91
91
  });
92
92
  }
93
93
  } else {
94
- if ((0, _platformFeatureFlags.fg)('navx-full-height-sidebar')) {
94
+ if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_fhs_instrumentation_1')) {
95
95
  var _onCollapseRef$curren3;
96
96
  (_onCollapseRef$curren3 = onCollapseRef.current) === null || _onCollapseRef$curren3 === void 0 || _onCollapseRef$curren3.call(onCollapseRef, {
97
97
  screen: 'mobile',
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.SideNavVisibilityProvider = void 0;
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
12
  var _visibilityContext = require("./visibility-context");
12
13
  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); }
13
14
  /**
@@ -16,7 +17,7 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
16
17
  var SideNavVisibilityProvider = exports.SideNavVisibilityProvider = function SideNavVisibilityProvider(_ref) {
17
18
  var children = _ref.children,
18
19
  defaultCollapsed = _ref.defaultCollapsed;
19
- var initialState = typeof defaultCollapsed === 'boolean' ? {
20
+ var initialState = typeof defaultCollapsed === 'boolean' && (0, _platformFeatureFlags.fg)('platform_dst_nav4_side_nav_default_collapsed_api') ? {
20
21
  desktop: defaultCollapsed ? 'collapsed' : 'expanded',
21
22
  mobile: 'collapsed',
22
23
  flyout: 'closed',
@@ -1,13 +1,7 @@
1
1
  import React, { forwardRef } from 'react';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
2
3
  import { MenuItemBase } from './menu-item';
3
4
  import { MenuListItem } from './menu-list-item';
4
-
5
- /**
6
- * We intentionally do not support the `isSelected` prop (which other menu item components
7
- * support) because `ButtonMenuItem`s do not correspond to a "page", so can't be navigated
8
- * to and become in a selected state.
9
- */
10
-
11
5
  /**
12
6
  * __ButtonMenuItem__
13
7
  *
@@ -20,9 +14,13 @@ export const ButtonMenuItem = /*#__PURE__*/forwardRef(({
20
14
  description,
21
15
  elemAfter,
22
16
  isDisabled,
17
+ isSelected,
23
18
  elemBefore,
24
19
  actionsOnHover,
25
20
  onClick,
21
+ 'aria-controls': ariaControls,
22
+ 'aria-expanded': ariaExpanded,
23
+ 'aria-haspopup': ariaHasPopup,
26
24
  interactionName,
27
25
  isContentTooltipDisabled,
28
26
  visualContentRef,
@@ -30,26 +28,32 @@ export const ButtonMenuItem = /*#__PURE__*/forwardRef(({
30
28
  isDragging,
31
29
  hasDragIndicator,
32
30
  dropIndicator
33
- }, forwardedRef) => /*#__PURE__*/React.createElement(MenuListItem, {
34
- ref: listItemRef
35
- }, /*#__PURE__*/React.createElement(MenuItemBase, {
36
- testId: testId,
37
- description: description,
38
- elemAfter: elemAfter,
39
- elemBefore: elemBefore,
40
- isDisabled: isDisabled
41
- /**
42
- * Not passing `actions` and `actionsOnHover` to MenuItemBase when `isDisabled`,
43
- * so they aren't rendered in the disabled state.
44
- */,
45
- actions: isDisabled ? undefined : actions,
46
- actionsOnHover: isDisabled ? undefined : actionsOnHover,
47
- onClick: onClick,
48
- ref: forwardedRef,
49
- visualContentRef: visualContentRef,
50
- interactionName: interactionName,
51
- isContentTooltipDisabled: isContentTooltipDisabled,
52
- isDragging: isDragging,
53
- hasDragIndicator: hasDragIndicator,
54
- dropIndicator: dropIndicator
55
- }, children)));
31
+ }, forwardedRef) => {
32
+ return /*#__PURE__*/React.createElement(MenuListItem, {
33
+ ref: listItemRef
34
+ }, /*#__PURE__*/React.createElement(MenuItemBase, {
35
+ testId: testId,
36
+ description: description,
37
+ elemAfter: elemAfter,
38
+ elemBefore: elemBefore,
39
+ isDisabled: isDisabled
40
+ /**
41
+ * Not passing `actions` and `actionsOnHover` to MenuItemBase when `isDisabled`,
42
+ * so they aren't rendered in the disabled state.
43
+ */,
44
+ actions: isDisabled ? undefined : actions,
45
+ actionsOnHover: isDisabled ? undefined : actionsOnHover,
46
+ onClick: onClick,
47
+ ariaControls: fg('platform-dst-buttonmenuitem-selected-state-support') ? ariaControls : undefined,
48
+ ariaExpanded: fg('platform-dst-buttonmenuitem-selected-state-support') ? ariaExpanded : undefined,
49
+ ariaHasPopup: fg('platform-dst-buttonmenuitem-selected-state-support') ? ariaHasPopup : undefined,
50
+ isSelected: fg('platform-dst-buttonmenuitem-selected-state-support') ? isSelected : undefined,
51
+ ref: forwardedRef,
52
+ visualContentRef: visualContentRef,
53
+ interactionName: interactionName,
54
+ isContentTooltipDisabled: isContentTooltipDisabled,
55
+ isDragging: isDragging,
56
+ hasDragIndicator: hasDragIndicator,
57
+ dropIndicator: dropIndicator
58
+ }, children));
59
+ });
@@ -57,6 +57,7 @@
57
57
  ._bfhk1o0g{background-color:var(--notch-color)}
58
58
  ._bfhkcdhy{background-color:var(--ds-background-neutral-bold,#44546f)}
59
59
  ._bfhkfg4m{background-color:var(--ds-background-selected,#e9f2ff)}
60
+ ._bfhkn7od{background-color:unset}
60
61
  ._bozg12x7{padding-inline-start:var(--ds-space-075,6px)}
61
62
  ._bozg1b66{padding-inline-start:var(--ds-space-050,4px)}
62
63
  ._db801b66{--actions-on-hover-padding:var(--ds-space-050,4px)}
@@ -96,6 +97,7 @@
96
97
  ._11om6b4r:hover{animation-name:k1xyysw3}
97
98
  ._1sjuglyw:hover{--elem-after-display:none}
98
99
  ._1uy01amc:hover{animation-delay:.8s}
100
+ ._30l31lh4:hover{color:var(--ds-text-disabled,#091e424f)}
99
101
  ._30l3aqb7:hover{color:var(--ds-text-selected,#0c66e4)}
100
102
  ._7psyru3m:hover{animation-duration:0s}
101
103
  ._bir2q7pw:hover{animation-fill-mode:forwards}
@@ -137,7 +137,7 @@ const containerStyles = {
137
137
  showHoverActions: "_uomdkb7n _pmxp1wug _db801b66",
138
138
  removeElemAfterOnHoverOrOpenNestedPopup: "_1djyglyw _1mfcglyw _1sjuglyw",
139
139
  selected: "_bfhkfg4m _syazaqb7 _1yyu1fvw _1swvi1yw _30l3aqb7 _irr3i1yw",
140
- disabled: "_syaz1lh4 _irr3n7od",
140
+ disabled: "_syaz1lh4 _bfhkn7od _irr3n7od _30l31lh4",
141
141
  hasDescription: "_4t3i1wto",
142
142
  dragging: "_tzy41ou4"
143
143
  };
@@ -6,6 +6,7 @@ import { ax, ix } from "@compiled/react/runtime";
6
6
  import { useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
7
7
  import { bind } from 'bind-event-listener';
8
8
  import { flushSync } from 'react-dom';
9
+ import { useAnalyticsEvents } from '@atlaskit/analytics-next';
9
10
  import mergeRefs from '@atlaskit/ds-lib/merge-refs';
10
11
  import useStableRef from '@atlaskit/ds-lib/use-stable-ref';
11
12
  import { OpenLayerObserverNamespaceProvider, useOpenLayerObserver } from '@atlaskit/layering/experimental/open-layer-observer';
@@ -127,6 +128,33 @@ function SideNavInternal({
127
128
  // This is so we can use it in an effect _that only runs once_, after the initial render on the client,
128
129
  // to sync the side nav context (provided in `<Root>`) with the `defaultCollapsed` prop provided to `<SideNav>`.
129
130
  const [initialDefaultCollapsed] = useState(defaultCollapsed);
131
+ const {
132
+ createAnalyticsEvent
133
+ } = useAnalyticsEvents();
134
+ const [initialIsExpandedOnDesktop] = useState(isExpandedOnDesktop);
135
+
136
+ /**
137
+ * Captures the initial collapsed/expanded state of the side nav.
138
+ *
139
+ * Only firing on desktop because the nav is never open by default on mobile.
140
+ */
141
+ useEffect(() => {
142
+ if (initialIsExpandedOnDesktop && fg('platform_dst_nav4_fhs_instrumentation_1')) {
143
+ const isDesktop = window.matchMedia('(min-width: 64rem)').matches;
144
+ if (isDesktop) {
145
+ const navigationAnalyticsEvent = createAnalyticsEvent({
146
+ source: 'topNav',
147
+ actionSubject: 'sideNav',
148
+ action: 'viewed',
149
+ actionSubjectId: 'sideNavMenu',
150
+ attributes: {
151
+ screen: 'desktop'
152
+ }
153
+ });
154
+ navigationAnalyticsEvent.fire('navigation');
155
+ }
156
+ }
157
+ }, [createAnalyticsEvent, initialIsExpandedOnDesktop]);
130
158
  const defaultWidth = useSafeDefaultWidth({
131
159
  defaultWidthProp,
132
160
  fallbackDefaultWidth,
@@ -286,10 +314,29 @@ function SideNavInternal({
286
314
  const toggleVisibilityByClickOutsideOnMobile = useToggleSideNav({
287
315
  trigger: 'click-outside-on-mobile'
288
316
  });
317
+ useEffect(() => {
318
+ if (fg('platform_dst_nav4_side_nav_default_collapsed_api')) {
319
+ // This is the old version of the hook, so we skip it when the flag is enabled
320
+ return;
321
+ }
322
+
323
+ // Sync the visibility in context (provided in `<Root>`) with the local `defaultCollapsed` prop provided to `SideNav`
324
+ // after SSR hydration. This should only run once, after the initial render on the client.
325
+ setSideNavState({
326
+ desktop: initialDefaultCollapsed ? 'collapsed' : 'expanded',
327
+ mobile: 'collapsed',
328
+ flyout: 'closed',
329
+ lastTrigger: null
330
+ });
331
+ }, [initialDefaultCollapsed, setSideNavState]);
289
332
 
290
333
  // Moving to `useLayoutEffect` so that there's no visual shift in non-SSR environments when using legacy API
291
334
  // For SSR the new API is still necessary
292
335
  useLayoutEffect(() => {
336
+ if (!fg('platform_dst_nav4_side_nav_default_collapsed_api')) {
337
+ // This is the new version of the hook, so we skip it when the flag is disabled
338
+ return;
339
+ }
293
340
  if (sideNavState !== null) {
294
341
  // Only need to do an initial sync if it hasn't been initialized from Root
295
342
  return;
@@ -308,11 +355,21 @@ function SideNavInternal({
308
355
  screen,
309
356
  trigger
310
357
  }) => {
311
- if (fg('navx-full-height-sidebar')) {
358
+ if (fg('platform_dst_nav4_fhs_instrumentation_1')) {
312
359
  onExpand === null || onExpand === void 0 ? void 0 : onExpand({
313
360
  screen,
314
361
  trigger
315
362
  });
363
+ const navigationAnalyticsEvent = createAnalyticsEvent({
364
+ source: 'topNav',
365
+ actionSubject: 'sideNav',
366
+ action: 'expanded',
367
+ actionSubjectId: 'sideNavMenu',
368
+ attributes: {
369
+ trigger
370
+ }
371
+ });
372
+ navigationAnalyticsEvent.fire('navigation');
316
373
  } else {
317
374
  onExpand === null || onExpand === void 0 ? void 0 : onExpand({
318
375
  screen
@@ -322,16 +379,26 @@ function SideNavInternal({
322
379
  // When the side nav gets expanded, we close the flyout to reset it.
323
380
  // This prevents the flyout from staying open and ensures we are respecting the user's intent to expand.
324
381
  updateFlyoutState('force-close');
325
- }, [onExpand, updateFlyoutState]);
382
+ }, [onExpand, updateFlyoutState, createAnalyticsEvent]);
326
383
  const handleCollapse = useCallback(({
327
384
  screen,
328
385
  trigger
329
386
  }) => {
330
- if (fg('navx-full-height-sidebar')) {
387
+ if (fg('platform_dst_nav4_fhs_instrumentation_1')) {
331
388
  onCollapse === null || onCollapse === void 0 ? void 0 : onCollapse({
332
389
  screen,
333
390
  trigger
334
391
  });
392
+ const navigationAnalyticsEvent = createAnalyticsEvent({
393
+ source: 'topNav',
394
+ actionSubject: 'sideNav',
395
+ action: 'collapsed',
396
+ actionSubjectId: 'sideNavMenu',
397
+ attributes: {
398
+ trigger
399
+ }
400
+ });
401
+ navigationAnalyticsEvent.fire('navigation');
335
402
  } else {
336
403
  onCollapse === null || onCollapse === void 0 ? void 0 : onCollapse({
337
404
  screen
@@ -341,7 +408,7 @@ function SideNavInternal({
341
408
  // When the side nav gets collapsed, we close the flyout to reset it.
342
409
  // This prevents the flyout from staying open and ensures we are respecting the user's intent to collapse.
343
410
  updateFlyoutState('force-close');
344
- }, [onCollapse, updateFlyoutState]);
411
+ }, [onCollapse, updateFlyoutState, createAnalyticsEvent]);
345
412
  useSideNavVisibilityCallbacks({
346
413
  onExpand: handleExpand,
347
414
  onCollapse: handleCollapse,