newspack-components 4.10.0 → 4.12.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 (81) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/DEVELOPMENT.md +80 -38
  3. package/dist/cjs/breadcrumbs/index.js +1 -0
  4. package/dist/cjs/breadcrumbs/style.scss +3 -10
  5. package/dist/cjs/card/style-core.scss +1 -1
  6. package/dist/cjs/card-sortable-list/index.js +23 -12
  7. package/dist/cjs/card-sortable-list/index.test.js +21 -0
  8. package/dist/cjs/card-sortable-list/style.scss +8 -0
  9. package/dist/cjs/drawer/body.js +4 -6
  10. package/dist/cjs/drawer/content.js +7 -37
  11. package/dist/cjs/drawer/footer.js +10 -1
  12. package/dist/cjs/drawer/header.js +9 -1
  13. package/dist/cjs/drawer/index.test.js +3 -4
  14. package/dist/cjs/drawer/slots.test.js +25 -67
  15. package/dist/cjs/drawer/style.scss +0 -18
  16. package/dist/cjs/index.js +14 -0
  17. package/dist/cjs/page/index.js +10 -2
  18. package/dist/cjs/page/style.scss +24 -2
  19. package/dist/cjs/reorder-modal/index.js +521 -0
  20. package/dist/cjs/reorder-modal/index.test.js +1223 -0
  21. package/dist/cjs/reorder-modal/style.scss +114 -0
  22. package/dist/cjs/tabbed-navigation/style.scss +5 -0
  23. package/dist/cjs/tooltip-badge/index.js +50 -0
  24. package/dist/cjs/tooltip-badge/index.test.js +30 -0
  25. package/dist/cjs/wizard/index.js +21 -8
  26. package/dist/cjs/wizard/index.test.js +78 -0
  27. package/dist/cjs/wizard/store/index.js +2 -1
  28. package/dist/esm/breadcrumbs/index.js +1 -0
  29. package/dist/esm/breadcrumbs/style.scss +3 -10
  30. package/dist/esm/card/style-core.scss +1 -1
  31. package/dist/esm/card-sortable-list/index.js +25 -13
  32. package/dist/esm/card-sortable-list/index.test.js +21 -0
  33. package/dist/esm/card-sortable-list/style.scss +8 -0
  34. package/dist/esm/drawer/body.js +4 -5
  35. package/dist/esm/drawer/content.js +7 -36
  36. package/dist/esm/drawer/footer.js +10 -1
  37. package/dist/esm/drawer/header.js +9 -1
  38. package/dist/esm/drawer/index.test.js +3 -4
  39. package/dist/esm/drawer/slots.test.js +25 -67
  40. package/dist/esm/drawer/style.scss +0 -18
  41. package/dist/esm/index.js +2 -0
  42. package/dist/esm/page/index.js +10 -2
  43. package/dist/esm/page/style.scss +24 -2
  44. package/dist/esm/reorder-modal/index.js +514 -0
  45. package/dist/esm/reorder-modal/index.test.js +1224 -0
  46. package/dist/esm/reorder-modal/style.scss +114 -0
  47. package/dist/esm/tabbed-navigation/style.scss +5 -0
  48. package/dist/esm/tooltip-badge/index.js +43 -0
  49. package/dist/esm/tooltip-badge/index.test.js +26 -0
  50. package/dist/esm/wizard/index.js +23 -12
  51. package/dist/esm/wizard/index.test.js +78 -0
  52. package/dist/esm/wizard/store/index.js +2 -1
  53. package/package.json +2 -2
  54. package/src/breadcrumbs/index.js +1 -1
  55. package/src/breadcrumbs/style.scss +3 -10
  56. package/src/card/style-core.scss +1 -1
  57. package/src/card-form/README.md +2 -2
  58. package/src/card-sortable-list/index.test.js +13 -0
  59. package/src/card-sortable-list/index.tsx +31 -12
  60. package/src/card-sortable-list/style.scss +8 -0
  61. package/src/drawer/README.md +10 -16
  62. package/src/drawer/body.tsx +4 -5
  63. package/src/drawer/content.tsx +7 -33
  64. package/src/drawer/footer.tsx +8 -1
  65. package/src/drawer/header.tsx +8 -1
  66. package/src/drawer/index.test.js +3 -4
  67. package/src/drawer/slots.test.js +14 -48
  68. package/src/drawer/style.scss +0 -18
  69. package/src/drawer/types.ts +8 -3
  70. package/src/index.js +2 -0
  71. package/src/page/index.js +7 -3
  72. package/src/page/style.scss +24 -2
  73. package/src/reorder-modal/index.js +484 -0
  74. package/src/reorder-modal/index.test.js +566 -0
  75. package/src/reorder-modal/style.scss +114 -0
  76. package/src/tabbed-navigation/style.scss +5 -0
  77. package/src/tooltip-badge/index.test.js +24 -0
  78. package/src/tooltip-badge/index.tsx +40 -0
  79. package/src/wizard/index.js +25 -14
  80. package/src/wizard/index.test.js +38 -0
  81. package/src/wizard/store/index.js +1 -0
