Merge default dev-dc
authorDamien Correia
Wed, 18 Jul 2018 18:50:14 +0200
branchdev-dc
changeset 103 c1cef6215051
parent 82 29e43fc3a6a0 (current diff)
parent 102 9821ede236b1 (diff)
child 104 a050abf1a69c
Merge default
--- a/src/pyams_default_theme/component/keynumber/portlet/__init__.py	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/component/keynumber/portlet/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -32,7 +32,7 @@
 from pyams_default_theme import _
 
 
-class KeyNumberPortletDefaultRenderer(PortletRenderer):
+class KeyNumberPortletBaseRenderer(PortletRenderer):
     """Key numbers portlet default renderer"""
 
     def get_link_info(cls, link):
@@ -49,7 +49,7 @@
 @adapter_config(context=(IPortalContext, IPyAMSLayer, Interface, IKeyNumberPortletSettings),
                 provides=IPortletRenderer)
 @template_config(template='templates/horizontal-render.pt', layer=IPyAMSLayer)
-class KeyNumberPortletHorizontalRenderer(KeyNumberPortletDefaultRenderer):
+class KeyNumberPortletHorizontalRenderer(KeyNumberPortletBaseRenderer):
     """Key numbers portlet horizontal renderer"""
 
     label = _("Horizontal list with carousel")
@@ -58,7 +58,7 @@
 @adapter_config(name='vertical', context=(IPortalContext, IPyAMSLayer, Interface, IKeyNumberPortletSettings),
                 provides=IPortletRenderer)
 @template_config(template='templates/vertical-render.pt', layer=IPyAMSLayer)
-class KeyNumberPortletVerticalRenderer(KeyNumberPortletDefaultRenderer):
+class KeyNumberPortletVerticalRenderer(KeyNumberPortletBaseRenderer):
     """Key numbers portlet vertical renderer"""
 
     label = _("Vertical list")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/paragraph/interfaces/map.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+from pyams_content.component.paragraph.interfaces.map import have_gis
+if have_gis:
+
+    # import standard library
+
+    # import interfaces
+    from pyams_gis.interfaces.configuration import IMapConfiguration
+
+    # import packages
+    from zope.interface import Attribute
+    from zope.schema import Bool
+
+    from pyams_default_theme import _
+
+
+    class IMapParagraphDefaultRendererSettings(IMapConfiguration):
+        """Map paragraph default renderer settings interface"""
+
+        no_use_default_map_configuration = Bool(title=_("Don't use default configuration?"),
+                                                required=True,
+                                                default=False)
+
+        use_default_map_configuration = Bool(title=_("Use default configuration?"),
+                                             required=True,
+                                             default=True)
+
+        configuration = Attribute("Map configuration")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/paragraph/map.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,99 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+from pyams_content.component.paragraph.interfaces.map import have_gis, IMapParagraph
+if have_gis:
+
+    # import standard library
+
+    # import interfaces
+    from pyams_content.features.renderer.interfaces import IContentRenderer
+    from pyams_default_theme.component.paragraph.interfaces.map import IMapParagraphDefaultRendererSettings
+    from pyams_gis.interfaces.configuration import IMapConfiguration
+    from pyams_gis.interfaces.utility import IMapManager
+    from pyams_skin.layer import IPyAMSLayer
+
+    # import packages
+    from pyams_content.features.renderer.skin import BaseContentRenderer
+    from pyams_gis.configuration import MapConfiguration
+    from pyams_template.template import template_config
+    from pyams_utils.adapter import adapter_config, get_annotation_adapter
+    from pyams_utils.registry import get_utility
+    from zope.interface import implementer
+    from zope.schema.fieldproperty import FieldProperty
+
+    from pyams_default_theme import _
+
+
+    #
+    # Map paragraph default renderer settings
+    #
+
+    MAP_DEFAULT_RENDERER_SETTINGS_KEY = 'pyams_content.map.renderer:default'
+
+
+    @implementer(IMapParagraphDefaultRendererSettings)
+    class MapParagraphDefaultRendererSettings(MapConfiguration):
+        """Map paragraph default renderer settings"""
+
+        _use_default_map_configuration = FieldProperty(IMapParagraphDefaultRendererSettings[
+                                                           'use_default_map_configuration'])
+
+        @property
+        def use_default_map_configuration(self):
+            return self._use_default_map_configuration
+
+        @use_default_map_configuration.setter
+        def use_default_map_configuration(self, value):
+            self._use_default_map_configuration = value
+
+        @property
+        def no_use_default_map_configuration(self):
+            return not bool(self.use_default_map_configuration)
+
+        @no_use_default_map_configuration.setter
+        def no_use_default_map_configuration(self, value):
+            self.use_default_map_configuration = not bool(value)
+
+        @property
+        def configuration(self):
+            if self.use_default_map_configuration:
+                manager = get_utility(IMapManager)
+                return IMapConfiguration(manager)
+            else:
+                return self
+
+
+    @adapter_config(context=IMapParagraph, provides=IMapParagraphDefaultRendererSettings)
+    def map_paragraph_default_renderer_settings_factory(context):
+        """Map paragraph default renderer settings factory"""
+        return get_annotation_adapter(context, MAP_DEFAULT_RENDERER_SETTINGS_KEY,
+                                      MapParagraphDefaultRendererSettings)
+
+
+    #
+    # Map paragraph default renderer
+    #
+
+    @adapter_config(name='default', context=(IMapParagraph, IPyAMSLayer), provides=IContentRenderer)
+    @template_config(template='templates/map-default.pt', layer=IPyAMSLayer)
+    class MapParagraphDefaultRenderer(BaseContentRenderer):
+        """Map paragraph default renderer"""
+
+        label = _("Default map renderer")
+
+        settings_interface = IMapParagraphDefaultRendererSettings
+
+        i18n_context_attrs = ('title', )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/paragraph/zmi/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/component/paragraph/zmi/map.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+from pyams_content.component.paragraph.interfaces.map import have_gis
+if have_gis:
+
+    # import standard library
+
+    # import interfaces
+    from pyams_default_theme.component.paragraph.interfaces.map import IMapParagraphDefaultRendererSettings
+    from pyams_form.interfaces.form import IFormManager
+    from pyams_skin.layer import IPyAMSLayer
+
+    # import packages
+    from pyams_content.features.renderer.zmi import RendererPropertiesEditForm
+    from pyams_form.group import NamedWidgetsGroup
+    from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
+    from pyams_zmi.form import AdminDialogEditForm
+    from z3c.form import field
+    from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget
+
+    from pyams_default_theme import _
+
+
+    @adapter_config(context=(IMapParagraphDefaultRendererSettings, IPyAMSLayer, RendererPropertiesEditForm),
+                    provides=IFormManager)
+    class MapParagraphDefaultRendererSettingsFormManager(ContextRequestViewAdapter):
+        """Map paragraph default renderer settings form manager"""
+
+        def getFields(self):
+            fields = field.Fields(IMapParagraphDefaultRendererSettings).omit('use_default_map_configuration')
+            fields['no_use_default_map_configuration'].widgetFactory = SingleCheckBoxFieldWidget
+            return fields
+
+        def update(self):
+            view = self.view
+            view.dialog_class = 'modal-large'
+            AdminDialogEditForm.update(view)
+
+        def updateWidgets(self, prefix=None):
+            AdminDialogEditForm.updateWidgets(self.view, prefix)
+
+        def updateActions(self):
+            AdminDialogEditForm.updateActions(self.view)
+
+        def updateGroups(self):
+            view = self.view
+            view.add_group(NamedWidgetsGroup(view, 'configuration', view.widgets,
+                                             view.fields.keys(),
+                                             legend=_("Don't use default map configuration"),
+                                             css_class='inner',
+                                             switch=True,
+                                             checkbox_switch=True,
+                                             checkbox_field=IMapParagraphDefaultRendererSettings['no_use_default_map_configuration']))
+            AdminDialogEditForm.updateGroups(view)
--- a/src/pyams_default_theme/features/footer/__init__.py	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/footer/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -16,12 +16,22 @@
 # import standard library
 
 # import interfaces
