@bundle-stats/ui 3.3.0-alpha.1 → 3.4.0-alpha.1

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 (178) hide show
  1. package/CHANGELOG.md +94 -13
  2. package/lib/app/app.js +137 -102
  3. package/lib/app/app.module.css +11 -4
  4. package/lib/app/header/header.js +1 -10
  5. package/lib/components/asset-info/asset-info.module.css +1 -0
  6. package/lib/components/bundle-assets/bundle-assets.js +104 -52
  7. package/lib/components/bundle-assets/bundle-assets.module.css +24 -26
  8. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +13 -3
  9. package/lib/components/bundle-modules/bundle-modules.js +53 -67
  10. package/lib/components/bundle-packages/bundle-packages.js +100 -44
  11. package/lib/components/bundle-packages/bundle-packages.module.css +17 -21
  12. package/lib/components/delta/delta.module.css +1 -0
  13. package/lib/components/job-header/job-header.js +3 -1
  14. package/lib/components/job-header/job-header.module.css +6 -8
  15. package/lib/components/jobs-header/jobs-header.module.css +5 -0
  16. package/lib/components/metrics-table/metrics-table.js +72 -59
  17. package/lib/components/metrics-table/metrics-table.module.css +18 -7
  18. package/lib/components/metrics-table-search/metrics-table-search.module.css +5 -4
  19. package/lib/components/metrics-table-title/metrics-table-title.js +9 -7
  20. package/lib/components/metrics-table-title/metrics-table-title.module.css +2 -0
  21. package/lib/components/module-info/module-info.js +2 -2
  22. package/lib/components/module-info/module-info.module.css +1 -0
  23. package/lib/components/summary/summary.js +1 -1
  24. package/lib/components/summary-item/summary-item.js +15 -18
  25. package/lib/components/summary-item/summary-item.module.css +1 -23
  26. package/lib/components/total-size-type-title/total-size-type-title.js +7 -3
  27. package/lib/css/default.css +14 -3
  28. package/lib/css/variables.css +17 -17
  29. package/lib/hooks/search-params.js +31 -31
  30. package/lib/layout/box/box.module.css +9 -0
  31. package/lib/layout/footer/footer.module.css +1 -1
  32. package/lib/layout/index.js +8 -0
  33. package/lib/layout/separator.js +48 -0
  34. package/lib/layout/separator.module.css +5 -0
  35. package/lib/ui/dropdown/dropdown.js +21 -26
  36. package/lib/ui/dropdown/dropdown.module.css +11 -12
  37. package/lib/ui/dropdown/dropdown.stories.js +2 -9
  38. package/lib/ui/empty-set/empty-set.js +5 -4
  39. package/lib/ui/empty-set/empty-set.module.css +2 -2
  40. package/lib/ui/filters/filters.container.js +1 -1
  41. package/lib/ui/filters/filters.js +22 -7
  42. package/lib/ui/filters/filters.module.css +3 -3
  43. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js +1 -1
  44. package/lib/ui/hover-card/hover-card.js +102 -0
  45. package/lib/ui/hover-card/hover-card.module.css +29 -0
  46. package/lib/ui/hover-card/hover-card.stories.js +56 -0
  47. package/lib/ui/hover-card/index.js +18 -0
  48. package/lib/ui/icon/icon.js +6 -6
  49. package/lib/ui/icon/icon.module.css +1 -0
  50. package/lib/ui/index.js +8 -8
  51. package/lib/ui/table/table.js +5 -74
  52. package/lib/ui/table/table.module.css +41 -25
  53. package/lib/ui/table/table.stories.js +1 -1
  54. package/lib/ui/{popover → tag}/index.js +4 -4
  55. package/lib/ui/tag/tag.js +72 -0
  56. package/lib/ui/tag/tag.module.css +55 -0
  57. package/lib/ui/tag/tag.stories.js +38 -0
  58. package/lib/ui/tooltip/tooltip.js +10 -9
  59. package/lib/ui/tooltip/tooltip.module.css +2 -1
  60. package/lib-esm/app/app.js +132 -102
  61. package/lib-esm/app/app.module.css +11 -4
  62. package/lib-esm/app/header/header.js +1 -9
  63. package/lib-esm/components/asset-info/asset-info.module.css +1 -0
  64. package/lib-esm/components/bundle-assets/bundle-assets.js +97 -56
  65. package/lib-esm/components/bundle-assets/bundle-assets.module.css +24 -26
  66. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +7 -3
  67. package/lib-esm/components/bundle-modules/bundle-modules.js +35 -50
  68. package/lib-esm/components/bundle-packages/bundle-packages.js +88 -41
  69. package/lib-esm/components/bundle-packages/bundle-packages.module.css +17 -21
  70. package/lib-esm/components/delta/delta.module.css +1 -0
  71. package/lib-esm/components/job-header/job-header.js +2 -1
  72. package/lib-esm/components/job-header/job-header.module.css +6 -8
  73. package/lib-esm/components/jobs-header/jobs-header.module.css +5 -0
  74. package/lib-esm/components/metrics-table/metrics-table.js +61 -53
  75. package/lib-esm/components/metrics-table/metrics-table.module.css +18 -7
  76. package/lib-esm/components/metrics-table-search/metrics-table-search.module.css +5 -4
  77. package/lib-esm/components/metrics-table-title/metrics-table-title.js +8 -7
  78. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +2 -0
  79. package/lib-esm/components/module-info/module-info.js +2 -2
  80. package/lib-esm/components/module-info/module-info.module.css +1 -0
  81. package/lib-esm/components/summary/summary.js +1 -1
  82. package/lib-esm/components/summary-item/summary-item.js +14 -18
  83. package/lib-esm/components/summary-item/summary-item.module.css +1 -23
  84. package/lib-esm/components/total-size-type-title/total-size-type-title.js +6 -3
  85. package/lib-esm/css/default.css +14 -3
  86. package/lib-esm/css/variables.css +17 -17
  87. package/lib-esm/hooks/search-params.js +27 -28
  88. package/lib-esm/layout/box/box.module.css +9 -0
  89. package/lib-esm/layout/footer/footer.module.css +1 -1
  90. package/lib-esm/layout/index.js +1 -0
  91. package/lib-esm/layout/separator.js +28 -0
  92. package/lib-esm/layout/separator.module.css +5 -0
  93. package/lib-esm/ui/dropdown/dropdown.js +20 -25
  94. package/lib-esm/ui/dropdown/dropdown.module.css +11 -12
  95. package/lib-esm/ui/dropdown/dropdown.stories.js +2 -7
  96. package/lib-esm/ui/empty-set/empty-set.js +4 -4
  97. package/lib-esm/ui/empty-set/empty-set.module.css +2 -2
  98. package/lib-esm/ui/filters/filters.js +20 -5
  99. package/lib-esm/ui/filters/filters.module.css +3 -3
  100. package/lib-esm/ui/hover-card/hover-card.js +83 -0
  101. package/lib-esm/ui/hover-card/hover-card.module.css +29 -0
  102. package/lib-esm/ui/hover-card/hover-card.stories.js +35 -0
  103. package/lib-esm/ui/hover-card/index.js +1 -0
  104. package/lib-esm/ui/icon/icon.js +3 -3
  105. package/lib-esm/ui/icon/icon.module.css +1 -0
  106. package/lib-esm/ui/index.js +1 -1
  107. package/lib-esm/ui/table/table.js +5 -65
  108. package/lib-esm/ui/table/table.module.css +41 -25
  109. package/lib-esm/ui/table/table.stories.js +1 -1
  110. package/lib-esm/ui/tag/index.js +1 -0
  111. package/lib-esm/ui/tag/tag.js +45 -0
  112. package/lib-esm/ui/tag/tag.module.css +55 -0
  113. package/lib-esm/ui/tag/tag.stories.js +23 -0
  114. package/lib-esm/ui/tooltip/tooltip.js +10 -9
  115. package/lib-esm/ui/tooltip/tooltip.module.css +2 -1
  116. package/package.json +33 -31
  117. package/src/app/app.jsx +142 -145
  118. package/src/app/app.module.css +11 -4
  119. package/src/app/header/header.jsx +0 -10
  120. package/src/components/asset-info/asset-info.module.css +1 -0
  121. package/src/components/bundle-assets/bundle-assets.jsx +85 -31
  122. package/src/components/bundle-assets/bundle-assets.module.css +24 -26
  123. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +2 -0
  124. package/src/components/bundle-modules/bundle-modules.jsx +36 -36
  125. package/src/components/bundle-packages/bundle-packages.jsx +89 -39
  126. package/src/components/bundle-packages/bundle-packages.module.css +17 -21
  127. package/src/components/delta/delta.module.css +1 -0
  128. package/src/components/job-header/job-header.jsx +2 -1
  129. package/src/components/job-header/job-header.module.css +6 -8
  130. package/src/components/jobs-header/jobs-header.module.css +5 -0
  131. package/src/components/metrics-table/metrics-table.jsx +53 -44
  132. package/src/components/metrics-table/metrics-table.module.css +18 -7
  133. package/src/components/metrics-table-search/metrics-table-search.module.css +5 -4
  134. package/src/components/metrics-table-title/metrics-table-title.jsx +20 -21
  135. package/src/components/metrics-table-title/metrics-table-title.module.css +2 -0
  136. package/src/components/module-info/module-info.jsx +3 -7
  137. package/src/components/module-info/module-info.module.css +1 -0
  138. package/src/components/summary/summary.jsx +1 -1
  139. package/src/components/summary-item/summary-item.jsx +21 -27
  140. package/src/components/summary-item/summary-item.module.css +1 -23
  141. package/src/components/total-size-type-title/total-size-type-title.jsx +6 -9
  142. package/src/css/default.css +14 -3
  143. package/src/css/variables.css +17 -17
  144. package/src/hooks/search-params.js +42 -33
  145. package/src/layout/box/box.module.css +9 -0
  146. package/src/layout/footer/footer.module.css +1 -1
  147. package/src/layout/index.js +1 -0
  148. package/src/layout/separator.jsx +25 -0
  149. package/src/layout/separator.module.css +5 -0
  150. package/src/ui/dropdown/dropdown.jsx +16 -22
  151. package/src/ui/dropdown/dropdown.module.css +11 -12
  152. package/src/ui/empty-set/empty-set.jsx +25 -21
  153. package/src/ui/empty-set/empty-set.module.css +2 -2
  154. package/src/ui/filters/filters.jsx +64 -53
  155. package/src/ui/filters/filters.module.css +3 -3
  156. package/src/ui/hover-card/hover-card.jsx +73 -0
  157. package/src/ui/hover-card/hover-card.module.css +29 -0
  158. package/src/ui/hover-card/index.js +1 -0
  159. package/src/ui/icon/icon.jsx +11 -7
  160. package/src/ui/icon/icon.module.css +1 -0
  161. package/src/ui/index.js +1 -1
  162. package/src/ui/table/table.jsx +5 -52
  163. package/src/ui/table/table.module.css +41 -25
  164. package/src/ui/tag/index.js +1 -0
  165. package/src/ui/tag/tag.jsx +49 -0
  166. package/src/ui/tag/tag.module.css +55 -0
  167. package/src/ui/tooltip/tooltip.jsx +10 -14
  168. package/src/ui/tooltip/tooltip.module.css +2 -1
  169. package/lib/ui/popover/popover.js +0 -92
  170. package/lib/ui/popover/popover.module.css +0 -66
  171. package/lib/ui/popover/popover.stories.js +0 -26
  172. package/lib-esm/ui/popover/index.js +0 -1
  173. package/lib-esm/ui/popover/popover.js +0 -71
  174. package/lib-esm/ui/popover/popover.module.css +0 -66
  175. package/lib-esm/ui/popover/popover.stories.js +0 -14
  176. package/src/ui/popover/index.js +0 -1
  177. package/src/ui/popover/popover.jsx +0 -79
  178. package/src/ui/popover/popover.module.css +0 -66
