newspack-components 2.2.1 → 3.0.0-alpha.2

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 (308) hide show
  1. package/babel.config.js +25 -0
  2. package/copy-styles.js +2 -10
  3. package/dist/{cjs/accordion → accordion}/index.js +17 -13
  4. package/dist/{cjs/accordion → accordion}/style.scss +7 -3
  5. package/dist/{cjs/action-card → action-card}/index.js +39 -43
  6. package/dist/{esm/action-card → action-card}/style.scss +9 -9
  7. package/dist/{cjs/autocomplete-tokenfield → autocomplete-tokenfield}/index.js +67 -29
  8. package/dist/{esm/autocomplete-tokenfield → autocomplete-tokenfield}/style.scss +14 -8
  9. package/dist/{cjs/autocomplete-with-suggestions → autocomplete-with-suggestions}/index.js +61 -73
  10. package/dist/{esm/autocomplete-with-suggestions → autocomplete-with-suggestions}/style.scss +9 -17
  11. package/dist/button/index.js +51 -0
  12. package/{src/button/index.js → dist/button/index.tsx} +12 -5
  13. package/dist/{cjs/button → button}/style.scss +1 -1
  14. package/dist/{cjs/button-card → button-card}/index.js +9 -10
  15. package/dist/{cjs/button-card → button-card}/style.scss +19 -13
  16. package/dist/{cjs/card → card}/index.js +4 -5
  17. package/dist/{esm/card → card}/style.scss +1 -1
  18. package/dist/{cjs/category-autocomplete → category-autocomplete}/index.js +51 -53
  19. package/dist/{esm/category-autocomplete → category-autocomplete}/style.scss +2 -2
  20. package/dist/{cjs/color-picker → color-picker}/index.js +14 -16
  21. package/dist/{cjs/color-picker → color-picker}/style.scss +3 -3
  22. package/dist/consts.js +7 -0
  23. package/dist/{cjs/custom-select-control → custom-select-control}/index.js +4 -5
  24. package/dist/{cjs/custom-select-control → custom-select-control}/style.scss +11 -10
  25. package/dist/{cjs/date-range-picker → date-range-picker}/index.js +9 -11
  26. package/dist/{cjs/date-range-picker → date-range-picker}/style.scss +6 -6
  27. package/dist/{cjs/footer → footer}/index.js +33 -36
  28. package/dist/{cjs/footer → footer}/style.scss +1 -1
  29. package/dist/{cjs/form-token-field → form-token-field}/index.js +6 -7
  30. package/dist/{esm/form-token-field → form-token-field}/style.scss +1 -1
  31. package/dist/{cjs/global-notices → global-notices}/index.js +4 -5
  32. package/dist/grid/index.js +44 -0
  33. package/dist/grid/index.tsx +34 -0
  34. package/dist/{cjs/grid → grid}/style.scss +9 -9
  35. package/dist/{cjs/handoff → handoff}/index.js +73 -71
  36. package/dist/{cjs/handoff-message → handoff-message}/index.js +5 -3
  37. package/dist/hooks/index.js +29 -0
  38. package/{src/hooks/index.js → dist/hooks/index.ts} +1 -1
  39. package/dist/{cjs/hooks → hooks}/useObjectState.js +2 -3
  40. package/dist/{cjs/hooks → hooks}/useObjectState.test.js +9 -9
  41. package/dist/{cjs/hooks → hooks}/useOnClickOutside.js +1 -2
  42. package/dist/hooks/usePrompt.js +47 -0
  43. package/{src/hooks/usePrompt.js → dist/hooks/usePrompt.ts} +4 -8
  44. package/dist/image-upload/index.js +148 -0
  45. package/dist/{cjs/image-upload → image-upload}/index.test.js +13 -6
  46. package/dist/{esm/image-upload → image-upload}/style.scss +5 -5
  47. package/dist/{cjs/index.js → index.js} +1 -1
  48. package/dist/{cjs/info-button → info-button}/index.js +6 -7
  49. package/dist/{cjs/modal → modal}/index.js +4 -5
  50. package/dist/{esm/modal → modal}/style.scss +5 -5
  51. package/dist/{cjs/newspack-icon → newspack-icon}/index.js +5 -6
  52. package/dist/{cjs/newspack-icon → newspack-icon}/style.scss +1 -1
  53. package/dist/{cjs/newspack-logo → newspack-logo}/index.js +5 -6
  54. package/dist/{cjs/newspack-logo → newspack-logo}/style.scss +1 -1
  55. package/dist/{cjs/notice → notice}/index.js +12 -10
  56. package/dist/{cjs/notice → notice}/style.scss +11 -11
  57. package/dist/patrons-logo/index.js +77 -0
  58. package/dist/plugin-installer/index.js +297 -0
  59. package/dist/{cjs/plugin-installer → plugin-installer}/style.scss +1 -1
  60. package/dist/{cjs/plugin-settings → plugin-settings}/SettingsSection.js +13 -13
  61. package/dist/plugin-settings/index.js +228 -0
  62. package/dist/{cjs/plugin-settings → plugin-settings}/style.scss +1 -1
  63. package/dist/plugin-toggle/README.md +53 -0
  64. package/dist/plugin-toggle/index.js +222 -0
  65. package/dist/{esm/plugin-toggle → plugin-toggle}/style.scss +1 -1
  66. package/dist/{cjs/popover → popover}/index.js +4 -5
  67. package/dist/{cjs/popover → popover}/style.scss +7 -7
  68. package/dist/{cjs/position-control → position-control}/index.js +33 -32
  69. package/dist/{cjs/position-control → position-control}/style.scss +8 -8
  70. package/dist/{cjs/progress-bar → progress-bar}/index.js +9 -10
  71. package/dist/{cjs/progress-bar → progress-bar}/index.test.js +16 -16
  72. package/dist/{cjs/progress-bar → progress-bar}/style.scss +2 -2
  73. package/dist/proxied-imports/router.js +15 -0
  74. package/dist/{cjs/radio-control → radio-control}/index.js +4 -5
  75. package/dist/{cjs/radio-control → radio-control}/style.scss +3 -3
  76. package/dist/{cjs/section-header → section-header}/index.js +20 -21
  77. package/dist/{esm/section-header → section-header}/style.scss +5 -1
  78. package/dist/{cjs/select-control → select-control}/ButtonGroupControl.js +17 -19
  79. package/dist/{cjs/select-control → select-control}/GroupedSelectControl.js +32 -35
  80. package/dist/{cjs/select-control → select-control}/index.js +7 -8
  81. package/dist/{cjs/select-control → select-control}/style.scss +4 -4
  82. package/dist/settings/MinMaxSetting.js +60 -0
  83. package/dist/{cjs/settings → settings}/SettingsCard.js +14 -16
  84. package/dist/settings/SettingsSection.js +33 -0
  85. package/dist/{cjs/settings → settings}/index.js +3 -4
  86. package/dist/{cjs/settings → settings}/style.scss +15 -2
  87. package/dist/sortable-newsletter-list-control/index.js +135 -0
  88. package/dist/sortable-newsletter-list-control/style.scss +45 -0
  89. package/dist/{cjs/steps-list → steps-list}/index.js +5 -6
  90. package/dist/{esm/steps-list → steps-list}/style.scss +2 -2
  91. package/dist/{cjs/steps-list-item → steps-list-item}/index.js +6 -7
  92. package/dist/{cjs/steps-list-item → steps-list-item}/style.scss +5 -5
  93. package/dist/{cjs/style-card → style-card}/index.js +21 -19
  94. package/dist/{esm/style-card → style-card}/style.scss +4 -4
  95. package/dist/{esm/style.scss → style.scss} +14 -2
  96. package/dist/{cjs/tabbed-navigation → tabbed-navigation}/index.js +16 -19
  97. package/dist/{cjs/tabbed-navigation → tabbed-navigation}/style.scss +4 -4
  98. package/dist/text-control/index.js +76 -0
  99. package/dist/text-control/index.tsx +71 -0
  100. package/dist/utils/index.js +36 -0
  101. package/dist/{cjs/waiting → waiting}/index.js +4 -5
  102. package/dist/web-preview/index.js +191 -0
  103. package/dist/{cjs/web-preview → web-preview}/style.scss +5 -5
  104. package/dist/with-wizard/index.js +328 -0
  105. package/dist/{esm/with-wizard → with-wizard}/style.scss +44 -22
  106. package/dist/{cjs/with-wizard-screen → with-wizard-screen}/index.js +40 -43
  107. package/dist/{esm/with-wizard-screen → with-wizard-screen}/style.scss +7 -7
  108. package/dist/{cjs/wizard → wizard}/components/WizardError.js +16 -17
  109. package/dist/{cjs/wizard → wizard}/index.js +44 -46
  110. package/dist/{cjs/wizard → wizard}/store/index.js +37 -38
  111. package/dist/{cjs/wizard → wizard}/store/utils.js +1 -4
  112. package/package.json +16 -14
  113. package/shared/scss/_mixins.scss +2 -2
  114. package/src/accordion/index.js +4 -1
  115. package/src/accordion/style.scss +7 -3
  116. package/src/action-card/style.scss +9 -9
  117. package/src/autocomplete-tokenfield/index.js +48 -15
  118. package/src/autocomplete-tokenfield/style.scss +14 -8
  119. package/src/autocomplete-with-suggestions/index.js +59 -62
  120. package/src/autocomplete-with-suggestions/style.scss +9 -17
  121. package/src/button/index.tsx +48 -0
  122. package/src/button/style.scss +1 -1
  123. package/src/button-card/style.scss +19 -13
  124. package/src/card/style.scss +1 -1
  125. package/src/category-autocomplete/style.scss +2 -2
  126. package/src/color-picker/style.scss +3 -3
  127. package/src/consts.js +0 -2
  128. package/src/custom-select-control/style.scss +11 -10
  129. package/src/date-range-picker/style.scss +6 -6
  130. package/src/footer/index.js +7 -7
  131. package/src/footer/style.scss +1 -1
  132. package/src/form-token-field/style.scss +1 -1
  133. package/src/grid/index.tsx +34 -0
  134. package/src/grid/style.scss +9 -9
  135. package/src/handoff/index.js +7 -6
  136. package/src/handoff-message/index.js +3 -1
  137. package/src/hooks/index.ts +15 -0
  138. package/src/hooks/usePrompt.ts +46 -0
  139. package/src/image-upload/index.js +5 -5
  140. package/src/image-upload/index.test.js +6 -1
  141. package/src/image-upload/style.scss +5 -5
  142. package/src/modal/style.scss +5 -5
  143. package/src/newspack-icon/style.scss +1 -1
  144. package/src/newspack-logo/style.scss +1 -1
  145. package/src/notice/index.js +1 -1
  146. package/src/notice/style.scss +11 -11
  147. package/src/patrons-logo/index.js +4 -1
  148. package/src/plugin-installer/index.js +7 -7
  149. package/src/plugin-installer/style.scss +1 -1
  150. package/src/plugin-settings/index.js +1 -1
  151. package/src/plugin-settings/style.scss +1 -1
  152. package/src/plugin-toggle/index.js +13 -12
  153. package/src/plugin-toggle/style.scss +1 -1
  154. package/src/popover/style.scss +7 -7
  155. package/src/position-control/index.js +63 -64
  156. package/src/position-control/style.scss +8 -8
  157. package/src/progress-bar/style.scss +2 -2
  158. package/src/radio-control/style.scss +3 -3
  159. package/src/section-header/index.js +3 -3
  160. package/src/section-header/style.scss +5 -1
  161. package/src/select-control/GroupedSelectControl.js +1 -1
  162. package/src/select-control/style.scss +4 -4
  163. package/src/settings/MinMaxSetting.js +8 -6
  164. package/src/settings/style.scss +15 -2
  165. package/src/sortable-newsletter-list-control/index.js +137 -0
  166. package/src/sortable-newsletter-list-control/style.scss +45 -0
  167. package/src/steps-list/style.scss +2 -2
  168. package/src/steps-list-item/style.scss +5 -5
  169. package/src/style-card/index.js +11 -5
  170. package/src/style-card/style.scss +4 -4
  171. package/src/style.scss +14 -2
  172. package/src/tabbed-navigation/style.scss +4 -4
  173. package/src/text-control/index.tsx +65 -0
  174. package/src/web-preview/index.js +6 -6
  175. package/src/web-preview/style.scss +5 -5
  176. package/src/with-wizard/index.js +4 -4
  177. package/src/with-wizard/style.scss +44 -22
  178. package/src/with-wizard-screen/index.js +1 -1
  179. package/src/with-wizard-screen/style.scss +7 -7
  180. package/src/wizard/components/WizardError.js +1 -1
  181. package/src/wizard/index.js +3 -3
  182. package/src/wizard/store/index.js +9 -2
  183. package/dist/cjs/action-card/style.scss +0 -483
  184. package/dist/cjs/autocomplete-tokenfield/style.scss +0 -43
  185. package/dist/cjs/autocomplete-with-suggestions/style.scss +0 -171
  186. package/dist/cjs/button/index.js +0 -57
  187. package/dist/cjs/card/style.scss +0 -168
  188. package/dist/cjs/category-autocomplete/style.scss +0 -34
  189. package/dist/cjs/consts.js +0 -12
  190. package/dist/cjs/form-token-field/style.scss +0 -37
  191. package/dist/cjs/grid/index.js +0 -54
  192. package/dist/cjs/hooks/index.js +0 -26
  193. package/dist/cjs/hooks/usePrompt.js +0 -52
  194. package/dist/cjs/image-upload/index.js +0 -144
  195. package/dist/cjs/image-upload/style.scss +0 -103
  196. package/dist/cjs/modal/style.scss +0 -56
  197. package/dist/cjs/patrons-logo/index.js +0 -82
  198. package/dist/cjs/plugin-installer/index.js +0 -299
  199. package/dist/cjs/plugin-settings/index.js +0 -222
  200. package/dist/cjs/plugin-toggle/index.js +0 -222
  201. package/dist/cjs/plugin-toggle/style.scss +0 -20
  202. package/dist/cjs/proxied-imports/router.js +0 -15
  203. package/dist/cjs/section-header/style.scss +0 -41
  204. package/dist/cjs/settings/MinMaxSetting.js +0 -57
  205. package/dist/cjs/settings/SettingsSection.js +0 -37
  206. package/dist/cjs/steps-list/style.scss +0 -11
  207. package/dist/cjs/style-card/style.scss +0 -94
  208. package/dist/cjs/style.scss +0 -43
  209. package/dist/cjs/text-control/index.js +0 -71
  210. package/dist/cjs/utils/index.js +0 -40
  211. package/dist/cjs/web-preview/index.js +0 -189
  212. package/dist/cjs/with-wizard/index.js +0 -318
  213. package/dist/cjs/with-wizard/style.scss +0 -260
  214. package/dist/cjs/with-wizard-screen/style.scss +0 -160
  215. package/dist/esm/accordion/index.js +0 -38
  216. package/dist/esm/accordion/style.scss +0 -27
  217. package/dist/esm/action-card/index.js +0 -222
  218. package/dist/esm/autocomplete-tokenfield/index.js +0 -223
  219. package/dist/esm/autocomplete-with-suggestions/index.js +0 -289
  220. package/dist/esm/button/index.js +0 -48
  221. package/dist/esm/button/style.scss +0 -11
  222. package/dist/esm/button-card/index.js +0 -65
  223. package/dist/esm/button-card/style.scss +0 -174
  224. package/dist/esm/card/index.js +0 -43
  225. package/dist/esm/category-autocomplete/index.js +0 -185
  226. package/dist/esm/color-picker/index.js +0 -61
  227. package/dist/esm/color-picker/style.scss +0 -37
  228. package/dist/esm/consts.js +0 -3
  229. package/dist/esm/custom-select-control/index.js +0 -37
  230. package/dist/esm/custom-select-control/style.scss +0 -92
  231. package/dist/esm/date-range-picker/index.js +0 -32
  232. package/dist/esm/date-range-picker/style.scss +0 -148
  233. package/dist/esm/footer/index.js +0 -105
  234. package/dist/esm/footer/style.scss +0 -82
  235. package/dist/esm/form-token-field/index.js +0 -50
  236. package/dist/esm/global-notices/index.js +0 -30
  237. package/dist/esm/grid/index.js +0 -45
  238. package/dist/esm/grid/style.scss +0 -166
  239. package/dist/esm/handoff/index.js +0 -177
  240. package/dist/esm/handoff-message/index.js +0 -45
  241. package/dist/esm/hooks/index.js +0 -17
  242. package/dist/esm/hooks/useObjectState.js +0 -31
  243. package/dist/esm/hooks/useObjectState.test.js +0 -83
  244. package/dist/esm/hooks/useOnClickOutside.js +0 -31
  245. package/dist/esm/hooks/usePrompt.js +0 -43
  246. package/dist/esm/image-upload/index.js +0 -141
  247. package/dist/esm/image-upload/index.test.js +0 -28
  248. package/dist/esm/index.js +0 -47
  249. package/dist/esm/info-button/index.js +0 -42
  250. package/dist/esm/info-button/style.scss +0 -18
  251. package/dist/esm/modal/index.js +0 -39
  252. package/dist/esm/newspack-icon/index.js +0 -50
  253. package/dist/esm/newspack-icon/style.scss +0 -26
  254. package/dist/esm/newspack-logo/index.js +0 -46
  255. package/dist/esm/newspack-logo/style.scss +0 -30
  256. package/dist/esm/notice/index.js +0 -67
  257. package/dist/esm/notice/style.scss +0 -111
  258. package/dist/esm/patrons-logo/index.js +0 -76
  259. package/dist/esm/plugin-installer/index.js +0 -295
  260. package/dist/esm/plugin-installer/style.scss +0 -72
  261. package/dist/esm/plugin-settings/SettingsSection.js +0 -136
  262. package/dist/esm/plugin-settings/index.js +0 -217
  263. package/dist/esm/plugin-settings/style.scss +0 -7
  264. package/dist/esm/plugin-toggle/index.js +0 -217
  265. package/dist/esm/popover/index.js +0 -41
  266. package/dist/esm/popover/style.scss +0 -161
  267. package/dist/esm/position-control/index.js +0 -109
  268. package/dist/esm/position-control/style.scss +0 -66
  269. package/dist/esm/progress-bar/index.js +0 -69
  270. package/dist/esm/progress-bar/index.test.js +0 -110
  271. package/dist/esm/progress-bar/style.scss +0 -42
  272. package/dist/esm/proxied-imports/router.js +0 -8
  273. package/dist/esm/radio-control/index.js +0 -37
  274. package/dist/esm/radio-control/style.scss +0 -92
  275. package/dist/esm/section-header/index.js +0 -68
  276. package/dist/esm/select-control/ButtonGroupControl.js +0 -54
  277. package/dist/esm/select-control/GroupedSelectControl.js +0 -84
  278. package/dist/esm/select-control/index.js +0 -51
  279. package/dist/esm/select-control/style.scss +0 -108
  280. package/dist/esm/settings/MinMaxSetting.js +0 -53
  281. package/dist/esm/settings/SettingsCard.js +0 -39
  282. package/dist/esm/settings/SettingsSection.js +0 -30
  283. package/dist/esm/settings/index.js +0 -9
  284. package/dist/esm/settings/style.scss +0 -106
  285. package/dist/esm/steps-list/index.js +0 -43
  286. package/dist/esm/steps-list-item/index.js +0 -48
  287. package/dist/esm/steps-list-item/style.scss +0 -47
  288. package/dist/esm/style-card/index.js +0 -76
  289. package/dist/esm/tabbed-navigation/index.js +0 -56
  290. package/dist/esm/tabbed-navigation/style.scss +0 -86
  291. package/dist/esm/text-control/index.js +0 -66
  292. package/dist/esm/text-control/style.scss +0 -32
  293. package/dist/esm/utils/index.js +0 -32
  294. package/dist/esm/waiting/index.js +0 -44
  295. package/dist/esm/waiting/style.scss +0 -27
  296. package/dist/esm/web-preview/index.js +0 -184
  297. package/dist/esm/web-preview/style.scss +0 -155
  298. package/dist/esm/with-wizard/index.js +0 -313
  299. package/dist/esm/with-wizard-screen/index.js +0 -116
  300. package/dist/esm/wizard/components/WizardError.js +0 -69
  301. package/dist/esm/wizard/index.js +0 -126
  302. package/dist/esm/wizard/store/index.js +0 -155
  303. package/dist/esm/wizard/store/utils.js +0 -17
  304. package/src/grid/index.js +0 -44
  305. package/src/text-control/index.js +0 -56
  306. /package/dist/{cjs/info-button → info-button}/style.scss +0 -0
  307. /package/dist/{cjs/text-control → text-control}/style.scss +0 -0
  308. /package/dist/{cjs/waiting → waiting}/style.scss +0 -0
