@primer/components 32.1.1-rc.8eccc94b → 33.0.0-rc.af3001e7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. package/.github/workflows/statuses.yml +32 -0
  2. package/.gitignore +1 -0
  3. package/CHANGELOG.md +15 -1
  4. package/contributor-docs/CONTRIBUTING.md +14 -58
  5. package/dist/browser.esm.js +104 -108
  6. package/dist/browser.esm.js.map +1 -1
  7. package/dist/browser.umd.js +104 -108
  8. package/dist/browser.umd.js.map +1 -1
  9. package/docs/content/BranchName.md +6 -5
  10. package/docs/content/Details.md +4 -8
  11. package/docs/content/Heading.md +5 -10
  12. package/docs/content/Label.md +6 -7
  13. package/docs/content/ProgressBar.mdx +7 -6
  14. package/docs/content/Text.md +0 -6
  15. package/docs/content/{ActionList2.mdx → drafts/ActionList2.mdx} +5 -9
  16. package/docs/content/drafts/ActionMenu2.mdx +251 -0
  17. package/docs/content/system-props.mdx +1 -1
  18. package/docs/src/@primer/gatsby-theme-doctocat/live-code-scope.js +9 -1
  19. package/lib/ActionList2/Divider.d.ts +3 -2
  20. package/lib/ActionList2/Divider.js +10 -5
  21. package/lib/ActionList2/Item.js +21 -5
  22. package/lib/ActionList2/List.js +11 -1
  23. package/lib/ActionList2/MenuContext.d.ts +10 -0
  24. package/lib/ActionList2/MenuContext.js +15 -0
  25. package/lib/ActionList2/Selection.js +11 -0
  26. package/lib/ActionList2/index.d.ts +1 -2
  27. package/lib/ActionMenu2.d.ts +310 -0
  28. package/lib/ActionMenu2.js +91 -0
  29. package/lib/Avatar.d.ts +1 -2
  30. package/lib/Avatar.js +1 -1
  31. package/lib/BranchName.d.ts +1 -2
  32. package/lib/BranchName.js +1 -1
  33. package/lib/Details.d.ts +1 -2
  34. package/lib/Details.js +1 -3
  35. package/lib/Dropdown.d.ts +2 -66
  36. package/lib/Heading.d.ts +1 -2
  37. package/lib/Heading.js +1 -6
  38. package/lib/ProgressBar.d.ts +16 -11
  39. package/lib/ProgressBar.js +6 -10
  40. package/lib/Spinner.d.ts +1 -2
  41. package/lib/Spinner.js +1 -3
  42. package/lib/__tests__/Avatar.test.js +4 -2
  43. package/lib/__tests__/Avatar.types.test.d.ts +3 -0
  44. package/lib/__tests__/Avatar.types.test.js +31 -0
  45. package/lib/__tests__/BranchName.types.test.d.ts +3 -0
  46. package/lib/__tests__/BranchName.types.test.js +28 -0
  47. package/lib/__tests__/Details.types.test.d.ts +3 -0
  48. package/lib/__tests__/Details.types.test.js +28 -0
  49. package/lib/__tests__/Heading.test.js +63 -30
  50. package/lib/__tests__/Heading.types.test.d.ts +3 -0
  51. package/lib/__tests__/Heading.types.test.js +28 -0
  52. package/lib/drafts.d.ts +1 -0
  53. package/lib/drafts.js +13 -0
  54. package/lib/stories/ActionMenu2.stories.js +433 -0
  55. package/lib-esm/ActionList2/Divider.d.ts +3 -2
  56. package/lib-esm/ActionList2/Divider.js +8 -5
  57. package/lib-esm/ActionList2/Item.js +19 -5
  58. package/lib-esm/ActionList2/List.js +9 -1
  59. package/lib-esm/ActionList2/MenuContext.d.ts +10 -0
  60. package/lib-esm/ActionList2/MenuContext.js +3 -0
  61. package/lib-esm/ActionList2/Selection.js +9 -0
  62. package/lib-esm/ActionList2/index.d.ts +1 -2
  63. package/lib-esm/ActionMenu2.d.ts +310 -0
  64. package/lib-esm/ActionMenu2.js +67 -0
  65. package/lib-esm/Avatar.d.ts +1 -2
  66. package/lib-esm/Avatar.js +2 -2
  67. package/lib-esm/BranchName.d.ts +1 -2
  68. package/lib-esm/BranchName.js +2 -2
  69. package/lib-esm/Details.d.ts +1 -2
  70. package/lib-esm/Details.js +1 -2
  71. package/lib-esm/Dropdown.d.ts +2 -66
  72. package/lib-esm/Heading.d.ts +1 -2
  73. package/lib-esm/Heading.js +2 -6
  74. package/lib-esm/ProgressBar.d.ts +16 -11
  75. package/lib-esm/ProgressBar.js +7 -11
  76. package/lib-esm/Spinner.d.ts +1 -2
  77. package/lib-esm/Spinner.js +1 -2
  78. package/lib-esm/__tests__/Avatar.test.js +4 -2
  79. package/lib-esm/__tests__/Avatar.types.test.d.ts +3 -0
  80. package/lib-esm/__tests__/Avatar.types.test.js +16 -0
  81. package/lib-esm/__tests__/BranchName.types.test.d.ts +3 -0
  82. package/lib-esm/__tests__/BranchName.types.test.js +13 -0
  83. package/lib-esm/__tests__/Details.types.test.d.ts +3 -0
  84. package/lib-esm/__tests__/Details.types.test.js +13 -0
  85. package/lib-esm/__tests__/Heading.test.js +62 -30
  86. package/lib-esm/__tests__/Heading.types.test.d.ts +3 -0
  87. package/lib-esm/__tests__/Heading.types.test.js +13 -0
  88. package/lib-esm/drafts.d.ts +1 -0
  89. package/lib-esm/drafts.js +2 -1
  90. package/lib-esm/stories/ActionMenu2.stories.js +376 -0
  91. package/package-lock.json +294 -247
  92. package/package.json +3 -1
  93. package/script/component-status-project/build.ts +100 -0
  94. package/script/component-status-project/deploy.rb +142 -0
  95. package/src/ActionList2/Divider.tsx +13 -8
  96. package/src/ActionList2/Item.tsx +13 -3
  97. package/src/ActionList2/List.tsx +6 -2
  98. package/src/ActionList2/MenuContext.tsx +6 -0
  99. package/src/ActionList2/Selection.tsx +9 -0
  100. package/src/ActionMenu2.tsx +94 -0
  101. package/src/Avatar.tsx +2 -4
  102. package/src/BranchName.tsx +3 -3
  103. package/src/Details.tsx +1 -5
  104. package/src/Heading.tsx +2 -9
  105. package/src/ProgressBar.tsx +11 -10
  106. package/src/Spinner.tsx +1 -3
  107. package/src/__tests__/Avatar.test.tsx +1 -1
  108. package/src/__tests__/Avatar.types.test.tsx +11 -0
  109. package/src/__tests__/BranchName.types.test.tsx +11 -0
  110. package/src/__tests__/Details.types.test.tsx +11 -0
  111. package/src/__tests__/Heading.test.tsx +71 -25
  112. package/src/__tests__/Heading.types.test.tsx +11 -0
  113. package/src/drafts.ts +1 -0
  114. package/src/stories/ActionMenu2.stories.tsx +551 -0
  115. package/stats.html +1 -1
  116. package/tsconfig.build.json +1 -1
  117. package/tsconfig.json +1 -1
