newspack-components 2.0.3 → 2.1.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 (248) hide show
  1. package/copy-styles.js +1 -1
  2. package/dist/cjs/action-card/index.js +29 -20
  3. package/dist/cjs/action-card/style.scss +52 -27
  4. package/dist/cjs/autocomplete-tokenfield/style.scss +4 -4
  5. package/dist/cjs/autocomplete-with-suggestions/index.js +3 -2
  6. package/dist/cjs/autocomplete-with-suggestions/style.scss +19 -20
  7. package/dist/cjs/button/index.js +2 -13
  8. package/dist/cjs/button/style.scss +3 -344
  9. package/dist/cjs/button-card/index.js +11 -6
  10. package/dist/cjs/button-card/style.scss +60 -30
  11. package/dist/cjs/card/index.js +3 -1
  12. package/dist/cjs/card/style.scss +29 -62
  13. package/dist/cjs/category-autocomplete/index.js +52 -13
  14. package/dist/cjs/category-autocomplete/style.scss +20 -22
  15. package/dist/cjs/color-picker/index.js +17 -35
  16. package/dist/cjs/color-picker/style.scss +20 -160
  17. package/dist/cjs/custom-select-control/style.scss +12 -42
  18. package/dist/cjs/footer/index.js +21 -7
  19. package/dist/cjs/footer/style.scss +9 -10
  20. package/dist/cjs/form-token-field/index.js +2 -2
  21. package/dist/cjs/form-token-field/style.scss +8 -103
  22. package/dist/cjs/global-notices/index.js +2 -1
  23. package/dist/cjs/grid/style.scss +14 -1
  24. package/dist/cjs/handoff/index.js +7 -7
  25. package/dist/cjs/image-upload/index.js +1 -1
  26. package/dist/cjs/image-upload/style.scss +10 -11
  27. package/dist/cjs/index.js +7 -53
  28. package/dist/cjs/modal/index.js +0 -3
  29. package/dist/cjs/modal/style.scss +19 -131
  30. package/dist/cjs/newspack-icon/index.js +4 -2
  31. package/dist/cjs/newspack-icon/style.scss +15 -0
  32. package/dist/cjs/notice/index.js +8 -9
  33. package/dist/cjs/notice/style.scss +38 -10
  34. package/dist/cjs/plugin-installer/index.js +1 -1
  35. package/dist/cjs/plugin-settings/SettingsSection.js +74 -43
  36. package/dist/cjs/plugin-settings/index.js +34 -30
  37. package/dist/cjs/plugin-settings/style.scss +7 -0
  38. package/dist/cjs/plugin-toggle/index.js +22 -1
  39. package/dist/cjs/popover/style.scss +2 -2
  40. package/dist/cjs/radio-control/style.scss +1 -2
  41. package/dist/cjs/section-header/index.js +18 -5
  42. package/dist/cjs/section-header/style.scss +22 -1
  43. package/dist/cjs/select-control/ButtonGroupControl.js +8 -8
  44. package/dist/cjs/select-control/GroupedSelectControl.js +33 -30
  45. package/dist/cjs/select-control/index.js +1 -2
  46. package/dist/cjs/select-control/style.scss +46 -87
  47. package/dist/cjs/settings/MinMaxSetting.js +4 -2
  48. package/dist/cjs/settings/SettingsCard.js +6 -1
  49. package/dist/cjs/settings/SettingsSection.js +4 -4
  50. package/dist/cjs/settings/style.scss +32 -4
  51. package/dist/cjs/style-card/index.js +10 -6
  52. package/dist/cjs/style-card/style.scss +12 -8
  53. package/dist/cjs/style.scss +44 -0
  54. package/dist/cjs/tabbed-navigation/index.js +13 -20
  55. package/dist/cjs/tabbed-navigation/style.scss +56 -34
  56. package/dist/cjs/text-control/index.js +0 -3
  57. package/dist/cjs/text-control/style.scss +0 -126
  58. package/dist/cjs/waiting/index.js +9 -25
  59. package/dist/cjs/waiting/style.scss +9 -20
  60. package/dist/cjs/web-preview/index.js +18 -30
  61. package/dist/cjs/web-preview/style.scss +33 -26
  62. package/dist/cjs/with-wizard/index.js +4 -2
  63. package/dist/cjs/with-wizard/style.scss +44 -89
  64. package/dist/cjs/with-wizard-screen/index.js +17 -21
  65. package/dist/cjs/with-wizard-screen/style.scss +74 -121
  66. package/dist/cjs/wizard/components/WizardError.js +86 -0
  67. package/dist/cjs/wizard/index.js +145 -0
  68. package/dist/cjs/wizard/store/index.js +178 -0
  69. package/dist/cjs/wizard/store/utils.js +31 -0
  70. package/dist/esm/action-card/index.js +30 -21
  71. package/dist/esm/action-card/style.scss +52 -27
  72. package/dist/esm/autocomplete-tokenfield/style.scss +4 -4
  73. package/dist/esm/autocomplete-with-suggestions/index.js +3 -2
  74. package/dist/esm/autocomplete-with-suggestions/style.scss +19 -20
  75. package/dist/esm/button/index.js +2 -12
  76. package/dist/esm/button/style.scss +3 -344
  77. package/dist/esm/button-card/index.js +10 -6
  78. package/dist/esm/button-card/style.scss +60 -30
  79. package/dist/esm/card/index.js +3 -1
  80. package/dist/esm/card/style.scss +29 -62
  81. package/dist/esm/category-autocomplete/index.js +54 -14
  82. package/dist/esm/category-autocomplete/style.scss +20 -22
  83. package/dist/esm/color-picker/index.js +15 -34
  84. package/dist/esm/color-picker/style.scss +20 -160
  85. package/dist/esm/custom-select-control/style.scss +12 -42
  86. package/dist/esm/footer/index.js +21 -7
  87. package/dist/esm/footer/style.scss +9 -10
  88. package/dist/esm/form-token-field/index.js +2 -2
  89. package/dist/esm/form-token-field/style.scss +8 -103
  90. package/dist/esm/global-notices/index.js +2 -1
  91. package/dist/esm/grid/style.scss +14 -1
  92. package/dist/esm/handoff/index.js +7 -7
  93. package/dist/esm/image-upload/index.js +1 -1
  94. package/dist/esm/image-upload/style.scss +10 -11
  95. package/dist/esm/index.js +3 -8
  96. package/dist/esm/modal/index.js +0 -3
  97. package/dist/esm/modal/style.scss +19 -131
  98. package/dist/esm/newspack-icon/index.js +4 -2
  99. package/dist/esm/newspack-icon/style.scss +15 -0
  100. package/dist/esm/notice/index.js +8 -3
  101. package/dist/esm/notice/style.scss +38 -10
  102. package/dist/esm/plugin-installer/index.js +2 -1
  103. package/dist/esm/plugin-settings/SettingsSection.js +72 -44
  104. package/dist/esm/plugin-settings/index.js +34 -30
  105. package/dist/esm/plugin-settings/style.scss +7 -0
  106. package/dist/esm/plugin-toggle/index.js +23 -1
  107. package/dist/esm/popover/style.scss +2 -2
  108. package/dist/esm/radio-control/style.scss +1 -2
  109. package/dist/esm/section-header/index.js +17 -5
  110. package/dist/esm/section-header/style.scss +22 -1
  111. package/dist/esm/select-control/ButtonGroupControl.js +8 -8
  112. package/dist/esm/select-control/GroupedSelectControl.js +33 -30
  113. package/dist/esm/select-control/index.js +1 -2
  114. package/dist/esm/select-control/style.scss +46 -87
  115. package/dist/esm/settings/MinMaxSetting.js +3 -2
  116. package/dist/esm/settings/SettingsCard.js +6 -1
  117. package/dist/esm/settings/SettingsSection.js +5 -5
  118. package/dist/esm/settings/style.scss +32 -4
  119. package/dist/esm/style-card/index.js +11 -8
  120. package/dist/esm/style-card/style.scss +12 -8
  121. package/dist/esm/style.scss +44 -0
  122. package/dist/esm/tabbed-navigation/index.js +14 -22
  123. package/dist/esm/tabbed-navigation/style.scss +56 -34
  124. package/dist/esm/text-control/index.js +0 -3
  125. package/dist/esm/text-control/style.scss +0 -126
  126. package/dist/esm/waiting/index.js +9 -22
  127. package/dist/esm/waiting/style.scss +9 -20
  128. package/dist/esm/web-preview/index.js +12 -25
  129. package/dist/esm/web-preview/style.scss +33 -26
  130. package/dist/esm/with-wizard/index.js +4 -2
  131. package/dist/esm/with-wizard/style.scss +44 -89
  132. package/dist/esm/with-wizard-screen/index.js +18 -22
  133. package/dist/esm/with-wizard-screen/style.scss +74 -121
  134. package/dist/esm/wizard/components/WizardError.js +78 -0
  135. package/dist/esm/wizard/index.js +128 -0
  136. package/dist/esm/wizard/store/index.js +161 -0
  137. package/dist/esm/wizard/store/utils.js +17 -0
  138. package/package.json +1 -1
  139. package/shared/scss/_colors.scss +15 -0
  140. package/src/action-card/index.js +28 -18
  141. package/src/action-card/style.scss +52 -27
  142. package/src/autocomplete-tokenfield/style.scss +4 -4
  143. package/src/autocomplete-with-suggestions/index.js +4 -2
  144. package/src/autocomplete-with-suggestions/style.scss +19 -20
  145. package/src/button/index.js +2 -9
  146. package/src/button/style.scss +3 -344
  147. package/src/button-card/index.js +19 -5
  148. package/src/button-card/style.scss +60 -30
  149. package/src/card/index.js +4 -0
  150. package/src/card/style.scss +29 -62
  151. package/src/category-autocomplete/index.js +51 -18
  152. package/src/category-autocomplete/style.scss +20 -22
  153. package/src/color-picker/index.js +16 -22
  154. package/src/color-picker/style.scss +20 -160
  155. package/src/custom-select-control/style.scss +12 -42
  156. package/src/footer/index.js +19 -8
  157. package/src/footer/style.scss +9 -10
  158. package/src/form-token-field/index.js +1 -1
  159. package/src/form-token-field/style.scss +8 -103
  160. package/src/global-notices/index.js +1 -1
  161. package/src/grid/style.scss +14 -1
  162. package/src/handoff/index.js +7 -7
  163. package/src/image-upload/style.scss +10 -11
  164. package/src/index.js +3 -7
  165. package/src/modal/index.js +2 -5
  166. package/src/modal/style.scss +19 -131
  167. package/src/newspack-icon/index.js +7 -2
  168. package/src/newspack-icon/style.scss +15 -0
  169. package/src/notice/index.js +7 -1
  170. package/src/notice/style.scss +38 -10
  171. package/src/plugin-installer/index.js +2 -2
  172. package/src/plugin-settings/SettingsSection.js +64 -26
  173. package/src/plugin-settings/index.js +23 -7
  174. package/src/plugin-settings/style.scss +7 -0
  175. package/src/plugin-toggle/index.js +35 -9
  176. package/src/popover/style.scss +2 -2
  177. package/src/radio-control/style.scss +1 -2
  178. package/src/section-header/index.js +25 -6
  179. package/src/section-header/style.scss +22 -1
  180. package/src/select-control/ButtonGroupControl.js +13 -6
  181. package/src/select-control/GroupedSelectControl.js +26 -24
  182. package/src/select-control/index.js +1 -2
  183. package/src/select-control/style.scss +46 -87
  184. package/src/settings/MinMaxSetting.js +2 -1
  185. package/src/settings/SettingsCard.js +9 -7
  186. package/src/settings/SettingsSection.js +4 -4
  187. package/src/settings/style.scss +32 -4
  188. package/src/style-card/index.js +14 -16
  189. package/src/style-card/style.scss +12 -8
  190. package/src/style.scss +44 -0
  191. package/src/tabbed-navigation/index.js +12 -24
  192. package/src/tabbed-navigation/style.scss +56 -34
  193. package/src/text-control/index.js +1 -2
  194. package/src/text-control/style.scss +0 -126
  195. package/src/waiting/index.js +7 -18
  196. package/src/waiting/style.scss +9 -20
  197. package/src/web-preview/index.js +12 -33
  198. package/src/web-preview/style.scss +33 -26
  199. package/src/with-wizard/index.js +7 -5
  200. package/src/with-wizard/style.scss +44 -89
  201. package/src/with-wizard-screen/index.js +14 -17
  202. package/src/with-wizard-screen/style.scss +74 -121
  203. package/src/wizard/components/WizardError.js +57 -0
  204. package/src/wizard/index.js +133 -0
  205. package/src/wizard/store/index.js +126 -0
  206. package/src/wizard/store/utils.js +16 -0
  207. package/dist/cjs/button-group/index.js +0 -57
  208. package/dist/cjs/button-group/style.scss +0 -73
  209. package/dist/cjs/checkbox-control/index.js +0 -63
  210. package/dist/cjs/checkbox-control/style.scss +0 -78
  211. package/dist/cjs/preview-box/index.js +0 -36
  212. package/dist/cjs/preview-box/style.scss +0 -18
  213. package/dist/cjs/textarea-control/index.js +0 -54
  214. package/dist/cjs/textarea-control/style.scss +0 -76
  215. package/dist/cjs/toggle-control/index.js +0 -58
  216. package/dist/cjs/toggle-control/style.scss +0 -74
  217. package/dist/cjs/toggle-group/index.js +0 -71
  218. package/dist/cjs/toggle-group/style.scss +0 -28
  219. package/dist/cjs/wizard-pagination/index.js +0 -71
  220. package/dist/cjs/wizard-pagination/style.scss +0 -74
  221. package/dist/esm/button-group/index.js +0 -43
  222. package/dist/esm/button-group/style.scss +0 -73
  223. package/dist/esm/checkbox-control/index.js +0 -49
  224. package/dist/esm/checkbox-control/style.scss +0 -78
  225. package/dist/esm/preview-box/index.js +0 -30
  226. package/dist/esm/preview-box/style.scss +0 -18
  227. package/dist/esm/textarea-control/index.js +0 -40
  228. package/dist/esm/textarea-control/style.scss +0 -76
  229. package/dist/esm/toggle-control/index.js +0 -44
  230. package/dist/esm/toggle-control/style.scss +0 -74
  231. package/dist/esm/toggle-group/index.js +0 -58
  232. package/dist/esm/toggle-group/style.scss +0 -28
  233. package/dist/esm/wizard-pagination/index.js +0 -57
  234. package/dist/esm/wizard-pagination/style.scss +0 -74
  235. package/src/button-group/index.js +0 -35
  236. package/src/button-group/style.scss +0 -73
  237. package/src/checkbox-control/index.js +0 -38
  238. package/src/checkbox-control/style.scss +0 -78
  239. package/src/preview-box/index.js +0 -18
  240. package/src/preview-box/style.scss +0 -18
  241. package/src/textarea-control/index.js +0 -32
  242. package/src/textarea-control/style.scss +0 -76
  243. package/src/toggle-control/index.js +0 -38
  244. package/src/toggle-control/style.scss +0 -74
  245. package/src/toggle-group/index.js +0 -43
  246. package/src/toggle-group/style.scss +0 -28
  247. package/src/wizard-pagination/index.js +0 -59
  248. package/src/wizard-pagination/style.scss +0 -74
