@automattic/vip-design-system 0.10.3 → 0.12.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.
Files changed (141) hide show
  1. package/.eslines.json +8 -8
  2. package/.eslintrc.json +9 -4
  3. package/.github/PULL_REQUEST_TEMPLATE.md +1 -1
  4. package/.github/workflows/nodejs.yaml +14 -14
  5. package/.prettierrc +1 -2
  6. package/.storybook/main.js +2 -1
  7. package/.storybook/preview.js +5 -8
  8. package/README.md +1 -0
  9. package/babel.config.js +1 -1
  10. package/build/system/Avatar/Avatar.js +2 -1
  11. package/build/system/BlankState/BlankState.stories.js +3 -3
  12. package/build/system/BlankState/BlankState.test.js +2 -2
  13. package/build/system/Card/Card.test.js +0 -2
  14. package/build/system/Code/Code.js +7 -2
  15. package/build/system/Code/Code.test.js +22 -57
  16. package/build/system/Form/Select.stories.js +3 -4
  17. package/build/system/Form/Select.test.js +2 -2
  18. package/build/system/Form/Toggle.js +45 -72
  19. package/build/system/Form/Toggle.stories.js +63 -0
  20. package/build/system/Form/Toggle.test.js +55 -0
  21. package/build/system/Notification/Notification.js +24 -15
  22. package/build/system/Notification/Notification.stories.js +14 -4
  23. package/build/system/OptionRow/OptionRow.js +23 -17
  24. package/build/system/OptionRow/OptionRow.stories.js +5 -5
  25. package/build/system/OptionRow/OptionRow.test.js +4 -4
  26. package/build/system/ResourceList/ResourceList.js +34 -25
  27. package/build/system/ResourceList/ResourceList.stories.js +2 -0
  28. package/build/system/ScreenReaderText/ScreenReader.test.js +37 -0
  29. package/build/system/ScreenReaderText/ScreenReaderText.js +49 -0
  30. package/build/system/ScreenReaderText/index.js +7 -0
  31. package/build/system/Table/Table.stories.js +46 -3
  32. package/build/system/Table/TableCell.js +57 -0
  33. package/build/system/Table/TableRow.js +12 -57
  34. package/build/system/Table/index.js +5 -1
  35. package/build/system/Time/index.js +1 -1
  36. package/build/system/Wizard/Wizard.stories.js +1 -1
  37. package/build/system/index.js +1 -0
  38. package/package.json +10 -4
  39. package/src/system/Avatar/Avatar.js +1 -0
  40. package/src/system/Avatar/index.js +0 -1
  41. package/src/system/Badge/index.js +0 -1
  42. package/src/system/BlankState/BlankState.js +8 -5
  43. package/src/system/BlankState/BlankState.stories.jsx +5 -4
  44. package/src/system/BlankState/BlankState.test.js +21 -21
  45. package/src/system/BlankState/index.js +0 -1
  46. package/src/system/Box/Box.js +7 -1
  47. package/src/system/Box/index.js +0 -1
  48. package/src/system/Button/Button.js +3 -3
  49. package/src/system/Button/Button.stories.jsx +2 -2
  50. package/src/system/Button/index.js +0 -1
  51. package/src/system/Card/Card.js +4 -4
  52. package/src/system/Card/Card.test.js +1 -2
  53. package/src/system/Card/index.js +0 -1
  54. package/src/system/Code/Code.js +6 -2
  55. package/src/system/Code/Code.stories.jsx +10 -5
  56. package/src/system/Code/Code.test.js +3 -16
  57. package/src/system/ConfirmationDialog/ConfirmationDialog.js +8 -1
  58. package/src/system/Dialog/Dialog.js +17 -8
  59. package/src/system/Dialog/Dialog.stories.jsx +9 -13
  60. package/src/system/Dialog/DialogButton.js +18 -14
  61. package/src/system/Dialog/DialogDivider.js +1 -1
  62. package/src/system/Dialog/DialogMenu.js +1 -5
  63. package/src/system/Dialog/DialogMenuItem.js +4 -8
  64. package/src/system/Dialog/DialogTrigger.js +1 -1
  65. package/src/system/Dialog/index.js +0 -1
  66. package/src/system/Flex/Flex.js +1 -1
  67. package/src/system/Flex/index.js +0 -1
  68. package/src/system/Form/AsyncSearchSelect.js +3 -7
  69. package/src/system/Form/Checkbox.js +32 -28
  70. package/src/system/Form/InlineSelect.js +21 -17
  71. package/src/system/Form/Input.js +43 -45
  72. package/src/system/Form/Label.js +2 -2
  73. package/src/system/Form/RadioBoxGroup.js +34 -32
  74. package/src/system/Form/RadioBoxGroup.stories.jsx +8 -1
  75. package/src/system/Form/SearchSelect.js +7 -7
  76. package/src/system/Form/Select.js +21 -2
  77. package/src/system/Form/Select.stories.jsx +31 -34
  78. package/src/system/Form/Select.test.js +3 -8
  79. package/src/system/Form/Textarea.js +38 -40
  80. package/src/system/Form/Toggle.js +37 -65
  81. package/src/system/Form/Toggle.stories.jsx +42 -0
  82. package/src/system/Form/Toggle.test.js +23 -0
  83. package/src/system/Form/ToggleGroup.js +29 -31
  84. package/src/system/Form/ToggleGroup.stories.jsx +8 -1
  85. package/src/system/Form/ToggleRow.js +6 -1
  86. package/src/system/Form/Validation.js +6 -1
  87. package/src/system/Form/index.js +13 -1
  88. package/src/system/Grid/Grid.js +1 -1
  89. package/src/system/Grid/index.js +0 -1
  90. package/src/system/Heading/Heading.js +4 -4
  91. package/src/system/Heading/index.js +0 -1
  92. package/src/system/Link/index.js +0 -1
  93. package/src/system/Notice/Notice.js +27 -13
  94. package/src/system/Notice/Notice.stories.jsx +6 -8
  95. package/src/system/Notice/index.js +0 -1
  96. package/src/system/Notification/Notification.js +25 -20
  97. package/src/system/Notification/Notification.stories.jsx +4 -4
  98. package/src/system/Notification/index.js +0 -1
  99. package/src/system/OptionRow/OptionRow.js +46 -44
  100. package/src/system/OptionRow/OptionRow.stories.jsx +10 -8
  101. package/src/system/OptionRow/OptionRow.test.js +12 -11
  102. package/src/system/OptionRow/index.js +0 -1
  103. package/src/system/Progress/Progress.js +3 -1
  104. package/src/system/Progress/Progress.stories.jsx +4 -4
  105. package/src/system/Progress/index.js +0 -1
  106. package/src/system/ResourceList/ResourceItem.js +15 -15
  107. package/src/system/ResourceList/ResourceList.js +28 -16
  108. package/src/system/ResourceList/ResourceList.stories.jsx +77 -71
  109. package/src/system/ScreenReaderText/ScreenReader.test.js +22 -0
  110. package/src/system/ScreenReaderText/ScreenReaderText.js +40 -0
  111. package/src/system/ScreenReaderText/index.js +7 -0
  112. package/src/system/Spinner/Spinner.js +4 -4
  113. package/src/system/Spinner/index.js +0 -1
  114. package/src/system/Table/Table.js +5 -5
  115. package/src/system/Table/Table.stories.jsx +39 -9
  116. package/src/system/Table/TableCell.js +48 -0
  117. package/src/system/Table/TableRow.js +10 -47
  118. package/src/system/Table/index.js +2 -2
  119. package/src/system/Tabs/Tabs.js +3 -3
  120. package/src/system/Tabs/index.js +0 -1
  121. package/src/system/Text/Text.js +3 -3
  122. package/src/system/Text/Text.stories.jsx +4 -6
  123. package/src/system/Text/index.js +0 -1
  124. package/src/system/Time/Time.stories.jsx +2 -6
  125. package/src/system/Time/index.js +5 -5
  126. package/src/system/Timeline/Timeline.js +6 -12
  127. package/src/system/Timeline/Timeline.stories.jsx +3 -12
  128. package/src/system/Timeline/index.js +0 -1
  129. package/src/system/Tooltip/Tooltip.js +4 -8
  130. package/src/system/Wizard/Wizard.js +23 -21
  131. package/src/system/Wizard/Wizard.stories.jsx +7 -12
  132. package/src/system/Wizard/WizardStep.js +8 -8
  133. package/src/system/Wizard/WizardStepHorizontal.js +4 -4
  134. package/src/system/Wizard/index.js +0 -1
  135. package/src/system/index.js +2 -1
  136. package/src/system/theme/index.js +3 -4
  137. package/tokens/valet-color.json +1919 -0
  138. package/build/system/Form/MultiSelect.js +0 -38
  139. package/build/system/UsageChart/UsageChart.js +0 -60
  140. package/build/system/UsageChart/UsageChart.stories.js +0 -20
  141. package/build/system/UsageChart/index.js +0 -7
