var/cache/dev/twig/f7/f73173666ea3dc3e8359ce8c5793f92d.php line 466

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