+from pyams_content.component.association.interfaces import ASSOCIATION_CONTAINER_KEY
 from pyams_content.features.footer.interfaces import IFooterTarget, IFooterSettings
+from pyams_content.features.menu.interfaces import IMenuLinksContainerTarget, IMenuLinksContainer
+from pyams_default_theme.features.footer.interfaces import ISimpleFooterRendererSettings, ISimpleFooterLinksMenu
 from pyams_default_theme.layer import IPyAMSDefaultLayer
+from zope.location.interfaces import ISublocations
 
 # import packages
+from persistent import Persistent
+from pyams_content.features.menu import Menu
+from pyams_utils.adapter import get_annotation_adapter, adapter_config, ContextAdapter
 from pyams_utils.traversing import get_parent
 from pyams_viewlet.viewlet import contentprovider_config, ViewContentProvider
+from zope.interface import implementer
+from zope.location import Location
+from zope.schema.fieldproperty import FieldProperty
 
 
 @contentprovider_config(name='pyams.footer', layer=IPyAMSDefaultLayer)
@@ -29,11 +39,16 @@
     """Footer content provider"""
 
     footer = None
+    renderer = None
 
     def update(self):
         parent = get_parent(self.context, IFooterTarget)
         if parent is not None:
-            self.footer = IFooterSettings(parent, None)
+            footer = self.footer = IFooterSettings(parent, None)
+            if footer is not None:
+                renderer = self.renderer = footer.get_renderer(self.request)
+                if renderer is not None:
+                    renderer.update()
 
     def render(self):
         if self.footer is None:
@@ -42,3 +57,36 @@
         if renderer is None:
             return ''
         return renderer.render()