@@ -56,62 +56,65 @@ const logs = [
56
56
  ];
57
57
 
58
58
  export const Grouped = () => (
59
- <Box sx={{ p: 5, pt: 2 }}>
60
- <Heading sx={{ mb: 2 }}>Audit Log</Heading>
61
- <Text sx={{ mb: 4 }}>A live trail of system and human events.</Text>
59
+ <Box sx={ { p: 5, pt: 2 } }>
60
+ <Heading sx={ { mb: 2 } }>Audit Log</Heading>
61
+ <Text sx={ { mb: 4 } }>A live trail of system and human events.</Text>
62
62
  <ResourceList
63
- items={logs}
63
+ items={ logs }
64
64
  dateKey="date"
65
- groupedByDay={true}
66
- renderItem={item => (
65
+ groupedByDay={ true }
66
+ renderItem={ item => (
67
67
  <ResourceItem
68
- item={item}
69
- icon={<BiGlobe sx={{ color: 'red' }} />}
70
- dateKey={'date'}
71
- relativeTime={true}
72
- timeOnly={true}
68
+ item={ item }
69
+ icon={ <BiGlobe sx={ { color: 'red' } } /> }
70
+ dateKey={ 'date' }
71
+ relativeTime={ true }
72
+ timeOnly={ true }
73
73
  >
74
- <Flex sx={{ alignItems: 'center', gap: 3 }}>
74
+ <Flex sx={ { alignItems: 'center', gap: 3 } }>
75
75
  <Avatar
76
- name={item.actor}
76
+ name={ item.actor }
77
77
  src="https://uifaces.co/our-content/donated/1H_7AxP0.jpg"
78
- size={16}
78
+ size={ 16 }
79
79
  />
80
- <Heading variant="h4" as="p" sx={{ mb: 0, fontWeight: 'normal' }}>
81
- {item.actor}{' '}
82
- <Text as="span" sx={{ color: 'muted', mb: 0 }}>
83
- {item.action}
84
- </Text>{' '}
85
- {item.object}
80
+ <Heading variant="h4" as="p" sx={ { mb: 0, fontWeight: 'normal' } }>
81
+ { item.actor }{ ' ' }
82
+ <Text as="span" sx={ { color: 'muted', mb: 0 } }>
83
+ { item.action }
84
+ </Text>{ ' ' }
85
+ { item.object }
86
86
  </Heading>
87
87
  </Flex>
88
- {item.showObject && (
88
+ { item.showObject && (
89
89
  <Box
90
90
  variant="indent"
91
- sx={{ mt: 2, display: 'flex', flexWrap: 'wrap', gap: 3, alignItems: 'center' }}
91
+ sx={ { mt: 2, display: 'flex', flexWrap: 'wrap', gap: 3, alignItems: 'center' } }
92
92
  >
93
- <Heading variant="h5" as="div" sx={{ mb: 0 }}>
94
- Merge pull request{' '}
95
- <Text as="span" sx={{ color: 'muted' }}>
93
+ <Heading variant="h5" as="div" sx={ { mb: 0 } }>
94
+ Merge pull request{ ' ' }
95
+ <Text as="span" sx={ { color: 'muted' } }>
96
96
  #443
97
97
  </Text>
98
98
  </Heading>
99
- <Text sx={{ mb: 0, fontSize: 1, display: 'flex', alignItems: 'center', gap: 1 }}>
99
+ <Text
100
+ as="div"
101
+ sx={ { mb: 0, fontSize: 1, display: 'flex', alignItems: 'center', gap: 1 } }
102
+ >
100
103
  <Avatar
101
- name={item.actor}
104
+ name={ item.actor }
102
105
  src="https://uifaces.co/our-content/donated/n4Ngwvi7.jpg"
103
- size={16}
106
+ size={ 16 }
104
107
  />
105
- {item.actor}
108
+ { item.actor }
106
109
  </Text>
107
- <Text sx={{ mb: 0, fontSize: 1, display: 'flex', alignItems: 'center', gap: 1 }}>
108
- <BiCheckCircle size={16} />
110
+ <Text sx={ { mb: 0, fontSize: 1, display: 'flex', alignItems: 'center', gap: 1 } }>
111
+ <BiCheckCircle size={ 16 } />
109
112
  Deployed in 31s
110
113
  </Text>
111
114
  </Box>
112
- )}
115
+ ) }
113
116
  </ResourceItem>
114
- )}
117
+ ) }
115
118
  />
116
119
  </Box>
117
120
  );
