newspack-components 4.3.0 → 4.4.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/DEVELOPMENT.md +868 -0
  3. package/colors/colors.module.scss +52 -2
  4. package/copy-styles.js +3 -2
  5. package/dist/cjs/accordion/index.js +17 -12
  6. package/dist/cjs/action-card/index.js +176 -139
  7. package/dist/cjs/autocomplete-tokenfield/index.js +254 -234
  8. package/dist/cjs/autocomplete-with-latest-posts/index.js +172 -110
  9. package/dist/cjs/autocomplete-with-suggestions/index.js +229 -126
  10. package/dist/cjs/badge/index.js +7 -7
  11. package/dist/cjs/box-contrast/index.js +19 -15
  12. package/dist/cjs/button/index.js +41 -26
  13. package/dist/cjs/button-props/button-props.js +5 -5
  14. package/dist/cjs/button-props/index.js +2 -2
  15. package/dist/cjs/card/core-card.js +110 -52
  16. package/dist/cjs/card/index.js +74 -67
  17. package/dist/cjs/card/style-core.scss +93 -25
  18. package/dist/cjs/card/style.scss +2 -2
  19. package/dist/cjs/card-feature/index.js +141 -0
  20. package/dist/cjs/card-feature/style.scss +75 -0
  21. package/dist/cjs/card-form/index.js +144 -0
  22. package/dist/cjs/card-form/style.scss +20 -0
  23. package/dist/cjs/card-settings-group/index.js +36 -16
  24. package/dist/cjs/card-sortable-list/index.js +176 -140
  25. package/dist/cjs/category-autocomplete/index.js +175 -155
  26. package/dist/cjs/color-picker/index.js +41 -23
  27. package/dist/cjs/color-picker/index.test.js +82 -0
  28. package/dist/cjs/color-picker/style.scss +11 -13
  29. package/dist/cjs/confirm-dialog/index.js +86 -22
  30. package/dist/cjs/consts.js +1 -1
  31. package/dist/cjs/custom-select-control/index.js +39 -28
  32. package/dist/cjs/dataviews/index.js +38 -0
  33. package/dist/cjs/dataviews/style.scss +9 -0
  34. package/dist/cjs/divider/index.js +26 -21
  35. package/dist/cjs/footer/index.js +36 -30
  36. package/dist/cjs/form-token-field/index.js +51 -40
  37. package/dist/cjs/global-notices/index.js +5 -5
  38. package/dist/cjs/grid/index.js +25 -19
  39. package/dist/cjs/grid/style.scss +6 -1
  40. package/dist/cjs/handoff/index.js +204 -156
  41. package/dist/cjs/handoff-message/index.js +12 -7
  42. package/dist/cjs/hooks/index.js +10 -8
  43. package/dist/cjs/hooks/use-confirm-dialog.js +79 -0
  44. package/dist/cjs/hooks/use-unsaved-changes-dialog.js +144 -0
  45. package/dist/cjs/hooks/useObjectState.js +21 -12
  46. package/dist/cjs/hooks/useObjectState.test.js +55 -33
  47. package/dist/cjs/hooks/useOnClickOutside.js +6 -6
  48. package/dist/cjs/hooks/usePrompt.js +10 -13
  49. package/dist/cjs/image-upload/index.js +114 -123
  50. package/dist/cjs/image-upload/index.test.js +11 -13
  51. package/dist/cjs/image-upload/style.scss +12 -40
  52. package/dist/cjs/index.js +136 -104
  53. package/dist/cjs/info-button/index.js +43 -32
  54. package/dist/cjs/integration-icons/active-campaign.js +22 -0
  55. package/dist/cjs/integration-icons/constant-contact.js +28 -0
  56. package/dist/cjs/integration-icons/fundraise-up.js +25 -0
  57. package/dist/cjs/integration-icons/index.js +48 -0
  58. package/dist/cjs/integration-icons/mailchimp.js +19 -0
  59. package/dist/cjs/integration-icons/salesforce.js +17 -0
  60. package/dist/cjs/integration-icons/wisepops.js +20 -0
  61. package/dist/cjs/modal/index.js +22 -19
  62. package/dist/cjs/modal/style.scss +4 -0
  63. package/dist/cjs/newspack-icon/index.js +45 -38
  64. package/dist/cjs/notice/index.js +64 -55
  65. package/dist/cjs/plugin-installer/index.js +259 -253
  66. package/dist/cjs/plugin-settings/SettingsSection.js +66 -60
  67. package/dist/cjs/plugin-settings/index.js +217 -200
  68. package/dist/cjs/plugin-toggle/index.js +192 -199
  69. package/dist/cjs/popover/index.js +41 -28
  70. package/dist/cjs/position-control/index.js +24 -23
  71. package/dist/cjs/progress-bar/index.js +71 -59
  72. package/dist/cjs/progress-bar/index.test.js +62 -68
  73. package/dist/cjs/proxied-imports/router.js +3 -3
  74. package/dist/cjs/radio-control/index.js +40 -27
  75. package/dist/cjs/section-header/index.js +103 -58
  76. package/dist/cjs/section-header/style.scss +31 -11
  77. package/dist/cjs/select-control/ButtonGroupControl.js +26 -21
  78. package/dist/cjs/select-control/GroupedSelectControl.js +41 -35
  79. package/dist/cjs/select-control/index.js +52 -40
  80. package/dist/cjs/settings/MinMaxSetting.js +30 -20
  81. package/dist/cjs/settings/SettingsCard.js +20 -17
  82. package/dist/cjs/settings/SettingsSection.js +22 -21
  83. package/dist/cjs/settings/index.js +5 -5
  84. package/dist/cjs/sortable-newsletter-list-control/index.js +78 -57
  85. package/dist/cjs/steps-list/index.js +44 -34
  86. package/dist/cjs/steps-list-item/index.js +47 -39
  87. package/dist/cjs/style-card/index.js +70 -63
  88. package/dist/cjs/tabbed-navigation/index.js +38 -36
  89. package/dist/cjs/text-control/index.js +27 -25
  90. package/dist/cjs/utils/color.js +4 -4
  91. package/dist/cjs/utils/editor-toolbar-back-button.js +61 -0
  92. package/dist/cjs/utils/index.js +31 -19
  93. package/dist/cjs/utils/style.scss +8 -0
  94. package/dist/cjs/waiting/index.js +48 -37
  95. package/dist/cjs/web-preview/index.js +217 -211
  96. package/dist/cjs/with-wizard/index.js +362 -364
  97. package/dist/cjs/with-wizard/style.scss +4 -54
  98. package/dist/cjs/with-wizard-screen/index.js +54 -58
  99. package/dist/cjs/with-wizard-screen/style.scss +41 -3
  100. package/dist/cjs/wizard/components/WizardError.js +20 -18
  101. package/dist/cjs/wizard/components/WizardSnackbar.js +26 -23
  102. package/dist/cjs/wizard/index.js +176 -114
  103. package/dist/cjs/wizard/store/index.js +171 -123
  104. package/dist/cjs/wizard/store/utils.js +13 -8
  105. package/dist/esm/accordion/index.js +14 -9
  106. package/dist/esm/action-card/index.js +168 -123
  107. package/dist/esm/autocomplete-tokenfield/index.js +248 -222
  108. package/dist/esm/autocomplete-with-latest-posts/index.js +169 -103
  109. package/dist/esm/autocomplete-with-suggestions/index.js +226 -119
  110. package/dist/esm/badge/index.js +5 -5
  111. package/dist/esm/box-contrast/index.js +15 -11
  112. package/dist/esm/button/index.js +39 -21
  113. package/dist/esm/button-props/button-props.js +1 -1
  114. package/dist/esm/card/core-card.js +109 -47
  115. package/dist/esm/card/index.js +69 -54
  116. package/dist/esm/card/style-core.scss +93 -25
  117. package/dist/esm/card/style.scss +2 -2
  118. package/dist/esm/card-feature/index.js +131 -0
  119. package/dist/esm/card-feature/style.scss +75 -0
  120. package/dist/esm/card-form/index.js +134 -0
  121. package/dist/esm/card-form/style.scss +20 -0
  122. package/dist/esm/card-settings-group/index.js +33 -14
  123. package/dist/esm/card-sortable-list/index.js +170 -126
  124. package/dist/esm/category-autocomplete/index.js +168 -140
  125. package/dist/esm/color-picker/index.js +39 -21
  126. package/dist/esm/color-picker/index.test.js +78 -0
  127. package/dist/esm/color-picker/style.scss +11 -13
  128. package/dist/esm/confirm-dialog/index.js +85 -18
  129. package/dist/esm/consts.js +1 -1
  130. package/dist/esm/custom-select-control/index.js +34 -15
  131. package/dist/esm/dataviews/index.js +34 -0
  132. package/dist/esm/dataviews/style.scss +9 -0
  133. package/dist/esm/divider/index.js +24 -16
  134. package/dist/esm/footer/index.js +34 -28
  135. package/dist/esm/form-token-field/index.js +46 -27
  136. package/dist/esm/global-notices/index.js +3 -3
  137. package/dist/esm/grid/index.js +23 -14
  138. package/dist/esm/grid/style.scss +6 -1
  139. package/dist/esm/handoff/index.js +199 -143
  140. package/dist/esm/handoff-message/index.js +10 -6
  141. package/dist/esm/hooks/index.js +8 -6
  142. package/dist/esm/hooks/use-confirm-dialog.js +73 -0
  143. package/dist/esm/hooks/use-unsaved-changes-dialog.js +136 -0
  144. package/dist/esm/hooks/useObjectState.js +19 -9
  145. package/dist/esm/hooks/useObjectState.test.js +54 -32
  146. package/dist/esm/hooks/useOnClickOutside.js +4 -4
  147. package/dist/esm/hooks/usePrompt.js +9 -11
  148. package/dist/esm/image-upload/index.js +110 -111
  149. package/dist/esm/image-upload/index.test.js +11 -13
  150. package/dist/esm/image-upload/style.scss +12 -40
  151. package/dist/esm/index.js +7 -1
  152. package/dist/esm/info-button/index.js +38 -19
  153. package/dist/esm/integration-icons/active-campaign.js +16 -0
  154. package/dist/esm/integration-icons/constant-contact.js +22 -0
  155. package/dist/esm/integration-icons/fundraise-up.js +19 -0
  156. package/dist/esm/integration-icons/index.js +6 -0
  157. package/dist/esm/integration-icons/mailchimp.js +13 -0
  158. package/dist/esm/integration-icons/salesforce.js +11 -0
  159. package/dist/esm/integration-icons/wisepops.js +14 -0
  160. package/dist/esm/modal/index.js +20 -13
  161. package/dist/esm/modal/style.scss +4 -0
  162. package/dist/esm/newspack-icon/index.js +40 -25
  163. package/dist/esm/notice/index.js +59 -42
  164. package/dist/esm/plugin-installer/index.js +255 -243
  165. package/dist/esm/plugin-settings/SettingsSection.js +61 -50
  166. package/dist/esm/plugin-settings/index.js +212 -189
  167. package/dist/esm/plugin-toggle/index.js +187 -190
  168. package/dist/esm/popover/index.js +35 -16
  169. package/dist/esm/position-control/index.js +22 -18
  170. package/dist/esm/progress-bar/index.js +66 -49
  171. package/dist/esm/progress-bar/index.test.js +61 -67
  172. package/dist/esm/radio-control/index.js +34 -15
  173. package/dist/esm/section-header/index.js +102 -57
  174. package/dist/esm/section-header/style.scss +31 -11
  175. package/dist/esm/select-control/ButtonGroupControl.js +23 -18
  176. package/dist/esm/select-control/GroupedSelectControl.js +38 -30
  177. package/dist/esm/select-control/index.js +47 -27
  178. package/dist/esm/settings/MinMaxSetting.js +27 -16
  179. package/dist/esm/settings/SettingsCard.js +18 -13
  180. package/dist/esm/settings/SettingsSection.js +20 -19
  181. package/dist/esm/settings/index.js +3 -3
  182. package/dist/esm/sortable-newsletter-list-control/index.js +74 -53
  183. package/dist/esm/steps-list/index.js +39 -21
  184. package/dist/esm/steps-list-item/index.js +42 -26
  185. package/dist/esm/style-card/index.js +65 -50
  186. package/dist/esm/tabbed-navigation/index.js +35 -33
  187. package/dist/esm/text-control/index.js +25 -19
  188. package/dist/esm/utils/color.js +4 -4
  189. package/dist/esm/utils/editor-toolbar-back-button.js +53 -0
  190. package/dist/esm/utils/index.js +29 -16
  191. package/dist/esm/utils/style.scss +8 -0
  192. package/dist/esm/waiting/index.js +43 -24
  193. package/dist/esm/web-preview/index.js +213 -201
  194. package/dist/esm/with-wizard/index.js +360 -358
  195. package/dist/esm/with-wizard/style.scss +4 -54
  196. package/dist/esm/with-wizard-screen/index.js +48 -46
  197. package/dist/esm/with-wizard-screen/style.scss +41 -3
  198. package/dist/esm/wizard/components/WizardError.js +18 -16
  199. package/dist/esm/wizard/components/WizardSnackbar.js +23 -17
  200. package/dist/esm/wizard/index.js +171 -103
  201. package/dist/esm/wizard/store/index.js +169 -116
  202. package/dist/esm/wizard/store/utils.js +13 -6
  203. package/package.json +30 -16
  204. package/release.config.js +1 -0
  205. package/shared/hooks/use-coauthors.js +195 -27
  206. package/shared/hooks/use-coauthors.test.js +232 -6
  207. package/shared/scss/_mixins.scss +13 -5
  208. package/src/accordion/index.js +8 -7
  209. package/src/action-card/index.js +15 -1
  210. package/src/badge/index.tsx +3 -1
  211. package/src/card/core-card.js +95 -18
  212. package/src/card/index.js +1 -0
  213. package/src/card/style-core.scss +93 -25
  214. package/src/card/style.scss +2 -2
  215. package/src/card-feature/README.md +188 -0
  216. package/src/card-feature/index.tsx +186 -0
  217. package/src/card-feature/style.scss +75 -0
  218. package/src/card-form/README.md +113 -0
  219. package/src/card-form/index.tsx +128 -0
  220. package/src/card-form/style.scss +20 -0
  221. package/src/card-settings-group/index.tsx +28 -3
  222. package/src/card-sortable-list/index.tsx +27 -4
  223. package/src/color-picker/index.js +15 -8
  224. package/src/color-picker/index.test.js +52 -0
  225. package/src/color-picker/style.scss +11 -13
  226. package/src/confirm-dialog/README.md +128 -0
  227. package/src/confirm-dialog/index.tsx +74 -6
  228. package/src/dataviews/index.tsx +34 -0
  229. package/src/dataviews/style.scss +9 -0
  230. package/src/grid/style.scss +6 -1
  231. package/src/handoff/README.md +93 -0
  232. package/src/handoff/index.js +46 -8
  233. package/src/hooks/index.ts +2 -1
  234. package/src/hooks/use-confirm-dialog.tsx +80 -0
  235. package/src/hooks/use-unsaved-changes-dialog.tsx +140 -0
  236. package/src/image-upload/index.js +10 -15
  237. package/src/image-upload/style.scss +12 -40
  238. package/src/index.js +7 -1
  239. package/src/integration-icons/active-campaign.js +14 -0
  240. package/src/integration-icons/constant-contact.js +22 -0
  241. package/src/integration-icons/fundraise-up.js +18 -0
  242. package/src/integration-icons/index.js +6 -0
  243. package/src/integration-icons/mailchimp.js +10 -0
  244. package/src/integration-icons/salesforce.js +10 -0
  245. package/src/integration-icons/wisepops.js +14 -0
  246. package/src/modal/style.scss +4 -0
  247. package/src/plugin-installer/index.js +30 -19
  248. package/src/section-header/index.js +56 -24
  249. package/src/section-header/style.scss +31 -11
  250. package/src/select-control/index.js +4 -0
  251. package/src/utils/editor-toolbar-back-button.tsx +48 -0
  252. package/src/utils/index.js +6 -0
  253. package/src/utils/style.scss +8 -0
  254. package/src/with-wizard/style.scss +4 -54
  255. package/src/with-wizard-screen/style.scss +41 -3
  256. package/src/wizard/index.js +90 -53
  257. package/src/wizard/store/index.js +2 -2
  258. package/dist/cjs/button-card/index.js +0 -72
  259. package/dist/cjs/button-card/style.scss +0 -180
  260. package/dist/esm/button-card/index.js +0 -64
  261. package/dist/esm/button-card/style.scss +0 -180
  262. package/src/button-card/index.js +0 -52
  263. package/src/button-card/style.scss +0 -180
