@bundle-stats/ui 3.3.0-alpha.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/CHANGELOG.md +74 -11
  2. package/lib/app/app.js +124 -104
  3. package/lib/app/app.module.css +11 -4
  4. package/lib/app/app.stories.js +1 -22
  5. package/lib/app/header/header.js +1 -10
  6. package/lib/assets/icons.svg +0 -8
  7. package/lib/components/asset-info/asset-info.module.css +1 -0
  8. package/lib/components/bundle-assets/bundle-assets.js +104 -52
  9. package/lib/components/bundle-assets/bundle-assets.module.css +24 -26
  10. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +16 -43
  11. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  12. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +1 -20
  13. package/lib/components/bundle-modules/bundle-modules.js +68 -68
  14. package/lib/components/bundle-modules/bundle-modules.module.css +11 -2
  15. package/lib/components/bundle-modules/bundle-modules.utils.js +14 -10
  16. package/lib/components/bundle-modules/index.js +4 -4
  17. package/lib/components/bundle-packages/bundle-packages.js +100 -44
  18. package/lib/components/bundle-packages/bundle-packages.module.css +17 -21
  19. package/lib/components/delta/delta.module.css +1 -0
  20. package/lib/components/job-header/job-header.js +3 -1
  21. package/lib/components/job-header/job-header.module.css +6 -8
  22. package/lib/components/jobs-header/jobs-header.module.css +5 -0
  23. package/lib/components/metrics-table/metrics-table.js +72 -59
  24. package/lib/components/metrics-table/metrics-table.module.css +18 -7
  25. package/lib/components/metrics-table-search/metrics-table-search.module.css +5 -4
  26. package/lib/components/metrics-table-title/metrics-table-title.js +9 -7
  27. package/lib/components/metrics-table-title/metrics-table-title.module.css +2 -0
  28. package/lib/components/module-info/module-info.js +2 -2
  29. package/lib/components/module-info/module-info.module.css +1 -0
  30. package/lib/components/summary/summary.js +7 -12
  31. package/lib/components/summary/summary.module.css +1 -1
  32. package/lib/components/summary/summary.stories.js +0 -29
  33. package/lib/components/summary-item/summary-item.js +18 -38
  34. package/lib/components/summary-item/summary-item.module.css +1 -34
  35. package/lib/components/summary-item/summary-item.stories.js +53 -51
  36. package/lib/components/total-size-type-title/total-size-type-title.js +7 -3
  37. package/lib/constants.js +4 -4
  38. package/lib/css/default.css +14 -3
  39. package/lib/css/variables.css +17 -17
  40. package/lib/hooks/search-params.js +31 -31
  41. package/lib/layout/box/box.module.css +9 -0
  42. package/lib/layout/footer/footer.module.css +1 -1
  43. package/lib/layout/index.js +8 -0
  44. package/lib/layout/separator.js +48 -0
  45. package/lib/layout/separator.module.css +5 -0
  46. package/lib/ui/alert/alert.js +3 -13
  47. package/lib/ui/dropdown/dropdown.js +21 -26
  48. package/lib/ui/dropdown/dropdown.module.css +11 -12
  49. package/lib/ui/dropdown/dropdown.stories.js +2 -9
  50. package/lib/ui/empty-set/empty-set.js +5 -4
  51. package/lib/ui/empty-set/empty-set.module.css +2 -2
  52. package/lib/ui/filters/filters.container.js +1 -1
  53. package/lib/ui/filters/filters.js +22 -7
  54. package/lib/ui/filters/filters.module.css +3 -3
  55. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js +1 -1
  56. package/lib/ui/hover-card/hover-card.js +102 -0
  57. package/lib/ui/hover-card/hover-card.module.css +29 -0
  58. package/lib/ui/hover-card/hover-card.stories.js +56 -0
  59. package/lib/{components/budget-info → ui/hover-card}/index.js +4 -4
  60. package/lib/ui/icon/icon.js +6 -8
  61. package/lib/ui/icon/icon.module.css +1 -0
  62. package/lib/ui/index.js +8 -8
  63. package/lib/ui/table/table.js +5 -74
  64. package/lib/ui/table/table.module.css +41 -25
  65. package/lib/ui/table/table.stories.js +1 -1
  66. package/lib/ui/{popover → tag}/index.js +4 -4
  67. package/lib/ui/tag/tag.js +72 -0
  68. package/lib/ui/tag/tag.module.css +55 -0
  69. package/lib/ui/tag/tag.stories.js +38 -0
  70. package/lib/ui/tooltip/tooltip.js +10 -9
  71. package/lib/ui/tooltip/tooltip.module.css +2 -1
  72. package/lib-esm/app/app.js +119 -103
  73. package/lib-esm/app/app.module.css +11 -4
  74. package/lib-esm/app/app.stories.js +1 -22
  75. package/lib-esm/app/header/header.js +1 -9
  76. package/lib-esm/assets/icons.svg +0 -8
  77. package/lib-esm/components/asset-info/asset-info.module.css +1 -0
  78. package/lib-esm/components/bundle-assets/bundle-assets.js +97 -56
  79. package/lib-esm/components/bundle-assets/bundle-assets.module.css +24 -26
  80. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +13 -27
  81. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  82. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +0 -18
  83. package/lib-esm/components/bundle-modules/bundle-modules.js +50 -51
  84. package/lib-esm/components/bundle-modules/bundle-modules.module.css +11 -2
  85. package/lib-esm/components/bundle-modules/bundle-modules.utils.js +14 -6
  86. package/lib-esm/components/bundle-modules/index.js +5 -3
  87. package/lib-esm/components/bundle-packages/bundle-packages.js +88 -41
  88. package/lib-esm/components/bundle-packages/bundle-packages.module.css +17 -21
  89. package/lib-esm/components/delta/delta.module.css +1 -0
  90. package/lib-esm/components/job-header/job-header.js +2 -1
  91. package/lib-esm/components/job-header/job-header.module.css +6 -8
  92. package/lib-esm/components/jobs-header/jobs-header.module.css +5 -0
  93. package/lib-esm/components/metrics-table/metrics-table.js +61 -53
  94. package/lib-esm/components/metrics-table/metrics-table.module.css +18 -7
  95. package/lib-esm/components/metrics-table-search/metrics-table-search.module.css +5 -4
  96. package/lib-esm/components/metrics-table-title/metrics-table-title.js +8 -7
  97. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +2 -0
  98. package/lib-esm/components/module-info/module-info.js +2 -2
  99. package/lib-esm/components/module-info/module-info.module.css +1 -0
  100. package/lib-esm/components/summary/summary.js +7 -11
  101. package/lib-esm/components/summary/summary.module.css +1 -1
  102. package/lib-esm/components/summary/summary.stories.js +0 -27
  103. package/lib-esm/components/summary-item/summary-item.js +16 -36
  104. package/lib-esm/components/summary-item/summary-item.module.css +1 -34
  105. package/lib-esm/components/summary-item/summary-item.stories.js +38 -50
  106. package/lib-esm/components/total-size-type-title/total-size-type-title.js +6 -3
  107. package/lib-esm/constants.js +4 -4
  108. package/lib-esm/css/default.css +14 -3
  109. package/lib-esm/css/variables.css +17 -17
  110. package/lib-esm/hooks/search-params.js +27 -28
  111. package/lib-esm/layout/box/box.module.css +9 -0
  112. package/lib-esm/layout/footer/footer.module.css +1 -1
  113. package/lib-esm/layout/index.js +1 -0
  114. package/lib-esm/layout/separator.js +28 -0
  115. package/lib-esm/layout/separator.module.css +5 -0
  116. package/lib-esm/ui/alert/alert.js +3 -6
  117. package/lib-esm/ui/dropdown/dropdown.js +20 -25
  118. package/lib-esm/ui/dropdown/dropdown.module.css +11 -12
  119. package/lib-esm/ui/dropdown/dropdown.stories.js +2 -7
  120. package/lib-esm/ui/empty-set/empty-set.js +4 -4
  121. package/lib-esm/ui/empty-set/empty-set.module.css +2 -2
  122. package/lib-esm/ui/filters/filters.js +20 -5
  123. package/lib-esm/ui/filters/filters.module.css +3 -3
  124. package/lib-esm/ui/hover-card/hover-card.js +83 -0
  125. package/lib-esm/ui/hover-card/hover-card.module.css +29 -0
  126. package/lib-esm/ui/hover-card/hover-card.stories.js +35 -0
  127. package/lib-esm/ui/hover-card/index.js +1 -0
  128. package/lib-esm/ui/icon/icon.js +3 -5
  129. package/lib-esm/ui/icon/icon.module.css +1 -0
  130. package/lib-esm/ui/index.js +1 -1
  131. package/lib-esm/ui/table/table.js +5 -65
  132. package/lib-esm/ui/table/table.module.css +41 -25
  133. package/lib-esm/ui/table/table.stories.js +1 -1
  134. package/lib-esm/ui/tag/index.js +1 -0
  135. package/lib-esm/ui/tag/tag.js +45 -0
  136. package/lib-esm/ui/tag/tag.module.css +55 -0
  137. package/lib-esm/ui/tag/tag.stories.js +23 -0
  138. package/lib-esm/ui/tooltip/tooltip.js +10 -9
  139. package/lib-esm/ui/tooltip/tooltip.module.css +2 -1
  140. package/package.json +33 -31
  141. package/src/app/app.jsx +135 -145
  142. package/src/app/app.module.css +11 -4
  143. package/src/app/header/header.jsx +0 -10
  144. package/src/assets/icons.svg +0 -8
  145. package/src/components/asset-info/asset-info.module.css +1 -0
  146. package/src/components/bundle-assets/bundle-assets.jsx +85 -31
  147. package/src/components/bundle-assets/bundle-assets.module.css +24 -26
  148. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +13 -26
  149. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  150. package/src/components/bundle-modules/bundle-modules.jsx +53 -36
  151. package/src/components/bundle-modules/bundle-modules.module.css +11 -2
  152. package/src/components/bundle-modules/bundle-modules.utils.js +16 -4
  153. package/src/components/bundle-modules/index.jsx +3 -0
  154. package/src/components/bundle-packages/bundle-packages.jsx +89 -39
  155. package/src/components/bundle-packages/bundle-packages.module.css +17 -21
  156. package/src/components/delta/delta.module.css +1 -0
  157. package/src/components/job-header/job-header.jsx +2 -1
  158. package/src/components/job-header/job-header.module.css +6 -8
  159. package/src/components/jobs-header/jobs-header.module.css +5 -0
  160. package/src/components/metrics-table/metrics-table.jsx +53 -44
  161. package/src/components/metrics-table/metrics-table.module.css +18 -7
  162. package/src/components/metrics-table-search/metrics-table-search.module.css +5 -4
  163. package/src/components/metrics-table-title/metrics-table-title.jsx +20 -21
  164. package/src/components/metrics-table-title/metrics-table-title.module.css +2 -0
  165. package/src/components/module-info/module-info.jsx +3 -7
  166. package/src/components/module-info/module-info.module.css +1 -0
  167. package/src/components/summary/summary.jsx +7 -8
  168. package/src/components/summary/summary.module.css +1 -1
  169. package/src/components/summary-item/summary-item.jsx +23 -40
  170. package/src/components/summary-item/summary-item.module.css +1 -34
  171. package/src/components/total-size-type-title/total-size-type-title.jsx +6 -9
  172. package/src/constants.js +11 -7
  173. package/src/css/default.css +14 -3
  174. package/src/css/variables.css +17 -17
  175. package/src/hooks/search-params.js +42 -33
  176. package/src/layout/box/box.module.css +9 -0
  177. package/src/layout/footer/footer.module.css +1 -1
  178. package/src/layout/index.js +1 -0
  179. package/src/layout/separator.jsx +25 -0
  180. package/src/layout/separator.module.css +5 -0
  181. package/src/ui/alert/alert.jsx +2 -7
  182. package/src/ui/dropdown/dropdown.jsx +16 -22
  183. package/src/ui/dropdown/dropdown.module.css +11 -12
  184. package/src/ui/empty-set/empty-set.jsx +25 -21
  185. package/src/ui/empty-set/empty-set.module.css +2 -2
  186. package/src/ui/filters/filters.jsx +64 -53
  187. package/src/ui/filters/filters.module.css +3 -3
  188. package/src/ui/hover-card/hover-card.jsx +73 -0
  189. package/src/ui/hover-card/hover-card.module.css +29 -0
  190. package/src/ui/hover-card/index.js +1 -0
  191. package/src/ui/icon/icon.jsx +11 -9
  192. package/src/ui/icon/icon.module.css +1 -0
  193. package/src/ui/index.js +1 -1
  194. package/src/ui/table/table.jsx +5 -52
  195. package/src/ui/table/table.module.css +41 -25
  196. package/src/ui/tag/index.js +1 -0
  197. package/src/ui/tag/tag.jsx +49 -0
  198. package/src/ui/tag/tag.module.css +55 -0
  199. package/src/ui/tooltip/tooltip.jsx +10 -14
  200. package/src/ui/tooltip/tooltip.module.css +2 -1
  201. package/lib/assets/icons/alert-circle.svg +0 -1
  202. package/lib/assets/icons/check-circle.svg +0 -1
  203. package/lib/components/budget-info/budget-info.js +0 -53
  204. package/lib/components/budget-info/budget-info.module.css +0 -28
  205. package/lib/components/budget-info/budget-info.stories.js +0 -42
  206. package/lib/components/budget-insights/budget-insights.js +0 -200
  207. package/lib/components/budget-insights/budget-insights.module.css +0 -53
  208. package/lib/components/budget-insights/budget-insights.stories.js +0 -104
  209. package/lib/components/budget-insights/index.js +0 -18
  210. package/lib/ui/popover/popover.js +0 -92
  211. package/lib/ui/popover/popover.module.css +0 -66
  212. package/lib/ui/popover/popover.stories.js +0 -26
  213. package/lib-esm/assets/icons/alert-circle.svg +0 -1
  214. package/lib-esm/assets/icons/check-circle.svg +0 -1
  215. package/lib-esm/components/budget-info/budget-info.js +0 -37
  216. package/lib-esm/components/budget-info/budget-info.module.css +0 -28
  217. package/lib-esm/components/budget-info/budget-info.stories.js +0 -26
  218. package/lib-esm/components/budget-info/index.js +0 -1
  219. package/lib-esm/components/budget-insights/budget-insights.js +0 -147
  220. package/lib-esm/components/budget-insights/budget-insights.module.css +0 -53
  221. package/lib-esm/components/budget-insights/budget-insights.stories.js +0 -84
  222. package/lib-esm/components/budget-insights/index.js +0 -1
  223. package/lib-esm/ui/popover/index.js +0 -1
  224. package/lib-esm/ui/popover/popover.js +0 -71
  225. package/lib-esm/ui/popover/popover.module.css +0 -66
  226. package/lib-esm/ui/popover/popover.stories.js +0 -14
  227. package/src/assets/icons/alert-circle.svg +0 -1
  228. package/src/assets/icons/check-circle.svg +0 -1
  229. package/src/components/budget-info/budget-info.jsx +0 -49
  230. package/src/components/budget-info/budget-info.module.css +0 -28
  231. package/src/components/budget-info/index.js +0 -1
  232. package/src/components/budget-insights/budget-insights.jsx +0 -152
  233. package/src/components/budget-insights/budget-insights.module.css +0 -53
  234. package/src/components/budget-insights/index.js +0 -1
  235. package/src/ui/popover/index.js +0 -1
  236. package/src/ui/popover/popover.jsx +0 -79
  237. package/src/ui/popover/popover.module.css +0 -66
