@bundle-stats/ui 3.2.1-beta.9 → 3.3.0-alpha.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 (124) hide show
  1. package/CHANGELOG.md +47 -1
  2. package/lib/app/app.js +31 -6
  3. package/lib/app/app.stories.js +31 -3
  4. package/lib/assets/icons/alert-circle.svg +1 -0
  5. package/lib/assets/icons/arrow-right-circle.svg +1 -0
  6. package/lib/assets/icons/check-circle.svg +1 -0
  7. package/lib/assets/icons/close.svg +1 -1
  8. package/lib/assets/icons.svg +50 -1
  9. package/lib/components/browsertime-table/browsertime-table.js +1 -1
  10. package/lib/components/browsertime-table/browsertime-table.stories.js +1 -1
  11. package/lib/components/budget-info/budget-info.js +53 -0
  12. package/lib/components/budget-info/budget-info.module.css +28 -0
  13. package/lib/components/budget-info/budget-info.stories.js +42 -0
  14. package/lib/components/budget-info/index.js +18 -0
  15. package/lib/components/budget-insights/budget-insights.js +200 -0
  16. package/lib/components/budget-insights/budget-insights.module.css +53 -0
  17. package/lib/components/budget-insights/budget-insights.stories.js +104 -0
  18. package/lib/components/budget-insights/index.js +18 -0
  19. package/lib/components/bundle-assets/bundle-assets.js +3 -3
  20. package/lib/components/bundle-assets/bundle-assets.utils.js +2 -2
  21. package/lib/components/bundle-assets/index.js +3 -3
  22. package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +1 -1
  23. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +45 -8
  24. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  25. package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +58 -43
  26. package/lib/components/bundle-modules/bundle-modules.js +3 -3
  27. package/lib/components/bundle-modules/bundle-modules.utils.js +2 -2
  28. package/lib/components/bundle-modules/index.js +3 -3
  29. package/lib/components/bundle-packages/bundle-packages.js +1 -1
  30. package/lib/components/bundle-packages/bundle-packages.utils.js +2 -2
  31. package/lib/components/bundle-packages/index.js +1 -1
  32. package/lib/components/lighthouse-table/lighthouse-table.js +1 -1
  33. package/lib/components/metrics-table/metrics-table.js +1 -1
  34. package/lib/components/metrics-table-search/metrics-table-search.js +1 -1
  35. package/lib/components/metrics-table-search/metrics-table-search.stories.js +1 -1
  36. package/lib/components/summary/summary.js +40 -62
  37. package/lib/components/summary/summary.module.css +31 -14
  38. package/lib/components/summary/summary.stories.js +29 -0
  39. package/lib/components/summary-item/summary-item.js +30 -13
  40. package/lib/components/summary-item/summary-item.module.css +18 -9
  41. package/lib/components/summary-item/summary-item.stories.js +67 -52
  42. package/lib/constants.js +6 -6
  43. package/lib/css/variables.css +15 -11
  44. package/lib/hooks/search-params.js +2 -2
  45. package/lib/layout/box/box.js +2 -2
  46. package/lib/layout/stack/stack.js +13 -3
  47. package/lib/query-state.js +1 -1
  48. package/lib/stories/wrapper.js +2 -2
  49. package/lib/ui/alert/alert.js +13 -3
  50. package/lib/ui/filters/filters.container.js +5 -5
  51. package/lib/ui/filters/filters.js +2 -2
  52. package/lib/ui/filters/filters.stories.js +3 -3
  53. package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js +3 -3
  54. package/lib/ui/icon/icon.js +3 -0
  55. package/lib/ui/icon/icon.stories.js +40 -22
  56. package/lib/ui/panels/panels.js +2 -2
  57. package/lib/ui/popover/popover.js +3 -3
  58. package/lib/ui/popover/popover.module.css +2 -1
  59. package/lib/ui/tabs/tabs.js +2 -2
  60. package/lib/ui/tooltip/tooltip.module.css +1 -0
  61. package/lib/utils.js +2 -2
  62. package/lib-esm/app/app.js +57 -31
  63. package/lib-esm/app/app.stories.js +29 -1
  64. package/lib-esm/assets/icons/alert-circle.svg +1 -0
  65. package/lib-esm/assets/icons/arrow-right-circle.svg +1 -0
  66. package/lib-esm/assets/icons/check-circle.svg +1 -0
  67. package/lib-esm/assets/icons/close.svg +1 -1
  68. package/lib-esm/assets/icons.svg +50 -1
  69. package/lib-esm/components/budget-info/budget-info.js +37 -0
  70. package/lib-esm/components/budget-info/budget-info.module.css +28 -0
  71. package/lib-esm/components/budget-info/budget-info.stories.js +26 -0
  72. package/lib-esm/components/budget-info/index.js +1 -0
  73. package/lib-esm/components/budget-insights/budget-insights.js +147 -0
  74. package/lib-esm/components/budget-insights/budget-insights.module.css +53 -0
  75. package/lib-esm/components/budget-insights/budget-insights.stories.js +84 -0
  76. package/lib-esm/components/budget-insights/index.js +1 -0
  77. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +24 -7
  78. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  79. package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +46 -21
  80. package/lib-esm/components/summary/summary.js +26 -45
  81. package/lib-esm/components/summary/summary.module.css +31 -14
  82. package/lib-esm/components/summary/summary.stories.js +27 -0
  83. package/lib-esm/components/summary-item/summary-item.js +28 -12
  84. package/lib-esm/components/summary-item/summary-item.module.css +18 -9
  85. package/lib-esm/components/summary-item/summary-item.stories.js +52 -42
  86. package/lib-esm/constants.js +4 -4
  87. package/lib-esm/css/variables.css +15 -11
  88. package/lib-esm/layout/box/box.js +2 -2
  89. package/lib-esm/layout/stack/stack.js +6 -3
  90. package/lib-esm/ui/alert/alert.js +6 -3
  91. package/lib-esm/ui/filters/filters.container.js +39 -41
  92. package/lib-esm/ui/icon/icon.js +3 -0
  93. package/lib-esm/ui/icon/icon.stories.js +22 -11
  94. package/lib-esm/ui/popover/popover.js +2 -2
  95. package/lib-esm/ui/popover/popover.module.css +2 -1
  96. package/lib-esm/ui/tooltip/tooltip.module.css +1 -0
  97. package/package.json +15 -15
  98. package/src/app/app.jsx +24 -8
  99. package/src/assets/icons/alert-circle.svg +1 -0
  100. package/src/assets/icons/arrow-right-circle.svg +1 -0
  101. package/src/assets/icons/check-circle.svg +1 -0
  102. package/src/assets/icons/close.svg +1 -1
  103. package/src/assets/icons.svg +50 -1
  104. package/src/components/budget-info/budget-info.jsx +49 -0
  105. package/src/components/budget-info/budget-info.module.css +28 -0
  106. package/src/components/budget-info/index.js +1 -0
  107. package/src/components/budget-insights/budget-insights.jsx +152 -0
  108. package/src/components/budget-insights/budget-insights.module.css +53 -0
  109. package/src/components/budget-insights/index.js +1 -0
  110. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +28 -13
  111. package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
  112. package/src/components/summary/summary.jsx +26 -44
  113. package/src/components/summary/summary.module.css +31 -14
  114. package/src/components/summary-item/summary-item.jsx +26 -24
  115. package/src/components/summary-item/summary-item.module.css +18 -9
  116. package/src/constants.js +7 -7
  117. package/src/css/variables.css +15 -11
  118. package/src/layout/box/box.jsx +1 -1
  119. package/src/layout/stack/stack.jsx +2 -2
  120. package/src/ui/alert/alert.jsx +7 -2
  121. package/src/ui/icon/icon.jsx +3 -0
  122. package/src/ui/popover/popover.jsx +3 -3
  123. package/src/ui/popover/popover.module.css +2 -1
  124. package/src/ui/tooltip/tooltip.module.css +1 -0
