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
@@ -3,11 +3,21 @@
3
3
  */
4
4
 
5
5
  @use "~@wordpress/base-styles/colors" as wp-colors;
6
+ @use "../../../colors/colors.module" as colors;
6
7
 
7
8
  // Styling for full-page-react Wizards (ignoring admin-header-only wizards).
8
9
  body.newspack-wizard-page:not(.newspack-admin-header) {
9
-
10
- background: white;
10
+ --wp-admin-theme-color: #{colors.$primary-600};
11
+ --wp-admin-theme-color--rgb: #{colors.$primary-600--rgb};
12
+ --wp-admin-theme-color-darker-10: #{colors.$primary-700};
13
+ --wp-admin-theme-color-darker-10--rgb: #{colors.$primary-700--rgb};
14
+ --wp-admin-theme-color-darker-20: #{colors.$primary-800};
15
+ --wp-admin-theme-color-darker-20--rgb: #{colors.$primary-800--rgb};
16
+ --wp-admin-theme-color-lighter-10: #{colors.$primary-000};
17
+ --wp-admin-theme-color-lighter-10--rgb: #{colors.$primary-000--rgb};
18
+ --wp-components-color-accent: #{colors.$primary-600};
19
+
20
+ background: #{wp-colors.$white};
11
21
 
12
22
  // Reset Padding
13
23
  #wpcontent {
@@ -18,6 +28,14 @@ body.newspack-wizard-page:not(.newspack-admin-header) {
18
28
  padding-bottom: 220px;
19
29
  min-height: 100vh;
20
30
 
31
+ @media screen and ( min-width: 600px ) {
32
+ min-height: calc(100vh - 46px);
33
+ }
34
+
35
+ @media screen and ( min-width: 783px ) {
36
+ min-height: calc(100vh - 32px);
37
+ }
38
+
21
39
  // For admin notices directly ">" at top of page above the Wizard header.
22
40
  // PHP code should hide these notices, but just incase add this style.
23
41
  > .notice {
@@ -29,10 +47,14 @@ body.newspack-wizard-page:not(.newspack-admin-header) {
29
47
  padding-bottom: 202px;
30
48
  }
31
49
 
32
- @media screen and ( min-width: 1128px ) {
33
- padding-bottom: 168px;
50
+ @media screen and ( min-width: 1054px ) {
51
+ padding-bottom: 136px;
34
52
  }
35
53
  }
54
+
55
+ .components-popover__content {
56
+ min-width: 192px;
57
+ }
36
58
  }
37
59
 
38
60
  // Styling for wizards that are admin-header-only.
@@ -63,37 +85,6 @@ svg {
63
85
  }
64
86
  }
65
87
 
66
- // Blue Screen
67
- .newspack-wizard__blue {
68
- #wpwrap {
69
- background: var(--wp-admin-theme-color);
70
- }
71
-
72
- .newspack-footer {
73
- background: var(--wp-admin-theme-color);
74
- border-color: var(--wp-admin-theme-color);
75
- justify-content: center;
76
-
77
- &__logo {
78
- background: inherit;
79
- }
80
- }
81
-
82
- #wpfooter {
83
- color: white;
84
-
85
- a {
86
- color: inherit;
87
-
88
- &:active,
89
- &:focus,
90
- &:hover {
91
- opacity: 0.75;
92
- }
93
- }
94
- }
95
- }
96
-
97
88
  // Loading
