@bundle-stats/ui 3.3.0-alpha.1 → 3.3.1-beta.8

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 (205) hide show
  1. package/CHANGELOG.md +65 -13
  2. package/build-storybook.log +4691 -0
  3. package/lib/app/app.js +137 -102
  4. package/lib/app/app.module.css +11 -4
  5. package/lib/app/header/header.js +1 -10
  6. package/lib/components/asset-info/asset-info.module.css +1 -0
  7. package/lib/components/bundle-assets/bundle-assets.js +104 -52
  8. package/lib/components/bundle-assets/bundle-assets.module.css +24 -26
  9. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +13 -3
  10. package/lib/components/bundle-modules/bundle-modules.js +68 -68
  11. package/lib/components/bundle-modules/bundle-modules.module.css +11 -2
  12. package/lib/components/bundle-modules/bundle-modules.utils.js +14 -10
  13. package/lib/components/bundle-modules/index.js +4 -4
  14. package/lib/components/bundle-packages/bundle-packages.js +100 -44
  15. package/lib/components/bundle-packages/bundle-packages.module.css +17 -21
  16. package/lib/components/delta/delta.module.css +1 -0
  17. package/lib/components/job-header/job-header.js +3 -1
  18. package/lib/components/job-header/job-header.module.css +6 -8
  19. package/lib/components/jobs-header/jobs-header.module.css +5 -0
  20. package/lib/components/metrics-table/metrics-table.js +72 -59
  21. package/lib/components/metrics-table/metrics-table.module.css +18 -7
  22. package/lib/components/metrics-table-search/metrics-table-search.module.css +5 -4
  23. package/lib/components/metrics-table-title/metrics-table-title.js +9 -7
  24. package/lib/components/metrics-table-title/metrics-table-title.module.css +2 -0
  25. package/lib/components/module-info/module-info.js +2 -2
  26. package/lib/components/module-info/module-info.module.css +1 -0
  27. package/lib/components/summary/summary.js +1 -1
  28. package/lib/components/summary-item/summary-item.js +15 -18
  29. package/lib/components/summary-item/summary-item.module.css +1 -23
  30. package/lib/components/total-size-type-title/total-size-type-title.js +7 -3
  31. package/lib/constants.js +1 -1
  32. package/lib/css/default.css +14 -3
  33. package/lib/css/variables.css +17 -17
  34. package/lib/hooks/search-params.js +31 -31
  35. package/lib/layout/box/box.module.css +9 -0
  36. package/lib/layout/footer/footer.module.css +1 -1
  37. package/lib/layout/index.js +8 -0
  38. package/lib/layout/separator.js +48 -0
  39. package/lib/layout/separator.module.css +5 -0
  40. package/lib/ui/dropdown/dropdown.js +21 -26
  41. package/lib/ui/dropdown/dropdown.module.css +11 -12
  42. package/lib/ui/dropdown/dropdown.stories.js +2 -9
  43. package/lib/ui/empty-set/empty-set.js +5 -4
  44. package/lib/ui/empty-set/empty-set.module.css +2 -2
  45. package/lib/ui/filters/filters.container.js +1 -1
  46. package/lib/ui/filters/filters.js +22 -7
  47. package/lib/ui/filters/filters.module.css +3 -3
  48. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js +1 -1
  49. package/lib/ui/hover-card/hover-card.js +102 -0
  50. package/lib/ui/hover-card/hover-card.module.css +29 -0
  51. package/lib/ui/hover-card/hover-card.stories.js +56 -0
  52. package/lib/ui/hover-card/index.js +18 -0
  53. package/lib/ui/icon/icon.js +6 -6
  54. package/lib/ui/icon/icon.module.css +1 -0
  55. package/lib/ui/index.js +8 -8
  56. package/lib/ui/table/table.js +5 -74
  57. package/lib/ui/table/table.module.css +41 -25
  58. package/lib/ui/table/table.stories.js +1 -1
  59. package/lib/ui/{popover → tag}/index.js +4 -4
  60. package/lib/ui/tag/tag.js +72 -0
  61. package/lib/ui/tag/tag.module.css +55 -0
  62. package/lib/ui/tag/tag.stories.js +38 -0
  63. package/lib/ui/tooltip/tooltip.js +10 -9
  64. package/lib/ui/tooltip/tooltip.module.css +2 -1
  65. package/lib-esm/app/app.js +132 -102
  66. package/lib-esm/app/app.module.css +11 -4
  67. package/lib-esm/app/header/header.js +1 -9
  68. package/lib-esm/components/asset-info/asset-info.module.css +1 -0
  69. package/lib-esm/components/bundle-assets/bundle-assets.js +97 -56
  70. package/lib-esm/components/bundle-assets/bundle-assets.module.css +24 -26
  71. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +7 -3
  72. package/lib-esm/components/bundle-modules/bundle-modules.js +50 -51
  73. package/lib-esm/components/bundle-modules/bundle-modules.module.css +11 -2
  74. package/lib-esm/components/bundle-modules/bundle-modules.utils.js +14 -6
  75. package/lib-esm/components/bundle-modules/index.js +5 -3
  76. package/lib-esm/components/bundle-packages/bundle-packages.js +88 -41
  77. package/lib-esm/components/bundle-packages/bundle-packages.module.css +17 -21
  78. package/lib-esm/components/delta/delta.module.css +1 -0
  79. package/lib-esm/components/job-header/job-header.js +2 -1
  80. package/lib-esm/components/job-header/job-header.module.css +6 -8
  81. package/lib-esm/components/jobs-header/jobs-header.module.css +5 -0
  82. package/lib-esm/components/metrics-table/metrics-table.js +61 -53
  83. package/lib-esm/components/metrics-table/metrics-table.module.css +18 -7
  84. package/lib-esm/components/metrics-table-search/metrics-table-search.module.css +5 -4
  85. package/lib-esm/components/metrics-table-title/metrics-table-title.js +8 -7
  86. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +2 -0
  87. package/lib-esm/components/module-info/module-info.js +2 -2
  88. package/lib-esm/components/module-info/module-info.module.css +1 -0
  89. package/lib-esm/components/summary/summary.js +1 -1
  90. package/lib-esm/components/summary-item/summary-item.js +14 -18
  91. package/lib-esm/components/summary-item/summary-item.module.css +1 -23
  92. package/lib-esm/components/total-size-type-title/total-size-type-title.js +6 -3
  93. package/lib-esm/constants.js +1 -1
  94. package/lib-esm/css/default.css +14 -3
  95. package/lib-esm/css/variables.css +17 -17
  96. package/lib-esm/hooks/search-params.js +27 -28
  97. package/lib-esm/layout/box/box.module.css +9 -0
  98. package/lib-esm/layout/footer/footer.module.css +1 -1
  99. package/lib-esm/layout/index.js +1 -0
  100. package/lib-esm/layout/separator.js +28 -0
  101. package/lib-esm/layout/separator.module.css +5 -0
  102. package/lib-esm/ui/dropdown/dropdown.js +20 -25
  103. package/lib-esm/ui/dropdown/dropdown.module.css +11 -12
  104. package/lib-esm/ui/dropdown/dropdown.stories.js +2 -7
  105. package/lib-esm/ui/empty-set/empty-set.js +4 -4
  106. package/lib-esm/ui/empty-set/empty-set.module.css +2 -2
  107. package/lib-esm/ui/filters/filters.js +20 -5
  108. package/lib-esm/ui/filters/filters.module.css +3 -3
  109. package/lib-esm/ui/hover-card/hover-card.js +83 -0
  110. package/lib-esm/ui/hover-card/hover-card.module.css +29 -0
  111. package/lib-esm/ui/hover-card/hover-card.stories.js +35 -0
  112. package/lib-esm/ui/hover-card/index.js +1 -0
  113. package/lib-esm/ui/icon/icon.js +3 -3
  114. package/lib-esm/ui/icon/icon.module.css +1 -0
  115. package/lib-esm/ui/index.js +1 -1
  116. package/lib-esm/ui/table/table.js +5 -65
  117. package/lib-esm/ui/table/table.module.css +41 -25
  118. package/lib-esm/ui/table/table.stories.js +1 -1
  119. package/lib-esm/ui/tag/index.js +1 -0
  120. package/lib-esm/ui/tag/tag.js +45 -0
  121. package/lib-esm/ui/tag/tag.module.css +55 -0
  122. package/lib-esm/ui/tag/tag.stories.js +23 -0
  123. package/lib-esm/ui/tooltip/tooltip.js +10 -9
  124. package/lib-esm/ui/tooltip/tooltip.module.css +2 -1
  125. package/package.json +33 -31
  126. package/src/app/app.jsx +136 -146
  127. package/src/app/app.module.css +11 -4
  128. package/src/app/header/header.jsx +1 -11
  129. package/src/assets/icons.svg +0 -8
  130. package/src/components/asset-info/asset-info.module.css +1 -0
  131. package/src/components/bundle-assets/bundle-assets.jsx +85 -31
  132. package/src/components/bundle-assets/bundle-assets.module.css +24 -26
  133. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +13 -25
  134. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  135. package/src/components/bundle-modules/bundle-modules.jsx +53 -36
  136. package/src/components/bundle-modules/bundle-modules.module.css +11 -2
  137. package/src/components/bundle-modules/bundle-modules.utils.js +16 -4
  138. package/src/components/bundle-modules/index.jsx +3 -0
  139. package/src/components/bundle-packages/bundle-packages.jsx +89 -39
  140. package/src/components/bundle-packages/bundle-packages.module.css +17 -21
  141. package/src/components/delta/delta.module.css +1 -0
  142. package/src/components/index.js +0 -1
  143. package/src/components/job-header/job-header.jsx +2 -1
  144. package/src/components/job-header/job-header.module.css +6 -8
  145. package/src/components/jobs-header/jobs-header.module.css +5 -0
  146. package/src/components/metrics-table/metrics-table.jsx +53 -44
  147. package/src/components/metrics-table/metrics-table.module.css +18 -7
  148. package/src/components/metrics-table-search/metrics-table-search.module.css +5 -4
  149. package/src/components/metrics-table-title/metrics-table-title.jsx +20 -21
  150. package/src/components/metrics-table-title/metrics-table-title.module.css +2 -0
  151. package/src/components/module-info/module-info.jsx +3 -7
  152. package/src/components/module-info/module-info.module.css +1 -0
  153. package/src/components/summary/summary.jsx +7 -8
  154. package/src/components/summary/summary.module.css +1 -1
  155. package/src/components/summary-item/summary-item.jsx +23 -40
  156. package/src/components/summary-item/summary-item.module.css +1 -34
  157. package/src/components/total-size-type-title/total-size-type-title.jsx +6 -9
  158. package/src/constants.js +11 -7
  159. package/src/css/default.css +14 -3
  160. package/src/css/variables.css +17 -17
  161. package/src/hooks/search-params.js +42 -33
  162. package/src/layout/box/box.module.css +9 -0
  163. package/src/layout/footer/footer.module.css +1 -1
  164. package/src/layout/index.js +1 -0
  165. package/src/layout/separator.jsx +25 -0
  166. package/src/layout/separator.module.css +5 -0
  167. package/src/ui/alert/alert.jsx +2 -7
  168. package/src/ui/dropdown/dropdown.jsx +16 -22
  169. package/src/ui/dropdown/dropdown.module.css +11 -12
  170. package/src/ui/empty-set/empty-set.jsx +25 -21
  171. package/src/ui/empty-set/empty-set.module.css +2 -2
  172. package/src/ui/filters/filters.jsx +64 -53
  173. package/src/ui/filters/filters.module.css +3 -3
  174. package/src/ui/hover-card/hover-card.jsx +73 -0
  175. package/src/ui/hover-card/hover-card.module.css +29 -0
  176. package/src/ui/hover-card/index.js +1 -0
  177. package/src/ui/icon/icon.jsx +11 -9
  178. package/src/ui/icon/icon.module.css +1 -0
  179. package/src/ui/index.js +1 -1
  180. package/src/ui/table/table.jsx +5 -52
  181. package/src/ui/table/table.module.css +41 -25
  182. package/src/ui/tag/index.js +1 -0
  183. package/src/ui/tag/tag.jsx +49 -0
  184. package/src/ui/tag/tag.module.css +55 -0
  185. package/src/ui/tooltip/tooltip.jsx +10 -14
  186. package/src/ui/tooltip/tooltip.module.css +2 -1
  187. package/storybook-static/favicon.ico +0 -0
  188. package/lib/ui/popover/popover.js +0 -92
  189. package/lib/ui/popover/popover.module.css +0 -66
  190. package/lib/ui/popover/popover.stories.js +0 -26
  191. package/lib-esm/ui/popover/index.js +0 -1
  192. package/lib-esm/ui/popover/popover.js +0 -71
  193. package/lib-esm/ui/popover/popover.module.css +0 -66
  194. package/lib-esm/ui/popover/popover.stories.js +0 -14
  195. package/src/assets/icons/alert-circle.svg +0 -1
  196. package/src/assets/icons/check-circle.svg +0 -1
  197. package/src/components/budget-info/budget-info.jsx +0 -65
  198. package/src/components/budget-info/budget-info.module.css +0 -40
  199. package/src/components/budget-info/index.js +0 -1
  200. package/src/components/budget-insights/budget-insights.jsx +0 -157
  201. package/src/components/budget-insights/budget-insights.module.css +0 -53
  202. package/src/components/budget-insights/index.js +0 -1
  203. package/src/ui/popover/index.js +0 -1
  204. package/src/ui/popover/popover.jsx +0 -79
  205. package/src/ui/popover/popover.module.css +0 -66
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = exports.OneLetter = exports.Default = void 0;
7
+
8
+ var _ = require(".");
9
+
10
+ var _default = {
11
+ title: 'UI/Tag',
12
+ component: _.Tag,
13
+ argTypes: {
14
+ kind: {
15
+ control: 'select',
16
+ options: Object.values(_.Tag.KINDS)
17
+ },
18
+ size: {
19
+ control: 'select',
20
+ options: Object.values(_.Tag.SIZES)
21
+ }
22
+ },
23
+ args: {
24
+ children: 'tag'
25
+ }
26
+ };
27
+ exports["default"] = _default;
28
+
29
+ var Default = _.Tag.bind();
30
+
31
+ exports.Default = Default;
32
+
33
+ var OneLetter = _.Tag.bind();
34
+
35
+ exports.OneLetter = OneLetter;
36
+ OneLetter.args = {
37
+ children: 'd'
38
+ };
@@ -11,7 +11,7 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
12
12
  var _classnames = _interopRequireDefault(require("classnames"));
