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

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 264
  308. yield "
  309. ";
  310. // line 265
  311. yield from $this->unwrap()->yieldBlock('body', $context, $blocks);
  312. // line 266
  313. yield "
  314. ";
  315. // line 267
  316. yield from $this->unwrap()->yieldBlock('footer', $context, $blocks);
  317. // line 271
  318. yield "
  319. ";
  320. // line 273
  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.', 273, $this->source); })()), "session", [], "any", false, false, false, 273), "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.', 273, $this->source); })()), "request", [], "any", false, false, false, 273), "get", ["_route"], "method", false, false, false, 273)], "method", false, false, false, 273), "html", null, true);
  323. yield "
  324. ";
  325. // line 278
  326. yield "
  327. ";
  328. // line 280
  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 285
  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 288
  339. yield " <script src=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.bundle.min.js\"></script>
  340. ";
  341. // line 291
  342. yield " <script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js\"></script>
  343. ";
  344. // line 294
  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 295
  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 296
  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 297
  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 298
  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 299
  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 300
  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 301
  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 332
  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 365
  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 373
  443. yield from $this->unwrap()->yieldBlock('javascripts', $context, $blocks);
  444. // line 374
  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. yield from $this->load("layout/partials/header.html.twig", 261)->unwrap()->yield($context);
  533. // line 262
  534. yield " ";
  535. }
  536. // line 263
  537. yield " ";
  538. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  539. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  540. yield from [];
  541. }
  542. // line 265
  543. /**
  544. * @return iterable<null|scalar|\Stringable>
  545. */
  546. public function block_body(array $context, array $blocks = []): iterable
  547. {
  548. $macros = $this->macros;
  549. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  550. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  551. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  552. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  553. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  554. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  555. yield from [];
  556. }
  557. // line 267
  558. /**
  559. * @return iterable<null|scalar|\Stringable>
  560. */
  561. public function block_footer(array $context, array $blocks = []): iterable
  562. {
  563. $macros = $this->macros;
  564. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  565. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footer"));
  566. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  567. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footer"));
  568. // line 268
  569. yield " ";
  570. yield from $this->load("layout/partials/partners.html.twig", 268)->unwrap()->yield($context);
  571. // line 269
  572. yield " ";
  573. yield from $this->load("layout/partials/footer.html.twig", 269)->unwrap()->yield($context);
  574. // line 270
  575. yield " ";
  576. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  577. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  578. yield from [];
  579. }
  580. // line 373
  581. /**
  582. * @return iterable<null|scalar|\Stringable>
  583. */
  584. public function block_javascripts(array $context, array $blocks = []): iterable
  585. {
  586. $macros = $this->macros;
  587. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  588. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
  589. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  590. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
  591. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  592. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  593. yield from [];
  594. }
  595. /**
  596. * @codeCoverageIgnore
  597. */
  598. public function getTemplateName(): string
  599. {
  600. return "layout/base.html.twig";
  601. }
  602. /**
  603. * @codeCoverageIgnore
  604. */
  605. public function isTraitable(): bool
  606. {
  607. return false;
  608. }
  609. /**
  610. * @codeCoverageIgnore
  611. */
  612. public function getDebugInfo(): array
  613. {
  614. return array ( 682 => 373, 671 => 270, 668 => 269, 665 => 268, 652 => 267, 630 => 265, 619 => 263, 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 => 374, 497 => 373, 487 => 365, 452 => 332, 418 => 301, 414 => 300, 410 => 299, 406 => 298, 402 => 297, 398 => 296, 394 => 295, 389 => 294, 385 => 291, 381 => 288, 375 => 285, 369 => 280, 366 => 278, 360 => 273, 357 => 271, 355 => 267, 352 => 266, 350 => 265, 347 => 264, 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,);
  615. }
  616. public function getSourceContext(): Source
  617. {
  618. return new Source("<!DOCTYPE html>
  619. <html lang=\"fr\">
  620. <head>
  621. <meta charset=\"UTF-8\">
  622. <title>{% block title %}NATIONS{% endblock %}</title>
  623. {# ── Viewport & compatibilité ── #}
  624. <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\">
  625. <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">
  626. {# ── SEO ── #}
  627. <meta name=\"keywords\" content=\"nations isbb bethesda liveedu gestion scolaire\">
  628. <meta name=\"description\" content=\"Institut secondaire bilingue des Nations — plateforme de gestion scolaire LiveEdu\">
  629. <meta name=\"author\" content=\"Arsene Fokam Poka, Ing\">
  630. {# ── Favicons ── #}
  631. <link rel=\"icon\" type=\"image/png\" href=\"{{ asset('assets/images/BethesdaLogo.png') }}\">
  632. <link rel=\"apple-touch-icon\" href=\"{{ asset('assets/images/BethesdaLogo.png') }}\">
  633. {# ── Polices Google ── #}
  634. <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">
  635. <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>
  636. <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\">
  637. {# ── Librairies CSS ── #}
  638. <link href=\"{{ asset('assets/css/bootstrap.min.css') }}\" rel=\"stylesheet\">
  639. <link href=\"{{ asset('assets/css/bootstrap-grid.min.css') }}\" rel=\"stylesheet\">
  640. <link href=\"{{ asset('assets/css/bootstrap-reboot.min.css') }}\" rel=\"stylesheet\">
  641. <link href=\"{{ asset('assets/css/font-awesome.min.css') }}\" rel=\"stylesheet\">
  642. {# ── CSS applicatif ── #}
  643. <link href=\"{{ asset('assets/css/style.css') }}\" rel=\"stylesheet\">
  644. <link href=\"{{ asset('assets/css/custom.css') }}\" rel=\"stylesheet\">
  645. <link href=\"{{ asset('assets/css/navbar-fix.css') }}\" rel=\"stylesheet\">
  646. {# ══════════════════════════════════════════════════════
  647. DESIGN SYSTEM GLOBAL — LiveEdu
  648. Tous les tokens, utilitaires et composants partagés.
  649. ══════════════════════════════════════════════════════ #}
  650. <style>
  651. /* ── Tokens ───────────────────────────────────────────── */
  652. :root {
  653. /* Couleurs */
  654. --c-ink: #0f1923;
  655. --c-ink-soft: #1e2f3f;
  656. --c-gold: #c9972b;
  657. --c-gold-lt: #f0c060;
  658. --c-cream: #faf7f2;
  659. --c-white: #ffffff;
  660. --c-slate: #344054;
  661. --c-muted: #6b7a90;
  662. --c-border: rgba(0,0,0,.08);
  663. --c-border-dk: rgba(255,255,255,.1);
  664. --c-success: #22c55e;
  665. --c-warning: #f59e0b;
  666. --c-danger: #ef4444;
  667. --c-info: #3b82f6;
  668. /* Typographie */
  669. --f-display: 'Playfair Display', Georgia, serif;
  670. --f-body: 'DM Sans', system-ui, sans-serif;
  671. /* Rayons & ombres */
  672. --r-sm: 8px;
  673. --r-md: 14px;
  674. --r-lg: 20px;
  675. --r-xl: 28px;
  676. --shadow-sm: 0 2px 8px rgba(0,0,0,.06);
  677. --shadow-md: 0 8px 24px rgba(0,0,0,.09);
  678. --shadow-lg: 0 16px 48px rgba(0,0,0,.12);
  679. /* Espacements de section */
  680. --gap-section: 12%;
  681. --gap-content: 6vw;
  682. }
  683. /* ── Reset minimal ────────────────────────────────────── */
  684. *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
  685. html { scroll-behavior: smooth; }
  686. body {
  687. font-family: var(--f-body);
  688. background: var(--c-cream);
  689. color: var(--c-ink);
  690. line-height: 1.6;
  691. -webkit-font-smoothing: antialiased;
  692. }
  693. img { max-width: 100%; display: block; }
  694. a { transition: color .18s, opacity .18s; }
  695. /* ── Typographie ──────────────────────────────────────── */
  696. .t-display {
  697. font-family: var(--f-display);
  698. font-weight: 700;
  699. line-height: 1.1;
  700. letter-spacing: -.02em;
  701. }
  702. .t-eyebrow {
  703. font-size: .68rem; font-weight: 700;
  704. letter-spacing: .18em; text-transform: uppercase;
  705. color: var(--c-gold);
  706. display: inline-flex; align-items: center; gap: 10px;
  707. }
  708. .t-eyebrow::before {
  709. content: ''; display: block;
  710. width: 28px; height: 1px; background: currentColor;
  711. }
  712. .t-muted { color: var(--c-muted); }
  713. .t-gold { color: var(--c-gold); }
  714. /* ── Boutons ──────────────────────────────────────────── */
  715. .btn-lv {
  716. display: inline-flex; align-items: center; gap: 8px;
  717. padding: 11px 24px; border-radius: var(--r-sm);
  718. font-family: var(--f-body); font-size: .9rem; font-weight: 600;
  719. cursor: pointer; text-decoration: none; border: none;
  720. transition: background .18s, transform .14s, box-shadow .18s;
  721. white-space: nowrap;
  722. }
  723. .btn-lv:hover { transform: translateY(-2px); }
  724. .btn-gold { background: var(--c-gold); color: #fff; }
  725. .btn-gold:hover { background: var(--c-gold-lt); color: #fff; }
  726. .btn-ink { background: var(--c-ink); color: #fff; }
  727. .btn-ink:hover { background: var(--c-ink-soft); color: #fff; }
  728. .btn-outline { background: transparent; color: var(--c-ink); border: 1.5px solid var(--c-border); }
  729. .btn-outline:hover { border-color: var(--c-gold); color: var(--c-gold); }
  730. .btn-outline-w { background: transparent; color: #fff; border: 1.5px solid rgba(255,255,255,.35); }
  731. .btn-outline-w:hover { border-color: #fff; background: rgba(255,255,255,.08); color: #fff; }
  732. .btn-white { background: #fff; color: var(--c-ink); box-shadow: var(--shadow-sm); }
  733. .btn-white:hover { box-shadow: var(--shadow-md); color: var(--c-ink); }
  734. /* ── Tags / Badges ────────────────────────────────────── */
  735. .badge-lv {
  736. display: inline-block;
  737. font-size: .68rem; font-weight: 700;
  738. letter-spacing: .09em; text-transform: uppercase;
  739. padding: 3px 11px; border-radius: 20px; border: 1px solid;
  740. }
  741. .badge-gold { background: rgba(201,151,43,.12); color: var(--c-gold); border-color: rgba(201,151,43,.3); }
  742. .badge-success { background: rgba(34,197,94,.12); color: #15803d; border-color: rgba(34,197,94,.3); }
  743. .badge-danger { background: rgba(239,68,68,.12); color: #b91c1c; border-color: rgba(239,68,68,.3); }
  744. .badge-info { background: rgba(59,130,246,.12); color: #1d4ed8; border-color: rgba(59,130,246,.3); }
  745. .badge-muted { background: rgba(0,0,0,.05); color: var(--c-muted);border-color: var(--c-border); }
  746. /* ── En-têtes de page (front) ─────────────────────────── */
  747. .page-header {
  748. background: var(--c-ink);
  749. padding: 60px var(--gap-content) 50px;
  750. position: relative; overflow: hidden;
  751. }
  752. .page-header__glow {
  753. position: absolute; pointer-events: none; border-radius: 50%;
  754. background: radial-gradient(circle, rgba(201,151,43,.18), transparent 70%);
  755. }
  756. .page-header__title {
  757. font-family: var(--f-display);
  758. font-size: clamp(2rem, 4vw, 3rem);
  759. font-weight: 700; color: #fff; line-height: 1.1;
  760. }
  761. .page-header__sub {
  762. color: rgba(255,255,255,.5);
  763. margin-top: 10px; font-size: .92rem;
  764. }
  765. /* ── Sections ─────────────────────────────────────────── */
  766. .section { padding: var(--gap-section) var(--gap-content); }
  767. .section--white { background: var(--c-white); }
  768. .section--ink { background: var(--c-ink); }
  769. .section--cream { background: var(--c-cream); }
  770. .content-wrap {
  771. max-width: 1280px;
  772. margin: 0 auto;
  773. padding: 56px var(--gap-content);
  774. }
  775. /* ── Cartes génériques ────────────────────────────────── */
  776. .card-lv {
  777. background: var(--c-white);
  778. border: 1px solid var(--c-border);
  779. border-radius: var(--r-md);
  780. transition: box-shadow .22s, transform .2s;
  781. }
  782. .card-lv:hover { box-shadow: var(--shadow-md); transform: translateY(-3px); }
  783. /* ── Grille auto ──────────────────────────────────────── */
  784. .grid-auto {
  785. display: grid;
  786. grid-template-columns: repeat(auto-fill, minmax(var(--col-min, 240px), 1fr));
  787. gap: var(--grid-gap, 24px);
  788. }
  789. /* ── Flash Messages ───────────────────────────────────── */
  790. .flash-stack {
  791. position: fixed; top: 16px; right: 16px; z-index: 9999;
  792. display: flex; flex-direction: column; gap: 10px;
  793. max-width: 380px; width: calc(100% - 32px);
  794. }
  795. .flash-item {
  796. display: flex; align-items: flex-start; gap: 12px;
  797. padding: 14px 16px; border-radius: var(--r-sm);
  798. background: #fff; border-left: 4px solid var(--c-gold);
  799. box-shadow: var(--shadow-md);
  800. animation: slideIn .3s ease both;
  801. }
  802. .flash-item--success { border-color: var(--c-success); }
  803. .flash-item--danger { border-color: var(--c-danger); }
  804. .flash-item--warning { border-color: var(--c-warning); }
  805. .flash-item--info { border-color: var(--c-info); }
  806. .flash-item__icon { font-size: 1rem; margin-top: 1px; }
  807. .flash-item--success .flash-item__icon { color: var(--c-success); }
  808. .flash-item--danger .flash-item__icon { color: var(--c-danger); }
  809. .flash-item--warning .flash-item__icon { color: var(--c-warning); }
  810. .flash-item--info .flash-item__icon { color: var(--c-info); }
  811. .flash-item__text { font-size: .88rem; flex: 1; line-height: 1.5; }
  812. .flash-item__close {
  813. background: none; border: none; cursor: pointer;
  814. color: var(--c-muted); font-size: 1rem; padding: 0;
  815. line-height: 1; margin-top: 1px; transition: color .15s;
  816. }
  817. .flash-item__close:hover { color: var(--c-ink); }
  818. /* ── Animations ───────────────────────────────────────── */
  819. @keyframes fadeUp {
  820. from { opacity: 0; transform: translateY(22px); }
  821. to { opacity: 1; transform: translateY(0); }
  822. }
  823. @keyframes slideIn {
  824. from { opacity: 0; transform: translateX(20px); }
  825. to { opacity: 1; transform: translateX(0); }
  826. }
  827. .anim-up { animation: fadeUp .55s ease both; }
  828. /* ── Utilitaires ──────────────────────────────────────── */
  829. .visually-hidden {
  830. position: absolute; width: 1px; height: 1px;
  831. overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap;
  832. }
  833. </style>
  834. {% block stylesheets %}{% endblock %}
  835. </head>
  836. <body class=\"host_version\">
  837. {% block main %}
  838. {# Réservé au layout backend #}
  839. {% endblock %}
  840. {% block partials %}
  841. {# Flash messages redesignés #}
  842. {% include 'layout/partials/flash_messages.html.twig' %}
  843. {% if not app.user %}
  844. {% include 'layout/partials/modal.html.twig' %}
  845. {% include 'layout/partials/loader.html.twig' %}
  846. {% include 'layout/partials/header.html.twig' %}
  847. {% endif %}
  848. {% endblock %}
  849. {% block body %}{% endblock %}
  850. {% block footer %}
  851. {% include 'layout/partials/partners.html.twig' %}
  852. {% include 'layout/partials/footer.html.twig' %}
  853. {% endblock %}
  854. {# Sauvegarde de la route courante en session #}
  855. {{ app.session.set('referer', app.request.get('_route')) }}
  856. {# ══════════════════════════════════════════════════════
  857. SCRIPTS — chargés en fin de body pour la performance
  858. ══════════════════════════════════════════════════════ #}
  859. {# ── 1. jQuery ── #}
  860. <script src=\"https://code.jquery.com/jquery-3.7.1.min.js\"
  861. integrity=\"sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=\"
  862. crossorigin=\"anonymous\"></script>
  863. {# ── 2. jQuery UI ── #}
  864. <script src=\"{{ asset('assets/js/jquery-ui.min.js') }}\"></script>
  865. {# ── 3. Bootstrap 4 bundle (inclut Popper) ── #}
  866. <script src=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.bundle.min.js\"></script>
  867. {# ── 4. Chart.js ── #}
  868. <script src=\"https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.0/chart.min.js\"></script>
  869. {# ── 5. Scripts applicatifs ── #}
  870. <script src=\"{{ asset('assets/js/jquery.mCustomScrollbar.concat.min.js') }}\"></script>
  871. <script src=\"{{ asset('assets/js/jsjquery.simpleAccordion.min.js') }}\"></script>
  872. <script src=\"{{ asset('assets/js/menu.js') }}\"></script>
  873. <script src=\"{{ asset('assets/js/all.js') }}\"></script>
  874. <script src=\"{{ asset('assets/js/front.js') }}\"></script>
  875. <script src=\"{{ asset('assets/js/custom.js') }}\"></script>
  876. <script src=\"{{ asset('assets/js/timeline.min.js') }}\"></script>
  877. <script src=\"{{ asset('assets/js/d3.v4.min.js') }}\"></script>
  878. <script>
  879. (function () {
  880. 'use strict';
  881. /* ── Sidebar toggle (backend) ──────────────────────── */
  882. \$('#toggle-btn').on('click', function (e) {
  883. e.preventDefault();
  884. if (\$(window).width() > 1199) {
  885. \$('body').toggleClass('sidebar-collapsed');
  886. \$('.side-navbar').toggleClass('shrinked');
  887. \$('.page').toggleClass('active');
  888. } else {
  889. \$('.side-navbar').toggleClass('show-sm');
  890. \$('.page').toggleClass('active-sm');
  891. }
  892. });
  893. \$(document).on('click', function (e) {
  894. if (\$(window).width() <= 1199 &&
  895. !\$(e.target).closest('.side-navbar, #toggle-btn').length) {
  896. \$('.side-navbar').removeClass('show-sm');
  897. \$('.page').removeClass('active-sm');
  898. }
  899. });
  900. /* ── Changement d'année scolaire ───────────────────── */
  901. \$('#select_year').on('change', function () {
  902. \$.ajax({
  903. type: 'POST',
  904. url: '{{ path(\"update_school_year\") }}',
  905. data: { selectedSchoolYear: \$(this).val() },
  906. success: function () { location.reload(); },
  907. error: function () { alert('Échec du changement d\\'année.'); }
  908. });
  909. });
  910. /* ── Timeline ──────────────────────────────────────── */
  911. if (typeof timeline === 'function') {
  912. timeline(document.querySelectorAll('.timeline'), {
  913. forceVerticalMode: 700,
  914. mode: 'horizontal',
  915. verticalStartPosition: 'left',
  916. visibleItems: 4
  917. });
  918. }
  919. /* ── Flash messages : fermeture manuelle ───────────── */
  920. \$(document).on('click', '.flash-item__close', function () {
  921. \$(this).closest('.flash-item').fadeOut(200, function () {
  922. \$(this).remove();
  923. });
  924. });
  925. /* ── Auto-dismiss des flash après 5s ───────────────── */
  926. setTimeout(function () {
  927. \$('.flash-item').fadeOut(400, function () { \$(this).remove(); });
  928. }, 5000);
  929. })();
  930. </script>
  931. {# ── Google Analytics ── #}
  932. <script async src=\"https://www.googletagmanager.com/gtag/js?id=UA-208287842-1\"></script>
  933. <script>
  934. window.dataLayer = window.dataLayer || [];
  935. function gtag() { dataLayer.push(arguments); }
  936. gtag('js', new Date());
  937. gtag('config', 'UA-208287842-1');
  938. </script>
  939. {% block javascripts %}{% endblock %}
  940. </body>
  941. </html>
  942. ", "layout/base.html.twig", "/var/www/bethesda/templates/layout/base.html.twig");
  943. }
  944. }