var/cache/dev/twig/2b/2b41aad17132677fd77cdd9cd42e0223.php line 64

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. /* application/whileresume/website/page_article.html.twig */
  16. class __TwigTemplate_8f65aa3b942c6806e2fe83344a46acf2 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.             'title' => [$this'block_title'],
  29.             'description' => [$this'block_description'],
  30.             'robots' => [$this'block_robots'],
  31.             'meta_social' => [$this'block_meta_social'],
  32.             'meta' => [$this'block_meta'],
  33.             'canonical' => [$this'block_canonical'],
  34.             'css' => [$this'block_css'],
  35.             'body' => [$this'block_body'],
  36.             'footer_js' => [$this'block_footer_js'],
  37.         ];
  38.     }
  39.     protected function doGetParent(array $context): bool|string|Template|TemplateWrapper
  40.     {
  41.         // line 1
  42.         return "application/whileresume/website/layout-social.html.twig";
  43.     }
  44.     protected function doDisplay(array $context, array $blocks = []): iterable
  45.     {
  46.         $macros $this->macros;
  47.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  48.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""application/whileresume/website/page_article.html.twig"));
  49.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  50.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""application/whileresume/website/page_article.html.twig"));
  51.         // line 3
  52.         $context["paramArticle"] = $this->extensions['App\Twig\ToolsExtension']->getCoreToolsList("article");
  53.         // line 1
  54.         $this->parent $this->load("application/whileresume/website/layout-social.html.twig"1);
  55.         yield from $this->parent->unwrap()->yield($contextarray_merge($this->blocks$blocks));
  56.         
  57.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  58.         
  59.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  60.     }
  61.     // line 5
  62.     /**
  63.      * @return iterable<null|scalar|\Stringable>
  64.      */
  65.     public function block_title(array $context, array $blocks = []): iterable
  66.     {
  67.         $macros $this->macros;
  68.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  69.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  70.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  71.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  72.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'5$this->source); })()), "title", [], "any"falsefalsefalse5), "html"nulltrue);
  73.         
  74.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  75.         
  76.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  77.         yield from [];
  78.     }
  79.     // line 6
  80.     /**
  81.      * @return iterable<null|scalar|\Stringable>
  82.      */
  83.     public function block_description(array $context, array $blocks = []): iterable
  84.     {
  85.         $macros $this->macros;
  86.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  87.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""description"));
  88.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  89.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""description"));
  90.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'6$this->source); })()), "shortDescription", [], "any"falsefalsefalse6), "html"nulltrue);
  91.         
  92.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  93.         
  94.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  95.         yield from [];
  96.     }
  97.     // line 7
  98.     /**
  99.      * @return iterable<null|scalar|\Stringable>
  100.      */
  101.     public function block_robots(array $context, array $blocks = []): iterable
  102.     {
  103.         $macros $this->macros;
  104.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  105.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""robots"));
  106.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  107.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""robots"));
  108.         yield "index,follow";
  109.         
  110.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  111.         
  112.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  113.         yield from [];
  114.     }
  115.     // line 8
  116.     /**
  117.      * @return iterable<null|scalar|\Stringable>
  118.      */
  119.     public function block_meta_social(array $context, array $blocks = []): iterable
  120.     {
  121.         $macros $this->macros;
  122.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  123.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""meta_social"));
  124.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  125.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""meta_social"));
  126.         yield from $this->yieldParentBlock("meta_social"$context$blocks);
  127.         yield from $this->load("/vitrine/components/socialmedia_articles.html.twig"8)->unwrap()->yield(CoreExtension::merge($context, ["social_type" => "article""article" => (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'8$this->source); })())]));
  128.         
  129.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  130.         
  131.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  132.         yield from [];
  133.     }
  134.     // line 9
  135.     /**
  136.      * @return iterable<null|scalar|\Stringable>
  137.      */
  138.     public function block_meta(array $context, array $blocks = []): iterable
  139.     {
  140.         $macros $this->macros;
  141.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  142.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""meta"));
  143.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  144.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""meta"));
  145.         yield from $this->yieldParentBlock("meta"$context$blocks);
  146.         if (( !(null === CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'9$this->source); })()), "author", [], "any"falsefalsefalse9)) &&  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'9$this->source); })()), "author", [], "any"falsefalsefalse9)))) {
  147.             yield "<meta name=\"author\" content=\"";
  148.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'9$this->source); })()), "author", [], "any"falsefalsefalse9), "html"nulltrue);
  149.             yield "\" />";
  150.         }
  151.         
  152.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  153.         
  154.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  155.         yield from [];
  156.     }
  157.     // line 10
  158.     /**
  159.      * @return iterable<null|scalar|\Stringable>
  160.      */
  161.     public function block_canonical(array $context, array $blocks = []): iterable
  162.     {
  163.         $macros $this->macros;
  164.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  165.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""canonical"));
  166.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  167.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""canonical"));
  168.         yield from $this->load("/vitrine/lexend/articles/components/canonical.html.twig"10)->unwrap()->yield(CoreExtension::merge($context, ["article" => (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'10$this->source); })())]));
  169.         
  170.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  171.         
  172.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  173.         yield from [];
  174.     }
  175.     // line 12
  176.     /**
  177.      * @return iterable<null|scalar|\Stringable>
  178.      */
  179.     public function block_css(array $context, array $blocks = []): iterable
  180.     {
  181.         $macros $this->macros;
  182.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  183.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""css"));
  184.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  185.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""css"));
  186.         // line 13
  187.         yield "    ";
  188.         yield from $this->yieldParentBlock("css"$context$blocks);
  189.         yield "
  190.     <style>
  191.         /* ═══════════════════════════════════════════════════════════════
  192.            PAGE ARTICLE — pattern jobs/show (1 colonne max-width 880px)
  193.         ═══════════════════════════════════════════════════════════════ */
  194.         .article-layout{display:block;max-width:880px;margin:0 auto}
  195.         /* ─── Header card (titre + meta) ─── */
  196.         .article-card-main{position:relative;background:#fff;border-radius:16px;box-shadow:0 4px 20px 0 rgba(0,0,0,0.06);overflow:hidden;margin-bottom:14px}
  197.         .article-card-cover{position:relative;width:100%;height:180px;background:linear-gradient(135deg,#6C3AED 0%,#8B5CF6 50%,#A78BFA 100%);overflow:hidden}
  198.         .article-card-cover img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
  199.         .article-card-cover-overlay{position:absolute;inset:0;background:linear-gradient(to bottom,rgba(0,0,0,.1) 0%,rgba(0,0,0,.55) 100%)}
  200.         @media(max-width:480px){.article-card-cover{height:140px}}
  201.         .article-card-head{padding:20px 24px 18px}
  202.         @media(max-width:480px){.article-card-head{padding:16px 18px 14px}}
  203.         .article-card-title{font-size:24px;font-weight:800;color:#1E1B2E;line-height:1.25;letter-spacing:-0.02em;margin:0 0 10px}
  204.         @media(min-width:768px){.article-card-title{font-size:28px}}
  205.         @media(max-width:480px){.article-card-title{font-size:22px}}
  206.         .article-card-subtitle{font-size:15px;color:#4B5563;line-height:1.5;margin:0 0 14px}
  207.         @media(max-width:480px){.article-card-subtitle{font-size:14px}}
  208.         .article-card-meta{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:0}
  209.         .article-card-meta-item{display:inline-flex;align-items:center;gap:5px;padding:5px 11px;border-radius:100px;background:#F3F4F6;font-size:12px;color:#4B5563;font-weight:500}
  210.         .article-card-meta-item svg{width:12px;height:12px;flex-shrink:0;color:#6B7280}
  211.         .article-card-meta-featured{background:#FEF3C7;color:#92400E;font-weight:600}
  212.         .article-card-meta-featured svg{color:currentColor}
  213.         /* ─── TOC sommaire flottant (bas à gauche, minimaliste) ─── */
  214.         .article-toc-fab{
  215.             position:fixed;
  216.             left:20px;
  217.             bottom:20px;
  218.             z-index:100;
  219.         }
  220.         @media(max-width:991px){
  221.             .article-toc-fab{left:16px;bottom:16px}
  222.         }
  223.         /* Bouton FAB (état fermé) */
  224.         .article-toc-trigger{
  225.             display:inline-flex;align-items:center;gap:8px;
  226.             background:#1E1B2E;
  227.             color:#fff;
  228.             border:none;
  229.             border-radius:100px;
  230.             padding:11px 18px 11px 14px;
  231.             font-size:13px;font-weight:600;
  232.             font-family:inherit;
  233.             cursor:pointer;
  234.             box-shadow:0 8px 24px rgba(30,27,46,.28),0 2px 6px rgba(30,27,46,.18);
  235.             transition:transform .2s ease,box-shadow .2s ease,background .15s ease;
  236.         }
  237.         .article-toc-trigger:hover{
  238.             transform:translateY(-2px);
  239.             box-shadow:0 12px 30px rgba(30,27,46,.35),0 3px 8px rgba(30,27,46,.22);
  240.             background:var(--theme-color,#6C3AED);
  241.         }
  242.         .article-toc-trigger-icon{
  243.             display:inline-flex;align-items:center;justify-content:center;
  244.             width:24px;height:24px;border-radius:50%;
  245.             background:rgba(255,255,255,.15);
  246.             flex-shrink:0;
  247.         }
  248.         .article-toc-trigger-icon svg{width:12px;height:12px}
  249.         .article-toc-trigger-count{
  250.             display:inline-flex;align-items:center;justify-content:center;
  251.             min-width:20px;height:20px;padding:0 6px;border-radius:100px;
  252.             background:var(--theme-color,#6C3AED);
  253.             color:#fff;
  254.             font-size:10.5px;font-weight:700;
  255.             line-height:1;
  256.             margin-left:2px;
  257.         }
  258.         .article-toc-trigger.has-active .article-toc-trigger-count{
  259.             background:#fff;
  260.             color:var(--theme-color,#6C3AED);
  261.         }
  262.         @media(max-width:540px){
  263.             .article-toc-trigger-label{display:none}
  264.             .article-toc-trigger{padding:11px 12px}
  265.         }
  266.         /* Panneau (état ouvert) */
  267.         .article-toc-panel{
  268.             position:absolute;
  269.             left:0;
  270.             bottom:calc(100% + 10px);
  271.             width:320px;
  272.             max-width:calc(100vw - 40px);
  273.             background:#fff;
  274.             border-radius:16px;
  275.             box-shadow:0 16px 48px rgba(0,0,0,.18),0 4px 12px rgba(0,0,0,.08);
  276.             opacity:0;
  277.             transform:translateY(8px) scale(.96);
  278.             transform-origin:bottom left;
  279.             pointer-events:none;
  280.             transition:opacity .2s ease,transform .2s ease;
  281.             overflow:hidden;
  282.         }
  283.         .article-toc-fab.is-open .article-toc-panel{
  284.             opacity:1;
  285.             transform:translateY(0) scale(1);
  286.             pointer-events:auto;
  287.         }
  288.         @media(max-width:540px){
  289.             .article-toc-panel{width:calc(100vw - 32px);max-width:340px}
  290.         }
  291.         .article-toc-panel-header{
  292.             display:flex;align-items:center;gap:10px;
  293.             padding:14px 16px;
  294.             border-bottom:1px solid #F3F4F6;
  295.         }
  296.         .article-toc-panel-icon{
  297.             display:inline-flex;align-items:center;justify-content:center;
  298.             width:28px;height:28px;border-radius:8px;
  299.             background:#F5F3FF;
  300.             color:var(--theme-color,#6C3AED);
  301.             flex-shrink:0;
  302.         }
  303.         .article-toc-panel-icon svg{width:13px;height:13px}
  304.         .article-toc-panel-label{
  305.             font-size:11px;font-weight:700;
  306.             color:#1E1B2E;
  307.             text-transform:uppercase;letter-spacing:.08em;
  308.             flex:1;margin:0;
  309.         }
  310.         .article-toc-panel-close{
  311.             background:transparent;border:0;
  312.             color:#9CA3AF;cursor:pointer;
  313.             padding:4px;line-height:1;
  314.             display:inline-flex;
  315.             border-radius:6px;
  316.             transition:background .15s,color .15s;
  317.         }
  318.         .article-toc-panel-close:hover{background:#F3F4F6;color:#1E1B2E}
  319.         .article-toc-panel-close svg{width:14px;height:14px}
  320.         .article-toc-panel-body{
  321.             padding:14px 16px;
  322.             max-height:60vh;
  323.             overflow-y:auto;
  324.         }
  325.         .article-toc-panel-body::-webkit-scrollbar{width:4px}
  326.         .article-toc-panel-body::-webkit-scrollbar-thumb{background:#E5E7EB;border-radius:4px}
  327.         .article-summary ul,.article-summary ol{padding-left:0;margin:0;list-style:none}
  328.         .article-summary li{font-size:13px;line-height:1.5;margin-bottom:6px;font-weight:500;position:relative;padding-left:14px}
  329.         .article-summary li::before{content:\"\";position:absolute;left:0;top:8px;width:5px;height:5px;border-radius:50%;background:#D1D5DB;transition:background .15s ease,transform .15s ease}
  330.         .article-summary li:hover::before{background:var(--theme-color,#6C3AED);transform:scale(1.4)}
  331.         .article-summary li a{color:#4B5563;text-decoration:none;transition:color .15s ease;display:block}
  332.         .article-summary li a:hover{color:var(--theme-color,#6C3AED)}
  333.         .article-summary li.active>a{color:var(--theme-color,#6C3AED);font-weight:700}
  334.         .article-summary li.active::before{background:var(--theme-color,#6C3AED);transform:scale(1.4)}
  335.         .article-summary ul ul,.article-summary ol ol{margin-top:6px;padding-left:14px}
  336.         /* Backdrop discret (clic en dehors pour fermer) */
  337.         .article-toc-backdrop{
  338.             position:fixed;inset:0;
  339.             background:transparent;
  340.             z-index:99;
  341.             opacity:0;
  342.             pointer-events:none;
  343.             transition:opacity .2s ease;
  344.         }
  345.         .article-toc-backdrop.is-visible{
  346.             opacity:1;
  347.             pointer-events:auto;
  348.         }
  349.         /* ─── Contenu de l'article ─── */
  350.         .article-card-content{background:#fff;border-radius:16px;box-shadow:0 4px 20px 0 rgba(0,0,0,0.06);overflow:hidden;margin-bottom:14px}
  351.         .article-card-section{padding:24px}
  352.         @media(max-width:480px){.article-card-section{padding:18px}}
  353.         .article-content{font-size:15px;line-height:1.75;color:#374151}
  354.         .article-content h2{font-size:22px;font-weight:700;color:#1E1B2E;margin:28px 0 12px;line-height:1.3;letter-spacing:-0.01em;scroll-margin-top:80px}
  355.         .article-content h2:first-child{margin-top:0}
  356.         .article-content h3{font-size:18px;font-weight:700;color:#1E1B2E;margin:22px 0 10px;line-height:1.3;scroll-margin-top:80px}
  357.         .article-content h4{font-size:16px;font-weight:700;color:#1E1B2E;margin:18px 0 8px}
  358.         .article-content p{margin-bottom:14px}
  359.         .article-content a{color:var(--theme-color,#6C3AED);text-decoration:none;font-weight:500}
  360.         .article-content a:hover{text-decoration:underline}
  361.         .article-content ul,.article-content ol{padding-left:24px;margin-bottom:14px}
  362.         .article-content li{margin-bottom:6px}
  363.         .article-content img{max-width:100%;height:auto;border-radius:12px;margin:16px 0}
  364.         .article-content blockquote{border-left:4px solid var(--theme-color,#6C3AED);padding:10px 18px;margin:16px 0;background:#F5F3FF;border-radius:0 8px 8px 0;font-style:italic;color:#4B5563}
  365.         .article-content code{background:#F3F4F6;padding:2px 6px;border-radius:4px;font-size:13px;color:#D6336C;font-family:\"SF Mono\",Menlo,Monaco,Consolas,monospace}
  366.         .article-content pre{background:#1E1B2E;color:#F3F4F6;padding:18px;border-radius:10px;overflow-x:auto;margin:16px 0;font-size:13px;line-height:1.6}
  367.         .article-content pre code{background:transparent;color:inherit;padding:0}
  368.         .article-content table{width:100%;border-collapse:collapse;margin:16px 0;font-size:14px}
  369.         .article-content th,.article-content td{padding:10px 12px;border:1px solid #E5E7EB;text-align:left}
  370.         .article-content th{background:#F9FAFB;font-weight:700;color:#1E1B2E}
  371.         /* ─── Tags en bas du contenu ─── */
  372.         .article-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:24px;padding-top:18px;border-top:1px solid #F3F4F6}
  373.         .article-tag{display:inline-flex;align-items:center;padding:5px 11px;border-radius:100px;background:#F5F3FF;color:var(--theme-color,#6C3AED);font-size:12px;font-weight:600;text-decoration:none;transition:background .15s,transform .15s}
  374.         .article-tag:hover{background:#EDE9FE;transform:translateY(-1px);color:var(--theme-color,#6C3AED)}
  375.         .article-tag::before{content:\"#\";opacity:.6;margin-right:1px}
  376.         /* ─── CTA inline (Recruteur / Candidat) ─── */
  377.         .article-cta{position:relative;border-radius:18px;padding:24px;margin-bottom:14px;background:linear-gradient(135deg,#6C3AED 0%,#8B5CF6 50%,#A78BFA 100%);overflow:hidden;box-shadow:0 10px 30px -8px rgba(108,58,237,.35)}
  378.         .article-cta::before{content:\"\";position:absolute;top:-40px;right:-40px;width:180px;height:180px;background:radial-gradient(circle,rgba(255,255,255,.15) 0%,transparent 70%);pointer-events:none}
  379.         .article-cta::after{content:\"\";position:absolute;bottom:-60px;left:-60px;width:200px;height:200px;background:radial-gradient(circle,rgba(255,255,255,.08) 0%,transparent 70%);pointer-events:none}
  380.         .article-cta-eyebrow{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;color:#fff;text-transform:uppercase;letter-spacing:.1em;background:rgba(255,255,255,.18);padding:5px 12px;border-radius:100px;margin-bottom:12px;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);position:relative;z-index:2}
  381.         .article-cta-eyebrow svg{width:12px;height:12px}
  382.         .article-cta-title{font-size:20px;font-weight:800;color:#fff;line-height:1.25;letter-spacing:-0.01em;margin:0 0 18px;position:relative;z-index:2}
  383.         @media(min-width:768px){.article-cta-title{font-size:24px}}
  384.         .article-cta-grid{display:grid;grid-template-columns:1fr;gap:12px;position:relative;z-index:2}
  385.         @media(min-width:640px){.article-cta-grid{grid-template-columns:1fr 1fr;gap:14px}}
  386.         .article-cta-side{background:rgba(255,255,255,.97);border-radius:14px;padding:18px;display:flex;flex-direction:column;transition:transform .2s,box-shadow .2s}
  387.         .article-cta-side:hover{transform:translateY(-2px);box-shadow:0 12px 24px -8px rgba(0,0,0,.18)}
  388.         .article-cta-side-head{display:flex;align-items:center;gap:10px;margin-bottom:10px}
  389.         .article-cta-side-icon{width:38px;height:38px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#EDE9FE,#DDD6FE);color:var(--theme-color,#6C3AED);flex-shrink:0}
  390.         .article-cta-side-icon svg{width:18px;height:18px}
  391.         .article-cta-side-label{font-size:11px;font-weight:700;color:var(--theme-color,#6C3AED);text-transform:uppercase;letter-spacing:.08em;margin:0}
  392.         .article-cta-side-heading{font-size:15px;font-weight:700;color:#1E1B2E;line-height:1.3;margin:0 0 8px}
  393.         .article-cta-side-text{font-size:13px;color:#6B7280;line-height:1.5;margin:0 0 14px;flex:1}
  394.         .article-cta-side-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:var(--theme-color,#6C3AED);color:#fff;text-decoration:none;padding:11px 16px;border-radius:10px;font-size:13px;font-weight:700;letter-spacing:.01em;transition:background .15s,transform .15s}
  395.         .article-cta-side-btn:hover{background:#5B21B6;color:#fff;transform:translateX(2px)}
  396.         .article-cta-side-btn svg{width:14px;height:14px;transition:transform .15s}
  397.         .article-cta-side-btn:hover svg{transform:translateX(2px)}
  398.         /* ─── Articles similaires (style identique aux jobs) ─── */
  399.         .similar-section-title{font-size:11px;font-weight:700;color:#9CA3AF;text-transform:uppercase;letter-spacing:.08em;margin:32px 0 12px;padding-left:4px;display:inline-flex;align-items:center;gap:8px}
  400.         .similar-card{background:#fff;border-radius:14px;padding:14px;box-shadow:0 0 16px 0 rgba(0,0,0,0.04);margin-bottom:10px;display:flex;align-items:center;gap:14px;text-decoration:none;color:inherit;transition:transform .15s,box-shadow .2s}
  401.         .similar-card:hover{transform:translateY(-1px);box-shadow:0 4px 20px rgba(108,58,237,.1);color:inherit}
  402.         .similar-card-logo{width:50px;height:50px;border-radius:12px;background:linear-gradient(135deg,#EDE9FE,#DDD6FE);display:flex;align-items:center;justify-content:center;color:var(--theme-color,#6C3AED);flex-shrink:0;overflow:hidden}
  403.         .similar-card-logo img{width:100%;height:100%;object-fit:cover;border-radius:8px}
  404.         .similar-card-logo svg{width:24px;height:24px;opacity:.9}
  405.         .similar-card-info{flex:1;min-width:0}
  406.         .similar-card-title{font-size:14px;font-weight:700;color:#1E1B2E;line-height:1.3;margin:0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  407.         .similar-card-meta{font-size:12px;color:#6B7280;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;gap:8px}
  408.         .similar-card-meta-sep{display:inline-block;width:3px;height:3px;border-radius:50%;background:#D1D5DB;flex-shrink:0}
  409.         .similar-card-arrow{flex-shrink:0;color:#9CA3AF;transition:color .15s,transform .15s}
  410.         .similar-card:hover .similar-card-arrow{color:var(--theme-color,#6C3AED);transform:translateX(2px)}
  411.         .similar-card-arrow svg{width:18px;height:18px}
  412.         /* ─── Section \"Offres recommandées\" (cross-sell article -> jobs) ─── */
  413.         .recommended-jobs-header{
  414.             display:flex;align-items:center;justify-content:space-between;gap:10px;
  415.             margin:32px 0 12px;padding-left:4px;flex-wrap:wrap;
  416.         }
  417.         .recommended-jobs-header .similar-section-title{margin:0}
  418.         .recommended-jobs-icon{
  419.             display:inline-flex;align-items:center;justify-content:center;
  420.             width:22px;height:22px;border-radius:6px;
  421.             background:#F5F3FF;
  422.             color:var(--theme-color,#6C3AED);
  423.             flex-shrink:0;
  424.         }
  425.         .recommended-jobs-icon svg{width:11px;height:11px}
  426.         .recommended-jobs-all{
  427.             display:inline-flex;align-items:center;gap:4px;
  428.             font-size:12px;font-weight:600;
  429.             color:var(--theme-color,#6C3AED);
  430.             text-decoration:none;
  431.             padding:5px 10px;border-radius:100px;
  432.             border:1px dashed rgba(108,58,237,.35);
  433.             transition:background .15s,border-style .15s,transform .15s;
  434.         }
  435.         .recommended-jobs-all:hover{
  436.             background:#F5F3FF;
  437.             border-style:solid;
  438.             color:var(--theme-color,#6C3AED);
  439.             transform:translateX(2px);
  440.         }
  441.         .recommended-jobs-all svg{width:11px;height:11px}
  442.         /* Grille des cards jobs (style identique au composant _jobs_content.html.twig) */
  443.         .recommended-jobs-grid{margin-bottom:14px}
  444.         .recommended-jobs-grid .job-card{
  445.             display:flex;flex-direction:column;gap:.75rem;
  446.             height:100%;
  447.             padding:1.25rem;
  448.             background:#fff;
  449.             border:1px solid #e6e8ec;
  450.             border-radius:14px;
  451.             text-decoration:none;color:inherit;
  452.             transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease;
  453.         }
  454.         .recommended-jobs-grid .job-card:hover{
  455.             transform:translateY(-2px);
  456.             box-shadow:0 8px 24px rgba(20,24,40,.08);
  457.             border-color:#d6d9e0;
  458.             text-decoration:none;color:inherit;
  459.         }
  460.         .recommended-jobs-grid .job-card__header{display:flex;align-items:center;gap:.75rem}
  461.         .recommended-jobs-grid .job-card__logo{
  462.             width:44px;height:44px;
  463.             border-radius:10px;
  464.             object-fit:cover;
  465.             background:#f4f5f8;
  466.             flex-shrink:0;
  467.         }
  468.         .recommended-jobs-grid .job-card__logo--placeholder{
  469.             display:flex;align-items:center;justify-content:center;
  470.             font-weight:700;color:#6b7280;
  471.             background:linear-gradient(135deg,#eef2ff,#f5f3ff);
  472.         }
  473.         .recommended-jobs-grid .job-card__company{
  474.             display:flex;flex-direction:column;
  475.             min-width:0;
  476.         }
  477.         .recommended-jobs-grid .job-card__company-name{
  478.             font-weight:600;font-size:.9rem;color:#111827;
  479.             white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  480.         }
  481.         .recommended-jobs-grid .job-card__location{
  482.             font-size:.8rem;color:#6b7280;
  483.             display:inline-flex;align-items:center;gap:.25rem;
  484.         }
  485.         .recommended-jobs-grid .job-card__summary{
  486.             font-size:.875rem;color:#4b5563;
  487.             margin:0;line-height:1.45;
  488.             display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  489.             overflow:hidden;
  490.         }
  491.         .recommended-jobs-grid .job-card__footer{
  492.             display:flex;flex-wrap:wrap;gap:.375rem;
  493.             margin-top:auto;padding-top:.5rem;
  494.         }
  495.         .recommended-jobs-grid .job-card__tag{
  496.             font-size:.72rem;font-weight:500;
  497.             padding:.25rem .55rem;
  498.             border-radius:999px;
  499.             background:#f3f4f6;color:#374151;
  500.         }
  501.         .recommended-jobs-grid .job-card__tag--accent{
  502.             background:#eef2ff;color:#4338ca;
  503.         }
  504.         /* Bouton retour vers la liste */
  505.         .article-back-link{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;background:#fff;border:1px solid #E5E7EB;border-radius:10px;font-size:12px;font-weight:600;color:#4B5563;text-decoration:none;margin-bottom:14px;transition:border-color .15s,color .15s}
  506.         .article-back-link:hover{border-color:var(--theme-color,#6C3AED);color:var(--theme-color,#6C3AED)}
  507.         .article-back-link svg{width:13px;height:13px}
  508.     </style>
  509. ";
  510.         
  511.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  512.         
  513.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  514.         yield from [];
  515.     }
  516.     // line 356
  517.     /**
  518.      * @return iterable<null|scalar|\Stringable>
  519.      */
  520.     public function block_body(array $context, array $blocks = []): iterable
  521.     {
  522.         $macros $this->macros;
  523.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  524.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""body"));
  525.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  526.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""body"));
  527.         // line 357
  528.         yield "    <div class=\"article-layout\">
  529.         ";
  530.         // line 360
  531.         yield "        <article class=\"article-card-main\">
  532.             ";
  533.         // line 363
  534.         yield "            ";
  535.         if ((($tmp =  !(null === CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'363$this->source); })()), "image", [], "any"falsefalsefalse363), "name", [], "any"falsefalsefalse363))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  536.             // line 364
  537.             yield "                <div class=\"article-card-cover\">
  538.                     <img src=\"";
  539.             // line 365
  540.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Vich\UploaderBundle\Twig\Extension\UploaderExtension']->asset((isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'365$this->source); })()), "imageFile"), "html"nulltrue);
  541.             yield "\" alt=\"";
  542.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'365$this->source); })()), "title", [], "any"falsefalsefalse365), "html"nulltrue);
  543.             yield "\" />
  544.                     <div class=\"article-card-cover-overlay\"></div>
  545.                 </div>
  546.             ";
  547.         }
  548.         // line 369
  549.         yield "
  550.             <div class=\"article-card-head\">
  551.                 <h1 class=\"article-card-title\">";
  552.         // line 371
  553.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'371$this->source); })()), "title", [], "any"falsefalsefalse371), "html"nulltrue);
  554.         yield "</h1>
  555.                 ";
  556.         // line 373
  557.         if ((($tmp =  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'373$this->source); })()), "subtitle", [], "any"falsefalsefalse373))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  558.             // line 374
  559.             yield "                    <p class=\"article-card-subtitle\">";
  560.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'374$this->source); })()), "subtitle", [], "any"falsefalsefalse374), "html"nulltrue);
  561.             yield "</p>
  562.                 ";
  563.         }
  564.         // line 376
  565.         yield "
  566.                 <div class=\"article-card-meta\">
  567.                     ";
  568.         // line 378
  569.         if (( !(null === CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'378$this->source); })()), "author", [], "any"falsefalsefalse378)) &&  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'378$this->source); })()), "author", [], "any"falsefalsefalse378)))) {
  570.             // line 379
  571.             yield "                        <span class=\"article-card-meta-item\">
  572.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  573.                                 <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/>
  574.                             </svg>
  575.                             ";
  576.             // line 383
  577.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'383$this->source); })()), "author", [], "any"falsefalsefalse383), "html"nulltrue);
  578.             yield "
  579.                         </span>
  580.                     ";
  581.         }
  582.         // line 386
  583.         yield "
  584.                     ";
  585.         // line 395
  586.         yield "                </div>
  587.             </div>
  588.         </article>
  589.         ";
  590.         // line 400
  591.         yield "        ";
  592.         $context["summaryHtml"] = $this->extensions['App\Twig\PagesExtension']->autosummary(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'400$this->source); })()), "description", [], "any"falsefalsefalse400));
  593.         // line 401
  594.         yield "        ";
  595.         if ((($tmp =  !Twig\Extension\CoreExtension::testEmpty((isset($context["summaryHtml"]) || array_key_exists("summaryHtml"$context) ? $context["summaryHtml"] : (function () { throw new RuntimeError('Variable "summaryHtml" does not exist.'401$this->source); })()))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  596.             // line 402
  597.             yield "            <div class=\"article-toc-fab\" id=\"articleTocFab\">
  598.                 ";
  599.             // line 404
  600.             yield "                <div class=\"article-toc-panel\" id=\"articleTocPanel\" role=\"dialog\" aria-label=\"";
  601.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\TranslationExtension']->trans("article.summary.title", [], "vitrine-lexend"), "html"nulltrue);
  602.             yield "\">
  603.                     <div class=\"article-toc-panel-header\">
  604.                         <span class=\"article-toc-panel-icon\">
  605.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  606.                                 <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>
  607.                             </svg>
  608.                         </span>
  609.                         <span class=\"article-toc-panel-label\">";
  610.             // line 411
  611.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\TranslationExtension']->trans("article.summary.title", [], "vitrine-lexend"), "html"nulltrue);
  612.             yield "</span>
  613.                         <button type=\"button\" class=\"article-toc-panel-close\" id=\"articleTocClose\" aria-label=\"Close\">
  614.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  615.                                 <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>
  616.                             </svg>
  617.                         </button>
  618.                     </div>
  619.                     <div class=\"article-toc-panel-body\">
  620.                         <div class=\"summary article-summary\">";
  621.             // line 419
  622.             yield (isset($context["summaryHtml"]) || array_key_exists("summaryHtml"$context) ? $context["summaryHtml"] : (function () { throw new RuntimeError('Variable "summaryHtml" does not exist.'419$this->source); })());
  623.             yield "</div>
  624.                         ";
  625.             // line 421
  626.             if ((($tmp $this->extensions['Symfony\Bridge\Twig\Extension\SecurityExtension']->isGranted("ROLE_SUPER_ADMIN")) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  627.                 // line 422
  628.                 yield "                            <div style=\"margin-top:12px;padding-top:10px;border-top:1px solid #F3F4F6;\">
  629.                                 <a href=\"";
  630.                 // line 423
  631.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("bo_articles_edit", ["id" => CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'423$this->source); })()), "id", [], "any"falsefalsefalse423)]), "html"nulltrue);
  632.                 yield "\"
  633.                                    style=\"font-size:11px;font-weight:600;color:#DC2626;text-transform:uppercase;letter-spacing:.06em;text-decoration:none;\">
  634.                                     <i class=\"feather-edit-2 me-1\"></i>";
  635.                 // line 425
  636.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\TranslationExtension']->trans("article.summary.edit", [], "vitrine-lexend"), "html"nulltrue);
  637.                 yield "
  638.                                 </a>
  639.                             </div>
  640.                         ";
  641.             }
  642.             // line 429
  643.             yield "                    </div>
  644.                 </div>
  645.                 ";
  646.             // line 433
  647.             yield "                <button type=\"button\" class=\"article-toc-trigger\" id=\"articleTocTrigger\" aria-expanded=\"false\">
  648.                     <span class=\"article-toc-trigger-icon\">
  649.                         <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  650.                             <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>
  651.                         </svg>
  652.                     </span>
  653.                     <span class=\"article-toc-trigger-label\">";
  654.             // line 439
  655.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\TranslationExtension']->trans("article.summary.title", [], "vitrine-lexend"), "html"nulltrue);
  656.             yield "</span>
  657.                     <span class=\"article-toc-trigger-count\" id=\"articleTocCount\">·</span>
  658.                 </button>
  659.             </div>
  660.             <div class=\"article-toc-backdrop\" id=\"articleTocBackdrop\"></div>
  661.         ";
  662.         }
  663.         // line 445
  664.         yield "
  665.         ";
  666.         // line 447
  667.         yield "        <div class=\"article-card-content\">
  668.             <div class=\"article-card-section\">
  669.                 <div id=\"single-post\" class=\"post-content article-content\">
  670.                     ";
  671.         // line 450
  672.         yield $this->extensions['App\Twig\ArticlesExtension']->contentArticle($this->extensions['App\Twig\PagesExtension']->autosummaryID(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'450$this->source); })()), "description", [], "any"falsefalsefalse450)));
  673.         yield "
  674.                 </div>
  675.                 ";
  676.         // line 454
  677.         yield "                ";
  678.         if ((($tmp =  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'454$this->source); })()), "tags", [], "any"falsefalsefalse454))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  679.             // line 455
  680.             yield "                    <div class=\"article-tags\">
  681.                         ";
  682.             // line 456
  683.             $context['_parent'] = $context;
  684.             $context['_seq'] = CoreExtension::ensureTraversable(Twig\Extension\CoreExtension::split($this->env->getCharset(), CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'456$this->source); })()), "tags", [], "any"falsefalsefalse456), ","));
  685.             foreach ($context['_seq'] as $context["_key"] => $context["tag"]) {
  686.                 // line 457
  687.                 yield "                            ";
  688.                 $context["t"] = Twig\Extension\CoreExtension::trim($context["tag"]);
  689.                 // line 458
  690.                 yield "                            ";
  691.                 if ((($tmp =  !Twig\Extension\CoreExtension::testEmpty((isset($context["t"]) || array_key_exists("t"$context) ? $context["t"] : (function () { throw new RuntimeError('Variable "t" does not exist.'458$this->source); })()))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  692.                     // line 459
  693.                     yield "                                <span class=\"article-tag\">";
  694.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["t"]) || array_key_exists("t"$context) ? $context["t"] : (function () { throw new RuntimeError('Variable "t" does not exist.'459$this->source); })()), "html"nulltrue);
  695.                     yield "</span>
  696.                             ";
  697.                 }
  698.                 // line 461
  699.                 yield "                        ";
  700.             }
  701.             $_parent $context['_parent'];
  702.             unset($context['_seq'], $context['_key'], $context['tag'], $context['_parent']);
  703.             $context array_intersect_key($context$_parent) + $_parent;
  704.             // line 462
  705.             yield "                    </div>
  706.                 ";
  707.         }
  708.         // line 464
  709.         yield "            </div>
  710.         </div>
  711.         ";
  712.         // line 468
  713.         yield "        ";
  714.         if ((($this->extensions['App\Twig\CoreExtension']->getEnv("KERNEL_APPLICATION") == "whileresume") && CoreExtension::inFilter(CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'468$this->source); })()), "request", [], "any"falsefalsefalse468), "locale", [], "any"falsefalsefalse468), ["fr""en"]))) {
  715.             // line 469
  716.             yield "            <div class=\"article-cta\">
  717.                 <span class=\"article-cta-eyebrow\">
  718.                     <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  719.                         <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/>
  720.                     </svg>
  721.                     Whileresume
  722.                 </span>
  723.                 <h2 class=\"article-cta-title\">
  724.                     ";
  725.             // line 478
  726.             if ((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'478$this->source); })()), "request", [], "any"falsefalsefalse478), "locale", [], "any"falsefalsefalse478) == "fr")) {
  727.                 // line 479
  728.                 yield "                        Talents et entreprises se rencontrent ici.
  729.                     ";
  730.             } else {
  731.                 // line 481
  732.                 yield "                        Where talent meets fast-growing companies.
  733.                     ";
  734.             }
  735.             // line 483
  736.             yield "                </h2>
  737.                 <div class=\"article-cta-grid\">
  738.                     <div class=\"article-cta-side\">
  739.                         <div class=\"article-cta-side-head\">
  740.                             <span class=\"article-cta-side-icon\">
  741.                                 <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  742.                                     <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"/><path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/>
  743.                                 </svg>
  744.                             </span>
  745.                             <span class=\"article-cta-side-label\">";
  746.             // line 493
  747.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'493$this->source); })()), "request", [], "any"falsefalsefalse493), "locale", [], "any"falsefalsefalse493) == "fr")) ? ("Recruteur") : ("Recruiter"));
  748.             yield "</span>
  749.                         </div>
  750.                         <h3 class=\"article-cta-side-heading\">
  751.                             ";
  752.             // line 496
  753.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'496$this->source); })()), "request", [], "any"falsefalsefalse496), "locale", [], "any"falsefalsefalse496) == "fr")) ? ("Recrutez des profils d'exception, plus vite.") : ("Hire exceptional talent, faster."));
  754.             yield "
  755.                         </h3>
  756.                         <p class=\"article-cta-side-text\">
  757.                             ";
  758.             // line 499
  759.             if ((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'499$this->source); })()), "request", [], "any"falsefalsefalse499), "locale", [], "any"falsefalsefalse499) == "fr")) {
  760.                 // line 500
  761.                 yield "                                Accédez aux meilleurs talents du marché et connectez-vous directement à des candidats qualifiés en quête de leur prochain défi.
  762.                             ";
  763.             } else {
  764.                 // line 502
  765.                 yield "                                Get access to top market talent and connect directly with qualified candidates ready for their next challenge.
  766.                             ";
  767.             }
  768.             // line 504
  769.             yield "                        </p>
  770.                         <a href=\"";
  771.             // line 505
  772.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath(("whileresume_business_" CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'505$this->source); })()), "request", [], "any"falsefalsefalse505), "locale", [], "any"falsefalsefalse505)));
  773.             yield "\" class=\"article-cta-side-btn\">
  774.                             ";
  775.             // line 506
  776.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'506$this->source); })()), "request", [], "any"falsefalsefalse506), "locale", [], "any"falsefalsefalse506) == "fr")) ? ("Je recrute") : ("I'm recruiting"));
  777.             yield "
  778.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  779.                                 <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12 5 19 12 12 19\"/>
  780.                             </svg>
  781.                         </a>
  782.                     </div>
  783.                     <div class=\"article-cta-side\">
  784.                         <div class=\"article-cta-side-head\">
  785.                             <span class=\"article-cta-side-icon\">
  786.                                 <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  787.                                     <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/>
  788.                                 </svg>
  789.                             </span>
  790.                             <span class=\"article-cta-side-label\">";
  791.             // line 520
  792.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'520$this->source); })()), "request", [], "any"falsefalsefalse520), "locale", [], "any"falsefalsefalse520) == "fr")) ? ("Candidat") : ("Candidate"));
  793.             yield "</span>
  794.                         </div>
  795.                         <h3 class=\"article-cta-side-heading\">
  796.                             ";
  797.             // line 523
  798.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'523$this->source); })()), "request", [], "any"falsefalsefalse523), "locale", [], "any"falsefalsefalse523) == "fr")) ? ("Trouvez le job qui vous ressemble.") : ("Find the job that fits you."));
  799.             yield "
  800.                         </h3>
  801.                         <p class=\"article-cta-side-text\">
  802.                             ";
  803.             // line 526
  804.             if ((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'526$this->source); })()), "request", [], "any"falsefalsefalse526), "locale", [], "any"falsefalsefalse526) == "fr")) {
  805.                 // line 527
  806.                 yield "                                On vous accompagne dans la recherche de votre poste idéal au sein des entreprises les plus prometteuses du marché.
  807.                             ";
  808.             } else {
  809.                 // line 529
  810.                 yield "                                We support you in finding your ideal position within the most promising companies on the market.
  811.                             ";
  812.             }
  813.             // line 531
  814.             yield "                        </p>
  815.                         <a href=\"";
  816.             // line 532
  817.             yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath(("whileresume_resume_" CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'532$this->source); })()), "request", [], "any"falsefalsefalse532), "locale", [], "any"falsefalsefalse532)));
  818.             yield "\" class=\"article-cta-side-btn\">
  819.                             ";
  820.             // line 533
  821.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'533$this->source); })()), "request", [], "any"falsefalsefalse533), "locale", [], "any"falsefalsefalse533) == "fr")) ? ("Je cherche un job") : ("I'm looking for a job"));
  822.             yield "
  823.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  824.                                 <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12 5 19 12 12 19\"/>
  825.                             </svg>
  826.                         </a>
  827.                     </div>
  828.                 </div>
  829.             </div>
  830.         ";
  831.         }
  832.         // line 542
  833.         yield "
  834.         ";
  835.         // line 543
  836.         if ((($tmp =  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'543$this->source); })()), "ctaHTML", [], "any"falsefalsefalse543))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  837.             yield CoreExtension::getAttribute($this->env$this->source, (isset($context["article"]) || array_key_exists("article"$context) ? $context["article"] : (function () { throw new RuntimeError('Variable "article" does not exist.'543$this->source); })()), "ctaHTML", [], "any"falsefalsefalse543);
  838.         }
  839.         // line 544
  840.         yield "
  841.         ";
  842.         // line 546
  843.         yield "        ";
  844.         if ((array_key_exists("similarArticles"$context) &&  !Twig\Extension\CoreExtension::testEmpty((isset($context["similarArticles"]) || array_key_exists("similarArticles"$context) ? $context["similarArticles"] : (function () { throw new RuntimeError('Variable "similarArticles" does not exist.'546$this->source); })())))) {
  845.             // line 547
  846.             yield "            <h4 class=\"similar-section-title\">
  847.                 ";
  848.             // line 548
  849.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'548$this->source); })()), "request", [], "any"falsefalsefalse548), "locale", [], "any"falsefalsefalse548) == "fr")) ? ("Articles similaires") : ("Similar articles"));
  850.             yield " · ";
  851.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::length($this->env->getCharset(), (isset($context["similarArticles"]) || array_key_exists("similarArticles"$context) ? $context["similarArticles"] : (function () { throw new RuntimeError('Variable "similarArticles" does not exist.'548$this->source); })())), "html"nulltrue);
  852.             yield "
  853.             </h4>
  854.             ";
  855.             // line 550
  856.             $context['_parent'] = $context;
  857.             $context['_seq'] = CoreExtension::ensureTraversable((isset($context["similarArticles"]) || array_key_exists("similarArticles"$context) ? $context["similarArticles"] : (function () { throw new RuntimeError('Variable "similarArticles" does not exist.'550$this->source); })()));
  858.             foreach ($context['_seq'] as $context["_key"] => $context["sa"]) {
  859.                 // line 551
  860.                 yield "
  861.                 ";
  862.                 // line 553
  863.                 yield "                ";
  864.                 $context["prefix"] = "";
  865.                 // line 554
  866.                 yield "                ";
  867.                 $context["urlSa"] = $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("cvs_website_article", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["sa"], "slug", [], "any"falsefalsefalse554)]);
  868.                 // line 555
  869.                 yield "                ";
  870.                 if ((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'555$this->source); })()), "request", [], "any"falsefalsefalse555), "locale", [], "any"falsefalsefalse555) != (isset($context["default_locale"]) || array_key_exists("default_locale"$context) ? $context["default_locale"] : (function () { throw new RuntimeError('Variable "default_locale" does not exist.'555$this->source); })()))) {
  871.                     // line 556
  872.                     yield "                    ";
  873.                     $context["urlSa"] = $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("locale_cvs_website_article", ["_locale" => CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'556$this->source); })()), "request", [], "any"falsefalsefalse556), "locale", [], "any"falsefalsefalse556), "slug" => CoreExtension::getAttribute($this->env$this->source$context["sa"], "slug", [], "any"falsefalsefalse556)]);
  874.                     // line 557
  875.                     yield "                    ";
  876.                     $context["prefix"] = ("/" CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'557$this->source); })()), "request", [], "any"falsefalsefalse557), "locale", [], "any"falsefalsefalse557));
  877.                     // line 558
  878.                     yield "                ";
  879.                 }
  880.                 // line 559
  881.                 yield "                ";
  882.                 if ((($tmp =  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug3", [], "any"falsefalsefalse559))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  883.                     // line 560
  884.                     yield "                    ";
  885.                     $context["urlSa"] = (((((((isset($context["prefix"]) || array_key_exists("prefix"$context) ? $context["prefix"] : (function () { throw new RuntimeError('Variable "prefix" does not exist.'560$this->source); })()) . "/") . CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug", [], "any"falsefalsefalse560)) . "/") . CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug2", [], "any"falsefalsefalse560)) . "/") . CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug3", [], "any"falsefalsefalse560));
  886.                     // line 561
  887.                     yield "                ";
  888.                 } elseif ((($tmp =  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug2", [], "any"falsefalsefalse561))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  889.                     // line 562
  890.                     yield "                    ";
  891.                     $context["urlSa"] = (((((isset($context["prefix"]) || array_key_exists("prefix"$context) ? $context["prefix"] : (function () { throw new RuntimeError('Variable "prefix" does not exist.'562$this->source); })()) . "/") . CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug", [], "any"falsefalsefalse562)) . "/") . CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug2", [], "any"falsefalsefalse562));
  892.                     // line 563
  893.                     yield "                ";
  894.                 } elseif ((($tmp =  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug", [], "any"falsefalsefalse563))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  895.                     // line 564
  896.                     yield "                    ";
  897.                     $context["urlSa"] = (((isset($context["prefix"]) || array_key_exists("prefix"$context) ? $context["prefix"] : (function () { throw new RuntimeError('Variable "prefix" does not exist.'564$this->source); })()) . "/") . CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug", [], "any"falsefalsefalse564));
  898.                     // line 565
  899.                     yield "                ";
  900.                 }
  901.                 // line 566
  902.                 yield "
  903.                 <a href=\"";
  904.                 // line 567
  905.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["urlSa"]) || array_key_exists("urlSa"$context) ? $context["urlSa"] : (function () { throw new RuntimeError('Variable "urlSa" does not exist.'567$this->source); })()), "html"nulltrue);
  906.                 yield "\" class=\"similar-card\">
  907.                     <div class=\"similar-card-logo\">
  908.                         ";
  909.                 // line 569
  910.                 if ((($tmp =  !(null === CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["sa"], "image", [], "any"falsefalsefalse569), "name", [], "any"falsefalsefalse569))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  911.                     // line 570
  912.                     yield "                            <img src=\"";
  913.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Vich\UploaderBundle\Twig\Extension\UploaderExtension']->asset($context["sa"], "imageFile"), "html"nulltrue);
  914.                     yield "\" alt=\"\">
  915.                         ";
  916.                 } else {
  917.                     // line 572
  918.                     yield "                            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  919.                                 <path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\"/>
  920.                                 <path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"/>
  921.                             </svg>
  922.                         ";
  923.                 }
  924.                 // line 577
  925.                 yield "                    </div>
  926.                     <div class=\"similar-card-info\">
  927.                         <div class=\"similar-card-title\">";
  928.                 // line 579
  929.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["sa"], "title", [], "any"falsefalsefalse579), "html"nulltrue);
  930.                 yield "</div>
  931.                         <div class=\"similar-card-meta\">
  932.                             <span>";
  933.                 // line 581
  934.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Twig\Extension\CoreExtension']->formatDate(CoreExtension::getAttribute($this->env$this->source$context["sa"], "publishedAt", [], "any"falsefalsefalse581), "d M Y"), "html"nulltrue);
  935.                 yield "</span>
  936.                             ";
  937.                 // line 582
  938.                 if (( !(null === CoreExtension::getAttribute($this->env$this->source$context["sa"], "author", [], "any"falsefalsefalse582)) &&  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source$context["sa"], "author", [], "any"falsefalsefalse582)))) {
  939.                     // line 583
  940.                     yield "                                <span class=\"similar-card-meta-sep\"></span>
  941.                                 <span>";
  942.                     // line 584
  943.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["sa"], "author", [], "any"falsefalsefalse584), "html"nulltrue);
  944.                     yield "</span>
  945.                             ";
  946.                 }
  947.                 // line 586
  948.                 yield "                            ";
  949.                 if ((($tmp =  !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug", [], "any"falsefalsefalse586))) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  950.                     // line 587
  951.                     yield "                                <span class=\"similar-card-meta-sep\"></span>
  952.                                 <span>";
  953.                     // line 588
  954.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["sa"], "pageslug", [], "any"falsefalsefalse588), "html"nulltrue);
  955.                     yield "</span>
  956.                             ";
  957.                 }
  958.                 // line 590
  959.                 yield "                        </div>
  960.                     </div>
  961.                     <span class=\"similar-card-arrow\">
  962.                         <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  963.                             <polyline points=\"9 18 15 12 9 6\"/>
  964.                         </svg>
  965.                     </span>
  966.                 </a>
  967.             ";
  968.             }
  969.             $_parent $context['_parent'];
  970.             unset($context['_seq'], $context['_key'], $context['sa'], $context['_parent']);
  971.             $context array_intersect_key($context$_parent) + $_parent;
  972.             // line 599
  973.             yield "        ";
  974.         }
  975.         // line 600
  976.         yield "
  977.         ";
  978.         // line 602
  979.         yield "        ";
  980.         if ((array_key_exists("recommendedJobs"$context) &&  !Twig\Extension\CoreExtension::testEmpty((isset($context["recommendedJobs"]) || array_key_exists("recommendedJobs"$context) ? $context["recommendedJobs"] : (function () { throw new RuntimeError('Variable "recommendedJobs" does not exist.'602$this->source); })())))) {
  981.             // line 603
  982.             yield "            <div class=\"recommended-jobs-header\">
  983.                 <h4 class=\"similar-section-title\" style=\"margin-bottom:0\">
  984.                     <span class=\"recommended-jobs-icon\">
  985.                         <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  986.                             <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"/>
  987.                             <path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/>
  988.                         </svg>
  989.                     </span>
  990.                     ";
  991.             // line 611
  992.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'611$this->source); })()), "request", [], "any"falsefalsefalse611), "locale", [], "any"falsefalsefalse611) == "fr")) ? ("Découvrez nos offres") : ("Discover our jobs"));
  993.             yield " · ";
  994.             yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::length($this->env->getCharset(), (isset($context["recommendedJobs"]) || array_key_exists("recommendedJobs"$context) ? $context["recommendedJobs"] : (function () { throw new RuntimeError('Variable "recommendedJobs" does not exist.'611$this->source); })())), "html"nulltrue);
  995.             yield "
  996.                 </h4>
  997.                 <a href=\"";
  998.             // line 613
  999.             if ((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'613$this->source); })()), "request", [], "any"falsefalsefalse613), "locale", [], "any"falsefalsefalse613) == "en")) {
  1000.                 yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("whileresume_jobs_list");
  1001.             } else {
  1002.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("locale_whileresume_jobs_list", ["_locale" => CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'613$this->source); })()), "request", [], "any"falsefalsefalse613), "locale", [], "any"falsefalsefalse613)]), "html"nulltrue);
  1003.             }
  1004.             yield "\"
  1005.                    class=\"recommended-jobs-all\">
  1006.                     ";
  1007.             // line 615
  1008.             yield (((CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'615$this->source); })()), "request", [], "any"falsefalsefalse615), "locale", [], "any"falsefalsefalse615) == "fr")) ? ("Voir toutes les offres") : ("See all jobs"));
  1009.             yield "
  1010.                     <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1011.                         <polyline points=\"9 18 15 12 9 6\"/>
  1012.                     </svg>
  1013.                 </a>
  1014.             </div>
  1015.             <div class=\"row g-3 recommended-jobs-grid\">
  1016.                 ";
  1017.             // line 623
  1018.             $context['_parent'] = $context;
  1019.             $context['_seq'] = CoreExtension::ensureTraversable((isset($context["recommendedJobs"]) || array_key_exists("recommendedJobs"$context) ? $context["recommendedJobs"] : (function () { throw new RuntimeError('Variable "recommendedJobs" does not exist.'623$this->source); })()));
  1020.             foreach ($context['_seq'] as $context["_key"] => $context["k"]) {
  1021.                 // line 624
  1022.                 yield "                    <div class=\"col-md-6 col-lg-4\">
  1023.                         <a href=\"";
  1024.                 // line 625
  1025.                 if ((CoreExtension::getAttribute($this->env$this->source$context["k"], "locale", [], "any"falsefalsefalse625) == "fr")) {
  1026.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("locale_cvs_application_job_show", ["_locale" => CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source, (isset($context["app"]) || array_key_exists("app"$context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.'625$this->source); })()), "request", [], "any"falsefalsefalse625), "locale", [], "any"falsefalsefalse625), "slug" => CoreExtension::getAttribute($this->env$this->source$context["k"], "slug", [], "any"falsefalsefalse625)]), "html"nulltrue);
  1027.                 } else {
  1028.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("cvs_application_job_show", ["slug" => CoreExtension::getAttribute($this->env$this->source$context["k"], "slug", [], "any"falsefalsefalse625)]), "html"nulltrue);
  1029.                 }
  1030.                 yield "\" class=\"job-card\">
  1031.                             <div class=\"job-card__header\">
  1032.                                 ";
  1033.                 // line 627
  1034.                 if ((CoreExtension::getAttribute($this->env$this->source$context["k"], "image", [], "any"falsefalsefalse627) && CoreExtension::getAttribute($this->env$this->sourceCoreExtension::getAttribute($this->env$this->source$context["k"], "image", [], "any"falsefalsefalse627), "name", [], "any"falsefalsefalse627))) {
  1035.                     // line 628
  1036.                     yield "                                    <img src=\"";
  1037.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Vich\UploaderBundle\Twig\Extension\UploaderExtension']->asset($context["k"], "imageFile"), "html"nulltrue);
  1038.                     yield "\" alt=\"";
  1039.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["k"], "companyName", [], "any"falsefalsefalse628), "html"nulltrue);
  1040.                     yield "\" class=\"job-card__logo\">
  1041.                                 ";
  1042.                 } else {
  1043.                     // line 630
  1044.                     yield "                                    <div class=\"job-card__logo job-card__logo--placeholder\">
  1045.                                         ";
  1046.                     // line 631
  1047.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::upper($this->env->getCharset(), Twig\Extension\CoreExtension::slice($this->env->getCharset(), ((CoreExtension::getAttribute($this->env$this->source$context["k"], "companyName", [], "any"truetruefalse631)) ? (Twig\Extension\CoreExtension::default(CoreExtension::getAttribute($this->env$this->source$context["k"], "companyName", [], "any"falsefalsefalse631), "?")) : ("?")), 01)), "html"nulltrue);
  1048.                     yield "
  1049.                                     </div>
  1050.                                 ";
  1051.                 }
  1052.                 // line 634
  1053.                 yield "                                <div class=\"job-card__company\">
  1054.                                     <span class=\"job-card__company-name\">";
  1055.                 // line 635
  1056.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["k"], "jobTitle", [], "any"falsefalsefalse635), "html"nulltrue);
  1057.                 yield "</span>
  1058.                                     <span class=\"job-card__location\">
  1059.                                         <i class=\"fas fa-map-marker-alt\"></i>
  1060.                                         ";
  1061.                 // line 638
  1062.                 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["k"], "city", [], "any"falsefalsefalse638), "html"nulltrue);
  1063.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["k"], "country", [], "any"falsefalsefalse638)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1064.                     yield ", ";
  1065.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["k"], "country", [], "any"falsefalsefalse638), "html"nulltrue);
  1066.                 }
  1067.                 // line 639
  1068.                 yield "                                    </span>
  1069.                                 </div>
  1070.                             </div>
  1071.                             ";
  1072.                 // line 643
  1073.                 $context["summary"] = ((CoreExtension::getAttribute($this->env$this->source$context["k"], "jobSummary", [], "any"falsefalsefalse643)) ? (CoreExtension::getAttribute($this->env$this->source$context["k"], "jobSummary", [], "any"falsefalsefalse643)) : (CoreExtension::getAttribute($this->env$this->source$context["k"], "shortDescription", [], "any"falsefalsefalse643)));
  1074.                 // line 644
  1075.                 yield "                            ";
  1076.                 if ((($tmp = (isset($context["summary"]) || array_key_exists("summary"$context) ? $context["summary"] : (function () { throw new RuntimeError('Variable "summary" does not exist.'644$this->source); })())) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1077.                     // line 645
  1078.                     yield "                                <p class=\"job-card__summary\">";
  1079.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::slice($this->env->getCharset(), Twig\Extension\CoreExtension::striptags((isset($context["summary"]) || array_key_exists("summary"$context) ? $context["summary"] : (function () { throw new RuntimeError('Variable "summary" does not exist.'645$this->source); })())), 0140), "html"nulltrue);
  1080.                     if ((Twig\Extension\CoreExtension::length($this->env->getCharset(), (isset($context["summary"]) || array_key_exists("summary"$context) ? $context["summary"] : (function () { throw new RuntimeError('Variable "summary" does not exist.'645$this->source); })())) > 140)) {
  1081.                         yield "…";
  1082.                     }
  1083.                     yield "</p>
  1084.                             ";
  1085.                 }
  1086.                 // line 647
  1087.                 yield "
  1088.                             <div class=\"job-card__footer\">
  1089.                                 ";
  1090.                 // line 649
  1091.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["k"], "employmentType", [], "any"falsefalsefalse649)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1092.                     yield "<span class=\"job-card__tag\">";
  1093.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["k"], "employmentType", [], "any"falsefalsefalse649), "html"nulltrue);
  1094.                     yield "</span>";
  1095.                 }
  1096.                 // line 650
  1097.                 yield "                                ";
  1098.                 if ((($tmp CoreExtension::getAttribute($this->env$this->source$context["k"], "remoteWork", [], "any"falsefalsefalse650)) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1099.                     yield "<span class=\"job-card__tag job-card__tag--accent\">";
  1100.                     yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env$this->source$context["k"], "remoteWork", [], "any"falsefalsefalse650), "html"nulltrue);
  1101.                     yield "</span>";
  1102.                 }
  1103.                 // line 651
  1104.                 yield "                            </div>
  1105.                         </a>
  1106.                     </div>
  1107.                 ";
  1108.             }
  1109.             $_parent $context['_parent'];
  1110.             unset($context['_seq'], $context['_key'], $context['k'], $context['_parent']);
  1111.             $context array_intersect_key($context$_parent) + $_parent;
  1112.             // line 655
  1113.             yield "            </div>
  1114.         ";
  1115.         }
  1116.         // line 657
  1117.         yield "
  1118.     </div>
  1119. ";
  1120.         
  1121.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1122.         
  1123.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1124.         yield from [];
  1125.     }
  1126.     // line 661
  1127.     /**
  1128.      * @return iterable<null|scalar|\Stringable>
  1129.      */
  1130.     public function block_footer_js(array $context, array $blocks = []): iterable
  1131.     {
  1132.         $macros $this->macros;
  1133.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  1134.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""footer_js"));
  1135.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  1136.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""footer_js"));
  1137.         // line 662
  1138.         yield "    ";
  1139.         yield from $this->yieldParentBlock("footer_js"$context$blocks);
  1140.         yield "
  1141.     <script>
  1142.         (function() {
  1143.             var fab       = document.getElementById('articleTocFab');
  1144.             var trigger   = document.getElementById('articleTocTrigger');
  1145.             var panel     = document.getElementById('articleTocPanel');
  1146.             var closeBtn  = document.getElementById('articleTocClose');
  1147.             var backdrop  = document.getElementById('articleTocBackdrop');
  1148.             var countEl   = document.getElementById('articleTocCount');
  1149.             if (!fab || !trigger) return;
  1150.             // ── Ouvrir / fermer le panneau ──
  1151.             function openPanel(){
  1152.                 fab.classList.add('is-open');
  1153.                 if (backdrop) backdrop.classList.add('is-visible');
  1154.                 trigger.setAttribute('aria-expanded', 'true');
  1155.             }
  1156.             function closePanel(){
  1157.                 fab.classList.remove('is-open');
  1158.                 if (backdrop) backdrop.classList.remove('is-visible');
  1159.                 trigger.setAttribute('aria-expanded', 'false');
  1160.             }
  1161.             function togglePanel(){
  1162.                 if (fab.classList.contains('is-open')) closePanel(); else openPanel();
  1163.             }
  1164.             trigger.addEventListener('click', function(e){ e.stopPropagation(); togglePanel(); });
  1165.             if (closeBtn) closeBtn.addEventListener('click', closePanel);
  1166.             if (backdrop) backdrop.addEventListener('click', closePanel);
  1167.             // Échap pour fermer
  1168.             document.addEventListener('keydown', function(e){
  1169.                 if (e.key === 'Escape' && fab.classList.contains('is-open')) closePanel();
  1170.             });
  1171.             // Clic en dehors (au cas où, pour les contextes sans backdrop)
  1172.             document.addEventListener('click', function(e){
  1173.                 if (!fab.classList.contains('is-open')) return;
  1174.                 if (panel && !panel.contains(e.target) && !trigger.contains(e.target)) closePanel();
  1175.             });
  1176.             // ── Scroll spy + compteur ──
  1177.             var summaryLinks = document.querySelectorAll('.article-summary a[href^=\"#\"]');
  1178.             if (countEl) {
  1179.                 countEl.textContent = summaryLinks.length || '·';
  1180.             }
  1181.             if (!summaryLinks.length) return;
  1182.             var targets = [];
  1183.             summaryLinks.forEach(function(link) {
  1184.                 var id = link.getAttribute('href').replace('#', '');
  1185.                 var target = document.getElementById(id);
  1186.                 if (target) targets.push({ link: link, target: target });
  1187.             });
  1188.             if (!targets.length) return;
  1189.             function onScroll() {
  1190.                 var scrollY = window.scrollY + 120;
  1191.                 var current = null;
  1192.                 var currentIndex = 0;
  1193.                 targets.forEach(function(item, i) {
  1194.                     if (item.target.offsetTop <= scrollY) {
  1195.                         current = item;
  1196.                         currentIndex = i;
  1197.                     }
  1198.                 });
  1199.                 summaryLinks.forEach(function(l) { l.parentElement.classList.remove('active'); });
  1200.                 if (current) {
  1201.                     current.link.parentElement.classList.add('active');
  1202.                     if (countEl) {
  1203.                         countEl.textContent = (currentIndex + 1) + '/' + targets.length;
  1204.                         trigger.classList.add('has-active');
  1205.                     }
  1206.                 } else {
  1207.                     if (countEl) countEl.textContent = targets.length;
  1208.                     trigger.classList.remove('has-active');
  1209.                 }
  1210.             }
  1211.             window.addEventListener('scroll', onScroll, { passive: true });
  1212.             onScroll();
  1213.             // Ferme le panneau quand on clique sur un lien d'ancre
  1214.             summaryLinks.forEach(function(link){
  1215.                 link.addEventListener('click', function(){
  1216.                     setTimeout(closePanel, 150);
  1217.                 });
  1218.             });
  1219.         })();
  1220.     </script>
  1221. ";
  1222.         
  1223.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1224.         
  1225.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1226.         yield from [];
  1227.     }
  1228.     /**
  1229.      * @codeCoverageIgnore
  1230.      */
  1231.     public function getTemplateName(): string
  1232.     {
  1233.         return "application/whileresume/website/page_article.html.twig";
  1234.     }
  1235.     /**
  1236.      * @codeCoverageIgnore
  1237.      */
  1238.     public function isTraitable(): bool
  1239.     {
  1240.         return false;
  1241.     }
  1242.     /**
  1243.      * @codeCoverageIgnore
  1244.      */
  1245.     public function getDebugInfo(): array
  1246.     {
  1247.         return array (  1226 => 662,  1213 => 661,  1200 => 657,  1196 => 655,  1187 => 651,  1180 => 650,  1174 => 649,  1170 => 647,  1161 => 645,  1158 => 644,  1156 => 643,  1150 => 639,  1144 => 638,  1138 => 635,  1135 => 634,  1129 => 631,  1126 => 630,  1118 => 628,  1116 => 627,  1107 => 625,  1104 => 624,  1100 => 623,  1089 => 615,  1080 => 613,  1073 => 611,  1063 => 603,  1060 => 602,  1057 => 600,  1054 => 599,  1040 => 590,  1035 => 588,  1032 => 587,  1029 => 586,  1024 => 584,  1021 => 583,  1019 => 582,  1015 => 581,  1010 => 579,  1006 => 577,  999 => 572,  993 => 570,  991 => 569,  986 => 567,  983 => 566,  980 => 565,  977 => 564,  974 => 563,  971 => 562,  968 => 561,  965 => 560,  962 => 559,  959 => 558,  956 => 557,  953 => 556,  950 => 555,  947 => 554,  944 => 553,  941 => 551,  937 => 550,  930 => 548,  927 => 547,  924 => 546,  921 => 544,  917 => 543,  914 => 542,  902 => 533,  898 => 532,  895 => 531,  891 => 529,  887 => 527,  885 => 526,  879 => 523,  873 => 520,  856 => 506,  852 => 505,  849 => 504,  845 => 502,  841 => 500,  839 => 499,  833 => 496,  827 => 493,  815 => 483,  811 => 481,  807 => 479,  805 => 478,  794 => 469,  791 => 468,  786 => 464,  782 => 462,  776 => 461,  770 => 459,  767 => 458,  764 => 457,  760 => 456,  757 => 455,  754 => 454,  748 => 450,  743 => 447,  740 => 445,  731 => 439,  723 => 433,  718 => 429,  711 => 425,  706 => 423,  703 => 422,  701 => 421,  696 => 419,  685 => 411,  674 => 404,  671 => 402,  668 => 401,  665 => 400,  659 => 395,  656 => 386,  650 => 383,  644 => 379,  642 => 378,  638 => 376,  632 => 374,  630 => 373,  625 => 371,  621 => 369,  612 => 365,  609 => 364,  606 => 363,  602 => 360,  598 => 357,  585 => 356,  231 => 13,  218 => 12,  195 => 10,  167 => 9,  143 => 8,  120 => 7,  97 => 6,  74 => 5,  63 => 1,  61 => 3,  48 => 1,);
  1248.     }
  1249.     public function getSourceContext(): Source
  1250.     {
  1251.         return new Source("{% extends 'application/whileresume/website/layout-social.html.twig' %}
  1252. {% set paramArticle = getCoreToolsList(\"article\") %}
  1253. {% block title %}{{ article.title }}{% endblock title %}
  1254. {% block description %}{{ article.shortDescription }}{% endblock description %}
  1255. {% block robots %}index,follow{% endblock robots %}
  1256. {% block meta_social %}{{ parent() }}{% include \"/vitrine/components/socialmedia_articles.html.twig\" with { 'social_type':'article','article':article } %}{% endblock meta_social %}
  1257. {% block meta %}{{ parent() }}{% if article.author is not null and article.author is not empty %}<meta name=\"author\" content=\"{{ article.author }}\" />{% endif %}{% endblock meta %}
  1258. {% block canonical %}{% include \"/vitrine/lexend/articles/components/canonical.html.twig\" with {'article':article} %}{% endblock canonical %}
  1259. {% block css %}
  1260.     {{ parent() }}
  1261.     <style>
  1262.         /* ═══════════════════════════════════════════════════════════════
  1263.            PAGE ARTICLE — pattern jobs/show (1 colonne max-width 880px)
  1264.         ═══════════════════════════════════════════════════════════════ */
  1265.         .article-layout{display:block;max-width:880px;margin:0 auto}
  1266.         /* ─── Header card (titre + meta) ─── */
  1267.         .article-card-main{position:relative;background:#fff;border-radius:16px;box-shadow:0 4px 20px 0 rgba(0,0,0,0.06);overflow:hidden;margin-bottom:14px}
  1268.         .article-card-cover{position:relative;width:100%;height:180px;background:linear-gradient(135deg,#6C3AED 0%,#8B5CF6 50%,#A78BFA 100%);overflow:hidden}
  1269.         .article-card-cover img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
  1270.         .article-card-cover-overlay{position:absolute;inset:0;background:linear-gradient(to bottom,rgba(0,0,0,.1) 0%,rgba(0,0,0,.55) 100%)}
  1271.         @media(max-width:480px){.article-card-cover{height:140px}}
  1272.         .article-card-head{padding:20px 24px 18px}
  1273.         @media(max-width:480px){.article-card-head{padding:16px 18px 14px}}
  1274.         .article-card-title{font-size:24px;font-weight:800;color:#1E1B2E;line-height:1.25;letter-spacing:-0.02em;margin:0 0 10px}
  1275.         @media(min-width:768px){.article-card-title{font-size:28px}}
  1276.         @media(max-width:480px){.article-card-title{font-size:22px}}
  1277.         .article-card-subtitle{font-size:15px;color:#4B5563;line-height:1.5;margin:0 0 14px}
  1278.         @media(max-width:480px){.article-card-subtitle{font-size:14px}}
  1279.         .article-card-meta{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:0}
  1280.         .article-card-meta-item{display:inline-flex;align-items:center;gap:5px;padding:5px 11px;border-radius:100px;background:#F3F4F6;font-size:12px;color:#4B5563;font-weight:500}
  1281.         .article-card-meta-item svg{width:12px;height:12px;flex-shrink:0;color:#6B7280}
  1282.         .article-card-meta-featured{background:#FEF3C7;color:#92400E;font-weight:600}
  1283.         .article-card-meta-featured svg{color:currentColor}
  1284.         /* ─── TOC sommaire flottant (bas à gauche, minimaliste) ─── */
  1285.         .article-toc-fab{
  1286.             position:fixed;
  1287.             left:20px;
  1288.             bottom:20px;
  1289.             z-index:100;
  1290.         }
  1291.         @media(max-width:991px){
  1292.             .article-toc-fab{left:16px;bottom:16px}
  1293.         }
  1294.         /* Bouton FAB (état fermé) */
  1295.         .article-toc-trigger{
  1296.             display:inline-flex;align-items:center;gap:8px;
  1297.             background:#1E1B2E;
  1298.             color:#fff;
  1299.             border:none;
  1300.             border-radius:100px;
  1301.             padding:11px 18px 11px 14px;
  1302.             font-size:13px;font-weight:600;
  1303.             font-family:inherit;
  1304.             cursor:pointer;
  1305.             box-shadow:0 8px 24px rgba(30,27,46,.28),0 2px 6px rgba(30,27,46,.18);
  1306.             transition:transform .2s ease,box-shadow .2s ease,background .15s ease;
  1307.         }
  1308.         .article-toc-trigger:hover{
  1309.             transform:translateY(-2px);
  1310.             box-shadow:0 12px 30px rgba(30,27,46,.35),0 3px 8px rgba(30,27,46,.22);
  1311.             background:var(--theme-color,#6C3AED);
  1312.         }
  1313.         .article-toc-trigger-icon{
  1314.             display:inline-flex;align-items:center;justify-content:center;
  1315.             width:24px;height:24px;border-radius:50%;
  1316.             background:rgba(255,255,255,.15);
  1317.             flex-shrink:0;
  1318.         }
  1319.         .article-toc-trigger-icon svg{width:12px;height:12px}
  1320.         .article-toc-trigger-count{
  1321.             display:inline-flex;align-items:center;justify-content:center;
  1322.             min-width:20px;height:20px;padding:0 6px;border-radius:100px;
  1323.             background:var(--theme-color,#6C3AED);
  1324.             color:#fff;
  1325.             font-size:10.5px;font-weight:700;
  1326.             line-height:1;
  1327.             margin-left:2px;
  1328.         }
  1329.         .article-toc-trigger.has-active .article-toc-trigger-count{
  1330.             background:#fff;
  1331.             color:var(--theme-color,#6C3AED);
  1332.         }
  1333.         @media(max-width:540px){
  1334.             .article-toc-trigger-label{display:none}
  1335.             .article-toc-trigger{padding:11px 12px}
  1336.         }
  1337.         /* Panneau (état ouvert) */
  1338.         .article-toc-panel{
  1339.             position:absolute;
  1340.             left:0;
  1341.             bottom:calc(100% + 10px);
  1342.             width:320px;
  1343.             max-width:calc(100vw - 40px);
  1344.             background:#fff;
  1345.             border-radius:16px;
  1346.             box-shadow:0 16px 48px rgba(0,0,0,.18),0 4px 12px rgba(0,0,0,.08);
  1347.             opacity:0;
  1348.             transform:translateY(8px) scale(.96);
  1349.             transform-origin:bottom left;
  1350.             pointer-events:none;
  1351.             transition:opacity .2s ease,transform .2s ease;
  1352.             overflow:hidden;
  1353.         }
  1354.         .article-toc-fab.is-open .article-toc-panel{
  1355.             opacity:1;
  1356.             transform:translateY(0) scale(1);
  1357.             pointer-events:auto;
  1358.         }
  1359.         @media(max-width:540px){
  1360.             .article-toc-panel{width:calc(100vw - 32px);max-width:340px}
  1361.         }
  1362.         .article-toc-panel-header{
  1363.             display:flex;align-items:center;gap:10px;
  1364.             padding:14px 16px;
  1365.             border-bottom:1px solid #F3F4F6;
  1366.         }
  1367.         .article-toc-panel-icon{
  1368.             display:inline-flex;align-items:center;justify-content:center;
  1369.             width:28px;height:28px;border-radius:8px;
  1370.             background:#F5F3FF;
  1371.             color:var(--theme-color,#6C3AED);
  1372.             flex-shrink:0;
  1373.         }
  1374.         .article-toc-panel-icon svg{width:13px;height:13px}
  1375.         .article-toc-panel-label{
  1376.             font-size:11px;font-weight:700;
  1377.             color:#1E1B2E;
  1378.             text-transform:uppercase;letter-spacing:.08em;
  1379.             flex:1;margin:0;
  1380.         }
  1381.         .article-toc-panel-close{
  1382.             background:transparent;border:0;
  1383.             color:#9CA3AF;cursor:pointer;
  1384.             padding:4px;line-height:1;
  1385.             display:inline-flex;
  1386.             border-radius:6px;
  1387.             transition:background .15s,color .15s;
  1388.         }
  1389.         .article-toc-panel-close:hover{background:#F3F4F6;color:#1E1B2E}
  1390.         .article-toc-panel-close svg{width:14px;height:14px}
  1391.         .article-toc-panel-body{
  1392.             padding:14px 16px;
  1393.             max-height:60vh;
  1394.             overflow-y:auto;
  1395.         }
  1396.         .article-toc-panel-body::-webkit-scrollbar{width:4px}
  1397.         .article-toc-panel-body::-webkit-scrollbar-thumb{background:#E5E7EB;border-radius:4px}
  1398.         .article-summary ul,.article-summary ol{padding-left:0;margin:0;list-style:none}
  1399.         .article-summary li{font-size:13px;line-height:1.5;margin-bottom:6px;font-weight:500;position:relative;padding-left:14px}
  1400.         .article-summary li::before{content:\"\";position:absolute;left:0;top:8px;width:5px;height:5px;border-radius:50%;background:#D1D5DB;transition:background .15s ease,transform .15s ease}
  1401.         .article-summary li:hover::before{background:var(--theme-color,#6C3AED);transform:scale(1.4)}
  1402.         .article-summary li a{color:#4B5563;text-decoration:none;transition:color .15s ease;display:block}
  1403.         .article-summary li a:hover{color:var(--theme-color,#6C3AED)}
  1404.         .article-summary li.active>a{color:var(--theme-color,#6C3AED);font-weight:700}
  1405.         .article-summary li.active::before{background:var(--theme-color,#6C3AED);transform:scale(1.4)}
  1406.         .article-summary ul ul,.article-summary ol ol{margin-top:6px;padding-left:14px}
  1407.         /* Backdrop discret (clic en dehors pour fermer) */
  1408.         .article-toc-backdrop{
  1409.             position:fixed;inset:0;
  1410.             background:transparent;
  1411.             z-index:99;
  1412.             opacity:0;
  1413.             pointer-events:none;
  1414.             transition:opacity .2s ease;
  1415.         }
  1416.         .article-toc-backdrop.is-visible{
  1417.             opacity:1;
  1418.             pointer-events:auto;
  1419.         }
  1420.         /* ─── Contenu de l'article ─── */
  1421.         .article-card-content{background:#fff;border-radius:16px;box-shadow:0 4px 20px 0 rgba(0,0,0,0.06);overflow:hidden;margin-bottom:14px}
  1422.         .article-card-section{padding:24px}
  1423.         @media(max-width:480px){.article-card-section{padding:18px}}
  1424.         .article-content{font-size:15px;line-height:1.75;color:#374151}
  1425.         .article-content h2{font-size:22px;font-weight:700;color:#1E1B2E;margin:28px 0 12px;line-height:1.3;letter-spacing:-0.01em;scroll-margin-top:80px}
  1426.         .article-content h2:first-child{margin-top:0}
  1427.         .article-content h3{font-size:18px;font-weight:700;color:#1E1B2E;margin:22px 0 10px;line-height:1.3;scroll-margin-top:80px}
  1428.         .article-content h4{font-size:16px;font-weight:700;color:#1E1B2E;margin:18px 0 8px}
  1429.         .article-content p{margin-bottom:14px}
  1430.         .article-content a{color:var(--theme-color,#6C3AED);text-decoration:none;font-weight:500}
  1431.         .article-content a:hover{text-decoration:underline}
  1432.         .article-content ul,.article-content ol{padding-left:24px;margin-bottom:14px}
  1433.         .article-content li{margin-bottom:6px}
  1434.         .article-content img{max-width:100%;height:auto;border-radius:12px;margin:16px 0}
  1435.         .article-content blockquote{border-left:4px solid var(--theme-color,#6C3AED);padding:10px 18px;margin:16px 0;background:#F5F3FF;border-radius:0 8px 8px 0;font-style:italic;color:#4B5563}
  1436.         .article-content code{background:#F3F4F6;padding:2px 6px;border-radius:4px;font-size:13px;color:#D6336C;font-family:\"SF Mono\",Menlo,Monaco,Consolas,monospace}
  1437.         .article-content pre{background:#1E1B2E;color:#F3F4F6;padding:18px;border-radius:10px;overflow-x:auto;margin:16px 0;font-size:13px;line-height:1.6}
  1438.         .article-content pre code{background:transparent;color:inherit;padding:0}
  1439.         .article-content table{width:100%;border-collapse:collapse;margin:16px 0;font-size:14px}
  1440.         .article-content th,.article-content td{padding:10px 12px;border:1px solid #E5E7EB;text-align:left}
  1441.         .article-content th{background:#F9FAFB;font-weight:700;color:#1E1B2E}
  1442.         /* ─── Tags en bas du contenu ─── */
  1443.         .article-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:24px;padding-top:18px;border-top:1px solid #F3F4F6}
  1444.         .article-tag{display:inline-flex;align-items:center;padding:5px 11px;border-radius:100px;background:#F5F3FF;color:var(--theme-color,#6C3AED);font-size:12px;font-weight:600;text-decoration:none;transition:background .15s,transform .15s}
  1445.         .article-tag:hover{background:#EDE9FE;transform:translateY(-1px);color:var(--theme-color,#6C3AED)}
  1446.         .article-tag::before{content:\"#\";opacity:.6;margin-right:1px}
  1447.         /* ─── CTA inline (Recruteur / Candidat) ─── */
  1448.         .article-cta{position:relative;border-radius:18px;padding:24px;margin-bottom:14px;background:linear-gradient(135deg,#6C3AED 0%,#8B5CF6 50%,#A78BFA 100%);overflow:hidden;box-shadow:0 10px 30px -8px rgba(108,58,237,.35)}
  1449.         .article-cta::before{content:\"\";position:absolute;top:-40px;right:-40px;width:180px;height:180px;background:radial-gradient(circle,rgba(255,255,255,.15) 0%,transparent 70%);pointer-events:none}
  1450.         .article-cta::after{content:\"\";position:absolute;bottom:-60px;left:-60px;width:200px;height:200px;background:radial-gradient(circle,rgba(255,255,255,.08) 0%,transparent 70%);pointer-events:none}
  1451.         .article-cta-eyebrow{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;color:#fff;text-transform:uppercase;letter-spacing:.1em;background:rgba(255,255,255,.18);padding:5px 12px;border-radius:100px;margin-bottom:12px;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);position:relative;z-index:2}
  1452.         .article-cta-eyebrow svg{width:12px;height:12px}
  1453.         .article-cta-title{font-size:20px;font-weight:800;color:#fff;line-height:1.25;letter-spacing:-0.01em;margin:0 0 18px;position:relative;z-index:2}
  1454.         @media(min-width:768px){.article-cta-title{font-size:24px}}
  1455.         .article-cta-grid{display:grid;grid-template-columns:1fr;gap:12px;position:relative;z-index:2}
  1456.         @media(min-width:640px){.article-cta-grid{grid-template-columns:1fr 1fr;gap:14px}}
  1457.         .article-cta-side{background:rgba(255,255,255,.97);border-radius:14px;padding:18px;display:flex;flex-direction:column;transition:transform .2s,box-shadow .2s}
  1458.         .article-cta-side:hover{transform:translateY(-2px);box-shadow:0 12px 24px -8px rgba(0,0,0,.18)}
  1459.         .article-cta-side-head{display:flex;align-items:center;gap:10px;margin-bottom:10px}
  1460.         .article-cta-side-icon{width:38px;height:38px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#EDE9FE,#DDD6FE);color:var(--theme-color,#6C3AED);flex-shrink:0}
  1461.         .article-cta-side-icon svg{width:18px;height:18px}
  1462.         .article-cta-side-label{font-size:11px;font-weight:700;color:var(--theme-color,#6C3AED);text-transform:uppercase;letter-spacing:.08em;margin:0}
  1463.         .article-cta-side-heading{font-size:15px;font-weight:700;color:#1E1B2E;line-height:1.3;margin:0 0 8px}
  1464.         .article-cta-side-text{font-size:13px;color:#6B7280;line-height:1.5;margin:0 0 14px;flex:1}
  1465.         .article-cta-side-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:var(--theme-color,#6C3AED);color:#fff;text-decoration:none;padding:11px 16px;border-radius:10px;font-size:13px;font-weight:700;letter-spacing:.01em;transition:background .15s,transform .15s}
  1466.         .article-cta-side-btn:hover{background:#5B21B6;color:#fff;transform:translateX(2px)}
  1467.         .article-cta-side-btn svg{width:14px;height:14px;transition:transform .15s}
  1468.         .article-cta-side-btn:hover svg{transform:translateX(2px)}
  1469.         /* ─── Articles similaires (style identique aux jobs) ─── */
  1470.         .similar-section-title{font-size:11px;font-weight:700;color:#9CA3AF;text-transform:uppercase;letter-spacing:.08em;margin:32px 0 12px;padding-left:4px;display:inline-flex;align-items:center;gap:8px}
  1471.         .similar-card{background:#fff;border-radius:14px;padding:14px;box-shadow:0 0 16px 0 rgba(0,0,0,0.04);margin-bottom:10px;display:flex;align-items:center;gap:14px;text-decoration:none;color:inherit;transition:transform .15s,box-shadow .2s}
  1472.         .similar-card:hover{transform:translateY(-1px);box-shadow:0 4px 20px rgba(108,58,237,.1);color:inherit}
  1473.         .similar-card-logo{width:50px;height:50px;border-radius:12px;background:linear-gradient(135deg,#EDE9FE,#DDD6FE);display:flex;align-items:center;justify-content:center;color:var(--theme-color,#6C3AED);flex-shrink:0;overflow:hidden}
  1474.         .similar-card-logo img{width:100%;height:100%;object-fit:cover;border-radius:8px}
  1475.         .similar-card-logo svg{width:24px;height:24px;opacity:.9}
  1476.         .similar-card-info{flex:1;min-width:0}
  1477.         .similar-card-title{font-size:14px;font-weight:700;color:#1E1B2E;line-height:1.3;margin:0 0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  1478.         .similar-card-meta{font-size:12px;color:#6B7280;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;gap:8px}
  1479.         .similar-card-meta-sep{display:inline-block;width:3px;height:3px;border-radius:50%;background:#D1D5DB;flex-shrink:0}
  1480.         .similar-card-arrow{flex-shrink:0;color:#9CA3AF;transition:color .15s,transform .15s}
  1481.         .similar-card:hover .similar-card-arrow{color:var(--theme-color,#6C3AED);transform:translateX(2px)}
  1482.         .similar-card-arrow svg{width:18px;height:18px}
  1483.         /* ─── Section \"Offres recommandées\" (cross-sell article -> jobs) ─── */
  1484.         .recommended-jobs-header{
  1485.             display:flex;align-items:center;justify-content:space-between;gap:10px;
  1486.             margin:32px 0 12px;padding-left:4px;flex-wrap:wrap;
  1487.         }
  1488.         .recommended-jobs-header .similar-section-title{margin:0}
  1489.         .recommended-jobs-icon{
  1490.             display:inline-flex;align-items:center;justify-content:center;
  1491.             width:22px;height:22px;border-radius:6px;
  1492.             background:#F5F3FF;
  1493.             color:var(--theme-color,#6C3AED);
  1494.             flex-shrink:0;
  1495.         }
  1496.         .recommended-jobs-icon svg{width:11px;height:11px}
  1497.         .recommended-jobs-all{
  1498.             display:inline-flex;align-items:center;gap:4px;
  1499.             font-size:12px;font-weight:600;
  1500.             color:var(--theme-color,#6C3AED);
  1501.             text-decoration:none;
  1502.             padding:5px 10px;border-radius:100px;
  1503.             border:1px dashed rgba(108,58,237,.35);
  1504.             transition:background .15s,border-style .15s,transform .15s;
  1505.         }
  1506.         .recommended-jobs-all:hover{
  1507.             background:#F5F3FF;
  1508.             border-style:solid;
  1509.             color:var(--theme-color,#6C3AED);
  1510.             transform:translateX(2px);
  1511.         }
  1512.         .recommended-jobs-all svg{width:11px;height:11px}
  1513.         /* Grille des cards jobs (style identique au composant _jobs_content.html.twig) */
  1514.         .recommended-jobs-grid{margin-bottom:14px}
  1515.         .recommended-jobs-grid .job-card{
  1516.             display:flex;flex-direction:column;gap:.75rem;
  1517.             height:100%;
  1518.             padding:1.25rem;
  1519.             background:#fff;
  1520.             border:1px solid #e6e8ec;
  1521.             border-radius:14px;
  1522.             text-decoration:none;color:inherit;
  1523.             transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease;
  1524.         }
  1525.         .recommended-jobs-grid .job-card:hover{
  1526.             transform:translateY(-2px);
  1527.             box-shadow:0 8px 24px rgba(20,24,40,.08);
  1528.             border-color:#d6d9e0;
  1529.             text-decoration:none;color:inherit;
  1530.         }
  1531.         .recommended-jobs-grid .job-card__header{display:flex;align-items:center;gap:.75rem}
  1532.         .recommended-jobs-grid .job-card__logo{
  1533.             width:44px;height:44px;
  1534.             border-radius:10px;
  1535.             object-fit:cover;
  1536.             background:#f4f5f8;
  1537.             flex-shrink:0;
  1538.         }
  1539.         .recommended-jobs-grid .job-card__logo--placeholder{
  1540.             display:flex;align-items:center;justify-content:center;
  1541.             font-weight:700;color:#6b7280;
  1542.             background:linear-gradient(135deg,#eef2ff,#f5f3ff);
  1543.         }
  1544.         .recommended-jobs-grid .job-card__company{
  1545.             display:flex;flex-direction:column;
  1546.             min-width:0;
  1547.         }
  1548.         .recommended-jobs-grid .job-card__company-name{
  1549.             font-weight:600;font-size:.9rem;color:#111827;
  1550.             white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  1551.         }
  1552.         .recommended-jobs-grid .job-card__location{
  1553.             font-size:.8rem;color:#6b7280;
  1554.             display:inline-flex;align-items:center;gap:.25rem;
  1555.         }
  1556.         .recommended-jobs-grid .job-card__summary{
  1557.             font-size:.875rem;color:#4b5563;
  1558.             margin:0;line-height:1.45;
  1559.             display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  1560.             overflow:hidden;
  1561.         }
  1562.         .recommended-jobs-grid .job-card__footer{
  1563.             display:flex;flex-wrap:wrap;gap:.375rem;
  1564.             margin-top:auto;padding-top:.5rem;
  1565.         }
  1566.         .recommended-jobs-grid .job-card__tag{
  1567.             font-size:.72rem;font-weight:500;
  1568.             padding:.25rem .55rem;
  1569.             border-radius:999px;
  1570.             background:#f3f4f6;color:#374151;
  1571.         }
  1572.         .recommended-jobs-grid .job-card__tag--accent{
  1573.             background:#eef2ff;color:#4338ca;
  1574.         }
  1575.         /* Bouton retour vers la liste */
  1576.         .article-back-link{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;background:#fff;border:1px solid #E5E7EB;border-radius:10px;font-size:12px;font-weight:600;color:#4B5563;text-decoration:none;margin-bottom:14px;transition:border-color .15s,color .15s}
  1577.         .article-back-link:hover{border-color:var(--theme-color,#6C3AED);color:var(--theme-color,#6C3AED)}
  1578.         .article-back-link svg{width:13px;height:13px}
  1579.     </style>
  1580. {% endblock css %}
  1581. {% block body %}
  1582.     <div class=\"article-layout\">
  1583.         {# ═══ Card principale : titre + meta + cover ═══ #}
  1584.         <article class=\"article-card-main\">
  1585.             {# Cover (si image) #}
  1586.             {% if article.image.name is not null %}
  1587.                 <div class=\"article-card-cover\">
  1588.                     <img src=\"{{ vich_uploader_asset(article, 'imageFile') }}\" alt=\"{{ article.title }}\" />
  1589.                     <div class=\"article-card-cover-overlay\"></div>
  1590.                 </div>
  1591.             {% endif %}
  1592.             <div class=\"article-card-head\">
  1593.                 <h1 class=\"article-card-title\">{{ article.title }}</h1>
  1594.                 {% if article.subtitle is not empty %}
  1595.                     <p class=\"article-card-subtitle\">{{ article.subtitle }}</p>
  1596.                 {% endif %}
  1597.                 <div class=\"article-card-meta\">
  1598.                     {% if article.author is not null and article.author is not empty %}
  1599.                         <span class=\"article-card-meta-item\">
  1600.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1601.                                 <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/>
  1602.                             </svg>
  1603.                             {{ article.author }}
  1604.                         </span>
  1605.                     {% endif %}
  1606.                     {#if article.pageslug is not empty %}
  1607.                         <span class=\"article-card-meta-item\">
  1608.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1609.                                 <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\"/>
  1610.                             </svg>
  1611.                             {{ article.pageslug }}
  1612.                         </span>
  1613.                     {% endif %#}
  1614.                 </div>
  1615.             </div>
  1616.         </article>
  1617.         {# ═══ Sommaire flottant en bas à gauche (FAB) ═══ #}
  1618.         {% set summaryHtml = autosummary(article.description) %}
  1619.         {% if summaryHtml is not empty %}
  1620.             <div class=\"article-toc-fab\" id=\"articleTocFab\">
  1621.                 {# Panneau (au-dessus du bouton, masqué par défaut) #}
  1622.                 <div class=\"article-toc-panel\" id=\"articleTocPanel\" role=\"dialog\" aria-label=\"{{ 'article.summary.title'|trans({}, 'vitrine-lexend') }}\">
  1623.                     <div class=\"article-toc-panel-header\">
  1624.                         <span class=\"article-toc-panel-icon\">
  1625.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1626.                                 <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>
  1627.                             </svg>
  1628.                         </span>
  1629.                         <span class=\"article-toc-panel-label\">{{ 'article.summary.title'|trans({}, 'vitrine-lexend') }}</span>
  1630.                         <button type=\"button\" class=\"article-toc-panel-close\" id=\"articleTocClose\" aria-label=\"Close\">
  1631.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1632.                                 <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>
  1633.                             </svg>
  1634.                         </button>
  1635.                     </div>
  1636.                     <div class=\"article-toc-panel-body\">
  1637.                         <div class=\"summary article-summary\">{{ summaryHtml|raw }}</div>
  1638.                         {% if is_granted('ROLE_SUPER_ADMIN') %}
  1639.                             <div style=\"margin-top:12px;padding-top:10px;border-top:1px solid #F3F4F6;\">
  1640.                                 <a href=\"{{ path('bo_articles_edit',{'id':article.id}) }}\"
  1641.                                    style=\"font-size:11px;font-weight:600;color:#DC2626;text-transform:uppercase;letter-spacing:.06em;text-decoration:none;\">
  1642.                                     <i class=\"feather-edit-2 me-1\"></i>{{ 'article.summary.edit'|trans({}, 'vitrine-lexend') }}
  1643.                                 </a>
  1644.                             </div>
  1645.                         {% endif %}
  1646.                     </div>
  1647.                 </div>
  1648.                 {# Bouton FAB (toujours visible) #}
  1649.                 <button type=\"button\" class=\"article-toc-trigger\" id=\"articleTocTrigger\" aria-expanded=\"false\">
  1650.                     <span class=\"article-toc-trigger-icon\">
  1651.                         <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1652.                             <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>
  1653.                         </svg>
  1654.                     </span>
  1655.                     <span class=\"article-toc-trigger-label\">{{ 'article.summary.title'|trans({}, 'vitrine-lexend') }}</span>
  1656.                     <span class=\"article-toc-trigger-count\" id=\"articleTocCount\">·</span>
  1657.                 </button>
  1658.             </div>
  1659.             <div class=\"article-toc-backdrop\" id=\"articleTocBackdrop\"></div>
  1660.         {% endif %}
  1661.         {# ═══ Contenu de l'article ═══ #}
  1662.         <div class=\"article-card-content\">
  1663.             <div class=\"article-card-section\">
  1664.                 <div id=\"single-post\" class=\"post-content article-content\">
  1665.                     {{ contentArticle(autosummaryID(article.description))|raw }}
  1666.                 </div>
  1667.                 {# Tags #}
  1668.                 {% if article.tags is not empty %}
  1669.                     <div class=\"article-tags\">
  1670.                         {% for tag in article.tags|split(',') %}
  1671.                             {% set t = tag|trim %}
  1672.                             {% if t is not empty %}
  1673.                                 <span class=\"article-tag\">{{ t }}</span>
  1674.                             {% endif %}
  1675.                         {% endfor %}
  1676.                     </div>
  1677.                 {% endif %}
  1678.             </div>
  1679.         </div>
  1680.         {# ═══ CTA Recruteur / Candidat ═══ #}
  1681.         {% if getEnv(\"KERNEL_APPLICATION\") == \"whileresume\" and app.request.locale in ['fr','en'] %}
  1682.             <div class=\"article-cta\">
  1683.                 <span class=\"article-cta-eyebrow\">
  1684.                     <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1685.                         <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/>
  1686.                     </svg>
  1687.                     Whileresume
  1688.                 </span>
  1689.                 <h2 class=\"article-cta-title\">
  1690.                     {% if app.request.locale == 'fr' %}
  1691.                         Talents et entreprises se rencontrent ici.
  1692.                     {% else %}
  1693.                         Where talent meets fast-growing companies.
  1694.                     {% endif %}
  1695.                 </h2>
  1696.                 <div class=\"article-cta-grid\">
  1697.                     <div class=\"article-cta-side\">
  1698.                         <div class=\"article-cta-side-head\">
  1699.                             <span class=\"article-cta-side-icon\">
  1700.                                 <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1701.                                     <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"/><path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/>
  1702.                                 </svg>
  1703.                             </span>
  1704.                             <span class=\"article-cta-side-label\">{{ app.request.locale == 'fr' ? 'Recruteur' : 'Recruiter' }}</span>
  1705.                         </div>
  1706.                         <h3 class=\"article-cta-side-heading\">
  1707.                             {{ app.request.locale == 'fr' ? \"Recrutez des profils d'exception, plus vite.\" : 'Hire exceptional talent, faster.' }}
  1708.                         </h3>
  1709.                         <p class=\"article-cta-side-text\">
  1710.                             {% if app.request.locale == 'fr' %}
  1711.                                 Accédez aux meilleurs talents du marché et connectez-vous directement à des candidats qualifiés en quête de leur prochain défi.
  1712.                             {% else %}
  1713.                                 Get access to top market talent and connect directly with qualified candidates ready for their next challenge.
  1714.                             {% endif %}
  1715.                         </p>
  1716.                         <a href=\"{{ path('whileresume_business_' ~ app.request.locale) }}\" class=\"article-cta-side-btn\">
  1717.                             {{ app.request.locale == 'fr' ? 'Je recrute' : \"I'm recruiting\" }}
  1718.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1719.                                 <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12 5 19 12 12 19\"/>
  1720.                             </svg>
  1721.                         </a>
  1722.                     </div>
  1723.                     <div class=\"article-cta-side\">
  1724.                         <div class=\"article-cta-side-head\">
  1725.                             <span class=\"article-cta-side-icon\">
  1726.                                 <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1727.                                     <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/><circle cx=\"12\" cy=\"7\" r=\"4\"/>
  1728.                                 </svg>
  1729.                             </span>
  1730.                             <span class=\"article-cta-side-label\">{{ app.request.locale == 'fr' ? 'Candidat' : 'Candidate' }}</span>
  1731.                         </div>
  1732.                         <h3 class=\"article-cta-side-heading\">
  1733.                             {{ app.request.locale == 'fr' ? 'Trouvez le job qui vous ressemble.' : 'Find the job that fits you.' }}
  1734.                         </h3>
  1735.                         <p class=\"article-cta-side-text\">
  1736.                             {% if app.request.locale == 'fr' %}
  1737.                                 On vous accompagne dans la recherche de votre poste idéal au sein des entreprises les plus prometteuses du marché.
  1738.                             {% else %}
  1739.                                 We support you in finding your ideal position within the most promising companies on the market.
  1740.                             {% endif %}
  1741.                         </p>
  1742.                         <a href=\"{{ path('whileresume_resume_' ~ app.request.locale) }}\" class=\"article-cta-side-btn\">
  1743.                             {{ app.request.locale == 'fr' ? 'Je cherche un job' : \"I'm looking for a job\" }}
  1744.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1745.                                 <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/><polyline points=\"12 5 19 12 12 19\"/>
  1746.                             </svg>
  1747.                         </a>
  1748.                     </div>
  1749.                 </div>
  1750.             </div>
  1751.         {% endif %}
  1752.         {% if article.ctaHTML is not empty %}{{ article.ctaHTML|raw }}{% endif %}
  1753.         {# ═══ Articles similaires ═══ #}
  1754.         {% if similarArticles is defined and similarArticles is not empty %}
  1755.             <h4 class=\"similar-section-title\">
  1756.                 {{ app.request.locale == 'fr' ? 'Articles similaires' : 'Similar articles' }} · {{ similarArticles|length }}
  1757.             </h4>
  1758.             {% for sa in similarArticles %}
  1759.                 {# Construction de l'URL article (idem que dans list.html.twig) #}
  1760.                 {% set prefix = \"\" %}
  1761.                 {% set urlSa = path('cvs_website_article',{'slug': sa.slug}) %}
  1762.                 {% if app.request.locale != default_locale %}
  1763.                     {% set urlSa = path('locale_cvs_website_article',{'_locale':app.request.locale,'slug': sa.slug}) %}
  1764.                     {% set prefix = \"/\" ~ app.request.locale %}
  1765.                 {% endif %}
  1766.                 {% if sa.pageslug3 is not empty %}
  1767.                     {% set urlSa = prefix ~ '/' ~ sa.pageslug ~ '/' ~ sa.pageslug2 ~ '/' ~ sa.pageslug3 %}
  1768.                 {% elseif sa.pageslug2 is not empty %}
  1769.                     {% set urlSa = prefix ~ '/' ~ sa.pageslug ~ '/' ~ sa.pageslug2 %}
  1770.                 {% elseif sa.pageslug is not empty %}
  1771.                     {% set urlSa = prefix ~ '/' ~ sa.pageslug %}
  1772.                 {% endif %}
  1773.                 <a href=\"{{ urlSa }}\" class=\"similar-card\">
  1774.                     <div class=\"similar-card-logo\">
  1775.                         {% if sa.image.name is not null %}
  1776.                             <img src=\"{{ vich_uploader_asset(sa, 'imageFile') }}\" alt=\"\">
  1777.                         {% else %}
  1778.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1779.                                 <path d=\"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\"/>
  1780.                                 <path d=\"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\"/>
  1781.                             </svg>
  1782.                         {% endif %}
  1783.                     </div>
  1784.                     <div class=\"similar-card-info\">
  1785.                         <div class=\"similar-card-title\">{{ sa.title }}</div>
  1786.                         <div class=\"similar-card-meta\">
  1787.                             <span>{{ sa.publishedAt|date(\"d M Y\") }}</span>
  1788.                             {% if sa.author is not null and sa.author is not empty %}
  1789.                                 <span class=\"similar-card-meta-sep\"></span>
  1790.                                 <span>{{ sa.author }}</span>
  1791.                             {% endif %}
  1792.                             {% if sa.pageslug is not empty %}
  1793.                                 <span class=\"similar-card-meta-sep\"></span>
  1794.                                 <span>{{ sa.pageslug }}</span>
  1795.                             {% endif %}
  1796.                         </div>
  1797.                     </div>
  1798.                     <span class=\"similar-card-arrow\">
  1799.                         <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1800.                             <polyline points=\"9 18 15 12 9 6\"/>
  1801.                         </svg>
  1802.                     </span>
  1803.                 </a>
  1804.             {% endfor %}
  1805.         {% endif %}
  1806.         {# ═══ Jobs aléatoires (style identique au composant _jobs_content) ═══ #}
  1807.         {% if recommendedJobs is defined and recommendedJobs is not empty %}
  1808.             <div class=\"recommended-jobs-header\">
  1809.                 <h4 class=\"similar-section-title\" style=\"margin-bottom:0\">
  1810.                     <span class=\"recommended-jobs-icon\">
  1811.                         <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1812.                             <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"/>
  1813.                             <path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/>
  1814.                         </svg>
  1815.                     </span>
  1816.                     {{ app.request.locale == 'fr' ? 'Découvrez nos offres' : 'Discover our jobs' }} · {{ recommendedJobs|length }}
  1817.                 </h4>
  1818.                 <a href=\"{% if app.request.locale == 'en' %}{{ path('whileresume_jobs_list') }}{% else %}{{ path('locale_whileresume_jobs_list',{'_locale':app.request.locale}) }}{% endif %}\"
  1819.                    class=\"recommended-jobs-all\">
  1820.                     {{ app.request.locale == 'fr' ? 'Voir toutes les offres' : 'See all jobs' }}
  1821.                     <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">
  1822.                         <polyline points=\"9 18 15 12 9 6\"/>
  1823.                     </svg>
  1824.                 </a>
  1825.             </div>
  1826.             <div class=\"row g-3 recommended-jobs-grid\">
  1827.                 {% for k in recommendedJobs %}
  1828.                     <div class=\"col-md-6 col-lg-4\">
  1829.                         <a href=\"{% if k.locale == 'fr' %}{{ path('locale_cvs_application_job_show',{'_locale':app.request.locale,'slug':k.slug}) }}{% else %}{{ path('cvs_application_job_show',{'slug':k.slug}) }}{% endif %}\" class=\"job-card\">
  1830.                             <div class=\"job-card__header\">
  1831.                                 {% if k.image and k.image.name %}
  1832.                                     <img src=\"{{ vich_uploader_asset(k, 'imageFile') }}\" alt=\"{{ k.companyName }}\" class=\"job-card__logo\">
  1833.                                 {% else %}
  1834.                                     <div class=\"job-card__logo job-card__logo--placeholder\">
  1835.                                         {{ k.companyName|default('?')|slice(0, 1)|upper }}
  1836.                                     </div>
  1837.                                 {% endif %}
  1838.                                 <div class=\"job-card__company\">
  1839.                                     <span class=\"job-card__company-name\">{{ k.jobTitle }}</span>
  1840.                                     <span class=\"job-card__location\">
  1841.                                         <i class=\"fas fa-map-marker-alt\"></i>
  1842.                                         {{ k.city }}{% if k.country %}, {{ k.country }}{% endif %}
  1843.                                     </span>
  1844.                                 </div>
  1845.                             </div>
  1846.                             {% set summary = k.jobSummary ?: k.shortDescription %}
  1847.                             {% if summary %}
  1848.                                 <p class=\"job-card__summary\">{{ summary|striptags|slice(0, 140) }}{% if summary|length > 140 %}…{% endif %}</p>
  1849.                             {% endif %}
  1850.                             <div class=\"job-card__footer\">
  1851.                                 {% if k.employmentType %}<span class=\"job-card__tag\">{{ k.employmentType }}</span>{% endif %}
  1852.                                 {% if k.remoteWork %}<span class=\"job-card__tag job-card__tag--accent\">{{ k.remoteWork }}</span>{% endif %}
  1853.                             </div>
  1854.                         </a>
  1855.                     </div>
  1856.                 {% endfor %}
  1857.             </div>
  1858.         {% endif %}
  1859.     </div>
  1860. {% endblock body %}
  1861. {% block footer_js %}
  1862.     {{ parent() }}
  1863.     <script>
  1864.         (function() {
  1865.             var fab       = document.getElementById('articleTocFab');
  1866.             var trigger   = document.getElementById('articleTocTrigger');
  1867.             var panel     = document.getElementById('articleTocPanel');
  1868.             var closeBtn  = document.getElementById('articleTocClose');
  1869.             var backdrop  = document.getElementById('articleTocBackdrop');
  1870.             var countEl   = document.getElementById('articleTocCount');
  1871.             if (!fab || !trigger) return;
  1872.             // ── Ouvrir / fermer le panneau ──
  1873.             function openPanel(){
  1874.                 fab.classList.add('is-open');
  1875.                 if (backdrop) backdrop.classList.add('is-visible');
  1876.                 trigger.setAttribute('aria-expanded', 'true');
  1877.             }
  1878.             function closePanel(){
  1879.                 fab.classList.remove('is-open');
  1880.                 if (backdrop) backdrop.classList.remove('is-visible');
  1881.                 trigger.setAttribute('aria-expanded', 'false');
  1882.             }
  1883.             function togglePanel(){
  1884.                 if (fab.classList.contains('is-open')) closePanel(); else openPanel();
  1885.             }
  1886.             trigger.addEventListener('click', function(e){ e.stopPropagation(); togglePanel(); });
  1887.             if (closeBtn) closeBtn.addEventListener('click', closePanel);
  1888.             if (backdrop) backdrop.addEventListener('click', closePanel);
  1889.             // Échap pour fermer
  1890.             document.addEventListener('keydown', function(e){
  1891.                 if (e.key === 'Escape' && fab.classList.contains('is-open')) closePanel();
  1892.             });
  1893.             // Clic en dehors (au cas où, pour les contextes sans backdrop)
  1894.             document.addEventListener('click', function(e){
  1895.                 if (!fab.classList.contains('is-open')) return;
  1896.                 if (panel && !panel.contains(e.target) && !trigger.contains(e.target)) closePanel();
  1897.             });
  1898.             // ── Scroll spy + compteur ──
  1899.             var summaryLinks = document.querySelectorAll('.article-summary a[href^=\"#\"]');
  1900.             if (countEl) {
  1901.                 countEl.textContent = summaryLinks.length || '·';
  1902.             }
  1903.             if (!summaryLinks.length) return;
  1904.             var targets = [];
  1905.             summaryLinks.forEach(function(link) {
  1906.                 var id = link.getAttribute('href').replace('#', '');
  1907.                 var target = document.getElementById(id);
  1908.                 if (target) targets.push({ link: link, target: target });
  1909.             });
  1910.             if (!targets.length) return;
  1911.             function onScroll() {
  1912.                 var scrollY = window.scrollY + 120;
  1913.                 var current = null;
  1914.                 var currentIndex = 0;
  1915.                 targets.forEach(function(item, i) {
  1916.                     if (item.target.offsetTop <= scrollY) {
  1917.                         current = item;
  1918.                         currentIndex = i;
  1919.                     }
  1920.                 });
  1921.                 summaryLinks.forEach(function(l) { l.parentElement.classList.remove('active'); });
  1922.                 if (current) {
  1923.                     current.link.parentElement.classList.add('active');
  1924.                     if (countEl) {
  1925.                         countEl.textContent = (currentIndex + 1) + '/' + targets.length;
  1926.                         trigger.classList.add('has-active');
  1927.                     }
  1928.                 } else {
  1929.                     if (countEl) countEl.textContent = targets.length;
  1930.                     trigger.classList.remove('has-active');
  1931.                 }
  1932.             }
  1933.             window.addEventListener('scroll', onScroll, { passive: true });
  1934.             onScroll();
  1935.             // Ferme le panneau quand on clique sur un lien d'ancre
  1936.             summaryLinks.forEach(function(link){
  1937.                 link.addEventListener('click', function(){
  1938.                     setTimeout(closePanel, 150);
  1939.                 });
  1940.             });
  1941.         })();
  1942.     </script>
  1943. {% endblock footer_js %}
  1944. ""application/whileresume/website/page_article.html.twig""/var/www/vhosts/mirtillostudio.fr/b1.mirtillostudio.fr/version-1/templates/application/whileresume/website/page_article.html.twig");
  1945.     }
  1946. }