@@ -218,83 +221,86 @@ const deploys = [
218
221
  ];
219
222
 
220
223
  export const Relative = () => (
221
- <Box sx={{ p: 5, pt: 2 }}>
222
- <Heading sx={{ mb: 2 }}>Deploys</Heading>
223
- <Text sx={{ mb: 4 }}>View and manage application deployments.</Text>
224
- <Card variant="indent" sx={{ mb: 4, display: 'flex', flexDirection: 'row-reverse', gap: 1 }}>
225
- {deploys.map( ( deploy, index ) => (
224
+ <Box sx={ { p: 5, pt: 2 } }>
225
+ <Heading sx={ { mb: 2 } }>Deploys</Heading>
226
+ <Text sx={ { mb: 4 } }>View and manage application deployments.</Text>
227
+ <Card variant="indent" sx={ { mb: 4, display: 'flex', flexDirection: 'row-reverse', gap: 1 } }>
228
+ { deploys.map( ( deploy, index ) => (
226
229
  <Box
227
- key={index}
228
- sx={{
230
+ key={ index }
231
+ sx={ {
229
232
  flex: '1 1 auto',
230
233
  width: 10,
231
234
  height: 4,
232
235
  backgroundColor: deploy.status === 'running' ? 'blue.50' : 'green.50',
233
236
  borderRadius: 1,
234
- }}
237
+ } }
235
238
  ></Box>
236
- ) )}
239
+ ) ) }
237
240
  </Card>
238
241
  <ResourceList
239
- items={deploys}
242
+ items={ deploys }
240
243
  dateKey="date"
241
- groupedByDay={false}
242
- renderItem={item => (
244
+ groupedByDay={ false }
245
+ renderItem={ item => (
243
246
  <ResourceItem
244
- item={item}
245
- dateKey={'date'}
246
- relativeTime={true}
247
- timeOnly={true}
248
- renderActions={() => (
249
- <Flex sx={{ alignItems: 'center' }}>
250
- <Button variant="secondary" sx={{ fontSize: 1 }}>
247
+ item={ item }
248
+ dateKey={ 'date' }
249
+ relativeTime={ true }
250
+ timeOnly={ true }
251
+ renderActions={ () => (
252
+ <Flex sx={ { alignItems: 'center' } }>
253
+ <Button variant="secondary" sx={ { fontSize: 1 } }>
251
254
  Rollback
252
255
  </Button>
253
256
  </Flex>
254
- )}
257
+ ) }
255
258
  >
256
- <Flex sx={{ alignItems: 'center', gap: 4 }}>
257
- <Flex sx={{ alignItems: 'center', gap: 3, minWidth: 300 }}>
258
- <Heading variant="h4" as="p" sx={{ mb: 0, fontWeight: 'normal' }}>
259
- {item.title}{' '}
260
- <Text as="span" sx={{ color: 'muted', mb: 0 }}>
261
- {item.id}
259
+ <Flex sx={ { alignItems: 'center', gap: 4 } }>
260
+ <Flex sx={ { alignItems: 'center', gap: 3, minWidth: 300 } }>
261
+ <Heading variant="h4" as="p" sx={ { mb: 0, fontWeight: 'normal' } }>
262
+ { item.title }{ ' ' }
263
+ <Text as="span" sx={ { color: 'muted', mb: 0 } }>
264
+ { item.id }
262
265
  </Text>
263
266
  </Heading>
264
- {item.status === 'running' && <Badge sx={{ mb: 0 }}>Running</Badge>}
267
+ { item.status === 'running' && <Badge sx={ { mb: 0 } }>Running</Badge> }
265
268
  </Flex>
266
- <Text sx={{ mb: 0, color: 'muted', display: 'flex', alignItems: 'center', gap: 2 }}>
269
+ <Text
270
+ as="div"
271
+ sx={ { mb: 0, color: 'muted', display: 'flex', alignItems: 'center', gap: 2 } }
272
+ >
267
273
  <Avatar
268
- name={item.author}
269
- size={16}
274
+ name={ item.author }
275
+ size={ 16 }
270
276
  src="https://randomuser.me/api/portraits/men/46.jpg"
271
277
  />
272
- {item.author}
278
+ { item.author }
273
279
  </Text>
274
280
  <Text
275
- sx={{
281
+ sx={ {
276
282
  mb: 0,
277
283
  color: item.status === 'running' ? 'blue.60' : 'muted',
278
284
  display: 'flex',
279
285
  alignItems: 'center',
280
286
  gap: 1,
281
- }}
287
+ } }
282
288
  >
283
- {item.status === 'running' ? (
289
+ { item.status === 'running' ? (
284
290
  <React.Fragment>
285
- <BiRevision size={16} />
291
+ <BiRevision size={ 16 } />
286
292
  Running for 31s
287
293
  </React.Fragment>
288
294
  ) : (
289
295
  <React.Fragment>
290
- <BiCheckCircle size={16} />
296
+ <BiCheckCircle size={ 16 } />
291
297
  Deployed in 31s
292
298
  </React.Fragment>
293
- )}
299
+ ) }
294
300
  </Text>
295
301
  </Flex>
296
302
  </ResourceItem>
297
- )}
303
+ ) }
298
304
  />
299
305
  </Box>
300
306
  );
