templates/application/whileresume/website/components/footer.html.twig line 7

Open in your IDE?
  1. {% set _locale = app.request.locale %}
  2. {% set _isFr = _locale == 'fr' %}
  3. {# Données dynamiques #}
  4. {% set footerArticles = getFooterArticles(_locale, 5) %}
  5. {% set footerLandingJobs = getFooterFeaturedLandingJobs(_locale, 5) %}
  6. {% set footerJobsCities = getFooterJobsCities(_locale, 6) %}
  7. {% set footerEnterprisesCities = getFooterEnterprisesCities(_locale, 6) %}
  8. <style>
  9.     /* ---------- Footer WhileResume ---------- */
  10.     .whr-footer {
  11.         margin-top: 32px;
  12.         padding: 36px 24px 24px;
  13.         background: #F9FAFD;
  14.         border-radius: 16px;
  15.         color: #2c2c46;
  16.         /* Pleine largeur quand le footer est en dehors de .middle-sidebar-left */
  17.         width: auto;
  18.         max-width: none;
  19.         margin-left: 16px;
  20.         margin-right: 16px;
  21.     }
  22.     .theme-dark .whr-footer {
  23.         background: #2a2a3c;
  24.         color: #e9e9ef;
  25.     }
  26.     /* Si le footer reste dans .middle-sidebar-left (fallback ancien layout) */
  27.     .middle-sidebar-left .whr-footer {
  28.         width: 100%;
  29.         margin-left: 0;
  30.         margin-right: 0;
  31.     }
  32.     /* Stores en haut de la col 1 */
  33.     .whr-footer .whr-stores {
  34.         display: flex;
  35.         flex-direction: column;
  36.         gap: 8px;
  37.         margin-bottom: 18px;
  38.     }
  39.     .whr-footer .whr-store-link {
  40.         display: inline-flex;
  41.         align-items: center;
  42.         gap: 10px;
  43.         padding: 8px 14px;
  44.         background: #111;
  45.         color: #fff !important;
  46.         border-radius: 10px;
  47.         font-size: 12px;
  48.         font-weight: 600;
  49.         text-decoration: none !important;
  50.         line-height: 1.2;
  51.         transition: transform .15s ease, background .2s ease;
  52.         max-width: 170px;
  53.     }
  54.     .whr-footer .whr-store-link:hover {
  55.         background: #2c2c46;
  56.         transform: translateY(-1px);
  57.     }
  58.     .whr-footer .whr-store-link small {
  59.         display: block;
  60.         font-weight: 400;
  61.         font-size: 10px;
  62.         opacity: .7;
  63.     }
  64.     .whr-footer .whr-store-link strong { font-size: 13px; display: block; }
  65.     /* Colonnes */
  66.     .whr-footer .whr-foot-col h4 {
  67.         font-size: 13px;
  68.         font-weight: 700;
  69.         margin: 0 0 14px 0;
  70.         color: inherit;
  71.         text-transform: uppercase;
  72.         letter-spacing: .3px;
  73.     }
  74.     .whr-footer .whr-foot-col ul {
  75.         list-style: none;
  76.         padding: 0;
  77.         margin: 0;
  78.         font-size: 13px;
  79.     }
  80.     .whr-footer .whr-foot-col ul li { margin-bottom: 10px; }
  81.     .whr-footer .whr-foot-col a {
  82.         color: inherit;
  83.         opacity: .75;
  84.         text-decoration: none;
  85.         transition: opacity .2s ease, color .2s ease;
  86.     }
  87.     .whr-footer .whr-foot-col a:hover { opacity: 1; color: var(--theme-color, #6C3AED); }
  88.     .whr-footer .whr-foot-empty {
  89.         font-size: 12px;
  90.         opacity: .5;
  91.         font-style: italic;
  92.     }
  93.     /* Liste avec icônes (col 1) */
  94.     .whr-footer .whr-foot-action-links a {
  95.         display: inline-flex;
  96.         align-items: center;
  97.         gap: 8px;
  98.     }
  99.     .whr-footer .whr-foot-action-links a i {
  100.         font-size: 14px;
  101.         opacity: .7;
  102.         width: 16px;
  103.         text-align: center;
  104.     }
  105.     /* Mini-icône ville pour cols 3 et 4 */
  106.     .whr-footer .whr-foot-col .whr-city-link {
  107.         display: inline-flex;
  108.         align-items: center;
  109.         gap: 6px;
  110.     }
  111.     .whr-footer .whr-foot-col .whr-city-link .whr-city-icon {
  112.         font-size: 14px;
  113.         line-height: 1;
  114.         display: inline-block;
  115.         width: 18px;
  116.         text-align: center;
  117.         opacity: .85;
  118.     }
  119.     /* Grille principale : 1 col → 2 cols → 5 cols */
  120.     .whr-footer .whr-foot-grid {
  121.         display: grid;
  122.         gap: 28px;
  123.         grid-template-columns: 1fr;
  124.     }
  125.     @media (min-width: 576px) {
  126.         .whr-footer .whr-foot-grid { grid-template-columns: 1fr 1fr; }
  127.     }
  128.     @media (min-width: 992px) {
  129.         .whr-footer .whr-foot-grid {
  130.             grid-template-columns: repeat(5, 1fr);
  131.             gap: 32px;
  132.         }
  133.     }
  134.     /* Bottom bar */
  135.     .whr-footer .whr-foot-bottom {
  136.         margin-top: 32px;
  137.         padding-top: 20px;
  138.         border-top: 1px solid rgba(0,0,0,.08);
  139.         display: flex;
  140.         flex-direction: column;
  141.         gap: 14px;
  142.         align-items: center;
  143.         text-align: center;
  144.     }
  145.     .theme-dark .whr-footer .whr-foot-bottom { border-top-color: rgba(255,255,255,.1); }
  146.     @media (min-width: 768px) {
  147.         .whr-footer .whr-foot-bottom {
  148.             flex-direction: row;
  149.             justify-content: space-between;
  150.             text-align: left;
  151.         }
  152.     }
  153.     .whr-footer .whr-foot-copy {
  154.         display: inline-flex;
  155.         align-items: center;
  156.         gap: 8px;
  157.         font-size: 12px;
  158.         opacity: .7;
  159.         margin: 0;
  160.     }
  161.     .whr-footer .whr-foot-copy img.whr-favicon {
  162.         width: 18px;
  163.         height: 18px;
  164.         border-radius: 4px;
  165.         flex-shrink: 0;
  166.     }
  167.     .whr-footer .whr-foot-legal {
  168.         display: flex;
  169.         flex-wrap: wrap;
  170.         gap: 6px 16px;
  171.         justify-content: center;
  172.         font-size: 12px;
  173.     }
  174.     .whr-footer .whr-foot-legal a {
  175.         color: inherit;
  176.         opacity: .75;
  177.         text-decoration: none;
  178.     }
  179.     .whr-footer .whr-foot-legal a:hover { opacity: 1; }
  180.     .whr-footer .whr-foot-legal .whr-admin-link { color: #e74c3c !important; opacity: 1; }
  181.     .whr-footer .whr-foot-social {
  182.         display: flex;
  183.         flex-wrap: wrap;
  184.         gap: 6px;
  185.         list-style: none;
  186.         padding: 0;
  187.         margin: 0;
  188.     }
  189.     .whr-footer .whr-foot-social a {
  190.         width: 32px; height: 32px;
  191.         border-radius: 8px;
  192.         background: #fff;
  193.         display: inline-flex;
  194.         align-items: center;
  195.         justify-content: center;
  196.         color: #2c2c46;
  197.         text-decoration: none !important;
  198.         transition: background .2s ease, color .2s ease, transform .15s ease;
  199.         box-shadow: 0 1px 2px rgba(0,0,0,.04);
  200.     }
  201.     .whr-footer .whr-foot-social a:hover {
  202.         background: var(--theme-color, #6C3AED);
  203.         color: #fff;
  204.         transform: translateY(-1px);
  205.     }
  206.     .theme-dark .whr-footer .whr-foot-social a {
  207.         background: #34344a;
  208.         color: #fff;
  209.         box-shadow: none;
  210.     }
  211.     .whr-footer .whr-foot-social i { font-size: 14px; }
  212.     @media (max-width: 575.98px) {
  213.         .whr-footer {
  214.             padding: 24px 18px 20px;
  215.             margin-left: 8px;
  216.             margin-right: 8px;
  217.         }
  218.     }
  219. </style>
  220. <footer class="whr-footer" role="contentinfo">
  221.     {# === Grille principale 5 colonnes === #}
  222.     <div class="whr-foot-grid">
  223.         {# ===== Col 1 : Mon compte / Commencer ici ===== #}
  224.         {% if _isFr %}
  225.             {% set _ios = ios_fr %}
  226.             {% set _android = android_fr %}
  227.         {% else %}
  228.             {% set _ios = ios_us %}
  229.             {% set _android = android_us %}
  230.         {% endif %}
  231.         <div class="whr-foot-col whr-foot-col-action">
  232.             {% if connectUser %}
  233.                 <h4>{{ 'layout.footer.my_account'|trans({}, 'whr-public')|default('Mon compte') }}</h4>
  234.             {% else %}
  235.                 <h4>{{ 'layout.footer.start_here'|trans({}, 'whr-public')|default('Commencer ici') }}</h4>
  236.             {% endif %}
  237.             <div class="whr-stores">
  238.                 {% if _ios %}
  239.                     <a href="{{ _ios }}" class="whr-store-link" target="_blank" rel="noopener" aria-label="App Store">
  240.                         <svg width="18" height="18" viewBox="0 0 24 24" fill="#fff" aria-hidden="true">
  241.                             <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"/>
  242.                         </svg>
  243.                         <span>
  244.                             <small>{{ 'layout.download_on'|trans({}, 'whr-public')|default('Télécharger sur') }}</small>
  245.                             <strong>App Store</strong>
  246.                         </span>
  247.                     </a>
  248.                 {% endif %}
  249.                 {% if _android %}
  250.                     <a href="{{ _android }}" class="whr-store-link" target="_blank" rel="noopener" aria-label="Google Play">
  251.                         <svg width="18" height="18" viewBox="0 0 512 512" aria-hidden="true">
  252.                             <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"/>
  253.                             <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"/>
  254.                             <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"/>
  255.                             <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"/>
  256.                         </svg>
  257.                         <span>
  258.                             <small>{{ 'layout.available_on'|trans({}, 'whr-public')|default('Disponible sur') }}</small>
  259.                             <strong>Google Play</strong>
  260.                         </span>
  261.                     </a>
  262.                 {% endif %}
  263.             </div>
  264.             <ul class="whr-foot-action-links">
  265.                 <li>
  266.                     <a href="{{ path('whileresume_homepage') }}">
  267.                         <i class="feather-flag"></i>
  268.                         English
  269.                     </a>
  270.                 </li>
  271.                 <li>
  272.                     <a href="{{ path('locale_whileresume_homepage',{'_locale':'fr'}) }}">
  273.                         <i class="feather-flag"></i>
  274.                         Français
  275.                     </a>
  276.                 </li>
  277.             </ul>
  278.         </div>
  279.         {# ===== Col 2 : Articles récents (featured) ===== #}
  280.         <div class="whr-foot-col">
  281.             <h4>{{ 'layout.footer.latest_articles'|trans({}, 'whr-public')|default('Articles récents') }}</h4>
  282.             {% if footerArticles is not empty %}
  283.                 <ul>
  284.                     {% for article in footerArticles %}
  285.                         <li>
  286.                             <a href="{% if _isFr %}{{ path('locale_cvs_website_article', {'_locale': _locale, 'slug': article.slug}) }}{% else %}{{ path('cvs_website_article', {'slug': article.slug}) }}{% endif %}"
  287.                                title="{{ article.title }}">
  288.                                 {{ article.shortTitle ?: cleanSubstr(article.title, 45) }}
  289.                             </a>
  290.                         </li>
  291.                     {% endfor %}
  292.                 </ul>
  293.             {% else %}
  294.                 <p class="whr-foot-empty">{{ 'layout.footer.coming_soon'|trans({}, 'whr-public')|default('Bientôt disponible') }}</p>
  295.             {% endif %}
  296.         </div>
  297.         {# ===== Col 3 : Emplois par ville ===== #}
  298.         <div class="whr-foot-col">
  299.             <h4>{{ 'layout.footer.jobs_by_city'|trans({}, 'whr-public')|default('Emplois par ville') }}</h4>
  300.             {% if footerJobsCities is not empty %}
  301.                 <ul>
  302.                     {% for city in footerJobsCities %}
  303.                         <li>
  304.                             <a class="whr-city-link"
  305.                                href="{% if _isFr %}{{ path('locale_cvs_application_jobs_filter', {'_locale': _locale, 'slug': city.slug}) }}{% else %}{{ path('cvs_application_jobs_filter', {'slug': city.slug}) }}{% endif %}"
  306.                                title="{{ city.shortTitle ?: city.label }}">
  307.                                 {% if city.icon %}
  308.                                     <span class="whr-city-icon">{{ city.icon }}</span>
  309.                                 {% else %}
  310.                                     <i class="feather-map-pin whr-city-icon"></i>
  311.                                 {% endif %}
  312.                                 <span>{{ city.label }}</span>
  313.                             </a>
  314.                         </li>
  315.                     {% endfor %}
  316.                 </ul>
  317.             {% else %}
  318.                 <p class="whr-foot-empty">{{ 'layout.footer.coming_soon'|trans({}, 'whr-public')|default('Bientôt disponible') }}</p>
  319.             {% endif %}
  320.         </div>
  321.         {# ===== Col 4 : Entreprises par ville ===== #}
  322.         <div class="whr-foot-col">
  323.             <h4>{{ 'layout.footer.companies_by_city'|trans({}, 'whr-public')|default('Entreprises par ville') }}</h4>
  324.             {% if footerEnterprisesCities is not empty %}
  325.                 <ul>
  326.                     {% for city in footerEnterprisesCities %}
  327.                         <li>
  328.                             <a class="whr-city-link"
  329.                                href="{% if _isFr %}{{ path('locale_cvs_application_companies_filter', {'_locale': _locale, 'slug': city.slug}) }}{% else %}{{ path('cvs_application_companies_filter', {'slug': city.slug}) }}{% endif %}"
  330.                                title="{{ city.shortTitle ?: city.label }}">
  331.                                 {% if city.icon %}
  332.                                     <span class="whr-city-icon">{{ city.icon }}</span>
  333.                                 {% else %}
  334.                                     <i class="feather-map-pin whr-city-icon"></i>
  335.                                 {% endif %}
  336.                                 <span>{{ city.label }}</span>
  337.                             </a>
  338.                         </li>
  339.                     {% endfor %}
  340.                 </ul>
  341.             {% else %}
  342.                 <p class="whr-foot-empty">{{ 'layout.footer.coming_soon'|trans({}, 'whr-public')|default('Bientôt disponible') }}</p>
  343.             {% endif %}
  344.         </div>
  345.         {# ===== Col 5 : Pages SEO (LandingJobs featured) =====
  346.              ⚠️ Route 'cvs_application_landing_jobs_show' non trouvée dans tes
  347.              routes.yml (peut-être dans whileresume_resume.yml ?). Adapte si besoin. #}
  348.         <div class="whr-foot-col">
  349.             <h4>{{ 'layout.footer.featured_pages'|trans({}, 'whr-public')|default('À découvrir') }}</h4>
  350.             {% if footerLandingJobs is not empty %}
  351.                 <ul>
  352.                     {% for landing in footerLandingJobs %}
  353.                         <li>
  354.                             <a href="{% if _isFr %}{{ path('locale_whileresume_homepage_landing', {'_locale': _locale, 'slug': landing.slug}) }}{% else %}{{ path('whileresume_homepage_landing', {'slug': landing.slug}) }}{% endif %}">
  355.                                 {{ landing.title }}
  356.                             </a>
  357.                         </li>
  358.                     {% endfor %}
  359.                 </ul>
  360.             {% endif %}
  361.         </div>
  362.     </div>
  363.     {# === Bas du footer === #}
  364.     <div class="whr-foot-bottom">
  365.         <p class="whr-foot-copy">
  366.             {% if favicon %}
  367.                 <img src="{{ favicon }}" alt="" class="whr-favicon" />
  368.             {% endif %}
  369.             <span>&copy; {{ "now"|date('Y') }} {{ websitename }}. {{ 'layout.rights_reserved'|trans({}, 'whr-public')|default('Tous droits réservés.') }}</span>
  370.         </p>
  371.         <div class="whr-foot-legal">
  372.             {% set menuFooter = getMenuWebsiteLocaleArray(_locale, "footer", connectUser) %}
  373.             {% if menuFooter is not empty %}
  374.                 {% for m in menuFooter %}
  375.                     <a href="{{ m.link }}"
  376.                        aria-label="{{ m.title }}"
  377.                        title="{{ m.title }}"
  378.                        {% if m.targetBlank == 1 %}target="_blank" rel="noreferrer"{% endif %}>
  379.                         {{ m.title }}
  380.                     </a>
  381.                 {% endfor %}
  382.             {% endif %}
  383.             {% if app.user is not null and is_granted("ROLE_SUPER_ADMIN") %}
  384.                 <a href="{{ path('backoffice_dashboard') }}" class="whr-admin-link" title="Administration">
  385.                     <i class="feather-settings"></i> Administration
  386.                 </a>
  387.             {% endif %}
  388.         </div>
  389.         <ul class="whr-foot-social">
  390.             {% if facebook %}
  391.                 <li><a href="{{ facebook }}" target="_blank" rel="noopener" aria-label="Facebook"><i class="feather-facebook"></i></a></li>
  392.             {% endif %}
  393.             {% if twitter %}
  394.                 <li><a href="{{ twitter }}" target="_blank" rel="noopener" aria-label="X / Twitter"><i class="feather-twitter"></i></a></li>
  395.             {% endif %}
  396.             {% if instagram %}
  397.                 <li><a href="{{ instagram }}" target="_blank" rel="noopener" aria-label="Instagram"><i class="feather-instagram"></i></a></li>
  398.             {% endif %}
  399.             {% if linkedin %}
  400.                 <li><a href="{{ linkedin }}" target="_blank" rel="noopener" aria-label="LinkedIn"><i class="feather-linkedin"></i></a></li>
  401.             {% endif %}
  402.             {% if youtube %}
  403.                 <li><a href="{{ youtube }}" target="_blank" rel="noopener" aria-label="YouTube"><i class="feather-youtube"></i></a></li>
  404.             {% endif %}
  405.         </ul>
  406.     </div>
  407. </footer>