@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.
- package/CHANGELOG.md +25 -0
- package/dist/cjs/ui/menu-item/button-menu-item.js +9 -6
- package/dist/cjs/ui/menu-item/menu-item.compiled.css +2 -0
- package/dist/cjs/ui/menu-item/menu-item.js +1 -1
- package/dist/cjs/ui/page-layout/side-nav/side-nav.js +76 -8
- package/dist/cjs/ui/page-layout/side-nav/toggle-button.js +28 -2
- package/dist/cjs/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +4 -4
- package/dist/cjs/ui/page-layout/side-nav/visibility-provider.js +2 -1
- package/dist/es2019/ui/menu-item/button-menu-item.js +34 -30
- package/dist/es2019/ui/menu-item/menu-item.compiled.css +2 -0
- package/dist/es2019/ui/menu-item/menu-item.js +1 -1
- package/dist/es2019/ui/page-layout/side-nav/side-nav.js +71 -4
- package/dist/es2019/ui/page-layout/side-nav/toggle-button.js +29 -2
- package/dist/es2019/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +4 -4
- package/dist/es2019/ui/page-layout/side-nav/visibility-provider.js +2 -1
- package/dist/esm/ui/menu-item/button-menu-item.js +9 -7
- package/dist/esm/ui/menu-item/menu-item.compiled.css +2 -0
- package/dist/esm/ui/menu-item/menu-item.js +1 -1
- package/dist/esm/ui/page-layout/side-nav/side-nav.js +76 -8
- package/dist/esm/ui/page-layout/side-nav/toggle-button.js +28 -2
- package/dist/esm/ui/page-layout/side-nav/use-side-nav-visibility-callbacks.js +4 -4
- package/dist/esm/ui/page-layout/side-nav/visibility-provider.js +2 -1
- package/dist/types/ui/menu-item/button-menu-item.d.ts +14 -5
- package/dist/types/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.d.ts +0 -4
- package/dist/types/ui/menu-item/flyout-menu-item/flyout-menu-item-trigger.d.ts +0 -4
- package/dist/types/ui/menu-item/menu-item.d.ts +0 -1
- package/dist/types/ui/menu-item/types.d.ts +4 -0
- package/dist/types/ui/page-layout/panel-splitter/context.d.ts +1 -1
- package/dist/types/ui/page-layout/side-nav/side-nav.d.ts +2 -2
- package/dist/types-ts4.5/ui/menu-item/button-menu-item.d.ts +14 -5
- package/dist/types-ts4.5/ui/menu-item/expandable-menu-item/expandable-menu-item-trigger.d.ts +0 -4
- package/dist/types-ts4.5/ui/menu-item/flyout-menu-item/flyout-menu-item-trigger.d.ts +0 -4
- package/dist/types-ts4.5/ui/menu-item/menu-item.d.ts +0 -1
- package/dist/types-ts4.5/ui/menu-item/types.d.ts +4 -0
- package/dist/types-ts4.5/ui/page-layout/panel-splitter/context.d.ts +1 -1
- package/dist/types-ts4.5/ui/page-layout/side-nav/side-nav.d.ts +2 -2
- 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
|
|
153
|
-
|
|
154
|
-
width =
|
|
155
|
-
setWidth =
|
|
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)('
|
|
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)('
|
|
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,
|
|
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)('
|
|
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)('
|
|
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)('
|
|
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)('
|
|
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) =>
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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('
|
|
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('
|
|
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,
|