newspack-components 4.8.0 → 4.9.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 (103) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/DEVELOPMENT.md +18 -17
  3. package/dist/cjs/action-card/index.js +85 -18
  4. package/dist/cjs/action-card/index.test.js +192 -5
  5. package/dist/cjs/action-card/style.scss +3 -9
  6. package/dist/cjs/card-feature/index.js +28 -3
  7. package/dist/cjs/card-feature/index.test.js +100 -45
  8. package/dist/cjs/card-feature/style.scss +1 -5
  9. package/dist/cjs/debug-badge/index.js +44 -0
  10. package/dist/cjs/debug-badge/index.test.js +50 -0
  11. package/dist/cjs/debug-badge/style.scss +26 -0
  12. package/dist/cjs/empty-state/index.test.js +37 -24
  13. package/dist/cjs/empty-state/root.js +2 -1
  14. package/dist/cjs/footer/index.js +52 -16
  15. package/dist/cjs/footer/index.test.js +208 -0
  16. package/dist/cjs/footer/style.scss +17 -1
  17. package/dist/cjs/index.js +7 -0
  18. package/dist/cjs/integration-icon/index.js +4 -4
  19. package/dist/cjs/integration-icon/style.scss +18 -2
  20. package/dist/cjs/integration-icons/active-campaign.js +4 -7
  21. package/dist/cjs/integration-icons/beehiiv.js +19 -0
  22. package/dist/cjs/integration-icons/gravity-forms.js +19 -0
  23. package/dist/cjs/integration-icons/index.js +26 -6
  24. package/dist/cjs/integration-icons/salesforce.js +5 -3
  25. package/dist/cjs/notice/index.js +1 -4
  26. package/dist/cjs/notice/style.scss +0 -19
  27. package/dist/cjs/plugin-toggle/index.js +1 -1
  28. package/dist/cjs/with-wizard-screen/index.js +1 -3
  29. package/dist/cjs/with-wizard-screen/index.test.js +0 -3
  30. package/dist/cjs/wizard/breadcrumbs-select.js +17 -4
  31. package/dist/cjs/wizard/breadcrumbs-select.test.js +17 -0
  32. package/dist/cjs/wizard/index.js +50 -13
  33. package/dist/cjs/wizard/index.test.js +304 -5
  34. package/dist/cjs/wizard/store/index.js +2 -0
  35. package/dist/esm/action-card/index.js +86 -21
  36. package/dist/esm/action-card/index.test.js +192 -1
  37. package/dist/esm/action-card/style.scss +3 -9
  38. package/dist/esm/card-feature/index.js +29 -4
  39. package/dist/esm/card-feature/index.test.js +100 -45
  40. package/dist/esm/card-feature/style.scss +1 -5
  41. package/dist/esm/debug-badge/index.js +39 -0
  42. package/dist/esm/debug-badge/index.test.js +46 -0
  43. package/dist/esm/debug-badge/style.scss +26 -0
  44. package/dist/esm/empty-state/index.test.js +37 -24
  45. package/dist/esm/empty-state/root.js +2 -1
  46. package/dist/esm/footer/index.js +52 -17
  47. package/dist/esm/footer/index.test.js +210 -0
  48. package/dist/esm/footer/style.scss +17 -1
  49. package/dist/esm/index.js +1 -0
  50. package/dist/esm/integration-icon/index.js +5 -5
  51. package/dist/esm/integration-icon/style.scss +18 -2
  52. package/dist/esm/integration-icons/active-campaign.js +5 -8
  53. package/dist/esm/integration-icons/beehiiv.js +13 -0
  54. package/dist/esm/integration-icons/gravity-forms.js +13 -0
  55. package/dist/esm/integration-icons/index.js +15 -4
  56. package/dist/esm/integration-icons/salesforce.js +5 -3
  57. package/dist/esm/notice/index.js +2 -5
  58. package/dist/esm/notice/style.scss +0 -19
  59. package/dist/esm/plugin-toggle/index.js +1 -1
  60. package/dist/esm/with-wizard-screen/index.js +2 -4
  61. package/dist/esm/with-wizard-screen/index.test.js +0 -3
  62. package/dist/esm/wizard/breadcrumbs-select.js +16 -3
  63. package/dist/esm/wizard/breadcrumbs-select.test.js +18 -1
  64. package/dist/esm/wizard/index.js +53 -16
  65. package/dist/esm/wizard/index.test.js +304 -5
  66. package/dist/esm/wizard/store/index.js +2 -0
  67. package/package.json +1 -1
  68. package/src/action-card/action-card.d.ts +3 -2
  69. package/src/action-card/index.js +81 -8
  70. package/src/action-card/index.test.js +159 -0
  71. package/src/action-card/style.scss +3 -9
  72. package/src/card-feature/README.md +10 -11
  73. package/src/card-feature/index.test.js +45 -15
  74. package/src/card-feature/index.tsx +43 -24
  75. package/src/card-feature/style.scss +1 -5
  76. package/src/debug-badge/index.js +36 -0
  77. package/src/debug-badge/index.test.js +39 -0
  78. package/src/debug-badge/style.scss +26 -0
  79. package/src/empty-state/README.md +11 -10
  80. package/src/empty-state/index.test.js +10 -0
  81. package/src/empty-state/root.tsx +2 -1
  82. package/src/empty-state/types.ts +1 -1
  83. package/src/footer/index.js +47 -2
  84. package/src/footer/index.test.js +114 -0
  85. package/src/footer/style.scss +17 -1
  86. package/src/index.js +1 -0
  87. package/src/integration-icon/index.tsx +5 -5
  88. package/src/integration-icon/style.scss +18 -2
  89. package/src/integration-icons/active-campaign.js +1 -5
  90. package/src/integration-icons/beehiiv.js +10 -0
  91. package/src/integration-icons/gravity-forms.js +10 -0
  92. package/src/integration-icons/index.js +14 -3
  93. package/src/integration-icons/salesforce.js +3 -3
  94. package/src/notice/index.js +2 -17
  95. package/src/notice/style.scss +0 -19
  96. package/src/plugin-toggle/index.js +1 -1
  97. package/src/with-wizard-screen/index.js +2 -2
  98. package/src/with-wizard-screen/index.test.js +0 -2
  99. package/src/wizard/breadcrumbs-select.js +12 -4
  100. package/src/wizard/breadcrumbs-select.test.js +15 -1
  101. package/src/wizard/index.js +45 -14
  102. package/src/wizard/index.test.js +169 -3
  103. package/src/wizard/store/index.js +2 -0
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports["default"] = void 0;
7
8
  var _i18n = require("@wordpress/i18n");
