newspack-components 4.7.0 → 4.8.0

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 (251) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/DEVELOPMENT.md +42 -21
  3. package/dist/cjs/_mixins.scss +13 -0
  4. package/dist/cjs/_variables.scss +12 -0
  5. package/dist/cjs/action-card/index.js +18 -10
  6. package/dist/cjs/action-card/index.test.js +91 -0
  7. package/dist/cjs/action-card/style.scss +2 -40
  8. package/dist/cjs/button/index.js +8 -3
  9. package/dist/cjs/button/index.test.js +61 -5
  10. package/dist/cjs/card/core-card.js +0 -2
  11. package/dist/cjs/card/style-core.scss +7 -5
  12. package/dist/cjs/card-feature/index.js +75 -61
  13. package/dist/cjs/card-feature/index.test.js +396 -54
  14. package/dist/cjs/card-feature/style.scss +20 -31
  15. package/dist/cjs/card-form/index.js +5 -5
  16. package/dist/cjs/card-sortable-list/index.js +5 -3
  17. package/dist/cjs/card-sortable-list/index.test.js +50 -0
  18. package/dist/cjs/collapsible-group/context.js +19 -0
  19. package/dist/cjs/collapsible-group/index.js +24 -0
  20. package/dist/cjs/collapsible-group/index.test.js +215 -0
  21. package/dist/cjs/collapsible-group/item.js +61 -0
  22. package/dist/cjs/collapsible-group/root.js +62 -0
  23. package/dist/cjs/collapsible-group/style.scss +47 -0
  24. package/dist/cjs/collapsible-group/types.js +5 -0
  25. package/dist/cjs/empty-state/actions.js +45 -0
  26. package/dist/cjs/empty-state/context.js +41 -0
  27. package/dist/cjs/empty-state/header.js +66 -0
  28. package/dist/cjs/empty-state/index.js +31 -0
  29. package/dist/cjs/empty-state/index.test.js +303 -0
  30. package/dist/cjs/empty-state/root.js +56 -0
  31. package/dist/cjs/empty-state/style.scss +51 -0
  32. package/dist/cjs/empty-state/types.js +5 -0
  33. package/dist/cjs/index.js +34 -20
  34. package/dist/cjs/info-button/index.js +59 -43
  35. package/dist/cjs/info-button/index.test.js +199 -0
  36. package/dist/cjs/info-button/style.scss +41 -9
  37. package/dist/cjs/modal/style.scss +12 -12
  38. package/dist/cjs/newspack-icon/style.scss +4 -4
  39. package/dist/cjs/notice/style.scss +3 -3
  40. package/dist/cjs/page/style.scss +16 -16
  41. package/dist/cjs/plugin-installer/index.js +5 -9
  42. package/dist/cjs/plugin-installer/style.scss +3 -14
  43. package/dist/cjs/section-header/index.js +31 -18
  44. package/dist/cjs/section-header/index.test.js +40 -0
  45. package/dist/cjs/section-header/style.scss +22 -6
  46. package/dist/cjs/settings/DateRangeSetting.js +309 -0
  47. package/dist/cjs/settings/SettingsSection.js +19 -5
  48. package/dist/cjs/settings/SettingsSection.test.js +49 -0
  49. package/dist/cjs/settings/index.js +3 -1
  50. package/dist/cjs/settings/style.scss +40 -7
  51. package/dist/cjs/stat-card/body.js +41 -0
  52. package/dist/cjs/stat-card/constants.js +11 -0
  53. package/dist/cjs/stat-card/context.js +54 -0
  54. package/dist/cjs/stat-card/delta.js +91 -0
  55. package/dist/cjs/stat-card/footer.js +72 -0
  56. package/dist/cjs/stat-card/index.js +47 -0
  57. package/dist/cjs/stat-card/index.test.js +938 -0
  58. package/dist/cjs/stat-card/label.js +66 -0
  59. package/dist/cjs/stat-card/root.js +69 -0
  60. package/dist/cjs/stat-card/secondary.js +38 -0
  61. package/dist/cjs/stat-card/style.scss +89 -0
  62. package/dist/cjs/stat-card/types.js +5 -0
  63. package/dist/cjs/stat-card/value.js +78 -0
  64. package/dist/cjs/status-indicator/index.js +66 -0
  65. package/dist/cjs/status-indicator/index.test.js +101 -0
  66. package/dist/cjs/status-indicator/statuses.js +39 -0
  67. package/dist/cjs/status-indicator/style.scss +9 -0
  68. package/dist/cjs/status-indicator/types.js +5 -0
  69. package/dist/cjs/style.scss +9 -9
  70. package/dist/cjs/tabbed-navigation/style.scss +6 -4
  71. package/dist/cjs/types.js +5 -0
  72. package/dist/cjs/web-preview/style.scss +11 -11
  73. package/dist/cjs/with-wizard/style.scss +10 -10
  74. package/dist/cjs/with-wizard-screen/style.scss +9 -9
  75. package/dist/cjs/wizard/index.js +33 -4
  76. package/dist/cjs/wizard/store/index.js +23 -1
  77. package/dist/esm/_mixins.scss +13 -0
  78. package/dist/esm/_variables.scss +12 -0
  79. package/dist/esm/action-card/index.js +18 -10
  80. package/dist/esm/action-card/index.test.js +89 -0
  81. package/dist/esm/action-card/style.scss +2 -40
  82. package/dist/esm/button/index.js +9 -4
  83. package/dist/esm/button/index.test.js +63 -5
  84. package/dist/esm/card/core-card.js +0 -2
  85. package/dist/esm/card/style-core.scss +7 -5
  86. package/dist/esm/card-feature/index.js +78 -62
  87. package/dist/esm/card-feature/index.test.js +397 -55
  88. package/dist/esm/card-feature/style.scss +20 -31
  89. package/dist/esm/card-form/index.js +5 -5
  90. package/dist/esm/card-sortable-list/index.js +6 -4
  91. package/dist/esm/card-sortable-list/index.test.js +46 -0
  92. package/dist/esm/collapsible-group/context.js +13 -0
  93. package/dist/esm/collapsible-group/index.js +17 -0
  94. package/dist/esm/collapsible-group/index.test.js +215 -0
  95. package/dist/esm/collapsible-group/item.js +53 -0
  96. package/dist/esm/collapsible-group/root.js +54 -0
  97. package/dist/esm/collapsible-group/style.scss +47 -0
  98. package/dist/esm/collapsible-group/types.js +1 -0
  99. package/dist/esm/empty-state/actions.js +37 -0
  100. package/dist/esm/empty-state/context.js +35 -0
  101. package/dist/esm/empty-state/header.js +58 -0
  102. package/dist/esm/empty-state/index.js +23 -0
  103. package/dist/esm/empty-state/index.test.js +299 -0
  104. package/dist/esm/empty-state/root.js +56 -0
  105. package/dist/esm/empty-state/style.scss +51 -0
  106. package/dist/esm/empty-state/types.js +1 -0
  107. package/dist/esm/index.js +4 -2
  108. package/dist/esm/info-button/index.js +54 -43
  109. package/dist/esm/info-button/index.test.js +195 -0
  110. package/dist/esm/info-button/style.scss +41 -9
  111. package/dist/esm/modal/style.scss +12 -12
  112. package/dist/esm/newspack-icon/style.scss +4 -4
  113. package/dist/esm/notice/style.scss +3 -3
  114. package/dist/esm/page/style.scss +16 -16
  115. package/dist/esm/plugin-installer/index.js +5 -9
  116. package/dist/esm/plugin-installer/style.scss +3 -14
  117. package/dist/esm/section-header/index.js +27 -14
  118. package/dist/esm/section-header/index.test.js +36 -0
  119. package/dist/esm/section-header/style.scss +22 -6
  120. package/dist/esm/settings/DateRangeSetting.js +304 -0
  121. package/dist/esm/settings/SettingsSection.js +16 -3
  122. package/dist/esm/settings/SettingsSection.test.js +45 -0
  123. package/dist/esm/settings/index.js +3 -1
  124. package/dist/esm/settings/style.scss +40 -7
  125. package/dist/esm/stat-card/body.js +36 -0
  126. package/dist/esm/stat-card/constants.js +5 -0
  127. package/dist/esm/stat-card/context.js +48 -0
  128. package/dist/esm/stat-card/delta.js +86 -0
  129. package/dist/esm/stat-card/footer.js +67 -0
  130. package/dist/esm/stat-card/index.js +33 -0
  131. package/dist/esm/stat-card/index.test.js +939 -0
  132. package/dist/esm/stat-card/label.js +61 -0
  133. package/dist/esm/stat-card/root.js +64 -0
  134. package/dist/esm/stat-card/secondary.js +33 -0
  135. package/dist/esm/stat-card/style.scss +89 -0
  136. package/dist/esm/stat-card/types.js +1 -0
  137. package/dist/esm/stat-card/value.js +73 -0
  138. package/dist/esm/status-indicator/index.js +52 -0
  139. package/dist/esm/status-indicator/index.test.js +96 -0
  140. package/dist/esm/status-indicator/statuses.js +33 -0
  141. package/dist/esm/status-indicator/style.scss +9 -0
  142. package/dist/esm/status-indicator/types.js +1 -0
  143. package/dist/esm/style.scss +9 -9
  144. package/dist/esm/tabbed-navigation/style.scss +6 -4
  145. package/dist/esm/types.js +1 -0
  146. package/dist/esm/web-preview/style.scss +11 -11
  147. package/dist/esm/with-wizard/style.scss +10 -10
  148. package/dist/esm/with-wizard-screen/style.scss +9 -9
  149. package/dist/esm/wizard/index.js +38 -7
  150. package/dist/esm/wizard/store/index.js +23 -1
  151. package/package.json +1 -1
  152. package/src/_mixins.scss +13 -0
  153. package/src/_variables.scss +12 -0
  154. package/src/action-card/action-card.d.ts +3 -2
  155. package/src/action-card/index.js +12 -12
  156. package/src/action-card/index.test.js +56 -0
  157. package/src/action-card/style.scss +2 -40
  158. package/src/button/index.test.js +52 -5
  159. package/src/button/index.tsx +9 -4
  160. package/src/card/core-card.js +0 -2
  161. package/src/card/style-core.scss +7 -5
  162. package/src/card-feature/README.md +68 -27
  163. package/src/card-feature/index.test.js +242 -27
  164. package/src/card-feature/index.tsx +77 -67
  165. package/src/card-feature/style.scss +20 -31
  166. package/src/card-form/README.md +10 -10
  167. package/src/card-form/index.tsx +4 -8
  168. package/src/card-sortable-list/README.md +4 -5
  169. package/src/card-sortable-list/index.test.js +29 -0
  170. package/src/card-sortable-list/index.tsx +7 -4
  171. package/src/collapsible-group/README.md +50 -0
  172. package/src/collapsible-group/context.ts +13 -0
  173. package/src/collapsible-group/index.test.js +168 -0
  174. package/src/collapsible-group/index.tsx +17 -0
  175. package/src/collapsible-group/item.tsx +42 -0
  176. package/src/collapsible-group/root.tsx +42 -0
  177. package/src/collapsible-group/style.scss +47 -0
  178. package/src/collapsible-group/types.ts +22 -0
  179. package/src/drawer/README.md +2 -2
  180. package/src/empty-state/README.md +165 -0
  181. package/src/empty-state/actions.tsx +37 -0
  182. package/src/empty-state/context.ts +40 -0
  183. package/src/empty-state/header.tsx +48 -0
  184. package/src/empty-state/index.test.js +247 -0
  185. package/src/empty-state/index.tsx +22 -0
  186. package/src/empty-state/root.tsx +39 -0
  187. package/src/empty-state/style.scss +51 -0
  188. package/src/empty-state/types.ts +33 -0
  189. package/src/index.js +4 -2
  190. package/src/info-button/README.md +115 -0
  191. package/src/info-button/index.test.js +163 -0
  192. package/src/info-button/index.tsx +64 -0
  193. package/src/info-button/style.scss +41 -9
  194. package/src/modal/style.scss +12 -12
  195. package/src/newspack-icon/style.scss +4 -4
  196. package/src/notice/style.scss +3 -3
  197. package/src/page/style.scss +16 -16
  198. package/src/plugin-installer/index.js +3 -9
  199. package/src/plugin-installer/style.scss +3 -14
  200. package/src/section-header/index.js +27 -14
  201. package/src/section-header/index.test.js +28 -0
  202. package/src/section-header/style.scss +22 -6
  203. package/src/settings/DateRangeSetting.js +266 -0
  204. package/src/settings/SettingsSection.js +24 -4
  205. package/src/settings/SettingsSection.test.js +45 -0
  206. package/src/settings/index.js +2 -0
  207. package/src/settings/style.scss +40 -7
  208. package/src/stat-card/README.md +434 -0
  209. package/src/stat-card/body.tsx +28 -0
  210. package/src/stat-card/constants.ts +5 -0
  211. package/src/stat-card/context.ts +53 -0
  212. package/src/stat-card/delta.tsx +88 -0
  213. package/src/stat-card/footer.tsx +68 -0
  214. package/src/stat-card/index.test.js +818 -0
  215. package/src/stat-card/index.tsx +48 -0
  216. package/src/stat-card/label.tsx +61 -0
  217. package/src/stat-card/root.tsx +40 -0
  218. package/src/stat-card/secondary.tsx +27 -0
  219. package/src/stat-card/style.scss +89 -0
  220. package/src/stat-card/types.ts +84 -0
  221. package/src/stat-card/value.tsx +72 -0
  222. package/src/status-indicator/README.md +123 -0
  223. package/src/status-indicator/index.test.js +70 -0
  224. package/src/status-indicator/index.tsx +39 -0
  225. package/src/status-indicator/statuses.ts +35 -0
  226. package/src/status-indicator/style.scss +9 -0
  227. package/src/status-indicator/types.ts +28 -0
  228. package/src/style.scss +9 -9
  229. package/src/tabbed-navigation/style.scss +6 -4
  230. package/src/types.ts +25 -0
  231. package/src/web-preview/style.scss +11 -11
  232. package/src/with-wizard/style.scss +10 -10
  233. package/src/with-wizard-screen/style.scss +9 -9
  234. package/src/wizard/index.js +49 -7
  235. package/src/wizard/store/index.js +26 -1
  236. package/dist/cjs/accordion/index.js +0 -72
  237. package/dist/cjs/accordion/index.test.js +0 -80
  238. package/dist/cjs/accordion/style.scss +0 -35
  239. package/dist/cjs/badge/index.js +0 -32
  240. package/dist/cjs/badge/style.scss +0 -36
  241. package/dist/esm/accordion/index.js +0 -63
  242. package/dist/esm/accordion/index.test.js +0 -79
  243. package/dist/esm/accordion/style.scss +0 -35
  244. package/dist/esm/badge/index.js +0 -24
  245. package/dist/esm/badge/style.scss +0 -36
  246. package/src/accordion/index.js +0 -46
  247. package/src/accordion/index.test.js +0 -62
  248. package/src/accordion/style.scss +0 -35
  249. package/src/badge/index.tsx +0 -26
  250. package/src/badge/style.scss +0 -36
  251. package/src/info-button/index.js +0 -38