@@ -1,47 +1,57 @@
1
1
  import React from 'react';
2
- import { storiesOf } from '@storybook/react';
3
- import { getWrapperDecorator } from '../../stories';
4
2
  import { SummaryItem } from './summary-item';
5
- const stories = storiesOf('Components/SummaryItem', module);
6
- stories.addDecorator(getWrapperDecorator({
7
- maxWidth: '320px'
8
- }));
9
- stories.add('default', () => /*#__PURE__*/React.createElement(SummaryItem, {
10
- loading: false,
11
- id: "webpack.totalSizeByTypeALL",
12
- data: {
13
- current: 120 * 1000,
14
- baseline: 100 * 1000
3
+ export default {
4
+ title: 'Components/SummaryItem',
5
+ component: SummaryItem,
6
+ decorators: [Story => /*#__PURE__*/React.createElement("div", {
7
+ style: {
8
+ maxWidth: '320px'
9
+ }
10
+ }, /*#__PURE__*/React.createElement(Story, null))],
11
+ args: {
12
+ loading: false,
13
+ id: 'webpack.totalSizeByTypeALL',
14
+ data: {
15
+ current: 120 * 1000,
16
+ baseline: 100 * 1000
17
+ }
15
18
  }
16
- }));
17
- stories.add('size large', () => /*#__PURE__*/React.createElement(SummaryItem, {
18
- size: "large",
19
- loading: false,
20
- id: "webpack.totalSizeByTypeALL",
21
- data: {
22
- current: 120 * 1000,
23
- baseline: 100 * 1000
24
- }
25
- }));
26
- stories.add('showMetricDescription', () => /*#__PURE__*/React.createElement(SummaryItem, {
27
- loading: false,
28
- id: "webpack.totalSizeByTypeALL",
29
- data: {
30
- current: 120 * 1000,
31
- baseline: 100 * 1000
32
- },
19
+ };
20
+
21
+ const Template = args => /*#__PURE__*/React.createElement(SummaryItem, args);
22
+
23
+ export const Standard = Template.bind();
24
+ export const SizeLarge = Template.bind();
25
+ SizeLarge.args = {
26
+ size: 'large'
27
+ };
28
+ export const ShowMetricDescription = Template.bind();
29
+ ShowMetricDescription.args = {
33
30
  showMetricDescription: true
34
- }));
35
- stories.add('showDelta false', () => /*#__PURE__*/React.createElement(SummaryItem, {
36
- loading: false,
37
- id: "webpack.totalSizeByTypeALL",
38
- data: {
39
- current: 120 * 1000,
40
- baseline: 0
41
- },
31
+ };
32
+ export const ShowDeltaFalse = Template.bind();
33
+ ShowDeltaFalse.args = {
42
34
  showDelta: false
43
- }));
44
- stories.add('loading', () => /*#__PURE__*/React.createElement(SummaryItem, {
45
- loading: true,
46
- id: "webpack.totalSizeByTypeALL"
47
- }));
35
+ };
36
+ export const BudgetOver = Template.bind();
37
+ BudgetOver.args = {
38
+ showMetricDescription: true,
39
+ budget: {
40
+ value: 120 * 1000,
41
+ budget: 100 * 1000,
42
+ overBudget: true
43
+ }
44
+ };
45
+ export const BudgetUnder = Template.bind();
46
+ BudgetUnder.args = {
47
+ showMetricDescription: true,
48
+ budget: {
49
+ value: 120 * 1000,
50
+ budget: 120 * 1024,
51
+ overBudget: false
52
+ }
53
+ };
54
+ export const Loading = Template.bind();
55
+ Loading.args = {
56
+ loading: true
57
+ };
@@ -25,7 +25,7 @@ export const SECTION_URLS = {
25
25
  export const ASSETS_SIZES_FILE_TYPE_MAP = FILE_TYPES.reduce((agg, fileType) => ({ ...agg,
26
26
  [`webpack.sizes.totalSizeByType${fileType}`]: fileType
27
27
  }), {});
28
- export const METRICS_WEBPACK_GENERAL = ['webpack.totalSizeByTypeALL', 'webpack.totalInitialSizeJS', 'webpack.totalInitialSizeCSS', 'webpack.cacheInvalidation'];
29
- export const METRICS_WEBPACK_ASSETS = ['webpack.assetCount', 'webpack.chunkCount'];
30
- export const METRICS_WEBPACK_MODULES = ['webpack.moduleCount'];
31
- export const METRICS_WEBPACK_PACKAGES = ['webpack.packageCount', 'webpack.duplicatePackagesCount'];
28
+ export const METRICS_WEBPACK_GENERAL = ['totalSizeByTypeALL', 'totalInitialSizeJS', 'totalInitialSizeCSS', 'cacheInvalidation'];
29
+ export const METRICS_WEBPACK_ASSETS = ['assetCount', 'chunkCount'];
30
+ export const METRICS_WEBPACK_MODULES = ['moduleCount'];
31
+ export const METRICS_WEBPACK_PACKAGES = ['packageCount', 'duplicatePackagesCount'];
@@ -27,20 +27,20 @@
27
27
 
28
28
  /*
29
29
  * Color scheme:
30
- * http://mcg.mbitson.com/#!?mcgpalette0=%23dd555e&mcgpalette1=%2363bf5e&mcgpalette2=%23f7e37d&mcgpalette3=%23484a4d&mcgpalette4=%233385d6&themename=mcgtheme
30
+ * http://mcg.mbitson.com/#!?mcgpalette0=%23dd555e&mcgpalette1=%2363bf5e&mcgpalette2=%23f7e37d&mcgpalette3=%23636568&mcgpalette4=%233385d6&themename=mcgtheme
31
31
  * https://coolors.co/3385d6-dd555e-63bf5e-f7e37d-192339
32
32
  */
33
33
  --color-gray-25: #fafafa;
34
- --color-gray-50: #e9e9ea;
35
- --color-gray-100: #c8c9ca;
36
- --color-gray-200: #a4a5a6;
37
- --color-gray-300: #7f8082;
38
- --color-gray-400: #636568;
39
- --color-gray-500: #484a4d;
40
- --color-gray-600: #414346;
41
- --color-gray-700: #383a3d;
42
- --color-gray-800: #303234;
43
- --color-gray-900: #212225;
34
+ --color-gray-50: #eceded;
35
+ --color-gray-100: #d0d1d2;
36
+ --color-gray-200: #b1b2b4;
37
+ --color-gray-300: #929395;
38
+ --color-gray-400: #7a7c7f;
39
+ --color-gray-500: #636568;
40
+ --color-gray-600: #5b5d60;
41
+ --color-gray-700: #515355;
42
+ --color-gray-800: #47494b;
43
+ --color-gray-900: #35373a;
44
44
 
45
45
  --color-gray-ultra-light: var(--color-gray-200);
46
46
  --color-gray-light: var(--color-gray-300);
@@ -181,6 +181,10 @@
181
181
  --layer-high: 1000;
182
182
  --layer-xhigh: 10000;
183
183
 
184
+ --radius-small: var(--space-xxxsmall);
185
+ --radius-medium: var(--space-xxsmall);
186
+ --radius-large: var(--space-small);
187
+
184
188
  /** Layout */
185
189
  --max-width: 80rem;
186
190
  }
@@ -17,9 +17,9 @@ export const Box = props => {
17
17
  } = props;
18
18
  const [resolvedPadding, resolvedVerticalPadding, resolvedHorizontalPadding] = Array.isArray(padding) ? [null, ...padding] : [padding, verticalPadding, horizontalPadding];
19
19
  const rootClassName = cx(css.root, className, resolvedPadding && css[`padding-${resolvedPadding}`], resolvedVerticalPadding && css[`vertical-padding-${resolvedVerticalPadding}`], resolvedHorizontalPadding && css[`horizontal-padding-${resolvedHorizontalPadding}`], outline && css.outline);
20
- return /*#__PURE__*/React.createElement(Component, _extends({
20
+ return /*#__PURE__*/React.createElement(Component, _extends({}, restProps, {
21
21
  className: rootClassName
22
- }, restProps));
22
+ }));
23
23
  };