13
13
 
14
- var _Tooltip = require("reakit/Tooltip");
14
+ var _tooltip = require("ariakit/tooltip");
15
15
 
16
16
  var _tooltipModule = _interopRequireDefault(require("./tooltip.module.css"));
17
17
 
@@ -34,22 +34,23 @@ var Tooltip = function Tooltip(props) {
34
34
  darkMode = props.darkMode,
35
35
  restProps = _objectWithoutProperties(props, _excluded);
36
36
 
37
- var rootClassName = (0, _classnames["default"])(_tooltipModule["default"].root, className);
38
- var tooltipProps = (0, _Tooltip.useTooltipState)({
39
- baseId: process.env.NODE_ENV === 'test' && 'id-test',
37
+ var tooltip = (0, _tooltip.useTooltipState)({
40
38
  placement: 'top'
41
39
  });
42
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_Tooltip.TooltipReference, _extends({
40
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_tooltip.TooltipAnchor, _extends({
43
41
  as: Component,
44
- className: rootClassName
42
+ className: (0, _classnames["default"])(_tooltipModule["default"].root, className),
43
+ state: tooltip
45
44
  }, ref ? {
46
45
  ref: ref
47
- } : {}, restProps, tooltipProps), children), title && /*#__PURE__*/_react["default"].createElement(_Tooltip.Tooltip, _extends({}, tooltipProps, {
46
+ } : {}, restProps), children), title && /*#__PURE__*/_react["default"].createElement(_tooltip.Tooltip, {
47
+ state: tooltip,
48
48
  className: (0, _classnames["default"])(_tooltipModule["default"].tooltip, darkMode && _tooltipModule["default"].tooltipDarkMode)
49
- }), /*#__PURE__*/_react["default"].createElement(_Tooltip.TooltipArrow, _extends({}, tooltipProps, {
49
+ }, /*#__PURE__*/_react["default"].createElement(_tooltip.TooltipArrow, {
50
+ state: tooltip,
50
51
  className: _tooltipModule["default"].arrow,
51
52
  size: 12
52
- })), title));
53
+ }), title));
53
54
  };