8
9
  var _components = require("@wordpress/components");
10
+ var _useConfirmDialog = _interopRequireDefault(require("../hooks/use-confirm-dialog"));
9
11
  require("./style.scss");
10
12
  var _jsxRuntime = require("react/jsx-runtime");
11
13
  /**
@@ -39,6 +41,18 @@ var Footer = function Footer(_ref) {
39
41
  _ref2$remove_starter_ = _ref2.remove_starter_content,
40
42
  removeStarterContent = _ref2$remove_starter_ === void 0 ? false : _ref2$remove_starter_,
41
43
  supportEmail = _ref2.support_email;
44
+ var resetDialog = (0, _useConfirmDialog["default"])({
45
+ title: (0, _i18n.__)('Reset Newspack?', 'newspack-plugin'),
46
+ message: (0, _i18n.__)('This deletes the Newspack settings on this site and returns you to the setup wizard. Your posts, pages and users are not affected. This cannot be undone.', 'newspack-plugin'),
47
+ confirmButtonText: (0, _i18n.__)('Reset Newspack', 'newspack-plugin'),
48
+ isDestructive: true
49
+ });
50
+ var starterContentDialog = (0, _useConfirmDialog["default"])({
51
+ title: (0, _i18n.__)('Remove Starter Content?', 'newspack-plugin'),
52
+ message: (0, _i18n.__)('This deletes the posts, pages and categories created as starter content. This cannot be undone.', 'newspack-plugin'),
53
+ confirmButtonText: (0, _i18n.__)('Remove Starter Content', 'newspack-plugin'),
54
+ isDestructive: true
55
+ });
42
56
  var footerElements = [{
43
57
  label: pluginVersion.label,
44
58
  url: 'https://newspack.com/category/release-notes/',
@@ -67,13 +81,15 @@ var Footer = function Footer(_ref) {
67
81
  if (resetUrl) {
68
82
  footerElements.push({
69
83
  label: (0, _i18n.__)('Reset Newspack', 'newspack-plugin'),
70
- url: resetUrl
84
+ url: resetUrl,
85
+ confirm: resetDialog.requestConfirm
71
86
  });
72
87
  }
73
88
  if (removeStarterContent) {
74
89
  footerElements.push({
75
90
  label: (0, _i18n.__)('Remove Starter Content', 'newspack-plugin'),
76
- url: removeStarterContent
91
+ url: removeStarterContent,
92
+ confirm: starterContentDialog.requestConfirm
77
93
  });
78
94
  }
79
95
  if (supportEmail) {
@@ -82,24 +98,44 @@ var Footer = function Footer(_ref) {
82
98
  url: "mailto:".concat(supportEmail)
83
99
  });
84
100
  }
85
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
101
+ var renderItem = function renderItem(_ref3) {
102
+ var url = _ref3.url,
103
+ label = _ref3.label,
104
+ external = _ref3.external,
105
+ confirm = _ref3.confirm;
106
+ if (external) {
107
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ExternalLink, {
108
+ href: url,
109
+ children: label
110
+ });
111
+ }
112
+ if (!confirm) {
113
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
114
+ href: url,
115
+ children: label
116
+ });
117
+ }
118
+ // onClick only sees primary clicks, so an href here would let a middle-click
119
+ // or "Open link in new tab" reach the URL unguarded.
120
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
121
+ type: "button",
122
+ onClick: function onClick() {
123
+ return confirm(function () {
124
+ window.location.href = url;
125
+ });
126
+ },
127
+ children: label
128
+ });
129
+ };
130
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
86
131
  className: "newspack-footer",
87
- children: !simple && /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
88
- children: footerElements.map(function (_ref3, index) {
89
- var url = _ref3.url,
90
- label = _ref3.label,
91
- external = _ref3.external;
132
+ children: [!simple && /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
133
+ children: footerElements.map(function (element, index) {
92
134
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
93
- children: external ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.ExternalLink, {
94
- href: url,
95
- children: label
96
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
97
- href: url,
98
- children: label
99
- })
135
+ children: renderItem(element)
100
136
  }, index);
101
137
  })
102
- })
138
+ }), resetDialog.confirmDialog, starterContentDialog.confirmDialog]
103
139
  });
104
140
  };
105
141
  var _default = exports["default"] = Footer;
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
5
+ var _react = require("@testing-library/react");
6
+ var _ = _interopRequireDefault(require("./"));
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
9
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); } /**
10
+ * External dependencies.
11
+ */ /**
12
+ * Internal dependencies.
13
+ */ // Footer renders outside the wizard's HashRouter, so there is no MemoryRouter
14
+ // wrapper here on purpose.
15
+ describe('Footer', function () {
16
+ var RESET_URL = 'https://example.test/wp-admin/admin.php?page=newspack-dashboard&newspack_reset=reset';
17
+ var STARTER_CONTENT_URL = 'https://example.test/wp-admin/admin.php?page=newspack-dashboard&newspack_reset=starter-content';
18
+ var assigned;
19
+ var originalLocation;
20
+ var originalUrls;
21
+ var confirmIn = /*#__PURE__*/function () {
22
+ var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator().m(function _callee(name) {
23
+ var _t;
24
+ return _regenerator().w(function (_context) {
25
+ while (1) switch (_context.n) {
26
+ case 0:
27
+ _t = _react.within;
28
+ _context.n = 1;
29
+ return _react.screen.findByRole('dialog');
30
+ case 1:
31
+ return _context.a(2, _t(_context.v).getByRole('button', {
32
+ name: name
33
+ }));
34
+ }
35
+ }, _callee);
36
+ }));
37
+ return function confirmIn(_x) {
38
+ return _ref.apply(this, arguments);
39
+ };
40
+ }();
41
+ beforeEach(function () {
42
+ assigned = [];
43
+ originalLocation = window.location;
44
+ originalUrls = window.newspack_urls;
45
+ delete window.location;
46
+ window.location = {
47
+ get href() {
48
+ return 'https://example.test/wp-admin/admin.php?page=newspack-dashboard';
49
+ },
50
+ set href(value) {
51
+ assigned.push(value);
52
+ }
53
+ };
54
+ window.newspack_urls = {
55
+ support: 'https://help.newspack.com/',
56
+ reset_url: RESET_URL,
57
+ remove_starter_content: STARTER_CONTENT_URL,
58
+ plugin_version: {
59
+ label: 'Newspack 1.0.0'
60
+ }
61
+ };
62
+ });
63
+ afterEach(function () {
64
+ delete window.location;
65
+ window.location = originalLocation;
66
+ if (undefined === originalUrls) {
67
+ delete window.newspack_urls;
68
+ } else {
69
+ window.newspack_urls = originalUrls;
70
+ }
71
+ });
72
+ it('offers no link for a browser gesture to follow', function () {
73
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
74
+ expect(_react.screen.getByRole('button', {
75
+ name: 'Reset Newspack'
76
+ })).not.toHaveAttribute('href');
77
+ expect(_react.screen.getByRole('button', {
78
+ name: 'Remove Starter Content'
79
+ })).not.toHaveAttribute('href');
80
+ });
81
+ it('does not reset on the first click', function () {
82
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
83
+ _react.fireEvent.click(_react.screen.getByRole('button', {
84
+ name: 'Reset Newspack'
85
+ }));
86
+ expect(assigned).toEqual([]);
87
+ });
88
+ it('asks before resetting', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator().m(function _callee2() {
89
+ var _t2;
90
+ return _regenerator().w(function (_context2) {
91
+ while (1) switch (_context2.n) {
92
+ case 0:
93
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
94
+ _react.fireEvent.click(_react.screen.getByRole('button', {
95
+ name: 'Reset Newspack'
96
+ }));
97
+ _t2 = expect;
98
+ _context2.n = 1;
99
+ return _react.screen.findByText(/deletes the Newspack settings/);
100
+ case 1:
101
+ _t2(_context2.v).toBeInTheDocument();
102
+ case 2:
103
+ return _context2.a(2);
104
+ }
105
+ }, _callee2);
106
+ })));
107
+ it('leaves the site alone when the reset is cancelled', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator().m(function _callee3() {
108
+ var cancel;
109
+ return _regenerator().w(function (_context3) {
110
+ while (1) switch (_context3.n) {
111
+ case 0:
112
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
113
+ _react.fireEvent.click(_react.screen.getByRole('button', {
114
+ name: 'Reset Newspack'
115
+ }));
116
+ // The modal's close icon also carries aria-label="Cancel"; this is the text button.
117
+ _context3.n = 1;
118
+ return _react.screen.findAllByRole('button', {
119
+ name: 'Cancel'
120
+ });
121
+ case 1:
122
+ cancel = _context3.v.find(function (button) {
123
+ return 'Cancel' === button.textContent;
124
+ });
125
+ _react.fireEvent.click(cancel);
126
+ expect(assigned).toEqual([]);
127
+ case 2:
128
+ return _context3.a(2);
129
+ }
130
+ }, _callee3);
131
+ })));
132
+ it('resets once confirmed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator().m(function _callee4() {
133
+ var _t3;
134
+ return _regenerator().w(function (_context4) {
135
+ while (1) switch (_context4.n) {
136
+ case 0:
137
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
138
+ _react.fireEvent.click(_react.screen.getByRole('button', {
139
+ name: 'Reset Newspack'
140
+ }));
141
+ _t3 = _react.fireEvent;
142
+ _context4.n = 1;
143
+ return confirmIn('Reset Newspack');
144
+ case 1:
145
+ _t3.click.call(_t3, _context4.v);
146
+ expect(assigned).toEqual([RESET_URL]);
147
+ case 2:
148
+ return _context4.a(2);
149
+ }
150
+ }, _callee4);
151
+ })));
152
+ it('does not remove the starter content on the first click', function () {
153
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
154
+ _react.fireEvent.click(_react.screen.getByRole('button', {
155
+ name: 'Remove Starter Content'
156
+ }));
157
+ expect(assigned).toEqual([]);
158
+ });
159
+ it('asks before removing the starter content', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator().m(function _callee5() {
160
+ var _t4;
161
+ return _regenerator().w(function (_context5) {
162
+ while (1) switch (_context5.n) {
163
+ case 0:
164
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
165
+ _react.fireEvent.click(_react.screen.getByRole('button', {
166
+ name: 'Remove Starter Content'
167
+ }));
168
+ _t4 = expect;
169
+ _context5.n = 1;
170
+ return _react.screen.findByText(/created as starter content/);
171
+ case 1:
172
+ _t4(_context5.v).toBeInTheDocument();
173
+ case 2:
174
+ return _context5.a(2);
175
+ }
176
+ }, _callee5);
177
+ })));
178
+ it('removes the starter content once confirmed', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator().m(function _callee6() {
179
+ var _t5;
180
+ return _regenerator().w(function (_context6) {
181
+ while (1) switch (_context6.n) {
182
+ case 0:
183
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
184
+ _react.fireEvent.click(_react.screen.getByRole('button', {
185
+ name: 'Remove Starter Content'
186
+ }));
187
+ _t5 = _react.fireEvent;
188
+ _context6.n = 1;
189
+ return confirmIn('Remove Starter Content');
190
+ case 1:
191
+ _t5.click.call(_t5, _context6.v);
192
+ expect(assigned).toEqual([STARTER_CONTENT_URL]);
193
+ case 2:
194
+ return _context6.a(2);
195
+ }
196
+ }, _callee6);
197
+ })));
198
+ it('does not guard the non-destructive links', function () {
199
+ window.newspack_urls.setup_wizard = 'https://example.test/wp-admin/admin.php?page=newspack-setup-wizard';
200
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"], {}));
201
+ var link = _react.screen.getByRole('link', {
202
+ name: 'Setup Wizard'
203
+ });
204
+ expect(link).toHaveAttribute('href', window.newspack_urls.setup_wizard);
205
+ _react.fireEvent.click(link);
206
+ expect(_react.screen.queryByRole('dialog')).not.toBeInTheDocument();
207
+ });
208
+ });
@@ -2,6 +2,7 @@
2
2
  * Footer
