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
@@ -1,3 +1,8 @@
1
+ /**
2
+ * WordPress dependencies.
3
+ */
4
+ import { Stack } from '@wordpress/ui';
5
+
1
6
  /**
2
7
  * External dependencies.
3
8
  */
@@ -10,7 +15,11 @@ import { jsx as _jsx } from "react/jsx-runtime";
10
15
  var Footer = function Footer(_ref) {
11
16
  var className = _ref.className,
12
17
  children = _ref.children;
13
- return /*#__PURE__*/_jsx("div", {
18
+ return /*#__PURE__*/_jsx(Stack, {
19
+ direction: "row",
20
+ justify: "flex-end",
21
+ wrap: "wrap",
22
+ gap: "sm",
14
23
  className: classnames('newspack-drawer__footer', className),
15
24
  children: children
16
25
  });
@@ -1,3 +1,8 @@
1
+ /**
2
+ * WordPress dependencies.
3
+ */
4
+ import { Stack } from '@wordpress/ui';
5
+
1
6
  /**
2
7
  * External dependencies.
3
8
  */
@@ -10,7 +15,10 @@ import { jsx as _jsx } from "react/jsx-runtime";
10
15
  var Header = function Header(_ref) {
11
16
  var className = _ref.className,
12
17
  children = _ref.children;
13
- return /*#__PURE__*/_jsx("div", {
18
+ return /*#__PURE__*/_jsx(Stack, {
19
+ direction: "row",
20
+ align: "center",
21
+ gap: "sm",
14
22
  className: classnames('newspack-drawer__header', className),
15
23
  children: children
16
24
  });
@@ -429,16 +429,15 @@ describe('Drawer sections', function () {
429
429
  });
430
430
 
431
431
  // The `> * { flex: none }` rule that stops sections compressing depends on this.
432
- it('lays the scroll container out as a flush VStack', function () {
432
+ it('lays the scroll container out as a flush column', function () {
433
433
  renderDrawer({
434
434
  contents: [/*#__PURE__*/_jsx(Drawer.Content, {
435
435
  children: "One"
436
436
  }, "one")]
437
437
  });
438
438
  var body = bodyOf(screen.getByText('One'));
439
- expect(body).toHaveClass('components-v-stack');
440
- expect(window.getComputedStyle(body).gap).toBe('0');
441
- expect(window.getComputedStyle(body).justifyContent).toBe('flex-start');
439
+ expect(body.style.flexDirection).toBe('column');
440
+ expect(body.style.gap).toBe('');
442
441
  });
443
442
  it('starts a new container after a non-content child', function () {
444
443
  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 = render(/*#__PURE__*/_jsx(Content, {
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 = render(/*#__PURE__*/_jsx(Content, {
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__*/_jsx(Content, {
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
- render(/*#__PURE__*/_jsxs(Content, {
161
- children: ["Lead text", /*#__PURE__*/_jsx("span", {
162
- children: "an element"
163
- }), 42]
164
- }));
165
- expect(screen.getByText('Lead text')).toBeInTheDocument();
166
- expect(screen.getByText('an element')).toBeInTheDocument();
167
- expect(screen.getByText('42')).toBeInTheDocument();
168
- });
169
- it('keeps a run of text and interpolations on one row', function () {
170
- var _render5 = render(/*#__PURE__*/_jsxs(Content, {
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 = render(/*#__PURE__*/_jsxs(Content, {
180
- children: ["before", /*#__PURE__*/_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 = render(/*#__PURE__*/_jsxs(Content, {
191
- children: [/*#__PURE__*/_jsx("span", {
192
- children: "one"
193
- }), " ", '', /*#__PURE__*/_jsx("span", {
194
- children: "two"
195
- })]
149
+ var _render4 = render(/*#__PURE__*/_jsxs(Content, {
150
+ children: ["Lead text", /*#__PURE__*/_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
- render(/*#__PURE__*/_jsx(Content, {
204
- children: "on its own"
205
- }));
206
- expect(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 = render(/*#__PURE__*/_jsx(Divider, {
160
+ var _render5 = render(/*#__PURE__*/_jsx(Divider, {
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(screen.getByRole('separator')).toBe(divider);
@@ -224,8 +173,17 @@ describe('Drawer.Footer', function () {
224
173
  }));
225
174
  expect(screen.getByText('actions')).toHaveClass('newspack-drawer__footer');
226
175
  });
176
+ it('lays its actions out in one end-aligned row that wraps', function () {
177
+ render(/*#__PURE__*/_jsx(Footer, {
178
+ children: "actions"
179
+ }));
180
+ var footer = 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 = render(/*#__PURE__*/_jsxs(Footer, {
186
+ var _render6 = render(/*#__PURE__*/_jsxs(Footer, {
229
187
  children: [/*#__PURE__*/_jsx(Action, {
230
188
  children: "One"
231
189
  }), /*#__PURE__*/_jsx(Action, {
@@ -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([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/esm/index.js CHANGED
@@ -39,6 +39,7 @@ export { default as PluginToggle } from './plugin-toggle';
39
39
  export { default as Popover } from './popover';
40
40
  export { default as ProgressBar } from './progress-bar';
41
41
  export { default as RadioControl } from './radio-control';
42
+ export { default as ReorderModal } from './reorder-modal';
42
43
  export { default as SectionHeader } from './section-header';
43
44
  export { default as SelectControl } from './select-control';
44
45
  export { default as Settings } from './settings';
@@ -50,6 +51,7 @@ export { default as StyleCard } from './style-card';
50
51
  export { default as TabbedNavigation } from './tabbed-navigation';
51
52
  export { default as TableCard } from './table-card';
52
53
  export { default as TextControl } from './text-control';
54
+ export { default as TooltipBadge } from './tooltip-badge';
53
55
  export { default as Waiting } from './waiting';
54
56
  export { default as WebPreview } from './web-preview';
55
57
  export { default as Wizard } from './wizard';
@@ -66,11 +66,13 @@ var Page = function Page(_ref) {
66
66
  direction: "row",
67
67
  gap: "sm",
68
68
  justify: "space-between",
69
+ wrap: "wrap",
69
70
  children: [/*#__PURE__*/_jsxs(Stack, {
70
71
  direction: "row",
71
72
  gap: "sm",
72
- align: "center",
73
+ align: "start",
73
74
  justify: "start",
75
+ className: "newspack-page__header-title",
74
76
  children: [/*#__PURE__*/_jsx("div", {
75
77
  className: "newspack-page__header-visual",
76
78
  "aria-hidden": "true",
@@ -83,7 +85,13 @@ var Page = function Page(_ref) {
83
85
  children: /*#__PURE__*/_jsx(Breadcrumbs, {
84
86
  items: breadcrumbItems
85
87
  })
86
- }), badges]
88
+ }), badges && /*#__PURE__*/_jsx(Stack, {
89
+ direction: "row",
90
+ gap: "sm",
91
+ align: "center",
92
+ className: "newspack-page__header-badges",
93
+ children: badges
94
+ })]
87
95
  }), actions && /*#__PURE__*/_jsx(Stack, {
88
96
  direction: "row",
89
97
  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
  }