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
@@ -2,13 +2,12 @@
2
2
  * Card
3
3
  */
4
4
 
5
- @import '../../../shared/scss/colors';
6
- @import '~@wordpress/base-styles/colors';
5
+ @use '~@wordpress/base-styles/colors' as wp-colors;
7
6
 
8
7
  .newspack-card {
9
- border-radius: 3px;
10
- border: 1px solid $gray-300;
11
- color: $gray-700;
8
+ border-radius: 2px;
9
+ border: 1px solid wp-colors.$gray-300;
10
+ color: wp-colors.$gray-900;
12
11
  margin: 32px 0;
13
12
  padding: 16px 48px;
14
13
 
@@ -21,11 +20,8 @@
21
20
  &__buttons-card {
22
21
  display: flex;
23
22
  flex-wrap: wrap;
24
- margin: 32px -8px 16px;
25
-
26
- .newspack-button {
27
- margin: 0 8px 16px;
28
- }
23
+ gap: 16px;
24
+ margin: 32px 0;
29
25
  }
30
26
 
31
27
  // Header Actions Card
@@ -34,6 +30,7 @@
34
30
  align-items: center;
35
31
  display: flex;
36
32
  flex-wrap: wrap;
33
+ gap: 8px;
37
34
  justify-content: space-between;
38
35
  margin-bottom: -16px;
39
36
 
@@ -41,6 +38,23 @@
41
38
  margin-bottom: 0 !important;
42
39
  margin-top: 0 !important;
43
40
  }
41
+
42
+ .newspack-select-control {
43
+ .components-base-control__field {
44
+ margin-bottom: 0;
45
+ }
46
+ }
47
+ }
48
+
49
+ // Is Narrow
50
+
51
+ &__is-narrow {
52
+ margin-left: auto;
53
+ margin-right: auto;
54
+
55
+ @media screen and ( min-width: 608px ) {
56
+ max-width: 576px;
57
+ }
44
58
  }
45
59
 
46
60
  // Is Small
@@ -79,65 +93,48 @@
79
93
  }
80
94
  }
81
95
 
82
- // No Border
96
+ // Is White
83
97
 
