{#
framework/cp_module_layout.html.twig
══════════════════════════════════════════════════════════════════════════════
Generic cp-shell MODULE layout (sidebar + topbar + content). One shell for every
module — a module extends this, sets its identity vars, and fills the blocks.
A module layout (e.g. @Purchase/layouts/purchase_layout.html.twig) does:
{% extends '@Application/framework/cp_module_layout.html.twig' %}
{% set module_brand = 'Purchasing' %}
{% set module_context = 'Procure to Pay' %}
{% set module_icon = 'shopping_cart' %}
{% set module_accent = '#2e7d68' %} (one hex re-accents the whole module)
{% set module_accent_hover = '#25624f' %}
{% set module_accent_dim = 'rgba(46,125,104,.10)' %}
(block) sidebar_nav …module nav links… (endblock)
…and each PAGE extends the module layout and fills the body block.
Blocks: eyebrow · page_heading · topbar_actions · sidebar_nav · sidebar_footer · body · page_scripts
NOTE: codecovers_header loads the JS bundles, so proposal.js / approval / selectize
all keep working inside this shell. This layout is PRESENTATION only.
══════════════════════════════════════════════════════════════════════════════
#}
{% include '@Application/codecovers_header.html.twig' %}
{% include '@Application/framework/_cp_tokens.html.twig' %}
{% include '@Application/framework/_cp_shell_css.html.twig' %}
<div class="cp-app cp-scope">
{% include '@Application/framework/_cp_topstrip.html.twig' %}
<div class="cp-shell cp-scope"
style="--cp-accent:{{ module_accent|default('#1f5673') }};--cp-accent-hover:{{ module_accent_hover|default('#16465f') }};--cp-accent-dim:{{ module_accent_dim|default('rgba(31,86,115,.10)') }};">
{# ── Global module rail ── #}
{% include '@Application/framework/_cp_global_rail.html.twig' %}
{# ── Module sub-nav ── #}
<aside class="cp-sidebar">
<div class="cp-sidebar-brand">
<div class="cp-brand-icon"><i class="material-icons">{{ module_icon|default('widgets') }}</i></div>
<div class="cp-brand-name">{{ module_brand|default('Module') }}</div>
{% if module_context is defined and module_context %}<div class="cp-brand-context">{{ module_context }}</div>{% endif %}
</div>
<nav class="cp-sidebar-nav">{% block sidebar_nav %}{% endblock %}</nav>
<div class="cp-sidebar-footer">
{% block sidebar_footer %}
<a href="{{ path('dashboard') }}" class="cp-nav-link" style="font-size:12px;">
<span class="cp-nav-icon"><i class="material-icons" style="font-size:14px">arrow_back</i></span> <span>Back to ERP</span>
</a>
{% endblock %}
</div>
</aside>
{# ── Main column ── #}
<div class="cp-main">
<header class="cp-topbar">
<div>
<div class="cp-eyebrow">{% block eyebrow %}{{ module_brand|default('') }}{% endblock %}</div>
<h1 class="cp-title">{% block page_heading %}{{ page_title|default('') }}{% endblock %}</h1>
</div>
<div class="cp-topbar-actions">{% block topbar_actions %}{% endblock %}</div>
</header>
<main class="cp-content">
{% include '@Application/inc/notification/error_notification.html.twig' %}
{% include '@Application/inc/notification/success_notification.html.twig' %}
{% block body %}{% endblock %}
</main>
</div>
</div>{# /.cp-shell #}
</div>{# /.cp-app #}
{% include '@Application/footer/footer_js_codecovers.html.twig' %}
{% include '@Application/codecovers_footer.html.twig' %}
{% block page_scripts %}{% endblock %}