@plone/volto 19.1.0 → 19.1.2

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.
package/CHANGELOG.md CHANGED
@@ -17,6 +17,21 @@ myst:
17
17
 
18
18
  <!-- towncrier release notes start -->
19
19
 
20
+ ## 19.1.2 (2026-06-08)
21
+
22
+ ### Bugfix
23
+
24
+ - Increase home icon size to comply with WCAG 2.2 accessibility. @polyester [#8297](https://github.com/plone/volto/issues/8297)
25
+ - Fix layout regression in `FormFieldWrapper` where the empty `aria-live` container was acting as an extra flex item, breaking widget layouts like `SizeWidget`. @Wagner3UB [#8319](https://github.com/plone/volto/issues/8319)
26
+ - Fix "Cannot POST" error on login form if it was submitted before hydration
27
+ finished, by disabling the submit button until then. @davisagli
28
+
29
+ ## 19.1.1 (2026-05-28)
30
+
31
+ ### Internal
32
+
33
+ - Update devDependency: `@testing-library/react` 16.3.2. @wesleybl [#8294](https://github.com/plone/volto/issues/8294)
34
+
20
35
  ## 19.1.0 (2026-05-28)
21
36
 
22
37
  ### Feature
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  }
10
10
  ],
11
11
  "license": "MIT",
12
- "version": "19.1.0",
12
+ "version": "19.1.2",
13
13
  "repository": {
14
14
  "type": "git",
15
15
  "url": "git@github.com:plone/volto.git"
@@ -177,10 +177,10 @@
177
177
  "url": "^0.11.3",
178
178
  "use-deep-compare-effect": "1.8.1",
179
179
  "uuid": "^14.0.0",
180
- "@plone/components": "4.1.0",
180
+ "@plone/components": "4.2.0",
181
181
  "@plone/registry": "3.0.1",
182
182
  "@plone/scripts": "4.0.1",
183
- "@plone/volto-slate": "19.0.1"
183
+ "@plone/volto-slate": "19.0.2"
184
184
  },
185
185
  "devDependencies": {
186
186
  "@babel/core": "^7.28.5",
@@ -205,7 +205,7 @@
205
205
  "@storybook/theming": "^8.0.4",
206
206
  "@testing-library/cypress": "10.1.0",
207
207
  "@testing-library/jest-dom": "^6.9.1",
208
- "@testing-library/react": "14.3.1",
208
+ "@testing-library/react": "^16.3.2",
209
209
  "@testing-library/react-hooks": "8.0.1",
210
210
  "@types/history": "^4.7.11",
211
211
  "@types/loadable__component": "^5.13.10",
@@ -288,11 +288,11 @@
288
288
  "webpack-bundle-analyzer": "4.10.1",
289
289
  "webpack-dev-server": "^5.2.4",
290
290
  "webpack-node-externals": "3.0.0",
291
- "@plone/razzle": "1.0.0",
292
291
  "@plone/babel-preset-razzle": "^1.0.1",
292
+ "@plone/types": "2.0.0",
293
293
  "@plone/razzle-dev-utils": "1.0.0",
294
294
  "@plone/volto-coresandbox": "1.0.0",
295
- "@plone/types": "2.0.0"
295
+ "@plone/razzle": "1.0.0"
296
296
  },
297
297
  "scripts": {
298
298
  "analyze": "BUNDLE_ANALYZE=true razzle build",
@@ -36,13 +36,13 @@ config.blocks.blocksConfig = {
36
36
 
37
37
  describe('Image View Component', () => {
38
38
  test('renders a view image component with a local image', () => {
39
- const { getByRole } = render(<View data={{ url: '/image.jpg' }} />);
40
- const img = getByRole('img');
39
+ const { container } = render(<View data={{ url: '/image.jpg' }} />);
40
+ const img = container.querySelector('img');
41
41
  expect(img).toHaveAttribute('src', '/image.jpg/@@images/image');
42
42
  expect(img).toHaveAttribute('loading', 'lazy');
43
43
  });
44
44
  test('renders a view image component with a local image with a link', () => {
45
- const { container, getByRole } = render(
45
+ const { container } = render(
46
46
  <Provider store={store}>
47
47
  <MemoryRouter>
48
48
  <View
@@ -51,22 +51,22 @@ describe('Image View Component', () => {
51
51
  </MemoryRouter>
52
52
  </Provider>,
53
53
  );
54
- const img = getByRole('img');
54
+ const img = container.querySelector('img');
55
55
  const a = container.querySelector('a');
56
56
  expect(img).toHaveAttribute('src', '/image.jpg/@@images/image');
57
57
  expect(a).toHaveAttribute('href', '/front-page');
58
58
  });
59
59
  test('renders a view image component with an external image', () => {
60
- const { getByRole } = render(
60
+ const { container } = render(
61
61
  <Provider store={store}>
62
62
  <View data={{ url: 'https://plone.org/logo.jpg' }} />
63
63
  </Provider>,
64
64
  );
65
- const img = getByRole('img');
65
+ const img = container.querySelector('img');
66
66
  expect(img).toHaveAttribute('src', 'https://plone.org/logo.jpg');
67
67
  });
68
68
  test('renders a view image component with an external image with a link', () => {
69
- const { container, getByRole } = render(
69
+ const { container } = render(
70
70
  <Provider store={store}>
71
71
  <View
72
72
  data={{
@@ -76,7 +76,7 @@ describe('Image View Component', () => {
76
76
  />
77
77
  </Provider>,
78
78
  );
79
- const img = getByRole('img');
79
+ const img = container.querySelector('img');
80
80
  const a = container.querySelector('a');
81
81
  expect(img).toHaveAttribute('src', 'https://plone.org/logo.jpg');
82
82
  expect(a).toHaveAttribute('href', 'http://front-page');
@@ -61,7 +61,11 @@ const FormFieldWrapper = ({
61
61
  <>
62
62
  {children}
63
63
 
64
- <div aria-live="polite" aria-atomic="true">
64
+ <div
65
+ aria-live="polite"
66
+ aria-atomic="true"
67
+ className={cx({ 'visually-hidden': !error?.length })}
68
+ >
65
69
  {map(error, (message) => (
66
70
  <Label key={message} basic color="red" className="form-error-label">
67
71
  {message}
@@ -67,7 +67,7 @@ const BreadcrumbsComponent = ({ pathname }) => {
67
67
  className="section"
68
68
  title={intl.formatMessage(messages.home)}
69
69
  >
70
- <Icon name={homeSVG} size="18px" />
70
+ <Icon name={homeSVG} size="24px" />
71
71
  </Link>
72
72
  {items.map((item, index, items) => [
73
73
  <Breadcrumb.Divider key={`divider-${item.url}`} />,
@@ -14,6 +14,7 @@ import qs from 'query-string';
14
14
 
15
15
  import Helmet from '@plone/volto/helpers/Helmet/Helmet';
16
16
  import { usePrevious } from '@plone/volto/helpers/Utils/usePrevious';
17
+ import { useClient } from '@plone/volto/hooks/client/useClient';
17
18
  import config from '@plone/volto/registry';
18
19
  import Icon from '@plone/volto/components/theme/Icon/Icon';
19
20
  import {
@@ -84,6 +85,7 @@ const Login = (props) => {
84
85
  location.pathname.replace(/\/[^/]*\/?$/, '') ||
85
86
  '/';
86
87
  const previousToken = usePrevious(token);
88
+ const isClient = useClient();
87
89
 
88
90
  useEffect(() => {
89
91
  if (location?.state?.isLogout) {
@@ -252,6 +254,7 @@ const Login = (props) => {
252
254
  aria-label={intl.formatMessage(messages.login)}
253
255
  title={intl.formatMessage(messages.login)}
254
256
  loading={loading}
257
+ disabled={!isClient}
255
258
  >
256
259
  <Icon className="circled" name={aheadSVG} size="30px" />
257
260
  </Button>