84
- &__no-border {
85
- border-radius: 0;
98
+ &__is-white {
99
+ background: white;
86
100
  border: 0;
87
- padding: 0;
88
101
  }
89
102
 
90
- // Typography
103
+ // No Border
91
104
 
92
- h2,
93
- h3,
94
- p {
95
- line-height: 24px;
96
- margin: 32px 0;
105
+ &__no-border {
106
+ border-radius: 0;
107
+ border: 0;
97
108
  padding: 0;
98
109
  }
99
110
 
100
- h2 {
101
- color: $gray-900;
102
- font-size: 17px;
103
- font-weight: bold;
104
- }
111
+ // Margin
105
112
 
106
- h3 {
107
- color: $gray-900;
108
- font-size: 14px;
109
- font-weight: bold;
113
+ &.mt64 {
114
+ margin-top: 64px;
110
115
  }
111
116
 
112
- p {
113
- font-size: 14px;
114
-
115
- &.is-dark {
116
- color: $gray-900;
117
- }
117
+ &.mt16 {
118
+ margin-top: 16px;
118
119
  }
119
120
 
120
- strong {
121
- font-weight: bold;
122
- }
121
+ // Typography
123
122
 
124
123
  small {
125
124
  font-size: 12px;
126
- line-height: 16px;
125
+ line-height: 1.4;
127
126
  }
128
127
 
129
128
  code {
130
- background: $gray-100;
131
- color: $gray-700;
132
- font-size: 12px;
133
- line-height: 16px;
134
- padding: 4px 8px;
129
+ background: wp-colors.$gray-100;
130
+ color: wp-colors.$gray-900;
131
+ padding: 0 0.5em;
135
132
  }
136
133
 
137
134
  // Thematic Break
138
135
 
139
136
  hr {
140
- background: $gray-300;
137
+ background: wp-colors.$gray-300;
141
138
  border: 0;
142
139
  height: 1px;
143
140
  margin: 48px 0;
@@ -150,7 +147,7 @@
150
147
  // Separator
151
148
 
152
149
  .sep {
153
- background: $gray-300;
150
+ background: wp-colors.$gray-300;
154
151
  height: 1px;
155
152
  margin-left: 8px;
156
153
  margin-right: 8px;
@@ -158,27 +155,14 @@
158
155
 
159
156
  &__inline {
160
157
  display: inline-block;
161
- line-height: 24px;
158
+ line-height: 1.5;
162
159
  vertical-align: middle;
163
160
  }
164
161
  }
165
162
 
166
- // Links
167
-
168
- a {
169
- color: $primary-500;
163
+ // Error
170
164
 
171
- &:active,
172
- &:focus,
173
- &:hover {
174
- color: $primary-600;
175
- text-decoration: none;
176
- }
177
-
178
- &:focus {
179
- box-shadow: none;
180
- outline: 2px solid $primary-500;
181
- outline-offset: 2px;
182
- }
165
+ .newspack-error {
166
+ color: wp-colors.$alert-red;
183
167
  }
184
168
  }
@@ -6,6 +6,7 @@
6
6
  * WordPress dependencies.
7
7
  */
8
8
  import apiFetch from '@wordpress/api-fetch';
9
+ import { Spinner } from '@wordpress/components';
9
10
  import { Component } from '@wordpress/element';
10
11
  import { addQueryArgs } from '@wordpress/url';
11
12
 
@@ -18,7 +19,9 @@ import './style.scss';
18
19
  /**
19
20
  * External dependencies
20
21
  */
21
- import { debounce, find } from 'lodash';
22
+ import debounce from 'lodash/debounce';
23
+ import find from 'lodash/find';
24
+ import filter from 'lodash/filter';
22
25
  import classnames from 'classnames';
23
26
 
24
27
  /**
@@ -28,6 +31,7 @@ class CategoryAutocomplete extends Component {
28
31
  state = {
29
32
  suggestions: {},
30
33
  allCategories: {},
34
+ isLoading: false,
31
35
  };
32
36
 
33
37
  /**
@@ -39,12 +43,15 @@ class CategoryAutocomplete extends Component {
39
43
  }
40
44
 
41
45
  componentDidMount() {
46
+ this.setState( { isLoading: true } );
42
47
  apiFetch( {
43
48
  path: addQueryArgs( `/wp/v2/${ this.props.taxonomy }`, {
44
49
  per_page: -1,
45
50
  _fields: 'id,name',
46
51
  } ),
47
- } ).then( categories => this.setState( { allCategories: categories } ) );
52
+ } )
53
+ .then( categories => this.setState( { allCategories: categories } ) )
54
+ .finally( () => this.setState( { isLoading: false } ) );
48
55
  }
49
56
 
50
57
  /**
@@ -60,6 +67,7 @@ class CategoryAutocomplete extends Component {
60
67
  * @param {string} search The typed text to search for.
61
68
  */
62
69
  updateSuggestions( search ) {
70
+ this.setState( { isLoading: true } );
63
71
  apiFetch( {
64
72
  path: addQueryArgs( `/wp/v2/${ this.props.taxonomy }`, {
65
73
  search,
@@ -68,14 +76,16 @@ class CategoryAutocomplete extends Component {
68
76
  orderby: 'count',
69
77
  order: 'desc',
70
78
  } ),
71
- } ).then( categories => {
72
- this.setState( {
73
- suggestions: categories.reduce(
74
- ( accumulator, category ) => ( { ...accumulator, [ category.name ]: category } ),
75
- {}
76
- ),
77
- } );
78
- } );
79
+ } )
80
+ .then( categories => {
81
+ this.setState( {
82
+ suggestions: categories.reduce(
83
+ ( accumulator, category ) => ( { ...accumulator, [ category.name ]: category } ),
84
+ {}
85
+ ),
86
+ } );
87
+ } )
88
+ .finally( () => this.setState( { isLoading: false } ) );
79
89
  }
80
90
 
81
91
  /**
@@ -88,12 +98,29 @@ class CategoryAutocomplete extends Component {
88
98
  const { suggestions } = this.state;
89
99
  // Categories that are already will be objects, while new additions will be strings (the name).
90
100
  // allValues nomalizes the array so that they are all objects.
91
- const allValues = tokens.map( token =>
92
- typeof token === 'string' ? suggestions[ token ] : token
93
- );
101
+ const allValues = tokens
102
+ .filter( token => 'undefined' !== typeof token ) // Ensure each token is a valid value.
103
+ .map( token => ( 'string' === typeof token ? suggestions[ token ] : token ) )
104
+ .filter( Boolean );
94
105
  onChange( allValues );
95
106
  };
96
107
 
108
+ getAvailableSuggestions = () => {
109
+ const { value } = this.props;
110
+ const { suggestions } = this.state;
111
+ const selectedIds = value.reduce( ( acc, item ) => {
112
+ if ( item?.id ) {
113
+ acc.push( item.id );
114
+ }
115
+ return acc;
116
+ }, [] );
117
+ const availableSuggestions = filter(
118
+ suggestions,
119
+ ( { id } ) => selectedIds.indexOf( id ) === -1
120
+ );
121
+ return availableSuggestions.map( v => v.name );
122
+ };
123
+
97
124
  /**
98
125
  * Render the component.
99
126
  */
@@ -107,21 +134,24 @@ class CategoryAutocomplete extends Component {
107
134
  label,
108
135
  value,
109
136
  } = this.props;
110
- const { suggestions, allCategories } = this.state;
137
+ const { allCategories, isLoading } = this.state;
111
138
  const classes = classnames( 'newspack-category-autocomplete', className );
112
139
  return (
113
140
  <div className={ classes }>
114
141
  <FormTokenField
115
142
  onInputChange={ input => this.debouncedUpdateSuggestions( input ) }
116
143
  value={ value.reduce( ( acc, item ) => {
117
- const category =
144
+ const categoryOrItem =
118
145
  typeof item === 'number' ? find( allCategories, [ 'id', item ] ) : item;
119
- if ( category ) {
120
- acc.push( { id: category.term_id || category.id, value: category.name } );
146
+ if ( categoryOrItem ) {
147
+ acc.push( {
148
+ id: categoryOrItem.term_id || categoryOrItem.id,
149
+ value: categoryOrItem.value || categoryOrItem.name,
150
+ } );
121
151
  }
122
152
  return acc;
123
153
  }, [] ) }
124
- suggestions={ Object.keys( suggestions ) }
154
+ suggestions={ this.getAvailableSuggestions() }
125
155
  onChange={ this.handleOnChange }
126
156
  label={ label }
127
157
  disabled={ disabled }
@@ -129,6 +159,11 @@ class CategoryAutocomplete extends Component {
129
159
  hideHelpFromVision={ hideHelpFromVision }
130
160
  hideLabelFromVision={ hideLabelFromVision }
131
161
  />
162
+ { isLoading ? (
163
+ <span className="newspack-category-autocomplete__suggestions-spinner">
164
+ <Spinner />
165
+ </span>
166
+ ) : null }
132
167
  </div>
133
168
  );
134
169
  }
@@ -2,37 +2,33 @@
2
2
  * Category Autocomplete
3
3
  */
4
4
 
5
- @import '../../../shared/scss/colors';
6
-
7
5
  .newspack-category-autocomplete {
6
+ position: relative;
7
+
8
8
  .components-form-token-field__help {
9
9
  display: none;
10
10
  }
11
11
 
12
- .components-button:focus:not( :disabled ) {
13
- box-shadow: inset 0 0 0 2px $primary-500;
14
- }
15
-
16
- // Multiple Select Controls
17
-
18
- & + & {
19
- margin-bottom: 32px;
20
- margin-top: -16px;
21
- }
22
-
23
- // Multiple Controls
24
-
25
- + .newspack-select-control,
26
- + .newspack-text-control,
27
- + .newspack-textarea-control,
28
- + .newspack-toggle-control {
29
- margin-bottom: 32px;
30
- margin-top: -16px;
31
- }
32
-
33
12
  // Within a Grid
34
13
 
35
- .newspack-grid & .newspack-form-token-field {
14
+ .newspack-grid & .newspack-form-token-field__input-container {
36
15
  margin: 0;
37
16
  }
17
+
18
+ // Loading state spinner
19
+ &__suggestions-spinner {
20
+ position: absolute;
21
+ right: 1px;
22
+ top: calc( 1.4em + 8px );
23
+ z-index: 2;
24
+
25
+ [class*='--label-hidden'] + & {
26
+ top: 0;
27
+ }
28
+
29
+ .components-spinner {
30
+ display: block;
31
+ margin: 7px;
32
+ }
33
+ }
38
34
  }
@@ -3,12 +3,13 @@
3
3
  */
4
4
  import { ColorPicker as ColorPickerComponent } from '@wordpress/components';
5
5
  import { useState, useRef } from '@wordpress/element';
6
- import { Icon, chevronDown } from '@wordpress/icons';
7
6
 
8
7
  /**
9
8
  * External dependencies.
10
9
  */
11
10
  import classnames from 'classnames';
11
+ import { colord, extend } from 'colord';
12
+ import a11yPlugin from 'colord/plugins/a11y';
12
13
 
13
14
  /**
14
15
  * Internal dependencies.
@@ -17,40 +18,33 @@ import hooks from '../hooks';
17
18
  import utils from '../utils';
18
19
  import './style.scss';
19
20
 
21
+ extend( [ a11yPlugin ] );
20
22
  const { InteractiveDiv } = utils;
21
23
 
22
24
  const ColorPicker = ( { label, color = '#fff', onChange, className } ) => {
23
25
  const [ isExpanded, setIsExpanded ] = useState( false );
24
26
  const ref = useRef();
27
+ const colordColor = colord( color );
25
28
  hooks.useOnClickOutside( ref, () => setIsExpanded( false ) );
26
29
  return (
27
30
  <div className={ classnames( 'newspack-color-picker', className ) }>
28
31
  <div className="newspack-color-picker__label">{ label }</div>
32
+
33
+ <InteractiveDiv
34
+ className={ 'newspack-color-picker__expander' }
35
+ onClick={ () => setIsExpanded( ! isExpanded ) }
36
+ style={ {
37
+ backgroundColor: color,
38
+ color: colordColor.contrast() > colordColor.contrast( '#000' ) ? '#fff' : '#000',
39
+ } }
40
+ >
41
+ { color }
42
+ </InteractiveDiv>
43
+
29
44
  <div className="newspack-color-picker__main" ref={ ref }>
30
- <InteractiveDiv
31
- className={ classnames( 'newspack-color-picker__expander', {
32
- 'newspack-color-picker__expander--expanded': isExpanded,
33
- } ) }
34
- onClick={ () => setIsExpanded( ! isExpanded ) }
35
- >
36
- <div>
37
- <div
38
- className="newspack-color-picker__indicator"
39
- style={ { backgroundColor: color } }
40
- />
41
- <div>{ color }</div>
42
- </div>
43
- <Icon
44
- icon={ chevronDown }
45
- size={ 18 }
46
- style={ isExpanded ? { transform: 'rotate(180deg)' } : {} }
47
- />
48
- </InteractiveDiv>
49
45
  { isExpanded && (
50
46
  <ColorPickerComponent
51
47
  color={ color }
52
- onChangeComplete={ ( { hex } ) => onChange( hex ) } // Prop will be deprecated in favor of onChange, which expects a string hex value.
53
- disableAlpha // Prop will be deprecated in favor of enableAlpha, which behaves in the opposite manner.
54
48
  onChange={ hex => onChange( hex ) }
55
49
  enableAlpha={ false }
56
50
  />
@@ -2,179 +2,36 @@
2
2
  * Color Picker
3
3
  */
4
4
 
5
- @import '../../../shared/scss/colors';
6
- @import '~@wordpress/base-styles/colors';
7
-
8
5
  .newspack-color-picker {
9
6
  position: relative;
10
- margin: 32px 0;
11
-
12
- &__main {
13
- height: 48px;
14
- }
15
- &__expander {
16
- padding: 11px 3px;
17
- justify-content: space-between;
18
- &,
19
- > div {
20
- display: flex;
21
- align-items: center;
22
- }
23
- > div {
24
- margin: 0 4px;
25
- }
26
- div + div {
27
- margin-left: 8px;
28
- }
29
- &:focus {
30
- border-color: $primary-500;
31
- box-shadow: inset 0 0 0 2px $primary-500;
32
- }
33
- &--expanded:focus {
34
- border-bottom-color: white;
35
- box-shadow: inset 2px 2px 0 0 $primary-500, inset -2px 2px 0 0 $primary-500;
36
-
37
- + .components-color-picker {
38
- position: relative;
39
- border-bottom-color: $primary-500;
40
- border-left-color: $primary-500;
41
- border-right-color: $primary-500;
42
- box-shadow: inset 2px -2px 0 0 $primary-500, inset -2px -2px 0 0 $primary-500;
43
7
 
44
- &::before,
45
- &::after {
46
- background: $primary-500;
47
- display: block;
48
- content: '';
49
- height: 1px;
50
- left: -1px;
51
- position: absolute;
52
- top: -1px;
53
- width: 3px;
54
- }
55
-
56
- &::after {
57
- left: auto;
58
- right: -1px;
59
- }
60
- }
61
- }
62
- }
63
- &__indicator {
64
- border: 1px solid rgba( black, 0.125 );
65
- border-radius: 50%;
66
- height: 24px;
67
- overflow: hidden;
68
- width: 24px;
69
- }
70
8
  &__label {
71
- align-items: center;
72
- color: $gray-900;
73
- display: flex;
74
- font-weight: bold;
75
- }
76
-
77
- &__expander,
78
- .components-color-picker {
79
- background-color: white;
80
- border: 1px solid $gray-300;
81
- border-radius: 3px;
82
- &--expanded {
83
- border-bottom-color: white;
84
- border-bottom-left-radius: 0;
85
- border-bottom-right-radius: 0;
86
- }
87
- }
88
- .components-color-picker {
89
- padding: 8px;
90
- position: relative;
91
- z-index: 1;
92
- padding-top: 0;
93
- border-top: none;
94
- border-top-left-radius: 0;
95
- border-top-right-radius: 0;
96
- }
97
-
98
- // Overrides of @wordpress/components component
99
-
100
- // Inputs
101
-
102
- .components-color-picker__body {
103
- padding: 16px 0 0;
104
- }
105
-
106
- .components-color-picker__inputs-wrapper {
107
- margin: 0;
108
- }
109
-
110
- .components-color-picker__inputs-fields {
111
- margin-right: 8px;
9
+ margin-bottom: 8px;
112
10
  }
113
11
 
114
- .components-color-picker__inputs-field {
115
- color: $gray-700;
116
- font-size: 14px;
117
- line-height: 24px;
118
- margin: 0;
119
-
120
- + .components-color-picker__inputs-field {
121
- margin-left: 8px;
122
- }
123
-
124
- label {
125
- color: $gray-900;
126
- font-size: inherit;
127
- font-weight: bold;
128
- line-height: inherit;
129
- margin: 0;
130
- }
131
-
132
- input[type='number'],
133
- input[type='text'] {
134
- background: white;
135
- border: 1px solid $gray-300;
136
- border-radius: 3px;
137
- box-shadow: none;
138
- color: inherit;
139
- font-size: 16px;
140
- line-height: inherit;
141
- margin: 0;
142
- min-height: 48px;
143
- padding: 11px 8px;
144
- transition: border-color 125ms ease-in-out, box-shadow 125ms ease-in-out;
145
- width: 100%;
146
-
147
- @media screen and ( min-width: 768px ) {
148
- font-size: inherit;
149
- }
150
-
151
- &:focus {
152
- border-color: $primary-500;
153
- box-shadow: 0 0 0 2px $primary-500;
154
- }
155
- }
156
-
157
- // Reset
12
+ &__expander {
13
+ box-shadow: inset 0 0 0 1px rgb( 0 0 0 / 20% );
14
+ border-radius: 2px;
15
+ height: 64px;
16
+ padding: 12px;
17
+ text-align: right;
18
+ text-transform: uppercase;
158
19
 
159
- .components-base-control__field,
160
- .components-base-control__label {
161
- display: block;
162
- margin: 0;
20
+ &:focus-visible {
21
+ box-shadow: 0 0 0 var( --wp-admin-border-width-focus ) var( --wp-admin-theme-color );
22
+ border-color: white;
163
23
  }
164
24
  }
165
25
 
166
- .components-color-picker__inputs-toggle {
167
- height: 36px;
168
- margin-bottom: 6px;
169
-
170
- &:active,
171
- &:focus:not( :disabled ),
172
- &:hover {
173
- color: $primary-500;
174
- }
175
-
176
- &:focus:not( :disabled ) {
177
- box-shadow: 0 0 0 3px $primary-500;
26
+ &__main {
27
+ background: white;
28
+ box-shadow: 0 0 8px 4px rgba( black, 0.08 );
29
+ margin: 12px 0;
30
+ position: absolute;
31
+ z-index: 2;
32
+
33
+ &:empty {
34
+ display: none;
178
35
  }
179
36
  }
180
37
  }
package/src/consts.js CHANGED
@@ -1,2 +1,3 @@
1
- export const NEWSPACK_SITE_URL = 'https://newspack.pub';
1
+ export const NEWSPACK_SITE_URL = 'https://newspack.com';
2
2
  export const NEWSPACK_SUPPORT_URL = `${ NEWSPACK_SITE_URL }/support`;
3
+ export const HANDOFF_KEY = 'newspack_wizard_handoff_message';