@bundle-stats/ui 4.13.0-beta.2 → 4.13.0-beta.20

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 (279) hide show
  1. package/lib/app/app.js +4 -8
  2. package/lib/app/app.js.map +1 -1
  3. package/lib/app/app.module.css +2 -2
  4. package/lib/assets/icons.svg +70 -67
  5. package/lib/assets/icons.svg.js +14 -12
  6. package/lib/assets/icons.svg.js.map +1 -1
  7. package/lib/components/bundle-assets/bundle-assets.js +47 -8
  8. package/lib/components/bundle-assets/bundle-assets.js.map +1 -1
  9. package/lib/components/bundle-assets/bundle-assets.module.css +0 -5
  10. package/lib/components/bundle-assets-totals/bundle-assets-totals.js +25 -14
  11. package/lib/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  12. package/lib/components/bundle-modules/bundle-modules.i18n.js +1 -1
  13. package/lib/components/bundle-modules/bundle-modules.js +45 -14
  14. package/lib/components/bundle-modules/bundle-modules.js.map +1 -1
  15. package/lib/components/bundle-modules/bundle-modules.module.css +0 -5
  16. package/lib/components/bundle-packages/bundle-packages.js +45 -6
  17. package/lib/components/bundle-packages/bundle-packages.js.map +1 -1
  18. package/lib/components/bundle-packages/bundle-packages.module.css +0 -5
  19. package/lib/components/delta/delta.js +1 -1
  20. package/lib/components/delta/delta.js.map +1 -1
  21. package/lib/components/delta/delta.module.css +10 -1
  22. package/lib/components/index.js +1 -3
  23. package/lib/components/index.js.map +1 -1
  24. package/lib/components/jobs-header/jobs-header.module.css +0 -4
  25. package/lib/components/metrics-display-selector/metrics-display-selector.js +42 -5
  26. package/lib/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  27. package/lib/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  28. package/lib/components/metrics-table/metrics-table.i18n.js +1 -6
  29. package/lib/components/metrics-table/metrics-table.i18n.js.map +1 -1
  30. package/lib/components/metrics-table/metrics-table.js +4 -37
  31. package/lib/components/metrics-table/metrics-table.js.map +1 -1
  32. package/lib/components/metrics-table/metrics-table.module.css +1 -44
  33. package/lib/components/{total-size-type-title → metrics-table-header}/index.js +1 -1
  34. package/lib/components/metrics-table-header/index.js.map +1 -0
  35. package/lib/components/metrics-table-header/metrics-table-header.i18n.js +9 -0
  36. package/lib/components/metrics-table-header/metrics-table-header.i18n.js.map +1 -0
  37. package/lib/components/metrics-table-header/metrics-table-header.js +79 -0
  38. package/lib/components/metrics-table-header/metrics-table-header.js.map +1 -0
  39. package/lib/components/metrics-table-header/metrics-table-header.module.css +51 -0
  40. package/lib/components/metrics-table-options/metrics-table-options.js +2 -2
  41. package/lib/components/metrics-table-options/metrics-table-options.js.map +1 -1
  42. package/lib/components/metrics-table-title/metrics-table-title.js +1 -1
  43. package/lib/components/metrics-table-title/metrics-table-title.js.map +1 -1
  44. package/lib/components/metrics-table-title/metrics-table-title.module.css +4 -4
  45. package/lib/components/metrics-treemap/index.js +4 -0
  46. package/lib/components/metrics-treemap/index.js.map +1 -1
  47. package/lib/components/metrics-treemap/metrics-treemap.constants.js +3 -0
  48. package/lib/components/metrics-treemap/metrics-treemap.constants.js.map +1 -0
  49. package/lib/components/metrics-treemap/metrics-treemap.i18n.js +6 -0
  50. package/lib/components/metrics-treemap/metrics-treemap.i18n.js.map +1 -0
  51. package/lib/components/metrics-treemap/metrics-treemap.js +96 -70
  52. package/lib/components/metrics-treemap/metrics-treemap.js.map +1 -1
  53. package/lib/components/metrics-treemap/metrics-treemap.module.css +163 -51
  54. package/lib/components/metrics-treemap/metrics-treemap.utils.js +109 -0
  55. package/lib/components/metrics-treemap/metrics-treemap.utils.js.map +1 -0
  56. package/lib/components/module-info/module-info.js +1 -2
  57. package/lib/components/module-info/module-info.js.map +1 -1
  58. package/lib/components/run-info/run-info.module.css +7 -7
  59. package/lib/components/sort-button/sort-button.module.css +1 -0
  60. package/lib/css/variables.css +14 -13
  61. package/lib/hooks/metrics-display-type.js +45 -24
  62. package/lib/hooks/metrics-display-type.js.map +1 -1
  63. package/lib/hooks/search-params.js +1 -0
  64. package/lib/hooks/search-params.js.map +1 -1
  65. package/lib/layout/box/box.module.css +4 -2
  66. package/lib/layout/flex-stack/flex-stack.js +3 -4
  67. package/lib/layout/flex-stack/flex-stack.js.map +1 -1
  68. package/lib/layout/flex-stack/flex-stack.module.css +19 -23
  69. package/lib/ui/button/button.js +5 -4
  70. package/lib/ui/button/button.js.map +1 -1
  71. package/lib/ui/button/button.module.css +55 -53
  72. package/lib/ui/dropdown/dropdown.js +10 -40
  73. package/lib/ui/dropdown/dropdown.js.map +1 -1
  74. package/lib/ui/dropdown/index.js.map +1 -1
  75. package/lib/ui/filters/filters.js +33 -35
  76. package/lib/ui/filters/filters.js.map +1 -1
  77. package/lib/ui/filters/filters.module.css +55 -67
  78. package/lib/ui/hover-card/hover-card.js +1 -1
  79. package/lib/ui/hover-card/hover-card.js.map +1 -1
  80. package/lib/ui/icon/icon.js +2 -1
  81. package/lib/ui/icon/icon.js.map +1 -1
  82. package/lib/ui/input-search/input-search.js +1 -1
  83. package/lib/ui/input-search/input-search.js.map +1 -1
  84. package/lib/ui/loader/loader.js +1 -1
  85. package/lib/ui/loader/loader.js.map +1 -1
  86. package/lib/ui/table/table.module.css +30 -0
  87. package/lib/ui/tag/tag.module.css +3 -3
  88. package/lib/ui/toolbar/toolbar.module.css +1 -3
  89. package/lib-esm/app/app.js +4 -8
  90. package/lib-esm/app/app.js.map +1 -1
  91. package/lib-esm/app/app.module.css +2 -2
  92. package/lib-esm/assets/icons.svg +70 -67
  93. package/lib-esm/assets/icons.svg.js +14 -12
  94. package/lib-esm/assets/icons.svg.js.map +1 -1
  95. package/lib-esm/components/bundle-assets/bundle-assets.js +48 -9
  96. package/lib-esm/components/bundle-assets/bundle-assets.js.map +1 -1
  97. package/lib-esm/components/bundle-assets/bundle-assets.module.css +0 -5
  98. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js +26 -15
  99. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.js.map +1 -1
  100. package/lib-esm/components/bundle-modules/bundle-modules.i18n.js +1 -1
  101. package/lib-esm/components/bundle-modules/bundle-modules.js +46 -15
  102. package/lib-esm/components/bundle-modules/bundle-modules.js.map +1 -1
  103. package/lib-esm/components/bundle-modules/bundle-modules.module.css +0 -5
  104. package/lib-esm/components/bundle-packages/bundle-packages.js +46 -7
  105. package/lib-esm/components/bundle-packages/bundle-packages.js.map +1 -1
  106. package/lib-esm/components/bundle-packages/bundle-packages.module.css +0 -5
  107. package/lib-esm/components/delta/delta.js +1 -1
  108. package/lib-esm/components/delta/delta.js.map +1 -1
  109. package/lib-esm/components/delta/delta.module.css +10 -1
  110. package/lib-esm/components/index.js +0 -1
  111. package/lib-esm/components/index.js.map +1 -1
  112. package/lib-esm/components/jobs-header/jobs-header.module.css +0 -4
  113. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js +42 -5
  114. package/lib-esm/components/metrics-display-selector/metrics-display-selector.js.map +1 -1
  115. package/lib-esm/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  116. package/lib-esm/components/metrics-table/metrics-table.i18n.js +0 -5
  117. package/lib-esm/components/metrics-table/metrics-table.i18n.js.map +1 -1
  118. package/lib-esm/components/metrics-table/metrics-table.js +4 -37
  119. package/lib-esm/components/metrics-table/metrics-table.js.map +1 -1
  120. package/lib-esm/components/metrics-table/metrics-table.module.css +1 -44
  121. package/lib-esm/components/metrics-table-header/index.js +2 -0
  122. package/lib-esm/components/metrics-table-header/index.js.map +1 -0
  123. package/lib-esm/components/metrics-table-header/metrics-table-header.i18n.js +6 -0
  124. package/lib-esm/components/metrics-table-header/metrics-table-header.i18n.js.map +1 -0
  125. package/lib-esm/components/metrics-table-header/metrics-table-header.js +49 -0
  126. package/lib-esm/components/metrics-table-header/metrics-table-header.js.map +1 -0
  127. package/lib-esm/components/metrics-table-header/metrics-table-header.module.css +51 -0
  128. package/lib-esm/components/metrics-table-options/metrics-table-options.js +3 -3
  129. package/lib-esm/components/metrics-table-options/metrics-table-options.js.map +1 -1
  130. package/lib-esm/components/metrics-table-title/metrics-table-title.js +1 -1
  131. package/lib-esm/components/metrics-table-title/metrics-table-title.js.map +1 -1
  132. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +4 -4
  133. package/lib-esm/components/metrics-treemap/index.js +1 -0
  134. package/lib-esm/components/metrics-treemap/index.js.map +1 -1
  135. package/lib-esm/components/metrics-treemap/metrics-treemap.constants.js +2 -0
  136. package/lib-esm/components/metrics-treemap/metrics-treemap.constants.js.map +1 -0
  137. package/lib-esm/components/metrics-treemap/metrics-treemap.i18n.js +3 -0
  138. package/lib-esm/components/metrics-treemap/metrics-treemap.i18n.js.map +1 -0
  139. package/lib-esm/components/metrics-treemap/metrics-treemap.js +98 -71
  140. package/lib-esm/components/metrics-treemap/metrics-treemap.js.map +1 -1
  141. package/lib-esm/components/metrics-treemap/metrics-treemap.module.css +163 -51
  142. package/lib-esm/components/metrics-treemap/metrics-treemap.utils.js +105 -0
  143. package/lib-esm/components/metrics-treemap/metrics-treemap.utils.js.map +1 -0
  144. package/lib-esm/components/module-info/module-info.js +1 -2
  145. package/lib-esm/components/module-info/module-info.js.map +1 -1
  146. package/lib-esm/components/run-info/run-info.module.css +7 -7
  147. package/lib-esm/components/sort-button/sort-button.module.css +1 -0
  148. package/lib-esm/css/variables.css +14 -13
  149. package/lib-esm/hooks/metrics-display-type.js +46 -24
  150. package/lib-esm/hooks/metrics-display-type.js.map +1 -1
  151. package/lib-esm/hooks/search-params.js +1 -0
  152. package/lib-esm/hooks/search-params.js.map +1 -1
  153. package/lib-esm/layout/box/box.module.css +4 -2
  154. package/lib-esm/layout/flex-stack/flex-stack.js +3 -4
  155. package/lib-esm/layout/flex-stack/flex-stack.js.map +1 -1
  156. package/lib-esm/layout/flex-stack/flex-stack.module.css +19 -23
  157. package/lib-esm/ui/button/button.js +5 -4
  158. package/lib-esm/ui/button/button.js.map +1 -1
  159. package/lib-esm/ui/button/button.module.css +55 -53
  160. package/lib-esm/ui/dropdown/dropdown.js +8 -39
  161. package/lib-esm/ui/dropdown/dropdown.js.map +1 -1
  162. package/lib-esm/ui/dropdown/index.js.map +1 -1
  163. package/lib-esm/ui/filters/filters.js +34 -36
  164. package/lib-esm/ui/filters/filters.js.map +1 -1
  165. package/lib-esm/ui/filters/filters.module.css +55 -67
  166. package/lib-esm/ui/hover-card/hover-card.js +1 -1
  167. package/lib-esm/ui/hover-card/hover-card.js.map +1 -1
  168. package/lib-esm/ui/icon/icon.js +2 -1
  169. package/lib-esm/ui/icon/icon.js.map +1 -1
  170. package/lib-esm/ui/input-search/input-search.js +1 -1
  171. package/lib-esm/ui/input-search/input-search.js.map +1 -1
  172. package/lib-esm/ui/loader/loader.js +1 -1
  173. package/lib-esm/ui/loader/loader.js.map +1 -1
  174. package/lib-esm/ui/table/table.module.css +30 -0
  175. package/lib-esm/ui/tag/tag.module.css +3 -3
  176. package/lib-esm/ui/toolbar/toolbar.module.css +1 -3
  177. package/package.json +10 -10
  178. package/src/app/app.jsx +4 -12
  179. package/src/app/app.module.css +2 -2
  180. package/src/assets/icons/check.svg +4 -0
  181. package/src/assets/icons.svg +70 -67
  182. package/src/assets/icons.svg.jsx +12 -12
  183. package/src/components/bundle-assets/bundle-assets.jsx +85 -12
  184. package/src/components/bundle-assets/bundle-assets.module.css +0 -5
  185. package/src/components/bundle-assets-totals/bundle-assets-totals.jsx +71 -35
  186. package/src/components/bundle-modules/bundle-modules.i18n.ts +1 -1
  187. package/src/components/bundle-modules/bundle-modules.module.css +0 -5
  188. package/src/components/bundle-modules/bundle-modules.tsx +123 -45
  189. package/src/components/bundle-packages/bundle-packages.jsx +79 -10
  190. package/src/components/bundle-packages/bundle-packages.module.css +0 -5
  191. package/src/components/delta/delta.jsx +1 -1
  192. package/src/components/delta/delta.module.css +10 -1
  193. package/src/components/index.js +0 -1
  194. package/src/components/jobs-header/jobs-header.module.css +0 -4
  195. package/src/components/metrics-display-selector/metrics-display-selector.module.css +15 -7
  196. package/src/components/metrics-display-selector/metrics-display-selector.stories.tsx +33 -0
  197. package/src/components/metrics-display-selector/metrics-display-selector.tsx +86 -28
  198. package/src/components/metrics-table/metrics-table.i18n.ts +0 -7
  199. package/src/components/metrics-table/metrics-table.module.css +1 -44
  200. package/src/components/metrics-table/metrics-table.tsx +17 -153
  201. package/src/components/metrics-table-header/index.ts +1 -0
  202. package/src/components/metrics-table-header/metrics-table-header.i18n.ts +6 -0
  203. package/src/components/metrics-table-header/metrics-table-header.module.css +51 -0
  204. package/src/components/metrics-table-header/metrics-table-header.tsx +172 -0
  205. package/src/components/metrics-table-options/metrics-table-options.jsx +4 -10
  206. package/src/components/metrics-table-title/metrics-table-title.jsx +1 -1
  207. package/src/components/metrics-table-title/metrics-table-title.module.css +4 -4
  208. package/src/components/metrics-treemap/__tests__/metrics-treemap.utils.ts +188 -0
  209. package/src/components/metrics-treemap/index.ts +1 -0
  210. package/src/components/metrics-treemap/metrics-treemap.constants.ts +52 -0
  211. package/src/components/metrics-treemap/metrics-treemap.i18n.ts +2 -0
  212. package/src/components/metrics-treemap/metrics-treemap.module.css +163 -51
  213. package/src/components/metrics-treemap/metrics-treemap.stories.tsx +44 -10
  214. package/src/components/metrics-treemap/metrics-treemap.tsx +340 -142
  215. package/src/components/metrics-treemap/metrics-treemap.utils.ts +162 -0
  216. package/src/components/module-info/module-info.tsx +1 -1
  217. package/src/components/run-info/run-info.module.css +7 -7
  218. package/src/components/sort-button/sort-button.module.css +1 -0
  219. package/src/css/variables.css +14 -13
  220. package/src/hooks/metrics-display-type.ts +79 -29
  221. package/src/hooks/search-params.js +1 -0
  222. package/src/layout/box/box.module.css +4 -2
  223. package/src/layout/flex-stack/flex-stack.module.css +19 -23
  224. package/src/layout/flex-stack/flex-stack.tsx +2 -8
  225. package/src/ui/button/button.module.css +55 -53
  226. package/src/ui/button/button.stories.tsx +16 -9
  227. package/src/ui/button/button.tsx +8 -7
  228. package/src/ui/dropdown/dropdown.stories.tsx +25 -0
  229. package/src/ui/dropdown/dropdown.tsx +66 -0
  230. package/src/ui/filters/filters.module.css +55 -67
  231. package/src/ui/filters/filters.stories.tsx +109 -0
  232. package/src/ui/filters/filters.tsx +128 -167
  233. package/src/ui/hover-card/hover-card.tsx +1 -1
  234. package/src/ui/icon/icon.tsx +2 -1
  235. package/src/ui/input-search/input-search.tsx +1 -0
  236. package/src/ui/loader/loader.jsx +1 -1
  237. package/src/ui/table/table.module.css +30 -0
  238. package/src/ui/tag/tag.module.css +3 -3
  239. package/src/ui/toolbar/toolbar.module.css +1 -3
  240. package/types/components/bundle-assets-totals/bundle-assets-totals.d.ts +5 -1
  241. package/types/components/bundle-modules/bundle-modules.i18n.d.ts +1 -1
  242. package/types/components/delta/delta.d.ts +2 -2
  243. package/types/components/index.d.ts +0 -1
  244. package/types/components/metrics-display-selector/metrics-display-selector.d.ts +5 -3
  245. package/types/components/metrics-table/metrics-table.d.ts +4 -10
  246. package/types/components/metrics-table/metrics-table.i18n.d.ts +0 -5
  247. package/types/components/metrics-table-header/index.d.ts +1 -0
  248. package/types/components/metrics-table-header/metrics-table-header.d.ts +15 -0
  249. package/types/components/metrics-table-header/metrics-table-header.i18n.d.ts +5 -0
  250. package/types/components/metrics-treemap/index.d.ts +1 -0
  251. package/types/components/metrics-treemap/metrics-treemap.constants.d.ts +20 -0
  252. package/types/components/metrics-treemap/metrics-treemap.d.ts +7 -5
  253. package/types/components/metrics-treemap/metrics-treemap.i18n.d.ts +2 -0
  254. package/types/components/metrics-treemap/metrics-treemap.utils.d.ts +5 -0
  255. package/types/hooks/metrics-display-type.d.ts +8 -2
  256. package/types/ui/dropdown/dropdown.d.ts +12 -47
  257. package/types/ui/dropdown/index.d.ts +1 -1
  258. package/types/ui/filters/filters.d.ts +2 -7
  259. package/types/ui/icon/icon.d.ts +4 -2
  260. package/types/ui/loader/loader.d.ts +2 -2
  261. package/lib/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  262. package/lib/components/total-size-type-title/index.js.map +0 -1
  263. package/lib/components/total-size-type-title/total-size-type-title.js +0 -32
  264. package/lib/components/total-size-type-title/total-size-type-title.js.map +0 -1
  265. package/lib/components/total-size-type-title/total-size-type-title.module.css +0 -14
  266. package/lib-esm/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  267. package/lib-esm/components/total-size-type-title/index.js +0 -2
  268. package/lib-esm/components/total-size-type-title/index.js.map +0 -1
  269. package/lib-esm/components/total-size-type-title/total-size-type-title.js +0 -25
  270. package/lib-esm/components/total-size-type-title/total-size-type-title.js.map +0 -1
  271. package/lib-esm/components/total-size-type-title/total-size-type-title.module.css +0 -14
  272. package/src/components/bundle-assets-totals/bundle-assets-totals.module.css +0 -7
  273. package/src/components/total-size-type-title/index.js +0 -1
  274. package/src/components/total-size-type-title/total-size-type-title.jsx +0 -41
  275. package/src/components/total-size-type-title/total-size-type-title.module.css +0 -14
  276. package/src/ui/dropdown/dropdown.jsx +0 -88
  277. package/types/components/total-size-type-title/index.d.ts +0 -1
  278. package/types/components/total-size-type-title/total-size-type-title.d.ts +0 -14
  279. /package/src/ui/dropdown/{index.js → index.ts} +0 -0