54
55
 
55
56
  exports.Tooltip = Tooltip;
@@ -12,10 +12,11 @@
12
12
 
13
13
  .tooltip {
14
14
  padding: var(--space-xxxsmall) var(--space-xxsmall);
15
- border-radius: var(--radius-small);
15
+ border-radius: var(--radius-medium);
16
16
  background: var(--color-light);
17
17
  color: var(--color-text);
18
18
  filter: drop-shadow(0 0 var(--space-xxxsmall) var(--color-shadow));
19
+ will-change: filter;
19
20
  font-size: var(--size-xsmall);
20
21
  line-height: var(--space-small);
21
22
  }
@@ -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, { useEffect, useMemo } from 'react';
3
+ import React, { useContext, useEffect, useMemo } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import { HashRouter, NavLink, Route, Switch, useLocation } from 'react-router-dom';
6
6
  import { COMPONENT } from '@bundle-stats/utils';
@@ -60,19 +60,133 @@ Layout.defaultProps = {
60
60
  jobs: null,
61
61
  version: null
62
62
  };
63
+ const JobsContext = /*#__PURE__*/React.createContext({
64
+ jobs: []
65
+ });
63
66
 
64
- const AppComponent = _ref2 => {
65
- var _insights$webpack;
66
-
67
+ const JobsProvider = _ref2 => {
67
68
  let {
68
- version,
69
- jobs
69
+ jobs,
70
+ ...restProps
70
71
  } = _ref2;
72
+ const value = useMemo(() => ({
73
+ jobs
74
+ }), [jobs]);
75
+ return /*#__PURE__*/React.createElement(JobsContext.Provider, _extends({
76
+ value: value
77
+ }, restProps));
78
+ };
79
+
80
+ JobsProvider.propTypes = {
81
+ jobs: PropTypes.arrayOf(PropTypes.object).isRequired
82
+ };
83
+
84
+ const OverviewContent = () => {
85
+ var _jobs$0$insights, _jobs$0$insights$webp;
86
+
87
+ const {
88
+ jobs
89
+ } = useContext(JobsContext);
90
+ const {
91
+ duplicatePackagesCount
92
+ } = jobs[0].summary.webpack;
93
+ const duplicatePackagesInsights = Boolean(duplicatePackagesCount.current || duplicatePackagesCount.baseline);
94
+ return /*#__PURE__*/React.createElement(Stack, {
95
+ space: "medium"
96
+ }, duplicatePackagesInsights && /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
97
+ space: "small"
98
+ }, /*#__PURE__*/React.createElement(DuplicatePackagesWarning, {
99
+ duplicatePackagesCount: duplicatePackagesCount,
100
+ showDelta: jobs.length > 1
101
+ }), /*#__PURE__*/React.createElement(BudgetInsights, {
102
+ source: "webpack",
103
+ budgets: (_jobs$0$insights = jobs[0].insights) == null ? void 0 : (_jobs$0$insights$webp = _jobs$0$insights.webpack) == null ? void 0 : _jobs$0$insights$webp.budgets
104
+ }))), /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
105
+ space: "small"
106
+ }, /*#__PURE__*/React.createElement(TotalSizeTypeTitle, null), /*#__PURE__*/React.createElement(BundleAssetsTotalsChartBars, {
107
+ jobs: jobs
108
+ }), /*#__PURE__*/React.createElement(BundleAssetsTotalsTable, {
109
+ jobs: jobs,
110
+ outline: true
111
+ }))));
112
+ };
113
+
114
+ const AssetsContent = () => {
115
+ var _jobs$, _jobs$0$insights2, _jobs$0$insights2$web;
116
+
71
117
  const [bundleStatsState, bundleStatsSetState] = useComponentQueryState(COMPONENT.BUNDLE_ASSETS);
72
- const [bundlePackagesState, bundlePackagesSetState] = useComponentQueryState(COMPONENT.BUNDLE_PACKAGES);
118
+ const {
119
+ jobs
120
+ } = useContext(JobsContext);
121
+ return /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
122
+ space: "medium"
123
+ }, /*#__PURE__*/React.createElement(Summary, {
124
+ keys: METRICS_WEBPACK_ASSETS,
125
+ data: jobs == null ? void 0 : (_jobs$ = jobs[0]) == null ? void 0 : _jobs$.summary,
126
+ budgets: (_jobs$0$insights2 = jobs[0].insights) == null ? void 0 : (_jobs$0$insights2$web = _jobs$0$insights2.webpack) == null ? void 0 : _jobs$0$insights2$web.budgets,
127
+ showSummaryItemDelta: (jobs == null ? void 0 : jobs.length) !== 1
128
+ }), /*#__PURE__*/React.createElement(Box, {
129
+ outline: true
130
+ }, /*#__PURE__*/React.createElement(BundleAssets, _extends({
131
+ jobs: jobs,
132
+ setState: bundleStatsSetState
133
+ }, bundleStatsState)))));
134
+ };
135
+
136
+ const ModulesContent = () => {
137
+ var _jobs$2, _jobs$0$insights3, _jobs$0$insights3$web;
138
+
73
139
  const [bundleModulesState, bundleModulesSetState] = useComponentQueryState(COMPONENT.BUNDLE_MODULES);
140
+ const {
141
+ jobs
142
+ } = useContext(JobsContext);
143
+ return /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
144
+ space: "medium"
145
+ }, /*#__PURE__*/React.createElement(Summary, {
146
+ keys: METRICS_WEBPACK_MODULES,
147
+ data: jobs == null ? void 0 : (_jobs$2 = jobs[0]) == null ? void 0 : _jobs$2.summary,
148
+ budgets: (_jobs$0$insights3 = jobs[0].insights) == null ? void 0 : (_jobs$0$insights3$web = _jobs$0$insights3.webpack) == null ? void 0 : _jobs$0$insights3$web.budgets,
149
+ showSummaryItemDelta: (jobs == null ? void 0 : jobs.length) !== 1
150
+ }), /*#__PURE__*/React.createElement(Box, {
151
+ outline: true
152
+ }, /*#__PURE__*/React.createElement(BundleModules, _extends({
153
+ jobs: jobs,
154
+ setState: bundleModulesSetState
155
+ }, bundleModulesState)))));
156
+ };
157
+
158
+ const PackagesContent = () => {
159
+ var _jobs$3, _jobs$0$insights4, _jobs$0$insights4$web;
160
+
161
+ const [bundlePackagesState, bundlePackagesSetState] = useComponentQueryState(COMPONENT.BUNDLE_PACKAGES);
162
+ const {
163
+ jobs
164
+ } = useContext(JobsContext);
165
+ return /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
166
+ space: "medium"
167
+ }, /*#__PURE__*/React.createElement(Summary, {
168
+ keys: METRICS_WEBPACK_PACKAGES,
169
+ data: jobs == null ? void 0 : (_jobs$3 = jobs[0]) == null ? void 0 : _jobs$3.summary,
170
+ budgets: (_jobs$0$insights4 = jobs[0].insights) == null ? void 0 : (_jobs$0$insights4$web = _jobs$0$insights4.webpack) == null ? void 0 : _jobs$0$insights4$web.budgets,
171
+ showSummaryItemDelta: (jobs == null ? void 0 : jobs.length) !== 1
172
+ }), /*#__PURE__*/React.createElement(Box, {
173
+ outline: true
174
+ }, /*#__PURE__*/React.createElement(BundlePackages, _extends({
175
+ jobs: jobs
176
+ }, bundlePackagesState, {
177
+ setState: bundlePackagesSetState
178
+ })))));
179
+ };
180
+
181
+ const AppComponent = _ref3 => {
182
+ var _jobs$0$insights5, _jobs$0$insights5$web;
183
+
184
+ let {
185
+ version,
186
+ jobs
187
+ } = _ref3;
74
188
 
75
- if (jobs.length === 0) {
189
+ if ((jobs == null ? void 0 : jobs.length) === 0) {
76
190
  return /*#__PURE__*/React.createElement(Layout, {
77
191
  version: version
78
192
  }, /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement("div", {
@@ -80,15 +194,9 @@ const AppComponent = _ref2 => {
80
194
  }, I18N.NO_DATA)));
81
195
  }
82
196
 
83
- const {
84
- summary,
85
- insights
86
- } = useMemo(() => jobs[0], jobs);
87
- const {
88
- duplicatePackagesCount
89
- } = summary.webpack;
90
- const duplicatePackagesInsights = Boolean(duplicatePackagesCount.current || duplicatePackagesCount.baseline);
91
- return /*#__PURE__*/React.createElement(Layout, {
197
+ return /*#__PURE__*/React.createElement(JobsProvider, {
198
+ jobs: jobs
199
+ }, /*#__PURE__*/React.createElement(Layout, {
92
200
  jobs: jobs,
93
201
  version: version
94
202
  }, /*#__PURE__*/React.createElement(Container, {
@@ -96,8 +204,8 @@ const AppComponent = _ref2 => {
96
204
  }, /*#__PURE__*/React.createElement(Summary, {
97
205
  size: "large",
98
206
  keys: METRICS_WEBPACK_GENERAL,
99
- data: summary,
100
- budgets: insights == null ? void 0 : (_insights$webpack = insights.webpack) == null ? void 0 : _insights$webpack.budgets,
207
+ data: jobs[0].summary,
208
+ budgets: (_jobs$0$insights5 = jobs[0].insights) == null ? void 0 : (_jobs$0$insights5$web = _jobs$0$insights5.webpack) == null ? void 0 : _jobs$0$insights5$web.budgets,
101
209
  showSummaryItemDelta: jobs.length !== 1
102
210
  })), /*#__PURE__*/React.createElement(Container, {
103
211
  className: css.tabsContainer
@@ -124,98 +232,20 @@ const AppComponent = _ref2 => {
124
232
  }, /*#__PURE__*/React.createElement(Switch, null, /*#__PURE__*/React.createElement(Route, {
125
233
  exact: true,
126
234
  path: URLS.ASSETS,
127
- render: _ref3 => {
128
- var _insights$webpack2;
129
-
130
- let {
131
- location
132
- } = _ref3;
133
- return /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
134
- space: "medium"
135
- }, /*#__PURE__*/React.createElement(Summary, {
136
- keys: METRICS_WEBPACK_ASSETS,
137
- data: summary,
138
- budgets: insights == null ? void 0 : (_insights$webpack2 = insights.webpack) == null ? void 0 : _insights$webpack2.budgets,
139
- showSummaryItemDelta: jobs.length !== 1
140
- }), /*#__PURE__*/React.createElement(Box, {
141
- outline: true
142
- }, /*#__PURE__*/React.createElement(BundleAssets, _extends({
143
- jobs: jobs,
144
- setState: bundleStatsSetState
145
- }, bundleStatsState, {
146
- key: `${location.pathname}_${location.search}`
147
- })))));
148
- }
235
+ component: AssetsContent
149
236
  }), /*#__PURE__*/React.createElement(Route, {
150
237
  exact: true,
151
238
  path: URLS.MODULES,
152
- render: () => {
153
- var _insights$webpack3;
154
-
155
- return /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
156
- space: "medium"
157
- }, /*#__PURE__*/React.createElement(Summary, {
158
- keys: METRICS_WEBPACK_MODULES,
159
- data: summary,
160
- budgets: insights == null ? void 0 : (_insights$webpack3 = insights.webpack) == null ? void 0 : _insights$webpack3.budgets,
161
- showSummaryItemDelta: jobs.length !== 1
162
- }), /*#__PURE__*/React.createElement(Box, {
163
- outline: true
164
- }, /*#__PURE__*/React.createElement(BundleModules, _extends({
165
- jobs: jobs,
166
- setState: bundleModulesSetState
167
- }, bundleModulesState)))));
168
- }
239
+ component: ModulesContent
169
240
  }), /*#__PURE__*/React.createElement(Route, {
170
241
  exact: true,
171
242
  path: URLS.PACKAGES,
172
- render: _ref4 => {
173
- var _insights$webpack4;
174
-
175
- let {
176
- location
177
- } = _ref4;
178
- return /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
179
- space: "medium"
180
- }, /*#__PURE__*/React.createElement(Summary, {
181
- keys: METRICS_WEBPACK_PACKAGES,
182
- data: summary,
183
- budgets: insights == null ? void 0 : (_insights$webpack4 = insights.webpack) == null ? void 0 : _insights$webpack4.budgets,
184
- showSummaryItemDelta: jobs.length !== 1
185
- }), /*#__PURE__*/React.createElement(Box, {
186
- outline: true
187
- }, /*#__PURE__*/React.createElement(BundlePackages, _extends({
188
- jobs: jobs
189
- }, bundlePackagesState, {
190
- setState: bundlePackagesSetState,
191
- key: `${location.pathname}_${location.search}`
192
- })))));
193
- }
243
+ component: PackagesContent
194
244
  }), /*#__PURE__*/React.createElement(Route, {
195
245
  exact: true,
196
246
  path: URLS.OVERVIEW,
197
- render: () => {
198
- var _insights$webpack5;
199
-
200
- return /*#__PURE__*/React.createElement(Stack, {
201
- space: "large"
202
- }, duplicatePackagesInsights && /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(DuplicatePackagesWarning, {
203
- duplicatePackagesCount: duplicatePackagesCount,
204
- showDelta: jobs.length > 1
205
- })), (insights == null ? void 0 : (_insights$webpack5 = insights.webpack) == null ? void 0 : _insights$webpack5.budgets) && /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(BudgetInsights, {
206
- source: "webpack",
207
- budgets: insights.webpack.budgets
208
- })), /*#__PURE__*/React.createElement(Container, null, /*#__PURE__*/React.createElement(Stack, {
209
- space: "small"
210
- }, /*#__PURE__*/React.createElement(TotalSizeTypeTitle, null), /*#__PURE__*/React.createElement(BundleAssetsTotalsChartBars, {
211
- jobs: jobs
212
- }), /*#__PURE__*/React.createElement(Box, {
213
- outline: true
214
- }, /*#__PURE__*/React.createElement(BundleAssetsTotalsTable, {
215
- jobs: jobs
216
- })))));
217
- }
218
- }))));
247
+ component: OverviewContent
248
+ })))));
219
249
  };
