@sproutsocial/seeds-react-menu 0.3.0 → 0.4.0
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/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +15 -0
- package/dist/esm/index.js +234 -80
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +43 -17
- package/dist/index.d.ts +43 -17
- package/dist/index.js +228 -72
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
- package/src/Autocomplete/Autocomplete.feature +14 -43
- package/src/Autocomplete/Autocomplete.stories.tsx +128 -0
- package/src/Autocomplete/Autocomplete.tsx +29 -11
- package/src/Autocomplete/AutocompleteInput.tsx +51 -0
- package/src/Autocomplete/AutocompleteTypes.ts +8 -1
- package/src/Autocomplete/__tests__/Autocomplete.test.tsx +142 -89
- package/src/Autocomplete/__tests__/Autocomplete.typetest.tsx +25 -43
- package/src/Autocomplete/index.ts +1 -0
- package/src/MenuContext.tsx +11 -5
- package/src/MenuGroup/MenuGroup.feature +6 -24
- package/src/MenuGroup/MenuGroup.tsx +12 -1
- package/src/MenuGroup/MenuGroupTypes.ts +4 -1
- package/src/MenuGroup/__tests__/MenuGroup.test.tsx +41 -18
- package/src/MenuGroup/__tests__/MenuGroup.typetest.tsx +4 -2
- package/src/MenuItem/MenuItem.tsx +8 -5
- package/src/MenuLabel.tsx +4 -4
- package/src/MenuRoot/MenuRoot.tsx +5 -3
- package/src/SingleSelectMenu/SingleSelectMenu.tsx +2 -2
- package/src/__fixtures__/menu-test-data.ts +36 -0
- package/src/__tests__/Menu.test.tsx +29 -96
- package/src/hooks/useItemsFromChildren.tsx +70 -27
- package/src/index.ts +1 -0
- package/src/reducers/useComboboxStateReducer.tsx +11 -8
- package/src/storybookUtilities/menu-storybook-components.tsx +39 -0
- package/src/types.ts +1 -0
|
@@ -9,6 +9,8 @@ import {
|
|
|
9
9
|
ActionMenu,
|
|
10
10
|
MultiSelectMenu,
|
|
11
11
|
SingleSelectMenu,
|
|
12
|
+
Autocomplete,
|
|
13
|
+
AutocompleteInput,
|
|
12
14
|
MenuToggleButton,
|
|
13
15
|
MenuContent,
|
|
14
16
|
MenuItem,
|
|
@@ -19,19 +21,18 @@ describe("Menu", () => {
|
|
|
19
21
|
{ name: "ActionMenu", Component: ActionMenu },
|
|
20
22
|
{ name: "MultiSelectMenu", Component: MultiSelectMenu },
|
|
21
23
|
{ name: "SingleSelectMenu", Component: SingleSelectMenu },
|
|
22
|
-
|
|
24
|
+
{ name: "Autocomplete", Component: Autocomplete },
|
|
25
|
+
])("$name", ({ name, Component }) => {
|
|
26
|
+
const toggleElement = (
|
|
27
|
+
<>
|
|
28
|
+
{name === "Autocomplete" && <AutocompleteInput />}
|
|
29
|
+
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
30
|
+
Open
|
|
31
|
+
</MenuToggleButton>
|
|
32
|
+
</>
|
|
33
|
+
);
|
|
23
34
|
it("should render the trigger button", () => {
|
|
24
|
-
render(
|
|
25
|
-
<Component
|
|
26
|
-
menuToggleElement={
|
|
27
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
28
|
-
Open
|
|
29
|
-
</MenuToggleButton>
|
|
30
|
-
}
|
|
31
|
-
>
|
|
32
|
-
Menu
|
|
33
|
-
</Component>
|
|
34
|
-
);
|
|
35
|
+
render(<Component menuToggleElement={toggleElement}>Menu</Component>);
|
|
35
36
|
const menuTrigger = screen.getByRole("button", { name: "Open Menu" });
|
|
36
37
|
expect(menuTrigger).toBeInTheDocument();
|
|
37
38
|
expect(screen.queryByText("Menu")).not.toBeInTheDocument();
|
|
@@ -39,14 +40,7 @@ describe("Menu", () => {
|
|
|
39
40
|
|
|
40
41
|
it("should default to open if initialIsOpen is true", () => {
|
|
41
42
|
render(
|
|
42
|
-
<Component
|
|
43
|
-
menuToggleElement={
|
|
44
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
45
|
-
Open
|
|
46
|
-
</MenuToggleButton>
|
|
47
|
-
}
|
|
48
|
-
initialIsOpen
|
|
49
|
-
>
|
|
43
|
+
<Component menuToggleElement={toggleElement} initialIsOpen>
|
|
50
44
|
Menu
|
|
51
45
|
</Component>
|
|
52
46
|
);
|
|
@@ -60,15 +54,7 @@ describe("Menu", () => {
|
|
|
60
54
|
|
|
61
55
|
it("should open when trigger button is clicked", async () => {
|
|
62
56
|
const { user } = render(
|
|
63
|
-
<Component
|
|
64
|
-
menuToggleElement={
|
|
65
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
66
|
-
Open
|
|
67
|
-
</MenuToggleButton>
|
|
68
|
-
}
|
|
69
|
-
>
|
|
70
|
-
Menu
|
|
71
|
-
</Component>
|
|
57
|
+
<Component menuToggleElement={toggleElement}>Menu</Component>
|
|
72
58
|
);
|
|
73
59
|
|
|
74
60
|
// Check that Menu is not open yet
|
|
@@ -85,15 +71,7 @@ describe("Menu", () => {
|
|
|
85
71
|
|
|
86
72
|
it("should open when trigger button is focused and enter key pressed", async () => {
|
|
87
73
|
const { user } = render(
|
|
88
|
-
<Component
|
|
89
|
-
menuToggleElement={
|
|
90
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
91
|
-
Open
|
|
92
|
-
</MenuToggleButton>
|
|
93
|
-
}
|
|
94
|
-
>
|
|
95
|
-
Menu
|
|
96
|
-
</Component>
|
|
74
|
+
<Component menuToggleElement={toggleElement}>Menu</Component>
|
|
97
75
|
);
|
|
98
76
|
|
|
99
77
|
// Check that Menu is not open yet
|
|
@@ -111,15 +89,7 @@ describe("Menu", () => {
|
|
|
111
89
|
|
|
112
90
|
it("should open when trigger button is focused and space key pressed", async () => {
|
|
113
91
|
const { user } = render(
|
|
114
|
-
<Component
|
|
115
|
-
menuToggleElement={
|
|
116
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
117
|
-
Open
|
|
118
|
-
</MenuToggleButton>
|
|
119
|
-
}
|
|
120
|
-
>
|
|
121
|
-
Menu
|
|
122
|
-
</Component>
|
|
92
|
+
<Component menuToggleElement={toggleElement}>Menu</Component>
|
|
123
93
|
);
|
|
124
94
|
|
|
125
95
|
// Check that Menu is not open yet
|
|
@@ -137,14 +107,7 @@ describe("Menu", () => {
|
|
|
137
107
|
|
|
138
108
|
it("should close when trigger button is clicked while open", async () => {
|
|
139
109
|
const { user } = render(
|
|
140
|
-
<Component
|
|
141
|
-
menuToggleElement={
|
|
142
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
143
|
-
Open
|
|
144
|
-
</MenuToggleButton>
|
|
145
|
-
}
|
|
146
|
-
initialIsOpen
|
|
147
|
-
>
|
|
110
|
+
<Component menuToggleElement={toggleElement} initialIsOpen>
|
|
148
111
|
Menu
|
|
149
112
|
</Component>
|
|
150
113
|
);
|
|
@@ -167,11 +130,7 @@ describe("Menu", () => {
|
|
|
167
130
|
const mockOnIsOpenChange = jest.fn();
|
|
168
131
|
const { user } = render(
|
|
169
132
|
<Component
|
|
170
|
-
menuToggleElement={
|
|
171
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
172
|
-
Open
|
|
173
|
-
</MenuToggleButton>
|
|
174
|
-
}
|
|
133
|
+
menuToggleElement={toggleElement}
|
|
175
134
|
onIsOpenChange={mockOnIsOpenChange}
|
|
176
135
|
initialIsOpen
|
|
177
136
|
>
|
|
@@ -199,11 +158,7 @@ describe("Menu", () => {
|
|
|
199
158
|
const { user } = render(
|
|
200
159
|
<div>
|
|
201
160
|
<Component
|
|
202
|
-
menuToggleElement={
|
|
203
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
204
|
-
Open
|
|
205
|
-
</MenuToggleButton>
|
|
206
|
-
}
|
|
161
|
+
menuToggleElement={toggleElement}
|
|
207
162
|
onIsOpenChange={mockOnIsOpenChange}
|
|
208
163
|
initialIsOpen
|
|
209
164
|
>
|
|
@@ -230,11 +185,7 @@ describe("Menu", () => {
|
|
|
230
185
|
const mockOnSelectedItemChange = jest.fn();
|
|
231
186
|
const { user } = render(
|
|
232
187
|
<Component
|
|
233
|
-
menuToggleElement={
|
|
234
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
235
|
-
Open
|
|
236
|
-
</MenuToggleButton>
|
|
237
|
-
}
|
|
188
|
+
menuToggleElement={toggleElement}
|
|
238
189
|
onSelectedItemChange={mockOnSelectedItemChange}
|
|
239
190
|
>
|
|
240
191
|
<MenuContent>
|
|
@@ -266,11 +217,7 @@ describe("Menu", () => {
|
|
|
266
217
|
const mockOnSelectedItemChange = jest.fn();
|
|
267
218
|
const { user } = render(
|
|
268
219
|
<Component
|
|
269
|
-
menuToggleElement={
|
|
270
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
271
|
-
Open
|
|
272
|
-
</MenuToggleButton>
|
|
273
|
-
}
|
|
220
|
+
menuToggleElement={toggleElement}
|
|
274
221
|
onSelectedItemChange={mockOnSelectedItemChange}
|
|
275
222
|
>
|
|
276
223
|
<MenuContent>
|
|
@@ -295,14 +242,12 @@ describe("Menu", () => {
|
|
|
295
242
|
});
|
|
296
243
|
|
|
297
244
|
it("should call onSelectedItemChange when item selected with space", async () => {
|
|
245
|
+
if (name === "Autocomplete") return;
|
|
246
|
+
|
|
298
247
|
const mockOnSelectedItemChange = jest.fn();
|
|
299
248
|
const { user } = render(
|
|
300
249
|
<Component
|
|
301
|
-
menuToggleElement={
|
|
302
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
303
|
-
Open
|
|
304
|
-
</MenuToggleButton>
|
|
305
|
-
}
|
|
250
|
+
menuToggleElement={toggleElement}
|
|
306
251
|
onSelectedItemChange={mockOnSelectedItemChange}
|
|
307
252
|
>
|
|
308
253
|
<MenuContent>
|
|
@@ -330,11 +275,7 @@ describe("Menu", () => {
|
|
|
330
275
|
const mockOnIsOpenChange = jest.fn();
|
|
331
276
|
const { user } = render(
|
|
332
277
|
<Component
|
|
333
|
-
menuToggleElement={
|
|
334
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
335
|
-
Open
|
|
336
|
-
</MenuToggleButton>
|
|
337
|
-
}
|
|
278
|
+
menuToggleElement={toggleElement}
|
|
338
279
|
onIsOpenChange={mockOnIsOpenChange}
|
|
339
280
|
>
|
|
340
281
|
<MenuContent>
|
|
@@ -362,11 +303,7 @@ describe("Menu", () => {
|
|
|
362
303
|
const mockOnHighlightedIndexChange = jest.fn();
|
|
363
304
|
const { user } = render(
|
|
364
305
|
<Component
|
|
365
|
-
menuToggleElement={
|
|
366
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
367
|
-
Open
|
|
368
|
-
</MenuToggleButton>
|
|
369
|
-
}
|
|
306
|
+
menuToggleElement={toggleElement}
|
|
370
307
|
onHighlightedIndexChange={mockOnHighlightedIndexChange}
|
|
371
308
|
>
|
|
372
309
|
<MenuContent>
|
|
@@ -396,11 +333,7 @@ describe("Menu", () => {
|
|
|
396
333
|
const mockStateReducer = jest.fn((state, { changes }) => changes);
|
|
397
334
|
const { user } = render(
|
|
398
335
|
<Component
|
|
399
|
-
menuToggleElement={
|
|
400
|
-
<MenuToggleButton role="button" aria-label="Open Menu">
|
|
401
|
-
Open
|
|
402
|
-
</MenuToggleButton>
|
|
403
|
-
}
|
|
336
|
+
menuToggleElement={toggleElement}
|
|
404
337
|
stateReducer={mockStateReducer}
|
|
405
338
|
>
|
|
406
339
|
<MenuContent>
|
|
@@ -421,7 +354,7 @@ describe("Menu", () => {
|
|
|
421
354
|
await user.keyboard("{arrowdown}{enter}");
|
|
422
355
|
|
|
423
356
|
// Check that stateReducer is called
|
|
424
|
-
await waitFor(() => expect(mockStateReducer).
|
|
357
|
+
await waitFor(() => expect(mockStateReducer).toHaveBeenCalled());
|
|
425
358
|
});
|
|
426
359
|
});
|
|
427
360
|
});
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import React, { type ReactNode, useMemo } from "react";
|
|
2
|
-
import type
|
|
2
|
+
import { MenuItem, type TypeMenuItemProps } from "../MenuItem";
|
|
3
3
|
import type { TypeMenuContext } from "../MenuContext";
|
|
4
4
|
import type { TypeMenuGroupProps } from "../MenuGroup/index";
|
|
5
|
+
import type { TypeDefaultItemProps } from "../types";
|
|
5
6
|
|
|
6
7
|
export interface TypeUseItemsFromChildrenProps {
|
|
7
8
|
children: ReactNode;
|
|
8
9
|
}
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
element:
|
|
10
|
+
export type TypeItemElement = React.ReactElement<TypeMenuItemProps>;
|
|
11
|
+
export type TypeMenuGroupElement = React.ReactElement<TypeMenuGroupProps>;
|
|
12
|
+
|
|
13
|
+
export interface TypeMenuChildren {
|
|
14
|
+
type: "item" | "group";
|
|
15
|
+
element:
|
|
16
|
+
| React.ReactElement<TypeMenuGroupProps>
|
|
17
|
+
| React.ReactElement<TypeMenuItemProps>;
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
// https://stackoverflow.com/questions/69119016/find-specific-children-components-regardless-of-depth-in-react
|
|
@@ -21,7 +24,6 @@ const walkAllChildren = (
|
|
|
21
24
|
) => {
|
|
22
25
|
const walk = (element: ReactNode, parents: readonly ReactNode[]) => {
|
|
23
26
|
if (element === null || element === undefined) return;
|
|
24
|
-
// console.log("element", element);
|
|
25
27
|
callback(element, parents);
|
|
26
28
|
const newParents = [...parents, element];
|
|
27
29
|
const children = (element as any).props?.children;
|
|
@@ -47,40 +49,81 @@ const checkIfIsElement = (element: ReactNode, name: string): boolean => {
|
|
|
47
49
|
};
|
|
48
50
|
|
|
49
51
|
const getAllMenuItems = (children: ReactNode) => {
|
|
50
|
-
const
|
|
51
|
-
walkAllChildren(children, (element
|
|
52
|
+
const orderedElements: TypeMenuChildren[] = [];
|
|
53
|
+
walkAllChildren(children, (element) => {
|
|
52
54
|
if (checkIfIsElement(element, "MenuItem")) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
orderedElements.push({
|
|
56
|
+
type: "item",
|
|
57
|
+
element: element as TypeItemElement,
|
|
58
|
+
});
|
|
59
|
+
} else if (checkIfIsElement(element, "MenuGroup")) {
|
|
60
|
+
orderedElements.push({
|
|
61
|
+
type: "group",
|
|
62
|
+
element: element as TypeItemElement,
|
|
56
63
|
});
|
|
57
64
|
}
|
|
58
65
|
});
|
|
59
|
-
return
|
|
66
|
+
return { orderedElements };
|
|
60
67
|
};
|
|
61
68
|
|
|
62
69
|
export const useItemsFromChildren = ({
|
|
63
70
|
children,
|
|
64
71
|
}: TypeUseItemsFromChildrenProps) => {
|
|
65
72
|
const { allMenuItems, menuItemsMap } = useMemo(() => {
|
|
66
|
-
const
|
|
73
|
+
const { orderedElements } = getAllMenuItems(children);
|
|
67
74
|
const menuItemsMap: TypeMenuContext["itemsMap"] = {};
|
|
68
|
-
const allMenuItems:
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
const allMenuItems: TypeDefaultItemProps[] = [];
|
|
76
|
+
let index = 0;
|
|
77
|
+
|
|
78
|
+
orderedElements.forEach(({ type, element }) => {
|
|
79
|
+
if (type === "group") {
|
|
80
|
+
const menuGroup = element as TypeMenuGroupElement;
|
|
81
|
+
const items = menuGroup.props.items;
|
|
82
|
+
if (items) {
|
|
83
|
+
items.forEach((menuItem) => {
|
|
84
|
+
const item = {
|
|
85
|
+
id: menuItem.id,
|
|
86
|
+
index: index++,
|
|
87
|
+
disabled: menuItem.disabled,
|
|
88
|
+
menuItemProps: menuItem,
|
|
89
|
+
menuGroupProps: element.props,
|
|
90
|
+
};
|
|
91
|
+
allMenuItems.push(item);
|
|
92
|
+
menuItemsMap[`${item.id}`] = item;
|
|
93
|
+
});
|
|
94
|
+
} else if (menuGroup.props.children) {
|
|
95
|
+
let children = menuGroup.props.children as TypeItemElement[];
|
|
96
|
+
// If there is only one child, it will be an object. Make it an array.
|
|
97
|
+
if (!Array.isArray(children)) {
|
|
98
|
+
children = [children];
|
|
99
|
+
}
|
|
100
|
+
children.forEach((menuItem) => {
|
|
101
|
+
const item = {
|
|
102
|
+
id: menuItem.props.id,
|
|
103
|
+
index: index++,
|
|
104
|
+
disabled: menuItem.props.disabled,
|
|
105
|
+
menuItemProps: menuItem.props,
|
|
106
|
+
menuGroupProps: element.props,
|
|
107
|
+
};
|
|
108
|
+
allMenuItems.push(item);
|
|
109
|
+
menuItemsMap[`${item.id}`] = item;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
// Items in groups would have already been added to the map.
|
|
114
|
+
if (menuItemsMap[`${element.props.id}`]) return;
|
|
115
|
+
const menuItem = element as TypeItemElement;
|
|
73
116
|
const item = {
|
|
74
|
-
id:
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
menuItemProps:
|
|
78
|
-
menuGroupProps: parentMenuGroup ? parentMenuGroup.props : undefined,
|
|
117
|
+
id: menuItem.props.id,
|
|
118
|
+
index: index++,
|
|
119
|
+
disabled: menuItem.props.disabled,
|
|
120
|
+
menuItemProps: menuItem.props,
|
|
79
121
|
};
|
|
122
|
+
allMenuItems.push(item);
|
|
80
123
|
menuItemsMap[`${item.id}`] = item;
|
|
81
|
-
return item;
|
|
82
124
|
}
|
|
83
|
-
);
|
|
125
|
+
});
|
|
126
|
+
|
|
84
127
|
return { allMenuItems, menuItemsMap };
|
|
85
128
|
}, [children]);
|
|
86
129
|
|
package/src/index.ts
CHANGED
|
@@ -8,12 +8,12 @@ export const useComboboxStateReducer: Required<
|
|
|
8
8
|
const { type, changes } = actionAndChanges;
|
|
9
9
|
switch (type) {
|
|
10
10
|
/** If downshift is blurred by tabbing within the menu, stay open */
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
case useCombobox.stateChangeTypes.InputBlur:
|
|
12
|
+
return {
|
|
13
|
+
...changes,
|
|
14
|
+
// keep menu open on blur
|
|
15
|
+
isOpen: true,
|
|
16
|
+
};
|
|
17
17
|
|
|
18
18
|
/** Return standard change payload */
|
|
19
19
|
default:
|
|
@@ -21,6 +21,9 @@ export const useComboboxStateReducer: Required<
|
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
-
export const defaultUseComboboxProps
|
|
25
|
-
|
|
24
|
+
export const defaultUseComboboxProps: Partial<
|
|
25
|
+
UseComboboxProps<TypeDefaultItemProps>
|
|
26
|
+
> = {
|
|
27
|
+
// disabling while item.hidden so that hidden items are ignored by downshift
|
|
28
|
+
isItemDisabled: (item) => Boolean(item.disabled || item.hidden),
|
|
26
29
|
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import styled from "styled-components";
|
|
2
|
+
import { Box } from "@sproutsocial/seeds-react-box";
|
|
3
|
+
import { Icon } from "@sproutsocial/seeds-react-icon";
|
|
4
|
+
import { useMenuContext, MenuToggleButton } from "../index";
|
|
5
|
+
|
|
6
|
+
export interface TypeStyledChevronProps {
|
|
7
|
+
$isOpen?: boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const StyledChevron = styled.div<TypeStyledChevronProps>`
|
|
11
|
+
margin-left: ${({ theme }) => theme.space[300]};
|
|
12
|
+
${({ $isOpen }) =>
|
|
13
|
+
$isOpen &&
|
|
14
|
+
`
|
|
15
|
+
transform: rotate(-180deg);
|
|
16
|
+
`}
|
|
17
|
+
transition: transform 0.15s;
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
interface StorybookMenuToggleButtonProps {
|
|
21
|
+
buttonText?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const StorybookMenuToggleButton = ({
|
|
25
|
+
buttonText,
|
|
26
|
+
}: StorybookMenuToggleButtonProps) => {
|
|
27
|
+
const { isOpen } = useMenuContext();
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<MenuToggleButton appearance="secondary">
|
|
31
|
+
<Box display="flex" justifyContent="space-between">
|
|
32
|
+
{buttonText ? buttonText : <span>Select book</span>}
|
|
33
|
+
<StyledChevron $isOpen={isOpen}>
|
|
34
|
+
<Icon name="chevron-down" />
|
|
35
|
+
</StyledChevron>
|
|
36
|
+
</Box>
|
|
37
|
+
</MenuToggleButton>
|
|
38
|
+
);
|
|
39
|
+
};
|