@atlaskit/menu 1.1.3 → 1.2.2

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 (79) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/cjs/internal/components/menu-item-primitive.js +200 -0
  3. package/dist/cjs/menu-item/button-item.js +31 -25
  4. package/dist/cjs/menu-item/custom-item.js +31 -32
  5. package/dist/cjs/menu-item/heading-item.js +25 -7
  6. package/dist/cjs/menu-item/link-item.js +50 -45
  7. package/dist/cjs/menu-item/skeleton-heading-item.js +42 -14
  8. package/dist/cjs/menu-item/skeleton-item.js +93 -13
  9. package/dist/cjs/menu-section/menu-group.js +11 -8
  10. package/dist/cjs/menu-section/section.js +83 -29
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/es2019/internal/components/menu-item-primitive.js +180 -0
  13. package/dist/es2019/menu-item/button-item.js +28 -21
  14. package/dist/es2019/menu-item/custom-item.js +32 -24
  15. package/dist/es2019/menu-item/heading-item.js +22 -6
  16. package/dist/es2019/menu-item/link-item.js +31 -26
  17. package/dist/es2019/menu-item/skeleton-heading-item.js +37 -11
  18. package/dist/es2019/menu-item/skeleton-item.js +89 -11
  19. package/dist/es2019/menu-section/menu-group.js +12 -8
  20. package/dist/es2019/menu-section/section.js +83 -31
  21. package/dist/es2019/version.json +1 -1
  22. package/dist/esm/internal/components/menu-item-primitive.js +184 -0
  23. package/dist/esm/menu-item/button-item.js +30 -24
  24. package/dist/esm/menu-item/custom-item.js +32 -26
  25. package/dist/esm/menu-item/heading-item.js +22 -8
  26. package/dist/esm/menu-item/link-item.js +49 -45
  27. package/dist/esm/menu-item/skeleton-heading-item.js +38 -14
  28. package/dist/esm/menu-item/skeleton-item.js +89 -13
  29. package/dist/esm/menu-section/menu-group.js +12 -8
  30. package/dist/esm/menu-section/section.js +82 -32
  31. package/dist/esm/version.json +1 -1
  32. package/dist/types/index.d.ts +1 -1
  33. package/dist/types/internal/components/menu-item-primitive.d.ts +17 -0
  34. package/dist/types/menu-item/button-item.d.ts +1 -1
  35. package/dist/types/menu-item/custom-item.d.ts +2 -1
  36. package/dist/types/menu-item/skeleton-heading-item.d.ts +1 -2
  37. package/dist/types/menu-item/skeleton-item.d.ts +1 -2
  38. package/dist/types/types.d.ts +27 -7
  39. package/package.json +4 -2
  40. package/dist/cjs/internal/components/base-item.js +0 -65
  41. package/dist/cjs/internal/styles/menu-item/base-item.js +0 -152
  42. package/dist/cjs/internal/styles/menu-item/button-item.js +0 -28
  43. package/dist/cjs/internal/styles/menu-item/custom-item.js +0 -24
  44. package/dist/cjs/internal/styles/menu-item/heading-item.js +0 -28
  45. package/dist/cjs/internal/styles/menu-item/link-item.js +0 -22
  46. package/dist/cjs/internal/styles/menu-item/skeleton-heading-item.js +0 -50
  47. package/dist/cjs/internal/styles/menu-item/skeleton-item.js +0 -98
  48. package/dist/cjs/internal/styles/menu-section/menu-group.js +0 -24
  49. package/dist/cjs/internal/styles/menu-section/section.js +0 -83
  50. package/dist/es2019/internal/components/base-item.js +0 -51
  51. package/dist/es2019/internal/styles/menu-item/base-item.js +0 -122
  52. package/dist/es2019/internal/styles/menu-item/button-item.js +0 -9
  53. package/dist/es2019/internal/styles/menu-item/custom-item.js +0 -5
  54. package/dist/es2019/internal/styles/menu-item/heading-item.js +0 -16
  55. package/dist/es2019/internal/styles/menu-item/link-item.js +0 -3
  56. package/dist/es2019/internal/styles/menu-item/skeleton-heading-item.js +0 -25
  57. package/dist/es2019/internal/styles/menu-item/skeleton-item.js +0 -75
  58. package/dist/es2019/internal/styles/menu-section/menu-group.js +0 -14
  59. package/dist/es2019/internal/styles/menu-section/section.js +0 -62
  60. package/dist/esm/internal/components/base-item.js +0 -55
  61. package/dist/esm/internal/styles/menu-item/base-item.js +0 -124
  62. package/dist/esm/internal/styles/menu-item/button-item.js +0 -16
  63. package/dist/esm/internal/styles/menu-item/custom-item.js +0 -12
  64. package/dist/esm/internal/styles/menu-item/heading-item.js +0 -16
  65. package/dist/esm/internal/styles/menu-item/link-item.js +0 -10
  66. package/dist/esm/internal/styles/menu-item/skeleton-heading-item.js +0 -33
  67. package/dist/esm/internal/styles/menu-item/skeleton-item.js +0 -81
  68. package/dist/esm/internal/styles/menu-section/menu-group.js +0 -15
  69. package/dist/esm/internal/styles/menu-section/section.js +0 -67
  70. package/dist/types/internal/components/base-item.d.ts +0 -9
  71. package/dist/types/internal/styles/menu-item/base-item.d.ts +0 -23
  72. package/dist/types/internal/styles/menu-item/button-item.d.ts +0 -2
  73. package/dist/types/internal/styles/menu-item/custom-item.d.ts +0 -2
  74. package/dist/types/internal/styles/menu-item/heading-item.d.ts +0 -2
  75. package/dist/types/internal/styles/menu-item/link-item.d.ts +0 -2
  76. package/dist/types/internal/styles/menu-item/skeleton-heading-item.d.ts +0 -2
  77. package/dist/types/internal/styles/menu-item/skeleton-item.d.ts +0 -2
  78. package/dist/types/internal/styles/menu-section/menu-group.d.ts +0 -3
  79. package/dist/types/internal/styles/menu-section/section.d.ts +0 -2
