@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.
Files changed (64) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/ui/menu-item/container-avatar.compiled.css +1 -1
  3. package/dist/cjs/ui/menu-item/container-avatar.js +1 -1
  4. package/dist/cjs/ui/page-layout/aside.js +8 -1
  5. package/dist/cjs/ui/page-layout/panel-splitter/context.js +11 -2
  6. package/dist/cjs/ui/page-layout/panel-splitter/get-width.js +5 -0
  7. package/dist/cjs/ui/page-layout/panel-splitter/panel-splitter.js +8 -1
  8. package/dist/cjs/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +47 -0
  9. package/dist/cjs/ui/page-layout/panel.js +9 -1
  10. package/dist/cjs/ui/page-layout/side-nav/side-nav.js +9 -1
  11. package/dist/cjs/ui/page-layout/use-safe-default-width.js +32 -0
  12. package/dist/cjs/ui/top-nav-items/nav-logo/custom-logo.compiled.css +1 -1
  13. package/dist/cjs/ui/top-nav-items/nav-logo/custom-logo.js +2 -2
  14. package/dist/cjs/ui/top-nav-items/search.compiled.css +1 -1
  15. package/dist/cjs/ui/top-nav-items/search.js +1 -1
  16. package/dist/cjs/ui/top-nav-items/themed/button.compiled.css +1 -1
  17. package/dist/cjs/ui/top-nav-items/themed/button.js +1 -1
  18. package/dist/es2019/ui/menu-item/container-avatar.compiled.css +1 -1
  19. package/dist/es2019/ui/menu-item/container-avatar.js +1 -1
  20. package/dist/es2019/ui/page-layout/aside.js +8 -1
  21. package/dist/es2019/ui/page-layout/panel-splitter/context.js +10 -1
  22. package/dist/es2019/ui/page-layout/panel-splitter/get-width.js +5 -0
  23. package/dist/es2019/ui/page-layout/panel-splitter/panel-splitter.js +9 -2
  24. package/dist/es2019/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +38 -0
  25. package/dist/es2019/ui/page-layout/panel.js +9 -1
  26. package/dist/es2019/ui/page-layout/side-nav/side-nav.js +9 -1
  27. package/dist/es2019/ui/page-layout/use-safe-default-width.js +28 -0
  28. package/dist/es2019/ui/top-nav-items/nav-logo/custom-logo.compiled.css +1 -1
  29. package/dist/es2019/ui/top-nav-items/nav-logo/custom-logo.js +2 -2
  30. package/dist/es2019/ui/top-nav-items/search.compiled.css +1 -1
  31. package/dist/es2019/ui/top-nav-items/search.js +1 -1
  32. package/dist/es2019/ui/top-nav-items/themed/button.compiled.css +1 -1
  33. package/dist/es2019/ui/top-nav-items/themed/button.js +1 -1
  34. package/dist/esm/ui/menu-item/container-avatar.compiled.css +1 -1
  35. package/dist/esm/ui/menu-item/container-avatar.js +1 -1
  36. package/dist/esm/ui/page-layout/aside.js +8 -1
  37. package/dist/esm/ui/page-layout/panel-splitter/context.js +10 -1
  38. package/dist/esm/ui/page-layout/panel-splitter/get-width.js +5 -0
  39. package/dist/esm/ui/page-layout/panel-splitter/panel-splitter.js +9 -2
  40. package/dist/esm/ui/page-layout/panel-splitter/side-nav-panel-splitter.js +38 -0
  41. package/dist/esm/ui/page-layout/panel.js +9 -1
  42. package/dist/esm/ui/page-layout/side-nav/side-nav.js +9 -1
  43. package/dist/esm/ui/page-layout/use-safe-default-width.js +27 -0
  44. package/dist/esm/ui/top-nav-items/nav-logo/custom-logo.compiled.css +1 -1
  45. package/dist/esm/ui/top-nav-items/nav-logo/custom-logo.js +2 -2
  46. package/dist/esm/ui/top-nav-items/search.compiled.css +1 -1
  47. package/dist/esm/ui/top-nav-items/search.js +1 -1
  48. package/dist/esm/ui/top-nav-items/themed/button.compiled.css +1 -1
  49. package/dist/esm/ui/top-nav-items/themed/button.js +1 -1
  50. package/dist/types/ui/page-layout/aside.d.ts +2 -2
  51. package/dist/types/ui/page-layout/panel-splitter/context.d.ts +8 -0
  52. package/dist/types/ui/page-layout/panel-splitter/panel-splitter.d.ts +1 -1
  53. package/dist/types/ui/page-layout/panel-splitter/side-nav-panel-splitter.d.ts +20 -0
  54. package/dist/types/ui/page-layout/panel.d.ts +2 -2
  55. package/dist/types/ui/page-layout/side-nav/side-nav.d.ts +2 -1
  56. package/dist/types/ui/page-layout/use-safe-default-width.d.ts +21 -0
  57. package/dist/types-ts4.5/ui/page-layout/aside.d.ts +2 -2
  58. package/dist/types-ts4.5/ui/page-layout/panel-splitter/context.d.ts +8 -0
  59. package/dist/types-ts4.5/ui/page-layout/panel-splitter/panel-splitter.d.ts +1 -1
  60. package/dist/types-ts4.5/ui/page-layout/panel-splitter/side-nav-panel-splitter.d.ts +20 -0
  61. package/dist/types-ts4.5/ui/page-layout/panel.d.ts +2 -2
  62. package/dist/types-ts4.5/ui/page-layout/side-nav/side-nav.d.ts +2 -1
  63. package/dist/types-ts4.5/ui/page-layout/use-safe-default-width.d.ts +21 -0
  64. 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
