var/cache/dev/twig/7a/7a0cb9aa0749c21dc44fc893eb6cda1e.php line 56

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. /* school/index.html.twig */
  16. class __TwigTemplate_9fead5845ecafbb027012398c54b664e 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->blocks = [
  28. 'name' => [$this, 'block_name'],
  29. 'stylesheets' => [$this, 'block_stylesheets'],
  30. 'body' => [$this, 'block_body'],
  31. 'javascripts' => [$this, 'block_javascripts'],
  32. ];
  33. }
  34. protected function doGetParent(array $context): bool|string|Template|TemplateWrapper
  35. {
  36. // line 1
  37. return "layout/frontEndLayout.html.twig";
  38. }
  39. protected function doDisplay(array $context, array $blocks = []): iterable
  40. {
  41. $macros = $this->macros;
  42. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  43. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "school/index.html.twig"));
  44. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  45. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "school/index.html.twig"));
  46. $this->parent = $this->load("layout/frontEndLayout.html.twig", 1);
  47. yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));
  48. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  49. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  50. }
  51. // line 3
  52. /**
  53. * @return iterable<null|scalar|\Stringable>
  54. */
  55. public function block_name(array $context, array $blocks = []): iterable
  56. {
  57. $macros = $this->macros;
  58. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  59. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "name"));
  60. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  61. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "name"));
  62. // line 4
  63. yield " Welcome to LiveEdu
  64. ";
  65. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  66. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  67. yield from [];
  68. }
  69. // line 7
  70. /**
  71. * @return iterable<null|scalar|\Stringable>
  72. */
  73. public function block_stylesheets(array $context, array $blocks = []): iterable
  74. {
  75. $macros = $this->macros;
  76. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  77. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "stylesheets"));
  78. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  79. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "stylesheets"));
  80. // line 8
  81. yield from $this->yieldParentBlock("stylesheets", $context, $blocks);
  82. yield "
  83. <link href=\"https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700;900&family=DM+Sans:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">
  84. <style>
  85. :root {
  86. --gold: #C9A84C;
  87. --gold-light: #E8D5A3;
  88. --navy: #0A1628;
  89. --navy-mid: #112244;
  90. --white: #FAFAF8;
  91. --cream: #F5F0E8;
  92. --text-muted: #8A8A8A;
  93. --accent: #2C6BAD;
  94. }
  95. * { margin: 0; padding: 0; box-sizing: border-box; }
  96. body {
  97. font-family: 'DM Sans', sans-serif;
  98. background: var(--white);
  99. color: var(--navy);
  100. }
  101. /* ─── HERO SLIDER ─────────────────────────────────────── */
  102. .hero-slider {
  103. position: relative;
  104. height: 100vh;
  105. min-height: 600px;
  106. overflow: hidden;
  107. }
  108. .carousel-item-custom {
  109. position: absolute;
  110. inset: 0;
  111. opacity: 0;
  112. transition: opacity 1s ease;
  113. background-size: cover;
  114. background-position: center;
  115. }
  116. .carousel-item-custom.active { opacity: 1; }
  117. .hero-overlay {
  118. position: absolute;
  119. inset: 0;
  120. background: linear-gradient(
  121. 135deg,
  122. rgba(10,22,40,0.85) 0%,
  123. rgba(17,34,68,0.60) 60%,
  124. rgba(201,168,76,0.15) 100%
  125. );
  126. }
  127. .hero-content {
  128. position: absolute;
  129. inset: 0;
  130. display: flex;
  131. flex-direction: column;
  132. justify-content: center;
  133. padding: 0 8vw;
  134. max-width: 900px;
  135. }
  136. .hero-label {
  137. font-family: 'DM Sans', sans-serif;
  138. font-size: 0.75rem;
  139. font-weight: 600;
  140. letter-spacing: 0.35em;
  141. text-transform: uppercase;
  142. color: var(--gold);
  143. margin-bottom: 1.5rem;
  144. opacity: 0;
  145. transform: translateY(20px);
  146. animation: fadeUp 0.8s ease 0.3s forwards;
  147. }
  148. .hero-title {
  149. font-family: 'Playfair Display', serif;
  150. font-size: clamp(2.5rem, 6vw, 5rem);
  151. font-weight: 900;
  152. line-height: 1.1;
  153. color: var(--white);
  154. margin-bottom: 1.5rem;
  155. opacity: 0;
  156. transform: translateY(30px);
  157. animation: fadeUp 0.9s ease 0.5s forwards;
  158. }
  159. .hero-title em {
  160. font-style: italic;
  161. color: var(--gold);
  162. }
  163. .hero-sub {
  164. font-size: 1.1rem;
  165. font-weight: 300;
  166. color: rgba(255,255,255,0.75);
  167. max-width: 480px;
  168. line-height: 1.7;
  169. opacity: 0;
  170. transform: translateY(20px);
  171. animation: fadeUp 0.9s ease 0.7s forwards;
  172. }
  173. .hero-cta {
  174. margin-top: 2.5rem;
  175. display: flex;
  176. gap: 1rem;
  177. opacity: 0;
  178. animation: fadeUp 0.9s ease 0.9s forwards;
  179. }
  180. .btn-gold {
  181. padding: 0.85rem 2rem;
  182. background: var(--gold);
  183. color: var(--navy);
  184. font-weight: 600;
  185. font-size: 0.9rem;
  186. letter-spacing: 0.05em;
  187. border: none;
  188. cursor: pointer;
  189. text-decoration: none;
  190. transition: all 0.3s ease;
  191. }
  192. .btn-gold:hover { background: var(--gold-light); transform: translateY(-2px); }
  193. .btn-outline-white {
  194. padding: 0.85rem 2rem;
  195. background: transparent;
  196. color: var(--white);
  197. font-weight: 500;
  198. font-size: 0.9rem;
  199. letter-spacing: 0.05em;
  200. border: 1px solid rgba(255,255,255,0.4);
  201. cursor: pointer;
  202. text-decoration: none;
  203. transition: all 0.3s ease;
  204. }
  205. .btn-outline-white:hover { border-color: var(--gold); color: var(--gold); }
  206. /* Slider decorative bar */
  207. .hero-bar {
  208. position: absolute;
  209. right: 0;
  210. top: 0;
  211. bottom: 0;
  212. width: 6px;
  213. background: var(--gold);
  214. }
  215. /* Slide counter */
  216. .slide-counter {
  217. position: absolute;
  218. bottom: 2.5rem;
  219. right: 3rem;
  220. color: rgba(255,255,255,0.5);
  221. font-size: 0.8rem;
  222. letter-spacing: 0.2em;
  223. font-weight: 500;
  224. }
  225. .slide-counter span { color: var(--gold); font-size: 1.1rem; }
  226. /* Carousel indicators */
  227. .hero-indicators {
  228. position: absolute;
  229. bottom: 2.5rem;
  230. left: 8vw;
  231. display: flex;
  232. gap: 0.6rem;
  233. list-style: none;
  234. }
  235. .hero-indicators li {
  236. width: 28px;
  237. height: 2px;
  238. background: rgba(255,255,255,0.3);
  239. cursor: pointer;
  240. transition: all 0.3s;
  241. }
  242. .hero-indicators li.active {
  243. width: 52px;
  244. background: var(--gold);
  245. }
  246. /* Carousel controls */
  247. .hero-prev, .hero-next {
  248. position: absolute;
  249. top: 50%;
  250. transform: translateY(-50%);
  251. width: 52px;
  252. height: 52px;
  253. border: 1px solid rgba(255,255,255,0.25);
  254. background: rgba(10,22,40,0.4);
  255. backdrop-filter: blur(8px);
  256. color: white;
  257. display: flex;
  258. align-items: center;
  259. justify-content: center;
  260. font-size: 1.1rem;
  261. cursor: pointer;
  262. transition: all 0.3s;
  263. text-decoration: none;
  264. z-index: 10;
  265. }
  266. .hero-prev { left: 2rem; }
  267. .hero-next { right: 2rem; }
  268. .hero-prev:hover, .hero-next:hover {
  269. background: var(--gold);
  270. border-color: var(--gold);
  271. color: var(--navy);
  272. }
  273. @keyframes fadeUp {
  274. to { opacity: 1; transform: translateY(0); }
  275. }
  276. /* ─── STATS BAR ──────────────────────────────────────── */
  277. .stats-bar {
  278. background: var(--navy);
  279. padding: 0;
  280. display: grid;
  281. grid-template-columns: repeat(4, 1fr);
  282. }
  283. .stat-item {
  284. padding: 2rem 1.5rem;
  285. text-align: center;
  286. border-right: 1px solid rgba(255,255,255,0.06);
  287. transition: background 0.3s;
  288. }
  289. .stat-item:last-child { border-right: none; }
  290. .stat-item:hover { background: rgba(201,168,76,0.08); }
  291. .stat-num {
  292. font-family: 'Playfair Display', serif;
  293. font-size: 2rem;
  294. font-weight: 700;
  295. color: var(--gold);
  296. display: block;
  297. }
  298. .stat-label {
  299. font-size: 0.75rem;
  300. letter-spacing: 0.12em;
  301. text-transform: uppercase;
  302. color: rgba(255,255,255,0.45);
  303. margin-top: 0.3rem;
  304. }
  305. /* ─── SECTION HEADING ────────────────────────────────── */
  306. .section-header {
  307. text-align: center;
  308. padding: 5rem 2rem 3rem;
  309. }
  310. .section-tag {
  311. display: inline-block;
  312. font-size: 0.7rem;
  313. font-weight: 600;
  314. letter-spacing: 0.35em;
  315. text-transform: uppercase;
  316. color: var(--gold);
  317. margin-bottom: 1rem;
  318. padding: 0.35rem 1rem;
  319. border: 1px solid var(--gold-light);
  320. background: rgba(201,168,76,0.06);
  321. }
  322. .section-title {
  323. font-family: 'Playfair Display', serif;
  324. font-size: clamp(1.8rem, 4vw, 2.8rem);
  325. font-weight: 700;
  326. color: var(--navy);
  327. line-height: 1.2;
  328. }
  329. .section-title em {
  330. font-style: italic;
  331. color: var(--accent);
  332. }
  333. .section-divider {
  334. width: 60px;
  335. height: 3px;
  336. background: var(--gold);
  337. margin: 1.5rem auto 0;
  338. }
  339. .section-sub {
  340. max-width: 520px;
  341. margin: 1.2rem auto 0;
  342. color: var(--text-muted);
  343. font-size: 0.95rem;
  344. line-height: 1.7;
  345. }
  346. /* ─── CHARTS SECTION ─────────────────────────────────── */
  347. .charts-section {
  348. background: var(--cream);
  349. padding-bottom: 5rem;
  350. }
  351. .charts-grid {
  352. display: grid;
  353. grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  354. gap: 1.5rem;
  355. padding: 0 4vw 2rem;
  356. max-width: 1400px;
  357. margin: 0 auto;
  358. }
  359. .chart-card {
  360. background: var(--white);
  361. border: 1px solid rgba(0,0,0,0.06);
  362. padding: 1.5rem 1rem 1.25rem;
  363. text-align: center;
  364. transition: all 0.35s ease;
  365. position: relative;
  366. overflow: hidden;
  367. }
  368. .chart-card::before {
  369. content: '';
  370. position: absolute;
  371. top: 0; left: 0; right: 0;
  372. height: 3px;
  373. background: linear-gradient(90deg, var(--gold), var(--accent));
  374. transform: scaleX(0);
  375. transition: transform 0.35s ease;
  376. }
  377. .chart-card:hover {
  378. transform: translateY(-6px);
  379. box-shadow: 0 20px 48px rgba(10,22,40,0.10);
  380. }
  381. .chart-card:hover::before { transform: scaleX(1); }
  382. .chart-card canvas {
  383. max-width: 180px;
  384. margin: 0 auto;
  385. display: block;
  386. }
  387. /* ─── FOOTER ACCENT ──────────────────────────────────── */
  388. .page-footer-accent {
  389. background: var(--navy);
  390. text-align: center;
  391. padding: 2rem;
  392. color: rgba(255,255,255,0.35);
  393. font-size: 0.8rem;
  394. letter-spacing: 0.1em;
  395. }
  396. .page-footer-accent span { color: var(--gold); }
  397. /* ─── RESPONSIVE ─────────────────────────────────────── */
  398. @media (max-width: 768px) {
  399. .stats-bar { grid-template-columns: repeat(2, 1fr); }
  400. .hero-content { padding: 0 5vw; }
  401. .hero-prev { left: 0.75rem; }
  402. .hero-next { right: 0.75rem; }
  403. }
  404. @media (max-width: 480px) {
  405. .stats-bar { grid-template-columns: 1fr 1fr; }
  406. .charts-grid { grid-template-columns: 1fr 1fr; gap: 1rem; }
  407. }
  408. </style>
  409. ";
  410. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  411. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  412. yield from [];
  413. }
  414. // line 372
  415. /**
  416. * @return iterable<null|scalar|\Stringable>
  417. */
  418. public function block_body(array $context, array $blocks = []): iterable
  419. {
  420. $macros = $this->macros;
  421. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  422. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  423. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  424. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  425. // line 373
  426. yield "
  427. ";
  428. // line 375
  429. yield "<div id=\"heroCarousel\" class=\"hero-slider\">
  430. ";
  431. // line 378
  432. yield "<div class=\"carousel-item-custom active\"
  433. style=\"background-image:url(";
  434. // line 379
  435. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/images/slider-01.jpg"), "html", null, true);
  436. yield ");\">
  437. <div class=\"hero-overlay\"></div>
  438. <div class=\"hero-content\">
  439. <p class=\"hero-label\">Excellence · Innovation · Bilingual Education</p>
  440. <h1 class=\"hero-title\">
  441. ";
  442. // line 384
  443. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["french_school_name"]) || array_key_exists("french_school_name", $context) ? $context["french_school_name"] : (function () { throw new RuntimeError('Variable "french_school_name" does not exist.', 384, $this->source); })()), "html", null, true);
  444. yield "<br>
  445. <em>";
  446. // line 385
  447. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["english_school_name"]) || array_key_exists("english_school_name", $context) ? $context["english_school_name"] : (function () { throw new RuntimeError('Variable "english_school_name" does not exist.', 385, $this->source); })()), "html", null, true);
  448. yield "</em>
  449. </h1>
  450. <p class=\"hero-sub\">";
  451. // line 387
  452. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["french_slogan"]) || array_key_exists("french_slogan", $context) ? $context["french_slogan"] : (function () { throw new RuntimeError('Variable "french_slogan" does not exist.', 387, $this->source); })()), "html", null, true);
  453. yield " &nbsp;·&nbsp; ";
  454. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["english_slogan"]) || array_key_exists("english_slogan", $context) ? $context["english_slogan"] : (function () { throw new RuntimeError('Variable "english_slogan" does not exist.', 387, $this->source); })()), "html", null, true);
  455. yield "</p>
  456. <div class=\"hero-cta\">
  457. <a href=\"#officialExams\" class=\"btn-gold\">Voir les résultats</a>
  458. <a href=\"#\" class=\"btn-outline-white\">En savoir plus</a>
  459. </div>
  460. </div>
  461. </div>
  462. ";
  463. // line 396
  464. yield "<div class=\"carousel-item-custom\"
  465. style=\"background-image:url(";
  466. // line 397
  467. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/images/slider-02.jpg"), "html", null, true);
  468. yield ");\">
  469. <div class=\"hero-overlay\"></div>
  470. <div class=\"hero-content\">
  471. <p class=\"hero-label\">Digital · Connected · Modern</p>
  472. <h1 class=\"hero-title\">
  473. <em>LiveEdu</em><br>
  474. Software Online Services
  475. </h1>
  476. <p class=\"hero-sub\">A complete digital ecosystem built for educators, students, and administrators.</p>
  477. <div class=\"hero-cta\">
  478. <a href=\"#\" class=\"btn-gold\">Découvrir la plateforme</a>
  479. </div>
  480. </div>
  481. </div>
  482. ";
  483. // line 413
  484. yield "<div class=\"carousel-item-custom\"
  485. style=\"background-image:url(";
  486. // line 414
  487. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("assets/images/slide_04.PNG"), "html", null, true);
  488. yield ");\">
  489. <div class=\"hero-overlay\"></div>
  490. <div class=\"hero-content\">
  491. <p class=\"hero-label\">Transparency · Quality · Trust</p>
  492. <h1 class=\"hero-title\">
  493. <em>";
  494. // line 419
  495. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["english_school_name"]) || array_key_exists("english_school_name", $context) ? $context["english_school_name"] : (function () { throw new RuntimeError('Variable "english_school_name" does not exist.', 419, $this->source); })()), "html", null, true);
  496. yield "</em><br>
  497. ";
  498. // line 420
  499. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["english_slogan"]) || array_key_exists("english_slogan", $context) ? $context["english_slogan"] : (function () { throw new RuntimeError('Variable "english_slogan" does not exist.', 420, $this->source); })()), "html", null, true);
  500. yield "
  501. </h1>
  502. <p class=\"hero-sub\">Real-time data, open reporting and trusted results — for every student, every year.</p>
  503. <div class=\"hero-cta\">
  504. <a href=\"#officialExams\" class=\"btn-gold\">Voir les statistiques</a>
  505. </div>
  506. </div>
  507. </div>
  508. ";
  509. // line 430
  510. yield " <div class=\"hero-bar\"></div>
  511. ";
  512. // line 433
  513. yield " <ol class=\"hero-indicators\" id=\"heroIndicators\">
  514. <li class=\"active\" data-slide=\"0\"></li>
  515. <li data-slide=\"1\"></li>
  516. <li data-slide=\"2\"></li>
  517. </ol>
  518. ";
  519. // line 440
  520. yield " <div class=\"slide-counter\">
  521. <span id=\"slideNum\">01</span> / 03
  522. </div>
  523. ";
  524. // line 445
  525. yield " <a class=\"hero-prev\" id=\"heroPrev\" href=\"#\">
  526. <i class=\"fa fa-angle-left\"></i>
  527. </a>
  528. <a class=\"hero-next\" id=\"heroNext\" href=\"#\">
  529. <i class=\"fa fa-angle-right\"></i>
  530. </a>
  531. </div>
  532. ";
  533. // line 454
  534. yield "<div class=\"stats-bar\">
  535. <div class=\"stat-item\">
  536. <span class=\"stat-num\">98%</span>
  537. <span class=\"stat-label\">Taux d'admission</span>
  538. </div>
  539. <div class=\"stat-item\">
  540. <span class=\"stat-num\">400+</span>
  541. <span class=\"stat-label\">Élèves inscrits</span>
  542. </div>
  543. <div class=\"stat-item\">
  544. <span class=\"stat-num\">50+</span>
  545. <span class=\"stat-label\">Enseignants qualifiés</span>
  546. </div>
  547. <div class=\"stat-item\">
  548. <span class=\"stat-num\">";
  549. // line 468
  550. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["year"]) || array_key_exists("year", $context) ? $context["year"] : (function () { throw new RuntimeError('Variable "year" does not exist.', 468, $this->source); })()), "code", [], "any", false, false, false, 468), "html", null, true);
  551. yield "</span>
  552. <span class=\"stat-label\">Année académique</span>
  553. </div>
  554. </div>
  555. ";
  556. // line 474
  557. yield "<section class=\"charts-section\" id=\"officialExams\">
  558. <div class=\"section-header\">
  559. <span class=\"section-tag\">Résultats officiels</span>
  560. <h2 class=\"section-title\">
  561. Taux de réussite aux examens<br>
  562. session <em>";
  563. // line 479
  564. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["year"]) || array_key_exists("year", $context) ? $context["year"] : (function () { throw new RuntimeError('Variable "year" does not exist.', 479, $this->source); })()), "code", [], "any", false, false, false, 479), "html", null, true);
  565. yield "</em>
  566. </h2>
  567. <div class=\"section-divider\"></div>
  568. <p class=\"section-sub\">
  569. Statistiques détaillées par série et par niveau pour la session officielle en cours.
  570. </p>
  571. </div>
  572. <div class=\"charts-grid\">
  573. ";
  574. // line 488
  575. $context['_parent'] = $context;
  576. $context['_seq'] = CoreExtension::ensureTraversable(Twig\Extension\CoreExtension::keys((isset($context["results"]) || array_key_exists("results", $context) ? $context["results"] : (function () { throw new RuntimeError('Variable "results" does not exist.', 488, $this->source); })())));
  577. foreach ($context['_seq'] as $context["_key"] => $context["key"]) {
  578. // line 489
  579. yield " <div class=\"chart-card\">
  580. <canvas id=\"";
  581. // line 490
  582. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["key"], "html", null, true);
  583. yield "\" height=\"160\"
  584. data-exam-objects=\"";
  585. // line 491
  586. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["results"]) || array_key_exists("results", $context) ? $context["results"] : (function () { throw new RuntimeError('Variable "results" does not exist.', 491, $this->source); })()), $context["key"], [], "array", false, false, false, 491), "html", null, true);
  587. yield "\"></canvas>
  588. </div>
  589. ";
  590. }
  591. $_parent = $context['_parent'];
  592. unset($context['_seq'], $context['_key'], $context['key'], $context['_parent']);
  593. $context = array_intersect_key($context, $_parent) + $_parent;
  594. // line 494
  595. yield " </div>
  596. </section>
  597. ";
  598. // line 498
  599. yield "<div class=\"page-footer-accent\">
  600. Propulsé par <span>LiveEdu</span> · Tous droits réservés ";
  601. // line 499
  602. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatDate("now", "Y"), "html", null, true);
  603. yield "
  604. </div>
  605. ";
  606. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  607. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  608. yield from [];
  609. }
  610. // line 504
  611. /**
  612. * @return iterable<null|scalar|\Stringable>
  613. */
  614. public function block_javascripts(array $context, array $blocks = []): iterable
  615. {
  616. $macros = $this->macros;
  617. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  618. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
  619. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  620. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
  621. // line 505
  622. yield from $this->yieldParentBlock("javascripts", $context, $blocks);
  623. yield "
  624. <script>
  625. /* ── Custom Carousel ───────────────────────────────────────── */
  626. (function () {
  627. const slides = document.querySelectorAll('.carousel-item-custom');
  628. const indicators = document.querySelectorAll('#heroIndicators li');
  629. const slideNum = document.getElementById('slideNum');
  630. let current = 0, timer;
  631. function goTo(n) {
  632. slides[current].classList.remove('active');
  633. indicators[current].classList.remove('active');
  634. current = (n + slides.length) % slides.length;
  635. slides[current].classList.add('active');
  636. indicators[current].classList.add('active');
  637. slideNum.textContent = String(current + 1).padStart(2, '0');
  638. }
  639. function autoPlay() { timer = setInterval(() => goTo(current + 1), 5500); }
  640. function resetTimer() { clearInterval(timer); autoPlay(); }
  641. document.getElementById('heroPrev').addEventListener('click', e => {
  642. e.preventDefault(); goTo(current - 1); resetTimer();
  643. });
  644. document.getElementById('heroNext').addEventListener('click', e => {
  645. e.preventDefault(); goTo(current + 1); resetTimer();
  646. });
  647. indicators.forEach(li => {
  648. li.addEventListener('click', () => { goTo(+li.dataset.slide); resetTimer(); });
  649. });
  650. autoPlay();
  651. })();
  652. /* ── Charts ─────────────────────────────────────────────────── */
  653. const palette = [
  654. '#C9A84C','#2C6BAD','#1D8A6E','#D9534F',
  655. '#7B5EA7','#F0A500','#2E86AB','#A23B72'
  656. ];
  657. const randomColor = (type, idx) =>
  658. type === 'ECHEC' ? '#D9534F' : palette[idx % palette.length];
  659. const drawCanvas = (examData, canvasId, name) => {
  660. const el = document.getElementById(canvasId);
  661. if (!el || !examData) return;
  662. const parsed = JSON.parse(examData);
  663. const values = parsed.mentionCountCategories.map(Number);
  664. const colors = parsed.mentionCategories.map((cat, i) => randomColor(cat, i));
  665. new Chart(el, {
  666. type: 'doughnut',
  667. data: {
  668. labels: parsed.mentionCategories,
  669. datasets: [{ data: values, backgroundColor: colors, borderWidth: 0 }]
  670. },
  671. options: {
  672. cutout: '68%',
  673. animation: { animateRotate: true, duration: 1000 },
  674. plugins: {
  675. legend: { display: false },
  676. title: {
  677. display: true,
  678. text: name,
  679. color: '#0A1628',
  680. font: { size: 13, family: \"'DM Sans', sans-serif\", weight: '600' },
  681. position: 'bottom',
  682. padding: { top: 14 }
  683. }
  684. }
  685. }
  686. });
  687. };
  688. ";
  689. // line 579
  690. $context['_parent'] = $context;
  691. $context['_seq'] = CoreExtension::ensureTraversable(Twig\Extension\CoreExtension::keys((isset($context["results"]) || array_key_exists("results", $context) ? $context["results"] : (function () { throw new RuntimeError('Variable "results" does not exist.', 579, $this->source); })())));
  692. foreach ($context['_seq'] as $context["_key"] => $context["key"]) {
  693. // line 580
  694. yield "drawCanvas(
  695. document.getElementById('";
  696. // line 581
  697. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["key"], "html", null, true);
  698. yield "')?.dataset?.examObjects,
  699. '";
  700. // line 582
  701. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["key"], "html", null, true);
  702. yield "',
  703. '";
  704. // line 583
  705. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::titleCase($this->env->getCharset(), Twig\Extension\CoreExtension::replace($context["key"], ["_" => " "])), "html", null, true);
  706. yield "'
  707. );
  708. ";
  709. }
  710. $_parent = $context['_parent'];
  711. unset($context['_seq'], $context['_key'], $context['key'], $context['_parent']);
  712. $context = array_intersect_key($context, $_parent) + $_parent;
  713. // line 586
  714. yield "</script>
  715. ";
  716. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  717. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  718. yield from [];
  719. }
  720. /**
  721. * @codeCoverageIgnore
  722. */
  723. public function getTemplateName(): string
  724. {
  725. return "school/index.html.twig";
  726. }
  727. /**
  728. * @codeCoverageIgnore
  729. */
  730. public function isTraitable(): bool
  731. {
  732. return false;
  733. }
  734. /**
  735. * @codeCoverageIgnore
  736. */
  737. public function getDebugInfo(): array
  738. {
  739. return array ( 807 => 586, 798 => 583, 794 => 582, 790 => 581, 787 => 580, 783 => 579, 706 => 505, 693 => 504, 678 => 499, 675 => 498, 670 => 494, 661 => 491, 657 => 490, 654 => 489, 650 => 488, 638 => 479, 631 => 474, 623 => 468, 607 => 454, 597 => 445, 591 => 440, 583 => 433, 579 => 430, 567 => 420, 563 => 419, 555 => 414, 552 => 413, 534 => 397, 531 => 396, 518 => 387, 513 => 385, 509 => 384, 501 => 379, 498 => 378, 494 => 375, 491 => 373, 478 => 372, 104 => 8, 91 => 7, 79 => 4, 66 => 3, 43 => 1,);
  740. }
  741. public function getSourceContext(): Source
  742. {
  743. return new Source("{% extends 'layout/frontEndLayout.html.twig' %}
  744. {% block name %}
  745. Welcome to LiveEdu
  746. {% endblock %}
  747. {% block stylesheets %}
  748. {{ parent() }}
  749. <link href=\"https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700;900&family=DM+Sans:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">
  750. <style>
  751. :root {
  752. --gold: #C9A84C;
  753. --gold-light: #E8D5A3;
  754. --navy: #0A1628;
  755. --navy-mid: #112244;
  756. --white: #FAFAF8;
  757. --cream: #F5F0E8;
  758. --text-muted: #8A8A8A;
  759. --accent: #2C6BAD;
  760. }
  761. * { margin: 0; padding: 0; box-sizing: border-box; }
  762. body {
  763. font-family: 'DM Sans', sans-serif;
  764. background: var(--white);
  765. color: var(--navy);
  766. }
  767. /* ─── HERO SLIDER ─────────────────────────────────────── */
  768. .hero-slider {
  769. position: relative;
  770. height: 100vh;
  771. min-height: 600px;
  772. overflow: hidden;
  773. }
  774. .carousel-item-custom {
  775. position: absolute;
  776. inset: 0;
  777. opacity: 0;
  778. transition: opacity 1s ease;
  779. background-size: cover;
  780. background-position: center;
  781. }
  782. .carousel-item-custom.active { opacity: 1; }
  783. .hero-overlay {
  784. position: absolute;
  785. inset: 0;
  786. background: linear-gradient(
  787. 135deg,
  788. rgba(10,22,40,0.85) 0%,
  789. rgba(17,34,68,0.60) 60%,
  790. rgba(201,168,76,0.15) 100%
  791. );
  792. }
  793. .hero-content {
  794. position: absolute;
  795. inset: 0;
  796. display: flex;
  797. flex-direction: column;
  798. justify-content: center;
  799. padding: 0 8vw;
  800. max-width: 900px;
  801. }
  802. .hero-label {
  803. font-family: 'DM Sans', sans-serif;
  804. font-size: 0.75rem;
  805. font-weight: 600;
  806. letter-spacing: 0.35em;
  807. text-transform: uppercase;
  808. color: var(--gold);
  809. margin-bottom: 1.5rem;
  810. opacity: 0;
  811. transform: translateY(20px);
  812. animation: fadeUp 0.8s ease 0.3s forwards;
  813. }
  814. .hero-title {
  815. font-family: 'Playfair Display', serif;
  816. font-size: clamp(2.5rem, 6vw, 5rem);
  817. font-weight: 900;
  818. line-height: 1.1;
  819. color: var(--white);
  820. margin-bottom: 1.5rem;
  821. opacity: 0;
  822. transform: translateY(30px);
  823. animation: fadeUp 0.9s ease 0.5s forwards;
  824. }
  825. .hero-title em {
  826. font-style: italic;
  827. color: var(--gold);
  828. }
  829. .hero-sub {
  830. font-size: 1.1rem;
  831. font-weight: 300;
  832. color: rgba(255,255,255,0.75);
  833. max-width: 480px;
  834. line-height: 1.7;
  835. opacity: 0;
  836. transform: translateY(20px);
  837. animation: fadeUp 0.9s ease 0.7s forwards;
  838. }
  839. .hero-cta {
  840. margin-top: 2.5rem;
  841. display: flex;
  842. gap: 1rem;
  843. opacity: 0;
  844. animation: fadeUp 0.9s ease 0.9s forwards;
  845. }
  846. .btn-gold {
  847. padding: 0.85rem 2rem;
  848. background: var(--gold);
  849. color: var(--navy);
  850. font-weight: 600;
  851. font-size: 0.9rem;
  852. letter-spacing: 0.05em;
  853. border: none;
  854. cursor: pointer;
  855. text-decoration: none;
  856. transition: all 0.3s ease;
  857. }
  858. .btn-gold:hover { background: var(--gold-light); transform: translateY(-2px); }
  859. .btn-outline-white {
  860. padding: 0.85rem 2rem;
  861. background: transparent;
  862. color: var(--white);
  863. font-weight: 500;
  864. font-size: 0.9rem;
  865. letter-spacing: 0.05em;
  866. border: 1px solid rgba(255,255,255,0.4);
  867. cursor: pointer;
  868. text-decoration: none;
  869. transition: all 0.3s ease;
  870. }
  871. .btn-outline-white:hover { border-color: var(--gold); color: var(--gold); }
  872. /* Slider decorative bar */
  873. .hero-bar {
  874. position: absolute;
  875. right: 0;
  876. top: 0;
  877. bottom: 0;
  878. width: 6px;
  879. background: var(--gold);
  880. }
  881. /* Slide counter */
  882. .slide-counter {
  883. position: absolute;
  884. bottom: 2.5rem;
  885. right: 3rem;
  886. color: rgba(255,255,255,0.5);
  887. font-size: 0.8rem;
  888. letter-spacing: 0.2em;
  889. font-weight: 500;
  890. }
  891. .slide-counter span { color: var(--gold); font-size: 1.1rem; }
  892. /* Carousel indicators */
  893. .hero-indicators {
  894. position: absolute;
  895. bottom: 2.5rem;
  896. left: 8vw;
  897. display: flex;
  898. gap: 0.6rem;
  899. list-style: none;
  900. }
  901. .hero-indicators li {
  902. width: 28px;
  903. height: 2px;
  904. background: rgba(255,255,255,0.3);
  905. cursor: pointer;
  906. transition: all 0.3s;
  907. }
  908. .hero-indicators li.active {
  909. width: 52px;
  910. background: var(--gold);
  911. }
  912. /* Carousel controls */
  913. .hero-prev, .hero-next {
  914. position: absolute;
  915. top: 50%;
  916. transform: translateY(-50%);
  917. width: 52px;
  918. height: 52px;
  919. border: 1px solid rgba(255,255,255,0.25);
  920. background: rgba(10,22,40,0.4);
  921. backdrop-filter: blur(8px);
  922. color: white;
  923. display: flex;
  924. align-items: center;
  925. justify-content: center;
  926. font-size: 1.1rem;
  927. cursor: pointer;
  928. transition: all 0.3s;
  929. text-decoration: none;
  930. z-index: 10;
  931. }
  932. .hero-prev { left: 2rem; }
  933. .hero-next { right: 2rem; }
  934. .hero-prev:hover, .hero-next:hover {
  935. background: var(--gold);
  936. border-color: var(--gold);
  937. color: var(--navy);
  938. }
  939. @keyframes fadeUp {
  940. to { opacity: 1; transform: translateY(0); }
  941. }
  942. /* ─── STATS BAR ──────────────────────────────────────── */
  943. .stats-bar {
  944. background: var(--navy);
  945. padding: 0;
  946. display: grid;
  947. grid-template-columns: repeat(4, 1fr);
  948. }
  949. .stat-item {
  950. padding: 2rem 1.5rem;
  951. text-align: center;
  952. border-right: 1px solid rgba(255,255,255,0.06);
  953. transition: background 0.3s;
  954. }
  955. .stat-item:last-child { border-right: none; }
  956. .stat-item:hover { background: rgba(201,168,76,0.08); }
  957. .stat-num {
  958. font-family: 'Playfair Display', serif;
  959. font-size: 2rem;
  960. font-weight: 700;
  961. color: var(--gold);
  962. display: block;
  963. }
  964. .stat-label {
  965. font-size: 0.75rem;
  966. letter-spacing: 0.12em;
  967. text-transform: uppercase;
  968. color: rgba(255,255,255,0.45);
  969. margin-top: 0.3rem;
  970. }
  971. /* ─── SECTION HEADING ────────────────────────────────── */
  972. .section-header {
  973. text-align: center;
  974. padding: 5rem 2rem 3rem;
  975. }
  976. .section-tag {
  977. display: inline-block;
  978. font-size: 0.7rem;
  979. font-weight: 600;
  980. letter-spacing: 0.35em;
  981. text-transform: uppercase;
  982. color: var(--gold);
  983. margin-bottom: 1rem;
  984. padding: 0.35rem 1rem;
  985. border: 1px solid var(--gold-light);
  986. background: rgba(201,168,76,0.06);
  987. }
  988. .section-title {
  989. font-family: 'Playfair Display', serif;
  990. font-size: clamp(1.8rem, 4vw, 2.8rem);
  991. font-weight: 700;
  992. color: var(--navy);
  993. line-height: 1.2;
  994. }
  995. .section-title em {
  996. font-style: italic;
  997. color: var(--accent);
  998. }
  999. .section-divider {
  1000. width: 60px;
  1001. height: 3px;
  1002. background: var(--gold);
  1003. margin: 1.5rem auto 0;
  1004. }
  1005. .section-sub {
  1006. max-width: 520px;
  1007. margin: 1.2rem auto 0;
  1008. color: var(--text-muted);
  1009. font-size: 0.95rem;
  1010. line-height: 1.7;
  1011. }
  1012. /* ─── CHARTS SECTION ─────────────────────────────────── */
  1013. .charts-section {
  1014. background: var(--cream);
  1015. padding-bottom: 5rem;
  1016. }
  1017. .charts-grid {
  1018. display: grid;
  1019. grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  1020. gap: 1.5rem;
  1021. padding: 0 4vw 2rem;
  1022. max-width: 1400px;
  1023. margin: 0 auto;
  1024. }
  1025. .chart-card {
  1026. background: var(--white);
  1027. border: 1px solid rgba(0,0,0,0.06);
  1028. padding: 1.5rem 1rem 1.25rem;
  1029. text-align: center;
  1030. transition: all 0.35s ease;
  1031. position: relative;
  1032. overflow: hidden;
  1033. }
  1034. .chart-card::before {
  1035. content: '';
  1036. position: absolute;
  1037. top: 0; left: 0; right: 0;
  1038. height: 3px;
  1039. background: linear-gradient(90deg, var(--gold), var(--accent));
  1040. transform: scaleX(0);
  1041. transition: transform 0.35s ease;
  1042. }
  1043. .chart-card:hover {
  1044. transform: translateY(-6px);
  1045. box-shadow: 0 20px 48px rgba(10,22,40,0.10);
  1046. }
  1047. .chart-card:hover::before { transform: scaleX(1); }
  1048. .chart-card canvas {
  1049. max-width: 180px;
  1050. margin: 0 auto;
  1051. display: block;
  1052. }
  1053. /* ─── FOOTER ACCENT ──────────────────────────────────── */
  1054. .page-footer-accent {
  1055. background: var(--navy);
  1056. text-align: center;
  1057. padding: 2rem;
  1058. color: rgba(255,255,255,0.35);
  1059. font-size: 0.8rem;
  1060. letter-spacing: 0.1em;
  1061. }
  1062. .page-footer-accent span { color: var(--gold); }
  1063. /* ─── RESPONSIVE ─────────────────────────────────────── */
  1064. @media (max-width: 768px) {
  1065. .stats-bar { grid-template-columns: repeat(2, 1fr); }
  1066. .hero-content { padding: 0 5vw; }
  1067. .hero-prev { left: 0.75rem; }
  1068. .hero-next { right: 0.75rem; }
  1069. }
  1070. @media (max-width: 480px) {
  1071. .stats-bar { grid-template-columns: 1fr 1fr; }
  1072. .charts-grid { grid-template-columns: 1fr 1fr; gap: 1rem; }
  1073. }
  1074. </style>
  1075. {% endblock %}
  1076. {% block body %}
  1077. {# ── HERO CAROUSEL ────────────────────────────────────────── #}
  1078. <div id=\"heroCarousel\" class=\"hero-slider\">
  1079. {# Slide 1 #}
  1080. <div class=\"carousel-item-custom active\"
  1081. style=\"background-image:url({{ asset('assets/images/slider-01.jpg') }});\">
  1082. <div class=\"hero-overlay\"></div>
  1083. <div class=\"hero-content\">
  1084. <p class=\"hero-label\">Excellence · Innovation · Bilingual Education</p>
  1085. <h1 class=\"hero-title\">
  1086. {{ french_school_name }}<br>
  1087. <em>{{ english_school_name }}</em>
  1088. </h1>
  1089. <p class=\"hero-sub\">{{ french_slogan }} &nbsp;·&nbsp; {{ english_slogan }}</p>
  1090. <div class=\"hero-cta\">
  1091. <a href=\"#officialExams\" class=\"btn-gold\">Voir les résultats</a>
  1092. <a href=\"#\" class=\"btn-outline-white\">En savoir plus</a>
  1093. </div>
  1094. </div>
  1095. </div>
  1096. {# Slide 2 #}
  1097. <div class=\"carousel-item-custom\"
  1098. style=\"background-image:url({{ asset('assets/images/slider-02.jpg') }});\">
  1099. <div class=\"hero-overlay\"></div>
  1100. <div class=\"hero-content\">
  1101. <p class=\"hero-label\">Digital · Connected · Modern</p>
  1102. <h1 class=\"hero-title\">
  1103. <em>LiveEdu</em><br>
  1104. Software Online Services
  1105. </h1>
  1106. <p class=\"hero-sub\">A complete digital ecosystem built for educators, students, and administrators.</p>
  1107. <div class=\"hero-cta\">
  1108. <a href=\"#\" class=\"btn-gold\">Découvrir la plateforme</a>
  1109. </div>
  1110. </div>
  1111. </div>
  1112. {# Slide 3 #}
  1113. <div class=\"carousel-item-custom\"
  1114. style=\"background-image:url({{ asset('assets/images/slide_04.PNG') }});\">
  1115. <div class=\"hero-overlay\"></div>
  1116. <div class=\"hero-content\">
  1117. <p class=\"hero-label\">Transparency · Quality · Trust</p>
  1118. <h1 class=\"hero-title\">
  1119. <em>{{ english_school_name }}</em><br>
  1120. {{ english_slogan }}
  1121. </h1>
  1122. <p class=\"hero-sub\">Real-time data, open reporting and trusted results — for every student, every year.</p>
  1123. <div class=\"hero-cta\">
  1124. <a href=\"#officialExams\" class=\"btn-gold\">Voir les statistiques</a>
  1125. </div>
  1126. </div>
  1127. </div>
  1128. {# Decorative bar #}
  1129. <div class=\"hero-bar\"></div>
  1130. {# Indicators #}
  1131. <ol class=\"hero-indicators\" id=\"heroIndicators\">
  1132. <li class=\"active\" data-slide=\"0\"></li>
  1133. <li data-slide=\"1\"></li>
  1134. <li data-slide=\"2\"></li>
  1135. </ol>
  1136. {# Slide counter #}
  1137. <div class=\"slide-counter\">
  1138. <span id=\"slideNum\">01</span> / 03
  1139. </div>
  1140. {# Controls #}
  1141. <a class=\"hero-prev\" id=\"heroPrev\" href=\"#\">
  1142. <i class=\"fa fa-angle-left\"></i>
  1143. </a>
  1144. <a class=\"hero-next\" id=\"heroNext\" href=\"#\">
  1145. <i class=\"fa fa-angle-right\"></i>
  1146. </a>
  1147. </div>
  1148. {# ── STATS BAR ─────────────────────────────────────────────── #}
  1149. <div class=\"stats-bar\">
  1150. <div class=\"stat-item\">
  1151. <span class=\"stat-num\">98%</span>
  1152. <span class=\"stat-label\">Taux d'admission</span>
  1153. </div>
  1154. <div class=\"stat-item\">
  1155. <span class=\"stat-num\">400+</span>
  1156. <span class=\"stat-label\">Élèves inscrits</span>
  1157. </div>
  1158. <div class=\"stat-item\">
  1159. <span class=\"stat-num\">50+</span>
  1160. <span class=\"stat-label\">Enseignants qualifiés</span>
  1161. </div>
  1162. <div class=\"stat-item\">
  1163. <span class=\"stat-num\">{{ year.code }}</span>
  1164. <span class=\"stat-label\">Année académique</span>
  1165. </div>
  1166. </div>
  1167. {# ── EXAM RESULTS SECTION ─────────────────────────────────── #}
  1168. <section class=\"charts-section\" id=\"officialExams\">
  1169. <div class=\"section-header\">
  1170. <span class=\"section-tag\">Résultats officiels</span>
  1171. <h2 class=\"section-title\">
  1172. Taux de réussite aux examens<br>
  1173. session <em>{{ year.code }}</em>
  1174. </h2>
  1175. <div class=\"section-divider\"></div>
  1176. <p class=\"section-sub\">
  1177. Statistiques détaillées par série et par niveau pour la session officielle en cours.
  1178. </p>
  1179. </div>
  1180. <div class=\"charts-grid\">
  1181. {% for key in results|keys %}
  1182. <div class=\"chart-card\">
  1183. <canvas id=\"{{ key }}\" height=\"160\"
  1184. data-exam-objects=\"{{ results[key] }}\"></canvas>
  1185. </div>
  1186. {% endfor %}
  1187. </div>
  1188. </section>
  1189. {# ── FOOTER ACCENT ─────────────────────────────────────────── #}
  1190. <div class=\"page-footer-accent\">
  1191. Propulsé par <span>LiveEdu</span> · Tous droits réservés {{ \"now\"|date(\"Y\") }}
  1192. </div>
  1193. {% endblock %}
  1194. {% block javascripts %}
  1195. {{ parent() }}
  1196. <script>
  1197. /* ── Custom Carousel ───────────────────────────────────────── */
  1198. (function () {
  1199. const slides = document.querySelectorAll('.carousel-item-custom');
  1200. const indicators = document.querySelectorAll('#heroIndicators li');
  1201. const slideNum = document.getElementById('slideNum');
  1202. let current = 0, timer;
  1203. function goTo(n) {
  1204. slides[current].classList.remove('active');
  1205. indicators[current].classList.remove('active');
  1206. current = (n + slides.length) % slides.length;
  1207. slides[current].classList.add('active');
  1208. indicators[current].classList.add('active');
  1209. slideNum.textContent = String(current + 1).padStart(2, '0');
  1210. }
  1211. function autoPlay() { timer = setInterval(() => goTo(current + 1), 5500); }
  1212. function resetTimer() { clearInterval(timer); autoPlay(); }
  1213. document.getElementById('heroPrev').addEventListener('click', e => {
  1214. e.preventDefault(); goTo(current - 1); resetTimer();
  1215. });
  1216. document.getElementById('heroNext').addEventListener('click', e => {
  1217. e.preventDefault(); goTo(current + 1); resetTimer();
  1218. });
  1219. indicators.forEach(li => {
  1220. li.addEventListener('click', () => { goTo(+li.dataset.slide); resetTimer(); });
  1221. });
  1222. autoPlay();
  1223. })();
  1224. /* ── Charts ─────────────────────────────────────────────────── */
  1225. const palette = [
  1226. '#C9A84C','#2C6BAD','#1D8A6E','#D9534F',
  1227. '#7B5EA7','#F0A500','#2E86AB','#A23B72'
  1228. ];
  1229. const randomColor = (type, idx) =>
  1230. type === 'ECHEC' ? '#D9534F' : palette[idx % palette.length];
  1231. const drawCanvas = (examData, canvasId, name) => {
  1232. const el = document.getElementById(canvasId);
  1233. if (!el || !examData) return;
  1234. const parsed = JSON.parse(examData);
  1235. const values = parsed.mentionCountCategories.map(Number);
  1236. const colors = parsed.mentionCategories.map((cat, i) => randomColor(cat, i));
  1237. new Chart(el, {
  1238. type: 'doughnut',
  1239. data: {
  1240. labels: parsed.mentionCategories,
  1241. datasets: [{ data: values, backgroundColor: colors, borderWidth: 0 }]
  1242. },
  1243. options: {
  1244. cutout: '68%',
  1245. animation: { animateRotate: true, duration: 1000 },
  1246. plugins: {
  1247. legend: { display: false },
  1248. title: {
  1249. display: true,
  1250. text: name,
  1251. color: '#0A1628',
  1252. font: { size: 13, family: \"'DM Sans', sans-serif\", weight: '600' },
  1253. position: 'bottom',
  1254. padding: { top: 14 }
  1255. }
  1256. }
  1257. }
  1258. });
  1259. };
  1260. {% for key in results|keys %}
  1261. drawCanvas(
  1262. document.getElementById('{{ key }}')?.dataset?.examObjects,
  1263. '{{ key }}',
  1264. '{{ key|replace({'_': ' '})|title }}'
  1265. );
  1266. {% endfor %}
  1267. </script>
  1268. {% endblock javascripts %}
  1269. ", "school/index.html.twig", "/var/www/bethesda/templates/school/index.html.twig");
  1270. }
  1271. }