newspack-components 2.0.3 → 2.2.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 (315) hide show
  1. package/copy-styles.js +1 -1
  2. package/dist/cjs/accordion/index.js +46 -0
  3. package/dist/cjs/accordion/style.scss +27 -0
  4. package/dist/cjs/action-card/index.js +72 -40
  5. package/dist/cjs/action-card/style.scss +143 -41
  6. package/dist/cjs/autocomplete-tokenfield/index.js +13 -41
  7. package/dist/cjs/autocomplete-tokenfield/style.scss +6 -6
  8. package/dist/cjs/autocomplete-with-suggestions/index.js +33 -53
  9. package/dist/cjs/autocomplete-with-suggestions/style.scss +27 -27
  10. package/dist/cjs/button/index.js +1 -20
  11. package/dist/cjs/button/style.scss +3 -344
  12. package/dist/cjs/button-card/index.js +11 -15
  13. package/dist/cjs/button-card/style.scss +65 -35
  14. package/dist/cjs/card/index.js +4 -9
  15. package/dist/cjs/card/style.scss +47 -63
  16. package/dist/cjs/category-autocomplete/index.js +66 -47
  17. package/dist/cjs/category-autocomplete/style.scss +20 -24
  18. package/dist/cjs/color-picker/index.js +16 -48
  19. package/dist/cjs/color-picker/style.scss +20 -163
  20. package/dist/cjs/consts.js +5 -3
  21. package/dist/cjs/custom-select-control/index.js +1 -9
  22. package/dist/cjs/custom-select-control/style.scss +14 -45
  23. package/dist/cjs/date-range-picker/index.js +1 -10
  24. package/dist/cjs/date-range-picker/style.scss +12 -12
  25. package/dist/cjs/footer/index.js +24 -22
  26. package/dist/cjs/footer/style.scss +13 -14
  27. package/dist/cjs/form-token-field/index.js +3 -11
  28. package/dist/cjs/form-token-field/style.scss +9 -105
  29. package/dist/cjs/global-notices/index.js +3 -9
  30. package/dist/cjs/grid/index.js +1 -8
  31. package/dist/cjs/grid/style.scss +19 -6
  32. package/dist/cjs/handoff/index.js +15 -24
  33. package/dist/cjs/handoff-message/index.js +50 -0
  34. package/dist/cjs/hooks/index.js +1 -7
  35. package/dist/cjs/hooks/useObjectState.js +7 -13
  36. package/dist/cjs/hooks/useObjectState.test.js +0 -14
  37. package/dist/cjs/hooks/useOnClickOutside.js +3 -6
  38. package/dist/cjs/hooks/usePrompt.js +1 -13
  39. package/dist/cjs/image-upload/index.js +22 -20
  40. package/dist/cjs/image-upload/index.test.js +0 -5
  41. package/dist/cjs/image-upload/style.scss +12 -17
  42. package/dist/cjs/index.js +31 -93
  43. package/dist/cjs/info-button/index.js +3 -11
  44. package/dist/cjs/info-button/style.scss +1 -3
  45. package/dist/cjs/modal/index.js +1 -12
  46. package/dist/cjs/modal/style.scss +20 -132
  47. package/dist/cjs/newspack-icon/index.js +5 -11
  48. package/dist/cjs/newspack-icon/style.scss +17 -2
  49. package/dist/cjs/newspack-logo/index.js +1 -9
  50. package/dist/cjs/newspack-logo/style.scss +3 -3
  51. package/dist/cjs/notice/index.js +8 -16
  52. package/dist/cjs/notice/style.scss +60 -19
  53. package/dist/cjs/patrons-logo/index.js +3 -11
  54. package/dist/cjs/plugin-installer/index.js +37 -37
  55. package/dist/cjs/plugin-installer/style.scss +5 -5
  56. package/dist/cjs/plugin-settings/SettingsSection.js +71 -59
  57. package/dist/cjs/plugin-settings/index.js +71 -50
  58. package/dist/cjs/plugin-settings/style.scss +7 -0
  59. package/dist/cjs/plugin-toggle/index.js +60 -32
  60. package/dist/cjs/plugin-toggle/style.scss +2 -2
  61. package/dist/cjs/popover/index.js +1 -11
  62. package/dist/cjs/popover/style.scss +20 -17
  63. package/dist/cjs/position-control/index.js +113 -0
  64. package/dist/cjs/position-control/style.scss +66 -0
  65. package/dist/cjs/progress-bar/index.js +2 -9
  66. package/dist/cjs/progress-bar/index.test.js +2 -7
  67. package/dist/cjs/progress-bar/style.scss +4 -4
  68. package/dist/cjs/proxied-imports/router.js +0 -3
  69. package/dist/cjs/radio-control/index.js +1 -11
  70. package/dist/cjs/radio-control/style.scss +10 -11
  71. package/dist/cjs/section-header/index.js +47 -19
  72. package/dist/cjs/section-header/style.scss +22 -1
  73. package/dist/cjs/select-control/ButtonGroupControl.js +11 -20
  74. package/dist/cjs/select-control/GroupedSelectControl.js +42 -45
  75. package/dist/cjs/select-control/index.js +6 -14
  76. package/dist/cjs/select-control/style.scss +47 -88
  77. package/dist/cjs/settings/MinMaxSetting.js +6 -8
  78. package/dist/cjs/settings/SettingsCard.js +9 -8
  79. package/dist/cjs/settings/SettingsSection.js +5 -8
  80. package/dist/cjs/settings/index.js +0 -6
  81. package/dist/cjs/settings/style.scss +32 -4
  82. package/dist/cjs/steps-list/index.js +52 -0
  83. package/dist/cjs/steps-list/style.scss +11 -0
  84. package/dist/cjs/steps-list-item/index.js +56 -0
  85. package/dist/cjs/steps-list-item/style.scss +47 -0
  86. package/dist/cjs/style-card/index.js +15 -18
  87. package/dist/cjs/style-card/style.scss +19 -18
  88. package/dist/cjs/style.scss +43 -0
  89. package/dist/cjs/tabbed-navigation/index.js +27 -31
  90. package/dist/cjs/tabbed-navigation/style.scss +58 -37
  91. package/dist/cjs/text-control/index.js +6 -19
  92. package/dist/cjs/text-control/style.scss +0 -126
  93. package/dist/cjs/utils/index.js +10 -5
  94. package/dist/cjs/waiting/index.js +9 -33
  95. package/dist/cjs/waiting/style.scss +9 -20
  96. package/dist/cjs/web-preview/index.js +30 -57
  97. package/dist/cjs/web-preview/style.scss +41 -34
  98. package/dist/cjs/with-wizard/index.js +55 -33
  99. package/dist/cjs/with-wizard/style.scss +77 -124
  100. package/dist/cjs/with-wizard-screen/index.js +28 -38
  101. package/dist/cjs/with-wizard-screen/style.scss +75 -125
  102. package/dist/cjs/wizard/components/WizardError.js +74 -0
  103. package/dist/cjs/wizard/index.js +131 -0
  104. package/dist/cjs/wizard/store/index.js +165 -0
  105. package/dist/cjs/wizard/store/utils.js +26 -0
  106. package/dist/cjs/wizard/style.scss +148 -0
  107. package/dist/esm/accordion/index.js +38 -0
  108. package/dist/esm/accordion/style.scss +27 -0
  109. package/dist/esm/action-card/index.js +75 -37
  110. package/dist/esm/action-card/style.scss +143 -41
  111. package/dist/esm/autocomplete-tokenfield/index.js +14 -37
  112. package/dist/esm/autocomplete-tokenfield/style.scss +6 -6
  113. package/dist/esm/autocomplete-with-suggestions/index.js +31 -43
  114. package/dist/esm/autocomplete-with-suggestions/style.scss +27 -27
  115. package/dist/esm/button/index.js +2 -14
  116. package/dist/esm/button/style.scss +3 -344
  117. package/dist/esm/button-card/index.js +12 -11
  118. package/dist/esm/button-card/style.scss +65 -35
  119. package/dist/esm/card/index.js +5 -6
  120. package/dist/esm/card/style.scss +47 -63
  121. package/dist/esm/category-autocomplete/index.js +68 -41
  122. package/dist/esm/category-autocomplete/style.scss +20 -24
  123. package/dist/esm/color-picker/index.js +17 -38
  124. package/dist/esm/color-picker/style.scss +20 -163
  125. package/dist/esm/consts.js +3 -2
  126. package/dist/esm/custom-select-control/index.js +2 -5
  127. package/dist/esm/custom-select-control/style.scss +14 -45
  128. package/dist/esm/date-range-picker/index.js +1 -3
  129. package/dist/esm/date-range-picker/style.scss +12 -12
  130. package/dist/esm/footer/index.js +22 -16
  131. package/dist/esm/footer/style.scss +13 -14
  132. package/dist/esm/form-token-field/index.js +4 -7
  133. package/dist/esm/form-token-field/style.scss +9 -105
  134. package/dist/esm/global-notices/index.js +3 -7
  135. package/dist/esm/grid/index.js +2 -5
  136. package/dist/esm/grid/style.scss +19 -6
  137. package/dist/esm/handoff/index.js +10 -21
  138. package/dist/esm/handoff-message/index.js +45 -0
  139. package/dist/esm/hooks/index.js +0 -2
  140. package/dist/esm/hooks/useObjectState.js +3 -8
  141. package/dist/esm/hooks/useObjectState.test.js +0 -3
  142. package/dist/esm/hooks/useOnClickOutside.js +2 -5
  143. package/dist/esm/hooks/usePrompt.js +1 -8
  144. package/dist/esm/image-upload/index.js +18 -17
  145. package/dist/esm/image-upload/style.scss +12 -17
  146. package/dist/esm/index.js +7 -8
  147. package/dist/esm/info-button/index.js +4 -6
  148. package/dist/esm/info-button/style.scss +1 -3
  149. package/dist/esm/modal/index.js +2 -8
  150. package/dist/esm/modal/style.scss +20 -132
  151. package/dist/esm/newspack-icon/index.js +6 -7
  152. package/dist/esm/newspack-icon/style.scss +17 -2
  153. package/dist/esm/newspack-logo/index.js +2 -5
  154. package/dist/esm/newspack-logo/style.scss +3 -3
  155. package/dist/esm/notice/index.js +11 -10
  156. package/dist/esm/notice/style.scss +60 -19
  157. package/dist/esm/patrons-logo/index.js +3 -5
  158. package/dist/esm/plugin-installer/index.js +37 -40
  159. package/dist/esm/plugin-installer/style.scss +5 -5
  160. package/dist/esm/plugin-settings/SettingsSection.js +71 -56
  161. package/dist/esm/plugin-settings/index.js +70 -52
  162. package/dist/esm/plugin-settings/style.scss +7 -0
  163. package/dist/esm/plugin-toggle/index.js +59 -34
  164. package/dist/esm/plugin-toggle/style.scss +2 -2
  165. package/dist/esm/popover/index.js +3 -6
  166. package/dist/esm/popover/style.scss +20 -17
  167. package/dist/esm/position-control/index.js +109 -0
  168. package/dist/esm/position-control/style.scss +66 -0
  169. package/dist/esm/progress-bar/index.js +2 -7
  170. package/dist/esm/progress-bar/index.test.js +2 -1
  171. package/dist/esm/progress-bar/style.scss +4 -4
  172. package/dist/esm/proxied-imports/router.js +1 -0
  173. package/dist/esm/radio-control/index.js +3 -6
  174. package/dist/esm/radio-control/style.scss +10 -11
  175. package/dist/esm/section-header/index.js +47 -16
  176. package/dist/esm/section-header/style.scss +22 -1
  177. package/dist/esm/select-control/ButtonGroupControl.js +12 -14
  178. package/dist/esm/select-control/GroupedSelectControl.js +38 -36
  179. package/dist/esm/select-control/index.js +7 -8
  180. package/dist/esm/select-control/style.scss +47 -88
  181. package/dist/esm/settings/MinMaxSetting.js +4 -5
  182. package/dist/esm/settings/SettingsCard.js +9 -5
  183. package/dist/esm/settings/SettingsSection.js +5 -7
  184. package/dist/esm/settings/style.scss +32 -4
  185. package/dist/esm/steps-list/index.js +43 -0
  186. package/dist/esm/steps-list/style.scss +11 -0
  187. package/dist/esm/steps-list-item/index.js +48 -0
  188. package/dist/esm/steps-list-item/style.scss +47 -0
  189. package/dist/esm/style-card/index.js +13 -13
  190. package/dist/esm/style-card/style.scss +19 -18
  191. package/dist/esm/style.scss +43 -0
  192. package/dist/esm/tabbed-navigation/index.js +30 -28
  193. package/dist/esm/tabbed-navigation/style.scss +58 -37
  194. package/dist/esm/text-control/index.js +2 -12
  195. package/dist/esm/text-control/style.scss +0 -126
  196. package/dist/esm/utils/index.js +9 -3
  197. package/dist/esm/waiting/index.js +11 -27
  198. package/dist/esm/waiting/style.scss +9 -20
  199. package/dist/esm/web-preview/index.js +21 -49
  200. package/dist/esm/web-preview/style.scss +41 -34
  201. package/dist/esm/with-wizard/index.js +53 -36
  202. package/dist/esm/with-wizard/style.scss +77 -124
  203. package/dist/esm/with-wizard-screen/index.js +26 -32
  204. package/dist/esm/with-wizard-screen/style.scss +75 -125
  205. package/dist/esm/wizard/components/WizardError.js +69 -0
  206. package/dist/esm/wizard/index.js +126 -0
  207. package/dist/esm/wizard/store/index.js +155 -0
  208. package/dist/esm/wizard/store/utils.js +17 -0
  209. package/dist/esm/wizard/style.scss +148 -0
  210. package/package.json +4 -4
  211. package/src/accordion/index.js +32 -0
  212. package/src/accordion/style.scss +27 -0
  213. package/src/action-card/index.js +70 -25
  214. package/src/action-card/style.scss +143 -41
  215. package/src/autocomplete-tokenfield/index.js +1 -1
  216. package/src/autocomplete-tokenfield/style.scss +6 -6
  217. package/src/autocomplete-with-suggestions/index.js +4 -2
  218. package/src/autocomplete-with-suggestions/style.scss +27 -27
  219. package/src/button/index.js +2 -9
  220. package/src/button/style.scss +3 -344
  221. package/src/button-card/index.js +19 -5
  222. package/src/button-card/style.scss +65 -35
  223. package/src/card/index.js +4 -0
  224. package/src/card/style.scss +47 -63
  225. package/src/category-autocomplete/index.js +53 -18
  226. package/src/category-autocomplete/style.scss +20 -24
  227. package/src/color-picker/index.js +16 -22
  228. package/src/color-picker/style.scss +20 -163
  229. package/src/consts.js +2 -1
  230. package/src/custom-select-control/style.scss +14 -45
  231. package/src/date-range-picker/style.scss +12 -12
  232. package/src/footer/index.js +20 -9
  233. package/src/footer/style.scss +13 -14
  234. package/src/form-token-field/index.js +3 -8
  235. package/src/form-token-field/style.scss +9 -105
  236. package/src/global-notices/index.js +1 -1
  237. package/src/grid/style.scss +19 -6
  238. package/src/handoff/index.js +10 -15
  239. package/src/handoff-message/index.js +39 -0
  240. package/src/hooks/useObjectState.js +2 -1
  241. package/src/image-upload/index.js +9 -3
  242. package/src/image-upload/style.scss +12 -17
  243. package/src/index.js +7 -7
  244. package/src/info-button/style.scss +1 -3
  245. package/src/modal/index.js +2 -5
  246. package/src/modal/style.scss +20 -132
  247. package/src/newspack-icon/index.js +7 -2
  248. package/src/newspack-icon/style.scss +17 -2
  249. package/src/newspack-logo/style.scss +3 -3
  250. package/src/notice/index.js +9 -1
  251. package/src/notice/style.scss +60 -19
  252. package/src/plugin-installer/index.js +17 -4
  253. package/src/plugin-installer/style.scss +5 -5
  254. package/src/plugin-settings/SettingsSection.js +59 -27
  255. package/src/plugin-settings/index.js +29 -8
  256. package/src/plugin-settings/style.scss +7 -0
  257. package/src/plugin-toggle/index.js +37 -12
  258. package/src/plugin-toggle/style.scss +2 -2
  259. package/src/popover/style.scss +20 -17
  260. package/src/position-control/index.js +122 -0
  261. package/src/position-control/style.scss +66 -0
  262. package/src/progress-bar/style.scss +4 -4
  263. package/src/radio-control/style.scss +10 -11
  264. package/src/section-header/index.js +41 -5
  265. package/src/section-header/style.scss +22 -1
  266. package/src/select-control/ButtonGroupControl.js +15 -5
  267. package/src/select-control/GroupedSelectControl.js +28 -25
  268. package/src/select-control/index.js +6 -3
  269. package/src/select-control/style.scss +47 -88
  270. package/src/settings/MinMaxSetting.js +2 -1
  271. package/src/settings/SettingsCard.js +9 -7
  272. package/src/settings/SettingsSection.js +4 -4
  273. package/src/settings/style.scss +32 -4
  274. package/src/steps-list/index.js +39 -0
  275. package/src/steps-list/style.scss +11 -0
  276. package/src/steps-list-item/index.js +40 -0
  277. package/src/steps-list-item/style.scss +47 -0
  278. package/src/style-card/index.js +16 -27
  279. package/src/style-card/style.scss +19 -18
  280. package/src/style.scss +43 -0
  281. package/src/tabbed-navigation/index.js +20 -24
  282. package/src/tabbed-navigation/style.scss +58 -37
  283. package/src/text-control/index.js +1 -2
  284. package/src/text-control/style.scss +0 -126
  285. package/src/utils/index.js +9 -0
  286. package/src/waiting/index.js +7 -18
  287. package/src/waiting/style.scss +9 -20
  288. package/src/web-preview/index.js +13 -34
  289. package/src/web-preview/style.scss +41 -34
  290. package/src/with-wizard/index.js +7 -5
  291. package/src/with-wizard/style.scss +77 -124
  292. package/src/with-wizard-screen/index.js +17 -17
  293. package/src/with-wizard-screen/style.scss +75 -125
  294. package/src/wizard/components/WizardError.js +57 -0
  295. package/src/wizard/index.js +145 -0
  296. package/src/wizard/store/index.js +132 -0
  297. package/src/wizard/store/utils.js +16 -0
  298. package/dist/cjs/wizard-pagination/index.js +0 -71
  299. package/dist/cjs/wizard-pagination/style.scss +0 -74
  300. package/dist/esm/wizard-pagination/index.js +0 -57
  301. package/dist/esm/wizard-pagination/style.scss +0 -74
  302. package/src/button-group/index.js +0 -35
  303. package/src/button-group/style.scss +0 -73
  304. package/src/checkbox-control/index.js +0 -38
  305. package/src/checkbox-control/style.scss +0 -78
  306. package/src/preview-box/index.js +0 -18
  307. package/src/preview-box/style.scss +0 -18
  308. package/src/textarea-control/index.js +0 -32
  309. package/src/textarea-control/style.scss +0 -76
  310. package/src/toggle-control/index.js +0 -38
  311. package/src/toggle-control/style.scss +0 -74
  312. package/src/toggle-group/index.js +0 -43
  313. package/src/toggle-group/style.scss +0 -28
  314. package/src/wizard-pagination/index.js +0 -59
  315. package/src/wizard-pagination/style.scss +0 -74