@@ -1,18 +1,44 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.default = void 0;
7
9
 
8
- var _react = require("react");
9
-
10
10
  var _core = require("@emotion/core");
11
11
 
12
- var _skeletonHeadingItem = require("../internal/styles/menu-item/skeleton-heading-item");
12
+ var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
13
13
 
14
- /** @jsx jsx */
14
+ var _colors = require("@atlaskit/theme/colors");
15
15
 
16
+ var _constants = require("@atlaskit/theme/constants");
17
+
18
+ var _tokens = require("@atlaskit/tokens");
19
+
20
+ /** @jsx jsx */
21
+ var skeletonStyles = (0, _core.css)({
22
+ padding: "0 ".concat((0, _constants.gridSize)() * 2.5, "px"),
23
+ '::after': {
24
+ display: 'block',
25
+ width: '30%',
26
+ height: (0, _constants.gridSize)(),
27
+ backgroundColor: (0, _tokens.token)('color.background.subtleNeutral.resting', (0, _colors.skeleton)()),
28
+ borderRadius: 100,
29
+ content: '""'
30
+ }
31
+ });
32
+ var defaultWidthStyles = (0, _core.css)({
33
+ '::after': {
34
+ width: '30%'
35
+ }
36
+ });
37
+ var customWidthStyles = (0, _core.css)({
38
+ '::after': {
39
+ width: 'var(--width)'
40
+ }
41
+ });
16
42
  /**
17
43
  * __Skeleton heading item__
18
44
  *
@@ -21,20 +47,22 @@ var _skeletonHeadingItem = require("../internal/styles/menu-item/skeleton-headin
21
47
  * - [Examples](https://atlaskit.atlassian.com/packages/design-system/menu/docs/skeleton-heading-item)
22
48
  * - [Code](https://atlaskit.atlassian.com/packages/design-system/menu)
23
49
  */
24
- var SkeletonHeadingItem = /*#__PURE__*/(0, _react.memo)(function (_ref) {
25
- var width = _ref.width,
26
- testId = _ref.testId,
27
- isShimmering = _ref.isShimmering,
50
+
51
+ var SkeletonHeadingItem = function SkeletonHeadingItem(_ref) {
52
+ var testId = _ref.testId,
53
+ width = _ref.width,
28
54
  _ref$cssFn = _ref.cssFn,
29
- cssFn = _ref$cssFn === void 0 ? function () {
30
- return {};
31
- } : _ref$cssFn;
55
+ cssFn = _ref$cssFn === void 0 ? _noop.default : _ref$cssFn;
32
56
  return (0, _core.jsx)("div", {
33
- // eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
34
- css: [(0, _skeletonHeadingItem.skeletonHeadingItemCSS)(width, isShimmering), cssFn(undefined)],
57
+ style: {
58
+ '--width': width
59
+ },
60
+ css: [skeletonStyles, width ? customWidthStyles : defaultWidthStyles, // eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
61
+ cssFn(undefined)],
35
62
  "data-ds--menu--skeleton-heading-item": true,
36
63
  "data-testid": testId
37
64
  });
38
- });
65
+ };
66
+
39
67
  var _default = SkeletonHeadingItem;