@@ -1,63 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { __experimentalVStack as VStack, PanelBody } from '@wordpress/components'; // eslint-disable-line @wordpress/no-unsafe-wp-apis
5
- import { Children, Fragment, cloneElement } from '@wordpress/element';
6
-
7
- /**
8
- * External dependencies
9
- */
10
- import classNames from 'classnames';
11
-
12
- /**
13
- * Internal dependencies
14
- */
15
- import Divider from '../divider';
16
- import './style.scss';
17
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
- export var AccordionPanel = function AccordionPanel(_ref) {
19
- var children = _ref.children,
20
- className = _ref.className,
21
- title = _ref.title,
22
- _ref$defaultOpen = _ref.defaultOpen,
23
- defaultOpen = _ref$defaultOpen === void 0 ? false : _ref$defaultOpen;
24
- return /*#__PURE__*/_jsx(PanelBody, {
25
- className: className,
26
- title: title,
27
- initialOpen: defaultOpen,
28
- children: children
29
- });
30
- };
31
- var Accordion = function Accordion(_ref2) {
32
- var children = _ref2.children,
33
- className = _ref2.className,
34
- _ref2$hideSingleTitle = _ref2.hideSingleTitle,
35
- hideSingleTitle = _ref2$hideSingleTitle === void 0 ? false : _ref2$hideSingleTitle,
36
- _ref2$spacing = _ref2.spacing,
37
- spacing = _ref2$spacing === void 0 ? 6 : _ref2$spacing;
38
- var panels = Children.toArray(children);
39
- // With nothing to collapse against, a lone panel can render open and untitled.
40
- if (hideSingleTitle && panels.length === 1) {
41
- return /*#__PURE__*/_jsx("div", {
42
- className: classNames('newspack-accordion', className),
43
- children: cloneElement(panels[0], {
44
- defaultOpen: true,
45
- title: undefined
46
- })
47
- });
48
- }
49
- return /*#__PURE__*/_jsx(VStack, {
50
- className: classNames('newspack-accordion', className),
51
- spacing: spacing,
52
- children: panels.map(function (panel, index) {
53
- return /*#__PURE__*/_jsxs(Fragment, {
54
- children: [panel, index < panels.length - 1 && /*#__PURE__*/_jsx(Divider, {
55
- variant: "secondary",
56
- marginBottom: 0,
57
- marginTop: 0
58
- })]
59
- }, panel.key);
60
- })
61
- });
62
- };
63
- export default Accordion;
@@ -1,79 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- 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; }
3
- 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; }
4
- /**
5
- * External dependencies
6
- */
7
- import { render, screen } from '@testing-library/react';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import Accordion, { AccordionPanel } from './index';
13
- import { jsx as _jsx } from "react/jsx-runtime";
14
- var renderPanels = function renderPanels(count) {
15
- var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
16
- return render(/*#__PURE__*/_jsx(Accordion, _objectSpread(_objectSpread({}, props), {}, {
17
- children: Array.from({
18
- length: count
19
- }, function (_, i) {
20
- return /*#__PURE__*/_jsx(AccordionPanel, {
21
- title: "Panel ".concat(i),
22
- children: "content"
23
- }, i);
24
- })
25
- })));
26
- };
27
- var dividers = function dividers(container) {
28
- return container.querySelectorAll('.newspack-divider');
29
- };
30
- describe('Accordion dividers', function () {
31
- it('renders no divider for a single panel', function () {
32
- var _renderPanels = renderPanels(1),
33
- container = _renderPanels.container;
34
- expect(container.querySelectorAll('.components-panel__body')).toHaveLength(1);
35
- expect(dividers(container)).toHaveLength(0);
36
- });
37
- it('renders a divider between panels but not after the last', function () {
38
- var _renderPanels2 = renderPanels(3),
39
- container = _renderPanels2.container;
40
- expect(container.querySelectorAll('.components-panel__body')).toHaveLength(3);
41
- expect(dividers(container)).toHaveLength(2);
42
- expect(container.querySelector('.newspack-accordion').lastElementChild).not.toHaveClass('newspack-divider');
43
- });
44
- it('renders secondary dividers', function () {
45
- var _renderPanels3 = renderPanels(2),
46
- container = _renderPanels3.container;
47
- expect(dividers(container)[0]).toHaveClass('newspack-divider--variant-secondary');
48
- });
49
- });
50
- describe('Accordion hideSingleTitle', function () {
51
- it('keeps the title on a lone panel by default', function () {
52
- renderPanels(1);
53
- expect(screen.getByRole('button', {
54
- name: 'Panel 0'
55
- })).toBeInTheDocument();
56
- });
57
- it('drops the title and opens a lone panel when set', function () {
58
- var _renderPanels4 = renderPanels(1, {
59
- hideSingleTitle: true
60
- }),
61
- container = _renderPanels4.container;
62
- expect(screen.queryByRole('button', {
63
- name: 'Panel 0'
64
- })).not.toBeInTheDocument();
65
- expect(container.querySelector('.components-panel__body')).toHaveClass('is-opened');
66
- expect(screen.getByText('content')).toBeInTheDocument();
67
- });
68
- it('leaves titles alone when there is more than one panel', function () {
69
- renderPanels(2, {
70
- hideSingleTitle: true
71
- });
72
- expect(screen.getByRole('button', {
73
- name: 'Panel 0'
74
- })).toBeInTheDocument();
75
- expect(screen.getByRole('button', {
76
- name: 'Panel 1'
77
- })).toBeInTheDocument();
78
- });
79
- });
@@ -1,35 +0,0 @@
1
- @use "~@wordpress/base-styles/mixins" as wp-mixins;
2
- @use "~@wordpress/base-styles/variables" as wp-vars;
3
-
4
- // Sit flush with the surrounding column: core insets panels horizontally, which
5
- // would misalign them against the section they belong to.
6
- .newspack-accordion {
7
- .components-panel__body {
8
- border: 0;
9
-
10
- > .components-panel__body-title:hover {
11
- background: none;
12
- }
13
- }
14
-
15
- .components-panel__body.is-opened {
16
- padding: 0;
17
-
18
- > .components-panel__body-title {
19
- margin: 0 0 wp-vars.$grid-unit-30;
20
- }
21
- }
22
-
23
- .components-panel__body-toggle.components-button {
24
- @include wp-mixins.heading-large();
25
- padding: 0;
26
-
27
- .components-panel__arrow {
28
- right: 0;
29
- }
30
-
31
- &:focus:not(:focus-visible) {
32
- box-shadow: none;
33
- }
34
- }
35
- }
@@ -1,24 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import './style.scss';
5
-
6
- /**
7
- * External dependencies
8
- */
9
- import classnames from 'classnames';
10
- import { jsx as _jsx } from "react/jsx-runtime";
11
- /**
12
- * Badge component
13
- */
14
- var Badge = function Badge(_ref) {
15
- var text = _ref.text,
16
- _ref$level = _ref.level,
17
- level = _ref$level === void 0 ? 'default' : _ref$level;
18
- var classes = classnames('newspack-badge', "is-".concat(level));
19
- return /*#__PURE__*/_jsx("span", {
20
- className: classes,
21
- children: text
22
- });
23
- };
24
- export default Badge;
@@ -1,36 +0,0 @@
1
- /**
2
- * Badge
3
- */
4
-
5
- @use "~@wordpress/base-styles/colors" as wp-colors;
6
- @use "../../../colors/colors.module" as colors;
7
-
8
- $badge-colors: (
9
- "info": colors.$primary-600,
10
- "warning": wp-colors.$alert-yellow,
11
- "error": wp-colors.$alert-red,
12
- "success": wp-colors.$alert-green,
13
- );
14
-
15
- .newspack-badge {
16
- background-color: color-mix(in srgb, wp-colors.$white 90%, var(--base-color));
17
- border-radius: 2px;
18
- color: color-mix(in srgb, wp-colors.$black 50%, var(--base-color));
19
- display: block;
20
- flex: 0 0 auto;
21
- font-size: 12px;
22
- line-height: 1.5;
23
- padding: 1px 4px;
24
-
25
- &:where(.is-default) {
26
- background-color: wp-colors.$gray-100;
27
- color: wp-colors.$gray-800;
28
- }
29
-
30
- // Generate color variants
31
- @each $type, $color in $badge-colors {
32
- &.is-#{$type} {
33
- --base-color: #{$color};
34
- }
35
- }
36
- }
@@ -1,46 +0,0 @@
1
- /**
2
- * WordPress dependencies
3
- */
4
- import { __experimentalVStack as VStack, PanelBody } from '@wordpress/components'; // eslint-disable-line @wordpress/no-unsafe-wp-apis
5
- import { Children, Fragment, cloneElement } from '@wordpress/element';
6
-
7
- /**
8
- * External dependencies
9
- */
10
- import classNames from 'classnames';
11
-
12
- /**
13
- * Internal dependencies
14
- */
15
- import Divider from '../divider';
16
- import './style.scss';
17
-
18
- export const AccordionPanel = ( { children, className, title, defaultOpen = false } ) => (
19
- <PanelBody className={ className } title={ title } initialOpen={ defaultOpen }>
20
- { children }
21
- </PanelBody>
22
- );
23
-
24
- const Accordion = ( { children, className, hideSingleTitle = false, spacing = 6 } ) => {
25
- const panels = Children.toArray( children );
26
- // With nothing to collapse against, a lone panel can render open and untitled.
27
- if ( hideSingleTitle && panels.length === 1 ) {
28
- return (
29
- <div className={ classNames( 'newspack-accordion', className ) }>
30
- { cloneElement( panels[ 0 ], { defaultOpen: true, title: undefined } ) }
31
- </div>
32
- );
33
- }
34
- return (
35
- <VStack className={ classNames( 'newspack-accordion', className ) } spacing={ spacing }>
36
- { panels.map( ( panel, index ) => (
37
- <Fragment key={ panel.key }>
38
- { panel }
39
- { index < panels.length - 1 && <Divider variant="secondary" marginBottom={ 0 } marginTop={ 0 } /> }
40
- </Fragment>
41
- ) ) }
42
- </VStack>
43
- );
44
- };
45
-
46
- export default Accordion;
@@ -1,62 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, screen } from '@testing-library/react';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import Accordion, { AccordionPanel } from './index';
10
-
11
- const renderPanels = ( count, props = {} ) =>
12
- render(
13
- <Accordion { ...props }>
14
- { Array.from( { length: count }, ( _, i ) => (
15
- <AccordionPanel key={ i } title={ `Panel ${ i }` }>
16
- content
17
- </AccordionPanel>
18
- ) ) }
19
- </Accordion>
20
- );
21
-
22
- const dividers = container => container.querySelectorAll( '.newspack-divider' );
23
-
24
- describe( 'Accordion dividers', () => {
25
- it( 'renders no divider for a single panel', () => {
26
- const { container } = renderPanels( 1 );
27
- expect( container.querySelectorAll( '.components-panel__body' ) ).toHaveLength( 1 );
28
- expect( dividers( container ) ).toHaveLength( 0 );
29
- } );
30
-
31
- it( 'renders a divider between panels but not after the last', () => {
32
- const { container } = renderPanels( 3 );
33
- expect( container.querySelectorAll( '.components-panel__body' ) ).toHaveLength( 3 );
34
- expect( dividers( container ) ).toHaveLength( 2 );
35
- expect( container.querySelector( '.newspack-accordion' ).lastElementChild ).not.toHaveClass( 'newspack-divider' );
36
- } );
37
-
38
- it( 'renders secondary dividers', () => {
39
- const { container } = renderPanels( 2 );
40
- expect( dividers( container )[ 0 ] ).toHaveClass( 'newspack-divider--variant-secondary' );
41
- } );
42
- } );
43
-
44
- describe( 'Accordion hideSingleTitle', () => {
45
- it( 'keeps the title on a lone panel by default', () => {
46
- renderPanels( 1 );
47
- expect( screen.getByRole( 'button', { name: 'Panel 0' } ) ).toBeInTheDocument();
48
- } );
49
-
50
- it( 'drops the title and opens a lone panel when set', () => {
51
- const { container } = renderPanels( 1, { hideSingleTitle: true } );
52
- expect( screen.queryByRole( 'button', { name: 'Panel 0' } ) ).not.toBeInTheDocument();
53
- expect( container.querySelector( '.components-panel__body' ) ).toHaveClass( 'is-opened' );
54
- expect( screen.getByText( 'content' ) ).toBeInTheDocument();
55
- } );
56
-
57
- it( 'leaves titles alone when there is more than one panel', () => {
58
- renderPanels( 2, { hideSingleTitle: true } );
59
- expect( screen.getByRole( 'button', { name: 'Panel 0' } ) ).toBeInTheDocument();
60
- expect( screen.getByRole( 'button', { name: 'Panel 1' } ) ).toBeInTheDocument();
61
- } );
62
- } );
@@ -1,35 +0,0 @@
1
- @use "~@wordpress/base-styles/mixins" as wp-mixins;
2
- @use "~@wordpress/base-styles/variables" as wp-vars;
3
-
4
- // Sit flush with the surrounding column: core insets panels horizontally, which
5
- // would misalign them against the section they belong to.
6
- .newspack-accordion {
7
- .components-panel__body {
8
- border: 0;
9
-
10
- > .components-panel__body-title:hover {
11
- background: none;
12
- }
13
- }
14
-
15
- .components-panel__body.is-opened {
16
- padding: 0;
17
-
18
- > .components-panel__body-title {
19
- margin: 0 0 wp-vars.$grid-unit-30;
20
- }
21
- }
22
-
23
- .components-panel__body-toggle.components-button {
24
- @include wp-mixins.heading-large();
25
- padding: 0;
26
-
27
- .components-panel__arrow {
28
- right: 0;
29
- }
30
-
31
- &:focus:not(:focus-visible) {
32
- box-shadow: none;
33
- }
34
- }
35
- }
@@ -1,26 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import './style.scss';
5
-
6
- /**
7
- * External dependencies
8
- */
9
- import classnames from 'classnames';
10
-
11
- export type BadgeLevel = 'default' | 'info' | 'success' | 'warning' | 'error';
12
-
13
- type BadgeProps = {
14
- text: string;
15
- level?: BadgeLevel;
16
- };
17
-
18
- /**
19
- * Badge component
20
- */
21
- const Badge = ( { text, level = 'default' }: BadgeProps ) => {
22
- const classes = classnames( 'newspack-badge', `is-${ level }` );
23
- return <span className={ classes }>{ text }</span>;
24
- };
25
-
26
- export default Badge;
@@ -1,36 +0,0 @@
1
- /**
2
- * Badge
3
- */
4
-
5
- @use "~@wordpress/base-styles/colors" as wp-colors;
6
- @use "../../../colors/colors.module" as colors;
7
-
8
- $badge-colors: (
9
- "info": colors.$primary-600,
10
- "warning": wp-colors.$alert-yellow,
11
- "error": wp-colors.$alert-red,
12
- "success": wp-colors.$alert-green,
13
- );
14
-
15
- .newspack-badge {
16
- background-color: color-mix(in srgb, wp-colors.$white 90%, var(--base-color));
17
- border-radius: 2px;
18
- color: color-mix(in srgb, wp-colors.$black 50%, var(--base-color));
19
- display: block;
20
- flex: 0 0 auto;
21
- font-size: 12px;
22
- line-height: 1.5;
23
- padding: 1px 4px;
24
-
25
- &:where(.is-default) {
26
- background-color: wp-colors.$gray-100;
27
- color: wp-colors.$gray-800;
28
- }
29
-
30
- // Generate color variants
31
- @each $type, $color in $badge-colors {
32
- &.is-#{$type} {
33
- --base-color: #{$color};
34
- }
35
- }
36
- }
@@ -1,38 +0,0 @@
1
- /**
2
- * Info Button
3
- */
4
-
5
- /**
6
- * WordPress dependencies.
7
- */
8
- import { Component } from '@wordpress/element';
9
- import { Tooltip } from '@wordpress/components';
10
- import { Icon, info } from '@wordpress/icons';
11
-
12
- /**
13
- * External dependencies.
14
- */
15
- import classnames from 'classnames';
16
-
17
- /**
18
- * Internal dependencies.
19
- */
20
- import './style.scss';
21
-
22
- class InfoButton extends Component {
23
- /**
24
- * Render.
25
- */
26
- render() {
27
- const { className, ...otherProps } = this.props;
28
- return (
29
- <Tooltip { ...otherProps }>
30
- <span className={ classnames( 'newspack-info-button', className ) }>
31
- <Icon icon={ info } />
32
- </span>
33
- </Tooltip>
34
- );
35
- }
36
- }
37
-
38
- export default InfoButton;