newspack-components 4.2.0 → 4.4.0-epic-editor-refactor.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 (315) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/DEVELOPMENT.md +868 -0
  3. package/copy-styles.js +3 -2
  4. package/dist/cjs/accordion/index.js +17 -12
  5. package/dist/cjs/action-card/index.js +186 -140
  6. package/dist/cjs/action-card/style.scss +25 -2
  7. package/dist/cjs/autocomplete-tokenfield/index.js +254 -234
  8. package/dist/cjs/autocomplete-with-latest-posts/index.js +351 -0
  9. package/dist/cjs/autocomplete-with-latest-posts/style.scss +150 -0
  10. package/dist/cjs/autocomplete-with-suggestions/index.js +229 -126
  11. package/dist/cjs/badge/index.js +32 -0
  12. package/dist/cjs/badge/style.scss +36 -0
  13. package/dist/cjs/box-contrast/index.js +19 -15
  14. package/dist/cjs/button/index.js +41 -24
  15. package/dist/cjs/button-props/button-props.js +5 -5
  16. package/dist/cjs/button-props/index.js +2 -2
  17. package/dist/cjs/card/core-card.js +199 -0
  18. package/dist/cjs/card/index.js +75 -35
  19. package/dist/cjs/card/style-core.scss +295 -0
  20. package/dist/cjs/card/style.scss +4 -4
  21. package/dist/cjs/card-feature/index.js +141 -0
  22. package/dist/cjs/card-feature/style.scss +75 -0
  23. package/dist/cjs/card-form/index.js +144 -0
  24. package/dist/cjs/card-form/style.scss +20 -0
  25. package/dist/cjs/card-settings-group/index.js +69 -0
  26. package/dist/cjs/card-settings-group/style.scss +33 -0
  27. package/dist/cjs/card-sortable-list/index.js +426 -0
  28. package/dist/cjs/card-sortable-list/style.scss +48 -0
  29. package/dist/cjs/category-autocomplete/index.js +175 -155
  30. package/dist/cjs/color-picker/index.js +41 -23
  31. package/dist/cjs/color-picker/index.test.js +82 -0
  32. package/dist/cjs/color-picker/style.scss +11 -13
  33. package/dist/cjs/confirm-dialog/index.js +123 -0
  34. package/dist/cjs/consts.js +1 -1
  35. package/dist/cjs/custom-select-control/index.js +39 -28
  36. package/dist/cjs/dataviews/index.js +38 -0
  37. package/dist/cjs/dataviews/style.scss +9 -0
  38. package/dist/cjs/divider/index.js +47 -0
  39. package/dist/cjs/divider/style.scss +51 -0
  40. package/dist/cjs/footer/index.js +36 -30
  41. package/dist/cjs/form-token-field/index.js +51 -40
  42. package/dist/cjs/form-token-field/style.scss +0 -5
  43. package/dist/cjs/global-notices/index.js +5 -5
  44. package/dist/cjs/grid/index.js +25 -18
  45. package/dist/cjs/grid/style.scss +67 -8
  46. package/dist/cjs/handoff/index.js +204 -156
  47. package/dist/cjs/handoff-message/index.js +12 -7
  48. package/dist/cjs/hooks/index.js +10 -8
  49. package/dist/cjs/hooks/use-confirm-dialog.js +79 -0
  50. package/dist/cjs/hooks/use-unsaved-changes-dialog.js +144 -0
  51. package/dist/cjs/hooks/useObjectState.js +21 -12
  52. package/dist/cjs/hooks/useObjectState.test.js +55 -33
  53. package/dist/cjs/hooks/useOnClickOutside.js +6 -6
  54. package/dist/cjs/hooks/usePrompt.js +10 -13
  55. package/dist/cjs/image-upload/index.js +114 -123
  56. package/dist/cjs/image-upload/index.test.js +11 -13
  57. package/dist/cjs/image-upload/style.scss +12 -40
  58. package/dist/cjs/index.js +166 -92
  59. package/dist/cjs/info-button/index.js +43 -32
  60. package/dist/cjs/integration-icons/active-campaign.js +22 -0
  61. package/dist/cjs/integration-icons/constant-contact.js +28 -0
  62. package/dist/cjs/integration-icons/fundraise-up.js +25 -0
  63. package/dist/cjs/integration-icons/index.js +48 -0
  64. package/dist/cjs/integration-icons/mailchimp.js +19 -0
  65. package/dist/cjs/integration-icons/salesforce.js +17 -0
  66. package/dist/cjs/integration-icons/wisepops.js +20 -0
  67. package/dist/cjs/modal/index.js +29 -19
  68. package/dist/cjs/modal/style.scss +47 -13
  69. package/dist/cjs/newspack-icon/index.js +45 -38
  70. package/dist/cjs/newspack-icon/style.scss +5 -3
  71. package/dist/cjs/notice/index.js +64 -55
  72. package/dist/cjs/plugin-installer/index.js +259 -253
  73. package/dist/cjs/plugin-settings/SettingsSection.js +66 -60
  74. package/dist/cjs/plugin-settings/index.js +217 -200
  75. package/dist/cjs/plugin-toggle/index.js +192 -199
  76. package/dist/cjs/popover/index.js +41 -28
  77. package/dist/cjs/position-control/index.js +24 -23
  78. package/dist/cjs/progress-bar/index.js +71 -59
  79. package/dist/cjs/progress-bar/index.test.js +62 -68
  80. package/dist/cjs/proxied-imports/router.js +3 -3
  81. package/dist/cjs/radio-control/index.js +40 -27
  82. package/dist/cjs/section-header/index.js +143 -39
  83. package/dist/cjs/section-header/style.scss +129 -4
  84. package/dist/cjs/select-control/ButtonGroupControl.js +26 -21
  85. package/dist/cjs/select-control/GroupedSelectControl.js +41 -35
  86. package/dist/cjs/select-control/index.js +52 -40
  87. package/dist/cjs/settings/MinMaxSetting.js +30 -20
  88. package/dist/cjs/settings/SettingsCard.js +20 -17
  89. package/dist/cjs/settings/SettingsSection.js +22 -21
  90. package/dist/cjs/settings/index.js +5 -5
  91. package/dist/cjs/sortable-newsletter-list-control/index.js +78 -57
  92. package/dist/cjs/steps-list/index.js +44 -34
  93. package/dist/cjs/steps-list-item/index.js +47 -39
  94. package/dist/cjs/style-card/index.js +70 -63
  95. package/dist/cjs/style.scss +2 -0
  96. package/dist/cjs/tabbed-navigation/index.js +38 -36
  97. package/dist/cjs/text-control/index.js +27 -25
  98. package/dist/cjs/utils/color.js +4 -4
  99. package/dist/cjs/utils/editor-toolbar-back-button.js +61 -0
  100. package/dist/cjs/utils/index.js +31 -19
  101. package/dist/cjs/utils/style.scss +8 -0
  102. package/dist/cjs/waiting/index.js +48 -35
  103. package/dist/cjs/waiting/style.scss +4 -0
  104. package/dist/cjs/web-preview/index.js +219 -154
  105. package/dist/cjs/web-preview/style.scss +20 -53
  106. package/dist/cjs/with-wizard/index.js +362 -364
  107. package/dist/cjs/with-wizard/style.scss +28 -60
  108. package/dist/cjs/with-wizard-screen/index.js +54 -58
  109. package/dist/cjs/with-wizard-screen/style.scss +77 -10
  110. package/dist/cjs/wizard/components/WizardError.js +20 -18
  111. package/dist/cjs/wizard/components/WizardSnackbar.js +73 -0
  112. package/dist/cjs/wizard/components/style.scss +48 -0
  113. package/dist/cjs/wizard/index.js +207 -64
  114. package/dist/cjs/wizard/store/index.js +191 -97
  115. package/dist/cjs/wizard/store/utils.js +13 -8
  116. package/dist/esm/accordion/index.js +14 -9
  117. package/dist/esm/action-card/index.js +178 -124
  118. package/dist/esm/action-card/style.scss +25 -2
  119. package/dist/esm/autocomplete-tokenfield/index.js +248 -222
  120. package/dist/esm/autocomplete-with-latest-posts/index.js +347 -0
  121. package/dist/esm/autocomplete-with-latest-posts/style.scss +150 -0
  122. package/dist/esm/autocomplete-with-suggestions/index.js +226 -119
  123. package/dist/esm/badge/index.js +24 -0
  124. package/dist/esm/badge/style.scss +36 -0
  125. package/dist/esm/box-contrast/index.js +15 -11
  126. package/dist/esm/button/index.js +39 -19
  127. package/dist/esm/button-props/button-props.js +1 -1
  128. package/dist/esm/card/core-card.js +195 -0
  129. package/dist/esm/card/index.js +70 -22
  130. package/dist/esm/card/style-core.scss +295 -0
  131. package/dist/esm/card/style.scss +4 -4
  132. package/dist/esm/card-feature/index.js +131 -0
  133. package/dist/esm/card-feature/style.scss +75 -0
  134. package/dist/esm/card-form/index.js +134 -0
  135. package/dist/esm/card-form/style.scss +20 -0
  136. package/dist/esm/card-settings-group/index.js +61 -0
  137. package/dist/esm/card-settings-group/style.scss +33 -0
  138. package/dist/esm/card-sortable-list/index.js +425 -0
  139. package/dist/esm/card-sortable-list/style.scss +48 -0
  140. package/dist/esm/category-autocomplete/index.js +168 -140
  141. package/dist/esm/color-picker/index.js +39 -21
  142. package/dist/esm/color-picker/index.test.js +78 -0
  143. package/dist/esm/color-picker/style.scss +11 -13
  144. package/dist/esm/confirm-dialog/index.js +116 -0
  145. package/dist/esm/consts.js +1 -1
  146. package/dist/esm/custom-select-control/index.js +34 -15
  147. package/dist/esm/dataviews/index.js +34 -0
  148. package/dist/esm/dataviews/style.scss +9 -0
  149. package/dist/esm/divider/index.js +42 -0
  150. package/dist/esm/divider/style.scss +51 -0
  151. package/dist/esm/footer/index.js +34 -28
  152. package/dist/esm/form-token-field/index.js +46 -27
  153. package/dist/esm/form-token-field/style.scss +0 -5
  154. package/dist/esm/global-notices/index.js +3 -3
  155. package/dist/esm/grid/index.js +23 -13
  156. package/dist/esm/grid/style.scss +67 -8
  157. package/dist/esm/handoff/index.js +199 -143
  158. package/dist/esm/handoff-message/index.js +10 -6
  159. package/dist/esm/hooks/index.js +8 -6
  160. package/dist/esm/hooks/use-confirm-dialog.js +73 -0
  161. package/dist/esm/hooks/use-unsaved-changes-dialog.js +136 -0
  162. package/dist/esm/hooks/useObjectState.js +19 -9
  163. package/dist/esm/hooks/useObjectState.test.js +54 -32
  164. package/dist/esm/hooks/useOnClickOutside.js +4 -4
  165. package/dist/esm/hooks/usePrompt.js +9 -11
  166. package/dist/esm/image-upload/index.js +110 -111
  167. package/dist/esm/image-upload/index.test.js +11 -13
  168. package/dist/esm/image-upload/style.scss +12 -40
  169. package/dist/esm/index.js +13 -1
  170. package/dist/esm/info-button/index.js +38 -19
  171. package/dist/esm/integration-icons/active-campaign.js +16 -0
  172. package/dist/esm/integration-icons/constant-contact.js +22 -0
  173. package/dist/esm/integration-icons/fundraise-up.js +19 -0
  174. package/dist/esm/integration-icons/index.js +6 -0
  175. package/dist/esm/integration-icons/mailchimp.js +13 -0
  176. package/dist/esm/integration-icons/salesforce.js +11 -0
  177. package/dist/esm/integration-icons/wisepops.js +14 -0
  178. package/dist/esm/modal/index.js +27 -13
  179. package/dist/esm/modal/style.scss +47 -13
  180. package/dist/esm/newspack-icon/index.js +40 -25
  181. package/dist/esm/newspack-icon/style.scss +5 -3
  182. package/dist/esm/notice/index.js +59 -42
  183. package/dist/esm/plugin-installer/index.js +255 -243
  184. package/dist/esm/plugin-settings/SettingsSection.js +61 -50
  185. package/dist/esm/plugin-settings/index.js +212 -189
  186. package/dist/esm/plugin-toggle/index.js +187 -190
  187. package/dist/esm/popover/index.js +35 -16
  188. package/dist/esm/position-control/index.js +22 -18
  189. package/dist/esm/progress-bar/index.js +66 -49
  190. package/dist/esm/progress-bar/index.test.js +61 -67
  191. package/dist/esm/radio-control/index.js +34 -15
  192. package/dist/esm/section-header/index.js +140 -38
  193. package/dist/esm/section-header/style.scss +129 -4
  194. package/dist/esm/select-control/ButtonGroupControl.js +23 -18
  195. package/dist/esm/select-control/GroupedSelectControl.js +38 -30
  196. package/dist/esm/select-control/index.js +47 -27
  197. package/dist/esm/settings/MinMaxSetting.js +27 -16
  198. package/dist/esm/settings/SettingsCard.js +18 -13
  199. package/dist/esm/settings/SettingsSection.js +20 -19
  200. package/dist/esm/settings/index.js +3 -3
  201. package/dist/esm/sortable-newsletter-list-control/index.js +74 -53
  202. package/dist/esm/steps-list/index.js +39 -21
  203. package/dist/esm/steps-list-item/index.js +42 -26
  204. package/dist/esm/style-card/index.js +65 -50
  205. package/dist/esm/style.scss +2 -0
  206. package/dist/esm/tabbed-navigation/index.js +35 -33
  207. package/dist/esm/text-control/index.js +25 -19
  208. package/dist/esm/utils/color.js +4 -4
  209. package/dist/esm/utils/editor-toolbar-back-button.js +53 -0
  210. package/dist/esm/utils/index.js +29 -16
  211. package/dist/esm/utils/style.scss +8 -0
  212. package/dist/esm/waiting/index.js +43 -22
  213. package/dist/esm/waiting/style.scss +4 -0
  214. package/dist/esm/web-preview/index.js +218 -147
  215. package/dist/esm/web-preview/style.scss +20 -53
  216. package/dist/esm/with-wizard/index.js +360 -358
  217. package/dist/esm/with-wizard/style.scss +28 -60
  218. package/dist/esm/with-wizard-screen/index.js +48 -46
  219. package/dist/esm/with-wizard-screen/style.scss +77 -10
  220. package/dist/esm/wizard/components/WizardError.js +18 -16
  221. package/dist/esm/wizard/components/WizardSnackbar.js +70 -0
  222. package/dist/esm/wizard/components/style.scss +48 -0
  223. package/dist/esm/wizard/index.js +207 -58
  224. package/dist/esm/wizard/store/index.js +189 -90
  225. package/dist/esm/wizard/store/utils.js +13 -6
  226. package/package.json +30 -17
  227. package/release.config.js +1 -0
  228. package/shared/author-context.js +26 -0
  229. package/shared/hooks/use-coauthors.js +388 -0
  230. package/shared/hooks/use-coauthors.test.js +850 -0
  231. package/shared/hooks/use-custom-byline.js +47 -0
  232. package/shared/hooks/use-custom-byline.test.js +133 -0
  233. package/shared/scss/_mixins.scss +54 -0
  234. package/src/accordion/index.js +8 -7
  235. package/src/action-card/action-card.d.ts +7 -3
  236. package/src/action-card/index.js +39 -12
  237. package/src/action-card/style.scss +25 -2
  238. package/src/autocomplete-tokenfield/index.js +2 -2
  239. package/src/autocomplete-with-latest-posts/index.js +290 -0
  240. package/src/autocomplete-with-latest-posts/style.scss +150 -0
  241. package/src/badge/index.tsx +26 -0
  242. package/src/badge/style.scss +36 -0
  243. package/src/button/index.tsx +3 -2
  244. package/src/card/core-card.js +224 -0
  245. package/src/card/index.js +40 -1
  246. package/src/card/style-core.scss +295 -0
  247. package/src/card/style.scss +4 -4
  248. package/src/card-feature/README.md +188 -0
  249. package/src/card-feature/index.tsx +186 -0
  250. package/src/card-feature/style.scss +75 -0
  251. package/src/card-form/README.md +113 -0
  252. package/src/card-form/index.tsx +128 -0
  253. package/src/card-form/style.scss +20 -0
  254. package/src/card-settings-group/README.md +43 -0
  255. package/src/card-settings-group/index.tsx +78 -0
  256. package/src/card-settings-group/style.scss +33 -0
  257. package/src/card-sortable-list/README.md +51 -0
  258. package/src/card-sortable-list/index.tsx +435 -0
  259. package/src/card-sortable-list/style.scss +48 -0
  260. package/src/color-picker/index.js +15 -8
  261. package/src/color-picker/index.test.js +52 -0
  262. package/src/color-picker/style.scss +11 -13
  263. package/src/confirm-dialog/README.md +128 -0
  264. package/src/confirm-dialog/index.tsx +132 -0
  265. package/src/dataviews/index.tsx +34 -0
  266. package/src/dataviews/style.scss +9 -0
  267. package/src/divider/README.md +25 -0
  268. package/src/divider/index.js +31 -0
  269. package/src/divider/style.scss +51 -0
  270. package/src/form-token-field/style.scss +0 -5
  271. package/src/grid/index.tsx +2 -1
  272. package/src/grid/style.scss +67 -8
  273. package/src/handoff/README.md +93 -0
  274. package/src/handoff/index.js +46 -8
  275. package/src/hooks/index.ts +2 -1
  276. package/src/hooks/use-confirm-dialog.tsx +80 -0
  277. package/src/hooks/use-unsaved-changes-dialog.tsx +140 -0
  278. package/src/image-upload/index.js +10 -15
  279. package/src/image-upload/style.scss +12 -40
  280. package/src/index.js +13 -1
  281. package/src/integration-icons/active-campaign.js +14 -0
  282. package/src/integration-icons/constant-contact.js +22 -0
  283. package/src/integration-icons/fundraise-up.js +18 -0
  284. package/src/integration-icons/index.js +6 -0
  285. package/src/integration-icons/mailchimp.js +10 -0
  286. package/src/integration-icons/salesforce.js +10 -0
  287. package/src/integration-icons/wisepops.js +14 -0
  288. package/src/modal/index.js +12 -3
  289. package/src/modal/style.scss +47 -13
  290. package/src/newspack-icon/style.scss +5 -3
  291. package/src/plugin-installer/index.js +30 -19
  292. package/src/section-header/index.js +105 -14
  293. package/src/section-header/style.scss +129 -4
  294. package/src/select-control/index.js +4 -0
  295. package/src/style.scss +2 -0
  296. package/src/utils/editor-toolbar-back-button.tsx +48 -0
  297. package/src/utils/index.js +6 -0
  298. package/src/utils/style.scss +8 -0
  299. package/src/waiting/index.js +2 -1
  300. package/src/waiting/style.scss +4 -0
  301. package/src/web-preview/index.js +90 -35
  302. package/src/web-preview/style.scss +20 -53
  303. package/src/with-wizard/index.js +1 -1
  304. package/src/with-wizard/style.scss +28 -60
  305. package/src/with-wizard-screen/style.scss +77 -10
  306. package/src/wizard/components/WizardSnackbar.js +58 -0
  307. package/src/wizard/components/style.scss +48 -0
  308. package/src/wizard/index.js +152 -21
  309. package/src/wizard/store/index.js +28 -2
  310. package/dist/cjs/button-card/index.js +0 -72
  311. package/dist/cjs/button-card/style.scss +0 -180
  312. package/dist/esm/button-card/index.js +0 -64
  313. package/dist/esm/button-card/style.scss +0 -180
  314. package/src/button-card/index.js +0 -52
  315. package/src/button-card/style.scss +0 -180
