newspack-components 4.7.0 → 4.8.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.
- package/CHANGELOG.md +20 -0
- package/DEVELOPMENT.md +42 -21
- package/dist/cjs/_mixins.scss +13 -0
- package/dist/cjs/_variables.scss +12 -0
- package/dist/cjs/action-card/index.js +18 -10
- package/dist/cjs/action-card/index.test.js +91 -0
- package/dist/cjs/action-card/style.scss +2 -40
- package/dist/cjs/button/index.js +8 -3
- package/dist/cjs/button/index.test.js +61 -5
- package/dist/cjs/card/core-card.js +0 -2
- package/dist/cjs/card/style-core.scss +7 -5
- package/dist/cjs/card-feature/index.js +75 -61
- package/dist/cjs/card-feature/index.test.js +396 -54
- package/dist/cjs/card-feature/style.scss +20 -31
- package/dist/cjs/card-form/index.js +5 -5
- package/dist/cjs/card-sortable-list/index.js +5 -3
- package/dist/cjs/card-sortable-list/index.test.js +50 -0
- package/dist/cjs/collapsible-group/context.js +19 -0
- package/dist/cjs/collapsible-group/index.js +24 -0
- package/dist/cjs/collapsible-group/index.test.js +215 -0
- package/dist/cjs/collapsible-group/item.js +61 -0
- package/dist/cjs/collapsible-group/root.js +62 -0
- package/dist/cjs/collapsible-group/style.scss +47 -0
- package/dist/cjs/collapsible-group/types.js +5 -0
- package/dist/cjs/empty-state/actions.js +45 -0
- package/dist/cjs/empty-state/context.js +41 -0
- package/dist/cjs/empty-state/header.js +66 -0
- package/dist/cjs/empty-state/index.js +31 -0
- package/dist/cjs/empty-state/index.test.js +303 -0
- package/dist/cjs/empty-state/root.js +56 -0
- package/dist/cjs/empty-state/style.scss +51 -0
- package/dist/cjs/empty-state/types.js +5 -0
- package/dist/cjs/index.js +34 -20
- package/dist/cjs/info-button/index.js +59 -43
- package/dist/cjs/info-button/index.test.js +199 -0
- package/dist/cjs/info-button/style.scss +41 -9
- package/dist/cjs/modal/style.scss +12 -12
- package/dist/cjs/newspack-icon/style.scss +4 -4
- package/dist/cjs/notice/style.scss +3 -3
- package/dist/cjs/page/style.scss +16 -16
- package/dist/cjs/plugin-installer/index.js +5 -9
- package/dist/cjs/plugin-installer/style.scss +3 -14
- package/dist/cjs/section-header/index.js +31 -18
- package/dist/cjs/section-header/index.test.js +40 -0
- package/dist/cjs/section-header/style.scss +22 -6
- package/dist/cjs/settings/DateRangeSetting.js +309 -0
- package/dist/cjs/settings/SettingsSection.js +19 -5
- package/dist/cjs/settings/SettingsSection.test.js +49 -0
- package/dist/cjs/settings/index.js +3 -1
- package/dist/cjs/settings/style.scss +40 -7
- package/dist/cjs/stat-card/body.js +41 -0
- package/dist/cjs/stat-card/constants.js +11 -0
- package/dist/cjs/stat-card/context.js +54 -0
- package/dist/cjs/stat-card/delta.js +91 -0
- package/dist/cjs/stat-card/footer.js +72 -0
- package/dist/cjs/stat-card/index.js +47 -0
- package/dist/cjs/stat-card/index.test.js +938 -0
- package/dist/cjs/stat-card/label.js +66 -0
- package/dist/cjs/stat-card/root.js +69 -0
- package/dist/cjs/stat-card/secondary.js +38 -0
- package/dist/cjs/stat-card/style.scss +89 -0
- package/dist/cjs/stat-card/types.js +5 -0
- package/dist/cjs/stat-card/value.js +78 -0
- package/dist/cjs/status-indicator/index.js +66 -0
- package/dist/cjs/status-indicator/index.test.js +101 -0
- package/dist/cjs/status-indicator/statuses.js +39 -0
- package/dist/cjs/status-indicator/style.scss +9 -0
- package/dist/cjs/status-indicator/types.js +5 -0
- package/dist/cjs/style.scss +9 -9
- package/dist/cjs/tabbed-navigation/style.scss +6 -4
- package/dist/cjs/types.js +5 -0
- package/dist/cjs/web-preview/style.scss +11 -11
- package/dist/cjs/with-wizard/style.scss +10 -10
- package/dist/cjs/with-wizard-screen/style.scss +9 -9
- package/dist/cjs/wizard/index.js +33 -4
- package/dist/cjs/wizard/store/index.js +23 -1
- package/dist/esm/_mixins.scss +13 -0
- package/dist/esm/_variables.scss +12 -0
- package/dist/esm/action-card/index.js +18 -10
- package/dist/esm/action-card/index.test.js +89 -0
- package/dist/esm/action-card/style.scss +2 -40
- package/dist/esm/button/index.js +9 -4
- package/dist/esm/button/index.test.js +63 -5
- package/dist/esm/card/core-card.js +0 -2
- package/dist/esm/card/style-core.scss +7 -5
- package/dist/esm/card-feature/index.js +78 -62
- package/dist/esm/card-feature/index.test.js +397 -55
- package/dist/esm/card-feature/style.scss +20 -31
- package/dist/esm/card-form/index.js +5 -5
- package/dist/esm/card-sortable-list/index.js +6 -4
- package/dist/esm/card-sortable-list/index.test.js +46 -0
- package/dist/esm/collapsible-group/context.js +13 -0
- package/dist/esm/collapsible-group/index.js +17 -0
- package/dist/esm/collapsible-group/index.test.js +215 -0
- package/dist/esm/collapsible-group/item.js +53 -0
- package/dist/esm/collapsible-group/root.js +54 -0
- package/dist/esm/collapsible-group/style.scss +47 -0
- package/dist/esm/collapsible-group/types.js +1 -0
- package/dist/esm/empty-state/actions.js +37 -0
- package/dist/esm/empty-state/context.js +35 -0
- package/dist/esm/empty-state/header.js +58 -0
- package/dist/esm/empty-state/index.js +23 -0
- package/dist/esm/empty-state/index.test.js +299 -0
- package/dist/esm/empty-state/root.js +56 -0
- package/dist/esm/empty-state/style.scss +51 -0
- package/dist/esm/empty-state/types.js +1 -0
- package/dist/esm/index.js +4 -2
- package/dist/esm/info-button/index.js +54 -43
- package/dist/esm/info-button/index.test.js +195 -0
- package/dist/esm/info-button/style.scss +41 -9
- package/dist/esm/modal/style.scss +12 -12
- package/dist/esm/newspack-icon/style.scss +4 -4
- package/dist/esm/notice/style.scss +3 -3
- package/dist/esm/page/style.scss +16 -16
- package/dist/esm/plugin-installer/index.js +5 -9
- package/dist/esm/plugin-installer/style.scss +3 -14
- package/dist/esm/section-header/index.js +27 -14
- package/dist/esm/section-header/index.test.js +36 -0
- package/dist/esm/section-header/style.scss +22 -6
- package/dist/esm/settings/DateRangeSetting.js +304 -0
- package/dist/esm/settings/SettingsSection.js +16 -3
- package/dist/esm/settings/SettingsSection.test.js +45 -0
- package/dist/esm/settings/index.js +3 -1
- package/dist/esm/settings/style.scss +40 -7
- package/dist/esm/stat-card/body.js +36 -0
- package/dist/esm/stat-card/constants.js +5 -0
- package/dist/esm/stat-card/context.js +48 -0
- package/dist/esm/stat-card/delta.js +86 -0
- package/dist/esm/stat-card/footer.js +67 -0
- package/dist/esm/stat-card/index.js +33 -0
- package/dist/esm/stat-card/index.test.js +939 -0
- package/dist/esm/stat-card/label.js +61 -0
- package/dist/esm/stat-card/root.js +64 -0
- package/dist/esm/stat-card/secondary.js +33 -0
- package/dist/esm/stat-card/style.scss +89 -0
- package/dist/esm/stat-card/types.js +1 -0
- package/dist/esm/stat-card/value.js +73 -0
- package/dist/esm/status-indicator/index.js +52 -0
- package/dist/esm/status-indicator/index.test.js +96 -0
- package/dist/esm/status-indicator/statuses.js +33 -0
- package/dist/esm/status-indicator/style.scss +9 -0
- package/dist/esm/status-indicator/types.js +1 -0
- package/dist/esm/style.scss +9 -9
- package/dist/esm/tabbed-navigation/style.scss +6 -4
- package/dist/esm/types.js +1 -0
- package/dist/esm/web-preview/style.scss +11 -11
- package/dist/esm/with-wizard/style.scss +10 -10
- package/dist/esm/with-wizard-screen/style.scss +9 -9
- package/dist/esm/wizard/index.js +38 -7
- package/dist/esm/wizard/store/index.js +23 -1
- package/package.json +1 -1
- package/src/_mixins.scss +13 -0
- package/src/_variables.scss +12 -0
- package/src/action-card/action-card.d.ts +3 -2
- package/src/action-card/index.js +12 -12
- package/src/action-card/index.test.js +56 -0
- package/src/action-card/style.scss +2 -40
- package/src/button/index.test.js +52 -5
- package/src/button/index.tsx +9 -4
- package/src/card/core-card.js +0 -2
- package/src/card/style-core.scss +7 -5
- package/src/card-feature/README.md +68 -27
- package/src/card-feature/index.test.js +242 -27
- package/src/card-feature/index.tsx +77 -67
- package/src/card-feature/style.scss +20 -31
- package/src/card-form/README.md +10 -10
- package/src/card-form/index.tsx +4 -8
- package/src/card-sortable-list/README.md +4 -5
- package/src/card-sortable-list/index.test.js +29 -0
- package/src/card-sortable-list/index.tsx +7 -4
- package/src/collapsible-group/README.md +50 -0
- package/src/collapsible-group/context.ts +13 -0
- package/src/collapsible-group/index.test.js +168 -0
- package/src/collapsible-group/index.tsx +17 -0
- package/src/collapsible-group/item.tsx +42 -0
- package/src/collapsible-group/root.tsx +42 -0
- package/src/collapsible-group/style.scss +47 -0
- package/src/collapsible-group/types.ts +22 -0
- package/src/drawer/README.md +2 -2
- package/src/empty-state/README.md +165 -0
- package/src/empty-state/actions.tsx +37 -0
- package/src/empty-state/context.ts +40 -0
- package/src/empty-state/header.tsx +48 -0
- package/src/empty-state/index.test.js +247 -0
- package/src/empty-state/index.tsx +22 -0
- package/src/empty-state/root.tsx +39 -0
- package/src/empty-state/style.scss +51 -0
- package/src/empty-state/types.ts +33 -0
- package/src/index.js +4 -2
- package/src/info-button/README.md +115 -0
- package/src/info-button/index.test.js +163 -0
- package/src/info-button/index.tsx +64 -0
- package/src/info-button/style.scss +41 -9
- package/src/modal/style.scss +12 -12
- package/src/newspack-icon/style.scss +4 -4
- package/src/notice/style.scss +3 -3
- package/src/page/style.scss +16 -16
- package/src/plugin-installer/index.js +3 -9
- package/src/plugin-installer/style.scss +3 -14
- package/src/section-header/index.js +27 -14
- package/src/section-header/index.test.js +28 -0
- package/src/section-header/style.scss +22 -6
- package/src/settings/DateRangeSetting.js +266 -0
- package/src/settings/SettingsSection.js +24 -4
- package/src/settings/SettingsSection.test.js +45 -0
- package/src/settings/index.js +2 -0
- package/src/settings/style.scss +40 -7
- package/src/stat-card/README.md +434 -0
- package/src/stat-card/body.tsx +28 -0
- package/src/stat-card/constants.ts +5 -0
- package/src/stat-card/context.ts +53 -0
- package/src/stat-card/delta.tsx +88 -0
- package/src/stat-card/footer.tsx +68 -0
- package/src/stat-card/index.test.js +818 -0
- package/src/stat-card/index.tsx +48 -0
- package/src/stat-card/label.tsx +61 -0
- package/src/stat-card/root.tsx +40 -0
- package/src/stat-card/secondary.tsx +27 -0
- package/src/stat-card/style.scss +89 -0
- package/src/stat-card/types.ts +84 -0
- package/src/stat-card/value.tsx +72 -0
- package/src/status-indicator/README.md +123 -0
- package/src/status-indicator/index.test.js +70 -0
- package/src/status-indicator/index.tsx +39 -0
- package/src/status-indicator/statuses.ts +35 -0
- package/src/status-indicator/style.scss +9 -0
- package/src/status-indicator/types.ts +28 -0
- package/src/style.scss +9 -9
- package/src/tabbed-navigation/style.scss +6 -4
- package/src/types.ts +25 -0
- package/src/web-preview/style.scss +11 -11
- package/src/with-wizard/style.scss +10 -10
- package/src/with-wizard-screen/style.scss +9 -9
- package/src/wizard/index.js +49 -7
- package/src/wizard/store/index.js +26 -1
- package/dist/cjs/accordion/index.js +0 -72
- package/dist/cjs/accordion/index.test.js +0 -80
- package/dist/cjs/accordion/style.scss +0 -35
- package/dist/cjs/badge/index.js +0 -32
- package/dist/cjs/badge/style.scss +0 -36
- package/dist/esm/accordion/index.js +0 -63
- package/dist/esm/accordion/index.test.js +0 -79
- package/dist/esm/accordion/style.scss +0 -35
- package/dist/esm/badge/index.js +0 -24
- package/dist/esm/badge/style.scss +0 -36
- package/src/accordion/index.js +0 -46
- package/src/accordion/index.test.js +0 -62
- package/src/accordion/style.scss +0 -35
- package/src/badge/index.tsx +0 -26
- package/src/badge/style.scss +0 -36
- package/src/info-button/index.js +0 -38
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _react = require("@testing-library/react");
|
|
5
|
+
var _SettingsSection = _interopRequireDefault(require("./SettingsSection"));
|
|
6
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
7
|
+
/**
|
|
8
|
+
* External dependencies.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Internal dependencies.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
var DESCRIPTION = 'Number of articles read in the last 30 day period.';
|
|
16
|
+
describe('SettingsSection', function () {
|
|
17
|
+
it('reveals the description from the info trigger', function () {
|
|
18
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingsSection["default"], {
|
|
19
|
+
title: "Articles read",
|
|
20
|
+
description: DESCRIPTION,
|
|
21
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {})
|
|
22
|
+
}));
|
|
23
|
+
expect(_react.screen.queryByText(DESCRIPTION)).not.toBeInTheDocument();
|
|
24
|
+
_react.fireEvent.click(_react.screen.getByRole('button', {
|
|
25
|
+
name: 'More information about Articles read'
|
|
26
|
+
}));
|
|
27
|
+
expect(_react.screen.getByText(DESCRIPTION)).toBeInTheDocument();
|
|
28
|
+
});
|
|
29
|
+
it('falls back to a plain trigger name when the title is not a string', function () {
|
|
30
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingsSection["default"], {
|
|
31
|
+
title: /*#__PURE__*/(0, _jsxRuntime.jsx)("em", {
|
|
32
|
+
children: "Articles read"
|
|
33
|
+
}),
|
|
34
|
+
description: DESCRIPTION,
|
|
35
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {})
|
|
36
|
+
}));
|
|
37
|
+
expect(_react.screen.getByRole('button', {
|
|
38
|
+
name: 'More information'
|
|
39
|
+
})).toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
it('renders no info trigger without a description', function () {
|
|
42
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingsSection["default"], {
|
|
43
|
+
title: "Articles read",
|
|
44
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("input", {})
|
|
45
|
+
}));
|
|
46
|
+
expect(_react.screen.getByText('Articles read')).toBeInTheDocument();
|
|
47
|
+
expect(_react.screen.queryByRole('button')).not.toBeInTheDocument();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -8,9 +8,11 @@ exports["default"] = void 0;
|
|
|
8
8
|
var _SettingsCard = _interopRequireDefault(require("./SettingsCard"));
|
|
9
9
|
var _SettingsSection = _interopRequireDefault(require("./SettingsSection"));
|
|
10
10
|
var _MinMaxSetting = _interopRequireDefault(require("./MinMaxSetting"));
|
|
11
|
+
var _DateRangeSetting = _interopRequireDefault(require("./DateRangeSetting"));
|
|
11
12
|
require("./style.scss");
|
|
12
13
|
var _default = exports["default"] = {
|
|
13
14
|
SettingsCard: _SettingsCard["default"],
|
|
14
15
|
SettingsSection: _SettingsSection["default"],
|
|
15
|
-
MinMaxSetting: _MinMaxSetting["default"]
|
|
16
|
+
MinMaxSetting: _MinMaxSetting["default"],
|
|
17
|
+
DateRangeSetting: _DateRangeSetting["default"]
|
|
16
18
|
};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
@use "~@wordpress/base-styles/variables" as wp-vars;
|
|
2
|
+
|
|
1
3
|
.newspack-settings {
|
|
2
4
|
&__card {
|
|
3
5
|
&.newspack-card.newspack-action-card {
|
|
@@ -28,17 +30,18 @@
|
|
|
28
30
|
|
|
29
31
|
.newspack-settings__section {
|
|
30
32
|
&__title {
|
|
31
|
-
align-items: center;
|
|
32
|
-
display: flex;
|
|
33
|
-
margin: 0;
|
|
34
|
-
|
|
35
33
|
span {
|
|
36
|
-
line-height:
|
|
34
|
+
line-height: wp-vars.$font-line-height-small;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.newspack-info-button {
|
|
38
|
+
margin-block: calc((#{wp-vars.$font-line-height-small} - #{wp-vars.$button-size-small}) / 2);
|
|
37
39
|
}
|
|
38
40
|
}
|
|
39
41
|
&__content {
|
|
40
42
|
> div,
|
|
41
|
-
.newspack-settings__min-max
|
|
43
|
+
.newspack-settings__min-max,
|
|
44
|
+
.newspack-settings__date-range-bound {
|
|
42
45
|
margin: 0;
|
|
43
46
|
display: flex;
|
|
44
47
|
align-items: center;
|
|
@@ -49,7 +52,19 @@
|
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
54
|
.newspack-autocomplete-tokenfield,
|
|
52
|
-
.newspack-settings__min-max
|
|
55
|
+
.newspack-settings__min-max,
|
|
56
|
+
.newspack-settings__date-range-bound {
|
|
57
|
+
width: 100%;
|
|
58
|
+
}
|
|
59
|
+
.newspack-settings__date-range-bound {
|
|
60
|
+
// Overrides the `center` above, which has to be beaten at this
|
|
61
|
+
// nesting level. The select carries the visible From/To label and
|
|
62
|
+
// the value input's is hidden, so the two controls differ in
|
|
63
|
+
// overall height; centering floats the input up against the label,
|
|
64
|
+
// while bottom-aligning lines the two boxes up with each other.
|
|
65
|
+
align-items: flex-end;
|
|
66
|
+
}
|
|
67
|
+
.newspack-settings__date-range-preset {
|
|
53
68
|
width: 100%;
|
|
54
69
|
}
|
|
55
70
|
.newspack-autocomplete-tokenfield {
|
|
@@ -90,6 +105,24 @@
|
|
|
90
105
|
margin-top: 16px !important;
|
|
91
106
|
}
|
|
92
107
|
}
|
|
108
|
+
.newspack-settings__date-range-preset + .newspack-settings__date-range-bound {
|
|
109
|
+
margin-top: 16px !important;
|
|
110
|
+
}
|
|
111
|
+
.newspack-settings__date-range-bound {
|
|
112
|
+
gap: 8px;
|
|
113
|
+
|
|
114
|
+
.newspack-select-control {
|
|
115
|
+
flex: 0 0 auto;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.newspack-text-control {
|
|
119
|
+
flex: 1 1 auto;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
+ .newspack-settings__date-range-bound {
|
|
123
|
+
margin-top: 16px !important;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
93
126
|
}
|
|
94
127
|
|
|
95
128
|
&__no-border {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
|
+
var _element = require("@wordpress/element");
|
|
11
|
+
var _ui = require("@wordpress/ui");
|
|
12
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
+
var _context = require("./context");
|
|
14
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
+
var _excluded = ["className", "children"];
|
|
16
|
+
/**
|
|
17
|
+
* WordPress dependencies.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* External dependencies.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Internal dependencies.
|
|
24
|
+
*/
|
|
25
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
26
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
27
|
+
var Body = (0, _element.forwardRef)(function Body(_ref, ref) {
|
|
28
|
+
var className = _ref.className,
|
|
29
|
+
children = _ref.children,
|
|
30
|
+
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
31
|
+
(0, _context.useStatCardContext)();
|
|
32
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Stack, _objectSpread(_objectSpread({
|
|
33
|
+
ref: ref,
|
|
34
|
+
direction: "column",
|
|
35
|
+
gap: "xs",
|
|
36
|
+
className: (0, _classnames["default"])('newspack-stat-card__body', className)
|
|
37
|
+
}, props), {}, {
|
|
38
|
+
children: children
|
|
39
|
+
}));
|
|
40
|
+
});
|
|
41
|
+
var _default = exports["default"] = Body;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.STAT_CARD_NULL_GLYPH = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Stands in for a figure that does not exist, rather than a zero that does.
|
|
9
|
+
* Exported so tables can show the same glyph as the cards above them.
|
|
10
|
+
*/
|
|
11
|
+
var STAT_CARD_NULL_GLYPH = exports.STAT_CARD_NULL_GLYPH = '—';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useStatCardContext = exports.resolveStatCardLabels = exports.StatCardContext = void 0;
|
|
7
|
+
var _element = require("@wordpress/element");
|
|
8
|
+
var _i18n = require("@wordpress/i18n");
|
|
9
|
+
/**
|
|
10
|
+
* WordPress dependencies.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Internal dependencies.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
var ORPHAN_MESSAGE = 'StatCard subcomponents must be rendered inside StatCard.Root.';
|
|
18
|
+
|
|
19
|
+
// Resolved per call rather than once at module load, so a locale switched after
|
|
20
|
+
// the bundle evaluates still reaches the defaults. A blank override is a missing
|
|
21
|
+
// one: the glyph and the arrow must never be left announcing nothing.
|
|
22
|
+
var resolveStatCardLabels = exports.resolveStatCardLabels = function resolveStatCardLabels(labels) {
|
|
23
|
+
var _labels$notApplicable, _labels$up, _labels$down;
|
|
24
|
+
return {
|
|
25
|
+
notApplicable: (labels === null || labels === void 0 || (_labels$notApplicable = labels.notApplicable) === null || _labels$notApplicable === void 0 ? void 0 : _labels$notApplicable.trim()) || (0, _i18n._x)('Not applicable', 'a statistic with no number to show', 'newspack-plugin'),
|
|
26
|
+
up: (labels === null || labels === void 0 || (_labels$up = labels.up) === null || _labels$up === void 0 ? void 0 : _labels$up.trim()) || (0, _i18n._x)('Up', 'a statistic that has increased', 'newspack-plugin'),
|
|
27
|
+
down: (labels === null || labels === void 0 || (_labels$down = labels.down) === null || _labels$down === void 0 ? void 0 : _labels$down.trim()) || (0, _i18n._x)('Down', 'a statistic that has decreased', 'newspack-plugin')
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
var StatCardContext = exports.StatCardContext = (0, _element.createContext)(null);
|
|
31
|
+
var useStatCardContext = exports.useStatCardContext = function useStatCardContext() {
|
|
32
|
+
var context = (0, _element.useContext)(StatCardContext);
|
|
33
|
+
var isOrphan = !context;
|
|
34
|
+
(0, _element.useEffect)(function () {
|
|
35
|
+
if (!isOrphan) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.warn(ORPHAN_MESSAGE);
|
|
40
|
+
}, [isOrphan]);
|
|
41
|
+
if (!context) {
|
|
42
|
+
// A loose slot sizes its figure against the wrong container, which is
|
|
43
|
+
// cosmetic. Nothing above these cards catches an error, so throwing in
|
|
44
|
+
// production would blank an admin screen over it.
|
|
45
|
+
if ('production' !== process.env.NODE_ENV) {
|
|
46
|
+
throw new Error(ORPHAN_MESSAGE);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
heading: 3,
|
|
50
|
+
labels: resolveStatCardLabels()
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return context;
|
|
54
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
|
+
var _element = require("@wordpress/element");
|
|
11
|
+
var _ui = require("@wordpress/ui");
|
|
12
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
+
var _context = require("./context");
|
|
14
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
+
var _excluded = ["direction", "tone", "directionLabel", "label", "className", "children"];
|
|
16
|
+
/**
|
|
17
|
+
* WordPress dependencies.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* External dependencies.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Internal dependencies.
|
|
24
|
+
*/
|
|
25
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
26
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
27
|
+
var glyphs = {
|
|
28
|
+
up: '↑',
|
|
29
|
+
down: '↓'
|
|
30
|
+
};
|
|
31
|
+
var tones = ['positive', 'negative', 'neutral'];
|
|
32
|
+
var Delta = (0, _element.forwardRef)(function Delta(_ref, ref) {
|
|
33
|
+
var direction = _ref.direction,
|
|
34
|
+
_ref$tone = _ref.tone,
|
|
35
|
+
tone = _ref$tone === void 0 ? 'neutral' : _ref$tone,
|
|
36
|
+
directionLabel = _ref.directionLabel,
|
|
37
|
+
label = _ref.label,
|
|
38
|
+
className = _ref.className,
|
|
39
|
+
children = _ref.children,
|
|
40
|
+
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
41
|
+
var _useStatCardContext = (0, _context.useStatCardContext)(),
|
|
42
|
+
labels = _useStatCardContext.labels;
|
|
43
|
+
(0, _element.useEffect)(function () {
|
|
44
|
+
if ('production' === process.env.NODE_ENV) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!glyphs[direction]) {
|
|
48
|
+
// eslint-disable-next-line no-console
|
|
49
|
+
console.warn("StatCard.Delta: unknown direction \"".concat(direction, "\". Use one of ").concat(Object.keys(glyphs).join(', '), "."));
|
|
50
|
+
}
|
|
51
|
+
if (!tones.includes(tone)) {
|
|
52
|
+
// eslint-disable-next-line no-console
|
|
53
|
+
console.warn("StatCard.Delta: unknown tone \"".concat(tone, "\", falling back to neutral. Use one of ").concat(tones.join(', '), "."));
|
|
54
|
+
}
|
|
55
|
+
}, [direction, tone]);
|
|
56
|
+
var directions = {
|
|
57
|
+
up: labels.up,
|
|
58
|
+
down: labels.down
|
|
59
|
+
};
|
|
60
|
+
var glyph = glyphs[direction];
|
|
61
|
+
// Trimmed, and `||` not `??`: a blank label is a missing one. The fallback
|
|
62
|
+
// is keyed on the arrow's own direction, so an unrecognised one goes
|
|
63
|
+
// unspoken rather than announced as its opposite; words the caller wrote
|
|
64
|
+
// are honoured either way.
|
|
65
|
+
var named = label === null || label === void 0 ? void 0 : label.trim();
|
|
66
|
+
var spoken = (directionLabel === null || directionLabel === void 0 ? void 0 : directionLabel.trim()) || directions[direction];
|
|
67
|
+
var classes = (0, _classnames["default"])('newspack-stat-card__delta', 'neutral' !== tone && tones.includes(tone) && "newspack-stat-card__delta--".concat(tone), className);
|
|
68
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", _objectSpread(_objectSpread({
|
|
69
|
+
ref: ref,
|
|
70
|
+
className: classes
|
|
71
|
+
}, props), {}, {
|
|
72
|
+
children: named ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
73
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
|
|
74
|
+
"aria-hidden": "true",
|
|
75
|
+
children: [glyph, children]
|
|
76
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.VisuallyHidden, {
|
|
77
|
+
render: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {}),
|
|
78
|
+
children: named
|
|
79
|
+
})]
|
|
80
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
81
|
+
children: [glyph && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
82
|
+
"aria-hidden": "true",
|
|
83
|
+
children: glyph
|
|
84
|
+
}), spoken && /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.VisuallyHidden, {
|
|
85
|
+
render: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {}),
|
|
86
|
+
children: "".concat(spoken, " ")
|
|
87
|
+
}), children]
|
|
88
|
+
})
|
|
89
|
+
}));
|
|
90
|
+
});
|
|
91
|
+
var _default = exports["default"] = Delta;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
10
|
+
var _element = require("@wordpress/element");
|
|
11
|
+
var _ui = require("@wordpress/ui");
|
|
12
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
+
var _context = require("./context");
|
|
14
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
+
var _excluded = ["className", "children"];
|
|
16
|
+
/**
|
|
17
|
+
* WordPress dependencies.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* External dependencies.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Internal dependencies.
|
|
24
|
+
*/
|
|
25
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
26
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
27
|
+
// A run of text shares one wrapper, so `Applies to { count } products` is one
|
|
28
|
+
// sentence rather than three stacked paragraphs.
|
|
29
|
+
var asParts = function asParts(children) {
|
|
30
|
+
var parts = [];
|
|
31
|
+
var text = [];
|
|
32
|
+
var flushText = function flushText() {
|
|
33
|
+
if (text.some(function (part) {
|
|
34
|
+
return '' !== String(part).trim();
|
|
35
|
+
})) {
|
|
36
|
+
parts.push(/*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
37
|
+
className: "newspack-stat-card__description",
|
|
38
|
+
children: text
|
|
39
|
+
}, "text-".concat(parts.length)));
|
|
40
|
+
}
|
|
41
|
+
text = [];
|
|
42
|
+
};
|
|
43
|
+
_element.Children.toArray(children).forEach(function (child) {
|
|
44
|
+
// A Fragment is part of the run, not a block of its own:
|
|
45
|
+
// `createInterpolateElement` returns one, and the sentence it holds
|
|
46
|
+
// belongs in the description wrapper like any other text.
|
|
47
|
+
if ((0, _element.isValidElement)(child) && _element.Fragment !== child.type) {
|
|
48
|
+
flushText();
|
|
49
|
+
parts.push(child);
|
|
50
|
+
} else {
|
|
51
|
+
text.push(child);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
flushText();
|
|
55
|
+
return parts;
|
|
56
|
+
};
|
|
57
|
+
var Footer = (0, _element.forwardRef)(function Footer(_ref, ref) {
|
|
58
|
+
var className = _ref.className,
|
|
59
|
+
children = _ref.children,
|
|
60
|
+
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
61
|
+
(0, _context.useStatCardContext)();
|
|
62
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Stack, _objectSpread(_objectSpread({
|
|
63
|
+
ref: ref,
|
|
64
|
+
direction: "column",
|
|
65
|
+
align: "flex-start",
|
|
66
|
+
gap: "xs",
|
|
67
|
+
className: (0, _classnames["default"])('newspack-stat-card__footer', className)
|
|
68
|
+
}, props), {}, {
|
|
69
|
+
children: asParts(children)
|
|
70
|
+
}));
|
|
71
|
+
});
|
|
72
|
+
var _default = exports["default"] = Footer;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
Object.defineProperty(exports, "STAT_CARD_NULL_GLYPH", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function get() {
|
|
10
|
+
return _constants.STAT_CARD_NULL_GLYPH;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
exports["default"] = exports.StatCard = void 0;
|
|
14
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
15
|
+
var _body = _interopRequireDefault(require("./body"));
|
|
16
|
+
var _delta = _interopRequireDefault(require("./delta"));
|
|
17
|
+
var _footer = _interopRequireDefault(require("./footer"));
|
|
18
|
+
var _label = _interopRequireDefault(require("./label"));
|
|
19
|
+
var _root = _interopRequireDefault(require("./root"));
|
|
20
|
+
var _secondary = _interopRequireDefault(require("./secondary"));
|
|
21
|
+
var _value = _interopRequireDefault(require("./value"));
|
|
22
|
+
var _constants = require("./constants");
|
|
23
|
+
/**
|
|
24
|
+
* StatCard
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Internal dependencies.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
// Compound components here export one namespace object, as Drawer does.
|
|
32
|
+
var StatCard = exports.StatCard = {
|
|
33
|
+
Root: _root["default"],
|
|
34
|
+
Label: _label["default"],
|
|
35
|
+
Body: _body["default"],
|
|
36
|
+
Value: _value["default"],
|
|
37
|
+
Delta: _delta["default"],
|
|
38
|
+
Secondary: _secondary["default"],
|
|
39
|
+
Footer: _footer["default"]
|
|
40
|
+
};
|
|
41
|
+
Object.entries(StatCard).forEach(function (_ref) {
|
|
42
|
+
var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
|
|
43
|
+
name = _ref2[0],
|
|
44
|
+
part = _ref2[1];
|
|
45
|
+
part.displayName = "StatCard.".concat(name);
|
|
46
|
+
});
|
|
47
|
+
var _default = exports["default"] = StatCard;
|