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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +94 -13
  2. package/lib/app/app.js +137 -102
  3. package/lib/app/app.module.css +11 -4
  4. package/lib/app/header/header.js +1 -10
  5. package/lib/components/asset-info/asset-info.module.css +1 -0
  6. package/lib/components/bundle-assets/bundle-assets.js +104 -52
  7. package/lib/components/bundle-assets/bundle-assets.module.css +24 -26
  8. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +13 -3
  9. package/lib/components/bundle-modules/bundle-modules.js +53 -67
  10. package/lib/components/bundle-packages/bundle-packages.js +100 -44
  11. package/lib/components/bundle-packages/bundle-packages.module.css +17 -21
  12. package/lib/components/delta/delta.module.css +1 -0
  13. package/lib/components/job-header/job-header.js +3 -1
  14. package/lib/components/job-header/job-header.module.css +6 -8
  15. package/lib/components/jobs-header/jobs-header.module.css +5 -0
  16. package/lib/components/metrics-table/metrics-table.js +72 -59
  17. package/lib/components/metrics-table/metrics-table.module.css +18 -7
  18. package/lib/components/metrics-table-search/metrics-table-search.module.css +5 -4
  19. package/lib/components/metrics-table-title/metrics-table-title.js +9 -7
  20. package/lib/components/metrics-table-title/metrics-table-title.module.css +2 -0
  21. package/lib/components/module-info/module-info.js +2 -2
  22. package/lib/components/module-info/module-info.module.css +1 -0
  23. package/lib/components/summary/summary.js +1 -1
  24. package/lib/components/summary-item/summary-item.js +15 -18
  25. package/lib/components/summary-item/summary-item.module.css +1 -23
  26. package/lib/components/total-size-type-title/total-size-type-title.js +7 -3
  27. package/lib/css/default.css +14 -3
  28. package/lib/css/variables.css +17 -17
  29. package/lib/hooks/search-params.js +31 -31
  30. package/lib/layout/box/box.module.css +9 -0
  31. package/lib/layout/footer/footer.module.css +1 -1
  32. package/lib/layout/index.js +8 -0
  33. package/lib/layout/separator.js +48 -0
  34. package/lib/layout/separator.module.css +5 -0
  35. package/lib/ui/dropdown/dropdown.js +21 -26
  36. package/lib/ui/dropdown/dropdown.module.css +11 -12
  37. package/lib/ui/dropdown/dropdown.stories.js +2 -9
  38. package/lib/ui/empty-set/empty-set.js +5 -4
  39. package/lib/ui/empty-set/empty-set.module.css +2 -2
  40. package/lib/ui/filters/filters.container.js +1 -1
  41. package/lib/ui/filters/filters.js +22 -7
  42. package/lib/ui/filters/filters.module.css +3 -3
  43. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js +1 -1
  44. package/lib/ui/hover-card/hover-card.js +102 -0
  45. package/lib/ui/hover-card/hover-card.module.css +29 -0
  46. package/lib/ui/hover-card/hover-card.stories.js +56 -0
  47. package/lib/ui/hover-card/index.js +18 -0
  48. package/lib/ui/icon/icon.js +6 -6
  49. package/lib/ui/icon/icon.module.css +1 -0
  50. package/lib/ui/index.js +8 -8
  51. package/lib/ui/table/table.js +5 -74
  52. package/lib/ui/table/table.module.css +41 -25
  53. package/lib/ui/table/table.stories.js +1 -1
  54. package/lib/ui/{popover → tag}/index.js +4 -4
  55. package/lib/ui/tag/tag.js +72 -0
  56. package/lib/ui/tag/tag.module.css +55 -0
  57. package/lib/ui/tag/tag.stories.js +38 -0
  58. package/lib/ui/tooltip/tooltip.js +10 -9
  59. package/lib/ui/tooltip/tooltip.module.css +2 -1
  60. package/lib-esm/app/app.js +132 -102
  61. package/lib-esm/app/app.module.css +11 -4
  62. package/lib-esm/app/header/header.js +1 -9
  63. package/lib-esm/components/asset-info/asset-info.module.css +1 -0
  64. package/lib-esm/components/bundle-assets/bundle-assets.js +97 -56
  65. package/lib-esm/components/bundle-assets/bundle-assets.module.css +24 -26
  66. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +7 -3
  67. package/lib-esm/components/bundle-modules/bundle-modules.js +35 -50
  68. package/lib-esm/components/bundle-packages/bundle-packages.js +88 -41
  69. package/lib-esm/components/bundle-packages/bundle-packages.module.css +17 -21
  70. package/lib-esm/components/delta/delta.module.css +1 -0
  71. package/lib-esm/components/job-header/job-header.js +2 -1
  72. package/lib-esm/components/job-header/job-header.module.css +6 -8
  73. package/lib-esm/components/jobs-header/jobs-header.module.css +5 -0
  74. package/lib-esm/components/metrics-table/metrics-table.js +61 -53
  75. package/lib-esm/components/metrics-table/metrics-table.module.css +18 -7
  76. package/lib-esm/components/metrics-table-search/metrics-table-search.module.css +5 -4
  77. package/lib-esm/components/metrics-table-title/metrics-table-title.js +8 -7
  78. package/lib-esm/components/metrics-table-title/metrics-table-title.module.css +2 -0
  79. package/lib-esm/components/module-info/module-info.js +2 -2
  80. package/lib-esm/components/module-info/module-info.module.css +1 -0
  81. package/lib-esm/components/summary/summary.js +1 -1
  82. package/lib-esm/components/summary-item/summary-item.js +14 -18
  83. package/lib-esm/components/summary-item/summary-item.module.css +1 -23
  84. package/lib-esm/components/total-size-type-title/total-size-type-title.js +6 -3
  85. package/lib-esm/css/default.css +14 -3
  86. package/lib-esm/css/variables.css +17 -17
  87. package/lib-esm/hooks/search-params.js +27 -28
  88. package/lib-esm/layout/box/box.module.css +9 -0
  89. package/lib-esm/layout/footer/footer.module.css +1 -1
  90. package/lib-esm/layout/index.js +1 -0
  91. package/lib-esm/layout/separator.js +28 -0
  92. package/lib-esm/layout/separator.module.css +5 -0
  93. package/lib-esm/ui/dropdown/dropdown.js +20 -25
  94. package/lib-esm/ui/dropdown/dropdown.module.css +11 -12
  95. package/lib-esm/ui/dropdown/dropdown.stories.js +2 -7
  96. package/lib-esm/ui/empty-set/empty-set.js +4 -4
  97. package/lib-esm/ui/empty-set/empty-set.module.css +2 -2
  98. package/lib-esm/ui/filters/filters.js +20 -5
  99. package/lib-esm/ui/filters/filters.module.css +3 -3
  100. package/lib-esm/ui/hover-card/hover-card.js +83 -0
  101. package/lib-esm/ui/hover-card/hover-card.module.css +29 -0
  102. package/lib-esm/ui/hover-card/hover-card.stories.js +35 -0
  103. package/lib-esm/ui/hover-card/index.js +1 -0
  104. package/lib-esm/ui/icon/icon.js +3 -3
  105. package/lib-esm/ui/icon/icon.module.css +1 -0
  106. package/lib-esm/ui/index.js +1 -1
  107. package/lib-esm/ui/table/table.js +5 -65
  108. package/lib-esm/ui/table/table.module.css +41 -25
  109. package/lib-esm/ui/table/table.stories.js +1 -1
  110. package/lib-esm/ui/tag/index.js +1 -0
  111. package/lib-esm/ui/tag/tag.js +45 -0
  112. package/lib-esm/ui/tag/tag.module.css +55 -0
  113. package/lib-esm/ui/tag/tag.stories.js +23 -0
  114. package/lib-esm/ui/tooltip/tooltip.js +10 -9
  115. package/lib-esm/ui/tooltip/tooltip.module.css +2 -1
  116. package/package.json +33 -31
  117. package/src/app/app.jsx +142 -145
  118. package/src/app/app.module.css +11 -4
  119. package/src/app/header/header.jsx +0 -10
  120. package/src/components/asset-info/asset-info.module.css +1 -0
  121. package/src/components/bundle-assets/bundle-assets.jsx +85 -31
  122. package/src/components/bundle-assets/bundle-assets.module.css +24 -26
  123. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +2 -0
  124. package/src/components/bundle-modules/bundle-modules.jsx +36 -36
  125. package/src/components/bundle-packages/bundle-packages.jsx +89 -39
  126. package/src/components/bundle-packages/bundle-packages.module.css +17 -21
  127. package/src/components/delta/delta.module.css +1 -0
  128. package/src/components/job-header/job-header.jsx +2 -1
  129. package/src/components/job-header/job-header.module.css +6 -8
  130. package/src/components/jobs-header/jobs-header.module.css +5 -0
  131. package/src/components/metrics-table/metrics-table.jsx +53 -44
  132. package/src/components/metrics-table/metrics-table.module.css +18 -7
  133. package/src/components/metrics-table-search/metrics-table-search.module.css +5 -4
  134. package/src/components/metrics-table-title/metrics-table-title.jsx +20 -21
  135. package/src/components/metrics-table-title/metrics-table-title.module.css +2 -0
  136. package/src/components/module-info/module-info.jsx +3 -7
  137. package/src/components/module-info/module-info.module.css +1 -0
  138. package/src/components/summary/summary.jsx +1 -1
  139. package/src/components/summary-item/summary-item.jsx +21 -27
  140. package/src/components/summary-item/summary-item.module.css +1 -23
  141. package/src/components/total-size-type-title/total-size-type-title.jsx +6 -9
  142. package/src/css/default.css +14 -3
  143. package/src/css/variables.css +17 -17
  144. package/src/hooks/search-params.js +42 -33
  145. package/src/layout/box/box.module.css +9 -0
  146. package/src/layout/footer/footer.module.css +1 -1
  147. package/src/layout/index.js +1 -0
  148. package/src/layout/separator.jsx +25 -0
  149. package/src/layout/separator.module.css +5 -0
  150. package/src/ui/dropdown/dropdown.jsx +16 -22
  151. package/src/ui/dropdown/dropdown.module.css +11 -12
  152. package/src/ui/empty-set/empty-set.jsx +25 -21
  153. package/src/ui/empty-set/empty-set.module.css +2 -2
  154. package/src/ui/filters/filters.jsx +64 -53
  155. package/src/ui/filters/filters.module.css +3 -3
  156. package/src/ui/hover-card/hover-card.jsx +73 -0
  157. package/src/ui/hover-card/hover-card.module.css +29 -0
  158. package/src/ui/hover-card/index.js +1 -0
  159. package/src/ui/icon/icon.jsx +11 -7
  160. package/src/ui/icon/icon.module.css +1 -0
  161. package/src/ui/index.js +1 -1
  162. package/src/ui/table/table.jsx +5 -52
  163. package/src/ui/table/table.module.css +41 -25
  164. package/src/ui/tag/index.js +1 -0
  165. package/src/ui/tag/tag.jsx +49 -0
  166. package/src/ui/tag/tag.module.css +55 -0
  167. package/src/ui/tooltip/tooltip.jsx +10 -14
  168. package/src/ui/tooltip/tooltip.module.css +2 -1
  169. package/lib/ui/popover/popover.js +0 -92
  170. package/lib/ui/popover/popover.module.css +0 -66
  171. package/lib/ui/popover/popover.stories.js +0 -26
  172. package/lib-esm/ui/popover/index.js +0 -1
  173. package/lib-esm/ui/popover/popover.js +0 -71
  174. package/lib-esm/ui/popover/popover.module.css +0 -66
  175. package/lib-esm/ui/popover/popover.stories.js +0 -14
  176. package/src/ui/popover/index.js +0 -1
  177. package/src/ui/popover/popover.jsx +0 -79
  178. package/src/ui/popover/popover.module.css +0 -66
