var/cache/dev/twig/70/7099039eb5b39b926d279efd1558727d.php line 587

Open in your IDE?
  1. <?php
  2. use Twig\Environment;
  3. use Twig\Error\LoaderError;
  4. use Twig\Error\RuntimeError;
  5. use Twig\Extension\CoreExtension;
  6. use Twig\Extension\SandboxExtension;
  7. use Twig\Markup;
  8. use Twig\Sandbox\SecurityError;
  9. use Twig\Sandbox\SecurityNotAllowedTagError;
  10. use Twig\Sandbox\SecurityNotAllowedFilterError;
  11. use Twig\Sandbox\SecurityNotAllowedFunctionError;
  12. use Twig\Source;
  13. use Twig\Template;
  14. use Twig\TemplateWrapper;
  15. /* layout/base.html.twig */
  16. class __TwigTemplate_622f1b446738d9ba753d92294afc7327 extends Template
  17. {
  18. private Source $source;
  19. /**
  20. * @var array<string, Template>
  21. */
  22. private array $macros = [];
  23. public function __construct(Environment $env)
  24. {
  25. parent::__construct($env);
  26. $this->source = $this->getSourceContext();
  27. $this->parent = false;
  28. $this->blocks = [
  29. 'title' => [$this, 'block_title'],
  30. 'stylesheets' => [$this, 'block_stylesheets'],
  31. 'main' => [$this, 'block_main'],
  32. 'partials' => [$this, 'block_partials'],
  33. 'body' => [$this, 'block_body'],
  34. 'footer' => [$this, 'block_footer'],
  35. 'javascripts' => [$this, 'block_javascripts'],
  36. ];
  37. }
  38. protected function doDisplay(array $context, array $blocks = []): iterable
  39. {
  40. $macros = $this->macros;
  41. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  42. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "layout/base.html.twig"));
  43. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  44. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "layout/base.html.twig"));
  45. // line 1
  46. yield "<!DOCTYPE html>
  47. <html lang=\"fr\">
  48. <head>
  49. <meta charset=\"UTF-8\">
  50. <title>";
  51. // line 5
  52. yield from $this->unwrap()->yieldBlock('title', $context, $blocks);
  53. yield "</title>
  54. ";
  55. // line 8
  56. yield " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">
  57. <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">
  58. ";
  59. // line 12
  60. yield " <meta name=\"keywords\" content=\"nations isbb bethesda liveedu gestion scolaire\">
  61. <meta name=\"description\" content=\"Institut secondaire bilingue des Nations — plateforme de gestion scolaire LiveEdu\">
  62. <meta name=\"author\" content=\"Arsene Fokam Poka, Ing\">
  63. ";
  64. // line 17
  65. yield " <link rel=\"icon\" type=\"image/png\" href=\"";
  66. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/images/BethesdaLogo.png"), "html", null, true);
  67. yield "\">
  68. <link rel=\"apple-touch-icon\" href=\"";
  69. // line 18
  70. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/images/BethesdaLogo.png"), "html", null, true);
  71. yield "\">
  72. ";
  73. // line 21
  74. yield " <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">
  75. <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>
  76. <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\">
  77. ";
  78. // line 26
  79. yield " <link href=\"";
  80. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/css/bootstrap.min.css"), "html", null, true);
  81. yield "\" rel=\"stylesheet\">
  82. <link href=\"";
  83. // line 27
  84. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/css/bootstrap-grid.min.css"), "html", null, true);
  85. yield "\" rel=\"stylesheet\">
  86. <link href=\"";
  87. // line 28
  88. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/css/bootstrap-reboot.min.css"), "html", null, true);
  89. yield "\" rel=\"stylesheet\">
  90. <link href=\"";
  91. // line 29
  92. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/css/font-awesome.min.css"), "html", null, true);
  93. yield "\" rel=\"stylesheet\">
  94. ";
  95. // line 32
  96. yield " <link href=\"";
  97. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/css/style.css"), "html", null, true);
  98. yield "\" rel=\"stylesheet\">
  99. <link href=\"";
  100. // line 33
  101. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/css/custom.css"), "html", null, true);
  102. yield "\" rel=\"stylesheet\">
  103. <link href=\"";
  104. // line 34
  105. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/css/navbar-fix.css"), "html", null, true);
  106. yield "\" rel=\"stylesheet\">
  107. ";
  108. // line 40
  109. yield " <style>
  110. /* ── Tokens ───────────────────────────────────────────── */
  111. :root {
  112. /* Couleurs */
  113. --c-ink: #0f1923;
  114. --c-ink-soft: #1e2f3f;
  115. --c-gold: #c9972b;
  116. --c-gold-lt: #f0c060;
  117. --c-cream: #faf7f2;
  118. --c-white: #ffffff;
  119. --c-slate: #344054;
  120. --c-muted: #6b7a90;
  121. --c-border: rgba(0,0,0,.08);
  122. --c-border-dk: rgba(255,255,255,.1);
  123. --c-success: #22c55e;
  124. --c-warning: #f59e0b;
  125. --c-danger: #ef4444;
  126. --c-info: #3b82f6;
  127. /* Typographie */
  128. --f-display: 'Playfair Display', Georgia, serif;
  129. --f-body: 'DM Sans', system-ui, sans-serif;
  130. /* Rayons & ombres */
  131. --r-sm: 8px;
  132. --r-md: 14px;
  133. --r-lg: 20px;
  134. --r-xl: 28px;
  135. --shadow-sm: 0 2px 8px rgba(0,0,0,.06);
  136. --shadow-md: 0 8px 24px rgba(0,0,0,.09);
  137. --shadow-lg: 0 16px 48px rgba(0,0,0,.12);
  138. /* Espacements de section */
  139. --gap-section: 12%;
  140. --gap-content: 6vw;
  141. }
  142. /* ── Reset minimal ────────────────────────────────────── */
  143. *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
  144. html { scroll-behavior: smooth; }
  145. body {
  146. font-family: var(--f-body);
  147. background: var(--c-cream);
  148. color: var(--c-ink);
  149. line-height: 1.6;
  150. -webkit-font-smoothing: antialiased;
  151. }
  152. img { max-width: 100%; display: block; }
  153. a { transition: color .18s, opacity .18s; }
  154. /* ── Typographie ──────────────────────────────────────── */
  155. .t-display {
  156. font-family: var(--f-display);
  157. font-weight: 700;
  158. line-height: 1.1;
  159. letter-spacing: -.02em;
  160. }
  161. .t-eyebrow {
  162. font-size: .68rem; font-weight: 700;
  163. letter-spacing: .18em; text-transform: uppercase;
  164. color: var(--c-gold);
  165. display: inline-flex; align-items: center; gap: 10px;
  166. }
  167. .t-eyebrow::before {
  168. content: ''; display: block;
  169. width: 28px; height: 1px; background: currentColor;
  170. }
  171. .t-muted { color: var(--c-muted); }
  172. .t-gold { color: var(--c-gold); }
  173. /* ── Boutons ──────────────────────────────────────────── */
  174. .btn-lv {
  175. display: inline-flex; align-items: center; gap: 8px;
  176. padding: 11px 24px; border-radius: var(--r-sm);
  177. font-family: var(--f-body); font-size: .9rem; font-weight: 600;
  178. cursor: pointer; text-decoration: none; border: none;
  179. transition: background .18s, transform .14s, box-shadow .18s;
  180. white-space: nowrap;
  181. }
  182. .btn-lv:hover { transform: translateY(-2px); }
  183. .btn-gold { background: var(--c-gold); color: #fff; }
  184. .btn-gold:hover { background: var(--c-gold-lt); color: #fff; }
  185. .btn-ink { background: var(--c-ink); color: #fff; }
  186. .btn-ink:hover { background: var(--c-ink-soft); color: #fff; }
  187. .btn-outline { background: transparent; color: var(--c-ink); border: 1.5px solid var(--c-border); }
  188. .btn-outline:hover { border-color: var(--c-gold); color: var(--c-gold); }
  189. .btn-outline-w { background: transparent; color: #fff; border: 1.5px solid rgba(255,255,255,.35); }
  190. .btn-outline-w:hover { border-color: #fff; background: rgba(255,255,255,.08); color: #fff; }
  191. .btn-white { background: #fff; color: var(--c-ink); box-shadow: var(--shadow-sm); }
  192. .btn-white:hover { box-shadow: var(--shadow-md); color: var(--c-ink); }
  193. /* ── Tags / Badges ────────────────────────────────────── */
  194. .badge-lv {
  195. display: inline-block;
  196. font-size: .68rem; font-weight: 700;
  197. letter-spacing: .09em; text-transform: uppercase;
  198. padding: 3px 11px; border-radius: 20px; border: 1px solid;
  199. }
  200. .badge-gold { background: rgba(201,151,43,.12); color: var(--c-gold); border-color: rgba(201,151,43,.3); }
  201. .badge-success { background: rgba(34,197,94,.12); color: #15803d; border-color: rgba(34,197,94,.3); }
  202. .badge-danger { background: rgba(239,68,68,.12); color: #b91c1c; border-color: rgba(239,68,68,.3); }
  203. .badge-info { background: rgba(59,130,246,.12); color: #1d4ed8; border-color: rgba(59,130,246,.3); }
  204. .badge-muted { background: rgba(0,0,0,.05); color: var(--c-muted);border-color: var(--c-border); }
  205. /* ── En-têtes de page (front) ─────────────────────────── */
  206. .page-header {
  207. background: var(--c-ink);
  208. padding: 60px var(--gap-content) 50px;
  209. position: relative; overflow: hidden;
  210. }
  211. .page-header__glow {
  212. position: absolute; pointer-events: none; border-radius: 50%;
  213. background: radial-gradient(circle, rgba(201,151,43,.18), transparent 70%);
  214. }
  215. .page-header__title {
  216. font-family: var(--f-display);
  217. font-size: clamp(2rem, 4vw, 3rem);
  218. font-weight: 700; color: #fff; line-height: 1.1;
  219. }
  220. .page-header__sub {
  221. color: rgba(255,255,255,.5);
  222. margin-top: 10px; font-size: .92rem;
  223. }
  224. /* ── Sections ─────────────────────────────────────────── */
  225. .section { padding: var(--gap-section) var(--gap-content); }
  226. .section--white { background: var(--c-white); }
  227. .section--ink { background: var(--c-ink); }
  228. .section--cream { background: var(--c-cream); }
  229. .content-wrap {
  230. max-width: 1280px;
  231. margin: 0 auto;
  232. padding: 56px var(--gap-content);
  233. }
  234. /* ── Cartes génériques ────────────────────────────────── */
  235. .card-lv {
  236. background: var(--c-white);
  237. border: 1px solid var(--c-border);
  238. border-radius: var(--r-md);
  239. transition: box-shadow .22s, transform .2s;
  240. }
  241. .card-lv:hover { box-shadow: var(--shadow-md); transform: translateY(-3px); }
  242. /* ── Grille auto ──────────────────────────────────────── */
  243. .grid-auto {
  244. display: grid;
  245. grid-template-columns: repeat(auto-fill, minmax(var(--col-min, 240px), 1fr));
  246. gap: var(--grid-gap, 24px);
  247. }
  248. /* ── Flash Messages ───────────────────────────────────── */
  249. .flash-stack {
  250. position: fixed; top: 16px; right: 16px; z-index: 9999;
  251. display: flex; flex-direction: column; gap: 10px;
  252. max-width: 380px; width: calc(100% - 32px);
  253. }
  254. .flash-item {
  255. display: flex; align-items: flex-start; gap: 12px;
  256. padding: 14px 16px; border-radius: var(--r-sm);
  257. background: #fff; border-left: 4px solid var(--c-gold);
  258. box-shadow: var(--shadow-md);
  259. animation: slideIn .3s ease both;
  260. }
  261. .flash-item--success { border-color: var(--c-success); }
  262. .flash-item--danger { border-color: var(--c-danger); }
  263. .flash-item--warning { border-color: var(--c-warning); }
  264. .flash-item--info { border-color: var(--c-info); }
  265. .flash-item__icon { font-size: 1rem; margin-top: 1px; }
  266. .flash-item--success .flash-item__icon { color: var(--c-success); }
  267. .flash-item--danger .flash-item__icon { color: var(--c-danger); }
  268. .flash-item--warning .flash-item__icon { color: var(--c-warning); }
  269. .flash-item--info .flash-item__icon { color: var(--c-info); }
  270. .flash-item__text { font-size: .88rem; flex: 1; line-height: 1.5; }
  271. .flash-item__close {
  272. background: none; border: none; cursor: pointer;
  273. color: var(--c-muted); font-size: 1rem; padding: 0;
  274. line-height: 1; margin-top: 1px; transition: color .15s;
  275. }
  276. .flash-item__close:hover { color: var(--c-ink); }
  277. /* ── Animations ───────────────────────────────────────── */
  278. @keyframes fadeUp {
  279. from { opacity: 0; transform: translateY(22px); }
  280. to { opacity: 1; transform: translateY(0); }
  281. }
  282. @keyframes slideIn {
  283. from { opacity: 0; transform: translateX(20px); }
  284. to { opacity: 1; transform: translateX(0); }
  285. }
  286. .anim-up { animation: fadeUp .55s ease both; }
  287. /* ── Utilitaires ──────────────────────────────────────── */
  288. .visually-hidden {
  289. position: absolute; width: 1px; height: 1px;
  290. overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap;
  291. }
  292. </style>
  293. ";
  294. // line 245
  295. yield from $this->unwrap()->yieldBlock('stylesheets', $context, $blocks);
  296. // line 246
  297. yield "</head>
  298. <body class=\"host_version\">
  299. ";
  300. // line 250
  301. yield from $this->unwrap()->yieldBlock('main', $context, $blocks);
  302. // line 253
  303. yield "
  304. ";
  305. // line 254
  306. yield from $this->unwrap()->yieldBlock('partials', $context, $blocks);
  307. // line 263
  308. yield "
  309. ";
  310. // line 264
  311. yield from $this->unwrap()->yieldBlock('body', $context, $blocks);
  312. // line 265
  313. yield "
  314. ";
  315. // line 266
  316. yield from $this->unwrap()->yieldBlock('footer', $context, $blocks);
  317. // line 270
  318. yield "
  319. ";
  320. // line 272
  321. yield " ";
  322. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 272, $this->source); })()), "session", [], "any", false, false, false, 272), "set", ["referer", CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 272, $this->source); })()), "request", [], "any", false, false, false, 272), "get", ["_route"], "method", false, false, false, 272)], "method", false, false, false, 272), "html", null, true);
  323. yield "
  324. ";
  325. // line 277
  326. yield "
  327. ";
  328. // line 279
  329. yield " <script src=\"https://code.jquery.com/jquery-3.7.1.min.js\"
  330. integrity=\"sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=\"
  331. crossorigin=\"anonymous\"></script>
  332. ";
  333. // line 284
  334. yield " <script src=\"";
  335. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/jquery-ui.min.js"), "html", null, true);
  336. yield "\"></script>
  337. ";
  338. // line 287
  339. yield " <script src=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.bundle.min.js\"></script>
  340. ";
  341. // line 290
  342. yield " <script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js\"></script>
  343. ";
  344. // line 293
  345. yield " <script src=\"";
  346. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/jquery.mCustomScrollbar.concat.min.js"), "html", null, true);
  347. yield "\"></script>
  348. <script src=\"";
  349. // line 294
  350. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/jsjquery.simpleAccordion.min.js"), "html", null, true);
  351. yield "\"></script>
  352. <script src=\"";
  353. // line 295
  354. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/menu.js"), "html", null, true);
  355. yield "\"></script>
  356. <script src=\"";
  357. // line 296
  358. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/all.js"), "html", null, true);
  359. yield "\"></script>
  360. <script src=\"";
  361. // line 297
  362. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/front.js"), "html", null, true);
  363. yield "\"></script>
  364. <script src=\"";
  365. // line 298
  366. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/custom.js"), "html", null, true);
  367. yield "\"></script>
  368. <script src=\"";
  369. // line 299
  370. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/timeline.min.js"), "html", null, true);
  371. yield "\"></script>
  372. <script src=\"";
  373. // line 300
  374. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/js/d3.v4.min.js"), "html", null, true);
  375. yield "\"></script>
  376. <script>
  377. (function () {
  378. 'use strict';
  379. /* ── Sidebar toggle (backend) ──────────────────────── */
  380. \$('#toggle-btn').on('click', function (e) {
  381. e.preventDefault();
  382. if (\$(window).width() > 1199) {
  383. \$('body').toggleClass('sidebar-collapsed');
  384. \$('.side-navbar').toggleClass('shrinked');
  385. \$('.page').toggleClass('active');
  386. } else {
  387. \$('.side-navbar').toggleClass('show-sm');
  388. \$('.page').toggleClass('active-sm');
  389. }
  390. });
  391. \$(document).on('click', function (e) {
  392. if (\$(window).width() <= 1199 &&
  393. !\$(e.target).closest('.side-navbar, #toggle-btn').length) {
  394. \$('.side-navbar').removeClass('show-sm');
  395. \$('.page').removeClass('active-sm');
  396. }
  397. });
  398. /* ── Changement d'année scolaire ───────────────────── */
  399. \$('#select_year').on('change', function () {
  400. \$.ajax({
  401. type: 'POST',
  402. url: '";
  403. // line 331
  404. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("update_school_year");
  405. yield "',
  406. data: { selectedSchoolYear: \$(this).val() },
  407. success: function () { location.reload(); },
  408. error: function () { alert('Échec du changement d\\'année.'); }
  409. });
  410. });
  411. /* ── Timeline ──────────────────────────────────────── */
  412. if (typeof timeline === 'function') {
  413. timeline(document.querySelectorAll('.timeline'), {
  414. forceVerticalMode: 700,
  415. mode: 'horizontal',
  416. verticalStartPosition: 'left',
  417. visibleItems: 4
  418. });
  419. }
  420. /* ── Flash messages : fermeture manuelle ───────────── */
  421. \$(document).on('click', '.flash-item__close', function () {
  422. \$(this).closest('.flash-item').fadeOut(200, function () {
  423. \$(this).remove();
  424. });
  425. });
  426. /* ── Auto-dismiss des flash après 5s ───────────────── */
  427. setTimeout(function () {
  428. \$('.flash-item').fadeOut(400, function () { \$(this).remove(); });
  429. }, 5000);
  430. })();
  431. </script>
  432. ";
  433. // line 364
  434. yield " <script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-208287842-1\"></script>
  435. <script>
  436. window.dataLayer = window.dataLayer || [];
  437. function gtag() { dataLayer.push(arguments); }
  438. gtag('js', new Date());
  439. gtag('config', 'UA-208287842-1');
  440. </script>
  441. ";
  442. // line 372
  443. yield from $this->unwrap()->yieldBlock('javascripts', $context, $blocks);
  444. // line 373
  445. yield "
  446. </body>
  447. </html>
  448. ";
  449. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  450. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  451. yield from [];
  452. }
  453. // line 5
  454. /**
  455. * @return iterable<null|scalar|\Stringable>
  456. */
  457. public function block_title(array $context, array $blocks = []): iterable
  458. {
  459. $macros = $this->macros;
  460. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  461. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));
  462. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  463. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));
  464. yield "NATIONS";
  465. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  466. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  467. yield from [];
  468. }
  469. // line 245
  470. /**
  471. * @return iterable<null|scalar|\Stringable>
  472. */
  473. public function block_stylesheets(array $context, array $blocks = []): iterable
  474. {
  475. $macros = $this->macros;
  476. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  477. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "stylesheets"));
  478. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  479. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "stylesheets"));
  480. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  481. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  482. yield from [];
  483. }
  484. // line 250
  485. /**
  486. * @return iterable<null|scalar|\Stringable>
  487. */
  488. public function block_main(array $context, array $blocks = []): iterable
  489. {
  490. $macros = $this->macros;
  491. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  492. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "main"));
  493. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  494. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "main"));
  495. // line 251
  496. yield " ";
  497. // line 252
  498. yield " ";
  499. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  500. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  501. yield from [];
  502. }
  503. // line 254
  504. /**
  505. * @return iterable<null|scalar|\Stringable>
  506. */
  507. public function block_partials(array $context, array $blocks = []): iterable
  508. {
  509. $macros = $this->macros;
  510. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  511. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "partials"));
  512. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  513. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "partials"));
  514. // line 255
  515. yield " ";
  516. // line 256
  517. yield " ";
  518. yield from $this->load("layout/partials/flash_messages.html.twig", 256)->unwrap()->yield($context);
  519. // line 257
  520. yield "
  521. ";
  522. // line 258
  523. if ((($tmp = !CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 258, $this->source); })()), "user", [], "any", false, false, false, 258)) && $tmp instanceof Markup ? (string) $tmp : $tmp)) {
  524. // line 259
  525. yield " ";
  526. yield from $this->load("layout/partials/modal.html.twig", 259)->unwrap()->yield($context);
  527. // line 260
  528. yield " ";
  529. yield from $this->load("layout/partials/loader.html.twig", 260)->unwrap()->yield($context);
  530. // line 261
  531. yield " ";
  532. }
  533. // line 262
  534. yield " ";
  535. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  536. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  537. yield from [];
  538. }
  539. // line 264
  540. /**
  541. * @return iterable<null|scalar|\Stringable>
  542. */
  543. public function block_body(array $context, array $blocks = []): iterable
  544. {
  545. $macros = $this->macros;
  546. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  547. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  548. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  549. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  550. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  551. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  552. yield from [];
  553. }
  554. // line 266
  555. /**
  556. * @return iterable<null|scalar|\Stringable>
  557. */
  558. public function block_footer(array $context, array $blocks = []): iterable
  559. {
  560. $macros = $this->macros;
  561. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  562. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footer"));
  563. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  564. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footer"));
  565. // line 267
  566. yield " ";
  567. yield from $this->load("layout/partials/partners.html.twig", 267)->unwrap()->yield($context);
  568. // line 268
  569. yield " ";
  570. yield from $this->load("layout/partials/footer.html.twig", 268)->unwrap()->yield($context);
  571. // line 269
  572. yield " ";
  573. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  574. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  575. yield from [];
  576. }
  577. // line 372
  578. /**
  579. * @return iterable<null|scalar|\Stringable>
  580. */
  581. public function block_javascripts(array $context, array $blocks = []): iterable
  582. {
  583. $macros = $this->macros;
  584. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  585. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
  586. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  587. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
  588. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  589. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  590. yield from [];
  591. }
  592. /**
  593. * @codeCoverageIgnore
  594. */
  595. public function getTemplateName(): string
  596. {
  597. return "layout/base.html.twig";
  598. }
  599. /**
  600. * @codeCoverageIgnore
  601. */
  602. public function isTraitable(): bool
  603. {
  604. return false;
  605. }
  606. /**
  607. * @codeCoverageIgnore
  608. */
  609. public function getDebugInfo(): array
  610. {
  611. return array ( 679 => 372, 668 => 269, 665 => 268, 662 => 267, 649 => 266, 627 => 264, 616 => 262, 613 => 261, 610 => 260, 607 => 259, 605 => 258, 602 => 257, 599 => 256, 597 => 255, 584 => 254, 573 => 252, 571 => 251, 558 => 250, 536 => 245, 513 => 5, 499 => 373, 497 => 372, 487 => 364, 452 => 331, 418 => 300, 414 => 299, 410 => 298, 406 => 297, 402 => 296, 398 => 295, 394 => 294, 389 => 293, 385 => 290, 381 => 287, 375 => 284, 369 => 279, 366 => 277, 360 => 272, 357 => 270, 355 => 266, 352 => 265, 350 => 264, 347 => 263, 345 => 254, 342 => 253, 340 => 250, 334 => 246, 332 => 245, 125 => 40, 120 => 34, 116 => 33, 111 => 32, 106 => 29, 102 => 28, 98 => 27, 93 => 26, 87 => 21, 82 => 18, 77 => 17, 71 => 12, 66 => 8, 61 => 5, 55 => 1,);
  612. }
  613. public function getSourceContext(): Source
  614. {
  615. return new Source("<!DOCTYPE html>
  616. <html lang=\"fr\">
  617. <head>
  618. <meta charset=\"UTF-8\">
  619. <title>{% block title %}NATIONS{% endblock %}</title>
  620. {# ── Viewport & compatibilité ── #}
  621. <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">
  622. <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">
  623. {# ── SEO ── #}
  624. <meta name=\"keywords\" content=\"nations isbb bethesda liveedu gestion scolaire\">
  625. <meta name=\"description\" content=\"Institut secondaire bilingue des Nations — plateforme de gestion scolaire LiveEdu\">
  626. <meta name=\"author\" content=\"Arsene Fokam Poka, Ing\">
  627. {# ── Favicons ── #}
  628. <link rel=\"icon\" type=\"image/png\" href=\"{{ asset('assets/images/BethesdaLogo.png') }}\">
  629. <link rel=\"apple-touch-icon\" href=\"{{ asset('assets/images/BethesdaLogo.png') }}\">
  630. {# ── Polices Google ── #}
  631. <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">
  632. <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>
  633. <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\">
  634. {# ── Librairies CSS ── #}
  635. <link href=\"{{ asset('assets/css/bootstrap.min.css') }}\" rel=\"stylesheet\">
  636. <link href=\"{{ asset('assets/css/bootstrap-grid.min.css') }}\" rel=\"stylesheet\">
  637. <link href=\"{{ asset('assets/css/bootstrap-reboot.min.css') }}\" rel=\"stylesheet\">
  638. <link href=\"{{ asset('assets/css/font-awesome.min.css') }}\" rel=\"stylesheet\">
  639. {# ── CSS applicatif ── #}
  640. <link href=\"{{ asset('assets/css/style.css') }}\" rel=\"stylesheet\">
  641. <link href=\"{{ asset('assets/css/custom.css') }}\" rel=\"stylesheet\">
  642. <link href=\"{{ asset('assets/css/navbar-fix.css') }}\" rel=\"stylesheet\">
  643. {# ══════════════════════════════════════════════════════
  644. DESIGN SYSTEM GLOBAL — LiveEdu
  645. Tous les tokens, utilitaires et composants partagés.
  646. ══════════════════════════════════════════════════════ #}
  647. <style>
  648. /* ── Tokens ───────────────────────────────────────────── */
  649. :root {
  650. /* Couleurs */
  651. --c-ink: #0f1923;
  652. --c-ink-soft: #1e2f3f;
  653. --c-gold: #c9972b;
  654. --c-gold-lt: #f0c060;
  655. --c-cream: #faf7f2;
  656. --c-white: #ffffff;
  657. --c-slate: #344054;
  658. --c-muted: #6b7a90;
  659. --c-border: rgba(0,0,0,.08);
  660. --c-border-dk: rgba(255,255,255,.1);
  661. --c-success: #22c55e;
  662. --c-warning: #f59e0b;
  663. --c-danger: #ef4444;
  664. --c-info: #3b82f6;
  665. /* Typographie */
  666. --f-display: 'Playfair Display', Georgia, serif;
  667. --f-body: 'DM Sans', system-ui, sans-serif;
  668. /* Rayons & ombres */
  669. --r-sm: 8px;
  670. --r-md: 14px;
  671. --r-lg: 20px;
  672. --r-xl: 28px;
  673. --shadow-sm: 0 2px 8px rgba(0,0,0,.06);
  674. --shadow-md: 0 8px 24px rgba(0,0,0,.09);
  675. --shadow-lg: 0 16px 48px rgba(0,0,0,.12);
  676. /* Espacements de section */
  677. --gap-section: 12%;
  678. --gap-content: 6vw;
  679. }
  680. /* ── Reset minimal ────────────────────────────────────── */
  681. *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
  682. html { scroll-behavior: smooth; }
  683. body {
  684. font-family: var(--f-body);
  685. background: var(--c-cream);
  686. color: var(--c-ink);
  687. line-height: 1.6;
  688. -webkit-font-smoothing: antialiased;
  689. }
  690. img { max-width: 100%; display: block; }
  691. a { transition: color .18s, opacity .18s; }
  692. /* ── Typographie ──────────────────────────────────────── */
  693. .t-display {
  694. font-family: var(--f-display);
  695. font-weight: 700;
  696. line-height: 1.1;
  697. letter-spacing: -.02em;
  698. }
  699. .t-eyebrow {
  700. font-size: .68rem; font-weight: 700;
  701. letter-spacing: .18em; text-transform: uppercase;
  702. color: var(--c-gold);
  703. display: inline-flex; align-items: center; gap: 10px;
  704. }
  705. .t-eyebrow::before {
  706. content: ''; display: block;
  707. width: 28px; height: 1px; background: currentColor;
  708. }
  709. .t-muted { color: var(--c-muted); }
  710. .t-gold { color: var(--c-gold); }
  711. /* ── Boutons ──────────────────────────────────────────── */
  712. .btn-lv {
  713. display: inline-flex; align-items: center; gap: 8px;
  714. padding: 11px 24px; border-radius: var(--r-sm);
  715. font-family: var(--f-body); font-size: .9rem; font-weight: 600;
  716. cursor: pointer; text-decoration: none; border: none;
  717. transition: background .18s, transform .14s, box-shadow .18s;
  718. white-space: nowrap;
  719. }
  720. .btn-lv:hover { transform: translateY(-2px); }
  721. .btn-gold { background: var(--c-gold); color: #fff; }
  722. .btn-gold:hover { background: var(--c-gold-lt); color: #fff; }
  723. .btn-ink { background: var(--c-ink); color: #fff; }
  724. .btn-ink:hover { background: var(--c-ink-soft); color: #fff; }
  725. .btn-outline { background: transparent; color: var(--c-ink); border: 1.5px solid var(--c-border); }
  726. .btn-outline:hover { border-color: var(--c-gold); color: var(--c-gold); }
  727. .btn-outline-w { background: transparent; color: #fff; border: 1.5px solid rgba(255,255,255,.35); }
  728. .btn-outline-w:hover { border-color: #fff; background: rgba(255,255,255,.08); color: #fff; }
  729. .btn-white { background: #fff; color: var(--c-ink); box-shadow: var(--shadow-sm); }
  730. .btn-white:hover { box-shadow: var(--shadow-md); color: var(--c-ink); }
  731. /* ── Tags / Badges ────────────────────────────────────── */
  732. .badge-lv {
  733. display: inline-block;
  734. font-size: .68rem; font-weight: 700;
  735. letter-spacing: .09em; text-transform: uppercase;
  736. padding: 3px 11px; border-radius: 20px; border: 1px solid;
  737. }
  738. .badge-gold { background: rgba(201,151,43,.12); color: var(--c-gold); border-color: rgba(201,151,43,.3); }
  739. .badge-success { background: rgba(34,197,94,.12); color: #15803d; border-color: rgba(34,197,94,.3); }
  740. .badge-danger { background: rgba(239,68,68,.12); color: #b91c1c; border-color: rgba(239,68,68,.3); }
  741. .badge-info { background: rgba(59,130,246,.12); color: #1d4ed8; border-color: rgba(59,130,246,.3); }
  742. .badge-muted { background: rgba(0,0,0,.05); color: var(--c-muted);border-color: var(--c-border); }
  743. /* ── En-têtes de page (front) ─────────────────────────── */
  744. .page-header {
  745. background: var(--c-ink);
  746. padding: 60px var(--gap-content) 50px;
  747. position: relative; overflow: hidden;
  748. }
  749. .page-header__glow {
  750. position: absolute; pointer-events: none; border-radius: 50%;
  751. background: radial-gradient(circle, rgba(201,151,43,.18), transparent 70%);
  752. }
  753. .page-header__title {
  754. font-family: var(--f-display);
  755. font-size: clamp(2rem, 4vw, 3rem);
  756. font-weight: 700; color: #fff; line-height: 1.1;
  757. }
  758. .page-header__sub {
  759. color: rgba(255,255,255,.5);
  760. margin-top: 10px; font-size: .92rem;
  761. }
  762. /* ── Sections ─────────────────────────────────────────── */
  763. .section { padding: var(--gap-section) var(--gap-content); }
  764. .section--white { background: var(--c-white); }
  765. .section--ink { background: var(--c-ink); }
  766. .section--cream { background: var(--c-cream); }
  767. .content-wrap {
  768. max-width: 1280px;
  769. margin: 0 auto;
  770. padding: 56px var(--gap-content);
  771. }
  772. /* ── Cartes génériques ────────────────────────────────── */
  773. .card-lv {
  774. background: var(--c-white);
  775. border: 1px solid var(--c-border);
  776. border-radius: var(--r-md);
  777. transition: box-shadow .22s, transform .2s;
  778. }
  779. .card-lv:hover { box-shadow: var(--shadow-md); transform: translateY(-3px); }
  780. /* ── Grille auto ──────────────────────────────────────── */
  781. .grid-auto {
  782. display: grid;
  783. grid-template-columns: repeat(auto-fill, minmax(var(--col-min, 240px), 1fr));
  784. gap: var(--grid-gap, 24px);
  785. }
  786. /* ── Flash Messages ───────────────────────────────────── */
  787. .flash-stack {
  788. position: fixed; top: 16px; right: 16px; z-index: 9999;
  789. display: flex; flex-direction: column; gap: 10px;
  790. max-width: 380px; width: calc(100% - 32px);
  791. }
  792. .flash-item {
  793. display: flex; align-items: flex-start; gap: 12px;
  794. padding: 14px 16px; border-radius: var(--r-sm);
  795. background: #fff; border-left: 4px solid var(--c-gold);
  796. box-shadow: var(--shadow-md);
  797. animation: slideIn .3s ease both;
  798. }
  799. .flash-item--success { border-color: var(--c-success); }
  800. .flash-item--danger { border-color: var(--c-danger); }
  801. .flash-item--warning { border-color: var(--c-warning); }
  802. .flash-item--info { border-color: var(--c-info); }
  803. .flash-item__icon { font-size: 1rem; margin-top: 1px; }
  804. .flash-item--success .flash-item__icon { color: var(--c-success); }
  805. .flash-item--danger .flash-item__icon { color: var(--c-danger); }
  806. .flash-item--warning .flash-item__icon { color: var(--c-warning); }
  807. .flash-item--info .flash-item__icon { color: var(--c-info); }
  808. .flash-item__text { font-size: .88rem; flex: 1; line-height: 1.5; }
  809. .flash-item__close {
  810. background: none; border: none; cursor: pointer;
  811. color: var(--c-muted); font-size: 1rem; padding: 0;
  812. line-height: 1; margin-top: 1px; transition: color .15s;
  813. }
  814. .flash-item__close:hover { color: var(--c-ink); }
  815. /* ── Animations ───────────────────────────────────────── */
  816. @keyframes fadeUp {
  817. from { opacity: 0; transform: translateY(22px); }
  818. to { opacity: 1; transform: translateY(0); }
  819. }
  820. @keyframes slideIn {
  821. from { opacity: 0; transform: translateX(20px); }
  822. to { opacity: 1; transform: translateX(0); }
  823. }
  824. .anim-up { animation: fadeUp .55s ease both; }
  825. /* ── Utilitaires ──────────────────────────────────────── */
  826. .visually-hidden {
  827. position: absolute; width: 1px; height: 1px;
  828. overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap;
  829. }
  830. </style>
  831. {% block stylesheets %}{% endblock %}
  832. </head>
  833. <body class=\"host_version\">
  834. {% block main %}
  835. {# Réservé au layout backend #}
  836. {% endblock %}
  837. {% block partials %}
  838. {# Flash messages redesignés #}
  839. {% include 'layout/partials/flash_messages.html.twig' %}
  840. {% if not app.user %}
  841. {% include 'layout/partials/modal.html.twig' %}
  842. {% include 'layout/partials/loader.html.twig' %}
  843. {% endif %}
  844. {% endblock %}
  845. {% block body %}{% endblock %}
  846. {% block footer %}
  847. {% include 'layout/partials/partners.html.twig' %}
  848. {% include 'layout/partials/footer.html.twig' %}
  849. {% endblock %}
  850. {# Sauvegarde de la route courante en session #}
  851. {{ app.session.set('referer', app.request.get('_route')) }}
  852. {# ══════════════════════════════════════════════════════
  853. SCRIPTS — chargés en fin de body pour la performance
  854. ══════════════════════════════════════════════════════ #}
  855. {# ── 1. jQuery ── #}
  856. <script src=\"https://code.jquery.com/jquery-3.7.1.min.js\"
  857. integrity=\"sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=\"
  858. crossorigin=\"anonymous\"></script>
  859. {# ── 2. jQuery UI ── #}
  860. <script src=\"{{ asset('assets/js/jquery-ui.min.js') }}\"></script>
  861. {# ── 3. Bootstrap 4 bundle (inclut Popper) ── #}
  862. <script src=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.bundle.min.js\"></script>
  863. {# ── 4. Chart.js ── #}
  864. <script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js\"></script>
  865. {# ── 5. Scripts applicatifs ── #}
  866. <script src=\"{{ asset('assets/js/jquery.mCustomScrollbar.concat.min.js') }}\"></script>
  867. <script src=\"{{ asset('assets/js/jsjquery.simpleAccordion.min.js') }}\"></script>
  868. <script src=\"{{ asset('assets/js/menu.js') }}\"></script>
  869. <script src=\"{{ asset('assets/js/all.js') }}\"></script>
  870. <script src=\"{{ asset('assets/js/front.js') }}\"></script>
  871. <script src=\"{{ asset('assets/js/custom.js') }}\"></script>
  872. <script src=\"{{ asset('assets/js/timeline.min.js') }}\"></script>
  873. <script src=\"{{ asset('assets/js/d3.v4.min.js') }}\"></script>
  874. <script>
  875. (function () {
  876. 'use strict';
  877. /* ── Sidebar toggle (backend) ──────────────────────── */
  878. \$('#toggle-btn').on('click', function (e) {
  879. e.preventDefault();
  880. if (\$(window).width() > 1199) {
  881. \$('body').toggleClass('sidebar-collapsed');
  882. \$('.side-navbar').toggleClass('shrinked');
  883. \$('.page').toggleClass('active');
  884. } else {
  885. \$('.side-navbar').toggleClass('show-sm');
  886. \$('.page').toggleClass('active-sm');
  887. }
  888. });
  889. \$(document).on('click', function (e) {
  890. if (\$(window).width() <= 1199 &&
  891. !\$(e.target).closest('.side-navbar, #toggle-btn').length) {
  892. \$('.side-navbar').removeClass('show-sm');
  893. \$('.page').removeClass('active-sm');
  894. }
  895. });
  896. /* ── Changement d'année scolaire ───────────────────── */
  897. \$('#select_year').on('change', function () {
  898. \$.ajax({
  899. type: 'POST',
  900. url: '{{ path(\"update_school_year\") }}',
  901. data: { selectedSchoolYear: \$(this).val() },
  902. success: function () { location.reload(); },
  903. error: function () { alert('Échec du changement d\\'année.'); }
  904. });
  905. });
  906. /* ── Timeline ──────────────────────────────────────── */
  907. if (typeof timeline === 'function') {
  908. timeline(document.querySelectorAll('.timeline'), {
  909. forceVerticalMode: 700,
  910. mode: 'horizontal',
  911. verticalStartPosition: 'left',
  912. visibleItems: 4
  913. });
  914. }
  915. /* ── Flash messages : fermeture manuelle ───────────── */
  916. \$(document).on('click', '.flash-item__close', function () {
  917. \$(this).closest('.flash-item').fadeOut(200, function () {
  918. \$(this).remove();
  919. });
  920. });
  921. /* ── Auto-dismiss des flash après 5s ───────────────── */
  922. setTimeout(function () {
  923. \$('.flash-item').fadeOut(400, function () { \$(this).remove(); });
  924. }, 5000);
  925. })();
  926. </script>
  927. {# ── Google Analytics ── #}
  928. <script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-208287842-1\"></script>
  929. <script>
  930. window.dataLayer = window.dataLayer || [];
  931. function gtag() { dataLayer.push(arguments); }
  932. gtag('js', new Date());
  933. gtag('config', 'UA-208287842-1');
  934. </script>
  935. {% block javascripts %}{% endblock %}
  936. </body>
  937. </html>
  938. ", "layout/base.html.twig", "/var/www/bethesda/templates/layout/base.html.twig");
  939. }
  940. }