@@ -1,22 +1,20 @@
1
1
  .title {
2
+ font-size: var(--size-xlarge);
2
3
  line-height: 1;
3
4
  font-weight: bold;
4
5
  vertical-align: top;
5
6
  }
6
7
 
7
8
  .tag {
8
- padding: var(--space-xxxsmall);
9
- margin-left: var(--space-xxxsmall);
10
- background-color: var(--color-highlight);
11
- color: var(--color-text-light);
12
- display: inline-block;
13
- font-size: 9px;
14
- line-height: var(--space-xxsmall);
15
- font-weight: normal;
9
+ margin-left: var(--space-xxsmall);
16
10
  vertical-align: top;
11
+ outline: 1px solid var(--color-outline);
12
+ background: var(--color-highlight);
13
+ color: var(--color-text-light);
17
14
  }
18
15
 
19
16
  .meta {
17
+ font-size: var(--size-small);
20
18
  color: var(--color-text-light);
21
19
  }
22
20
 
@@ -9,3 +9,8 @@
9
9
  padding: 0 var(--space-medium);
10
10
  border-left: 1px solid var(--color-outline);
11
11
  }
12
+
13
+ .item:first-child {
14
+ border-left: 0;
15
+ padding-left: 0;
16
+ }
@@ -12,7 +12,8 @@ import styles from './metrics-table.module.css';
12
12
 