@@ -5,8 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports["default"] = void 0;
8
+ var _ui = require("@wordpress/ui");
8
9
  var _classnames = _interopRequireDefault(require("classnames"));
9
10
  var _jsxRuntime = require("react/jsx-runtime");
11
+ /**
12
+ * WordPress dependencies.
13
+ */
14
+
10
15
  /**
11
16
  * External dependencies.
12
17
  */
@@ -18,7 +23,11 @@ var _jsxRuntime = require("react/jsx-runtime");
18
23
  var Footer = function Footer(_ref) {
19
24
  var className = _ref.className,
20
25
  children = _ref.children;
21
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
26
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Stack, {
27
+ direction: "row",
28
+ justify: "flex-end",
29
+ wrap: "wrap",
30
+ gap: "sm",
22
31
  className: (0, _classnames["default"])('newspack-drawer__footer', className),
23
32
  children: children
24
33
  });
@@ -5,8 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports["default"] = void 0;
8
+ var _ui = require("@wordpress/ui");
8
9
  var _classnames = _interopRequireDefault(require("classnames"));
9
10
  var _jsxRuntime = require("react/jsx-runtime");
11
+ /**
12
+ * WordPress dependencies.
13
+ */
14
+
10
15
  /**
11
16
  * External dependencies.
12
17
  */
@@ -18,7 +23,10 @@ var _jsxRuntime = require("react/jsx-runtime");
18
23
  var Header = function Header(_ref) {
19
24
  var className = _ref.className,
20
25
  children = _ref.children;
21
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
26
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Stack, {
27
+ direction: "row",
28
+ align: "center",
29
+ gap: "sm",
22
30
  className: (0, _classnames["default"])('newspack-drawer__header', className),
23
31
  children: children
24
32
  });
@@ -431,16 +431,15 @@ describe('Drawer sections', function () {
431
431
  });
432
432
 
433
433
  // The `> * { flex: none }` rule that stops sections compressing depends on this.
434
- it('lays the scroll container out as a flush VStack', function () {
434
+ it('lays the scroll container out as a flush column', function () {
435
435
  renderDrawer({
436
436
  contents: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_["default"].Content, {
437
437
  children: "One"
438
438
  }, "one")]
439
439
  });
440
440
  var body = bodyOf(_react.screen.getByText('One'));
441
- expect(body).toHaveClass('components-v-stack');
442
- expect(window.getComputedStyle(body).gap).toBe('0');
443
- expect(window.getComputedStyle(body).justifyContent).toBe('flex-start');
441
+ expect(body.style.flexDirection).toBe('column');
442
+ expect(body.style.gap).toBe('');
444
443
  });