@@ -19,8 +19,5 @@ const createAction = type => payload => ({
19
19
  payload
20
20
  });
21
21
  exports.createAction = createAction;
22
- const useWizardData = function (wizardName) {
23
- let defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
24
- return (0, _data.useSelect)(select => select(_.WIZARD_STORE_NAMESPACE).getWizardAPIData(`newspack-${wizardName}-wizard`)) || defaultValue;
25
- };
22
+ const useWizardData = (wizardName, defaultValue = {}) => (0, _data.useSelect)(select => select(_.WIZARD_STORE_NAMESPACE).getWizardAPIData(`newspack-${wizardName}-wizard`)) || defaultValue;
26
23
  exports.useWizardData = useWizardData;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "newspack-components",
3
- "version": "2.2.1",
3
+ "version": "3.0.0-alpha.2",
4
4
  "description": "Newspack design system components",
5
5
  "author": "Automattic",
6
6
  "license": "GPL-2.0-or-later",
@@ -16,30 +16,32 @@
16
16
  "repository": {
17
17
  "type": "git",
18
18
  "url": "https://github.com/Automattic/newspack-plugin.git",
19
- "directory": "assets/src/components"
19
+ "directory": "src/components"
20
20
  },
21
- "main": "dist/esm/index.js",
21
+ "main": "dist/index.js",
22
22
  "publishConfig": {
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@wordpress/base-styles": "^4.0.0",
27
- "@wordpress/components": "^23.6.0",
28
- "@wordpress/element": "^5.5.0",
29
- "@wordpress/i18n": "^4.2.2",
30
- "@wordpress/icons": "^9.11.0",
26
+ "@wordpress/base-styles": "^5.0.0",
27
+ "@wordpress/components": "^28.0.0",
28
+ "@wordpress/element": "^6.0.0",
29
+ "@wordpress/i18n": "^5.0.0",
30
+ "@wordpress/icons": "^10.0.0",
31
31
  "classnames": "^2.3.1",
32
32
  "lodash": "^4.17.21",
33
33
  "moment-range": "^3.1.1",
34
34
  "qs": "^6.10.1",
35
35
  "react-daterange-picker": "^2.0.1",
36
- "react-router-dom": "^5.3.0"
36
+ "react-router-dom": "^5.3.4"
37
37
  },
