@automattic/vip-design-system 0.9.6 → 0.10.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 (161) hide show
  1. package/.eslintrc.json +2 -5
  2. package/.storybook/decorators/withBoundingBox.jsx +15 -0
  3. package/.storybook/decorators/withColorMode.jsx +45 -0
  4. package/.storybook/decorators/withThemeProvider.jsx +18 -0
  5. package/.storybook/main.js +7 -8
  6. package/.storybook/preview.js +13 -32
  7. package/README.md +4 -4
  8. package/babel.config.js +2 -3
  9. package/build/system/Avatar/Avatar.js +17 -12
  10. package/build/system/Avatar/Avatar.stories.js +1 -9
  11. package/build/system/Avatar/Avatar.test.js +16 -7
  12. package/build/system/Badge/Badge.js +18 -13
  13. package/build/system/Badge/Badge.stories.js +1 -9
  14. package/build/system/Badge/Badge.test.js +16 -7
  15. package/build/system/BlankState/BlankState.js +10 -4
  16. package/build/system/BlankState/BlankState.stories.js +1 -9
  17. package/build/system/BlankState/BlankState.test.js +26 -17
  18. package/build/system/Box/Box.js +19 -4
  19. package/build/system/Box/Box.stories.js +1 -9
  20. package/build/system/Button/Button.js +15 -12
  21. package/build/system/Button/Button.stories.js +3 -3
  22. package/build/system/Button/Button.test.js +14 -5
  23. package/build/system/Card/Card.js +17 -13
  24. package/build/system/Card/Card.stories.js +1 -9
  25. package/build/system/Card/Card.test.js +19 -10
  26. package/build/system/Code/Code.js +16 -12
  27. package/build/system/Code/Code.stories.js +17 -5
  28. package/build/system/Code/Code.test.js +29 -20
  29. package/build/system/ConfirmationDialog/ConfirmationDialog.js +16 -10
  30. package/build/system/ConfirmationDialog/ConfirmationDialog.stories.js +1 -9
  31. package/build/system/Dialog/Dialog.js +9 -8
  32. package/build/system/Dialog/Dialog.stories.js +1 -9
  33. package/build/system/Dialog/DialogButton.js +8 -9
  34. package/build/system/Dialog/DialogContent.js +11 -12
  35. package/build/system/Dialog/DialogDivider.js +5 -3
  36. package/build/system/Dialog/DialogMenu.js +5 -3
  37. package/build/system/Dialog/DialogMenuItem.js +8 -9
  38. package/build/system/Dialog/DialogTrigger.js +9 -2
  39. package/build/system/Flex/Flex.js +9 -2
  40. package/build/system/Flex/Flex.stories.js +1 -9
  41. package/build/system/Form/AsyncSearchSelect.js +8 -10
  42. package/build/system/Form/Checkbox.js +10 -11
  43. package/build/system/Form/InlineSelect.js +12 -14
  44. package/build/system/Form/Input.js +8 -9
  45. package/build/system/Form/Input.stories.js +2 -8
  46. package/build/system/Form/Label.js +9 -2
  47. package/build/system/Form/Radio.js +8 -9
  48. package/build/system/Form/RadioBoxGroup.js +8 -9
  49. package/build/system/Form/RadioBoxGroup.stories.js +53 -0
  50. package/build/system/Form/SearchSelect.js +15 -18
  51. package/build/system/Form/Select.js +10 -10
  52. package/build/system/Form/Select.stories.js +96 -10
  53. package/build/system/Form/Select.test.js +14 -5
  54. package/build/system/Form/Textarea.js +8 -9
  55. package/build/system/Form/Toggle.js +18 -13
  56. package/build/system/Form/ToggleGroup.js +8 -9
  57. package/build/system/Form/ToggleGroup.stories.js +50 -0
  58. package/build/system/Form/ToggleRow.js +9 -10
  59. package/build/system/Form/Validation.js +8 -9
  60. package/build/system/Grid/Grid.js +9 -2
  61. package/build/system/Grid/Grid.stories.js +1 -9
  62. package/build/system/Heading/Heading.js +18 -13
  63. package/build/system/Heading/Heading.stories.js +1 -9
  64. package/build/system/Link/Link.js +9 -10
  65. package/build/system/Link/Link.stories.js +1 -9
  66. package/build/system/Notice/Notice.js +18 -13
  67. package/build/system/Notice/Notice.stories.js +20 -3
  68. package/build/system/Notification/Notification.js +3 -2
  69. package/build/system/Notification/Notification.stories.js +1 -9
  70. package/build/system/OptionRow/OptionRow.js +26 -16
  71. package/build/system/OptionRow/OptionRow.stories.js +12 -12
  72. package/build/system/OptionRow/OptionRow.test.js +93 -0
  73. package/build/system/Progress/Progress.js +17 -12
  74. package/build/system/Progress/Progress.stories.js +1 -9
  75. package/build/system/ResourceList/ResourceItem.js +2 -2
  76. package/build/system/ResourceList/ResourceList.js +14 -4
  77. package/build/system/ResourceList/ResourceList.stories.js +377 -0
  78. package/build/system/Spinner/Spinner.js +17 -12
  79. package/build/system/Spinner/Spinner.stories.js +1 -9
  80. package/build/system/Table/Table.js +10 -13
  81. package/build/system/Table/Table.stories.js +1 -9
  82. package/build/system/Table/TableRow.js +2 -2
  83. package/build/system/Tabs/TabItem.js +10 -10
  84. package/build/system/Tabs/Tabs.js +19 -14
  85. package/build/system/Tabs/Tabs.stories.js +1 -9
  86. package/build/system/Text/Text.js +18 -13
  87. package/build/system/Text/Text.stories.js +1 -9
  88. package/build/system/Time/Time.stories.js +52 -0
  89. package/build/system/Time/index.js +17 -13
  90. package/build/system/Timeline/Timeline.js +17 -11
  91. package/build/system/Timeline/Timeline.stories.js +16 -22
  92. package/build/system/Tooltip/Tooltip.js +10 -11
  93. package/build/system/Tooltip/Tooltip.stories.js +1 -9
  94. package/build/system/UsageChart/UsageChart.stories.js +20 -0
  95. package/build/system/Wizard/Wizard.js +18 -11
  96. package/build/system/Wizard/Wizard.stories.js +5 -4
  97. package/build/system/Wizard/WizardStep.js +8 -4
  98. package/build/system/Wizard/WizardStepHorizontal.js +8 -4
  99. package/build/system/index.js +3 -3
  100. package/build/system/theme/colors.js +1 -1
  101. package/build/system/theme/index.js +10 -5
  102. package/package.json +25 -13
  103. package/src/system/Avatar/Avatar.js +4 -0
  104. package/src/system/Avatar/{Avatar.stories.js → Avatar.stories.jsx} +0 -0
  105. package/src/system/Badge/Badge.js +4 -1
  106. package/src/system/Badge/{Badge.stories.js → Badge.stories.jsx} +0 -0
  107. package/src/system/BlankState/BlankState.js +4 -1
  108. package/src/system/BlankState/{BlankState.stories.js → BlankState.stories.jsx} +0 -0
  109. package/src/system/BlankState/BlankState.test.js +23 -22
  110. package/src/system/Box/Box.js +6 -1
  111. package/src/system/Box/{Box.stories.js → Box.stories.jsx} +0 -0
  112. package/src/system/Button/Button.js +3 -0
  113. package/src/system/Button/{Button.stories.js → Button.stories.jsx} +0 -0
  114. package/src/system/Card/Card.js +4 -1
  115. package/src/system/Card/{Card.stories.js → Card.stories.jsx} +0 -0
  116. package/src/system/Code/Code.js +4 -1
  117. package/src/system/Code/{Code.stories.js → Code.stories.jsx} +0 -0
  118. package/src/system/ConfirmationDialog/ConfirmationDialog.js +4 -2
  119. package/src/system/ConfirmationDialog/{ConfirmationDialog.stories.js → ConfirmationDialog.stories.jsx} +0 -0
  120. package/src/system/Dialog/Dialog.js +1 -1
  121. package/src/system/Dialog/{Dialog.stories.js → Dialog.stories.jsx} +0 -0
  122. package/src/system/Flex/{Flex.stories.js → Flex.stories.jsx} +0 -0
  123. package/src/system/Form/{Input.stories.js → Input.stories.jsx} +0 -0
  124. package/src/system/Form/{RadioBoxGroup.stories.js → RadioBoxGroup.stories.jsx} +0 -0
  125. package/src/system/Form/Select.js +1 -1
  126. package/src/system/Form/{Select.stories.js → Select.stories.jsx} +0 -0
  127. package/src/system/Form/Toggle.js +4 -2
  128. package/src/system/Form/{ToggleGroup.stories.js → ToggleGroup.stories.jsx} +0 -0
  129. package/src/system/Grid/{Grid.stories.js → Grid.stories.jsx} +0 -0
  130. package/src/system/Heading/Heading.js +4 -1
  131. package/src/system/Heading/{Heading.stories.js → Heading.stories.jsx} +0 -0
  132. package/src/system/Link/{Link.stories.js → Link.stories.jsx} +0 -0
  133. package/src/system/Notice/Notice.js +4 -1
  134. package/src/system/Notice/{Notice.stories.js → Notice.stories.jsx} +0 -0
  135. package/src/system/Notification/Notification.js +1 -0
  136. package/src/system/Notification/{Notification.stories.js → Notification.stories.jsx} +0 -0
  137. package/src/system/OptionRow/OptionRow.js +11 -2
  138. package/src/system/OptionRow/{OptionRow.stories.js → OptionRow.stories.jsx} +9 -0
  139. package/src/system/OptionRow/OptionRow.test.js +49 -0
  140. package/src/system/Progress/Progress.js +4 -1
  141. package/src/system/Progress/{Progress.stories.js → Progress.stories.jsx} +0 -0
  142. package/src/system/ResourceList/ResourceList.js +1 -1
  143. package/src/system/ResourceList/{ResourceList.stories.js → ResourceList.stories.jsx} +0 -0
  144. package/src/system/Spinner/Spinner.js +4 -1
  145. package/src/system/Spinner/{Spinner.stories.js → Spinner.stories.jsx} +0 -0
  146. package/src/system/Table/Table.js +1 -1
  147. package/src/system/Table/{Table.stories.js → Table.stories.jsx} +0 -0
  148. package/src/system/Tabs/TabItem.js +1 -0
  149. package/src/system/Tabs/Tabs.js +5 -2
  150. package/src/system/Tabs/{Tabs.stories.js → Tabs.stories.jsx} +0 -0
  151. package/src/system/Text/Text.js +4 -1
  152. package/src/system/Text/{Text.stories.js → Text.stories.jsx} +0 -0
  153. package/src/system/Time/{Time.stories.js → Time.stories.jsx} +0 -0
  154. package/src/system/Time/index.js +4 -1
  155. package/src/system/Timeline/Timeline.js +4 -2
  156. package/src/system/Timeline/{Timeline.stories.js → Timeline.stories.jsx} +0 -0
  157. package/src/system/Tooltip/{Tooltip.stories.js → Tooltip.stories.jsx} +0 -0
  158. package/src/system/Wizard/Wizard.js +6 -2
  159. package/src/system/Wizard/{Wizard.stories.js → Wizard.stories.jsx} +1 -1
  160. package/src/system/Wizard/WizardStep.js +5 -2
  161. package/src/system/Wizard/WizardStepHorizontal.js +4 -1
