@kitconcept/volto-light-theme 7.3.1 → 8.0.0-alpha.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.
- package/.changelog.draft +11 -3
- package/CHANGELOG.md +14 -0
- package/package.json +4 -17
- package/src/components/Blocks/Block/Edit.jsx +4 -1
- package/src/components/Blocks/Block/EditBlockWrapper.jsx +9 -4
- package/src/components/Blocks/Image/ImageSidebar.jsx +13 -1
- package/src/components/Blocks/Slider/DefaultBody.jsx +2 -1
- package/src/components/Blocks/Slider/SliderVariants.jsx +2 -1
- package/src/components/Blocks/Slider/View.jsx +1 -0
- package/src/components/Theme/RenderBlocks.jsx +1 -0
- package/src/components/Widgets/ColorPicker.tsx +2 -1
- package/src/components/LanguageSelector/LanguageSelector.jsx +0 -76
- package/src/customizations/volto/components/theme/LanguageSelector/LanguageSelector.js +0 -11
package/.changelog.draft
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
##
|
|
1
|
+
## 8.0.0-alpha.0 (2025-10-24)
|
|
2
2
|
|
|
3
|
-
###
|
|
3
|
+
### Breaking
|
|
4
4
|
|
|
5
|
-
-
|
|
5
|
+
- Use Volto 19a9. @sneridagh
|
|
6
|
+
Use `@plone/components` 4.0.0 alpha.
|
|
7
|
+
Recommended add-ons are not included by default as `peerDependencies`.
|
|
8
|
+
|
|
9
|
+
Breaking change: Please, check the [upgrade guide](https://volto-light-theme.readthedocs.io/how-to-guides/upgrade-guide.html) for more information. [#693](https://github.com/kitconcept/volto-light-theme/pull/693)
|
|
10
|
+
|
|
11
|
+
### Feature
|
|
12
|
+
|
|
13
|
+
- To reduce the size of the main VLT repository, snapshots for visual regression testing are now stored in a separate repository (kitconcept/vlt-visual-regression). @sneridagh [#690](https://github.com/kitconcept/volto-light-theme/pull/690)
|
|
6
14
|
|
|
7
15
|
|
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,20 @@
|
|
|
8
8
|
|
|
9
9
|
<!-- towncrier release notes start -->
|
|
10
10
|
|
|
11
|
+
## 8.0.0-alpha.0 (2025-10-24)
|
|
12
|
+
|
|
13
|
+
### Breaking
|
|
14
|
+
|
|
15
|
+
- Use Volto 19a9. @sneridagh
|
|
16
|
+
Use `@plone/components` 4.0.0 alpha.
|
|
17
|
+
Recommended add-ons are not included by default as `peerDependencies`.
|
|
18
|
+
|
|
19
|
+
Breaking change: Please, check the [upgrade guide](https://volto-light-theme.readthedocs.io/how-to-guides/upgrade-guide.html) for more information. [#693](https://github.com/kitconcept/volto-light-theme/pull/693)
|
|
20
|
+
|
|
21
|
+
### Feature
|
|
22
|
+
|
|
23
|
+
- To reduce the size of the main VLT repository, snapshots for visual regression testing are now stored in a separate repository (kitconcept/vlt-visual-regression). @sneridagh [#690](https://github.com/kitconcept/volto-light-theme/pull/690)
|
|
24
|
+
|
|
11
25
|
## 7.3.1 (2025-10-08)
|
|
12
26
|
|
|
13
27
|
### Bugfix
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kitconcept/volto-light-theme",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0-alpha.0",
|
|
4
4
|
"description": "Volto Light Theme by kitconcept",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"types": "src/index.ts",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"release-it": "^19.0.3",
|
|
46
46
|
"typescript": "^5.7.3",
|
|
47
47
|
"vitest": "^3.1.2",
|
|
48
|
-
"@plone/types": "
|
|
48
|
+
"@plone/types": "2.0.0-alpha.7"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@dnd-kit/core": "6.0.8",
|
|
@@ -57,23 +57,10 @@
|
|
|
57
57
|
"react-aria-components": "^1.7.0",
|
|
58
58
|
"react-colorful": "^5.6.1",
|
|
59
59
|
"uuid": "^11.0.0",
|
|
60
|
-
"@plone/components": "^
|
|
60
|
+
"@plone/components": "^4.0.0-alpha.1"
|
|
61
61
|
},
|
|
62
62
|
"peerDependencies": {
|
|
63
|
-
"
|
|
64
|
-
"@kitconcept/volto-banner-block": "^1.1.0",
|
|
65
|
-
"@kitconcept/volto-bm3-compat": "^1.0.0-alpha.1",
|
|
66
|
-
"@kitconcept/volto-button-block": "^4.0.0-alpha.0",
|
|
67
|
-
"@kitconcept/volto-carousel-block": "^2.0.0-alpha.3",
|
|
68
|
-
"@kitconcept/volto-dsgvo-banner": "^2.5.1",
|
|
69
|
-
"@kitconcept/volto-heading-block": "^2.5.0",
|
|
70
|
-
"@kitconcept/volto-highlight-block": "^4.4.0",
|
|
71
|
-
"@kitconcept/volto-introduction-block": "^1.1.0",
|
|
72
|
-
"@kitconcept/volto-logos-block": "^3.0.0-alpha.1",
|
|
73
|
-
"@kitconcept/volto-separator-block": "^4.2.1",
|
|
74
|
-
"@kitconcept/volto-slider-block": "^6.4.0",
|
|
75
|
-
"@plonegovbr/volto-social-media": "^2.0.0-alpha.10",
|
|
76
|
-
"classnames": "^2.2.6",
|
|
63
|
+
"classnames": "^2.5.1",
|
|
77
64
|
"lodash": "4.17.21",
|
|
78
65
|
"react": "18.2.0",
|
|
79
66
|
"react-dom": "18.2.0",
|
|
@@ -151,7 +151,7 @@ export class Edit extends Component {
|
|
|
151
151
|
*/
|
|
152
152
|
render() {
|
|
153
153
|
const { blocksConfig = config.blocks.blocksConfig } = this.props;
|
|
154
|
-
const { editable, type } = this.props;
|
|
154
|
+
const { editable, type, isContainer: parentIsContainer } = this.props;
|
|
155
155
|
const required = isBoolean(this.props.data.required)
|
|
156
156
|
? this.props.data.required
|
|
157
157
|
: includes(config.blocks.requiredBlocks, type);
|
|
@@ -275,6 +275,7 @@ export class Edit extends Component {
|
|
|
275
275
|
selected: this.props.selected || this.props.multiSelected,
|
|
276
276
|
multiSelected: this.props.multiSelected,
|
|
277
277
|
hovered: this.props.hovered === this.props.id,
|
|
278
|
+
error: !!this.props.blocksErrors?.[this.props.id],
|
|
278
279
|
},
|
|
279
280
|
)}
|
|
280
281
|
ref={this.blockNode}
|
|
@@ -291,6 +292,7 @@ export class Edit extends Component {
|
|
|
291
292
|
{...this.props}
|
|
292
293
|
blockNode={this.blockNode}
|
|
293
294
|
data={this.props.data}
|
|
295
|
+
className={cx({ contained: parentIsContainer })}
|
|
294
296
|
/>
|
|
295
297
|
</MaybeWrap>
|
|
296
298
|
|
|
@@ -433,6 +435,7 @@ export class Edit extends Component {
|
|
|
433
435
|
selected: this.props.selected || this.props.multiSelected,
|
|
434
436
|
multiSelected: this.props.multiSelected,
|
|
435
437
|
hovered: this.props.hovered === this.props.id,
|
|
438
|
+
error: !!this.props.blocksErrors?.[this.props.id],
|
|
436
439
|
})}
|
|
437
440
|
// END CUSTOMIZATION
|
|
438
441
|
style={{ outline: 'none' }}
|
|
@@ -21,9 +21,13 @@ import BlockChooserButton from '@plone/volto/components/manage/BlockChooser/Bloc
|
|
|
21
21
|
import trashSVG from '@plone/volto/icons/delete.svg';
|
|
22
22
|
|
|
23
23
|
const messages = defineMessages({
|
|
24
|
-
|
|
25
|
-
id: '
|
|
26
|
-
defaultMessage: 'delete',
|
|
24
|
+
delete_block: {
|
|
25
|
+
id: 'delete_block',
|
|
26
|
+
defaultMessage: 'delete {type} block',
|
|
27
|
+
},
|
|
28
|
+
drag_block: {
|
|
29
|
+
id: 'drag_block',
|
|
30
|
+
defaultMessage: 'drag {type} block',
|
|
27
31
|
},
|
|
28
32
|
});
|
|
29
33
|
|
|
@@ -99,6 +103,7 @@ const EditBlockWrapper = (props) => {
|
|
|
99
103
|
}}
|
|
100
104
|
{...draginfo.dragHandleProps}
|
|
101
105
|
className="drag handle wrapper"
|
|
106
|
+
aria-label={intl.formatMessage(messages.drag_block, { type })}
|
|
102
107
|
>
|
|
103
108
|
<Icon name={dragSVG} size="18px" />
|
|
104
109
|
</div>
|
|
@@ -111,7 +116,7 @@ const EditBlockWrapper = (props) => {
|
|
|
111
116
|
basic
|
|
112
117
|
onClick={() => onDeleteBlock(block, true)}
|
|
113
118
|
className="delete-button"
|
|
114
|
-
aria-label={intl.formatMessage(messages.
|
|
119
|
+
aria-label={intl.formatMessage(messages.delete_block, { type })}
|
|
115
120
|
>
|
|
116
121
|
<Icon name={trashSVG} size="18px" />
|
|
117
122
|
</Button>
|
|
@@ -11,7 +11,15 @@ import imageSVG from '@plone/volto/icons/image.svg';
|
|
|
11
11
|
import trashSVG from '@plone/volto/icons/delete.svg';
|
|
12
12
|
|
|
13
13
|
const ImageSidebar = (props) => {
|
|
14
|
-
const {
|
|
14
|
+
const {
|
|
15
|
+
blocksConfig,
|
|
16
|
+
blocksErrors,
|
|
17
|
+
data,
|
|
18
|
+
block,
|
|
19
|
+
onChangeBlock,
|
|
20
|
+
navRoot,
|
|
21
|
+
contentType,
|
|
22
|
+
} = props;
|
|
15
23
|
const intl = useIntl();
|
|
16
24
|
const schema = ImageSchema({ formData: data, intl });
|
|
17
25
|
// START CUSTOMIZATION
|
|
@@ -26,6 +34,7 @@ const ImageSidebar = (props) => {
|
|
|
26
34
|
</h2>
|
|
27
35
|
<Button.Group>
|
|
28
36
|
<Button
|
|
37
|
+
type="button"
|
|
29
38
|
title={intl.formatMessage(messages.clear)}
|
|
30
39
|
basic
|
|
31
40
|
disabled={!data.url}
|
|
@@ -107,6 +116,9 @@ const ImageSidebar = (props) => {
|
|
|
107
116
|
formData={data}
|
|
108
117
|
block={block}
|
|
109
118
|
blocksConfig={blocksConfig}
|
|
119
|
+
navRoot={navRoot}
|
|
120
|
+
contentType={contentType}
|
|
121
|
+
errors={blocksErrors}
|
|
110
122
|
/>
|
|
111
123
|
</>
|
|
112
124
|
);
|
|
@@ -30,6 +30,7 @@ const messages = defineMessages({
|
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
33
34
|
const DefaultImage = (props) => <img {...props} alt={props.alt || ''} />;
|
|
34
35
|
|
|
35
36
|
const SliderBody = ({
|
|
@@ -78,7 +79,7 @@ const SliderBody = ({
|
|
|
78
79
|
{!href && isEditMode && (
|
|
79
80
|
<Message>
|
|
80
81
|
<div className="grid-teaser-item default">
|
|
81
|
-
<
|
|
82
|
+
<Image src={imageBlockSVG} alt="" />
|
|
82
83
|
<p>{intl.formatMessage(messages.PleaseChooseContent)}</p>
|
|
83
84
|
<div className="toolbar-inner">
|
|
84
85
|
<Button.Group>
|
|
@@ -30,6 +30,7 @@ const messages = defineMessages({
|
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
33
34
|
const DefaultImage = (props) => <img {...props} alt={props.alt || ''} />;
|
|
34
35
|
|
|
35
36
|
const SliderVariants = ({
|
|
@@ -78,7 +79,7 @@ const SliderVariants = ({
|
|
|
78
79
|
{!href && isEditMode && (
|
|
79
80
|
<Message>
|
|
80
81
|
<div className="grid-teaser-item default">
|
|
81
|
-
<
|
|
82
|
+
<Image src={imageBlockSVG} alt="" />
|
|
82
83
|
<p>{intl.formatMessage(messages.PleaseChooseContent)}</p>
|
|
83
84
|
<div className="toolbar-inner">
|
|
84
85
|
<Button.Group>
|
|
@@ -116,6 +116,7 @@ const SliderView = (props) => {
|
|
|
116
116
|
{(data.slides?.length === 0 || !data.slides) && isEditMode && (
|
|
117
117
|
<Message>
|
|
118
118
|
<div className="teaser-item default">
|
|
119
|
+
{/* eslint-disable-next-line no-restricted-syntax */}
|
|
119
120
|
<img src={teaserTemplate} alt="" />
|
|
120
121
|
<p>{intl.formatMessage(messages.PleaseChooseContent)}</p>
|
|
121
122
|
</div>
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import FormFieldWrapper from '@plone/volto/components/manage/Widgets/FormFieldWrapper';
|
|
2
2
|
import { HexColorPicker, HexColorInput } from 'react-colorful';
|
|
3
3
|
import { Button, Dialog, DialogTrigger, Popover } from 'react-aria-components';
|
|
4
|
-
import { ColorSwatch
|
|
4
|
+
import { ColorSwatch } from '@plone/components';
|
|
5
|
+
import { CloseIcon } from '@plone/components/Icons';
|
|
5
6
|
import ColorContrastChecker from './ColorContrastChecker';
|
|
6
7
|
import config from '@plone/volto/registry';
|
|
7
8
|
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Language selector component.
|
|
3
|
-
* @module components/LanguageSelector/LanguageSelector
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import React from 'react';
|
|
7
|
-
import PropTypes from 'prop-types';
|
|
8
|
-
import { Link } from 'react-router-dom';
|
|
9
|
-
|
|
10
|
-
import { useSelector } from 'react-redux';
|
|
11
|
-
import cx from 'classnames';
|
|
12
|
-
import { find, map } from 'lodash';
|
|
13
|
-
|
|
14
|
-
import Helmet from '@plone/volto/helpers/Helmet/Helmet';
|
|
15
|
-
import langmap from '@plone/volto/helpers/LanguageMap/LanguageMap';
|
|
16
|
-
import { flattenToAppURL } from '@plone/volto/helpers/Url/Url';
|
|
17
|
-
import { toReactIntlLang } from '@plone/volto/helpers/Utils/Utils';
|
|
18
|
-
|
|
19
|
-
import config from '@plone/volto/registry';
|
|
20
|
-
|
|
21
|
-
import { defineMessages, useIntl } from 'react-intl';
|
|
22
|
-
|
|
23
|
-
const messages = defineMessages({
|
|
24
|
-
switchLanguageTo: {
|
|
25
|
-
id: 'Switch to',
|
|
26
|
-
defaultMessage: 'Switch to',
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const LanguageSelector = (props) => {
|
|
31
|
-
const intl = useIntl();
|
|
32
|
-
const currentLang = useSelector((state) => state.intl.locale);
|
|
33
|
-
const translations = useSelector(
|
|
34
|
-
(state) => state.content.data?.['@components']?.translations?.items,
|
|
35
|
-
);
|
|
36
|
-
|
|
37
|
-
const { settings } = config;
|
|
38
|
-
|
|
39
|
-
return settings.isMultilingual ? (
|
|
40
|
-
<div className="language-selector">
|
|
41
|
-
{map(settings.supportedLanguages, (lang) => {
|
|
42
|
-
const translation = find(translations, { language: lang });
|
|
43
|
-
return (
|
|
44
|
-
<Link
|
|
45
|
-
aria-label={`${intl.formatMessage(
|
|
46
|
-
messages.switchLanguageTo,
|
|
47
|
-
)} ${langmap[lang].nativeName.toLowerCase()}`}
|
|
48
|
-
className={cx({ selected: toReactIntlLang(lang) === currentLang })}
|
|
49
|
-
to={translation ? flattenToAppURL(translation['@id']) : `/${lang}`}
|
|
50
|
-
title={langmap[lang].nativeName}
|
|
51
|
-
onClick={() => {
|
|
52
|
-
props.onClickAction();
|
|
53
|
-
}}
|
|
54
|
-
key={`language-selector-${lang}`}
|
|
55
|
-
>
|
|
56
|
-
{langmap[lang].nativeName}
|
|
57
|
-
</Link>
|
|
58
|
-
);
|
|
59
|
-
})}
|
|
60
|
-
</div>
|
|
61
|
-
) : (
|
|
62
|
-
<Helmet>
|
|
63
|
-
<html lang={toReactIntlLang(settings.defaultLanguage)} />
|
|
64
|
-
</Helmet>
|
|
65
|
-
);
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
LanguageSelector.propTypes = {
|
|
69
|
-
onClickAction: PropTypes.func,
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
LanguageSelector.defaultProps = {
|
|
73
|
-
onClickAction: () => {},
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
export default LanguageSelector;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OVERRIDE LanguageSelector.js
|
|
3
|
-
* REASON: This theme uses a custom pre-@plone/components component
|
|
4
|
-
* SemanticUI-free located at the components folder.
|
|
5
|
-
* To override it, override the @kitconcept/volto-light-theme one instead of
|
|
6
|
-
* this one.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import LanguageSelector from '../../../../../components/LanguageSelector/LanguageSelector';
|
|
10
|
-
|
|
11
|
-
export default LanguageSelector;
|