@kitconcept/volto-light-theme 6.0.0-alpha.22 → 6.0.0-alpha.24

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 CHANGED
@@ -1,26 +1,9 @@
1
- ## 6.0.0-alpha.22 (2025-04-29)
2
-
3
- ### Breaking
4
-
5
- - Remove `Anontools` from the headers.
6
- If you want to add them, you can use the `header_actions` field in the site customization behaviors. @sneridagh [#522](https://github.com/kitconcept/volto-light-theme/pull/522)
7
- - Updated the footer structure and look and feel:
8
- - Follow us, powered by `@plonegovbr/volto-social-media`
9
- - Footer links
10
- - Colophon
11
-
12
- All of them are powered by their slots, so they are customizable.
13
-
14
- @sneridagh [#525](https://github.com/kitconcept/volto-light-theme/pull/525)
1
+ ## 6.0.0-alpha.24 (2025-05-06)
15
2
 
16
3
  ### Feature
17
4
 
18
- - Allow `intranet_flag` in both headers. @sneridagh [#524](https://github.com/kitconcept/volto-light-theme/pull/524)
19
- - Added distribution core footer, only active if the `kitconcept.distributions.footer` is installed. @sneridagh [#525](https://github.com/kitconcept/volto-light-theme/pull/525)
20
-
21
- ### Bugfix
22
-
23
- - Minor typo fix in color contrast check message. @danalvrz [#526](https://github.com/kitconcept/volto-light-theme/pull/526)
24
- - Fix customized object list widget when data doesn't contain a value yet. @davisagli [#527](https://github.com/kitconcept/volto-light-theme/pull/527)
5
+ - Added `sticky_menu` slot. @sneridagh [#523](https://github.com/kitconcept/volto-light-theme/pull/523)
6
+ - Better naming for the specific kitconcept's behaviors for distributions. @sneridagh [#530](https://github.com/kitconcept/volto-light-theme/pull/530)
7
+ - Use `--image-aspect-ratio` for all images. @danalvrz [#533](https://github.com/kitconcept/volto-light-theme/pull/533)
25
8
 
26
9
 
package/CHANGELOG.md CHANGED
@@ -8,6 +8,21 @@
8
8
 
9
9
  <!-- towncrier release notes start -->
10
10
 
11
+ ## 6.0.0-alpha.24 (2025-05-06)
12
+
13
+ ### Feature
14
+
15
+ - Added `sticky_menu` slot. @sneridagh [#523](https://github.com/kitconcept/volto-light-theme/pull/523)
16
+ - Better naming for the specific kitconcept's behaviors for distributions. @sneridagh [#530](https://github.com/kitconcept/volto-light-theme/pull/530)
17
+ - Use `--image-aspect-ratio` for all images. @danalvrz [#533](https://github.com/kitconcept/volto-light-theme/pull/533)
18
+
19
+ ## 6.0.0-alpha.23 (2025-04-30)
20
+
21
+ ### Bugfix
22
+
23
+ - Do not use the color contrast checker if the field is not in the color map settings config. @sneridagh [#529](https://github.com/kitconcept/volto-light-theme/pull/529)
24
+ - Adjustments to the footer, conditional "Follow us" text and footer_links container. @sneridagh [#529](https://github.com/kitconcept/volto-light-theme/pull/529)
25
+
11
26
  ## 6.0.0-alpha.22 (2025-04-29)
12
27
 
13
28
  ### Breaking
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitconcept/volto-light-theme",
3
- "version": "6.0.0-alpha.22",
3
+ "version": "6.0.0-alpha.24",
4
4
  "description": "Volto Light Theme by kitconcept",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
@@ -33,7 +33,7 @@
33
33
  "@types/react": "^18.3.12",
34
34
  "@types/react-dom": "^18.3.1",
35
35
  "release-it": "^17.7.0",
36
- "@plone/types": "1.4.1"
36
+ "@plone/types": "1.4.3"
37
37
  },
38
38
  "dependencies": {
39
39
  "@dnd-kit/core": "6.0.8",
@@ -8,30 +8,30 @@ import type { Content } from '@plone/types';
8
8
  const CoreFooter = ({ content }: { content: Content }) => {
9
9
  const footer_address = useLiveData<SiteFooterSettings['footer_address']>(
10
10
  content,
11
- 'kitconcept.distributions.footer',
11
+ 'kitconcept.footer',
12
12
  'footer_address',
13
13
  );
14
14
 
15
15
  const footer_column_left_header = useLiveData<
16
16
  SiteFooterSettings['footer_column_left_header']
17
- >(content, 'kitconcept.distributions.footer', 'footer_column_left_header');
17
+ >(content, 'kitconcept.footer', 'footer_column_left_header');
18
18
  const footer_column_left = useLiveData<
19
19
  SiteFooterSettings['footer_column_left']
20
- >(content, 'kitconcept.distributions.footer', 'footer_column_left');
20
+ >(content, 'kitconcept.footer', 'footer_column_left');
21
21
 
22
22
  const footer_column_middle_header = useLiveData<
23
23
  SiteFooterSettings['footer_column_middle_header']
24
- >(content, 'kitconcept.distributions.footer', 'footer_column_middle_header');
24
+ >(content, 'kitconcept.footer', 'footer_column_middle_header');
25
25
  const footer_column_middle = useLiveData<
26
26
  SiteFooterSettings['footer_column_middle']
27
- >(content, 'kitconcept.distributions.footer', 'footer_column_middle');
27
+ >(content, 'kitconcept.footer', 'footer_column_middle');
28
28
 
29
29
  const footer_column_right_header = useLiveData<
30
30
  SiteFooterSettings['footer_column_right_header']
31
- >(content, 'kitconcept.distributions.footer', 'footer_column_right_header');
31
+ >(content, 'kitconcept.footer', 'footer_column_right_header');
32
32
  const footer_column_right = useLiveData<
33
33
  SiteFooterSettings['footer_column_right']
34
- >(content, 'kitconcept.distributions.footer', 'footer_column_right');
34
+ >(content, 'kitconcept.footer', 'footer_column_right');
35
35
 
36
36
  return (
37
37
  <Container className="footer">
@@ -4,12 +4,19 @@ import { flattenToAppURL } from '@plone/volto/helpers/Url/Url';
4
4
  import ConditionalLink from '@plone/volto/components/manage/ConditionalLink/ConditionalLink';
5
5
  import { Container } from '@plone/components';
6
6
  import { useLiveData } from '@kitconcept/volto-light-theme/helpers/useLiveData';
7
- import LinkList from '../LinkList';
8
- import type { SiteFooterSettings } from '../../../types';
7
+ import LinkList from '../../../primitives/LinkList';
8
+ import type {
9
+ PloneGobrSocialMediaSettings,
10
+ SiteFooterSettings,
11
+ } from '../../../types';
9
12
  import type { Content } from '@plone/types';
10
13
  import SlotRenderer from '@plone/volto/components/theme/SlotRenderer/SlotRenderer';
11
14
 
12
15
  const FollowUsPostFooterLogoAndLinks = ({ content }: { content: Content }) => {
16
+ const social_links = useLiveData<
17
+ PloneGobrSocialMediaSettings['social_links']
18
+ >(content, 'plonegovbr.socialmedia.settings', 'social_links');
19
+
13
20
  const footer_links = useLiveData<SiteFooterSettings['footer_links']>(
14
21
  content,
15
22
  'voltolighttheme.footer',
@@ -18,7 +25,7 @@ const FollowUsPostFooterLogoAndLinks = ({ content }: { content: Content }) => {
18
25
 
19
26
  const footer_logo = useLiveData<SiteFooterSettings['footer_logo']>(
20
27
  content,
21
- 'kitconcept.distributions.footer',
28
+ 'kitconcept.footer',
22
29
  'footer_logo',
23
30
  );
24
31
 
@@ -33,16 +40,20 @@ const FollowUsPostFooterLogoAndLinks = ({ content }: { content: Content }) => {
33
40
  })}
34
41
  >
35
42
  <div className="followus-and-links">
36
- <div className="follow-us">
37
- <span>
38
- <FormattedMessage id="Follow us:" defaultMessage="Follow us:" />
39
- </span>
40
- <SlotRenderer name="followUs" content={content} />
41
- </div>
42
- <div className="footer-links">
43
- <SlotRenderer name="footerLinks" content={content} />
44
- <LinkList links={footer_links} />
45
- </div>
43
+ {social_links?.length > 0 && (
44
+ <div className="follow-us">
45
+ <span>
46
+ <FormattedMessage id="Follow us:" defaultMessage="Follow us:" />
47
+ </span>
48
+ <SlotRenderer name="followUs" content={content} />
49
+ </div>
50
+ )}
51
+ {footer_links?.length > 0 && (
52
+ <div className="footer-links">
53
+ <SlotRenderer name="footerLinks" content={content} />
54
+ <LinkList links={footer_links} />
55
+ </div>
56
+ )}
46
57
  </div>
47
58
  {footer_logo?.data || footer_logo?.download ? (
48
59
  <div className="footer-logo">
@@ -0,0 +1,36 @@
1
+ import { useLiveData } from '@kitconcept/volto-light-theme/helpers/useLiveData';
2
+ import IconLinkList from '@kitconcept/volto-light-theme/primitives/IconLinkList';
3
+ import type { StickyMenuSettings } from '../../types';
4
+ import type { Content } from '@plone/types';
5
+
6
+ const StickyMenu = ({ content }: { content: Content }) => {
7
+ const menuData = useLiveData<StickyMenuSettings['sticky_menu']>(
8
+ content,
9
+ 'kitconcept.sticky_menu',
10
+ 'sticky_menu',
11
+ );
12
+
13
+ const sticky_menu_color = useLiveData<
14
+ StickyMenuSettings['sticky_menu_color']
15
+ >(content, 'kitconcept.sticky_menu', 'sticky_menu_color');
16
+
17
+ const sticky_menu_foreground_color = useLiveData<
18
+ StickyMenuSettings['sticky_menu_foreground_color']
19
+ >(content, 'kitconcept.sticky_menu', 'sticky_menu_foreground_color');
20
+
21
+ return (
22
+ <div
23
+ className="sticky-menu"
24
+ style={
25
+ {
26
+ '--sticky-menu-color': sticky_menu_color,
27
+ '--sticky-menu-foreground-color': sticky_menu_foreground_color,
28
+ } as React.CSSProperties
29
+ }
30
+ >
31
+ <IconLinkList iconLinks={menuData} />
32
+ </div>
33
+ );
34
+ };
35
+
36
+ export default StickyMenu;
@@ -3,6 +3,7 @@ import { HexColorPicker, HexColorInput } from 'react-colorful';
3
3
  import { Button, Dialog, DialogTrigger, Popover } from 'react-aria-components';
4
4
  import { ColorSwatch, CloseIcon } from '@plone/components';
5
5
  import ColorContrastChecker from './ColorContrastChecker';
6
+ import config from '@plone/volto/registry';
6
7
 
7
8
  const ColorPicker = (props: {
8
9
  id: string;
@@ -48,7 +49,9 @@ const ColorPicker = (props: {
48
49
  <CloseIcon size="S" />
49
50
  </Button>
50
51
  </FormFieldWrapper>
51
- <ColorContrastChecker {...props} />
52
+ {config.settings.colorMap[props.id] && (
53
+ <ColorContrastChecker {...props} />
54
+ )}
52
55
  </>
53
56
  );
54
57
  };
@@ -121,6 +121,18 @@ export type ObjectListWidgetProps = {
121
121
  }) => JSONSchema;
122
122
  };
123
123
 
124
+ const EMPTY_SCHEMA = {
125
+ fieldsets: [
126
+ {
127
+ id: 'default',
128
+ title: 'Default',
129
+ fields: [],
130
+ },
131
+ ],
132
+ properties: {},
133
+ required: [],
134
+ };
135
+
124
136
  const ObjectListWidget = (props: ObjectListWidgetProps) => {
125
137
  const {
126
138
  block,
@@ -136,7 +148,9 @@ const ObjectListWidget = (props: ObjectListWidgetProps) => {
136
148
  config.getUtility({
137
149
  type: 'schema',
138
150
  name: schemaName,
139
- }).method || props.schema;
151
+ }).method ||
152
+ props.schema ||
153
+ EMPTY_SCHEMA;
140
154
 
141
155
  const [localActiveObject, setLocalActiveObject] = useState(
142
156
  props.activeObject ?? value?.length - 1,
@@ -21,7 +21,7 @@ type apiExpanderInherit = {
21
21
 
22
22
  export default function install(config: ConfigType) {
23
23
  const EXPANDERS_INHERIT_BEHAVIORS =
24
- 'voltolighttheme.header,voltolighttheme.theme,voltolighttheme.footer,kitconcept.distributions.footer';
24
+ 'voltolighttheme.header,voltolighttheme.theme,voltolighttheme.footer,kitconcept.footer,kitconcept.sticky_menu';
25
25
  config.settings.enableAutoBlockGroupingByBackgroundColor = true;
26
26
  config.settings.navDepth = 3;
27
27
  config.settings.slate.useLinkedHeadings = false;
@@ -4,6 +4,7 @@ import FooterLogos from '../components/Footer/slots/FooterLogos';
4
4
  import FollowUsLogoAndLinks from '../components/Footer/slots/FollowUsLogoAndLinks';
5
5
  import Colophon from '../components/Footer/slots/Colophon';
6
6
  import CoreFooter from '../components/Footer/slots/CoreFooter';
7
+ import StickyMenu from '../components/StickyMenu/StickyMenu';
7
8
  import type { Content } from '@plone/types';
8
9
 
9
10
  export function hasInheritedBehavior(behavior: string) {
@@ -18,6 +19,12 @@ export default function install(config: ConfigType) {
18
19
  component: Theming,
19
20
  });
20
21
 
22
+ config.registerSlotComponent({
23
+ slot: 'aboveHeader',
24
+ name: 'StickyMenu',
25
+ component: StickyMenu,
26
+ });
27
+
21
28
  config.registerSlotComponent({
22
29
  name: 'footerLogos',
23
30
  slot: 'preFooter',
@@ -28,7 +35,7 @@ export default function install(config: ConfigType) {
28
35
  name: 'coreFooter',
29
36
  slot: 'footer',
30
37
  component: CoreFooter,
31
- predicates: [hasInheritedBehavior('kitconcept.distributions.footer')],
38
+ predicates: [hasInheritedBehavior('kitconcept.footer')],
32
39
  });
33
40
 
34
41
  config.registerSlotComponent({
package/src/index.ts CHANGED
@@ -21,6 +21,8 @@ import type {
21
21
  SiteHeaderSettings,
22
22
  SiteThemeSettings,
23
23
  SiteFooterSettings,
24
+ StickyMenuSettings,
25
+ PloneGobrSocialMediaSettings,
24
26
  } from './types';
25
27
 
26
28
  defineMessages({
@@ -54,7 +56,9 @@ declare module '@plone/types' {
54
56
  'voltolighttheme.header': CustomInheritBehavior<SiteHeaderSettings>;
55
57
  'voltolighttheme.theme': CustomInheritBehavior<SiteThemeSettings>;
56
58
  'voltolighttheme.footer': CustomInheritBehavior<SiteFooterSettings>;
57
- 'kitconcept.distributions.footer': CustomInheritBehavior<SiteFooterSettings>;
59
+ 'kitconcept.sticky_menu': CustomInheritBehavior<StickyMenuSettings>;
60
+ 'kitconcept.footer': CustomInheritBehavior<SiteFooterSettings>;
61
+ 'plonegovbr.socialmedia.settings': CustomInheritBehavior<PloneGobrSocialMediaSettings>;
58
62
  };
59
63
  }
60
64
  }
@@ -1,6 +1,6 @@
1
1
  import { flattenToAppURL } from '@plone/volto/helpers/Url/Url';
2
2
  import ConditionalLink from '@plone/volto/components/manage/ConditionalLink/ConditionalLink';
3
- import type { iconLink } from '../../types';
3
+ import type { iconLink } from '../types';
4
4
 
5
5
  type IconLinkListProps = {
6
6
  iconLinks: Array<iconLink>;
@@ -1,7 +1,7 @@
1
1
  import isEmpty from 'lodash/isEmpty';
2
2
  import { flattenToAppURL } from '@plone/volto/helpers/Url/Url';
3
3
  import UniversalLink from '@plone/volto/components/manage/UniversalLink/UniversalLink';
4
- import type { Link } from '../../types';
4
+ import type { Link } from '../types';
5
5
 
6
6
  type LinksProps = { links: Array<Link> };
7
7
 
@@ -293,7 +293,7 @@
293
293
  &:before {
294
294
  display: block;
295
295
  padding-top: 50px;
296
- border-top: 1px solid $black;
296
+ border-top: 1px solid var(--footer-foreground, $black);
297
297
  content: '';
298
298
  @include default-container-width();
299
299
  }
@@ -37,7 +37,7 @@
37
37
 
38
38
  @mixin default-aspect-ratio {
39
39
  height: auto; // needed width width, height props and aspect ratio
40
- aspect-ratio: $aspect-ratio;
40
+ aspect-ratio: var(--image-aspect-ratio, $aspect-ratio);
41
41
  object-fit: cover;
42
42
  object-position: top left;
43
43
  }
@@ -114,6 +114,11 @@ $secondary-grey: #ececec !default;
114
114
  syntax: '<color>';
115
115
  }
116
116
 
117
+ @property --image-aspect-ratio {
118
+ inherits: true;
119
+ syntax: '<number> | auto';
120
+ }
121
+
117
122
  :root {
118
123
  --background: initial;
119
124
  --text-color: initial;
@@ -1,4 +1,6 @@
1
1
  .block.highlight {
2
+ --highlight-images-aspect-ratio: var(--image-aspect-ratio, 1.7777777778);
3
+
2
4
  .teaser-item.top .highlight-description {
3
5
  .title h2 {
4
6
  @include highlight-title();
@@ -82,7 +82,7 @@
82
82
  img {
83
83
  width: 220px;
84
84
  height: min-content;
85
- aspect-ratio: $aspect-ratio !important;
85
+ aspect-ratio: var(--image-aspect-ratio, $aspect-ratio) !important;
86
86
  @container (max-width: #{$largest-mobile-screen}) {
87
87
  width: 100%;
88
88
  min-width: 335px;
@@ -177,7 +177,7 @@
177
177
  img.item-image {
178
178
  width: 100%;
179
179
  margin: 0;
180
- aspect-ratio: $aspect-ratio !important;
180
+ aspect-ratio: var(--image-aspect-ratio, $aspect-ratio) !important;
181
181
  }
182
182
 
183
183
  .item {
@@ -1,14 +1,14 @@
1
1
  .block.maps {
2
2
  iframe {
3
3
  height: unset;
4
- aspect-ratio: $aspect-ratio;
4
+ aspect-ratio: var(--image-aspect-ratio, $aspect-ratio);
5
5
  }
6
6
  &.align.left {
7
7
  iframe {
8
8
  height: unset;
9
9
  margin-right: 20px !important;
10
10
  margin-bottom: 20px !important;
11
- aspect-ratio: $aspect-ratio;
11
+ aspect-ratio: var(--image-aspect-ratio, $aspect-ratio);
12
12
  @container (max-width: #{$largest-mobile-screen}) {
13
13
  margin-bottom: $spacing-large !important;
14
14
  }
@@ -21,7 +21,7 @@
21
21
  height: unset;
22
22
  margin-bottom: 20px !important;
23
23
  margin-left: 20px !important;
24
- aspect-ratio: $aspect-ratio;
24
+ aspect-ratio: var(--image-aspect-ratio, $aspect-ratio);
25
25
  @container (max-width: #{$largest-mobile-screen}) {
26
26
  margin-bottom: $spacing-large !important;
27
27
  }
@@ -34,6 +34,7 @@
34
34
  @import 'blocks/maps';
35
35
  @import 'blocks-chooser';
36
36
  @import 'blocks/eventMetadata';
37
+ @import 'sticky-menu';
37
38
 
38
39
  @import 'temp';
39
40
 
@@ -0,0 +1,50 @@
1
+ .sticky-menu {
2
+ position: fixed;
3
+ z-index: 1000;
4
+ top: 373px;
5
+ right: 0;
6
+
7
+ ul {
8
+ display: flex;
9
+ width: 115px;
10
+ flex-direction: column;
11
+ padding: 0;
12
+ margin: 0;
13
+ list-style: none;
14
+
15
+ li a {
16
+ display: flex;
17
+ height: 93px;
18
+ flex-direction: column;
19
+ align-items: center;
20
+ justify-content: center;
21
+ margin-bottom: 2px;
22
+ background: var(--sticky-menu-color, #555);
23
+ color: var(--sticky-menu-foreground-color, #fff);
24
+ font-family: Inter;
25
+ font-size: 10px;
26
+ font-style: normal;
27
+ font-weight: 700;
28
+ line-height: 18px; /* 180% */
29
+ text-transform: capitalize;
30
+ }
31
+
32
+ .image-wrapper {
33
+ height: 65px;
34
+ }
35
+
36
+ img {
37
+ width: 100%;
38
+ max-width: 65px;
39
+ height: auto;
40
+ }
41
+ }
42
+
43
+ @media only screen and (max-width: $largest-mobile-screen) {
44
+ display: none;
45
+ }
46
+ }
47
+
48
+ body.view-editview .sticky-menu {
49
+ display: none;
50
+ }
package/src/types.d.ts CHANGED
@@ -75,6 +75,16 @@ export type SiteFooterSettings = {
75
75
  footer_links: Array<Link>;
76
76
  };
77
77
 
78
+ export type StickyMenuSettings = {
79
+ sticky_menu: Array<iconLink>;
80
+ sticky_menu_color: string;
81
+ sticky_menu_foreground_color: string;
82
+ };
83
+
84
+ export type PloneGobrSocialMediaSettings = {
85
+ social_links: Array<iconLink>;
86
+ };
87
+
78
88
  export type CustomInheritBehavior<T> = {
79
89
  data: T;
80
90
  from: {
@@ -86,6 +96,7 @@ export type CustomInheritBehavior<T> = {
86
96
  declare module '@plone/types' {
87
97
  export interface Content {
88
98
  footer_logos: Array<footerLogo>;
99
+ sticky_menu: Array<stickyMenu>;
89
100
  footer_links: Array<Link>;
90
101
  }
91
102
  }