@@ -1,6 +1,6 @@
1
1
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
- import React, { useCallback } from 'react';
3
+ import React, { useCallback, useMemo, useState } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import cx from 'classnames';
6
6
  import { PACKAGE_FILTERS, PACKAGES_SEPARATOR, PACKAGE_ID_SEPARATOR, getBundleModulesBySearch, getBundlePackagesByNameComponentLink } from '@bundle-stats/utils';
@@ -10,8 +10,9 @@ import { Stack } from '../../layout/stack';
10
10
  import { FlexStack } from '../../layout/flex-stack';
11
11
  import { EmptySet } from '../../ui/empty-set';
12
12
  import { Filters } from '../../ui/filters';
13
- import { Popover } from '../../ui/popover';
13
+ import { HoverCard } from '../../ui/hover-card';
14
14
  import { SortDropdown } from '../../ui/sort-dropdown';
15
+ import { Tag } from '../../ui/tag';
15
16
  import { Toolbar } from '../../ui/toolbar';
16
17
  import { FileName } from '../../ui/file-name';
17
18
  import { ComponentLink } from '../component-link';
@@ -32,36 +33,36 @@ const PackagePopoverContent = _ref => {
32
33
  const normalizedPackagePath = path || `node_modules/${fullName.split(PACKAGES_SEPARATOR).join('/node_modules/')}/`;
33
34
  const [normalizedName, packageId] = name.split(PACKAGE_ID_SEPARATOR);
34
35
  return /*#__PURE__*/React.createElement(Stack, {
35
- space: "xxsmall",
36
- className: css.packagePopover
36
+ space: "xsmall",
37
+ className: css.packageHoverCard
37
38
  }, /*#__PURE__*/React.createElement(Stack, {
38
39
  space: "xxxsmall"
39
40
  }, /*#__PURE__*/React.createElement("h3", {
40
- className: css.packagePopoverTitle
41
+ className: css.packageHoverCardTitle
41
42
  }, normalizedName, packageId && /*#__PURE__*/React.createElement("span", {
42
- className: css.packagePopoverTitleIndex
43
+ className: css.packageHoverCardTitleIndex
43
44
  }, `${PACKAGE_ID_SEPARATOR}${packageId}`)), /*#__PURE__*/React.createElement("p", {
44
- className: css.packagePopoverPath
45
+ className: css.packageHoverCardPath
45
46
  }, /*#__PURE__*/React.createElement(FileName, {
46
- className: css.packagePopoverPathValue,
47
+ className: css.packageHoverCardPathValue,
47
48
  name: normalizedPackagePath
48
49
  }))), /*#__PURE__*/React.createElement("ul", {
49
- className: css.packagePopoverList
50
+ className: css.packageHoverCardList
50
51
  }, /*#__PURE__*/React.createElement("li", {
51
- className: css.packagePopoverItem
52
+ className: css.packageHoverCardItem
52
53
  }, /*#__PURE__*/React.createElement("a", {
53
54
  href: `https://www.npmjs.com/package/${normalizedName}`,
54
55
  target: "_blank",
55
56
  rel: "noreferrer"
56
57
  }, "npmjs.com")), /*#__PURE__*/React.createElement("li", {
57
- className: css.packagePopoverItem
58
+ className: css.packageHoverCardItem
58
59
  }, /*#__PURE__*/React.createElement("a", {
59
60
  href: `https://bundlephobia.com/result?p=${normalizedName}`,
60
61
  target: "_blank",
61
62
  rel: "noreferrer"
62
63
  }, "bundlephobia.com"))), /*#__PURE__*/React.createElement(Stack, {
63
64
  space: "xxxsmall",
64
- className: css.packagePopover.actions
65
+ className: css.packageHoverCardActions
65
66
  }, duplicate && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(CustomComponentLink, getBundlePackagesByNameComponentLink(normalizedName), "View all duplicate instances")), /*#__PURE__*/React.createElement(CustomComponentLink, getBundleModulesBySearch(normalizedPackagePath), "Search modules by package path")));