@@ -2,17 +2,18 @@
2
2
  * Button Card
3
3
  */
4
4
 
5
- @import '../../../shared/scss/colors';
6
5
  @import '~@wordpress/base-styles/colors';
7
6
 
8
7
  .newspack-button-card {
9
- border-radius: 3px;
8
+ background: white;
9
+ border-radius: 2px;
10
10
  border: 1px solid $gray-300;
11
- box-shadow: inset 0 0 0 2px transparent;
11
+ box-shadow: inset 0 0 0 var( --wp-admin-border-width-focus ) transparent;
12
12
  cursor: pointer;
13
13
  display: block;
14
14
  margin: 32px 0;
15
15
  padding: 32px;
16
+ position: relative;
16
17
  text-decoration: none;
17
18
  transition: background-color 125ms ease-in-out, border-color 125ms ease-in-out,
18
19
  box-shadow 125ms ease-in-out;
@@ -20,43 +21,41 @@
20
21
  &:focus,
21
22
  &.is-pressed {
22
23
  background: white;
23
- border-color: $primary-500;
24
- box-shadow: inset 0 0 0 2px $primary-500 !important;
24
+ border-color: var( --wp-admin-theme-color );
25
+ box-shadow: inset 0 0 0 1px var( --wp-admin-theme-color ) !important;
25
26
  outline: none !important;
26
- position: relative;
27
+ z-index: 1;
27
28
  }
28
29
 
29
30
  &.is-pressed:focus-visible {
30
- box-shadow: inset 0 0 0 2px $primary-500, 0 0 0 1px white, 0 0 0 2px $primary-500 !important;
31
+ box-shadow: inset 0 0 0 1px var( --wp-admin-theme-color ), 0 0 0 1px white,
32
+ 0 0 0 var( --wp-admin-border-width-focus ) var( --wp-admin-theme-color ) !important;
31
33
  }
32
34
 
33
35
  &:active,
34
36
  &:hover {
35
- background-color: $gray-100;
36
- color: $primary-600;
37
+ border-color: var( --wp-admin-theme-color );
38
+ color: var( --wp-admin-theme-color );
37
39
  text-decoration: none;
40
+ z-index: 1;
38
41
 
39
- .title,
40
- .desc {
42
+ .newspack-grid h3,
43
+ p {
41
44
  color: inherit;
42
45
  }
43
46
  }
44
47
 
45
- .title,
46
- .desc {
47
- line-height: 24px;
48
+ .newspack-grid h3,
49
+ p {
48
50
  transition: color 125ms ease-in-out;
49
51
  }
50
52
 
51
- .title {
53
+ .newspack-grid h3 {
52
54
  color: $gray-900;
53
- font-size: 17px;
54
- font-weight: bold;
55
55
  }
56
56
 
57
- .desc {
57
+ p {
58
58
  color: $gray-700;
59
- font-size: 14px;
60
59
  }
61
60
 
62
61
  // Grouped
@@ -69,13 +68,13 @@
69
68
  }
70
69
 
71
70
  &.br--bottom {
72
- border-bottom-left-radius: 3px;
73
- border-bottom-right-radius: 3px;
71
+ border-bottom-left-radius: 2px;
72
+ border-bottom-right-radius: 2px;
74
73
  }
75
74
 
76
75
  &.br--top {
77
- border-top-left-radius: 3px;
78
- border-top-right-radius: 3px;
76
+ border-top-left-radius: 2px;
77
+ border-top-right-radius: 2px;
79
78
  }
80
79
  }
81
80
 
@@ -96,7 +95,7 @@
96
95
  }
97
96
 
98
97
  svg {
99
- fill: $primary-500;
98
+ fill: var( --wp-admin-theme-color );
100
99
  transition: fill 125ms ease-in-out;
101
100
  }
102
101
  }
@@ -116,8 +115,6 @@
116
115
 
117
116
  &.has-chevron,
118
117
  &.has-icon {
119
- grid-gap: 8px;
120
-
121
118
  svg {
122
119
  height: 24px;
123
120
  width: 24px;
@@ -132,13 +129,46 @@
132
129
  }
133
130
  }
134
131
 
135
- .title {
136
- font-size: 14px;
132
+ h3 {
133
+ font-size: 1em;
134
+ line-height: 1.5;
137
135
  }
138
136
 
139
- .desc {
137
+ p {
140
138
  font-size: 12px;
141
- line-height: 16px;
139
+ line-height: 1.4;
140
+ }
141
+ }
142
+
143
+ // Is Destructive
144
+
145
+ &.is-destructive {
146
+ .title {
147
+ color: $alert-red;
148
+ }
149
+
150
+ &.has-chevron,
151
+ &.has-icon {
152
+ svg {
153
+ fill: $alert-red;
154
+ }
155
+ }
156
+
157
+ &:focus,
158
+ &.is-pressed {
159
+ border-color: $alert-red;
160
+ box-shadow: inset 0 0 0 1px $alert-red !important;
161
+ }
162
+
163
+ &.is-pressed:focus-visible {
164
+ box-shadow: inset 0 0 0 1px $alert-red, 0 0 0 1px white,
165
+ 0 0 0 var( --wp-admin-border-width-focus ) $alert-red !important;
166
+ }
167
+
168
+ &:active,
169
+ &:hover {
170
+ background-color: $gray-100;
171
+ border-color: $alert-red;
142
172
  }
143
173
  }
144
174
  }
package/src/card/index.js CHANGED
@@ -26,8 +26,10 @@ class Card extends Component {
26
26
  buttonsCard,
27
27
  className,
28
28
  headerActions,
29
+ isNarrow,
29
30
  isMedium,
30
31
  isSmall,
32
+ isWhite,
31
33
  noBorder,
32
34
  ...otherProps
33
35
  } = this.props;
@@ -37,7 +39,9 @@ class Card extends Component {
37
39
  buttonsCard && 'newspack-card__buttons-card',
38
40
  headerActions && 'newspack-card__header-actions',
39
41
  isMedium && 'newspack-card__is-medium',
42
+ isNarrow && 'newspack-card__is-narrow',
40
43
  isSmall && 'newspack-card__is-small',
44
+ isWhite && 'newspack-card__is-white',
41
45
  noBorder && 'newspack-card__no-border'
42
46
  );
43
47
  return <div className={ classes } { ...otherProps } />;
@@ -2,13 +2,12 @@
2
2
  * Card
3
3
  */
4
4
 
5
- @import '../../../shared/scss/colors';
6
5
  @import '~@wordpress/base-styles/colors';
7
6
 
8
7
  .newspack-card {
9
- border-radius: 3px;
8
+ border-radius: 2px;
10
9
  border: 1px solid $gray-300;
11
- color: $gray-700;
10
+ color: $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
@@ -43,6 +39,17 @@
43
39
  }
44
40
  }
