newspack-components 4.7.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
package/dist/cjs/index.js CHANGED
@@ -4,18 +4,6 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- Object.defineProperty(exports, "Accordion", {
8
- enumerable: true,
9
- get: function get() {
10
- return _accordion["default"];
11
- }
12
- });
13
- Object.defineProperty(exports, "AccordionPanel", {
14
- enumerable: true,
15
- get: function get() {
16
- return _accordion.AccordionPanel;
17
- }
18
- });
19
7
  Object.defineProperty(exports, "ActionCard", {
20
8
  enumerable: true,
21
9
  get: function get() {
@@ -40,12 +28,6 @@ Object.defineProperty(exports, "AutocompleteWithSuggestions", {
40
28
  return _autocompleteWithSuggestions["default"];
41
29
  }
42
30
  });
43
- Object.defineProperty(exports, "Badge", {
44
- enumerable: true,
45
- get: function get() {
46
- return _badge["default"];
47
- }
48
- });
49
31
  Object.defineProperty(exports, "BoxContrast", {
50
32
  enumerable: true,
51
33
  get: function get() {
@@ -100,6 +82,12 @@ Object.defineProperty(exports, "CategoryAutocomplete", {
100
82
  return _categoryAutocomplete["default"];
101
83
  }
102
84
  });
85
+ Object.defineProperty(exports, "CollapsibleGroup", {
86
+ enumerable: true,
87
+ get: function get() {
88
+ return _collapsibleGroup["default"];
89
+ }
90
+ });
103
91
  Object.defineProperty(exports, "ColorPicker", {
104
92
  enumerable: true,
105
93
  get: function get() {
@@ -136,6 +124,12 @@ Object.defineProperty(exports, "Drawer", {
136
124
  return _drawer["default"];
137
125
  }
138
126
  });
127
+ Object.defineProperty(exports, "EmptyState", {
128
+ enumerable: true,
129
+ get: function get() {
130
+ return _emptyState["default"];
131
+ }
132
+ });
139
133
  Object.defineProperty(exports, "Footer", {
140
134
  enumerable: true,
141
135
  get: function get() {
@@ -262,6 +256,12 @@ Object.defineProperty(exports, "Router", {
262
256
  return _router["default"];
263
257
  }
264
258
  });
259
+ Object.defineProperty(exports, "STAT_CARD_NULL_GLYPH", {
260
+ enumerable: true,
261
+ get: function get() {
262
+ return _statCard.STAT_CARD_NULL_GLYPH;
263
+ }
264
+ });
265
265
  Object.defineProperty(exports, "SectionHeader", {
266
266
  enumerable: true,
267
267
  get: function get() {
@@ -280,6 +280,18 @@ Object.defineProperty(exports, "Settings", {
280
280
  return _settings["default"];
281
281
  }
282
282
  });
283
+ Object.defineProperty(exports, "StatCard", {
284
+ enumerable: true,
285
+ get: function get() {
286
+ return _statCard["default"];
287
+ }
288
+ });
289
+ Object.defineProperty(exports, "StatusIndicator", {
290
+ enumerable: true,
291
+ get: function get() {
292
+ return _statusIndicator["default"];
293
+ }
294
+ });
283
295
  Object.defineProperty(exports, "StepsList", {
284
296
  enumerable: true,
285
297
  get: function get() {
@@ -383,12 +395,10 @@ Object.defineProperty(exports, "withWizardScreen", {
383
395
  return _withWizardScreen["default"];
384
396
  }
385
397
  });
386
- var _accordion = _interopRequireWildcard(require("./accordion"));
387
398
  var _actionCard = _interopRequireDefault(require("./action-card"));
388
399
  var _autocompleteTokenfield = _interopRequireDefault(require("./autocomplete-tokenfield"));
389
400
  var _autocompleteWithSuggestions = _interopRequireDefault(require("./autocomplete-with-suggestions"));
390
401
  var _autocompleteWithLatestPosts = _interopRequireDefault(require("./autocomplete-with-latest-posts"));
391
- var _badge = _interopRequireDefault(require("./badge"));
392
402
  var _breadcrumbs = _interopRequireDefault(require("./breadcrumbs"));
393
403
  var _button = _interopRequireDefault(require("./button"));
394
404
  var _boxContrast = _interopRequireDefault(require("./box-contrast"));
@@ -399,12 +409,14 @@ var _cardSettingsGroup = _interopRequireDefault(require("./card-settings-group")
399
409
  var _cardSortableList = _interopRequireDefault(require("./card-sortable-list"));
400
410
  var _integrationIcon = _interopRequireDefault(require("./integration-icon"));
401
411
  var _categoryAutocomplete = _interopRequireDefault(require("./category-autocomplete"));
412
+ var _collapsibleGroup = _interopRequireDefault(require("./collapsible-group"));
402
413
  var _colorPicker = _interopRequireDefault(require("./color-picker"));
403
414
  var _confirmDialog = _interopRequireDefault(require("./confirm-dialog"));
404
415
  var _customSelectControl = _interopRequireDefault(require("./custom-select-control"));
405
416
  var _dataviews = _interopRequireDefault(require("./dataviews"));
406
417
  var _divider = _interopRequireDefault(require("./divider"));
407
418
  var _drawer = _interopRequireDefault(require("./drawer"));
419
+ var _emptyState = _interopRequireDefault(require("./empty-state"));
408
420
  var _formTokenField = _interopRequireDefault(require("./form-token-field"));
409
421
  var _footer = _interopRequireDefault(require("./footer"));
410
422
  var _handoff = _interopRequireDefault(require("./handoff"));
@@ -427,6 +439,8 @@ var _radioControl = _interopRequireDefault(require("./radio-control"));
427
439
  var _sectionHeader = _interopRequireDefault(require("./section-header"));
428
440
  var _selectControl = _interopRequireDefault(require("./select-control"));
429
441
  var _settings = _interopRequireDefault(require("./settings"));
442
+ var _statCard = _interopRequireWildcard(require("./stat-card"));
443
+ var _statusIndicator = _interopRequireDefault(require("./status-indicator"));
430
444
  var _stepsList = _interopRequireDefault(require("./steps-list"));
431
445
  var _stepsListItem = _interopRequireDefault(require("./steps-list-item"));
432
446
  var _styleCard = _interopRequireDefault(require("./style-card"));
@@ -7,55 +7,71 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
13
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
14
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
10
+ var _classnames = _interopRequireDefault(require("classnames"));
15
11
  var _element = require("@wordpress/element");
16
- var _components = require("@wordpress/components");
12
+ var _i18n = require("@wordpress/i18n");
17
13
  var _icons = require("@wordpress/icons");
18
- var _classnames = _interopRequireDefault(require("classnames"));
14
+ var _ui = require("@wordpress/ui");
19
15
  require("./style.scss");
20
16
  var _jsxRuntime = require("react/jsx-runtime");
21
- var _excluded = ["className"];
22
- 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; }
23
- 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; }
24
- function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
25
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /**
26
- * Info Button
27
- */ /**
28
- * WordPress dependencies.
29
- */ /**
17
+ var _excluded = ["description", "className", "triggerLabel", "aria-label"];
18
+ /**
30
19
  * External dependencies.
31
- */ /**
20
+ */
21
+ /**
22
+ * WordPress dependencies.
23
+ */
24
+ /**
32
25
  * Internal dependencies.
33
26
  */
34
- var InfoButton = /*#__PURE__*/function (_Component) {
35
- function InfoButton() {
36
- (0, _classCallCheck2["default"])(this, InfoButton);
37
- return _callSuper(this, InfoButton, arguments);
27
+ 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; }
28
+ 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; }
29
+ /**
30
+ * Uses `Popover` rather than `Tooltip`: a tooltip never opens from a touch
31
+ * pointer, and its popup is not exposed to assistive technology.
32
+ */
33
+ var InfoButton = (0, _element.forwardRef)(function InfoButton(_ref, ref) {
34
+ var description = _ref.description,
35
+ className = _ref.className,
36
+ triggerLabel = _ref.triggerLabel,
37
+ ariaLabel = _ref['aria-label'],
38
+ rest = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
39
+ if (!description) {
40
+ return null;
38
41
  }
39
- (0, _inherits2["default"])(InfoButton, _Component);
40
- return (0, _createClass2["default"])(InfoButton, [{
41
- key: "render",
42
- value:
43
- /**
44
- * Render.
45
- */
46
- function render() {
47
- var _this$props = this.props,
48
- className = _this$props.className,
49
- otherProps = (0, _objectWithoutProperties2["default"])(_this$props, _excluded);
50
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Tooltip, _objectSpread(_objectSpread({}, otherProps), {}, {
51
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
52
- className: (0, _classnames["default"])('newspack-info-button', className),
53
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.Icon, {
54
- icon: _icons.info
55
- })
56
- })
57
- }));
58
- }
59
- }]);
60
- }(_element.Component);
42
+ var name = triggerLabel || ariaLabel || (0, _i18n.__)('More information', 'newspack-plugin');
43
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_ui.Popover.Root, {
44
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Popover.Trigger, _objectSpread(_objectSpread({
45
+ ref: ref,
46
+ openOnHover: true,
47
+ delay: 200,
48
+ closeDelay: 200,
49
+ "aria-label": name,
50
+ className: (0, _classnames["default"])('newspack-info-button', className)
51
+ }, rest), {}, {
52
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_icons.Icon, {
53
+ icon: _icons.info,
54
+ size: 20
55
+ })
56
+ })), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_ui.Popover.Popup, {
57
+ variant: "unstyled",
58
+ className: "newspack-info-button__popup",
59
+ portal: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Popover.Portal, {
60
+ className: "newspack-info-button__portal",
61
+ container: (0, _ui.getWpCompatOverlaySlot)()
62
+ }),
63
+ positioner: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Popover.Positioner, {
64
+ className: "newspack-info-button__positioner",
65
+ side: "top",
66
+ sideOffset: 4
67
+ }),
68
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.VisuallyHidden, {
69
+ render: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Popover.Title, {}),
70
+ children: name
71
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Popover.Description, {
72
+ children: description
73
+ })]
74
+ })]
75
+ });
76
+ });
61
77
  var _default = exports["default"] = InfoButton;
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _react = require("@testing-library/react");
5
+ var _element = require("@wordpress/element");
6
+ var _ = _interopRequireDefault(require("./"));
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ /**
9
+ * External dependencies.
10
+ */
11
+
12
+ /**
13
+ * WordPress dependencies.
14
+ */
15
+
16
+ /**
17
+ * Internal dependencies.
18
+ */
19
+
20
+ var DESCRIPTION = 'Number of articles read in the last 30 day period.';
21
+ var getTrigger = function getTrigger() {
22
+ var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'More information';
23
+ return _react.screen.getByRole('button', {
24
+ name: name
25
+ });
26
+ };
27
+ describe('InfoButton', function () {
28
+ afterEach(function () {
29
+ jest.useRealTimers();
30
+ });
31
+ it('names the trigger briefly rather than with the whole description', function () {
32
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
33
+ description: DESCRIPTION
34
+ }));
35
+ expect(getTrigger()).toBeInTheDocument();
36
+ expect(_react.screen.queryByRole('button', {
37
+ name: DESCRIPTION
38
+ })).not.toBeInTheDocument();
39
+ });
40
+ it('renders nothing at all without a description', function () {
41
+ var _render = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {})),
42
+ container = _render.container;
43
+ expect(_react.screen.queryByRole('button')).not.toBeInTheDocument();
44
+ expect(container.firstChild).toBeNull();
45
+ });
46
+ it('treats an empty description as nothing to explain', function () {
47
+ var _render2 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
48
+ description: ""
49
+ })),
50
+ container = _render2.container;
51
+ expect(_react.screen.queryByRole('button')).not.toBeInTheDocument();
52
+ expect(container.firstChild).toBeNull();
53
+ });
54
+ it('lets a consumer name the trigger for its own context', function () {
55
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
56
+ description: DESCRIPTION,
57
+ triggerLabel: "More information about Articles read"
58
+ }));
59
+ expect(getTrigger('More information about Articles read')).toBeInTheDocument();
60
+ });
61
+ it('leaves the trigger in the tab order', function () {
62
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
63
+ description: DESCRIPTION
64
+ }));
65
+ expect(getTrigger().tabIndex).toBeGreaterThanOrEqual(0);
66
+ });
67
+ it('keeps the description hidden until the trigger is activated', function () {
68
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
69
+ description: DESCRIPTION
70
+ }));
71
+ expect(_react.screen.queryByText(DESCRIPTION)).not.toBeInTheDocument();
72
+ expect(getTrigger()).toHaveAttribute('aria-expanded', 'false');
73
+ });
74
+ it('reveals the description on click, so touch users can reach it', function () {
75
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
76
+ description: DESCRIPTION
77
+ }));
78
+ _react.fireEvent.click(getTrigger());
79
+ expect(_react.screen.getByText(DESCRIPTION)).toBeInTheDocument();
80
+ expect(getTrigger()).toHaveAttribute('aria-expanded', 'true');
81
+ });
82
+ it('reveals the description on hover, once the pointer has rested', function () {
83
+ jest.useFakeTimers();
84
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
85
+ description: DESCRIPTION
86
+ }));
87
+ var trigger = getTrigger();
88
+ _react.fireEvent.mouseEnter(trigger);
89
+ _react.fireEvent.mouseMove(trigger);
90
+ expect(_react.screen.queryByText(DESCRIPTION)).not.toBeInTheDocument();
91
+ (0, _react.act)(function () {
92
+ return jest.advanceTimersByTime(200);
93
+ });
94
+ expect(_react.screen.getByText(DESCRIPTION)).toBeInTheDocument();
95
+ });
96
+ it('holds the description open long enough to overshoot the trigger', function () {
97
+ jest.useFakeTimers();
98
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
99
+ description: DESCRIPTION
100
+ }));
101
+ var trigger = getTrigger();
102
+ _react.fireEvent.mouseEnter(trigger);
103
+ _react.fireEvent.mouseMove(trigger);
104
+ (0, _react.act)(function () {
105
+ return jest.advanceTimersByTime(200);
106
+ });
107
+ expect(_react.screen.getByText(DESCRIPTION)).toBeInTheDocument();
108
+ _react.fireEvent.mouseLeave(trigger);
109
+ expect(_react.screen.getByText(DESCRIPTION)).toBeInTheDocument();
110
+ (0, _react.act)(function () {
111
+ return jest.advanceTimersByTime(200);
112
+ });
113
+ expect(_react.screen.queryByText(DESCRIPTION)).not.toBeInTheDocument();
114
+ });
115
+ it('uses a native button, so Enter and Space activate it', function () {
116
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
117
+ description: DESCRIPTION
118
+ }));
119
+ var trigger = getTrigger();
120
+ expect(trigger.tagName).toBe('BUTTON');
121
+ expect(trigger).toHaveAttribute('type', 'button');
122
+ });
123
+ it('closes on Escape and hands focus back to the trigger', function () {
124
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
125
+ description: DESCRIPTION
126
+ }));
127
+ var trigger = getTrigger();
128
+ trigger.focus();
129
+ _react.fireEvent.click(trigger);
130
+ expect(_react.screen.getByText(DESCRIPTION)).toBeInTheDocument();
131
+ _react.fireEvent.keyDown(document.activeElement, {
132
+ key: 'Escape'
133
+ });
134
+ expect(_react.screen.queryByText(DESCRIPTION)).not.toBeInTheDocument();
135
+ expect(trigger).toHaveFocus();
136
+ });
137
+ it('gives the popup an accessible name of its own', function () {
138
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
139
+ description: DESCRIPTION
140
+ }));
141
+ _react.fireEvent.click(getTrigger());
142
+ expect(_react.screen.getByRole('dialog', {
143
+ name: 'More information'
144
+ })).toBeInTheDocument();
145
+ });
146
+ it('describes the popup with the description rather than naming it', function () {
147
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
148
+ description: DESCRIPTION
149
+ }));
150
+ _react.fireEvent.click(getTrigger());
151
+ var paragraph = _react.screen.getByText(DESCRIPTION);
152
+ expect(paragraph.id).toBeTruthy();
153
+ expect(document.querySelector("[aria-describedby=\"".concat(paragraph.id, "\"]"))).toBeInTheDocument();
154
+ });
155
+ it('renders through its own portal and positioner', function () {
156
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
157
+ description: DESCRIPTION
158
+ }));
159
+ _react.fireEvent.click(getTrigger());
160
+ var paragraph = _react.screen.getByText(DESCRIPTION);
161
+ expect(paragraph.closest('.newspack-info-button__positioner')).toBeInTheDocument();
162
+ expect(paragraph.closest('.newspack-info-button__portal')).toBeInTheDocument();
163
+ });
164
+ it('forwards unknown props to the trigger', function () {
165
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
166
+ description: DESCRIPTION,
167
+ id: "articles-read-info",
168
+ "data-testid": "info"
169
+ }));
170
+ var trigger = getTrigger();
171
+ expect(trigger).toHaveAttribute('id', 'articles-read-info');
172
+ expect(trigger).toHaveAttribute('data-testid', 'info');
173
+ });
174
+ it('keeps its own class alongside a consumer className', function () {
175
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
176
+ description: DESCRIPTION,
177
+ className: "custom-class"
178
+ }));
179
+ expect(getTrigger()).toHaveClass('newspack-info-button', 'custom-class');
180
+ });
181
+ it('hands a consumer ref the trigger itself', function () {
182
+ var ref = (0, _element.createRef)();
183
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
184
+ description: DESCRIPTION,
185
+ ref: ref
186
+ }));
187
+ expect(ref.current).toBe(getTrigger());
188
+ });
189
+ it('names the trigger and the popup alike when given an aria-label', function () {
190
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {
191
+ description: DESCRIPTION,
192
+ "aria-label": "More information about Articles read"
193
+ }));
194
+ _react.fireEvent.click(getTrigger('More information about Articles read'));
195
+ expect(_react.screen.getByRole('dialog', {
196
+ name: 'More information about Articles read'
197
+ })).toBeInTheDocument();
198
+ });
199
+ });
@@ -1,18 +1,50 @@
1
- /**
2
- * Info Button
3
- */
1
+ @use "~@wordpress/base-styles/colors" as wp-colors;
2
+ @use "~@wordpress/base-styles/variables" as wp-vars;
3
+ @use "~@wordpress/base-styles/z-index" as wp-z;
4
4
 