24
24
  Box.defaultProps = {
25
25
  className: '',
@@ -1,3 +1,5 @@
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
+
1
3
  import React from 'react';
2
4
  import PropTypes from 'prop-types';
3
5
  import cx from 'classnames';
@@ -9,12 +11,13 @@ export const Stack = props => {
9
11
  as: Component,
10
12
  className,
11
13
  space,
12
- children
14
+ children,
15
+ ...restProps
13
16
  } = props;
14
17
  const rootClassName = cx(className, css.root, css[`space--${space}`]);
15
- return /*#__PURE__*/React.createElement(Component, {
18
+ return /*#__PURE__*/React.createElement(Component, _extends({}, restProps, {
16
19
  className: rootClassName
17
- }, React.Children.map(children, getRenderChildWithClassName(css.item)));
20
+ }), React.Children.map(children, getRenderChildWithClassName(css.item)));
18
21
  };
19
22
  Stack.defaultProps = {
20
23
  as: 'div',
@@ -1,3 +1,5 @@
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
+
1
3
  import React from 'react';
2
4
  import cx from 'classnames';
3
5
  import PropTypes from 'prop-types';
@@ -7,13 +9,14 @@ export const Alert = props => {
7
9
  const {
8
10
  className,
9
11
  kind,
10
- children
12
+ children,
13
+ ...restProps
11
14
  } = props;
12
- return /*#__PURE__*/React.createElement(Box, {
15
+ return /*#__PURE__*/React.createElement(Box, _extends({
13
16
  padding: ['xsmall', 'small'],
14
17
  outline: true,
15
18
  className: cx(css.root, className, css[kind])
16
- }, children);
19
+ }, restProps), children);
17
20
  };
18
21
  Alert.propTypes = {
19
22
  className: PropTypes.string,
@@ -28,45 +28,6 @@ export const filtersDropdownContainer = BaseComponent => {
28
28
  class FiltersContainer extends React.Component {
29
29
  constructor(props) {
30
30
  super(props);
31
-
32
- this.toggleFilter = (key, value) => this.setState(_ref2 => {
33
- let {
34
- values,
35
- ...state
36
- } = _ref2;
37
- const newState = { ...state,
38
- values: { ...values,
39
- [key]: value
40
- }
41
- };
42
- const {
43
- onChange
44
- } = this.props;
45
-
46
- if (onChange) {
47
- onChange(newState.values);
48
- }
49
-
50
- return newState;
51
- });
52
-
53
- this.toggleFilters = newFilters => this.setState(prevState => {
54
- const newState = { ...prevState,
55
- values: { ...prevState.values,
56
- ...newFilters
57
- }
58
- };
59
- const {
60
- onChange
61
- } = this.props;
62
-
63
- if (onChange) {
64
- onChange(newState.values);
65
- }
66
-
67
- return newState;
68
- });
69
-
70
31
  const {
71
32
  filters
72
33
  } = this.props;
@@ -75,10 +36,10 @@ export const filtersDropdownContainer = BaseComponent => {
75
36
  };
76
37
  }
77
38
 
78
- static getDerivedStateFromProps(_ref3, state) {
39
+ static getDerivedStateFromProps(_ref2, state) {
79
40
  let {
80
41
  filters
81
- } = _ref3;
42
+ } = _ref2;
82
43
 
83
44
  if (_isEqual(filters, state.values)) {
84
45
  return null;
@@ -89,6 +50,43 @@ export const filtersDropdownContainer = BaseComponent => {
89
50
  };
90
51
  }
91
52
 
53
+ toggleFilter = (key, value) => this.setState(_ref3 => {
54
+ let {
55
+ values,
56
+ ...state
57
+ } = _ref3;
58
+ const newState = { ...state,
59
+ values: { ...values,
60
+ [key]: value
61
+ }
62
+ };
63
+ const {
64
+ onChange
65
+ } = this.props;
66
+
67
+ if (onChange) {
68
+ onChange(newState.values);
69
+ }
70
+
71
+ return newState;
72
+ });
73
+ toggleFilters = newFilters => this.setState(prevState => {
74
+ const newState = { ...prevState,
75
+ values: { ...prevState.values,
76
+ ...newFilters
77
+ }
78
+ };
79
+ const {
80
+ onChange
81
+ } = this.props;
82
+
83
+ if (onChange) {
84
+ onChange(newState.values);
85
+ }
86
+
87
+ return newState;
88
+ });
89
+
92
90
  render() {
93
91
  return /*#__PURE__*/React.createElement(BaseComponent, _extends({}, this.props, this.state, {
94
92
  toggleFilter: this.toggleFilter,
@@ -5,10 +5,13 @@ import PropTypes from 'prop-types';
5
5
  import cx from 'classnames';
6
6
  import css from './icon.module.css';
7
7
  const ICONS = {
8
+ ALERT_CIRCLE: 'alert-circle',
8
9
  ARROW: 'arrow',
10
+ ARROW_RIGHT_CIRLCE: 'arrow-right-circle',
9
11
  CANCEL: 'cancel',
10
12
  CLOSE: 'close',
11
13
  CLOCK: 'clock',
14
+ CHECK_CIRCLE: 'check-circle',
12
15
  COMMIT: 'commit',
13
16
  FILTER: 'filter',
14
17
  HELP: 'help',
@@ -1,21 +1,32 @@
1
1
  import React from 'react';
2
- import { storiesOf } from '@storybook/react';
3
- import { getWrapperDecorator } from '../../stories';
4
2
  import { Icon } from '.';
5
- const stories = storiesOf('UI/Icon', module);
6
- stories.addDecorator(getWrapperDecorator());
7
- stories.add('default', () => /*#__PURE__*/React.createElement(Icon, {
3
+ export default {
4
+ title: 'UI/Icon',
5
+ component: Icon
6
+ };
7
+
8
+ const Template = args => /*#__PURE__*/React.createElement(Icon, args);
9
+
10
+ export const Standard = Template.bind();
11
+ Standard.args = {
8
12
  glyph: Icon.ICONS.ARROW
9
- }));
10
- stories.add('with size', () => /*#__PURE__*/React.createElement(Icon, {
13
+ };
14
+ export const CustomSize = Template.bind();
15
+ CustomSize.args = {
11
16
  glyph: Icon.ICONS.ARROW,
12
17
  size: Icon.SIZE_LARGE
13
- }));
14
- stories.add('all', () => /*#__PURE__*/React.createElement(React.Fragment, null, Object.values(Icon.ICONS).map(glyph => /*#__PURE__*/React.createElement("span", {
18
+ };
19
+ export const All = () => /*#__PURE__*/React.createElement(React.Fragment, null, Object.values(Icon.ICONS).map(glyph => /*#__PURE__*/React.createElement("div", {
15
20
  style: {
16
- margin: '0.3rem'
21
+ display: 'inline-block',
22
+ padding: '1rem',
23
+ textAlign: 'center'
17
24
  }
18
25
  }, /*#__PURE__*/React.createElement(Icon, {
19
26
  glyph: glyph,
20
27
  key: glyph
21
- })))));
28
+ }), /*#__PURE__*/React.createElement("code", {
29
+ style: {
30
+ display: 'block'
31
+ }
32
+ }, glyph))));
@@ -16,7 +16,7 @@ export const Popover = _ref => {
16
16
  } = _ref;
17
17
  const popover = usePopoverState({
18
18
  baseId: process.env.NODE_ENV === 'test' && 'id-test',
19
- gutter: 24,
19
+ gutter: 12,
20
20
  modal: true,
21
21
  placement: 'top'
22
22
  });
@@ -45,7 +45,7 @@ export const Popover = _ref => {
45
45
  }), /*#__PURE__*/React.createElement(UIPopoverArrow, _extends({
46
46
  className: css.arrow
47
47
  }, popover, {
48
- size: 24
48
+ size: 16
49
49
  })), typeof children === 'function' ? children({
50
50
  popoverToggle: popover.toggle
51
51
  }) : children, /*#__PURE__*/React.createElement(Icon, {
@@ -23,7 +23,8 @@
23
23
  }
24
24
 
25
25
  .popover {
26
- padding: var(--space-xsmall) var(--space-large) var(--space-xsmall) var(--space-small);
26
+ padding: var(--space-small) var(--space-large) var(--space-small) var(--space-small);
27
+ border-radius: var(--radius-small);
27
28
  max-width: 360px;
28
29
  outline: none;
29
30
  filter: drop-shadow(0 0 var(--space-xxxsmall) var(--color-shadow));
@@ -12,6 +12,7 @@
12
12
 
13
13
  .tooltip {
14
14
  padding: var(--space-xxxsmall) var(--space-xxsmall);
15
+ border-radius: var(--radius-small);
15
16
  background: var(--color-light);
16
17
  color: var(--color-text);
17
18
  filter: drop-shadow(0 0 var(--space-xxxsmall) var(--color-shadow));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bundle-stats/ui",
3
- "version": "3.2.1-beta.9",
3
+ "version": "3.3.0-alpha.0",
4
4
  "description": "UI components for BundleStats projects.",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-esm/index.js",
@@ -12,7 +12,7 @@
12
12
  "build-esm": "babel -D src -d lib-esm --ignore **/__tests__/**/* --ignore /prototypes/**",
13
13
  "build-storybook": "npx build-storybook -c ./build/storybook",
14
14
  "generate-chart-colors": "node scripts/generate-chart-colors.js",
15
- "generate-svg-sprite": "npx svg-sprite -s --si src/assets/icons/*.svg && mv symbol/svg/sprite.symbol.svg src/assets/icons.svg",
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
18
  "test": "npm run test:unit && npm run test:storyshots",
@@ -42,31 +42,31 @@
42
42
  "@babel/preset-env": "7.16.4",
43
43
  "@babel/preset-react": "7.16.0",
44
44
  "@simplyianm/babel-plugin-inline-react-svg": "1.2.0",
45
- "@storybook/addon-knobs": "6.3.1",
45
+ "@storybook/addon-knobs": "6.4.0",
46
46
  "@storybook/addon-postcss": "2.0.0",
47
- "@storybook/addon-storyshots": "6.3.12",
48
- "@storybook/addons": "6.3.12",
49
- "@storybook/builder-webpack5": "6.3.12",
50
- "@storybook/manager-webpack5": "6.3.12",
51
- "@storybook/react": "6.3.12",
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",
52
52
  "babel-core": "7.0.0-bridge.0",
53
- "babel-jest": "27.3.1",
53
+ "babel-jest": "27.4.2",
54
54
  "babel-plugin-lodash": "3.3.4",
55
55
  "babel-plugin-require-context-hook": "1.0.0",
56
- "chromatic": "6.0.6",
56
+ "chromatic": "6.2.0",
57
57
  "classnames": "2.3.1",
58
58
  "colormap": "2.3.2",
59
- "core-js": "3.19.1",
59
+ "core-js": "3.19.3",
60
60
  "cross-env": "7.0.3",
61
61
  "enzyme": "3.11.0",
62
62
  "enzyme-adapter-react-16": "1.15.6",
63
63
  "enzyme-to-json": "3.6.2",
64
64
  "hex-rgb": "5.0.0",
65
65
  "identity-obj-proxy": "3.0.0",
66
- "jest": "27.3.1",
66
+ "jest": "27.4.3",
67
67
  "jest-date-mock": "1.0.8",
68
68
  "lodash": "4.17.21",
69
- "postcss": "8.3.11",
69
+ "postcss": "8.4.4",
70
70
  "prop-types": "15.7.2",
71
71
  "react": "16.14.0",
72
72
  "react-dom": "16.14.0",
@@ -84,11 +84,11 @@
84
84
  "react-router-dom": "^5.3.0"
85
85
  },
86
86
  "dependencies": {
87
- "@bundle-stats/utils": "^3.2.1-beta.9",
87
+ "@bundle-stats/utils": "^3.3.0-alpha.0",
88
88
  "date-fns": "^2.6.0",
89
89
  "query-string": "^7.0.0",
90
90
  "reakit": "^1.3.6",
91
91
  "use-query-params": "^1.2.2"
92
92
  },
93
- "gitHead": "43b453a608ced66881eeca23c3b6c464b7dcfd8b"
93
+ "gitHead": "7c7e664296ad7aed38a6972f4421d754098119eb"
94
94
  }
package/src/app/app.jsx CHANGED
@@ -1,4 +1,4 @@
1
- import React, { useEffect } from 'react';
1
+ import React, { 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';
@@ -13,6 +13,7 @@ import {
13
13
  import { Box } from '../layout/box';
14
14
  import { Container } from '../ui/container';
15
15
  import { DuplicatePackagesWarning } from '../components/duplicate-packages-warning';
16
+ import { BudgetInsights } from '../components/budget-insights';
16
17
  import { Summary } from '../components/summary';
17
18
  import { BundleAssets } from '../components/bundle-assets';
18
19
  import { BundleAssetsTotalsChartBars } from '../components/bundle-assets-totals-chart-bars';
@@ -58,8 +59,12 @@ Layout.defaultProps = {
58
59
 
59
60
  const AppComponent = ({ version, jobs }) => {
60
61
  const [bundleStatsState, bundleStatsSetState] = useComponentQueryState(COMPONENT.BUNDLE_ASSETS);
61
- const [bundlePackagesState, bundlePackagesSetState] = useComponentQueryState(COMPONENT.BUNDLE_PACKAGES);
62
- const [bundleModulesState, bundleModulesSetState] = useComponentQueryState(COMPONENT.BUNDLE_MODULES);
62
+ const [bundlePackagesState, bundlePackagesSetState] = useComponentQueryState(
63
+ COMPONENT.BUNDLE_PACKAGES,
64
+ );
65
+ const [bundleModulesState, bundleModulesSetState] = useComponentQueryState(
66
+ COMPONENT.BUNDLE_MODULES,
67
+ );
63
68
 
64
69
  if (jobs.length === 0) {
65
70
  return (
@@ -71,7 +76,9 @@ const AppComponent = ({ version, jobs }) => {
71
76
  );
72
77
  }
73
78
 
74
- const { duplicatePackagesCount } = jobs[0].summary.webpack;
79
+ const { summary, insights } = useMemo(() => jobs[0], jobs);
80
+
81
+ const { duplicatePackagesCount } = summary.webpack;
75
82
  const duplicatePackagesInsights = Boolean(
76
83
  duplicatePackagesCount.current || duplicatePackagesCount.baseline,
77
84
  );
@@ -82,7 +89,8 @@ const AppComponent = ({ version, jobs }) => {
82
89
  <Summary
83
90
  size="large"
84
91
  keys={METRICS_WEBPACK_GENERAL}
85
- data={jobs[0].summary}
92
+ data={summary}
93
+ budgets={insights?.webpack?.budgets}
86
94
  showSummaryItemDelta={jobs.length !== 1}
87
95
  />
88
96
  </Container>
@@ -114,7 +122,8 @@ const AppComponent = ({ version, jobs }) => {
114
122
  <Stack space="medium">
115
123
  <Summary
116
124
  keys={METRICS_WEBPACK_ASSETS}
117
- data={jobs[0].summary}
125
+ data={summary}
126
+ budgets={insights?.webpack?.budgets}
118
127
  showSummaryItemDelta={jobs.length !== 1}
119
128
  />
120
129
  <Box outline>
@@ -137,7 +146,8 @@ const AppComponent = ({ version, jobs }) => {
137
146
  <Stack space="medium">
138
147
  <Summary
139
148
  keys={METRICS_WEBPACK_MODULES}
140
- data={jobs[0].summary}
149
+ data={summary}
150
+ budgets={insights?.webpack?.budgets}
141
151
  showSummaryItemDelta={jobs.length !== 1}
142
152
  />
143
153
  <Box outline>
@@ -159,7 +169,8 @@ const AppComponent = ({ version, jobs }) => {
159
169
  <Stack space="medium">
160
170
  <Summary
161
171
  keys={METRICS_WEBPACK_PACKAGES}
162
- data={jobs[0].summary}
172
+ data={summary}
173
+ budgets={insights?.webpack?.budgets}
163
174
  showSummaryItemDelta={jobs.length !== 1}
164
175
  />
165
176
  <Box outline>
@@ -187,6 +198,11 @@ const AppComponent = ({ version, jobs }) => {
187
198
  />
188
199
  </Container>
189
200
  )}
201
+ {insights?.webpack?.budgets && (
202
+ <Container>
203
+ <BudgetInsights source="webpack" budgets={insights.webpack.budgets} />
204
+ </Container>
205
+ )}
190
206
  <Container>
191
207
  <Stack space="small">
192
208
  <TotalSizeTypeTitle />
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-circle"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-right-circle"><circle cx="12" cy="12" r="10"></circle><polyline points="12 16 16 12 12 8"></polyline><line x1="8" y1="12" x2="16" y2="12"></line></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check-circle"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path><polyline points="22 4 12 14.01 9 11.01"></polyline></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x-circle"><circle cx="12" cy="12" r="10"></circle><line x1="15" y1="9" x2="9" y2="15"></line><line x1="9" y1="9" x2="15" y2="15"></line></svg>