templates/default/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %}Otropik — Agence de voyage en Guadeloupe & dans le monde{% endblock %}
  3. {% block body %}
  4. {# -----------------------------
  5.    HERO avec fond + recherche
  6. ------------------------------ #}
  7. <section class="section-hero position-relative">
  8.   <picture>
  9.   {% if banner.img %}
  10.   <img src="{{ asset('img/banner/')}}{{banner.img}}" alt="Plage paradisiaque" class="hero-bg w-100 h-100">
  11.   {% else %}
  12.     <img src="{{ asset('img/3004.jpg') }}" alt="Plage paradisiaque en Guadeloupe" class="hero-bg w-100 h-100">
  13.   {% endif %}
  14.   </picture>
  15.   <div class="hero-overlay container py-5 text-center text-white">
  16.     <img src="{{ asset('img/logo-otropik.png') }}" alt="Otropik" class="mb-3" style="max-width: 240px; height: auto;">
  17.     <p class="lead fw-semibold text-shadow-sm">N&#39;imaginez plus vos vacances, vivez-les !</p>
  18.     <form class="d-flex justify-content-center mt-4" action="{{ path('search') }}" method="get" role="search" aria-label="Recherche de séjours">
  19.       <div class="search-pill bg-white rounded-pill shadow-lg d-flex align-items-center overflow-hidden w-100" style="max-width:760px;">
  20.         <input class="form-control border-0 px-4 py-3 flex-grow-1" type="search" name="q" placeholder="Où partez-vous ? (ex: Guadeloupe, New York, croisière…)" aria-label="Rechercher">
  21.         <button class="btn btn-primary rounded-0 px-4 py-3" type="submit">Rechercher</button>
  22.       </div>
  23.     </form>
  24.     <div class="d-flex gap-2 justify-content-center mt-3 flex-wrap">
  25.       <a href="{{ path('o.circuit') }}" class="btn btn-outline-light btn-sm rounded-pill">O&#39; Circuit</a>
  26.       <a href="{{ path('o.escapade') }}" class="btn btn-outline-light btn-sm rounded-pill">O&#39; Escapade</a>
  27.       <a href="{{ path('o.roadtrip') }}" class="btn btn-outline-light btn-sm rounded-pill">O&#39; RoadTrip</a>
  28.        <a href="{{ path('o.croisiere') }}" class="btn btn-outline-light btn-sm rounded-pill">O&#39; Croisière</a>
  29.     </div>
  30.   </div>
  31. </section>
  32. {# -----------------------------
  33.    Offres du moment + chips
  34. ------------------------------ #}
  35. <section class="py-5 bg-white">
  36.   <div class="container">
  37.     <header class="d-flex flex-wrap align-items-center justify-content-between gap-3 mb-3">
  38.       <div>
  39.         <h2 class="h3 text-success mb-1 fw-bold">Nos O&#39;ffres du moment</h2>
  40.         <p class="text-muted mb-0">Découvrez nos dernières expériences en immersion !</p>
  41.       </div>
  42.      <div class="d-flex gap-2 flex-wrap">
  43.         <a href="{{ path('o.circuit') }}" class="chip">O&#39; Circuit</a>
  44.         <a href="{{ path('o.escapade') }}" class="chip">O&#39; Escapade</a>
  45.         <a href="{{ path('o.roadtrip') }}" class="chip">O&#39; RoadTrip</a>
  46.       </div> 
  47.     </header>
  48.     <div class="row g-3 g-md-4">
  49.       {% for o in ourOffer %}
  50.       <div class="col-12 col-sm-6 col-lg-3">
  51.         <article class="card card-offer border-0 shadow-sm h-10s0 overflow-hidden rounded-4">
  52.           {% if o.type.id ==  1 %}
  53.           <a href="{{ path('o.escapade.destination',{slug:o.slug})}}" class="stretched-link text-decoration-none text-white">
  54.           {% elseif o.type.id == 2 %}
  55.           <a href="{{ path('o.circuit.destination',{slug:o.slug})}}" class="stretched-link text-decoration-none text-white">
  56.           {% elseif o.type.id == 3 %}
  57.           <a href="{{ path('o.roadtrip.destination',{slug:o.slug})}}" class="stretched-link text-decoration-none text-white">
  58.           {% endif %}
  59.             <div class="ratio ratio-4x5">
  60.               <img src="{{asset('img/offer/' ~ o.file  ~ '/' ~ o.slug  ~ '/' ~ o.img)}}" alt="{{ o.file }}" class="object-fit-cover w-100 h-100">
  61.             </div>
  62.             <div class="card-img-overlay d-flex flex-column justify-content-end p-3 p-md-4">
  63.               <span>{{ o.type.name }}</span>
  64.               <h3 class="h5 fw-bold text-white text-shadow-sm mb-3">{{ o.title }}</h3>
  65.               <div>
  66.                 <span class="btn btn-outline-light btn-sm rounded-pill">Découvrir</span>
  67.               </div>
  68.             </div>
  69.           </a>
  70.         </article>
  71.       </div>
  72.       {% endfor %}
  73.     </div>
  74.     <div class="section-divider mx-auto my-5"></div>
  75.   </div>
  76. </section>
  77. {# -----------------------------
  78.    O&#39;Selection (grille 4 cartes)
  79. ------------------------------ #}
  80. <section class="py-5 bg-white">
  81.   <div class="container">
  82.     <header class="mb-3">
  83.       <h2 class="h3 text-success mb-1 fw-bold">Nos O&#39;Sélections</h2>
  84.       <p class="text-muted mb-0">Découvrez nos dernières expériences en immersion !</p>
  85.     </header>
  86.     <div class="row g-3 g-md-4">
  87.  {% for offer in offEscapade %}
  88.     <div class="col-12 col-sm-6 col-lg-3">
  89.       <article class="card card-dest border-0 shadow-sm h-100 overflow-hidden rounded-4">
  90.       {% if offer.destination %}
  91.         <a href="{{ path('o.escapade.destination',{slug:offer.destination.slug}) }}" class="stretched-link text-decoration-none text-white">
  92.           <div class="ratio ratio-4x5">
  93.               <img src="{{asset('img/destination/' ~ offer.destination.slug  ~ '/' ~ offer.destination.img)}}" alt="{{ offer.title }}" class="object-fit-cover w-100 h-100">
  94.           </div>
  95.           <div class="card-img-overlay d-flex flex-column justify-content-end p-3 p-md-4">
  96.              {# <span class="badge bg-light text-dark rounded-pill small mb-2">{{ c.badge }}</span> #}
  97.                 <h3 class="h5 fw-bold text-white text-shadow-sm mb-0">{{ offer.title }}</h3>
  98.               <div class="mt-3">
  99.                   <span class="btn btn-outline-light btn-sm rounded-pill">Découvrir</span>
  100.               </div>
  101.           </div>
  102.           </a>
  103.         {% endif %}
  104.         </article>
  105.       </div>
  106. {% endfor %}
  107.     <div class="section-divider mx-auto my-5"></div>
  108.   </div>
  109. </section>
  110. {# -----------------------------
  111.    Bandeau CTA parallax
  112. ------------------------------ #}
  113. <section class="cta-parallax text-white text-center">
  114.   {# bg en CSS via variable -> parallax #}
  115.   <div class="cta-parallax__bg" style="--bg:url('{{ asset('img/para.jpg') }}');"></div>
  116.   <div class="cta-parallax__overlay"></div>
  117.   <div class="container position-relative py-5 py-lg-7">
  118.     <h2 class="display-6 fw-bold text-shadow-sm mb-3">Une envie de voyage particulière ?</h2>
  119.     {# tags / chips #}
  120.     <ul class="cta-chips list-unstyled mx-auto mb-3" role="list" aria-label="Idées de voyages">
  121.       {% set tags = ['Randonnée','Road trip','Croisière','Immersion','Aventure','Découverte'] %}
  122.       {#{% for t in tags %}
  123.         <li class="chip chip--ghost">{{ t }}</li>
  124.       {% endfor %}#}
  125.       {% for c in continents %}
  126.         <a class="chip chip--ghost" href="{{path('o.continent',{slug:c.slug})}}"><li>{{ c.name }}</li></a> 
  127.       {% endfor %}
  128.     </ul>
  129.     <p class="opacity-90 mb-4">Construisez votre voyage avec un spécialiste</p>
  130.     <div class="d-flex gap-2 justify-content-center flex-wrap">
  131.       <a href="{{ path('o.contact') }}" class="btn btn-outline-light rounded-pill">Nous contacter</a>
  132.       <a href="{{ path('o.devis') }}" class="btn btn-primary rounded-pill">Demander un devis</a>
  133.     </div>
  134.   </div>
  135. </section>
  136. {# -----------------------------
  137.    Pourquoi voyager avec nous + O’Atouts
  138. ------------------------------ #}
  139. <section class="py-5 bg-white">
  140.   <div class="container">
  141.     {# --- Partie Pourquoi voyager avec nous --- #}
  142.     <div class="row align-items-center g-4">
  143.       <div class="col-12 col-lg-6">
  144.         <div id="carouselAtouts" class="carousel slide rounded-4 overflow-hidden shadow-sm" data-bs-ride="carousel">
  145.           <div class="carousel-inner">
  146.             <div class="carousel-item active">
  147.               <img src="{{ asset('img/photo-agence.jpg') }}" class="d-block w-100 object-fit-cover" alt="Voyage 1">
  148.             </div>
  149.             <div class="carousel-item">
  150.               <img src="{{ asset('img/photo-agence-0.jpg') }}" class="d-block w-100 object-fit-cover" alt="Voyage 2">
  151.             </div>
  152.           </div>
  153.           <button class="carousel-control-prev" type="button" data-bs-target="#carouselAtouts" data-bs-slide="prev">
  154.             <span class="carousel-control-prev-icon" aria-hidden="true"></span>
  155.             <span class="visually-hidden">Précédent</span>
  156.           </button>
  157.           <button class="carousel-control-next" type="button" data-bs-target="#carouselAtouts" data-bs-slide="next">
  158.             <span class="carousel-control-next-icon" aria-hidden="true"></span>
  159.             <span class="visually-hidden">Suivant</span>
  160.           </button>
  161.         </div>
  162.       </div>
  163.       <div class="col-12 col-lg-6">
  164.         <h2 class="h3 txt-ot-green fw-bold mb-3">Pourquoi voyager avec O’TROPIK ?</h2>
  165.         <p class="text-muted">Chez O’TROPIK, nous croyons que chaque voyage doit être unique, conçu avec soin et adapté à vos envies.</p>
  166.         <p class="text-muted">Forte d’une solide expérience dans le tourisme et d’une véritable passion pour le voyage, notre agence vous accompagne dans la création de séjours qui vous ressemblent.</p>
  167.         <p class="text-muted">Notre priorité : que vos vacances soient inoubliables et que vous vous sentiez privilégiés à chaque étape, de la préparation à votre retour.</p>
  168.       {# <div class="mt-4">
  169.           <a href="{#{ path('app_agence') }}" class="btn btn-primary">En savoir plus</a>
  170.         </div> #} 
  171.       </div>
  172.     </div>
  173.     {# --- O’Atouts (sous la row principale) --- #}
  174.     <div class="row mt-5 mb-2">
  175.       <div class="col-12 mb-3">
  176.         <h2 class="h3 fw-bold txt-ot-green">O’ Atouts</h2>
  177.         <p class="text-muted mb-0">Parce que chaque détail compte, voici ce qui rend nos voyages uniques.</p>
  178.       </div>
  179.       {% for a in atouts %}
  180.          <div class="col-12 col-md-6 col-lg-3 mb-3">
  181.         <div class="p-3 text-center h-100 border rounded-4 shadow-sm">
  182.           <strong class="txt-ot-green">{{a.title}}</strong><br>
  183.           <small class="text-muted">{{a.description}}</small>
  184.         </div>
  185.       </div>
  186.       {% endfor %}
  187.     </div>
  188.     <div class="section-divider mx-auto my-5"></div>
  189.   </div>
  190. </section>
  191. <section>
  192. <h2 class="h3 fw-bold txt-ot-green text-center"> Accréditations & partenaires de confiance</h2>
  193.   <div class="partner-slider">
  194.   <div class="track">
  195.     <img src="/img/logos/apst.png" alt="APST">
  196.     <img src="/img/logos/assurever.png" alt="Assurever">
  197.     <img src="/img/logos/hiscox.png" alt="Hiscox">
  198.     <img src="/img/logos/iata.png" alt="IATA">
  199.     <img src="/img/logos/atout-france.png" alt="Atout France">
  200.     <img src="/img/logos/tourcom.png" alt="TourCom">
  201.   </div>
  202. </div>
  203. </section>
  204. {# -----------------------------
  205.    Call to action (bandeau photo)
  206. ------------------------------ 
  207. <section class="position-relative overflow-hidden">
  208.   <div class="ratio ratio-21x9">
  209.     <img src="{{ asset('img/cta-tourist.jpg') }}" alt="Famille en voyage" class="object-fit-cover w-100 h-100">
  210.   </div>
  211.   <div class="position-absolute top-0 start-0 w-100 h-100 d-flex align-items-center">
  212.     <div class="container">
  213.       <div class="row">
  214.         <div class="col-12 col-lg-6 text-white">
  215.           <h2 class="h4 mb-1">Call to action</h2>
  216.           <p class="mb-0 opacity-90">Accroche…</p>
  217.         </div>
  218.       </div>
  219.     </div>
  220.   </div>
  221. </section>. #}
  222. {# -----------------------------
  223.    Infos contact (3 colonnes)
  224. ------------------------------ #}
  225. <section class="py-5 bg-white">
  226.   <div class="container">
  227.     <div class="row text-center g-4">
  228.       <div class="col-12 col-md-4">
  229.         <div class="contact-ico mb-2" style="font-size: 2em;color: #1a8754;"><i class="bi bi-clock"></i></div>
  230.         <h3 class="text-success h6 fw-bold">Horaire Agence</h3>
  231.         <p class="small text-muted mb-0">Du lundi au Vendredi de 09h à 12h et de 13H à 17h00 <br>Un samedi sur deux</p>
  232.       </div>
  233.       <div class="col-12 col-md-4">
  234.         <div class="contact-ico mb-2" style="font-size: 2em;color: #1a8754;"><i class="bi bi-telephone"></i></div>
  235.         <h3 class="text-success h6 fw-bold">Téléphone</h3>
  236.        
  237.         <p class="small text-muted mb-0">
  238.         {% if infos.phone %} 
  239.         Bureau : <a class="link-info" href="tel:+590590505134">{{infos.phone}}</a><br> {% endif %}
  240.         {% if infos.mobile %} 
  241.         Mobile : <a class="link-info" href="tel:+590690357030">{{infos.mobile}}</a><br> {% endif %}
  242.         {% if infos.mobileTwo %} 
  243.         Mobile : <a class="link-info" href="tel:+590690762562">{{infos.mobileTwo}}</a> {% endif %}
  244.         </p>
  245.       </div>
  246.       <div class="col-12 col-md-4">
  247.         <div class="contact-ico mb-2" style="font-size: 2em;color: #1a8754;"><i class="bi bi-geo-alt"></i></div>
  248.         <h3 class="text-success h6 fw-bold">Localisation</h3>
  249.         <p class="small text-muted mb-0">{{infos.adress}} <br> {{infos.zip}} {{infos.city}} </p>
  250.       </div>
  251.     </div>
  252.   </div>
  253. </section>
  254. <script>
  255. document.addEventListener("DOMContentLoaded", function () {
  256.   const slider = document.querySelector('.partner-slider');
  257.   const track = slider.querySelector('.track');
  258.   const logos = [...track.children];
  259.   const dotsContainer = slider.querySelector('.dots');
  260.   // clone images to simulate infinite scroll visually
  261.   logos.forEach(logo => {
  262.     const clone = logo.cloneNode(true);
  263.     track.appendChild(clone);
  264.   });
  265.   // create dots
  266.   logos.forEach((_, i) => {
  267.     const dot = document.createElement('span');
  268.     if (i === 0) dot.classList.add('active');
  269.     dotsContainer.appendChild(dot);
  270.   });
  271.   let index = 0;
  272.   const dots = [...dotsContainer.children];
  273.   setInterval(() => {
  274.     index = (index + 1) % logos.length;
  275.     dots.forEach(d => d.classList.remove('active'));
  276.     dots[index].classList.add('active');
  277.   }, 3000);
  278. });
  279. </script>
  280. {% endblock %}