66
67
  };
67
68
 
@@ -76,39 +77,83 @@ PackagePopoverContent.defaultProps = {
76
77
  path: ''
77
78
  };
78
79
 
79
- const PackageRowHeader = _ref2 => {
80
+ const PackageName = _ref2 => {
80
81
  let {
81
- item,
82
+ packageName,
83
+ path,
84
+ showDuplicateFlag,
85
+ row,
82
86
  CustomComponentLink
83
87
  } = _ref2;
84
- const packageNames = item.label.split(PACKAGES_SEPARATOR);
88
+ const [showHoverCard, setHoverCard] = useState(false);
89
+ const handleOnMouseEnter = useCallback(() => setHoverCard(true), [showHoverCard]);
90
+ const label = useMemo(() => /*#__PURE__*/React.createElement(React.Fragment, null, showDuplicateFlag && row.duplicate && /*#__PURE__*/React.createElement(Tag, {
91
+ className: css.packageNameTagDuplicate,
92
+ title: "Duplicate package",
93
+ kind: Tag.KINDS.DANGER,
94
+ size: Tag.SIZES.SMALL
95
+ }), /*#__PURE__*/React.createElement("span", {
96
+ className: css.packageNameLabel
97
+ }, packageName)), [packageName, showDuplicateFlag, row]);
98
+
99
+ if (!showHoverCard) {
100
+ return /*#__PURE__*/React.createElement("span", {
101
+ className: css.packageName,
102
+ onMouseEnter: handleOnMouseEnter
103
+ }, label);
104
+ }
105
+
106
+ return /*#__PURE__*/React.createElement(HoverCard, {
107
+ className: css.packageName,
108
+ label: /*#__PURE__*/React.createElement("span", {
109
+ className: css.packageName
110
+ }, label)
111
+ }, /*#__PURE__*/React.createElement(PackagePopoverContent, {
112
+ name: packageName,
113
+ path: path,
114
+ fullName: row.label,
115
+ duplicate: row.duplicate,
116
+ CustomComponentLink: CustomComponentLink
117
+ }));
118
+ };
119
+
120
+ PackageName.propTypes = {
121
+ packageName: PropTypes.string.isRequired,
122
+ path: PropTypes.string.isRequired,
123
+ showDuplicateFlag: PropTypes.bool.isRequired,
124
+ row: PropTypes.shape({
125
+ label: PropTypes.string,
126
+ duplicate: PropTypes.bool,
127
+ runs: PropTypes.arrayOf(PropTypes.shape({
128
+ path: PropTypes.string
129
+ })).isRequired
130
+ }).isRequired,
131
+ CustomComponentLink: PropTypes.elementType.isRequired
132
+ };
133
+
134
+ const RowHeader = _ref3 => {
135
+ let {
136
+ row,
137
+ CustomComponentLink
138
+ } = _ref3;
139
+ const packageNames = row.label.split(PACKAGES_SEPARATOR);
85
140
  const {
86
141
  path
87
- } = item.runs[0] || {};
142
+ } = row.runs[0] || {};
88
143
  return /*#__PURE__*/React.createElement("span", {
89
144
  className: css.packageNames
90
- }, packageNames.map((packageName, index) => {
91
- // Render duplicate flag only for the last entry
92
- const duplicateFlag = index === packageNames.length - 1 && item.duplicate && /*#__PURE__*/React.createElement("span", {
93
- className: css.duplicate,
94
- title: "Duplicate package"
95
- }, "D");
96
- return /*#__PURE__*/React.createElement(Popover, {
97
- className: css.packageName,
98
- icon: duplicateFlag,
99
- label: packageName
100
- }, /*#__PURE__*/React.createElement(PackagePopoverContent, {
101
- name: packageName,
102
- path: path,
103
- fullName: item.label,
104
- duplicate: item.duplicate,
105
- CustomComponentLink: CustomComponentLink
106
- }));
107
- }));
145
+ }, packageNames.map((packageName, index) => /*#__PURE__*/React.createElement(PackageName, {
146
+ packageName: packageName,
147
+ path: path // Render duplicate flag only for the last entry
148
+ ,
149
+ showDuplicateFlag: index === packageNames.length - 1,
150
+ row: row,
151
+ CustomComponentLink: CustomComponentLink
152
+ })));
108
153
  };
