@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.
Files changed (92) hide show
  1. package/.eslines.json +10 -0
  2. package/.eslintignore +7 -0
  3. package/.eslintrc.json +23 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +22 -0
  5. package/.github/workflows/codeql-analysis.yml +71 -0
  6. package/.github/workflows/nodejs.yaml +29 -0
  7. package/.prettierrc +9 -0
  8. package/.storybook/preview.js +5 -0
  9. package/README.md +38 -1
  10. package/babel.config.js +10 -10
  11. package/build/system/Avatar/Avatar.js +1 -1
  12. package/build/system/Avatar/Avatar.test.js +54 -0
  13. package/build/system/Card/Card.js +2 -1
  14. package/build/system/Dialog/DialogButton.js +0 -2
  15. package/build/system/Dialog/DialogContent.js +1 -1
  16. package/build/system/Form/InlineSelect.js +2 -2
  17. package/build/system/Form/Input.js +2 -1
  18. package/build/system/Form/RadioBoxGroup.js +0 -2
  19. package/build/system/Form/SearchSelect.js +1 -1
  20. package/build/system/Form/Select.js +3 -3
  21. package/build/system/Form/Textarea.js +3 -2
  22. package/build/system/Form/ToggleGroup.js +0 -4
  23. package/build/system/Notice/Notice.js +50 -29
  24. package/build/system/ResourceList/ResourceItem.js +89 -0
  25. package/build/system/ResourceList/ResourceList.js +121 -0
  26. package/build/system/ResourceList/index.js +11 -0
  27. package/build/system/Time/index.js +91 -0
  28. package/build/system/Timeline/index.js +11 -9
  29. package/build/system/Tooltip/Tooltip.js +4 -3
  30. package/build/system/index.js +9 -0
  31. package/build/system/theme/index.js +1 -1
  32. package/package.json +47 -7
  33. package/src/system/Avatar/Avatar.js +1 -1
  34. package/src/system/Avatar/Avatar.stories.js +0 -5
  35. package/src/system/Avatar/Avatar.test.js +31 -0
  36. package/src/system/Badge/Badge.js +1 -1
  37. package/src/system/Badge/Badge.stories.js +0 -5
  38. package/src/system/BlankState/BlankState.js +2 -2
  39. package/src/system/BlankState/BlankState.stories.js +0 -5
  40. package/src/system/Box/Box.stories.js +0 -5
  41. package/src/system/Button/Button.js +1 -1
  42. package/src/system/Card/Card.js +16 -12
  43. package/src/system/Card/Card.stories.js +0 -5
  44. package/src/system/Code/Code.stories.js +4 -1
  45. package/src/system/ConfirmationDialog/ConfirmationDialog.stories.js +0 -5
  46. package/src/system/Dialog/Dialog.stories.js +0 -5
  47. package/src/system/Dialog/DialogButton.js +0 -1
  48. package/src/system/Dialog/DialogContent.js +14 -1
  49. package/src/system/Flex/Flex.stories.js +0 -5
  50. package/src/system/Form/InlineSelect.js +6 -6
  51. package/src/system/Form/Input.js +2 -0
  52. package/src/system/Form/Input.stories.js +0 -5
  53. package/src/system/Form/RadioBoxGroup.js +1 -2
  54. package/src/system/Form/RadioBoxGroup.stories.js +4 -5
  55. package/src/system/Form/SearchSelect.js +4 -4
  56. package/src/system/Form/Select.js +18 -18
  57. package/src/system/Form/Select.stories.js +1 -1
  58. package/src/system/Form/Textarea.js +3 -1
  59. package/src/system/Form/ToggleGroup.js +34 -37
  60. package/src/system/Form/ToggleGroup.stories.js +30 -32
  61. package/src/system/Form/ToggleRow.js +1 -1
  62. package/src/system/Grid/Grid.stories.js +0 -5
  63. package/src/system/Heading/Heading.stories.js +0 -5
  64. package/src/system/Link/Link.stories.js +0 -5
  65. package/src/system/Notice/Notice.js +30 -11
  66. package/src/system/Notification/Notification.js +2 -2
  67. package/src/system/Notification/Notification.stories.js +0 -5
  68. package/src/system/OptionRow/OptionRow.js +23 -23
  69. package/src/system/OptionRow/OptionRow.stories.js +0 -5
  70. package/src/system/Progress/Progress.stories.js +0 -5
  71. package/src/system/ResourceList/ResourceItem.js +66 -0
  72. package/src/system/ResourceList/ResourceList.js +96 -0
  73. package/src/system/ResourceList/ResourceList.stories.js +300 -0
  74. package/src/system/ResourceList/index.js +7 -0
  75. package/src/system/Spinner/Spinner.stories.js +0 -5
  76. package/src/system/Table/Table.stories.js +0 -5
  77. package/src/system/Table/TableRow.js +1 -1
  78. package/src/system/Tabs/Tabs.stories.js +0 -5
  79. package/src/system/Text/Text.stories.js +0 -5
  80. package/src/system/{Timeline/Timeline.stories.js → Time/Time.stories.js} +5 -5
  81. package/src/system/Time/index.js +62 -0
  82. package/src/system/Timeline/index.js +11 -5
  83. package/src/system/Tooltip/Tooltip.js +5 -4
  84. package/src/system/Tooltip/Tooltip.stories.js +0 -5
  85. package/src/system/Wizard/Wizard.js +7 -7
  86. package/src/system/Wizard/WizardStep.js +5 -5
  87. package/src/system/Wizard/WizardStepHorizontal.js +1 -1
  88. package/src/system/index.js +27 -2
  89. package/src/system/theme/colors.js +1 -1
  90. package/src/system/theme/index.js +248 -248
  91. package/test/setupAfterEnv.js +13 -0
  92. 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, Text } from 'theme-ui';
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
- <VerticalLine />
26
+ { ! first && (
27
+ <VerticalLine />
28
+ ) }
27
29
  <MdWatchLater sx={ { color: 'border' } } size={ 18 }/>
28
- <VerticalLine />
30
+ { ! last && (
31
+ <VerticalLine />
32
+ ) }
29
33
  </Flex>
30
34
  <Flex sx={ { alignItems: 'center', ml: 2 } }>
31
- <Text as="span" sx={ { color: 'muted' } }>{ time }</Text>
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 "@radix-ui/react-tooltip";
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 };
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import React from 'react';
5
-
6
1
  /**
7
2
  * Internal dependencies
8
3
  */
@@ -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
 
@@ -11,7 +11,7 @@ import PropTypes from 'prop-types';
11
11
  */
12
12
  import { Heading } from '..';
13
13
 
14
- const WizardStepHorizontal = ({ title, active }) => {
14
+ const WizardStepHorizontal = ( { title, active } ) => {
15
15
  return (
16
16
  <Heading
17
17
  variant="h4"
@@ -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 { Dialog, DialogButton, DialogDivider, DialogMenu, DialogMenuItem, DialogTrigger, DialogContent } from './Dialog';
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 { Input, Label, Toggle, ToggleRow, ToggleGroup, Validation, Radio, RadioBoxGroup, Select, Textarea, Checkbox } from './Form';
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,
@@ -396,4 +396,4 @@ export const dark = {
396
396
  },
397
397
  };
398
398
 
399
- export default light;
399
+ export default light;