@atlaskit/navigation-system 2.0.0 → 2.1.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 +20 -0
- package/dist/cjs/ui/menu-item/container-avatar.compiled.css +1 -1
- package/dist/cjs/ui/menu-item/container-avatar.js +1 -1
- package/dist/cjs/ui/page-layout/aside.js +8 -1
- package/dist/cjs/ui/page-layout/panel-splitter/context.js +11 -2
- package/dist/cjs/ui/page-layout/panel-splitter/get-width.js +5 -0
- package/dist/cjs/ui/page-layout/panel-splitter/panel-splitter.js +8 -1
- package/dist/cjs/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +47 -0
- package/dist/cjs/ui/page-layout/panel.js +9 -1
- package/dist/cjs/ui/page-layout/side-nav/side-nav.js +9 -1
- package/dist/cjs/ui/page-layout/use-safe-default-width.js +32 -0
- package/dist/cjs/ui/top-nav-items/nav-logo/custom-logo.compiled.css +1 -1
- package/dist/cjs/ui/top-nav-items/nav-logo/custom-logo.js +2 -2
- package/dist/cjs/ui/top-nav-items/search.compiled.css +1 -1
- package/dist/cjs/ui/top-nav-items/search.js +1 -1
- package/dist/cjs/ui/top-nav-items/themed/button.compiled.css +1 -1
- package/dist/cjs/ui/top-nav-items/themed/button.js +1 -1
- package/dist/es2019/ui/menu-item/container-avatar.compiled.css +1 -1
- package/dist/es2019/ui/menu-item/container-avatar.js +1 -1
- package/dist/es2019/ui/page-layout/aside.js +8 -1
- package/dist/es2019/ui/page-layout/panel-splitter/context.js +10 -1
- package/dist/es2019/ui/page-layout/panel-splitter/get-width.js +5 -0
- package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.js +9 -2
- package/dist/es2019/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +38 -0
- package/dist/es2019/ui/page-layout/panel.js +9 -1
- package/dist/es2019/ui/page-layout/side-nav/side-nav.js +9 -1
- package/dist/es2019/ui/page-layout/use-safe-default-width.js +28 -0
- package/dist/es2019/ui/top-nav-items/nav-logo/custom-logo.compiled.css +1 -1
- package/dist/es2019/ui/top-nav-items/nav-logo/custom-logo.js +2 -2
- package/dist/es2019/ui/top-nav-items/search.compiled.css +1 -1
- package/dist/es2019/ui/top-nav-items/search.js +1 -1
- package/dist/es2019/ui/top-nav-items/themed/button.compiled.css +1 -1
- package/dist/es2019/ui/top-nav-items/themed/button.js +1 -1
- package/dist/esm/ui/menu-item/container-avatar.compiled.css +1 -1
- package/dist/esm/ui/menu-item/container-avatar.js +1 -1
- package/dist/esm/ui/page-layout/aside.js +8 -1
- package/dist/esm/ui/page-layout/panel-splitter/context.js +10 -1
- package/dist/esm/ui/page-layout/panel-splitter/get-width.js +5 -0
- package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.js +9 -2
- package/dist/esm/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +38 -0
- package/dist/esm/ui/page-layout/panel.js +9 -1
- package/dist/esm/ui/page-layout/side-nav/side-nav.js +9 -1
- package/dist/esm/ui/page-layout/use-safe-default-width.js +27 -0
- package/dist/esm/ui/top-nav-items/nav-logo/custom-logo.compiled.css +1 -1
- package/dist/esm/ui/top-nav-items/nav-logo/custom-logo.js +2 -2
- package/dist/esm/ui/top-nav-items/search.compiled.css +1 -1
- package/dist/esm/ui/top-nav-items/search.js +1 -1
- package/dist/esm/ui/top-nav-items/themed/button.compiled.css +1 -1
- package/dist/esm/ui/top-nav-items/themed/button.js +1 -1
- package/dist/types/ui/page-layout/aside.d.ts +2 -2
- package/dist/types/ui/page-layout/panel-splitter/context.d.ts +8 -0
- package/dist/types/ui/page-layout/panel-splitter/panel-splitter.d.ts +1 -1
- package/dist/types/ui/page-layout/panel-splitter/side-nav-panel-splitter.d.ts +20 -0
- package/dist/types/ui/page-layout/panel.d.ts +2 -2
- package/dist/types/ui/page-layout/side-nav/side-nav.d.ts +2 -1
- package/dist/types/ui/page-layout/use-safe-default-width.d.ts +21 -0
- package/dist/types-ts4.5/ui/page-layout/aside.d.ts +2 -2
- package/dist/types-ts4.5/ui/page-layout/panel-splitter/context.d.ts +8 -0
- package/dist/types-ts4.5/ui/page-layout/panel-splitter/panel-splitter.d.ts +1 -1
- package/dist/types-ts4.5/ui/page-layout/panel-splitter/side-nav-panel-splitter.d.ts +20 -0
- package/dist/types-ts4.5/ui/page-layout/panel.d.ts +2 -2
- package/dist/types-ts4.5/ui/page-layout/side-nav/side-nav.d.ts +2 -1
- package/dist/types-ts4.5/ui/page-layout/use-safe-default-width.d.ts +21 -0
- package/package.json +5 -43
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @atlassian/navigation-system
|
|
2
2
|
|
|
3
|
+
## 2.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`23bcc5bbc9cee`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/23bcc5bbc9cee) -
|
|
8
|
+
Internal changes to how border radius is applied.
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
|
|
11
|
+
## 2.1.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- [`8f30ac4ceb737`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/8f30ac4ceb737) -
|
|
16
|
+
Adds extra guards for resizable slots to avoid invalid widths being set. This change is behind the
|
|
17
|
+
`platform_dst_nav4_panel_splitter_guards` feature gate.
|
|
18
|
+
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Updated dependencies
|
|
22
|
+
|
|
3
23
|
## 2.0.0
|
|
4
24
|
|
|
5
25
|
### Major Changes
|
|
@@ -11,7 +11,7 @@ var React = _interopRequireWildcard(require("react"));
|
|
|
11
11
|
var _runtime = require("@compiled/react/runtime");
|
|
12
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); }
|
|
13
13
|
var styles = {
|
|
14
|
-
root: "
|
|
14
|
+
root: "_2rko12b0 _vchhusvi _4t3igktf _1bsbgktf"
|
|
15
15
|
};
|
|
16
16
|
/**
|
|
17
17
|
* __Container avatar__
|
|
@@ -22,6 +22,7 @@ var _hoistUtils = require("./hoist-utils");
|
|
|
22
22
|
var _idUtils = require("./id-utils");
|
|
23
23
|
var _provider = require("./panel-splitter/provider");
|
|
24
24
|
var _useResizingWidthCssVarOnRootElement = require("./use-resizing-width-css-var-on-root-element");
|
|
25
|
+
var _useSafeDefaultWidth = require("./use-safe-default-width");
|
|
25
26
|
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); }
|
|
26
27
|
var panelSplitterResizingVar = '--n_asdRsz';
|
|
27
28
|
/**
|
|
@@ -54,6 +55,7 @@ var styles = {
|
|
|
54
55
|
root: "_nd5lns35 _vchhusvi _kqswh2mm _glte1kzp _ndwch9n0",
|
|
55
56
|
inner: "_1reo1wug _18m91wug _152timx3 _4t3i1osq _165teqxy _13wn1if8"
|
|
56
57
|
};
|
|
58
|
+
var fallbackDefaultWidth = 330;
|
|
57
59
|
|
|
58
60
|
/**
|
|
59
61
|
* The Aside is rendered to the right (inline end) of the Main area.
|
|
@@ -64,7 +66,7 @@ function Aside(_ref) {
|
|
|
64
66
|
var children = _ref.children,
|
|
65
67
|
xcss = _ref.xcss,
|
|
66
68
|
_ref$defaultWidth = _ref.defaultWidth,
|
|
67
|
-
|
|
69
|
+
defaultWidthProp = _ref$defaultWidth === void 0 ? fallbackDefaultWidth : _ref$defaultWidth,
|
|
68
70
|
_ref$label = _ref.label,
|
|
69
71
|
label = _ref$label === void 0 ? 'Aside' : _ref$label,
|
|
70
72
|
_ref$skipLinkLabel = _ref.skipLinkLabel,
|
|
@@ -75,6 +77,11 @@ function Aside(_ref) {
|
|
|
75
77
|
var id = (0, _idUtils.useLayoutId)({
|
|
76
78
|
providedId: providedId
|
|
77
79
|
});
|
|
80
|
+
var defaultWidth = (0, _useSafeDefaultWidth.useSafeDefaultWidth)({
|
|
81
|
+
defaultWidthProp: defaultWidthProp,
|
|
82
|
+
fallbackDefaultWidth: fallbackDefaultWidth,
|
|
83
|
+
slotName: 'Aside'
|
|
84
|
+
});
|
|
78
85
|
|
|
79
86
|
/**
|
|
80
87
|
* Don't show the skip link if the slot has 0 width.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.PanelSplitterContext = void 0;
|
|
6
|
+
exports.PanelSplitterContext = exports.OnDoubleClickContext = void 0;
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
// Disabling the rule to allow for `Type` suffix, to differentiate from the Context object.
|
|
9
9
|
// eslint-disable-next-line @repo/internal/react/consistent-types-definitions
|
|
@@ -11,4 +11,13 @@ var _react = require("react");
|
|
|
11
11
|
/**
|
|
12
12
|
* Context for the panel splitter. Only internally exported.
|
|
13
13
|
*/
|
|
14
|
-
var PanelSplitterContext = exports.PanelSplitterContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
14
|
+
var PanelSplitterContext = exports.PanelSplitterContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Context for the panel splitter's double click handler. Only internally exported.
|
|
18
|
+
*
|
|
19
|
+
* NOTE: This context is a temporary workaround to enable the `SideNavPanelSplitter` component
|
|
20
|
+
* to collapse the side nav on double click, without exposing the `onDoubleClick` prop on `PanelSplitter`.
|
|
21
|
+
* Once `PanelSplitter` supports an `onDoubleClick` prop directly, this context should be removed.
|
|
22
|
+
*/
|
|
23
|
+
var OnDoubleClickContext = exports.OnDoubleClickContext = /*#__PURE__*/(0, _react.createContext)(undefined);
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getWidthFromDragLocation = exports.getPixelWidth = void 0;
|
|
7
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
7
8
|
var getWidthFromDragLocation = exports.getWidthFromDragLocation = function getWidthFromDragLocation(_ref) {
|
|
8
9
|
var initialWidth = _ref.initialWidth,
|
|
9
10
|
location = _ref.location,
|
|
@@ -25,6 +26,10 @@ var getWidthFromDragLocation = exports.getWidthFromDragLocation = function getWi
|
|
|
25
26
|
* Returns the computed width of an element in pixels.
|
|
26
27
|
*/
|
|
27
28
|
var getPixelWidth = exports.getPixelWidth = function getPixelWidth(element) {
|
|
29
|
+
if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_panel_splitter_guards')) {
|
|
30
|
+
// Always returns an integer. Returns 0 if element is hidden / removed.
|
|
31
|
+
return element.offsetWidth;
|
|
32
|
+
}
|
|
28
33
|
var _window$getComputedSt = window.getComputedStyle(element),
|
|
29
34
|
width = _window$getComputedSt.width;
|
|
30
35
|
return parseInt(width);
|
|
@@ -92,6 +92,13 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref) {
|
|
|
92
92
|
rangeInputBounds = _useState4[0],
|
|
93
93
|
setRangeInputBounds = _useState4[1];
|
|
94
94
|
var openLayerObserver = (0, _openLayerObserver.useOpenLayerObserver)();
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* This is a temporary workaround to enable the `SideNavPanelSplitter` component
|
|
98
|
+
* to collapse the side nav on double click, without exposing the `onDoubleClick` prop on `PanelSplitter`.
|
|
99
|
+
* Once `PanelSplitter` supports an `onDoubleClick` prop directly, this context can be removed.
|
|
100
|
+
*/
|
|
101
|
+
var onDoubleClick = (0, _react.useContext)(_context.OnDoubleClickContext);
|
|
95
102
|
(0, _react.useEffect)(function () {
|
|
96
103
|
var splitter = splitterRef.current;
|
|
97
104
|
(0, _tinyInvariant.default)(splitter, 'Splitter ref must be set');
|
|
@@ -164,7 +171,6 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref) {
|
|
|
164
171
|
var source = _ref5.source;
|
|
165
172
|
(0, _tinyInvariant.default)(isPanelSplitterDragData(source.data));
|
|
166
173
|
_preventUnhandled.preventUnhandled.stop();
|
|
167
|
-
(0, _tinyInvariant.default)(isPanelSplitterDragData(source.data));
|
|
168
174
|
var finalWidth = (0, _getWidth.getPixelWidth)(panel);
|
|
169
175
|
onCompleteResize(finalWidth);
|
|
170
176
|
onResizeEnd === null || onResizeEnd === void 0 || onResizeEnd({
|
|
@@ -276,6 +282,7 @@ var PortaledPanelSplitter = function PortaledPanelSplitter(_ref) {
|
|
|
276
282
|
}, /*#__PURE__*/React.createElement("div", {
|
|
277
283
|
ref: splitterRef,
|
|
278
284
|
"data-testid": testId,
|
|
285
|
+
onDoubleClick: onDoubleClick,
|
|
279
286
|
className: (0, _runtime.ax)([grabAreaStyles.root])
|
|
280
287
|
}, /*#__PURE__*/React.createElement(_visuallyHidden.default, null, /*#__PURE__*/React.createElement("input", {
|
|
281
288
|
type: "range",
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.SideNavPanelSplitter = void 0;
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _tinyInvariant = _interopRequireDefault(require("tiny-invariant"));
|
|
11
|
+
var _constants = require("../constants");
|
|
12
|
+
var _useToggleSideNav = require("../side-nav/use-toggle-side-nav");
|
|
13
|
+
var _context = require("./context");
|
|
14
|
+
var _panelSplitter = require("./panel-splitter");
|
|
15
|
+
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); }
|
|
16
|
+
/**
|
|
17
|
+
* _SideNavPanelSplitter_
|
|
18
|
+
*
|
|
19
|
+
* A component that allows the user to resize or collapse the side nav.
|
|
20
|
+
* It must be used within the `SideNav` layout area.
|
|
21
|
+
*
|
|
22
|
+
* Example usage:
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <SideNav>
|
|
25
|
+
* <SideNavPanelSplitter label="Resize or collapse Side Nav" />
|
|
26
|
+
* </SideNav>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
var SideNavPanelSplitter = exports.SideNavPanelSplitter = function SideNavPanelSplitter(_ref) {
|
|
30
|
+
var label = _ref.label,
|
|
31
|
+
onResizeStart = _ref.onResizeStart,
|
|
32
|
+
onResizeEnd = _ref.onResizeEnd,
|
|
33
|
+
testId = _ref.testId,
|
|
34
|
+
_ref$shouldCollapseOn = _ref.shouldCollapseOnDoubleClick,
|
|
35
|
+
shouldCollapseOnDoubleClick = _ref$shouldCollapseOn === void 0 ? true : _ref$shouldCollapseOn;
|
|
36
|
+
var context = (0, _react.useContext)(_context.PanelSplitterContext);
|
|
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)();
|
|
39
|
+
return /*#__PURE__*/_react.default.createElement(_context.OnDoubleClickContext.Provider, {
|
|
40
|
+
value: shouldCollapseOnDoubleClick ? toggleSideNav : undefined
|
|
41
|
+
}, /*#__PURE__*/_react.default.createElement(_panelSplitter.PanelSplitter, {
|
|
42
|
+
label: label,
|
|
43
|
+
onResizeStart: onResizeStart,
|
|
44
|
+
onResizeEnd: onResizeEnd,
|
|
45
|
+
testId: testId
|
|
46
|
+
}));
|
|
47
|
+
};
|
|
@@ -23,6 +23,7 @@ var _idUtils = require("./id-utils");
|
|
|
23
23
|
var _provider = require("./panel-splitter/provider");
|
|
24
24
|
var _elementContext = require("./side-nav/element-context");
|
|
25
25
|
var _useResizingWidthCssVarOnRootElement = require("./use-resizing-width-css-var-on-root-element");
|
|
26
|
+
var _useSafeDefaultWidth = require("./use-safe-default-width");
|
|
26
27
|
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); }
|
|
27
28
|
var panelSplitterResizingVar = '--n_pnlRsz';
|
|
28
29
|
|
|
@@ -41,6 +42,7 @@ var styles = {
|
|
|
41
42
|
oldMobileWidth: "_1bsb1adv",
|
|
42
43
|
newMobileWidth: "_1bsb1dxx"
|
|
43
44
|
};
|
|
45
|
+
var fallbackDefaultWidth = 365;
|
|
44
46
|
|
|
45
47
|
/**
|
|
46
48
|
* The Panel layout area is rendered to the right (inline end) of the Main area, or the Aside area if it is present.
|
|
@@ -52,7 +54,7 @@ var styles = {
|
|
|
52
54
|
function Panel(_ref) {
|
|
53
55
|
var children = _ref.children,
|
|
54
56
|
_ref$defaultWidth = _ref.defaultWidth,
|
|
55
|
-
|
|
57
|
+
defaultWidthProp = _ref$defaultWidth === void 0 ? fallbackDefaultWidth : _ref$defaultWidth,
|
|
56
58
|
_ref$label = _ref.label,
|
|
57
59
|
label = _ref$label === void 0 ? 'Panel' : _ref$label,
|
|
58
60
|
_ref$skipLinkLabel = _ref.skipLinkLabel,
|
|
@@ -66,6 +68,12 @@ function Panel(_ref) {
|
|
|
66
68
|
var id = (0, _idUtils.useLayoutId)({
|
|
67
69
|
providedId: providedId
|
|
68
70
|
});
|
|
71
|
+
var defaultWidth = (0, _useSafeDefaultWidth.useSafeDefaultWidth)({
|
|
72
|
+
defaultWidthProp: defaultWidthProp,
|
|
73
|
+
fallbackDefaultWidth: fallbackDefaultWidth,
|
|
74
|
+
slotName: 'Panel'
|
|
75
|
+
});
|
|
76
|
+
|
|
69
77
|
/**
|
|
70
78
|
* Don't show the skip link if the slot has 0 width.
|
|
71
79
|
*
|
|
@@ -29,6 +29,7 @@ var _hoistUtils = require("../hoist-utils");
|
|
|
29
29
|
var _idUtils = require("../id-utils");
|
|
30
30
|
var _provider = require("../panel-splitter/provider");
|
|
31
31
|
var _useResizingWidthCssVarOnRootElement = require("../use-resizing-width-css-var-on-root-element");
|
|
32
|
+
var _useSafeDefaultWidth = require("../use-safe-default-width");
|
|
32
33
|
var _elementContext = require("./element-context");
|
|
33
34
|
var _flyoutCloseDelayMs = require("./flyout-close-delay-ms");
|
|
34
35
|
var _toggleButtonContext = require("./toggle-button-context");
|
|
@@ -59,6 +60,8 @@ var styles = {
|
|
|
59
60
|
hiddenMobileOnly: "_1e0cglyw _dm2518uv",
|
|
60
61
|
hiddenDesktopOnly: "_dm25glyw"
|
|
61
62
|
};
|
|
63
|
+
var fallbackDefaultWidth = 320;
|
|
64
|
+
|
|
62
65
|
/**
|
|
63
66
|
* We need an additional component layer so we can wrap the side nav in a `OpenLayerObserver` and have access to the
|
|
64
67
|
* context value.
|
|
@@ -67,7 +70,7 @@ function SideNavInternal(_ref) {
|
|
|
67
70
|
var children = _ref.children,
|
|
68
71
|
defaultCollapsed = _ref.defaultCollapsed,
|
|
69
72
|
_ref$defaultWidth = _ref.defaultWidth,
|
|
70
|
-
|
|
73
|
+
defaultWidthProp = _ref$defaultWidth === void 0 ? fallbackDefaultWidth : _ref$defaultWidth,
|
|
71
74
|
testId = _ref.testId,
|
|
72
75
|
_ref$label = _ref.label,
|
|
73
76
|
label = _ref$label === void 0 ? 'Sidebar' : _ref$label,
|
|
@@ -113,6 +116,11 @@ function SideNavInternal(_ref) {
|
|
|
113
116
|
var _useState = (0, _react.useState)(defaultCollapsed),
|
|
114
117
|
_useState2 = (0, _slicedToArray2.default)(_useState, 1),
|
|
115
118
|
initialDefaultCollapsed = _useState2[0];
|
|
119
|
+
var defaultWidth = (0, _useSafeDefaultWidth.useSafeDefaultWidth)({
|
|
120
|
+
defaultWidthProp: defaultWidthProp,
|
|
121
|
+
fallbackDefaultWidth: fallbackDefaultWidth,
|
|
122
|
+
slotName: 'SideNav'
|
|
123
|
+
});
|
|
116
124
|
var _useState3 = (0, _react.useState)(defaultWidth),
|
|
117
125
|
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
118
126
|
width = _useState4[0],
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useSafeDefaultWidth = useSafeDefaultWidth;
|
|
7
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
8
|
+
/**
|
|
9
|
+
* When `platform_dst_nav4_panel_splitter_guards` is disabled,
|
|
10
|
+
* `useSafeDefaultWidth` returns the provided `defaultWidthProp`.
|
|
11
|
+
*
|
|
12
|
+
* When `platform_dst_nav4_panel_splitter_guards` is enabled,
|
|
13
|
+
* `useSafeDefaultWidth` returns the `fallbackWidth` if the provided `defaultWidthProp` is not an integer value.
|
|
14
|
+
*/
|
|
15
|
+
function useSafeDefaultWidth(_ref) {
|
|
16
|
+
var defaultWidthProp = _ref.defaultWidthProp,
|
|
17
|
+
fallbackDefaultWidth = _ref.fallbackDefaultWidth,
|
|
18
|
+
slotName = _ref.slotName;
|
|
19
|
+
if ((0, _platformFeatureFlags.fg)('platform_dst_nav4_panel_splitter_guards')) {
|
|
20
|
+
// If the provided `defaultWidth` is invalid then we use our fallback.
|
|
21
|
+
// We are using a runtime check because some invalid numbers like `NaN` are not caught by types,
|
|
22
|
+
// and we saw some issues in products where our experience broke due to this.
|
|
23
|
+
if (!Number.isInteger(defaultWidthProp)) {
|
|
24
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
25
|
+
// eslint-disable-next-line no-console
|
|
26
|
+
console.error("The defaultWidth value must be an integer, but '".concat(defaultWidthProp, "' was provided to ").concat(slotName, ". Falling back to ").concat(fallbackDefaultWidth, "px instead."));
|
|
27
|
+
}
|
|
28
|
+
return fallbackDefaultWidth;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return defaultWidthProp;
|
|
32
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
.
|
|
2
|
+
._2rkofajl{border-radius:var(--ds-radius-small,3px)}
|
|
3
3
|
._18zr1b66{padding-inline:var(--ds-space-050,4px)}
|
|
4
4
|
._18zru2gc{padding-inline:var(--ds-space-100,8px)}._18m915vq{overflow-y:hidden}
|
|
5
5
|
._1e0c1txw{display:flex}
|
|
@@ -17,8 +17,8 @@ var _logoRenderer = require("./logo-renderer");
|
|
|
17
17
|
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); }
|
|
18
18
|
// eslint-disable-next-line @atlaskit/design-system/no-emotion-primitives -- to be migrated to @atlaskit/primitives/compiled – go/akcss
|
|
19
19
|
var anchorStyles = {
|
|
20
|
-
root: "
|
|
21
|
-
customLogoBorderRadius: "
|
|
20
|
+
root: "_2rkofajl _1e0c1txw _4cvr1h6o _4t3izwfg",
|
|
21
|
+
customLogoBorderRadius: "_2rkofajl",
|
|
22
22
|
newMargin: "_ahbq1b66",
|
|
23
23
|
newInteractionStates: "_irr3166n _1di61wwy",
|
|
24
24
|
newInteractionStatesCustomTheming: "_irr31rps _1di6yhlj"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
.
|
|
2
|
+
._2rko12b0{border-radius:var(--ds-radius-small,4px)}._18zr12x7{padding-inline:var(--ds-space-075,6px)}
|
|
3
3
|
._1ii7kb7n{grid-row:1}
|
|
4
4
|
._1rjcze3t{padding-block:var(--ds-space-0,0)}
|
|
5
5
|
._yyhy11wp{grid-column:3}
|
|
@@ -15,7 +15,7 @@ var _compiled = require("@atlaskit/primitives/compiled");
|
|
|
15
15
|
var _migration = require("./themed/migration");
|
|
16
16
|
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); }
|
|
17
17
|
var styles = {
|
|
18
|
-
root: "
|
|
18
|
+
root: "_2rko12b0 _1rjcze3t _18zr12x7 _yv0e1mfv _4cvr1h6o _bfhk1j9a _vchhusvi _80om1kdv _1e0cglyw _4t3izwfg _p12f1kvu _1bsb1osq _irr31d5g _1di6r01l _114b11p5",
|
|
19
19
|
buttonText: "_yyhyjvu9 _1ii7kb7n",
|
|
20
20
|
iconBefore: "_yyhykb7n _1ii7kb7n _1e0c1txw",
|
|
21
21
|
elemAfter: "_yyhy11wp _1ii7kb7n _1e0c1txw"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
._11q7esko{background:var(--ds-top-bar-button-primary-background)}
|
|
5
5
|
._11q7pkxg{background:var(--ds-top-bar-button-background)}
|
|
6
6
|
._14mj1kw7:after{border-radius:inherit}
|
|
7
|
-
.
|
|
7
|
+
._2rkofajl{border-radius:var(--ds-radius-small,3px)}
|
|
8
8
|
._9v7aze3t:after{inset:var(--ds-space-0,0)}
|
|
9
9
|
._v5649dqc{transition:background .1s ease-out}
|
|
10
10
|
._zulp12x7{gap:var(--ds-space-075,6px)}
|
|
@@ -85,7 +85,7 @@ var themedButtonSelectedBorder = exports.themedButtonSelectedBorder = '--ds-top-
|
|
|
85
85
|
var themedButtonDisabledText = exports.themedButtonDisabledText = '--ds-top-bar-button-disabled-text';
|
|
86
86
|
var themedButtonDisabledBackground = exports.themedButtonDisabledBackground = '--ds-top-bar-button-disabled-background';
|
|
87
87
|
var styles = {
|
|
88
|
-
root: "_zulp12x7 _11c82smr
|
|
88
|
+
root: "_zulp12x7 _11c82smr _2rkofajl _v5649dqc _4bfu1r31 _1hmsglyw _ajmmnqa1 _1rjcze3t _1e0c1txw _4cvr1h6o _1bah1h6o _4t3i5r7u _kqswh2mm _1nrm1r31 _1a3b1r31 _9oik1r31 _c2waglyw _4fprglyw _1bnxglyw _1iohnqa1 _5goinqa1 _jf4cnqa1",
|
|
89
89
|
border: "_14mj1kw7 _9v7aze3t _1tv3nqa1 _39yqe4h9 _aetrb3bt _18postnw",
|
|
90
90
|
selected: "_11q71qds _syazw5ct _8l3m15jn _f8pjw5ct _1053w5ct _19lcjrv1 _30l3w5ct _j6xtnh62 _9h8hw5ct",
|
|
91
91
|
disabled: "_11q71c9b _syaz1i3i _8l3m1j28 _f8pj1i3i _10531i3i _19lc1c9b _30l31i3i _j6xt1c9b _9h8h1i3i"
|
|
@@ -3,7 +3,7 @@ import "./container-avatar.compiled.css";
|
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { ax, ix } from "@compiled/react/runtime";
|
|
5
5
|
const styles = {
|
|
6
|
-
root: "
|
|
6
|
+
root: "_2rko12b0 _vchhusvi _4t3igktf _1bsbgktf"
|
|
7
7
|
};
|
|
8
8
|
/**
|
|
9
9
|
* __Container avatar__
|
|
@@ -12,6 +12,7 @@ import { DangerouslyHoistCssVarToDocumentRoot } from './hoist-utils';
|
|
|
12
12
|
import { useLayoutId } from './id-utils';
|
|
13
13
|
import { PanelSplitterProvider } from './panel-splitter/provider';
|
|
14
14
|
import { useResizingWidthCssVarOnRootElement } from './use-resizing-width-css-var-on-root-element';
|
|
15
|
+
import { useSafeDefaultWidth } from './use-safe-default-width';
|
|
15
16
|
const panelSplitterResizingVar = '--n_asdRsz';
|
|
16
17
|
/**
|
|
17
18
|
* The bounds for Aside and Panel are purposely set to support the current usage in Jira.
|
|
@@ -43,6 +44,7 @@ const styles = {
|
|
|
43
44
|
root: "_nd5lns35 _vchhusvi _kqswh2mm _glte1kzp _ndwch9n0",
|
|
44
45
|
inner: "_1reo1wug _18m91wug _152timx3 _4t3i1osq _165teqxy _13wn1if8"
|
|
45
46
|
};
|
|
47
|
+
const fallbackDefaultWidth = 330;
|
|
46
48
|
|
|
47
49
|
/**
|
|
48
50
|
* The Aside is rendered to the right (inline end) of the Main area.
|
|
@@ -52,7 +54,7 @@ const styles = {
|
|
|
52
54
|
export function Aside({
|
|
53
55
|
children,
|
|
54
56
|
xcss,
|
|
55
|
-
defaultWidth =
|
|
57
|
+
defaultWidth: defaultWidthProp = fallbackDefaultWidth,
|
|
56
58
|
label = 'Aside',
|
|
57
59
|
skipLinkLabel = label,
|
|
58
60
|
testId,
|
|
@@ -62,6 +64,11 @@ export function Aside({
|
|
|
62
64
|
const id = useLayoutId({
|
|
63
65
|
providedId
|
|
64
66
|
});
|
|
67
|
+
const defaultWidth = useSafeDefaultWidth({
|
|
68
|
+
defaultWidthProp,
|
|
69
|
+
fallbackDefaultWidth,
|
|
70
|
+
slotName: 'Aside'
|
|
71
|
+
});
|
|
65
72
|
|
|
66
73
|
/**
|
|
67
74
|
* Don't show the skip link if the slot has 0 width.
|
|
@@ -6,4 +6,13 @@ import { createContext } from 'react';
|
|
|
6
6
|
/**
|
|
7
7
|
* Context for the panel splitter. Only internally exported.
|
|
8
8
|
*/
|
|
9
|
-
export const PanelSplitterContext = /*#__PURE__*/createContext(null);
|
|
9
|
+
export const PanelSplitterContext = /*#__PURE__*/createContext(null);
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Context for the panel splitter's double click handler. Only internally exported.
|
|
13
|
+
*
|
|
14
|
+
* NOTE: This context is a temporary workaround to enable the `SideNavPanelSplitter` component
|
|
15
|
+
* to collapse the side nav on double click, without exposing the `onDoubleClick` prop on `PanelSplitter`.
|
|
16
|
+
* Once `PanelSplitter` supports an `onDoubleClick` prop directly, this context should be removed.
|
|
17
|
+
*/
|
|
18
|
+
export const OnDoubleClickContext = /*#__PURE__*/createContext(undefined);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
1
2
|
export const getWidthFromDragLocation = ({
|
|
2
3
|
initialWidth,
|
|
3
4
|
location,
|
|
@@ -20,6 +21,10 @@ export const getWidthFromDragLocation = ({
|
|
|
20
21
|
* Returns the computed width of an element in pixels.
|
|
21
22
|
*/
|
|
22
23
|
export const getPixelWidth = element => {
|
|
24
|
+
if (fg('platform_dst_nav4_panel_splitter_guards')) {
|
|
25
|
+
// Always returns an integer. Returns 0 if element is hidden / removed.
|
|
26
|
+
return element.offsetWidth;
|
|
27
|
+
}
|
|
23
28
|
const {
|
|
24
29
|
width
|
|
25
30
|
} = window.getComputedStyle(element);
|
|
@@ -15,7 +15,7 @@ import { blockDraggingToIFrames } from '@atlaskit/pragmatic-drag-and-drop/elemen
|
|
|
15
15
|
import { disableNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview';
|
|
16
16
|
import { preventUnhandled } from '@atlaskit/pragmatic-drag-and-drop/prevent-unhandled';
|
|
17
17
|
import VisuallyHidden from '@atlaskit/visually-hidden';
|
|
18
|
-
import { PanelSplitterContext } from './context';
|
|
18
|
+
import { OnDoubleClickContext, PanelSplitterContext } from './context';
|
|
19
19
|
import { convertResizeBoundToPixels } from './convert-resize-bound-to-pixels';
|
|
20
20
|
import { getPercentageWithinPixelBounds } from './get-percentage-within-pixel-bounds';
|
|
21
21
|
import { getPixelWidth, getWidthFromDragLocation } from './get-width';
|
|
@@ -77,6 +77,13 @@ const PortaledPanelSplitter = ({
|
|
|
77
77
|
max: 500
|
|
78
78
|
});
|
|
79
79
|
const openLayerObserver = useOpenLayerObserver();
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* This is a temporary workaround to enable the `SideNavPanelSplitter` component
|
|
83
|
+
* to collapse the side nav on double click, without exposing the `onDoubleClick` prop on `PanelSplitter`.
|
|
84
|
+
* Once `PanelSplitter` supports an `onDoubleClick` prop directly, this context can be removed.
|
|
85
|
+
*/
|
|
86
|
+
const onDoubleClick = useContext(OnDoubleClickContext);
|
|
80
87
|
useEffect(() => {
|
|
81
88
|
const splitter = splitterRef.current;
|
|
82
89
|
invariant(splitter, 'Splitter ref must be set');
|
|
@@ -154,7 +161,6 @@ const PortaledPanelSplitter = ({
|
|
|
154
161
|
}) {
|
|
155
162
|
invariant(isPanelSplitterDragData(source.data));
|
|
156
163
|
preventUnhandled.stop();
|
|
157
|
-
invariant(isPanelSplitterDragData(source.data));
|
|
158
164
|
const finalWidth = getPixelWidth(panel);
|
|
159
165
|
onCompleteResize(finalWidth);
|
|
160
166
|
onResizeEnd === null || onResizeEnd === void 0 ? void 0 : onResizeEnd({
|
|
@@ -254,6 +260,7 @@ const PortaledPanelSplitter = ({
|
|
|
254
260
|
}, /*#__PURE__*/React.createElement("div", {
|
|
255
261
|
ref: splitterRef,
|
|
256
262
|
"data-testid": testId,
|
|
263
|
+
onDoubleClick: onDoubleClick,
|
|
257
264
|
className: ax([grabAreaStyles.root])
|
|
258
265
|
}, /*#__PURE__*/React.createElement(VisuallyHidden, null, /*#__PURE__*/React.createElement("input", {
|
|
259
266
|
type: "range",
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import invariant from 'tiny-invariant';
|
|
3
|
+
import { sideNavPanelSplitterId } from '../constants';
|
|
4
|
+
import { useToggleSideNav } from '../side-nav/use-toggle-side-nav';
|
|
5
|
+
import { OnDoubleClickContext, PanelSplitterContext } from './context';
|
|
6
|
+
import { PanelSplitter } from './panel-splitter';
|
|
7
|
+
/**
|
|
8
|
+
* _SideNavPanelSplitter_
|
|
9
|
+
*
|
|
10
|
+
* A component that allows the user to resize or collapse the side nav.
|
|
11
|
+
* It must be used within the `SideNav` layout area.
|
|
12
|
+
*
|
|
13
|
+
* Example usage:
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <SideNav>
|
|
16
|
+
* <SideNavPanelSplitter label="Resize or collapse Side Nav" />
|
|
17
|
+
* </SideNav>
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export const SideNavPanelSplitter = ({
|
|
21
|
+
label,
|
|
22
|
+
onResizeStart,
|
|
23
|
+
onResizeEnd,
|
|
24
|
+
testId,
|
|
25
|
+
shouldCollapseOnDoubleClick = true
|
|
26
|
+
}) => {
|
|
27
|
+
const context = useContext(PanelSplitterContext);
|
|
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();
|
|
30
|
+
return /*#__PURE__*/React.createElement(OnDoubleClickContext.Provider, {
|
|
31
|
+
value: shouldCollapseOnDoubleClick ? toggleSideNav : undefined
|
|
32
|
+
}, /*#__PURE__*/React.createElement(PanelSplitter, {
|
|
33
|
+
label: label,
|
|
34
|
+
onResizeStart: onResizeStart,
|
|
35
|
+
onResizeEnd: onResizeEnd,
|
|
36
|
+
testId: testId
|
|
37
|
+
}));
|
|
38
|
+
};
|
|
@@ -13,6 +13,7 @@ import { useLayoutId } from './id-utils';
|
|
|
13
13
|
import { PanelSplitterProvider } from './panel-splitter/provider';
|
|
14
14
|
import { useSideNavRef } from './side-nav/element-context';
|
|
15
15
|
import { useResizingWidthCssVarOnRootElement } from './use-resizing-width-css-var-on-root-element';
|
|
16
|
+
import { useSafeDefaultWidth } from './use-safe-default-width';
|
|
16
17
|
const panelSplitterResizingVar = '--n_pnlRsz';
|
|
17
18
|
|
|
18
19
|
/**
|
|
@@ -30,6 +31,7 @@ const styles = {
|
|
|
30
31
|
oldMobileWidth: "_1bsb1adv",
|
|
31
32
|
newMobileWidth: "_1bsb1dxx"
|
|
32
33
|
};
|
|
34
|
+
const fallbackDefaultWidth = 365;
|
|
33
35
|
|
|
34
36
|
/**
|
|
35
37
|
* The Panel layout area is rendered to the right (inline end) of the Main area, or the Aside area if it is present.
|
|
@@ -40,7 +42,7 @@ const styles = {
|
|
|
40
42
|
*/
|
|
41
43
|
export function Panel({
|
|
42
44
|
children,
|
|
43
|
-
defaultWidth =
|
|
45
|
+
defaultWidth: defaultWidthProp = fallbackDefaultWidth,
|
|
44
46
|
label = 'Panel',
|
|
45
47
|
skipLinkLabel = label,
|
|
46
48
|
testId,
|
|
@@ -52,6 +54,12 @@ export function Panel({
|
|
|
52
54
|
const id = useLayoutId({
|
|
53
55
|
providedId
|
|
54
56
|
});
|
|
57
|
+
const defaultWidth = useSafeDefaultWidth({
|
|
58
|
+
defaultWidthProp,
|
|
59
|
+
fallbackDefaultWidth,
|
|
60
|
+
slotName: 'Panel'
|
|
61
|
+
});
|
|
62
|
+
|
|
55
63
|
/**
|
|
56
64
|
* Don't show the skip link if the slot has 0 width.
|
|
57
65
|
*
|
|
@@ -19,6 +19,7 @@ import { DangerouslyHoistCssVarToDocumentRoot } from '../hoist-utils';
|
|
|
19
19
|
import { useLayoutId } from '../id-utils';
|
|
20
20
|
import { PanelSplitterProvider } from '../panel-splitter/provider';
|
|
21
21
|
import { useResizingWidthCssVarOnRootElement } from '../use-resizing-width-css-var-on-root-element';
|
|
22
|
+
import { useSafeDefaultWidth } from '../use-safe-default-width';
|
|
22
23
|
import { useSideNavRef } from './element-context';
|
|
23
24
|
import { sideNavFlyoutCloseDelayMs } from './flyout-close-delay-ms';
|
|
24
25
|
import { SideNavToggleButtonElement } from './toggle-button-context';
|
|
@@ -48,6 +49,8 @@ const styles = {
|
|
|
48
49
|
hiddenMobileOnly: "_1e0cglyw _dm2518uv",
|
|
49
50
|
hiddenDesktopOnly: "_dm25glyw"
|
|
50
51
|
};
|
|
52
|
+
const fallbackDefaultWidth = 320;
|
|
53
|
+
|
|
51
54
|
/**
|
|
52
55
|
* We need an additional component layer so we can wrap the side nav in a `OpenLayerObserver` and have access to the
|
|
53
56
|
* context value.
|
|
@@ -55,7 +58,7 @@ const styles = {
|
|
|
55
58
|
function SideNavInternal({
|
|
56
59
|
children,
|
|
57
60
|
defaultCollapsed,
|
|
58
|
-
defaultWidth =
|
|
61
|
+
defaultWidth: defaultWidthProp = fallbackDefaultWidth,
|
|
59
62
|
testId,
|
|
60
63
|
label = 'Sidebar',
|
|
61
64
|
skipLinkLabel = label,
|
|
@@ -99,6 +102,11 @@ function SideNavInternal({
|
|
|
99
102
|
// This is so we can use it in an effect _that only runs once_, after the initial render on the client,
|
|
100
103
|
// to sync the side nav context (provided in `<Root>`) with the `defaultCollapsed` prop provided to `<SideNav>`.
|
|
101
104
|
const [initialDefaultCollapsed] = useState(defaultCollapsed);
|
|
105
|
+
const defaultWidth = useSafeDefaultWidth({
|
|
106
|
+
defaultWidthProp,
|
|
107
|
+
fallbackDefaultWidth,
|
|
108
|
+
slotName: 'SideNav'
|
|
109
|
+
});
|
|
102
110
|
const [width, setWidth] = useState(defaultWidth);
|
|
103
111
|
const clampedWidth = `clamp(${widthResizeBounds.min}, ${width}px, ${widthResizeBounds.max})`;
|
|
104
112
|
const dangerouslyHoistSlotSizes = useContext(DangerouslyHoistSlotSizes);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { fg } from '@atlaskit/platform-feature-flags';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* When `platform_dst_nav4_panel_splitter_guards` is disabled,
|
|
5
|
+
* `useSafeDefaultWidth` returns the provided `defaultWidthProp`.
|
|
6
|
+
*
|
|
7
|
+
* When `platform_dst_nav4_panel_splitter_guards` is enabled,
|
|
8
|
+
* `useSafeDefaultWidth` returns the `fallbackWidth` if the provided `defaultWidthProp` is not an integer value.
|
|
9
|
+
*/
|
|
10
|
+
export function useSafeDefaultWidth({
|
|
11
|
+
defaultWidthProp,
|
|
12
|
+
fallbackDefaultWidth,
|
|
13
|
+
slotName
|
|
14
|
+
}) {
|
|
15
|
+
if (fg('platform_dst_nav4_panel_splitter_guards')) {
|
|
16
|
+
// If the provided `defaultWidth` is invalid then we use our fallback.
|
|
17
|
+
// We are using a runtime check because some invalid numbers like `NaN` are not caught by types,
|
|
18
|
+
// and we saw some issues in products where our experience broke due to this.
|
|
19
|
+
if (!Number.isInteger(defaultWidthProp)) {
|
|
20
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
21
|
+
// eslint-disable-next-line no-console
|
|
22
|
+
console.error(`The defaultWidth value must be an integer, but '${defaultWidthProp}' was provided to ${slotName}. Falling back to ${fallbackDefaultWidth}px instead.`);
|
|
23
|
+
}
|
|
24
|
+
return fallbackDefaultWidth;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return defaultWidthProp;
|
|
28
|
+
}
|