38
38
  "devDependencies": {
39
- "@automattic/calypso-build": "^10.0.0",
40
- "@babel/cli": "^7.15.0",
41
- "@babel/core": "^7.15.0",
42
- "recursive-copy": "^2.0.13"
39
+ "@babel/cli": "^7.24.0",
40
+ "@babel/core": "^7.24.0",
41
+ "@babel/preset-env": "^7.24.7",
42
+ "@babel/preset-react": "^7.24.7",
43
+ "@babel/preset-typescript": "^7.24.7",
44
+ "recursive-copy": "^2.0.0"
43
45
  },
44
46
  "babel": {
45
47
  "ignore": [
@@ -47,7 +49,7 @@
47
49
  ]
48
50
  },
49
51
  "scripts": {
50
- "prepublishOnly": "transpile && node copy-styles.js",
52
+ "prepublishOnly": "npx babel src --out-dir dist && node copy-styles.js",
51
53
  "postpublish": "rm -r dist && rm -r shared"
52
54
  }
53
55
  }
@@ -1,7 +1,7 @@
1
1
  @mixin visuallyHidden {
2
2
  border: 0;
3
- clip: rect( 1px, 1px, 1px, 1px );
4
- clip-path: inset( 50% );
3
+ clip: rect(1px, 1px, 1px, 1px);
4
+ clip-path: inset(50%);
5
5
  width: 1px;
6
6
  height: 1px;
7
7
  margin: -1px;
@@ -1,3 +1,6 @@
1
+ /* eslint-disable jsx-a11y/click-events-have-key-events */
2
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
3
+
1
4
  /**
2
5
  * WordPress dependencies
3
6
  */
@@ -24,7 +27,7 @@ const Accordion = ( { children, title } ) => {
24
27
  { title }
25
28
  <Icon className="newspack-accordion__icon" icon={ chevronRight } size={ 24 } />
26
29
  </summary>
27
- { children }
30
+ <div className="newspack-accordion__content">{ children }</div>
28
31
  </details>
29
32
  );
30
33
  };