3
3
  */
4
4
 
5
+ @use "../mixins" as mixins;
5
6
  @use "~@wordpress/base-styles/colors" as wp-colors;
6
7
 
7
8
  .newspack-footer {
@@ -31,7 +32,8 @@
31
32
  li {
32
33
  margin: 8px;
33
34
 
34
- a {
35
+ a,
36
+ button {
35
37
  align-items: flex-end;
36
38
  color: inherit;
37
39
  display: flex;
@@ -42,5 +44,19 @@
42
44
  color: wp-colors.$gray-900;
43
45
  }
44
46
  }
47
+
48
+ button {
49
+ appearance: none;
50
+ background: none;
51
+ border: 0;
52
+ cursor: pointer;
53
+ font: inherit;
54
+ padding: 0;
55
+ text-decoration: underline;
56
+
57
+ &:focus-visible {
58
+ @include mixins.wpds-focus-ring;
59
+ }
60
+ }
45
61
  }
46
62
  }
package/dist/cjs/index.js CHANGED
@@ -112,6 +112,12 @@ Object.defineProperty(exports, "DataViews", {
112
112
  return _dataviews["default"];
113
113
  }
114
114
  });
115
+ Object.defineProperty(exports, "DebugBadge", {
116
+ enumerable: true,
117
+ get: function get() {
118
+ return _debugBadge["default"];
119
+ }
120
+ });
115
121
  Object.defineProperty(exports, "Divider", {
116
122
  enumerable: true,
117
123
  get: function get() {
@@ -414,6 +420,7 @@ var _colorPicker = _interopRequireDefault(require("./color-picker"));
414
420
  var _confirmDialog = _interopRequireDefault(require("./confirm-dialog"));
415
421
  var _customSelectControl = _interopRequireDefault(require("./custom-select-control"));
416
422
  var _dataviews = _interopRequireDefault(require("./dataviews"));
423
+ var _debugBadge = _interopRequireDefault(require("./debug-badge"));
417
424
  var _divider = _interopRequireDefault(require("./divider"));
418
425
  var _drawer = _interopRequireDefault(require("./drawer"));
419
426
  var _emptyState = _interopRequireDefault(require("./empty-state"));
@@ -18,14 +18,14 @@ var _jsxRuntime = require("react/jsx-runtime");
18
18
  */
19
19
 
20
20
  /**
21
- * The single source for how an ESP provider is shown: brand mark plus badge
22
- * background. A new provider needs an icon file, an `espProviderIcons` entry,
21
+ * The single source for how a provider is shown: brand mark plus badge
22
+ * background. A new provider needs an icon file, a `providerIcons` entry,
23
23
  * and a background rule in this component's stylesheet.
24
24
  */var IntegrationIcon = function IntegrationIcon(_ref) {
25
25
  var provider = _ref.provider,
26
26
  className = _ref.className;
27
- var icons = _integrationIcons.espProviderIcons;
28
- var node = Object.prototype.hasOwnProperty.call(_integrationIcons.espProviderIcons, provider) ? icons[provider] : null;
27
+ var icons = _integrationIcons.providerIcons;
28
+ var node = Object.prototype.hasOwnProperty.call(_integrationIcons.providerIcons, provider) ? icons[provider] : null;
29
29
  if (!node) {
30
30
  return null;
31
31
  }
@@ -21,14 +21,26 @@
21
21
  background: #004cff;
22
22
  }
23
23
 
24
- &--mailchimp {
25
- background: #ffe01b;
24
+ &--beehiiv {
25
+ background: #060419;
26
26
  }
27
27
 
28
28
  &--constant-contact {
29
29
  background: wp-colors.$gray-100;
30
30
  }
31
31
 
32
+ &--fundraiseup {
33
+ background: #2bb77b;
34
+ }
35
+
36
+ &--gravity-forms {
37
+ background: #ff4f00;
38
+ }
39
+
40
+ &--mailchimp {
41
+ background: #ffe01b;
42
+ }
43
+
32
44
  &--manual {
33
45
  background: wp-colors.$gray-800;
34
46
  color: wp-colors.$white;
@@ -39,4 +51,8 @@
39
51
  fill: currentcolor;
40
52
  }
41
53
  }
54
+
55
+ &--salesforce {
56
+ background: #0d9dda;
57
+ }
42
58
  }
@@ -5,18 +5,15 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports["default"] = void 0;
7
7
  var _jsxRuntime = require("react/jsx-runtime");
8
- var activeCampaign = /*#__PURE__*/(0, _jsxRuntime.jsxs)("svg", {
8
+ var activeCampaign = /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
9
9
  xmlns: "http://www.w3.org/2000/svg",
10
10
  width: "24",
11
11
  height: "24",
12
12
  viewBox: "0 0 24 24",
13
13
  fill: "none",
14
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
15
- d: "M16.6934 10.5811C17.1772 10.9036 17.4355 11.4194 17.4355 11.9678C17.4355 12.516 17.1449 13.0319 16.6934 13.3545L6.56445 20V18.6133C6.56445 18.1939 6.75844 17.7746 7.14551 17.5166L15.5 11.9678L7.14551 6.38672C6.79063 6.16086 6.56445 5.74175 6.56445 5.29004V4L16.6934 10.5811Z",
14
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
15
+ d: "M17.28 10.4037C17.8244 10.7666 18.115 11.3468 18.115 11.9637C18.115 12.5805 17.788 13.1609 17.28 13.5238L5.88501 21V19.4399C5.88501 18.9681 6.10324 18.4965 6.5387 18.2062L15.9375 11.9637L6.5387 5.68506C6.13946 5.43097 5.88501 4.95947 5.88501 4.45129V3L17.28 10.4037ZM5.88501 8.37122C5.88501 7.89959 6.4296 7.64482 6.79248 7.8988L12.7438 11.9275L11.9451 12.4713C11.4371 12.7977 10.7842 12.7978 10.2762 12.4713L8.96997 11.6375L5.88501 9.56873V8.37122Z",
16
16
  fill: "white"
17
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
18
- d: "M6.56445 8.77441C6.56445 8.35519 7.04853 8.12873 7.37109 8.35449L12.6611 11.9355L11.9512 12.4189C11.4996 12.7091 10.9193 12.7092 10.4678 12.4189L9.30664 11.6777L6.56445 9.83887V8.77441Z",
19
- fill: "white"
20
- })]
17
+ })
21
18
  });