45
41
 
42
+ // Is Narrow
43
+
44
+ &__is-narrow {
45
+ margin-left: auto;
46
+ margin-right: auto;
47
+
48
+ @media screen and ( min-width: 608px ) {
49
+ max-width: 576px;
50
+ }
51
+ }
52
+
46
53
  // Is Small
47
54
 
48
55
  &__is-small {
@@ -79,6 +86,13 @@
79
86
  }
80
87
  }
81
88
 
89
+ // Is White
90
+
91
+ &__is-white {
92
+ background: white;
93
+ border: 0;
94
+ }
95
+
82
96
  // No Border
83
97
 
84
98
  &__no-border {
@@ -89,49 +103,15 @@
89
103
 
90
104
  // Typography
91
105
 
92
- h2,
93
- h3,
94
- p {
95
- line-height: 24px;
96
- margin: 32px 0;
97
- padding: 0;
98
- }
99
-
100
- h2 {
101
- color: $gray-900;
102
- font-size: 17px;
103
- font-weight: bold;
104
- }
105
-
106
- h3 {
107
- color: $gray-900;
108
- font-size: 14px;
109
- font-weight: bold;
110
- }
111
-
112
- p {
113
- font-size: 14px;
114
-
115
- &.is-dark {
116
- color: $gray-900;
117
- }
118
- }
119
-
120
- strong {
121
- font-weight: bold;
122
- }
123
-
124
106
  small {
125
107
  font-size: 12px;
126
- line-height: 16px;
108
+ line-height: 1.4;
127
109
  }
128
110
 
129
111
  code {
130
112
  background: $gray-100;
131
- color: $gray-700;
132
- font-size: 12px;
133
- line-height: 16px;
134
- padding: 4px 8px;
113
+ color: $gray-900;
114
+ padding: 0 0.5em;
135
115
  }
136
116
 
137
117
  // Thematic Break
@@ -158,27 +138,14 @@
158
138
 
159
139
  &__inline {
160
140
  display: inline-block;
161
- line-height: 24px;
141
+ line-height: 1.5;
162
142
  vertical-align: middle;
163
143
  }
164
144
  }
