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>