From ecad4c99c6d3246d532817f955c0cccdef20eac3 Mon Sep 17 00:00:00 2001 From: Victor Fernandez de Alba Date: Tue, 20 Jan 2026 11:37:18 +0100 Subject: [PATCH] Move k.footer to core --- backend/news/+movefootertocore.feature | 1 + .../kitconcept/core/behaviors/configure.zcml | 7 + .../src/kitconcept/core/behaviors/footer.py | 162 ++++++++++++++++++ .../locales/de/LC_MESSAGES/kitconcept.core.po | 88 +++++++++- .../locales/en/LC_MESSAGES/kitconcept.core.po | 88 +++++++++- .../core/locales/kitconcept.core.pot | 88 +++++++++- .../news/+movefootertocore.feature | 1 + .../packages/kitconcept-core/package.json | 3 +- .../kitconcept-core/src/config/slots.ts | 14 ++ .../src/slots/Footer/CoreFooter.tsx | 83 +++++++++ .../packages/kitconcept-core/tsconfig.json | 3 + frontend/pnpm-lock.yaml | 34 ++-- 12 files changed, 557 insertions(+), 15 deletions(-) create mode 100644 backend/news/+movefootertocore.feature create mode 100644 backend/src/kitconcept/core/behaviors/footer.py create mode 100644 frontend/packages/kitconcept-core/news/+movefootertocore.feature create mode 100644 frontend/packages/kitconcept-core/src/slots/Footer/CoreFooter.tsx diff --git a/backend/news/+movefootertocore.feature b/backend/news/+movefootertocore.feature new file mode 100644 index 00000000..7461ce23 --- /dev/null +++ b/backend/news/+movefootertocore.feature @@ -0,0 +1 @@ +Moved kitconcept.footer behavior to k.core. @sneridagh diff --git a/backend/src/kitconcept/core/behaviors/configure.zcml b/backend/src/kitconcept/core/behaviors/configure.zcml index 2fa9886a..bb6f3c81 100644 --- a/backend/src/kitconcept/core/behaviors/configure.zcml +++ b/backend/src/kitconcept/core/behaviors/configure.zcml @@ -40,4 +40,11 @@ provides=".person_image.IPersonImage" /> + + diff --git a/backend/src/kitconcept/core/behaviors/footer.py b/backend/src/kitconcept/core/behaviors/footer.py new file mode 100644 index 00000000..1dc84c1b --- /dev/null +++ b/backend/src/kitconcept/core/behaviors/footer.py @@ -0,0 +1,162 @@ +from kitconcept.voltolighttheme import _ +from plone.autoform import directives +from plone.autoform.interfaces import IFormFieldProvider +from plone.namedfile.field import NamedBlobImage +from plone.schema import JSONField +from plone.supermodel import model +from zope.interface import provider +from zope.schema import Text +from zope.schema import TextLine + +import json + + +OBJECT_LIST_DEFAULT_VALUE = [] + +OBJECT_LIST = json.dumps({ + "type": "array", + "items": { + "type": "object", + }, +}) + + +@provider(IFormFieldProvider) +class IKitconceptVoltoFooterSettings(model.Schema): + """Site/Subsite footer properties behavior.""" + + model.fieldset( + "footer", + label=_("Footer customizations"), + fields=[ + "footer_logo", + "footer_address", + "footer_column_left_header", + "footer_column_left", + "footer_column_middle_header", + "footer_column_middle", + "footer_column_right_header", + "footer_column_right", + "post_footer_logo", + "post_footer_logo_link", + ], + ) + + footer_logo = NamedBlobImage( + title=_("label_footer_logo", default="Footer Logo"), + description=_( + "help_footer_logo", + default="The footer has a main logo located in the lower" + " left side, above the address. In case that the footer has a dark " + " background, you can set this inversed logo to ensure it plays well with " + "the background color. If not set, the main site logo will be used.", + ), + required=False, + ) + + footer_address = Text( + title=_("Footer address"), + description=_( + "The footer address that appears below the footer logo in the" + " first footer column." + ), + required=False, + ) + + footer_column_left_header = TextLine( + title=_("Footer column left header"), + required=False, + ) + + directives.widget( + "footer_column_left", + frontendOptions={ + "widget": "object_list", + "widgetProps": {"schemaName": "footerLinks"}, + }, + ) + footer_column_left = JSONField( + title=_("Footer column left"), + description=_( + "The left-most column appearing after the address column. It can contain" + " a list of links." + ), + schema=OBJECT_LIST, + default=OBJECT_LIST_DEFAULT_VALUE, + required=False, + widget="", + ) + + footer_column_middle_header = TextLine( + title=_("Footer column middle header"), + required=False, + ) + + directives.widget( + "footer_column_middle", + frontendOptions={ + "widget": "object_list", + "widgetProps": {"schemaName": "footerLinks"}, + }, + ) + footer_column_middle = JSONField( + title=_("Footer column middle"), + description=_( + "The middle column appearing between the left and the right columns. It can" + " contain a list of links." + ), + schema=OBJECT_LIST, + default=OBJECT_LIST_DEFAULT_VALUE, + required=False, + widget="", + ) + + footer_column_right_header = TextLine( + title=_("Footer column right header"), + required=False, + ) + + directives.widget( + "footer_column_right", + frontendOptions={ + "widget": "object_list", + "widgetProps": {"schemaName": "footerLinks"}, + }, + ) + footer_column_right = JSONField( + title=_("Footer column right"), + description=_( + "The right-most column appearing after the middle column. It can contain" + " a list of links." + ), + schema=OBJECT_LIST, + default=OBJECT_LIST_DEFAULT_VALUE, + required=False, + widget="", + ) + + post_footer_logo = NamedBlobImage( + title=_("label_post_footer_logo", default="Post Footer Logo"), + description=_( + "help_post_footer_logo", + default="The post footer can have a prominent logo located in the lower" + " right side. It is normally used for displaying the logo of the site" + " sponsor.", + ), + required=False, + ) + + directives.widget( + "post_footer_logo_link", + frontendOptions={ + "widget": "url", + }, + ) + post_footer_logo_link = TextLine( + title=_("label_post_footer_logo_link", default="Post Footer Logo Link"), + description=_( + "help_post_footer_logo_link", + default="The post footer logo can be linked to a URL.", + ), + required=False, + ) diff --git a/backend/src/kitconcept/core/locales/de/LC_MESSAGES/kitconcept.core.po b/backend/src/kitconcept/core/locales/de/LC_MESSAGES/kitconcept.core.po index 48689bac..5f73ceb0 100644 --- a/backend/src/kitconcept/core/locales/de/LC_MESSAGES/kitconcept.core.po +++ b/backend/src/kitconcept/core/locales/de/LC_MESSAGES/kitconcept.core.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2025-12-09 17:11+0000\n" +"POT-Creation-Date: 2026-01-20 10:11+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,6 +38,38 @@ msgstr "Benutzerdefiniertes CSS für diese Seite." msgid "Fields with additional person information" msgstr "Felder mit zusätzlichen Personeninformationen" +#: kitconcept/core/behaviors/footer.py:58 +msgid "Footer address" +msgstr "Footer Adresse" + +#: kitconcept/core/behaviors/footer.py:79 +msgid "Footer column left" +msgstr "Footer Spalte 1" + +#: kitconcept/core/behaviors/footer.py:67 +msgid "Footer column left header" +msgstr "Footer Spalte 1 Überschrift" + +#: kitconcept/core/behaviors/footer.py:103 +msgid "Footer column middle" +msgstr "Footer Spalte 2" + +#: kitconcept/core/behaviors/footer.py:91 +msgid "Footer column middle header" +msgstr "Footer Spalte 2 Überschrift" + +#: kitconcept/core/behaviors/footer.py:127 +msgid "Footer column right" +msgstr "Footer Spalte 3" + +#: kitconcept/core/behaviors/footer.py:115 +msgid "Footer column right header" +msgstr "Footer Spalte 3 Überschrift" + +#: kitconcept/core/behaviors/footer.py:30 +msgid "Footer customizations" +msgstr "Footer Anpassungen" + #: kitconcept/core/profiles.zcml:13 msgid "Generic setup profile with base settings for kitconcept projects." msgstr "Generisches Setup-Profil mit Basiseinstellungen für kitconcept-Projekte." @@ -66,14 +98,34 @@ msgstr "Person: Biografieinformationen" msgid "Person: Image" msgstr "Person: Bild" +#: kitconcept/core/behaviors/configure.zcml:48 +msgid "Set of fields to customize kitconcept's distributions sites and subsites" +msgstr "" + #: kitconcept/core/behaviors/configure.zcml:41 msgid "Simple attribute-based image field for persons portraits." msgstr "Einfaches attributbasiertes Bildfeld für Personenporträts." +#: kitconcept/core/behaviors/footer.py:59 +msgid "The footer address that appears below the footer logo in the first footer column." +msgstr "Die Adresse wird auf der linken Seite im Footer unterhalb des Footer Logos angezeigt." + +#: kitconcept/core/behaviors/footer.py:80 +msgid "The left-most column appearing after the address column. It can contain a list of links." +msgstr "Die linke Spalte, die nach der Adressspalte erscheint. Sie kann eine Liste von Links enthalten." + +#: kitconcept/core/behaviors/footer.py:104 +msgid "The middle column appearing between the left and the right columns. It can contain a list of links." +msgstr "Die mittlere Spalte, die zwischen der linken und der rechten Spalte erscheint. Sie kann eine Liste von Links enthalten." + #: kitconcept/core/profiles/dependencies/registry/querystring.xml msgid "The path of an item" msgstr "Der Pfad eines Inhalts" +#: kitconcept/core/behaviors/footer.py:128 +msgid "The right-most column appearing after the middle column. It can contain a list of links." +msgstr "Die rechte Spalte, die nach der mittleren Spalte erscheint. Sie kann eine Liste von Links enthalten." + #: kitconcept/core/behaviors/configure.zcml:19 msgid "Through The Web blocks configuration" msgstr "Blockkonfiguration durch die Weboberfläche" @@ -83,6 +135,11 @@ msgstr "Blockkonfiguration durch die Weboberfläche" msgid "help_blocks_config_mutator" msgstr "Blocks Konfiguration anpassen" +#. Default: "The footer has a main logo located in the lower left side, above the address. In case that the footer has a dark background, you can set this inversed logo to ensure it plays well with the background color. If not set, the main site logo will be used." +#: kitconcept/core/behaviors/footer.py:47 +msgid "help_footer_logo" +msgstr "Der Footer zeigt ein Logo in der unteren linken Ecke, direkt über der Adresse. Falls der Footer eine dunkle Hintergrundfarbe hat, können Sie ein invertiertes Logo verwenden, um sicherzustellen, dass es mit dem Hintergrund funktioniert. Wenn Sie dieses Feld nicht füllen, wird das Hauptlogo der Seite im Footer verwendet." + #. Default: "A short biography for this person." #: kitconcept/core/behaviors/person_bio.py:20 msgid "help_person_biography" @@ -93,10 +150,24 @@ msgstr "Kurzbiographie der Person." msgid "help_person_image" msgstr "Laden Sie ein normales Portraitbild mit Ihrem Kopf in der Mitte hoch." +#. Default: "The post footer can have a prominent logo located in the lower right side. It is normally used for displaying the logo of the site sponsor." +#: kitconcept/core/behaviors/footer.py:140 +msgid "help_post_footer_logo" +msgstr "Zeigt das Logo einer Organisation an, die das Projekt oder die Website fördert oder finanziert. Wird unterhalb des Footers platziert, um Fördergeber und Träger zu würdigen." + +#. Default: "The post footer logo can be linked to a URL." +#: kitconcept/core/behaviors/footer.py:157 +msgid "help_post_footer_logo_link" +msgstr "Verknüpfung des Förderlogos mit der Website der fördernden Organisation." + #: kitconcept/core/controlpanel/kitconcept.py:27 msgid "kitconcept Settings" msgstr "" +#: kitconcept/core/behaviors/configure.zcml:48 +msgid "kitconcept specific footer customizations" +msgstr "" + #: kitconcept/core/profiles.zcml:13 msgid "kitconcept: Base settings" msgstr "" @@ -129,6 +200,11 @@ msgstr "Standort" msgid "label_contact_room" msgstr "Raum" +#. Default: "Footer Logo" +#: kitconcept/core/behaviors/footer.py:46 +msgid "label_footer_logo" +msgstr "Footer Logo" + #. Default: "Biography" #: kitconcept/core/behaviors/person_bio.py:19 msgid "label_person_biography" @@ -138,3 +214,13 @@ msgstr "Biographie" #: kitconcept/core/behaviors/person_image.py:11 msgid "label_person_image" msgstr "Profilbild/Portrait" + +#. Default: "Post Footer Logo" +#: kitconcept/core/behaviors/footer.py:139 +msgid "label_post_footer_logo" +msgstr "Partnerlogo/Förderlogo" + +#. Default: "Post Footer Logo Link" +#: kitconcept/core/behaviors/footer.py:156 +msgid "label_post_footer_logo_link" +msgstr "Partnerlogo/Förderlogo Link" diff --git a/backend/src/kitconcept/core/locales/en/LC_MESSAGES/kitconcept.core.po b/backend/src/kitconcept/core/locales/en/LC_MESSAGES/kitconcept.core.po index 41a8b7c6..c0d98fa1 100644 --- a/backend/src/kitconcept/core/locales/en/LC_MESSAGES/kitconcept.core.po +++ b/backend/src/kitconcept/core/locales/en/LC_MESSAGES/kitconcept.core.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2025-12-09 17:11+0000\n" +"POT-Creation-Date: 2026-01-20 10:11+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,6 +38,38 @@ msgstr "" msgid "Fields with additional person information" msgstr "" +#: kitconcept/core/behaviors/footer.py:58 +msgid "Footer address" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:79 +msgid "Footer column left" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:67 +msgid "Footer column left header" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:103 +msgid "Footer column middle" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:91 +msgid "Footer column middle header" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:127 +msgid "Footer column right" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:115 +msgid "Footer column right header" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:30 +msgid "Footer customizations" +msgstr "" + #: kitconcept/core/profiles.zcml:13 msgid "Generic setup profile with base settings for kitconcept projects." msgstr "" @@ -66,14 +98,34 @@ msgstr "" msgid "Person: Image" msgstr "" +#: kitconcept/core/behaviors/configure.zcml:48 +msgid "Set of fields to customize kitconcept's distributions sites and subsites" +msgstr "" + #: kitconcept/core/behaviors/configure.zcml:41 msgid "Simple attribute-based image field for persons portraits." msgstr "" +#: kitconcept/core/behaviors/footer.py:59 +msgid "The footer address that appears below the footer logo in the first footer column." +msgstr "" + +#: kitconcept/core/behaviors/footer.py:80 +msgid "The left-most column appearing after the address column. It can contain a list of links." +msgstr "" + +#: kitconcept/core/behaviors/footer.py:104 +msgid "The middle column appearing between the left and the right columns. It can contain a list of links." +msgstr "" + #: kitconcept/core/profiles/dependencies/registry/querystring.xml msgid "The path of an item" msgstr "" +#: kitconcept/core/behaviors/footer.py:128 +msgid "The right-most column appearing after the middle column. It can contain a list of links." +msgstr "" + #: kitconcept/core/behaviors/configure.zcml:19 msgid "Through The Web blocks configuration" msgstr "" @@ -83,6 +135,11 @@ msgstr "" msgid "help_blocks_config_mutator" msgstr "" +#. Default: "The footer has a main logo located in the lower left side, above the address. In case that the footer has a dark background, you can set this inversed logo to ensure it plays well with the background color. If not set, the main site logo will be used." +#: kitconcept/core/behaviors/footer.py:47 +msgid "help_footer_logo" +msgstr "" + #. Default: "A short biography for this person." #: kitconcept/core/behaviors/person_bio.py:20 msgid "help_person_biography" @@ -93,10 +150,24 @@ msgstr "" msgid "help_person_image" msgstr "" +#. Default: "The post footer can have a prominent logo located in the lower right side. It is normally used for displaying the logo of the site sponsor." +#: kitconcept/core/behaviors/footer.py:140 +msgid "help_post_footer_logo" +msgstr "" + +#. Default: "The post footer logo can be linked to a URL." +#: kitconcept/core/behaviors/footer.py:157 +msgid "help_post_footer_logo_link" +msgstr "" + #: kitconcept/core/controlpanel/kitconcept.py:27 msgid "kitconcept Settings" msgstr "" +#: kitconcept/core/behaviors/configure.zcml:48 +msgid "kitconcept specific footer customizations" +msgstr "" + #: kitconcept/core/profiles.zcml:13 msgid "kitconcept: Base settings" msgstr "" @@ -129,6 +200,11 @@ msgstr "" msgid "label_contact_room" msgstr "" +#. Default: "Footer Logo" +#: kitconcept/core/behaviors/footer.py:46 +msgid "label_footer_logo" +msgstr "" + #. Default: "Biography" #: kitconcept/core/behaviors/person_bio.py:19 msgid "label_person_biography" @@ -138,3 +214,13 @@ msgstr "" #: kitconcept/core/behaviors/person_image.py:11 msgid "label_person_image" msgstr "" + +#. Default: "Post Footer Logo" +#: kitconcept/core/behaviors/footer.py:139 +msgid "label_post_footer_logo" +msgstr "" + +#. Default: "Post Footer Logo Link" +#: kitconcept/core/behaviors/footer.py:156 +msgid "label_post_footer_logo_link" +msgstr "" diff --git a/backend/src/kitconcept/core/locales/kitconcept.core.pot b/backend/src/kitconcept/core/locales/kitconcept.core.pot index c764a2ee..a1d9d83f 100644 --- a/backend/src/kitconcept/core/locales/kitconcept.core.pot +++ b/backend/src/kitconcept/core/locales/kitconcept.core.pot @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2025-12-09 17:11+0000\n" +"POT-Creation-Date: 2026-01-20 10:11+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,6 +41,38 @@ msgstr "" msgid "Fields with additional person information" msgstr "" +#: kitconcept/core/behaviors/footer.py:58 +msgid "Footer address" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:79 +msgid "Footer column left" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:67 +msgid "Footer column left header" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:103 +msgid "Footer column middle" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:91 +msgid "Footer column middle header" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:127 +msgid "Footer column right" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:115 +msgid "Footer column right header" +msgstr "" + +#: kitconcept/core/behaviors/footer.py:30 +msgid "Footer customizations" +msgstr "" + #: kitconcept/core/profiles.zcml:13 msgid "Generic setup profile with base settings for kitconcept projects." msgstr "" @@ -69,14 +101,34 @@ msgstr "" msgid "Person: Image" msgstr "" +#: kitconcept/core/behaviors/configure.zcml:48 +msgid "Set of fields to customize kitconcept's distributions sites and subsites" +msgstr "" + #: kitconcept/core/behaviors/configure.zcml:41 msgid "Simple attribute-based image field for persons portraits." msgstr "" +#: kitconcept/core/behaviors/footer.py:59 +msgid "The footer address that appears below the footer logo in the first footer column." +msgstr "" + +#: kitconcept/core/behaviors/footer.py:80 +msgid "The left-most column appearing after the address column. It can contain a list of links." +msgstr "" + +#: kitconcept/core/behaviors/footer.py:104 +msgid "The middle column appearing between the left and the right columns. It can contain a list of links." +msgstr "" + #: kitconcept/core/profiles/dependencies/registry/querystring.xml msgid "The path of an item" msgstr "" +#: kitconcept/core/behaviors/footer.py:128 +msgid "The right-most column appearing after the middle column. It can contain a list of links." +msgstr "" + #: kitconcept/core/behaviors/configure.zcml:19 msgid "Through The Web blocks configuration" msgstr "" @@ -86,6 +138,11 @@ msgstr "" msgid "help_blocks_config_mutator" msgstr "" +#. Default: "The footer has a main logo located in the lower left side, above the address. In case that the footer has a dark background, you can set this inversed logo to ensure it plays well with the background color. If not set, the main site logo will be used." +#: kitconcept/core/behaviors/footer.py:47 +msgid "help_footer_logo" +msgstr "" + #. Default: "A short biography for this person." #: kitconcept/core/behaviors/person_bio.py:20 msgid "help_person_biography" @@ -96,10 +153,24 @@ msgstr "" msgid "help_person_image" msgstr "" +#. Default: "The post footer can have a prominent logo located in the lower right side. It is normally used for displaying the logo of the site sponsor." +#: kitconcept/core/behaviors/footer.py:140 +msgid "help_post_footer_logo" +msgstr "" + +#. Default: "The post footer logo can be linked to a URL." +#: kitconcept/core/behaviors/footer.py:157 +msgid "help_post_footer_logo_link" +msgstr "" + #: kitconcept/core/controlpanel/kitconcept.py:27 msgid "kitconcept Settings" msgstr "" +#: kitconcept/core/behaviors/configure.zcml:48 +msgid "kitconcept specific footer customizations" +msgstr "" + #: kitconcept/core/profiles.zcml:13 msgid "kitconcept: Base settings" msgstr "" @@ -132,6 +203,11 @@ msgstr "" msgid "label_contact_room" msgstr "" +#. Default: "Footer Logo" +#: kitconcept/core/behaviors/footer.py:46 +msgid "label_footer_logo" +msgstr "" + #. Default: "Biography" #: kitconcept/core/behaviors/person_bio.py:19 msgid "label_person_biography" @@ -141,3 +217,13 @@ msgstr "" #: kitconcept/core/behaviors/person_image.py:11 msgid "label_person_image" msgstr "" + +#. Default: "Post Footer Logo" +#: kitconcept/core/behaviors/footer.py:139 +msgid "label_post_footer_logo" +msgstr "" + +#. Default: "Post Footer Logo Link" +#: kitconcept/core/behaviors/footer.py:156 +msgid "label_post_footer_logo_link" +msgstr "" diff --git a/frontend/packages/kitconcept-core/news/+movefootertocore.feature b/frontend/packages/kitconcept-core/news/+movefootertocore.feature new file mode 100644 index 00000000..7461ce23 --- /dev/null +++ b/frontend/packages/kitconcept-core/news/+movefootertocore.feature @@ -0,0 +1 @@ +Moved kitconcept.footer behavior to k.core. @sneridagh diff --git a/frontend/packages/kitconcept-core/package.json b/frontend/packages/kitconcept-core/package.json index f17193bd..6bd044e7 100644 --- a/frontend/packages/kitconcept-core/package.json +++ b/frontend/packages/kitconcept-core/package.json @@ -27,8 +27,9 @@ "release-alpha": "release-it --preRelease=alpha" }, "dependencies": { + "@plone/components": "workspace:*", "@plone-collective/volto-authomatic": "3.0.0-alpha.6", - "@kitconcept/volto-light-theme": "^8.0.0-alpha.10", + "@kitconcept/volto-light-theme": "^8.0.0-alpha.12", "@mbarde/volto-image-crop-widget": "^0.5.1" }, "peerDependencies": { diff --git a/frontend/packages/kitconcept-core/src/config/slots.ts b/frontend/packages/kitconcept-core/src/config/slots.ts index b9b2f718..38d01779 100644 --- a/frontend/packages/kitconcept-core/src/config/slots.ts +++ b/frontend/packages/kitconcept-core/src/config/slots.ts @@ -1,6 +1,13 @@ import type { ConfigType } from '@plone/registry'; import TTWCustomCSS from '../slots/TTWCustomCSS/TTWCustomCSS'; import ConfigInjector from '../slots/ConfigInjector/ConfigInjector'; +import type { Content } from '@plone/types'; +import CoreFooter from '../slots/Footer/CoreFooter'; + +export function hasInheritedBehavior(behavior: string) { + return ({ content }: { content: Content }) => + Object.keys(content?.['@components']?.inherit || {}).includes(behavior); +} export default function install(config: ConfigType) { config.registerSlotComponent({ @@ -15,5 +22,12 @@ export default function install(config: ConfigType) { component: TTWCustomCSS, }); + config.registerSlotComponent({ + name: 'coreFooter', + slot: 'footer', + component: CoreFooter, + predicates: [hasInheritedBehavior('kitconcept.footer')], + }); + return config; } diff --git a/frontend/packages/kitconcept-core/src/slots/Footer/CoreFooter.tsx b/frontend/packages/kitconcept-core/src/slots/Footer/CoreFooter.tsx new file mode 100644 index 00000000..2e714891 --- /dev/null +++ b/frontend/packages/kitconcept-core/src/slots/Footer/CoreFooter.tsx @@ -0,0 +1,83 @@ +import { Container } from '@plone/components'; +import Logo from '@plone/volto/components/theme/Logo/Logo'; +import { useLiveData } from '@kitconcept/volto-light-theme/helpers/useLiveData'; +import ColumnLinks from '@kitconcept/volto-light-theme/components/Footer/ColumnLinks'; +import type { SiteFooterSettings } from '@kitconcept/volto-light-theme/types'; +import type { Content } from '@plone/types'; + +const CoreFooter = ({ content }: { content: Content }) => { + const footer_address = useLiveData( + content, + 'kitconcept.footer', + 'footer_address', + ); + + const footer_column_left_header = useLiveData< + SiteFooterSettings['footer_column_left_header'] + >(content, 'kitconcept.footer', 'footer_column_left_header'); + const footer_column_left = useLiveData< + SiteFooterSettings['footer_column_left'] + >(content, 'kitconcept.footer', 'footer_column_left'); + + const footer_column_middle_header = useLiveData< + SiteFooterSettings['footer_column_middle_header'] + >(content, 'kitconcept.footer', 'footer_column_middle_header'); + const footer_column_middle = useLiveData< + SiteFooterSettings['footer_column_middle'] + >(content, 'kitconcept.footer', 'footer_column_middle'); + + const footer_column_right_header = useLiveData< + SiteFooterSettings['footer_column_right_header'] + >(content, 'kitconcept.footer', 'footer_column_right_header'); + const footer_column_right = useLiveData< + SiteFooterSettings['footer_column_right'] + >(content, 'kitconcept.footer', 'footer_column_right'); + + return ( + + +
+
+ {/* @ts-ignore the Logo definition is different from the Volto one */} + +