@@ -1,17 +1,17 @@
1
- @use '~@wordpress/base-styles/colors' as wp-colors;
1
+ @use "~@wordpress/base-styles/colors" as wp-colors;
2
2
 
3
3
  .newspack-accordion {
4
4
  border: 1px solid wp-colors.$gray-300;
5
5
 
6
6
  &__icon {
7
7
  transition: transform 200ms ease-out;
8
- transform: rotate( 90deg );
8
+ transform: rotate(90deg);
9
9
  }
10
10
 
11
11
  &--is-open {
12
12
  .newspack-accordion {
13
13
  &__icon {
14
- transform: rotate( -90deg );
14
+ transform: rotate(-90deg);
15
15
  }
16
16
  }
17
17
  }
@@ -24,4 +24,8 @@
24
24
  font-size: 14px;
25
25
  font-weight: bold;
26
26
  }
27
+
28
+ &__content {
29
+ padding: 16px 32px;
30
+ }
27
31
  }
@@ -2,8 +2,8 @@
2
2
  * Action Card
3
3
  */
4
4
 
5
- @use 'sass:color';
6
- @use '~@wordpress/base-styles/colors' as wp-colors;
5
+ @use "sass:color";
6
+ @use "~@wordpress/base-styles/colors" as wp-colors;
7
7
 