@@ -3,7 +3,7 @@ function _extends() { _extends = Object.assign || function (target) { for (var i
3
3
  import React from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import cx from 'classnames';
6
- import { Tooltip as UITooltip, TooltipArrow as UITooltipArrow, TooltipReference as UITooltipReference, useTooltipState } from 'reakit/Tooltip';
6
+ import { Tooltip as UITooltip, TooltipAnchor as UITooltipAnchor, TooltipArrow as UITooltipArrow, useTooltipState } from 'ariakit/tooltip';
7
7
  import css from './tooltip.module.css';
8
8
  export const Tooltip = props => {
9
9
  const {
@@ -15,22 +15,23 @@ export const Tooltip = props => {
15
15
  darkMode,
16
16
  ...restProps
17
17
  } = props;
18
- const rootClassName = cx(css.root, className);
19
- const tooltipProps = useTooltipState({
20
- baseId: process.env.NODE_ENV === 'test' && 'id-test',
18
+ const tooltip = useTooltipState({
21
19
  placement: 'top'
22
20
  });
23
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UITooltipReference, _extends({
21
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UITooltipAnchor, _extends({
24
22
  as: Component,
25
- className: rootClassName
23
+ className: cx(css.root, className),
24
+ state: tooltip
26
25
  }, ref ? {
27
26
  ref
28
- } : {}, restProps, tooltipProps), children), title && /*#__PURE__*/React.createElement(UITooltip, _extends({}, tooltipProps, {
27
+ } : {}, restProps), children), title && /*#__PURE__*/React.createElement(UITooltip, {
28
+ state: tooltip,
29
29
  className: cx(css.tooltip, darkMode && css.tooltipDarkMode)
30
- }), /*#__PURE__*/React.createElement(UITooltipArrow, _extends({}, tooltipProps, {
30
+ }, /*#__PURE__*/React.createElement(UITooltipArrow, {
31
+ state: tooltip,
31
32
  className: css.arrow,
32
33
  size: 12
33
- })), title));
34
+ }), title));
34
35
  };
35
36
  Tooltip.defaultProps = {
36
37
  className: '',
@@ -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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bundle-stats/ui",
3
- "version": "3.3.0-alpha.1",
3
+ "version": "3.4.0-alpha.1",
4
4
  "description": "UI components for BundleStats projects.",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-esm/index.js",
@@ -15,7 +15,7 @@
15
15
  "generate-svg-sprite": "npx svg-sprite -s --si --no-svg-namespace-classnames src/assets/icons/*.svg && mv symbol/svg/sprite.symbol.svg src/assets/icons.svg",
16
16
  "lint": "../../node_modules/.bin/eslint . --ext .jsx,.js",
17
17
  "start": "cross-env NODE_ENV=development start-storybook -c ./build/storybook -p 8080",
18
- "test": "npm run test:unit && npm run test:storyshots",
18
+ "test": "npm run test:unit",
19
19
  "test:unit": "jest src --passWithNoTests",
20
20
  "test:storyshots": "jest build/storybook ",
21
21
  "chromatic": "chromatic --exit-zero-on-changes"
@@ -36,38 +36,39 @@
36
36
  },
37
37
  "homepage": "https://github.com/relative-ci/bundle-stats/blob/master/packages/ui#readme",
38
38
  "devDependencies": {
39
- "@babel/cli": "7.16.0",
40
- "@babel/core": "7.16.0",
41
- "@babel/plugin-proposal-class-properties": "7.16.0",
42
- "@babel/preset-env": "7.16.4",
43
- "@babel/preset-react": "7.16.0",
39
+ "@babel/cli": "7.17.6",
40
+ "@babel/core": "7.17.5",
41
+ "@babel/plugin-proposal-class-properties": "7.16.7",
42
+ "@babel/preset-env": "7.16.11",
43
+ "@babel/preset-react": "7.16.7",
44
44
  "@simplyianm/babel-plugin-inline-react-svg": "1.2.0",
45
+ "@storybook/addon-essentials": "6.4.19",
45
46
  "@storybook/addon-knobs": "6.4.0",
46
47
  "@storybook/addon-postcss": "2.0.0",
47
- "@storybook/addon-storyshots": "6.4.8",
48
- "@storybook/addons": "6.4.8",
49
- "@storybook/builder-webpack5": "6.4.8",
50
- "@storybook/manager-webpack5": "6.4.8",
51
- "@storybook/react": "6.4.8",
48
+ "@storybook/addon-storyshots": "6.4.19",
49
+ "@storybook/addons": "6.4.19",
50
+ "@storybook/builder-webpack5": "6.4.19",
51
+ "@storybook/manager-webpack5": "6.4.19",
52
+ "@storybook/react": "6.4.19",
52
53
  "babel-core": "7.0.0-bridge.0",
53
- "babel-jest": "27.4.2",
54
+ "babel-jest": "27.5.1",
54
55
  "babel-plugin-lodash": "3.3.4",
55
56
  "babel-plugin-require-context-hook": "1.0.0",
56
- "chromatic": "6.2.0",
57
+ "chromatic": "6.5.1",
57
58
  "classnames": "2.3.1",
58
59
  "colormap": "2.3.2",
59
- "core-js": "3.19.3",
60
+ "core-js": "3.20.2",
60
61
  "cross-env": "7.0.3",
61
62
  "enzyme": "3.11.0",
62
63
  "enzyme-adapter-react-16": "1.15.6",
63
64
  "enzyme-to-json": "3.6.2",
64
65
  "hex-rgb": "5.0.0",
65
66
  "identity-obj-proxy": "3.0.0",
66
- "jest": "27.4.3",
67
+ "jest": "27.5.1",
67
68
  "jest-date-mock": "1.0.8",
68
69
  "lodash": "4.17.21",
69
- "postcss": "8.4.4",
70
- "prop-types": "15.7.2",
70
+ "postcss": "8.4.7",
71
+ "prop-types": "15.8.1",
71
72
  "react": "16.14.0",
72
73
  "react-dom": "16.14.0",
73
74
  "react-router-dom": "5.3.0",
@@ -75,20 +76,21 @@
75
76
  "rimraf": "3.0.2"
76
77
  },
77
78
  "peerDependencies": {
78
- "classnames": "^2.2.6",
79
- "core-js": "^3.16.2",
80
- "lodash": "^4.17.21",
81
- "prop-types": "^15.7.2",
82
- "react": "^16.14.0",
83
- "react-dom": "^16.14.0",
84
- "react-router-dom": "^5.3.0"
79
+ "classnames": "2.2.6",
80
+ "core-js": "3.20.2",
81
+ "lodash": "4.17.21",
82
+ "prop-types": "15.7.2",
83
+ "react": "16.14.0",
84
+ "react-dom": "16.14.0",
85
+ "react-router-dom": "5.3.0"
85
86
  },
86
87
  "dependencies": {
87
- "@bundle-stats/utils": "^3.3.0-alpha.1",
88
- "date-fns": "^2.6.0",
89
- "query-string": "^7.0.0",
90
- "reakit": "^1.3.6",
91
- "use-query-params": "^1.2.2"
88
+ "@bundle-stats/utils": "^3.4.0-alpha.1",
89
+ "ariakit": "2.0.0-alpha.19",
90
+ "date-fns": "2.28.0",
91
+ "modern-css-reset": "1.4.0",
92
+ "query-string": "7.1.1",
93
+ "use-query-params": "1.2.3"
92
94
  },
93
- "gitHead": "b510975b373ee38b66899a990c7341d1a29a69e2"
95
+ "gitHead": "a7ba8010b047028c4e56e407719616fde7d8ea88"
94
96
  }
package/src/app/app.jsx CHANGED
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useMemo } from 'react';
1
+ import React, { useContext, useEffect, useMemo } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { HashRouter, NavLink, Route, Switch, useLocation } from 'react-router-dom';
4
4
  import { COMPONENT } from '@bundle-stats/utils';
