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