@@ -1,4 +1,4 @@
1
1
 
2
- ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}._1bsbgktf{width:20px}
2
+ ._2rko12b0{border-radius:var(--ds-radius-small,4px)}._1bsbgktf{width:20px}
3
3
  ._4t3igktf{height:20px}
4
4
  ._vchhusvi{box-sizing:border-box}
@@ -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: "_2rkoiti9 _vchhusvi _4t3igktf _1bsbgktf"
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
- defaultWidth = _ref$defaultWidth === void 0 ? 330 : _ref$defaultWidth,
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
- defaultWidth = _ref$defaultWidth === void 0 ? 365 : _ref$defaultWidth,
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
- defaultWidth = _ref$defaultWidth === void 0 ? 320 : _ref$defaultWidth,
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
- ._2rkosqtm{border-radius:var(--ds-border-radius-100,3px)}
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: "_2rkosqtm _1e0c1txw _4cvr1h6o _4t3izwfg",
21
- customLogoBorderRadius: "_2rkosqtm",
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
- ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}._18zr12x7{padding-inline:var(--ds-space-075,6px)}
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: "_2rkoiti9 _1rjcze3t _18zr12x7 _yv0e1mfv _4cvr1h6o _bfhk1j9a _vchhusvi _80om1kdv _1e0cglyw _4t3izwfg _p12f1kvu _1bsb1osq _irr31d5g _1di6r01l _114b11p5",
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
- ._2rkosqtm{border-radius:var(--ds-border-radius-100,3px)}
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 _2rkosqtm _v5649dqc _4bfu1r31 _1hmsglyw _ajmmnqa1 _1rjcze3t _1e0c1txw _4cvr1h6o _1bah1h6o _4t3i5r7u _kqswh2mm _1nrm1r31 _1a3b1r31 _9oik1r31 _c2waglyw _4fprglyw _1bnxglyw _1iohnqa1 _5goinqa1 _jf4cnqa1",
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"
@@ -1,4 +1,4 @@
1
1
 
2
- ._2rkoiti9{border-radius:var(--ds-border-radius-100,4px)}._1bsbgktf{width:20px}
2
+ ._2rko12b0{border-radius:var(--ds-radius-small,4px)}._1bsbgktf{width:20px}
3
3
  ._4t3igktf{height:20px}
4
4
  ._vchhusvi{box-sizing:border-box}
@@ -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: "_2rkoiti9 _vchhusvi _4t3igktf _1bsbgktf"
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 = 330,
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 = 365,
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 = 320,
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
+ }