220
250
 
221
251
  AppComponent.defaultProps = {
@@ -13,12 +13,13 @@
13
13
  }
14
14
 
15
15
  .summaryContainer {
16
- padding-top: var(--space-large);
16
+ padding-top: var(--space-medium);
17
17
  padding-bottom: var(--space-small);
18
18
  }
19
19
 
20
20
  .tabsContainer {
21
21
  border-bottom: 1px solid var(--color-outline);
22
+ background: var(--color-light);
22
23
  }
23
24
 
24
25
  .tabs {
@@ -34,14 +35,14 @@
34
35
  }
35
36
 
36
37
  .tabsContent {
37
- padding-top: var(--space-large);
38
- padding-bottom: var(--space-large);
38
+ padding-top: var(--space-medium);
39
+ padding-bottom: var(--space-medium);
39
40
  min-height: 480px;
40
41
  }
41
42
 
42
43
  @media (min-width: 600px) {
43
44
  :root {
44
- --header-height: 80px;
45
+ --header-height: 72px;
45
46
  }
46
47
 
47
48
  .header {
@@ -54,4 +55,10 @@
54
55
  background-color: var(--color-background);
55
56
  border-bottom: 1px solid var(--color-outline);
56
57
  }
58
+
59
+ .tabsContainer {
60
+ position: sticky;
61
+ top: var(--header-height);
62
+ z-index: 100;
63
+ }
57
64
  }
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
3
3
  import cx from 'classnames';