@@ -1,53 +1,52 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ 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; }
3
+ 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) { _defineProperty(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; }
1
4
  import React, { createElement as _createElement } from 'react';
2
5
  import { render } from '@testing-library/react';
3
6
  import ProgressBar from './';
4
7
  import { jsx as _jsx } from "react/jsx-runtime";
5
- describe('ProgressBar', () => {
6
- it('should render a progress indicator', () => {
7
- const {
8
- getByTestId
9
- } = render(/*#__PURE__*/_jsx(ProgressBar, {
10
- completed: "1",
11
- total: "2"
12
- }));
13
- const indicator = getByTestId('progress-bar-indicator');
8
+ describe('ProgressBar', function () {
9
+ it('should render a progress indicator', function () {
10
+ var _render = render(/*#__PURE__*/_jsx(ProgressBar, {
11
+ completed: "1",
12
+ total: "2"
13
+ })),
14
+ getByTestId = _render.getByTestId;
15
+ var indicator = getByTestId('progress-bar-indicator');
14
16
  expect(indicator).toHaveAttribute('style', 'width: 50%;');
15
17
  });
16
- it('should render a label', () => {
17
- const label = 'test label';
18
- const {
19
- getByText
20
- } = render(/*#__PURE__*/_jsx(ProgressBar, {
21
- completed: "1",
22
- total: "2",
23
- label: label
24
- }));
18
+ it('should render a label', function () {
19
+ var label = 'test label';
20
+ var _render2 = render(/*#__PURE__*/_jsx(ProgressBar, {
21
+ completed: "1",
22
+ total: "2",
23
+ label: label
24
+ })),
25
+ getByText = _render2.getByText;
25
26
  expect(getByText(label)).toBeInTheDocument();
26
27
  });
27
- it('should render progress as a fraction', () => {
28
- const {
29
- getByText
30
- } = render(/*#__PURE__*/_jsx(ProgressBar, {
31
- completed: "1",
32
- total: "2",
33
- displayFraction: true
34
- }));
28
+ it('should render progress as a fraction', function () {
29
+ var _render3 = render(/*#__PURE__*/_jsx(ProgressBar, {
30
+ completed: "1",
31
+ total: "2",
32
+ displayFraction: true
33
+ })),
34
+ getByText = _render3.getByText;
35
35
  expect(getByText('1/2')).toBeInTheDocument();
36
36
  });
37
- it('should render with both label and fraction', () => {
38
- const label = 'test label';
39
- const {
40
- getByText
41
- } = render(/*#__PURE__*/_jsx(ProgressBar, {
42
- completed: "1",
43
- total: "2",
44
- label: label,
45
- displayFraction: true
46
- }));
37
+ it('should render with both label and fraction', function () {
38
+ var label = 'test label';
39
+ var _render4 = render(/*#__PURE__*/_jsx(ProgressBar, {
40
+ completed: "1",
41
+ total: "2",
42
+ label: label,
43
+ displayFraction: true
44
+ })),
45
+ getByText = _render4.getByText;
47
46
  expect(getByText(label)).toBeInTheDocument();
48
47
  expect(getByText('1/2')).toBeInTheDocument();
49
48
  });
50
- describe('should calculate progress correctly', () => {
49
+ describe('should calculate progress correctly', function () {
51
50
  [{
52
51
  props: {
53
52
  completed: 1,
@@ -66,42 +65,37 @@ describe('ProgressBar', () => {
66
65
  total: 3
67
66
  },
68
67
  expectedWidth: 100
69
- }].forEach(({
70
- props,
71
- expectedWidth
72
- }) => {
73
- it(`with expected progress of ${expectedWidth}`, () => {
74
- const {
75
- getByTestId
76
- } = render(/*#__PURE__*/_createElement(ProgressBar, {
77
- ...props,
78
- key: expectedWidth
79
- }));
80
- expect(getByTestId('progress-bar-indicator')).toHaveAttribute('style', `width: ${expectedWidth}%;`);
68
+ }].forEach(function (_ref) {
69
+ var props = _ref.props,
70
+ expectedWidth = _ref.expectedWidth;
71
+ it("with expected progress of ".concat(expectedWidth), function () {
72
+ var _render5 = render(/*#__PURE__*/_createElement(ProgressBar, _objectSpread(_objectSpread({}, props), {}, {
73
+ key: expectedWidth
74
+ }))),
75
+ getByTestId = _render5.getByTestId;
76
+ expect(getByTestId('progress-bar-indicator')).toHaveAttribute('style', "width: ".concat(expectedWidth, "%;"));
81
77
  });
82
78
  });
83
79
  });
84
- it('should handle non-numeric values in ProgressBar element', () => {
85
- const {
86
- getByText,
87
- getByTestId
88
- } = render(/*#__PURE__*/_jsx(ProgressBar, {
89
- completed: "cats",
90
- total: "dogs",
91
- displayFraction: true
92
- }));
80
+ it('should handle non-numeric values in ProgressBar element', function () {
81
+ var _render6 = render(/*#__PURE__*/_jsx(ProgressBar, {
82
+ completed: "cats",
83
+ total: "dogs",
84
+ displayFraction: true
85
+ })),
86
+ getByText = _render6.getByText,
87
+ getByTestId = _render6.getByTestId;
93
88
  expect(getByText('0/0')).toBeInTheDocument();
94
89
  expect(getByTestId('progress-bar-indicator')).toHaveAttribute('style', 'width: 100%;');
95
90
  });
96
- it('should handle non-logical values in ProgressBar element', () => {
97
- const {
98
- getByText,
99
- getByTestId
100
- } = render(/*#__PURE__*/_jsx(ProgressBar, {
101
- completed: "3",
102
- total: "-1",
103
- displayFraction: true
104
- }));
91
+ it('should handle non-logical values in ProgressBar element', function () {
92
+ var _render7 = render(/*#__PURE__*/_jsx(ProgressBar, {
93
+ completed: "3",
94
+ total: "-1",
95
+ displayFraction: true
96
+ })),
97
+ getByText = _render7.getByText,
98
+ getByTestId = _render7.getByTestId;
105
99
  expect(getByText('0/0')).toBeInTheDocument();
106
100
  expect(getByTestId('progress-bar-indicator')).toHaveAttribute('style', 'width: 100%;');
107
101
  });
@@ -1,3 +1,15 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
4
+ import _createClass from "@babel/runtime/helpers/createClass";
5
+ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
6
+ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
7
+ import _inherits from "@babel/runtime/helpers/inherits";
8
+ var _excluded = ["className"];
9
+ 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; }
10
+ 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) { _defineProperty(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; }
11
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
12
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
1
13
  /**
2
14
  * WordPress dependencies.
3
15
  */
@@ -18,20 +30,27 @@ import classnames from 'classnames';
18
30
  * Radio Control.
19
31
  */
20
32
  import { jsx as _jsx } from "react/jsx-runtime";
21
- class RadioControl extends Component {
22
- /**
23
- * Render.
24
- */
25
- render() {
26
- const {
27
- className,
28
- ...otherProps
29
- } = this.props;
30
- const classes = classnames('newspack-radio-control', className);
31
- return /*#__PURE__*/_jsx(BaseComponent, {
32
- className: classes,
33
- ...otherProps
34
- });
33
+ var RadioControl = /*#__PURE__*/function (_Component) {
34
+ function RadioControl() {
35
+ _classCallCheck(this, RadioControl);
36
+ return _callSuper(this, RadioControl, arguments);
35
37
  }
36
- }
38
+ _inherits(RadioControl, _Component);
39
+ return _createClass(RadioControl, [{
40
+ key: "render",
41
+ value:
42
+ /**
43
+ * Render.
44
+ */
45
+ function render() {
46
+ var _this$props = this.props,
47
+ className = _this$props.className,
48
+ otherProps = _objectWithoutProperties(_this$props, _excluded);
49
+ var classes = classnames('newspack-radio-control', className);
50
+ return /*#__PURE__*/_jsx(BaseComponent, _objectSpread({
51
+ className: classes
52
+ }, otherProps));
53
+ }
54
+ }]);
55
+ }(Component);
37
56
  export default RadioControl;
@@ -5,12 +5,15 @@
5
5
  /**
6
6
  * WordPress dependencies
7
7
  */
8
+ import { __ } from '@wordpress/i18n';
8
9
  import { useEffect, useRef } from '@wordpress/element';
10
+ import { DropdownMenu, MenuItem, Tooltip, __experimentalHStack as HStack } from '@wordpress/components'; // eslint-disable-line @wordpress/no-unsafe-wp-apis
11
+ import { Icon, chevronLeft, moreVertical } from '@wordpress/icons';
9
12
 
10
13
  /**
11
14
  * Internal dependencies
12
15
  */
13
- import { Grid } from '..';
16
+ import { Badge, Button, Grid } from '..';
14
17
  import './style.scss';
15
18
 
16
19
  /**
@@ -22,14 +25,20 @@ import classnames from 'classnames';
22
25
  * Represents a section header component.
23
26
  *
24
27
  * @typedef {Object} SectionHeaderProps
25
- * @property {boolean} [centered=false] - Indicates if the header is centered.
26
- * @property {?string} [className=null] - Additional CSS class name.
27
- * @property {string|Function|*} [description] - Description of the section.
28
- * @property {number} [heading=2] - HTML heading level, e.g., 1 for h1, 2 for h2, etc.
29
- * @property {boolean} [isWhite=false] - Indicates if the header should use a white theme.
30
- * @property {boolean} [noMargin=false] - Indicates if the header should have no margin.
31
- * @property {string} title - The title of the section.
32
- * @property {?string} [id=null] - Optional ID for the header element.
28
+ * @property {string} [backNav=''] - URL to navigate back to.
29
+ * @property {string|string[]} [badge] - Badge to display in the header.
30
+ * @property {string} [badgeLevel] - Badge level, e.g., 'success', 'info', 'warning', 'error'.
31
+ * @property {boolean} [centered=false] - Indicates if the header is centered.
32
+ * @property {?string} [className=null] - Additional CSS class name.
33
+ * @property {string|Function|*} [description] - Description of the section.
34
+ * @property {number} [heading=2] - HTML heading level, e.g., 1 for h1, 2 for h2, etc.
35
+ * @property {string|Function|*} [icon] - Icon to display in the header.
36
+ * @property {boolean} [isWhite=false] - Indicates if the header should use a white theme.
37
+ * @property {boolean} [noMargin=false] - Indicates if the header should have no margin.
38
+ * @property {boolean} [pageHeader=false] - Indicates if the header is used as a page header.
39
+ * @property {string} title - The title of the section.
40
+ * @property {?string} [id=null] - Optional ID for the header element.
41
+ * @property {?string|Function|*} [children=null] - Optional children to display in the header.
33
42
  */
34
43
 
35
44
  /**
@@ -38,52 +47,145 @@ import classnames from 'classnames';
38
47
  * @param {SectionHeaderProps} props - The properties for the section header.
39
48
  */
40
49
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
41
- const SectionHeader = ({
42
- centered = false,
43
- className = null,
44
- description = '',
45
- heading = 2,
46
- isWhite = false,
47
- noMargin = false,
48
- title,
49
- id = null
50
- }) => {
50
+ var SectionHeader = function SectionHeader(_ref) {
51
+ var _ref$backNav = _ref.backNav,
52
+ backNav = _ref$backNav === void 0 ? '' : _ref$backNav,
53
+ badges = _ref.badges,
54
+ _ref$centered = _ref.centered,
55
+ centered = _ref$centered === void 0 ? false : _ref$centered,
56
+ _ref$className = _ref.className,
57
+ className = _ref$className === void 0 ? null : _ref$className,
58
+ _ref$description = _ref.description,
59
+ description = _ref$description === void 0 ? '' : _ref$description,
60
+ _ref$heading = _ref.heading,
61
+ heading = _ref$heading === void 0 ? 2 : _ref$heading,
62
+ _ref$icon = _ref.icon,
63
+ icon = _ref$icon === void 0 ? null : _ref$icon,
64
+ _ref$isWhite = _ref.isWhite,
65
+ isWhite = _ref$isWhite === void 0 ? false : _ref$isWhite,
66
+ _ref$noMargin = _ref.noMargin,
67
+ noMargin = _ref$noMargin === void 0 ? false : _ref$noMargin,
68
+ _ref$pageHeader = _ref.pageHeader,
69
+ pageHeader = _ref$pageHeader === void 0 ? false : _ref$pageHeader,
70
+ title = _ref.title,
71
+ _ref$id = _ref.id,
72
+ id = _ref$id === void 0 ? null : _ref$id,
73
+ menu = _ref.menu,
74
+ primaryAction = _ref.primaryAction,
75
+ secondaryAction = _ref.secondaryAction,
76
+ _ref$children = _ref.children,
77
+ children = _ref$children === void 0 ? null : _ref$children;
51
78
  // If id is in the URL as a scrollTo param, scroll to it on render.
52
- const ref = useRef();
53
- useEffect(() => {
54
- const params = new Proxy(new URLSearchParams(window.location.search), {
55
- get: (searchParams, prop) => searchParams.get(prop)
79
+ var ref = useRef();
80
+ useEffect(function () {
81
+ var params = new Proxy(new URLSearchParams(window.location.search), {
82
+ get: function get(searchParams, prop) {
83
+ return searchParams.get(prop);
84
+ }
56
85
  });
57
- const scrollToId = params.scrollTo;
86
+ var scrollToId = params.scrollTo;
58
87
  if (scrollToId && scrollToId === id) {
59
88
  // Let parent scroll action run before running this.
60
- window.setTimeout(() => ref.current.scrollIntoView({
61
- behavior: 'smooth'
62
- }), 250);
89
+ window.setTimeout(function () {
90
+ return ref.current.scrollIntoView({
91
+ behavior: 'smooth'
92
+ });
93
+ }, 250);
63
94
  }
64
95
  }, []);
65
- const classes = classnames('newspack-section-header', centered && 'newspack-section-header--is-centered', isWhite && 'newspack-section-header--is-white', noMargin && 'newspack-section-header--no-margin', className);
66
- const HeadingTag = `h${heading}`;
67
- return /*#__PURE__*/_jsx("div", {
96
+ var classes = classnames('newspack-section-header', centered && 'newspack-section-header--is-centered', isWhite && 'newspack-section-header--is-white', noMargin && 'newspack-section-header--no-margin', pageHeader && 'newspack-section-header--page-header');
97
+ var HeadingTag = pageHeader ? 'h1' : "h".concat(heading);
98
+ var titleContent = null;
99
+ if (typeof title === 'string') {
100
+ titleContent = /*#__PURE__*/_jsxs("div", {
101
+ className: "newspack-section-header__title-container",
102
+ children: [/*#__PURE__*/_jsxs(HeadingTag, {
103
+ children: [title, badges !== null && badges !== void 0 && badges.length ? badges.map(function (badge, i) {
104
+ return /*#__PURE__*/_jsx(Badge, {
105
+ text: badge.label,
106
+ level: badge.level || 'default'
107
+ }, i);
108
+ }) : null]
109
+ }), (menu === null || menu === void 0 ? void 0 : menu.length) > 0 && /*#__PURE__*/_jsx(DropdownMenu, {
110
+ className: "newspack-section-header__menu",
111
+ icon: moreVertical,
112
+ label: __('More options', 'newspack-plugin'),
113
+ children: function children() {
114
+ return menu.map(function (item, index) {
115
+ return /*#__PURE__*/_jsx(MenuItem, {
116
+ icon: item.icon,
117
+ href: item.href,
118
+ onClick: item.action,
119
+ disabled: item.disabled || false,
120
+ isDestructive: item.destructive || false,
121
+ children: item.label
122
+ }, index);
123
+ });
124
+ }
125
+ }), secondaryAction && /*#__PURE__*/_jsx("div", {
126
+ className: "newspack-section-header__secondary-action",
127
+ children: /*#__PURE__*/_jsx(Button, {
128
+ variant: "link",
129
+ href: secondaryAction.href,
130
+ onClick: secondaryAction.action,
131
+ children: secondaryAction.label
132
+ })
133
+ })]
134
+ });
135
+ } else if (typeof title === 'function') {
136
+ titleContent = /*#__PURE__*/_jsx(HeadingTag, {
137
+ children: title()
138
+ });
139
+ }
140
+ return /*#__PURE__*/_jsxs("div", {
68
141
  id: id,
69
- className: "newspack-section-header__container",
142
+ className: classnames('newspack-section-header__container', backNav && 'newspack-section-header--has-back-nav', primaryAction && 'newspack-section-header--has-primary-action', className),
70
143
  ref: ref,
71
- children: /*#__PURE__*/_jsxs(Grid, {
144
+ children: [/*#__PURE__*/_jsxs(Grid, {
72
145
  columns: 1,
73
146
  gutter: 8,
74
147
  className: classes,
75
- children: [typeof title === 'string' && /*#__PURE__*/_jsx(HeadingTag, {
76
- children: title
77
- }), typeof title === 'function' && /*#__PURE__*/_jsx(HeadingTag, {
78
- children: title()
79
- }), description && typeof description === 'string' && /*#__PURE__*/_jsx("p", {
148
+ children: [icon && /*#__PURE__*/_jsx("div", {
149
+ className: "newspack-section-header__icon",
150
+ children: /*#__PURE__*/_jsx(Icon, {
151
+ icon: icon,
152
+ size: 48
153
+ })
154
+ }), backNav ? /*#__PURE__*/_jsxs(HStack, {
155
+ alignment: "left",
156
+ style: {
157
+ position: 'relative'
158
+ },
159
+ children: [/*#__PURE__*/_jsx("div", {
160
+ className: "newspack-section-header__back-nav",
161
+ children: /*#__PURE__*/_jsx(Tooltip, {
162
+ text: __('Go back', 'newspack-plugin'),
163
+ children: /*#__PURE__*/_jsx(Button, {
164
+ href: backNav,
165
+ icon: chevronLeft,
166
+ variant: "tertiary"
167
+ })
168
+ })
169
+ }), titleContent]
170
+ }) : titleContent, description && typeof description === 'string' && /*#__PURE__*/_jsx("p", {
80
171
  children: description
81
172
  }), typeof description === 'function' && /*#__PURE__*/_jsx("p", {
82
173
  children: description()
83
174
  }), description && typeof description !== 'string' && typeof description !== 'function' && /*#__PURE__*/_jsx("p", {
84
175
  children: description
176
+ }), children && /*#__PURE__*/_jsx("div", {
177
+ className: "newspack-section-header__children",
178
+ children: children
85
179
  })]
86
- })
180
+ }), primaryAction && /*#__PURE__*/_jsx("div", {
181
+ className: "newspack-section-header__primary-action",
182
+ children: /*#__PURE__*/_jsx(Button, {
183
+ href: primaryAction.href,
184
+ variant: "primary",
185
+ onClick: primaryAction.action,
186
+ children: primaryAction.label
187
+ })
188
+ })]
87
189
  });
88
190
  };
89
191
  export default SectionHeader;
@@ -3,21 +3,66 @@
3
3
  */
4
4
 
5
5
  @use "~@wordpress/base-styles/colors" as wp-colors;
6
+ @use "~@wordpress/base-styles/variables" as wp-vars;
7
+ @use "../../../colors/colors.module" as colors;
6
8
 
7
9
  .newspack-section-header {
10
+ flex: 1;
8
11
  margin: 64px 0 32px;
9
12
 
10
- &__container:not(:first-child) {
11
- margin-top: 48px;
13
+ &__container {
14
+ position: relative;
15
+ &:not(:first-child) {
16
+ margin-top: 48px;
17
+ }
18
+ &:has(> .newspack-section-header--no-margin) {
19
+ margin-top: 0;
20
+ }
21
+ &.newspack-section-header--has-primary-action {
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: 32px;
25
+ @media (min-width: 782px) {
26
+ align-items: flex-start;
27
+ flex-direction: row;
28
+ }
29
+ }
30
+ &.newspack-section-header--has-back-nav {
31
+ @media (min-width: 782px) {
32
+ .newspack-section-header__title-container,
33
+ p {
34
+ max-width: calc(50% - 16px);
35
+ }
36
+ }
37
+ }
38
+ }
39
+
40
+ &__back-nav {
41
+ @media (min-width: 1280px) {
42
+ left: 0;
43
+ position: absolute;
44
+ top: 50%;
45
+ transform: translate(calc(-100% - 8px), -50%);
46
+ }
47
+ a,
48
+ button {
49
+ color: inherit !important;
50
+ }
12
51
  }
13
52
 
14
- &--no-margin,
15
53
  h1,
16
54
  h2,
17
55
  h3,
18
56
  h4,
19
57
  h5,
20
58
  h6 {
59
+ align-items: center;
60
+ display: flex;
61
+ gap: 8px;
62
+ margin: 0 !important;
63
+ }
64
+
65
+ &--no-margin {
21
66
  margin: 0 !important;
22
67
  }
23
68
 
@@ -25,7 +70,7 @@
25
70
  text-align: center;
26
71
  }
27
72
 
28
- &:not( #{&}--no-margin ) + *:not( #{&} ) {
73
+ &:not( #{&}--no-margin ) + *:not( #{&} ):not(.newspack-wizard__section-header):not(.newspack-section-header__primary-action) {
29
74
  margin-top: -16px !important;
30
75
  }
31
76
 
@@ -39,7 +84,87 @@
39
84
  color: wp-colors.$gray-700;
40
85
  }
41
86
 
87
+ &__title-container {
88
+ align-items: center;
89
+ display: flex;
90
+ gap: 8px;
91
+
92
+ h2 {
93
+ font-size: wp-vars.$font-size-x-large;
94
+ font-weight: wp-vars.$font-weight-medium;
95
+ line-height: wp-vars.$font-line-height-x-large;
96
+ }
97
+
98
+ .newspack-section-header__menu,
99
+ .newspack-section-header__secondary-action,
100
+ .newspack-badge {
101
+ margin-top: 8px;
102
+ }
103
+ }
104
+
105
+ &__menu {
106
+ align-self: center;
107
+ }
108
+
109
+ &__primary-action {
110
+ @media (min-width: 782px) {
111
+ display: flex;
112
+ flex: 1;
113
+ justify-content: flex-end;
114
+ }
115
+ }
116
+
117
+ &__secondary-action {
118
+ display: flex;
119
+ margin-left: 8px;
120
+ }
121
+
122
+ &__children {
123
+ margin-top: 32px;
124
+ width: 100%;
125
+ .newspack-button-card:not(.grouped) {
126
+ margin-bottom: 0;
127
+ & + .newspack-button-card:not(.grouped) {
128
+ margin-top: 16px;
129
+ }
130
+ }
131
+ }
132
+
42
133
  .newspack-wizard__content &:first-child {
43
134
  margin-top: 32px;
44
135
  }
136
+ &.newspack-section-header--page-header {
137
+ display: flex;
138
+ flex-direction: column;
139
+ align-items: center;
140
+ justify-content: center;
141
+ margin-left: auto;
142
+ margin-right: auto;
143
+ > h1,
144
+ > h2,
145
+ > h3,
146
+ > h4,
147
+ > h5,
148
+ > h6,
149
+ > p {
150
+ text-align: center;
151
+ }
152
+ .newspack-section-header__icon {
153
+ background-color: var(--wp-admin-theme-color-lighter-10);
154
+ border-radius: 100%;
155
+ display: grid;
156
+ height: 80px;
157
+ margin-bottom: 8px !important;
158
+ width: 80px;
159
+ place-items: center;
160
+ svg {
161
+ fill: var(--wp-admin-theme-color);
162
+ }
163
+ }
164
+ h1 {
165
+ font-size: wp-vars.$font-size-x-large;
166
+ font-weight: wp-vars.$font-weight-medium;
167
+ line-height: wp-vars.$font-line-height-x-large;
168
+ }
169
+ }
45
170
  }
@@ -14,17 +14,16 @@ import { BaseControl, Button, ButtonGroup } from '@wordpress/components';
14
14
  */
15
15
  import { hooks } from '..';
16
16
  import { jsx as _jsx } from "react/jsx-runtime";
17
- const ButtonGroupControl = ({
18
- buttonOptions,
19
- buttonSmall,
20
- className,
21
- help,
22
- hideLabelFromVision,
23
- label,
24
- onChange,
25
- value
26
- }) => {
27
- const id = hooks.useUniqueId('button-group');
17
+ var ButtonGroupControl = function ButtonGroupControl(_ref) {
18
+ var buttonOptions = _ref.buttonOptions,
19
+ buttonSmall = _ref.buttonSmall,
20
+ className = _ref.className,
21
+ help = _ref.help,
22
+ hideLabelFromVision = _ref.hideLabelFromVision,
23
+ label = _ref.label,
24
+ onChange = _ref.onChange,
25
+ value = _ref.value;
26
+ var id = hooks.useUniqueId('button-group');
28
27
  return /*#__PURE__*/_jsx(BaseControl, {
29
28
  label: label,
30
29
  help: help,
@@ -32,19 +31,25 @@ const ButtonGroupControl = ({
32
31
  id: id.current,
33
32
  className: classnames(className, 'components-select-control'),
34
33
  children: /*#__PURE__*/_jsx(ButtonGroup, {
35
- children: buttonOptions.map(option => {
36
- const isSelected = value === option.value;
37
- let Label = () => option.label;
34
+ children: buttonOptions.map(function (option) {
35
+ var isSelected = value === option.value;
36
+ var Label = function Label() {
37
+ return option.label;
38
+ };
38
39
  if (option.icon) {
39
40
  // eslint-disable-next-line react/display-name
40
- Label = () => /*#__PURE__*/_jsx(Icon, {
41
- icon: option.icon
42
- });
41
+ Label = function Label() {
42
+ return /*#__PURE__*/_jsx(Icon, {
43
+ icon: option.icon
44
+ });
45
+ };
43
46
  }
44
47
  return /*#__PURE__*/_jsx(Button, {
45
48
  variant: isSelected ? 'primary' : null,
46
49
  isPressed: isSelected,
47
- onClick: () => onChange(option.value),
50
+ onClick: function onClick() {
51
+ return onChange(option.value);
52
+ },
48
53
  isSmall: buttonSmall,
49
54
  children: /*#__PURE__*/_jsx(Label, {})
50
55
  }, option.value);