templates/frontView/contact.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %}Demander un devis{% endblock %}
  3. {% block body %}
  4. <header>
  5.     {{ include('@FrontView/menus.html.twig') }}
  6. </header>
  7. <main class="front-office-page front-office-generic-page demo-page py-4">
  8.     <div class="container">
  9.         <div class="row py-1 g-4">
  10.             <aside class="col-md-2">
  11.                 {{ include('@FrontView/menusgeneral.html.twig', { hidePartners: true }) }}
  12.             </aside>
  13.             <div class="col-md-10">
  14.                 {% for message in app.flashes('success') %}
  15.                     <div class="alert alert-success alert-dismissible fade show rounded-3" role="alert">
  16.                         <i class="fas fa-check-circle me-2"></i>{{ message }}
  17.                         <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
  18.                     </div>
  19.                 {% endfor %}
  20.                 {% for message in app.flashes('error') %}
  21.                     <div class="alert alert-danger alert-dismissible fade show rounded-3" role="alert">
  22.                         <i class="fas fa-exclamation-circle me-2"></i>{{ message }}
  23.                         <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
  24.                     </div>
  25.                 {% endfor %}
  26.                 <section class="demo-hero rounded-4 p-4 p-md-5 mb-4">
  27.                     <div class="row align-items-center g-4">
  28.                         <div class="col-lg-8">
  29.                             <span class="demo-eyebrow">RAPETO DIGITAL</span>
  30.                             <h1 class="fw-bold text-white mt-2 mb-3">Demander un devis</h1>
  31.                             <p class="text-white-50 mb-0">Décrivez votre projet et recevez une proposition adaptée à vos besoins.</p>
  32.                         </div>
  33.                         <div class="col-lg-4 text-center">
  34.                             <div class="contact-icon-wrap"><i class="fas fa-comments"></i></div>
  35.                         </div>
  36.                     </div>
  37.                 </section>
  38.                 <div class="row g-4">
  39.                     <div class="col-lg-7">
  40.                         <div class="demo-card h-100">
  41.                             <div class="mb-4">
  42.                                 <p class="text-muted mb-0">Les champs marqués d’un astérisque sont obligatoires.</p>
  43.                             </div>
  44.                             <form method="post" action="{{ path('app_contact') }}">
  45.                                 <input type="hidden" name="_token" value="{{ csrf_token('contact_form') }}">
  46.                                 {% if quote_product %}<input type="hidden" name="product_id" value="{{ quote_product.id }}">{% endif %}
  47.                                 <div class="row g-3">
  48.                                     <div class="col-md-6">
  49.                                         <label for="contact_name" class="form-label">Nom complet *</label>
  50.                                         <input type="text" id="contact_name" name="name" class="form-control" placeholder="Votre nom" required>
  51.                                     </div>
  52.                                     <div class="col-md-6">
  53.                                         <label for="contact_email" class="form-label">Adresse e-mail *</label>
  54.                                         <input type="email" id="contact_email" name="email" class="form-control" placeholder="vous@exemple.com" required>
  55.                                     </div>
  56.                                     <div class="col-md-6">
  57.                                         <label for="contact_phone" class="form-label">Téléphone</label>
  58.                                         <input type="tel" id="contact_phone" name="phone" class="form-control" placeholder="Votre numéro">
  59.                                     </div>
  60.                                     <div class="col-md-6">
  61.                                         <label for="requester_type" class="form-label">Type de demandeur *</label>
  62.                                         <select id="requester_type" name="requester_type" class="form-select" required>
  63.                                             <option value="">Choisir un type</option>
  64.                                             <option>Particulier</option>
  65.                                             <option>Entreprise</option>
  66.                                         </select>
  67.                                     </div>
  68.                                     <div class="col-md-6">
  69.                                         <label for="location" class="form-label">Lieu *</label>
  70.                                         <input type="text" id="location" name="location" class="form-control" placeholder="Votre ville ou région" required>
  71.                                     </div>
  72.                                     <div class="col-md-6">
  73.                                         <label for="role" class="form-label">Rôle / Fonction *</label>
  74.                                         <select id="role" name="role" class="form-select" required>
  75.                                             <option value="">Choisir une fonction</option>
  76.                                             <option>Gérant</option>
  77.                                             <option>Caissier / Caissière</option>
  78.                                             <option>Comptable</option>
  79.                                             <option>Autre</option>
  80.                                         </select>
  81.                                     </div>
  82.                                     <div class="col-md-6">
  83.                                         <label for="product_name" class="form-label">Nom du produit *</label>
  84.                                         <input type="text" id="product_name" name="product_name" class="form-control" value="{{ quote_product ? quote_product.title : '' }}" placeholder="Produit demandé" readonly required>
  85.                                     </div>
  86.                                     <div class="col-md-6">
  87.                                         <label for="product_type" class="form-label">Type du produit *</label>
  88.                                         <input type="text" id="product_type" name="product_type" class="form-control" value="{{ quote_product ? quote_product.statetypeLabels|join(' / ') : '' }}" placeholder="Type de produit" readonly required>
  89.                                     </div>
  90.                                     <div class="col-12 pt-2">
  91.                                         <button type="submit" class="btn btn-primary px-4 contact-submit-btn">
  92.                                             <span class="contact-submit-label">Envoyer ma demande <i class="fas fa-arrow-right ms-2"></i></span>
  93.                                             <span class="contact-submit-loading" aria-hidden="true">
  94.                                                 <span class="contact-spinner"></span> Envoi en cours…
  95.                                             </span>
  96.                                         </button>
  97.                                     </div>
  98.                                 </div>
  99.                             </form>
  100.                         </div>
  101.                     </div>
  102.                     <div class="col-lg-5">
  103.                         <div class="demo-card h-100">
  104.                             <h2 class="h4 fw-bold text-primary mb-4">Pourquoi nous contacter ?</h2>
  105.                             <div class="contact-benefit">
  106.                                 <span><i class="fas fa-lightbulb"></i></span>
  107.                                 <div><strong>Un conseil adapté</strong><p>Nous vous orientons vers la solution correspondant à votre activité.</p></div>
  108.                             </div>
  109.                             <div class="contact-benefit">
  110.                                 <span><i class="fas fa-laptop-code"></i></span>
  111.                                 <div><strong>Une solution sur mesure</strong><p>Site vitrine, plateforme dynamique ou logiciel métier.</p></div>
  112.                             </div>
  113.                             <div class="contact-benefit">
  114.                                 <span><i class="fas fa-file-invoice-dollar"></i></span>
  115.                                 <div><strong>Un devis clair</strong><p>Votre besoin est étudié avant toute proposition.</p></div>
  116.                             </div>
  117.                             <hr class="my-4">
  118.                             <p class="text-muted mb-0"><i class="fas fa-clock text-primary me-2"></i>Nous revenons vers vous après réception de votre demande.</p>
  119.                         </div>
  120.                     </div>
  121.                 </div>
  122.             </div>
  123.         </div>
  124.     </div>
  125. </main>
  126. {{ include('@FrontView/footer.html.twig') }}
  127. <style>
  128.     .demo-page { background: #f7f9fc; }
  129.     .demo-hero { background: linear-gradient(135deg, #003b7e 0%, #1769aa 100%); overflow: hidden; padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; }
  130.     .demo-hero h1 { font-size: 2rem; }
  131.     .demo-hero p { font-size: 1rem; }
  132.     .demo-eyebrow { color: #ffd34e; font-size: .7rem; font-weight: 700; letter-spacing: .14rem; }
  133.     .contact-icon-wrap { display: inline-flex; align-items: center; justify-content: center; width: 90px; height: 90px; border: 1px solid rgba(255,255,255,.25); border-radius: 50%; color: #ffd34e; font-size: 2.4rem; }
  134.     .demo-card { background: #fff; border-radius: 1rem; padding: 1.5rem; box-shadow: 0 12px 35px rgba(0, 59, 126, .08); }
  135.     .demo-card h2 { font-size: 1.35rem; }
  136.     .demo-card .form-label { color: #16324f; font-weight: 600; }
  137.     .demo-card .form-control, .demo-card .form-select { border: 1px solid #dbe3ee; border-radius: .7rem; }
  138.     .demo-card .form-control:focus, .demo-card .form-select:focus { border-color: #1769aa; box-shadow: 0 0 0 .2rem rgba(23, 105, 170, .12); }
  139.     .contact-benefit { display: flex; gap: 1rem; margin-bottom: 1.5rem; }
  140.     .contact-benefit > span { flex: 0 0 42px; height: 42px; display: flex; align-items: center; justify-content: center; background: #eaf3fb; border-radius: .7rem; color: #1769aa; }
  141.     .contact-benefit strong { color: #16324f; }
  142.     .contact-benefit p { color: #718096; margin: .25rem 0 0; font-size: .85rem; }
  143.     .contact-submit-loading { display: none; }
  144.     .contact-submit-btn.is-loading { cursor: wait; opacity: .85; }
  145.     .contact-submit-btn.is-loading .contact-submit-label { display: none; }
  146.     .contact-submit-btn.is-loading .contact-submit-loading { display: inline-flex; align-items: center; gap: .5rem; }
  147.     .contact-spinner { width: 1rem; height: 1rem; border: 2px solid rgba(255,255,255,.45); border-top-color: #fff; border-radius: 50%; animation: contact-spin .7s linear infinite; }
  148.     @keyframes contact-spin { to { transform: rotate(360deg); } }
  149. </style>
  150. <script>
  151.     document.addEventListener('DOMContentLoaded', function () {
  152.         const form = document.querySelector('.demo-page form');
  153.         const button = document.querySelector('.contact-submit-btn');
  154.         if (!form || !button) {
  155.             return;
  156.         }
  157.         form.addEventListener('submit', function () {
  158.             if (!form.checkValidity()) {
  159.                 return;
  160.             }
  161.             button.disabled = true;
  162.             button.classList.add('is-loading');
  163.             button.setAttribute('aria-busy', 'true');
  164.         });
  165.     });
  166. </script>
  167. {% endblock %}