@bundle-stats/ui 3.2.2 → 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.
- package/CHANGELOG.md +27 -0
- package/lib/app/app.js +31 -6
- package/lib/app/app.stories.js +24 -3
- package/lib/assets/icons/alert-circle.svg +1 -0
- package/lib/assets/icons/check-circle.svg +1 -0
- package/lib/assets/icons.svg +8 -0
- package/lib/components/browsertime-table/browsertime-table.js +1 -1
- package/lib/components/browsertime-table/browsertime-table.stories.js +1 -1
- package/lib/components/budget-info/budget-info.js +53 -0
- package/lib/components/budget-info/budget-info.module.css +28 -0
- package/lib/components/budget-info/budget-info.stories.js +42 -0
- package/lib/components/budget-info/index.js +18 -0
- package/lib/components/budget-insights/budget-insights.js +200 -0
- package/lib/components/budget-insights/budget-insights.module.css +53 -0
- package/lib/components/budget-insights/budget-insights.stories.js +104 -0
- package/lib/components/budget-insights/index.js +18 -0
- package/lib/components/bundle-assets/bundle-assets.js +3 -3
- package/lib/components/bundle-assets/bundle-assets.utils.js +2 -2
- package/lib/components/bundle-assets/index.js +3 -3
- package/lib/components/bundle-assets-totals-chart-bars/bundle-assets-totals-chart-bars.js +1 -1
- package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.js +45 -8
- package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
- package/lib/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +20 -1
- package/lib/components/bundle-modules/bundle-modules.js +3 -3
- package/lib/components/bundle-modules/bundle-modules.utils.js +2 -2
- package/lib/components/bundle-modules/index.js +3 -3
- package/lib/components/bundle-packages/bundle-packages.js +1 -1
- package/lib/components/bundle-packages/bundle-packages.utils.js +2 -2
- package/lib/components/bundle-packages/index.js +1 -1
- package/lib/components/lighthouse-table/lighthouse-table.js +1 -1
- package/lib/components/metrics-table/metrics-table.js +1 -1
- package/lib/components/metrics-table-search/metrics-table-search.js +1 -1
- package/lib/components/metrics-table-search/metrics-table-search.stories.js +1 -1
- package/lib/components/summary/summary.js +12 -7
- package/lib/components/summary/summary.module.css +1 -1
- package/lib/components/summary/summary.stories.js +29 -0
- package/lib/components/summary-item/summary-item.js +22 -5
- package/lib/components/summary-item/summary-item.module.css +15 -0
- package/lib/components/summary-item/summary-item.stories.js +51 -53
- package/lib/constants.js +6 -6
- package/lib/hooks/search-params.js +2 -2
- package/lib/query-state.js +1 -1
- package/lib/stories/wrapper.js +2 -2
- package/lib/ui/alert/alert.js +13 -3
- package/lib/ui/filters/filters.container.js +5 -5
- package/lib/ui/filters/filters.js +2 -2
- package/lib/ui/filters/filters.stories.js +3 -3
- package/lib/ui/horizontal-bar-chart/horizontal-bar-chart.js +3 -3
- package/lib/ui/icon/icon.js +2 -0
- package/lib/ui/panels/panels.js +2 -2
- package/lib/ui/popover/popover.js +1 -1
- package/lib/ui/tabs/tabs.js +2 -2
- package/lib/utils.js +2 -2
- package/lib-esm/app/app.js +57 -31
- package/lib-esm/app/app.stories.js +22 -1
- package/lib-esm/assets/icons/alert-circle.svg +1 -0
- package/lib-esm/assets/icons/check-circle.svg +1 -0
- package/lib-esm/assets/icons.svg +8 -0
- package/lib-esm/components/budget-info/budget-info.js +37 -0
- package/lib-esm/components/budget-info/budget-info.module.css +28 -0
- package/lib-esm/components/budget-info/budget-info.stories.js +26 -0
- package/lib-esm/components/budget-info/index.js +1 -0
- package/lib-esm/components/budget-insights/budget-insights.js +147 -0
- package/lib-esm/components/budget-insights/budget-insights.module.css +53 -0
- package/lib-esm/components/budget-insights/budget-insights.stories.js +84 -0
- package/lib-esm/components/budget-insights/index.js +1 -0
- package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.js +24 -7
- package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
- package/lib-esm/components/bundle-assets-totals-table/bundle-assets-totals-table.stories.js +18 -0
- package/lib-esm/components/summary/summary.js +11 -7
- package/lib-esm/components/summary/summary.module.css +1 -1
- package/lib-esm/components/summary/summary.stories.js +27 -0
- package/lib-esm/components/summary-item/summary-item.js +20 -4
- package/lib-esm/components/summary-item/summary-item.module.css +15 -0
- package/lib-esm/components/summary-item/summary-item.stories.js +50 -38
- package/lib-esm/constants.js +4 -4
- package/lib-esm/ui/alert/alert.js +6 -3
- package/lib-esm/ui/filters/filters.container.js +39 -41
- package/lib-esm/ui/icon/icon.js +2 -0
- package/package.json +3 -3
- package/src/app/app.jsx +24 -8
- package/src/assets/icons/alert-circle.svg +1 -0
- package/src/assets/icons/check-circle.svg +1 -0
- package/src/assets/icons.svg +8 -0
- package/src/components/budget-info/budget-info.jsx +49 -0
- package/src/components/budget-info/budget-info.module.css +28 -0
- package/src/components/budget-info/index.js +1 -0
- package/src/components/budget-insights/budget-insights.jsx +152 -0
- package/src/components/budget-insights/budget-insights.module.css +53 -0
- package/src/components/budget-insights/index.js +1 -0
- package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.jsx +28 -13
- package/src/components/bundle-assets-totals-table/bundle-assets-totals-table.module.css +2 -2
- package/src/components/summary/summary.jsx +8 -7
- package/src/components/summary/summary.module.css +1 -1
- package/src/components/summary-item/summary-item.jsx +13 -2
- package/src/components/summary-item/summary-item.module.css +15 -0
- package/src/constants.js +7 -7
- package/src/ui/alert/alert.jsx +7 -2
- package/src/ui/icon/icon.jsx +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,33 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [3.3.0-alpha.0](https://github.com/relative-ci/bundle-stats/compare/v3.2.2...v3.3.0-alpha.0) (2021-12-17)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **ui:** Alert - allow to override props ([4d52999](https://github.com/relative-ci/bundle-stats/commit/4d52999e80427f95bac30d0123cc149566b54282))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* App - add BudgetInsights ([4068e33](https://github.com/relative-ci/bundle-stats/commit/4068e334465f6eb624b92790da11306d711718f6))
|
|
17
|
+
* **ui:** App - pass budgets info to Summary ([102a4c1](https://github.com/relative-ci/bundle-stats/commit/102a4c1b4a8ab445c1a39ba8d19fba88b0c259d5))
|
|
18
|
+
* **ui:** BudgetInsights component ([4458395](https://github.com/relative-ci/bundle-stats/commit/44583958a83458285b896c5564b03df0960fb992))
|
|
19
|
+
* **ui:** BundleAssetsTotalsTable - add budgets ([b2fa86e](https://github.com/relative-ci/bundle-stats/commit/b2fa86eb1ec2ad1e4ea183a4f4dee2eefa4cfddc))
|
|
20
|
+
* **ui:** Icon - add check-circle icon ([1bc3707](https://github.com/relative-ci/bundle-stats/commit/1bc3707a868ca216da5b9e500ba0536d0163b168))
|
|
21
|
+
* **ui:** Icon - alert-circle icon ([9ae82bc](https://github.com/relative-ci/bundle-stats/commit/9ae82bcac0ff55511eafb158322b571e09a4de60))
|
|
22
|
+
* **ui:** SummaryItem - budgets ([591bb41](https://github.com/relative-ci/bundle-stats/commit/591bb414f7aa93c2e1f4208f1dfedffa037e5225))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Performance Improvements
|
|
26
|
+
|
|
27
|
+
* **ui:** BundleAssetsTotalsTable - use memo / callback ([22ec007](https://github.com/relative-ci/bundle-stats/commit/22ec00772b1b27d19d89a106fbcf93ac49b3d57e))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
6
33
|
## [3.2.2](https://github.com/relative-ci/bundle-stats/compare/v3.2.1...v3.2.2) (2021-12-08)
|
|
7
34
|
|
|
8
35
|
|
package/lib/app/app.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(obj) { "@babel/helpers - typeof";
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
4
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
@@ -23,6 +23,8 @@ var _container = require("../ui/container");
|
|
|
23
23
|
|
|
24
24
|
var _duplicatePackagesWarning = require("../components/duplicate-packages-warning");
|
|
25
25
|
|
|
26
|
+
var _budgetInsights = require("../components/budget-insights");
|
|
27
|
+
|
|
26
28
|
var _summary = require("../components/summary");
|
|
27
29
|
|
|
28
30
|
var _bundleAssets = require("../components/bundle-assets");
|
|
@@ -114,6 +116,8 @@ Layout.defaultProps = {
|
|
|
114
116
|
};
|
|
115
117
|
|
|
116
118
|
var AppComponent = function AppComponent(_ref2) {
|
|
119
|
+
var _insights$webpack;
|
|
120
|
+
|
|
117
121
|
var version = _ref2.version,
|
|
118
122
|
jobs = _ref2.jobs;
|
|
119
123
|
|
|
@@ -140,7 +144,13 @@ var AppComponent = function AppComponent(_ref2) {
|
|
|
140
144
|
}, _i18n["default"].NO_DATA)));
|
|
141
145
|
}
|
|
142
146
|
|
|
143
|
-
var
|
|
147
|
+
var _useMemo = (0, _react.useMemo)(function () {
|
|
148
|
+
return jobs[0];
|
|
149
|
+
}, jobs),
|
|
150
|
+
summary = _useMemo.summary,
|
|
151
|
+
insights = _useMemo.insights;
|
|
152
|
+
|
|
153
|
+
var duplicatePackagesCount = summary.webpack.duplicatePackagesCount;
|
|
144
154
|
var duplicatePackagesInsights = Boolean(duplicatePackagesCount.current || duplicatePackagesCount.baseline);
|
|
145
155
|
return /*#__PURE__*/_react["default"].createElement(Layout, {
|
|
146
156
|
jobs: jobs,
|
|
@@ -150,7 +160,8 @@ var AppComponent = function AppComponent(_ref2) {
|
|
|
150
160
|
}, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
|
|
151
161
|
size: "large",
|
|
152
162
|
keys: _constants.METRICS_WEBPACK_GENERAL,
|
|
153
|
-
data:
|
|
163
|
+
data: summary,
|
|
164
|
+
budgets: insights === null || insights === void 0 ? void 0 : (_insights$webpack = insights.webpack) === null || _insights$webpack === void 0 ? void 0 : _insights$webpack.budgets,
|
|
154
165
|
showSummaryItemDelta: jobs.length !== 1
|
|
155
166
|
})), /*#__PURE__*/_react["default"].createElement(_container.Container, {
|
|
156
167
|
className: _appModule["default"].tabsContainer
|
|
@@ -178,12 +189,15 @@ var AppComponent = function AppComponent(_ref2) {
|
|
|
178
189
|
exact: true,
|
|
179
190
|
path: _constants.URLS.ASSETS,
|
|
180
191
|
render: function render(_ref3) {
|
|
192
|
+
var _insights$webpack2;
|
|
193
|
+
|
|
181
194
|
var location = _ref3.location;
|
|
182
195
|
return /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
|
|
183
196
|
space: "medium"
|
|
184
197
|
}, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
|
|
185
198
|
keys: _constants.METRICS_WEBPACK_ASSETS,
|
|
186
|
-
data:
|
|
199
|
+
data: summary,
|
|
200
|
+
budgets: insights === null || insights === void 0 ? void 0 : (_insights$webpack2 = insights.webpack) === null || _insights$webpack2 === void 0 ? void 0 : _insights$webpack2.budgets,
|
|
187
201
|
showSummaryItemDelta: jobs.length !== 1
|
|
188
202
|
}), /*#__PURE__*/_react["default"].createElement(_box.Box, {
|
|
189
203
|
outline: true
|
|
@@ -198,11 +212,14 @@ var AppComponent = function AppComponent(_ref2) {
|
|
|
198
212
|
exact: true,
|
|
199
213
|
path: _constants.URLS.MODULES,
|
|
200
214
|
render: function render() {
|
|
215
|
+
var _insights$webpack3;
|
|
216
|
+
|
|
201
217
|
return /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
|
|
202
218
|
space: "medium"
|
|
203
219
|
}, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
|
|
204
220
|
keys: _constants.METRICS_WEBPACK_MODULES,
|
|
205
|
-
data:
|
|
221
|
+
data: summary,
|
|
222
|
+
budgets: insights === null || insights === void 0 ? void 0 : (_insights$webpack3 = insights.webpack) === null || _insights$webpack3 === void 0 ? void 0 : _insights$webpack3.budgets,
|
|
206
223
|
showSummaryItemDelta: jobs.length !== 1
|
|
207
224
|
}), /*#__PURE__*/_react["default"].createElement(_box.Box, {
|
|
208
225
|
outline: true
|
|
@@ -215,12 +232,15 @@ var AppComponent = function AppComponent(_ref2) {
|
|
|
215
232
|
exact: true,
|
|
216
233
|
path: _constants.URLS.PACKAGES,
|
|
217
234
|
render: function render(_ref4) {
|
|
235
|
+
var _insights$webpack4;
|
|
236
|
+
|
|
218
237
|
var location = _ref4.location;
|
|
219
238
|
return /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
|
|
220
239
|
space: "medium"
|
|
221
240
|
}, /*#__PURE__*/_react["default"].createElement(_summary.Summary, {
|
|
222
241
|
keys: _constants.METRICS_WEBPACK_PACKAGES,
|
|
223
|
-
data:
|
|
242
|
+
data: summary,
|
|
243
|
+
budgets: insights === null || insights === void 0 ? void 0 : (_insights$webpack4 = insights.webpack) === null || _insights$webpack4 === void 0 ? void 0 : _insights$webpack4.budgets,
|
|
224
244
|
showSummaryItemDelta: jobs.length !== 1
|
|
225
245
|
}), /*#__PURE__*/_react["default"].createElement(_box.Box, {
|
|
226
246
|
outline: true
|
|
@@ -235,11 +255,16 @@ var AppComponent = function AppComponent(_ref2) {
|
|
|
235
255
|
exact: true,
|
|
236
256
|
path: _constants.URLS.OVERVIEW,
|
|
237
257
|
render: function render() {
|
|
258
|
+
var _insights$webpack5;
|
|
259
|
+
|
|
238
260
|
return /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
|
|
239
261
|
space: "large"
|
|
240
262
|
}, duplicatePackagesInsights && /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_duplicatePackagesWarning.DuplicatePackagesWarning, {
|
|
241
263
|
duplicatePackagesCount: duplicatePackagesCount,
|
|
242
264
|
showDelta: jobs.length > 1
|
|
265
|
+
})), (insights === null || insights === void 0 ? void 0 : (_insights$webpack5 = insights.webpack) === null || _insights$webpack5 === void 0 ? void 0 : _insights$webpack5.budgets) && /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_budgetInsights.BudgetInsights, {
|
|
266
|
+
source: "webpack",
|
|
267
|
+
budgets: insights.webpack.budgets
|
|
243
268
|
})), /*#__PURE__*/_react["default"].createElement(_container.Container, null, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
|
|
244
269
|
space: "small"
|
|
245
270
|
}, /*#__PURE__*/_react["default"].createElement(_totalSizeTypeTitle.TotalSizeTypeTitle, null), /*#__PURE__*/_react["default"].createElement(_bundleAssetsTotalsChartBars.BundleAssetsTotalsChartBars, {
|
package/lib/app/app.stories.js
CHANGED
|
@@ -26,9 +26,9 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
|
|
|
26
26
|
|
|
27
27
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
28
28
|
|
|
29
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
29
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
30
30
|
|
|
31
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
31
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
32
32
|
|
|
33
33
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
34
34
|
|
|
@@ -48,7 +48,28 @@ var JOBS = (0, _utils.createJobs)([CURRENT_SOURCE, BASELINE_SOURCE], {
|
|
|
48
48
|
webpack: {
|
|
49
49
|
budgets: [{
|
|
50
50
|
metric: 'totalSizeByTypeALL',
|
|
51
|
-
value: 1024 * 1024
|
|
51
|
+
value: 2 * 1024 * 1024
|
|
52
|
+
}, {
|
|
53
|
+
metric: 'totalInitialSizeJS',
|
|
54
|
+
value: 512 * 1024
|
|
55
|
+
}, {
|
|
56
|
+
metric: 'totalInitialSizeCSS',
|
|
57
|
+
value: 50 * 1024
|
|
58
|
+
}, {
|
|
59
|
+
metric: 'chunkCount',
|
|
60
|
+
value: 50
|
|
61
|
+
}, {
|
|
62
|
+
metric: 'moduleCount',
|
|
63
|
+
value: 2000
|
|
64
|
+
}, {
|
|
65
|
+
metric: 'duplicatePackagesCount',
|
|
66
|
+
value: 5
|
|
67
|
+
}, {
|
|
68
|
+
metric: 'sizes.totalSizeByTypeJS',
|
|
69
|
+
value: 2 * 1024 * 1024
|
|
70
|
+
}, {
|
|
71
|
+
metric: 'sizes.totalSizeByTypeCSS',
|
|
72
|
+
value: 20 * 1024
|
|
52
73
|
}]
|
|
53
74
|
}
|
|
54
75
|
});
|
|
@@ -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-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>
|
package/lib/assets/icons.svg
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
<svg width="16" height="16">
|
|
2
|
+
<symbol fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-alert-circle" viewBox="0 0 24 24" id="alert-circle" xmlns="http://www.w3.org/2000/svg">
|
|
3
|
+
<circle cx="12" cy="12" r="10"/>
|
|
4
|
+
<path d="M12 8v4M12 16h.01"/>
|
|
5
|
+
</symbol>
|
|
2
6
|
<symbol viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-down" id="arrow" xmlns="http://www.w3.org/2000/svg">
|
|
3
7
|
<path d="M12 5v14M19 12l-7 7-7-7"/>
|
|
4
8
|
</symbol>
|
|
@@ -10,6 +14,10 @@
|
|
|
10
14
|
<circle cx="12" cy="12" r="10"/>
|
|
11
15
|
<path d="M15 9l-6 6M9 9l6 6"/>
|
|
12
16
|
</symbol>
|
|
17
|
+
<symbol fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check-circle" viewBox="0 0 24 24" id="check-circle" xmlns="http://www.w3.org/2000/svg">
|
|
18
|
+
<path d="M22 11.08V12a10 10 0 11-5.93-9.14"/>
|
|
19
|
+
<path d="M22 4L12 14.01l-3-3"/>
|
|
20
|
+
</symbol>
|
|
13
21
|
<symbol viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-clock" id="clock" xmlns="http://www.w3.org/2000/svg">
|
|
14
22
|
<circle cx="12" cy="12" r="10"/>
|
|
15
23
|
<path d="M12 6v6l4 2"/>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(obj) { "@babel/helpers - typeof";
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
4
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(obj) { "@babel/helpers - typeof";
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
4
|
|
|
5
5
|
var _react = _interopRequireDefault(require("react"));
|
|
6
6
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BudgetInfo = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
11
|
+
|
|
12
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
|
+
|
|
14
|
+
var _icon = require("../../ui/icon");
|
|
15
|
+
|
|
16
|
+
var _tooltip = require("../../ui/tooltip");
|
|
17
|
+
|
|
18
|
+
var _budgetInfoModule = _interopRequireDefault(require("./budget-info.module.css"));
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
21
|
+
|
|
22
|
+
var BudgetInfo = function BudgetInfo(_ref) {
|
|
23
|
+
var _ref$className = _ref.className,
|
|
24
|
+
className = _ref$className === void 0 ? '' : _ref$className,
|
|
25
|
+
budget = _ref.budget,
|
|
26
|
+
metric = _ref.metric;
|
|
27
|
+
var rootClassName = (0, _classnames["default"])(_budgetInfoModule["default"].root, budget.failed ? _budgetInfoModule["default"].over : _budgetInfoModule["default"].under, className);
|
|
28
|
+
return /*#__PURE__*/_react["default"].createElement(_tooltip.Tooltip, {
|
|
29
|
+
className: rootClassName,
|
|
30
|
+
title: /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("strong", null, metric.label), " is ".concat(budget.failed ? 'over' : 'under', " "), metric.formatter(budget.budgetValue), " budget")
|
|
31
|
+
}, /*#__PURE__*/_react["default"].createElement(_icon.Icon, {
|
|
32
|
+
className: _budgetInfoModule["default"].icon,
|
|
33
|
+
glyph: budget.failed ? _icon.Icon.ICONS.ALERT_CIRCLE : _icon.Icon.ICONS.CHECK_CIRCLE,
|
|
34
|
+
size: "medium"
|
|
35
|
+
}));
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
exports.BudgetInfo = BudgetInfo;
|
|
39
|
+
BudgetInfo.propTypes = {
|
|
40
|
+
budget: _propTypes["default"].shape({
|
|
41
|
+
currentValue: _propTypes["default"].number,
|
|
42
|
+
budgetValue: _propTypes["default"].number,
|
|
43
|
+
failed: _propTypes["default"].bool
|
|
44
|
+
}).isRequired,
|
|
45
|
+
metric: _propTypes["default"].shape({
|
|
46
|
+
label: _propTypes["default"].string,
|
|
47
|
+
formatter: _propTypes["default"].func
|
|
48
|
+
}).isRequired,
|
|
49
|
+
className: _propTypes["default"].string
|
|
50
|
+
};
|
|
51
|
+
BudgetInfo.defaultProps = {
|
|
52
|
+
className: ''
|
|
53
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
.root {
|
|
2
|
+
display: inline-block;
|
|
3
|
+
line-height: 1em;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/* Budget over */
|
|
7
|
+
.over .icon {
|
|
8
|
+
color: var(--color-danger-light);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.over .icon:hover,
|
|
12
|
+
.over .icon:focus,
|
|
13
|
+
.over .icon:active
|
|
14
|
+
{
|
|
15
|
+
color: var(--color-danger);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* Budget under */
|
|
19
|
+
.under .icon {
|
|
20
|
+
color: var(--color-success-light);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.under .icon:hover,
|
|
24
|
+
.under .icon:focus,
|
|
25
|
+
.under .icon:active
|
|
26
|
+
{
|
|
27
|
+
color: var(--color-success);
|
|
28
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
|
|
5
|
+
var _react2 = require("@storybook/react");
|
|
6
|
+
|
|
7
|
+
var _stories = require("../../stories");
|
|
8
|
+
|
|
9
|
+
var _ = require(".");
|
|
10
|
+
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
12
|
+
|
|
13
|
+
var stories = (0, _react2.storiesOf)('Components/BudgetInfo', module);
|
|
14
|
+
stories.addDecorator((0, _stories.getWrapperDecorator)());
|
|
15
|
+
stories.add('default', function () {
|
|
16
|
+
return /*#__PURE__*/_react["default"].createElement(_.BudgetInfo, {
|
|
17
|
+
budget: {
|
|
18
|
+
budget: 300,
|
|
19
|
+
value: 250,
|
|
20
|
+
overBudget: false
|
|
21
|
+
},
|
|
22
|
+
metric: {
|
|
23
|
+
formatter: function formatter(v) {
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
stories.add('over', function () {
|
|
30
|
+
return /*#__PURE__*/_react["default"].createElement(_.BudgetInfo, {
|
|
31
|
+
budget: {
|
|
32
|
+
budget: 300,
|
|
33
|
+
value: 350,
|
|
34
|
+
overBudget: true
|
|
35
|
+
},
|
|
36
|
+
metric: {
|
|
37
|
+
formatter: function formatter(v) {
|
|
38
|
+
return v;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _budgetInfo = require("./budget-info");
|
|
8
|
+
|
|
9
|
+
Object.keys(_budgetInfo).forEach(function (key) {
|
|
10
|
+
if (key === "default" || key === "__esModule") return;
|
|
11
|
+
if (key in exports && exports[key] === _budgetInfo[key]) return;
|
|
12
|
+
Object.defineProperty(exports, key, {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function get() {
|
|
15
|
+
return _budgetInfo[key];
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.BudgetInsights = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
|
+
|
|
14
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
15
|
+
|
|
16
|
+
var _utils = require("@bundle-stats/utils");
|
|
17
|
+
|
|
18
|
+
var _box = require("../../layout/box");
|
|
19
|
+
|
|
20
|
+
var _stack = require("../../layout/stack");
|
|
21
|
+
|
|
22
|
+
var _flexStack = require("../../layout/flex-stack");
|
|
23
|
+
|
|
24
|
+
var _alert = require("../../ui/alert");
|
|
25
|
+
|
|
26
|
+
var _icon = require("../../ui/icon");
|
|
27
|
+
|
|
28
|
+
var _componentLink = require("../component-link");
|
|
29
|
+
|
|
30
|
+
var _budgetInsightsModule = _interopRequireDefault(require("./budget-insights.module.css"));
|
|
31
|
+
|
|
32
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
33
|
+
|
|
34
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
35
|
+
|
|
36
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
37
|
+
|
|
38
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
39
|
+
|
|
40
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
41
|
+
|
|
42
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
43
|
+
|
|
44
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
45
|
+
|
|
46
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
47
|
+
|
|
48
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
49
|
+
|
|
50
|
+
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); }
|
|
51
|
+
|
|
52
|
+
var Budget = function Budget(props) {
|
|
53
|
+
var className = props.className,
|
|
54
|
+
metricKey = props.metricKey,
|
|
55
|
+
CustomLink = props.CustomLink,
|
|
56
|
+
failed = props.failed,
|
|
57
|
+
budgetValue = props.budgetValue;
|
|
58
|
+
var metric = (0, _utils.getGlobalMetricType)(metricKey);
|
|
59
|
+
|
|
60
|
+
var componentLinkOptions = _utils.METRIC_COMPONENT_LINKS.get(metricKey);
|
|
61
|
+
|
|
62
|
+
return /*#__PURE__*/_react["default"].createElement(CustomLink, _extends({
|
|
63
|
+
className: (0, _classnames["default"])(_budgetInsightsModule["default"].budget, className)
|
|
64
|
+
}, componentLinkOptions === null || componentLinkOptions === void 0 ? void 0 : componentLinkOptions.link), /*#__PURE__*/_react["default"].createElement("span", {
|
|
65
|
+
className: _budgetInsightsModule["default"].budgetLabel
|
|
66
|
+
}, metric.label), " is ".concat(failed ? 'over' : 'under', " "), /*#__PURE__*/_react["default"].createElement("span", {
|
|
67
|
+
className: _budgetInsightsModule["default"].budgetValue
|
|
68
|
+
}, metric.formatter(budgetValue)), " budget");
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
Budget.propTypes = {
|
|
72
|
+
className: _propTypes["default"].string,
|
|
73
|
+
metricKey: _propTypes["default"].string.isRequired,
|
|
74
|
+
failed: _propTypes["default"].bool.isRequired,
|
|
75
|
+
currentValue: _propTypes["default"].number.isRequired,
|
|
76
|
+
budgetValue: _propTypes["default"].number.isRequired,
|
|
77
|
+
CustomLink: _propTypes["default"].elementType.isRequired
|
|
78
|
+
};
|
|
79
|
+
Budget.defaultProps = {
|
|
80
|
+
className: ''
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
var BudgetsGroup = function BudgetsGroup(props) {
|
|
84
|
+
var className = props.className,
|
|
85
|
+
kind = props.kind,
|
|
86
|
+
source = props.source,
|
|
87
|
+
budgets = props.budgets,
|
|
88
|
+
CustomLink = props.CustomLink;
|
|
89
|
+
|
|
90
|
+
var _useState = (0, _react.useState)(false),
|
|
91
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
92
|
+
showBudgets = _useState2[0],
|
|
93
|
+
setShowBudgets = _useState2[1];
|
|
94
|
+
|
|
95
|
+
var isFailed = kind === 'danger';
|
|
96
|
+
return /*#__PURE__*/_react["default"].createElement(_alert.Alert, {
|
|
97
|
+
kind: kind,
|
|
98
|
+
padding: "none",
|
|
99
|
+
className: (0, _classnames["default"])(_budgetInsightsModule["default"].group, _budgetInsightsModule["default"][kind], className)
|
|
100
|
+
}, /*#__PURE__*/_react["default"].createElement(_box.Box, {
|
|
101
|
+
padding: ['xsmall', 'small'],
|
|
102
|
+
className: _budgetInsightsModule["default"].groupHeader,
|
|
103
|
+
as: "button",
|
|
104
|
+
type: "button",
|
|
105
|
+
onClick: function onClick() {
|
|
106
|
+
return setShowBudgets(!showBudgets);
|
|
107
|
+
}
|
|
108
|
+
}, /*#__PURE__*/_react["default"].createElement(_flexStack.FlexStack, {
|
|
109
|
+
space: "xxsmall",
|
|
110
|
+
className: _budgetInsightsModule["default"].groupTitle
|
|
111
|
+
}, /*#__PURE__*/_react["default"].createElement(_icon.Icon, {
|
|
112
|
+
className: _budgetInsightsModule["default"].groupIcon,
|
|
113
|
+
glyph: isFailed ? _icon.Icon.ICONS.ALERT_CIRCLE : _icon.Icon.ICONS.CHECK_CIRCLE
|
|
114
|
+
}), /*#__PURE__*/_react["default"].createElement("span", null, /*#__PURE__*/_react["default"].createElement("strong", null, budgets.length), " budget ".concat(budgets.length > 1 ? 'checks' : 'check', " ").concat(isFailed ? 'failed' : 'passed')), /*#__PURE__*/_react["default"].createElement("span", {
|
|
115
|
+
className: _budgetInsightsModule["default"].groupTitleToggle
|
|
116
|
+
}, showBudgets ? 'hide' : 'show', " all"))), showBudgets && /*#__PURE__*/_react["default"].createElement(_box.Box, {
|
|
117
|
+
padding: ['xsmall', 'small'],
|
|
118
|
+
className: _budgetInsightsModule["default"].groupContent
|
|
119
|
+
}, /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
|
|
120
|
+
space: "none"
|
|
121
|
+
}, budgets.map(function (_ref) {
|
|
122
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
123
|
+
key = _ref2[0],
|
|
124
|
+
budget = _ref2[1];
|
|
125
|
+
|
|
126
|
+
return /*#__PURE__*/_react["default"].createElement(Budget, _extends({
|
|
127
|
+
key: key,
|
|
128
|
+
source: source,
|
|
129
|
+
metricKey: "".concat(source, ".").concat(key),
|
|
130
|
+
CustomLink: CustomLink
|
|
131
|
+
}, budget));
|
|
132
|
+
}))));
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
BudgetsGroup.propTypes = {
|
|
136
|
+
className: _propTypes["default"].string,
|
|
137
|
+
kind: _propTypes["default"].oneOf(['success', 'danger']).isRequired,
|
|
138
|
+
source: _propTypes["default"].string.isRequired,
|
|
139
|
+
budgets: _propTypes["default"].object.isRequired,
|
|
140
|
+
// eslint-disable-line react/forbid-prop-types
|
|
141
|
+
CustomLink: _propTypes["default"].elementType.isRequired
|
|
142
|
+
};
|
|
143
|
+
BudgetsGroup.defaultProps = {
|
|
144
|
+
className: ''
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
var BudgetInsights = function BudgetInsights(props) {
|
|
148
|
+
var className = props.className,
|
|
149
|
+
source = props.source,
|
|
150
|
+
budgets = props.budgets,
|
|
151
|
+
CustomLink = props.CustomLink;
|
|
152
|
+
|
|
153
|
+
var _useMemo = (0, _react.useMemo)(function () {
|
|
154
|
+
var passed = [];
|
|
155
|
+
var failed = [];
|
|
156
|
+
Object.entries(budgets).forEach(function (_ref3) {
|
|
157
|
+
var _ref4 = _slicedToArray(_ref3, 2),
|
|
158
|
+
key = _ref4[0],
|
|
159
|
+
budget = _ref4[1];
|
|
160
|
+
|
|
161
|
+
if (budget.failed) {
|
|
162
|
+
failed.push([key, budget]);
|
|
163
|
+
} else {
|
|
164
|
+
passed.push([key, budget]);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
return [failed, passed];
|
|
168
|
+
}, [budgets]),
|
|
169
|
+
_useMemo2 = _slicedToArray(_useMemo, 2),
|
|
170
|
+
failedBudgets = _useMemo2[0],
|
|
171
|
+
passedBudgets = _useMemo2[1];
|
|
172
|
+
|
|
173
|
+
return /*#__PURE__*/_react["default"].createElement(_stack.Stack, {
|
|
174
|
+
className: className,
|
|
175
|
+
space: "xsmall"
|
|
176
|
+
}, failedBudgets.length > 0 && /*#__PURE__*/_react["default"].createElement(BudgetsGroup, {
|
|
177
|
+
kind: "danger",
|
|
178
|
+
source: source,
|
|
179
|
+
budgets: failedBudgets,
|
|
180
|
+
CustomLink: CustomLink
|
|
181
|
+
}), passedBudgets.length > 0 && /*#__PURE__*/_react["default"].createElement(BudgetsGroup, {
|
|
182
|
+
kind: "success",
|
|
183
|
+
source: source,
|
|
184
|
+
budgets: passedBudgets,
|
|
185
|
+
CustomLink: CustomLink
|
|
186
|
+
}));
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
exports.BudgetInsights = BudgetInsights;
|
|
190
|
+
BudgetInsights.propTypes = {
|
|
191
|
+
className: _propTypes["default"].string,
|
|
192
|
+
source: _propTypes["default"].string.isRequired,
|
|
193
|
+
budgets: _propTypes["default"].object.isRequired,
|
|
194
|
+
// eslint-disable-line react/forbid-prop-types
|
|
195
|
+
CustomLink: _propTypes["default"].elementType
|
|
196
|
+
};
|
|
197
|
+
BudgetInsights.defaultProps = {
|
|
198
|
+
className: '',
|
|
199
|
+
CustomLink: _componentLink.ComponentLink
|
|
200
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
.groupHeader {
|
|
2
|
+
width: 100%;
|
|
3
|
+
border: none;
|
|
4
|
+
background: none;
|
|
5
|
+
cursor: pointer;
|
|
6
|
+
color: inherit;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.groupTitle {
|
|
10
|
+
width: 100%;
|
|
11
|
+
align-items: center;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.groupTitle:hover {
|
|
15
|
+
color: var(--color-text-dark);
|
|
16
|
+
text-decoration: underline;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.groupTitleToggle {
|
|
20
|
+
margin: 0 0 0 auto !important;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.danger .groupIcon {
|
|
24
|
+
color: var(--color-danger);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.success .groupIcon {
|
|
28
|
+
color: var(--color-success);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.groupContent {
|
|
32
|
+
padding-top: 0px;
|
|
33
|
+
background: transparent;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.budget {
|
|
37
|
+
display: block;
|
|
38
|
+
color: var(--color-text);
|
|
39
|
+
text-decoration: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.budgetLabel,
|
|
43
|
+
.budgetValue {
|
|
44
|
+
color: var(--color-text-dark);
|
|
45
|
+
font-weight: 500;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.budget:hover,
|
|
49
|
+
.budget:focus,
|
|
50
|
+
.budget:active {
|
|
51
|
+
color: var(--color-text);
|
|
52
|
+
text-decoration: underline;
|
|
53
|
+
}
|