@automattic/vip-design-system 0.8.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslines.json +10 -0
- package/.eslintignore +7 -0
- package/.eslintrc.json +23 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/.github/workflows/codeql-analysis.yml +71 -0
- package/.github/workflows/nodejs.yaml +29 -0
- package/.prettierrc +9 -0
- package/.storybook/preview.js +5 -0
- package/README.md +38 -1
- package/babel.config.js +10 -10
- package/build/system/Avatar/Avatar.js +1 -1
- package/build/system/Avatar/Avatar.test.js +54 -0
- package/build/system/Card/Card.js +2 -1
- package/build/system/Dialog/DialogButton.js +0 -2
- package/build/system/Dialog/DialogContent.js +1 -1
- package/build/system/Form/InlineSelect.js +2 -2
- package/build/system/Form/Input.js +2 -1
- package/build/system/Form/RadioBoxGroup.js +0 -2
- package/build/system/Form/SearchSelect.js +1 -1
- package/build/system/Form/Select.js +3 -3
- package/build/system/Form/Textarea.js +3 -2
- package/build/system/Form/ToggleGroup.js +0 -4
- package/build/system/Notice/Notice.js +50 -29
- package/build/system/ResourceList/ResourceItem.js +89 -0
- package/build/system/ResourceList/ResourceList.js +121 -0
- package/build/system/ResourceList/index.js +11 -0
- package/build/system/Time/index.js +91 -0
- package/build/system/Timeline/index.js +11 -9
- package/build/system/Tooltip/Tooltip.js +4 -3
- package/build/system/index.js +9 -0
- package/build/system/theme/index.js +1 -1
- package/package.json +47 -7
- package/src/system/Avatar/Avatar.js +1 -1
- package/src/system/Avatar/Avatar.stories.js +0 -5
- package/src/system/Avatar/Avatar.test.js +31 -0
- package/src/system/Badge/Badge.js +1 -1
- package/src/system/Badge/Badge.stories.js +0 -5
- package/src/system/BlankState/BlankState.js +2 -2
- package/src/system/BlankState/BlankState.stories.js +0 -5
- package/src/system/Box/Box.stories.js +0 -5
- package/src/system/Button/Button.js +1 -1
- package/src/system/Card/Card.js +16 -12
- package/src/system/Card/Card.stories.js +0 -5
- package/src/system/Code/Code.stories.js +4 -1
- package/src/system/ConfirmationDialog/ConfirmationDialog.stories.js +0 -5
- package/src/system/Dialog/Dialog.stories.js +0 -5
- package/src/system/Dialog/DialogButton.js +0 -1
- package/src/system/Dialog/DialogContent.js +14 -1
- package/src/system/Flex/Flex.stories.js +0 -5
- package/src/system/Form/InlineSelect.js +6 -6
- package/src/system/Form/Input.js +2 -0
- package/src/system/Form/Input.stories.js +0 -5
- package/src/system/Form/RadioBoxGroup.js +1 -2
- package/src/system/Form/RadioBoxGroup.stories.js +4 -5
- package/src/system/Form/SearchSelect.js +4 -4
- package/src/system/Form/Select.js +18 -18
- package/src/system/Form/Select.stories.js +1 -1
- package/src/system/Form/Textarea.js +3 -1
- package/src/system/Form/ToggleGroup.js +34 -37
- package/src/system/Form/ToggleGroup.stories.js +30 -32
- package/src/system/Form/ToggleRow.js +1 -1
- package/src/system/Grid/Grid.stories.js +0 -5
- package/src/system/Heading/Heading.stories.js +0 -5
- package/src/system/Link/Link.stories.js +0 -5
- package/src/system/Notice/Notice.js +30 -11
- package/src/system/Notification/Notification.js +2 -2
- package/src/system/Notification/Notification.stories.js +0 -5
- package/src/system/OptionRow/OptionRow.js +23 -23
- package/src/system/OptionRow/OptionRow.stories.js +0 -5
- package/src/system/Progress/Progress.stories.js +0 -5
- package/src/system/ResourceList/ResourceItem.js +66 -0
- package/src/system/ResourceList/ResourceList.js +96 -0
- package/src/system/ResourceList/ResourceList.stories.js +300 -0
- package/src/system/ResourceList/index.js +7 -0
- package/src/system/Spinner/Spinner.stories.js +0 -5
- package/src/system/Table/Table.stories.js +0 -5
- package/src/system/Table/TableRow.js +1 -1
- package/src/system/Tabs/Tabs.stories.js +0 -5
- package/src/system/Text/Text.stories.js +0 -5
- package/src/system/{Timeline/Timeline.stories.js → Time/Time.stories.js} +5 -5
- package/src/system/Time/index.js +62 -0
- package/src/system/Timeline/index.js +11 -5
- package/src/system/Tooltip/Tooltip.js +5 -4
- package/src/system/Tooltip/Tooltip.stories.js +0 -5
- package/src/system/Wizard/Wizard.js +7 -7
- package/src/system/Wizard/WizardStep.js +5 -5
- package/src/system/Wizard/WizardStepHorizontal.js +1 -1
- package/src/system/index.js +27 -2
- package/src/system/theme/colors.js +1 -1
- package/src/system/theme/index.js +248 -248
- package/test/setupAfterEnv.js +13 -0
- package/test/setupTests.js +4 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** @jsxImportSource theme-ui */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* External dependencies
|
|
5
|
+
*/
|
|
6
|
+
import { Text } from 'theme-ui';
|
|
7
|
+
import PropTypes from 'prop-types';
|
|
8
|
+
|
|
9
|
+
const formatter = new Intl.RelativeTimeFormat( undefined, {
|
|
10
|
+
numeric: 'auto',
|
|
11
|
+
} );
|
|
12
|
+
|
|
13
|
+
const DIVISIONS = [
|
|
14
|
+
{ amount: 60, name: 'seconds' },
|
|
15
|
+
{ amount: 60, name: 'minutes' },
|
|
16
|
+
{ amount: 24, name: 'hours' },
|
|
17
|
+
{ amount: 7, name: 'days' },
|
|
18
|
+
{ amount: 12, name: 'months' },
|
|
19
|
+
{ amount: Number.POSITIVE_INFINITY, name: 'years' },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
function formatTimeAgo( date ) {
|
|
23
|
+
let duration = ( date - new Date() ) / 1000;
|
|
24
|
+
|
|
25
|
+
for ( let i = 0; i <= DIVISIONS.length; i++ ) {
|
|
26
|
+
const division = DIVISIONS[ i ];
|
|
27
|
+
if ( Math.abs( duration ) < division.amount ) {
|
|
28
|
+
return formatter.format( Math.round( duration ), division.name );
|
|
29
|
+
}
|
|
30
|
+
duration /= division.amount;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const Time = ( { time, relativeTime = false, timeOnly = false, ...props } ) => {
|
|
35
|
+
let formattedTime;
|
|
36
|
+
if ( relativeTime ) {
|
|
37
|
+
formattedTime = formatTimeAgo( time );
|
|
38
|
+
} else if ( timeOnly ) {
|
|
39
|
+
formattedTime = time.toLocaleTimeString();
|
|
40
|
+
} else {
|
|
41
|
+
formattedTime = time.toLocaleString();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<Text
|
|
46
|
+
title={time.toLocaleString( 'sv', { timeZoneName: 'short' } )}
|
|
47
|
+
datetime={time}
|
|
48
|
+
as="time"
|
|
49
|
+
{...props}
|
|
50
|
+
>
|
|
51
|
+
{formattedTime}
|
|
52
|
+
</Text>
|
|
53
|
+
);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
Time.propTypes = {
|
|
57
|
+
time: PropTypes.string,
|
|
58
|
+
timeOnly: PropTypes.bool,
|
|
59
|
+
relativeTime: PropTypes.bool,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export { Time };
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* External dependencies
|
|
5
5
|
*/
|
|
6
|
-
import { Flex
|
|
6
|
+
import { Flex } from 'theme-ui';
|
|
7
7
|
import { MdWatchLater } from 'react-icons/md';
|
|
8
8
|
import PropTypes from 'prop-types';
|
|
9
9
|
|
|
@@ -20,21 +20,27 @@ const VerticalLine = () => {
|
|
|
20
20
|
);
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
-
const Timeline = ( { time, ...props } ) => (
|
|
23
|
+
const Timeline = ( { time, first = false, last = false, ...props } ) => (
|
|
24
24
|
<Flex { ...props }>
|
|
25
25
|
<Flex sx={ { flexDirection: 'column', justifyContent: 'space-evenly', alignItems: 'center' } }>
|
|
26
|
-
|
|
26
|
+
{ ! first && (
|
|
27
|
+
<VerticalLine />
|
|
28
|
+
) }
|
|
27
29
|
<MdWatchLater sx={ { color: 'border' } } size={ 18 }/>
|
|
28
|
-
|
|
30
|
+
{ ! last && (
|
|
31
|
+
<VerticalLine />
|
|
32
|
+
) }
|
|
29
33
|
</Flex>
|
|
30
34
|
<Flex sx={ { alignItems: 'center', ml: 2 } }>
|
|
31
|
-
<
|
|
35
|
+
<span>{ time }</span>
|
|
32
36
|
</Flex>
|
|
33
37
|
</Flex>
|
|
34
38
|
);
|
|
35
39
|
|
|
36
40
|
Timeline.propTypes = {
|
|
41
|
+
first: PropTypes.bool,
|
|
37
42
|
time: PropTypes.string,
|
|
43
|
+
last: PropTypes.bool,
|
|
38
44
|
};
|
|
39
45
|
|
|
40
46
|
export { Timeline };
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import PropTypes from 'prop-types';
|
|
7
7
|
import { MdHelp } from 'react-icons/md';
|
|
8
|
-
import * as TTip from
|
|
8
|
+
import * as TTip from '@radix-ui/react-tooltip';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Internal dependencies
|
|
12
12
|
*/
|
|
13
13
|
import { Card, Text } from '..';
|
|
14
14
|
|
|
15
|
-
const StyledArrow = props => <TTip.Arrow sx={{ fill: 'white' }} { ...props }
|
|
15
|
+
const StyledArrow = props => <TTip.Arrow sx={{ fill: 'white' }} { ...props } />;
|
|
16
16
|
|
|
17
17
|
const Tooltip = ( {
|
|
18
18
|
trigger = <MdHelp />,
|
|
@@ -70,10 +70,11 @@ const Tooltip = ( {
|
|
|
70
70
|
};
|
|
71
71
|
|
|
72
72
|
Tooltip.propTypes = {
|
|
73
|
+
children: PropTypes.object,
|
|
74
|
+
text: PropTypes.string,
|
|
75
|
+
tooltipProps: PropTypes.object,
|
|
73
76
|
trigger: PropTypes.string,
|
|
74
77
|
width: PropTypes.number,
|
|
75
|
-
text: PropTypes.string,
|
|
76
|
-
children: PropTypes.object,
|
|
77
78
|
};
|
|
78
79
|
|
|
79
80
|
export { Tooltip };
|
|
@@ -12,7 +12,7 @@ import { MdArrowForward } from 'react-icons/md';
|
|
|
12
12
|
*/
|
|
13
13
|
import { Box, WizardStep, Flex, WizardStepHorizontal } from '..';
|
|
14
14
|
|
|
15
|
-
const Wizard = ({ steps, activeStep, variant, completed = [], ...props }) => {
|
|
15
|
+
const Wizard = ( { steps, activeStep, variant, completed = [], ...props } ) => {
|
|
16
16
|
return (
|
|
17
17
|
<Box>
|
|
18
18
|
{variant === 'horizontal' ? (
|
|
@@ -23,7 +23,7 @@ const Wizard = ({ steps, activeStep, variant, completed = [], ...props }) => {
|
|
|
23
23
|
}}
|
|
24
24
|
{...props}
|
|
25
25
|
>
|
|
26
|
-
{steps.map(({ title, subTitle }, index) => (
|
|
26
|
+
{steps.map( ( { title, subTitle }, index ) => (
|
|
27
27
|
<React.Fragment key={index}>
|
|
28
28
|
<WizardStepHorizontal
|
|
29
29
|
active={index === activeStep}
|
|
@@ -32,22 +32,22 @@ const Wizard = ({ steps, activeStep, variant, completed = [], ...props }) => {
|
|
|
32
32
|
/>
|
|
33
33
|
{index < steps.length - 1 && <MdArrowForward sx={{ mx: 2, color: 'grey.80' }} />}
|
|
34
34
|
</React.Fragment>
|
|
35
|
-
))}
|
|
35
|
+
) )}
|
|
36
36
|
</Flex>
|
|
37
|
-
{steps[activeStep].children}
|
|
37
|
+
{steps[ activeStep ].children}
|
|
38
38
|
</Box>
|
|
39
39
|
) : (
|
|
40
|
-
steps.map(({ title, subTitle, children }, index) => (
|
|
40
|
+
steps.map( ( { title, subTitle, children }, index ) => (
|
|
41
41
|
<WizardStep
|
|
42
42
|
active={index === activeStep}
|
|
43
43
|
title={title}
|
|
44
44
|
subTitle={subTitle}
|
|
45
|
-
complete={completed.includes(index)}
|
|
45
|
+
complete={completed.includes( index )}
|
|
46
46
|
key={index}
|
|
47
47
|
>
|
|
48
48
|
{children}
|
|
49
49
|
</WizardStep>
|
|
50
|
-
))
|
|
50
|
+
) )
|
|
51
51
|
)}
|
|
52
52
|
</Box>
|
|
53
53
|
);
|
|
@@ -11,20 +11,20 @@ import PropTypes from 'prop-types';
|
|
|
11
11
|
*/
|
|
12
12
|
import { Card, Heading, Text } from '..';
|
|
13
13
|
|
|
14
|
-
const WizardStep = ({ title, subTitle, complete = false, children, active }) => {
|
|
14
|
+
const WizardStep = ( { title, subTitle, complete = false, children, active } ) => {
|
|
15
15
|
let borderLeftColor = 'border';
|
|
16
16
|
|
|
17
|
-
if (complete) {
|
|
17
|
+
if ( complete ) {
|
|
18
18
|
borderLeftColor = 'success';
|
|
19
|
-
} else if (active) {
|
|
19
|
+
} else if ( active ) {
|
|
20
20
|
borderLeftColor = 'primary';
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
let color = 'muted';
|
|
24
24
|
|
|
25
|
-
if (complete) {
|
|
25
|
+
if ( complete ) {
|
|
26
26
|
color = 'success';
|
|
27
|
-
} else if (active) {
|
|
27
|
+
} else if ( active ) {
|
|
28
28
|
color = 'heading';
|
|
29
29
|
}
|
|
30
30
|
|
package/src/system/index.js
CHANGED
|
@@ -8,17 +8,39 @@ import { Box } from './Box';
|
|
|
8
8
|
import { Button } from './Button';
|
|
9
9
|
import { Card } from './Card';
|
|
10
10
|
import { Code } from './Code';
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
Dialog,
|
|
13
|
+
DialogButton,
|
|
14
|
+
DialogDivider,
|
|
15
|
+
DialogMenu,
|
|
16
|
+
DialogMenuItem,
|
|
17
|
+
DialogTrigger,
|
|
18
|
+
DialogContent,
|
|
19
|
+
} from './Dialog';
|
|
12
20
|
import { ConfirmationDialog } from './ConfirmationDialog';
|
|
13
21
|
import { Flex } from './Flex';
|
|
14
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
Input,
|
|
24
|
+
Label,
|
|
25
|
+
Toggle,
|
|
26
|
+
ToggleRow,
|
|
27
|
+
ToggleGroup,
|
|
28
|
+
Validation,
|
|
29
|
+
Radio,
|
|
30
|
+
RadioBoxGroup,
|
|
31
|
+
Select,
|
|
32
|
+
Textarea,
|
|
33
|
+
Checkbox,
|
|
34
|
+
} from './Form';
|
|
15
35
|
import { Grid } from './Grid';
|
|
16
36
|
import { Heading } from './Heading';
|
|
17
37
|
import { Link } from './Link';
|
|
18
38
|
import { Notice } from './Notice';
|
|
19
39
|
import { Progress } from './Progress';
|
|
20
40
|
import { Spinner } from './Spinner';
|
|
41
|
+
import { ResourceList, ResourceItem } from './ResourceList';
|
|
21
42
|
import { Tooltip } from './Tooltip';
|
|
43
|
+
import { Time } from './Time';
|
|
22
44
|
import { Timeline } from './Timeline';
|
|
23
45
|
import { Notification } from './Notification';
|
|
24
46
|
import { OptionRow } from './OptionRow';
|
|
@@ -61,6 +83,8 @@ export {
|
|
|
61
83
|
Select,
|
|
62
84
|
Radio,
|
|
63
85
|
RadioBoxGroup,
|
|
86
|
+
ResourceList,
|
|
87
|
+
ResourceItem,
|
|
64
88
|
Textarea,
|
|
65
89
|
Progress,
|
|
66
90
|
Text,
|
|
@@ -69,6 +93,7 @@ export {
|
|
|
69
93
|
ToggleRow,
|
|
70
94
|
ToggleGroup,
|
|
71
95
|
TabItem,
|
|
96
|
+
Time,
|
|
72
97
|
Timeline,
|
|
73
98
|
Validation,
|
|
74
99
|
Wizard,
|