8
8
  .newspack-card.newspack-action-card {
9
9
  padding: 0;
@@ -15,7 +15,7 @@
15
15
  transition: box-shadow 125ms ease-in-out;
16
16
 
17
17
  &:hover {
18
- box-shadow: 0 4px 8px rgba( black, 0.08 );
18
+ box-shadow: 0 4px 8px rgba(black, 0.08);
19
19
  }
20
20
  }
21
21
 
@@ -34,7 +34,7 @@
34
34
  }
35
35
 
36
36
  &.newspack-card__is-primary {
37
- box-shadow: inset 4px 0 0 var( --wp-admin-theme-color );
37
+ box-shadow: inset 4px 0 0 var(--wp-admin-theme-color);
38
38
  }
39
39
 
40
40
  &.newspack-card__is-secondary {
@@ -181,12 +181,12 @@
181
181
  }
182
182
 
183
183
  .newspack-action-card__region-top {
184
- background-color: rgba( black, 0.025 );
184
+ background-color: rgba(black, 0.025);
185
185
  }
186
186
 
187
187
  .newspack-action-card__region-center {
188
188
  p {
189
- color: color.adjust( wp-colors.$gray-700, $lightness: -0.75% );
189
+ color: color.adjust(wp-colors.$gray-700, $lightness: -0.75%);
190
190
  }
191
191
  }
192
192
  }
@@ -209,7 +209,7 @@
209
209
  border-left-width: 1px;
210
210
  border-bottom-width: 1px;
211
211
  border-radius: 0 0 0 2px;
212
- content: '';
212
+ content: "";
213
213
  display: block;
214
214
  position: absolute;
215
215
  inset: -17px 100% 50% -28px;
@@ -219,7 +219,7 @@
219
219
  // Typography
220
220
 
221
221
  h2,
222
- p:not( [class*='components-base-control'] ) {
222
+ p:not([class*="components-base-control"]) {
223
223
  margin: 0;
224
224
  max-width: 100%;
225
225
  width: 100%;
@@ -242,7 +242,7 @@
242
242
  &:active,
243
243
  &:focus,
244
244
  &:hover {
245
- color: var( --wp-admin-theme-color );
245
+ color: var(--wp-admin-theme-color);
246
246
  }
247
247
  }
248
248
  }
@@ -57,6 +57,26 @@ class AutocompleteTokenField extends Component {
57
57
  }
58
58
  }
59
59
 
60
+ /**
61
+ * When the component updates, fetch information about the tokens so we can populate
62
+ * the tokens with the correct labels.
63
+ */
64
+ componentDidUpdate( prevProps ) {
65
+ const { tokens, fetchSavedInfo } = this.props;
66
+
67
+ if ( tokens !== prevProps.tokens && this.isFetchingInfoOnLoad() ) {
68
+ fetchSavedInfo( tokens ).then( results => {
69
+ const { validValues } = this.state;
70
+
71
+ results.forEach( suggestion => {
72
+ validValues[ suggestion.value ] = suggestion.label;
73
+ } );
74
+
75
+ this.setState( { validValues, loading: false } );
76
+ } );
77
+ }
78
+ }
79
+
60
80
  /**
61
81
  * Clean up any unfinished autocomplete api call requests.
62
82
  */