109
154
 
110
- PackageRowHeader.propTypes = {
111
- item: PropTypes.shape({
155
+ RowHeader.propTypes = {
156
+ row: PropTypes.shape({
112
157
  label: PropTypes.string,
113
158
  duplicate: PropTypes.bool,
114
159
  runs: PropTypes.arrayOf(PropTypes.shape({
@@ -141,18 +186,18 @@ export const BundlePackages = props => {
141
186
  handleResetFilters: resetFilters,
142
187
  handleViewAll: resetAllFilters
143
188
  });
144
- const renderRowHeader = useCallback(item => /*#__PURE__*/React.createElement(PackageRowHeader, {
145
- item: item,
189
+ const renderRowHeader = useCallback(row => /*#__PURE__*/React.createElement(RowHeader, {
190
+ row: row,
146
191
  CustomComponentLink: CustomComponentLink
147
192
  }), [CustomComponentLink]);
148
193
  return /*#__PURE__*/React.createElement("section", {
149
194
  className: cx(css.root, className)
150
195
  }, /*#__PURE__*/React.createElement(Toolbar, {
151
196
  className: css.toolbar,
152
- renderActions: _ref3 => {
197
+ renderActions: _ref4 => {
153
198
  let {
154
199
  actionClassName
155
- } = _ref3;
200
+ } = _ref4;
156
201
  return /*#__PURE__*/React.createElement(FlexStack, {
157
202
  space: "xxsmall",
158
203
  className: cx(css.dropdown, actionClassName)
@@ -165,7 +210,9 @@ export const BundlePackages = props => {
165
210
  handleResetFilters: resetFilters
166
211
  }));
167
212
  }
168
- }, /*#__PURE__*/React.createElement(FlexStack, null, /*#__PURE__*/React.createElement(MetricsTableSearch, {
213
+ }, /*#__PURE__*/React.createElement(FlexStack, {
214
+ space: "xxsmall"
215
+ }, /*#__PURE__*/React.createElement(MetricsTableSearch, {
169
216
  className: css.toolbarSearch,
170
217
  placeholder: "Search by name",
171
218
  search: search,
@@ -12,23 +12,8 @@
12
12
  margin-right: -1px; /** collapse border */
13
13
  }
14
14
 
15
- .duplicate {
16
- margin-right: var(--space-xxxsmall);
17
- display: inline-block;
18
- width: var(--space-small);
19
- height: var(--space-small);
20
- font-size: 10px;
21
- font-weight: bold;
22
- line-height: var(--space-small);
23
- text-align: center;
24
- text-transform: uppercase;
25
- vertical-align: middle;
26
-
27
- background: var(--color-danger);
28
- color: var(--color-light);
29
- }
30
-
31
15
  .packageName {
16
+ display: inline-block;
32
17
  color: var(--color-text-light);
33
18
  }
34
19
 
@@ -43,22 +28,33 @@
43
28
  color: var(--color-text-ultra-light);
44
29
  }
45
30
 
46
- .packagePopover {
47
- min-width: 320px;
31
+ .packageNameTagDuplicate {
32
+ margin-right: var(--space-xxxsmall);
33
+ vertical-align: middle;
34
+ }
35
+
36
+ .packageNameLabel {
37
+ vertical-align: middle;
38
+ }
39
+
40
+ .packageNameTagDuplicate::before {
41
+ content: 'd';
48
42
  }
49
43
 
50
- .packagePopoverTitleIndex {
44
+
45
+ .packageHoverCardTitleIndex {
51
46
  color: var(--color-text-light);
52
47
  font-weight: normal;
53
48
  }
54
49
 
55
- .packagePopoverPathValue {
50
+ .packageHoverCardPathValue {
51
+ width: 100%;
56
52
  padding: var(--space-xxxsmall);
57
53
  background: var(--color-highlight-warning);
58
54
  font-family: var(--font-family-monospace);
59
55
  }
60
56
 
61
- .packagePopoverList {
57
+ .packageHoverCardList {
62
58
  padding: 0;
63
59
  list-style: inside;
64
60
  }
@@ -28,6 +28,7 @@
28
28
  }
29
29
 
30
30
  .inverted {
31
+ border-radius: var(--radius-small);
31
32
  background-color: var(--color-gray-ultra-light);
32
33
  color: var(--color-light);
33
34
  }
@@ -7,6 +7,7 @@ import { SOURCE_PATH_WEBPACK_STATS, formatDate, formatTime } from '@bundle-stats
7
7
  import { FlexStack } from '../../layout/flex-stack';
8
8
  import { Stack } from '../../layout/stack';
9
9
  import { Icon } from '../../ui/icon';
10
+ import { Tag } from '../../ui/tag';
10
11
  import css from './job-header.module.css';
11
12
  export const JobHeader = props => {
12
13
  const {
@@ -27,7 +28,7 @@ export const JobHeader = props => {
27
28
  space: "xxsmall"
28
29
  }, /*#__PURE__*/React.createElement("h1", {
29
30
  className: css.title
30
- }, /*#__PURE__*/React.createElement("span", null, `#${job.internalBuildNumber}`), tag && /*#__PURE__*/React.createElement("span", {
31
+ }, /*#__PURE__*/React.createElement("span", null, `#${job.internalBuildNumber}`), tag && /*#__PURE__*/React.createElement(Tag, {
31
32
  className: css.tag
32
33
  }, tag)), /*#__PURE__*/React.createElement(FlexStack, {
33
34
  className: css.meta,
@@ -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
+ }
@@ -1,6 +1,9 @@
1
1
  import _sum from "lodash/sum";
2
2
  import _isEmpty from "lodash/isEmpty";
3
3
  import _get from "lodash/get";
4
+
5
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
6
+
4
7
  import React, { useMemo } from 'react';
5
8
  import PropTypes from 'prop-types';
6
9
  import cx from 'classnames';
@@ -85,47 +88,60 @@ const getHeaderRows = (runs, items, showHeaderSum, title) => [{
85
88
  cells: runs.map(getHeaderTotalCells(items)).flat()
86
89
  }] : [])];
87
90
 
88
- const generateRowCells = (item, index, items) => {
89
- const isBaseline = index === items.length - 1; // eslint-disable-next-line react/destructuring-assignment
90
-
91
- if (!item || typeof item.value === 'undefined') {
92
- return ['-', ...(!isBaseline ? [''] : [])];
93
- }
91
+ const MetricsTableRow = _ref => {
92
+ let {
93
+ item,
94
+ renderRowHeader
95
+ } = _ref;
96
+ return /*#__PURE__*/React.createElement(Table.Tr, {
97
+ className: cx(!item.changed && styles.unchanged)
98
+ }, /*#__PURE__*/React.createElement(Table.Th, {
99
+ className: styles.metricName
100
+ }, renderRowHeader(item)), item.runs.map((run, index) => {
101
+ const isBaseline = index === item.runs.length - 1;
102
+ const valueClassName = cx(styles.value, !isBaseline && styles.current); // Empty cells if no value
94
103
 
95
- const {
96
- displayValue,
97
- deltaPercentage,
98
- displayDeltaPercentage,
99
- deltaType
100
- } = item;
101
- const cells = [/*#__PURE__*/React.createElement(Metric, {
102
- value: displayValue
103
- })];
104
+ if (!run || typeof run.value === 'undefined') {
105
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Table.Td, {
106
+ className: valueClassName
107
+ }, "-"), !isBaseline && /*#__PURE__*/React.createElement(Table.Td, {
108
+ className: styles.delta
109
+ }));
110
+ }
104
111
 
105
- if (!isBaseline) {
106
- cells.push(typeof deltaPercentage === 'number' && /*#__PURE__*/React.createElement(Delta, {
112
+ const {
113
+ displayValue,
114
+ deltaPercentage,
115
+ displayDeltaPercentage,
116
+ deltaType
117
+ } = run;
118
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Table.Td, {
119
+ className: valueClassName
120
+ }, /*#__PURE__*/React.createElement(Metric, {
121
+ value: displayValue
122
+ })), !isBaseline && typeof deltaPercentage === 'number' && /*#__PURE__*/React.createElement(Table.Td, {
123
+ className: styles.delta
124
+ }, /*#__PURE__*/React.createElement(Delta, {
107
125
  displayValue: displayDeltaPercentage,
108
126
  deltaType: deltaType
109
- }));
110
- }
111
-
112
- return cells;
127
+ })));
128
+ }));
113
129
  };
114
130
 
115
- const getRows = (runs, items, renderRowHeader) => items.map((item, index) => {
116
- const {
117
- changed
118
- } = item;
119
- return {
120
- key: (item == null ? void 0 : item.key) || index,
121
- className: changed ? '' : styles.unchanged,
122
- cells: [// Metric name
123
- renderRowHeader(item), // Metric item values
124
- ...item.runs.map(generateRowCells).flat()]
125
- };
126
- });
127
-
128
- export const MetricsTable = _ref => {
131
+ MetricsTableRow.propTypes = {
132
+ item: PropTypes.shape({
133
+ changed: PropTypes.bool,
134
+ runs: PropTypes.arrayOf(PropTypes.shape({
135
+ value: PropTypes.number,
136
+ displayValue: PropTypes.string,
137
+ deltaPercentage: PropTypes.number,
138
+ displayDeltaPercentage: PropTypes.string,
139
+ deltaType: PropTypes.string
140
+ }))
141
+ }).isRequired,
142
+ renderRowHeader: PropTypes.func.isRequired
143
+ };
144
+ export const MetricsTable = _ref2 => {
129
145
  let {
130
146
  className,
131
147
  renderRowHeader,
@@ -134,8 +150,9 @@ export const MetricsTable = _ref => {
134
150
  emptyMessage,
135
151
  showHeaderSum,
136
152
  headerRows,
137
- title
138
- } = _ref;
153
+ title,
154
+ ...restProps
155
+ } = _ref2;
139
156
  const {
140
157
  headers,
141
158
  columnClassNames
@@ -147,12 +164,11 @@ export const MetricsTable = _ref => {
147
164
  columnClassNames: headerColumns[0].cells.map(headerColumn => headerColumn.className)
148
165
  };
149
166
  }, [headerRows, runs, items, showHeaderSum, title]);
150
- const rows = useMemo(() => getRows(runs, items, renderRowHeader), [runs, items, renderRowHeader]);
151
167
  const rootClassName = cx(styles.root, className, runs.length > 1 && styles.multipleRuns, showHeaderSum && styles.showHeaderSum);
152
- return /*#__PURE__*/React.createElement(Table, {
168
+ return /*#__PURE__*/React.createElement(Table, _extends({
153
169
  className: rootClassName,
154
170
  compact: true
155
- }, /*#__PURE__*/React.createElement(Table.THead, null, headers.map(headerRow => {
171
+ }, restProps), /*#__PURE__*/React.createElement(Table.THead, null, headers.map(headerRow => {
156
172
  const {
157
173
  cells,
158
174
  className: rowClassName
@@ -162,19 +178,11 @@ export const MetricsTable = _ref => {
162
178
  return /*#__PURE__*/React.createElement(Table.Tr, {
163
179
  className: rowClassName
164
180
  }, cells.map(header => /*#__PURE__*/React.createElement(Table.Th, header)));
165
- })), /*#__PURE__*/React.createElement(Table.TBody, null, !_isEmpty(rows) ? rows.map(_ref2 => {
166
- let {
167
- key,
168
- className: rowClassName,
169
- cells
170
- } = _ref2;
171
- return /*#__PURE__*/React.createElement(Table.Tr, {
172
- key: key,
173
- className: rowClassName
174
- }, cells.map((cell, index) => /*#__PURE__*/React.createElement(Table.Td, {
175
- className: columnClassNames[index]
176
- }, cell)));
177
- }) : /*#__PURE__*/React.createElement(Table.Tr, null, /*#__PURE__*/React.createElement(Table.Td, {
181
+ })), /*#__PURE__*/React.createElement(Table.TBody, null, !_isEmpty(items) ? items.map(item => /*#__PURE__*/React.createElement(MetricsTableRow, {
182
+ key: item.key,
183
+ item: item,
184
+ renderRowHeader: renderRowHeader
185
+ })) : /*#__PURE__*/React.createElement(Table.Tr, null, /*#__PURE__*/React.createElement(Table.Td, {
178
186
  className: styles.empty,
179
187
  colSpan: (columnClassNames == null ? void 0 : columnClassNames.length) || 1
180
188
  }, emptyMessage))));
@@ -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);
@@ -4,7 +4,8 @@ import cx from 'classnames';
4
4
  import I18N from '../../i18n';
5
5
  import { FlexStack } from '../../layout/flex-stack';
6
6
  import { Stack } from '../../layout/stack';
7
- import { Popover } from '../../ui/popover';
7
+ import { Icon } from '../../ui/icon';
8
+ import { HoverCard } from '../../ui/hover-card';
8
9
  import css from './metrics-table-title.module.css';
9
10
  export const MetricsTableTitle = props => {
10
11
  const {
@@ -15,22 +16,22 @@ export const MetricsTableTitle = props => {
15
16
  popoverHref
16
17
  } = props;
17
18
  const rootClassName = cx(css.root, className);
18
- return /*#__PURE__*/React.createElement(Stack, {
19
+ return /*#__PURE__*/React.createElement(FlexStack, {
19
20
  space: "xxxsmall",
20
21
  className: rootClassName
21
- }, /*#__PURE__*/React.createElement(FlexStack, {
22
- space: "xxxsmall"
23
22
  }, /*#__PURE__*/React.createElement("span", null, title), info && /*#__PURE__*/React.createElement("span", {
24
23
  className: css.info
25
- }, info), (popoverInfo || popoverHref) && /*#__PURE__*/React.createElement(Popover, {
26
- icon: "help"
24
+ }, info), (popoverInfo || popoverHref) && /*#__PURE__*/React.createElement(HoverCard, {
25
+ label: /*#__PURE__*/React.createElement(Icon, {
26
+ glyph: "help"
27
+ })
27
28
  }, /*#__PURE__*/React.createElement(Stack, {
28
29
  space: "xxxsmall"
29
30
  }, popoverInfo && /*#__PURE__*/React.createElement("p", null, popoverInfo), popoverHref && /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement("a", {
30
31
  href: popoverHref,
31
32
  target: "_blank",
32
33
  rel: "noreferrer"
33
- }, I18N.READ_MORE))))));
34
+ }, I18N.READ_MORE)))));
34
35
  };
35
36
  MetricsTableTitle.propTypes = {
36
37
  className: PropTypes.string,
@@ -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
  }
@@ -22,7 +22,7 @@ export const ModuleInfo = props => {
22
22
  onClick
23
23
  } = props;
24
24
  return /*#__PURE__*/React.createElement(Stack, {
25
- space: "small",
25
+ space: "xsmall",
26
26
  className: className
27
27
  }, item.runs.map((run, index) => {
28
28
  const TitleComponent = index !== 0 ? 'h4' : 'h3';
@@ -32,7 +32,7 @@ export const ModuleInfo = props => {
32
32
  key: key
33
33
  }, /*#__PURE__*/React.createElement(TitleComponent, null, labels[index]), index === 0 && !_isEmpty(run == null ? void 0 : run.chunkIds) && /*#__PURE__*/React.createElement("div", {
34
34
  className: css.chunks
35
- }, /*#__PURE__*/React.createElement("strong", {
35
+ }, /*#__PURE__*/React.createElement("span", {
36
36
  className: css.chunksTitle
37
37
  }, "Chunks:"), run.chunkIds.map(chunkId => {
38
38
  const chunk = _find(chunks, {
@@ -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
  }