@@ -2,23 +2,17 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
 
4
4
  import I18N from '../../i18n';
5
- import { Dropdown } from '../../ui/dropdown';
5
+ import { Dropdown, DropdownItem } from '../../ui/dropdown';
6
6
 
7
7
  export const MetricsTableOptions = (props) => {
8
- const { className, handleViewAll, handleResetFilters, ...restProps } = props;
8
+ const { className, handleViewAll, handleResetFilters, ...restProps } = props;
9
9
 
10
10
  return (
11
11
  <Dropdown className={className} glyph="more-vertical" {...restProps}>
12
12
  {handleResetFilters && (
13
- <Dropdown.Item onClick={handleResetFilters}>
14
- {I18N.RESET_FILTERS}
15
- </Dropdown.Item>
16
- )}
17
- {handleViewAll && (
18
- <Dropdown.Item onClick={handleViewAll}>
19
- {I18N.VIEW_ALL}
20
- </Dropdown.Item>
13
+ <DropdownItem onClick={handleResetFilters}>{I18N.RESET_FILTERS}</DropdownItem>
21
14
  )}
15
+ {handleViewAll && <DropdownItem onClick={handleViewAll}>{I18N.VIEW_ALL}</DropdownItem>}
22
16
  </Dropdown>
23
17
  );
24
18
  };