@@ -99,7 +119,9 @@ class AutocompleteTokenField extends Component {
99
119
  return labels.reduce( ( acc, label ) => {
100
120
  Object.keys( validValues ).forEach( key => {
101
121
  if ( validValues[ key ] === label ) {
102
- acc.push( { value: key, label } );
122
+ // Preserve numeric or string type of values. Object.keys will convert numbers to strings.
123
+ const value = isNaN( parseInt( key ) ) ? key.toString() : parseInt( key );
124
+ acc.push( { value, label } );
103
125
  }
104
126
  } );
105
127
 
@@ -108,7 +130,9 @@ class AutocompleteTokenField extends Component {
108
130
  }
109
131
 
110
132
  return labels.map( label =>
111
- Object.keys( validValues ).find( key => validValues[ key ] === label )
133
+ Object.keys( validValues )
134
+ .map( key => ( isNaN( parseInt( key ) ) ? key.toString() : parseInt( key ) ) )
135
+ .find( key => validValues[ key ] === label )
112
136
  );
113
137
  }
114
138
 
@@ -134,16 +158,16 @@ class AutocompleteTokenField extends Component {
134
158
  return;
135
159
  }
136
160
 
161
+ const { validValues } = this.state;
137
162
  const currentSuggestions = [ ...suggestions ];
138
- const currentValidValues = {};
139
163
 
140
164
  suggestions.forEach( suggestion => {
141
- currentValidValues[ suggestion.value ] = suggestion.label;
165
+ validValues[ suggestion.value ] = suggestion.label;
142
166
  } );
143
167
 
144
168
  this.setState( {
145
169
  suggestions: currentSuggestions,
146
- validValues: currentValidValues,
170
+ validValues,
147
171
  loading: false,
148
172
  } );
149
173
  } )
