@automattic/vip-design-system 2.5.0 → 2.7.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/build/system/Card/Card.d.ts +9 -1
- package/build/system/Card/Card.js +25 -4
- package/build/system/Card/Card.stories.d.ts +5 -0
- package/build/system/Card/Card.stories.js +34 -2
- package/build/system/Card/Card.test.js +25 -0
- package/build/system/Dropdown/Dropdown.d.ts +25 -36
- package/build/system/Dropdown/Dropdown.js +60 -99
- package/build/system/Dropdown/Dropdown.stories.d.ts +1 -26
- package/build/system/Dropdown/Dropdown.test.js +51 -28
- package/build/system/Dropdown/DropdownContent.d.ts +14 -10
- package/build/system/Dropdown/DropdownContent.js +43 -47
- package/build/system/Dropdown/DropdownItem.d.ts +20 -32
- package/build/system/Dropdown/DropdownItem.js +86 -103
- package/build/system/Dropdown/DropdownLabel.d.ts +11 -7
- package/build/system/Dropdown/DropdownLabel.js +29 -29
- package/build/system/Dropdown/DropdownSeparator.d.ts +10 -6
- package/build/system/Dropdown/DropdownSeparator.js +28 -28
- package/build/system/Dropdown/index.d.ts +17 -39
- package/build/system/Dropdown/index.js +23 -50
- package/build/system/FilterDropdown/FilterDropdown.d.ts +27 -0
- package/build/system/FilterDropdown/FilterDropdown.js +75 -0
- package/build/system/FilterDropdown/FilterDropdown.stories.d.ts +18 -0
- package/build/system/FilterDropdown/FilterDropdown.stories.js +46 -0
- package/build/system/FilterDropdown/FilterDropdown.test.d.ts +1 -0
- package/build/system/FilterDropdown/FilterDropdown.test.js +53 -0
- package/build/system/Hr/Hr.d.ts +7 -0
- package/build/system/Hr/Hr.js +22 -0
- package/build/system/Hr/Hr.stories.d.ts +23 -0
- package/build/system/Hr/Hr.stories.js +30 -0
- package/build/system/Hr/Hr.test.d.ts +1 -0
- package/build/system/Hr/Hr.test.js +41 -0
- package/build/system/Page/Page.d.ts +2 -0
- package/build/system/Page/Page.js +10 -0
- package/build/system/Page/Page.test.d.ts +1 -0
- package/build/system/Page/Page.test.js +41 -0
- package/build/system/index.d.ts +3 -1
- package/build/system/index.js +4 -0
- package/build/system/theme/index.d.ts +84 -33
- package/build/system/theme/index.js +32 -5
- package/package.json +1 -1
- package/src/system/Card/Card.stories.tsx +19 -1
- package/src/system/Card/Card.test.tsx +11 -0
- package/src/system/Card/Card.tsx +43 -14
- package/src/system/Dropdown/{Dropdown.test.js → Dropdown.test.tsx} +2 -1
- package/src/system/Dropdown/Dropdown.tsx +72 -0
- package/src/system/Dropdown/DropdownContent.tsx +46 -0
- package/src/system/Dropdown/DropdownItem.tsx +112 -0
- package/src/system/Dropdown/DropdownLabel.tsx +29 -0
- package/src/system/Dropdown/DropdownSeparator.tsx +28 -0
- package/src/system/Dropdown/{index.js → index.ts} +1 -3
- package/src/system/FilterDropdown/FilterDropdown.stories.tsx +57 -0
- package/src/system/FilterDropdown/FilterDropdown.test.tsx +52 -0
- package/src/system/FilterDropdown/FilterDropdown.tsx +92 -0
- package/src/system/Hr/Hr.stories.tsx +48 -0
- package/src/system/Hr/Hr.test.tsx +22 -0
- package/src/system/Hr/Hr.tsx +11 -0
- package/src/system/Page/Page.test.tsx +22 -0
- package/src/system/Page/Page.tsx +3 -0
- package/src/system/index.js +4 -0
- package/src/system/theme/index.js +32 -5
- package/tokens/valet-core/$metadata.json +1 -17
- package/tokens/valet-core/$themes.json +0 -2586
- package/src/system/Dropdown/Dropdown.js +0 -101
- package/src/system/Dropdown/DropdownContent.js +0 -50
- package/src/system/Dropdown/DropdownItem.js +0 -108
- package/src/system/Dropdown/DropdownLabel.js +0 -31
- package/src/system/Dropdown/DropdownSeparator.js +0 -30
- package/tokens/valet-core/figma-parsely-web-type.json +0 -1217
- package/tokens/valet-core/figma-valet-web-type.json +0 -1217
- package/tokens/valet-core/figma-wpvip-services-web-type.json +0 -1267
- package/tokens/valet-core/figma-wpvip-web-type.json +0 -1213
- package/tokens/valet-core/parsely-web-color.json +0 -729
- package/tokens/valet-core/parsely-web-core.json +0 -172
- package/tokens/valet-core/parsely-web-type.json +0 -362
- package/tokens/valet-core/valet-web-color.json +0 -677
- package/tokens/valet-core/valet-web-core.json +0 -172
- package/tokens/valet-core/wpvip-services-web-color.json +0 -730
- package/tokens/valet-core/wpvip-services-web-core.json +0 -172
- package/tokens/valet-core/wpvip-services-web-type.json +0 -412
- package/tokens/valet-core/wpvip-web-color-dark.json +0 -735
- package/tokens/valet-core/wpvip-web-color.json +0 -730
- package/tokens/valet-core/wpvip-web-type.json +0 -412
- package/tokens/valet-core/wpvip-web.json +0 -1310
|
@@ -33,29 +33,72 @@ declare namespace _default {
|
|
|
33
33
|
}
|
|
34
34
|
export namespace cards {
|
|
35
35
|
namespace primary {
|
|
36
|
-
let padding: number;
|
|
37
36
|
let borderRadius: number;
|
|
38
37
|
let backgroundColor: string;
|
|
39
38
|
let boxShadow: string;
|
|
39
|
+
namespace header {
|
|
40
|
+
let backgroundColor_1: string;
|
|
41
|
+
export { backgroundColor_1 as backgroundColor };
|
|
42
|
+
export let borderTopLeftRadius: number;
|
|
43
|
+
export let borderTopRightRadius: number;
|
|
44
|
+
export let p: number;
|
|
45
|
+
export let fontWeight: string;
|
|
46
|
+
export let display: string;
|
|
47
|
+
}
|
|
48
|
+
namespace children {
|
|
49
|
+
let p_1: number;
|
|
50
|
+
export { p_1 as p };
|
|
51
|
+
}
|
|
40
52
|
}
|
|
41
53
|
namespace secondary {
|
|
42
54
|
let borderRadius_1: number;
|
|
43
55
|
export { borderRadius_1 as borderRadius };
|
|
44
|
-
export let p: number;
|
|
45
56
|
let boxShadow_1: string;
|
|
46
57
|
export { boxShadow_1 as boxShadow };
|
|
47
58
|
export let border: string;
|
|
48
59
|
export let borderColor: string;
|
|
60
|
+
export namespace header_1 {
|
|
61
|
+
let backgroundColor_2: string;
|
|
62
|
+
export { backgroundColor_2 as backgroundColor };
|
|
63
|
+
let borderTopLeftRadius_1: number;
|
|
64
|
+
export { borderTopLeftRadius_1 as borderTopLeftRadius };
|
|
65
|
+
let borderTopRightRadius_1: number;
|
|
66
|
+
export { borderTopRightRadius_1 as borderTopRightRadius };
|
|
67
|
+
let p_2: number;
|
|
68
|
+
export { p_2 as p };
|
|
69
|
+
let fontWeight_1: string;
|
|
70
|
+
export { fontWeight_1 as fontWeight };
|
|
71
|
+
let display_1: string;
|
|
72
|
+
export { display_1 as display };
|
|
73
|
+
}
|
|
74
|
+
export { header_1 as header };
|
|
75
|
+
export namespace children_1 {
|
|
76
|
+
let p_3: number;
|
|
77
|
+
export { p_3 as p };
|
|
78
|
+
}
|
|
79
|
+
export { children_1 as children };
|
|
49
80
|
}
|
|
50
81
|
namespace indent {
|
|
51
82
|
let borderRadius_2: number;
|
|
52
83
|
export { borderRadius_2 as borderRadius };
|
|
53
|
-
let p_1: number;
|
|
54
|
-
export { p_1 as p };
|
|
55
84
|
let boxShadow_2: string;
|
|
56
85
|
export { boxShadow_2 as boxShadow };
|
|
57
|
-
let
|
|
58
|
-
export {
|
|
86
|
+
let backgroundColor_3: string;
|
|
87
|
+
export { backgroundColor_3 as backgroundColor };
|
|
88
|
+
export namespace header_2 {
|
|
89
|
+
let display_2: string;
|
|
90
|
+
export { display_2 as display };
|
|
91
|
+
let fontWeight_2: string;
|
|
92
|
+
export { fontWeight_2 as fontWeight };
|
|
93
|
+
let p_4: number;
|
|
94
|
+
export { p_4 as p };
|
|
95
|
+
}
|
|
96
|
+
export { header_2 as header };
|
|
97
|
+
export namespace children_2 {
|
|
98
|
+
let p_5: number;
|
|
99
|
+
export { p_5 as p };
|
|
100
|
+
}
|
|
101
|
+
export { children_2 as children };
|
|
59
102
|
}
|
|
60
103
|
}
|
|
61
104
|
export namespace buttons {
|
|
@@ -112,7 +155,7 @@ declare namespace _default {
|
|
|
112
155
|
borderColor: string;
|
|
113
156
|
};
|
|
114
157
|
};
|
|
115
|
-
|
|
158
|
+
let display_3: {
|
|
116
159
|
variant: string;
|
|
117
160
|
color: string;
|
|
118
161
|
bg: string;
|
|
@@ -125,6 +168,7 @@ declare namespace _default {
|
|
|
125
168
|
borderColor: string;
|
|
126
169
|
};
|
|
127
170
|
};
|
|
171
|
+
export { display_3 as display };
|
|
128
172
|
export let ghost: {
|
|
129
173
|
variant: string;
|
|
130
174
|
color: string;
|
|
@@ -1081,8 +1125,8 @@ declare namespace _default {
|
|
|
1081
1125
|
export let top: string;
|
|
1082
1126
|
export let left: string;
|
|
1083
1127
|
export let maxWidth: string;
|
|
1084
|
-
let
|
|
1085
|
-
export {
|
|
1128
|
+
let backgroundColor_4: string;
|
|
1129
|
+
export { backgroundColor_4 as backgroundColor };
|
|
1086
1130
|
let boxShadow_3: string;
|
|
1087
1131
|
export { boxShadow_3 as boxShadow };
|
|
1088
1132
|
}
|
|
@@ -1100,15 +1144,15 @@ declare namespace _default {
|
|
|
1100
1144
|
export { borderRadius_3 as borderRadius };
|
|
1101
1145
|
let boxShadow_4: string;
|
|
1102
1146
|
export { boxShadow_4 as boxShadow };
|
|
1103
|
-
let
|
|
1104
|
-
export {
|
|
1147
|
+
let backgroundColor_5: string;
|
|
1148
|
+
export { backgroundColor_5 as backgroundColor };
|
|
1105
1149
|
}
|
|
1106
1150
|
export { sidebar_1 as sidebar };
|
|
1107
1151
|
export namespace cover {
|
|
1108
1152
|
let position_2: string;
|
|
1109
1153
|
export { position_2 as position };
|
|
1110
|
-
let
|
|
1111
|
-
export {
|
|
1154
|
+
let backgroundColor_6: string;
|
|
1155
|
+
export { backgroundColor_6 as backgroundColor };
|
|
1112
1156
|
export let width: string;
|
|
1113
1157
|
let left_2: number;
|
|
1114
1158
|
export { left_2 as left };
|
|
@@ -1168,32 +1212,39 @@ declare namespace _default {
|
|
|
1168
1212
|
};
|
|
1169
1213
|
};
|
|
1170
1214
|
export namespace styles {
|
|
1171
|
-
|
|
1172
|
-
fontFamily: string;
|
|
1173
|
-
lineHeight: string;
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1215
|
+
namespace root {
|
|
1216
|
+
export let fontFamily: string;
|
|
1217
|
+
export let lineHeight: string;
|
|
1218
|
+
let fontWeight_3: string;
|
|
1219
|
+
export { fontWeight_3 as fontWeight };
|
|
1220
|
+
let color_1: string;
|
|
1221
|
+
export { color_1 as color };
|
|
1222
|
+
let backgroundColor_7: string;
|
|
1223
|
+
export { backgroundColor_7 as backgroundColor };
|
|
1224
|
+
export let webkitFontSmoothing: string;
|
|
1225
|
+
export let mozOsxFontmoothing: string;
|
|
1226
|
+
export let a: {
|
|
1180
1227
|
'&:hover': {
|
|
1181
1228
|
textDecorationLine: string;
|
|
1182
1229
|
textDecorationThickness: string;
|
|
1183
1230
|
textUnderlineOffset: string;
|
|
1184
1231
|
};
|
|
1185
1232
|
};
|
|
1186
|
-
svg
|
|
1187
|
-
fill: string;
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1233
|
+
export namespace svg {
|
|
1234
|
+
export let fill: string;
|
|
1235
|
+
let display_4: string;
|
|
1236
|
+
export { display_4 as display };
|
|
1237
|
+
}
|
|
1238
|
+
export namespace pre {
|
|
1239
|
+
let fontFamily_1: string;
|
|
1240
|
+
export { fontFamily_1 as fontFamily };
|
|
1241
|
+
}
|
|
1242
|
+
export namespace p_6 {
|
|
1243
|
+
let color_2: string;
|
|
1244
|
+
export { color_2 as color };
|
|
1245
|
+
}
|
|
1246
|
+
export { p_6 as p };
|
|
1247
|
+
}
|
|
1197
1248
|
}
|
|
1198
1249
|
}
|
|
1199
1250
|
export default _default;
|
|
@@ -250,23 +250,50 @@ export default {
|
|
|
250
250
|
|
|
251
251
|
cards: {
|
|
252
252
|
primary: {
|
|
253
|
-
padding: 3,
|
|
254
253
|
borderRadius: 2,
|
|
255
254
|
backgroundColor: 'layer.2',
|
|
256
255
|
boxShadow: 'low',
|
|
256
|
+
header: {
|
|
257
|
+
backgroundColor: 'layer.1',
|
|
258
|
+
borderTopLeftRadius: 2,
|
|
259
|
+
borderTopRightRadius: 2,
|
|
260
|
+
p: 3,
|
|
261
|
+
fontWeight: 'bold',
|
|
262
|
+
display: 'flex',
|
|
263
|
+
},
|
|
264
|
+
children: {
|
|
265
|
+
p: 3,
|
|
266
|
+
},
|
|
257
267
|
},
|
|
258
268
|
secondary: {
|
|
259
269
|
borderRadius: 2,
|
|
260
|
-
p: 3,
|
|
261
270
|
boxShadow: 'none',
|
|
262
271
|
border: '1px solid',
|
|
263
272
|
borderColor: 'borders.2',
|
|
273
|
+
header: {
|
|
274
|
+
backgroundColor: 'layer.1',
|
|
275
|
+
borderTopLeftRadius: 2,
|
|
276
|
+
borderTopRightRadius: 2,
|
|
277
|
+
p: 3,
|
|
278
|
+
fontWeight: 'bold',
|
|
279
|
+
display: 'flex',
|
|
280
|
+
},
|
|
281
|
+
children: {
|
|
282
|
+
p: 3,
|
|
283
|
+
},
|
|
264
284
|
},
|
|
265
285
|
indent: {
|
|
266
286
|
borderRadius: 2,
|
|
267
|
-
p: 3,
|
|
268
287
|
boxShadow: 'none',
|
|
269
288
|
backgroundColor: 'backgroundMuted',
|
|
289
|
+
header: {
|
|
290
|
+
display: 'flex',
|
|
291
|
+
fontWeight: 'bold',
|
|
292
|
+
p: 3,
|
|
293
|
+
},
|
|
294
|
+
children: {
|
|
295
|
+
p: 3,
|
|
296
|
+
},
|
|
270
297
|
},
|
|
271
298
|
},
|
|
272
299
|
|
|
@@ -525,8 +552,8 @@ export default {
|
|
|
525
552
|
fontWeight: 'body',
|
|
526
553
|
color: 'text',
|
|
527
554
|
backgroundColor: 'backgrounds.primary',
|
|
528
|
-
|
|
529
|
-
|
|
555
|
+
webkitFontSmoothing: 'antialiased',
|
|
556
|
+
mozOsxFontmoothing: 'grayscale',
|
|
530
557
|
a: {
|
|
531
558
|
'&:hover': {
|
|
532
559
|
textDecorationLine: 'underline',
|
package/package.json
CHANGED
|
@@ -8,4 +8,22 @@ export default {
|
|
|
8
8
|
component: Card,
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
export const Default = () => <Card>
|
|
11
|
+
export const Default = () => <Card>Hello</Card>;
|
|
12
|
+
|
|
13
|
+
export const WithHeader = () => <Card header="Header">This is a card with a header.</Card>;
|
|
14
|
+
|
|
15
|
+
export const DefaultSecondary = () => <Card variant="secondary">Hello</Card>;
|
|
16
|
+
|
|
17
|
+
export const WithHeaderSecondary = () => (
|
|
18
|
+
<Card header="Header" variant="secondary">
|
|
19
|
+
This is a card with a header.
|
|
20
|
+
</Card>
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
export const DefaultIndent = () => <Card variant="indent">Hello</Card>;
|
|
24
|
+
|
|
25
|
+
export const WithHeaderIndent = () => (
|
|
26
|
+
<Card header="Header" variant="indent">
|
|
27
|
+
This is a card with a header.
|
|
28
|
+
</Card>
|
|
29
|
+
);
|
|
@@ -29,4 +29,15 @@ describe( '<Card />', () => {
|
|
|
29
29
|
// Check for accessibility issues
|
|
30
30
|
expect( await axe( container ) ).toHaveNoViolations();
|
|
31
31
|
} );
|
|
32
|
+
|
|
33
|
+
it( 'renders the Card component with a header', async () => {
|
|
34
|
+
const { container } = render( <Card header="Card Header">Card text</Card> );
|
|
35
|
+
|
|
36
|
+
expect( screen.getByText( 'Card Header' ) ).toBeInTheDocument();
|
|
37
|
+
|
|
38
|
+
expect( screen.getByText( 'Card text' ) ).toBeInTheDocument();
|
|
39
|
+
|
|
40
|
+
// Check for accessibility issues
|
|
41
|
+
expect( await axe( container ) ).toHaveNoViolations();
|
|
42
|
+
} );
|
|
32
43
|
} );
|
package/src/system/Card/Card.tsx
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* External dependencies
|
|
3
5
|
*/
|
|
@@ -10,30 +12,57 @@ import { BoxProps } from 'theme-ui';
|
|
|
10
12
|
*/
|
|
11
13
|
import { Box } from '..';
|
|
12
14
|
|
|
15
|
+
export enum CardVariant {
|
|
16
|
+
'primary',
|
|
17
|
+
'secondary',
|
|
18
|
+
'indent',
|
|
19
|
+
}
|
|
20
|
+
|
|
13
21
|
export interface CardProps {
|
|
14
|
-
variant?:
|
|
22
|
+
variant?: keyof typeof CardVariant;
|
|
15
23
|
sx?: BoxProps[ 'sx' ];
|
|
16
24
|
className?: Argument;
|
|
25
|
+
header?: React.ReactNode;
|
|
26
|
+
children?: React.ReactNode;
|
|
17
27
|
}
|
|
18
28
|
|
|
19
29
|
type CardBoxProps = CardProps & BoxProps;
|
|
20
30
|
|
|
21
31
|
export const Card = forwardRef< HTMLElement, CardBoxProps >(
|
|
22
32
|
(
|
|
23
|
-
{ variant = 'primary', sx = {}, className, ...props }:
|
|
33
|
+
{ variant = 'primary', header, sx = {}, className, children, ...props }: CardProps,
|
|
24
34
|
ref: Ref< HTMLElement >
|
|
25
|
-
) =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
) => {
|
|
36
|
+
return (
|
|
37
|
+
<Box
|
|
38
|
+
ref={ ref }
|
|
39
|
+
sx={ {
|
|
40
|
+
// pass variant prop to sx
|
|
41
|
+
variant: `cards.${ variant }`,
|
|
42
|
+
...sx,
|
|
43
|
+
} }
|
|
44
|
+
className={ classNames( 'vip-card-component', className ) }
|
|
45
|
+
{ ...props }
|
|
46
|
+
>
|
|
47
|
+
{ header && (
|
|
48
|
+
<div
|
|
49
|
+
sx={ {
|
|
50
|
+
variant: `cards.${ variant }.header`,
|
|
51
|
+
} }
|
|
52
|
+
>
|
|
53
|
+
{ header }
|
|
54
|
+
</div>
|
|
55
|
+
) }
|
|
56
|
+
<div
|
|
57
|
+
sx={ {
|
|
58
|
+
variant: `cards.${ variant }.children`,
|
|
59
|
+
} }
|
|
60
|
+
>
|
|
61
|
+
{ children }
|
|
62
|
+
</div>
|
|
63
|
+
</Box>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
37
66
|
);
|
|
38
67
|
|
|
39
68
|
Card.displayName = 'Card';
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { fireEvent, render, screen } from '@testing-library/react';
|
|
5
5
|
import { axe } from 'jest-axe';
|
|
6
|
+
import React from 'react';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Internal dependencies
|
|
@@ -28,6 +29,6 @@ describe( '<Dropdown />', () => {
|
|
|
28
29
|
fireEvent.click( getButton() );
|
|
29
30
|
|
|
30
31
|
// Check for accessibility issues
|
|
31
|
-
|
|
32
|
+
expect( await axe( container ) ).toHaveNoViolations();
|
|
32
33
|
} );
|
|
33
34
|
} );
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
3
|
+
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
4
|
+
import React, { ReactNode } from 'react';
|
|
5
|
+
|
|
6
|
+
import { DropdownContent, DropdownContentProps } from './DropdownContent';
|
|
7
|
+
|
|
8
|
+
const DropdownMenu = DropdownMenuPrimitive.Root;
|
|
9
|
+
const DropdownTrigger = DropdownMenuPrimitive.Trigger;
|
|
10
|
+
const DropdownRadioGroup = DropdownMenuPrimitive.RadioGroup;
|
|
11
|
+
const DropdownItemIndicator = DropdownMenuPrimitive.DropdownMenuItemIndicator;
|
|
12
|
+
const DropdownLabel = DropdownMenuPrimitive.DropdownMenuLabel;
|
|
13
|
+
const DropdownSeparator = DropdownMenuPrimitive.DropdownMenuSeparator;
|
|
14
|
+
const DropdownSub = DropdownMenuPrimitive.DropdownMenuSub;
|
|
15
|
+
const DropdownSubTrigger = DropdownMenuPrimitive.DropdownMenuSubTrigger;
|
|
16
|
+
const DropdownSubContent = DropdownMenuPrimitive.DropdownMenuSubContent;
|
|
17
|
+
|
|
18
|
+
export interface DropdownProps {
|
|
19
|
+
trigger: ReactNode;
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
open?: boolean;
|
|
22
|
+
defaultOpen?: boolean;
|
|
23
|
+
onOpenChange?: ( open: boolean ) => void;
|
|
24
|
+
modal?: boolean;
|
|
25
|
+
dir?: 'ltr' | 'rtl';
|
|
26
|
+
contentProps?: DropdownContentProps;
|
|
27
|
+
portalProps?: object;
|
|
28
|
+
className?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const Dropdown: React.FC< DropdownProps > = ( {
|
|
32
|
+
trigger,
|
|
33
|
+
children,
|
|
34
|
+
open = undefined,
|
|
35
|
+
defaultOpen = false,
|
|
36
|
+
onOpenChange = undefined,
|
|
37
|
+
modal = true,
|
|
38
|
+
dir = 'ltr',
|
|
39
|
+
contentProps = {},
|
|
40
|
+
portalProps = {},
|
|
41
|
+
} ) => (
|
|
42
|
+
<DropdownMenu
|
|
43
|
+
open={ open }
|
|
44
|
+
defaultOpen={ defaultOpen }
|
|
45
|
+
onOpenChange={ onOpenChange }
|
|
46
|
+
modal={ modal }
|
|
47
|
+
dir={ dir }
|
|
48
|
+
>
|
|
49
|
+
<DropdownTrigger className="vip-dropdown-trigger" asChild>
|
|
50
|
+
{ trigger }
|
|
51
|
+
</DropdownTrigger>
|
|
52
|
+
|
|
53
|
+
<DropdownMenuPrimitive.Portal { ...portalProps }>
|
|
54
|
+
<DropdownContent { ...contentProps }>
|
|
55
|
+
{ children }
|
|
56
|
+
<DropdownMenuPrimitive.Arrow sx={ { fill: 'background', boxShadow: 'high' } } />
|
|
57
|
+
</DropdownContent>
|
|
58
|
+
</DropdownMenuPrimitive.Portal>
|
|
59
|
+
</DropdownMenu>
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
// Exports
|
|
63
|
+
export {
|
|
64
|
+
DropdownTrigger,
|
|
65
|
+
DropdownRadioGroup,
|
|
66
|
+
DropdownItemIndicator,
|
|
67
|
+
DropdownLabel,
|
|
68
|
+
DropdownSeparator,
|
|
69
|
+
DropdownSub,
|
|
70
|
+
DropdownSubTrigger,
|
|
71
|
+
DropdownSubContent,
|
|
72
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
3
|
+
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
export interface DropdownContentProps {
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const styles = {
|
|
12
|
+
minWidth: 220,
|
|
13
|
+
borderRadius: 2,
|
|
14
|
+
backgroundColor: 'background',
|
|
15
|
+
boxShadow: 'high',
|
|
16
|
+
px: 2,
|
|
17
|
+
py: 1,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const DropdownContent = React.forwardRef< HTMLDivElement, DropdownContentProps >(
|
|
21
|
+
( { className, ...props }, forwardRef ) => (
|
|
22
|
+
<DropdownMenuPrimitive.DropdownMenuContent
|
|
23
|
+
className={ classNames( 'vip-dropdown-menu-content', className ) }
|
|
24
|
+
ref={ forwardRef }
|
|
25
|
+
sx={ styles }
|
|
26
|
+
{ ...props }
|
|
27
|
+
/>
|
|
28
|
+
)
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
DropdownContent.displayName = 'DropdownContent';
|
|
32
|
+
|
|
33
|
+
export const DropdownSubContent = React.forwardRef< HTMLDivElement, DropdownContentProps >(
|
|
34
|
+
( { className, ...props }, forwardRef ) => (
|
|
35
|
+
<DropdownMenuPrimitive.Portal>
|
|
36
|
+
<DropdownMenuPrimitive.DropdownMenuSubContent
|
|
37
|
+
className={ classNames( 'vip-dropdown-menu-sub-content', className ) }
|
|
38
|
+
ref={ forwardRef }
|
|
39
|
+
sx={ styles }
|
|
40
|
+
{ ...props }
|
|
41
|
+
/>
|
|
42
|
+
</DropdownMenuPrimitive.Portal>
|
|
43
|
+
)
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
DropdownSubContent.displayName = 'DropdownSubContent';
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
3
|
+
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import { ThemeUIStyleObject } from 'theme-ui';
|
|
7
|
+
|
|
8
|
+
export interface DropdownItemProps extends DropdownMenuPrimitive.MenuItemProps {
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface DropdownRadioItemProps extends DropdownMenuPrimitive.MenuRadioItemProps {
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface DropdownCheckboxItemProps extends DropdownMenuPrimitive.MenuCheckboxItemProps {
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface DropdownSubTriggerItemProps
|
|
21
|
+
extends DropdownMenuPrimitive.DropdownMenuSubTriggerProps {
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const styles: ThemeUIStyleObject = {
|
|
26
|
+
unset: 'all',
|
|
27
|
+
cursor: 'pointer',
|
|
28
|
+
display: 'flex',
|
|
29
|
+
alignItems: 'center',
|
|
30
|
+
flexDirection: 'row',
|
|
31
|
+
textAlign: 'left',
|
|
32
|
+
height: 25,
|
|
33
|
+
textDecoration: 'none',
|
|
34
|
+
position: 'relative',
|
|
35
|
+
m: 0,
|
|
36
|
+
color: 'heading',
|
|
37
|
+
px: 2,
|
|
38
|
+
paddingLeft: 3,
|
|
39
|
+
py: 1,
|
|
40
|
+
'&:hover, &:focus': {
|
|
41
|
+
backgroundColor: 'hover',
|
|
42
|
+
textDecoration: 'none',
|
|
43
|
+
},
|
|
44
|
+
'&[data-disabled]': {
|
|
45
|
+
color: 'muted',
|
|
46
|
+
pointerEvents: 'none',
|
|
47
|
+
},
|
|
48
|
+
'&[data-highlighted]': {
|
|
49
|
+
backgroundColor: 'hover',
|
|
50
|
+
color: 'link',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const DropdownItem = React.forwardRef< HTMLDivElement, DropdownItemProps >(
|
|
55
|
+
( { className, ...props }, forwardRef ) => (
|
|
56
|
+
<DropdownMenuPrimitive.DropdownMenuItem
|
|
57
|
+
className={ classNames( 'vip-dropdown-menu-item', className ) }
|
|
58
|
+
ref={ forwardRef }
|
|
59
|
+
sx={ styles }
|
|
60
|
+
{ ...props }
|
|
61
|
+
/>
|
|
62
|
+
)
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
DropdownItem.displayName = 'DropdownItem';
|
|
66
|
+
|
|
67
|
+
export const DropdownCheckboxItem = React.forwardRef< HTMLDivElement, DropdownCheckboxItemProps >(
|
|
68
|
+
( { className, ...props }, forwardRef ) => (
|
|
69
|
+
<DropdownMenuPrimitive.CheckboxItem
|
|
70
|
+
className={ classNames( 'vip-dropdown-checkbox-item', className ) }
|
|
71
|
+
ref={ forwardRef }
|
|
72
|
+
sx={ styles }
|
|
73
|
+
{ ...props }
|
|
74
|
+
/>
|
|
75
|
+
)
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
DropdownCheckboxItem.displayName = 'DropdownCheckboxItem';
|
|
79
|
+
|
|
80
|
+
export const DropdownRadioItem = React.forwardRef< HTMLDivElement, DropdownRadioItemProps >(
|
|
81
|
+
( { className, ...props }, forwardRef ) => (
|
|
82
|
+
<DropdownMenuPrimitive.RadioItem
|
|
83
|
+
className={ classNames( 'vip-dropdown-radio-item', className ) }
|
|
84
|
+
ref={ forwardRef }
|
|
85
|
+
sx={ styles }
|
|
86
|
+
{ ...props }
|
|
87
|
+
/>
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
DropdownRadioItem.displayName = 'DropdownRadioItem';
|
|
92
|
+
|
|
93
|
+
export const DropdownSubTrigger = React.forwardRef< HTMLDivElement, DropdownSubTriggerItemProps >(
|
|
94
|
+
( { className, ...props }, forwardRef ) => (
|
|
95
|
+
<DropdownMenuPrimitive.SubTrigger
|
|
96
|
+
className={ classNames( 'vip-dropdown-sub-trigger', className ) }
|
|
97
|
+
ref={ forwardRef }
|
|
98
|
+
sx={ {
|
|
99
|
+
...styles,
|
|
100
|
+
...{
|
|
101
|
+
'&[data-state="open"]': {
|
|
102
|
+
background: 'highlight',
|
|
103
|
+
color: 'primary',
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
} }
|
|
107
|
+
{ ...props }
|
|
108
|
+
/>
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
DropdownSubTrigger.displayName = 'DropdownSubTrigger';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
3
|
+
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
export interface DropdownLabelProps {
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const styles = {
|
|
12
|
+
paddingLeft: 3,
|
|
13
|
+
fontSize: 12,
|
|
14
|
+
lineHeight: '25px',
|
|
15
|
+
color: 'muted',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const DropdownLabel = React.forwardRef< HTMLDivElement, DropdownLabelProps >(
|
|
19
|
+
( { className, ...props }, forwardRef ) => (
|
|
20
|
+
<DropdownMenuPrimitive.DropdownMenuLabel
|
|
21
|
+
className={ classNames( 'vip-dropdown-menu-label', className ) }
|
|
22
|
+
ref={ forwardRef }
|
|
23
|
+
sx={ styles }
|
|
24
|
+
{ ...props }
|
|
25
|
+
/>
|
|
26
|
+
)
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
DropdownLabel.displayName = 'DropdownLabel';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
3
|
+
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
export interface DropdownSeparatorProps {
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const styles = {
|
|
12
|
+
height: '1px',
|
|
13
|
+
backgroundColor: 'borders.2',
|
|
14
|
+
my: '5px',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const DropdownSeparator = React.forwardRef< HTMLDivElement, DropdownSeparatorProps >(
|
|
18
|
+
( { className, ...props }, forwardRef ) => (
|
|
19
|
+
<DropdownMenuPrimitive.DropdownMenuSeparator
|
|
20
|
+
className={ classNames( 'vip-dropdown-menu-separator', className ) }
|
|
21
|
+
ref={ forwardRef }
|
|
22
|
+
sx={ styles }
|
|
23
|
+
{ ...props }
|
|
24
|
+
/>
|
|
25
|
+
)
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
DropdownSeparator.displayName = 'DropdownSeparator';
|