@primer/components 0.0.0-2021111135547 → 0.0.0-2021111145137
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 +5 -1
- package/lib/ActionList2/Divider.js +10 -5
- package/lib/ActionList2/Item.js +21 -5
- package/lib/ActionList2/List.js +11 -1
- package/lib/ActionList2/MenuContext.js +15 -0
- package/lib/ActionList2/Selection.js +11 -0
- package/lib/ActionMenu2.js +91 -0
- package/lib/drafts.js +13 -0
- package/lib/src/ActionList2/Divider.d.ts +3 -2
- package/lib/src/ActionList2/MenuContext.d.ts +10 -0
- package/lib/src/ActionList2/index.d.ts +1 -2
- package/lib/src/ActionMenu2.d.ts +310 -0
- package/lib/src/drafts.d.ts +1 -0
- package/lib-esm/ActionList2/Divider.js +8 -5
- package/lib-esm/ActionList2/Item.js +19 -5
- package/lib-esm/ActionList2/List.js +9 -1
- package/lib-esm/ActionList2/MenuContext.js +3 -0
- package/lib-esm/ActionList2/Selection.js +9 -0
- package/lib-esm/ActionMenu2.js +67 -0
- package/lib-esm/drafts.js +2 -1
- package/lib-esm/src/ActionList2/Divider.d.ts +3 -2
- package/lib-esm/src/ActionList2/MenuContext.d.ts +10 -0
- package/lib-esm/src/ActionList2/index.d.ts +1 -2
- package/lib-esm/src/ActionMenu2.d.ts +310 -0
- package/lib-esm/src/drafts.d.ts +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# @primer/components
|
2
2
|
|
3
|
-
## 0.0.0-
|
3
|
+
## 0.0.0-2021111145137
|
4
4
|
|
5
5
|
### Major Changes
|
6
6
|
|
@@ -12,6 +12,10 @@
|
|
12
12
|
|
13
13
|
* [#1643](https://github.com/primer/react/pull/1643) [`3938550f`](https://github.com/primer/react/commit/3938550fb3ea3fbec542a0cadaf6aeb734fba938) Thanks [@jfuchs](https://github.com/jfuchs)! - Heading no longer accepts styled-system props. Please use the `sx` prop to extend Primer component styling instead. See also https://primer.style/react/overriding-styles for information about `sx` and https://primer.style/react/system-props for context on the removal.
|
14
14
|
|
15
|
+
### Minor Changes
|
16
|
+
|
17
|
+
- [#1619](https://github.com/primer/react/pull/1619) [`a13efa45`](https://github.com/primer/react/commit/a13efa457ded69656fb390b5b9b666d00157fd21) Thanks [@siddharthkp](https://github.com/siddharthkp)! - Add composable `ActionMenu` to `@primer/components/drafts`
|
18
|
+
|
15
19
|
### Patch Changes
|
16
20
|
|
17
21
|
- [#1668](https://github.com/primer/react/pull/1668) [`98dc6336`](https://github.com/primer/react/commit/98dc633674b793edfa4fbeb88fd239e6ca40544e) Thanks [@siddharthkp](https://github.com/siddharthkp)! - ActionList: Fix multiple selection svg by overriding global shape-rendering for github.com
|
@@ -3,7 +3,7 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.Divider =
|
6
|
+
exports.Divider = void 0;
|
7
7
|
|
8
8
|
var _react = _interopRequireDefault(require("react"));
|
9
9
|
|
@@ -11,25 +11,30 @@ var _Box = _interopRequireDefault(require("../Box"));
|
|
11
11
|
|
12
12
|
var _constants = require("../constants");
|
13
13
|
|
14
|
+
var _sx = require("../sx");
|
15
|
+
|
14
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
15
17
|
|
16
18
|
/**
|
17
19
|
* Visually separates `Item`s or `Group`s in an `ActionList`.
|
18
20
|
*/
|
19
|
-
|
21
|
+
const Divider = ({
|
22
|
+
sx = {}
|
23
|
+
}) => {
|
20
24
|
return /*#__PURE__*/_react.default.createElement(_Box.default, {
|
21
25
|
as: "li",
|
22
26
|
role: "separator",
|
23
|
-
sx: {
|
27
|
+
sx: (0, _sx.merge)({
|
24
28
|
height: 1,
|
25
29
|
backgroundColor: 'actionListItem.inlineDivider',
|
26
30
|
marginTop: theme => `calc(${(0, _constants.get)('space.2')(theme)} - 1px)`,
|
27
31
|
marginBottom: 2,
|
28
32
|
listStyle: 'none' // hide the ::marker inserted by browser's stylesheet
|
29
33
|
|
30
|
-
},
|
34
|
+
}, sx),
|
31
35
|
"data-component": "ActionList.Divider"
|
32
36
|
});
|
33
|
-
}
|
37
|
+
};
|
34
38
|
|
39
|
+
exports.Divider = Divider;
|
35
40
|
Divider.displayName = "Divider";
|
package/lib/ActionList2/Item.js
CHANGED
@@ -21,6 +21,8 @@ var _createSlots = _interopRequireDefault(require("../utils/create-slots"));
|
|
21
21
|
|
22
22
|
var _List = require("./List");
|
23
23
|
|
24
|
+
var _MenuContext = require("./MenuContext");
|
25
|
+
|
24
26
|
var _Selection = require("./Selection");
|
25
27
|
|
26
28
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
@@ -82,6 +84,7 @@ const Item = /*#__PURE__*/_react.default.forwardRef(({
|
|
82
84
|
onSelect,
|
83
85
|
sx: sxProp = {},
|
84
86
|
id,
|
87
|
+
role,
|
85
88
|
_PrivateItemWrapper,
|
86
89
|
...props
|
87
90
|
}, forwardedRef) => {
|
@@ -90,6 +93,11 @@ const Item = /*#__PURE__*/_react.default.forwardRef(({
|
|
90
93
|
showDividers
|
91
94
|
} = _react.default.useContext(_List.ListContext);
|
92
95
|
|
96
|
+
const {
|
97
|
+
itemRole,
|
98
|
+
afterSelect
|
99
|
+
} = _react.default.useContext(_MenuContext.MenuContext);
|
100
|
+
|
93
101
|
const {
|
94
102
|
theme
|
95
103
|
} = (0, _ThemeProvider.useTheme)();
|
@@ -165,17 +173,24 @@ const Item = /*#__PURE__*/_react.default.forwardRef(({
|
|
165
173
|
const clickHandler = _react.default.useCallback(event => {
|
166
174
|
if (typeof onSelect !== 'function') return;
|
167
175
|
if (disabled) return;
|
168
|
-
|
169
|
-
|
176
|
+
|
177
|
+
if (!event.defaultPrevented) {
|
178
|
+
onSelect(event); // if this Item is inside a Menu, close the Menu
|
179
|
+
|
180
|
+
if (typeof afterSelect === 'function') afterSelect();
|
181
|
+
}
|
182
|
+
}, [onSelect, disabled, afterSelect]);
|
170
183
|
|
171
184
|
const keyPressHandler = _react.default.useCallback(event => {
|
172
185
|
if (typeof onSelect !== 'function') return;
|
173
186
|
if (disabled) return;
|
174
187
|
|
175
188
|
if (!event.defaultPrevented && [' ', 'Enter'].includes(event.key)) {
|
176
|
-
onSelect(event);
|
189
|
+
onSelect(event); // if this Item is inside a Menu, close the Menu
|
190
|
+
|
191
|
+
if (typeof afterSelect === 'function') afterSelect();
|
177
192
|
}
|
178
|
-
}, [onSelect, disabled]); // use props.id if provided, otherwise generate one.
|
193
|
+
}, [onSelect, disabled, afterSelect]); // use props.id if provided, otherwise generate one.
|
179
194
|
|
180
195
|
|
181
196
|
const labelId = (0, _ssr.useSSRSafeId)(id);
|
@@ -198,7 +213,8 @@ const Item = /*#__PURE__*/_react.default.forwardRef(({
|
|
198
213
|
"aria-disabled": disabled ? true : undefined,
|
199
214
|
tabIndex: disabled || _PrivateItemWrapper ? undefined : 0,
|
200
215
|
"aria-labelledby": `${labelId} ${slots.InlineDescription ? inlineDescriptionId : ''}`,
|
201
|
-
"aria-describedby": slots.BlockDescription ? blockDescriptionId : undefined
|
216
|
+
"aria-describedby": slots.BlockDescription ? blockDescriptionId : undefined,
|
217
|
+
role: role || itemRole
|
202
218
|
}, props), /*#__PURE__*/_react.default.createElement(ItemWrapper, null, /*#__PURE__*/_react.default.createElement(_Selection.Selection, {
|
203
219
|
selected: selected
|
204
220
|
}), slots.LeadingVisual, /*#__PURE__*/_react.default.createElement(_Box.default, {
|
package/lib/ActionList2/List.js
CHANGED
@@ -11,6 +11,8 @@ var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
11
11
|
|
12
12
|
var _sx = _interopRequireWildcard(require("../sx"));
|
13
13
|
|
14
|
+
var _MenuContext = require("./MenuContext");
|
15
|
+
|
14
16
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
15
17
|
|
16
18
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
@@ -32,6 +34,7 @@ const List = /*#__PURE__*/_react.default.forwardRef(({
|
|
32
34
|
variant = 'inset',
|
33
35
|
selectionVariant,
|
34
36
|
showDividers = false,
|
37
|
+
role,
|
35
38
|
sx: sxProp = {},
|
36
39
|
...props
|
37
40
|
}, forwardedRef) => {
|
@@ -41,8 +44,15 @@ const List = /*#__PURE__*/_react.default.forwardRef(({
|
|
41
44
|
// reset ul styles
|
42
45
|
paddingY: variant === 'inset' ? 2 : 0
|
43
46
|
};
|
47
|
+
/** if list is inside a Menu, it will get a role from the Menu */
|
48
|
+
|
49
|
+
const {
|
50
|
+
listRole
|
51
|
+
} = _react.default.useContext(_MenuContext.MenuContext);
|
52
|
+
|
44
53
|
return /*#__PURE__*/_react.default.createElement(ListBox, _extends({
|
45
|
-
sx: (0, _sx.merge)(styles, sxProp)
|
54
|
+
sx: (0, _sx.merge)(styles, sxProp),
|
55
|
+
role: role || listRole
|
46
56
|
}, props, {
|
47
57
|
ref: forwardedRef
|
48
58
|
}), /*#__PURE__*/_react.default.createElement(ListContext.Provider, {
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.MenuContext = void 0;
|
7
|
+
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
9
|
+
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
11
|
+
|
12
|
+
/** This context can be used by components that compose ActionList inside a Menu */
|
13
|
+
const MenuContext = /*#__PURE__*/_react.default.createContext({});
|
14
|
+
|
15
|
+
exports.MenuContext = MenuContext;
|
@@ -13,6 +13,8 @@ var _List = require("./List");
|
|
13
13
|
|
14
14
|
var _Group = require("./Group");
|
15
15
|
|
16
|
+
var _MenuContext = require("./MenuContext");
|
17
|
+
|
16
18
|
var _Visuals = require("./Visuals");
|
17
19
|
|
18
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
@@ -27,6 +29,10 @@ const Selection = ({
|
|
27
29
|
const {
|
28
30
|
selectionVariant: groupSelectionVariant
|
29
31
|
} = _react.default.useContext(_Group.GroupContext);
|
32
|
+
|
33
|
+
const {
|
34
|
+
parent
|
35
|
+
} = _react.default.useContext(_MenuContext.MenuContext);
|
30
36
|
/** selectionVariant in Group can override the selectionVariant in List root */
|
31
37
|
|
32
38
|
|
@@ -38,6 +44,11 @@ const Selection = ({
|
|
38
44
|
return null;
|
39
45
|
}
|
40
46
|
|
47
|
+
if (parent === 'ActionMenu') {
|
48
|
+
throw new Error('ActionList cannot have a selectionVariant inside ActionMenu, please use DropdownMenu or SelectPanel instead. More information: https://primer.style/design/components/action-list#application');
|
49
|
+
return null;
|
50
|
+
}
|
51
|
+
|
41
52
|
if (selectionVariant === 'single') {
|
42
53
|
return /*#__PURE__*/_react.default.createElement(_Visuals.LeadingVisualContainer, null, selected && /*#__PURE__*/_react.default.createElement(_octiconsReact.CheckIcon, null));
|
43
54
|
}
|
@@ -0,0 +1,91 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.ActionMenu = void 0;
|
7
|
+
|
8
|
+
var _Button = _interopRequireDefault(require("./Button"));
|
9
|
+
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
11
|
+
|
12
|
+
var _AnchoredOverlay = require("./AnchoredOverlay");
|
13
|
+
|
14
|
+
var _useProvidedStateOrCreate = require("./hooks/useProvidedStateOrCreate");
|
15
|
+
|
16
|
+
var _hooks = require("./hooks");
|
17
|
+
|
18
|
+
var _Divider = require("./ActionList2/Divider");
|
19
|
+
|
20
|
+
var _MenuContext = require("./ActionList2/MenuContext");
|
21
|
+
|
22
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
23
|
+
|
24
|
+
const ActionMenuBase = ({
|
25
|
+
anchorRef: externalAnchorRef,
|
26
|
+
open,
|
27
|
+
onOpenChange,
|
28
|
+
overlayProps,
|
29
|
+
children
|
30
|
+
}) => {
|
31
|
+
const [combinedOpenState, setCombinedOpenState] = (0, _useProvidedStateOrCreate.useProvidedStateOrCreate)(open, onOpenChange, false);
|
32
|
+
const anchorRef = (0, _hooks.useProvidedRefOrCreate)(externalAnchorRef);
|
33
|
+
|
34
|
+
const onOpen = _react.default.useCallback(() => setCombinedOpenState(true), [setCombinedOpenState]);
|
35
|
+
|
36
|
+
const onClose = _react.default.useCallback(() => setCombinedOpenState(false), [setCombinedOpenState]);
|
37
|
+
|
38
|
+
let renderAnchor = null;
|
39
|
+
const contents = [];
|
40
|
+
|
41
|
+
_react.default.Children.map(children, child => {
|
42
|
+
if (child.type === MenuButton || child.type === Anchor) {
|
43
|
+
renderAnchor = anchorProps => /*#__PURE__*/_react.default.cloneElement(child, anchorProps);
|
44
|
+
} else {
|
45
|
+
contents.push(child);
|
46
|
+
}
|
47
|
+
});
|
48
|
+
|
49
|
+
return /*#__PURE__*/_react.default.createElement(_AnchoredOverlay.AnchoredOverlay, {
|
50
|
+
renderAnchor: renderAnchor,
|
51
|
+
anchorRef: anchorRef,
|
52
|
+
open: combinedOpenState,
|
53
|
+
onOpen: onOpen,
|
54
|
+
onClose: onClose,
|
55
|
+
overlayProps: overlayProps
|
56
|
+
}, /*#__PURE__*/_react.default.createElement(_MenuContext.MenuContext.Provider, {
|
57
|
+
value: {
|
58
|
+
parent: 'ActionMenu',
|
59
|
+
listRole: 'menu',
|
60
|
+
itemRole: 'menuitem',
|
61
|
+
afterSelect: onClose
|
62
|
+
}
|
63
|
+
}, contents));
|
64
|
+
};
|
65
|
+
|
66
|
+
ActionMenuBase.displayName = "ActionMenuBase";
|
67
|
+
|
68
|
+
const Anchor = /*#__PURE__*/_react.default.forwardRef(({
|
69
|
+
children,
|
70
|
+
...anchorProps
|
71
|
+
}, anchorRef) => {
|
72
|
+
return /*#__PURE__*/_react.default.cloneElement(children, { ...anchorProps,
|
73
|
+
ref: anchorRef
|
74
|
+
});
|
75
|
+
});
|
76
|
+
/** this component is syntactical sugar 🍭 */
|
77
|
+
|
78
|
+
|
79
|
+
const MenuButton = /*#__PURE__*/_react.default.forwardRef((props, anchorRef) => {
|
80
|
+
return /*#__PURE__*/_react.default.createElement(Anchor, {
|
81
|
+
ref: anchorRef
|
82
|
+
}, /*#__PURE__*/_react.default.createElement(_Button.default, props));
|
83
|
+
});
|
84
|
+
|
85
|
+
ActionMenuBase.displayName = 'ActionMenu';
|
86
|
+
const ActionMenu = Object.assign(ActionMenuBase, {
|
87
|
+
Button: MenuButton,
|
88
|
+
Anchor,
|
89
|
+
Divider: _Divider.Divider
|
90
|
+
});
|
91
|
+
exports.ActionMenu = ActionMenu;
|
package/lib/drafts.js
CHANGED
@@ -28,4 +28,17 @@ Object.keys(_NewButton).forEach(function (key) {
|
|
28
28
|
return _NewButton[key];
|
29
29
|
}
|
30
30
|
});
|
31
|
+
});
|
32
|
+
|
33
|
+
var _ActionMenu = require("./ActionMenu2");
|
34
|
+
|
35
|
+
Object.keys(_ActionMenu).forEach(function (key) {
|
36
|
+
if (key === "default" || key === "__esModule") return;
|
37
|
+
if (key in exports && exports[key] === _ActionMenu[key]) return;
|
38
|
+
Object.defineProperty(exports, key, {
|
39
|
+
enumerable: true,
|
40
|
+
get: function () {
|
41
|
+
return _ActionMenu[key];
|
42
|
+
}
|
43
|
+
});
|
31
44
|
});
|
@@ -1,5 +1,6 @@
|
|
1
|
-
|
1
|
+
import React from 'react';
|
2
|
+
import { SxProp } from '../sx';
|
2
3
|
/**
|
3
4
|
* Visually separates `Item`s or `Group`s in an `ActionList`.
|
4
5
|
*/
|
5
|
-
export declare
|
6
|
+
export declare const Divider: React.FC<SxProp>;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
/** This context can be used by components that compose ActionList inside a Menu */
|
2
|
+
import React from 'react';
|
3
|
+
declare type ContextProps = {
|
4
|
+
parent?: string;
|
5
|
+
listRole?: string;
|
6
|
+
itemRole?: string;
|
7
|
+
afterSelect?: () => void;
|
8
|
+
};
|
9
|
+
export declare const MenuContext: React.Context<ContextProps>;
|
10
|
+
export {};
|
@@ -1,5 +1,4 @@
|
|
1
1
|
/// <reference types="react" />
|
2
|
-
import { Divider } from './Divider';
|
3
2
|
export type { ListProps as ActionListProps } from './List';
|
4
3
|
export type { GroupProps } from './Group';
|
5
4
|
export type { ItemProps } from './Item';
|
@@ -26,7 +25,7 @@ export declare const ActionList: import("@radix-ui/react-polymorphic").ForwardRe
|
|
26
25
|
referrerPolicy?: import("react").HTMLAttributeReferrerPolicy | undefined;
|
27
26
|
}>;
|
28
27
|
/** Visually separates `Item`s or `Group`s in an `ActionList`. */
|
29
|
-
Divider:
|
28
|
+
Divider: import("react").FC<import("../sx").SxProp>;
|
30
29
|
/** Secondary text which provides additional information about an `Item`. */
|
31
30
|
Description: import("react").FC<import("./Description").DescriptionProps>;
|
32
31
|
/** Icon (or similar) positioned before `Item` text. */
|