165
145
 
166
- // Links
146
+ // Error
167
147
 
168
- a {
169
- color: $primary-500;
170
-
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
- }
148
+ .newspack-error {
149
+ color: $alert-red;
183
150
  }
184
151
  }
@@ -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,7 @@ import './style.scss';
18
19
  /**
19
20
  * External dependencies
20
21
  */
21
- import { debounce, find } from 'lodash';
22
+ import { debounce, find, filter } from 'lodash';
22
23
  import classnames from 'classnames';
23
24
 
24
25
  /**
@@ -28,6 +29,7 @@ class CategoryAutocomplete extends Component {
28
29
  state = {
29
30
  suggestions: {},
30
31
  allCategories: {},
32
+ isLoading: false,
31
33
  };
32
34
 
33
35
  /**
@@ -39,12 +41,15 @@ class CategoryAutocomplete extends Component {
39
41
  }
40
42
 
41
43
  componentDidMount() {
44
+ this.setState( { isLoading: true } );
42
45
  apiFetch( {
43
46
  path: addQueryArgs( `/wp/v2/${ this.props.taxonomy }`, {
44
47
  per_page: -1,
45
48
  _fields: 'id,name',
46
49
  } ),
47
- } ).then( categories => this.setState( { allCategories: categories } ) );
50
+ } )
51
+ .then( categories => this.setState( { allCategories: categories } ) )
52
+ .finally( () => this.setState( { isLoading: false } ) );
48
53
  }
49
54
 
50
55
  /**
@@ -60,6 +65,7 @@ class CategoryAutocomplete extends Component {
60
65
  * @param {string} search The typed text to search for.
61
66
  */