@@ -7,7 +7,7 @@ import { category } from '@wordpress/icons';
7
7
  /**
8
8
  * Internal dependencies
9
9
  */
10
- import { Button, Handoff, NewspackIcon, Notice, TabbedNavigation, WizardPagination } from '../';
10
+ import { Button, Handoff, NewspackIcon, Notice, HandoffMessage, TabbedNavigation } from '../';
11
11
  import { buttonProps } from '../../../shared/js/';
12
12
  import './style.scss';
13
13
 
@@ -31,9 +31,10 @@ export default function withWizardScreen( WrappedComponent, { hidePrimaryButton
31
31
  tabbedNavigation,
32
32
  secondaryButtonText,
33
33
  secondaryButtonAction,
34
- routes,
35
34
  renderAboveContent,
35
+ disableUpcomingInTabbedNavigation,
36
36
  } = props;
37
+
37
38
  const retrievedButtonProps = buttonProps( buttonAction );
38
39
  const retrievedSecondaryButtonProps = buttonProps( secondaryButtonAction );
39
40
  const SecondaryCTAComponent = retrievedSecondaryButtonProps.plugin ? Handoff : Button;
@@ -58,13 +59,7 @@ export default function withWizardScreen( WrappedComponent, { hidePrimaryButton
58
59
  );
59
60
  return (
60
61
  <>
61
- { newspack_aux_data.is_debug_mode && (
62
- <Notice
63
- isWarning
64
- className="newspack-wizard__above-header"
65
- noticeText={ __( 'Newspack is in debug mode.', 'newspack' ) }
66
- />
67
- ) }
62
+ { newspack_aux_data.is_debug_mode && <Notice debugMode /> }
68
63
  <div className="newspack-wizard__header">
69
64
  <div className="newspack-wizard__header__inner">
70
65
  <div className="newspack-wizard__title">
@@ -78,18 +73,23 @@ export default function withWizardScreen( WrappedComponent, { hidePrimaryButton
78
73
  >
79
74
  <NewspackIcon size={ 36 } />
80
75
  </Button>
81
- { headerText && <h1>{ headerText }</h1> }
82
- { subHeaderText && <p className="screen-reader-text">{ subHeaderText }</p> }
76
+ <div>
77
+ { headerText && <h2>{ headerText }</h2> }
78
+ { subHeaderText && <span>{ subHeaderText }</span> }
79
+ </div>
83
80
  </div>
84
- { tabbedNavigation && (
85
- <>
86
- <TabbedNavigation items={ tabbedNavigation } />
87
- </>
88
- ) }
89
81
  </div>
90
- { routes && <WizardPagination routes={ routes } /> }
91
82
  </div>
92
83
 
84
+ { tabbedNavigation && (
85
+ <TabbedNavigation
86
+ disableUpcoming={ disableUpcomingInTabbedNavigation }
87
+ items={ tabbedNavigation.filter( item => ! item.isHiddenInNav ) }
88
+ />
89
+ ) }
90
+
91
+ <HandoffMessage />
92
+
93
93
  <div className={ classnames( 'newspack-wizard newspack-wizard__content', className ) }>
94
94
  { typeof renderAboveContent === 'function' ? renderAboveContent() : null }
95
95
  { <WrappedComponent { ...props } renderPrimaryButton={ renderPrimaryButton } /> }
@@ -2,25 +2,75 @@
2
2
  * With Wizard Screen
3
3
  */
4
4
 
5
- @import '~@wordpress/base-styles/colors';
6
- @import '../../../shared/scss/colors';
5
+ @use '~@wordpress/base-styles/colors' as wp-colors;
6
+ @use '../../../shared/scss/colors';
7
7
 
8
8
  .newspack-wizard {
9
+ // Color
10
+ --wp-admin-theme-color: #{colors.$primary-500};
11
+ --wp-admin-theme-color--rgb: #{colors.$primary-500--rgb};
12
+ --wp-admin-theme-color-darker-10: #{colors.$primary-600};
13
+ --wp-admin-theme-color-darker-10--rgb: #{colors.$primary-600--rgb};
14
+ --wp-admin-theme-color-darker-20: #{colors.$primary-700};
15
+ --wp-admin-theme-color-darker-20--rgb: #{colors.$primary-700--rgb};
16
+
17
+ color: wp-colors.$gray-900;
18
+
19
+ // Headings
20
+ h1,
21
+ h2,
22
+ h3 {
23
+ color: inherit;
24
+ }
25
+
26
+ h1 {
27
+ line-height: 1.4;
28
+ }
29
+
30
+ // Links
31
+ a {
32
+ color: var( --wp-admin-theme-color );
33
+
34
+ &:active,
35
+ &:focus,
36
+ &:hover {
37
+ color: var( --wp-admin-theme-color-darker-10 );
38
+ }
39
+
40
+ &:focus {
41
+ box-shadow: 0 0 0 var( --wp-admin-border-width-focus ) var( --wp-admin-theme-color );
42
+ outline: 3px solid transparent;
43
+ }
44
+ }
45
+
9
46
  &__header {
10
47
  background: white;
11
48
  }
12
49
 
13
50
  &__title {
14
51
  align-items: center;
15
- border-bottom: 1px solid $gray-300;
52
+ border-bottom: 1px solid wp-colors.$gray-300;
16
53
  display: flex;
17
54
 
18
- h1 {
19
- color: $gray-900;
20
- font-size: 21px;
21
- line-height: 30px;
55
+ h2 {
22
56
  margin: 0;
57
+ padding: 0;
58
+ }
59
+
60
+ > div {
61
+ align-items: baseline;
62
+ display: flex;
23
63
  padding: 0 24px;
64
+
65
+ span {
66
+ color: wp-colors.$gray-700;
67
+ display: none;
68
+ margin-left: 8px;
69
+
70
+ @media screen and ( min-width: 744px ) {
71
+ display: block;
72
+ }
73
+ }
24
74
  }
25
75
 
26
76
  svg {
@@ -33,17 +83,19 @@
33
83
  }
34
84
 
35
85
  &:not( .newspack-icon ) {
36
- background: $primary-500;
86
+ background: colors.$primary-500;
37
87
  left: 50%;
38
- margin: -18px 0 0 -18px !important;
88
+ margin: -28px 0 0 -28px !important;
39
89
  opacity: 0;
90
+ padding: 10px;
40
91
  position: absolute;
41
92
  top: 50%;
42
93
  transition: opacity 125ms ease-in-out;
43
94
  }
44
95
  }
45
96
 
46
- a {
97
+ .components-button.has-icon {
98
+ padding: 0;
47
99
  position: relative;
48
100
 
49
101
  &:hover {
@@ -51,29 +103,23 @@
51
103
  opacity: 1;
52
104
  }
53
105
  }
54
- }
55
106
 
56
- a:focus-visible {
57
- outline: none !important;
107
+ &:focus-visible {
108
+ outline: none !important;
58
109
 
59
- &::before {
60
- border: 2px solid white;
61
- border-radius: 3px;
62
- bottom: 5px;
63
- content: '';
64
- display: block;
65
- left: 6px;
66
- position: absolute;
67
- right: 6px;
68
- top: 6px;
110
+ &::before {
111
+ border: 2px solid white;
112
+ border-radius: 2px;
113
+ content: '';
114
+ display: block;
115
+ inset: 6px 6px 5px;
116
+ position: absolute;
117
+ }
69
118
  }
70
119
  }
71
120
  }
72
121
 
73
122
  &__content {
74
- color: $gray-700;
75
- font-size: 14px;
76
- line-height: 24px;
77
123
  margin: 0 auto;
78
124
  max-width: 1208px;
79
125
  padding: 0 16px;
@@ -84,55 +130,19 @@
84
130
 
85
131
  // Typography
86
132
 
87
- h1,
88
- h2,
89
- h3,
90
- p {
91
- line-height: 24px;
92
- margin: 32px 0;
93
- padding: 0;
94
- }
95
-
96
- h1 {
97
- color: $gray-900;
98
- font-size: 21px;
99
- font-weight: bold;
100
- line-height: 32px;
101
- }
102
-
103
- h2 {
104
- color: $gray-900;
105
- font-size: 17px;
106
- font-weight: bold;
107
- }
108
-
109
- h3 {
110
- color: $gray-900;
111
- font-size: 14px;
112
- font-weight: bold;
113
- }
114
-
115
- p {
116
- font-size: 14px;
117
-
118
- &.is-dark {
119
- color: $gray-900;
120
- }
121
- }
122
-
123
133
  strong {
124
134
  font-weight: bold;
125
135
  }
126
136
 
127
137
  small {
128
138
  font-size: 12px;
129
- line-height: 16px;
139
+ line-height: 1.4;
130
140
  }
131
141
 
132
142
  // Thematic Break
133
143
 
134
144
  hr {
135
- background: $gray-300;
145
+ background: wp-colors.$gray-300;
136
146
  border: 0;
137
147
  height: 1px;
138
148
  margin: 48px 0;
@@ -141,70 +151,10 @@
141
151
  margin: 64px 0;
142
152
  }
143
153
  }
144
-
145
- // Links
146
-
147
- a {
148
- color: $primary-500;
149
-
150
- &:active,
151
- &:focus,
152
- &:hover {
153
- color: $primary-600;
154
- text-decoration: none;
155
- }
156
-
157
- &:focus {
158
- box-shadow: none;
159
- outline: 2px solid $primary-500;
160
- outline-offset: 2px;
161
- }
162
- }
163
154
  }
164
155
 
165
156
  &__above-header {
157
+ border-radius: 0;
166
158
  margin: 0;
167
159
  }
168
160
  }
169
-
170
- // Buttons Card
171
-
172
- .newspack-buttons-card {
173
- display: flex;
174
- flex-direction: row-reverse;
175
- justify-content: flex-start;
176
- align-items: center;
177
- margin: 64px 0 32px;
178
-
179
- &:empty {
180
- display: none;
181
- }
182
-
183
- .newspack-button {
184
- margin-left: 16px;
185
- }
186
- }
187
-
188
- // Checkbox Icon
189
-
190
- .newspack-checkbox-icon {
191
- background: white;
192
- border-radius: 50%;
193
- box-shadow: inset 0 0 0 1px $gray-300;
194
- display: block;
195
- height: 24px;
196
- width: 24px;
197
-
198
- svg {
199
- fill: $gray-700;
200
- }
201
-
202
- &--checked {
203
- background: $alert-green;
204
- box-shadow: none;
205
-
206
- svg {
207
- fill: white;
208
- }
209
- }
210
- }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * WordPress dependencies.
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useSelect } from '@wordpress/data';
6
+
7
+ /**
8
+ * Internal dependencies.
9
+ */
10
+ import { Button, Card, Modal, Notice } from '../..';
11
+ import { WIZARD_STORE_NAMESPACE } from '../store';
12
+
13
+ const parseError = ( { data, message, code } ) => {
14
+ let level = 'fatal';
15
+ if ( !! data && 'level' in data ) {
16
+ level = data.level;
17
+ } else if ( 'rest_invalid_param' === code ) {
18
+ level = 'notice';
19
+ }
20
+ return {
21
+ message,
22
+ level,
23
+ };
24
+ };
25
+
26
+ const WizardError = () => {
27
+ const error = useSelect( select => select( WIZARD_STORE_NAMESPACE ).getError() );
28
+ if ( ! error ) {
29
+ return null;
30
+ }
31
+
32
+ const { level, message } = parseError( error );
33
+ if ( 'fatal' === level ) {
34
+ const fallbackURL = typeof newspack_urls !== 'undefined' && newspack_urls.dashboard;
35
+ return (
36
+ <Modal
37
+ title={ __( 'Unrecoverable error' ) }
38
+ onRequestClose={ fallbackURL ? () => ( window.location = fallbackURL ) : undefined }
39
+ >
40
+ <Notice noticeText={ message } isError rawHTML />
41
+ { fallbackURL && (
42
+ <Card buttonsCard noBorder className="justify-end">
43
+ <Button isPrimary href={ fallbackURL }>
44
+ { __( 'Return to Dashboard', 'newspack' ) }
45
+ </Button>
46
+ </Card>
47
+ ) }
48
+ </Modal>
49
+ );
50
+ }
51
+
52
+ return (
53
+ <Notice isError className="newspack-wizard__above-header" noticeText={ message } rawHTML />
54
+ );
55
+ };
56
+
57
+ export default WizardError;
@@ -0,0 +1,145 @@
1
+ /**
2
+ * External dependencies.
3
+ */
4
+ import classnames from 'classnames';
5
+
6
+ /**
7
+ * WordPress dependencies.
8
+ */
9
+ import { useSelect } from '@wordpress/data';
10
+ import { useState } from '@wordpress/element';
11
+ import { __ } from '@wordpress/i18n';
12
+ import { category } from '@wordpress/icons';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import {
18
+ Footer,
19
+ Notice,
20
+ Button,
21
+ NewspackIcon,
22
+ TabbedNavigation,
23
+ PluginInstaller,
24
+ HandoffMessage,
25
+ } from '../';
26
+ import Router from '../proxied-imports/router';
27
+ import registerStore, { WIZARD_STORE_NAMESPACE } from './store';
28
+ import { useWizardData } from './store/utils';
29
+ import WizardError from './components/WizardError';
30
+
31
+ registerStore();
32
+
33
+ const { HashRouter, Redirect, Route, Switch } = Router;
34
+
35
+ const Wizard = ( {
36
+ sections = [],
37
+ apiSlug,
38
+ headerText,
39
+ subHeaderText,
40
+ hasSimpleFooter,
41
+ className,
42
+ renderAboveSections,
43
+ requiredPlugins = [],
44
+ } ) => {
45
+ const isLoading = useSelect( select => select( WIZARD_STORE_NAMESPACE ).isLoading() );
46
+ const isQuietLoading = useSelect( select => select( WIZARD_STORE_NAMESPACE ).isQuietLoading() );
47
+
48
+ // Trigger initial data fetch. Some sections might not use the wizard data,
49
+ // but for consistency, fetching is triggered regardless of the section.
50
+ useSelect( select => select( WIZARD_STORE_NAMESPACE ).getWizardAPIData( apiSlug ) );
51
+
52
+ let displayedSections = sections.filter( section => ! section.isHidden );
53
+
54
+ const [ pluginRequirementsSatisfied, setPluginRequirementsSatisfied ] = useState(
55
+ requiredPlugins.length === 0
56
+ );
57
+ if ( ! pluginRequirementsSatisfied ) {
58
+ headerText =
59
+ requiredPlugins.length > 1
60
+ ? __( 'Required plugins', 'newspack' )
61
+ : __( 'Required plugin', 'newspack' );
62
+ displayedSections = [
63
+ {
64
+ path: '/',
65
+ render: () => (
66
+ <PluginInstaller
67
+ plugins={ requiredPlugins }
68
+ onStatus={ ( { complete } ) => setPluginRequirementsSatisfied( complete ) }
69
+ />
70
+ ),
71
+ },
72
+ ];
73
+ }
74
+
75
+ return (
76
+ <>
77
+ <div
78
+ className={ classnames(
79
+ isLoading ? 'newspack-wizard__is-loading' : 'newspack-wizard__is-loaded',
80
+ {
81
+ 'newspack-wizard__is-loading-quiet': isQuietLoading,
82
+ }
83
+ ) }
84
+ >
85
+ <HashRouter hashType="slash">
86
+ { newspack_aux_data.is_debug_mode && <Notice debugMode /> }
87
+ <div className="bg-white">
88
+ <div className="newspack-wizard__header__inner">
89
+ <div className="newspack-wizard__title">
90
+ <Button
91
+ isLink
92
+ href={ newspack_urls.dashboard }
93
+ label={ __( 'Return to Dashboard', 'newspack' ) }
94
+ showTooltip={ true }
95
+ icon={ category }
96
+ iconSize={ 36 }
97
+ >
98
+ <NewspackIcon size={ 36 } />
99
+ </Button>
100
+ <div>
101
+ { headerText && <h2>{ headerText }</h2> }
102
+ { subHeaderText && <span>{ subHeaderText }</span> }
103
+ </div>
104
+ </div>
105
+ </div>
106
+ </div>
107
+
108
+ { displayedSections.length > 1 && (
109
+ <TabbedNavigation items={ displayedSections }>
110
+ <WizardError />
111
+ </TabbedNavigation>
112
+ ) }
113
+ <HandoffMessage />
114
+
115
+ <Switch>
116
+ { displayedSections.map( ( section, index ) => {
117
+ const SectionComponent = section.render;
118
+ return (
119
+ <Route key={ index } path={ section.path }>
120
+ <div
121
+ className={ classnames(
122
+ 'newspack-wizard newspack-wizard__content',
123
+ className
124
+ ) }
125
+ >
126
+ { 'function' === typeof renderAboveSections ? renderAboveSections() : null }
127
+ <SectionComponent />
128
+ </div>
129
+ </Route>
130
+ );
131
+ } ) }
132
+ <Redirect to={ displayedSections[ 0 ].path } />
133
+ </Switch>
134
+ </HashRouter>
135
+ </div>
136
+ { ! isLoading && <Footer simple={ hasSimpleFooter } /> }
137
+ </>
138
+ );
139
+ };
140
+
141
+ Wizard.useWizardData = useWizardData;
142
+
143
+ Wizard.STORE_NAMESPACE = WIZARD_STORE_NAMESPACE;
144
+
145
+ export default Wizard;
@@ -0,0 +1,132 @@
1
+ /**
2
+ * External dependencies.
3
+ */
4
+ import set from 'lodash/set';
5
+ import get from 'lodash/get';
6
+ import isEmpty from 'lodash/isEmpty';
7
+
8
+ /**
9
+ * WordPress dependencies.
10
+ */
11
+ import apiFetch from '@wordpress/api-fetch';
12
+ import { createReduxStore, register, dispatch, select } from '@wordpress/data';
13
+
14
+ import { createAction } from './utils.js';
15
+
16
+ export const WIZARD_STORE_NAMESPACE = 'newspack/wizards';
17
+
18
+ const DEFAULT_STATE = {
19
+ isLoading: true,
20
+ isQuietLoading: false,
21
+ apiData: {},
22
+ error: null,
23
+ };
24
+
25
+ /**
26
+ * wordpress/data does not trigger a component re-render
27
+ * on deep state change (via lodash's set function)
28
+ * unless the state was cloned first.
29
+ */
30
+ const clone = objectToClone => JSON.parse( JSON.stringify( objectToClone ) );
31
+
32
+ const reducer = ( state = DEFAULT_STATE, { type, payload = {} } ) => {
33
+ switch ( type ) {
34
+ case 'START_LOADING_DATA':
35
+ if ( payload.isQuietLoading ) {
36
+ return { ...state, isQuietLoading: true };
37
+ }
38
+ return { ...state, isLoading: true };
39
+ case 'FINISH_LOADING_DATA':
40
+ return { ...state, isLoading: false, isQuietLoading: false };
41
+ case 'SET_API_DATA':
42
+ return set( clone( state ), [ 'apiData', payload.slug ], payload.data );
43
+ case 'UPDATE_WIZARD_SETTINGS':
44
+ return set( clone( state ), [ 'apiData', payload.slug, ...payload.path ], payload.value );
45
+ case 'SET_ERROR':
46
+ return { ...state, error: payload };
47
+ default:
48
+ return state;
49
+ }
50
+ };
51
+
52
+ const actions = {
53
+ // Regular actions.
54
+ startLoadingData: createAction( 'START_LOADING_DATA' ),
55
+ finishLoadingData: createAction( 'FINISH_LOADING_DATA' ),
56
+ fetchFromAPI: createAction( 'FETCH_FROM_API' ),
57
+ setAPIDataForWizard: createAction( 'SET_API_DATA' ),
58
+ updateWizardSettings: createAction( 'UPDATE_WIZARD_SETTINGS' ),
59
+ setError: createAction( 'SET_ERROR' ),
60
+
61
+ // Async actions. These will not show up in Redux devtools.
62
+ *saveWizardSettings( { slug, section = '', payloadPath = false, updatePayload = null } ) {
63
+ // Optionally data can be updated before saving - an immediate update case
64
+ // (without an explicit "save" action).
65
+ if ( updatePayload ) {
66
+ yield actions.updateWizardSettings( { slug, ...updatePayload } );
67
+ }
68
+ const wizardState = select( WIZARD_STORE_NAMESPACE ).getWizardAPIData( slug );
69
+ const updatedData = yield actions.fetchFromAPI( {
70
+ path: `/newspack/v1/wizard/${ slug }/${ section }`,
71
+ method: 'POST',
72
+ data: payloadPath ? get( wizardState, payloadPath ) : wizardState,
73
+ isQuietFetch: true,
74
+ } );
75
+ if ( ! isEmpty( updatedData ) && ! updatedData.error ) {
76
+ return actions.setAPIDataForWizard( { slug, data: updatedData } );
77
+ }
78
+ },
79
+ *wizardApiFetch( fetchConfig ) {
80
+ // Just a proxy to fetchFromAPI, but it has to be a generator.
81
+ const result = yield actions.fetchFromAPI( fetchConfig );
82
+ return result;
83
+ },
84
+ };
85
+
86
+ const selectors = {
87
+ isLoading: state => state.isLoading,
88
+ isQuietLoading: state => state.isQuietLoading,
89
+ getWizardAPIData: ( state, slug ) => state.apiData[ slug ] || {},
90
+ getError: state => state.error,
91
+ };
92
+
93
+ const store = createReduxStore( WIZARD_STORE_NAMESPACE, {
94
+ reducer,
95
+ actions,
96
+ selectors,
97
+
98
+ controls: {
99
+ FETCH_FROM_API: action => {
100
+ dispatch( WIZARD_STORE_NAMESPACE ).startLoadingData( {
101
+ isQuietLoading: Boolean( action.payload.isQuietFetch ),
102
+ } );
103
+ return apiFetch( action.payload )
104
+ .then( data => {
105
+ dispatch( WIZARD_STORE_NAMESPACE ).setError( null );
106
+ return data;
107
+ } )
108
+ .catch( error => {
109
+ dispatch( WIZARD_STORE_NAMESPACE ).setError( error );
110
+ return { error };
111
+ } )
112
+ .finally( result => {
113
+ dispatch( WIZARD_STORE_NAMESPACE ).finishLoadingData();
114
+ return result;
115
+ } );
116
+ },
117
+ },
118
+
119
+ resolvers: {
120
+ *getWizardAPIData( slug ) {
121
+ if ( slug ) {
122
+ const data = yield actions.fetchFromAPI( {
123
+ path: `/newspack/v1/wizard/${ slug }`,
124
+ } );
125
+ return actions.setAPIDataForWizard( { slug, data } );
126
+ }
127
+ return actions.finishLoadingData();
128
+ },
129
+ },
130
+ } );
131
+
132
+ export default () => register( store );
@@ -0,0 +1,16 @@
1
+ /**
2
+ * WordPress dependencies.
3
+ */
4
+ import { useSelect } from '@wordpress/data';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { WIZARD_STORE_NAMESPACE } from '.';
10
+
11
+ export const createAction = type => payload => ( { type, payload } );
12
+
13
+ export const useWizardData = ( wizardName, defaultValue = {} ) =>
14
+ useSelect( select =>
15
+ select( WIZARD_STORE_NAMESPACE ).getWizardAPIData( `newspack-${ wizardName }-wizard` )
16
+ ) || defaultValue;