+

+ + {footer_column_left && ( +
+ {footer_column_left_header && ( +

{footer_column_left_header}

+ )} + +
+ )} + + {footer_column_middle && ( +
+ {footer_column_middle_header && ( +

{footer_column_middle_header}

+ )} + +
+ )} + + {footer_column_right && ( +
+ {footer_column_right_header && ( +

{footer_column_right_header}

+ )} + +
+ )} +
+
+
+ ); +}; + +export default CoreFooter; diff --git a/frontend/packages/kitconcept-core/tsconfig.json b/frontend/packages/kitconcept-core/tsconfig.json index 9a150fe1..af82646a 100644 --- a/frontend/packages/kitconcept-core/tsconfig.json +++ b/frontend/packages/kitconcept-core/tsconfig.json @@ -14,6 +14,9 @@ "jsx": "react-jsx", "paths": { "@plone/volto/*": ["../../core/packages/volto/src/*"], + "@kitconcept/volto-light-theme/*": [ + "./node_modules/@kitconcept/volto-light-theme/src/*" + ], "core/*": ["./src/*"] } }, diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 4aaf5e7e..629a499b 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -1607,14 +1607,17 @@ importers: packages/kitconcept-core: dependencies: '@kitconcept/volto-light-theme': - specifier: ^8.0.0-alpha.10 - version: 8.0.0-alpha.10(classnames@2.5.1)(embla-carousel@8.6.0)(lodash@4.17.21)(react-dom@18.2.0(react@18.2.0))(react-intl@3.12.1(@types/react@18.3.27)(react@18.2.0))(react-redux@8.1.2(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(redux@4.2.1))(react-router-dom@5.2.0(react@18.2.0))(react@18.2.0) + specifier: ^8.0.0-alpha.12 + version: 8.0.0-alpha.12(classnames@2.5.1)(embla-carousel@8.6.0)(lodash@4.17.21)(react-dom@18.2.0(react@18.2.0))(react-intl@3.12.1(@types/react@18.3.27)(react@18.2.0))(react-redux@8.1.2(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(redux@4.2.1))(react-router-dom@5.2.0(react@18.2.0))(react@18.2.0) '@mbarde/volto-image-crop-widget': specifier: ^0.5.1 version: 0.5.1(react@18.2.0) '@plone-collective/volto-authomatic': specifier: 3.0.0-alpha.6 - version: 3.0.0-alpha.6(@plone/components@4.0.0-alpha.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@plone/registry@core+packages+registry)(react-dom@18.2.0(react@18.2.0))(react-intl@3.12.1(@types/react@18.3.27)(react@18.2.0))(react@18.2.0)(semantic-ui-react@2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + version: 3.0.0-alpha.6(@plone/components@core+packages+components)(@plone/registry@core+packages+registry)(react-dom@18.2.0(react@18.2.0))(react-intl@3.12.1(@types/react@18.3.27)(react@18.2.0))(react@18.2.0)(semantic-ui-react@2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) + '@plone/components': + specifier: workspace:* + version: link:../../core/packages/components react: specifier: ^18.2.0 version: 18.2.0 @@ -3365,8 +3368,8 @@ packages: react: 18.2.0 react-dom: 18.2.0 - '@kitconcept/volto-light-theme@8.0.0-alpha.10': - resolution: {integrity: sha512-4cU8wRNvuAFwj5RRtTbtBacirO7dYs9JITrNRRc31a/N2UQ2L53A3o9xh2L/1dHN98F6UA4t48GGBFANMjoF/A==} + '@kitconcept/volto-light-theme@8.0.0-alpha.12': + resolution: {integrity: sha512-F6pZ2mb5Vo7uh77m6cp1NY+bfzbjQSaJiOUWqdSIOelgCvrTuhHTge1mJaslcbur5uzhFxcdyHlB63l5Kq9JjA==} peerDependencies: classnames: ^2.5.1 lodash: 4.17.21 @@ -15736,7 +15739,7 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@kitconcept/volto-light-theme@8.0.0-alpha.10(classnames@2.5.1)(embla-carousel@8.6.0)(lodash@4.17.21)(react-dom@18.2.0(react@18.2.0))(react-intl@3.12.1(@types/react@18.3.27)(react@18.2.0))(react-redux@8.1.2(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(redux@4.2.1))(react-router-dom@5.2.0(react@18.2.0))(react@18.2.0)': + '@kitconcept/volto-light-theme@8.0.0-alpha.12(classnames@2.5.1)(embla-carousel@8.6.0)(lodash@4.17.21)(react-dom@18.2.0(react@18.2.0))(react-intl@3.12.1(@types/react@18.3.27)(react@18.2.0))(react-redux@8.1.2(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(redux@4.2.1))(react-router-dom@5.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) @@ -16114,9 +16117,9 @@ snapshots: '@pkgr/core@0.2.9': {} - '@plone-collective/volto-authomatic@3.0.0-alpha.6(@plone/components@4.0.0-alpha.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@plone/registry@core+packages+registry)(react-dom@18.2.0(react@18.2.0))(react-intl@3.12.1(@types/react@18.3.27)(react@18.2.0))(react@18.2.0)(semantic-ui-react@2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': + '@plone-collective/volto-authomatic@3.0.0-alpha.6(@plone/components@core+packages+components)(@plone/registry@core+packages+registry)(react-dom@18.2.0(react@18.2.0))(react-intl@3.12.1(@types/react@18.3.27)(react@18.2.0))(react@18.2.0)(semantic-ui-react@2.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': dependencies: - '@plone/components': 4.0.0-alpha.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@plone/components': link:core/packages/components '@plone/registry': link:core/packages/registry react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -16134,9 +16137,9 @@ snapshots: react-aria-components: 1.14.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-stately: 3.43.0(react@18.2.0) tailwind-merge: 3.4.0 - tailwind-variants: 1.0.0(tailwindcss@4.1.17) - tailwindcss: 4.1.17 - tailwindcss-animate: 1.0.7(tailwindcss@4.1.17) + tailwind-variants: 1.0.0(tailwindcss@4.1.18) + tailwindcss: 4.1.18 + tailwindcss-animate: 1.0.7(tailwindcss@4.1.18) optionalDependencies: react-dom: 18.2.0(react@18.2.0) @@ -27770,10 +27773,19 @@ snapshots: tailwind-merge: 3.0.2 tailwindcss: 4.1.17 + tailwind-variants@1.0.0(tailwindcss@4.1.18): + dependencies: + tailwind-merge: 3.0.2 + tailwindcss: 4.1.18 + tailwindcss-animate@1.0.7(tailwindcss@4.1.17): dependencies: tailwindcss: 4.1.17 + tailwindcss-animate@1.0.7(tailwindcss@4.1.18): + dependencies: + tailwindcss: 4.1.18 + tailwindcss-react-aria-components@2.0.1(tailwindcss@4.1.17): dependencies: tailwindcss: 4.1.17