@@ -12,15 +12,16 @@ BranchName is a label-type component rendered as an `<a>` tag by default with mo
12
12
 
13
13
  ## Props
14
14
 
15
- | Name | Type | Default | Description |
16
- | :--- | :----- | :-----: | :---------------------------------- |
17
- | as | String | `<a>` | sets the HTML tag for the component |
18
- | href | String | | a URL to link the component to |
15
+ | Name | Type | Default | Description |
16
+ | :--- | :---------------- | :-----: | :----------------------------------- |
17
+ | as | String | `<a>` | sets the HTML tag for the component |
18
+ | href | String | | a URL to link the component to |
19
+ | sx | SystemStyleObject | {} | Style to be applied to the component |
19
20
 
20
21
  ## Component status
21
22
 
22
23
  <ComponentChecklist
23
- items={{
24
+ items={{
24
25
  propsDocumented: true,
25
26
  noUnnecessaryDeps: true,
26
27
  adaptsToThemes: true,
@@ -79,15 +79,11 @@ In previous versions of Primer React Components, we allowed users to pass in a c
79
79
  </State>
80
80
  ```
81
81
 
82
- ## `Details` System props
82
+ ## Details props
83
83
 
84
- <Note variant="warning">
85
-
86
- System props are deprecated in all components except [Box](/Box). Please use the [`sx` prop](/overriding-styles) instead.
87
-
88
- </Note>
89
-
90
- Details components get `COMMON` system props. Read our [System Props](/system-props) doc page for a full list of available props.
84
+ | Name | Type | Default | Description |
85
+ | :--- | :---------------- | :-----: | :----------------------------------- |
86
+ | sx | SystemStyleObject | {} | Style to be applied to the component |
91
87
 
92
88
  ## `useDetails` hook configuration options
93
89
 
@@ -10,17 +10,12 @@ The Heading component will render an html `h2` tag without any default styling.
10
10
  ## Default example
11
11
 
12
12
  ```jsx live
13
- <Heading fontSize={1} mb={2}>
14
- H2 heading with fontSize={1}
15
- </Heading>
13
+ <Heading sx={{fontSize: 1, mb: 2}}>H2 heading with fontSize={1}</Heading>
16
14
  ```
17
15
 
18
- ## System props
19
-
20
- Heading components get `TYPOGRAPHY` and `COMMON` system props. Read our [System Props](/system-props) doc page for a full list of available props.
21
-
22
16
  ## Component props
23
17
 
24
- | Prop name | Type | Description |
25
- | :-------- | :---------------------- | :---------------------------------- |
26
- | as | String or React element | sets the HTML tag for the component |
18
+ | Name | Type | Default | Description |
19
+ | :--- | :---------------------- | :-----: | :----------------------------------- |
20
+ | as | String or React element | | sets the HTML tag for the component |
21
+ | sx | SystemStyleObject | {} | Style to be applied to the component |
@@ -41,10 +41,9 @@ The Label component is used to add contextual metadata to a design. Visually it
41
41
 
42
42
  ## Component props
43
43
 
44
- | Name | Type | Default | Description |
45
- | :--------- | :---------------- | :--------------------: | :----------------------------------------------------------------------------- |
46
- | outline | Boolean | | Creates an outline style label |
47
- | variant | String | 'medium' | Can be one of `small`, `medium` (default), `large` or `xl` . |
48
- | dropshadow | Boolean | | Adds a dropshadow to the label |
49
- | bg | String | 'label.primary.border' | Part of the `COMMON` system props, used to change the background of the label. |
50
- | sx | SystemStyleObject | {} | Style to be applied to the component |
44
+ | Name | Type | Default | Description |
45
+ | :--------- | :---------------- | :------: | :----------------------------------------------------------- |
46
+ | outline | Boolean | | Creates an outline style label |
47
+ | variant | String | 'medium' | Can be one of `small`, `medium` (default), `large` or `xl` . |
48
+ | dropshadow | Boolean | | Adds a dropshadow to the label |
49
+ | sx | SystemStyleObject | {} | Style to be applied to the component |
@@ -22,9 +22,10 @@ If you'd like to use ProgressBar inline, pass the `inline` boolean prop & **be s
22
22
 
23
23
  ## Component props
24
24
 
25
- | Name | Type | Default | Description |
26
- | :------- | :------ | :-----------------: | :------------------------------------------------------------------------------------------------------------------------------- |
27
- | progress | Number | | Used to set the size of the green bar |
28
- | barSize | String | 'default' | Controls the height of the progress bar. Can be 'small', 'large', or 'default'. If omitted, height is set to the default height. |
29
- | inline | Boolean | false | Styles the progress bar inline |
30
- | bg | String | 'bg.successInverse' | Set the progress bar color, defaults to bg-green |
25
+ | Name | Type | Default | Description |
26
+ | :------- | :---------------- | :-----------------: | :------------------------------------------------------------------------------------------------------------------------------- |
27
+ | progress | Number | | Used to set the size of the green bar |
28
+ | barSize | String | 'default' | Controls the height of the progress bar. Can be 'small', 'large', or 'default'. If omitted, height is set to the default height. |
29
+ | inline | Boolean | false | Styles the progress bar inline |
30
+ | bg | String | 'bg.successInverse' | Set the progress bar color, defaults to bg-green |
31
+ | sx | SystemStyleObject | {} | Style to be applied to the component |
@@ -23,12 +23,6 @@ The Text component is a wrapper component that will apply typography styles to t
23
23
 
24
24
  ## System props
25
25
 
26
- <Note variant="warning">
27
-
28
- System props are deprecated in all components except [Box](/Box). Please use the [`sx` prop](/overriding-styles) instead.
29
-
30
- </Note>
31
-
32
26
  Text components get `TYPOGRAPHY` and `COMMON` system props. Read our [System Props](/system-props) doc page for a full list of available props.
33
27
 
34
28
  ## Component props
@@ -6,16 +6,13 @@ storybook: '/react/storybook?path=/story/composite-components-actionlist2'
6
6
  description: An ActionList is a list of items that can be activated or selected. ActionList is the base component for many menu-type components, including DropdownMenu and ActionMenu.
7
7
  ---
8
8
 
9
- import {BorderBox, Avatar} from '@primer/components'
9
+ import {Box, Avatar} from '@primer/components'
10
10
  import {ActionList} from '@primer/components/drafts'
11
- import {ComponentChecklist} from '../src/component-checklist'
12
-
13
- import {ImageContainer} from '@primer/gatsby-theme-doctocat'
14
11
  import {LinkIcon, AlertIcon, ArrowRightIcon} from '@primer/octicons-react'
15
12
 
16
13
  <br />
17
14
 
18
- <BorderBox sx={{padding: 6}}>
15
+ <Box sx={{border: '1px solid', borderColor: 'border.default', borderRadius: 2, padding: 6}}>
19
16
  <ActionList sx={{width: 320}}>
20
17
  <ActionList.Item>
21
18
  <ActionList.LeadingVisual>
@@ -43,7 +40,7 @@ import {LinkIcon, AlertIcon, ArrowRightIcon} from '@primer/octicons-react'
43
40
  </ActionList.TrailingVisual>
44
41
  </ActionList.Item>
45
42
  </ActionList>
46
- </BorderBox>
43
+ </Box>
47
44
 
48
45
  <br />
49
46
 
@@ -351,11 +348,10 @@ render(<SelectFields />)
351
348
 
352
349
  - [Interface guidelines: Action List](https://primer.style/design/components/action-list)
353
350
 
354
- <br />
355
-
356
351
  ## Related components
357
352
 
358
- - [ActionMenu](/ActionMenu)
353
+ - [ActionMenu](/drafts/ActionMenu2)
354
+ - [DropdownMenu](/DropdownMenu)
359
355
  - [SelectPanel](/SelectPanel)
360
356
 
361
357
  ## Component status
@@ -0,0 +1,251 @@
1
+ ---
2
+ title: ActionMenu
3
+ status: Alpha
4
+ source: https://github.com/primer/react/tree/main/src/ActionMenu
5
+ storybook: '/react/storybook?path=/story/composite-components-actionmenu2'
6
+ description: An ActionMenu is an ActionList-based component for creating a menu of actions that expands through a trigger button.
7
+ ---
8
+
9
+ import {Box, Avatar} from '@primer/components'
10
+ import {ActionMenu, ActionList} from '@primer/components/drafts'
11
+ import {Props} from '../../src/props'
12
+
13
+ <br />
14
+
15
+ <Box sx={{border: '1px solid', borderColor: 'border.default', borderRadius: 2, padding: 6}}>
16
+ <ActionMenu>
17
+ <ActionMenu.Button>Menu</ActionMenu.Button>
18
+ <ActionList>
19
+ <ActionList.Item onSelect={() => onSelect('Copy link')}>
20
+ Copy link
21
+ <ActionList.TrailingVisual>⌘C</ActionList.TrailingVisual>
22
+ </ActionList.Item>
23
+ <ActionList.Item onSelect={() => onSelect('Quote reply')}>
24
+ Quote reply
25
+ <ActionList.TrailingVisual>⌘Q</ActionList.TrailingVisual>
26
+ </ActionList.Item>
27
+ <ActionList.Item onSelect={() => onSelect('Edit comment')}>
28
+ Edit comment
29
+ <ActionList.TrailingVisual>⌘E</ActionList.TrailingVisual>
30
+ </ActionList.Item>
31
+ <ActionList.Divider />
32
+ <ActionList.Item variant="danger" onSelect={() => onSelect('Delete file')}>
33
+ Delete file
34
+ <ActionList.TrailingVisual>⌘D</ActionList.TrailingVisual>
35
+ </ActionList.Item>
36
+ </ActionList>
37
+
38
+ </ActionMenu>
39
+ </Box>
40
+
41
+ <br />
42
+
43
+ ```js
44
+ import {ActionMenu} from '@primer/components/drafts'
45
+ ```
46
+
47
+ <br />
48
+
49
+ ## Examples
50
+
51
+ ### Minimal example
52
+
53
+ `ActionMenu` ships with `ActionMenu.Button` which is an accessible trigger for the overlay. It's recommended to compose `ActionList` with this component.
54
+
55
+ &nbsp;
56
+
57
+ ```javascript live noinline
58
+ // import {ActionMenu, ActionList} from '@primer/components/drafts'
59
+ const {ActionMenu, ActionList} = drafts // ignore docs silliness; import like that ↑
60
+
61
+ render(
62
+ <ActionMenu>
63
+ <ActionMenu.Button>Menu</ActionMenu.Button>
64
+
65
+ <ActionList>
66
+ <ActionList.Item onSelect={event => console.log('New file')}>New file</ActionList.Item>
67
+ <ActionList.Item>Copy link</ActionList.Item>
68
+ <ActionList.Item>Edit file</ActionList.Item>
69
+ <ActionList.Divider />
70
+ <ActionList.Item variant="danger">Delete file</ActionList.Item>
71
+ </ActionList>
72
+ </ActionMenu>
73
+ )
74
+ ```
75
+
76
+ ### With a custom anchor
77
+
78
+ You can choose to have a different _anchor_ for the Menu dependending on the application's context.
79
+
80
+ &nbsp;
81
+
82
+ ```javascript live noinline
83
+ // import {ActionMenu, ActionList} from '@primer/components/drafts'
84
+ const {ActionMenu, ActionList} = drafts // ignore docs silliness; import like that ↑
85
+
86
+ render(
87
+ <ActionMenu>
88
+ <ActionMenu.Anchor>
89
+ <ButtonInvisible aria-label="Open column options">
90
+ <KebabHorizontalIcon />
91
+ </ButtonInvisible>
92
+ </ActionMenu.Anchor>
93
+
94
+ <ActionList>
95
+ <ActionList.Item>
96
+ <ActionList.LeadingVisual>
97
+ <PencilIcon />
98
+ </ActionList.LeadingVisual>
99
+ Rename
100
+ </ActionList.Item>
101
+ <ActionList.Item>
102
+ <ActionList.LeadingVisual>
103
+ <ArchiveIcon />
104
+ </ActionList.LeadingVisual>
105
+ Archive all cards
106
+ </ActionList.Item>
107
+ <ActionList.Item variant="danger">
108
+ <ActionList.LeadingVisual>
109
+ <TrashIcon />
110
+ </ActionList.LeadingVisual>
111
+ Delete
112
+ </ActionList.Item>
113
+ </ActionList>
114
+ </ActionMenu>
115
+ )
116
+ ```
117
+
118
+ ### With Groups
119
+
120
+ ```javascript live noinline
121
+ // import {ActionMenu, ActionList} from '@primer/components/drafts'
122
+ const {ActionMenu, ActionList} = drafts // ignore docs silliness; import like that ↑
123
+
124
+ render(
125
+ <ActionMenu>
126
+ <ActionMenu.Button>Open column menu</ActionMenu.Button>
127
+
128
+ <ActionList showDividers>
129
+ <ActionList.Group title="Live query">
130
+ <ActionList.Item>
131
+ <ActionList.LeadingVisual>
132
+ <SearchIcon />
133
+ </ActionList.LeadingVisual>
134
+ repo:github/memex,github/github
135
+ </ActionList.Item>
136
+ </ActionList.Group>
137
+ <ActionList.Divider />
138
+ <ActionList.Group title="Layout" variant="subtle">
139
+ <ActionList.Item>
140
+ <ActionList.LeadingVisual>
141
+ <NoteIcon />
142
+ </ActionList.LeadingVisual>
143
+ Table
144
+ <ActionList.Description variant="block">
145
+ Information-dense table optimized for operations across teams
146
+ </ActionList.Description>
147
+ </ActionList.Item>
148
+ <ActionList.Item role="listitem">
149
+ <ActionList.LeadingVisual>
150
+ <ProjectIcon />
151
+ </ActionList.LeadingVisual>
152
+ Board
153
+ <ActionList.Description variant="block">Kanban-style board focused on visual states</ActionList.Description>
154
+ </ActionList.Item>
155
+ </ActionList.Group>
156
+ <ActionList.Divider />
157
+ <ActionList.Group>
158
+ <ActionList.Item>
159
+ <ActionList.LeadingVisual>
160
+ <FilterIcon />
161
+ </ActionList.LeadingVisual>
162
+ Save sort and filters to current view
163
+ </ActionList.Item>
164
+ <ActionList.Item>
165
+ <ActionList.LeadingVisual>
166
+ <FilterIcon />
167
+ </ActionList.LeadingVisual>
168
+ Save sort and filters to new view
169
+ </ActionList.Item>
170
+ </ActionList.Group>
171
+ <ActionList.Divider />
172
+ <ActionList.Group>
173
+ <ActionList.Item>
174
+ <ActionList.LeadingVisual>
175
+ <GearIcon />
176
+ </ActionList.LeadingVisual>
177
+ View settings
178
+ </ActionList.Item>
179
+ </ActionList.Group>
180
+ </ActionList>
181
+ </ActionMenu>
182
+ )
183
+ ```
184
+
185
+ ### With External Anchor
186
+
187
+ To create an anchor outside of the menu, you need to switch to controlled mode for the menu and pass it as `anchorRef` to `ActionMenu`:
188
+
189
+ ```javascript live noinline
190
+ // import {ActionMenu, ActionList} from '@primer/components/drafts'
191
+ const {ActionMenu, ActionList} = drafts // ignore docs silliness; import like that ↑
192
+
193
+ const Example = () => {
194
+ const [open, setOpen] = React.useState(false)
195
+ const anchorRef = React.createRef()
196
+
197
+ return (
198
+ <>
199
+ <Button ref={anchorRef} onClick={() => setOpen(!open)}>
200
+ {open ? 'Close Menu' : 'Open Menu'}
201
+ </Button>
202
+
203
+ <ActionMenu open={open} onOpenChange={setOpen} anchorRef={anchorRef}>
204
+ <ActionList>
205
+ <ActionList.Item>Copy link</ActionList.Item>
206
+ <ActionList.Item>Quote reply</ActionList.Item>
207
+ <ActionList.Item>Edit comment</ActionList.Item>
208
+ <ActionList.Divider />
209
+ <ActionList.Item variant="danger">Delete file</ActionList.Item>
210
+ </ActionList>
211
+ </ActionMenu>
212
+ </>
213
+ )
214
+ }
215
+
216
+ render(<Example />)
217
+ ```
218
+
219
+ ## Props / API reference
220
+
221
+ ### ActionMenu
222
+
223
+ | Name | Type | Default | Description |
224
+ | :----------- | :-------------------------------------------------- | :-----: | :----------------------------------------------------------------------------------------------------------------------- |
225
+ | children\* | `React.ReactElement[]` | - | Required. Recommended: `ActionMenu.Button` or `ActionMenu.Anchor` with [`ActionList`](/drafts/ActionList2) |
226
+ | open | `boolean` | - | Optional. If defined, will control the open/closed state of the overlay. Must be used in conjuction with `onOpenChange`. |
227
+ | onOpenChange | `(open: boolean) => void` | - | Optional. If defined, will control the open/closed state of the overlay. Must be used in conjuction with `open`. |
228
+ | anchorRef | `React.RefObject<HTMLElement>` | - | Optional. Useful for defining an external anchor |
229
+ | overlayProps | [`Partial<OverlayProps>`](/Overlay#component-props) | - | Optional. Props to be spread on the internal [`AnchoredOverlay`](/AnchoredOverlay) component. |
230
+
231
+ ### ActionMenu.Button
232
+
233
+ | Type | Default | Description |
234
+ | :-------------------------------------- | :-----: | :------------------------------------------------------------------------------------------------------------------- |
235
+ | [ButtonProps](/Buttons#component-props) | - | Optional. You can pass all of the props that you would pass to a [`Button`](/Buttons) component like `variant`, `sx` |
236
+
237
+ ### ActionMenu.Anchor
238
+
239
+ | Name | Type | Default | Description |
240
+ | :--------- | :------------------- | :-----: | :-------------------------------- |
241
+ | children\* | `React.ReactElement` | - | Required. Accepts a single child. |
242
+
243
+ ## Further reading
244
+
245
+ [Interface guidelines: Action List + Menu](https://primer.style/design/components/action-list)
246
+
247
+ ## Related components
248
+
249
+ - [ActionList](/drafts/ActionList2)
250
+ - [DropdownMenu](/DropdownMenu)
251
+ - [SelectPanel](/SelectPanel)
@@ -6,7 +6,7 @@ import {PropsList, COMMON, LAYOUT, BORDER, TYPOGRAPHY, FLEX, POSITION, GRID} fro
6
6
 
7
7
  <Note variant="warning">
8
8
 
9
- System props are deprecated in all components except [Box](/Box). Please use the [`sx` prop](/overriding-styles) instead.
9
+ System props are deprecated in all components except [Box](/Box) and [Text](/Text). Please use the [`sx` prop](/overriding-styles) instead.
10
10
 
11
11
  </Note>
12
12
 
@@ -24,7 +24,11 @@ import {
24
24
  LawIcon,
25
25
  StarIcon,
26
26
  AlertIcon,
27
- ArrowRightIcon
27
+ ArrowRightIcon,
28
+ KebabHorizontalIcon,
29
+ PencilIcon,
30
+ ArchiveIcon,
31
+ TrashIcon
28
32
  } from '@primer/octicons-react'
29
33
  import State from '../../../components/State'
30
34
  import {Dialog as Dialog2} from '../../../../src/Dialog/Dialog'
@@ -65,6 +69,10 @@ export default {
65
69
  StarIcon,
66
70
  AlertIcon,
67
71
  ArrowRightIcon,
72
+ KebabHorizontalIcon,
73
+ PencilIcon,
74
+ ArchiveIcon,
75
+ TrashIcon,
68
76
  Dialog2,
69
77
  ConfirmationDialog,
70
78
  useConfirm,
@@ -1,5 +1,6 @@
1
- /// <reference types="react" />
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 function Divider(): JSX.Element;
6
+ export declare const Divider: React.FC<SxProp>;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.Divider = 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
- function Divider() {
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";
@@ -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
- if (!event.defaultPrevented) onSelect(event);
169
- }, [onSelect, disabled]);
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, {
@@ -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,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 {};
@@ -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
  }