@@ -0,0 +1,22 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen } from '@testing-library/react';
5
+ import '@testing-library/jest-dom';
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import ScreenReaderText from './ScreenReaderText';
10
+
11
+ describe( '<ScreenReaderText />', () => {
12
+ it( 'should render correctly', () => {
13
+ const props = {};
14
+ const text = 'Hello there';
15
+ const { container } = render( <ScreenReaderText { ...props }>{ text }</ScreenReaderText> );
16
+ // we're using the querySelector to ensure the class is rendered since it affects the A11Y
17
+ // in case it's removed it could compromise the A11Y of the components using it.
18
+ expect( container.querySelector( '.screen-reader-text' ) ).toBeInTheDocument();
19
+
20
+ expect( screen.queryByText( text ) ).toBeInTheDocument();
21
+ } );
22
+ } );
@@ -0,0 +1,40 @@
1
+ /** @jsxImportSource theme-ui */
2
+ /**
3
+ * External dependencies
4
+ */
5
+
6
+ import PropTypes from 'prop-types';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+
12
+ export default function ScreenReaderText( props ) {
13
+ return (
14
+ <span
15
+ className="screen-reader-text"
16
+ sx={ {
17
+ border: 'none',
18
+ clip: 'rect(1px, 1px, 1px, 1px)',
19
+ clipPath: 'inset(50%)',
20
+ height: '1px',
21
+ margin: '-1px',
22
+ overflow: 'hidden',
23
+ padding: '0',
24
+ position: 'absolute',
25
+ width: '1px',
26
+ wordWrap: 'normal !important',
27
+ } }
28
+ { ...props }
29
+ >
30
+ { props.children }
31
+ </span>
32
+ );
33
+ }
34
+
35
+ /**
36
+ * propTypes
37
+ */
38
+ ScreenReaderText.propTypes = {
39
+ children: PropTypes.node.isRequired,
40
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+
5
+ import { ScreenReaderText } from './ScreenReaderText';
6
+
7
+ export { ScreenReaderText };
@@ -9,13 +9,13 @@ import classNames from 'classnames';
9
9
 
10
10
  const Spinner = ( { sx, className = null, ...props } ) => (
11
11
  <ThemeSpinner
12
- strokeWidth={2}
13
- sx={{
12
+ strokeWidth={ 2 }
13
+ sx={ {
14
14
  fill: 'none',
15
15
  color: 'primary',
16
- }}
16
+ } }
17
17
  className={ classNames( 'vip-spinner-component', className ) }
18
- {...props}
18
+ { ...props }
19
19
  />
20
20
  );
21
21
 
@@ -1,4 +1,3 @@
1
-
2
1
  /**
3
2
  * Internal dependencies
4
3
  */
@@ -8,11 +8,11 @@ import classNames from 'classnames';
8
8
 
9
9
  const Table = ( { sx, className, ...props } ) => (
10
10
  <table
11
- sx={{ width: '100%', minWidth: 1024, ...sx }}
12
- cellPadding={0}
13
- cellSpacing={0}
14
- className={classNames( 'vip-table-component', className )}
15
- {...props}
11
+ sx={ { width: '100%', minWidth: 1024, ...sx } }
12
+ cellPadding={ 0 }
13
+ cellSpacing={ 0 }
14
+ className={ classNames( 'vip-table-component', className ) }
15
+ { ...props }
16
16
  />
17
17
  );
18
18
 
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Internal dependencies
3
3
  */
4
- import { Table, TableRow, Flex, Heading, Text } from '..';
4
+ import { Table, TableRow, Flex, Heading, Text, TableCell } from '..';
5
5
 
6
6
  export default {
7
7
  title: 'Table',
@@ -11,29 +11,59 @@ export default {
11
11
  export const Default = () => (
12
12
  <Table>
13
13
  <thead>
14
- <TableRow head cells={[ 'User', 'Command', 'Duration', 'Time' ]} />
14
+ <TableRow head cells={ [ 'User', 'Command', 'Duration', 'Time' ] } />
15
15
  </thead>
16
16
  <tbody>
17
17
  <TableRow
18
- cells={[
19
- <Flex sx={{ alignItems: 'center' }} key="user">
20
- <Heading variant="h4" sx={{ mb: 0 }}>
18
+ cells={ [
19
+ <Flex sx={ { alignItems: 'center' } } key="user">
20
+ <Heading variant="h4" sx={ { mb: 0 } }>
21
21
  kwaves
22
22
  </Heading>
23
23
  </Flex>,
24
24
  <Heading
25
25
  variant="h4"
26
26
  key="command"
27
- sx={{ mb: 0, display: 'flex', alignItems: 'center' }}
27
+ sx={ { mb: 0, display: 'flex', alignItems: 'center' } }
28
28
  >
29
29
  wp rewrite flush
30
30
  </Heading>,
31
- <Text sx={{ mb: 0 }} key="duration">2s</Text>,
32
- <Text sx={{ mb: 0, color: 'muted' }} key="time">
31
+ <Text sx={ { mb: 0 } } key="duration">
32
+ 2s
33
+ </Text>,
34
+ <Text sx={ { mb: 0, color: 'muted' } } key="time">
33
35
  11th Mar 2020, 16:49:22
34
36
  </Text>,
35
- ]}
37
+ ] }
36
38
  />
39
+ <TableRow>
40
+ <TableCell sx={ { backgroundColor: 'lightgray' } }>
41
+ <Flex sx={ { alignItems: 'center' } } key="user">
42
+ <Heading variant="h4" sx={ { mb: 0 } }>
43
+ simon
44
+ </Heading>
45
+ </Flex>
46
+ </TableCell>
47
+ <TableCell>
48
+ <Heading
49
+ variant="h4"
50
+ key="command"
51
+ sx={ { mb: 0, display: 'flex', alignItems: 'center' } }
52
+ >
53
+ wp posts list
54
+ </Heading>
55
+ </TableCell>
56
+ <TableCell>
57
+ <Text sx={ { mb: 0 } } key="duration">
58
+ 3s
59
+ </Text>
60
+ </TableCell>
61
+ <TableCell>
62
+ <Text sx={ { mb: 0, color: 'muted' } } key="time">
63
+ 3rd May 2021, 13:22:13
64
+ </Text>
65
+ </TableCell>
66
+ </TableRow>
37
67
  </tbody>
38
68
  </Table>
39
69
  );
@@ -0,0 +1,48 @@
1
+ /** @jsxImportSource theme-ui */
2
+
3
+ /**
4
+ * External dependencies
5
+ */
6
+
7
+ import PropTypes from 'prop-types';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import { Heading, Box } from '../';
13
+
14
+ const TableCell = ( { head, children, ...rest } ) => {
15
+ const sx = {
16
+ borderBottom: '1px solid',
17
+ borderTop: head ? '1px solid' : 'none',
18
+ // borderColor should come after borderTop so it can override it
19
+ borderColor: 'border',
20
+ fontWeight: 'body',
21
+ px: 3,
22
+ py: 2,
23
+ textAlign: 'left',
24
+ '&:first-of-type': {
25
+ pl: 5,
26
+ },
27
+ ...rest.sx,
28
+ };
29
+
30
+ return (
31
+ <Box as={ head ? 'th' : 'td' } { ...{ ...rest, sx } }>
32
+ { head ? (
33
+ <Heading variant="caps" as="div" sx={ { mb: 0 } }>
34
+ { children }
35
+ </Heading>
36
+ ) : (
37
+ children
38
+ ) }
39
+ </Box>
40
+ );
41
+ };
42
+
43
+ TableCell.propTypes = {
44
+ children: PropTypes.node,
45
+ head: PropTypes.bool,
46
+ };
47
+
48
+ export { TableCell };
@@ -9,9 +9,9 @@ import PropTypes from 'prop-types';
9
9
  /**
10
10
  * Internal dependencies
11
11
  */
12
- import { Heading, Box } from '../';
12
+ import { TableCell } from './TableCell';
13
13
 
14
- const TableRow = ( { onClick, head = false, rowHead = false, cells } ) => {
14
+ const TableRow = ( { onClick, head = false, cells = [], children } ) => {
15
15
  const hoverStyles = onClick
16
16
  ? { cursor: 'pointer', '&:hover': { bg: 'hover', borderRadius: 2 } }
17
17
  : {};
@@ -30,58 +30,21 @@ const TableRow = ( { onClick, head = false, rowHead = false, cells } ) => {
30
30
  onKeyDown={ handleKeyPress }
31
31
  >
32
32
  { cells.map( ( cell, index ) => (
33
- <TableCell key={ index } cell={ cell } head={ head } isRowHead={ index === 0 && rowHead } />
33
+ <TableCell key={ index } head={ head }>
34
+ { cell }
35
+ </TableCell>
34
36
  ) ) }
35
- </tr>
36
- );
37
- };
38
37
 
39
- const TableCell = ( { head, isRowHead, cell } ) => {
40
- let scope = null;
41
- if ( head ) {
42
- scope = 'col';
43
- } else if ( isRowHead ) {
44
- scope = 'row';
45
- }
46
- return (
47
- <Box
48
- as={ isRowHead || head ? 'th' : 'td' }
49
- scope={ scope }
50
- sx={ {
51
- px: 3,
52
- py: 2,
53
- textAlign: 'left',
54
- borderBottom: '1px solid',
55
- fontWeight: 'body',
56
- borderTop: head ? '1px solid' : 'none',
57
- borderColor: 'border',
58
- '&:first-of-type': {
59
- pl: 5,
60
- },
61
- } }
62
- >
63
- { head ? (
64
- <Heading variant="caps" as="div" sx={ { mb: 0 } }>
65
- { cell }
66
- </Heading>
67
- ) : (
68
- cell
69
- ) }
70
- </Box>
38
+ { children }
39
+ </tr>
71
40
  );
72
41
  };
73
42
 
74
- TableCell.propTypes = {
75
- head: PropTypes.bool,
76
- isRowHead: PropTypes.bool,
77
- cell: PropTypes.node,
78
- };
79
-
80
43
  TableRow.propTypes = {
81
- onClick: PropTypes.func,
82
- head: PropTypes.bool,
83
44
  cells: PropTypes.array,
84
- rowHead: PropTypes.bool,
45
+ children: PropTypes.node,
46
+ head: PropTypes.bool,
47
+ onClick: PropTypes.func,
85
48
  };
86
49
 
87
50
  export { TableRow };
@@ -1,8 +1,8 @@
1
-
2
1
  /**
3
2
  * Internal dependencies
4
3
  */
5
4
  import { Table } from './Table';
6
5
  import { TableRow } from './TableRow';
6
+ import { TableCell } from './TableCell';
7
7
 
8
- export { Table, TableRow };
8
+ export { Table, TableRow, TableCell };
@@ -14,15 +14,15 @@ import { Flex } from '..';
14
14
  const Tabs = ( { className = null, sx, ...props } ) => (
15
15
  <Flex
16
16
  className={ classNames( 'vip-tabs-component', className ) }
17
- sx={{
17
+ sx={ {
18
18
  borderBottom: '1px solid',
19
19
  borderColor: 'border',
20
20
  listStyleType: 'none',
21
21
  margin: 0,
22
22
  padding: 0,
23
23
  ...sx,
24
- }}
25
- {...props}
24
+ } }
25
+ { ...props }
26
26
  />
27
27
  );
28
28
 
@@ -1,4 +1,3 @@
1
-
2
1
  /**
3
2
  * Internal dependencies
4
3
  */
@@ -10,13 +10,13 @@ import classNames from 'classnames';
10
10
  const Text = ( { sx, className = null, ...props } ) => (
11
11
  <ThemeText
12
12
  as="p"
13
- sx={{
13
+ sx={ {
14
14
  lineHeight: 1.5,
15
15
  marginBottom: 2,
16
16
  ...sx,
17
- }}
17
+ } }
18
18
  className={ classNames( 'vip-text-component', className ) }
19
- {...props}
19
+ { ...props }
20
20
  />
21
21
  );
22
22
 
@@ -10,11 +10,9 @@ export default {
10
10
 
11
11
  export const Default = () => (
12
12
  <Text>
13
- Apparently we had reached a great height in the atmosphere, for the sky
14
- was a dead black, and the stars had ceased to twinkle. By the same
15
- illusion which lifts the horizon of the sea to the level of the
16
- spectator on a hillside, the sable cloud beneath was dished out, and the
17
- car seemed to float in the middle of an immense dark sphere, whose upper
18
- half was strewn with silver.{' '}
13
+ Apparently we had reached a great height in the atmosphere, for the sky was a dead black, and
14
+ the stars had ceased to twinkle. By the same illusion which lifts the horizon of the sea to the
15
+ level of the spectator on a hillside, the sable cloud beneath was dished out, and the car seemed
16
+ to float in the middle of an immense dark sphere, whose upper half was strewn with silver.{ ' ' }
19
17
  </Text>
20
18
  );
@@ -1,4 +1,3 @@
1
-
2
1
  /**
3
2
  * Internal dependencies
4
3
  */
@@ -17,16 +17,12 @@ export const Default = () => (
17
17
  <React.Fragment>
18
18
  <Grid gap={ 2 } columns={ [ 2, '100px 300px' ] } sx={ { mb: '20px' } }>
19
19
  <Time time="7pm" />
20
- <Box>
21
- It looks like everything is recovered now. You can forget about the last event.
22
- </Box>
20
+ <Box>It looks like everything is recovered now. You can forget about the last event.</Box>
23
21
  </Grid>
24
22
 
25
23
  <Grid gap={ 2 } columns={ [ 2, '100px 200px' ] }>
26
24
  <Time time="6pm" />
27
- <Box>
28
- At this particular moment in the day, something happened with your environment.
29
- </Box>
25
+ <Box>At this particular moment in the day, something happened with your environment.</Box>
30
26
  </Grid>
31
27
  </React.Fragment>
32
28
  );
@@ -44,19 +44,19 @@ const Time = ( { time, relativeTime = false, timeOnly = false, className = null,
44
44
 
45
45
  return (
46
46
  <Text
47
- title={time.toLocaleString( 'sv', { timeZoneName: 'short' } )}
48
- datetime={time}
47
+ title={ time.toLocaleString( 'sv', { timeZoneName: 'short' } ) }
48
+ datetime={ time }
49
49
  as="time"
50
50
  className={ classNames( 'vip-time-component', className ) }
51
- {...props}
51
+ { ...props }
52
52
  >
53
- {formattedTime}
53
+ { formattedTime }
54
54
  </Text>
55
55
  );
56
56
  };
57
57
 
58
58
  Time.propTypes = {
59
- time: PropTypes.string,
59
+ time: PropTypes.oneOfType( [ PropTypes.string, PropTypes.instanceOf( Date ) ] ),
60
60
  timeOnly: PropTypes.bool,
61
61
  relativeTime: PropTypes.bool,
62
62
  className: PropTypes.any,