@@ -3,6 +3,7 @@
3
3
  /**
4
4
  * External dependencies
5
5
  */
6
+ import classNames from 'classnames';
6
7
  import PropTypes from 'prop-types';
7
8
  import React from 'react';
8
9
 
@@ -11,8 +12,8 @@ import React from 'react';
11
12
  */
12
13
  import { Dialog, Box, Heading, Text, Flex, Button } from '../';
13
14
 
14
- const ConfirmationDialogContent = ( { title, body, onClose, label = 'Confirm', onConfirm } ) => (
15
- <Box p={ 4 }>
15
+ const ConfirmationDialogContent = ( { title, body, onClose, label = 'Confirm', onConfirm, className = null } ) => (
16
+ <Box p={ 4 } className={ classNames( 'vip-confirmation-dialog-component', className ) }>
16
17
  <Heading variant="h3" sx={ { mb: 2 } }>
17
18
  { title }
18
19
  </Heading>
@@ -40,6 +41,7 @@ ConfirmationDialogContent.propTypes = {
40
41
  label: PropTypes.string,
41
42
  onClose: PropTypes.func,
42
43
  onConfirm: PropTypes.func,
44
+ className: PropTypes.any,
43
45
  };
44
46
 
45
47
  const ConfirmationDialog = ( { trigger, onConfirm, needsConfirm = true, ...props } ) => {
@@ -46,7 +46,7 @@ const Dialog = ( { trigger, position = 'left', startOpen = false, content, disab
46
46
  };
47
47
 
48
48
  return (
49
- <div onClick={ e => e.stopPropagation() } sx={ { position: 'relative' } } ref={ dialogRef }>
49
+ <div onClick={ e => e.stopPropagation() } sx={ { position: 'relative' } } ref={ dialogRef } className="vip-dialog-component">
50
50
  <DialogTrigger
51
51
  tabIndex="0"
52
52
  sx={ { display: 'inline' } }
@@ -36,7 +36,7 @@ const Select = ( { isMulti = false, isInline, isAsync, options, label, isSearch,
36
36
  break;
37
37
  }
38
38
 
39
- return <div ref={selectRef}><Component isMulti={isMulti} label={label} options={options} {...portalProps} {...props} /></div>;
39
+ return <div ref={selectRef} className="vip-select-component"><Component isMulti={isMulti} label={label} options={options} {...portalProps} {...props} /></div>;
40
40
  };
41
41
 
42
42
  Select.propTypes = {
@@ -3,10 +3,11 @@
3
3
  /**
4
4
  * External dependencies
5
5
  */
6
+ import classNames from 'classnames';
6
7
  import PropTypes from 'prop-types';
7
8
 
8
- const Toggle = ( { name = 'toggle', ...props } ) => (
9
- <CheckBoxWrapper>
9
+ const Toggle = ( { name = 'toggle', className = null, ...props } ) => (
10
+ <CheckBoxWrapper className={ classNames( 'vip-checkbox-component', className ) }>
10
11
  <CheckBox name={name} id={name} type="checkbox" {...props} />
11
12
  <CheckBoxLabel htmlFor={name} />
12
13
  </CheckBoxWrapper>
@@ -14,6 +15,7 @@ const Toggle = ( { name = 'toggle', ...props } ) => (
14
15
 
15
16
  Toggle.propTypes = {
16
17
  name: PropTypes.string,
18
+ className: PropTypes.any,
17
19
  };
18
20
 
19
21
  export { Toggle };
@@ -5,8 +5,9 @@
5
5
  */
6
6
  import { Heading as ThemeHeading } from 'theme-ui';
7
7
  import PropTypes from 'prop-types';
8
+ import classNames from 'classnames';
8
9
 
9
- const Heading = ( { variant = 'h3', sx, ...props } ) => (
10
+ const Heading = ( { variant = 'h3', sx, className = null, ...props } ) => (
10
11
  <ThemeHeading
11
12
  as={variant}
12
13
  sx={{
@@ -15,6 +16,7 @@ const Heading = ( { variant = 'h3', sx, ...props } ) => (
15
16
  variant: `text.${ variant }`,
16
17
  ...sx,
17
18
  }}
19
+ className={ classNames( 'vip-heading-component', className ) }
18
20
  {...props}
19
21
  />
20
22
  );
@@ -22,6 +24,7 @@ const Heading = ( { variant = 'h3', sx, ...props } ) => (
22
24
  Heading.propTypes = {
23
25
  variant: PropTypes.string,
24
26
  sx: PropTypes.object,
27
+ className: PropTypes.any,
25
28
  };
26
29
 
27
30
  export { Heading };
@@ -3,6 +3,7 @@
3
3
  /**
4
4
  * External dependencies
5
5
  */
6
+ import classNames from 'classnames';
6
7
  import PropTypes from 'prop-types';
7
8
  import { MdError, MdWarning, MdCheckCircle, MdInfo } from 'react-icons/md';
8
9
 
@@ -36,7 +37,7 @@ NoticeIcon.propTypes = {
36
37
  variant: PropTypes.string,
37
38
  };
38
39
 
39
- const Notice = ( { variant = 'warning', inline = false, children, title, sx = {}, ...props } ) => {
40
+ const Notice = ( { variant = 'warning', inline = false, children, title, sx = {}, className = null, ...props } ) => {
40
41
  let color = 'yellow';
41
42
 
42
43
  switch ( variant ) {
@@ -66,6 +67,7 @@ const Notice = ( { variant = 'warning', inline = false, children, title, sx = {}
66
67
  },
67
68
  ...sx,
68
69
  } }
70
+ className={ classNames( 'vip-notice-component', className ) }
69
71
  { ...props }
70
72
  >
71
73
  <Flex sx={ {
@@ -93,6 +95,7 @@ Notice.propTypes = {
93
95
  sx: PropTypes.object,
94
96
  title: PropTypes.node,
95
97
  variant: PropTypes.string,
98
+ className: PropTypes.any,
96
99
  };
97
100
 
98
101
  export { Notice };
@@ -13,6 +13,7 @@ import { Box, Button, Card, Flex, Heading, Text } from '../';
13
13
 
14
14
  const Notification = ( { title, body, status = 'success', onClose } ) => (
15
15
  <Card
16
+ className="vip-notification-component"
16
17
  sx={{
17
18
  boxShadow: 'medium',
18
19
  width: 320,
@@ -11,6 +11,7 @@ import PropTypes from 'prop-types';
11
11
  * Internal dependencies
12
12
  */
13
13
  import { Badge, Box, Grid, Heading, Text } from '..';
14
+ import classNames from 'classnames';
14
15
 
15
16
  const OptionRow = ( {
16
17
  image,
@@ -24,6 +25,8 @@ const OptionRow = ( {
24
25
  to,
25
26
  small = false,
26
27
  disabled = false,
28
+ order = null,
29
+ className = null,
27
30
  ...props
28
31
  } ) => {
29
32
  const mergedCard = disabled
@@ -53,13 +56,15 @@ const OptionRow = ( {
53
56
  to={to}
54
57
  columns={[ 1, 1, 'auto 1fr auto' ]}
55
58
  gap={[ 3, 3, `${ small ? 3 : 4 }` ]}
59
+ data-order={ order || undefined }
60
+ className={ classNames( 'vip-option-row-component', className ) }
56
61
  {...props}
57
62
  sx={{
58
63
  alignItems: 'center',
59
64
  cursor: disabled ? 'auto' : 'pointer',
60
65
  textDecoration: 'none',
61
66
  color: 'inherit',
62
- '&:hover': {
67
+ '&:hover': ! disabled && {
63
68
  backgroundColor: 'hover',
64
69
  },
65
70
  ...inlineStyles,
@@ -102,7 +107,9 @@ const OptionRow = ( {
102
107
  {subTitle && <Text sx={{ mb: 1, color: 'muted' }}>{subTitle}</Text>}
103
108
  {body && <Text sx={{ mb: 0 }}>{body}</Text>}
104
109
  </Box>
105
- <Box>{meta ? meta : <MdArrowForward size={24} />}</Box>
110
+ { ( false !== meta && '' !== meta ) && (
111
+ <Box data-testid="meta">{ meta ? meta : <MdArrowForward size={24} /> }</Box>
112
+ ) }
106
113
  </Grid>
107
114
  );
108
115
  };
@@ -119,6 +126,8 @@ OptionRow.propTypes = {
119
126
  to: PropTypes.string,
120
127
  small: PropTypes.bool,
121
128
  disabled: PropTypes.bool,
129
+ order: PropTypes.number,
130
+ className: PropTypes.any,
122
131
  };
123
132
 
124
133
  export { OptionRow };
@@ -26,6 +26,15 @@ export const Default = () => (
26
26
  label="Option Row"
27
27
  subTitle="Mostly used to link off to other pages."
28
28
  as="a"
29
+ order={ 2 }
30
+ />
31
+ <OptionRow
32
+ image={image2}
33
+ label="Option Row – Disabled"
34
+ subTitle="Mostly used to link off to other pages."
35
+ as={ Box }
36
+ disabled
37
+ meta=""
29
38
  />
30
39
  </Box>
31
40
  );
@@ -0,0 +1,49 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen } from '@testing-library/react';
5
+ import { axe } from 'jest-axe';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { OptionRow } from './OptionRow';
11
+
12
+ describe( '<OptionRow />', () => {
13
+ it( 'renders the OptionRow', async () => {
14
+ const { container } = render(
15
+ <OptionRow
16
+ label="Option Row"
17
+ subTitle="Mostly used to link off to other pages."
18
+ as="a"
19
+ />
20
+ );
21
+
22
+ expect( screen.getByText( 'Mostly used to link off to other pages.' ) ).toBeInTheDocument();
23
+
24
+ // Check for accessibility issues
25
+ await expect( await axe( container ) ).toHaveNoViolations();
26
+ } );
27
+
28
+ it( 'renders a disabled OptionRow', async () => {
29
+ // eslint-disable-next-line max-len
30
+ const image1 = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='79' height='79' viewBox='0 0 79 79' fill='none' %3E%3Cpath d='M71.4 15.3L54.2 4.2C54 4 53.7 4 53.4 4H26.4C26.1 4 25.8 4.1 25.6 4.2L8.29997 15.3C7.89997 15.6 7.59998 16 7.59998 16.5V32.1V63C7.59998 63.5 7.89997 64 8.29997 64.2L25.5 75.3C25.5 75.3 25.6 75.3 25.6 75.4C25.6 75.4 25.7 75.4 25.7 75.5C25.9 75.6 26 75.6 26.2 75.6H53.2C53.4 75.6 53.5 75.6 53.7 75.5C53.8 75.5 53.8 75.5 53.8 75.4C53.8 75.4 53.9 75.4 53.9 75.3L71.4 64.2C71.5 64.1 71.7 64 71.8 63.8C71.8 63.8 71.8 63.7 71.9 63.7C72 63.6 72.1 63.4 72.1 63.2V63.1C72.1 63 72.1 62.9 72.1 62.8V32.1V16.5C72.1 16 71.8 15.6 71.4 15.3ZM24.9 71.4L10.6 62.2V34.8L24.9 44V71.4ZM51.9 72.6H27.8V44.7H51.9V72.6ZM69.1 31.3L52.9 41.7H26.8L10.6 31.3V17.3L26.8 6.9H52.9L69.1 17.3V31.3Z' fill='%23BD9D70' /%3E%3C/svg%3E";
31
+
32
+ const { container } = render(
33
+ <OptionRow
34
+ image={image1}
35
+ label="Option Row"
36
+ subTitle="Mostly used to link off to other pages."
37
+ as="a"
38
+ disabled
39
+ meta=""
40
+ />
41
+ );
42
+
43
+ expect( screen.getByAltText( 'Image representing the list item' ).closest( 'div' ) ).toHaveStyle( { background: 'none' } );
44
+ expect( screen.queryByTestId( 'meta' ) ).not.toBeInTheDocument();
45
+
46
+ // Check for accessibility issues
47
+ await expect( await axe( container ) ).toHaveNoViolations();
48
+ } );
49
+ } );
@@ -11,10 +11,12 @@ import PropTypes from 'prop-types';
11
11
  */
12
12
  import { Spinner } from '../Spinner';
13
13
  import { Box, Heading, Text, Flex } from '../';
14
+ import classNames from 'classnames';
14
15
 
15
- const Progress = ( { steps, activeStep, sx, ...props } ) => (
16
+ const Progress = ( { steps, activeStep, sx, className, ...props } ) => (
16
17
  <Box>
17
18
  <ThemeProgress
19
+ className={ classNames( 'vip-progress-component', className ) }
18
20
  { ...props }
19
21
  sx={ {
20
22
  color: 'primary',
@@ -39,6 +41,7 @@ Progress.propTypes = {
39
41
  steps: PropTypes.array,
40
42
  activeStep: PropTypes.number,
41
43
  sx: PropTypes.object,
44
+ className: PropTypes.any,
42
45
  };
43
46
 
44
47
  export { Progress };
@@ -59,7 +59,7 @@ const ResourceList = ( { groupedByDay = false, items, renderItem, dateKey } ) =>
59
59
  itemsList.map( ( item, index ) => <StyledListItem key={index}>{renderItem( item )}</StyledListItem> );
60
60
 
61
61
  return (
62
- <Box as="ul" sx={{ listStyleType: 'none', m: 0, p: 0 }}>
62
+ <Box as="ul" sx={{ listStyleType: 'none', m: 0, p: 0 }} className="vip-resource-list-component">
63
63
  {groupedByDay
64
64
  ? Object.keys( groupedItems ).map( ( groupName, index ) => (
65
65
  <Box sx={{ mb: 4 }} key={index}>
@@ -5,20 +5,23 @@
5
5
  */
6
6
  import { Spinner as ThemeSpinner } from 'theme-ui';
7
7
  import PropTypes from 'prop-types';
8
+ import classNames from 'classnames';
8
9
 
9
- const Spinner = ( { sx, ...props } ) => (
10
+ const Spinner = ( { sx, className = null, ...props } ) => (
10
11
  <ThemeSpinner
11
12
  strokeWidth={2}
12
13
  sx={{
13
14
  fill: 'none',
14
15
  color: 'primary',
15
16
  }}
17
+ className={ classNames( 'vip-spinner-component', className ) }
16
18
  {...props}
17
19
  />
18
20
  );
19
21
 
20
22
  Spinner.propTypes = {
21
23
  sx: PropTypes.object,
24
+ className: PropTypes.any,
22
25
  };
23
26
 
24
27
  export { Spinner };
@@ -6,7 +6,7 @@
6
6
  import PropTypes from 'prop-types';
7
7
 
8
8
  const Table = ( { sx, ...props } ) => (
9
- <div sx={ { overflowX: 'auto', pb: 300, mb: -300 } }>
9
+ <div sx={ { overflowX: 'auto' } }>
10
10
  <table
11
11
  sx={ { width: '100%', minWidth: 1024, ...sx } }
12
12
  cellPadding={ 0 }
@@ -15,6 +15,7 @@ const TabItem = ( { active = false, sx, ...props } ) => (
15
15
  variant="h4"
16
16
  as="button"
17
17
  tabIndex="0"
18
+ data-active={ active || undefined }
18
19
  sx={ {
19
20
  cursor: 'pointer',
20
21
  background: 'none',
@@ -3,6 +3,7 @@
3
3
  /**
4
4
  * External dependencies
5
5
  */
6
+ import classNames from 'classnames';
6
7
  import PropTypes from 'prop-types';
7
8
 
8
9
  /**
@@ -10,8 +11,9 @@ import PropTypes from 'prop-types';
10
11
  */
11
12
  import { Flex } from '..';
12
13
 
13
- const Tabs = ( { sx, ...props } ) => (
14
+ const Tabs = ( { className = null, sx, ...props } ) => (
14
15
  <Flex
16
+ className={ classNames( 'vip-tabs-component', className ) }
15
17
  sx={{
16
18
  borderBottom: '1px solid',
17
19
  borderColor: 'border',
@@ -25,8 +27,9 @@ const Tabs = ( { sx, ...props } ) => (
25
27
  );
26
28
 
27
29
  Tabs.propTypes = {
28
- variant: PropTypes.string,
30
+ className: PropTypes.any,
29
31
  sx: PropTypes.object,
32
+ variant: PropTypes.string,
30
33
  };
31
34
 
32
35
  export { Tabs };
@@ -5,8 +5,9 @@
5
5
  */
6
6
  import { Text as ThemeText } from 'theme-ui';
7
7
  import PropTypes from 'prop-types';
8
+ import classNames from 'classnames';
8
9
 
9
- const Text = ( { sx, ...props } ) => (
10
+ const Text = ( { sx, className = null, ...props } ) => (
10
11
  <ThemeText
11
12
  as="p"
12
13
  sx={{
@@ -14,12 +15,14 @@ const Text = ( { sx, ...props } ) => (
14
15
  marginBottom: 2,
15
16
  ...sx,
16
17
  }}
18
+ className={ classNames( 'vip-text-component', className ) }
17
19
  {...props}
18
20
  />
19
21
  );
20
22
 
21
23
  Text.propTypes = {
22
24
  sx: PropTypes.object,
25
+ className: PropTypes.any,
23
26
  };
24
27
 
25
28
  export { Text };
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { Text } from 'theme-ui';
7
7
  import PropTypes from 'prop-types';
8
+ import classNames from 'classnames';
8
9
 
9
10
  const formatter = new Intl.RelativeTimeFormat( undefined, {
10
11
  numeric: 'auto',
@@ -31,7 +32,7 @@ function formatTimeAgo( date ) {
31
32
  }
32
33
  }
33
34
 
34
- const Time = ( { time, relativeTime = false, timeOnly = false, ...props } ) => {
35
+ const Time = ( { time, relativeTime = false, timeOnly = false, className = null, ...props } ) => {
35
36
  let formattedTime;
36
37
  if ( relativeTime ) {
37
38
  formattedTime = formatTimeAgo( time );
@@ -46,6 +47,7 @@ const Time = ( { time, relativeTime = false, timeOnly = false, ...props } ) => {
46
47
  title={time.toLocaleString( 'sv', { timeZoneName: 'short' } )}
47
48
  datetime={time}
48
49
  as="time"
50
+ className={ classNames( 'vip-time-component', className ) }
49
51
  {...props}
50
52
  >
51
53
  {formattedTime}
@@ -57,6 +59,7 @@ Time.propTypes = {
57
59
  time: PropTypes.string,
58
60
  timeOnly: PropTypes.bool,
59
61
  relativeTime: PropTypes.bool,
62
+ className: PropTypes.any,
60
63
  };
61
64
 
62
65
  export { Time };
@@ -6,6 +6,7 @@
6
6
  import { Flex } from 'theme-ui';
7
7
  import { MdWatchLater } from 'react-icons/md';
8
8
  import PropTypes from 'prop-types';
9
+ import classNames from 'classnames';
9
10
 
10
11
  const VerticalLine = () => {
11
12
  return (
@@ -20,8 +21,8 @@ const VerticalLine = () => {
20
21
  );
21
22
  };
22
23
 
23
- const Timeline = ( { time, first = false, last = false, ...props } ) => (
24
- <Flex { ...props }>
24
+ const Timeline = ( { time, first = false, last = false, className = null, ...props } ) => (
25
+ <Flex className={ classNames( 'vip-timeline-component', className ) } { ...props }>
25
26
  <Flex sx={ { flexDirection: 'column', justifyContent: 'space-evenly', alignItems: 'center' } }>
26
27
  { ! first && (
27
28
  <VerticalLine />
@@ -41,6 +42,7 @@ Timeline.propTypes = {
41
42
  first: PropTypes.bool,
42
43
  time: PropTypes.node,
43
44
  last: PropTypes.bool,
45
+ className: PropTypes.any,
44
46
  };
45
47
 
46
48
  export { Timeline };
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
+ import classNames from 'classnames';
8
9
  import { MdArrowForward } from 'react-icons/md';
9
10
 
10
11
  /**
@@ -12,9 +13,9 @@ import { MdArrowForward } from 'react-icons/md';
12
13
  */
13
14
  import { Box, WizardStep, Flex, WizardStepHorizontal } from '..';
14
15
 
15
- const Wizard = ( { steps, activeStep, variant, completed = [], ...props } ) => {
16
+ const Wizard = ( { steps, activeStep, variant, completed = [], className = null, ...props } ) => {
16
17
  return (
17
- <Box>
18
+ <Box className={ classNames( 'vip-wizard-component', className ) }>
18
19
  {variant === 'horizontal' ? (
19
20
  <Box>
20
21
  <Flex
@@ -26,6 +27,7 @@ const Wizard = ( { steps, activeStep, variant, completed = [], ...props } ) => {
26
27
  {steps.map( ( { title, subTitle }, index ) => (
27
28
  <React.Fragment key={index}>
28
29
  <WizardStepHorizontal
30
+ order={index + 1}
29
31
  active={index === activeStep}
30
32
  title={title}
31
33
  subTitle={subTitle}
@@ -44,6 +46,7 @@ const Wizard = ( { steps, activeStep, variant, completed = [], ...props } ) => {
44
46
  subTitle={subTitle}
45
47
  complete={completed.includes( index )}
46
48
  key={index}
49
+ order={index + 1}
47
50
  >
48
51
  {children}
49
52
  </WizardStep>
@@ -58,6 +61,7 @@ Wizard.propTypes = {
58
61
  activeStep: PropTypes.number,
59
62
  variant: PropTypes.string,
60
63
  completed: PropTypes.array,
64
+ className: PropTypes.any,
61
65
  };
62
66
 
63
67
  export { Wizard };
@@ -51,7 +51,7 @@ export const Default = () => {
51
51
  </Box>
52
52
  </Flex>
53
53
  <Box mt={4}>
54
- <Wizard activeStep={0} steps={steps} />
54
+ <Wizard activeStep={0} steps={steps} className="vip-wizard-xyz" />
55
55
  </Box>
56
56
  </React.Fragment>
57
57
  );
@@ -11,7 +11,7 @@ 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, order } ) => {
15
15
  let borderLeftColor = 'border';
16
16
 
17
17
  if ( complete ) {
@@ -44,6 +44,8 @@ const WizardStep = ( { title, subTitle, complete = false, children, active } ) =
44
44
  borderColor: active ? 'primary' : 'border',
45
45
  borderLeftColor: borderLeftColor,
46
46
  }}
47
+ data-step={ order }
48
+ data-active={ active || undefined }
47
49
  >
48
50
  <Heading
49
51
  variant="h4"
@@ -69,7 +71,8 @@ WizardStep.propTypes = {
69
71
  subTitle: PropTypes.node,
70
72
  complete: PropTypes.bool,
71
73
  active: PropTypes.bool,
72
- children: PropTypes.node.isRequired,
74
+ children: PropTypes.node,
75
+ order: PropTypes.number.isRequired,
73
76
  };
74
77
 
75
78
  export { WizardStep };
@@ -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, order } ) => {
15
15
  return (
16
16
  <Heading
17
17
  variant="h4"
@@ -21,6 +21,8 @@ const WizardStepHorizontal = ( { title, active } ) => {
21
21
  alignItems: 'center',
22
22
  color: active ? 'heading' : 'muted',
23
23
  }}
24
+ data-step={ order }
25
+ data-active={ active || undefined }
24
26
  >
25
27
  <MdCheckCircle sx={{ mr: 2 }} />
26
28
  {title}
@@ -32,6 +34,7 @@ WizardStepHorizontal.propTypes = {
32
34
  title: PropTypes.node,
33
35
  subTitle: PropTypes.node,
34
36
  active: PropTypes.bool,
37
+ order: PropTypes.number.isRequired,
35
38
  };
36
39
 
37
40
  export { WizardStepHorizontal };