<!DOCTYPE html><html lang="fr" dir="ltr"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"><!-- Favicons & Icons --><link rel="icon" type="image/webp" href="/uploads/icons/logo.webp"><link rel="apple-touch-icon" sizes="180x180" href="/uploads/icons/logo.webp"><link rel="manifest" href="/site.webmanifest"><meta name="theme-color" content="#048B9A"><meta name="mobile-web-app-capable" content="yes"><!-- DNS Prefetch & Preconnect --><link rel="dns-prefetch" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.googleapis.com" crossorigin><link rel="dns-prefetch" href="https://fonts.gstatic.com"><!-- Preload Images Critiques (Above the Fold) --><link rel="preload" as="image" href="/uploads/hero/maison-build.webp" type="image/webp" fetchpriority="high"><link rel="preload" as="image" href="/uploads/icons/logo.webp" type="image/webp"><!-- Generator --><meta name="generator" content="Astro v5.16.9"><!-- SEO Principal --><title>Oveco - Auto-construction et Rénovation Écologique | Maisons Passives</title><meta name="description" content="Oveco accompagne vos projets d'auto-construction et de rénovation écologique en Belgique. Expertise en maisons passives, énergies renouvelables et construction durable."><meta name="keywords" content="auto-construction, rénovation écologique, maison passive, énergies renouvelables, construction durable, isolation thermique, chauffage écologique, Belgique, ossature bois, panneaux solaires, pompe à chaleur, rénovation énergétique"><meta name="author" content="Oveco"><link rel="canonical" href="https://oveco.be/"><!-- Robots --><meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name="googlebot" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name="bingbot" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://oveco.be/"><meta property="og:title" content="Oveco - Auto-construction et Rénovation Écologique | Maisons Passives"><meta property="og:description" content="Oveco accompagne vos projets d'auto-construction et de rénovation écologique en Belgique. Expertise en maisons passives, énergies renouvelables et construction durable."><meta property="og:image" content="https://oveco.be/og-image.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta property="og:image:alt" content="Oveco - Auto-construction et Rénovation Écologique | Maisons Passives"><meta property="og:locale" content="fr_FR"><meta property="og:site_name" content="Oveco"><meta property="og:updated_time" content="2026-01-22T10:31:55.320Z"><!-- Twitter Card --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:site" content="@oveco_be"><meta name="twitter:creator" content="@oveco_be"><meta name="twitter:url" content="https://oveco.be/"><meta name="twitter:title" content="Oveco - Auto-construction et Rénovation Écologique | Maisons Passives"><meta name="twitter:description" content="Oveco accompagne vos projets d'auto-construction et de rénovation écologique en Belgique. Expertise en maisons passives, énergies renouvelables et construction durable."><meta name="twitter:image" content="https://oveco.be/og-image.png"><meta name="twitter:image:alt" content="Oveco - Auto-construction et Rénovation Écologique | Maisons Passives"><!-- Additional SEO --><meta name="format-detection" content="telephone=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><!-- Structured Data (JSON-LD) --><script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://oveco.be/#organization","name":"Oveco","alternateName":"Oveco Construction","url":"https://oveco.be","logo":{"@type":"ImageObject","url":"https://oveco.be/favicon.png","width":512,"height":512},"description":"Entreprise spécialisée dans l'auto-construction et la rénovation écologique. Expertise en maisons passives et énergies renouvelables.","foundingDate":"2010","address":{"@type":"PostalAddress","addressCountry":"BE","addressRegion":"Wallonie"},"contactPoint":{"@type":"ContactPoint","contactType":"Customer Service","email":"contact@oveco.be","availableLanguage":["fr","en"],"areaServed":"BE"},"sameAs":["https://www.linkedin.com/company/oveco","https://www.facebook.com/oveco"],"serviceArea":{"@type":"GeoCircle","geoMidpoint":{"@type":"GeoCoordinates","latitude":50.8503,"longitude":4.3517},"geoRadius":"100000"},"hasOfferCatalog":{"@type":"OfferCatalog","name":"Services de construction écologique","itemListElement":[{"@type":"Offer","itemOffered":{"@type":"Service","name":"Auto-construction","description":"Accompagnement dans vos projets d'auto-construction écologique"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Rénovation écologique","description":"Rénovation énergétique et écologique de votre habitat"}},{"@type":"Offer","itemOffered":{"@type":"Service","name":"Maisons passives","description":"Conception et construction de maisons passives"}}]}},{"@type":"WebSite","@id":"https://oveco.be/#website","url":"https://oveco.be","name":"Oveco - Auto-construction et Rénovation Écologique","description":"Site officiel d'Oveco, spécialiste de l'auto-construction et de la rénovation écologique en Belgique.","publisher":{"@id":"https://oveco.be/#organization"},"inLanguage":"fr-FR","potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://oveco.be/works?q={search_term_string}"},"query-input":"required name=search_term_string"}},{"@type":"WebPage","@id":"https://oveco.be/#webpage","url":"https://oveco.be/","name":"Oveco - Auto-construction et Rénovation Écologique | Maisons Passives","description":"Oveco accompagne vos projets d'auto-construction et de rénovation écologique en Belgique. Expertise en maisons passives, énergies renouvelables et construction durable.","isPartOf":{"@id":"https://oveco.be/#website"},"datePublished":"2025-01-01T00:00:00+00:00","dateModified":"2026-01-22T10:31:55.320Z","inLanguage":"fr-FR","breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https://oveco.be"}]}}]}</script><!-- Performance hints: preload CSS retiré pendant le dev pour éviter les warnings inutiles --><!-- View Transitions (Astro 2025) --><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/js/ClientRouter.astro_astro_type_script_index_0_lang-BiKrWNe3.js"></script><link rel="stylesheet" href="/css/_slug_-FybHTR1h.css">
<style>.astro-route-announcer{position:absolute;left:0;top:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;white-space:nowrap;width:1px;height:1px}
</style>
<link rel="stylesheet" href="/css/_slug_-CFJzXnLU.css">
<link rel="stylesheet" href="/css/_slug_-CcbeZeLH.css"><script type="module" src="/js/page-CJTYi9NF.js"></script></head> <body>  <div id="preview-loading-screen"> <div class="loading-content"> <div class="loading-spinner"></div> <p class="loading-text">Vérification du mode preview...</p> </div> </div>  <div id="preview-maintenance-overlay"> <div class="maintenance-page"> <header class="maintenance-header"> <div class="header-brand">vdb <em>création</em></div> </header> <main class="maintenance-main"> <div class="overline"> <span class="overline-label">Oveco</span> </div> <h1 class="title"> <span>Preview</span> <span>Désactivé</span> </h1> <div class="footer-section"> <p class="message">
Le mode preview est actuellement désactivé. 
          Le site principal est en ligne avec la dernière version publiée.
</p> <div class="actions"> <a href="/" class="btn btn-primary" id="main-site-btn">
Voir le site en ligne
<span class="btn-arrow">→</span> </a> <a href="https://vdbcreation.eu" target="_blank" rel="noopener" class="btn btn-secondary">
vdb création
<span class="btn-arrow">→</span> </a> </div> </div> </main> </div> </div>  <div id="preview-building-overlay"> <div class="maintenance-page building-page"> <header class="maintenance-header"> <div class="header-brand">vdb <em>création</em></div> </header> <main class="maintenance-main"> <div class="overline"> <span class="overline-label">Oveco</span> </div> <h1 class="title"> <span>Build en</span> <span>cours...</span> </h1> <div class="footer-section"> <div class="building-indicator"> <div class="building-spinner"></div> <span class="building-status">Déploiement en cours</span> </div> <p class="message">
Une nouvelle version du preview est en cours de construction. 
          Cette page se rechargera automatiquement une fois le build terminé.