445
444
  it('starts a new container after a non-content child', function () {
446
445
  renderDrawer({
@@ -132,86 +132,35 @@ describe('Drawer.Content', function () {
132
132
  container = _render2.container;
133
133
  expect(sectionOf(container).style.getPropertyValue('--newspack-drawer-content-padding')).toBe('0px');
134
134
  });
135
- it('renders each section as a VStack', function () {
135
+ it('spaces its children by the lg gap token, and by the gap prop', function () {
136
136
  var _render3 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_content["default"], {
137
137
  children: "stacked"
138
138
  })),
139
- container = _render3.container;
140
- expect(sectionOf(container)).toHaveClass('newspack-drawer__content', 'components-v-stack');
141
- });
142
-
143
- // VStack emits its spacing as a `calc()` on the 4px base, not as pixels.
144
- it('spaces its children by 16px, and by the gap prop', function () {
145
- var _render4 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_content["default"], {
146
- children: "stacked"
147
- })),
148
- container = _render4.container,
149
- rerender = _render4.rerender;
150
- expect(window.getComputedStyle(sectionOf(container)).gap).toBe('calc(4px * 4)');
139
+ container = _render3.container,
140
+ rerender = _render3.rerender;
141
+ expect(sectionOf(container).style.gap).toContain('gap-lg');
151
142
  rerender(/*#__PURE__*/(0, _jsxRuntime.jsx)(_content["default"], {
152
- gap: 2,
143
+ gap: "sm",
153
144
  children: "stacked"
154
145
  }));
155
- expect(window.getComputedStyle(sectionOf(container)).gap).toBe('calc(4px * 2)');
146
+ expect(sectionOf(container).style.gap).toContain('gap-sm');
156
147
  });
157
-
158
- // VStack keeps only elements, so these would otherwise vanish without warning.
159
148
  it('keeps plain text sitting beside an element', function () {
160
- (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_content["default"], {
161
- children: ["Lead text", /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
162
- children: "an element"
163
- }), 42]
164
- }));
165
- expect(_react.screen.getByText('Lead text')).toBeInTheDocument();
166
- expect(_react.screen.getByText('an element')).toBeInTheDocument();
167
- expect(_react.screen.getByText('42')).toBeInTheDocument();
168
- });
169
- it('keeps a run of text and interpolations on one row', function () {
170
- var _render5 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_content["default"], {
171
- children: ["Edited by ", 'Ada', " just now"]
172
- })),
173
- container = _render5.container;
174
- var rows = sectionOf(container).children;
175
- expect(rows).toHaveLength(1);
176
- expect(rows[0]).toHaveTextContent('Edited by Ada just now');
177
- });
178
- it('starts a new row either side of an element', function () {
179
- var _render6 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_content["default"], {
180
- children: ["before", /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
181
- children: "middle"
182
- }), "after"]
183
- })),
184
- container = _render6.container;
185
- expect(Array.from(sectionOf(container).children).map(function (row) {
186
- return row.textContent;
187
- })).toEqual(['before', 'middle', 'after']);
188
- });
189
- it('emits no row for whitespace or empty text between elements', function () {
190
- var _render7 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_content["default"], {
191
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
192
- children: "one"
193
- }), " ", '', /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
194
- children: "two"
195
- })]
149
+ var _render4 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_content["default"], {
150
+ children: ["Lead text", /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
151
+ children: "an element"
152
+ }), 42]
196
153
  })),
197
- container = _render7.container;
198
- expect(Array.from(sectionOf(container).children).map(function (row) {
199
- return row.textContent;
200
- })).toEqual(['one', 'two']);
201
- });
202
- it('keeps a lone string', function () {
203
- (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_content["default"], {
204
- children: "on its own"
205
- }));
206
- expect(_react.screen.getByText('on its own')).toBeInTheDocument();
154
+ container = _render4.container;
155
+ expect(sectionOf(container)).toHaveTextContent('Lead textan element42');
207
156
  });
208
157
  });