13
13
  const METRIC_TYPE_DATA = getGlobalMetricType(null, METRIC_TYPE_FILE_SIZE);
14
14
 
15
- const getRowsRunTotal = (rows, runIndex) => sum(rows.map((row) => get(row, `runs[${runIndex}].value`, 0)));
15
+ const getRowsRunTotal = (rows, runIndex) =>
16
+ sum(rows.map((row) => get(row, `runs[${runIndex}].value`, 0)));
16
17
 
17
18
  const getHeaderLabelCells = (rows) => (run, runIndex, runs) => {
18
19
  const isBaseline = runIndex === runs.length - 1;
@@ -102,46 +103,58 @@ const getHeaderRows = (runs, items, showHeaderSum, title) => [
102
103
  : []),
103
104
  ];
104
105
 
105
- const generateRowCells = (item, index, items) => {
106
- const isBaseline = index === items.length - 1;
106
+ const MetricsTableRow = ({ item, renderRowHeader }) => (
107
+ <Table.Tr className={cx(!item.changed && styles.unchanged)}>
108
+ <Table.Th className={styles.metricName}>{renderRowHeader(item)}</Table.Th>
107
109
 
108
- // eslint-disable-next-line react/destructuring-assignment
109
- if (!item || typeof item.value === 'undefined') {
110
- return ['-', ...(!isBaseline ? [''] : [])];
111
- }
110
+ {item.runs.map((run, index) => {
111
+ const isBaseline = index === item.runs.length - 1;
112
+ const valueClassName = cx(styles.value, !isBaseline && styles.current);
112
113
 
113
- const { displayValue, deltaPercentage, displayDeltaPercentage, deltaType } = item;
114
+ // Empty cells if no value
115
+ if (!run || typeof run.value === 'undefined') {
116
+ return (
117
+ <>
118
+ <Table.Td className={valueClassName}>-</Table.Td>
119
+ {!isBaseline && <Table.Td className={styles.delta} />}
120
+ </>
121
+ );
122
+ }
114
123
 
115
- const cells = [<Metric value={displayValue} />];
124
+ const { displayValue, deltaPercentage, displayDeltaPercentage, deltaType } = run;
116
125
 
117
- if (!isBaseline) {
118
- cells.push(
119
- typeof deltaPercentage === 'number' && (
120
- <Delta displayValue={displayDeltaPercentage} deltaType={deltaType} />
121
- ),
122
- );
123
- }
126
+ return (
127
+ <>
128
+ <Table.Td className={valueClassName}>
129
+ <Metric value={displayValue} />
130
+ </Table.Td>
131
+ {!isBaseline && typeof deltaPercentage === 'number' && (
132
+ <Table.Td className={styles.delta}>
133
+ <Delta displayValue={displayDeltaPercentage} deltaType={deltaType} />
134
+ </Table.Td>
135
+ )}
136
+ </>
137
+ );
138
+ })}
139
+ </Table.Tr>
140
+ );
124
141
 
125
- return cells;
142
+ MetricsTableRow.propTypes = {
143
+ item: PropTypes.shape({
144
+ changed: PropTypes.bool,
145
+ runs: PropTypes.arrayOf(
146
+ PropTypes.shape({
147
+ value: PropTypes.number,
148
+ displayValue: PropTypes.string,
149
+ deltaPercentage: PropTypes.number,
150
+ displayDeltaPercentage: PropTypes.string,
151
+ deltaType: PropTypes.string,
152
+ }),
153
+ ),
154
+ }).isRequired,
155
+ renderRowHeader: PropTypes.func.isRequired,
126
156
  };
127
157
 
128
- const getRows = (runs, items, renderRowHeader) =>
129
- items.map((item, index) => {
130
- const { changed } = item;
131
-
132
- return {
133
- key: item?.key || index,
134
- className: changed ? '' : styles.unchanged,
135
- cells: [
136
- // Metric name
137
- renderRowHeader(item),
138
-
139
- // Metric item values
140
- ...item.runs.map(generateRowCells).flat(),
141
- ],
142
- };
143
- });
144
-
145
158
  export const MetricsTable = ({
146
159
  className,
147
160
  renderRowHeader,
@@ -151,9 +164,11 @@ export const MetricsTable = ({
151
164
  showHeaderSum,
152
165
  headerRows,
153
166
  title,
167
+ ...restProps
154
168
  }) => {
155
169
  const { headers, columnClassNames } = useMemo(() => {
156
170
  const headerColumns = getHeaderRows(runs, items, showHeaderSum, title);
171
+
157
172
  return {
158
173
  headers: [...headerRows, ...headerColumns],
159
174
  // First header row has the column class names
@@ -161,8 +176,6 @@ export const MetricsTable = ({
161
176
  };
162
177
  }, [headerRows, runs, items, showHeaderSum, title]);
163
178
 
164
- const rows = useMemo(() => getRows(runs, items, renderRowHeader), [runs, items, renderRowHeader]);
165
-
166
179
  const rootClassName = cx(
167
180
  styles.root,
168
181
  className,
@@ -171,7 +184,7 @@ export const MetricsTable = ({
171
184
  );
172
185
 
173
186
  return (
174
- <Table className={rootClassName} compact>
187
+ <Table className={rootClassName} compact {...restProps}>
175
188
  <Table.THead>
176
189
  {headers.map((headerRow) => {
177
190
  const { cells, className: rowClassName } = headerRow.cells
@@ -188,13 +201,9 @@ export const MetricsTable = ({
188
201
  })}
189
202
  </Table.THead>
190
203
  <Table.TBody>
191
- {!isEmpty(rows) ? (
192
- rows.map(({ key, className: rowClassName, cells }) => (
193
- <Table.Tr key={key} className={rowClassName}>
194
- {cells.map((cell, index) => (
195
- <Table.Td className={columnClassNames[index]}>{cell}</Table.Td>
196
- ))}
197
- </Table.Tr>
204
+ {!isEmpty(items) ? (
205
+ items.map((item) => (
206
+ <MetricsTableRow key={item.key} item={item} renderRowHeader={renderRowHeader} />
198
207
  ))
199
208
  ) : (
200
209
  <Table.Tr>
@@ -1,11 +1,11 @@
1
- .jobName a {
1
+ .root a {
2
2
  color: inherit;
3
3
  text-decoration: none;
4
4
  }
5
5
 
6
- .jobName a:hover,
7
- .jobName a:active,
8
- .jobName a:focus {
6
+ .root a:hover,
7
+ .root a:active,
8
+ .root a:focus {
9
9
  color: var(--color-primary);
10
10
  text-decoration: underline;
11
11
  }
@@ -15,21 +15,31 @@
15
15
  width: 100%;
16
16
  }
17
17
 
18
- .value {
18
+ .root .value {
19
19
  padding-left: var(--space-large);
20
20
  text-align: right;
21
+ vertical-align: baseline;
21
22
  }
22
23
 
23
- .delta {
24
+ .root .delta {
24
25
  padding-left: 0;
25
26
  text-align: left;
26
27
  font-size: var(--size-xsmall);
28
+ vertical-align: baseline;
27
29
  }
28
30
 
29
- .value.current {
31
+ .root tbody .delta {
32
+ line-height: 1.6rem; /* baseline alignment with the value */
33
+ }
34
+
35
+ .root .value.current {
30
36
  padding-right: var(--space-xxsmall);
31
37
  }
32
38
 
39
+ .jobName {
40
+ white-space: nowrap;
41
+ }
42
+
33
43
  /* columns overrides for showHeaderSum */
34
44
  .showHeaderSum .headerRowColumns .value,
35
45
  .showHeaderSum .headerRowColumns .delta {
@@ -45,6 +55,7 @@
45
55
  }
46
56
 
47
57
  /** rows */
58
+ .multipleRuns .unchanged th,
48
59
  .multipleRuns .unchanged td {
49
60
  color: var(--color-text-light);
50
61
  }
@@ -5,6 +5,7 @@
5
5
  }
6
6
 
7
7
  .input {
8
+ border-radius: var(--radius-small);
8
9
  height: var(--space-large);
9
10
  border-color: var(--color-outline);
10
11
  }
@@ -21,12 +22,12 @@
21
22
  cursor: pointer;
22
23
  border-radius: 50%;
23
24
  position: absolute;
24
- right: 0;
25
+ right: 2px;
25
26
  top: 50%;
26
27
  transform: translateY(-50%);
27
- padding: var(--space-xxsmall);
28
- width: var(--space-large);
29
- height: var(--space-large);
28
+ padding: var(--space-xxxsmall);
29
+ width: var(--space-medium);
30
+ height: var(--space-medium);
30
31
  background: radial-gradient(var(--color-background) 50%, transparent);
31
32
  color: var(--color-text-ultra-light);
32
33
  transition: var(--transition-in);
@@ -5,7 +5,8 @@ import cx from 'classnames';
5
5
  import I18N from '../../i18n';
6
6
  import { FlexStack } from '../../layout/flex-stack';
7
7
  import { Stack } from '../../layout/stack';
8
- import { Popover } from '../../ui/popover';
8
+ import { Icon } from '../../ui/icon';
9
+ import { HoverCard } from '../../ui/hover-card';
9
10
  import css from './metrics-table-title.module.css';
10
11
 
11
12
  export const MetricsTableTitle = (props) => {
@@ -13,26 +14,24 @@ export const MetricsTableTitle = (props) => {
13
14
  const rootClassName = cx(css.root, className);
14
15
 
15
16
  return (
16
- <Stack space="xxxsmall" className={rootClassName}>
17
- <FlexStack space="xxxsmall">
18
- <span>{title}</span>
19
- {info && <span className={css.info}>{info}</span>}
20
- {(popoverInfo || popoverHref) && (
21
- <Popover icon="help">
22
- <Stack space="xxxsmall">
23
- {popoverInfo && <p>{popoverInfo}</p>}
24
- {popoverHref && (
25
- <p>
26
- <a href={popoverHref} target="_blank" rel="noreferrer">
27
- {I18N.READ_MORE}
28
- </a>
29
- </p>
30
- )}
31
- </Stack>
32
- </Popover>
33
- )}
34
- </FlexStack>
35
- </Stack>
17
+ <FlexStack space="xxxsmall" className={rootClassName}>
18
+ <span>{title}</span>
19
+ {info && <span className={css.info}>{info}</span>}
20
+ {(popoverInfo || popoverHref) && (
21
+ <HoverCard label={<Icon glyph="help" />}>
22
+ <Stack space="xxxsmall">
23
+ {popoverInfo && <p>{popoverInfo}</p>}
24
+ {popoverHref && (
25
+ <p>
26
+ <a href={popoverHref} target="_blank" rel="noreferrer">
27
+ {I18N.READ_MORE}
28
+ </a>
29
+ </p>
30
+ )}
31
+ </Stack>
32
+ </HoverCard>
33
+ )}
34
+ </FlexStack>
36
35
  );
37
36
  };
38
37
 
@@ -1,5 +1,7 @@
1
1
  .root {
2
+ align-items: center;
2
3
  font-weight: bold;
4
+ line-height: var(--space-small);
3
5
  text-transform: uppercase;
4
6
  color: var(--color-text-light);
5
7
  }
@@ -20,7 +20,7 @@ export const ModuleInfo = (props) => {
20
20
  } = props;
21
21
 
22
22
  return (
23
- <Stack space="small" className={className}>
23
+ <Stack space="xsmall" className={className}>
24
24
  {item.runs.map((run, index) => {
25
25
  const TitleComponent = index !== 0 ? 'h4' : 'h3';
26
26
  const key = `module-info-${run?.name || index}-${index}`;
@@ -30,7 +30,7 @@ export const ModuleInfo = (props) => {
30
30
  <TitleComponent>{labels[index]}</TitleComponent>
31
31
  {index === 0 && !isEmpty(run?.chunkIds) && (
32
32
  <div className={css.chunks}>
33
- <strong className={css.chunksTitle}>Chunks:</strong>
33
+ <span className={css.chunksTitle}>Chunks:</span>
34
34
  {run.chunkIds.map((chunkId) => {
35
35
  const chunk = find(chunks, { id: chunkId });
36
36
 
@@ -51,11 +51,7 @@ export const ModuleInfo = (props) => {
51
51
  </div>
52
52
  )}
53
53
 
54
- <FileName
55
- className={css.fileName}
56
- as="code"
57
- name={run?.name || '-'}
58
- />
54
+ <FileName className={css.fileName} as="code" name={run?.name || '-'} />
59
55
  </Stack>
60
56
  );
61
57
  })}
@@ -15,6 +15,7 @@
15
15
  }
16
16
 
17
17
  .fileName {
18
+ max-width: 100%;
18
19
  padding: 2px;
19
20
  background: var(--color-highlight-warning);
20
21
  }
@@ -34,7 +34,7 @@ export const Summary = ({
34
34
  size={size}
35
35
  id={metricId}
36
36
  data={get(data, metricId)}
37
- budget={get(budgets, metricId)}
37
+ budget={get(budgets, getSourceMetricId(metricId))}
38
38
  loading={loading}
39
39
  showMetricDescription
40
40
  showDelta={showSummaryItemDelta && metricOptions.showDelta !== false}
@@ -3,7 +3,8 @@ import PropTypes from 'prop-types';
3
3
  import cx from 'classnames';
4
4
  import { getGlobalMetricType, getMetricRunInfo } from '@bundle-stats/utils';
5
5
 
6
- import { Popover } from '../../ui/popover';
6
+ import { HoverCard } from '../../ui/hover-card';
7
+ import { Icon } from '../../ui/icon';
7
8
  import { Skeleton } from '../../ui/skeleton';
8
9
  import { Stack } from '../../layout/stack';
9
10
  import { FlexStack } from '../../layout/flex-stack';
@@ -12,32 +13,25 @@ import { Delta } from '../delta';
12
13
  import { BudgetInfo } from '../budget-info';
13
14
  import css from './summary-item.module.css';
14
15
 
15
- const MetricInfoPopover = ({ description, url }) => {
16
- // Workaround cases where the parent is a link
17
- const readMoreOnClick = () => {
18
- window.open(url);
19
- };
20
-
21
- return (
22
- <Stack space="xxxsmall">
23
- <p>{description}</p>
24
- {url && (
25
- <p>
26
- <button type="button" className={css.readMoreBtn} onClick={readMoreOnClick}>
27
- Read more
28
- </button>
29
- </p>
30
- )}
31
- </Stack>
32
- );
33
- };
34
-
35
- MetricInfoPopover.propTypes = {
16
+ const MetricInfo = ({ description, url }) => (
17
+ <Stack space="xxxsmall">
18
+ <p>{description}</p>
19
+ {url && (
20
+ <p>
21
+ <a href={url} className={css.readMoreLink}>
22
+ Read more
23
+ </a>
24
+ </p>
25
+ )}
26
+ </Stack>
27
+ );
28
+
29
+ MetricInfo.propTypes = {
36
30
  description: PropTypes.string.isRequired,
37
31
  url: PropTypes.string,
38
32
  };
39
33
 
40
- MetricInfoPopover.defaultProps = {
34
+ MetricInfo.defaultProps = {
41
35
  url: '',
42
36
  };
43
37
 
@@ -61,14 +55,14 @@ export const SummaryItem = ({
61
55
  const rootClassName = cx(css.root, className, css[size], showDelta && css.showDelta);
62
56
 
63
57
  return (
64
- <Stack space="xxsmall" as={Component} className={rootClassName} {...props}>
58
+ <Stack space="xxxsmall" as={Component} className={rootClassName} {...props}>
65
59
  <FlexStack as="h3" space="xxxsmall" className={css.title}>
66
60
  <span className={css.titleLabel}>{metric.label}</span>
67
61
 
68
62
  {showMetricDescriptionTooltip && (
69
- <Popover className={css.icon} icon="help">
70
- <MetricInfoPopover {...metric} />
71
- </Popover>
63
+ <HoverCard className={css.icon} label={<Icon glyph="help" />}>
64
+ <MetricInfo {...metric} />
65
+ </HoverCard>
72
66
  )}
73
67
 
74
68
  {budget && <BudgetInfo className={css.budgetInfo} metricId={id} budgetInsight={budget} />}
@@ -4,6 +4,7 @@
4
4
  }
5
5
 
6
6
  .title {
7
+ align-items: center;
7
8
  color: var(--color-text-ultra-light);
8
9
  font-weight: bold;
9
10
  font-size: var(--size-xsmall);
@@ -12,29 +13,6 @@
12
13
  white-space: nowrap;
13
14
  }
14
15
 
15
- .titleLabel {
16
- flex: 0 0 auto;
17
- }
18
-
19
- .readMoreBtn {
20
- appearance: none;
21
- padding: 0;
22
- border: 0;
23
- background: none;
24
- cursor: pointer;
25
- /* simulate link */
26
- color: var(--color-primary);
27
- text-decoration: underline;
28
- line-height: var(--space-small);
29
- }
30
-
31
- .readMoreBtn:hover,
32
- .readMoreBtn:active,
33
- .readMoreBtn:focus {
34
- color: var(--color-primary-dark);
35
- text-decoration: none;
36
- }
37
-
38
16
  .budgetInfo {
39
17
  position: absolute;
40
18
  right: 0;
@@ -1,31 +1,28 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import cx from 'classnames'
3
+ import cx from 'classnames';
4
4
 
5
5
  import config from '../../config.json';
6
6
  import I18N from '../../i18n';
7
7
  import { FlexStack } from '../../layout/flex-stack';
8
8
  import { Stack } from '../../layout/stack';
9
- import { Popover } from '../../ui/popover';
9
+ import { Icon } from '../../ui/icon';
10
+ import { HoverCard } from '../../ui/hover-card';
10
11
  import css from './total-size-type-title.module.css';
11
12
 
12
13
  export const TotalSizeTypeTitle = ({ className }) => (
13
14
  <FlexStack space="xxxsmall" className={cx(css.title, className)}>
14
15
  <span>{I18N.ASSET_TOTALS}</span>
15
- <Popover icon="help">
16
+ <HoverCard label={<Icon glyph="help" />}>
16
17
  <Stack space="xxxsmall">
17
18
  <p>{I18N.ASSET_TOTALS_INFO}</p>
18
19
  <p>
19
- <a
20
- href={config.documentation.assets}
21
- target="_blank"
22
- rel="noreferrer"
23
- >
20
+ <a href={config.documentation.assets} target="_blank" rel="noreferrer">
24
21
  {I18N.READ_MORE}
25
22
  </a>
26
23
  </p>
27
24
  </Stack>
28
- </Popover>
25
+ </HoverCard>
29
26
  </FlexStack>
30
27
  );
31
28
 
@@ -1,18 +1,29 @@
1
+ @import url("~modern-css-reset/dist/reset.css");
2
+
1
3
  :root {
2
4
  --chart-height: 180px;
3
5
  }
4
6
 
7
+ /** modern-css-reset updates */
8
+ pre,
9
+ ul,
10
+ ol,
11
+ button {
12
+ margin: 0;
13
+ }
14
+
5
15
  html {
16
+ font-family: var(--font-family);
6
17
  font-size: 81.25%;
7
- line-height: 1.8461;
18
+ line-height: 1.6;
8
19
  }
9
20
 
10
21
  body {
22
+ background: var(--color-background);
11
23
  color: var(--color-text);
12
24
  }
13
25
 
14
- h1, h2, h3, h4, h5 {
15
- margin-bottom: var(--space-small);
26
+ h1, h2, h3, h4, h5, h6 {
16
27
  color: var(--color-heading);
17
28
  font-weight: 500;
18
29
  }
@@ -23,30 +23,30 @@
23
23
  --size-xxlarge: 1.424rem;
24
24
  --size-xxxlarge: 1.602rem;
25
25
 
26
- --line-height: var(--space-medium);
26
+ --line-height: 1.6em;
27
27
 
28
28
  /*
29
29
  * Color scheme:
30
- * http://mcg.mbitson.com/#!?mcgpalette0=%23dd555e&mcgpalette1=%2363bf5e&mcgpalette2=%23f7e37d&mcgpalette3=%23636568&mcgpalette4=%233385d6&themename=mcgtheme
31
30
  * https://coolors.co/3385d6-dd555e-63bf5e-f7e37d-192339
31
+ * http://mcg.mbitson.com/#!?mcgpalette0=%23dd555e&mcgpalette1=%2363bf5e&mcgpalette2=%23f7e37d&mcgpalette3=%235b5d60&mcgpalette4=%233385d6&themename=mcgtheme
32
32
  */
33
33
  --color-gray-25: #fafafa;
34
- --color-gray-50: #eceded;
35
- --color-gray-100: #d0d1d2;
36
- --color-gray-200: #b1b2b4;
37
- --color-gray-300: #929395;
38
- --color-gray-400: #7a7c7f;
39
- --color-gray-500: #636568;
40
- --color-gray-600: #5b5d60;
41
- --color-gray-700: #515355;
42
- --color-gray-800: #47494b;
43
- --color-gray-900: #35373a;
34
+ --color-gray-50: #e4e4e5;
35
+ --color-gray-100: #cececf;
36
+ --color-gray-200: #adaeb0;
37
+ --color-gray-300: #8c8e90;
38
+ --color-gray-400: #747578;
39
+ --color-gray-500: #5b5d60;
40
+ --color-gray-600: #535558;
41
+ --color-gray-700: #494b4e;
42
+ --color-gray-800: #404144;
43
+ --color-gray-900: #2f3033;
44
44
 
45
45
  --color-gray-ultra-light: var(--color-gray-200);
46
46
  --color-gray-light: var(--color-gray-300);
47
47
  --color-gray: var(--color-gray-500);
48
- --color-gray-dark: var(--color-gray-700);
49
- --color-gray-ultra-dark: var(--color-gray-900);
48
+ --color-gray-dark: var(--color-gray-600);
49
+ --color-gray-ultra-dark: var(--color-gray-700);
50
50
 
51
51
  --color-red-25: #fdf5f6;
52
52
  --color-red-50: #fbebec;
@@ -181,9 +181,9 @@
181
181
  --layer-high: 1000;
182
182
  --layer-xhigh: 10000;
183
183
 
184
- --radius-small: var(--space-xxxsmall);
185
- --radius-medium: var(--space-xxsmall);
186
- --radius-large: var(--space-small);
184
+ --radius-small: 3px;
185
+ --radius-medium: var(--space-xxxsmall);
186
+ --radius-large: var(--space-xxsmall);
187
187
 
188
188
  /** Layout */
189
189
  --max-width: 80rem;