@bundle-stats/ui 4.12.1 → 4.13.0-beta.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 (182) hide show
  1. package/lib/app/app.js +3 -7
  2. package/lib/app/app.js.map +1 -1
  3. package/lib/assets/icons.svg +26 -20
  4. package/lib/assets/icons.svg.js +27 -23
  5. package/lib/assets/icons.svg.js.map +1 -1
  6. package/lib/components/bundle-assets/bundle-assets.js +11 -3
  7. package/lib/components/bundle-assets/bundle-assets.js.map +1 -1
  8. package/lib/components/bundle-assets/index.js +3 -4
  9. package/lib/components/bundle-assets/index.js.map +1 -1
  10. package/lib/components/bundle-assets-totals/bundle-assets-totals.js +77 -0
  11. package/lib/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -0
  12. package/lib/components/bundle-assets-totals/bundle-assets-totals.module.css +7 -0
  13. package/lib/{ui/horizontal-bar-chart → components/bundle-assets-totals}/index.js +1 -1
  14. package/lib/components/bundle-assets-totals/index.js.map +1 -0
  15. package/lib/components/bundle-modules/bundle-modules.js +9 -2
  16. package/lib/components/bundle-modules/bundle-modules.js.map +1 -1
  17. package/lib/components/bundle-modules/index.js +3 -4
  18. package/lib/components/bundle-modules/index.js.map +1 -1
  19. package/lib/components/bundle-packages/bundle-packages.js +10 -2
  20. package/lib/components/bundle-packages/bundle-packages.js.map +1 -1
  21. package/lib/components/bundle-packages/index.js +3 -4
  22. package/lib/components/bundle-packages/index.js.map +1 -1
  23. package/lib/components/index.js +3 -5
  24. package/lib/components/index.js.map +1 -1
  25. package/lib/components/{bundle-assets-totals-table → metrics-display-selector}/index.js +1 -1
  26. package/lib/components/metrics-display-selector/index.js.map +1 -0
  27. package/lib/components/metrics-display-selector/metrics-display-selector.js +21 -0
  28. package/lib/components/metrics-display-selector/metrics-display-selector.js.map +1 -0
  29. package/lib/components/metrics-display-selector/metrics-display-selector.module.css +10 -0
  30. package/lib/components/{bundle-assets-totals-chart-bars → metrics-treemap}/index.js +1 -1
  31. package/lib/components/metrics-treemap/index.js.map +1 -0
  32. package/lib/components/metrics-treemap/metrics-treemap.js +168 -0
  33. package/lib/components/metrics-treemap/metrics-treemap.js.map +1 -0
  34. package/lib/components/metrics-treemap/metrics-treemap.module.css +184 -0
  35. package/lib/constants.js +6 -1
  36. package/lib/constants.js.map +1 -1
  37. package/lib/hooks/entry-info.js +12 -0
  38. package/lib/hooks/entry-info.js.map +1 -0
  39. package/lib/hooks/metrics-display-type.js +40 -0
  40. package/lib/hooks/metrics-display-type.js.map +1 -0
  41. package/lib/query-state.js +1 -1
  42. package/lib/query-state.js.map +1 -1
  43. package/lib/ui/button/button.module.css +1 -0
  44. package/lib/ui/icon/icon.js +2 -0
  45. package/lib/ui/icon/icon.js.map +1 -1
  46. package/lib/ui/index.js +1 -3
  47. package/lib/ui/index.js.map +1 -1
  48. package/lib-esm/app/app.js +3 -7
  49. package/lib-esm/app/app.js.map +1 -1
  50. package/lib-esm/assets/icons.svg +26 -20
  51. package/lib-esm/assets/icons.svg.js +27 -23
  52. package/lib-esm/assets/icons.svg.js.map +1 -1
  53. package/lib-esm/components/bundle-assets/bundle-assets.js +11 -3
  54. package/lib-esm/components/bundle-assets/bundle-assets.js.map +1 -1
  55. package/lib-esm/components/bundle-assets/index.js +5 -6
  56. package/lib-esm/components/bundle-assets/index.js.map +1 -1
  57. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js +47 -0
  58. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -0
  59. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.module.css +7 -0
  60. package/lib-esm/components/bundle-assets-totals/index.js +2 -0
  61. package/lib-esm/components/bundle-assets-totals/index.js.map +1 -0
  62. package/lib-esm/components/bundle-modules/bundle-modules.js +9 -2
  63. package/lib-esm/components/bundle-modules/bundle-modules.js.map +1 -1
  64. package/lib-esm/components/bundle-modules/index.js +3 -4
  65. package/lib-esm/components/bundle-modules/index.js.map +1 -1
  66. package/lib-esm/components/bundle-packages/bundle-packages.js +10 -2
  67. package/lib-esm/components/bundle-packages/bundle-packages.js.map +1 -1
  68. package/lib-esm/components/bundle-packages/index.js +5 -6
  69. package/lib-esm/components/bundle-packages/index.js.map +1 -1
  70. package/lib-esm/components/index.js +1 -2
  71. package/lib-esm/components/index.js.map +1 -1
  72. package/lib-esm/components/metrics-display-selector/index.js +2 -0
  73. package/lib-esm/components/metrics-display-selector/index.js.map +1 -0
  74. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js +14 -0
  75. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js.map +1 -0
  76. package/lib-esm/components/metrics-display-selector/metrics-display-selector.module.css +10 -0
  77. package/lib-esm/components/metrics-treemap/index.js +2 -0
  78. package/lib-esm/components/metrics-treemap/index.js.map +1 -0
  79. package/lib-esm/components/metrics-treemap/metrics-treemap.js +140 -0
  80. package/lib-esm/components/metrics-treemap/metrics-treemap.js.map +1 -0
  81. package/lib-esm/components/metrics-treemap/metrics-treemap.module.css +184 -0
  82. package/lib-esm/constants.js +5 -0
  83. package/lib-esm/constants.js.map +1 -1
  84. package/lib-esm/hooks/entry-info.js +8 -0
  85. package/lib-esm/hooks/entry-info.js.map +1 -0
  86. package/lib-esm/hooks/metrics-display-type.js +36 -0
  87. package/lib-esm/hooks/metrics-display-type.js.map +1 -0
  88. package/lib-esm/query-state.js +1 -1
  89. package/lib-esm/query-state.js.map +1 -1
  90. package/lib-esm/ui/button/button.module.css +1 -0
  91. package/lib-esm/ui/icon/icon.js +2 -0
  92. package/lib-esm/ui/icon/icon.js.map +1 -1
  93. package/lib-esm/ui/index.js +0 -1
  94. package/lib-esm/ui/index.js.map +1 -1
  95. package/package.json +7 -4
  96. package/src/app/app.jsx +4 -8
  97. package/src/assets/icons/table.svg +3 -0
  98. package/src/assets/icons/treemap.svg +4 -0
  99. package/src/assets/icons.svg +26 -20
  100. package/src/assets/icons.svg.jsx +91 -55
  101. package/src/components/bundle-assets/bundle-assets.jsx +25 -11
  102. package/src/components/bundle-assets/index.jsx +10 -5
  103. package/src/components/bundle-assets-totals/bundle-assets-totals.jsx +94 -0
  104. package/src/components/bundle-assets-totals/bundle-assets-totals.module.css +7 -0
  105. package/src/components/bundle-assets-totals/index.js +1 -0
  106. package/src/components/bundle-modules/bundle-modules.tsx +26 -12
  107. package/src/components/bundle-modules/index.tsx +4 -3
  108. package/src/components/bundle-packages/bundle-packages.jsx +24 -10
  109. package/src/components/bundle-packages/index.jsx +10 -5
  110. package/src/components/index.js +1 -2
  111. package/src/components/metrics-display-selector/index.tsx +1 -0
  112. package/src/components/metrics-display-selector/metrics-display-selector.module.css +10 -0
  113. package/src/components/metrics-display-selector/metrics-display-selector.tsx +47 -0
  114. package/src/components/metrics-treemap/index.ts +1 -0
  115. package/src/components/metrics-treemap/metrics-treemap.module.css +184 -0
  116. package/src/components/metrics-treemap/metrics-treemap.stories.tsx +23 -0
  117. package/src/components/metrics-treemap/metrics-treemap.tsx +308 -0
  118. package/src/{constants.js → constants.ts} +5 -0
  119. package/src/hooks/entry-info.ts +19 -0
  120. package/src/hooks/metrics-display-type.ts +56 -0
  121. package/src/query-state.tsx +1 -1
  122. package/src/types.d.ts +2 -0
  123. package/src/ui/button/button.module.css +1 -0
  124. package/src/ui/icon/icon.tsx +2 -0
  125. package/src/ui/index.js +0 -1
  126. package/types/components/bundle-assets/bundle-assets.d.ts +2 -1
  127. package/types/components/{bundle-assets-totals-table/bundle-assets-totals-table.d.ts → bundle-assets-totals/bundle-assets-totals.d.ts} +2 -2
  128. package/types/components/bundle-assets-totals/index.d.ts +1 -0
  129. package/types/components/bundle-modules/bundle-modules.d.ts +2 -1
  130. package/types/components/bundle-modules/index.d.ts +1 -1
  131. package/types/components/bundle-packages/bundle-packages.d.ts +1 -0
  132. package/types/components/index.d.ts +1 -2
  133. package/types/components/metrics-display-selector/index.d.ts +1 -0
  134. package/types/components/metrics-display-selector/metrics-display-selector.d.ts +9 -0
  135. package/types/components/metrics-treemap/index.d.ts +1 -0
  136. package/types/components/metrics-treemap/metrics-treemap.d.ts +9 -0
  137. package/types/constants.d.ts +19 -15
  138. package/types/hooks/entry-info.d.ts +8 -0
  139. package/types/hooks/metrics-display-type.d.ts +4 -0
  140. package/types/ui/icon/icon.d.ts +4 -0
  141. package/types/ui/index.d.ts +0 -1
  142. package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +0 -95
  143. package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js.map +0 -1
  144. package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.module.css +0 -42
  145. package/lib/components/bundle-assets-totals-chart-bars/index.js.map +0 -1
  146. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +0 -57
  147. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js.map +0 -1
  148. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +0 -3
  149. package/lib/components/bundle-assets-totals-table/index.js.map +0 -1
  150. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js +0 -102
  151. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js.map +0 -1
  152. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.module.css +0 -42
  153. package/lib/ui/horizontal-bar-chart/index.js.map +0 -1
  154. package/lib-esm/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +0 -66
  155. package/lib-esm/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js.map +0 -1
  156. package/lib-esm/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.module.css +0 -42
  157. package/lib-esm/components/bundle-assets-totals-chart-bars/index.js +0 -2
  158. package/lib-esm/components/bundle-assets-totals-chart-bars/index.js.map +0 -1
  159. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +0 -27
  160. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js.map +0 -1
  161. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +0 -3
  162. package/lib-esm/components/bundle-assets-totals-table/index.js +0 -2
  163. package/lib-esm/components/bundle-assets-totals-table/index.js.map +0 -1
  164. package/lib-esm/ui/horizontal-bar-chart/horizontal-bar-chart.js +0 -96
  165. package/lib-esm/ui/horizontal-bar-chart/horizontal-bar-chart.js.map +0 -1
  166. package/lib-esm/ui/horizontal-bar-chart/horizontal-bar-chart.module.css +0 -42
  167. package/lib-esm/ui/horizontal-bar-chart/index.js +0 -2
  168. package/lib-esm/ui/horizontal-bar-chart/index.js.map +0 -1
  169. package/src/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.jsx +0 -106
  170. package/src/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.module.css +0 -42
  171. package/src/components/bundle-assets-totals-chart-bars/index.js +0 -1
  172. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +0 -55
  173. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +0 -3
  174. package/src/components/bundle-assets-totals-table/index.js +0 -1
  175. package/src/ui/horizontal-bar-chart/horizontal-bar-chart.jsx +0 -156
  176. package/src/ui/horizontal-bar-chart/horizontal-bar-chart.module.css +0 -42
  177. package/src/ui/horizontal-bar-chart/index.js +0 -1
  178. package/types/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.d.ts +0 -22
  179. package/types/components/bundle-assets-totals-chart-bars/index.d.ts +0 -1
  180. package/types/components/bundle-assets-totals-table/index.d.ts +0 -1
  181. package/types/ui/horizontal-bar-chart/horizontal-bar-chart.d.ts +0 -23
  182. package/types/ui/horizontal-bar-chart/index.d.ts +0 -1