98
89
  .newspack-wizard__is-loading {
99
90
  background: white;
@@ -134,7 +125,7 @@ svg {
134
125
  0 96px 0 0 wp-colors.$gray-700;
135
126
  height: 24px;
136
127
  margin: 68px auto 0;
137
- max-width: 1040px;
128
+ max-width: 1006px;
138
129
  width: calc(100% - ( 32px * 2 ));
139
130
 
140
131
  @media screen and ( min-width: 744px ) {
@@ -156,29 +147,6 @@ svg {
156
147
  }
157
148
  }
158
149
 
159
- // Blue Screen
160
- .newspack-wizard__blue & {
161
- background: var(--wp-admin-theme-color);
162
-
163
- &::before {
164
- animation: loading-quiet 1.25s ease-in-out infinite;
165
- background: white;
166
- border-radius: 0;
167
- box-shadow: 0;
168
- height: 8px;
169
- left: 0;
170
- margin: 0;
171
- position: absolute;
172
- right: 100%;
173
- top: 0;
174
- width: auto;
175
- }
176
-
177
- &::after {
178
- display: none;
179
- }
180
- }
181
-
182
150
  // Quiet
183
151
  &-quiet {
184
152
  position: relative;
@@ -250,7 +218,7 @@ svg {
250
218
  0 96px 0 0 wp-colors.$gray-700;
251
219
  height: 24px;
252
220
  margin: 0 auto;
253
- max-width: 1040px;
221
+ max-width: 1006px;
254
222
  width: 100%;
255
223
 
256
224
  @media screen and ( min-width: 744px ) {
@@ -13,6 +13,8 @@
13
13
  --wp-admin-theme-color-darker-10--rgb: #{colors.$primary-700--rgb};
14
14
  --wp-admin-theme-color-darker-20: #{colors.$primary-800};
15
15
  --wp-admin-theme-color-darker-20--rgb: #{colors.$primary-800--rgb};
16
+ --wp-admin-theme-color-lighter-10: #{colors.$primary-000};
17
+ --wp-admin-theme-color-lighter-10--rgb: #{colors.$primary-000--rgb};
16
18
 
17
19
  color: wp-colors.$gray-900;
18
20
 
@@ -44,12 +46,59 @@
44
46
  }
45
47
 
46
48
  &__header {
49
+ align-items: center;
47
50
  background: white;
51
+ border-bottom: 1px solid wp-colors.$gray-300;
52
+ display: flex;
53
+ .newspack-wizard__fixed-header & {
54
+ position: sticky;
55
+ top: 0;
56
+ width: 100%;
57
+ z-index: 1000;
58
+ .admin-bar & {
59
+ @media only screen and ( min-width: 601px ) {
60
+ top: 46px;
61
+ }
62
+ @media only screen and ( min-width: 782px ) {
63
+ top: 32px;
64
+ }
65
+ }
66
+ }
67
+ &__inner {
68
+ flex: 1 1 100%;
69
+ }
70
+ &__actions {
71
+ align-items: center;
72
+ display: flex;
73
+ gap: 8px;
74
+ justify-content: flex-end;
75
+ padding: 0 24px 0 0;
76
+ > .newspack-wizard__header__actions__main {
77
+ display: none;
78
+ }
79
+ @media only screen and ( min-width: 782px ) {
80
+ flex: 1 1 auto;
81
+ > .newspack-wizard__header__actions__main {
82
+ display: flex;
83
+ }
84
+ &__more {
85
+ &--primary-only,
86
+ .newspack-wizard__header__actions__more__main {
87
+ display: none;
88
+ }
89
+ }
90
+ }
91
+ }
48
92
  }
49
93
 
94
+ &__main {
95
+ overflow-x: hidden;
96
+ padding-bottom: 1px; /* Prevents borders from being cut off */
97
+ }
98
+
99
+
50
100
  &__title {
51
101
  align-items: center;
52
- border-bottom: 1px solid wp-colors.$gray-300;
53
102
  display: flex;
54
103
 
55
104
  h2 {
@@ -62,7 +111,7 @@
62
111
  display: flex;
63
112
  padding: 0 24px;
64
113
 
65
- span {
114
+ > span {
66
115
  color: wp-colors.$gray-700;
67
116
  display: none;
68
117
  margin-left: 8px;
@@ -119,14 +168,22 @@
119
168
  }
120
169
  }
121
170
 
171
+ &__section-header {
172
+ margin: 0 auto 32px;
173
+ max-width: calc(calc(var(--newspack-wizard-section-space) * 2) + var(--newspack-wizard-section-width));
174
+ &:not(.newspack-section-header--has-primary-action) {
175
+ @media (min-width: 782px) {
176
+ .newspack-section-header__title-container + p {
177
+ max-width: 50%;
178
+ }
179
+ }
180
+ }
181
+ }
182
+
122
183
  &__content {
123
184
  margin: 0 auto;
124
- max-width: 1208px;
125
- padding: 0 16px;
126
-
127
- @media screen and ( min-width: 744px ) {
128
- padding: 40px 84px;
129
- }
185
+ max-width: calc(calc(var(--newspack-wizard-section-space) * 2) + var(--newspack-wizard-section-width));
186
+ padding: calc(var(--newspack-wizard-section-space) * 2) var(--newspack-wizard-section-space) 0;
130
187
 
131
188
  // Typography
132
189
 
@@ -141,16 +198,26 @@
141
198
 
142
199
  // Thematic Break
143
200
 
144
- hr {
201
+ hr:not(.newspack-divider) {
145
202
  background: wp-colors.$gray-300;
146
203
  border: 0;
147
204
  height: 1px;
148
- margin: 48px 0;
205
+ margin: 32px 0;
149
206
 
150
207
  @media screen and ( min-width: 744px ) {
151
208
  margin: 64px 0;
152
209
  }
153
210
  }
211
+ &:not(.newspack-wizard__content--full-width) {
212
+ .newspack-dataviews {
213
+ margin-left: -24px;
214
+ margin-right: -24px;
215
+ @media (min-width: 380px) {
216
+ margin-left: -48px;
217
+ margin-right: -48px;
218
+ }
219
+ }
220
+ }
154
221
  }
155
222
 
156
223
  &__above-header {
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Snackbar.
3
+ */
4
+
5
+ /**
6
+ * WordPress dependencies.
7
+ */
8
+ import { Snackbar as BaseComponent } from '@wordpress/components';
9
+ import { useDispatch } from '@wordpress/data';
10
+
11
+ /**
12
+ * Internal dependencies.
13
+ */
14
+ import { WIZARD_STORE_NAMESPACE } from '../store';
15
+ import './style.scss';
16
+
17
+ /**
18
+ * External dependencies.
19
+ */
20
+ import classnames from 'classnames';
21
+
22
+ /**
23
+ * WizardSnackbar component.
24
+ *
25
+ * @param {Object} props - The component props.
26
+ * @param {Object[]} props.actions - The actions to display in the snackbar.
27
+ * @param {JSX.Element} props.children - The component children.
28
+ * @param {Object} props.props - The component props. See: https://wordpress.github.io/gutenberg/?path=/docs/components-snackbar--docs
29
+ * @param {string} props.position - The snackbar position.
30
+ * @param {string} props.type - The snackbar type: 'info', 'success', 'warning', or 'error'.
31
+ * @return {JSX.Element} The component.
32
+ */
33
+ const WizardSnackbar = ( { children, position = 'bottom-left', type = 'info', actions = [], ...props } ) => {
34
+ const className = classnames(
35
+ 'newspack-wizard__snackbar',
36
+ props.className,
37
+ `newspack-wizard__snackbar--${ position }`,
38
+ `newspack-wizard__snackbar--${ type }`
39
+ );
40
+ const { removeNotice, resetNotices } = useDispatch( WIZARD_STORE_NAMESPACE );
41
+ const onRemove = () => {
42
+ if ( props.onRemove ) {
43
+ props.onRemove();
44
+ }
45
+ if ( props.id ) {
46
+ removeNotice( props.id );
47
+ } else {
48
+ resetNotices();
49
+ }
50
+ };
51
+ return (
52
+ <BaseComponent className={ className } { ...props } onRemove={ onRemove } actions={ actions }>
53
+ { children }
54
+ </BaseComponent>
55
+ );
56
+ };
57
+
58
+ export default WizardSnackbar;
@@ -0,0 +1,48 @@
1
+ .newspack-wizard {
2
+ &__snackbar {
3
+ border-bottom: 2px solid transparent;
4
+ bottom: 16px;
5
+ left: 16px;
6
+ max-width: calc(100vw - 32px);
7
+ position: fixed;
8
+ z-index: 99999;
9
+ &--success {
10
+ border-color: var(--newspack-ui-color-success-60);
11
+ }
12
+ &--error {
13
+ border-color: var(--newspack-ui-color-error-60);
14
+ }
15
+ &--warning {
16
+ border-color: var(--newspack-ui-color-warning-40);
17
+ }
18
+ @media screen and ( min-width: 783px ) {
19
+ left: calc(36px + 16px); /* 36px for admin menu bar */
20
+ }
21
+ @media screen and ( min-width: 960px ) {
22
+ left: calc(160px + 16px); /* 160px for admin menu bar */
23
+ }
24
+ &.newspack-wizard__snackbar--bottom-right,
25
+ &.newspack-wizard__snackbar--top-right {
26
+ left: auto;
27
+ right: calc(16px);
28
+ }
29
+ &.newspack-wizard__snackbar--top-left,
30
+ &.newspack-wizard__snackbar--top-right {
31
+ bottom: auto;
32
+ top: calc(16px + 46px); /* 46px for admin bar */
33
+ @media screen and ( min-width: 783px ) {
34
+ top: calc(16px + 32px); /* 32px for admin bar */
35
+ }
36
+ }
37
+ a,
38
+ .components-button.is-link {
39
+ color: var(--newspack-ui-color-neutral-0);
40
+ cursor: pointer;
41
+ margin-left: 16px;
42
+ &:hover,
43
+ &:focus {
44
+ color: var(--newspack-ui-color-neutral-10);
45
+ }
46
+ }
47
+ }
48
+ }
@@ -6,22 +6,52 @@ import classnames from 'classnames';
6
6
  /**
7
7
  * WordPress dependencies.
8
8
  */
9
- import { useSelect } from '@wordpress/data';
10
- import { useState, forwardRef } from '@wordpress/element';
9
+ import { DropdownMenu, MenuItem } from '@wordpress/components';
10
+ import { useDispatch, useSelect } from '@wordpress/data';
11
+ import { useEffect, useState, forwardRef } from '@wordpress/element';
11
12
  import { __ } from '@wordpress/i18n';
12
- import { category } from '@wordpress/icons';
13
+ import { category, chevronLeft, moreVertical } from '@wordpress/icons';
13
14
 
14
15
  /**
15
16
  * Internal dependencies
16
17
  */
17
- import { Footer, Notice, Button, NewspackIcon, TabbedNavigation, PluginInstaller, HandoffMessage } from '../';
18
+ import { Footer, Notice, Button, NewspackIcon, TabbedNavigation, PluginInstaller, SectionHeader, HandoffMessage } from '../';
18
19
  import Router from '../proxied-imports/router';
19
20
  import registerStore, { WIZARD_STORE_NAMESPACE } from './store';
21
+ import WizardSnackbar from './components/WizardSnackbar';
20
22
  import WizardError from './components/WizardError';
21
23
 
22
24
  registerStore();
23
25
 
24
- const { HashRouter, Redirect, Route, Switch } = Router;
26
+ /**
27
+ * Icon registry for resolving icon name strings passed through the data store.
28
+ * React elements from @wordpress/icons can't cross webpack entry point boundaries
29
+ * because each bundle has its own copy of the icon primitives.
30
+ */
31
+ const ICON_REGISTRY = { chevronLeft, category, moreVertical };
32
+ const resolveIcon = icon => {
33
+ if ( typeof icon === 'string' ) {
34
+ return ICON_REGISTRY[ icon ] || null;
35
+ }
36
+ return icon;
37
+ };
38
+
39
+ const { HashRouter, Redirect, Route, Switch, useLocation } = Router;
40
+
41
+ /**
42
+ * Reset the header data when a new section is rendered.
43
+ */
44
+ const ResetHeaderData = () => {
45
+ const location = useLocation();
46
+ const { resetHeaderData } = useDispatch( WIZARD_STORE_NAMESPACE );
47
+
48
+ useEffect( () => {
49
+ resetHeaderData();
50
+ window.scrollTo( 0, 0 );
51
+ }, [ location.pathname, resetHeaderData ] );
52
+
53
+ return null;
54
+ };
25
55
 
26
56
  /**
27
57
  * @typedef {Object} WizardProps
@@ -49,17 +79,26 @@ const Wizard = (
49
79
  sections = [],
50
80
  headerText,
51
81
  apiSlug,
82
+ sharedProps = {},
52
83
  subHeaderText,
53
84
  hasSimpleFooter,
54
85
  className,
55
86
  renderAboveSections,
56
87
  requiredPlugins = [],
57
88
  isInitialFetchTriggered = true,
89
+ fixedHeader = false,
58
90
  },
59
91
  ref
60
92
  ) => {
61
93
  const isLoading = useSelect( select => select( WIZARD_STORE_NAMESPACE ).isLoading() );
62
94
  const isQuietLoading = useSelect( select => select( WIZARD_STORE_NAMESPACE ).isQuietLoading() );
95
+ const headerData = useSelect( select => select( WIZARD_STORE_NAMESPACE ).getHeaderData() );
96
+ const notices = useSelect( select => select( WIZARD_STORE_NAMESPACE ).getNotices() );
97
+ const { actions, backNav, badges, sectionDescription, sectionMenu, sectionName, sectionTitle, sectionPrimaryAction, sectionSecondaryAction } =
98
+ headerData;
99
+
100
+ const mainActions = actions?.filter( action => action.type === 'primary' || action.type === 'secondary' );
101
+ const moreActions = actions?.filter( action => action.type === 'more' );
63
102
 
64
103
  // Trigger initial data fetch. Some sections might not use the wizard data,
65
104
  // but for consistency, fetching is triggered regardless of the section.
@@ -80,6 +119,10 @@ const Wizard = (
80
119
  ];
81
120
  }
82
121
 
122
+ // When plugins are required but not yet satisfied, `displayedSections` is replaced with
123
+ // the PluginInstaller. Use it for routing so the installer actually mounts and runs.
124
+ const routedSections = pluginRequirementsSatisfied ? sections : displayedSections;
125
+
83
126
  const urlWithoutHash = window.location.href.split( '#' )[ 0 ];
84
127
 
85
128
  return (
@@ -87,11 +130,12 @@ const Wizard = (
87
130
  <div
88
131
  className={ classnames( isLoading ? 'newspack-wizard__is-loading' : 'newspack-wizard__is-loaded', {
89
132
  'newspack-wizard__is-loading-quiet': isQuietLoading,
133
+ 'newspack-wizard__fixed-header': fixedHeader,
90
134
  } ) }
91
135
  >
92
136
  <HashRouter hashType="slash">
93
137
  { newspack_aux_data.is_debug_mode && <Notice debugMode /> }
94
- <div className="bg-white">
138
+ <div className="newspack-wizard__header">
95
139
  <div className="newspack-wizard__header__inner">
96
140
  <div className="newspack-wizard__title">
97
141
  { newspack_urls.dashboard !== urlWithoutHash ? (
@@ -109,11 +153,64 @@ const Wizard = (
109
153
  <NewspackIcon size={ 36 } />
110
154
  ) }
111
155
  <div>
112
- { headerText && <h2>{ headerText }</h2> }
156
+ { headerText && (
157
+ <h2 className="newspack-wizard__header__title">
158
+ { headerText }
159
+ { sectionName && (
160
+ <span className="newspack-wizard__header__section">
161
+ <span className="newspack-wizard__header__section__separator"> / </span> { sectionName }
162
+ </span>
163
+ ) }
164
+ </h2>
165
+ ) }
113
166
  { subHeaderText && <span>{ subHeaderText }</span> }
114
167
  </div>
115
168
  </div>
116
169
  </div>
170
+ { actions?.length > 0 && (
171
+ <div className="newspack-wizard__header__actions">
172
+ { mainActions.map( ( action, index ) => (
173
+ <Button
174
+ key={ index }
175
+ className="newspack-wizard__header__actions__main"
176
+ href={ action.href }
177
+ icon={ resolveIcon( action.icon ) }
178
+ variant={ action.type }
179
+ onClick={ action.action }
180
+ disabled={ action.disabled || false }
181
+ isDestructive={ action.destructive || false }
182
+ >
183
+ { action.label }
184
+ </Button>
185
+ ) ) }
186
+ <DropdownMenu
187
+ className={ moreActions?.length === 0 ? 'newspack-wizard__header__actions__more--primary-only' : '' }
188
+ icon={ moreVertical }
189
+ label={ __( 'More', 'newspack-plugin' ) }
190
+ popoverProps={ { className: 'newspack-wizard__header__actions__more' } }
191
+ >
192
+ { () =>
193
+ actions.map( ( action, index ) => (
194
+ <MenuItem
195
+ key={ index }
196
+ className={
197
+ action.type === 'primary' || action.type === 'secondary'
198
+ ? 'newspack-wizard__header__actions__more__main'
199
+ : 'newspack-wizard__header__actions__more__more'
200
+ }
201
+ icon={ action.icon }
202
+ href={ action.href }
203
+ onClick={ action.action }
204
+ disabled={ action.disabled || false }
205
+ isDestructive={ action.destructive || false }
206
+ >
207
+ { action.label }
208
+ </MenuItem>
209
+ ) )
210
+ }
211
+ </DropdownMenu>
212
+ </div>
213
+ ) }
117
214
  </div>
118
215
 
119
216
  { displayedSections.length > 1 && (
@@ -123,21 +220,55 @@ const Wizard = (
123
220
  ) }
124
221
  <HandoffMessage />
125
222
 
126
- <Switch>
127
- { displayedSections.map( ( section, index ) => {
128
- const SectionComponent = section.render;
129
- return (
130
- <Route key={ index } exact={ section.exact ?? false } path={ section.path }>
131
- <div className={ classnames( 'newspack-wizard__content', className ) }>
132
- { 'function' === typeof renderAboveSections ? renderAboveSections() : null }
133
- <SectionComponent />
134
- </div>
135
- </Route>
136
- );
137
- } ) }
138
- <Redirect to={ displayedSections[ 0 ].path } />
139
- </Switch>
223
+ { sections.length > 1 && <ResetHeaderData /> }
224
+
225
+ <div className="newspack-wizard__main">
226
+ <Switch>
227
+ { routedSections.map( ( section, index ) => {
228
+ const SectionComponent = section.render;
229
+ const sectionProps = section.props || {};
230
+ return (
231
+ <Route
232
+ key={ index }
233
+ exact={ section.exact ?? false }
234
+ path={ section.path }
235
+ render={ routerProps => (
236
+ <div
237
+ className={ classnames( 'newspack-wizard__content', className, {
238
+ 'newspack-wizard__content--full-width': section.fullWidth,
239
+ } ) }
240
+ >
241
+ { 'function' === typeof renderAboveSections ? renderAboveSections() : null }
242
+ { ( sectionTitle || section.title ) && (
243
+ <SectionHeader
244
+ className="newspack-wizard__section-header"
245
+ backNav={ backNav || section.backNav }
246
+ title={ sectionTitle || section.title }
247
+ description={ sectionDescription || section.description }
248
+ badges={ badges || section.badges }
249
+ menu={ sectionMenu || section.menu }
250
+ primaryAction={ sectionPrimaryAction || section.primaryAction }
251
+ secondaryAction={ sectionSecondaryAction || section.secondaryAction }
252
+ heading={ 1 }
253
+ noMargin
254
+ />
255
+ ) }
256
+ <SectionComponent { ...routerProps } { ...sectionProps } { ...sharedProps } />
257
+ </div>
258
+ ) }
259
+ />
260
+ );
261
+ } ) }
262
+ <Redirect to={ displayedSections[ 0 ].path } />
263
+ </Switch>
264
+ </div>
140
265
  </HashRouter>
266
+ { notices?.length > 0 &&
267
+ notices.map( ( notice, index ) => (
268
+ <WizardSnackbar key={ notice.id || index } type={ notice.type } id={ notice.id } actions={ notice.actions }>
269
+ { notice.message }
270
+ </WizardSnackbar>
271
+ ) ) }
141
272
  </div>
142
273
  { ! isLoading && <Footer simple={ hasSimpleFooter } /> }
143
274
  </div>