40
68
  exports.default = _default;
@@ -1,18 +1,97 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.default = void 0;
7
9
 
8
- var _react = require("react");
9
-
10
10
  var _core = require("@emotion/core");
11
11
 
12
- var _skeletonItem = require("../internal/styles/menu-item/skeleton-item");
12
+ var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
13
13
 
14
- /** @jsx jsx */
14
+ var _colors = require("@atlaskit/theme/colors");
15
+
16
+ var _constants = require("@atlaskit/theme/constants");
17
+
18
+ var _tokens = require("@atlaskit/tokens");
15
19
 
20
+ /** @jsx jsx */
21
+ var gridSize = (0, _constants.gridSize)();
22
+ var borderRadius = (0, _constants.borderRadius)();
23
+ var itemElemSpacing = gridSize * 1.5;
24
+ var itemExpectedElemSize = gridSize * 3;
25
+ var itemMinHeight = gridSize * 5;
26
+ var itemPadding = gridSize * 2.5;
27
+ var skeletonItemElemSize = gridSize * 2.5;
28
+ var itemElemSkeletonOffset = (itemExpectedElemSize - skeletonItemElemSize) / 2;
29
+ var skeletonTextBorderRadius = 100;
30
+ var skeletonContentHeight = 9;
31
+ var skeletonColor = (0, _tokens.token)('color.background.subtleNeutral.resting', (0, _colors.skeleton)());
32
+ var skeletonStyles = (0, _core.css)({
33
+ display: 'flex',
34
+ minHeight: itemMinHeight,
35
+ padding: "0 ".concat(itemPadding, "px"),
36
+ alignItems: 'center',
37
+ pointerEvents: 'none',
38
+ '::after': {
39
+ height: skeletonContentHeight,
40
+ // This is a little bespoke but we need to push everything down 1px
41
+ // because the skeleton content should align to the bottom of the text.
42
+ // Confirm VR test failures before accepting a change.
43
+ marginTop: 1,
44
+ backgroundColor: skeletonColor,
45
+ borderRadius: skeletonTextBorderRadius,
46
+ content: '""'
47
+ }
48
+ });
49
+ var defaultWidthStyles = (0, _core.css)({
50
+ ':nth-of-type(1n)::after': {
51
+ flexBasis: '70%'
52
+ },
53
+ ':nth-of-type(2n)::after': {
54
+ flexBasis: '50%'
55
+ },
56
+ ':nth-of-type(3n)::after': {
57
+ flexBasis: '60%'
58
+ },
59
+ ':nth-of-type(4n)::after': {
60
+ flexBasis: '90%'
61
+ },
62
+ ':nth-of-type(5n)::after': {
63
+ flexBasis: '35%'
64
+ },
65
+ ':nth-of-type(6n)::after': {
66
+ flexBasis: '77%'
67
+ }
68
+ });
69
+ var customWidthStyles = (0, _core.css)({
70
+ '::after': {
71
+ flexBasis: 'var(--width)'
72
+ }
73
+ });
74
+ var beforeElementStyles = (0, _core.css)({
75
+ '::before': {
76
+ width: skeletonItemElemSize,
77
+ height: skeletonItemElemSize,
78
+ marginRight: itemElemSpacing + itemElemSkeletonOffset,
79
+ marginLeft: itemElemSkeletonOffset,
80
+ flexShrink: 0,
81
+ backgroundColor: skeletonColor,
82
+ content: '""'
83
+ }
84
+ });
85
+ var avatarStyles = (0, _core.css)({
86
+ '::before': {
87
+ borderRadius: '100%'
88
+ }
89
+ });
90
+ var iconStyles = (0, _core.css)({
91
+ '::before': {
92
+ borderRadius: borderRadius
93
+ }
94
+ });
16
95
  /**
17
96
  * __Skeleton item__
18
97
  *
@@ -21,22 +100,23 @@ var _skeletonItem = require("../internal/styles/menu-item/skeleton-item");
21
100
  * - [Examples](https://atlaskit.atlassian.com/packages/design-system/menu/docs/skeleton-item)
22
101
  * - [Code](https://atlaskit.atlassian.com/packages/design-system/menu)
23
102
  */