62
67
  updateSuggestions( search ) {
68
+ this.setState( { isLoading: true } );
63
69
  apiFetch( {
64
70
  path: addQueryArgs( `/wp/v2/${ this.props.taxonomy }`, {
65
71
  search,
@@ -68,14 +74,16 @@ class CategoryAutocomplete extends Component {
68
74
  orderby: 'count',
69
75
  order: 'desc',
70
76
  } ),
71
- } ).then( categories => {
72
- this.setState( {
73
- suggestions: categories.reduce(
74
- ( accumulator, category ) => ( { ...accumulator, [ category.name ]: category } ),
75
- {}
76
- ),
77
- } );
78
- } );
77
+ } )
78
+ .then( categories => {
79
+ this.setState( {
80
+ suggestions: categories.reduce(
81
+ ( accumulator, category ) => ( { ...accumulator, [ category.name ]: category } ),
82
+ {}
83
+ ),
84
+ } );
85
+ } )
86
+ .finally( () => this.setState( { isLoading: false } ) );
79
87
  }
80
88
 
81
89
  /**
@@ -88,12 +96,29 @@ class CategoryAutocomplete extends Component {
88
96
  const { suggestions } = this.state;
89
97
  // Categories that are already will be objects, while new additions will be strings (the name).
90
98
  // allValues nomalizes the array so that they are all objects.
91
- const allValues = tokens.map( token =>
92
- typeof token === 'string' ? suggestions[ token ] : token
93
- );
99
+ const allValues = tokens
100
+ .filter( token => 'undefined' !== typeof token ) // Ensure each token is a valid value.
101
+ .map( token => ( 'string' === typeof token ? suggestions[ token ] : token ) )
102
+ .filter( Boolean );
94
103
  onChange( allValues );
95
104
  };
96
105
 
106
+ getAvailableSuggestions = () => {
107
+ const { value } = this.props;
108
+ const { suggestions } = this.state;
109
+ const selectedIds = value.reduce( ( acc, item ) => {
110
+ if ( item?.id ) {
111
+ acc.push( item.id );
112
+ }
113
+ return acc;
114
+ }, [] );
115
+ const availableSuggestions = filter(
116
+ suggestions,
117
+ ( { id } ) => selectedIds.indexOf( id ) === -1
118
+ );
119
+ return availableSuggestions.map( v => v.name );
120
+ };
121
+
97
122
  /**
98
123
  * Render the component.
99
124
  */
