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.
Files changed (251) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/DEVELOPMENT.md +42 -21
  3. package/dist/cjs/_mixins.scss +13 -0
  4. package/dist/cjs/_variables.scss +12 -0
  5. package/dist/cjs/action-card/index.js +18 -10
  6. package/dist/cjs/action-card/index.test.js +91 -0
  7. package/dist/cjs/action-card/style.scss +2 -40
  8. package/dist/cjs/button/index.js +8 -3
  9. package/dist/cjs/button/index.test.js +61 -5
  10. package/dist/cjs/card/core-card.js +0 -2
  11. package/dist/cjs/card/style-core.scss +7 -5
  12. package/dist/cjs/card-feature/index.js +75 -61
  13. package/dist/cjs/card-feature/index.test.js +396 -54
  14. package/dist/cjs/card-feature/style.scss +20 -31
  15. package/dist/cjs/card-form/index.js +5 -5
  16. package/dist/cjs/card-sortable-list/index.js +5 -3
  17. package/dist/cjs/card-sortable-list/index.test.js +50 -0
  18. package/dist/cjs/collapsible-group/context.js +19 -0
  19. package/dist/cjs/collapsible-group/index.js +24 -0
  20. package/dist/cjs/collapsible-group/index.test.js +215 -0
  21. package/dist/cjs/collapsible-group/item.js +61 -0
  22. package/dist/cjs/collapsible-group/root.js +62 -0
  23. package/dist/cjs/collapsible-group/style.scss +47 -0
  24. package/dist/cjs/collapsible-group/types.js +5 -0
  25. package/dist/cjs/empty-state/actions.js +45 -0
  26. package/dist/cjs/empty-state/context.js +41 -0
  27. package/dist/cjs/empty-state/header.js +66 -0
  28. package/dist/cjs/empty-state/index.js +31 -0
  29. package/dist/cjs/empty-state/index.test.js +303 -0
  30. package/dist/cjs/empty-state/root.js +56 -0
  31. package/dist/cjs/empty-state/style.scss +51 -0
  32. package/dist/cjs/empty-state/types.js +5 -0
  33. package/dist/cjs/index.js +34 -20
  34. package/dist/cjs/info-button/index.js +59 -43
  35. package/dist/cjs/info-button/index.test.js +199 -0
  36. package/dist/cjs/info-button/style.scss +41 -9
  37. package/dist/cjs/modal/style.scss +12 -12
  38. package/dist/cjs/newspack-icon/style.scss +4 -4
  39. package/dist/cjs/notice/style.scss +3 -3
  40. package/dist/cjs/page/style.scss +16 -16
  41. package/dist/cjs/plugin-installer/index.js +5 -9
  42. package/dist/cjs/plugin-installer/style.scss +3 -14
  43. package/dist/cjs/section-header/index.js +31 -18
  44. package/dist/cjs/section-header/index.test.js +40 -0
  45. package/dist/cjs/section-header/style.scss +22 -6
  46. package/dist/cjs/settings/DateRangeSetting.js +309 -0
  47. package/dist/cjs/settings/SettingsSection.js +19 -5
  48. package/dist/cjs/settings/SettingsSection.test.js +49 -0
  49. package/dist/cjs/settings/index.js +3 -1
  50. package/dist/cjs/settings/style.scss +40 -7
  51. package/dist/cjs/stat-card/body.js +41 -0
  52. package/dist/cjs/stat-card/constants.js +11 -0
  53. package/dist/cjs/stat-card/context.js +54 -0
  54. package/dist/cjs/stat-card/delta.js +91 -0
  55. package/dist/cjs/stat-card/footer.js +72 -0
  56. package/dist/cjs/stat-card/index.js +47 -0
  57. package/dist/cjs/stat-card/index.test.js +938 -0
  58. package/dist/cjs/stat-card/label.js +66 -0
  59. package/dist/cjs/stat-card/root.js +69 -0
  60. package/dist/cjs/stat-card/secondary.js +38 -0
  61. package/dist/cjs/stat-card/style.scss +89 -0
  62. package/dist/cjs/stat-card/types.js +5 -0
  63. package/dist/cjs/stat-card/value.js +78 -0
  64. package/dist/cjs/status-indicator/index.js +66 -0
  65. package/dist/cjs/status-indicator/index.test.js +101 -0
  66. package/dist/cjs/status-indicator/statuses.js +39 -0
  67. package/dist/cjs/status-indicator/style.scss +9 -0
  68. package/dist/cjs/status-indicator/types.js +5 -0
  69. package/dist/cjs/style.scss +9 -9
  70. package/dist/cjs/tabbed-navigation/style.scss +6 -4
  71. package/dist/cjs/types.js +5 -0
  72. package/dist/cjs/web-preview/style.scss +11 -11
  73. package/dist/cjs/with-wizard/style.scss +10 -10
  74. package/dist/cjs/with-wizard-screen/style.scss +9 -9
  75. package/dist/cjs/wizard/index.js +33 -4
  76. package/dist/cjs/wizard/store/index.js +23 -1
  77. package/dist/esm/_mixins.scss +13 -0
  78. package/dist/esm/_variables.scss +12 -0
  79. package/dist/esm/action-card/index.js +18 -10
  80. package/dist/esm/action-card/index.test.js +89 -0
  81. package/dist/esm/action-card/style.scss +2 -40
  82. package/dist/esm/button/index.js +9 -4
  83. package/dist/esm/button/index.test.js +63 -5
  84. package/dist/esm/card/core-card.js +0 -2
  85. package/dist/esm/card/style-core.scss +7 -5
  86. package/dist/esm/card-feature/index.js +78 -62
  87. package/dist/esm/card-feature/index.test.js +397 -55
  88. package/dist/esm/card-feature/style.scss +20 -31
  89. package/dist/esm/card-form/index.js +5 -5
  90. package/dist/esm/card-sortable-list/index.js +6 -4
  91. package/dist/esm/card-sortable-list/index.test.js +46 -0
  92. package/dist/esm/collapsible-group/context.js +13 -0
  93. package/dist/esm/collapsible-group/index.js +17 -0
  94. package/dist/esm/collapsible-group/index.test.js +215 -0
  95. package/dist/esm/collapsible-group/item.js +53 -0
  96. package/dist/esm/collapsible-group/root.js +54 -0
  97. package/dist/esm/collapsible-group/style.scss +47 -0
  98. package/dist/esm/collapsible-group/types.js +1 -0
  99. package/dist/esm/empty-state/actions.js +37 -0
  100. package/dist/esm/empty-state/context.js +35 -0
  101. package/dist/esm/empty-state/header.js +58 -0
  102. package/dist/esm/empty-state/index.js +23 -0
  103. package/dist/esm/empty-state/index.test.js +299 -0
  104. package/dist/esm/empty-state/root.js +56 -0
  105. package/dist/esm/empty-state/style.scss +51 -0
  106. package/dist/esm/empty-state/types.js +1 -0
  107. package/dist/esm/index.js +4 -2
  108. package/dist/esm/info-button/index.js +54 -43
  109. package/dist/esm/info-button/index.test.js +195 -0
  110. package/dist/esm/info-button/style.scss +41 -9
  111. package/dist/esm/modal/style.scss +12 -12
  112. package/dist/esm/newspack-icon/style.scss +4 -4
  113. package/dist/esm/notice/style.scss +3 -3
  114. package/dist/esm/page/style.scss +16 -16
  115. package/dist/esm/plugin-installer/index.js +5 -9
  116. package/dist/esm/plugin-installer/style.scss +3 -14
  117. package/dist/esm/section-header/index.js +27 -14
  118. package/dist/esm/section-header/index.test.js +36 -0
  119. package/dist/esm/section-header/style.scss +22 -6
  120. package/dist/esm/settings/DateRangeSetting.js +304 -0
  121. package/dist/esm/settings/SettingsSection.js +16 -3
  122. package/dist/esm/settings/SettingsSection.test.js +45 -0
  123. package/dist/esm/settings/index.js +3 -1
  124. package/dist/esm/settings/style.scss +40 -7
  125. package/dist/esm/stat-card/body.js +36 -0
  126. package/dist/esm/stat-card/constants.js +5 -0
  127. package/dist/esm/stat-card/context.js +48 -0
  128. package/dist/esm/stat-card/delta.js +86 -0
  129. package/dist/esm/stat-card/footer.js +67 -0
  130. package/dist/esm/stat-card/index.js +33 -0
  131. package/dist/esm/stat-card/index.test.js +939 -0
  132. package/dist/esm/stat-card/label.js +61 -0
  133. package/dist/esm/stat-card/root.js +64 -0
  134. package/dist/esm/stat-card/secondary.js +33 -0
  135. package/dist/esm/stat-card/style.scss +89 -0
  136. package/dist/esm/stat-card/types.js +1 -0
  137. package/dist/esm/stat-card/value.js +73 -0
  138. package/dist/esm/status-indicator/index.js +52 -0
  139. package/dist/esm/status-indicator/index.test.js +96 -0
  140. package/dist/esm/status-indicator/statuses.js +33 -0
  141. package/dist/esm/status-indicator/style.scss +9 -0
  142. package/dist/esm/status-indicator/types.js +1 -0
  143. package/dist/esm/style.scss +9 -9
  144. package/dist/esm/tabbed-navigation/style.scss +6 -4
  145. package/dist/esm/types.js +1 -0
  146. package/dist/esm/web-preview/style.scss +11 -11
  147. package/dist/esm/with-wizard/style.scss +10 -10
  148. package/dist/esm/with-wizard-screen/style.scss +9 -9
  149. package/dist/esm/wizard/index.js +38 -7
  150. package/dist/esm/wizard/store/index.js +23 -1
  151. package/package.json +1 -1
  152. package/src/_mixins.scss +13 -0
  153. package/src/_variables.scss +12 -0
  154. package/src/action-card/action-card.d.ts +3 -2
  155. package/src/action-card/index.js +12 -12
  156. package/src/action-card/index.test.js +56 -0
  157. package/src/action-card/style.scss +2 -40
  158. package/src/button/index.test.js +52 -5
  159. package/src/button/index.tsx +9 -4
  160. package/src/card/core-card.js +0 -2
  161. package/src/card/style-core.scss +7 -5
  162. package/src/card-feature/README.md +68 -27
  163. package/src/card-feature/index.test.js +242 -27
  164. package/src/card-feature/index.tsx +77 -67
  165. package/src/card-feature/style.scss +20 -31
  166. package/src/card-form/README.md +10 -10
  167. package/src/card-form/index.tsx +4 -8
  168. package/src/card-sortable-list/README.md +4 -5
  169. package/src/card-sortable-list/index.test.js +29 -0
  170. package/src/card-sortable-list/index.tsx +7 -4
  171. package/src/collapsible-group/README.md +50 -0
  172. package/src/collapsible-group/context.ts +13 -0
  173. package/src/collapsible-group/index.test.js +168 -0
  174. package/src/collapsible-group/index.tsx +17 -0
  175. package/src/collapsible-group/item.tsx +42 -0
  176. package/src/collapsible-group/root.tsx +42 -0
  177. package/src/collapsible-group/style.scss +47 -0
  178. package/src/collapsible-group/types.ts +22 -0
  179. package/src/drawer/README.md +2 -2
  180. package/src/empty-state/README.md +165 -0
  181. package/src/empty-state/actions.tsx +37 -0
  182. package/src/empty-state/context.ts +40 -0
  183. package/src/empty-state/header.tsx +48 -0
  184. package/src/empty-state/index.test.js +247 -0
  185. package/src/empty-state/index.tsx +22 -0
  186. package/src/empty-state/root.tsx +39 -0
  187. package/src/empty-state/style.scss +51 -0
  188. package/src/empty-state/types.ts +33 -0
  189. package/src/index.js +4 -2
  190. package/src/info-button/README.md +115 -0
  191. package/src/info-button/index.test.js +163 -0
  192. package/src/info-button/index.tsx +64 -0
  193. package/src/info-button/style.scss +41 -9
  194. package/src/modal/style.scss +12 -12
  195. package/src/newspack-icon/style.scss +4 -4
  196. package/src/notice/style.scss +3 -3
  197. package/src/page/style.scss +16 -16
  198. package/src/plugin-installer/index.js +3 -9
  199. package/src/plugin-installer/style.scss +3 -14
  200. package/src/section-header/index.js +27 -14
  201. package/src/section-header/index.test.js +28 -0
  202. package/src/section-header/style.scss +22 -6
  203. package/src/settings/DateRangeSetting.js +266 -0
  204. package/src/settings/SettingsSection.js +24 -4
  205. package/src/settings/SettingsSection.test.js +45 -0
  206. package/src/settings/index.js +2 -0
  207. package/src/settings/style.scss +40 -7
  208. package/src/stat-card/README.md +434 -0
  209. package/src/stat-card/body.tsx +28 -0
  210. package/src/stat-card/constants.ts +5 -0
  211. package/src/stat-card/context.ts +53 -0
  212. package/src/stat-card/delta.tsx +88 -0
  213. package/src/stat-card/footer.tsx +68 -0
  214. package/src/stat-card/index.test.js +818 -0
  215. package/src/stat-card/index.tsx +48 -0
  216. package/src/stat-card/label.tsx +61 -0
  217. package/src/stat-card/root.tsx +40 -0
  218. package/src/stat-card/secondary.tsx +27 -0
  219. package/src/stat-card/style.scss +89 -0
  220. package/src/stat-card/types.ts +84 -0
  221. package/src/stat-card/value.tsx +72 -0
  222. package/src/status-indicator/README.md +123 -0
  223. package/src/status-indicator/index.test.js +70 -0
  224. package/src/status-indicator/index.tsx +39 -0
  225. package/src/status-indicator/statuses.ts +35 -0
  226. package/src/status-indicator/style.scss +9 -0
  227. package/src/status-indicator/types.ts +28 -0
  228. package/src/style.scss +9 -9
  229. package/src/tabbed-navigation/style.scss +6 -4
  230. package/src/types.ts +25 -0
  231. package/src/web-preview/style.scss +11 -11
  232. package/src/with-wizard/style.scss +10 -10
  233. package/src/with-wizard-screen/style.scss +9 -9
  234. package/src/wizard/index.js +49 -7
  235. package/src/wizard/store/index.js +26 -1
  236. package/dist/cjs/accordion/index.js +0 -72
  237. package/dist/cjs/accordion/index.test.js +0 -80
  238. package/dist/cjs/accordion/style.scss +0 -35
  239. package/dist/cjs/badge/index.js +0 -32
  240. package/dist/cjs/badge/style.scss +0 -36
  241. package/dist/esm/accordion/index.js +0 -63
  242. package/dist/esm/accordion/index.test.js +0 -79
  243. package/dist/esm/accordion/style.scss +0 -35
  244. package/dist/esm/badge/index.js +0 -24
  245. package/dist/esm/badge/style.scss +0 -36
  246. package/src/accordion/index.js +0 -46
  247. package/src/accordion/index.test.js +0 -62
  248. package/src/accordion/style.scss +0 -35
  249. package/src/badge/index.tsx +0 -26
  250. package/src/badge/style.scss +0 -36
  251. 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: 24px;
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;