@@ -57,16 +57,116 @@ Layout.defaultProps = {
57
57
  version: null,
58
58
  };
59
59
 
60
- const AppComponent = ({ version, jobs }) => {
60
+ const JobsContext = React.createContext({ jobs: [] });
61
+ const JobsProvider = ({ jobs, ...restProps }) => {
62
+ const value = useMemo(() => ({ jobs }), [jobs]);
63
+ return <JobsContext.Provider value={value} {...restProps} />;
64
+ };
65
+
66
+ JobsProvider.propTypes = {
67
+ jobs: PropTypes.arrayOf(PropTypes.object).isRequired,
68
+ };
69
+
70
+ const OverviewContent = () => {
71
+ const { jobs } = useContext(JobsContext);
72
+ const { duplicatePackagesCount } = jobs[0].summary.webpack;
73
+ const duplicatePackagesInsights = Boolean(
74
+ duplicatePackagesCount.current || duplicatePackagesCount.baseline,
75
+ );
76
+
77
+ return (
78
+ <Stack space="medium">
79
+ {duplicatePackagesInsights && (
80
+ <Container>
81
+ <Stack space="small">
82
+ <DuplicatePackagesWarning
83
+ duplicatePackagesCount={duplicatePackagesCount}
84
+ showDelta={jobs.length > 1}
85
+ />
86
+ <BudgetInsights source="webpack" budgets={jobs[0].insights?.webpack?.budgets} />
87
+ </Stack>
88
+ </Container>
89
+ )}
90
+ <Container>
91
+ <Stack space="small">
92
+ <TotalSizeTypeTitle />
93
+ <BundleAssetsTotalsChartBars jobs={jobs} />
94
+ <BundleAssetsTotalsTable jobs={jobs} outline />
95
+ </Stack>
96
+ </Container>
97
+ </Stack>
98
+ );
99
+ };
100
+
101
+ const AssetsContent = () => {
61
102
  const [bundleStatsState, bundleStatsSetState] = useComponentQueryState(COMPONENT.BUNDLE_ASSETS);
62
- const [bundlePackagesState, bundlePackagesSetState] = useComponentQueryState(
63
- COMPONENT.BUNDLE_PACKAGES,
103
+ const { jobs } = useContext(JobsContext);
104
+
105
+ return (
106
+ <Container>
107
+ <Stack space="medium">
108
+ <Summary
109
+ keys={METRICS_WEBPACK_ASSETS}
110
+ data={jobs?.[0]?.summary}
111
+ budgets={jobs[0].insights?.webpack?.budgets}
112
+ showSummaryItemDelta={jobs?.length !== 1}
113
+ />
114
+ <Box outline>
115
+ <BundleAssets jobs={jobs} setState={bundleStatsSetState} {...bundleStatsState} />
116
+ </Box>
117
+ </Stack>
118
+ </Container>
64
119
  );
120
+ };
121
+
122
+ const ModulesContent = () => {
65
123
  const [bundleModulesState, bundleModulesSetState] = useComponentQueryState(
66
124
  COMPONENT.BUNDLE_MODULES,
67
125
  );
126
+ const { jobs } = useContext(JobsContext);
127
+
128
+ return (
129
+ <Container>
130
+ <Stack space="medium">
131
+ <Summary
132
+ keys={METRICS_WEBPACK_MODULES}
133
+ data={jobs?.[0]?.summary}
134
+ budgets={jobs[0].insights?.webpack?.budgets}
135
+ showSummaryItemDelta={jobs?.length !== 1}
136
+ />
137
+ <Box outline>
138
+ <BundleModules jobs={jobs} setState={bundleModulesSetState} {...bundleModulesState} />
139
+ </Box>
140
+ </Stack>
141
+ </Container>
142
+ );
143
+ };
68
144
 
69
- if (jobs.length === 0) {
145
+ const PackagesContent = () => {
146
+ const [bundlePackagesState, bundlePackagesSetState] = useComponentQueryState(
147
+ COMPONENT.BUNDLE_PACKAGES,
148
+ );
149
+ const { jobs } = useContext(JobsContext);
150
+
151
+ return (
152
+ <Container>
153
+ <Stack space="medium">
154
+ <Summary
155
+ keys={METRICS_WEBPACK_PACKAGES}
156
+ data={jobs?.[0]?.summary}
157
+ budgets={jobs[0].insights?.webpack?.budgets}
158
+ showSummaryItemDelta={jobs?.length !== 1}
159
+ />
160
+ <Box outline>
161
+ <BundlePackages jobs={jobs} {...bundlePackagesState} setState={bundlePackagesSetState} />
162
+ </Box>
163
+ </Stack>
164
+ </Container>
165
+ );
166
+ };
167
+
168
+ const AppComponent = ({ version, jobs }) => {
169
+ if (jobs?.length === 0) {
70
170
  return (
71
171
  <Layout version={version}>
72
172
  <Container>
@@ -76,148 +176,45 @@ const AppComponent = ({ version, jobs }) => {
76
176
  );
77
177
  }
78
178
 
79
- const { summary, insights } = useMemo(() => jobs[0], jobs);
80
-
81
- const { duplicatePackagesCount } = summary.webpack;
82
- const duplicatePackagesInsights = Boolean(
83
- duplicatePackagesCount.current || duplicatePackagesCount.baseline,
84
- );
85
-
86
179
  return (
87
- <Layout jobs={jobs} version={version}>
88
- <Container className={css.summaryContainer}>
89
- <Summary
90
- size="large"
91
- keys={METRICS_WEBPACK_GENERAL}
92
- data={summary}
93
- budgets={insights?.webpack?.budgets}
94
- showSummaryItemDelta={jobs.length !== 1}
95
- />
96
- </Container>
97
-
98
- <Container className={css.tabsContainer}>
99
- <Tabs className={css.tabs}>
100
- <NavLink exact to={URLS.OVERVIEW} activeClassName={css.tabActive}>
101
- {I18N.OVERVIEW}
102
- </NavLink>
103
- <NavLink exact to={URLS.ASSETS} activeClassName={css.tabActive}>
104
- {I18N.ASSETS}
105
- </NavLink>
106
- <NavLink exact to={URLS.MODULES} activeClassName={css.tabActive}>
107
- {I18N.MODULES}
108
- </NavLink>
109
- <NavLink exact to={URLS.PACKAGES} activeClassName={css.tabActive}>
110
- {I18N.PACKAGES}
111
- </NavLink>
112
- </Tabs>
113
- </Container>
114
-
115
- <div className={css.tabsContent}>
116
- <Switch>
117
- <Route
118
- exact
119
- path={URLS.ASSETS}
120
- render={({ location }) => (
121
- <Container>
122
- <Stack space="medium">
123
- <Summary
124
- keys={METRICS_WEBPACK_ASSETS}
125
- data={summary}
126
- budgets={insights?.webpack?.budgets}
127
- showSummaryItemDelta={jobs.length !== 1}
128
- />
129
- <Box outline>
130
- <BundleAssets
131
- jobs={jobs}
132
- setState={bundleStatsSetState}
133
- {...bundleStatsState}
134
- key={`${location.pathname}_${location.search}`}
135
- />
136
- </Box>
137
- </Stack>
138
- </Container>
139
- )}
180
+ <JobsProvider jobs={jobs}>
181
+ <Layout jobs={jobs} version={version}>
182
+ <Container className={css.summaryContainer}>
183
+ <Summary
184
+ size="large"
185
+ keys={METRICS_WEBPACK_GENERAL}
186
+ data={jobs[0].summary}
187
+ budgets={jobs[0].insights?.webpack?.budgets}
188
+ showSummaryItemDelta={jobs.length !== 1}
140
189
  />
141
- <Route
142
- exact
143
- path={URLS.MODULES}
144
- render={() => (
145
- <Container>
146
- <Stack space="medium">
147
- <Summary
148
- keys={METRICS_WEBPACK_MODULES}
149
- data={summary}
150
- budgets={insights?.webpack?.budgets}
151
- showSummaryItemDelta={jobs.length !== 1}
152
- />
153
- <Box outline>
154
- <BundleModules
155
- jobs={jobs}
156
- setState={bundleModulesSetState}
157
- {...bundleModulesState}
158
- />
159
- </Box>
160
- </Stack>
161
- </Container>
162
- )}
163
- />
164
- <Route
165
- exact
166
- path={URLS.PACKAGES}
167
- render={({ location }) => (
168
- <Container>
169
- <Stack space="medium">
170
- <Summary
171
- keys={METRICS_WEBPACK_PACKAGES}
172
- data={summary}
173
- budgets={insights?.webpack?.budgets}
174
- showSummaryItemDelta={jobs.length !== 1}
175
- />
176
- <Box outline>
177
- <BundlePackages
178
- jobs={jobs}
179
- {...bundlePackagesState}
180
- setState={bundlePackagesSetState}
181
- key={`${location.pathname}_${location.search}`}
182
- />
183
- </Box>
184
- </Stack>
185
- </Container>
186
- )}
187
- />
188
- <Route
189
- exact
190
- path={URLS.OVERVIEW}
191
- render={() => (
192
- <Stack space="large">
193
- {duplicatePackagesInsights && (
194
- <Container>
195
- <DuplicatePackagesWarning
196
- duplicatePackagesCount={duplicatePackagesCount}
197
- showDelta={jobs.length > 1}
198
- />
199
- </Container>
200
- )}
201
- {insights?.webpack?.budgets && (
202
- <Container>
203
- <BudgetInsights source="webpack" budgets={insights.webpack.budgets} />
204
- </Container>
205
- )}
206
- <Container>
207
- <Stack space="small">
208
- <TotalSizeTypeTitle />
209
- <BundleAssetsTotalsChartBars jobs={jobs} />
210
- <Box outline>
211
- <BundleAssetsTotalsTable jobs={jobs} />
212
- </Box>
213
- </Stack>
214
- </Container>
215
- </Stack>
216
- )}
217
- />
218
- </Switch>
219
- </div>
220
- </Layout>
190
+ </Container>
191
+ <Container className={css.tabsContainer}>
192
+ <Tabs className={css.tabs}>
193
+ <NavLink exact to={URLS.OVERVIEW} activeClassName={css.tabActive}>
194
+ {I18N.OVERVIEW}
195
+ </NavLink>
196
+ <NavLink exact to={URLS.ASSETS} activeClassName={css.tabActive}>
197
+ {I18N.ASSETS}
198
+ </NavLink>
199
+ <NavLink exact to={URLS.MODULES} activeClassName={css.tabActive}>
200
+ {I18N.MODULES}
201
+ </NavLink>
202
+ <NavLink exact to={URLS.PACKAGES} activeClassName={css.tabActive}>
203
+ {I18N.PACKAGES}
204
+ </NavLink>
205
+ </Tabs>
206
+ </Container>
207
+
208
+ <div className={css.tabsContent}>
209
+ <Switch>
210
+ <Route exact path={URLS.ASSETS} component={AssetsContent} />
211
+ <Route exact path={URLS.MODULES} component={ModulesContent} />
212
+ <Route exact path={URLS.PACKAGES} component={PackagesContent} />
213
+ <Route exact path={URLS.OVERVIEW} component={OverviewContent} />
214
+ </Switch>
215
+ </div>
216
+ </Layout>
217
+ </JobsProvider>
221
218
  );
222
219
  };
223
220
 
@@ -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
  }
@@ -4,21 +4,11 @@ import cx from 'classnames';
4
4
 
5
5
  import { Container } from '../../ui/container';
6
6
  import { JobsHeader } from '../../components/jobs-header';
7
- import { Logo } from '../../ui/logo';
8
-
9
7
  import css from './header.module.css';
10
8
 
11
9
  export const Header = ({ className, jobs }) => (
12
10
  <Container as="header" className={cx(css.root, className)}>
13
11
  <div className={css.inner}>
14
- <a
15
- className={css.branding}
16
- href="https://github.com/relative-ci/bundle-stats"
17
- target="_blank"
18
- rel="noopener noreferrer nofollow"
19
- >
20
- <Logo className={css.brandingLogo}>BundleStats</Logo>
21
- </a>
22
12
  <JobsHeader className={css.jobs} jobs={jobs} />
23
13
  </div>
24
14
  </Container>
@@ -1,4 +1,5 @@
1
1
  .fileName {
2
+ max-width: 100%;
2
3
  padding: 2px;
3
4
  background: var(--color-highlight-warning);
4
5
  }