@@ -183,20 +207,29 @@ class AutocompleteTokenField extends Component {
183
207
  * Render.
184
208
  */
185
209
  render() {
186
- const { help, label = '', maxLength } = this.props;
210
+ const { help, label = '', placeholder = '', maxLength } = this.props;
187
211
  const { suggestions, loading } = this.state;
188
212
 
213
+ const classNames = [ 'newspack-autocomplete-tokenfield__input-container' ];
214
+
215
+ if ( label ) {
216
+ classNames.push( 'has-label' );
217
+ }
218
+
189
219
  return (
190
220
  <div className="newspack-autocomplete-tokenfield">
191
- <FormTokenField
192
- value={ this.getTokens() }
193
- suggestions={ suggestions.map( suggestion => suggestion.label ) }
194
- onChange={ tokens => this.handleOnChange( tokens ) }
195
- onInputChange={ input => this.debouncedUpdateSuggestions( input ) }
196
- label={ label }
197
- maxLength={ maxLength }
198
- />
199
- { loading && <Spinner /> }
221
+ <div className={ classNames.join( ' ' ) }>
222
+ <FormTokenField
223
+ value={ this.getTokens() }
224
+ suggestions={ suggestions.map( suggestion => suggestion.label ) }
225
+ onChange={ tokens => this.handleOnChange( tokens ) }
226
+ onInputChange={ input => this.debouncedUpdateSuggestions( input ) }
227
+ label={ label }
228
+ maxLength={ maxLength }
229
+ placeholder={ placeholder }
230
+ />
231
+ { loading && <Spinner /> }
232
+ </div>
200
233
  { help && <p className="newspack-autocomplete-tokenfield__help">{ help }</p> }
201
234
  </div>
202
235
  );
@@ -2,16 +2,22 @@
2
2
  * Autocomplete Token Field
3
3
  */
4
4
 
5
- @use '~@wordpress/base-styles/colors' as wp-colors;
5
+ @use "~@wordpress/base-styles/colors" as wp-colors;
6
6
 
7
7
  .newspack-autocomplete-tokenfield {
8
- position: relative;
9
-
10
8
  .components-spinner {
11
- margin: 8px;
9
+ margin: 0;
12
10
  position: absolute;
13
- right: 0;
14
- top: calc( 1.4em + 8px );
11
+ right: 8px;
12
+ top: 8px;
13
+ }
14
+
15
+ &__input-container {
16
+ position: relative;
17
+
18
+ &.has-label .components-spinner {
19
+ top: 32px;
20
+ }
15
21
  }
16
22
 
17
23
  /* Workaround for hard-coded help text in FormTokenField. */
@@ -37,7 +43,7 @@
37
43
  padding-left: 0;
38
44
  }
39
45
 
40
- .components-button:focus:not( :disabled ) {
41
- box-shadow: inset 0 0 0 var( --wp-admin-border-width-focus ) var( --wp-admin-theme-color );
46
+ .components-button:focus:not(:disabled) {
47
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
42
48
  }
43
49
  }
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import apiFetch from '@wordpress/api-fetch';
5
- import { Button, CheckboxControl, SelectControl, Spinner } from '@wordpress/components';
5
+ import { Button, CheckboxControl, SelectControl } from '@wordpress/components';
6
6
  import { decodeEntities } from '@wordpress/html-entities';
7
7
  import { useEffect, useState } from '@wordpress/element';
8
8
  import { __, _x, sprintf } from '@wordpress/i18n';
@@ -17,16 +17,16 @@ import './style.scss';
17
17
  const AutocompleteWithSuggestions = ( {
18
18
  fetchSavedPosts = false, // If passed, will use this function to fetch saved data.
19
19
  fetchSuggestions = false, // If passed, will use this function to fetch suggestions data.
20
- help = __( 'Begin typing search term, click autocomplete result to select.', 'newspack' ),
20
+ help = __( 'Begin typing search term, click autocomplete result to select.', 'newspack-plugin' ),
21
21
  hideHelp = false, // If true, all help text will be hidden.
22
- label = __( 'Search', 'newspack' ),
22
+ label = __( 'Search', 'newspack-plugin' ),
23
23
  maxItemsToSuggest = 0, // If passed, will be used to determine "load more" state. Necessary if you want "load more" functionality when using a custom `fetchSuggestions` function.
24
24
  multiSelect = false, // If true, component can select multiple values at once.
25
25
  onChange = false, // Function to call when selections change.
26
26
  onPostTypeChange = false, // Funciton to call when the post type selector is changed.
27
27
  postTypes = [ { slug: 'post', label: 'Post' } ], // If passed, will render a selector to change the post type queried for suggestions.
28
- postTypeLabel = __( 'item', 'newspack' ), // String to describe the data being shown.
29
- postTypeLabelPlural = __( 'items', 'newspack' ), // Plural string to describe the data being shown.
28
+ postTypeLabel = __( 'item', 'newspack-plugin' ), // String to describe the data being shown.
29
+ postTypeLabelPlural = __( 'items', 'newspack-plugin' ), // Plural string to describe the data being shown.
30
30
  selectedItems = [], // Array of saved items.
31
31
  selectedPost = 0, // Legacy prop when single-select was the only option.
32
32
  suggestionsToFetch = 10, // Number of suggestions to fetch per query.
@@ -81,24 +81,24 @@ const AutocompleteWithSuggestions = ( {
81
81
  const handleFetchSaved = fetchSavedPosts
82
82
  ? fetchSavedPosts
83
83
  : async ( postIds = [], searchSlug = null ) => {
84
- const postTypeSlug = searchSlug || postTypeToSearch;
85
- const endpoint =
84
+ const postTypeSlug = searchSlug || postTypeToSearch;
85
+ const endpoint =
86
86
  'post' === postTypeSlug || 'page' === postTypeSlug
87
87
  ? postTypeSlug + 's' // Default post type endpoints are plural.
88
88
  : postTypeSlug; // Custom post type endpoints are singular.
89
- const posts = await apiFetch( {
90
- path: addQueryArgs( '/wp/v2/' + endpoint, {
91
- per_page: 100,
92
- include: postIds.join( ',' ),
93
- _fields: 'id,title',
94
- } ),
95
- } );
89
+ const posts = await apiFetch( {
90
+ path: addQueryArgs( '/wp/v2/' + endpoint, {
91
+ per_page: 100,
92
+ include: postIds.join( ',' ),
93
+ _fields: 'id,title',
94
+ } ),
95
+ } );
96
96
 
97
- return posts.map( post => ( {
98
- value: parseInt( post.id ),
99
- label: decodeEntities( post.title ) || __( '(no title)', 'newspack' ),
100
- } ) );
101
- };
97
+ return posts.map( post => ( {
98
+ value: parseInt( post.id ),
99
+ label: decodeEntities( post.title ) || __( '(no title)', 'newspack-plugin' ),
100
+ } ) );
101
+ };
102
102
 
103
103
  /**
104
104
  * If passed a `fetchSuggestions` prop, use that, otherwise, build it based on the selected post type.
@@ -106,36 +106,36 @@ const AutocompleteWithSuggestions = ( {
106
106
  const handleFetchSuggestions = fetchSuggestions
107
107
  ? fetchSuggestions
108
108
  : async ( search = null, offset = 0, searchSlug = null ) => {
109
- const postTypeSlug = searchSlug || postTypeToSearch;
110
- const endpoint =
109
+ const postTypeSlug = searchSlug || postTypeToSearch;
110
+ const endpoint =
111
111
  'post' === postTypeSlug || 'page' === postTypeSlug
112
112
  ? postTypeSlug + 's' // Default post type endpoints are plural.
113
113
  : postTypeSlug; // Custom post type endpoints are singular.
114
- const response = await apiFetch( {
115
- parse: false,
116
- path: addQueryArgs( '/wp/v2/' + endpoint, {
117
- search,
118
- offset,
119
- per_page: suggestionsToFetch,
120
- _fields: 'id,title',
121
- } ),
122
- } );
114
+ const response = await apiFetch( {
115
+ parse: false,
116
+ path: addQueryArgs( '/wp/v2/' + endpoint, {
117
+ search,
118
+ offset,
119
+ per_page: suggestionsToFetch,
120
+ _fields: 'id,title',
121
+ } ),
122
+ } );
123
123
 
124
- const total = parseInt( response.headers.get( 'x-wp-total' ) || 0 );
125
- const posts = await response.json();
124
+ const total = parseInt( response.headers.get( 'x-wp-total' ) || 0 );
125
+ const posts = await response.json();
126
126
 
127
- setMaxSuggestions( total );
127
+ setMaxSuggestions( total );
128
128
 
129
- // Format suggestions for FormTokenField display.
130
- return posts.reduce( ( acc, post ) => {
131
- acc.push( {
132
- value: parseInt( post.id ),
133
- label: decodeEntities( post?.title.rendered ) || __( '(no title)', 'newspack' ),
134
- } );
129
+ // Format suggestions for FormTokenField display.
130
+ return posts.reduce( ( acc, post ) => {
131
+ acc.push( {
132
+ value: parseInt( post.id ),
133
+ label: decodeEntities( post?.title.rendered ) || __( '(no title)', 'newspack-plugin' ),
134
+ } );
135
135
 
136
- return acc;
137
- }, [] );
138
- };
136
+ return acc;
137
+ }, [] );
138
+ };
139
139
 
140
140
  /**
141
141
  * Intercept onChange callback so we can decide whether to allow multiple selections.
@@ -176,22 +176,24 @@ const AutocompleteWithSuggestions = ( {
176
176
  const selections = selectedPost ? [ ...selectedItems, selectedPost ] : selectedItems;
177
177
  const selectedMessage = multiSelect
178
178
  ? sprintf(
179
- // Translators: %1: the length of selections. %2: the selection leabel.
180
- __( '%1$s %2$s selected', 'newspack' ),
181
- selections.length,
182
- selections.length > 1 ? postTypeLabelPlural : postTypeLabel
183
- )
184
- : // Translators: %s: The label for the selection.
185
- sprintf( __( 'Selected %s', 'newspack' ), postTypeLabel );
179
+ // Translators: %1: the length of selections. %2: the selection leabel.
180
+ __( '%1$s %2$s selected', 'newspack-plugin' ),
181
+ selections.length,
182
+ selections.length > 1 ? postTypeLabelPlural : postTypeLabel
183
+ ) : sprintf(
184
+ // Translators: %s: The label for the selection.
185
+ __( 'Selected %s', 'newspack-plugin' ),
186
+ postTypeLabel
187
+ );
186
188
 
187
189
  return (
188
190
  <div className="newspack-autocomplete-with-suggestions__selected-items">
189
191
  <p className="newspack-autocomplete-with-suggestions__label">
190
192
  { selectedMessage }
191
- { 1 < selections.length && _x( ' – ', 'separator character', 'newspack' ) }
193
+ { 1 < selections.length && _x( ' – ', 'separator character', 'newspack-plugin' ) }
192
194
  { 1 < selections.length && (
193
195
  <Button onClick={ () => onChange( [] ) } isLink isDestructive>
194
- { __( 'Clear all', 'newspack' ) }
196
+ { __( 'Clear all', 'newspack-plugin' ) }
195
197
  </Button>
196
198
  ) }
197
199
  </p>
@@ -219,7 +221,7 @@ const AutocompleteWithSuggestions = ( {
219
221
  <SelectControl
220
222
  label={ sprintf(
221
223
  // Translators: %s: The name of the type.
222
- __( '%s type', 'newspack' ),
224
+ __( '%s type', 'newspack-plugin' ),
223
225
  postTypeLabel.charAt( 0 ).toUpperCase() + postTypeLabel.slice( 1 )
224
226
  ) }
225
227
  value={ postTypeToSearch }
@@ -265,14 +267,6 @@ const AutocompleteWithSuggestions = ( {
265
267
  * Render a list of suggestions that can be clicked to select instead of searching by title.
266
268
  */
267
269
  const renderSuggestions = () => {
268
- if ( isLoading ) {
269
- return (
270
- <div className="newspack-autocomplete-with-suggestions__suggestions-spinner">
271
- <Spinner />
272
- </div>
273
- );
274
- }
275
-
276
270
  if ( 0 === suggestions.length ) {
277
271
  return null;
278
272
  }
@@ -287,7 +281,7 @@ const AutocompleteWithSuggestions = ( {
287
281
  <p className="newspack-autocomplete-with-suggestions__label">
288
282
  {
289
283
  /* Translators: %s: the name of a post type. */ sprintf(
290
- __( 'Or, select a recent %s:', 'newspack' ),
284
+ __( 'Or, select a recent %s:', 'newspack-plugin' ),
291
285
  postTypeLabel
292
286
  )
293
287
  }
@@ -301,7 +295,9 @@ const AutocompleteWithSuggestions = ( {
301
295
  isSecondary
302
296
  onClick={ () => setIsLoadingMore( true ) }
303
297
  >
304
- { isLoadingMore ? __( 'Loading…', 'newspack' ) : __( 'Load more', 'newspack' ) }
298
+ { isLoadingMore
299
+ ? __( 'Loading…', 'newspack-plugin' )
300
+ : __( 'Load more', 'newspack-plugin' ) }
305
301
  </Button>
306
302
  ) }
307
303
  </div>
@@ -319,6 +315,7 @@ const AutocompleteWithSuggestions = ( {
319
315
  fetchSuggestions={ async search => handleFetchSuggestions( search, 0, postTypeToSearch ) }
320
316
  fetchSavedInfo={ postIds => handleFetchSaved( postIds ) }
321
317
  label={ label }
318
+ loading={ isLoading }
322
319
  help={ ! hideHelp && help }
323
320
  returnFullObjects
324
321
  />
@@ -2,7 +2,7 @@
2
2
  * Styles for AutocompleteWithSuggestions component.
3
3
  */
4
4
 
5
- @use '~@wordpress/base-styles/colors' as wp-colors;
5
+ @use "~@wordpress/base-styles/colors" as wp-colors;
6
6
 
7
7
  .newspack-autocomplete-with-suggestions {
8
8
  width: 100%;
@@ -15,13 +15,6 @@
15
15
  margin-top: 16px;
16
16
  }
17
17
  }
18
-
19
- .components-spinner {
20
- margin: 8px;
21
- right: 0;
22
- top: calc( 1.4em + 8px );
23
- }
24
-
25
18
  .components-select-control__input {
26
19
  max-width: none;
27
20
  }
@@ -104,7 +97,7 @@
104
97
  padding-right: 8px;
105
98
 
106
99
  &::after {
107
- content: '✕';
100
+ content: "✕";
108
101
  margin-left: 8px;
109
102
  }
110
103
 
@@ -119,8 +112,7 @@
119
112
  border-radius: 2px;
120
113
  border: 1px solid wp-colors.$gray-700;
121
114
  max-height: 178px;
122
- overflow-x: visible;
123
- overflow-y: auto;
115
+ overflow: visible auto;
124
116
  padding: 8px 8px 0;
125
117
 
126
118
  .components-button {
@@ -134,10 +126,10 @@
134
126
  text-decoration: none;
135
127
  width: 100%;
136
128
 
137
- &:active:not( :disabled ),
138
- &:hover:not( :disabled ) {
129
+ &:active:not(:disabled),
130
+ &:hover:not(:disabled) {
139
131
  background: wp-colors.$gray-900;
140
- background: var( --wp-admin-theme-color );
132
+ background: var(--wp-admin-theme-color);
141
133
  color: white;
142
134
  }
143
135
  }
@@ -157,14 +149,14 @@
157
149
  .components-button {
158
150
  line-height: normal;
159
151
 
160
- &:focus:not( :disabled ) {
152
+ &:focus:not(:disabled) {
161
153
  border-radius: 0;
162
154
  box-shadow: inset 0 0 0 1.5px wp-colors.$gray-900;
163
- box-shadow: inset 0 0 0 var( --wp-admin-border-width-focus ) var( --wp-admin-theme-color );
155
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
164
156
  }
165
157
 
166
158
  &.is-secondary {
167
- width: calc( 100% - 16px );
159
+ width: calc(100% - 16px);
168
160
  }
169
161
  }
170
162
  }