24
- var SkeletonItem = /*#__PURE__*/(0, _react.memo)(function (_ref) {
103
+
104
+ var SkeletonItem = function SkeletonItem(_ref) {
25
105
  var hasAvatar = _ref.hasAvatar,
26
106
  hasIcon = _ref.hasIcon,
27
- width = _ref.width,
28
107
  testId = _ref.testId,
29
- isShimmering = _ref.isShimmering,
108
+ width = _ref.width,
30
109
  _ref$cssFn = _ref.cssFn,
31
- cssFn = _ref$cssFn === void 0 ? function () {
32
- return {};
33
- } : _ref$cssFn;
110
+ cssFn = _ref$cssFn === void 0 ? _noop.default : _ref$cssFn;
34
111
  return (0, _core.jsx)("div", {
35
- css: [// eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
36
- (0, _skeletonItem.skeletonItemCSS)(hasAvatar, hasIcon, width, isShimmering), // eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
112
+ style: {
113
+ '--width': width
114
+ },
115
+ css: [skeletonStyles, (hasAvatar || hasIcon) && beforeElementStyles, hasAvatar && avatarStyles, hasIcon && iconStyles, width ? customWidthStyles : defaultWidthStyles, // eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
37
116
  cssFn(undefined)],
38
117
  "data-testid": testId
39
118
  });
40
- });
119
+ };
120
+
41
121
  var _default = SkeletonItem;
42
122
  exports.default = _default;
@@ -13,10 +13,12 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
13
13
 
14
14
  var _core = require("@emotion/core");
15
15
 
16
- var _menuGroup = require("../internal/styles/menu-section/menu-group");
17
-
18
16
  /** @jsx jsx */
19
-
17
+ var groupStyles = (0, _core.css)({
18
+ display: 'flex',
19
+ flexDirection: 'column',
20
+ overflow: 'auto'
21
+ });
20
22
  /**
21
23
  * __Menu group__
22
24
  *
@@ -25,6 +27,7 @@ var _menuGroup = require("../internal/styles/menu-section/menu-group");
25
27
  * - [Examples](https://atlaskit.atlassian.com/packages/design-system/menu/docs/menu-group)
26
28
  * - [Code](https://atlaskit.atlassian.com/packages/design-system/menu)
27
29
  */
30
+
28
31
  var MenuGroup = function MenuGroup(_ref) {
29
32
  var maxWidth = _ref.maxWidth,
30
33
  minWidth = _ref.minWidth,
@@ -33,13 +36,13 @@ var MenuGroup = function MenuGroup(_ref) {
33
36
  testId = _ref.testId,
34
37
  rest = (0, _objectWithoutProperties2.default)(_ref, ["maxWidth", "minWidth", "minHeight", "maxHeight", "testId"]);
35
38
  return (0, _core.jsx)("div", (0, _extends2.default)({
36
- // eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
37
- css: (0, _menuGroup.menuGroupCSS)({
38
- maxHeight: maxHeight,
39
+ style: {
40
+ minWidth: minWidth,
39
41
  maxWidth: maxWidth,
40
42
  minHeight: minHeight,
41
- minWidth: minWidth
42
- }),
43
+ maxHeight: maxHeight
44
+ },
45
+ css: groupStyles,
43
46
  "data-testid": testId
44
47
  }, rest));
45
48
  };
@@ -15,12 +15,78 @@ var _react = require("react");
15
15
 
16
16
  var _core = require("@emotion/core");
17
17
 
18
- var _section = require("../internal/styles/menu-section/section");
18
+ var _colors = require("@atlaskit/theme/colors");
19
+
20
+ var _constants = require("@atlaskit/theme/constants");
21
+
22
+ var _typography = require("@atlaskit/theme/typography");
23
+
24
+ var _tokens = require("@atlaskit/tokens");
19
25
 
20
26
  var _headingItem = _interopRequireDefault(require("../menu-item/heading-item"));
21
27
 
22
28
  /** @jsx jsx */
29
+ var gridSize = (0, _constants.gridSize)();
30
+ var itemHeadingTopMargin = gridSize * 2.5;
31
+ var itemHeadingBottomMargin = gridSize * 0.75; // Skeleton content is slightly shorter than the real content.
32
+ // Because of that we slightly increase the top margin to offset this so the
33
+ // containing size both real and skeleton always equal approx 30px.
23
34
 
35
+ var itemHeadingContentHeight = _typography.headingSizes.h100.lineHeight;
36
+ var skeletonHeadingHeight = gridSize;
37
+ var skeletonHeadingMarginOffset = 3;
38
+ var skeletonHeadingTopMargin = itemHeadingTopMargin + (itemHeadingContentHeight - skeletonHeadingHeight) - skeletonHeadingMarginOffset; // We want to move the entire body up by 3px without affecting the height of the skeleton container.
39
+
40
+ var skeletonHeadingBottomMargin = itemHeadingBottomMargin + skeletonHeadingMarginOffset;
41
+ var sectionPaddingTopBottom = gridSize * 0.75;
42
+ var VAR_SEPARATOR_COLOR = '--ds-menu-seperator-color';
43
+ var sectionStyles = (0, _core.css)({
44
+ '&::before, &::after': {
45
+ display: 'block',
46
+ height: sectionPaddingTopBottom,
47
+ content: '""'
48
+ },
49
+ // eslint-disable-next-line @repo/internal/styles/no-nested-styles
50
+ '& [data-ds--menu--heading-item]': {
51
+ marginTop: itemHeadingTopMargin,
52
+ marginBottom: itemHeadingBottomMargin,
53
+ '&:first-of-type': {
54
+ marginTop: itemHeadingTopMargin - sectionPaddingTopBottom
55
+ }
56
+ },
57
+ // eslint-disable-next-line @repo/internal/styles/no-nested-styles
58
+ '& [data-ds--menu--skeleton-heading-item]': {
59
+ marginTop: skeletonHeadingTopMargin,
60
+ marginBottom: skeletonHeadingBottomMargin,
61
+ '&:first-of-type': {
62
+ marginTop: skeletonHeadingTopMargin - sectionPaddingTopBottom
63
+ }
64
+ },
65
+ '&:focus': {
66
+ // NOTE: Firefox allows elements that have "overflow: auto" to gain focus (as if it had tab-index="0")
67
+ // We have made a deliberate choice to leave this behaviour as is.
68
+ // This makes the outline go inside by 1px so it can actually be displayed
69
+ // else it gets cut off from the overflow: scroll from the parent menu group.
70
+ outlineOffset: -1
71
+ }
72
+ });
73
+ var scrollableStyles = (0, _core.css)({
74
+ flexShrink: 1,
75
+ overflow: 'auto'
76
+ });
77
+ var unscrollableStyles = (0, _core.css)({
78
+ flexShrink: 0
79
+ });
80
+ var separatorStyles = (0, _core.css)({
81
+ borderTop: "2px solid var(".concat(VAR_SEPARATOR_COLOR, ", ").concat((0, _tokens.token)('color.border.neutral', _colors.N30A), ")")
82
+ });
83
+ var noSeparatorStyles = (0, _core.css)({
84
+ // this is to ensure that adjacent sections without separators don't get additional margins.
85
+ // eslint-disable-next-line @repo/internal/styles/no-nested-styles
86
+ '[data-section] + &': {
87
+ marginTop: -6
88
+ }
89
+ });
24
90
  /**
25
91
  * __Section__
26
92
  *
@@ -29,45 +95,33 @@ var _headingItem = _interopRequireDefault(require("../menu-item/heading-item"));
29
95
  * - [Examples](https://atlaskit.atlassian.com/packages/design-system/menu/docs/section)
30
96
  * - [Code](https://atlaskit.atlassian.com/packages/design-system/menu)
31
97
  */
32
- var Section = /*#__PURE__*/(0, _react.forwardRef)( // Type needed on props to extract types with extract react types.
33
- function (_ref, ref) {
98
+
99
+ var Section = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
34
100
  var children = _ref.children,
35
101
  overrides = _ref.overrides,
36
102
  title = _ref.title,
37
103
  testId = _ref.testId,
38
- rest = (0, _objectWithoutProperties2.default)(_ref, ["children", "overrides", "title", "testId"]);
39
- return title !== undefined ? (0, _core.jsx)(SectionBase, (0, _extends2.default)({}, rest, {
40
- testId: testId,
41
- ref: ref,
42
- "aria-label": title
43
- }), (0, _core.jsx)(_headingItem.default // eslint-disable-next-line @repo/internal/react/no-unsafe-overrides
104
+ isScrollable = _ref.isScrollable,
105
+ hasSeparator = _ref.hasSeparator,
106
+ id = _ref.id,
107
+ rest = (0, _objectWithoutProperties2.default)(_ref, ["children", "overrides", "title", "testId", "isScrollable", "hasSeparator", "id"]);
108
+ var childrenMarkup = title !== undefined ? (0, _core.jsx)(_react.Fragment, null, (0, _core.jsx)(_headingItem.default // eslint-disable-next-line @repo/internal/react/no-unsafe-overrides
44
109
  , {
45
110
  cssFn: overrides && overrides.HeadingItem && overrides.HeadingItem.cssFn,
46
111
  testId: testId && "".concat(testId, "--heading"),
47
112
  "aria-hidden": true
48
- }, title), children) : (0, _core.jsx)(SectionBase, (0, _extends2.default)({}, rest, {
49
- ref: ref
50
- }), children);
51
- });
52
- var SectionBase = /*#__PURE__*/(0, _react.forwardRef)( // Type needed on props to extract types with extract react types.
53
- function (_ref2, ref) {
54
- var isScrollable = _ref2.isScrollable,
55
- hasSeparator = _ref2.hasSeparator,
56
- testId = _ref2.testId,
57
- rest = (0, _objectWithoutProperties2.default)(_ref2, ["isScrollable", "hasSeparator", "testId"]);
58
- return (0, _core.jsx)("div", (0, _extends2.default)({
59
- // NOTE: Firefox allows elements that have "overflow: auto" to gain focus (as if it had tab-index="0")
113
+ }, title), children) : children;
114
+ return (0, _core.jsx)("div", (0, _extends2.default)({}, rest, {
115
+ id: id // NOTE: Firefox allows elements that have "overflow: auto" to gain focus (as if it had tab-index="0")
60
116
  // We have made a deliberate choice to leave this behaviour as is.
61
- // eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
62
- css: (0, _section.sectionCSS)(isScrollable, hasSeparator),
63
- "data-testid": testId,
64
- role: "group" // this is being used to target CSS selectors
65
- // where emotion's API was falling a little short.
66
117
  ,
67
- "data-section": true
68
- }, rest, {
118
+ css: [sectionStyles, isScrollable ? scrollableStyles : unscrollableStyles, hasSeparator ? separatorStyles : noSeparatorStyles],
119
+ "aria-label": title,
120
+ "data-testid": testId,
121
+ role: "group",
122
+ "data-section": true,
69
123
  ref: ref
70
- }));
124
+ }), childrenMarkup);
71
125
  });
72
126
  var _default = Section;
73
127
  exports.default = _default;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/menu",
3
- "version": "1.1.3",
3
+ "version": "1.2.2",
4
4
  "sideEffects": false
5
5
  }