+
+
+#
+# Simple footer renderer settings
+#
+
+SIMPLE_FOOTER_LINKS_KEY = '{0}::links'.format(ASSOCIATION_CONTAINER_KEY)
+
+
+@implementer(ISimpleFooterRendererSettings, IMenuLinksContainerTarget)
+class SimpleFooterRendererSettings(Persistent, Location):
+    """Simple footer renderer settings"""
+
+    copyright = FieldProperty(ISimpleFooterRendererSettings['copyright'])
+
+    @property
+    def links(self):
+        return get_annotation_adapter(self, SIMPLE_FOOTER_LINKS_KEY, Menu,
+                                      markers=ISimpleFooterLinksMenu, name='++ass++links')
+
+
+@adapter_config(name='links', context=ISimpleFooterRendererSettings, provides=IMenuLinksContainer)
+def simple_footer_links_adapter(context):
+    """Simple footer links adapter"""
+    return context.links
+
+
+@adapter_config(name='links', context=ISimpleFooterRendererSettings, provides=ISublocations)
+class SimpleFooterRendererSettingsSublocations(ContextAdapter):
+    """Simple footer renderer settings sub-locations adapter"""
+
+    def sublocations(self):
+        return self.context.links.values()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/features/footer/interfaces.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.features.footer.interfaces import IFooterRendererSettings
+
+# import packages
+from zope.interface import Interface, Attribute
+from zope.schema import TextLine
+
+from pyams_default_theme import _
+
+
+class ISimpleFooterRendererSettings(IFooterRendererSettings):
+    """Simple footer renderer settings"""
+
+    copyright = TextLine(title=_("Copyright"),
+                         description=_("Copyright mention displayed in page footer"),
+                         required=False)
+
+    links = Attribute("Footer links")
+
+
+class ISimpleFooterLinksMenu(Interface):
+    """Simple footer links marker interface"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/features/footer/skin/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.component.association.interfaces import IAssociationInfo
+from pyams_content.features.footer.interfaces import IFooterTarget, IFooterRenderer, IFooterSettings, \
+    IFooterRendererSettings
+from pyams_default_theme.features.footer.interfaces import ISimpleFooterRendererSettings
+from pyams_skin.layer import IPyAMSLayer
+
+# import packages
+from pyams_content.features.footer.skin import BaseFooterRenderer
+from pyams_default_theme.features.footer import SimpleFooterRendererSettings
+from pyams_template.template import template_config
+from pyams_utils.adapter import adapter_config
+
+from pyams_default_theme import _
+
+
+SIMPLE_FOOTER_RENDERER_NAME = 'PyAMS simple header'
+
+
+#
+# Simple footer renderer
+#
+
+@adapter_config(name=SIMPLE_FOOTER_RENDERER_NAME, context=(IFooterTarget, IPyAMSLayer),
+                provides=IFooterRenderer)
+@adapter_config(name=SIMPLE_FOOTER_RENDERER_NAME, context=(IFooterSettings, IPyAMSLayer),
+                provides=IFooterRenderer)
+@template_config(template='templates/simple-footer.pt', layer=IPyAMSLayer)
+class SimpleFooterRenderer(BaseFooterRenderer):
+    """Simple footer renderer"""
+
+    name = SIMPLE_FOOTER_RENDERER_NAME
+    label = _("PyAMS simple footer with links")
+    weight = 1
+
+    settings_key = 'PyAMS::simple'
+    settings_interface = ISimpleFooterRendererSettings
+
+    @staticmethod
+    def get_link_info(link):
+        return IAssociationInfo(link)
+
+
+@adapter_config(context=SimpleFooterRenderer, provides=IFooterRendererSettings)
+def simple_footer_renderer_settings_factory(context):
+    """Simple footer renderer settings factory"""
+    return SimpleFooterRendererSettings()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/features/footer/skin/templates/simple-footer.pt	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,15 @@
+<div class="footer footer-simple"
+	 tal:define="settings view.settings" i18n:domain="pyams_default_theme">
+	<ul class="nav nav-tabs" role="tablist">
+		<tal:loop repeat="link settings.links.get_visible_items(request)">
+			<li role="presentation">
+				<a tal:define="info view.get_link_info(link);
+							   href link.get_url(request);"
+				   tal:condition="href"
+				   tal:attributes="href href">${info.user_title}</a>
+			</li>
+		</tal:loop>
+		<li role="presentation"
+			tal:condition="settings.copyright">${settings.copyright}</li>
+	</ul>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/features/footer/zmi/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_default_theme.features.footer.interfaces import ISimpleFooterRendererSettings, ISimpleFooterLinksMenu
+from pyams_form.interfaces.form import IInnerSubForm
+from pyams_portal.interfaces import MANAGE_TEMPLATE_PERMISSION
+from pyams_skin.layer import IPyAMSLayer
+
+# import packages
+from pyams_content.features.footer.zmi import FooterSettingsRendererSettingsEditForm
+from pyams_content.features.menu.zmi import LinksTable, IMenuLinksView, MenuLinksView
+from pyams_utils.adapter import adapter_config
+from pyams_zmi.form import InnerAdminEditForm
+from z3c.form import field
+
+from pyams_default_theme import _
+
+
+@adapter_config(name='simple-footer-properties',
+                context=(ISimpleFooterRendererSettings, IPyAMSLayer, FooterSettingsRendererSettingsEditForm),
+                provides=IInnerSubForm)
+class SimpleFooterPropertiesEditForm(InnerAdminEditForm):
+    """Simple footer properties edit form"""
+
+    legend = None
+    edit_permission = MANAGE_TEMPLATE_PERMISSION
+    weight = 1
+
+    fields = field.Fields(ISimpleFooterRendererSettings)
+
+
+#
+# Footer links table view
+#
+
+class LinksAssociationsTable(LinksTable):
+    """Simple footer links associations table"""
+
+    associations_name = 'links'
+
+
+@adapter_config(name='simple-footer-links',
+                context=(ISimpleFooterRendererSettings, IPyAMSLayer, FooterSettingsRendererSettingsEditForm),
+                provides=IInnerSubForm)
+@adapter_config(name='++ass++links', context=(ISimpleFooterLinksMenu, IPyAMSLayer), provides=IMenuLinksView)
+class SimpleFooterTabsView(MenuLinksView):
+    """Simple footer links view"""
+
+    title = _("Footer links")
+
+    table_class = LinksAssociationsTable
+    weight = 10
--- a/src/pyams_default_theme/features/header/__init__.py	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/header/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -31,7 +31,7 @@
 from pyams_utils.traversing import get_parent
 from pyams_viewlet.viewlet import contentprovider_config, ViewContentProvider
 from zope.interface import implementer
-from zope.location import Location, locate
+from zope.location import Location
 
 
 @contentprovider_config(name='pyams.header', layer=IPyAMSDefaultLayer)
--- a/src/pyams_default_theme/features/header/skin/__init__.py	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/header/skin/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -40,8 +40,10 @@
 # Simple header renderer
 #
 
-@adapter_config(name=SIMPLE_HEADER_RENDERER_NAME, context=(IHeaderTarget, IPyAMSLayer), provides=IHeaderRenderer)
-@adapter_config(name=SIMPLE_HEADER_RENDERER_NAME, context=(IHeaderSettings, IPyAMSLayer), provides=IHeaderRenderer)
+@adapter_config(name=SIMPLE_HEADER_RENDERER_NAME, context=(IHeaderTarget, IPyAMSLayer),
+                provides=IHeaderRenderer)
+@adapter_config(name=SIMPLE_HEADER_RENDERER_NAME, context=(IHeaderSettings, IPyAMSLayer),
+                provides=IHeaderRenderer)
 @template_config(template='templates/simple-header.pt', layer=IPyAMSLayer)
 class SimpleHeaderRenderer(BaseHeaderRenderer):
     """Simple header renderer"""
--- a/src/pyams_default_theme/features/header/skin/templates/simple-header.pt	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/header/skin/templates/simple-header.pt	Wed Jul 18 18:50:14 2018 +0200
@@ -1,8 +1,8 @@
 <div class="header header-simple"
 	 tal:define="settings view.settings" i18n:domain="pyams_default_theme">
 	<tal:var replace="structure provider:pyams.banner" />
-	<ul class="nav nav-tabs" role="tablist">
-		<tal:loop repeat="link settings.tabs.get_visible_items()">
+	<ul class="nav nav-pills margin-bottom-20" role="tablist">
+		<tal:loop repeat="link settings.tabs.get_visible_items(request)">
 			<li role="presentation"
 				tal:attributes="class 'active' if view.is_active(link) else ''">
 				<a tal:define="info view.get_link_info(link);
--- a/src/pyams_default_theme/features/menu/__init__.py	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/features/menu/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -16,5 +16,23 @@
 # import standard library
 
 # import interfaces
+from pyams_content.component.illustration import IBasicIllustration
+from pyams_content.component.links.interfaces import IBaseLink, IInternalLink
+from pyams_default_theme.interfaces import IContentNavigationIllustration
+from pyams_skin.layer import IPyAMSLayer
 
 # import packages
+from pyams_utils.adapter import adapter_config
+
+
+@adapter_config(context=(IBaseLink, IPyAMSLayer), provides=IContentNavigationIllustration)
+def base_link_navigation_illustration_adapter(context, request):
+    """Base link navigation illustration adapter"""
+    illustration = IBasicIllustration(context, None)
+    if not (illustration and illustration.has_data()):
+        if IInternalLink.providedBy(context):
+            target = context.get_target()
+            if target is not None:
+                illustration = request.registry.queryMultiAdapter((target, request),
+                                                                  IContentNavigationIllustration)
+    return illustration
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/interfaces/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+
+# import packages
+from zope.interface import Interface
+
+
+class IContentNavigationTitle(Interface):
+    """Content navigation title"""
+
+
+class IContentTag(Interface):
+    """Content tag interface"""
+
+
+class IContentDate(Interface):
+    """Content date interface"""
+
+
+class IContentNavigationIllustration(Interface):
+    """Content navigation illustration"""
Binary file src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.mo has changed
--- a/src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.po	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/locales/fr/LC_MESSAGES/pyams_default_theme.po	Wed Jul 18 18:50:14 2018 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-07-03 09:32+0200\n"
+"POT-Creation-Date: 2018-07-18 14:48+0200\n"
 "PO-Revision-Date: 2017-06-07 12:41+0200\n"
 "Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
 "Language-Team: French\n"
@@ -24,11 +24,11 @@
 msgid "Default gallery renderer"
 msgstr "Par défaut"
 
-#: src/pyams_default_theme/component/keynumber/portlet/__init__.py:37
+#: src/pyams_default_theme/component/keynumber/portlet/__init__.py:55
 msgid "Horizontal list with carousel"
 msgstr "Liste horizontale (par défaut)"
 
-#: src/pyams_default_theme/component/keynumber/portlet/__init__.py:46
+#: src/pyams_default_theme/component/keynumber/portlet/__init__.py:64
 msgid "Vertical list"
 msgstr "Liste verticale"
 
@@ -58,6 +58,10 @@
 msgid "Default key points renderer"
 msgstr "Par défaut"
 
+#: src/pyams_default_theme/component/paragraph/map.py:95
+msgid "Default map renderer"
+msgstr "Par défaut"
+
 #: src/pyams_default_theme/component/paragraph/video.py:40
 #: src/pyams_default_theme/component/video/__init__.py:41
 msgid "Default video renderer"
@@ -97,6 +101,18 @@
 msgid "Default header renderer"
 msgstr "Par défaut"
 
+#: src/pyams_default_theme/component/paragraph/zmi/map.py:62
+msgid "Don't use default map configuration"
+msgstr "Ne pas utiliser la configuration de carte par défaut"
+
+#: src/pyams_default_theme/component/paragraph/interfaces/map.py:34
+msgid "Don't use default configuration?"
+msgstr "Ne pas utiliser la configuration par défaut ?"
+
+#: src/pyams_default_theme/component/paragraph/interfaces/map.py:38
+msgid "Use default configuration?"
+msgstr "Utiliser la configuration par défaut ?"
+
 #: src/pyams_default_theme/component/paragraph/interfaces/frame.py:29
 #: src/pyams_default_theme/component/paragraph/interfaces/verbatim.py:29
 #: src/pyams_default_theme/component/paragraph/interfaces/contact.py:29
@@ -200,9 +216,9 @@
 "ATTENTION : la sélection des éléments affichés dans cet aperçu ne tient pas "
 "compte du contexte éventuellement paramétré dans la vue"
 
-#: src/pyams_default_theme/shared/view/portlet/__init__.py:37
-msgid "Simple list view"
-msgstr "Liste simple"
+#: src/pyams_default_theme/shared/view/portlet/__init__.py:38
+msgid "Simple vertical view"
+msgstr "Liste verticale simple"
 
 #: src/pyams_default_theme/shared/imagemap/__init__.py:58
 msgid "Default imagemap renderer"
@@ -216,6 +232,10 @@
 msgid "Default logos renderer"
 msgstr "Par défaut"
 
+#: src/pyams_default_theme/viewlet/logo/templates/logo.pt:5
+msgid "Back home"
+msgstr "Revenir à l'accueil"
+
 #: src/pyams_default_theme/features/menu/portlet/navigation/__init__.py:49
 msgid "Horizontal list with vertical illustrations"
 msgstr "Liste horizontale avec illustrations verticales (par défaut)"
@@ -248,6 +268,22 @@
 msgid "Label associated with second level options menu"
 msgstr "Libellé associé au second niveau de sélection"
 
+#: src/pyams_default_theme/features/footer/interfaces.py:31
+msgid "Copyright"
+msgstr "Copyright"
+
+#: src/pyams_default_theme/features/footer/interfaces.py:32
+msgid "Copyright mention displayed in page footer"
+msgstr "Mention affichée dans le pied de page"
+
+#: src/pyams_default_theme/features/footer/zmi/__init__.py:64
+msgid "Footer links"
+msgstr "Liens du pied de page"
+
+#: src/pyams_default_theme/features/footer/skin/__init__.py:50
+msgid "PyAMS simple footer with links"
+msgstr "PyAMS: pied de page simple avec liens"
+
 #: src/pyams_default_theme/features/header/interfaces.py:31
 msgid "Banner image"
 msgstr "Bandeau"
@@ -268,7 +304,7 @@
 msgid "Top tabs"
 msgstr "Onglets de navigation"
 
-#: src/pyams_default_theme/features/header/skin/__init__.py:48
+#: src/pyams_default_theme/features/header/skin/__init__.py:52
 msgid "PyAMS simple header with banner and tabs"
 msgstr "PyAMS: en-tête simple avec bandeau et onglets de navigation"
 
--- a/src/pyams_default_theme/locales/pyams_default_theme.pot	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/locales/pyams_default_theme.pot	Wed Jul 18 18:50:14 2018 +0200
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2018-07-03 09:32+0200\n"
+"POT-Creation-Date: 2018-07-18 14:48+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -24,11 +24,11 @@
 msgid "Default gallery renderer"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:37
+#: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:55
 msgid "Horizontal list with carousel"
 msgstr ""
 
-#: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:46
+#: ./src/pyams_default_theme/component/keynumber/portlet/__init__.py:64
 msgid "Vertical list"
 msgstr ""
 
@@ -56,6 +56,10 @@
 msgid "Default key points renderer"
 msgstr ""
 
+#: ./src/pyams_default_theme/component/paragraph/map.py:95
+msgid "Default map renderer"
+msgstr ""
+
 #: ./src/pyams_default_theme/component/paragraph/video.py:40
 #: ./src/pyams_default_theme/component/video/__init__.py:41
 msgid "Default video renderer"
@@ -95,6 +99,18 @@
 msgid "Default header renderer"
 msgstr ""
 
+#: ./src/pyams_default_theme/component/paragraph/zmi/map.py:62
+msgid "Don't use default map configuration"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/paragraph/interfaces/map.py:34
+msgid "Don't use default configuration?"
+msgstr ""
+
+#: ./src/pyams_default_theme/component/paragraph/interfaces/map.py:38
+msgid "Use default configuration?"
+msgstr ""
+
 #: ./src/pyams_default_theme/component/paragraph/interfaces/frame.py:29
 #: ./src/pyams_default_theme/component/paragraph/interfaces/verbatim.py:29
 #: ./src/pyams_default_theme/component/paragraph/interfaces/contact.py:29
@@ -183,8 +199,8 @@
 msgid "WARNING: items displayed in this preview are out of context!!"
 msgstr ""
 
-#: ./src/pyams_default_theme/shared/view/portlet/__init__.py:37
-msgid "Simple list view"
+#: ./src/pyams_default_theme/shared/view/portlet/__init__.py:38
+msgid "Simple vertical view"
 msgstr ""
 
 #: ./src/pyams_default_theme/shared/imagemap/__init__.py:58
@@ -199,6 +215,10 @@
 msgid "Default logos renderer"
 msgstr ""
 
+#: ./src/pyams_default_theme/viewlet/logo/templates/logo.pt:5
+msgid "Back home"
+msgstr ""
+
 #: ./src/pyams_default_theme/features/menu/portlet/navigation/__init__.py:49
 msgid "Horizontal list with vertical illustrations"
 msgstr ""
@@ -231,6 +251,22 @@
 msgid "Label associated with second level options menu"
 msgstr ""
 
+#: ./src/pyams_default_theme/features/footer/interfaces.py:31
+msgid "Copyright"
+msgstr ""
+
+#: ./src/pyams_default_theme/features/footer/interfaces.py:32
+msgid "Copyright mention displayed in page footer"
+msgstr ""
+
+#: ./src/pyams_default_theme/features/footer/zmi/__init__.py:64
+msgid "Footer links"
+msgstr ""
+
+#: ./src/pyams_default_theme/features/footer/skin/__init__.py:50
+msgid "PyAMS simple footer with links"
+msgstr ""
+
 #: ./src/pyams_default_theme/features/header/interfaces.py:31
 msgid "Banner image"
 msgstr ""
@@ -251,6 +287,6 @@
 msgid "Top tabs"
 msgstr ""
 
-#: ./src/pyams_default_theme/features/header/skin/__init__.py:48
+#: ./src/pyams_default_theme/features/header/skin/__init__.py:52
 msgid "PyAMS simple header with banner and tabs"
 msgstr ""
--- a/src/pyams_default_theme/resources/css/pyams-default.css	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/resources/css/pyams-default.css	Wed Jul 18 18:50:14 2018 +0200
@@ -1,13 +1,14 @@
 body {
-  max-width: 950px;
   margin: 0 auto;
 }
 body .header-simple .regularbanner {
   position: relative;
 }
+body .header-simple .regularbanner picture.regularbanner__media,
 body .header-simple .regularbanner img.regularbanner__media {
   width: 100%;
 }
+body .header-simple .regularbanner picture.logo,
 body .header-simple .regularbanner img.logo {
   position: absolute;
   top: 10px;
@@ -34,4 +35,10 @@
     display: none;
   }
 }
+.margin-bottom-10 {
+  margin-bottom: 10px;
+}
+.margin-bottom-20 {
+  margin-bottom: 20px;
+}
 /*# sourceMappingURL=pyams-default.css.map */
\ No newline at end of file
--- a/src/pyams_default_theme/resources/css/pyams-default.css.map	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/resources/css/pyams-default.css.map	Wed Jul 18 18:50:14 2018 +0200
@@ -1,1 +1,1 @@
-{"version":3,"sources":["../../../../../../../../../home/tflorac/Dropbox/src/PyAMS/pyams_default_theme/src/pyams_default_theme/resources/less/pyams-default.less"],"names":[],"mappings":"AAAA;EACC,gBAAA;EACA,cAAA;;AAFD,IAIC,eACC;EACC,kBAAA;;AAGC,IALH,eACC,eAGC,IACE;EACA,WAAA;;AAED,IARH,eACC,eAGC,IAIE;EACA,kBAAA;EACA,SAAA;EACA,UAAA;EACA,YAAY,SAAZ;;AAUH,wBAA2C;EAC1C,YAFF,MAEG;IACA,aAAA;;;AAGF,wBAA0C,uBAAwB;EACjE,YAPF,MAOG;IACA,aAAA;;;AAGF,wBAA0C,uBAAuB;EAChE,YAZF,MAYG;IACA,aAAA;;;AAGF,wBAA0C;EACzC,YAjBF,MAiBG;IACA,aAAA","file":"pyams-default.css"}
\ No newline at end of file
+{"version":3,"sources":["../less/pyams-default.less"],"names":[],"mappings":"AAAA;EACC,cAAA;;AADD,IAGC,eACC;EACC,kBAAA;;AAIC,IANH,eACC,eAGC,QAEE;AAAD,IANH,eACC,eAIC,IACE;EACA,WAAA;;AAED,IATH,eACC,eAGC,QAKE;AAAD,IATH,eACC,eAIC,IAIE;EACA,kBAAA;EACA,SAAA;EACA,UAAA;EACA,YAAY,SAAZ;;AAUH,wBAA2C;EAC1C,YAFF,MAEG;IACA,aAAA;;;AAGF,wBAA0C,uBAAwB;EACjE,YAPF,MAOG;IACA,aAAA;;;AAGF,wBAA0C,uBAAuB;EAChE,YAZF,MAYG;IACA,aAAA;;;AAGF,wBAA0C;EACzC,YAjBF,MAiBG;IACA,aAAA;;;AAQH,cAAC;EACA,mBAAA;;AAED,cAAC;EACA,mBAAA","file":"pyams-default.css"}
\ No newline at end of file
--- a/src/pyams_default_theme/resources/css/pyams-default.min.css	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/resources/css/pyams-default.min.css	Wed Jul 18 18:50:14 2018 +0200
@@ -1,1 +1,1 @@
-body{max-width:950px;margin:0 auto}body .header-simple .regularbanner{position:relative}body .header-simple .regularbanner img.regularbanner__media{width:100%}body .header-simple .regularbanner img.logo{position:absolute;top:10px;left:10px;max-height:calc(80%)}@media only screen and (min-width:1200px){.portal-page .slot.col-lg-0{display:none}}@media only screen and (min-width:992px) and (max-width:1199px){.portal-page .slot.col-md-0{display:none}}@media only screen and (min-width:768px) and (max-width:991px){.portal-page .slot.col-sm-0{display:none}}@media only screen and (max-width:767px){.portal-page .slot.col-xs-0{display:none}}
+body{margin:0 auto}body .header-simple .regularbanner{position:relative}body .header-simple .regularbanner img.regularbanner__media,body .header-simple .regularbanner picture.regularbanner__media{width:100%}body .header-simple .regularbanner img.logo,body .header-simple .regularbanner picture.logo{position:absolute;top:10px;left:10px;max-height:calc(80%)}@media only screen and (min-width:1200px){.portal-page .slot.col-lg-0{display:none}}@media only screen and (min-width:992px) and (max-width:1199px){.portal-page .slot.col-md-0{display:none}}@media only screen and (min-width:768px) and (max-width:991px){.portal-page .slot.col-sm-0{display:none}}@media only screen and (max-width:767px){.portal-page .slot.col-xs-0{display:none}}.margin-bottom-10{margin-bottom:10px}.margin-bottom-20{margin-bottom:20px}
--- a/src/pyams_default_theme/resources/less/pyams-default.less	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/resources/less/pyams-default.less	Wed Jul 18 18:50:14 2018 +0200
@@ -1,11 +1,11 @@
 body {
-	max-width: 950px;
 	margin: 0 auto;
 
 	.header-simple {
 		.regularbanner {
 			position: relative;
 
+			picture,
 			img {
 				&.regularbanner__media {
 					width: 100%;
@@ -46,3 +46,13 @@
 		}
 	}
 }
+
+
+.margin-bottom {
+	&-10 {
+		margin-bottom: 10px;
+	}
+	&-20 {
+		margin-bottom: 20px;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_default_theme/shared/common/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -0,0 +1,112 @@
+#
+# Copyright (c) 2008-2018 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+
+# import interfaces
+from pyams_content.component.illustration import ILinkIllustration, IIllustration
+from pyams_content.interfaces import IBaseContent
+from pyams_content.shared.common.interfaces import IWfSharedContent
+from pyams_default_theme.interfaces import IContentNavigationTitle, IContentTag, IContentDate, \
+    IContentNavigationIllustration
+from pyams_i18n.interfaces import II18n
+from pyams_skin.layer import IPyAMSLayer
+from pyams_utils.interfaces.tales import ITALESExtension
+from pyams_workflow.interfaces import IWorkflowPublicationInfo
+
+# import packages
+from pyams_utils.adapter import adapter_config, ContextRequestViewAdapter
+from pyams_utils.date import format_date, SH_DATE_FORMAT
+from zope.interface import Interface
+
+
+@adapter_config(context=(IBaseContent, IPyAMSLayer), provides=IContentNavigationTitle)
+def shared_content_navigation_title(context, request):
+    """Default content navigation title adapter"""
+    return II18n(context).query_attribute('title', request=request)
+
+
+@adapter_config(name='pyams_title',
+                context=(Interface, Interface, Interface),
+                provides=ITALESExtension)
+class PyAMSContentTitleTALESExtension(ContextRequestViewAdapter):
+    """PyAMS content title TALES extension"""
+
+    def render(self, context=None):
+        if context is None:
+            context = self.context
+        return self.request.registry.queryMultiAdapter((context, self.request), IContentNavigationTitle)
+
+
+@adapter_config(context=(IWfSharedContent, IPyAMSLayer), provides=IContentTag)
+def shared_content_tag_adapter(context, request):
+    """Default shared content tag adapter"""
+    translate = request.localizer.translate
+    return translate(context.content_name)
+
+
+@adapter_config(name='pyams_tag',
+                context=(Interface, Interface, Interface),
+                provides=ITALESExtension)
+class PyAMSContentTagTALESExtension(ContextRequestViewAdapter):
+    """PyAMS content tag TALES extension"""
+
+    def render(self, context=None):
+        if context is None:
+            context = self.context
+        return self.request.registry.queryMultiAdapter((context, self.request), IContentTag)
+
+
+@adapter_config(context=(IWfSharedContent, IPyAMSLayer), provides=IContentDate)
+def shared_content_date_adapter(context, request):
+    """Default shared content date adapter"""
+    publication_info = IWorkflowPublicationInfo(context, None)
+    if publication_info is not None:
+        return format_date(publication_info.visible_publication_date,
+                           format=SH_DATE_FORMAT, request=request)
+
+
+@adapter_config(name='pyams_date',
+                context=(Interface, Interface, Interface),
+                provides=ITALESExtension)
+class PyAMSContentDateTALESExtension(ContextRequestViewAdapter):
+    """PyAMS content date TALES extension"""
+
+    def render(self, context=None):
+        if context is None:
+            context = self.context
+        return self.request.registry.queryMultiAdapter((context, self.request), IContentDate)
+
+
+@adapter_config(context=(IBaseContent, IPyAMSLayer), provides=IContentNavigationIllustration)
+def base_content_navigation_illustration_adapter(context, request):
+    """Default content navigation illustration adapter"""
+    illustration = ILinkIllustration(context, None)
+    if not (illustration and illustration.has_data()):
+        illustration = IIllustration(context, None)
+    if illustration and illustration.has_data():
+        return illustration
+
+
+@adapter_config(name='pyams_illustration',
+                context=(Interface, Interface, Interface),
+                provides=ITALESExtension)
+class PyAMSContentIllustrationTALESExtension(ContextRequestViewAdapter):
+    """PyAMS content illustration TALES extension"""
+
+    def render(self, context=None):
+        if context is None:
+            context = self.context
+        return self.request.registry.queryMultiAdapter((context, self.request), IContentNavigationIllustration)
--- a/src/pyams_default_theme/shared/view/portlet/__init__.py	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/shared/view/portlet/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -29,9 +29,10 @@
 from pyams_default_theme import _
 
 
-@adapter_config(context=(IPortalContext, IPyAMSLayer, Interface, IViewItemsPortletSettings), provides=IPortletRenderer)
+@adapter_config(context=(IPortalContext, IPyAMSLayer, Interface, IViewItemsPortletSettings),
+                provides=IPortletRenderer)
 @template_config(template='templates/view-items-list.pt', layer=IPyAMSLayer)
-class ViewItemsPortletRenderer(PortletRenderer):
+class ViewItemsPortletVerticalRenderer(PortletRenderer):
     """View items portlet renderer"""
 
-    label = _("Simple list view")
+    label = _("Simple vertical view")
--- a/src/pyams_default_theme/templates/layout.pt	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/templates/layout.pt	Wed Jul 18 18:50:14 2018 +0200
@@ -26,7 +26,6 @@
 
 		<!-- Page header -->
 		<tal:var content="structure provider:pyams.header">Header</tal:var>
-		<tal:var content="structure provider:pyams.banner">Banner</tal:var>
 		<!-- End page header -->
 
 		<!-- Main panel -->
--- a/src/pyams_default_theme/viewlet/banner/__init__.py	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/viewlet/banner/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -35,4 +35,7 @@
     @property
     def settings(self):
         target = get_parent(self.context, IHeaderTarget)
-        return ISimpleHeaderRendererSettings(IHeaderSettings(target).settings, None)
+        settings = IHeaderSettings(target)
+        while settings.inherit:
+            settings = IHeaderSettings(settings.parent)
+        return ISimpleHeaderRendererSettings(settings.settings, None)
--- a/src/pyams_default_theme/viewlet/logo/__init__.py	Tue Jul 10 12:20:13 2018 +0200
+++ b/src/pyams_default_theme/viewlet/logo/__init__.py	Wed Jul 18 18:50:14 2018 +0200
@@ -12,6 +12,7 @@
 
 __docformat__ = 'restructuredtext'
 
+
 # import standard library
 
 # import interfaces
@@ -34,4 +35,7 @@
     @property
     def settings(self):
         target = get_parent(self.context, IHeaderTarget)
-        return ISimpleHeaderRendererSettings(IHeaderSettings(target).settings, None)
+        settings = IHeaderSettings(target)
+        while settings.inherit:
+            settings = IHeaderSettings(settings.parent)
+        return ISimpleHeaderRendererSettings(settings.settings, None)