22
19
  var _default = exports["default"] = activeCampaign;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ var beehiiv = /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
9
+ xmlns: "http://www.w3.org/2000/svg",
10
+ width: "24",
11
+ height: "24",
12
+ viewBox: "0 0 24 24",
13
+ fill: "none",
14
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
15
+ d: "M18.6602 11.4894H5.35668C5.19293 11.4883 5.03627 11.4225 4.92088 11.3063C4.80549 11.1901 4.74073 11.033 4.74073 10.8692V9.92487C4.7398 9.67122 4.78886 9.41988 4.88509 9.1852C4.98132 8.95052 5.12284 8.73709 5.30157 8.55712C5.4803 8.37714 5.69274 8.23414 5.92675 8.13629C6.16076 8.03843 6.41176 7.98764 6.6654 7.9868H17.3353C17.5889 7.98754 17.8398 8.03822 18.0738 8.13595C18.3078 8.23368 18.5203 8.37654 18.6991 8.55637C18.8779 8.7362 19.0195 8.94949 19.1158 9.18406C19.2122 9.41862 19.2614 9.66987 19.2607 9.92346V10.8685C19.2638 10.9491 19.2506 11.0296 19.2218 11.1049C19.193 11.1803 19.1492 11.249 19.0931 11.307C19.0369 11.365 18.9697 11.411 18.8953 11.4422C18.8209 11.4734 18.7409 11.4899 18.6602 11.4894ZM15.8574 6.96492H8.15947C7.99191 6.96343 7.8317 6.89593 7.71361 6.77704C7.59552 6.65816 7.52908 6.4975 7.52872 6.32994C7.52872 4.74919 8.80643 3.46302 10.3773 3.46302H13.641C15.2119 3.46302 16.4896 4.74919 16.4896 6.32994C16.4907 6.41334 16.4752 6.49613 16.4439 6.57345C16.4126 6.65077 16.3662 6.72106 16.3074 6.7802C16.2486 6.83934 16.1785 6.88615 16.1014 6.91787C16.0243 6.94959 15.9416 6.96558 15.8582 6.96492H15.8574ZM19.2755 12.5113H4.74073C3.7858 12.5113 3 13.3013 3 14.2619C3 15.2225 3.7858 16.0132 4.74073 16.0132H9.89879C10.0834 15.0216 10.9453 14.2619 11.9919 14.2619C12.4923 14.2631 12.9767 14.4386 13.3618 14.7582C13.7468 15.0778 14.0085 15.5216 14.1019 16.0132H19.2607C20.2149 16.0132 21 15.2225 21 14.2619C21 13.3013 20.2304 12.5113 19.2755 12.5113ZM18.6454 17.0358H14.1336V20.537H17.5214C18.4756 20.537 19.2607 19.7477 19.2607 18.7864V17.6708C19.2636 17.5882 19.2499 17.506 19.2202 17.4289C19.1906 17.3518 19.1457 17.2816 19.0883 17.2223C19.0308 17.163 18.962 17.1159 18.8859 17.0838C18.8098 17.0518 18.728 17.0354 18.6454 17.0358ZM5.35668 17.0358C5.189 17.0371 5.02861 17.1045 4.91037 17.2234C4.79213 17.3423 4.72559 17.5031 4.72523 17.6708V18.7864C4.72523 19.747 5.51102 20.537 6.46596 20.537H9.85298V17.0358H5.35668Z",
16
+ fill: "white"
17
+ })
18
+ });
19
+ var _default = exports["default"] = beehiiv;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ var gravityForms = /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
9
+ xmlns: "http://www.w3.org/2000/svg",
10
+ width: "24",
11
+ height: "24",
12
+ viewBox: "0 0 24 24",
13
+ fill: "none",
14
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
15
+ d: "M8.74072 8.98989H24V4.73383H8.77618C6.75022 4.67092 4.79489 5.46964 3.41 6.92583C0.0886559 10.4377 0 19.2696 0 19.2696H23.8818V11.2749H19.5912V15.0019H4.58018C4.67474 13.6123 5.31889 11.1296 6.53633 9.84462C7.10785 9.25496 7.91399 8.9424 8.74072 8.98989Z",
16
+ fill: "white"
17
+ })
18
+ });
19
+ var _default = exports["default"] = gravityForms;
@@ -10,25 +10,38 @@ Object.defineProperty(exports, "activeCampaign", {
10
10
  return _activeCampaign["default"];
11
11
  }
12
12
  });
