{% extends 'application/whileresume/website/layout-social.html.twig' %}{% macro cta_recruiter_candidate(locale) %} <div class="articles-cta-inline"> <h2 class="articles-cta-title"> {% if locale == 'fr' %}Talents et entreprises se rencontrent ici. {% else %}Where talent meets fast-growing companies.{% endif %} </h2> <div class="articles-cta-grid"> {# ── Recruteur ── #} <div class="articles-cta-side"> <div class="articles-cta-side-head"> <span class="articles-cta-side-icon"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <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"/> </svg> </span> <span class="articles-cta-side-label">{{ locale == 'fr' ? 'Recruteur' : 'Recruiter' }}</span> </div> <h3 class="articles-cta-side-heading"> {% if locale == 'fr' %}Recrutez des profils d'exception, plus vite.{% else %}Hire exceptional talent, faster.{% endif %} </h3> <p class="articles-cta-side-text"> {% if locale == 'fr' %}Accédez aux meilleurs talents du marché et connectez-vous directement à des candidats qualifiés en quête de leur prochain défi.{% else %}Get access to top market talent and connect directly with qualified candidates ready for their next challenge.{% endif %} </p> <a href="{{ path('whileresume_business_' ~ locale) }}" class="articles-cta-side-btn"> {{ locale == 'fr' ? 'Je recrute' : "I'm recruiting" }} <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"> <line x1="5" y1="12" x2="19" y2="12"/> <polyline points="12 5 19 12 12 19"/> </svg> </a> </div> {# ── Candidat ── #} <div class="articles-cta-side"> <div class="articles-cta-side-head"> <span class="articles-cta-side-icon"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/> <circle cx="12" cy="7" r="4"/> </svg> </span> <span class="articles-cta-side-label">{{ locale == 'fr' ? 'Candidat' : 'Candidate' }}</span> </div> <h3 class="articles-cta-side-heading"> {% if locale == 'fr' %}Trouvez le job qui vous ressemble.{% else %}Find the job that fits you.{% endif %} </h3> <p class="articles-cta-side-text"> {% if locale == 'fr' %}On vous accompagne dans la recherche de votre poste idéal au sein des entreprises les plus prometteuses du marché.{% else %}We support you in finding your ideal position within the most promising companies on the market.{% endif %} </p> <a href="{% if app.request.locale == "en" %}{{ path('whileresume_homepage') }}{% else %}{{ path('locale_whileresume_homepage',{'_locale':app.request.locale}) }}{% endif %}#register" class="articles-cta-side-btn"> {{ locale == 'fr' ? 'Je cherche un job' : "I'm looking for a job" }} <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"> <line x1="5" y1="12" x2="19" y2="12"/> <polyline points="12 5 19 12 12 19"/> </svg> </a> </div> </div> </div>{% endmacro %}{% import _self as ctaMacro %}{% block title %}{{ page.shortTitle }}{% endblock title %}{% block description %}{{ page.shortDescription }}{% endblock description %}{% block robots %}{{ page.robots }}{% endblock robots %}{% block meta_social %}{{ parent() }}{% include "/vitrine/components/socialmedia.html.twig" with { 'page':page,'social_type':'website' } %}{% endblock meta_social %}{% block canonical %}{% include "/vitrine/lexend/components/pages/canonical.html.twig" with {'page':page} %}{% endblock canonical %}{% block css %} {{ parent() }} <style> /* ─── Page liste articles (mêmes patterns que /jobs) ─── */ .articles-dash{max-width:880px;margin:0 auto} .articles-dash-header{margin-bottom:18px} .articles-dash-title{font-size:24px;font-weight:800;color:#1E1B2E;line-height:1.2;letter-spacing:-0.02em;margin:0 0 6px} @media(min-width:768px){.articles-dash-title{font-size:28px}} /* Liste cards (style identique aux jobs-card) */ .articles-list{display:flex;flex-direction:column;gap:10px} .articles-card{background:#fff;border-radius:14px;padding:14px;box-shadow:0 0 16px 0 rgba(0,0,0,0.04);display:flex;align-items:center;gap:14px;text-decoration:none;color:inherit;transition:transform .15s,box-shadow .2s} .articles-card:hover{transform:translateY(-1px);box-shadow:0 4px 20px rgba(108,58,237,.1);color:inherit} .articles-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} .articles-card-logo svg{width:24px;height:24px;opacity:.9} .articles-card-info{flex:1;min-width:0} .articles-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} .articles-card-meta{font-size:12px;color:#6B7280;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;gap:8px} .articles-card-meta-sep{display:inline-block;width:3px;height:3px;border-radius:50%;background:#D1D5DB;flex-shrink:0} .articles-card-badge{font-size:11px;font-weight:600;color:var(--theme-color,#6C3AED);background:#F5F3FF;padding:3px 9px;border-radius:100px;white-space:nowrap;flex-shrink:0;text-transform:uppercase;letter-spacing:.04em} .articles-card-arrow{flex-shrink:0;color:#9CA3AF;transition:color .15s,transform .15s} .articles-card:hover .articles-card-arrow{color:var(--theme-color,#6C3AED);transform:translateX(2px)} .articles-card-arrow svg{width:18px;height:18px} /* État vide */ .articles-empty{text-align:center;padding:40px 20px;background:#fff;border-radius:14px;box-shadow:0 0 16px 0 rgba(0,0,0,0.04)} .articles-empty-icon{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:16px;background:#F5F3FF;color:var(--theme-color,#6C3AED);margin-bottom:14px} .articles-empty-icon svg{width:24px;height:24px} .articles-empty-title{font-size:16px;font-weight:700;color:#1E1B2E;margin:0 0 6px} .articles-empty-text{font-size:13px;color:#6B7280;margin:0} /* Pagination */ .articles-pagination{margin-top:18px} /* ═══ CTA inline (entre articles) ═══ */ .articles-cta-inline{ position:relative; border-radius:18px; padding:24px; margin:6px 0; background:linear-gradient(135deg,#6C3AED 0%,#8B5CF6 50%,#A78BFA 100%); overflow:hidden; box-shadow:0 10px 30px -8px rgba(108,58,237,.35); } .articles-cta-inline::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; } .articles-cta-inline::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; } .articles-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; } .articles-cta-eyebrow svg{width:12px;height:12px} .articles-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; } @media(min-width:768px){.articles-cta-title{font-size:24px}} .articles-cta-grid{ display:grid; grid-template-columns:1fr; gap:12px; position:relative;z-index:2; } @media(min-width:640px){.articles-cta-grid{grid-template-columns:1fr 1fr;gap:14px}} .articles-cta-side{ background:rgba(255,255,255,.97); border-radius:14px; padding:18px; display:flex;flex-direction:column; transition:transform .2s,box-shadow .2s; } .articles-cta-side:hover{transform:translateY(-2px);box-shadow:0 12px 24px -8px rgba(0,0,0,.18)} .articles-cta-side-head{ display:flex;align-items:center;gap:10px; margin-bottom:10px; } .articles-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; } .articles-cta-side-icon svg{width:18px;height:18px} .articles-cta-side-label{ font-size:11px;font-weight:700; color:var(--theme-color,#6C3AED); text-transform:uppercase;letter-spacing:.08em; margin:0; } .articles-cta-side-heading{ font-size:15px;font-weight:700; color:#1E1B2E; line-height:1.3; margin:0 0 8px; } .articles-cta-side-text{ font-size:13px;color:#6B7280; line-height:1.5; margin:0 0 14px; flex:1; } .articles-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; } .articles-cta-side-btn:hover{ background:#5B21B6;color:#fff; transform:translateX(2px); } .articles-cta-side-btn svg{width:14px;height:14px;transition:transform .15s} .articles-cta-side-btn:hover svg{transform:translateX(2px)} </style>{% endblock css %}{% block body %} <div class="articles-dash"> {# ═══ Header ═══ #} <div class="articles-dash-header"> <h1 class="articles-dash-title">{{ page.title }}</h1> </div> {# ═══ Liste articles ═══ #} {% if pagination|length > 0 %} <div class="articles-list"> {% for article in pagination %} {# ── URL article ── #} {% set prefix = "" %} {% set urlArticle = path('blog_article',{'slug': article.slug}) %} {% if app.request.locale != default_locale %} {% set urlArticle = path('locale_blog_article',{'_locale':app.request.locale,'slug': article.slug}) %} {% set prefix = "/" ~ app.request.locale %} {% endif %} {% if article.pageslug3 is not empty %} {% set urlArticle = prefix ~ '/' ~ article.pageslug ~ '/' ~ article.pageslug2 ~ '/' ~ article.pageslug3 %} {% elseif article.pageslug2 is not empty %} {% set urlArticle = prefix ~ '/' ~ article.pageslug ~ '/' ~ article.pageslug2 %} {% elseif article.pageslug is not empty %} {% set urlArticle = prefix ~ '/' ~ article.pageslug %} {% endif %} <a href="{{ urlArticle }}" class="articles-card"> <div class="articles-card-logo"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/> <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/> </svg> </div> <div class="articles-card-info"> <h2 class="articles-card-title">{{ article.title }}</h2> <div class="articles-card-meta"> {#<span>{{ article.publishedAt|date("d M Y") }}</span> <span class="articles-card-meta-sep"></span>#} {% if article.subtitle is not empty %} <span>{{ article.subtitle|length > 60 ? article.subtitle|slice(0,60) ~ '…' : article.subtitle }}</span> {% endif %} </div> </div> <span class="articles-card-badge">{{ "Je lis l'article"|translateLocale(arrayTranslate) }}</span> <span class="articles-card-arrow"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="9 18 15 12 9 6"/> </svg> </span> </a> {# ═══ CTA inline après le 3e article ═══ #} {% if loop.index == 3 and getEnv("KERNEL_APPLICATION") == "whileresume" and app.request.locale in ['fr','en'] %} {% if app.user is null %} {{ ctaMacro.cta_recruiter_candidate(app.request.locale) }} {% endif %} {% endif %} {% endfor %} </div> {# Pagination #} <div class="articles-pagination"> {{ knp_pagination_render(pagination,'application/whileresume/website/pagination/pagination.html.twig') }} </div> {% else %} <div class="articles-empty"> <div class="articles-empty-icon"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/> <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/> </svg> </div> <p class="articles-empty-title">{{ "Aucun article"|translateLocale(arrayTranslate) }}</p> </div> {% endif %} {# ═══ CTA Recruteur / Candidat (en bas, si moins de 3 articles → fallback) ═══ #} {% if pagination|length > 0 and pagination|length < 3 and getEnv("KERNEL_APPLICATION") == "whileresume" and app.request.locale in ['fr','en'] %} {% if app.user is null %} <div class="mt-3"> {{ ctaMacro.cta_recruiter_candidate(app.request.locale) }} </div> {% endif %} {% endif %} </div>{% endblock body %}