5
5
  .newspack-info-button {
6
- display: inline-block;
7
- flex: 0 0 24px;
8
- height: 24px;
9
- margin: 0;
10
- margin-left: 4px;
11
- width: 24px;
6
+ align-items: center;
7
+ background: none;
8
+ border: none;
9
+ border-radius: var(--wpds-border-radius-sm, #{wp-vars.$radius-small});
10
+ color: inherit;
11
+ cursor: var(--wpds-cursor-control, pointer);
12
+ display: inline-flex;
13
+ flex: 0 0 auto;
14
+ height: wp-vars.$button-size-small;
15
+ justify-content: center;
16
+ padding: 0;
12
17
  vertical-align: middle;
18
+ width: wp-vars.$button-size-small;
13
19
 
14
20
  svg {
15
21
  display: block;
16
22
  fill: currentcolor;
17
23
  }
24
+
25
+ &:focus-visible {
26
+ outline: var(--wp-admin-border-width-focus, #{wp-vars.$border-width-focus-fallback}) solid var(--wp-admin-theme-color, #{wp-colors.$gray-900});
27
+ outline-offset: 0;
28
+ }
29
+ }
30
+
31
+ .newspack-info-button__portal {
32
+ --wp-ui-popover-z-index: #{wp-z.z-index(".components-popover")};
33
+ }
34
+
35
+ .newspack-info-button__positioner {
36
+ max-width: var(--wpds-dimension-surface-width-sm, calc(#{wp-vars.$grid-unit} * 40));
37
+ }
38
+
39
+ .newspack-info-button__popup {
40
+ background-color: wp-colors.$gray-900;
41
+ border-radius: var(--wpds-border-radius-md, #{wp-vars.$radius-medium});
42
+ box-shadow: var(--wpds-elevation-sm, #{wp-vars.$elevation-small});
43
+ color: wp-colors.$white;
44
+ outline: 0;
45
+ padding: var(--wpds-dimension-padding-xs, #{wp-vars.$grid-unit-05}) var(--wpds-dimension-padding-sm, #{wp-vars.$grid-unit-10});
46
+
47
+ @media (forced-colors: active) {
48
+ border: var(--wpds-border-width-xs, #{wp-vars.$border-width}) solid CanvasText;
49
+ }
18
50
  }
@@ -2,18 +2,18 @@
2
2
  * Modal
3
3
  */
4
4
 
5
- @use "../../../colors/colors.module" as colors;
5
+ @use "../../../colors/colors.module" as np-colors;
6
6
 
7
7
  .newspack-modal {
8
8
  // Color
9
- --wp-admin-theme-color: #{colors.$primary-600};
10
- --wp-admin-theme-color--rgb: #{colors.$primary-600--rgb};
11
- --wp-admin-theme-color-darker-10: #{colors.$primary-700};
12
- --wp-admin-theme-color-darker-10--rgb: #{colors.$primary-700--rgb};
13
- --wp-admin-theme-color-darker-20: #{colors.$primary-800};
14
- --wp-admin-theme-color-darker-20--rgb: #{colors.$primary-800--rgb};
15
- --wp-admin-theme-color-lighter-10: #{colors.$primary-000};
16
- --wp-admin-theme-color-lighter-10--rgb: #{colors.$primary-000--rgb};
9
+ --wp-admin-theme-color: #{np-colors.$primary-600};
10
+ --wp-admin-theme-color--rgb: #{np-colors.$primary-600--rgb};
11
+ --wp-admin-theme-color-darker-10: #{np-colors.$primary-700};
12
+ --wp-admin-theme-color-darker-10--rgb: #{np-colors.$primary-700--rgb};
13
+ --wp-admin-theme-color-darker-20: #{np-colors.$primary-800};
14
+ --wp-admin-theme-color-darker-20--rgb: #{np-colors.$primary-800--rgb};
15
+ --wp-admin-theme-color-lighter-10: #{np-colors.$primary-000};
16
+ --wp-admin-theme-color-lighter-10--rgb: #{np-colors.$primary-000--rgb};
17
17
 
18
18
  border-radius: 8px;
19
19
  margin: auto;
@@ -58,11 +58,11 @@
58
58
 
59
59
  &--destructive {
60
60
  .components-button.is-primary {
61
- background-color: colors.$error-500;
62
- color: colors.$neutral-000;
61
+ background-color: np-colors.$error-500;
62
+ color: np-colors.$neutral-000;
63
63
  &:hover,
64
64
  &:focus {
65
- background-color: colors.$error-600;
65
+ background-color: np-colors.$error-600;
66
66
  }
67
67
  }
68
68
  }
@@ -1,22 +1,22 @@
1
- @use '../../../colors/colors.module.scss' as colors;
1
+ @use "../../../colors/colors.module" as np-colors;
2
2
 
3
3
  /**
4
4
  * Newspack Icon
5
5
  */
6
6
 
7
7
  .newspack-icon {
8
- background: colors.$primary-600;
8
+ background: np-colors.$primary-600;
9
9
  fill: white;
10
10
  padding: 12px;
11
11
 
12
12
  &--white {
13
13
  background: white;
14
- fill: colors.$primary-600;
14
+ fill: np-colors.$primary-600;
15
15
  }
16
16
 
17
17
  &--simple {
18
18
  background: none;
19
- fill: colors.$primary-600;
19
+ fill: np-colors.$primary-600;
20
20
  padding: 0;
21
21
  }
22
22
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  @use "sass:color";
6
6
  @use "~@wordpress/base-styles/colors" as wp-colors;
7
- @use "../../../colors/colors.module" as colors;
7
+ @use "../../../colors/colors.module" as np-colors;
8
8
 
9
9
  .newspack-notice {
10
10
  align-items: center;
@@ -23,7 +23,7 @@
23
23
  }
24
24
 
25
25
  &__is-debug {
26
- background: colors.$primary-600;
26
+ background: np-colors.$primary-600;
27
27
  border-radius: 50%;
28
28
  bottom: 16px;
29
29
  box-shadow: 0 0 8px 4px rgba(black, 0.08);
@@ -63,7 +63,7 @@
63
63
  }
64
64
 
65
65
  &__is-help {
66
- background: colors.$primary-050;
66
+ background: np-colors.$primary-050;
67
67
 
68
68
  > svg {
69
69
  fill: var(--wp-admin-theme-color);
@@ -1,4 +1,4 @@
1
- @use "../../../colors/colors.module" as colors;
1
+ @use "../../../colors/colors.module" as np-colors;
2
2
  @use "~@wordpress/base-styles/colors" as wp-colors;
3
3
  @use "~@wordpress/base-styles/mixins" as wp-mixins;
4
4
  @use "~@wordpress/base-styles/variables" as wp-vars;
@@ -20,21 +20,21 @@
20
20
  // without per-component overrides.
21
21
  /* stylelint-disable plugin-wpds/no-setting-wpds-custom-properties -- deliberate Newspack brand override of the wpds brand tokens. */
22
22
  :root {
23
- --wpds-color-background-interactive-brand-strong: #{colors.$primary-600};
24
- --wpds-color-background-interactive-brand-strong-active: #{colors.$primary-800};
25
- --wpds-color-background-interactive-brand-weak-active: #{colors.$primary-000};
26
- --wpds-color-background-surface-brand: #{colors.$primary-000};
27
- --wpds-color-background-thumb-brand: #{colors.$primary-600};
28
- --wpds-color-background-thumb-brand-active: #{colors.$primary-600};
29
- --wpds-color-foreground-interactive-brand: #{colors.$primary-600};
30
- --wpds-color-foreground-interactive-brand-active: #{colors.$primary-800};
31
- --wpds-color-foreground-interactive-brand-disabled: #{colors.$primary-400};
32
- --wpds-color-stroke-focus: #{colors.$primary-600};
33
- --wpds-color-stroke-interactive-brand: #{colors.$primary-600};
34
- --wpds-color-stroke-interactive-brand-active: #{colors.$primary-800};
35
- --wpds-color-stroke-interactive-brand-disabled: #{colors.$primary-100};
36
- --wpds-color-stroke-surface-brand: #{colors.$primary-000};
37
- --wpds-color-stroke-surface-brand-strong: #{colors.$primary-600};
23
+ --wpds-color-background-interactive-brand-strong: #{np-colors.$primary-600};
24
+ --wpds-color-background-interactive-brand-strong-active: #{np-colors.$primary-800};
25
+ --wpds-color-background-interactive-brand-weak-active: #{np-colors.$primary-000};
26
+ --wpds-color-background-surface-brand: #{np-colors.$primary-000};
27
+ --wpds-color-background-thumb-brand: #{np-colors.$primary-600};
28
+ --wpds-color-background-thumb-brand-active: #{np-colors.$primary-600};
29
+ --wpds-color-foreground-interactive-brand: #{np-colors.$primary-600};
30
+ --wpds-color-foreground-interactive-brand-active: #{np-colors.$primary-800};
31
+ --wpds-color-foreground-interactive-brand-disabled: #{np-colors.$primary-400};
32
+ --wpds-color-stroke-focus: #{np-colors.$primary-600};
33
+ --wpds-color-stroke-interactive-brand: #{np-colors.$primary-600};
34
+ --wpds-color-stroke-interactive-brand-active: #{np-colors.$primary-800};
35
+ --wpds-color-stroke-interactive-brand-disabled: #{np-colors.$primary-100};
36
+ --wpds-color-stroke-surface-brand: #{np-colors.$primary-000};
37
+ --wpds-color-stroke-surface-brand-strong: #{np-colors.$primary-600};
38
38
  }
39
39
  /* stylelint-enable plugin-wpds/no-setting-wpds-custom-properties */
40
40