@@ -107,21 +132,24 @@ class CategoryAutocomplete extends Component {
107
132
  label,
108
133
  value,
109
134
  } = this.props;
110
- const { suggestions, allCategories } = this.state;
135
+ const { allCategories, isLoading } = this.state;
111
136
  const classes = classnames( 'newspack-category-autocomplete', className );
112
137
  return (
113
138
  <div className={ classes }>
114
139
  <FormTokenField
115
140
  onInputChange={ input => this.debouncedUpdateSuggestions( input ) }
116
141
  value={ value.reduce( ( acc, item ) => {
117
- const category =
142
+ const categoryOrItem =
118
143
  typeof item === 'number' ? find( allCategories, [ 'id', item ] ) : item;
119
- if ( category ) {
120
- acc.push( { id: category.term_id || category.id, value: category.name } );
144
+ if ( categoryOrItem ) {
145
+ acc.push( {
146
+ id: categoryOrItem.term_id || categoryOrItem.id,
147
+ value: categoryOrItem.value || categoryOrItem.name,
148
+ } );
121
149
  }
122
150
  return acc;
123
151
  }, [] ) }
124
- suggestions={ Object.keys( suggestions ) }
152
+ suggestions={ this.getAvailableSuggestions() }
125
153
  onChange={ this.handleOnChange }
126
154
  label={ label }
127
155
  disabled={ disabled }
@@ -129,6 +157,11 @@ class CategoryAutocomplete extends Component {
129
157
  hideHelpFromVision={ hideHelpFromVision }
130
158
  hideLabelFromVision={ hideLabelFromVision }
131
159
  />
160
+ { isLoading ? (
161
+ <span className="newspack-category-autocomplete__suggestions-spinner">
162
+ <Spinner />
163
+ </span>
164
+ ) : null }
132
165
  </div>
133
166
  );
134
167
  }
@@ -5,34 +5,32 @@
5
5
  @import '../../../shared/scss/colors';
6
6
 
7
7
  .newspack-category-autocomplete {
8
+ position: relative;
9
+
8
10
  .components-form-token-field__help {
9
11
  display: none;
10
12
  }
11
13
 
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
14
  // Within a Grid
34
15
 
35
- .newspack-grid & .newspack-form-token-field {
16
+ .newspack-grid & .newspack-form-token-field__input-container {
36
17
  margin: 0;
37
18
  }
19
+
20
+ // Loading state spinner
21
+ &__suggestions-spinner {
22
+ position: absolute;
23
+ right: 1px;
24
+ top: calc( 1.4em + 8px );
25
+ z-index: 2;
26
+
27
+ [class*='--label-hidden'] + & {
28
+ top: 0;
29
+ }
30
+
31
+ .components-spinner {
32
+ display: block;
33
+ margin: 7px;
34
+ }
35
+ }
38
36
  }
@@ -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
  />