@@ -1,3 +1,13 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/createClass";
3
+ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
4
+ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
5
+ import _inherits from "@babel/runtime/helpers/inherits";
6
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
7
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
8
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
10
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
1
11
  /**
2
12
  * Category Autocomplete
3
13
  */
@@ -28,155 +38,173 @@ import classnames from 'classnames';
28
38
  * Category autocomplete field component.
29
39
  */
30
40
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
31
- class CategoryAutocomplete extends Component {
32
- state = {
33
- suggestions: {},
34
- allCategories: {},
35
- isLoading: false
36
- };
37
-
41
+ var CategoryAutocomplete = /*#__PURE__*/function (_Component) {
38
42
  /**
39
43
  * Class constructor.
40
44
  */
41
- constructor(props) {
42
- super(props);
43
- this.debouncedUpdateSuggestions = debounce(this.updateSuggestions, 100);
44
- }
45
- componentDidMount() {
46
- this.setState({
47
- isLoading: true
48
- });
49
- apiFetch({
50
- path: addQueryArgs(`/wp/v2/${this.props.taxonomy}`, {
51
- per_page: -1,
52
- _fields: 'id,name'
53
- })
54
- }).then(categories => this.setState({
55
- allCategories: categories
56
- })).finally(() => this.setState({
45
+ function CategoryAutocomplete(props) {
46
+ var _this;
47
+ _classCallCheck(this, CategoryAutocomplete);
48
+ _this = _callSuper(this, CategoryAutocomplete, [props]);
49
+ _defineProperty(_this, "state", {
50
+ suggestions: {},
51
+ allCategories: {},
57
52
  isLoading: false
58
- }));
59
- }
60
-
61
- /**
62
- * Clean up debounced suggestions method.
63
- */
64
- componentWillUnmount() {
65
- this.debouncedUpdateSuggestions.cancel();
66
- }
67
-
68
- /**
69
- * Refresh the autocomplete UI based on text that was typed.
70
- *
71
- * @param {string} search The typed text to search for.
72
- */
73
- updateSuggestions(search) {
74
- this.setState({
75
- isLoading: true
76
53
  });
77
- apiFetch({
78
- path: addQueryArgs(`/wp/v2/${this.props.taxonomy}`, {
79
- search,
80
- per_page: 20,
81
- _fields: 'id,name',
82
- orderby: 'count',
83
- order: 'desc'
84
- })
85
- }).then(categories => {
86
- this.setState({
87
- suggestions: categories.reduce((accumulator, category) => ({
88
- ...accumulator,
89
- [category.name]: category
90
- }), {})
54
+ /**
55
+ * Prepare categories data for the API endpoint, call the change handler.
56
+ *
57
+ * @param {Array} tokens An array of category tokens.
58
+ */
59
+ _defineProperty(_this, "handleOnChange", function (tokens) {
60
+ var onChange = _this.props.onChange;
61
+ var suggestions = _this.state.suggestions;
62
+ // Categories that are already will be objects, while new additions will be strings (the name).
63
+ // allValues nomalizes the array so that they are all objects.
64
+ var allValues = tokens.filter(function (token) {
65
+ return 'undefined' !== typeof token;
66
+ }) // Ensure each token is a valid value.
67
+ .map(function (token) {
68
+ return 'string' === typeof token ? suggestions[token] : token;
69
+ }).filter(Boolean);
70
+ onChange(allValues);
71
+ });
72
+ _defineProperty(_this, "getAvailableSuggestions", function () {
73
+ var value = _this.props.value;
74
+ var suggestions = _this.state.suggestions;
75
+ var selectedIds = value.reduce(function (acc, item) {
76
+ if (item !== null && item !== void 0 && item.id) {
77
+ acc.push(item.id);
78
+ }
79
+ return acc;
80
+ }, []);
81
+ var availableSuggestions = filter(suggestions, function (_ref) {
82
+ var id = _ref.id;
83
+ return selectedIds.indexOf(id) === -1;
91
84
  });
92
- }).finally(() => this.setState({
93
- isLoading: false
94
- }));
85
+ return availableSuggestions.map(function (v) {
86
+ return v.name;
87
+ });
88
+ });
89
+ _this.debouncedUpdateSuggestions = debounce(_this.updateSuggestions, 100);
90
+ return _this;
95
91
  }
92
+ _inherits(CategoryAutocomplete, _Component);
93
+ return _createClass(CategoryAutocomplete, [{
94
+ key: "componentDidMount",
95
+ value: function componentDidMount() {
96
+ var _this2 = this;
97
+ this.setState({
98
+ isLoading: true
99
+ });
100
+ apiFetch({
101
+ path: addQueryArgs("/wp/v2/".concat(this.props.taxonomy), {
102
+ per_page: -1,
103
+ _fields: 'id,name'
104
+ })
105
+ }).then(function (categories) {
106
+ return _this2.setState({
107
+ allCategories: categories
108
+ });
109
+ })["finally"](function () {
110
+ return _this2.setState({
111
+ isLoading: false
112
+ });
113
+ });
114
+ }
96
115
 
97
- /**
98
- * Prepare categories data for the API endpoint, call the change handler.
99
- *
100
- * @param {Array} tokens An array of category tokens.
101
- */
102
- handleOnChange = tokens => {
103
- const {
104
- onChange
105
- } = this.props;
106
- const {
107
- suggestions
108
- } = this.state;
109
- // Categories that are already will be objects, while new additions will be strings (the name).
110
- // allValues nomalizes the array so that they are all objects.
111
- const allValues = tokens.filter(token => 'undefined' !== typeof token) // Ensure each token is a valid value.
112
- .map(token => 'string' === typeof token ? suggestions[token] : token).filter(Boolean);
113
- onChange(allValues);
114
- };
115
- getAvailableSuggestions = () => {
116
- const {
117
- value
118
- } = this.props;
119
- const {
120
- suggestions
121
- } = this.state;
122
- const selectedIds = value.reduce((acc, item) => {
123
- if (item?.id) {
124
- acc.push(item.id);
125
- }
126
- return acc;
127
- }, []);
128
- const availableSuggestions = filter(suggestions, ({
129
- id
130
- }) => selectedIds.indexOf(id) === -1);
131
- return availableSuggestions.map(v => v.name);
132
- };
116
+ /**
117
+ * Clean up debounced suggestions method.
118
+ */
119
+ }, {
120
+ key: "componentWillUnmount",
121
+ value: function componentWillUnmount() {
122
+ this.debouncedUpdateSuggestions.cancel();
123
+ }
133
124
 
134
- /**
135
- * Render the component.
136
- */
137
- render() {
138
- const {
139
- className,
140
- disabled,
141
- description,
142
- hideHelpFromVision,
143
- hideLabelFromVision,
144
- label,
145
- value
146
- } = this.props;
147
- const {
148
- allCategories,
149
- isLoading
150
- } = this.state;
151
- const classes = classnames('newspack-category-autocomplete', className);
152
- return /*#__PURE__*/_jsxs("div", {
153
- className: classes,
154
- children: [/*#__PURE__*/_jsx(FormTokenField, {
155
- onInputChange: input => this.debouncedUpdateSuggestions(input),
156
- value: value.reduce((acc, item) => {
157
- const categoryOrItem = typeof item === 'number' ? find(allCategories, ['id', item]) : item;
158
- if (categoryOrItem) {
159
- acc.push({
160
- id: categoryOrItem.term_id || categoryOrItem.id,
161
- value: categoryOrItem.value || categoryOrItem.name
162
- });
163
- }
164
- return acc;
165
- }, []),
166
- suggestions: this.getAvailableSuggestions(),
167
- onChange: this.handleOnChange,
168
- label: label,
169
- disabled: disabled,
170
- description: description,
171
- hideHelpFromVision: hideHelpFromVision,
172
- hideLabelFromVision: hideLabelFromVision
173
- }), isLoading ? /*#__PURE__*/_jsx("span", {
174
- className: "newspack-category-autocomplete__suggestions-spinner",
175
- children: /*#__PURE__*/_jsx(Spinner, {})
176
- }) : null]
177
- });
178
- }
179
- }
125
+ /**
126
+ * Refresh the autocomplete UI based on text that was typed.
127
+ *
128
+ * @param {string} search The typed text to search for.
129
+ */
130
+ }, {
131
+ key: "updateSuggestions",
132
+ value: function updateSuggestions(search) {
133
+ var _this3 = this;
134
+ this.setState({
135
+ isLoading: true
136
+ });
137
+ apiFetch({
138
+ path: addQueryArgs("/wp/v2/".concat(this.props.taxonomy), {
139
+ search: search,
140
+ per_page: 20,
141
+ _fields: 'id,name',
142
+ orderby: 'count',
143
+ order: 'desc'
144
+ })
145
+ }).then(function (categories) {
146
+ _this3.setState({
147
+ suggestions: categories.reduce(function (accumulator, category) {
148
+ return _objectSpread(_objectSpread({}, accumulator), {}, _defineProperty({}, category.name, category));
149
+ }, {})
150
+ });
151
+ })["finally"](function () {
152
+ return _this3.setState({
153
+ isLoading: false
154
+ });
155
+ });
156
+ }
157
+ }, {
158
+ key: "render",
159
+ value:
160
+ /**
161
+ * Render the component.
162
+ */
163
+ function render() {
164
+ var _this4 = this;
165
+ var _this$props = this.props,
166
+ className = _this$props.className,
167
+ disabled = _this$props.disabled,
168
+ description = _this$props.description,
169
+ hideHelpFromVision = _this$props.hideHelpFromVision,
170
+ hideLabelFromVision = _this$props.hideLabelFromVision,
171
+ label = _this$props.label,
172
+ value = _this$props.value;
173
+ var _this$state = this.state,
174
+ allCategories = _this$state.allCategories,
175
+ isLoading = _this$state.isLoading;
176
+ var classes = classnames('newspack-category-autocomplete', className);
177
+ return /*#__PURE__*/_jsxs("div", {
178
+ className: classes,
179
+ children: [/*#__PURE__*/_jsx(FormTokenField, {
180
+ onInputChange: function onInputChange(input) {
181
+ return _this4.debouncedUpdateSuggestions(input);
182
+ },
183
+ value: value.reduce(function (acc, item) {
184
+ var categoryOrItem = typeof item === 'number' ? find(allCategories, ['id', item]) : item;
185
+ if (categoryOrItem) {
186
+ acc.push({
187
+ id: categoryOrItem.term_id || categoryOrItem.id,
188
+ value: categoryOrItem.value || categoryOrItem.name
189
+ });
190
+ }
191
+ return acc;
192
+ }, []),
193
+ suggestions: this.getAvailableSuggestions(),
194
+ onChange: this.handleOnChange,
195
+ label: label,
196
+ disabled: disabled,
197
+ description: description,
198
+ hideHelpFromVision: hideHelpFromVision,
199
+ hideLabelFromVision: hideLabelFromVision
200
+ }), isLoading ? /*#__PURE__*/_jsx("span", {
201
+ className: "newspack-category-autocomplete__suggestions-spinner",
202
+ children: /*#__PURE__*/_jsx(Spinner, {})
203
+ }) : null]
204
+ });
205
+ }
206
+ }]);
207
+ }(Component);
180
208
  CategoryAutocomplete.defaultProps = {
181
209
  taxonomy: 'categories'
182
210
  };
@@ -1,7 +1,9 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
1
2
  /**
2
3
  * WordPress dependencies.
3
4
  */
4
- import { ColorPicker as ColorPickerComponent } from '@wordpress/components';
5
+ import { BaseControl, ColorPicker as ColorPickerComponent } from '@wordpress/components';
6
+ import { useInstanceId } from '@wordpress/compose';
5
7
  import { useState, useRef } from '@wordpress/element';
6
8
 
7
9
  /**
@@ -19,41 +21,57 @@ import utils from '../utils';
19
21
  import './style.scss';
20
22
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
21
23
  extend([a11yPlugin]);
22
- const {
23
- InteractiveDiv
24
- } = utils;
24
+ var InteractiveDiv = utils.InteractiveDiv;
25
25
 
26
26
  /**
27
27
  * ColorPicker component.
28
28
  *
29
29
  * @param {Object} props - Component props.
30
30
  * @param {JSX.Element|string} props.label - Label for the color picker.
31
+ * @param {JSX.Element|string} props.help - Help text for the color picker.
31
32
  * @param {string} [props.color] - Default color.
32
33
  * @param {Function} props.onChange - Function to call when the color changes.
33
34
  * @param {string} [props.className] - Additional class name.
34
35
  * @return {JSX.Element} ColorPicker component.
35
36
  */
36
- const ColorPicker = ({
37
- label,
38
- color = '#fff',
39
- onChange,
40
- className
41
- }) => {
42
- const [isExpanded, setIsExpanded] = useState(false);
43
- const ref = useRef();
44
- const colordColor = colord(color);
45
- hooks.useOnClickOutside(ref, () => setIsExpanded(false));
46
- return /*#__PURE__*/_jsxs("div", {
37
+ var _ColorPicker = function ColorPicker(_ref) {
38
+ var label = _ref.label,
39
+ help = _ref.help,
40
+ _ref$color = _ref.color,
41
+ color = _ref$color === void 0 ? '#ffffff' : _ref$color,
42
+ onChange = _ref.onChange,
43
+ className = _ref.className;
44
+ var _useState = useState(false),
45
+ _useState2 = _slicedToArray(_useState, 2),
46
+ isExpanded = _useState2[0],
47
+ setIsExpanded = _useState2[1];
48
+ var ref = useRef();
49
+ var id = useInstanceId(_ColorPicker, 'newspack-color-picker');
50
+ var labelId = "".concat(id, "-label");
51
+ var colordColor = colord(color);
52
+ hooks.useOnClickOutside(ref, function () {
53
+ return setIsExpanded(false);
54
+ });
55
+ return /*#__PURE__*/_jsxs(BaseControl, {
56
+ id: id,
47
57
  className: classnames('newspack-color-picker', className),
48
- children: [/*#__PURE__*/_jsx("div", {
49
- className: "newspack-color-picker__label",
58
+ help: help,
59
+ __nextHasNoMarginBottom: true,
60
+ children: [/*#__PURE__*/_jsx(BaseControl.VisualLabel, {
61
+ id: labelId,
50
62
  children: label
51
63
  }), /*#__PURE__*/_jsx(InteractiveDiv, {
64
+ id: id,
65
+ "aria-labelledby": labelId,
66
+ "aria-describedby": help ? "".concat(id, "__help") : undefined,
67
+ "aria-expanded": isExpanded,
52
68
  className: 'newspack-color-picker__expander',
53
- onClick: () => setIsExpanded(!isExpanded),
69
+ onClick: function onClick() {
70
+ return setIsExpanded(!isExpanded);
71
+ },
54
72
  style: {
55
73
  backgroundColor: color,
56
- color: colordColor.contrast() > colordColor.contrast('#000') ? '#fff' : '#000'
74
+ color: colordColor.contrast() > colordColor.contrast('#000000') ? '#ffffff' : '#000000'
57
75
  },
58
76
  children: color
59
77
  }), /*#__PURE__*/_jsx("div", {
@@ -61,10 +79,10 @@ const ColorPicker = ({
61
79
  ref: ref,
62
80
  children: isExpanded && /*#__PURE__*/_jsx(ColorPickerComponent, {
63
81
  color: color,
64
- onChange: hex => onChange(hex),
82
+ onChange: onChange,
65
83
  enableAlpha: false
66
84
  })
67
85
  })]
68
86
  });
69
87
  };
70
- export default ColorPicker;
88
+ export default _ColorPicker;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, fireEvent } from '@testing-library/react';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import ColorPicker from './';
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ describe('ColorPicker', function () {
12
+ it('should render the label', function () {
13
+ var _render = render(/*#__PURE__*/_jsx(ColorPicker, {
14
+ label: "Background color",
15
+ onChange: function onChange() {}
16
+ })),
17
+ getByText = _render.getByText;
18
+ expect(getByText('Background color')).toBeInTheDocument();
19
+ });
20
+ it('should render help text', function () {
21
+ var _render2 = render(/*#__PURE__*/_jsx(ColorPicker, {
22
+ label: "Background color",
23
+ help: "Choose a color",
24
+ onChange: function onChange() {}
25
+ })),
26
+ getByText = _render2.getByText;
27
+ expect(getByText('Choose a color')).toBeInTheDocument();
28
+ });
29
+ it('should start collapsed', function () {
30
+ var _render3 = render(/*#__PURE__*/_jsx(ColorPicker, {
31
+ label: "Background color",
32
+ onChange: function onChange() {}
33
+ })),
34
+ getByRole = _render3.getByRole;
35
+ expect(getByRole('button')).toHaveAttribute('aria-expanded', 'false');
36
+ });
37
+ it('should expand when the expander is clicked', function () {
38
+ var _render4 = render(/*#__PURE__*/_jsx(ColorPicker, {
39
+ label: "Background color",
40
+ onChange: function onChange() {}
41
+ })),
42
+ getByRole = _render4.getByRole;
43
+ var expander = getByRole('button');
44
+ fireEvent.click(expander);
45
+ expect(expander).toHaveAttribute('aria-expanded', 'true');
46
+ });
47
+ it('should associate label via aria-labelledby', function () {
48
+ var _render5 = render(/*#__PURE__*/_jsx(ColorPicker, {
49
+ label: "Background color",
50
+ onChange: function onChange() {}
51
+ })),
52
+ getByRole = _render5.getByRole,
53
+ getByText = _render5.getByText;
54
+ var expander = getByRole('button');
55
+ var label = getByText('Background color');
56
+ expect(expander.getAttribute('aria-labelledby')).toBe(label.id);
57
+ });
58
+ it('should associate help text via aria-describedby when help is provided', function () {
59
+ var _render6 = render(/*#__PURE__*/_jsx(ColorPicker, {
60
+ label: "Background color",
61
+ help: "Choose a color",
62
+ onChange: function onChange() {}
63
+ })),
64
+ getByRole = _render6.getByRole,
65
+ getByText = _render6.getByText;
66
+ var expander = getByRole('button');
67
+ var help = getByText('Choose a color');
68
+ expect(expander.getAttribute('aria-describedby')).toBe(help.id);
69
+ });
70
+ it('should not set aria-describedby when no help is provided', function () {
71
+ var _render7 = render(/*#__PURE__*/_jsx(ColorPicker, {
72
+ label: "Background color",
73
+ onChange: function onChange() {}
74
+ })),
75
+ getByRole = _render7.getByRole;
76
+ expect(getByRole('button')).not.toHaveAttribute('aria-describedby');
77
+ });
78
+ });
@@ -2,31 +2,29 @@
2
2
  * Color Picker
3
3
  */
4
4
 
5
+ @use "~@wordpress/base-styles/colors" as wp-colors;
6
+ @use "~@wordpress/base-styles/variables" as wp-vars;
7
+
5
8
  .newspack-color-picker {
6
9
  position: relative;
7
-
8
- &__label {
9
- margin-bottom: 8px;
10
- }
11
-
12
10
  &__expander {
13
- box-shadow: inset 0 0 0 1px rgb(0 0 0 / 20%);
14
- border-radius: 2px;
15
- height: 64px;
16
- padding: 12px;
11
+ box-shadow: inset 0 0 0 1px rgba(wp-colors.$black, 0.54);
12
+ border-radius: wp-vars.$radius-small;
13
+ height: wp-vars.$grid-unit-80;
14
+ padding: wp-vars.$grid-unit-10;
17
15
  text-align: right;
18
16
  text-transform: uppercase;
19
17
 
20
18
  &:focus-visible {
21
19
  box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
22
- border-color: white;
20
+ border-color: wp-colors.$white;
23
21
  }
24
22
  }
25
23
 
26
24
  &__main {
27
- background: white;
28
- box-shadow: 0 0 8px 4px rgba(black, 0.08);
29
- margin: 12px 0;
25
+ background: wp-colors.$white;
26
+ box-shadow: wp-vars.$elevation-small;
27
+ margin: wp-vars.$grid-unit-10 0 0;
30
28
  position: absolute;
31
29
  z-index: 2;
32
30