209
158
  describe('Drawer.Divider', function () {
210
159
  it('renders a separator, merging className', function () {
211
- var _render8 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_divider["default"], {
160
+ var _render5 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_divider["default"], {
212
161
  className: "custom"
213
162
  })),
214
- container = _render8.container;
163
+ container = _render5.container;
215
164
  var divider = container.querySelector('hr');
216
165
  expect(divider).toHaveClass('newspack-drawer__divider', 'custom');
217
166
  expect(_react.screen.getByRole('separator')).toBe(divider);
@@ -224,8 +173,17 @@ describe('Drawer.Footer', function () {
224
173
  }));
225
174
  expect(_react.screen.getByText('actions')).toHaveClass('newspack-drawer__footer');
226
175
  });
176
+ it('lays its actions out in one end-aligned row that wraps', function () {
177
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_footer["default"], {
178
+ children: "actions"
179
+ }));
180
+ var footer = _react.screen.getByText('actions');
181
+ expect(footer.style.flexDirection).toBe('row');
182
+ expect(footer.style.justifyContent).toBe('flex-end');
183
+ expect(footer.style.flexWrap).toBe('wrap');
184
+ });
227
185
  it('renders its actions as direct children', function () {
228
- var _render9 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_footer["default"], {
186
+ var _render6 = (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsxs)(_footer["default"], {
229
187
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_action["default"], {
230
188
  children: "One"
231
189
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_action["default"], {
@@ -234,7 +192,7 @@ describe('Drawer.Footer', function () {
234
192
  children: "Three"
235
193
  })]
236
194
  })),
237
- container = _render9.container;
195
+ container = _render6.container;
238
196
  var footer = container.querySelector('.newspack-drawer__footer');
239
197
  expect(Array.from(footer.children)).toEqual([_react.screen.getByRole('button', {
240
198
  name: 'One'
@@ -80,10 +80,7 @@ $drawer-size-x-large: 640px;
80
80
  }
81
81
 
82
82
  .newspack-drawer__header {
83
- align-items: center;
84
- display: flex;
85
83
  flex: 0 0 auto;
86
- gap: wp-vars.$grid-unit-10;
87
84
  padding: wp-vars.$grid-unit-30 wp-vars.$grid-unit-30 wp-vars.$grid-unit-20;
88
85
  }
89
86
 
@@ -139,23 +136,8 @@ $drawer-size-x-large: 640px;
139
136
 
140
137
  .newspack-drawer__footer {
141
138
  background: wp-colors.$white;
142
- display: flex;
143
139
  flex: 0 0 auto;
144
- gap: wp-vars.$grid-unit-10;
145
140
  padding: wp-vars.$grid-unit-20 wp-vars.$grid-unit-30 wp-vars.$grid-unit-30;
146
-
147
- > .components-button {
148
- flex: 1;
149
- justify-content: center;
150
- }
151
-
152
- &:has(> :nth-child(3)) {
153
- flex-direction: column;
154
-
155
- > .components-button {
156
- flex: 0 0 auto;
157
- }
158
- }
159
141
  }
160
142
 
161
143
  @keyframes newspack-drawer-slide-in {
package/dist/cjs/index.js CHANGED
@@ -250,6 +250,12 @@ Object.defineProperty(exports, "RadioControl", {
250
250
  return _radioControl["default"];
251
251
  }
252
252
  });
253
+ Object.defineProperty(exports, "ReorderModal", {
254
+ enumerable: true,
255
+ get: function get() {
256
+ return _reorderModal["default"];
257
+ }
258
+ });
253
259
  Object.defineProperty(exports, "Router", {
254
260
  enumerable: true,
255
261
  get: function get() {
@@ -328,6 +334,12 @@ Object.defineProperty(exports, "TextControl", {
328
334
  return _textControl["default"];
329
335
  }
330
336
  });
337
+ Object.defineProperty(exports, "TooltipBadge", {
338
+ enumerable: true,
339
+ get: function get() {
340
+ return _tooltipBadge["default"];
341
+ }
342
+ });
331
343
  Object.defineProperty(exports, "Waiting", {
332
344
  enumerable: true,
333
345
  get: function get() {
@@ -436,6 +448,7 @@ var _pluginToggle = _interopRequireDefault(require("./plugin-toggle"));
436
448
  var _popover = _interopRequireDefault(require("./popover"));
437
449
  var _progressBar = _interopRequireDefault(require("./progress-bar"));
438
450
  var _radioControl = _interopRequireDefault(require("./radio-control"));
451
+ var _reorderModal = _interopRequireDefault(require("./reorder-modal"));
439
452
  var _sectionHeader = _interopRequireDefault(require("./section-header"));
440
453
  var _selectControl = _interopRequireDefault(require("./select-control"));
441
454
  var _settings = _interopRequireDefault(require("./settings"));
@@ -447,6 +460,7 @@ var _styleCard = _interopRequireDefault(require("./style-card"));
447
460
  var _tabbedNavigation = _interopRequireDefault(require("./tabbed-navigation"));
448
461
  var _tableCard = _interopRequireDefault(require("./table-card"));
449
462
  var _textControl = _interopRequireDefault(require("./text-control"));
463
+ var _tooltipBadge = _interopRequireDefault(require("./tooltip-badge"));
450
464
  var _waiting = _interopRequireDefault(require("./waiting"));
451
465
  var _webPreview = _interopRequireDefault(require("./web-preview"));
452
466
  var _wizard = _interopRequireWildcard(require("./wizard"));
@@ -74,11 +74,13 @@ var _jsxRuntime = require("react/jsx-runtime");
74
74
  direction: "row",
75
75
  gap: "sm",
76
76
  justify: "space-between",
77
+ wrap: "wrap",
77
78
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_ui.Stack, {
78
79
  direction: "row",
79
80
  gap: "sm",
80
- align: "center",
81
+ align: "start",
81
82
  justify: "start",
83
+ className: "newspack-page__header-title",
82
84
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
83
85
  className: "newspack-page__header-visual",
84
86
  "aria-hidden": "true",
@@ -91,7 +93,13 @@ var _jsxRuntime = require("react/jsx-runtime");
91
93
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_breadcrumbs["default"], {
92
94
  items: breadcrumbItems
93
95
  })
94
- }), badges]
96
+ }), badges && /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Stack, {
97
+ direction: "row",
98
+ gap: "sm",
99
+ align: "center",
100
+ className: "newspack-page__header-badges",
101
+ children: badges
102
+ })]
95
103
  }), actions && /*#__PURE__*/(0, _jsxRuntime.jsx)(_ui.Stack, {
96
104
  direction: "row",
97
105
  gap: "sm",
@@ -56,8 +56,29 @@
56
56
  padding: var(--wpds-dimension-padding-lg) var(--wpds-dimension-padding-2xl);
57
57
  }
58
58
 
59
+ .newspack-page__header-title {
60
+ min-width: 0;
61
+ }
62
+
59
63
  .newspack-page__header-actions {
64
+ flex-basis: 100%;
65
+ flex-shrink: 0;
66
+ justify-content: flex-end;
67
+ margin-inline-start: auto;
68
+
69
+ @include wp-mixins.break-medium {
70
+ flex-basis: auto;
71
+ }
72
+
73
+ &:empty,
74
+ &:has(> :only-child:empty) {
75
+ display: none;
76
+ }
77
+ }
78
+
79
+ .newspack-page__header-badges {
60
80
  flex-shrink: 0;
81
+ min-height: wp-vars.$button-size;
61
82
  }
62
83
 
63
84
  .newspack-page__header-subtitle {
@@ -68,7 +89,7 @@
68
89
  .newspack-page__header-visual {
69
90
  display: grid;
70
91
  flex-shrink: 0;
71
- height: 24px;
92
+ height: wp-vars.$button-size;
72
93
  place-items: center;
73
94
  width: 24px;
74
95
 
@@ -80,5 +101,6 @@
80
101
  }
81
102
 
82
103
  .newspack-page__breadcrumbs {
83
- min-height: wp-vars.$button-size;
104
+ min-width: 0;
105
+ padding-block: calc((#{wp-vars.$button-size} - var(--wpds-typography-line-height-md)) / 2);
84
106
  }