</p> <div class="actions"> <a href="/" class="btn btn-secondary" id="main-site-btn-building">
Voir le site en ligne
<span class="btn-arrow">→</span> </a> </div> </div> </main> </div> </div> <!-- Charger les polices Instrument Serif et Instrument Sans --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Instrument+Sans:wght@400;500;600&family=Instrument+Serif:ital@0;1&display=swap" rel="stylesheet">  <script>(function(){const publishApiUrl = "https://api.vdbcreation.eu";
const projectSlug = "oveco";
const mainSiteUrl = "";

  // Exécuter immédiatement (pas de DOMContentLoaded pour éviter le flash)
  (function checkPreviewStatus() {
    const loadingScreen = document.getElementById('preview-loading-screen');
    const maintenanceOverlay = document.getElementById('preview-maintenance-overlay');
    const buildingOverlay = document.getElementById('preview-building-overlay');
    
    if (!loadingScreen || !maintenanceOverlay || !buildingOverlay) {
      console.log('[PreviewGuard] Elements not found');
      return;
    }

    // DÉTECTION PREVIEW 100% DYNAMIQUE - Aucune URL en dur
    const hostname = window.location.hostname.toLowerCase();
    let isPreviewDomain = false;
    
    // 1. Localhost = jamais preview
    if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('192.168.')) {
      isPreviewDomain = false;
    }
    // 2. Cloudflare Pages: xxx.project.pages.dev (4+ parties) = preview
    else if (hostname.endsWith('.pages.dev')) {
      const parts = hostname.split('.');
      isPreviewDomain = parts.length > 3;
    }
    // 3. Sous-domaine "preview" explicite
    else if (hostname.startsWith('preview.') || hostname.includes('.preview.') || hostname.includes('-preview')) {
      isPreviewDomain = true;
    }
    // 4. Vercel/Netlify preview URLs
    else if (hostname.match(/^[a-z0-9]+-[a-z0-9-]+\.(vercel\.app|netlify\.app)$/)) {
      isPreviewDomain = true;
    }
    // 5. Tout autre domaine = production
    else {
      isPreviewDomain = false;
    }
    
    if (!isPreviewDomain) {
      console.log('[PreviewGuard] Production domain (' + hostname + ')');
      return;
    }

    console.log('[PreviewGuard] Preview domain detected:', hostname);
    
    // Afficher l'écran de chargement IMMÉDIATEMENT
    loadingScreen.classList.add('active');

    // Variable globale pour stocker preview_custom_url depuis l'API
    let storedPreviewCustomUrl = null;
    
    // Calculer l'URL du site principal dynamiquement (100% dynamique)
    function getMainSiteUrl() {
      // Priorité 1: preview_custom_url depuis l'API (URL personnalisée stockée en DB)
      if (storedPreviewCustomUrl) {
        return storedPreviewCustomUrl;
      }
      
      // Priorité 2: URL configurée via .env
      if (mainSiteUrl) return mainSiteUrl;
      
      // Priorité 3: Calcul dynamique basé sur le hostname actuel
      const origin = window.location.origin;
      const hostname = window.location.hostname;
      
      // Cloudflare Pages: xxx.project.pages.dev -> project.pages.dev
      if (hostname.endsWith('.pages.dev')) {
        const parts = hostname.split('.');
        if (parts.length > 3) {
          const mainDomain = parts.slice(1).join('.');
          return 'https://' + mainDomain;
        }
      }
      
      // Pattern: preview.example.com -> example.com
      if (hostname.startsWith('preview.')) {
        return origin.replace('preview.', '');
      }
      
      // Pattern: example-preview.xxx -> example.xxx
      if (hostname.includes('-preview.')) {
        return origin.replace('-preview.', '.');
      }
      if (hostname.includes('-preview')) {
        return origin.replace('-preview', '');
      }
      
      // Fallback: même origine
      return origin;
    }

    // Fonction pour cacher le loading et révéler le site
    function showSite() {
      loadingScreen.classList.remove('active');
    }
    
    // Fonction pour afficher la maintenance (set_preview=false)
    function showMaintenance() {
      loadingScreen.classList.remove('active');
      maintenanceOverlay.classList.add('visible');
      document.body.style.overflow = 'hidden';
      
      const mainBtn = document.getElementById('main-site-btn');
      if (mainBtn) {
        mainBtn.href = getMainSiteUrl();
      }
    }
    
    // Fonction pour afficher "Build en cours" (set_preview=true mais is_build_preview=false)
    function showBuilding(apiUrl) {
      loadingScreen.classList.remove('active');
      buildingOverlay.classList.add('visible');
      document.body.style.overflow = 'hidden';
      
      const mainBtn = document.getElementById('main-site-btn-building');
      if (mainBtn) {
        mainBtn.href = getMainSiteUrl();
      }
      
      // Polling RAPIDE: vérifier toutes les 3 secondes si le build est terminé
      // Démarrage immédiat puis polling régulier
      let pollCount = 0;
      const maxPolls = 200; // ~10 minutes max (200 * 3s)
      
      async function pollOnce() {
        try {
          const checkUrl = apiUrl + '/check-preview?project=' + encodeURIComponent(projectSlug) + '&_t=' + Date.now();
          const response = await fetch(checkUrl, {
            method: 'GET',
            headers: { 'Content-Type': 'application/json' },
            cache: 'no-store'
          });
          
          if (response.ok) {
            const data = await response.json();
            console.log('[PreviewGuard] Poll #' + pollCount + ':', JSON.stringify(data));
            
            // Stocker preview_custom_url si disponible
            if (data.preview_custom_url) {
              storedPreviewCustomUrl = data.preview_custom_url;
            }
            
            // Si is_build_preview devient true, recharger la page
            if (data.is_build_preview === true) {
              console.log('[PreviewGuard] Build complete! Reloading...');
              clearInterval(pollInterval);
              window.location.reload();
              return;
            }
            
            // Si set_preview devient false, passer en maintenance
            if (data.set_preview === false) {
              console.log('[PreviewGuard] set_preview became false, switching to maintenance');
              clearInterval(pollInterval);
              buildingOverlay.classList.remove('visible');
              showMaintenance();
              return;
            }
          }
        } catch (e) {
          console.warn('[PreviewGuard] Poll error:', e.message);
        }
        
        pollCount++;
        if (pollCount >= maxPolls) {
          console.warn('[PreviewGuard] Max polls reached, stopping');
          clearInterval(pollInterval);
        }
      }
      
      // Premier check immédiat puis toutes les 3 secondes
      pollOnce();
      const pollInterval = setInterval(pollOnce, 3000);
    }

    // Timeout de sécurité: si l'API ne répond pas en 5s, afficher le site
    const safetyTimeout = setTimeout(function() {
      console.log('[PreviewGuard] Safety timeout - showing site');
      showSite();
    }, 5000);

    // Déterminer l'URL de l'API
    // CORRECTION: Détecter et remplacer l'ancienne URL même si hardcodée dans le HTML
    let apiUrl = publishApiUrl;
    if (apiUrl && apiUrl.includes('fg0g44os0scg4o0g8ckskggw.vdbcreation.eu')) {
      console.warn('[PreviewGuard] ⚠️ Ancienne URL détectée:', apiUrl);
      console.warn('[PreviewGuard] → Remplacement par: https://api.vdbcreation.eu');
      apiUrl = 'https://api.vdbcreation.eu';
    }
    
    console.log('[PreviewGuard] API URL utilisée:', apiUrl);
    
    async function checkApi() {
      // Si pas d'API configurée, on ne peut pas vérifier le preview
      if (!apiUrl) {
        console.log('[PreviewGuard] No API URL configured (PUBLISH_API_URL) - showing site');
        clearTimeout(safetyTimeout);
        showSite();
        return;
      }

      try {
        const checkUrl = apiUrl + '/check-preview?project=' + encodeURIComponent(projectSlug);
        console.log('[PreviewGuard] Checking:', checkUrl);
        
        const response = await fetch(checkUrl, {
          method: 'GET',
          headers: { 'Content-Type': 'application/json' }
        });

        clearTimeout(safetyTimeout);

        if (!response.ok) {
          console.warn('[PreviewGuard] API error:', response.status, '- showing site');
          showSite();
          return;
        }

        const data = await response.json();
        console.log('[PreviewGuard] API response:', JSON.stringify(data));

        // Stocker preview_custom_url pour les redirections
        if (data.preview_custom_url) {
          storedPreviewCustomUrl = data.preview_custom_url;
          console.log('[PreviewGuard] preview_custom_url stored:', storedPreviewCustomUrl);
        }

        // DÉCISION: afficher maintenance, build en cours, ou site
        if (data.set_preview === false) {
          // Cas 1: Preview désactivé -> page maintenance
          console.log('[PreviewGuard] set_preview=false -> MAINTENANCE');
          showMaintenance();
        } else if (data.is_build_preview === false) {
          // Cas 2: Preview activé mais build pas terminé -> page "build en cours"
          console.log('[PreviewGuard] set_preview=true, is_build_preview=false -> BUILDING');
          showBuilding(apiUrl);
        } else {
          // Cas 3: Preview activé et build terminé -> afficher le site
          console.log('[PreviewGuard] set_preview=true, is_build_preview=true -> SITE');
          showSite();
        }
      } catch (error) {
        clearTimeout(safetyTimeout);
        console.warn('[PreviewGuard] Fetch error:', error.message, '- showing site');
        showSite();
      }
    }

    // Lancer la vérification
    checkApi();
  })();
})();</script>  <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script><script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><astro-island uid="ZLX1xj" prefix="r1" component-url="/js/LiveBridge-D9JdhVVV.js" component-export="default" renderer-url="/js/client-BlHPgOCb.js" props="{&quot;home&quot;:[0,{&quot;query&quot;:[0,&quot;\n    query pages($relativePath: String!) {\n  pages(relativePath: $relativePath) {\n    ... on Document {\n      _sys {\n        filename\n        basename\n        hasReferences\n        breadcrumbs\n        path\n        relativePath\n        extension\n      }\n      id\n    }\n    ...PagesParts\n  }\n}\n    \n    fragment PagesParts on Pages {\n  __typename\n  slug\n  title {\n    __typename\n    fr\n    en\n  }\n  description {\n    __typename\n    fr\n    en\n  }\n  sections {\n    __typename\n    ... on PagesSectionsHero {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      ctaText {\n        __typename\n        fr\n        en\n      }\n      ctaUrl\n      images {\n        __typename\n        src\n        alt\n        class\n      }\n    }\n    ... on PagesSectionsWorksHero {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      ctaLabel {\n        __typename\n        fr\n        en\n      }\n      ctaHref\n      mediaLeft {\n        __typename\n        src\n        alt\n      }\n      mediaRight {\n        __typename\n        src\n        alt\n        overlay\n      }\n    }\n    ... on PagesSectionsAutoconstruction {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      services {\n        __typename\n        image\n        alt\n        title {\n          __typename\n          fr\n          en\n        }\n        description {\n          __typename\n          fr\n          en\n        }\n      }\n      ctaLabel {\n        __typename\n        fr\n        en\n      }\n      ctaHref\n    }\n    ... on PagesSectionsExpertise {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      cards {\n        __typename\n        icon\n        alt\n        title {\n          __typename\n          fr\n          en\n        }\n        description {\n          __typename\n          fr\n          en\n        }\n      }\n      ctaLabel {\n        __typename\n        fr\n        en\n      }\n      ctaHref\n    }\n    ... on PagesSectionsStats {\n      title {\n        __typename\n        fr\n        en\n      }\n      stats {\n        __typename\n        value\n        label {\n          __typename\n          fr\n          en\n        }\n        description {\n          __typename\n          fr\n          en\n        }\n      }\n    }\n    ... on PagesSectionsCompetences {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      competences {\n        __typename\n        icon\n        alt\n        title {\n          __typename\n          fr\n          en\n        }\n        description {\n          __typename\n          fr\n          en\n        }\n      }\n    }\n    ... on PagesSectionsCertifications {\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      cards {\n        __typename\n        logo\n        title {\n          __typename\n          fr\n          en\n        }\n        text {\n          __typename\n          fr\n          en\n        }\n      }\n    }\n    ... on PagesSectionsGallerie {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      gallery {\n        __typename\n        src\n        alt\n      }\n    }\n    ... on PagesSectionsTextimage {\n      sectionSubtitle {\n        __typename\n        fr\n        en\n      }\n      sectionTitle {\n        __typename\n        fr\n        en\n      }\n      sectionDescription {\n        __typename\n        fr\n        en\n      }\n      showSectionHeader\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      image {\n        __typename\n        src\n        alt\n      }\n      icon1 {\n        __typename\n        src\n        alt\n      }\n      icon2 {\n        __typename\n        src\n        alt\n      }\n      reverse\n      subtitle2 {\n        __typename\n        fr\n        en\n      }\n      title2 {\n        __typename\n        fr\n        en\n      }\n      description2 {\n        __typename\n        fr\n        en\n      }\n      image2 {\n        __typename\n        src\n        alt\n      }\n    }\n    ... on PagesSectionsPartners {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      logos {\n        __typename\n        src\n        alt\n      }\n    }\n    ... on PagesSectionsProjects {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      linkText {\n        __typename\n        fr\n        en\n      }\n      linkUrl\n      cards {\n        __typename\n        image\n        type {\n          __typename\n          fr\n          en\n        }\n        client\n        title {\n          __typename\n          fr\n          en\n        }\n        url\n        description {\n          __typename\n          fr\n          en\n        }\n      }\n    }\n    ... on PagesSectionsTestimonials {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      linkText {\n        __typename\n        fr\n        en\n      }\n      linkUrl\n      testimonials {\n        __typename\n        thumbnail {\n          __typename\n          src\n          alt\n        }\n        client_name\n        client_position {\n          __typename\n          fr\n          en\n        }\n        client_company\n        content {\n          __typename\n          fr\n          en\n        }\n        card_content {\n          __typename\n          fr\n          en\n        }\n      }\n    }\n    ... on PagesSectionsSimplecompetence {\n      number\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      cta {\n        __typename\n        label {\n          __typename\n          fr\n          en\n        }\n        url\n      }\n      image {\n        __typename\n        src\n        alt\n      }\n    }\n    ... on PagesSectionsSkillsgrid {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n    }\n    ... on PagesSectionsSkillsSection {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n    }\n    ... on PagesSectionsContact {\n      subtitle {\n        __typename\n        fr\n        en\n      }\n      title {\n        __typename\n        fr\n        en\n      }\n      description {\n        __typename\n        fr\n        en\n      }\n      contactInfo {\n        __typename\n        email\n        phone\n        location {\n          __typename\n          fr\n          en\n        }\n      }\n      formAction\n    }\n    ... on PagesSectionsFooter {\n      copyrightYear\n      companyName\n      legalText {\n        __typename\n        fr\n        en\n      }\n    }\n  }\n}\n    &quot;],&quot;variables&quot;:[0,{&quot;relativePath&quot;:[0,&quot;home.json&quot;]}],&quot;data&quot;:[0,{&quot;pages&quot;:[0,{&quot;_sys&quot;:[0,{&quot;filename&quot;:[0,&quot;home&quot;],&quot;basename&quot;:[0,&quot;home.json&quot;],&quot;hasReferences&quot;:[0,false],&quot;breadcrumbs&quot;:[1,[[0,&quot;home&quot;]]],&quot;path&quot;:[0,&quot;content/pages/home.json&quot;],&quot;relativePath&quot;:[0,&quot;home.json&quot;],&quot;extension&quot;:[0,&quot;.json&quot;]}],&quot;id&quot;:[0,&quot;content/pages/home.json&quot;],&quot;__typename&quot;:[0,&quot;Pages&quot;],&quot;slug&quot;:[0,&quot;home&quot;],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesTitle&quot;],&quot;fr&quot;:[0,&quot;Oveco - Auto-construction et Rénovation Écologique | Maisons Passives&quot;],&quot;en&quot;:[0,&quot;Oveco - Self-Construction and Ecological Renovation | Passive Houses&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesDescription&quot;],&quot;fr&quot;:[0,&quot;Oveco accompagne vos projets d&#39;auto-construction et de rénovation écologique en Belgique. Expertise en maisons passives, énergies renouvelables et construction durable.&quot;],&quot;en&quot;:[0,&quot;Oveco supports your self-construction and ecological renovation projects in Belgium. Expertise in passive houses, renewable energies and sustainable construction.&quot;]}],&quot;sections&quot;:[1,[[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHero&quot;],&quot;subtitle&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHeroSubtitle&quot;],&quot;fr&quot;:[0,&quot;oveco&quot;],&quot;en&quot;:[0,&quot;oveco&quot;]}],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHeroTitle&quot;],&quot;fr&quot;:[0,&quot;Construisons l&#39;avenir&quot;],&quot;en&quot;:[0,&quot;Building the future&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHeroDescription&quot;],&quot;fr&quot;:[0,&quot;Des ingénieurs-installateurs à vos côtés.&quot;],&quot;en&quot;:[0,&quot;Engineers by your side.&quot;]}],&quot;ctaText&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHeroCtaText&quot;],&quot;fr&quot;:[0,&quot;Nous contacter&quot;],&quot;en&quot;:[0,&quot;Contact us&quot;]}],&quot;ctaUrl&quot;:[0,&quot;/#contact&quot;],&quot;images&quot;:[1,[[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHeroImages&quot;],&quot;src&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/hero/maison-build.webp&quot;],&quot;alt&quot;:[0,&quot;Maison passive en construction&quot;],&quot;class&quot;:[0,&quot;hero__image hero__image--large-1&quot;]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHeroImages&quot;],&quot;src&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/imgs/plan.webp&quot;],&quot;alt&quot;:[0,&quot;Projet d&#39;auto-construction&quot;],&quot;class&quot;:[0,&quot;hero__image hero__image--large-2&quot;]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHeroImages&quot;],&quot;src&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/imgs/maison-toit-2.webp&quot;],&quot;alt&quot;:[0,&quot;Rénovation énergétique&quot;],&quot;class&quot;:[0,&quot;hero__image hero__image--medium-1&quot;]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsHeroImages&quot;],&quot;src&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/hero/maison-build.webp&quot;],&quot;alt&quot;:[0,&quot;Construction durable&quot;],&quot;class&quot;:[0,&quot;hero__image hero__image--medium-2&quot;]}]]]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimage&quot;],&quot;sectionSubtitle&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageSectionSubtitle&quot;],&quot;fr&quot;:[0,&quot;Notre approche&quot;],&quot;en&quot;:[0,&quot;Our approach&quot;]}],&quot;sectionTitle&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageSectionTitle&quot;],&quot;fr&quot;:[0,&quot;Des solutions sur mesure pour votre autonomie énergétique&quot;],&quot;en&quot;:[0,&quot;Tailor-made solutions for your energy autonomy&quot;]}],&quot;sectionDescription&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageSectionDescription&quot;],&quot;fr&quot;:[0,&quot;Chez Oveco, nous allions expertise technique et accompagnement humain.&quot;],&quot;en&quot;:[0,&quot;At Oveco, we combine technical expertise and human support.&quot;]}],&quot;showSectionHeader&quot;:[0,true],&quot;subtitle&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageSubtitle&quot;],&quot;fr&quot;:[0,&quot;L&#39;auto-construction&quot;],&quot;en&quot;:[0,&quot;Self-construction&quot;]}],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageTitle&quot;],&quot;fr&quot;:[0,&quot;Apprendre en faisant, construire en étant accompagné&quot;],&quot;en&quot;:[0,&quot;Learn by doing, build with support&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageDescription&quot;],&quot;fr&quot;:[0,&quot;Nous croyons que l&#39;auto-construction est un moyen puissant de s&#39;approprier son habitat.&quot;],&quot;en&quot;:[0,&quot;We believe that self-construction is a powerful way to take ownership of your home.&quot;]}],&quot;image&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageImage&quot;],&quot;src&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/imgs/maison-toit.webp&quot;],&quot;alt&quot;:[0,&quot;Équipe Oveco&quot;]}],&quot;icon1&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageIcon1&quot;],&quot;src&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/icons/crayon.webp&quot;],&quot;alt&quot;:[0,&quot;Icône maison&quot;]}],&quot;icon2&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTextimageIcon2&quot;],&quot;src&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/icons/maison.webp&quot;],&quot;alt&quot;:[0,&quot;Icône conception&quot;]}],&quot;reverse&quot;:[0,false],&quot;subtitle2&quot;:[0,null],&quot;title2&quot;:[0,null],&quot;description2&quot;:[0,null],&quot;image2&quot;:[0,null]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertise&quot;],&quot;subtitle&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseSubtitle&quot;],&quot;fr&quot;:[0,&quot;Nos expertises&quot;],&quot;en&quot;:[0,&quot;Our expertise&quot;]}],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseTitle&quot;],&quot;fr&quot;:[0,&quot;Des solutions énergétiques durables et performantes&quot;],&quot;en&quot;:[0,&quot;Sustainable and efficient energy solutions&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseDescription&quot;],&quot;fr&quot;:[0,&quot;Notre expertise couvre l&#39;ensemble des domaines nécessaires à votre autonomie énergétique.&quot;],&quot;en&quot;:[0,&quot;Our expertise covers all the areas necessary for your energy autonomy.&quot;]}],&quot;cards&quot;:[1,[[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCards&quot;],&quot;icon&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/competence/elec.webp&quot;],&quot;alt&quot;:[0,&quot;Électricité&quot;],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCardsTitle&quot;],&quot;fr&quot;:[0,&quot;Photovoltaïque et électricité&quot;],&quot;en&quot;:[0,&quot;Photovoltaics and electricity&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCardsDescription&quot;],&quot;fr&quot;:[0,&quot;Installation de panneaux solaires performants.&quot;],&quot;en&quot;:[0,&quot;Installation of high-performance solar panels.&quot;]}]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCards&quot;],&quot;icon&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/competence/clim.webp&quot;],&quot;alt&quot;:[0,&quot;Chauffage&quot;],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCardsTitle&quot;],&quot;fr&quot;:[0,&quot;Pompes à chaleur et chauffage&quot;],&quot;en&quot;:[0,&quot;Heat pumps and heating&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCardsDescription&quot;],&quot;fr&quot;:[0,&quot;Systèmes de chauffage écologiques.&quot;],&quot;en&quot;:[0,&quot;Ecological heating systems.&quot;]}]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCards&quot;],&quot;icon&quot;:[0,&quot;https://assets.tina.io/a6a75741-8e49-4084-b132-6cb6df40bc37/competence/eolienne.webp&quot;],&quot;alt&quot;:[0,&quot;Énergies renouvelables&quot;],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCardsTitle&quot;],&quot;fr&quot;:[0,&quot;Énergies renouvelables&quot;],&quot;en&quot;:[0,&quot;Renewable energies&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsExpertiseCardsDescription&quot;],&quot;fr&quot;:[0,&quot;Intégration complète d&#39;énergies renouvelables.&quot;],&quot;en&quot;:[0,&quot;Complete integration of renewable energies.&quot;]}]}]]],&quot;ctaLabel&quot;:[0,null],&quot;ctaHref&quot;:[0,null]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsProjects&quot;],&quot;subtitle&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsProjectsSubtitle&quot;],&quot;fr&quot;:[0,&quot;Nos réalisations&quot;],&quot;en&quot;:[0,&quot;Our projects&quot;]}],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsProjectsTitle&quot;],&quot;fr&quot;:[0,&quot;Projets récents&quot;],&quot;en&quot;:[0,&quot;Recent projects&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsProjectsDescription&quot;],&quot;fr&quot;:[0,&quot;Une sélection de projets accompagnés avec succès.&quot;],&quot;en&quot;:[0,&quot;A selection of successfully supported projects.&quot;]}],&quot;linkText&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsProjectsLinkText&quot;],&quot;fr&quot;:[0,&quot;Voir tous les projets&quot;],&quot;en&quot;:[0,&quot;See all projects&quot;]}],&quot;linkUrl&quot;:[0,&quot;/works&quot;],&quot;cards&quot;:[1,[]]}],[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTestimonials&quot;],&quot;subtitle&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTestimonialsSubtitle&quot;],&quot;fr&quot;:[0,&quot;Témoignages&quot;],&quot;en&quot;:[0,&quot;Testimonials&quot;]}],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTestimonialsTitle&quot;],&quot;fr&quot;:[0,&quot;Ce qu&#39;ils disent de nous&quot;],&quot;en&quot;:[0,&quot;What they say about us&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;PagesSectionsTestimonialsDescription&quot;],&quot;fr&quot;:[0,&quot;Retours authentiques de nos clients.&quot;],&quot;en&quot;:[0,&quot;Authentic feedback from our clients.&quot;]}],&quot;linkText&quot;:[0,null],&quot;linkUrl&quot;:[0,null],&quot;testimonials&quot;:[1,[]]}]]]}],&quot;globalComponents&quot;:[0,{&quot;_sys&quot;:[0,{&quot;filename&quot;:[0,&quot;components&quot;],&quot;basename&quot;:[0,&quot;components.json&quot;],&quot;hasReferences&quot;:[0,false],&quot;breadcrumbs&quot;:[1,[[0,&quot;components&quot;]]],&quot;path&quot;:[0,&quot;content/global/components.json&quot;],&quot;relativePath&quot;:[0,&quot;components.json&quot;],&quot;extension&quot;:[0,&quot;.json&quot;]}],&quot;id&quot;:[0,&quot;content/global/components.json&quot;],&quot;__typename&quot;:[0,&quot;GlobalComponents&quot;],&quot;navbar&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbar&quot;],&quot;siteName&quot;:[0,&quot;Oveco&quot;],&quot;siteUrl&quot;:[0,&quot;/&quot;],&quot;logoUrl&quot;:[0,&quot;/uploads/icons/logo.webp&quot;],&quot;links&quot;:[1,[[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarLinks&quot;],&quot;label&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarLinksLabel&quot;],&quot;fr&quot;:[0,&quot;Qui sommes nous ?&quot;],&quot;en&quot;:[0,&quot;About us&quot;]}],&quot;url&quot;:[0,&quot;/about&quot;]}],[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarLinks&quot;],&quot;label&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarLinksLabel&quot;],&quot;fr&quot;:[0,&quot;Habitats groupés&quot;],&quot;en&quot;:[0,&quot;Group Housing&quot;]}],&quot;url&quot;:[0,&quot;/habitats&quot;]}],[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarLinks&quot;],&quot;label&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarLinksLabel&quot;],&quot;fr&quot;:[0,&quot;Nos réalisations&quot;],&quot;en&quot;:[0,&quot;Our Projects&quot;]}],&quot;url&quot;:[0,&quot;/works&quot;]}],[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarLinks&quot;],&quot;label&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarLinksLabel&quot;],&quot;fr&quot;:[0,&quot;Nos compétences&quot;],&quot;en&quot;:[0,&quot;Our Skills&quot;]}],&quot;url&quot;:[0,&quot;/competences&quot;]}]]],&quot;ctaButton&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarCtaButton&quot;],&quot;label&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsNavbarCtaButtonLabel&quot;],&quot;fr&quot;:[0,&quot;Nous contacter&quot;],&quot;en&quot;:[0,&quot;Contact us&quot;]}],&quot;url&quot;:[0,&quot;/#contact&quot;]}]}],&quot;contact&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContact&quot;],&quot;subtitle&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactSubtitle&quot;],&quot;fr&quot;:[0,&quot;Nous contacter&quot;],&quot;en&quot;:[0,&quot;Contact us&quot;]}],&quot;title&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactTitle&quot;],&quot;fr&quot;:[0,&quot;Vous avez un projet d&#39;auto-construction ou de rénovation énergétique ?&quot;],&quot;en&quot;:[0,&quot;Do you have a self-construction or energy renovation project?&quot;]}],&quot;description&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactDescription&quot;],&quot;fr&quot;:[0,&quot;Contactez-nous pour discuter de votre projet. Notre équipe est disponible pour répondre à toutes vos questions et vous proposer une solution adaptée à vos besoins.&quot;],&quot;en&quot;:[0,&quot;Contact us to discuss your project. Our team is available to answer all your questions and offer you a solution adapted to your needs.&quot;]}],&quot;contactInfo&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactContactInfo&quot;],&quot;email&quot;:[0,&quot;contact@oveco.be&quot;],&quot;phone&quot;:[0,&quot;+32 473 / 68.99.02&quot;],&quot;location&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactContactInfoLocation&quot;],&quot;fr&quot;:[0,&quot;Région de Beauvechain, Belgique&quot;],&quot;en&quot;:[0,&quot;Beauvechain area, Belgium&quot;]}]}],&quot;emailField&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactEmailField&quot;],&quot;label&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactEmailFieldLabel&quot;],&quot;fr&quot;:[0,&quot;Email&quot;],&quot;en&quot;:[0,&quot;Email&quot;]}],&quot;placeholder&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactEmailFieldPlaceholder&quot;],&quot;fr&quot;:[0,&quot;exemple@email.com&quot;],&quot;en&quot;:[0,&quot;example@email.com&quot;]}]}],&quot;messageField&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactMessageField&quot;],&quot;label&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactMessageFieldLabel&quot;],&quot;fr&quot;:[0,&quot;Message&quot;],&quot;en&quot;:[0,&quot;Message&quot;]}],&quot;placeholder&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactMessageFieldPlaceholder&quot;],&quot;fr&quot;:[0,&quot;Votre message ici...&quot;],&quot;en&quot;:[0,&quot;Your message here...&quot;]}]}],&quot;additionalFields&quot;:[1,[[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactAdditionalFields&quot;],&quot;type&quot;:[0,&quot;name&quot;],&quot;label&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactAdditionalFieldsLabel&quot;],&quot;fr&quot;:[0,&quot;Nom&quot;],&quot;en&quot;:[0,&quot;Name&quot;]}],&quot;placeholder&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsContactAdditionalFieldsPlaceholder&quot;],&quot;fr&quot;:[0,&quot;Jean Dupont&quot;],&quot;en&quot;:[0,&quot;John Doe&quot;]}],&quot;required&quot;:[0,false]}]]]}],&quot;footer&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsFooter&quot;],&quot;copyrightYear&quot;:[0,2024],&quot;companyName&quot;:[0,&quot;Oveco&quot;],&quot;legalText&quot;:[0,{&quot;__typename&quot;:[0,&quot;GlobalComponentsFooterLegalText&quot;],&quot;fr&quot;:[0,&quot;Tous droits réservés&quot;],&quot;en&quot;:[0,&quot;All Rights Reserved&quot;]}]}]}]}]}],&quot;docKey&quot;:[0,&quot;home&quot;]}" ssr client="load" opts="{&quot;name&quot;:&quot;LiveBridge&quot;,&quot;value&quot;:true}"></astro-island>   <nav class="navbar astro-jljvkfhn" id="navbar" role="navigation" aria-label="Navigation principale"> <div class="navbar__container astro-jljvkfhn"> <!-- Brand/Logo --> <a href="/" class="navbar__brand astro-jljvkfhn" aria-label="Oveco - Retour à l'accueil"> <img src="/uploads/icons/logo.webp" alt="Logo Oveco" class="brand__logo-img astro-jljvkfhn" width="45" height="45" loading="eager" fetchpriority="high" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div class="brand__text astro-jljvkfhn" style="display: none;" aria-hidden="true"> Oveco </div> </a> <!-- Navigation Menu --> <nav class="navbar__menu astro-jljvkfhn" id="navbarMenu" aria-label="Menu principal"> <ul class="navbar__links astro-jljvkfhn" role="list"> <li role="listitem" class="astro-jljvkfhn"> <a href="/about" class="navbar__link astro-jljvkfhn" aria-label="Aller à Qui sommes nous ?"> Qui sommes nous ? </a> </li><li role="listitem" class="astro-jljvkfhn"> <a href="/habitats" class="navbar__link astro-jljvkfhn" aria-label="Aller à Habitats groupés"> Habitats groupés </a> </li><li role="listitem" class="astro-jljvkfhn"> <a href="/works" class="navbar__link astro-jljvkfhn" aria-label="Aller à Nos réalisations"> Nos réalisations </a> </li><li role="listitem" class="astro-jljvkfhn"> <a href="/competences" class="navbar__link astro-jljvkfhn" aria-label="Aller à Nos compétences"> Nos compétences </a> </li> </ul> <!-- CTA Button et Language Switcher --> <div class="navbar__cta astro-jljvkfhn">  <div class="navbar__lang-switcher astro-jljvkfhn" role="group" aria-label="Changer de langue"> <button type="button" class="navbar__lang-btn navbar__lang-btn--active astro-jljvkfhn" data-lang="fr" aria-pressed="true" aria-label="Passer en FR"> FR </button><button type="button" class="navbar__lang-btn  astro-jljvkfhn" data-lang="en" aria-pressed="false" aria-label="Passer en EN"> EN </button> </div> <a href="/#contact" class="navbar__btn astro-jljvkfhn" aria-label="Nous contacter - Action principale"> Nous contacter </a> </div> </nav> <!-- Mobile Toggle --> <button class="navbar__toggle astro-jljvkfhn" id="navbarToggle" type="button" aria-label="Ouvrir le menu de navigation" aria-controls="navbarMenu" aria-expanded="false" aria-haspopup="true"> <span aria-hidden="true" class="astro-jljvkfhn"></span> <span aria-hidden="true" class="astro-jljvkfhn"></span> <span aria-hidden="true" class="astro-jljvkfhn"></span> </button> </div> </nav> <!-- Overlay pour fermeture du menu sur mobile --> <div class="navbar-overlay astro-jljvkfhn" id="navbarOverlay" hidden aria-hidden="true"></div> <script type="module">function u(){const r=document.getElementById("navbar"),t=document.getElementById("navbarToggle"),c=document.getElementById("navbarMenu"),s=document.getElementById("navbarOverlay"),l=document.body;if(!r||!t||!c||!s)return;t.addEventListener("click",function(){const a=!t.classList.contains("active");t.classList.toggle("active"),c.classList.toggle("active"),s.classList.toggle("active"),s.hidden=!s.classList.contains("active"),l.classList.toggle("no-scroll",a),t.setAttribute("aria-expanded",a?"true":"false")}),c.addEventListener("click",function(a){a.target.classList.contains("navbar__link")&&(t.classList.remove("active"),c.classList.remove("active"),s.classList.remove("active"),s.hidden=!0,l.classList.remove("no-scroll"),t.setAttribute("aria-expanded","false"))}),s.addEventListener("click",function(){t.classList.remove("active"),c.classList.remove("active"),s.classList.remove("active"),s.hidden=!0,l.classList.remove("no-scroll"),t.setAttribute("aria-expanded","false")}),window.addEventListener("keydown",function(a){a.key==="Escape"&&t.classList.contains("active")&&t.click()});const v=window.matchMedia("(min-width: 1025px)"),g=()=>{v.matches&&(t.classList.remove("active"),c.classList.remove("active"),s.classList.remove("active"),s.hidden=!0,l.classList.remove("no-scroll"),t.setAttribute("aria-expanded","false"))};window.addEventListener("resize",g),v.addEventListener?.("change",g),window.addEventListener("scroll",function(){window.scrollY>50?r.classList.add("scrolled"):r.classList.remove("scrolled")});const L=document.querySelectorAll(".navbar__lang-btn"),f=a=>{const n=document.cookie.match(new RegExp("(^| )"+a+"=([^;]+)"));return n?n[2]:null},h=()=>{const n=window.location.pathname.match(/^\/(en|es|de|nl)(?:\/|$)/);return n?n[1]:"fr"},m=()=>{const a=h(),n=f("oveco-lang"),i=a||n||"fr";L.forEach(e=>{(e.dataset.lang||"fr")===i?(e.classList.add("navbar__lang-btn--active"),e.setAttribute("aria-pressed","true")):(e.classList.remove("navbar__lang-btn--active"),e.setAttribute("aria-pressed","false"))})};m(),L.forEach(a=>{a.addEventListener("click",function(){const n=this.dataset.lang||"fr",i=window.location.pathname;document.cookie=`oveco-lang=${n}; path=/; max-age=31536000; SameSite=Lax`;let e="";const d=i.match(/^\/(en|es|de|nl)(?:\/(.*))?$/);d?e=d[2]||"":e=i.replace(/^\//,"").replace(/\/$/,""),e=e.replace(/\/$/,"");let o;n==="fr"?o=e===""?"/":`/${e}`:o=e===""?`/${n}/`:`/${n}/${e}`,o!==i&&o!==i+"/"?window.location.href=o:m()})})}document.addEventListener("DOMContentLoaded",u);document.addEventListener("astro:page-load",u);</script>  <main id="main-content" role="main"> <div class="home-page astro-bbe6dxrz"> <section class="hero astro-bbe6dxrz" role="banner" aria-labelledby="hero-title"> <div class="hero__mouse-follower astro-bbe6dxrz" id="mouseFollower" aria-hidden="true"></div> <!-- Blur décoratif en bas (gradient CSS pour performance) --> <div class="hero__blur-decoration astro-bbe6dxrz" aria-hidden="true"></div> <div class="hero__container astro-bbe6dxrz"> <div class="hero__image-wrapper hero__image-wrapper--1 astro-bbe6dxrz" id="wrapper-img1"> <img src="/uploads/hero/maison-build.webp" alt="Maison passive en construction" class="hero__image hero__image--1 astro-bbe6dxrz" id="img1" width="532" height="640" loading="eager" decoding="sync" fetchpriority="high" data-bind="sections.0.images.0.src"> </div><div class="hero__image-wrapper hero__image-wrapper--2 astro-bbe6dxrz" id="wrapper-img2"> <img src="/uploads/imgs/plan.webp" alt="Projet d'auto-construction" class="hero__image hero__image--2 astro-bbe6dxrz" id="img2" width="532" height="640" loading="lazy" decoding="async" fetchpriority="low" data-bind="sections.0.images.1.src"> </div><div class="hero__image-wrapper hero__image-wrapper--3 astro-bbe6dxrz" id="wrapper-img3"> <img src="/uploads/imgs/maison-toit-2.webp" alt="Rénovation énergétique" class="hero__image hero__image--3 astro-bbe6dxrz" id="img3" width="532" height="640" loading="lazy" decoding="async" fetchpriority="low" data-bind="sections.0.images.2.src"> </div><div class="hero__image-wrapper hero__image-wrapper--4 astro-bbe6dxrz" id="wrapper-img4"> <img src="/uploads/hero/maison-build.webp" alt="Construction durable" class="hero__image hero__image--4 astro-bbe6dxrz" id="img4" width="532" height="640" loading="lazy" decoding="async" fetchpriority="low" data-bind="sections.0.images.3.src"> </div> <div class="hero__content astro-bbe6dxrz"> <header class="hero__header astro-bbe6dxrz"> <p class="hero__subtitle astro-bbe6dxrz" data-bind="sections.0.subtitle" aria-label="Sous-titre">oveco</p> <h1 class="hero__title astro-bbe6dxrz" id="hero-title" data-bind="sections.0.title">Construisons l&#39;avenir</h1> </header> <p class="hero__description astro-bbe6dxrz" data-bind="sections.0.description">Des ingénieurs-installateurs à vos côtés.</p> <a href="/#contact" class="hero__cta astro-bbe6dxrz" data-bind="sections.0.ctaUrl" aria-label="Nous contacter - Contactez-nous"> <span data-bind="sections.0.ctaText" class="astro-bbe6dxrz">Nous contacter</span> </a> </div> </div> </section> </div> <script type="module">function m(){const r=document.getElementById("mouseFollower"),e=document.querySelector(".hero");if(!r||!e)return;const c=r;let i=0,a=0,o=0,l=0,s=!1;const d=.1;function u(){const t=i-o,n=a-l;o+=t*d,l+=n*d,c.style.transform=`translate3d(${o}px, ${l}px, 0) translate(-50%, -50%)`,c.style.opacity=s?"1":"0",requestAnimationFrame(u)}u(),e.addEventListener("mousemove",t=>{const n=e.getBoundingClientRect();i=t.clientX-n.left,a=t.clientY-n.top,s=!0}),e.addEventListener("mouseleave",()=>{s=!1})}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",m):m();</script> <section class="oveco-section astro-4loisj62" itemscope itemtype="https://schema.org/Organization"> <!-- Décoration maison SVG pour le mode reverse -->  <div class="container astro-4loisj62">  <div class="oveco__section-header astro-4loisj62"> <div class="oveco__section-content astro-4loisj62"> <p class="oveco__section-subtitle astro-4loisj62" data-bind="sections.1.sectionSubtitle">Notre approche</p> <h2 class="oveco__section-title astro-4loisj62" data-bind="sections.1.sectionTitle">Des solutions sur mesure pour votre autonomie énergétique</h2> <p class="oveco__section-description astro-4loisj62" data-bind="sections.1.sectionDescription">Chez Oveco, nous allions expertise technique et accompagnement humain.</p> </div> </div>  <div class="oveco__container  astro-4loisj62">  <div class="oveco__content astro-4loisj62"> <header class="oveco__header astro-4loisj62"> <h3 class="oveco__subtitle astro-4loisj62" itemprop="name" data-bind="sections.1.subtitle">L&#39;auto-construction</h3> <h2 class="oveco__title astro-4loisj62" data-bind="sections.1.title">Apprendre en faisant, construire en étant accompagné</h2> <p class="oveco__description astro-4loisj62" itemprop="description" data-bind="sections.1.description">Nous croyons que l'auto-construction est un moyen puissant de s'approprier son habitat.</p> </header>  </div>  <div class="oveco__visual astro-4loisj62"> <img src="/uploads/imgs/maison-build.webp" alt="Équipe Oveco" class="oveco__main-image astro-4loisj62 smart-image has-placeholder astro-5ef4xkjn" loading="lazy" decoding="async" width="362" height="436" sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" style="object-fit: cover; object-position: center; aspect-ratio: 0.83125; background-image: url(data:image/webp;base64,UklGRvQAAABXRUJQVlA4IOgAAADQBQCdASoYAB0APwFyslGrJqSiqAqpYCAJYwC7AzLQb5nwLLJ/KN9SXcVvz1sov/XqG2BH4V8AAM3caNNy+IES8lYbm8VvXO4gpS2vgG8SN8k8EVXYX9TcJWF3RA+Gp2DHeFX0K3jeukN7QilNx8us7U3dI+mJo3XjwDrvgDWctm7gQ74medN9UaLvI67ywohsb3vGE3e2/zRcAXDiVHwSY0Uogymp5XYprLRGd4ON1EW73YvYgBO09ZBviw0NmTCJaSE1CgwYJYH4q1vM3rxUjuXDn2s8hD9LZ59kcW/CGv53ZcWEAAAA); background-size: cover; background-position: center;" data-bind="sections.1.image.src" onload="this.classList.add('loaded'); this.style.backgroundImage='none';"> <img src="/uploads/icons/crayon.webp" alt="Icône maison" width="100" height="100" loading="lazy" class="oveco__icon oveco__icon--house astro-4loisj62" aria-hidden="true" data-bind="sections.1.icon1.src"> <img src="/uploads/icons/maison.webp" alt="Icône conception" width="104" height="104" loading="lazy" class="oveco__icon oveco__icon--pencil astro-4loisj62" aria-hidden="true" data-bind="sections.1.icon2.src"> </div> </div>   </div> </section> <section class="expertise-section astro-jznfhtox" id="expertises" aria-labelledby="expertise-title"> <div class="container astro-jznfhtox"> <div class="expertise__container astro-jznfhtox"> <header class="expertise__header astro-jznfhtox"> <p class="expertise__subtitle astro-jznfhtox" aria-label="Section nos expertises" data-bind="sections.2.subtitle">Nos expertises</p> <h2 class="expertise__title astro-jznfhtox" id="expertise-title" data-bind="sections.2.title">Des solutions énergétiques durables et performantes</h2> <p class="expertise__description astro-jznfhtox" data-bind="sections.2.description">Notre expertise couvre l'ensemble des domaines nécessaires à votre autonomie énergétique.</p> </header> <div class="expertise__content astro-jznfhtox"> <div class="expertise__grid astro-jznfhtox" role="list" aria-label="Liste de nos expertises"> <article class="expertise__card astro-jznfhtox" role="listitem" itemscope itemtype="https://schema.org/Service"> <img src="/uploads/compétance/elec.webp" alt="Icône photovoltaïque" class="expertise__icon astro-jznfhtox smart-image has-placeholder astro-5ef4xkjn" loading="lazy" decoding="async" width="168" height="168" sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" style="object-fit: cover; object-position: center; aspect-ratio: 1; background-image: url(data:image/webp;base64,UklGRtQBAABXRUJQVlA4WAoAAAAQAAAAFwAAFwAAQUxQSPYAAAABgGPb2rHn/LFt27ZtO5WtyraN0klrcxKpMqJ/ref7gwFExATwZx2rGhK1NGC+2BuY1Lkep8hsxxwIsBz1VzJjAXQSo72owKkHyH4kgiF9WYMHWO8MeobR4m4oGtGB9cDpz+LI6YEjfUmbE1WXq7VJkRwPOg9J3DrRYnPKMMTvS4+GCAFT1lh9m8ZwlQ5+61oCsylSC4lwvAVccusFjBq6RETkNKQDhM9K0nvsUWUeaqmFjaoEpRcNyfn7L6hHjGoJkhs9UjND76MBH9t5hMaXs1OLs5tb7gT6TAVIGNjpGr2O1uufnpzxRKx90LXfika1gh34nwFWUDgguAAAAPAEAJ0BKhgAGAA/AXazU6snJKKoCAFgIAlsAMKR/+LU8OKdT2t3v/xH4ukndsD7sAD+nYo4AlrJGcTuOD9QgQEiEzpHnGbtDLCzfTnUMWkzSjdzeXvZGY3od0twqAJUmCgJWW8vyIorpwiFRpzT8Zm4Vh8a280bT1VuONvcAd2YgsvqPjJKCEgzzTXeQSrvVVzT+kBBwGNue+iXhHIfJR+LrA/oJarL5LF9svPM6DHsfJutl/mgAAA=); background-size: cover; background-position: center;" data-bind="sections.2.cards.0.icon" onload="this.classList.add('loaded'); this.style.backgroundImage='none';"> <div class="expertise__card-content astro-jznfhtox"> <h3 class="expertise__card-title astro-jznfhtox" itemprop="name" data-bind="sections.2.cards.0.title">Photovoltaïque</h3> <p class="expertise__card-description astro-jznfhtox" itemprop="description" data-bind="sections.2.cards.0.description">Installation de panneaux solaires performants pour votre autonomie énergétique.</p> </div> </article><article class="expertise__card astro-jznfhtox" role="listitem" itemscope itemtype="https://schema.org/Service"> <img src="/uploads/compétance/clim.webp" alt="Icône pompe à chaleur" class="expertise__icon astro-jznfhtox smart-image has-placeholder astro-5ef4xkjn" loading="lazy" decoding="async" width="168" height="168" sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" style="object-fit: cover; object-position: center; aspect-ratio: 1; background-image: url(data:image/webp;base64,UklGRqIAAABXRUJQVlA4IJYAAADwBACdASoYABgAPwFqsE8rJiUiKA1RYCAJZgC4MYsYcDrUykypimtdYyNi1q+SkAAA/u/Cp2/YhVl+ODFSQxSMXHij0EmYCLCtZbeRkcxKIOJqKYHpF8NPtnWzG98HyiZo29BgWH95gLx0sMc6tXcE/heZaey7ubu36e+Jxn0UPR/sOod3xGzWLhw5SkURVamqtwwAAAA=); background-size: cover; background-position: center;" data-bind="sections.2.cards.1.icon" onload="this.classList.add('loaded'); this.style.backgroundImage='none';"> <div class="expertise__card-content astro-jznfhtox"> <h3 class="expertise__card-title astro-jznfhtox" itemprop="name" data-bind="sections.2.cards.1.title">Pompe à chaleur</h3> <p class="expertise__card-description astro-jznfhtox" itemprop="description" data-bind="sections.2.cards.1.description">Systèmes de chauffage écologiques et économiques.</p> </div> </article><article class="expertise__card astro-jznfhtox" role="listitem" itemscope itemtype="https://schema.org/Service"> <img src="/uploads/competence/isolation.webp" alt="Icône isolation" class="expertise__icon astro-jznfhtox smart-image astro-5ef4xkjn" loading="lazy" decoding="async" width="168" height="168" sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" style="object-fit: cover; object-position: center; aspect-ratio: 1" data-bind="sections.2.cards.2.icon" onload="this.classList.add('loaded'); this.style.backgroundImage='none';"> <div class="expertise__card-content astro-jznfhtox"> <h3 class="expertise__card-title astro-jznfhtox" itemprop="name" data-bind="sections.2.cards.2.title">Isolation thermique</h3> <p class="expertise__card-description astro-jznfhtox" itemprop="description" data-bind="sections.2.cards.2.description">Isolation performante pour un confort optimal et des économies d'énergie.</p> </div> </article><article class="expertise__card astro-jznfhtox" role="listitem" itemscope itemtype="https://schema.org/Service"> <img src="/uploads/compétance/clim.webp" alt="Icône ventilation" class="expertise__icon astro-jznfhtox smart-image has-placeholder astro-5ef4xkjn" loading="lazy" decoding="async" width="168" height="168" sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" style="object-fit: cover; object-position: center; aspect-ratio: 1; background-image: url(data:image/webp;base64,UklGRqIAAABXRUJQVlA4IJYAAADwBACdASoYABgAPwFqsE8rJiUiKA1RYCAJZgC4MYsYcDrUykypimtdYyNi1q+SkAAA/u/Cp2/YhVl+ODFSQxSMXHij0EmYCLCtZbeRkcxKIOJqKYHpF8NPtnWzG98HyiZo29BgWH95gLx0sMc6tXcE/heZaey7ubu36e+Jxn0UPR/sOod3xGzWLhw5SkURVamqtwwAAAA=); background-size: cover; background-position: center;" data-bind="sections.2.cards.3.icon" onload="this.classList.add('loaded'); this.style.backgroundImage='none';"> <div class="expertise__card-content astro-jznfhtox"> <h3 class="expertise__card-title astro-jznfhtox" itemprop="name" data-bind="sections.2.cards.3.title">Ventilation</h3> <p class="expertise__card-description astro-jznfhtox" itemprop="description" data-bind="sections.2.cards.3.description">Systèmes de ventilation double flux pour un air sain.</p> </div> </article><article class="expertise__card astro-jznfhtox" role="listitem" itemscope itemtype="https://schema.org/Service"> <img src="/uploads/competence/bois.webp" alt="Icône ossature bois" class="expertise__icon astro-jznfhtox smart-image astro-5ef4xkjn" loading="lazy" decoding="async" width="168" height="168" sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" style="object-fit: cover; object-position: center; aspect-ratio: 1" data-bind="sections.2.cards.4.icon" onload="this.classList.add('loaded'); this.style.backgroundImage='none';"> <div class="expertise__card-content astro-jznfhtox"> <h3 class="expertise__card-title astro-jznfhtox" itemprop="name" data-bind="sections.2.cards.4.title">Ossature bois</h3> <p class="expertise__card-description astro-jznfhtox" itemprop="description" data-bind="sections.2.cards.4.description">Construction en ossature bois pour des maisons durables et écologiques.</p> </div> </article> </div> <a href="/competences" class="expertise__cta astro-jznfhtox" aria-label> <span class="astro-jznfhtox"></span> </a> </div> </div> </div> </section> <section class="projects-section" id="projets" itemscope itemtype="https://schema.org/ItemList" data-projects-root> <!-- Décoration house.svg --> <div class="projects__decoration projects__decoration--left" aria-hidden="true"> <img src="/uploads/icons/maison.svg" alt="" width="206" height="228" loading="lazy"> </div> <div class="projects"> <div class="projects__container"> <header class="projects__header"> <div class="projects__header-content"> <p class="projects__subtitle" data-bind="sections.3.subtitle">Nos réalisations</p> <h2 class="projects__title" id="projets-title" itemprop="name" data-bind="sections.3.title">Projets récents</h2> <p class="projects__description" itemprop="description" data-bind="sections.3.description">Une sélection de projets accompagnés avec succès.</p> <a href="/works" class="projects__link" aria-label="Voir tous nos projets (page Réalisations)" data-bind="sections.3.linkUrl"> <span data-bind="sections.3.linkText">Voir tous les projets</span> <svg class="projects__link-arrow" width="10" height="9" viewBox="0 0 10 9" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path d="M1 4.5H9M9 4.5L5.5 1M9 4.5L5.5 8" stroke="#048B9A" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </a> </div> <div class="projects__navigation" role="navigation" aria-label="Navigation des projets"> <button class="projects__nav-btn projects__nav-btn--prev" aria-label="Projet précédent" type="button" data-scroll-dir="prev"> <svg width="11" height="21" viewBox="0 0 11 21" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path d="M10 1L1 10.5L10 20" stroke="#FFFEF8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </button> <button class="projects__nav-btn projects__nav-btn--next" aria-label="Projet suivant" type="button" data-scroll-dir="next"> <svg width="11" height="21" viewBox="0 0 11 21" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path d="M1 1L10 10.5L1 20" stroke="#FFFEF8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </button> </div> </header> <div class="projects__grid" role="list" aria-labelledby="projets-title" data-projects-grid> <a href="/work/renovation-ecologique-exemple" class="projects__card astro-dohjnao5" role="listitem" style="background-image: url('/uploads/imgs/Charpantier.webp');" data-project-title="renovation écologique" data-project-type="renovation écologique" data-project-client="martin p" data-project-description="renovated surface fr" data-competences aria-label="Voir le projet Renovation écologique"> <div class="projects__card-overlay astro-dohjnao5" aria-hidden="true"></div> <!-- Header: Type en haut à droite --> <div class="projects__card-header astro-dohjnao5"> <span class="projects__card-type astro-dohjnao5">Renovation écologique</span> </div> <!-- Contenu principal --> <div class="projects__card-content astro-dohjnao5"> <div class="projects__card-info astro-dohjnao5"> <p class="projects__card-client astro-dohjnao5">Martin P</p> <h2 class="projects__card-title astro-dohjnao5">Renovation écologique</h2> <p class="projects__card-description astro-dohjnao5">Renovated surface FR</p> </div> </div> <!-- Footer: Indicateur visuel --> <footer class="projects__card-footer astro-dohjnao5"> <span class="projects__card-link astro-dohjnao5"> <span class="astro-dohjnao5">Voir le projet</span> <svg class="projects__card-arrow astro-dohjnao5" width="10" height="9" viewBox="0 0 10 9" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path d="M1 4.5H9M9 4.5L5.5 1M9 4.5L5.5 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="astro-dohjnao5"></path> </svg> </span> </footer> </a>  </div> </div> </div> </section> <script>
  // Navigation du carrousel de projets (support multi-sections)
  function initProjectsCarousels() {
    var sections = document.querySelectorAll('[data-projects-root]');
    if (!sections || !sections.length) return;

    sections.forEach(function(section) {
      var grid = section.querySelector('[data-projects-grid]');
      var prevBtn = section.querySelector('.projects__nav-btn--prev');
      var nextBtn = section.querySelector('.projects__nav-btn--next');

      if (!grid || !prevBtn || !nextBtn) return;

    // Fonction pour calculer la largeur de scroll
    var getScrollAmount = function() {
      var screenWidth = window.innerWidth;
      var firstCard = grid.querySelector('.projects__card');
      
      if (firstCard) {
        var cardRect = firstCard.getBoundingClientRect();
        var gap = window.getComputedStyle(grid).gap;
        var gapValue = parseInt(gap) || 14;
        return cardRect.width + gapValue;
      }
      
      // Fallback basé sur la taille d'écran
      var cardWidth = 388;
      var gapVal = 14;
      
      if (screenWidth <= 480) {
        cardWidth = Math.min(300, screenWidth * 0.82);
        gapVal = 10;
      } else if (screenWidth <= 768) {
        cardWidth = Math.min(340, screenWidth * 0.85);
        gapVal = 12;
      } else if (screenWidth <= 1024) {
        cardWidth = Math.min(360, screenWidth * 0.42);
        gapVal = 12;
      } else if (screenWidth <= 1200) {
        cardWidth = Math.min(380, screenWidth * 0.38);
        gapVal = 12;
      } else {
        cardWidth = Math.min(388, screenWidth * 0.26);
        gapVal = 14;
      }
      
      return cardWidth + gapVal;
    };

    // Gestion des boutons de navigation
    prevBtn.addEventListener('click', function(e) {
      e.preventDefault();
      e.stopPropagation();
      grid.scrollBy({ left: -getScrollAmount(), behavior: 'smooth' });
    });

    nextBtn.addEventListener('click', function(e) {
      e.preventDefault();
      e.stopPropagation();
      grid.scrollBy({ left: getScrollAmount(), behavior: 'smooth' });
    });

      // Drag (pointer events) - plus fluide et compatible desktop/mobile
      var isDragging = false;
      var startX = 0;
      var startScrollLeft = 0;
      var hasMoved = false;

      function onPointerDown(e) {
        // bouton gauche souris ou touch/pen
        if (e.pointerType === 'mouse' && e.button !== 0) return;
        isDragging = true;
        hasMoved = false;
        startX = e.clientX;
        startScrollLeft = grid.scrollLeft;
        grid.classList.add('is-grabbing');
      }

      function onPointerMove(e) {
        if (!isDragging) return;
        var dx = e.clientX - startX;
        // Seuil de 8px pour détecter un vrai drag
        if (Math.abs(dx) > 8) {
          hasMoved = true;
          grid.scrollLeft = startScrollLeft - dx;
        }
      }

      function endDrag() {
        isDragging = false;
        grid.classList.remove('is-grabbing');
        // Reset hasMoved après un court délai pour laisser passer le click event
        setTimeout(function() { hasMoved = false; }, 10);
      }

      grid.addEventListener('pointerdown', onPointerDown);
      grid.addEventListener('pointermove', onPointerMove);
      grid.addEventListener('pointerup', endDrag);
      grid.addEventListener('pointercancel', endDrag);
      grid.addEventListener('pointerleave', endDrag);

      // Empêcher les clics uniquement si on a vraiment fait un drag
      grid.addEventListener('click', function(e) {
        if (hasMoved) {
          e.preventDefault();
          e.stopPropagation();
        }
      }, true);

      // Initialiser le curseur
      grid.style.cursor = 'grab';
      console.log('[Projects] Carousel initialized');
    });
  }
  
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', initProjectsCarousels);
  } else {
    initProjectsCarousels();
  }
</script> <section class="testimonials-section astro-aadlzisc" id="temoignages" itemscope itemtype="https://schema.org/ItemList" data-testimonials-root> <!-- Décoration house.svg --> <div class="testimonials__decoration testimonials__decoration--right astro-aadlzisc" aria-hidden="true"> <img src="/uploads/icons/maison.svg" alt="" width="206" height="228" loading="lazy" class="astro-aadlzisc"> </div> <div class="testimonials astro-aadlzisc"> <div class="testimonials__container astro-aadlzisc"> <header class="testimonials__header astro-aadlzisc"> <div class="testimonials__header-content astro-aadlzisc"> <p class="testimonials__subtitle astro-aadlzisc" data-bind="sections.4.subtitle">Témoignages</p> <h2 class="testimonials__title astro-aadlzisc" id="temoignages-title" data-bind="sections.4.title">Ce qu&#39;ils disent de nous</h2> <p class="testimonials__description astro-aadlzisc" data-bind="sections.4.description">Retours authentiques de nos clients.</p> <!-- Lien retiré - plus de flèche dans le header --> </div> <div class="testimonials__navigation astro-aadlzisc" role="navigation" aria-label="Navigation des témoignages"> <button class="testimonials__nav-btn testimonials__nav-btn--prev astro-aadlzisc" aria-label="Témoignage précédent" type="button" data-scroll-dir="prev"> <svg width="11" height="21" viewBox="0 0 11 21" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="astro-aadlzisc"> <path d="M10 1L1 10.5L10 20" stroke="#FFFEF8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="astro-aadlzisc"></path> </svg> </button> <button class="testimonials__nav-btn testimonials__nav-btn--next astro-aadlzisc" aria-label="Témoignage suivant" type="button" data-scroll-dir="next"> <svg width="11" height="21" viewBox="0 0 11 21" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="astro-aadlzisc"> <path d="M1 1L10 10.5L1 20" stroke="#FFFEF8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="astro-aadlzisc"></path> </svg> </button> </div> </header> <div class="testimonials__grid astro-aadlzisc" role="list" aria-labelledby="temoignages-title" data-testimonials-grid> <article class="projects__card testimonial-card astro-3ba2o4vp" role="listitem" itemscope itemtype="https://schema.org/Review" style="background-image: url('/uploads/imgs/femme.avif');"><meta itemprop="image" content="/uploads/imgs/femme.avif"><div class="projects__card-overlay testimonial-overlay astro-3ba2o4vp" aria-hidden="true"></div><!-- Header: Type en haut à droite --><div class="projects__card-header astro-3ba2o4vp"><span class="projects__card-type astro-3ba2o4vp">Témoignage</span></div><!-- Contenu principal --><div class="projects__card-content astro-3ba2o4vp"><div class="projects__card-info astro-3ba2o4vp"><p class="projects__card-client astro-3ba2o4vp" itemprop="author" itemscope itemtype="https://schema.org/Person"><span itemprop="name" class="astro-3ba2o4vp">Emma</span></p><h2 class="projects__card-title astro-3ba2o4vp">PDG chez Coolify</h2><p class="projects__card-description astro-3ba2o4vp" itemprop="reviewBody">dolore aliquip enim ullamco ullamco id</p></div></div><!-- Pas de footer "Voir le projet" si pas de projet lié --></article><a href="/work/renovation-ecologique-exemple" class="projects__card testimonial-card testimonial-card--linked astro-3ba2o4vp" role="listitem" itemscope itemtype="https://schema.org/Review" style="background-image: url('/uploads/imgs/homme.avif');" aria-label="Témoignage - Martin P - Voir le projet"><meta itemprop="image" content="/uploads/imgs/homme.avif"><div class="projects__card-overlay testimonial-overlay astro-3ba2o4vp" aria-hidden="true"></div><!-- Header: Type en haut à droite --><div class="projects__card-header astro-3ba2o4vp"><span class="projects__card-type astro-3ba2o4vp">Témoignage</span></div><!-- Contenu principal --><div class="projects__card-content astro-3ba2o4vp"><div class="projects__card-info astro-3ba2o4vp"><p class="projects__card-client astro-3ba2o4vp" itemprop="author" itemscope itemtype="https://schema.org/Person"><span itemprop="name" class="astro-3ba2o4vp">Martin P</span></p><h2 class="projects__card-title astro-3ba2o4vp">Développeur web chez Twitch</h2><p class="projects__card-description astro-3ba2o4vp" itemprop="reviewBody">dolore aliquip enim ullamco ullamco id</p></div></div><!-- Footer: Lien vers le projet --><footer class="projects__card-footer astro-3ba2o4vp"><span class="projects__card-link astro-3ba2o4vp"><span class="astro-3ba2o4vp">Voir le projet</span><svg class="projects__card-arrow astro-3ba2o4vp" width="10" height="9" viewBox="0 0 10 9" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M1 4.5H9M9 4.5L5.5 1M9 4.5L5.5 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="astro-3ba2o4vp"></path></svg></span></footer></a> </div> </div> </div> </section> <script>
  // Navigation du carrousel de témoignages (support multi-sections)
  function initTestimonialsCarousels() {
    var sections = document.querySelectorAll('[data-testimonials-root]');
    if (!sections || !sections.length) return;

    sections.forEach(function(section) {
      var grid = section.querySelector('[data-testimonials-grid]');
      var prevBtn = section.querySelector('.testimonials__nav-btn--prev');
      var nextBtn = section.querySelector('.testimonials__nav-btn--next');

      if (!grid || !prevBtn || !nextBtn) return;

    // Fonction pour calculer la largeur de scroll
    var getScrollAmount = function() {
      var screenWidth = window.innerWidth;
      var firstCard = grid.querySelector('.projects__card');
      
      if (firstCard) {
        var cardRect = firstCard.getBoundingClientRect();
        var gap = window.getComputedStyle(grid).gap;
        var gapValue = parseInt(gap) || 24;
        return cardRect.width + gapValue;
      }
      
      // Fallback basé sur la taille d'écran
      var cardWidth = 388;
      var gapVal = 24;
      
      if (screenWidth <= 480) {
        cardWidth = Math.min(300, screenWidth * 0.82);
        gapVal = 10;
      } else if (screenWidth <= 768) {
        cardWidth = Math.min(340, screenWidth * 0.85);
        gapVal = 12;
      } else if (screenWidth <= 1024) {
        cardWidth = Math.min(360, screenWidth * 0.42);
        gapVal = 18;
      } else if (screenWidth <= 1200) {
        cardWidth = Math.min(380, screenWidth * 0.38);
        gapVal = 20;
      } else {
        cardWidth = Math.min(388, screenWidth * 0.26);
        gapVal = 24;
      }
      
      return cardWidth + gapVal;
    };

    // Gestion des boutons de navigation
    prevBtn.addEventListener('click', function(e) {
      e.preventDefault();
      e.stopPropagation();
      grid.scrollBy({ left: -getScrollAmount(), behavior: 'smooth' });
    });

    nextBtn.addEventListener('click', function(e) {
      e.preventDefault();
      e.stopPropagation();
      grid.scrollBy({ left: getScrollAmount(), behavior: 'smooth' });
    });

      // Drag (pointer events) - plus fluide
      var isDragging = false;
      var startX = 0;
      var startScrollLeft = 0;
      var hasMoved = false;

      function onPointerDown(e) {
        if (e.pointerType === 'mouse' && e.button !== 0) return;
        isDragging = true;
        hasMoved = false;
        startX = e.clientX;
        startScrollLeft = grid.scrollLeft;
        grid.classList.add('is-grabbing');
      }

      function onPointerMove(e) {
        if (!isDragging) return;
        var dx = e.clientX - startX;
        // Seuil de 8px pour détecter un vrai drag
        if (Math.abs(dx) > 8) {
          hasMoved = true;
          grid.scrollLeft = startScrollLeft - dx;
        }
      }

      function endDrag() {
        isDragging = false;
        grid.classList.remove('is-grabbing');
        // Reset hasMoved après un court délai pour laisser passer le click event
        setTimeout(function() { hasMoved = false; }, 10);
      }

      grid.addEventListener('pointerdown', onPointerDown);
      grid.addEventListener('pointermove', onPointerMove);
      grid.addEventListener('pointerup', endDrag);
      grid.addEventListener('pointercancel', endDrag);
      grid.addEventListener('pointerleave', endDrag);

      // Empêcher les clics uniquement si on a vraiment fait un drag
      grid.addEventListener('click', function(e) {
        if (hasMoved) {
          e.preventDefault();
          e.stopPropagation();
        }
      }, true);

      grid.style.cursor = 'grab';
      console.log('[Testimonials] Carousel initialized');
    });
  }
  
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', initTestimonialsCarousels);
  } else {
    initTestimonialsCarousels();
  }
</script>  </main> <section class="contact-section astro-xmivup5a" id="contact" aria-labelledby="contact-title"> <div class="contact astro-xmivup5a" itemscope itemtype="https://schema.org/ContactPoint"> <div class="contact__container astro-xmivup5a"> <aside class="contact__info astro-xmivup5a" aria-labelledby="contact-title contact-subtitle"> <div class="contact__info-header astro-xmivup5a"> <p class="contact__subtitle astro-xmivup5a" id="contact-subtitle" data-bind="globalComponents.contact.subtitle">Nous contacter</p> <h2 class="contact__title astro-xmivup5a" id="contact-title" data-bind="globalComponents.contact.title">Vous avez un projet d&#39;auto-construction ou de rénovation énergétique ?</h2> </div> <p class="contact__description astro-xmivup5a" data-bind="globalComponents.contact.description">Contactez-nous pour discuter de votre projet. Notre équipe est disponible pour répondre à toutes vos questions et vous proposer une solution adaptée à vos besoins.</p> <ul class="contact__list astro-xmivup5a" role="list"> <li class="contact__item astro-xmivup5a"> <span class="contact__item-icon astro-xmivup5a" aria-hidden="true"> <svg width="19" height="15" viewBox="0 0 19 15" fill="none" xmlns="http://www.w3.org/2000/svg" class="astro-xmivup5a"> <path d="M18.2476 3.14648V11.4798C18.2476 12.0324 18.0281 12.5623 17.6374 12.953C17.2467 13.3437 16.7168 13.5632 16.1642 13.5632H3.66424C3.11171 13.5632 2.5818 13.3437 2.1911 12.953C1.8004 12.5623 1.58091 12.0324 1.58091 11.4798V3.14648" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="astro-xmivup5a"></path> <path d="M18.2476 3.14681C18.2476 2.59428 18.0281 2.06437 17.6374 1.67367C17.2467 1.28297 16.7168 1.06348 16.1642 1.06348H3.66424C3.11171 1.06348 2.5818 1.28297 2.1911 1.67367C1.8004 2.06437 1.58091 2.59428 1.58091 3.14681L8.81008 7.6607C9.14118 7.86764 9.52378 7.97737 9.91424 7.97737C10.3047 7.97737 10.6873 7.86764 11.0184 7.6607L18.2476 3.14681Z" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="astro-xmivup5a"></path> </svg> </span> <a class="contact__link contact__link--accent astro-xmivup5a" href="mailto:contact@oveco.be" data-bind="globalComponents.contact.contactInfo.email"> contact@oveco.be </a> </li> <li class="contact__item astro-xmivup5a"> <span class="contact__item-icon contact__item-icon--phone astro-xmivup5a" aria-hidden="true"> <svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg" class="astro-xmivup5a"> <path d="M12.1658 17.5824L12.1749 17.5888C12.962 18.0899 13.8964 18.3075 14.8239 18.2056C15.7514 18.1038 16.6163 17.6886 17.2759 17.0286L17.8488 16.4556C17.9758 16.3287 18.0765 16.1781 18.1452 16.0122C18.2139 15.8464 18.2493 15.6687 18.2493 15.4892C18.2493 15.3097 18.2139 15.1319 18.1452 14.9661C18.0765 14.8003 17.9758 14.6496 17.8488 14.5227L15.4322 12.108C15.3054 11.981 15.1547 11.8803 14.9889 11.8116C14.823 11.7429 14.6453 11.7075 14.4658 11.7075C14.2863 11.7075 14.1085 11.7429 13.9427 11.8116C13.7769 11.8803 13.6262 11.981 13.4993 12.108C13.2431 12.3641 12.8957 12.508 12.5334 12.508C12.1711 12.508 11.8236 12.3641 11.5674 12.108L7.70342 8.24312C7.44727 7.9869 7.30338 7.63943 7.30338 7.27713C7.30338 6.91484 7.44727 6.56737 7.70342 6.31115C7.83039 6.18426 7.93111 6.0336 7.99983 5.86777C8.06855 5.70195 8.10392 5.5242 8.10392 5.3447C8.10392 5.1652 8.06855 4.98746 7.99983 4.82163C7.93111 4.65581 7.83039 4.50515 7.70342 4.37826L5.28777 1.96352C5.03154 1.70737 4.68408 1.56348 4.32178 1.56348C3.95948 1.56348 3.61201 1.70737 3.35579 1.96352L2.78193 2.53646C2.12208 3.1961 1.70702 4.06112 1.60533 4.98858C1.50364 5.91604 1.72141 6.85044 2.22265 7.63739L2.22812 7.6465C4.8753 11.5631 8.24874 14.9359 12.1658 17.5824V17.5824Z" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="astro-xmivup5a"></path> </svg> </span> <a class="contact__link contact__link--accent astro-xmivup5a" href="tel:+32473/68.99.02" data-bind="globalComponents.contact.contactInfo.phone"> +32 473 / 68.99.02 </a> </li> <li class="contact__item astro-xmivup5a"> <span class="contact__item-icon contact__item-icon--location astro-xmivup5a" aria-hidden="true"> <svg width="16" height="19" viewBox="0 0 16 19" fill="none" xmlns="http://www.w3.org/2000/svg" class="astro-xmivup5a"> <path d="M14.7751 8.65382C14.7751 14.0327 9.26589 17.3464 8.121 17.9776C8.05758 18.0126 7.98632 18.0309 7.91389 18.0309C7.84146 18.0309 7.77021 18.0126 7.70678 17.9776C6.56103 17.3464 1.05356 14.0327 1.05356 8.65382C1.05356 4.36584 3.62634 1.36426 7.91432 1.36426C12.2023 1.36426 14.7751 4.36584 14.7751 8.65382Z" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="astro-xmivup5a"></path> <path d="M4.48396 8.2253C4.48396 9.1351 4.84538 10.0076 5.4887 10.6509C6.13202 11.2943 7.00455 11.6557 7.91434 11.6557C8.82414 11.6557 9.69667 11.2943 10.34 10.6509C10.9833 10.0076 11.3447 9.1351 11.3447 8.2253C11.3447 7.31551 10.9833 6.44298 10.34 5.79966C9.69667 5.15634 8.82414 4.79492 7.91434 4.79492C7.00455 4.79492 6.13202 5.15634 5.4887 5.79966C4.84538 6.44298 4.48396 7.31551 4.48396 8.2253V8.2253Z" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="astro-xmivup5a"></path> </svg> </span> <span class="contact__text astro-xmivup5a" data-bind="globalComponents.contact.contactInfo.location"> Région de Beauvechain, Belgique </span> </li> </ul> </aside> <div class="contact__panel astro-xmivup5a" aria-label="Formulaire de contact"> <form class="contact__form astro-xmivup5a" method="POST" action="https://api.web3forms.com/submit" novalidate> <!-- Web3Forms Access Key (public) --> <input type="hidden" name="access_key" value="c0bf4249-eab3-452c-93aa-ad5fc185f1ae" class="astro-xmivup5a"> <!-- Métadonnées utiles --> <input type="hidden" name="subject" value="Nouveau message depuis le site Oveco" class="astro-xmivup5a"> <input type="hidden" name="from_name" value="Formulaire Oveco" class="astro-xmivup5a"> <!-- Anti-spam honeypot (reste vide) --> <input type="text" name="botcheck" class="contact__hp astro-xmivup5a" tabindex="-1" autocomplete="off" aria-hidden="true"> <!-- Pas de page_url ni redirect pour forcer une réponse JSON au lieu de HTML --> <div class="contact__groups astro-xmivup5a">  <div class="contact__col astro-xmivup5a">  <div class="contact__field astro-xmivup5a"> <label class="contact__label astro-xmivup5a" for="contact-email" data-bind="globalComponents.contact.emailField.label"> Email <span class="required astro-xmivup5a" aria-label="requis">*</span> </label> <input id="contact-email" class="contact__input astro-xmivup5a" name="email" type="email" inputmode="email" autocomplete="email" placeholder="exemple@email.com" required aria-required="true" aria-describedby="contact-email-error" data-pattern="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" data-error-message="Veuillez entrer une adresse email valide (ex: exemple@domaine.com)" data-bind="globalComponents.contact.emailField.placeholder" data-bind-attr="placeholder"> <div id="contact-email-error" class="contact__error astro-xmivup5a" role="alert" aria-live="polite"></div> </div>  <div class="contact__field astro-xmivup5a"> <label class="contact__label astro-xmivup5a" for="contact-name" data-bind="globalComponents.contact.additionalFields.0.label"> Nom  </label> <input id="contact-name" class="contact__input astro-xmivup5a" name="name" type="text" inputmode="text" autocomplete="name" placeholder="Jean Dupont" aria-required="false" aria-describedby="contact-name-error" data-pattern="^[a-zA-ZÀ-ÿ\s'-]{2,}$" data-error-message="Veuillez entrer un nom valide (au moins 2 caractères)" data-bind="globalComponents.contact.additionalFields.0.placeholder" data-bind-attr="placeholder"> <div id="contact-name-error" class="contact__error astro-xmivup5a" role="alert" aria-live="polite"></div> </div><div class="contact__field astro-xmivup5a"> <label class="contact__label astro-xmivup5a" for="contact-phone" data-bind="globalComponents.contact.additionalFields.1.label"> Votre numéro de Tél.  </label> <input id="contact-phone" class="contact__input astro-xmivup5a" name="phone" type="tel" inputmode="tel" autocomplete="tel" placeholder="+32 400 10 10 10" aria-required="false" aria-describedby="contact-phone-error" data-pattern="^[+]?[(]?[0-9]{1,4}[)]?[-\s./0-9]*$" data-error-message="Veuillez entrer un numéro de téléphone valide" data-bind="globalComponents.contact.additionalFields.1.placeholder" data-bind-attr="placeholder"> <div id="contact-phone-error" class="contact__error astro-xmivup5a" role="alert" aria-live="polite"></div> </div> </div>   </div>  <div class="contact__field contact__field--message astro-xmivup5a"> <label class="contact__label astro-xmivup5a" for="contact-message" data-bind="globalComponents.contact.messageField.label"> Message <span class="required astro-xmivup5a" aria-label="requis">*</span> </label> <textarea id="contact-message" class="contact__textarea astro-xmivup5a" name="message" rows="6" placeholder="Votre message ici..." required aria-required="true" aria-describedby="contact-message-error" data-bind="globalComponents.contact.messageField.placeholder" data-bind-attr="placeholder"></textarea> <div id="contact-message-error" class="contact__error astro-xmivup5a" role="alert" aria-live="polite"></div> </div> <div class="contact__actions astro-xmivup5a"> <button type="submit" class="contact__submit astro-xmivup5a" aria-label="Envoyer le message de contact"> <span class="astro-xmivup5a">Envoyer</span> <svg class="contact__submit-icon astro-xmivup5a" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> <path d="M8 1L15 8L8 15M14 8H1" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="astro-xmivup5a"></path> </svg> </button> </div> <div class="contact__status astro-xmivup5a" role="status" aria-live="polite"></div> </form> <div class="contact__success astro-xmivup5a" role="status" aria-live="polite" hidden> <!-- Message injecté dynamiquement après succès --> </div> </div> </div> </div> </section>  <script type="module" src="/js/Contact.astro_astro_type_script_index_0_lang-DrP2d_Kg.js"></script> <footer class="footer astro-sz7xmlte" role="contentinfo" aria-label="Pied de page"> <div class="footer__container astro-sz7xmlte"> <p class="footer__copyright astro-sz7xmlte">
Copyright © 2026 Oveco. Tous droits réservés.
</p> <nav class="footer__legal astro-sz7xmlte" aria-label="Liens légaux"> <p class="footer__legal-text astro-sz7xmlte"> Tous droits réservés </p> </nav> </div> </footer>  <!-- Script de redirection automatique selon la langue sauvegardée ou du navigateur --> <script>
		// Fonction de redirection basée sur la langue
		function checkAndRedirectLanguage() {
			const pathname = window.location.pathname;
			const isEnglishPage = pathname.startsWith('/en/') || pathname === '/en';
			const isFrenchPage = !isEnglishPage;
			
			// Lire la langue sauvegardée dans le cookie
			const cookieMatch = document.cookie.match(/oveco-lang=([^;]+)/);
			const savedLang = cookieMatch ? cookieMatch[1] : null;
			
			// Debug (à retirer en prod)
			// console.log('[Lang] pathname:', pathname, 'savedLang:', savedLang, 'isEN:', isEnglishPage);
			
			// Si l'utilisateur a choisi l'anglais mais est sur une page FR -> rediriger vers EN
			if (savedLang === 'en' && isFrenchPage) {
				let newPath;
				if (pathname === '/' || pathname === '') {
					newPath = '/en/';
				} else {
					newPath = '/en' + pathname;
				}
				window.location.replace(newPath);
				return true;
			}
			
			// Si l'utilisateur a choisi le français mais est sur une page EN -> rediriger vers FR
			if (savedLang === 'fr' && isEnglishPage) {
				let newPath;
				const pathWithoutLang = pathname.replace(/^\/(en|es|de|nl)/, '');
				newPath = pathWithoutLang || '/';
				window.location.replace(newPath);
				return true;
			}
			
			// Si aucun choix n'a été fait, détecter la langue du navigateur (seulement au premier accès)
			if (!savedLang && isFrenchPage) {
				const browserLang = navigator.language || navigator.userLanguage || 'en';
				const primaryLang = browserLang.split('-')[0].toLowerCase();
				
				// Si navigateur non-FR et on est sur page FR -> rediriger vers EN
				if (primaryLang !== 'fr') {
					let newPath;
					if (pathname === '/' || pathname === '') {
						newPath = '/en/';
					} else {
						newPath = '/en' + pathname;
					}
					window.location.replace(newPath);
					return true;
				}
			}
			return false;
		}
		
		// Exécuter immédiatement
		checkAndRedirectLanguage();
		
		// Ré-exécuter lors des navigations View Transitions
		document.addEventListener('astro:page-load', checkAndRedirectLanguage);
		</script> <!-- Scripts d'animation désactivés temporairement --> </body></html>