@@ -0,0 +1,180 @@
1
+ /** @jsx jsx */
2
+ import { Fragment } from 'react';
3
+ import { ClassNames, css, jsx } from '@emotion/core';
4
+ import FocusRing from '@atlaskit/focus-ring';
5
+ import { N20, N200, N30 } from '@atlaskit/theme/colors';
6
+ import { fontSize as fontSizeFn, gridSize as gridSizeFn } from '@atlaskit/theme/constants';
7
+ import { headingSizes } from '@atlaskit/theme/typography';
8
+ import { token } from '@atlaskit/tokens';
9
+
10
+ const defaultRender = (Component, props) => jsx(Component, props);
11
+
12
+ const gridSize = gridSizeFn();
13
+ const fontSize = fontSizeFn();
14
+ const itemTopBottomPadding = gridSize;
15
+ const itemSidePadding = gridSize * 2.5;
16
+ const itemElemSpacing = gridSize * 1.5;
17
+ const itemDescriptionSpacing = gridSize * 0.375;
18
+ const itemMinHeight = gridSize * 5;
19
+ const beforeElementStyles = css({
20
+ display: 'flex',
21
+ marginRight: itemElemSpacing,
22
+ alignItems: 'center',
23
+ flexShrink: 0
24
+ });
25
+ const afterElementStyles = css({
26
+ display: 'flex',
27
+ marginLeft: itemElemSpacing,
28
+ alignItems: 'center',
29
+ flexShrink: 0
30
+ });
31
+ const contentStyles = css({
32
+ display: 'flex',
33
+ justifyContent: 'center',
34
+ flexDirection: 'column',
35
+ flexGrow: 1,
36
+ // Fix - avoid clipped text descenders when using standard 16px line-height
37
+ lineHeight: 1.22,
38
+ outline: 'none',
39
+ overflow: 'hidden',
40
+ textAlign: 'left'
41
+ });
42
+ const truncateStyles = css({
43
+ display: 'block',
44
+ overflow: 'hidden',
45
+ textOverflow: 'ellipsis',
46
+ whiteSpace: 'nowrap'
47
+ });
48
+ const wordBreakStyles = css({
49
+ wordBreak: 'break-word'
50
+ });
51
+ const descriptionStyles = css({
52
+ marginTop: itemDescriptionSpacing,
53
+ color: token('color.text.lowEmphasis', N200),
54
+ fontSize: headingSizes.h200.size
55
+ });
56
+ const primitiveStyles = css({
57
+ display: 'flex',
58
+ boxSizing: 'border-box',
59
+ width: '100%',
60
+ minHeight: itemMinHeight,
61
+ margin: 0,
62
+ padding: `${itemTopBottomPadding}px ${itemSidePadding}px`,
63
+ alignItems: 'center',
64
+ border: 0,
65
+ fontSize: fontSize,
66
+ outline: 0,
67
+ textDecoration: 'none',
68
+ userSelect: 'none',
69
+ '::-moz-focus-inner': {
70
+ border: 0
71
+ },
72
+ ':hover': {
73
+ textDecoration: 'none'
74
+ }
75
+ });
76
+ const interactiveStyles = css({
77
+ cursor: 'pointer'
78
+ });
79
+ const unselectedStyles = css({
80
+ backgroundColor: 'transparent',
81
+ color: 'currentColor',
82
+ ':visited': {
83
+ color: 'currentColor'
84
+ },
85
+ ':hover': {
86
+ backgroundColor: token('color.background.transparentNeutral.hover', N20),
87
+ color: 'currentColor'
88
+ },
89
+ ':active': {
90
+ backgroundColor: token('color.background.transparentNeutral.pressed', N30),
91
+ boxShadow: 'none',
92
+ color: 'currentColor'
93
+ }
94
+ });
95
+ const disabledStyles = css({
96
+ cursor: 'not-allowed',
97
+ '&, :hover, :active': {
98
+ backgroundColor: 'transparent',
99
+ color: token('color.text.disabled', N200)
100
+ }
101
+ });
102
+ const selectedStyles = css({
103
+ backgroundColor: token('color.background.selected.resting', N20),
104
+ // Suppress the need for a fallback as selected color isn't used in the non-tokens world.
105
+ // When removing fallbacks make sure to remove this supression.
106
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
107
+ color: token('color.text.selected'),
108
+ ':visited': {
109
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
110
+ color: token('color.text.selected')
111
+ },
112
+ ':hover': {
113
+ backgroundColor: token('color.background.selected.hover', N20),
114
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
115
+ color: token('color.text.selected')
116
+ },
117
+ ':active': {
118
+ backgroundColor: token('color.background.selected.pressed', N30),
119
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
120
+ color: token('color.text.selected')
121
+ }
122
+ });
123
+ /**
124
+ * __Menu item primitive__
125
+ *
126
+ * Menu item primitive contains all the styles for menu items,
127
+ * including support for selected, disabled, and interaction states.
128
+ *
129
+ * Using children as function prop you wire up this to your own host element.
130
+ *
131
+ * ```jsx
132
+ * <MenuItemPrimitive>
133
+ * {({ children, ...props }) => <button {...props}>{children}</button>}
134
+ * </MenuItemPrimitive>
135
+ * ```
136
+ */
137
+
138
+ const MenuItemPrimitive = ({
139
+ children,
140
+ title,
141
+ description,
142
+ iconAfter,
143
+ iconBefore,
144
+ overrides,
145
+ className,
146
+ shouldTitleWrap = false,
147
+ shouldDescriptionWrap = false,
148
+ isDisabled = false,
149
+ isSelected = false
150
+ }) => {
151
+ const renderTitle = overrides && overrides.Title && overrides.Title.render || defaultRender;
152
+ return jsx(ClassNames, null, ({
153
+ css: cn,
154
+ cx
155
+ }) => {
156
+ return jsx(FocusRing, {
157
+ isInset: true
158
+ }, children({
159
+ className: cx([cn([primitiveStyles, !isDisabled && !isSelected && unselectedStyles, !isDisabled && isSelected && selectedStyles, isDisabled ? disabledStyles : interactiveStyles]), className]),
160
+ children: jsx(Fragment, null, iconBefore && jsx("span", {
161
+ "data-item-elem-before": true,
162
+ css: beforeElementStyles
163
+ }, iconBefore), title && jsx("span", {
164
+ css: contentStyles
165
+ }, renderTitle('span', {
166
+ children: title,
167
+ className: cn(shouldTitleWrap ? wordBreakStyles : truncateStyles),
168
+ 'data-item-title': true
169
+ }), description && jsx("span", {
170
+ "data-item-description": true,
171
+ css: [descriptionStyles, shouldDescriptionWrap ? wordBreakStyles : truncateStyles]
172
+ }, description)), iconAfter && jsx("span", {
173
+ "data-item-elem-after": true,
174
+ css: afterElementStyles
175
+ }, iconAfter))
176
+ }));
177
+ });
178
+ };
179
+
180
+ export default MenuItemPrimitive;
@@ -3,14 +3,14 @@ import _extends from "@babel/runtime/helpers/extends";
3
3
  /** @jsx jsx */
