<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="keywords" content="bethesda liveedu gestion scolaire">
<meta name="description" content="Institut secondaire bilingue Bethesda — plateforme de gestion scolaire LiveEdu">
<meta name="author" content="Arsene Fokam Poka, Ing">
<title>{% block title 'LiveEdu — Bethesda' %}</title>
{% block stylesheets %}
<link rel="icon" type="image/png" href="{{ asset('assets/images/BethesdaLogo.png') }}"/>
<link rel="apple-touch-icon" href="{{ asset('assets/images/BethesdaLogo.png') }}">
{# ── Polices ── #}
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700;900&family=DM+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
{# ── Librairies CSS ── #}
<link href="{{ asset('assets/css/bootstrap.min.css') }}" rel="stylesheet">
<link href="{{ asset('assets/css/bootstrap-grid.min.css') }}" rel="stylesheet">
<link href="{{ asset('assets/css/font-awesome.min.css') }}" rel="stylesheet">
{# ── CSS applicatif ── #}
<link href="{{ asset('assets/css/style.css') }}" rel="stylesheet">
<link href="{{ asset('assets/css/custom.css') }}" rel="stylesheet">
<link href="{{ asset('assets/css/navbar-fix.css') }}" rel="stylesheet">
{# ══════════════════════════════════════════════════════
DESIGN SYSTEM GLOBAL — LiveEdu
Tous les tokens, utilitaires et composants partagés
sont définis ici. Les layouts enfants n'ont plus à
redéfinir couleurs, typographie ou espacements.
══════════════════════════════════════════════════════ #}
<style>
/* ── Tokens ───────────────────────────────────────────── */
:root {
/* Couleurs */
--c-ink: #0f1923;
--c-ink-soft: #1e2f3f;
--c-gold: #c9972b;
--c-gold-lt: #f0c060;
--c-cream: #faf7f2;
--c-white: #ffffff;
--c-slate: #344054;
--c-muted: #6b7a90;
--c-border: rgba(0,0,0,.08);
--c-border-dk:rgba(255,255,255,.1);
--c-success: #22c55e;
--c-warning: #f59e0b;
--c-danger: #ef4444;
--c-info: #3b82f6;
/* Typographie */
--f-display: 'Playfair Display', Georgia, serif;
--f-body: 'DM Sans', system-ui, sans-serif;
/* Rayons & ombres */
--r-sm: 8px;
--r-md: 14px;
--r-lg: 20px;
--r-xl: 28px;
--shadow-sm: 0 2px 8px rgba(0,0,0,.06);
--shadow-md: 0 8px 24px rgba(0,0,0,.09);
--shadow-lg: 0 16px 48px rgba(0,0,0,.12);
/* Espacements de section */
--gap-section: 80px;
--gap-content: 6vw;
}
/* ── Reset minimal ────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
body {
font-family: var(--f-body);
background: var(--c-cream);
color: var(--c-ink);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
img { max-width: 100%; display: block; }
a { transition: color .18s, opacity .18s; }
/* ── Typographie ──────────────────────────────────────── */
.t-display {
font-family: var(--f-display);
font-weight: 700;
line-height: 1.1;
letter-spacing: -.02em;
}
.t-eyebrow {
font-size: .68rem; font-weight: 700;
letter-spacing: .18em; text-transform: uppercase;
color: var(--c-gold);
display: inline-flex; align-items: center; gap: 10px;
}
.t-eyebrow::before {
content: ''; display: block;
width: 28px; height: 1px; background: currentColor;
}
.t-muted { color: var(--c-muted); }
.t-gold { color: var(--c-gold); }
/* ── Boutons ──────────────────────────────────────────── */
.btn-lv {
display: inline-flex; align-items: center; gap: 8px;
padding: 11px 24px; border-radius: var(--r-sm);
font-family: var(--f-body); font-size: .9rem; font-weight: 600;
cursor: pointer; text-decoration: none; border: none;
transition: background .18s, transform .14s, box-shadow .18s;
white-space: nowrap;
}
.btn-lv:hover { transform: translateY(-2px); }
.btn-gold {
background: var(--c-gold); color: #fff;
}
.btn-gold:hover { background: var(--c-gold-lt); color: #fff; }
.btn-ink {
background: var(--c-ink); color: #fff;
}
.btn-ink:hover { background: var(--c-ink-soft); color: #fff; }
.btn-outline {
background: transparent; color: var(--c-ink);
border: 1.5px solid var(--c-border);
}
.btn-outline:hover { border-color: var(--c-gold); color: var(--c-gold); }
.btn-outline-w {
background: transparent; color: #fff;
border: 1.5px solid rgba(255,255,255,.35);
}
.btn-outline-w:hover { border-color: #fff; background: rgba(255,255,255,.08); color: #fff; }
.btn-white {
background: #fff; color: var(--c-ink);
box-shadow: var(--shadow-sm);
}
.btn-white:hover { box-shadow: var(--shadow-md); color: var(--c-ink); }
/* ── Tags / Badges ────────────────────────────────────── */
.badge-lv {
display: inline-block;
font-size: .68rem; font-weight: 700;
letter-spacing: .09em; text-transform: uppercase;
padding: 3px 11px; border-radius: 20px;
border: 1px solid;
}
.badge-gold { background: rgba(201,151,43,.12); color: var(--c-gold); border-color: rgba(201,151,43,.3); }
.badge-success{ background: rgba(34,197,94,.12); color: #15803d; border-color: rgba(34,197,94,.3); }
.badge-danger { background: rgba(239,68,68,.12); color: #b91c1c; border-color: rgba(239,68,68,.3); }
.badge-info { background: rgba(59,130,246,.12); color: #1d4ed8; border-color: rgba(59,130,246,.3); }
.badge-muted { background: rgba(0,0,0,.05); color: var(--c-muted);border-color: var(--c-border); }
/* ── En-têtes de page (front) ─────────────────────────── */
.page-header {
background: var(--c-ink);
padding: 60px var(--gap-content) 50px;
position: relative; overflow: hidden;
}
.page-header__glow {
position: absolute; pointer-events: none;
border-radius: 50%;
background: radial-gradient(circle, rgba(201,151,43,.18), transparent 70%);
}
.page-header__title {
font-family: var(--f-display);
font-size: clamp(2rem, 4vw, 3rem);
font-weight: 700; color: #fff; line-height: 1.1;
}
.page-header__sub {
color: rgba(255,255,255,.5);
margin-top: 10px; font-size: .92rem;
}
/* ── Sections ─────────────────────────────────────────── */
.section {
padding: var(--gap-section) var(--gap-content);
}
.section--white { background: var(--c-white); }
.section--ink { background: var(--c-ink); }
.section--cream { background: var(--c-cream); }
.content-wrap {
max-width: 1280px;
margin: 0 auto;
padding: 56px var(--gap-content);
}
/* ── Cartes génériques ────────────────────────────────── */
.card-lv {
background: var(--c-white);
border: 1px solid var(--c-border);
border-radius: var(--r-md);
transition: box-shadow .22s, transform .2s;
}
.card-lv:hover {
box-shadow: var(--shadow-md);
transform: translateY(-3px);
}
/* ── Grille de features / cartes ─────────────────────── */
.grid-auto {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(var(--col-min, 240px), 1fr));
gap: var(--grid-gap, 24px);
}
/* ── Flash Messages ───────────────────────────────────── */
.flash-stack {
position: fixed; top: 16px; right: 16px; z-index: 9999;
display: flex; flex-direction: column; gap: 10px;
max-width: 380px; width: calc(100% - 32px);
}
.flash-item {
display: flex; align-items: flex-start; gap: 12px;
padding: 14px 16px; border-radius: var(--r-sm);
background: #fff; border-left: 4px solid var(--c-gold);
box-shadow: var(--shadow-md);
animation: slideIn .3s ease both;
}
.flash-item--success { border-color: var(--c-success); }
.flash-item--danger { border-color: var(--c-danger); }
.flash-item--warning { border-color: var(--c-warning); }
.flash-item--info { border-color: var(--c-info); }
.flash-item__icon { font-size: 1rem; margin-top: 1px; }
.flash-item--success .flash-item__icon { color: var(--c-success); }
.flash-item--danger .flash-item__icon { color: var(--c-danger); }
.flash-item--warning .flash-item__icon { color: var(--c-warning); }
.flash-item--info .flash-item__icon { color: var(--c-info); }
.flash-item__text { font-size: .88rem; flex: 1; line-height: 1.5; }
.flash-item__close {
background: none; border: none; cursor: pointer;
color: var(--c-muted); font-size: 1rem; padding: 0;
line-height: 1; margin-top: 1px;
transition: color .15s;
}
.flash-item__close:hover { color: var(--c-ink); }
/* ── Animations ───────────────────────────────────────── */
@keyframes fadeUp {
from { opacity: 0; transform: translateY(22px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes slideIn {
from { opacity: 0; transform: translateX(20px); }
to { opacity: 1; transform: translateX(0); }
}
.anim-up { animation: fadeUp .55s ease both; }
/* ── Utilitaires ──────────────────────────────────────── */
.visually-hidden {
position: absolute; width: 1px; height: 1px;
overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap;
}
</style>
{% endblock %}
</head>
<body class="host_version">
{% block main %}
{# Réservé au layout backend #}
{% endblock %}
{% block partials %}
{# Flash messages redesignés #}
{% include 'layout/partials/flash_messages.html.twig' %}
{% if not app.user %}
{% include 'layout/partials/modal.html.twig' %}
{% include 'layout/partials/loader.html.twig' %}
{% include 'layout/partials/header.html.twig' %}
{% endif %}
{% endblock %}
{% block body %}{% endblock %}
{% block footer %}
{% include 'layout/partials/partners.html.twig' %}
{% include 'layout/partials/footer.html.twig' %}
{% endblock %}
{# Sauvegarde de la route courante en session #}
{{ app.session.set('referer', app.request.get('_route')) }}
{% block javascripts %}
{# ── 1. jQuery ── #}
<script src="https://code.jquery.com/jquery-3.7.1.min.js"
integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
crossorigin="anonymous"></script>
{# ── 2. jQuery UI ── #}
<script src="{{ asset('assets/js/jquery-ui.min.js') }}"></script>
{# ── 3. Bootstrap 4 ── #}
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.bundle.min.js"></script>
{# ── 4. Chart.js ── #}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js"></script>
{# ── 5. Scripts applicatifs ── #}
<script src="{{ asset('assets/js/jquery.mCustomScrollbar.concat.min.js') }}"></script>
<script src="{{ asset('assets/js/menu.js') }}"></script>
<script src="{{ asset('assets/js/all.js') }}"></script>
<script src="{{ asset('assets/js/front.js') }}"></script>
<script src="{{ asset('assets/js/custom.js') }}"></script>
<script src="{{ asset('assets/js/timeline.min.js') }}"></script>
<script src="{{ asset('assets/js/d3.v4.min.js') }}"></script>
<script>
(function () {
'use strict';
/* ── Sidebar toggle (backend) ──────────────────────── */
$('#toggle-btn').on('click', function (e) {
e.preventDefault();
if ($(window).width() > 1199) {
$('body').toggleClass('sidebar-collapsed');
$('.side-navbar').toggleClass('shrinked');
$('.page').toggleClass('active');
} else {
$('.side-navbar').toggleClass('show-sm');
$('.page').toggleClass('active-sm');
}
});
$(document).on('click', function (e) {
if ($(window).width() <= 1199 &&
!$(e.target).closest('.side-navbar, #toggle-btn').length) {
$('.side-navbar').removeClass('show-sm');
$('.page').removeClass('active-sm');
}
});
/* ── Changement d'année scolaire ───────────────────── */
$('#select_year').on('change', function () {
$.ajax({
type: 'POST',
url: '{{ path("update_school_year") }}',
data: { selectedSchoolYear: $(this).val() },
success: function () { location.reload(); },
error: function () { alert('Échec du changement d\'année.'); }
});
});
/* ── Timeline ──────────────────────────────────────── */
if (typeof timeline === 'function') {
timeline(document.querySelectorAll('.timeline'), {
forceVerticalMode: 700,
mode: 'horizontal',
verticalStartPosition: 'left',
visibleItems: 4
});
}
/* ── Flash messages : fermeture manuelle ───────────── */
$(document).on('click', '.flash-item__close', function () {
$(this).closest('.flash-item').fadeOut(200, function () {
$(this).remove();
});
});
/* ── Auto-dismiss des flash après 5s ───────────────── */
setTimeout(function () {
$('.flash-item').fadeOut(400, function () { $(this).remove(); });
}, 5000);
})();
</script>
{# ── Google Analytics ── #}
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-208287842-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'UA-208287842-1');
</script>
{% endblock %}
</body>
</html>