4
4
  import { Container } from '../../ui/container';
5
5
  import { JobsHeader } from '../../components/jobs-header';
6
- import { Logo } from '../../ui/logo';
7
6
  import css from './header.module.css';
8
7
  export const Header = _ref => {
9
8
  let {
@@ -15,14 +14,7 @@ export const Header = _ref => {
15
14
  className: cx(css.root, className)
16
15
  }, /*#__PURE__*/React.createElement("div", {
17
16
  className: css.inner
18
- }, /*#__PURE__*/React.createElement("a", {
19
- className: css.branding,
20
- href: "https://github.com/relative-ci/bundle-stats",
21
- target: "_blank",
22
- rel: "noopener noreferrer nofollow"
23
- }, /*#__PURE__*/React.createElement(Logo, {
24
- className: css.brandingLogo
25
- }, "BundleStats")), /*#__PURE__*/React.createElement(JobsHeader, {
17
+ }, /*#__PURE__*/React.createElement(JobsHeader, {
26
18
  className: css.jobs,
27
19
  jobs: jobs
28
20
  })));
@@ -1,4 +1,5 @@
1
1
  .fileName {
2
+ max-width: 100%;
2
3
  padding: 2px;
3
4
  background: var(--color-highlight-warning);
4
5
  }
@@ -3,7 +3,7 @@ import _get from "lodash/get";
3
3
 
4
4
  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); }
