templates/application/whileresume/website/candidates/homepage_fr.html.twig line 1

Open in your IDE?
  1. {% extends 'vitrine/lexend/layout.html.twig' %}
  2. {% block title %}{{ page.shortTitle }}{% endblock title %}
  3. {% block description %}{{ page.shortDescription }}{% endblock description %}
  4. {% block robots %}{{ page.robots }}{% endblock robots %}
  5. {% block meta_social %}{{ parent() }}{% include "/vitrine/components/socialmedia.html.twig" with { 'page':page,'social_type':'website' } %}{% endblock meta_social %}
  6. {% block meta %}{{ parent() }}{% include "/vitrine/components/author.html.twig" with {'page':page } %}{% endblock meta %}
  7. {% block canonical %}{% include "/vitrine/lexend/components/languages/canonical_classic.html.twig" %}{% endblock canonical %}
  8. {% block body_header %}
  9.     {% embed "/vitrine/lexend/components/header.html.twig" with {'navcolor':'blue','navtype':'default'} %}
  10.         {% block header_content %}
  11.             {% include "/vitrine/lexend/components/languages/classic.html.twig" %}
  12.         {% endblock %}
  13.         {% block header_content2 %}
  14.             {% include "/vitrine/lexend/components/languages/classic_mobile.html.twig" %}
  15.         {% endblock %}
  16.     {% endembed %}
  17. {% endblock body_header %}
  18. {% block css %}
  19.     <style>
  20.         .wr-search-section{position:relative;z-index:2;width:100%;max-width:720px;margin:0 auto}
  21.         .wr-search-bar{display:flex;align-items:center;background:#fff;border-radius:16px;padding:6px;box-shadow:0 4px 24px rgba(108,58,237,.08),0 1px 3px rgba(0,0,0,.04);border:2px solid transparent;transition:border-color .3s,box-shadow .3s;cursor:pointer}
  22.         .wr-search-bar:hover,.wr-search-bar.active{border-color:rgba(108,58,237,.2);box-shadow:0 8px 32px rgba(108,58,237,.12),0 2px 6px rgba(0,0,0,.04)}
  23.         .wr-search-icon{padding:12px 14px;color:#9CA3AF;display:flex;align-items:center;flex-shrink:0}
  24.         .wr-search-input-wrapper{flex:1;position:relative;height:48px;display:flex;align-items:center;overflow:hidden}
  25.         .wr-search-typed-text{font-size:16px;color:#1E1B2E;white-space:nowrap}
  26.         .wr-search-cursor{display:inline-block;width:2px;height:20px;background:var(--color-primary,#6C3AED);margin-left:2px;animation:wrBlink 1s step-end infinite;vertical-align:middle}
  27.         @keyframes wrBlink{0%,100%{opacity:1}50%{opacity:0}}
  28.         .wr-search-placeholder{color:#9CA3AF;font-size:16px}
  29.         .wr-search-real-input{width:100%;border:none;outline:none;font-size:16px;color:#1E1B2E;background:transparent;font-family:inherit}
  30.         .wr-search-real-input::placeholder{color:#9CA3AF}
  31.         .wr-search-btn{background:var(--color-primary,#6C3AED);color:#fff;border:none;padding:12px 24px;border-radius:12px;font-size:15px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:6px;transition:background .2s,transform .15s;flex-shrink:0;font-family:inherit}
  32.         .wr-search-btn:hover{filter:brightness(1.1);transform:scale(1.02)}
  33.         @media(max-width:640px){.wr-search-btn span{display:none}.wr-search-btn{padding:12px 14px}}
  34.         .wr-search-tags{display:flex;align-items:center;gap:8px;margin-top:12px;flex-wrap:wrap;justify-content:center}
  35.         .wr-search-tags>span.wr-label{font-size:13px;color:#9CA3AF}
  36.         .wr-tag{display:inline-flex;align-items:center;gap:4px;padding:4px 12px;border-radius:100px;font-size:13px;font-weight:500;background:#fff;color:#4B5563;border:1px solid rgba(0,0,0,.06);cursor:pointer;transition:all .2s;text-decoration:none}
  37.         .wr-tag:hover{background:#F5F3FF;color:var(--color-primary,#6C3AED);border-color:rgba(108,58,237,.2)}
  38.         .wr-search-results{position:relative;background:#fff;border-radius:16px;box-shadow:0 12px 48px rgba(0,0,0,.1),0 2px 8px rgba(0,0,0,.04);padding:0;max-height:0;overflow:hidden;transition:max-height .5s ease,padding .5s ease,margin .5s ease,opacity .4s ease;z-index:10;opacity:0;margin-top:0}
  39.         .wr-search-results.visible{max-height:2000px;padding:8px;margin-top:12px;opacity:1}
  40.         .wr-result-item{display:flex;align-items:center;gap:14px;padding:12px 14px;border-radius:12px;cursor:pointer;transition:background .2s,opacity .3s ease,transform .3s ease;opacity:0;transform:translateY(8px);text-decoration:none;color:inherit}
  41.         .wr-result-item.show{opacity:1;transform:translateY(0)}
  42.         .wr-result-item:hover{background:#F5F3FF}
  43.         .wr-result-item+.wr-result-item{border-top:1px solid rgba(0,0,0,.04)}
  44.         .wr-result-logo{width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;font-weight:700}
  45.         .wr-result-logo img{width:100%;height:100%;object-fit:cover;border-radius:10px}
  46.         .wr-result-info{flex:1;text-align:left;min-width:0}
  47.         .wr-result-title{font-size:14px;font-weight:600;color:#1E1B2E;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  48.         .wr-result-meta{display:flex;align-items:center;gap:8px;font-size:12px;color:#9CA3AF;flex-wrap:wrap}
  49.         .wr-result-company{color:#4B5563;font-weight:500}
  50.         .wr-result-badge{display:inline-flex;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:600}
  51.         .wr-badge-new{background:#DCFCE7;color:#16A34A}
  52.         .wr-badge-hot{background:#FEF3C7;color:#D97706}
  53.         .wr-badge-expire{background:#FEE2E2;color:#DC2626}
  54.         .wr-result-salary{font-size:13px;font-weight:600;color:var(--color-primary,#6C3AED);white-space:nowrap}
  55.         .wr-result-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}
  56.         .wr-like-btn{background:none;border:none;cursor:pointer;padding:6px;border-radius:8px;transition:transform .2s,background .2s;display:flex;align-items:center}
  57.         .wr-like-btn:hover{transform:scale(1.15);background:rgba(239,68,68,.06)}
  58.         .wr-like-btn svg{width:20px;height:20px;stroke:#D1D5DB;fill:none;transition:all .2s}
  59.         .wr-like-btn.liked svg{stroke:#EF4444;fill:#EF4444}
  60.         .wr-results-cta-overlay{position:relative;margin-top:4px;border-radius:12px;overflow:hidden}
  61.         .wr-results-blurred{padding:10px 14px;display:flex;flex-direction:column;gap:10px;filter:blur(5px);opacity:.5;pointer-events:none;user-select:none}
  62.         .wr-blurred-row{display:flex;align-items:center;gap:12px}
  63.         .wr-blurred-circle{width:44px;height:44px;border-radius:10px;background:#E5E7EB;flex-shrink:0}
  64.         .wr-blurred-lines{flex:1;display:flex;flex-direction:column;gap:6px}
  65.         .wr-blurred-line{height:10px;border-radius:5px;background:#E5E7EB}
  66.         .wr-blurred-line:first-child{width:60%}.wr-blurred-line:last-child{width:40%}
  67.         .wr-cta-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:rgba(255,255,255,.65);backdrop-filter:blur(2px);border-radius:12px;gap:8px}
  68.         .wr-cta-overlay-text{font-size:14px;font-weight:600;color:#1E1B2E}
  69.         .wr-cta-overlay-btn{display:inline-flex;align-items:center;gap:6px;padding:8px 20px;background:var(--color-primary,#6C3AED);color:#fff;border:none;border-radius:10px;font-size:13px;font-weight:600;cursor:pointer;transition:all .2s;text-decoration:none;font-family:inherit}
  70.         .wr-cta-overlay-btn:hover{filter:brightness(1.1);transform:translateY(-1px)}
  71.         .wr-results-count{text-align:center;padding:10px;font-size:13px;color:#9CA3AF;border-top:1px solid rgba(0,0,0,.04);margin-top:4px}
  72.         .wr-results-count strong{color:var(--color-primary,#6C3AED)}
  73.         .wr-hero-badge{display:inline-flex;align-items:center;gap:8px;background:#fff;border:1px solid rgba(108,58,237,.15);padding:6px 16px;border-radius:100px;font-size:13px;font-weight:500;color:var(--color-primary,#6C3AED)}
  74.         .wr-hero-badge .wr-dot{width:8px;height:8px;background:#22C55E;border-radius:50%;animation:wrPulseDot 2s ease-in-out infinite}
  75.         @keyframes wrPulseDot{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.6;transform:scale(1.3)}}
  76.         .wr-video-cta{display:inline-flex;align-items:center;gap:6px;background:rgba(108,58,237,.06);padding:6px 14px;border-radius:100px;font-weight:500;color:var(--color-primary,#6C3AED);font-size:14px}
  77.         {# === Styles mode connectĂ© === #}
  78.         .wr-loading{text-align:center;padding:30px 20px}
  79.         .wr-spinner{display:inline-block;width:28px;height:28px;border:3px solid rgba(108,58,237,.15);border-top-color:var(--color-primary,#6C3AED);border-radius:50%;animation:wrSpin .7s linear infinite}
  80.         @keyframes wrSpin{to{transform:rotate(360deg)}}
  81.         .wr-empty-state,.wr-coming-soon{text-align:center;padding:40px 20px}
  82.         .wr-empty-icon,.wr-coming-icon{font-size:40px;margin-bottom:12px}
  83.         .wr-empty-title,.wr-coming-title{font-size:16px;font-weight:600;color:#1E1B2E;margin:0 0 6px}
  84.         .wr-empty-text,.wr-coming-text{font-size:14px;color:#9CA3AF;margin:0}
  85.         .wr-load-more{display:flex;justify-content:center;padding:12px 8px 4px}
  86.         .wr-load-more-btn{background:none;border:2px solid var(--color-primary,#6C3AED);color:var(--color-primary,#6C3AED);padding:8px 24px;border-radius:10px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;font-family:inherit}
  87.         .wr-load-more-btn:hover{background:var(--color-primary,#6C3AED);color:#fff}
  88.         .wr-load-more-btn:disabled{opacity:.5;cursor:not-allowed}
  89.         {# === Styles offres populaires === #}
  90.         .wr-popular-card{display:block;text-decoration:none;color:inherit;background:#fff;border-radius:14px;padding:16px;border:1px solid rgba(0,0,0,.06);transition:transform .2s,box-shadow .2s}
  91.         .wr-popular-card:hover{transform:translateY(-3px);box-shadow:0 8px 24px rgba(0,0,0,.08)}
  92.         .wr-popular-avatar{width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:18px;font-weight:700;flex-shrink:0}
  93.         .wr-popular-title{font-size:14px;font-weight:600;color:#1E1B2E;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  94.         .wr-popular-meta{font-size:12px;color:#9CA3AF;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  95.         .wr-popular-badge{display:inline-flex;padding:2px 10px;border-radius:6px;font-size:11px;font-weight:600}
  96.         .wr-popular-date{font-size:11px;color:#6B7280}
  97.     </style>
  98. {% endblock css %}
  99. {% block body %}
  100.     <div id="hero_header" class="hero-header section panel overflow-hidden">
  101.         <div class="position-absolute top-0 start-0 end-0 h-screen bg-secondary dark:bg-gray-300 dark:bg-opacity-15 rounded-bottom-2 lg:rounded-bottom-5"></div>
  102.         <div class="section-outer panel py-8 lg:py-9 xl:py-10">
  103.             <div class="container">
  104.                 <div class="section-inner panel">
  105.                     <div class="d-none xl:d-block">
  106.                         <div class="position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block" style="top: 5%; left: 5%" data-anime="translateY: [0, 10]; easing: linear; loop: true; direction: alternate; delay: 0;"><img class="p-narrow rounded-circle" src="/uploads/no_avatar.png" alt="Candidat anonyme"></div>
  107.                         <div class="position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block" style="top: 20%; left: 10%" data-anime="translateY: [0, 15]; easing: linear; loop: true; direction: alternate; delay: 25;"><img class="p-narrow rounded-circle" src="/uploads/no_avatar.png" alt="Candidat anonyme"></div>
  108.                         <div class="position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block" style="top: 35%; left: 0%" data-anime="translateY: [0, 5]; easing: linear; loop: true; direction: alternate; delay: 25;"><img class="p-narrow rounded-circle" src="/uploads/no_avatar.png" alt="Candidat anonyme"></div>
  109.                         <div class="position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block" style="top: 5%; right: 5%" data-anime="translateY: [0, 10]; easing: linear; loop: true; direction: alternate; delay: 0;"><img class="p-narrow rounded-circle" src="/uploads/no_avatar.png" alt="Candidat anonyme"></div>
  110.                         <div class="position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block" style="top: 20%; right: 10%" data-anime="translateY: [0, 15]; easing: linear; loop: true; direction: alternate; delay: 25;"><img class="p-narrow rounded-circle" src="/uploads/no_avatar.png" alt="Candidat anonyme"></div>
  111.                         <div class="position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block" style="top: 35%; right: 0%" data-anime="translateY: [0, 5]; easing: linear; loop: true; direction: alternate; delay: 25;"><img class="p-narrow rounded-circle" src="/uploads/no_avatar.png" alt="Candidat anonyme"></div>
  112.                     </div>
  113.                     <div class="row child-cols-12 justify-center items-center g-8">
  114.                         <div class="lg:col-12">
  115.                             <div class="panel vstack gap-4 lg:gap-6">
  116.                                 <div class="panel vstack justify-center items-center gap-2 px-2 pt-4 text-center">
  117.                                     <div class="wr-hero-badge">
  118.                                         đźŽ‰ + 20000 offres d'emploi
  119.                                     </div>
  120.                                     <h1 class="h3 md:h2 lg:display-4 m-0">Le <span class="text-primary dark:text-tertiary">career board</span> nouvelle gĂ©nĂ©ration â€” votre prochain poste vous cherche dĂ©jĂ </h1>
  121.                                     <p class="fs-6 xl:fs-4 xl:px-10 dark:text-white text-opacity-70">
  122.                                         CrĂ©ez votre profil sur <span class="text-primary dark:text-tertiary">Whileresume</span> et laissez les <span class="text-primary dark:text-tertiary">offres</span> venir Ă  vous
  123.                                     </p>
  124.                                 </div>
  125.                                 {# ====== BARRE DE RECHERCHE ====== #}
  126.                                 <div class="wr-search-section" id="wrSearchSection">
  127.                                     <div class="wr-search-bar{#% if app.user %#} active{#% endif %#}" id="wrSearchBar">
  128.                                         <div class="wr-search-icon">
  129.                                             <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>
  130.                                         </div>
  131.                                         <div class="wr-search-input-wrapper">
  132.                                             {#% if app.user %#}
  133.                                                 <input type="text" id="wrSearchInput" class="wr-search-real-input" placeholder="Rechercher un poste, une entreprise, une ville..." autocomplete="off">
  134.                                             {#% else %}
  135.                                                 <span class="wr-search-typed-text" id="wrTypedText"></span><span class="wr-search-cursor" id="wrCursor"></span>
  136.                                                 <span class="wr-search-placeholder" id="wrPlaceholder">Agent immobilier, SecrĂ©taire, Avocat...</span>
  137.                                             {% endif %#}
  138.                                         </div>
  139.                                         <button class="wr-search-btn" id="wrSearchBtn">
  140.                                             <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>
  141.                                             <span>Rechercher</span>
  142.                                         </button>
  143.                                     </div>
  144.                                     <div class="wr-search-tags">
  145.                                         <span class="wr-label">Populaire :</span>
  146.                                         {% for pk in popularKeywords %}
  147.                                             <span class="wr-tag" data-search="{{ pk.keyword }}">{{ pk.icon }} {{ pk.label }}</span>
  148.                                         {% endfor %}
  149.                                     </div>
  150.                                 </div>
  151.                                 {# ====== BOUTONS CTA ====== #}
  152.                                 <div class="panel vstack justify-center items-center text-center">
  153.                                     <div class="vstack md:hstack justify-center">
  154.                                         <a href="{{ ios_fr }}" class="btn btn-md btn-outline-primary dark:border-tertiary dark:text-tertiary dark:hover:bg-tertiary dark:hover:text-primary-700 border-2 px-3 w-auto" style="margin-top:10px;">
  155.                                             TĂ©lĂ©charger sur iOS
  156.                                             <svg fill="#000000" width="25px" height="25px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M18.71 19.5C17.88 20.74 17 21.95 15.66 21.97C14.32 22 13.89 21.18 12.37 21.18C10.84 21.18 10.37 21.95 9.09997 22C7.78997 22.05 6.79997 20.68 5.95997 19.47C4.24997 17 2.93997 12.45 4.69997 9.39C5.56997 7.87 7.12997 6.91 8.81997 6.88C10.1 6.86 11.32 7.75 12.11 7.75C12.89 7.75 14.37 6.68 15.92 6.84C16.57 6.87 18.39 7.1 19.56 8.82C19.47 8.88 17.39 10.1 17.41 12.63C17.44 15.65 20.06 16.66 20.09 16.67C20.06 16.74 19.67 18.11 18.71 19.5ZM13 3.5C13.73 2.67 14.94 2.04 15.94 2C16.07 3.17 15.6 4.35 14.9 5.19C14.21 6.04 13.07 6.7 11.95 6.61C11.8 5.46 12.36 4.26 13 3.5Z"/></svg>
  157.                                         </a>
  158.                                         <a href="{{ android_fr }}" class="btn btn-md btn-outline-primary dark:border-tertiary dark:text-tertiary dark:hover:bg-tertiary dark:hover:text-primary-700 border-2 px-3 w-auto" style="margin-top:10px; margin-left:10px;">
  159.                                             TĂ©lĂ©charger sur Android
  160.                                             <svg height="20px" width="20px" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" xml:space="preserve"><g><g><path style="fill:#3A9BC8;" d="M225.656,256.052L14.016,485.451l-6.442,7.052c-4.005-5.919-6.704-12.972-7.313-20.806C0.087,470.305,0,468.91,0,467.518V44.499c0-9.488,2.873-18.02,7.574-24.987L225.656,256.052z"/><path style="fill:#9BCD83;" d="M320.811,152.8l-95.155,103.253L7.574,19.512C19.936,1.405,45.183-6.342,66.6,6.02L320.811,152.8z"/><path style="fill:#EEB84C;" d="M455.056,257.27c-0.348,14.453-7.748,28.904-22.113,37.174l-112.132,64.771l-95.155-103.163L320.811,152.8l70.518,40.745l41.614,24.026C448.178,226.366,455.579,241.861,455.056,257.27z"/><path style="fill:#B43F70;" d="M7.591,492.492c12.368,18.116,37.599,25.838,58.976,13.496L320.775,359.22l-95.156-103.209L7.591,492.492z"/></g><path style="opacity:0.2;fill:#FFFFFF;" d="M454.067,246.447c-2.453-11.518-9.483-22.156-21.124-28.876l-41.614-24.026L320.811,152.8L66.6,6.02C45.183-6.342,19.936,1.405,7.574,19.512C2.873,26.479,0,35.011,0,44.499v243.72c36.681,3.114,74.226,4.746,112.451,4.746c47.984,0,94.85-2.644,140.318-7.505l-27.027-29.314l27.038,29.314C323.988,277.849,391.567,264.55,454.067,246.447z"/></g></svg>
  161.                                         </a>
  162.                                     </div>
  163.                                 </div>
  164.                                 {# ====== RÉSULTATS ====== #}
  165.                                 {#% if app.user %#}
  166.                                     <div class="wr-search-results visible" id="wrSearchResults" style="max-height:none;opacity:1;padding:8px;margin-top:12px;">
  167.                                         <div id="wrJobsList"></div>
  168.                                         <div id="wrLoading" class="wr-loading">
  169.                                             <div class="wr-spinner"></div>
  170.                                         </div>
  171.                                         <div id="wrEmptyState" class="wr-empty-state" style="display:none;">
  172.                                             <div class="wr-empty-icon">🔍</div>
  173.                                             <p class="wr-empty-title">Aucune offre ne correspond Ă  votre recherche</p>
  174.                                             <p class="wr-empty-text">Essayez avec d'autres mots-clĂ©s ou consultez les recherches populaires ci-dessus</p>
  175.                                         </div>
  176.                                         <div id="wrComingSoon" class="wr-coming-soon" style="display:none;">
  177.                                             <div class="wr-coming-icon">🚀</div>
  178.                                             <p class="wr-coming-title">De nouvelles offres arrivent bientĂ´t !</p>
  179.                                             <p class="wr-coming-text">Nous ajoutons de nouvelles opportunitĂ©s chaque jour.<br>Revenez vite ou activez les notifications pour ĂŞtre alertĂ©.</p>
  180.                                         </div>
  181.                                         <div id="wrLoadMore" class="wr-load-more" style="display:none;">
  182.                                             <button class="wr-load-more-btn" id="wrLoadMoreBtn">Voir plus d'offres</button>
  183.                                         </div>
  184.                                         <div class="wr-results-count" id="wrResultsCount" style="display:none;">
  185.                                             <strong id="wrTotalCount">0</strong> offres trouvĂ©es
  186.                                         </div>
  187.                                     </div>
  188.                                 {#% else %}
  189.                                     <div class="wr-search-results" id="wrSearchResults">
  190.                                         <div id="wrResultsList"></div>
  191.                                         <div class="wr-results-cta-overlay">
  192.                                             <div class="wr-results-blurred">
  193.                                                 <div class="wr-blurred-row"><div class="wr-blurred-circle"></div><div class="wr-blurred-lines"><div class="wr-blurred-line"></div><div class="wr-blurred-line"></div></div></div>
  194.                                                 <div class="wr-blurred-row"><div class="wr-blurred-circle"></div><div class="wr-blurred-lines"><div class="wr-blurred-line"></div><div class="wr-blurred-line"></div></div></div>
  195.                                             </div>
  196.                                             <div class="wr-cta-overlay">
  197.                                                 <span class="wr-cta-overlay-text">đź”’ Inscrivez-vous pour voir toutes les offres</span>
  198.                                                 <a href="{{ path('whileresume_resume_' ~ app.request.locale) }}" class="wr-cta-overlay-btn">CrĂ©er mon profil gratuitement <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M7 17l9.2-9.2M17 17V7H7"/></svg></a>
  199.                                             </div>
  200.                                         </div>
  201.                                         {% if totalJobs is defined and totalJobs > 0 %}
  202.                                             <div class="wr-results-count">
  203.                                                 <strong>+{{ totalJobs|number_format(0, ',', ' ') }} offres</strong> dans notre base de donnĂ©es
  204.                                             </div>
  205.                                         {% endif %}
  206.                                     </div>
  207.                                 {% endif %#}
  208.                                 <div class="panel vstack justify-center items-center text-center">
  209.                                     <div class="vstack sm:hstack items-center justify-center gap-1 fs-6 text-gray-900 dark:text-white">
  210.                                         <span class="wr-video-cta">🎥 Partagez votre <strong>&nbsp;CV vidĂ©o&nbsp;</strong> pour augmenter vos chances</span>
  211.                                     </div>
  212.                                     <div class="vstack sm:hstack items-center justify-center gap-1 fs-6 text-gray-900 dark:text-white">
  213.                                         <span class="desc">Le saviez-vous ? <a href="https://www.welcometothejungle.com/fr/articles/marche-cache-emploi-candidater" target="_blank">40%</a> des offres d emploi restent cachĂ©es et sont directement confiĂ©es aux recruteurs</span>
  214.                                     </div>
  215.                                 </div>
  216.                             </div>
  217.                         </div>
  218.                     </div>
  219.                 </div>
  220.             </div>
  221.         </div>
  222.     </div>
  223.     {#% if app.user %#}
  224.         <script>
  225.             (function(){
  226.                 var LIKED_IDS = {{ likedJobIds|json_encode|raw }};
  227.                 var IS_CANDIDATE = {{ (app.user.typeAccount is defined and app.user.typeAccount == 'candidate') ? 'true' : 'false' }};
  228.             var JOB_BASE_URL = '/{{ app.request.locale }}/job/';
  229.                 var SEARCH_API = '{{ path("locale_api_jobs_search", {"_locale": app.request.locale}) }}';
  230.                 var LIKE_API = '{{ path("locale_api_jobs_like", {"_locale": app.request.locale}) }}';
  231.                 // --- Palette couleurs logos ---
  232.                 var palette = [
  233.                     {bg:'#EDE9FE',color:'#7C3AED'},{bg:'#DBEAFE',color:'#2563EB'},
  234.                     {bg:'#D1FAE5',color:'#059669'},{bg:'#FEF3C7',color:'#D97706'},
  235.                     {bg:'#FCE7F3',color:'#DB2777'},{bg:'#FEE2E2',color:'#DC2626'},
  236.                     {bg:'#E0E7FF',color:'#4338CA'},{bg:'#CCFBF1',color:'#0D9488'}
  237.                 ];
  238.                 function getColor(name){
  239.                     var h=0;for(var i=0;i<name.length;i++) h=name.charCodeAt(i)+((h<<5)-h);
  240.                     return palette[Math.abs(h)%palette.length];
  241.                 }
  242.                 // --- DOM ---
  243.                 var searchInput = document.getElementById('wrSearchInput');
  244.                 var searchBtn = document.getElementById('wrSearchBtn');
  245.                 var jobsList = document.getElementById('wrJobsList');
  246.                 var loading = document.getElementById('wrLoading');
  247.                 var emptyState = document.getElementById('wrEmptyState');
  248.                 var comingSoon = document.getElementById('wrComingSoon');
  249.                 var loadMoreWrap = document.getElementById('wrLoadMore');
  250.                 var loadMoreBtn = document.getElementById('wrLoadMoreBtn');
  251.                 var resultsCount = document.getElementById('wrResultsCount');
  252.                 var totalCountEl = document.getElementById('wrTotalCount');
  253.                 var currentQuery = '';
  254.                 var currentOffset = 0;
  255.                 var LIMIT = 10;
  256.                 var isLoading = false;
  257.                 var debounceTimer;
  258.                 // --- IcĂ´nes SVG ---
  259.                 var heartSvg = '<svg viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>';
  260.                 // --- Rendu d'une offre ---
  261.                 function renderJob(job){
  262.                     var col = getColor(job.companyName);
  263.                     var logoHtml;
  264.                     if(job.image){
  265.                         logoHtml = '<div class="wr-result-logo"><img src="'+job.image+'" alt="'+job.companyName+'"></div>';
  266.                     } else {
  267.                         logoHtml = '<div class="wr-result-logo" style="background:'+col.bg+';color:'+col.color+';">'+job.logo+'</div>';
  268.                     }
  269.                     var badgeHtml = '';
  270.                     if(job.isNew) badgeHtml = '<span class="wr-result-badge wr-badge-new">Nouveau</span>';
  271.                     var salaryHtml = job.salary ? '<span class="wr-result-salary">'+job.salary+'</span>' : '';
  272.                     var likeHtml = '';
  273.                     if(IS_CANDIDATE){
  274.                         var likedClass = LIKED_IDS.indexOf(job.id) !== -1 ? ' liked' : '';
  275.                         likeHtml = '<button class="wr-like-btn'+likedClass+'" data-job-id="'+job.id+'" title="Sauvegarder">'+heartSvg+'</button>';
  276.                     }
  277.                     var remoteHtml = '';
  278.                     if(job.remoteWork && job.remoteWork !== '' && job.remoteWork !== 'no'){
  279.                         var remoteLabel = job.remoteWork === 'full' ? 'Full remote' : (job.remoteWork === 'hybrid' ? 'Hybride' : job.remoteWork);
  280.                         remoteHtml = '<span>·</span><span>'+remoteLabel+'</span>';
  281.                     }
  282.                     var div = document.createElement('a');
  283.                     div.className = 'wr-result-item';
  284.                     div.href = JOB_BASE_URL + job.slug;
  285.                     div.innerHTML = logoHtml +
  286.                         '<div class="wr-result-info">' +
  287.                         '<div class="wr-result-title">' + job.jobTitle + '</div>' +
  288.                         '<div class="wr-result-meta">' +
  289.                         '<span class="wr-result-company">' + job.companyName + '</span>' +
  290.                         (job.city ? '<span>·</span><span>' + job.city + '</span>' : '') +
  291.                         '<span>·</span><span>' + job.employmentType + '</span>' +
  292.                         remoteHtml +
  293.                         badgeHtml +
  294.                         '</div>' +
  295.                         '</div>' +
  296.                         '<div class="wr-result-actions">' + salaryHtml + likeHtml + '</div>';
  297.                     return div;
  298.                 }
  299.                 // --- Fetch offres ---
  300.                 function fetchJobs(query, offset, append){
  301.                     if(isLoading) return;
  302.                     isLoading = true;
  303.                     if(!append){
  304.                         jobsList.innerHTML = '';
  305.                         loadMoreWrap.style.display = 'none';
  306.                         resultsCount.style.display = 'none';
  307.                     }
  308.                     loading.style.display = 'block';
  309.                     emptyState.style.display = 'none';
  310.                     comingSoon.style.display = 'none';
  311.                     var url = SEARCH_API + '?q=' + encodeURIComponent(query) + '&offset=' + offset + '&limit=' + LIMIT;
  312.                     fetch(url, {credentials:'same-origin'})
  313.                         .then(function(r){ return r.json(); })
  314.                         .then(function(data){
  315.                             loading.style.display = 'none';
  316.                             isLoading = false;
  317.                             // Aucune offre du tout (base vide pour cette langue)
  318.                             if(data.total === 0 && query === ''){
  319.                                 comingSoon.style.display = 'block';
  320.                                 return;
  321.                             }
  322.                             // Aucun rĂ©sultat pour cette recherche
  323.                             if(data.total === 0 && query !== ''){
  324.                                 emptyState.style.display = 'block';
  325.                                 return;
  326.                             }
  327.                             // Afficher les rĂ©sultats
  328.                             data.jobs.forEach(function(job, i){
  329.                                 var el = renderJob(job);
  330.                                 jobsList.appendChild(el);
  331.                                 // Animation stagger
  332.                                 setTimeout(function(){ el.classList.add('show'); }, 50 + i * 60);
  333.                             });
  334.                             // Compteur
  335.                             totalCountEl.textContent = data.total;
  336.                             resultsCount.style.display = 'block';
  337.                             // Bouton "Voir plus"
  338.                             if(data.hasMore){
  339.                                 loadMoreWrap.style.display = 'flex';
  340.                             } else {
  341.                                 loadMoreWrap.style.display = 'none';
  342.                             }
  343.                             currentOffset = offset + data.jobs.length;
  344.                         })
  345.                         .catch(function(err){
  346.                             console.error('Erreur recherche:', err);
  347.                             loading.style.display = 'none';
  348.                             isLoading = false;
  349.                         });
  350.                 }
  351.                 // --- Like / Unlike ---
  352.                 function toggleLike(btn){
  353.                     var jobId = parseInt(btn.getAttribute('data-job-id'));
  354.                     fetch(LIKE_API, {
  355.                         method: 'POST',
  356.                         credentials: 'same-origin',
  357.                         headers: {'Content-Type':'application/json'},
  358.                         body: JSON.stringify({jobId: jobId})
  359.                     })
  360.                         .then(function(r){ return r.json(); })
  361.                         .then(function(data){
  362.                             if(data.liked){
  363.                                 btn.classList.add('liked');
  364.                                 if(LIKED_IDS.indexOf(jobId) === -1) LIKED_IDS.push(jobId);
  365.                             } else {
  366.                                 btn.classList.remove('liked');
  367.                                 var idx = LIKED_IDS.indexOf(jobId);
  368.                                 if(idx !== -1) LIKED_IDS.splice(idx, 1);
  369.                             }
  370.                         })
  371.                         .catch(function(err){ console.error('Erreur like:', err); });
  372.                 }
  373.                 // --- Event: delegation click like ---
  374.                 jobsList.addEventListener('click', function(e){
  375.                     var likeBtn = e.target.closest('.wr-like-btn');
  376.                     if(likeBtn){
  377.                         e.preventDefault();
  378.                         e.stopPropagation();
  379.                         toggleLike(likeBtn);
  380.                     }
  381.                 });
  382.                 // --- Event: recherche avec debounce ---
  383.                 searchInput.addEventListener('input', function(){
  384.                     clearTimeout(debounceTimer);
  385.                     debounceTimer = setTimeout(function(){
  386.                         currentQuery = searchInput.value.trim();
  387.                         currentOffset = 0;
  388.                         fetchJobs(currentQuery, 0, false);
  389.                     }, 350);
  390.                 });
  391.                 // --- Event: bouton recherche ---
  392.                 searchBtn.addEventListener('click', function(e){
  393.                     e.preventDefault();
  394.                     clearTimeout(debounceTimer);
  395.                     currentQuery = searchInput.value.trim();
  396.                     currentOffset = 0;
  397.                     fetchJobs(currentQuery, 0, false);
  398.                 });
  399.                 // --- Event: touche EntrĂ©e ---
  400.                 searchInput.addEventListener('keydown', function(e){
  401.                     if(e.key === 'Enter'){
  402.                         e.preventDefault();
  403.                         clearTimeout(debounceTimer);
  404.                         currentQuery = searchInput.value.trim();
  405.                         currentOffset = 0;
  406.                         fetchJobs(currentQuery, 0, false);
  407.                     }
  408.                 });
  409.                 // --- Event: voir plus ---
  410.                 loadMoreBtn.addEventListener('click', function(){
  411.                     fetchJobs(currentQuery, currentOffset, true);
  412.                 });
  413.                 // --- Event: tags populaires ---
  414.                 document.querySelectorAll('.wr-tag').forEach(function(tag){
  415.                     tag.addEventListener('click', function(){
  416.                         var s = tag.getAttribute('data-search');
  417.                         searchInput.value = s;
  418.                         currentQuery = s;
  419.                         currentOffset = 0;
  420.                         fetchJobs(s, 0, false);
  421.                     });
  422.                 });
  423.                 // --- Chargement initial ---
  424.                 fetchJobs('', 0, false);
  425.             })();
  426.         </script>
  427.     {#% else %}
  428.         <script>
  429.             (function(){
  430.                 var palette = [
  431.                     {bg:'#EDE9FE',color:'#7C3AED'},{bg:'#DBEAFE',color:'#2563EB'},
  432.                     {bg:'#D1FAE5',color:'#059669'},{bg:'#FEF3C7',color:'#D97706'},
  433.                     {bg:'#FCE7F3',color:'#DB2777'},{bg:'#FEE2E2',color:'#DC2626'},
  434.                     {bg:'#E0E7FF',color:'#4338CA'},{bg:'#CCFBF1',color:'#0D9488'}
  435.                 ];
  436.                 function getColor(name){
  437.                     var h=0;for(var i=0;i<name.length;i++) h=name.charCodeAt(i)+((h<<5)-h);
  438.                     return palette[Math.abs(h)%palette.length];
  439.                 }
  440.                 var JOB_BASE_URL = '/{{ app.request.locale }}/job/';
  441.             var searches = {{ popularJobsForVisitor|json_encode|raw }};
  442.                 var typedEl=document.getElementById('wrTypedText'),placeholderEl=document.getElementById('wrPlaceholder'),searchBar=document.getElementById('wrSearchBar'),searchResults=document.getElementById('wrSearchResults'),resultsList=document.getElementById('wrResultsList');
  443.                 var currentSearch=0,charIndex=0,animTimeout;
  444.                 var resultsVisible=false;
  445.                 function buildResults(items){
  446.                     resultsList.innerHTML='';
  447.                     if(!items || items.length === 0){
  448.                         resultsList.innerHTML='<div style="text-align:center;padding:20px;color:#9CA3AF;font-size:14px;">Aucune offre trouvĂ©e pour cette recherche</div>';
  449.                         return;
  450.                     }
  451.                     items.forEach(function(d){
  452.                         var col = getColor(d.jobTitle);
  453.                         var initial = d.jobTitle ? d.jobTitle.charAt(0).toUpperCase() : '?';
  454.             var badgeHtml = '';
  455.             if(d.diffDays <= 3){
  456.                 badgeHtml = '<span class="wr-result-badge wr-badge-new">🆕 New</span>';
  457.             } else if(d.daysUntilExpiry <= 5 && d.daysUntilExpiry > 0){
  458.                 badgeHtml = '<span class="wr-result-badge wr-badge-expire">⏳ Expire dans '+d.daysUntilExpiry+'j</span>';
  459.             } else if(d.daysUntilExpiry <= 0){
  460.                 badgeHtml = '<span class="wr-result-badge wr-badge-expire">⏳ ExpirĂ©e</span>';
  461.             }
  462.             var dateHtml = '<span class="wr-popular-date" style="font-size:12px;color:#6B7280;">đź“… '+d.createdAt+'</span>';
  463.             var div=document.createElement('a');
  464.             div.className='wr-result-item';
  465.             div.href=JOB_BASE_URL + d.slug;
  466.             div.innerHTML=
  467.                 '<div class="wr-result-logo" style="background:'+col.bg+';color:'+col.color+';">'+initial+'</div>'+
  468.                 '<div class="wr-result-info">'+
  469.                     '<div class="wr-result-title">'+d.jobTitle+'</div>'+
  470.                     '<div class="wr-result-meta">'+
  471.                         '<span>📍 '+d.city+'</span>'+
  472.                         '<span>·</span><span>'+d.employmentType+'</span>'+
  473.                         badgeHtml+
  474.                     '</div>'+
  475.                 '</div>'+
  476.                 '<div class="wr-result-actions">'+dateHtml+'</div>';
  477.             resultsList.appendChild(div);
  478.         });
  479.     }
  480.     function showResults(){
  481.         searchResults.classList.add('visible');
  482.         searchBar.classList.add('active');
  483.         resultsVisible=true;
  484.         resultsList.querySelectorAll('.wr-result-item').forEach(function(item,i){
  485.             setTimeout(function(){item.classList.add('show');},100+i*80);
  486.         });
  487.     }
  488.     function updateResults(items){
  489.         var old=resultsList.querySelectorAll('.wr-result-item');
  490.         old.forEach(function(item){item.classList.remove('show');});
  491.         setTimeout(function(){
  492.             buildResults(items);
  493.             resultsList.querySelectorAll('.wr-result-item').forEach(function(item,i){
  494.                 setTimeout(function(){item.classList.add('show');},50+i*80);
  495.             });
  496.         },200);
  497.     }
  498.     function typeText(text,cb){
  499.         if(charIndex<text.length){typedEl.textContent+=text[charIndex];charIndex++;animTimeout=setTimeout(function(){typeText(text,cb)},70+Math.random()*50)}else{cb&&cb()}
  500.     }
  501.     function deleteText(cb){
  502.         var t=typedEl.textContent;if(t.length>0){typedEl.textContent=t.slice(0,-1);animTimeout=setTimeout(function(){deleteText(cb)},35)}else{cb&&cb()}
  503.     }
  504.     function runAnimation(){
  505.         if(searches.length === 0) return;
  506.         var data=searches[currentSearch];placeholderEl.style.display='none';charIndex=0;
  507.         typeText(data.text,function(){
  508.             animTimeout=setTimeout(function(){
  509.                 if(resultsVisible){updateResults(data.jobs)}else{buildResults(data.jobs);showResults()}
  510.                 animTimeout=setTimeout(function(){
  511.                     deleteText(function(){currentSearch=(currentSearch+1)%searches.length;animTimeout=setTimeout(runAnimation,800)});
  512.                 },4000);
  513.             },500);
  514.         });
  515.     }
  516.             if(searches.length > 0){
  517.                 var firstData=searches[0];
  518.                 placeholderEl.style.display='none';
  519.                 typedEl.textContent=firstData.text;
  520.                 buildResults(firstData.jobs);
  521.                 showResults();
  522.                 currentSearch=1 % searches.length;
  523.                 animTimeout=setTimeout(function(){deleteText(function(){animTimeout=setTimeout(runAnimation,800)})},3000);
  524.             }
  525.             document.querySelectorAll('.wr-tag').forEach(function(tag){
  526.                 tag.addEventListener('click',function(){
  527.                     clearTimeout(animTimeout);typedEl.textContent='';placeholderEl.style.display='none';charIndex=0;
  528.                     var s=tag.getAttribute('data-search');
  529.                     var data=searches.find(function(x){return x.searchKeyword===s})||searches.find(function(x){return x.text===s})||searches[0];
  530.                     if(data){
  531.                         typeText(data.text,function(){setTimeout(function(){if(resultsVisible){updateResults(data.jobs)}else{buildResults(data.jobs);showResults()}},400)});
  532.                     }
  533.                 });
  534.             });
  535.         })();
  536.         </script>
  537.     {#% endif %#}
  538.     <div id="how_it_works" class="how-it-works section panel overflow-hidden" style="margin-top:30px;">
  539.         <div class="section-outer panel">
  540.             <div class="container">
  541.                 <div style="text-align:center; margin-bottom:50px;">
  542.                     <h2 class="h4 sm:h3 xl:h2 m-0">Comment Ă§a marche ?</h2>
  543.                 </div>
  544.                 <div class="section-inner panel vstack border rounded-3 overflow-hidden" style="background-color:#F4ECE1;">
  545.                     <div class="row child-cols-12 md:child-cols justify-center col-match g-4 sep uc-grid">
  546.                         <div class="min-w-1/4">
  547.                             <div class="panel vstack items-center gap-2 text-center p-5 xl:py-8">
  548.                                 <img class="w-100" src="/uploads/rh/mascotte_register.png" alt="Alice s'inscrit sur Whileresume">
  549.                                 <h3 class="h5 lg:h4 m-0">Je m'inscris gratuitement</h3>
  550.                                 <p class="fs-6">Connectez-vous avec des entreprises qui recherchent activement des profils comme le vĂ´tre, dans un large Ă©ventail de secteurs.</p>
  551.                             </div>
  552.                         </div>
  553.                         <div class="min-w-1/4">
  554.                             <div class="panel vstack items-center gap-2 text-center p-5 xl:py-8">
  555.                                 <img class="w-100" src="/uploads/rh/mascotte_upload2.png" alt="Alice tĂ©lĂ©charge son CV sur Whileresume">
  556.                                 <h3 class="h5 lg:h4 m-0">Je tĂ©lĂ©charge mon CV</h3>
  557.                                 <p class="fs-6">Je tĂ©lĂ©charge mon CV au format PDF et/ou ma prĂ©sentation vidĂ©o. Je dĂ©finis mes compĂ©tences, mon niveau et mes attentes.</p>
  558.                             </div>
  559.                         </div>
  560.                         <div class="min-w-100 lg:min-w-1/4">
  561.                             <div class="panel vstack items-center gap-2 text-center p-5 xl:py-8">
  562.                                 <img class="w-100" src="/uploads/rh/mascotte_reunion.png" alt="Alice rencontre un recruteur IT">
  563.                                 <h3 class="h5 lg:h4 m-0">Les entreprises me contactent</h3>
  564.                                 <p class="fs-6">Elles utilisent nos filtres pour trouver mon profil et me contactent directement avec des opportunitĂ©s correspondantes, ou je peux postuler directement aux postes ouverts.</p>
  565.                             </div>
  566.                         </div>
  567.                     </div>
  568.                 </div>
  569.             </div>
  570.         </div>
  571.     </div>
  572.     <div id="main_features" class="main-features section panel overflow-hidden">
  573.         <div class="section-outer panel py-6 lg:py-8 xl:py-10">
  574.             <div class="container">
  575.                 <div class="row child-cols col-match justify-between g-4 lg:g-8 xl:g-10">
  576.                     <div class="col-12 sm:col-6 order-0 lg:order-1">
  577.                         <div class="panel w-100"><img src="/uploads/rh/mascotte_filtrage3.png" title="Filtrage par critères" alt="Filtrage par critères" class="rounded-2" style="background-color:#F5EDE3;"></div>
  578.                     </div>
  579.                     <div class="col-12 sm:col-6 order-1 lg:order-0">
  580.                         <div class="panel vstack justify-between gap-4 sm:gap-6 h-100">
  581.                             <div>
  582.                                 <div class="panel vstack gap-2">
  583.                                     <span class="fs-6 fw-bold m-0 text-primary">01.</span>
  584.                                     <h2 class="h4 lg:h3 xl:h2 m-0">Filtrage par critères</h2>
  585.                                     <p class="fs-6 lg:fs-5 opacity-70 dark:opacity-80"><strong>DĂ©finissez une fois</strong> vos critères essentiels : poste recherchĂ©, secteur d'activitĂ©, ville souhaitĂ©e et prĂ©fĂ©rences de travail. Notre système de filtres avancĂ©s permet aux recruteurs de vous identifier prĂ©cisĂ©ment selon vos attentes.</p>
  586.                                     <p class="fs-6 lg:fs-5 opacity-70 dark:opacity-80">Fini les opportunitĂ©s inadĂ©quates : seules les offres qui correspondent vraiment Ă  votre profil vous contactent.</p>
  587.                                 </div>
  588.                             </div>
  589.                             <div>
  590.                                 <div class="p-3 panel vstack gap-3 rounded border">
  591.                                     <p class="fs-6 dark:text-white">"Enfin, une plateforme de recrutement qui fonctionne pour moi. Je dĂ©finis une seule fois mes critères essentiels et je ne reçois que des opportunitĂ©s qui correspondent rĂ©ellement Ă  mon profil. Cela me fait gagner du temps et rend tout le processus bien plus efficace."</p>
  592.                                     <div class="panel hstack gap-1"><div class="panel vstack items-start gap-0"><h6 class="h6 m-0">Clark PHILLIP</h6><span class="fs-7 opacity-70">Data Engineer</span></div></div>
  593.                                 </div>
  594.                             </div>
  595.                         </div>
  596.                     </div>
  597.                 </div>
  598.                 <div class="row child-cols col-match justify-between g-4 lg:g-8 xl:g-10" style="margin-top:40px;">
  599.                     <div class="col-12 sm:col-6 order-0 lg:order-1">
  600.                         <div class="panel w-100"><img src="/uploads/rh/mascotte_upload.png" title="Alice upload son CV" alt="Alice upload son CV" class="rounded-2" style="background-color:#F5EDE3;"></div>
  601.                     </div>
  602.                     <div class="col-12 sm:col-6 order-1 lg:order-0">
  603.                         <div class="panel vstack justify-between gap-4 sm:gap-6 h-100">
  604.                             <div>
  605.                                 <div class="panel vstack gap-2">
  606.                                     <span class="fs-6 fw-bold m-0 text-primary">02.</span>
  607.                                     <h2 class="h4 lg:h3 xl:h2 m-0">Optimisation intelligente</h2>
  608.                                     <p class="fs-6 lg:fs-5 opacity-70 dark:opacity-80"><strong>TĂ©lĂ©chargez votre CV existant</strong> et laissez Whileresume l'analyser automatiquement. Le système extrait et structure l'ensemble de vos informations pour crĂ©er une <strong>prĂ©sentation optimisĂ©e</strong> conforme Ă  votre profil.</p>
  609.                                     <p class="fs-6 lg:fs-5 opacity-70 dark:opacity-80">Whileresume identifie et met en valeur vos <strong>soft skills</strong> (leadership, communication, adaptabilitĂ©...), vos <strong>hard skills</strong> (compĂ©tences techniques, outils, certifications), vos <strong>expĂ©riences professionnelles</strong> avec leurs rĂ©alisations quantifiables, et vos <strong>projets marquants</strong>.</p>
  610.                                 </div>
  611.                             </div>
  612.                             <div>
  613.                                 <div class="p-3 panel vstack gap-3 rounded border">
  614.                                     <p class="fs-6 dark:text-white">"L'outil basĂ© sur l’IA m’aide Ă  crĂ©er un profil solide en intĂ©grant toutes les compĂ©tences clĂ©s de mon CV. Cela permet aux entreprises de me trouver plus facilement que sur n’importe quelle autre plateforme et donc d’avoir plus d’opportunitĂ©s."</p>
  615.                                     <div class="panel hstack gap-1"><div class="panel vstack items-start gap-0"><h6 class="h6 m-0">Alicia GEVERS</h6><span class="fs-7 opacity-70">Digital Marketer</span></div></div>
  616.                                 </div>
  617.                             </div>
  618.                         </div>
  619.                     </div>
  620.                 </div>
  621.                 <div class="row child-cols col-match justify-between g-4 lg:g-8 xl:g-10" style="margin-top:40px;">
  622.                     <div class="col-12 sm:col-6 order-0 lg:order-1">
  623.                         <div class="panel w-100"><img src="/uploads/rh/mascotte_register.png" class="rounded-2" alt="Une recruteuse recupère une pile de CV qualifiĂ©" loading="lazy"></div>
  624.                     </div>
  625.                     <div class="col-12 sm:col-6 order-1 lg:order-0">
  626.                         <div class="panel vstack justify-between gap-4 sm:gap-6 h-100">
  627.                             <div><div class="panel vstack gap-2">
  628.                                     <span class="fs-6 fw-bold m-0 text-primary">03.</span>
  629.                                     <h2 class="h4 lg:h3 xl:h2 m-0">Recherche qualifiĂ©</h2>
  630.                                     <p class="fs-6 lg:fs-5 opacity-70 dark:opacity-80">Plus besoin de chercher activement : les <strong>recruteurs</strong> vous trouvent grâce Ă  <strong>vos critères prĂ©dĂ©finis</strong>. Votre profil reste visible 24h/24 auprès des entreprises & recruteurs qui correspondent Ă  vos attentes.</p>
  631.                                     <p class="fs-6 lg:fs-5 opacity-70 dark:opacity-80">Vous Ă©conomisez du temps tout en multipliant <strong>vos opportunitĂ©s de carrière</strong>. La recherche d'emploi devient enfin passive et efficace.</p>
  632.                                 </div></div>
  633.                             <div><div class="p-3 panel vstack gap-3 rounded border">
  634.                                     <p class="fs-6 dark:text-white">"Cette plateforme Ă©limine le superflu. Chaque message que je reçois est une vĂ©ritable opportunitĂ© qui me correspond. C’est vraiment agrĂ©able d’avoir enfin un recrutement qui respecte mon temps."</p>
  635.                                     <div class="panel hstack gap-1"><div class="panel vstack items-start gap-0"><h6 class="h6 m-0">Bryan OSHEN</h6><span class="fs-7 opacity-70">Product Owner</span></div></div>
  636.                                 </div></div>
  637.                         </div>
  638.                     </div>
  639.                 </div>
  640.                 <div class="row child-cols col-match justify-between g-4 lg:g-8 xl:g-10" style="margin-top:40px;">
  641.                     <div class="col-12 sm:col-6 order-0 lg:order-1">
  642.                         <div class="panel w-100"><img src="/uploads/rh/mascotte_reunion.png" alt="" class="rounded-2"></div>
  643.                     </div>
  644.                     <div class="col-12 sm:col-6 order-1 lg:order-0">
  645.                         <div class="panel vstack justify-between gap-4 sm:gap-6 h-100">
  646.                             <div>
  647.                                 <div class="panel vstack gap-2">
  648.                                     <span class="fs-6 fw-bold m-0 text-primary">04.</span>
  649.                                     <h2 class="h4 lg:h3 xl:h2 m-0">Contact direct qualifiĂ©</h2>
  650.                                     <p class="fs-6 lg:fs-5 opacity-70 dark:opacity-80">Les recruteurs vous contactent <strong>directement</strong> uniquement s'ils ont <strong>une opportunitĂ© concrète</strong> qui correspond Ă  vos critères. Chaque <strong>contact</strong> reçu est <strong>qualifiĂ© et pertinent</strong>.</p>
  651.                                     <p class="fs-6 lg:fs-5 opacity-70 dark:opacity-80">Vous Ă©vitez les sollicitations inadĂ©quates et vous concentrez sur les vraies opportunitĂ©s. Le processus de recrutement devient plus transparent et respectueux de votre temps.</p>
  652.                                 </div>
  653.                             </div>
  654.                             <div>
  655.                                 <div class="p-3 panel vstack gap-3 rounded border">
  656.                                     <p class="fs-6 dark:text-white">"Depuis que j'utilise Whileresume, je ne reçois que des propositions qui correspondent vraiment Ă  mon profil. En deux semaines, j'ai dĂ©crochĂ© trois entretiens pour des postes qui me passionnent. C'est un vrai gain de temps et d'Ă©nergie."</p>
  657.                                     <div class="panel hstack gap-1">
  658.                                         <div class="panel vstack items-start gap-0">
  659.                                             <h6 class="h6 m-0">Sophie MARCHAND</h6>
  660.                                             <span class="fs-7 opacity-70">DĂ©veloppeuse Full-Stack Senior</span>
  661.                                         </div>
  662.                                     </div>
  663.                                 </div>
  664.                             </div>
  665.                         </div>
  666.                     </div>
  667.                 </div>
  668.             </div>
  669.         </div>
  670.     </div>
  671.     <div id="pre_cta" class="pre-cta section panel overflow-hidden">
  672.         <div class="section-outer panel pb-4 sm:pb-6 xl:pb-9">
  673.             <div class="container max-w-xl">
  674.                 <div class="section-inner panel p-4 md:p-6 lg:p-8 rounded-1-5 lg:rounded-2 bg-secondary dark:bg-gray-800 dark:text-white" data-anime="onview: -200; translateY: [24, 0]; opacity: [0, 1]; easing: easeOutCubic; duration: 500;" style="transform: translateY(0px); opacity: 1;">
  675.                     <div class="vstack items-center gap-2 mx-auto text-center" data-anime="onview: -200; targets: &gt;*; translateY: [48, 0]; opacity: [0, 1]; easing: easeOutCubic; duration: 500; delay: anime.stagger(100, {start: 200});">
  676.                         <h2 class="h3 m-0">Whileresume met en relation des talents avec des entreprises en forte croissance</h2>
  677.                         <div class="row" style="margin-top:15px;">
  678.                             <div class="col-md-6">
  679.                                 <div style="background-color:white; text-align:left; border-radius:20px; padding:20px;">
  680.                                     <h3 class="h3 m-0" style="color:purple;">Recruteur</h3>
  681.                                     <p class="fs-6 text-dark dark:text-white text-opacity-70" style="margin-top:10px;">On connecte les meilleurs talents du marchĂ© aux entreprises en croissance qui recherchent des collaborateurs d'exception.</p>
  682.                                     <a href="{{ path('whileresume_business_' ~ app.request.locale) }}" class="btn btn-md btn-primary rounded-default text-white shadow-xs" style="margin-top:10px;">Je recrute <i class="icon-2 unicon-arrow-up-right rtl:-rotate-90"></i></a>
  683.                                 </div>
  684.                             </div>
  685.                             <div class="col-md-6">
  686.                                 <div style="background-color:white; text-align:left; border-radius:20px; padding:20px;">
  687.                                     <h3 class="h3 m-0" style="color:purple;">Candidat</h3>
  688.                                     <p class="fs-6 text-dark dark:text-white text-opacity-70" style="margin-top:10px;">On vous accompagne dans la recherche de votre poste idĂ©al au sein des entreprises les plus prometteuses du marchĂ©.</p>
  689.                                     <a href="{{ path('whileresume_resume_' ~ app.request.locale) }}" class="btn btn-md btn-primary rounded-default text-white shadow-xs" style="margin-top:10px;">Je cherche un job <i class="icon-2 unicon-arrow-up-right rtl:-rotate-90"></i></a>
  690.                                 </div>
  691.                             </div>
  692.                         </div>
  693.                     </div>
  694.                 </div>
  695.             </div>
  696.         </div>
  697.     </div>
  698.     <div id="faq" class="faq section panel" style="margin-bottom:100px;">
  699.         <div class="section panel">
  700.             <div class="container">
  701.                 <div class="section-inner panel">
  702.                     <div class="row child-cols-12 col-match gy-2 lg:gy-6">
  703.                         <div><div class="vstack items-center text-center gap-2"><h2 class="h4 lg:h3 m-0">Comment Ă§a marche ?</h2></div></div>
  704.                         <div>
  705.                             <div class="panel">
  706.                                 <ul class="uc-accordion gap-1 max-w-850px mx-auto" data-uc-accordion="targets: > li; multiple: false;">
  707.                                     <li class="panel p-3 lg:p-4 rounded-1-5 bg-secondary dark:bg-gray-300 dark:bg-opacity-15"><a class="uc-accordion-title h6 md:h5 lg:h4 ls-0 fw-bold ltr:pe-4 rtl:ps-4" href="#">Comment les recruteurs me trouvent-ils ?</a><div class="uc-accordion-content lg:fs-5 opacity-70"><p>Les recruteurs utilisent nos filtres avancĂ©s (poste, secteur, ville, prĂ©fĂ©rences) pour identifier les candidats qui correspondent exactement Ă  leurs besoins. Votre profil apparaĂ®t uniquement dans les recherches pertinentes selon vos critères prĂ©dĂ©finis.</p></div></li>
  708.                                     <li class="panel p-3 lg:p-4 rounded-1-5 bg-secondary dark:bg-gray-300 dark:bg-opacity-15"><a class="uc-accordion-title h6 md:h5 lg:h4 ls-0 fw-bold ltr:pe-4 rtl:ps-4" href="#">Puis-je modifier mes critères après inscription ?</a><div class="uc-accordion-content lg:fs-5 opacity-70"><p>Oui, vous pouvez modifier Ă  tout moment vos prĂ©fĂ©rences de poste, secteur, ville et type de contrat. Ces changements sont immĂ©diatement pris en compte dans les recherches des recruteurs.</p></div></li>
  709.                                     <li class="panel p-3 lg:p-4 rounded-1-5 bg-secondary dark:bg-gray-300 dark:bg-opacity-15"><a class="uc-accordion-title h6 md:h5 lg:h4 ls-0 fw-bold ltr:pe-4 rtl:ps-4" href="#">Comment fonctionne l'IA pour crĂ©er mon CV ?</a><div class="uc-accordion-content lg:fs-5 opacity-70"><p>L'IA analyse vos informations et créé un CV professionnel adaptĂ© Ă  votre secteur. Vous pouvez choisir parmi diffĂ©rents formats (europĂ©en, corporate, thĂ©matisĂ©) et l'IA optimise automatiquement la prĂ©sentation de vos compĂ©tences pour maximiser votre impact.</p></div></li>
  710.                                     <li class="panel p-3 lg:p-4 rounded-1-5 bg-secondary dark:bg-gray-300 dark:bg-opacity-15"><a class="uc-accordion-title h6 md:h5 lg:h4 ls-0 fw-bold ltr:pe-4 rtl:ps-4" href="#">Mes donnĂ©es personnelles sont-elles protĂ©gĂ©es ?</a><div class="uc-accordion-content lg:fs-5 opacity-70"><p>Toutes vos donnĂ©es sont chiffrĂ©es et stockĂ©es de manière sĂ©curisĂ©e. Vous contrĂ´lez entièrement votre profil et pouvez choisir d'utiliser un CV anonyme si vous le souhaitez. Aucune information n'est partagĂ©e sans votre consentement.</p></div></li>
  711.                                     <li class="panel p-3 lg:p-4 rounded-1-5 bg-secondary dark:bg-gray-300 dark:bg-opacity-15"><a class="uc-accordion-title h6 md:h5 lg:h4 ls-0 fw-bold ltr:pe-4 rtl:ps-4" href="#">Que se passe-t-il quand un recruteur me contacte ?</a><div class="uc-accordion-content lg:fs-5 opacity-70"><p>Vous recevez une notification avec les dĂ©tails de l'opportunitĂ©. Le recruteur vous contacte directement parce que votre profil correspond Ă  ses critères de recherche. Vous pouvez alors Ă©changer et dĂ©cider si l'opportunitĂ© vous intĂ©resse.</p></div></li>
  712.                                     <li class="panel p-3 lg:p-4 rounded-1-5 bg-secondary dark:bg-gray-300 dark:bg-opacity-15"><a class="uc-accordion-title h6 md:h5 lg:h4 ls-0 fw-bold ltr:pe-4 rtl:ps-4" href="#">La plateforme est-elle vraiment gratuite ?</a><div class="uc-accordion-content lg:fs-5 opacity-70"><p>Oui, l'inscription et l'utilisation de la plateforme sont 100% gratuites pour les candidats. Vous pouvez crĂ©er votre profil, tĂ©lĂ©charger votre CV, utiliser l'IA et recevoir des contacts de recruteurs sans aucun frais.</p></div></li>
  713.                                 </ul>
  714.                             </div>
  715.                         </div>
  716.                     </div>
  717.                 </div>
  718.             </div>
  719.         </div>
  720.     </div>
  721.     <div id="articles" class="faq section panel" style="margin-bottom:100px;">
  722.         <div class="section-outer panel">
  723.             <div class="container">
  724.                 <div style="margin-bottom:50px; margin-top:50px;"><div class="vstack items-center text-center gap-2"><h2 class="h4 lg:h3 m-0">Nos articles pour vous aider Ă  candidater</h2></div></div>
  725.                 <div class="row child-cols-12 sm:child-cols-4 col-match gy-4 gx-2 xl:gx-4">
  726.                     {% for article in articles %}
  727.                         {% set urlArticle = '/fr' ~ path('blog_article',{'slug': article.slug})  %}
  728.                         {% if article.pageslug3 is not empty %}
  729.                             {% set urlArticle = '/fr/' ~ article.pageslug ~ '/' ~  article.pageslug2 ~ '/' ~ article.pageslug3  %}
  730.                         {% elseif article.pageslug2 is not empty %}
  731.                             {% set urlArticle = '/fr/' ~ article.pageslug ~ '/' ~  article.pageslug2  %}
  732.                         {% elseif article.pageslug is not empty %}
  733.                             {% set urlArticle = '/fr/' ~ article.pageslug  %}
  734.                         {% endif %}
  735.                         <div class="col-12">
  736.                             <article class="post type-post panel rounded-3 p-2 md:p-4 bg-secondary dark:bg-gray-800">
  737.                                 <div class="panel row child-cols-12 sm:child-cols items-center g-3 md:g-4">
  738.                                     <div class="sm:col-4 md:col-6 lg:col-4">
  739.                                         <div class="panel">
  740.                                             {% if article.image.name is not null %}
  741.                                                 <figure class="featured-image m-0 rounded ratio ratio-1x1 rounded-2 uc-transition-toggle overflow-hidden"><img class="media-cover image uc-transition-scale-up uc-transition-opaque" src="{{ vich_uploader_asset(article, 'imageFile') }}" alt="{{ article.title }}" title="{{ article.title }}"><a class="position-cover" href="#"></a></figure>
  742.                                             {% else %}
  743.                                                 <figure class="featured-image m-0 rounded ratio ratio-1x1 rounded-2 uc-transition-toggle overflow-hidden"><img class="media-cover image uc-transition-scale-up uc-transition-opaque" src="/uploads/no_article.jpg" alt="{{ article.title }}" title="{{ article.title }}"><a class="position-cover" href="#"></a></figure>
  744.                                             {% endif %}
  745.                                         </div>
  746.                                     </div>
  747.                                     <div>
  748.                                         <div class="vstack items-start gap-2 md:gap-3">
  749.                                             <ul class="post-meta nav-x ft-tertiary justify-start gap-1 fs-7"><li><div class="post-date hstack gap-narrow"><span>{{ article.publishedAt|date("d, M, Y") }}</span></div></li></ul>
  750.                                             <h3 class="h4 sm:h5 md:h4 lg:h3 m-0"><a class="text-none" href="{{ urlArticle }}">{{ article.title }}</a></h3>
  751.                                             <p class="fs-6 md:fs-5 d-none md:d-block">{{ article.subtitle }}</p>
  752.                                             <a class="btn btn-text text-primary border-bottom d-inline-flex fs-7 md:fs-6 my-1 md:my-2 d-none md:d-block" href="{{ urlArticle }}">Je lis l'article</a>
  753.                                         </div>
  754.                                     </div>
  755.                                 </div>
  756.                             </article>
  757.                         </div>
  758.                     {% endfor  %}
  759.                 </div>
  760.             </div>
  761.         </div>
  762.     </div>
  763.     <div id="pre_cta" class="pre-cta section panel overflow-hidden">
  764.         <div class="section-outer panel pb-4 sm:pb-6 xl:pb-9">
  765.             <div class="container max-w-xl">
  766.                 <div class="section-inner panel p-4 md:p-6 lg:p-8 rounded-1-5 lg:rounded-2 bg-secondary dark:bg-gray-800 dark:text-white" data-anime="onview: -200; translateY: [24, 0]; opacity: [0, 1]; easing: easeOutCubic; duration: 500;" style="transform: translateY(0px); opacity: 1;">
  767.                     <div class="vstack items-center gap-2 mx-auto text-center" data-anime="onview: -200; targets: &gt;*; translateY: [48, 0]; opacity: [0, 1]; easing: easeOutCubic; duration: 500; delay: anime.stagger(100, {start: 200});">
  768.                         <h2 class="h3 m-0">Whileresume met en relation des talents avec des entreprises en forte croissance</h2>
  769.                         <div class="row" style="margin-top:15px;">
  770.                             <div class="col-md-6">
  771.                                 <div style="background-color:white; text-align:left; border-radius:20px; padding:20px;">
  772.                                     <h3 class="h3 m-0" style="color:purple;">Recruteur</h3>
  773.                                     <p class="fs-6 text-dark dark:text-white text-opacity-70" style="margin-top:10px;">On connecte les meilleurs talents du marchĂ© aux entreprises en croissance qui recherchent des collaborateurs d'exception.</p>
  774.                                     <a href="{{ path('whileresume_business_' ~ app.request.locale) }}" class="btn btn-md btn-primary rounded-default text-white shadow-xs" style="margin-top:10px;">Je recrute <i class="icon-2 unicon-arrow-up-right rtl:-rotate-90"></i></a>
  775.                                 </div>
  776.                             </div>
  777.                             <div class="col-md-6">
  778.                                 <div style="background-color:white; text-align:left; border-radius:20px; padding:20px;">
  779.                                     <h3 class="h3 m-0" style="color:purple;">Candidat</h3>
  780.                                     <p class="fs-6 text-dark dark:text-white text-opacity-70" style="margin-top:10px;">On vous accompagne dans la recherche de votre poste idĂ©al au sein des entreprises les plus prometteuses du marchĂ©.</p>
  781.                                     <a href="{{ path('whileresume_resume_' ~ app.request.locale) }}" class="btn btn-md btn-primary rounded-default text-white shadow-xs" style="margin-top:10px;">Je cherche un job <i class="icon-2 unicon-arrow-up-right rtl:-rotate-90"></i></a>
  782.                                 </div>
  783.                             </div>
  784.                         </div>
  785.                     </div>
  786.                 </div>
  787.             </div>
  788.         </div>
  789.     </div>
  790. {% endblock body %}