@@ -2,10 +2,11 @@ import React, { useCallback, useMemo } from 'react';
2
2
  import cx from 'classnames';
3
3
  import { SECTIONS, COMPONENT } from '@bundle-stats/utils';
4
4
 
5
- import type { SortAction } from '../../types';
5
+ import { SortAction } from '../../types';
6
6
  import config from '../../config.json';
7
7
  import I18N from '../../i18n';
8
8
  import { Box } from '../../layout/box';
9
+ import { MetricsDisplayType } from '../../constants';
9
10
  import { FlexStack } from '../../layout/flex-stack';
10
11
  import { Button } from '../../ui/button';
11
12
  import { EmptySet } from '../../ui/empty-set';
@@ -17,7 +18,9 @@ import { Toolbar } from '../../ui/toolbar';
17
18
  import { Tooltip } from '../../ui/tooltip';
18
19
  import { ComponentLink } from '../component-link';
19
20
  import { MetricsTable } from '../metrics-table';
21
+ import { MetricsTreemap } from '../metrics-treemap';
20
22
  import { MetricsTableOptions } from '../metrics-table-options';
23
+ import { MetricsDisplaySelector } from '../metrics-display-selector';
21
24
  import { MetricsTableTitle } from '../metrics-table-title';
22
25
  import { ModuleInfo } from '../module-info';