13
+ Object.defineProperty(exports, "beehiiv", {
14
+ enumerable: true,
15
+ get: function get() {
16
+ return _beehiiv["default"];
17
+ }
18
+ });
13
19
  Object.defineProperty(exports, "constantContact", {
14
20
  enumerable: true,
15
21
  get: function get() {
16
22
  return _constantContact["default"];
17
23
  }
18
24
  });
19
- exports.espProviderOrder = exports.espProviderIcons = void 0;
25
+ exports.espProviderOrder = void 0;
20
26
  Object.defineProperty(exports, "fundraiseUp", {
21
27
  enumerable: true,
22
28
  get: function get() {
23
29
  return _fundraiseUp["default"];
24
30
  }
25
31
  });
32
+ Object.defineProperty(exports, "gravityForms", {
33
+ enumerable: true,
34
+ get: function get() {
35
+ return _gravityForms["default"];
36
+ }
37
+ });
26
38
  Object.defineProperty(exports, "mailchimp", {
27
39
  enumerable: true,
28
40
  get: function get() {
29
41
  return _mailchimp["default"];
30
42
  }
31
43
  });
44
+ exports.providerIcons = void 0;
32
45
  Object.defineProperty(exports, "salesforce", {
33
46
  enumerable: true,
34
47
  get: function get() {
@@ -43,9 +56,11 @@ Object.defineProperty(exports, "wisepops", {
43
56
  });
44
57
  var _icons = require("@wordpress/icons");
45
58
  var _activeCampaign = _interopRequireDefault(require("./active-campaign"));
59
+ var _beehiiv = _interopRequireDefault(require("./beehiiv"));
46
60
  var _constantContact = _interopRequireDefault(require("./constant-contact"));
47
- var _mailchimp = _interopRequireDefault(require("./mailchimp"));
48
61
  var _fundraiseUp = _interopRequireDefault(require("./fundraise-up"));
62
+ var _gravityForms = _interopRequireDefault(require("./gravity-forms"));
63
+ var _mailchimp = _interopRequireDefault(require("./mailchimp"));
49
64
  var _salesforce = _interopRequireDefault(require("./salesforce"));
50
65
  var _wisepops = _interopRequireDefault(require("./wisepops"));
51
66
  /**
@@ -56,12 +71,17 @@ var _wisepops = _interopRequireDefault(require("./wisepops"));
56
71
  * Internal dependencies
57
72
  */
58
73
 
59
- // ESP provider brand marks keyed by the slug the backend reports
60
- // (`Newspack_Newsletters::service_provider()`). Rendered via IntegrationIcon.
61
- var espProviderIcons = exports.espProviderIcons = {
74
+ // Brand marks keyed by the ESP slug the backend reports
75
+ // (`Newspack_Newsletters::service_provider()`), by integration ID, or by the
76
+ // brand slug an integration maps to. Rendered via IntegrationIcon.
77
+ var providerIcons = exports.providerIcons = {
62
78
  active_campaign: _activeCampaign["default"],
63
79
  mailchimp: _mailchimp["default"],
64
80
  constant_contact: _constantContact["default"],
65
- manual: _icons.atSymbol
81
+ manual: _icons.atSymbol,
82
+ salesforce: _salesforce["default"],
83
+ beehiiv: _beehiiv["default"],
84
+ fundraiseup: _fundraiseUp["default"],
85
+ gravity_forms: _gravityForms["default"]
66
86
  };
67
87
  var espProviderOrder = exports.espProviderOrder = ['active_campaign', 'mailchimp', 'constant_contact', 'manual'];
@@ -7,11 +7,13 @@ exports["default"] = void 0;
7
7
  var _jsxRuntime = require("react/jsx-runtime");
8
8
  var salesforce = /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
9
9
  xmlns: "http://www.w3.org/2000/svg",
10
- viewBox: "0 0 32 32",
10
+ width: "24",
11
+ height: "24",
12
+ viewBox: "0 0 24 24",
11
13
  fill: "none",
12
14
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
13
- d: "M13.3173 7.24314C14.3498 6.16866 15.7848 5.50017 17.3737 5.50017C19.4877 5.50017 21.3287 6.67965 22.3122 8.42612C23.1661 8.04463 24.1111 7.83113 25.1016 7.83113C28.913 7.83113 32 10.9461 32 14.7925C32 18.639 28.9095 21.7539 25.1016 21.7539C24.6361 21.7539 24.1811 21.7084 23.7436 21.6174C22.8791 23.1574 21.2307 24.2004 19.3407 24.2004C18.5497 24.2004 17.8007 24.0184 17.1357 23.6929C16.2607 25.7543 14.2168 27.1998 11.8403 27.1998C9.46385 27.1998 7.25189 25.6319 6.4399 23.4339C6.0864 23.5074 5.71891 23.5494 5.34092 23.5494C2.39046 23.5494 0 21.1344 0 18.1525C0 16.154 1.07448 14.411 2.67046 13.4765C2.34146 12.7206 2.15947 11.8841 2.15947 11.0091C2.15947 7.57913 4.94192 4.80018 8.37537 4.80018C10.3913 4.80018 12.1833 5.75916 13.3173 7.24314Z",
14
- fill: "var(--integration-icon-color, #0D9DDA)"
15
+ d: "M10.0838 5.745C10.8213 4.9775 11.8463 4.5 12.9813 4.5C14.4913 4.5 15.8063 5.3425 16.5088 6.59C17.1188 6.3175 17.7938 6.165 18.5013 6.165C21.2238 6.165 23.4288 8.39 23.4288 11.1375C23.4288 13.885 21.2213 16.11 18.5013 16.11C18.1688 16.11 17.8438 16.0775 17.5313 16.0125C16.9138 17.1125 15.7363 17.8575 14.3863 17.8575C13.8213 17.8575 13.2863 17.7275 12.8113 17.495C12.1863 18.9675 10.7263 20 9.02876 20C7.33126 20 5.75126 18.88 5.17126 17.31C4.91876 17.3625 4.65626 17.3925 4.38626 17.3925C2.27876 17.3925 0.571259 15.6675 0.571259 13.5375C0.571259 12.11 1.33876 10.865 2.47876 10.1975C2.24376 9.6575 2.11376 9.06 2.11376 8.435C2.11376 5.985 4.10126 4 6.55376 4C7.99376 4 9.27376 4.685 10.0838 5.745Z",
16
+ fill: "white"
15
17
  })
16
18
  });
