#

Construction

<!-- Construction Services (Maamtinga) -->

<section id="construction-services" class="cs">

 <style>

  :root{--red:#E53935;--yellow:#FDD835;--green:#43A047;--ink:#1f2937;--muted:#6b7280;--bg:#f8fafc;--card:#fff;--ring:#e5e7eb;--radius:16px}

  .cs{font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;background:var(--bg);color:var(--ink);padding:48px 16px}

  .cs .container{max-width:1100px;margin:0 auto}

  .cs .header{display:flex;flex-wrap:wrap;align-items:center;gap:12px;justify-content:space-between;margin-bottom:24px}

  .cs h2{font-size:28px;margin:0}

  .tagline{color:var(--muted);margin-top:4px}

  .lang-toggle{display:flex;gap:8px}

  .lang-toggle button{border:1px solid var(--ring);background:#fff;border-radius:999px;padding:6px 12px;cursor:pointer}

  .lang-toggle button.active{border-color:var(--green);box-shadow:0 0 0 3px rgba(67,160,71,.15)}

  /* Cards */

  .services{display:grid;grid-template-columns:repeat(12,1fr);gap:16px;margin-top:16px}

  .service-card{grid-column:span 12;background:var(--card);border:1px solid var(--ring);border-radius:var(--radius);padding:18px;display:flex;gap:14px;align-items:flex-start}

  @media(min-width:720px){.service-card{grid-column:span 6}}

  @media(min-width:980px){.service-card{grid-column:span 4}}

  .icon{width:42px;height:42px;border-radius:12px;display:grid;place-items:center;color:#fff;font-weight:700}

  .icon.red{background:var(--red)} .icon.yellow{background:var(--yellow);color:#222} .icon.green{background:var(--green)}

  .service-title{font-weight:700;margin:0 0 6px}

  .service-feats{margin:0 0 10px;padding-left:18px;color:#374151}

  .service-card .cta{border:0;background:var(--green);color:#fff;border-radius:10px;padding:8px 12px;cursor:pointer}

  .service-card .cta:hover{filter:brightness(0.95)}

  /* Form */

  .quote{margin-top:28px;background:var(--card);border:1px solid var(--ring);border-radius:var(--radius);padding:18px}

  .quote h3{margin:0 0 14px}

  .stepper{display:flex;gap:8px;margin:0 0 14px;flex-wrap:wrap}

  .chip{border:1px dashed var(--ring);border-radius:999px;padding:4px 10px;font-size:12px}

  .chip.active{border-style:solid;border-color:var(--green);background:rgba(67,160,71,.06)}

  .grid{display:grid;grid-template-columns:1fr;gap:12px}

  @media(min-width:740px){.grid.two{grid-template-columns:1fr 1fr}}

  @media(min-width:980px){.grid.three{grid-template-columns:1fr 1fr 1fr}}

  label{font-size:13px;color:#374151;display:block;margin-bottom:4px}

  input,select,textarea{width:100%;padding:10px;border:1px solid var(--ring);border-radius:10px;background:#fff}

  textarea{min-height:96px;resize:vertical}

  .help{font-size:12px;color:var(--muted);margin-top:4px}

  .actions{display:flex;gap:10px;justify-content:space-between;margin-top:14px;flex-wrap:wrap}

  .btn{border:0;border-radius:10px;padding:10px 14px;cursor:pointer}

  .btn.ghost{background:#fff;border:1px solid var(--ring)}

  .btn.primary{background:var(--red);color:#fff}

  .btn.success{background:var(--green);color:#fff}

  .divider{height:1px;background:var(--ring);margin:14px 0}

  .notice{background:rgba(253,216,53,.18);border:1px solid var(--yellow);padding:8px 12px;border-radius:10px;font-size:13px}

  /* Languages */

  .lang-fr .en{display:none}

  .lang-en .fr{display:none}

 </style>


 <div class="container">

  <div class="header">

   <div>

    <h2>

     <span class="fr">Services de construction & rénovation</span>

     <span class="en">Construction & Renovation Services</span>

    </h2>

    <div class="tagline">

     <span class="fr">Conception, permis, gros œuvre, second œuvre, finitions — Burkina Faso.</span>

     <span class="en">Design, permits, structural, finishing — Burkina Faso.</span>

    </div>

   </div>

   <div class="lang-toggle" aria-label="Language">

    <button type="button" data-lang="fr" class="active">FR</button>

    <button type="button" data-lang="en">EN</button>

   </div>

  </div>


  <!-- Services cards (exemples) -->

  <div class="services">

   <article class="service-card">

    <div class="icon red">A</div>

    <div>

     <h3 class="service-title"><span class="fr">Conception & Plans</span><span class="en">Design & Blueprints</span></h3>

     <ul class="service-feats">

      <li class="fr">Plans architecturaux, BPE, DCE</li>

      <li class="en">Architectural drawings, BoQ, specs</li>

     </ul>

     <button class="cta" data-service="Conception & Plans">+ Devis</button>

    </div>

   </article>

   <article class="service-card">

    <div class="icon yellow">B</div>

    <div>

     <h3 class="service-title"><span class="fr">Gros œuvre</span><span class="en">Structural Works</span></h3>

     <ul class="service-feats">

      <li class="fr">Fondations, dalles, élévations</li>

      <li class="en">Foundations, slabs, walls</li>

     </ul>

     <button class="cta" data-service="Gros œuvre">+ Devis</button>

    </div>

   </article>

   <article class="service-card">

    <div class="icon green">C</div>

    <div>

     <h3 class="service-title"><span class="fr">Finitions & Rénovation</span><span class="en">Finishing & Renovation</span></h3>

     <ul class="service-feats">

      <li class="fr">Peinture, carrelage, façades</li>

      <li class="en">Painting, tiling, facades</li>

     </ul>

     <button class="cta" data-service="Finitions & Rénovation">+ Devis</button>

    </div>

   </article>

  </div>


  <!-- Quote Form -->

  <div class="quote lang-fr">

   <h3><span class="fr">Demande de devis</span><span class="en">Request a Quote</span></h3>

   <div class="stepper">

    <span class="chip step-chip" data-step="1">1. <span class="fr">Projet</span><span class="en">Project</span></span>

    <span class="chip step-chip" data-step="2">2. <span class="fr">Localisation</span><span class="en">Location</span></span>

    <span class="chip step-chip" data-step="3">3. <span class="fr">Budget & Délai</span><span class="en">Budget & Timeline</span></span>

    <span class="chip step-chip" data-step="4">4. <span class="fr">Contact</span><span class="en">Contact</span></span>

   </div>


   <!-- IMPORTANT: configurez le endpoint WP + emails en backend -->

   <form id="quoteForm"

      action="/wp-admin/admin-ajax.php?action=maamtinga_construction_quote"

      method="post" novalidate>

    <!-- Emails souhaités -->

    <input type="hidden" name="mail_from" value="info@maamtinga.com">

    <input type="hidden" name="mail_to" value="construction@maamtinga.com">

    <input type="hidden" name="mail_subject" value="Nouvelle demande de devis (Construction)">


    <!-- STEP 1 -->

    <div class="step" data-step="1">

     <div class="grid two">

      <div>

       <label for="serviceType"><span class="fr">Type de service</span><span class="en">Service type</span></label>

       <select id="serviceType" name="service_type" required>

        <option value="">—</option>

        <option>Conception & Plans</option>

        <option>Permis & Démarches</option>

        <option>Gros œuvre</option>

        <option>Second œuvre</option>

        <option>Électricité & Plomberie</option>

        <option>Finitions & Rénovation</option>

       </select>

      </div>

      <div>

       <label for="propertyType"><span class="fr">Type de bien</span><span class="en">Property type</span></label>

       <select id="propertyType" name="property_type" required>

        <option value="">—</option>

        <option class="fr">Villa</option><option class="en">Villa</option>

        <option class="fr">Immeuble</option><option class="en">Building</option>

        <option class="fr">Duplex</option><option class="en">Duplex</option>

        <option class="fr">Centre commercial</option><option class="en">Shopping center</option>

        <option class="fr">Bureau</option><option class="en">Office</option>

        <option class="fr">Boutique</option><option class="en">Shop</option>

        <option class="fr">Autre</option><option class="en">Other</option>

       </select>

      </div>

     </div>


     <div class="grid two">

      <div>

       <label for="area"><span class="fr">Surface (m²)</span><span class="en">Area (m²)</span></label>

       <input type="number" id="area" name="area_m2" inputmode="numeric" min="1" placeholder="120" required>

      </div>

      <div>

       <label for="furnished"><span class="fr">Meublé</span><span class="en">Furnished</span></label>

       <select id="furnished" name="furnished">

        <option value="">—</option>

        <option value="yes"><span class="fr">Oui</span><span class="en">Yes</span></option>

        <option value="no"><span class="fr">Non</span><span class="en">No</span></option>

       </select>

       <div class="help"><span class="fr">Utile pour rénovation/second œuvre.</span><span class="en">Useful for renovation/second fix.</span></div>

      </div>

     </div>

    </div>


    <!-- STEP 2 -->

    <div class="step" data-step="2" hidden>

     <div class="grid three">

      <div>

       <label for="region"><span class="fr">Région</span><span class="en">Region</span></label>

       <select id="region" name="region" required>

        <option value="">—</option>

        <option value="Centre">Centre</option>

        <option value="Hauts-Bassins">Hauts-Bassins</option>

        <option value="Boucle du Mouhoun">Boucle du Mouhoun</option>

        <option value="Cascades">Cascades</option>

       </select>

      </div>

      <div>

       <label for="city"><span class="fr">Ville</span><span class="en">City</span></label>

       <select id="city" name="city" required>

        <option value="">—</option>

        <option data-region="Centre" value="Ouagadougou">Ouagadougou</option>

        <option data-region="Hauts-Bassins" value="Bobo-Dioulasso">Bobo-Dioulasso</option>

        <option data-region="Boucle du Mouhoun" value="Dédougou">Dédougou</option>

       </select>

      </div>

      <div>

       <label for="district"><span class="fr">Quartier</span><span class="en">District</span></label>

       <select id="district" name="district" required>

        <option value="">—</option>

        <option data-city="Ouagadougou" value="Ouaga 2000">Ouaga 2000</option>

        <option data-city="Ouagadougou" value="Patte d’Oie">Patte d’Oie</option>

        <option data-city="Bobo-Dioulasso" value="Accart-Ville">Accart-Ville</option>

       </select>

      </div>

     </div>

    </div>


    <!-- STEP 3 -->

    <div class="step" data-step="3" hidden>

     <div class="grid two">

      <div>

       <label for="budget"><span class="fr">Budget estimatif</span><span class="en">Estimated budget</span></label>

       <input type="number" id="budget" name="budget_amount" inputmode="numeric" placeholder="15000000" required>

      </div>

      <div>

       <label for="currency"><span class="fr">Devise</span><span class="en">Currency</span></label>

       <select id="currency" name="budget_currency" required>

        <option value="XOF">XOF (CFA)</option>

        <option value="USD">USD</option>

        <option value="EUR">EUR</option>

       </select>

      </div>

     </div>


     <div class="grid two">

      <div>

       <label for="timeline"><span class="fr">Délai souhaité</span><span class="en">Desired timeline</span></label>

       <select id="timeline" name="timeline" required>

        <option value="">—</option>

        <option class="fr">1–3 mois</option><option class="en">1–3 months</option>

        <option class="fr">3–6 mois</option><option class="en">3–6 months</option>

        <option class="fr">6–12 mois</option><option class="en">6–12 months</option>

       </select>

      </div>

      <div>

       <label for="notes"><span class="fr">Détails / Notes</span><span class="en">Details / Notes</span></label>

       <textarea id="notes" name="notes" placeholder="BOQ, matériaux, contraintes…"></textarea>

      </div>

     </div>

    </div>


    <!-- STEP 4 -->

    <div class="step" data-step="4" hidden>

     <div class="grid two">

      <div>

       <label for="name"><span class="fr">Nom complet</span><span class="en">Full name</span></label>

       <input id="name" name="contact_name" required placeholder="Votre nom">

      </div>

      <div>

       <label for="phone"><span class="fr">Téléphone (WhatsApp)</span><span class="en">Phone (WhatsApp)</span></label>

       <input id="phone" name="contact_phone" required placeholder="+226 …">

      </div>

     </div>

     <div class="grid two">

      <div>

       <label for="email"><span class="fr">Email</span><span class="en">Email</span></label>

       <input type="email" id="email" name="contact_email" placeholder="you@example.com">

      </div>

      <div>

       <label for="contactPref"><span class="fr">Mode de contact</span><span class="en">Contact method</span></label>

       <select id="contactPref" name="contact_pref" required>

        <option value="">—</option>

        <option>WhatsApp</option>

        <option>Call</option>

        <option>Email</option>

       </select>

      </div>

     </div>

     <div class="notice">

      <span class="fr">En soumettant, vous acceptez d’être recontacté.</span>

      <span class="en">By submitting, you agree to be contacted.</span>

     </div>

    </div>


    <div class="divider"></div>

    <div class="actions">

     <button type="button" class="btn ghost prev"><span class="fr">Précédent</span><span class="en">Back</span></button>

     <div style="display:flex;gap:8px;">

      <button type="button" class="btn ghost next"><span class="fr">Suivant</span><span class="en">Next</span></button>

      <button type="submit" class="btn success submit" hidden><span class="fr">Envoyer la demande</span><span class="en">Submit request</span></button>

     </div>

    </div>

    <div class="help"><span class="fr">Étape <b class="curStep">1</b>/4</span><span class="en">Step <b class="curStep">1</b>/4</span></div>

   </form>

  </div>

 </div>


 <script>

  (function(){

   const section = document.getElementById('construction-services');

   // Langue

   const langBtns = section.querySelectorAll('.lang-toggle button');

   const setLang = (lng)=>{ section.classList.toggle('lang-fr', lng==='fr'); section.classList.toggle('lang-en', lng==='en'); langBtns.forEach(b=>b.classList.toggle('active', b.dataset.lang===lng)); };

   setLang('fr'); langBtns.forEach(btn=>btn.addEventListener('click', ()=>setLang(btn.dataset.lang)));


   // Pré-remplir service depuis les cartes

   section.querySelectorAll('.service-card .cta').forEach(btn=>{

    btn.addEventListener('click', ()=>{

     const v = btn.getAttribute('data-service');

     const sel = section.querySelector('#serviceType');

     [...sel.options].forEach(o=>{ if(o.textContent.trim()===v) sel.value=o.textContent.trim(); });

     window.scrollTo({top:section.querySelector('.quote').offsetTop-20,behavior:'smooth'});

    });

   });


   // Stepper

   const form = section.querySelector('#quoteForm');

   const steps = [...form.querySelectorAll('.step')];

   const chips = [...section.querySelectorAll('.step-chip')];

   const prevBtn = form.querySelector('.prev');

   const nextBtn = form.querySelector('.next');

   const submitBtn = form.querySelector('.submit');

   const curStepEls = form.querySelectorAll('.curStep');

   let step = 1, max = steps.length;


   function showStep(n){ step = Math.min(Math.max(1,n), max);

    steps.forEach(s => s.hidden = (parseInt(s.dataset.step)!==step));

    chips.forEach(c => c.classList.toggle('active', parseInt(c.dataset.step)===step));

    prevBtn.disabled = (step===1); nextBtn.hidden = (step===max); submitBtn.hidden = (step!==max);

    curStepEls.forEach(el => el.textContent = step);

   }

   function validateStep(n){

    const current = steps.find(s=>parseInt(s.dataset.step)===n);

    const req = [...current.querySelectorAll('[required]')];

    for(const el of req){ if(!el.value){ el.focus(); el.reportValidity?.(); return false; } }

    return true;

   }

   showStep(1);

   prevBtn.addEventListener('click', ()=> showStep(step-1));

   nextBtn.addEventListener('click', ()=> { if(validateStep(step)) showStep(step+1); });

   chips.forEach(c=>c.addEventListener('click', ()=>{ const t = parseInt(c.dataset.step); if(t<=step || validateStep(step)) showStep(t); }));


   // Région -> Ville -> Quartier

   const regionSel = form.querySelector('#region'), citySel = form.querySelector('#city'), districtSel = form.querySelector('#district');

   function filterCities(){ const r = regionSel.value;

    [...citySel.options].forEach(opt=>{ if(!opt.dataset.region){ opt.hidden=false; return; } opt.hidden = (opt.dataset.region!==r); });

    if(citySel.selectedOptions[0]?.hidden) citySel.value=''; filterDistricts();

   }

   function filterDistricts(){ const c = citySel.value;

    [...districtSel.options].forEach(opt=>{ if(!opt.dataset.city){ opt.hidden=false; return; } opt.hidden = (opt.dataset.city!==c); });

    if(districtSel.selectedOptions[0]?.hidden) districtSel.value='';

   }

   regionSel.addEventListener('change', filterCities);

   citySel.addEventListener('change', filterDistricts);


   // Soumission (exemple) -> backend WP

   form.addEventListener('submit', async (e)=>{

    e.preventDefault();

    if(!validateStep(step)) return;

    try{

     const fd = new FormData(form);

     // CONSEIL: côté serveur, ignorez ces champs du client et fixez les emails dans le handler.

     fd.set('mail_from','info@maamtinga.com');

     fd.set('mail_to','construction@maamtinga.com');


     const res = await fetch(form.action, { method:'POST', body: fd, credentials:'same-origin' });

     if(!res.ok) throw new Error('Network');

     alert('✅ Demande envoyée. Nous vous contacterons bientôt.');

     form.reset(); showStep(1);

    }catch(err){

     alert('❌ Envoi impossible. Merci de réessayer plus tard.');

    }

   });

  })();

 </script>

</section>