5
5
 
6
- import React, { useMemo } from 'react';
6
+ import React, { useCallback, useMemo, useState } from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import cx from 'classnames';
9
9
  import { ASSET_ENTRY_TYPE, ASSET_FILE_TYPE, ASSET_FILTERS, FILE_TYPE_LABELS } from '@bundle-stats/utils';
@@ -12,8 +12,9 @@ import I18N from '../../i18n';
12
12
  import { FlexStack } from '../../layout/flex-stack';
13
13
  import { Icon } from '../../ui/icon';
14
14
  import { FileName } from '../../ui/file-name';
15
- import { Popover } from '../../ui/popover';
15
+ import { HoverCard } from '../../ui/hover-card';
16
16
  import { Tooltip } from '../../ui/tooltip';
17
+ import { Tag } from '../../ui/tag';
17
18
  import { Filters } from '../../ui/filters';
18
19
  import { SortDropdown } from '../../ui/sort-dropdown';
19
20
  import { EmptySet } from '../../ui/empty-set';
@@ -71,58 +72,92 @@ TooltipNotPredictive.propTypes = {
71
72
 
72
73
  };
73
74
 
74
- const getRenderRowHeader = _ref4 => {
75
+ const RowHeader = _ref4 => {
75
76
  let {
77
+ row,
76
78
  labels,
77
- CustomComponentLink,
78
- chunks
79
+ chunks,
80
+ CustomComponentLink
79
81
  } = _ref4;
80
- return item => {
81
- const {
82
- label,
83
- isNotPredictive,
84
- runs,
85
- isChunk,
86
- isEntry,
87
- isInitial
88
- } = item;
89
- return /*#__PURE__*/React.createElement(Popover, {
90
- label: /*#__PURE__*/React.createElement(FileName, {
91
- name: label
92
- }),
93
- icon: /*#__PURE__*/React.createElement("div", {
94
- className: css.assetInfoFlags
95
- }, isNotPredictive && /*#__PURE__*/React.createElement(Tooltip, {
96
- className: css.notPredictive,
97
- title: /*#__PURE__*/React.createElement(TooltipNotPredictive, {
98
- runs: runs
99
- })
100
- }, /*#__PURE__*/React.createElement(Icon, {
101
- className: css.notPredictiveIcon,
102
- glyph: "warning"
103
- })), isChunk && /*#__PURE__*/React.createElement("span", {
104
- title: "Chunk",
105
- className: css.flagChunk
106
- }, "c"), isEntry && /*#__PURE__*/React.createElement("span", {
107
- title: "Entrypoint",
108
- className: css.flagEntry
109
- }, "e"), isInitial && /*#__PURE__*/React.createElement("span", {
110
- title: "Initial",
111
- className: css.flagInitial
112
- }, "i"))
113
- }, /*#__PURE__*/React.createElement(AssetInfo, {
114
- className: css.assetInfo,
115
- item: item,
116
- labels: labels,
117
- chunks: chunks,
118
- CustomComponentLink: CustomComponentLink
119
- }));
120
- };
82
+ const {
83
+ label,
84
+ isNotPredictive,
85
+ runs,
86
+ isChunk,
87
+ isEntry,
88
+ isInitial
89
+ } = row;
90
+ const [showHoverCard, setHoverCard] = useState(false);
91
+ const handleOnMouseEnter = useCallback(() => setHoverCard(true), [showHoverCard]);
92
+ const content = useMemo(() => /*#__PURE__*/React.createElement("span", {
93
+ className: css.assetName
94
+ }, /*#__PURE__*/React.createElement("span", {
95
+ className: css.assetNameTags
96
+ }, isNotPredictive && /*#__PURE__*/React.createElement(Tooltip, {
97
+ className: css.notPredictive,
98
+ title: /*#__PURE__*/React.createElement(TooltipNotPredictive, {
99
+ runs: runs
100
+ })
101
+ }, /*#__PURE__*/React.createElement(Icon, {
102
+ className: css.notPredictiveIcon,
103
+ glyph: "warning"
104
+ })), isChunk && /*#__PURE__*/React.createElement(Tag, {
105
+ className: cx(css.assetNameTag, css.assetNameTagChunk),
106
+ title: "Chunk",
107
+ size: Tag.SIZES.SMALL,
108
+ kind: Tag.KINDS.INFO
109
+ }), isEntry && /*#__PURE__*/React.createElement(Tag, {
110
+ className: cx(css.assetNameTag, css.assetNameTagEntry),
111
+ title: "Entrypoint",
112
+ size: Tag.SIZES.SMALL,
113
+ kind: Tag.KINDS.INFO
114
+ }), isInitial && /*#__PURE__*/React.createElement(Tag, {
115
+ className: cx(css.assetNameTag, css.assetNameTagInitial),
116
+ title: "Initial",
117
+ size: Tag.SIZES.SMALL,
118
+ kind: Tag.KINDS.INFO
119
+ })), /*#__PURE__*/React.createElement(FileName, {
120
+ className: css.assetNameText,
121
+ name: label
122
+ })), [isChunk, isEntry, isInitial, isNotPredictive, runs]);
123
+
124
+ if (!showHoverCard) {
125
+ return /*#__PURE__*/React.createElement("span", {
126
+ onMouseEnter: handleOnMouseEnter
127
+ }, content);
128
+ }
129
+
130
+ return /*#__PURE__*/React.createElement(HoverCard, {
131
+ label: content
132
+ }, /*#__PURE__*/React.createElement(AssetInfo, {
133
+ className: css.assetInfo,
134
+ item: row,
135
+ labels: labels,
136
+ chunks: chunks,
137
+ CustomComponentLink: CustomComponentLink
138
+ }));
121
139
  };
122
140
 
141
+ RowHeader.propTypes = {
142
+ row: PropTypes.shape({
143
+ label: PropTypes.string,
144
+ isNotPredictive: PropTypes.bool,
145
+ isChunk: PropTypes.bool,
146
+ isInitial: PropTypes.bool,
147
+ isEntry: PropTypes.bool,
148
+ runs: PropTypes.arrayOf(PropTypes.object)
149
+ }).isRequired,
150
+ chunks: PropTypes.arrayOf(PropTypes.shape({
151
+ id: PropTypes.string,
152
+ name: PropTypes.string
153
+ })),
154
+ labels: PropTypes.arrayOf(PropTypes.string).isRequired,
155
+ CustomComponentLink: PropTypes.elementType.isRequired
156
+ };
157
+ RowHeader.defaultProps = {
158
+ chunks: []
159
+ };
123
160
  export const BundleAssets = props => {
124
- var _jobs$, _jobs$$meta, _jobs$$meta$webpack;
125
-
126
161
  const {
127
162
  className,
128
163
  jobs,
@@ -146,12 +181,16 @@ export const BundleAssets = props => {
146
181
  handleResetFilters: resetFilters,
147
182
  handleViewAll: resetAllFilters
148
183
  });
149
- const chunks = ((_jobs$ = jobs[0]) == null ? void 0 : (_jobs$$meta = _jobs$.meta) == null ? void 0 : (_jobs$$meta$webpack = _jobs$$meta.webpack) == null ? void 0 : _jobs$$meta$webpack.chunks) || [];
150
- const renderRowHeader = useMemo(() => getRenderRowHeader({
151
- labels: _map(jobs, 'label'),
152
- CustomComponentLink,
153
- chunks
154
- }), [jobs, chunks]);
184
+ const renderRowHeader = useCallback(row => {
185
+ var _jobs$, _jobs$$meta, _jobs$$meta$webpack;
186
+
187
+ return /*#__PURE__*/React.createElement(RowHeader, {
188
+ row: row,
189
+ labels: _map(jobs, 'label'),
190
+ chunks: ((_jobs$ = jobs[0]) == null ? void 0 : (_jobs$$meta = _jobs$.meta) == null ? void 0 : (_jobs$$meta$webpack = _jobs$$meta.webpack) == null ? void 0 : _jobs$$meta$webpack.chunks) || [],
191
+ CustomComponentLink: CustomComponentLink
192
+ });
193
+ }, [jobs, CustomComponentLink]);
155
194
  return /*#__PURE__*/React.createElement("section", {
156
195
  className: cx(css.root, className)
157
196
  }, /*#__PURE__*/React.createElement(Toolbar, {
@@ -161,7 +200,7 @@ export const BundleAssets = props => {
161
200
  actionClassName
162
201
  } = _ref5;
163
202
  return /*#__PURE__*/React.createElement(FlexStack, {
164
- space: "xsmall",
203
+ space: "xxsmall",
165
204
  className: cx(css.dropdown, actionClassName)
166
205
  }, /*#__PURE__*/React.createElement(SortDropdown, _extends({
167
206
  fields: sortFields
@@ -172,7 +211,9 @@ export const BundleAssets = props => {
172
211
  handleResetFilters: resetFilters
173
212
  }));
174
213
  }
175
- }, /*#__PURE__*/React.createElement(FlexStack, null, /*#__PURE__*/React.createElement(MetricsTableSearch, {
214
+ }, /*#__PURE__*/React.createElement(FlexStack, {
215
+ space: "xxsmall"
216
+ }, /*#__PURE__*/React.createElement(MetricsTableSearch, {
176
217
  className: css.toolbarSearch,
177
218
  placeholder: "Search by name",
178
219
  search: search,