23
26
  import { generateFilterFieldsData } from './bundle-modules.utils';
@@ -25,6 +28,7 @@ import { ModuleMetric } from './bundle-modules.constants';
25
28
  import type { Chunk, Job, ReportMetricModuleRow } from './bundle-modules.types';
26
29
  import * as I18N_MODULES from './bundle-modules.i18n';
27
30
  import css from './bundle-modules.module.css';
31
+ import { useMetricsDisplayType } from '../../hooks/metrics-display-type';
28
32
 
29
33
  interface RowHeaderProps {
30
34
  row: ReportMetricModuleRow;
@@ -72,6 +76,7 @@ interface BundleModulesProps extends React.ComponentProps<'div'> {
72
76
 
73
77
  entryId?: string;
74
78
  hideEntryInfo: () => void;
79
+ showEntryInfo: (entryId: string) => void;
75
80
 
76
81
  moduleMetric: ModuleMetric;
77
82
  setModuleMetric: (newValue: ModuleMetric) => void;
@@ -99,12 +104,15 @@ export const BundleModules = (props: BundleModulesProps) => {
99
104
  hideEntryInfo,
100
105
  moduleMetric,
101
106
  setModuleMetric,
107
+ showEntryInfo,
102
108
  customComponentLink: CustomComponentLink = ComponentLink,
103
109
  } = props;
104
110
 
105
111
  const rootClassName = cx(css.root, className);
106
112
  const jobLabels = jobs?.map((job) => job?.label);
107
113
 
114
+ const [displayType, setDisplayType] = useMetricsDisplayType();
115
+
108
116
  const filterFieldsData = useMemo(
109
117
  () => generateFilterFieldsData({ filters, chunks, compareMode: jobs.length > 1 }),
110
118
  [jobs, filters, chunks],
@@ -162,6 +170,7 @@ export const BundleModules = (props: BundleModulesProps) => {
162
170
  className={css.toolbar}
163
171
  renderActions={({ actionClassName }) => (
164
172
  <FlexStack space="xxsmall" className={cx(css.dropdown, actionClassName)}>
173
+ <MetricsDisplaySelector onSelect={setDisplayType} value={displayType} />
165
174
  <MetricsTableOptions
166
175
  handleViewAll={resetAllFilters}
167
176
  handleResetFilters={resetFilters}
@@ -205,17 +214,22 @@ export const BundleModules = (props: BundleModulesProps) => {
205
214
  </Button>
206
215
  </FlexStack>
207
216
  </Box>
208
- <MetricsTable
209
- className={css.table}
210
- items={items}
211
- runs={jobs}
212
- renderRowHeader={renderRowHeader}
213
- emptyMessage={emptyMessage}
214
- showHeaderSum
215
- title={metricsTableTitle}
216
- sort={sort}
217
- updateSort={updateSort}
218
- />
217
+ {displayType === MetricsDisplayType.TABLE && (
218
+ <MetricsTable
219
+ className={css.table}
220
+ items={items}
221
+ runs={jobs}
222
+ renderRowHeader={renderRowHeader}
223
+ emptyMessage={emptyMessage}
224
+ showHeaderSum
225
+ title={metricsTableTitle}
226
+ sort={sort}
227
+ updateSort={updateSort}
228
+ />
229
+ )}
230
+ {displayType === MetricsDisplayType.TREEMAP && (
231
+ <MetricsTreemap emptyMessage={emptyMessage} items={items} onItemClick={showEntryInfo} />
232
+ )}
219
233
  </div>
220
234
  {entryItem && (
221
235
  <ModuleInfo
@@ -6,6 +6,7 @@ import type { SortAction } from '../../types';
6
6
  import { useRowsFilter } from '../../hooks/rows-filter';
7
7
  import { useRowsSort } from '../../hooks/rows-sort';
8
8
  import { useSearchParams } from '../../hooks/search-params';
9
+ import { useEntryInfo } from '../../hooks/entry-info';
9
10
  import { BundleModules as BaseComponent } from './bundle-modules';
10
11
  import {
11
12
  addRowFlags,
@@ -61,6 +62,7 @@ interface BundleModulesProps
61
62
  | 'allItems'
62
63
  | 'totalRowCount'
63
64
  | 'hideEntryInfo'
65
+ | 'showEntryInfo'
64
66
  > {
65
67
  jobs: Array<types.Job>;
66
68
  filters: Record<string, boolean>;
@@ -118,9 +120,7 @@ export const BundleModules = (props: BundleModulesProps) => {
118
120
  getCustomSort,
119
121
  });
120
122
 
121
- const hideEntryInfo = useCallback(() => {
122
- setState({ entryId: '' });
123
- }, [setState]);
123
+ const [hideEntryInfo, showEntryInfo] = useEntryInfo({ setState });
124
124
 
125
125
  return (
126
126
  <BaseComponent
@@ -134,6 +134,7 @@ export const BundleModules = (props: BundleModulesProps) => {
134
134
  hideEntryInfo={hideEntryInfo}
135
135
  moduleMetric={moduleMetric}
136
136
  setModuleMetric={setModuleMetric}
137
+ showEntryInfo={showEntryInfo}
137
138
  />
138
139
  );
139
140
  };
@@ -18,6 +18,10 @@ import { MetricsTableTitle } from '../metrics-table-title';
18
18
  import { PackageInfo } from '../package-info';
19
19
  import { SEARCH_PLACEHOLDER } from './bundle-packages.i18n';
20
20
  import css from './bundle-packages.module.css';
21
+ import { MetricsDisplaySelector } from '../metrics-display-selector';
22
+ import { MetricsDisplayType } from '../../constants';
23
+ import { MetricsTreemap } from '../metrics-treemap';
24
+ import { useMetricsDisplayType } from '../../hooks/metrics-display-type';
21
25
 
22
26
  const getDropdownFilters = ({ compareMode, filters }) => ({
23
27
  [PACKAGE_FILTERS.CHANGED]: {
@@ -126,10 +130,13 @@ export const BundlePackages = (props) => {
126
130
  entryId,
127
131
  allItems,
128
132
  hideEntryInfo,
133
+ showEntryInfo,
129
134
  } = props;
130
135
 
131
136
  const jobLabels = jobs?.map((job) => job?.label);
132
137
 
138
+ const [displayType, setDisplayType] = useMetricsDisplayType();
139
+
133
140
  const dropdownFilters = useMemo(
134
141
  () => getDropdownFilters({ compareMode: jobs?.length > 1, filters }),
135
142
  [jobs, filters],
@@ -187,6 +194,7 @@ export const BundlePackages = (props) => {
187
194
  className={css.toolbar}
188
195
  renderActions={({ actionClassName }) => (
189
196
  <FlexStack space="xxsmall" className={cx(css.dropdown, actionClassName)}>
197
+ <MetricsDisplaySelector onSelect={setDisplayType} value={displayType} />
190
198
  <MetricsTableOptions
191
199
  handleViewAll={resetAllFilters}
192
200
  handleResetFilters={resetFilters}
@@ -210,16 +218,21 @@ export const BundlePackages = (props) => {
210
218
  </FlexStack>
211
219
  </Toolbar>
212
220
  <main>
213
- <MetricsTable
214
- runs={jobs}
215
- items={items}
216
- emptyMessage={emptyMessage}
217
- renderRowHeader={renderRowHeader}
218
- showHeaderSum
219
- title={metricsTableTitle}
220
- sort={sort}
221
- updateSort={updateSort}
222
- />
221
+ {displayType === MetricsDisplayType.TABLE && (
222
+ <MetricsTable
223
+ runs={jobs}
224
+ items={items}
225
+ emptyMessage={emptyMessage}
226
+ renderRowHeader={renderRowHeader}
227
+ showHeaderSum
228
+ title={metricsTableTitle}
229
+ sort={sort}
230
+ updateSort={updateSort}
231
+ />
232
+ )}
233
+ {displayType === MetricsDisplayType.TREEMAP && (
234
+ <MetricsTreemap emptyMessage={emptyMessage} items={items} onItemClick={showEntryInfo} />
235
+ )}
223
236
  </main>
224
237
  </section>
225
238
  {entryItem && (
@@ -283,4 +296,5 @@ BundlePackages.propTypes = {
283
296
  customComponentLink: PropTypes.elementType,
284
297
  entryId: PropTypes.string,
285
298
  hideEntryInfo: PropTypes.func.isRequired,
299
+ showEntryInfo: PropTypes.func.isRequired,
286
300
  };
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useMemo } from 'react';
1
+ import React, { useMemo } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { PACKAGE_FILTERS } from '@bundle-stats/utils';
4
4
  import * as webpack from '@bundle-stats/utils/lib-esm/webpack/compare';
@@ -6,8 +6,14 @@ import * as webpack from '@bundle-stats/utils/lib-esm/webpack/compare';
6
6
  import { useRowsFilter } from '../../hooks/rows-filter';
7
7
  import { useRowsSort } from '../../hooks/rows-sort';
8
8
  import { useSearchParams } from '../../hooks/search-params';
9
+ import { useEntryInfo } from '../../hooks/entry-info';
9
10
  import { BundlePackages as BundlePackagesComponent } from './bundle-packages';
10
- import { getDuplicatePackages, getAddRowDuplicateFlag, getRowFilter, getCustomSort } from './bundle-packages.utils';
11
+ import {
12
+ getDuplicatePackages,
13
+ getAddRowDuplicateFlag,
14
+ getRowFilter,
15
+ getCustomSort,
16
+ } from './bundle-packages.utils';
11
17
 
12
18
  export const BundlePackages = (props) => {
13
19
  const { jobs, search, filters, setState, sortBy, direction, ...restProps } = props;
@@ -54,9 +60,7 @@ export const BundlePackages = (props) => {
54
60
  getCustomSort,
55
61
  });
56
62
 
57
- const hideEntryInfo = useCallback(() => {
58
- setState({ entryId: '' });
59
- }, [setState]);
63
+ const [hideEntryInfo, showEntryInfo] = useEntryInfo({ setState });
60
64
 
61
65
  return (
62
66
  <BundlePackagesComponent
@@ -67,6 +71,7 @@ export const BundlePackages = (props) => {
67
71
  allItems={rows}
68
72
  totalRowCount={totalRowCount}
69
73
  hideEntryInfo={hideEntryInfo}
74
+ showEntryInfo={showEntryInfo}
70
75
  />
71
76
  );
72
77
  };
@@ -1,7 +1,6 @@
1
1
  export { BrowsertimeTable } from './browsertime-table';
2
2
  export { BundleAssets } from './bundle-assets';
3
- export { BundleAssetsTotalsTable } from './bundle-assets-totals-table';
4
- export { BundleAssetsTotalsChartBars } from './bundle-assets-totals-chart-bars';
3
+ export { BundleAssetsTotals } from './bundle-assets-totals';
5
4
  export { BundlePackages } from './bundle-packages';
6
5
  export { BundleModules } from './bundle-modules';
7
6
  export { ComponentLink } from './component-link';
@@ -0,0 +1 @@
1
+ export * from './metrics-display-selector';
@@ -0,0 +1,10 @@
1
+ .button {
2
+ text-decoration: none;
3
+ }
4
+
5
+ .buttonActive,
6
+ .buttonActive:active,
7
+ .buttonActive:focus {
8
+ color: var(--color-primary);
9
+ border-color: var(--color-primary);
10
+ }
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ import cx from 'classnames';
3
+
4
+ import { MetricsDisplayType } from '../../constants';
5
+ import { FlexStack } from '../../layout/flex-stack';
6
+ import { Button } from '../../ui/button';
7
+ import { Icon } from '../../ui/icon';
8
+ import css from './metrics-display-selector.module.css';
9
+
10
+ interface MetricsDisplaySelectorProps {
11
+ value: MetricsDisplayType;
12
+ onSelect: (newValue: MetricsDisplayType) => void;
13
+ }
14
+
15
+ export const MetricsDisplaySelector = (
16
+ props: MetricsDisplaySelectorProps &
17
+ Omit<React.ComponentProps<typeof FlexStack>, 'onSelect' | 'value'>,
18
+ ) => {
19
+ const { className = '', value, onSelect, ...restProps } = props;
20
+
21
+ return (
22
+ <FlexStack space="xxsmall" as="nav" className={cx(css.root, className)} {...restProps}>
23
+ <Button
24
+ outline
25
+ active={value === MetricsDisplayType.TABLE}
26
+ size="small"
27
+ type="button"
28
+ glyph={Icon.ICONS.TABLE}
29
+ onClick={() => onSelect(MetricsDisplayType.TABLE)}
30
+ className={css.button}
31
+ >
32
+ Table
33
+ </Button>
34
+ <Button
35
+ outline
36
+ active={value === MetricsDisplayType.TREEMAP}
37
+ size="small"
38
+ type="button"
39
+ glyph={Icon.ICONS.TREEMAP}
40
+ onClick={() => onSelect(MetricsDisplayType.TREEMAP)}
41
+ className={cx(css.button)}
42
+ >
43
+ Treemap
44
+ </Button>
45
+ </FlexStack>
46
+ );
47
+ };
@@ -0,0 +1 @@
1
+ export * from './metrics-treemap';
@@ -0,0 +1,184 @@
1
+ .root {
2
+ position: relative;
3
+ aspect-ratio: 16/9;
4
+ background: var(--color-background);
5
+ }
6
+
7
+ .canvas {
8
+ position: absolute;
9
+ left: 0;
10
+ top: 0;
11
+ width: 100%;
12
+ height: 100%;
13
+ fill: var(--color-text);
14
+ font-family: var(--font-family);
15
+ background: var(--color-outline);
16
+ }
17
+
18
+ /** Tile overlay fill background transition */
19
+ .root {
20
+ transition: var(--ui-transition-out);
21
+ transition-property: opacity;
22
+ }
23
+
24
+ .leafBackground {
25
+ fill: var(--color-background);
26
+ }
27
+
28
+ .leafBackdrop {
29
+ fill: var(--color-background);
30
+ transition: var(--ui-transition-out);
31
+ transition-property: opacity;
32
+ opacity: 0.2;
33
+ }
34
+
35
+ .leaf:hover .leafBackdrop {
36
+ transition: var(--ui-transition-in);
37
+ opacity: 0.5;
38
+ }
39
+
40
+ /** Leaf wrapper button */
41
+ .leafAction {
42
+ appearance: none;
43
+ border: 0;
44
+ border-radius: 0;
45
+ padding: 0;
46
+ background: none;
47
+ width: 100%;
48
+ height: 100%;
49
+ display: flex;
50
+ align-items: center;
51
+ font-family: var(--font-family-fixed);
52
+ font-size: var(--size-small);
53
+ line-height: var(--line-height-heading);
54
+ text-align: left;
55
+ }
56
+
57
+ .leafContent {
58
+ width: 100%;
59
+ height: 100%;
60
+ display: flex;
61
+ flex-flow: column;
62
+ justify-content: center;
63
+ padding: var(--space-xxsmall) var(--space-xxsmall);
64
+ gap: var(--space-xxsmall);
65
+ line-height: var(--line-height-heading);
66
+ }
67
+
68
+ /** Align label to other elements on the first column leafs */
69
+ .leafWrapper[x="0"] .leafContent {
70
+ padding-left: var(--space-small);
71
+ }
72
+
73
+ .leadContentLabel {
74
+ flex: 0 1 auto;
75
+ width: 100%;
76
+ min-width: 0;
77
+ max-height: calc(2em * var(--line-height-heading));
78
+ overflow: hidden;
79
+ word-break: break-word;
80
+ }
81
+
82
+ .leadContentValue {
83
+ flex: 0 0 auto;
84
+ max-width: calc(100% + var(--space-xxsmall));
85
+ white-space: nowrap;
86
+ overflow: hidden;
87
+ }
88
+
89
+ .leadContentMetric {
90
+ font-weight: bold;
91
+ }
92
+
93
+ .leadContentDelta {
94
+ margin-left: var(--space-xxxsmall);
95
+ }
96
+
97
+ /** Tile size variation */
98
+ .leafSmall .leafContent {
99
+ padding: var(--space-xxxsmall) var(--space-xxsmall);
100
+ gap: 0;
101
+ font-size: var(--size-xsmall);
102
+ }
103
+
104
+ .leafSmall .leadContentLabel {
105
+ margin-top: 0;
106
+ }
107
+
108
+ /** Tile diff variation */
109
+ .leaf-NO_CHANGE .leafBackdrop {
110
+ fill: transparent;
111
+ }
112
+
113
+ .leaf-NO_CHANGE .leafAction {
114
+ color: var(--color-text-light);
115
+ }
116
+
117
+ .leaf-HIGH_NEGATIVE .leafBackdrop {
118
+ fill: var(--color-red-100);
119
+ }
120
+
121
+ .leaf-NEGATIVE .leafBackdrop {
122
+ fill: var(--color-red-50);
123
+ }
124
+
125
+ .leaf-LOW_NEGATIVE .leafBackdrop {
126
+ fill: var(--color-red-25);
127
+ }
128
+
129
+ .leaf-LOW_POSITIVE .leafBackdrop {
130
+ fill: var(--color-green-25);
131
+ }
132
+
133
+ .leaf-POSITIVE .leafBackdrop {
134
+ fill: var(--color-green-50);
135
+ }
136
+
137
+ .leaf-HIGH_POSITIVE .leafBackdrop {
138
+ fill: var(--color-green-100);
139
+ }
140
+
141
+ /** empty message */
142
+ .emptyMessage {
143
+ position: absolute;
144
+ left: 0;
145
+ top: 0;
146
+ width: 100%;
147
+ height: 100%;
148
+ display: flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ }
152
+
153
+ .emptyMessageWrapper {
154
+ max-width: 100%;
155
+ text-align: center;
156
+ }
157
+
158
+ /** tooltip */
159
+ .leafContentTooltipAnchor {
160
+ width: 100%;
161
+ height: 100%;
162
+ }
163
+
164
+ .tooltip {
165
+ z-index: var(--layer-xxhigh);
166
+ padding: var(--space-xsmall) var(--space-small);
167
+ border-radius: var(--radius-medium);
168
+ width: calc(100vw - 2 * var(--space-small));
169
+ max-width: 340px;
170
+ outline: none;
171
+ filter: drop-shadow(var(--shadow-layer-high));
172
+ will-change: filter;
173
+ background: var(--color-light);
174
+ font-size: var(--size-small);
175
+ }
176
+
177
+ .leafTooltipArrow svg {
178
+ display: block;
179
+ fill: var(--color-background) !important;
180
+ }
181
+
182
+ .leafTooltipContentTitle {
183
+ font-size: var(--size-medium);
184
+ }
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { Meta, StoryObj } from '@storybook/react';
3
+ // eslint-disable-next-line import/no-extraneous-dependencies
4
+ import { action } from '@storybook/addon-actions';
5
+
6
+ // eslint-disable-next-line import/no-relative-packages
7
+ import moduleItemsFixture from '../../../../../fixtures/module-items.json';
8
+ import { MetricsTreemap } from '.';
9
+
10
+ export default {
11
+ title: 'Components/MetricsTreemap',
12
+ component: MetricsTreemap,
13
+ } as Meta;
14
+
15
+ export const Default: StoryObj = {
16
+ render: (props: React.ComponentProps<typeof MetricsTreemap>) => (
17
+ <MetricsTreemap style={{ maxWidth: 'var(--max-width)' }} {...props} />
18
+ ),
19
+ args: {
20
+ items: moduleItemsFixture,
21
+ onItemClick: action('CLICK'),
22
+ },
23
+ };