17
19
  var _default = exports["default"] = salesforce;
@@ -40,7 +40,6 @@ var Notice = /*#__PURE__*/function (_Component) {
40
40
  function render() {
41
41
  var _this$props = this.props,
42
42
  className = _this$props.className,
43
- debugMode = _this$props.debugMode,
44
43
  isError = _this$props.isError,
45
44
  isHandoff = _this$props.isHandoff,
46
45
  isHelp = _this$props.isHelp,
@@ -52,14 +51,12 @@ var Notice = /*#__PURE__*/function (_Component) {
52
51
  style = _this$props$style === void 0 ? {} : _this$props$style,
53
52
  _this$props$children = _this$props.children,
54
53
  children = _this$props$children === void 0 ? null : _this$props$children;
55
- var classes = (0, _classnames["default"])('newspack-notice', className, debugMode && 'newspack-notice__is-debug', isError && 'newspack-notice__is-error', isHandoff && 'newspack-notice__is-handoff', isHelp && 'newspack-notice__is-help', isSuccess && 'newspack-notice__is-success', isWarning && 'newspack-notice__is-warning');
54
+ var classes = (0, _classnames["default"])('newspack-notice', className, isError && 'newspack-notice__is-error', isHandoff && 'newspack-notice__is-handoff', isHelp && 'newspack-notice__is-help', isSuccess && 'newspack-notice__is-success', isWarning && 'newspack-notice__is-warning');
56
55
  var noticeIcon;
57
56
  if (isHelp) {
58
57
  noticeIcon = _icons.help;
59
58
  } else if (isSuccess) {
60
59
  noticeIcon = _icons.check;
61
- } else if (debugMode) {
62
- noticeIcon = _icons.bug;
63
60
  } else {
64
61
  noticeIcon = _icons.info;
65
62
  }
@@ -22,25 +22,6 @@
22
22
  margin-right: 4px;
23
23
  }
24
24
 
25
- &__is-debug {
26
- background: np-colors.$primary-600;
27
- border-radius: 50%;
28
- bottom: 16px;
29
- box-shadow: 0 0 8px 4px rgba(black, 0.08);
30
- color: white;
31
- font-weight: bold;
32
- margin: 0 16px;
33
- padding: 6px;
34
- position: fixed;
35
- text-transform: uppercase;
36
- z-index: 9997;
37
-
38
- > svg {
39
- fill: white;
40
- margin: 0;
41
- }
42
- }
43
-
44
25
  &__is-error {
45
26
  background: color.adjust(wp-colors.$alert-red, $lightness: 35%);
46
27