@@ -15,7 +15,7 @@ export const MetricsTableTitle = (props) => {
15
15
  const rootClassName = cx(css.root, className);
16
16
 
17
17
  return (
18
- <Stack space="xxsmall" className={rootClassName}>
18
+ <Stack space="none" className={rootClassName}>
19
19
  <FlexStack space="xxxsmall" alignItems="center" as="h3" className={css.title}>
20
20
  <span>{title}</span>
21
21
 
@@ -1,8 +1,9 @@
1
1
  .root {
2
+ color: var(--color-text-ultra-light);
2
3
  }
3
4
 
4
5
  .title {
5
- color: var(--color-text-light);
6
+ color: inherit;
6
7
  font-size: 1em;
7
8
  font-weight: bold;
8
9
  text-transform: uppercase;
@@ -18,8 +19,7 @@
18
19
  }
19
20
 
20
21
  .info {
21
- color: var(--color-text-light);
22
+ font-size: var(--size-small);
22
23
  font-family: var(--font-family-fixed);
23
- font-size: var(--size-xsmall);
24
- font-weight: bold;
24
+ font-weight: normal;
25
25
  }
@@ -0,0 +1,188 @@
1
+ import { getTreemapNodesGroupedByPath } from '../metrics-treemap.utils';
2
+
3
+ describe('MetricsTreemap / getTreeNodesGroupedByPath', () => {
4
+ test('should group tree ndoes by path', () => {
5
+ const actual = getTreemapNodesGroupedByPath([
6
+ {
7
+ key: './src/app.jsx',
8
+ runs: [{ value: 300 }, { value: 500 }],
9
+ },
10
+ {
11
+ key: './src/components/header.jsx',
12
+ runs: [{ value: 200 }, { value: 100 }],
13
+ },
14
+ {
15
+ key: './src/components/footer.jsx',
16
+ runs: [{ value: 100 }, { value: 100 }],
17
+ },
18
+ {
19
+ key: './src/ui/button.jsx',
20
+ runs: [{ value: 100 }, { value: 100 }],
21
+ },
22
+ {
23
+ key: './src/ui/input.jsx',
24
+ runs: [{ value: 0 }, { value: 100 }],
25
+ },
26
+ {
27
+ key: './node_modules/react/dist/react.production.js',
28
+ runs: [{ value: 100 }, { value: 100 }],
29
+ },
30
+ {
31
+ key: 'favicon.ico',
32
+ runs: [{ value: 10 }, { value: 10 }],
33
+ },
34
+ ] as any);
35
+
36
+ expect(actual).toStrictEqual({
37
+ id: '',
38
+ label: '(root)',
39
+ value: 0,
40
+ total: {
41
+ current: 810,
42
+ baseline: 1010,
43
+ },
44
+ children: [
45
+ {
46
+ id: '.',
47
+ label: '.',
48
+ value: 0,
49
+ total: {
50
+ current: 800,
51
+ baseline: 1000,
52
+ },
53
+ children: [
54
+ {
55
+ id: './src',
56
+ label: 'src',
57
+ value: 0,
58
+ total: {
59
+ current: 700,
60
+ baseline: 900,
61
+ },
62
+ children: [
63
+ {
64
+ id: './src/app.jsx',
65
+ label: 'app.jsx',
66
+ value: 500,
67
+ item: {
68
+ key: './src/app.jsx',
69
+ runs: [{ value: 300 }, { value: 500 }],
70
+ },
71
+ },
72
+ {
73
+ id: './src/components',
74
+ label: 'components',
75
+ value: 0,
76
+ total: {
77
+ current: 300,
78
+ baseline: 200,
79
+ },
80
+ children: [
81
+ {
82
+ id: './src/components/header.jsx',
83
+ label: 'header.jsx',
84
+ value: 200,
85
+ item: {
86
+ key: './src/components/header.jsx',
87
+ runs: [{ value: 200 }, { value: 100 }],
88
+ },
89
+ },
90
+ {
91
+ id: './src/components/footer.jsx',
92
+ label: 'footer.jsx',
93
+ value: 100,
94
+ item: {
95
+ key: './src/components/footer.jsx',
96
+ runs: [{ value: 100 }, { value: 100 }],
97
+ },
98
+ },
99
+ ],
100
+ },
101
+ {
102
+ id: './src/ui',
103
+ label: 'ui',
104
+ value: 0,
105
+ total: {
106
+ current: 100,
107
+ baseline: 200,
108
+ },
109
+ children: [
110
+ {
111
+ id: './src/ui/button.jsx',
112
+ label: 'button.jsx',
113
+ value: 100,
114
+ item: {
115
+ key: './src/ui/button.jsx',
116
+ runs: [{ value: 100 }, { value: 100 }],
117
+ },
118
+ },
119
+ {
120
+ id: './src/ui/input.jsx',
121
+ label: 'input.jsx',
122
+ value: 100,
123
+ item: {
124
+ key: './src/ui/input.jsx',
125
+ runs: [{ value: 0 }, { value: 100 }],
126
+ },
127
+ },
128
+ ],
129
+ },
130
+ ],
131
+ },
132
+ {
133
+ id: './node_modules',
134
+ label: 'node_modules',
135
+ value: 0,
136
+ total: {
137
+ current: 100,
138
+ baseline: 100,
139
+ },
140
+ children: [
141
+ {
142
+ id: './node_modules/react',
143
+ label: 'react',
144
+ value: 0,
145
+ total: {
146
+ current: 100,
147
+ baseline: 100,
148
+ },
149
+ children: [
150
+ {
151
+ id: './node_modules/react/dist',
152
+ label: 'dist',
153
+ value: 0,
154
+ total: {
155
+ current: 100,
156
+ baseline: 100,
157
+ },
158
+ children: [
159
+ {
160
+ id: './node_modules/react/dist/react.production.js',
161
+ label: 'react.production.js',
162
+ value: 100,
163
+ item: {
164
+ key: './node_modules/react/dist/react.production.js',
165
+ runs: [{ value: 100 }, { value: 100 }],
166
+ },
167
+ },
168
+ ],
169
+ },
170
+ ],
171
+ },
172
+ ],
173
+ },
174
+ ],
175
+ },
176
+ {
177
+ id: 'favicon.ico',
178
+ label: 'favicon.ico',
179
+ value: 10,
180
+ item: {
181
+ key: 'favicon.ico',
182
+ runs: [{ value: 10 }, { value: 10 }],
183
+ },
184
+ },
185
+ ],
186
+ });
187
+ });
188
+ });
@@ -1 +1,2 @@
1
1
  export * from './metrics-treemap';
2
+ export { getTreemapNodes, getTreemapNodesGroupedByPath } from './metrics-treemap.utils';
@@ -0,0 +1,52 @@
1
+ import type { ReportMetricRow } from '@bundle-stats/utils';
2
+
3
+ export interface TreeTotal {
4
+ current: number;
5
+ baseline: number;
6
+ }
7
+
8
+ export interface TreeLeaf {
9
+ /**
10
+ * Node id - file/directory path
11
+ */
12
+ id: string;
13
+ /**
14
+ * Node label - file/directory baseline
15
+ */
16
+ label: string;
17
+ /**
18
+ * Node value - the max amount between item run values
19
+ */
20
+ value: number;
21
+ /**
22
+ * Corresponding report metric item
23
+ */
24
+ item: ReportMetricRow;
25
+ }
26
+
27
+ export interface Tree {
28
+ /**
29
+ * Node id - file/directory path
30
+ */
31
+ id: string;
32
+ /**
33
+ * Node label - file/directory baseline
34
+ */
35
+ label: string;
36
+ /**
37
+ * Node value - 0 for groups
38
+ */
39
+ value: number;
40
+ /**
41
+ * List of children nodes
42
+ */
43
+ children: TreeNodeChildren;
44
+ /**
45
+ * children total values for nested
46
+ */
47
+ total?: TreeTotal;
48
+ }
49
+
50
+ export type TreeNode = Tree | TreeLeaf;
51
+
52
+ export type TreeNodeChildren = Array<TreeNode>;
@@ -0,0 +1,2 @@
1
+ export const TILE_GROUP_LABEL = 'View children entries';
2
+ export const TILE_LABEL = 'View entry info';
@@ -2,6 +2,9 @@
2
2
  position: relative;
3
3
  aspect-ratio: 16/9;
4
4
  background: var(--color-background);
5
+ border-bottom-left-radius: inherit;
6
+ border-bottom-right-radius: inherit;
7
+ overflow: hidden;
5
8
  }
6
9
 
7
10
  .canvas {
@@ -10,132 +13,235 @@
10
13
  top: 0;
11
14
  width: 100%;
12
15
  height: 100%;
13
- fill: var(--color-text);
14
- font-family: var(--font-family);
15
- background: var(--color-outline);
16
+ background: var(--color-background);
16
17
  }
17
18
 
18
- /** Tile overlay fill background transition */
19
- .root {
20
- transition: var(--ui-transition-out);
21
- transition-property: opacity;
19
+ /**
20
+ * Tile group
21
+ */
22
+ .tileGroup {
23
+ position: absolute;
22
24
  }
23
25
 
24
- .leafBackground {
25
- fill: var(--color-background);
26
+ .tileGroupTitle {
27
+ width: 100%;
28
+ padding: 4px var(--space-xxxsmall);
29
+ color: var(--color-text);
30
+ font-size: 10px;
31
+ font-family: var(--font-family-fixed);
32
+ font-weight: 500;
33
+ line-height: 12px;
34
+ overflow: hidden;
35
+ white-space: nowrap;
36
+ text-overflow: ellipsis;
26
37
  }
27
38
 
28
- .leafBackdrop {
29
- fill: var(--color-background);
30
- transition: var(--ui-transition-out);
31
- transition-property: opacity;
32
- opacity: 0.2;
39
+ .tileGroupTitleTotal {
40
+ margin-left: var(--space-xxxsmall);
41
+ font-weight: 300;
33
42
  }
34
43
 
35
- .leaf:hover .leafBackdrop {
44
+ /** Tile group size variation */
45
+ .tileGroupSizeDefault {
36
46
  transition: var(--ui-transition-in);
37
- opacity: 0.5;
47
+ transition-property: left, top, width, height;
48
+ }
49
+
50
+ /** Tile group nested variation */
51
+ .nested .tileGroup {
52
+ background-color: rgba(27, 26, 33, 0.04);
53
+ outline: 1px solid rgba(255, 255, 255, 0.5);
54
+ }
55
+
56
+ .nested .tileGroup:has(> .tileGroupTitle:hover),
57
+ .nested .tileGroup:has(> .tile:hover) {
58
+ outline: 1px solid rgba(255, 255, 255, 1);
59
+ background-color: rgba(27, 26, 33, 0.08);
60
+ }
61
+
62
+ .nested .tileGroup--NEGATIVE:has(> .tileGroupTitle:hover),
63
+ .nested .tileGroup--NEGATIVE:has(> .tile:hover) {
64
+ background-color: rgba(194, 31, 37, 0.2);
65
+ }
66
+
67
+ .nested .tileGroup--NEGATIVE {
68
+ background-color: rgba(194, 31, 37, 0.1);
69
+ }
70
+
71
+ .nested .tileGroup--NEGATIVE:has(> .tileGroupTitle:hover),
72
+ .nested .tileGroup--NEGATIVE:has(> .tile:hover) {
73
+ background-color: rgba(194, 31, 37, 0.2);
74
+ }
75
+
76
+ .nested .tileGroup--POSITIVE {
77
+ background-color: rgba(42, 147, 39, 0.05);
78
+ }
79
+
80
+ .nested .tileGroup--POSITIVE:has(> .tileGroupTitle:hover),
81
+ .nested .tileGroup--POSITIVE:has(> .tile:hover) {
82
+ background-color: rgba(42, 147, 39, 0.1);
83
+ }
84
+
85
+ /* reset bacground color when having a not changed group */
86
+ .nested .tileGroup--POSITIVE > .tileGroup--NO_CHANGE,
87
+ .nested .tileGroup--NEGATIVE > .tileGroup--NO_CHANGE {
88
+ background-color: var(--color-background);
89
+ background-image: linear-gradient(rgba(27, 26, 33, 0.04), rgba(27, 26, 33, 0.04));
90
+ }
91
+
92
+ .nested .tileGroup--POSITIVE > .tileGroup--NO_CHANGE:has(> .tileGroupTitle:hover),
93
+ .nested .tileGroup--POSITIVE > .tileGroup--NO_CHANGE:has(> .tile:hover),
94
+ .nested .tileGroup--NEGATIVE > .tileGroup--NO_CHANGE:has(> .tileGroupTitle:hover),
95
+ .nested .tileGroup--NEGATIVE > .tileGroup--NEGATIVE > .tileGroup--NO_CHANGE:has(> .tile:hover) {
96
+ background-color: var(--color-background);
97
+ background-image: linear-gradient(rgba(27, 26, 33, 0.08), rgba(27, 26, 33, 0.08));
38
98
  }
39
99
 
40
100
  /** Leaf wrapper button */
41
- .leafAction {
101
+ .tile {
102
+ position: absolute;
42
103
  appearance: none;
104
+ outline: 1px solid rgba(255, 255, 255, 1);
43
105
  border: 0;
44
106
  border-radius: 0;
45
107
  padding: 0;
46
- background: none;
47
- width: 100%;
48
- height: 100%;
108
+ background: var(--color-background);
49
109
  display: flex;
50
110
  align-items: center;
51
111
  font-family: var(--font-family-fixed);
52
112
  font-size: var(--size-small);
53
113
  line-height: var(--line-height-heading);
54
114
  text-align: left;
115
+ transition: var(--ui-transition-out);
55
116
  }
56
117
 
57
- .leafContent {
118
+ .tile::before {
119
+ content: "";
120
+ display: block;
121
+ position: absolute;
122
+ z-index: 1;
123
+ left: 0;
124
+ top: 0;
125
+ width: 100%;
126
+ height: 100%;
127
+ background-color: currentColor;
128
+ }
129
+
130
+ .tileContent {
131
+ position: relative;
132
+ z-index: 1;
58
133
  width: 100%;
59
134
  height: 100%;
60
135
  display: flex;
61
136
  flex-flow: column;
62
137
  justify-content: center;
63
138
  padding: var(--space-xxsmall) var(--space-xxsmall);
64
- gap: var(--space-xxsmall);
139
+ gap: var(--space-xxxsmall);
65
140
  line-height: var(--line-height-heading);
66
141
  }
67
142
 
68
- /** Align label to other elements on the first column leafs */
69
- .leafWrapper[x="0"] .leafContent {
143
+ /** Align label to other elements on the first column cells */
144
+ .tileFirstCol .tileContent {
70
145
  padding-left: var(--space-small);
71
146
  }
72
147
 
73
- .leadContentLabel {
148
+ .tileContentLabel {
74
149
  flex: 0 1 auto;
75
150
  width: 100%;
76
151
  min-width: 0;
77
152
  max-height: calc(2em * var(--line-height-heading));
78
153
  overflow: hidden;
79
- word-break: break-word;
80
154
  }
81
155
 
82
- .leadContentValue {
156
+ .tileContentValue {
83
157
  flex: 0 0 auto;
84
158
  max-width: calc(100% + var(--space-xxsmall));
85
159
  white-space: nowrap;
86
160
  overflow: hidden;
87
161
  }
88
162
 
89
- .leadContentMetric {
163
+ .tileContentMetric {
90
164
  font-weight: bold;
91
165
  }
92
166
 
93
- .leadContentDelta {
167
+ .tileContentDelta {
94
168
  margin-left: var(--space-xxxsmall);
95
169
  }
96
170
 
97
171
  /** Tile size variation */
98
- .leafSmall .leafContent {
172
+ .tileSizeSmall .tileContent {
99
173
  padding: var(--space-xxxsmall) var(--space-xxsmall);
100
174
  gap: 0;
101
175
  font-size: var(--size-xsmall);
102
176
  }
103
177
 
104
- .leafSmall .leadContentLabel {
178
+ .tileSizeSmall .tileContentLabel {
105
179
  margin-top: 0;
106
180
  }
107
181
 
182
+ .tileSizeDefault {
183
+ transition: var(--ui-transition-in);
184
+ transition-property: left top width height;
185
+ }
186
+
108
187
  /** Tile diff variation */
109
- .leaf-NO_CHANGE .leafBackdrop {
110
- fill: transparent;
188
+ .tile {
189
+ color: var(--color-text);
190
+ transition: var(--ui-transition-out);
191
+ }
192
+
193
+ .tile::before {
194
+ color: var(--color-highlight);
195
+ transition: var(--ui-transition-out);
196
+ transition-property: opacity;
197
+ opacity: 0.5;
111
198
  }
112
199
 
113
- .leaf-NO_CHANGE .leafAction {
114
- color: var(--color-text-light);
200
+ .tile:hover::before {
201
+ transition: var(--ui-transition-in);
202
+ opacity: 0.4;
115
203
  }
116
204
 
117
- .leaf-HIGH_NEGATIVE .leafBackdrop {
118
- fill: var(--color-red-100);
205
+ .tile-NO_CHANGE {
206
+ color: var(--color-text-ultra-light);
119
207
  }
120
208
 
121
- .leaf-NEGATIVE .leafBackdrop {
122
- fill: var(--color-red-50);
209
+ .tile-NO_CHANGE::before {
210
+ color: var(--color-gray-50);
123
211
  }
124
212
 
125
- .leaf-LOW_NEGATIVE .leafBackdrop {
126
- fill: var(--color-red-25);
213
+ .tile-HIGH_NEGATIVE::before {
214
+ color: var(--color-red-100);
127
215
  }
128
216
 
129
- .leaf-LOW_POSITIVE .leafBackdrop {
130
- fill: var(--color-green-25);
217
+ .tile-NEGATIVE::before {
218
+ color: var(--color-red-50);
131
219
  }
132
220
 
133
- .leaf-POSITIVE .leafBackdrop {
134
- fill: var(--color-green-50);
221
+ .tile-LOW_NEGATIVE::before {
222
+ color: var(--color-red-50);
223
+ opacity: 0.6;
135
224
  }
136
225
 
137
- .leaf-HIGH_POSITIVE .leafBackdrop {
138
- fill: var(--color-green-100);
226
+ .tile-LOW_NEGATIVE:hover::before {
227
+ opacity: 0.5;
228
+ }
229
+
230
+ .tile-LOW_POSITIVE::before {
231
+ color: var(--color-green-50);
232
+ opacity: 0.6;
233
+ }
234
+
235
+ .tile-LOW_POSITIVE:hover::before {
236
+ opacity: 0.5;
237
+ }
238
+
239
+ .tile-POSITIVE::before {
240
+ color: var(--color-green-50);
241
+ }
242
+
243
+ .tile-HIGH_POSITIVE::before {
244
+ color: var(--color-green-100);
139
245
  }
140
246
 
141
247
  /** empty message */
@@ -156,7 +262,7 @@
156
262
  }
157
263
 
158
264
  /** tooltip */
159
- .leafContentTooltipAnchor {
265
+ .tileContentTooltipAnchor {
160
266
  width: 100%;
161
267
  height: 100%;
162
268
  }
@@ -172,13 +278,19 @@
172
278
  will-change: filter;
173
279
  background: var(--color-light);
174
280
  font-size: var(--size-small);
281
+ pointer-events: none;
175
282
  }
176
283
 
177
- .leafTooltipArrow svg {
284
+ .tileTooltipArrow svg {
178
285
  display: block;
179
286
  fill: var(--color-background) !important;
180
287
  }
181
288
 
182
- .leafTooltipContentTitle {
183
- font-size: var(--size-medium);
289
+ .tileTooltipContentTitle {
290
+ font-size: var(--size-small);
291
+ }
292
+
293
+ /* prevent tooltip portal wrapper from capturing events */
294
+ div[role="presentation"]:has(.tooltip) {
295
+ pointer-events: none;
184
296
  }
@@ -2,22 +2,56 @@ import React from 'react';
2
2
  import { Meta, StoryObj } from '@storybook/react';
3
3
  // eslint-disable-next-line import/no-extraneous-dependencies
4
4
  import { action } from '@storybook/addon-actions';
5
+ import { createJobs } from '@bundle-stats/utils';
6
+ import * as webpack from '@bundle-stats/utils/lib-esm/webpack';
5
7
 
6
- // eslint-disable-next-line import/no-relative-packages
8
+ /* eslint-disable import/no-relative-packages */
9
+ import baselineData from '../../../../../fixtures/webpack-stats.baseline.json';
10
+ import currentData from '../../../../../fixtures/webpack-stats.current.json';
7
11
  import moduleItemsFixture from '../../../../../fixtures/module-items.json';
8
- import { MetricsTreemap } from '.';
12
+ /* eslint-enable import/no-relative-packages */
13
+ import { MetricsTreemap, getTreemapNodes, getTreemapNodesGroupedByPath } from '.';
9
14
 
10
- export default {
15
+ const meta: Meta<typeof MetricsTreemap> = {
11
16
  title: 'Components/MetricsTreemap',
12
17
  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
18
  args: {
20
- items: moduleItemsFixture,
21
19
  onItemClick: action('CLICK'),
22
20
  },
23
21
  };
22
+
23
+ type Story = StoryObj<typeof meta>;
24
+
25
+ export default meta;
26
+
27
+ const MULTIPLE_JOBS = createJobs([{ webpack: currentData }, { webpack: baselineData }]);
28
+
29
+ export const Assets: Story = {
30
+ render: (props) => <MetricsTreemap style={{ maxWidth: 'var(--max-width)' }} {...props} />,
31
+ args: {
32
+ treeNodes: getTreemapNodes(webpack.compareBySection.assets(MULTIPLE_JOBS)),
33
+ },
34
+ };
35
+
36
+ export const AssetsNested: Story = {
37
+ render: (props) => <MetricsTreemap style={{ maxWidth: 'var(--max-width)' }} {...props} />,
38
+ args: {
39
+ treeNodes: getTreemapNodesGroupedByPath(webpack.compareBySection.assets(MULTIPLE_JOBS)),
40
+ nested: true,
41
+ },
42
+ };
43
+
44
+ export const Modules: Story = {
45
+ render: (props) => <MetricsTreemap style={{ maxWidth: 'var(--max-width)' }} {...props} />,
46
+ args: {
47
+ treeNodes: getTreemapNodes(moduleItemsFixture),
48
+ },
49
+ };
50
+
51
+ export const ModulesNested: Story = {
52
+ render: (props) => <MetricsTreemap style={{ maxWidth: 'var(--max-width)' }} {...props} />,
53
+ args: {
54
+ treeNodes: getTreemapNodesGroupedByPath(moduleItemsFixture),
55
+ nested: true,
56
+ },
57
+ };