4
4
  import { forwardRef, memo } from 'react';
5
5
  import { jsx } from '@emotion/core';
6
- import BaseItem from '../internal/components/base-item';
6
+ import noop from '@atlaskit/ds-lib/noop';
7
+ import MenuItemPrimitive from '../internal/components/menu-item-primitive';
7
8
  import { useBlurOnMouseDown } from '../internal/hooks/use-blur-on-mouse-down';
8
- import { buttonItemCSS } from '../internal/styles/menu-item/button-item';
9
9
 
10
10
  /**
11
11
  * __Button item__
12
12
  *
13
- * A button item is used to populate a menu with items that need to be a button element.
13
+ * A button item is used to populate a menu with items that are buttons.
14
14
  *
15
15
  * - [Examples](https://atlaskit.atlassian.com/packages/design-system/menu/docs/button-item)
16
16
  * - [Code](https://atlaskit.atlassian.com/packages/design-system/menu)
@@ -19,7 +19,7 @@ const ButtonItem = /*#__PURE__*/memo( /*#__PURE__*/forwardRef( // Type needed on
19
19
  (props, ref) => {
20
20
  const {
21
21
  children,
22
- cssFn = () => ({}),
22
+ cssFn = noop,
23
23
  description,
24
24
  iconAfter,
25
25
  iconBefore,
@@ -31,7 +31,7 @@ const ButtonItem = /*#__PURE__*/memo( /*#__PURE__*/forwardRef( // Type needed on
31
31
  onMouseDown,
32
32
  shouldTitleWrap,
33
33
  shouldDescriptionWrap,
34
- ...others
34
+ ...rest
35
35
  } = props;
36
36
  const onMouseDownHandler = useBlurOnMouseDown(onMouseDown);
37
37
 
@@ -39,27 +39,34 @@ const ButtonItem = /*#__PURE__*/memo( /*#__PURE__*/forwardRef( // Type needed on
39
39
  return null;
40
40
  }
41
41
 
42
- return jsx("button", _extends({
43
- css: [// eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
44
- buttonItemCSS(isDisabled, isSelected), // eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
42
+ return jsx(MenuItemPrimitive, _extends({}, rest, {
43
+ // eslint-disable-next-line @repo/internal/react/no-unsafe-overrides
44
+ overrides: overrides,
45
+ iconBefore: iconBefore,
46
+ iconAfter: iconAfter,
47
+ isDisabled: isDisabled,
48
+ isSelected: isSelected,
49
+ description: description,
50
+ title: children,
51
+ shouldTitleWrap: shouldTitleWrap,
52
+ shouldDescriptionWrap: shouldDescriptionWrap,
53
+ css: // eslint-disable-next-line @repo/internal/react/consistent-css-prop-usage
45
54
  cssFn({
46
55
  isSelected,
47
56
  isDisabled
48
- })],
49
- type: "button",
50
- "data-testid": testId,
57
+ })
58
+ }), ({
59
+ children,
60
+ className
61
+ }) => jsx("button", _extends({
62
+ "data-testid": testId
63
+ }, rest, {
64
+ className: className,
65
+ ref: ref,
51
66
  disabled: isDisabled,
52
67
  onClick: onClick,
53
68
  onMouseDown: onMouseDownHandler,
54
- ref: ref
55
- }, others), jsx(BaseItem // eslint-disable-next-line @repo/internal/react/no-unsafe-overrides
56
- , {
57
- overrides: overrides,
58
- iconBefore: iconBefore,
59
- iconAfter: iconAfter,
60
- description: description,
61
- shouldTitleWrap: shouldTitleWrap,
62
- shouldDescriptionWrap: shouldDescriptionWrap
63
- }, children));
69
+ type: "button"
70
+ }), children));
64
71
  }));
65
72
  export default ButtonItem;