/* MuurX site — shared core.
   Header (with Diensten dropdown), Footer, QuoteForm, Placeholder, data.
   Uses design-system components from the compiled bundle. */

const NS = window.MuurXDesignSystem_8b18fa;
const { Logo, Button, Icon, GoldRule, Overline, ContactStrip, CoreValuesBar, InclusionList, InfoBlock } = NS;

/* Path helpers — each page sets window.SITE_BASE ('' at site/ root, '../' one level down). */
const BASE = () => (window.SITE_BASE || '');
const url = (p) => BASE() + p;
const ASSET_BASE = () => BASE();

/* Referral-attributie: ?ref=CODE onthouden zodat het offerteformulier weet
   via wie de bezoeker binnenkwam (zie REFERRAL-SYSTEM.md). */
(function () {
  try {
    const ref = new URLSearchParams(window.location.search).get('ref');
    if (ref) localStorage.setItem('muurx_ref', ref.toUpperCase());
  } catch (e) { /* localStorage niet beschikbaar */ }
})();
const getRefCode = () => {
  try { return localStorage.getItem('muurx_ref') || ''; } catch (e) { return ''; }
};

/* ---------------- Bedrijfsgegevens (voor facturen & privacyverklaring) ----------------
   TODO: vul de echte gegevens in. Deze verschijnen als afzender ("Aan") op de
   uitbetaal-facturen en in de privacyverklaring. */
const MUURX_BEDRIJF = {
  naam: 'MuurX',
  adres: 'Dekemastraat 5',
  postcode: '8804 NZ',
  plaats: 'Tzum',
  land: 'Nederland',
  kvk: '99605228',
  btw: 'NL005033282B20',
  iban: '',             // bewust leeg: MuurX-IBAN hoeft niet op deze factuur (klant is begunstigde)
  email: 'muurx.info@gmail.com',
  telefoon: '06 38144883',
};

/* ---------------- Services data ---------------- */
const SERVICES = [
  {
    slug: 'stucwerk', title: 'Stucwerk', icon: 'stucwerk',
    short: 'Strak stucwerk voor wanden en plafonds, sausklaar of behangklaar opgeleverd.',
    intro: 'Strak stucwerk voor wanden en plafonds. Wij zorgen voor een egale, duurzame ondergrond, sausklaar of behangklaar opgeleverd en tot in de kleinste hoek perfect afgewerkt.',
    doen: ['Wanden en plafonds stucen', 'Sausklaar opleveren', 'Behangklaar opleveren', 'Repareren van beschadigingen en scheuren'],
    inclusion: [
      { label: 'Inclusief materiaal & plaatsing' },
      { label: 'Voorbereiden & afplakken' },
      { label: 'Sausklaar of behangklaar oplevering' },
      { label: 'Afval afvoeren', included: false },
    ],
    packages: [
      { id: 'home', segment: 'particulier', title: 'Home Package', subtitle: 'Ideaal voor een complete kamer of kleine woning.', size: '20 – 35 m²', price: '€ 1.000', unit: 'compleet', features: ['Inclusief materiaal & hoekprofielen', 'Afplakken & schoonmaken inbegrepen', 'Afval afvoeren inbegrepen'] },
      { id: 'complete-home', segment: 'particulier', title: 'Complete Home Package', subtitle: 'Voor complete woonruimtes met een hoogwaardige afwerking.', size: '36 – 49 m²', price: '€ 1.500', unit: 'compleet', features: ['Inclusief materiaal & hoekprofielen', 'Afplakken & schoonmaken inbegrepen', 'Afval afvoeren inbegrepen'] },
      { id: 'small', segment: 'particulier', title: 'Small Projects', subtitle: 'Voor kleine reparaties en renovaties.', size: 'Tot 19 m²', price: '€ 500', unit: 'compleet', features: ['Inclusief materiaal & hoekprofielen', 'Afplakken & schoonmaken inbegrepen', 'Kleiner dan 20 m²: offerte op maat'] },
      { id: 'project', segment: 'beide', title: 'Project Package', subtitle: 'Ideaal voor grotere renovatie- en nieuwbouwprojecten.', size: '50 – 249 m²', price: '€ 21', unit: 'per m²', features: ['Inclusief materiaal', 'Excl. hoekprofielen & afplakken', 'Excl. afval afvoeren & btw'] },
      { id: 'signature', segment: 'particulier', title: 'MuurX Signature', subtitle: 'Voor stenen muren die een dikkere stuclaag nodig hebben (meer dan 5 mm).', size: 'Vanaf 30 m²', price: '€ 35', unit: 'per m²', features: ['Professionele voorbereiding', 'Hoogwaardige materialen', 'Afwerking op maat'] },
      { id: 'business', segment: 'zakelijk', title: 'Business Package', subtitle: 'Geschikt voor zakelijke projecten en grotere oppervlakken.', size: '250 – 499 m²', price: '€ 20', unit: 'per m²', features: ['Inclusief materiaal', 'Excl. hoekprofielen & afplakken', 'Excl. afval afvoeren & btw'] },
      { id: 'commercial', segment: 'zakelijk', title: 'Commercial Package', subtitle: 'Geschikt voor commerciële projecten en zeer grote oppervlakken.', size: '500 – 999 m²', price: '€ 19', unit: 'per m²', features: ['Inclusief materiaal', 'Excl. hoekprofielen & afplakken', 'Excl. afval afvoeren & btw'] },
      { id: 'enterprise', segment: 'zakelijk', title: 'Enterprise Package', subtitle: 'Voor grootschalige projecten vanaf 1.000 m² en meer.', size: 'Vanaf 1.000 m²', price: '€ 18', unit: 'per m²', features: ['Inclusief materiaal', 'Excl. hoekprofielen & afplakken', 'Excl. afval afvoeren & btw'] },
      { id: 'prestige', segment: 'zakelijk', title: 'Prestige Package', subtitle: 'Voor grootschalige projecten vanaf 5.000 m² en meer.', size: 'Vanaf 5.000 m²', price: '€ 17', unit: 'per m²', features: ['Inclusief materiaal', 'Excl. hoekprofielen & afplakken', 'Excl. afval afvoeren & btw'] },
    ],
    addon: { title: 'Hoekprofielen', price: '€ 7,50 per strekkende meter', note: 'Inclusief materiaal en plaatsing. BTW: 9% voor woningen ouder dan 2,5 jaar, 21% voor nieuwbouw.' },
    beforeAfter: [
      'uploads/2.png',
      'uploads/3.png',
      'uploads/4.png',
    ],
  },
  {
    slug: 'dunpleister', title: 'Dunpleister', icon: 'pleisterwerk',
    short: 'Moderne dunpleister voor een glad en strak resultaat, ideaal voor nieuwbouw.',
    intro: 'Moderne dunpleister voor een supergladde, strakke wand. Ideaal voor nieuwbouw en gladde ondergronden waar een dunne, egale laag volstaat. Snel aangebracht, prachtig resultaat.',
    doen: ['Dunpleister op nieuwbouw-ondergronden', 'Gladde, strakke afwerking in één systeem', 'Naadloze aansluiting op plafonds en hoeken', 'Advies over de juiste ondergrond'],
    inclusion: [
      { label: 'Inclusief materiaal & plaatsing' },
      { label: 'Stofarm werken' },
      { label: 'Sausklare oplevering' },
      { label: 'Voorstrijken indien nodig' },
    ],
  },
  {
    slug: 'schilderwerk', title: 'Schilderwerk', icon: 'schilderwerk',
    short: 'Professioneel schilderwerk voor binnen en buiten, met oog voor detail.',
    intro: 'Professioneel schilderwerk voor binnen én buiten. Een nette, egale afwerking met oog voor detail, duurzame verfsystemen en strakke lijnen, precies zoals u het voor ogen heeft.',
    doen: ['Binnen- en buitenschilderwerk', 'Houtrot herstellen en gronden', 'Latex- en lakwerk', 'Kleuradvies op maat'],
    inclusion: [
      { label: 'Inclusief materiaal & plaatsing' },
      { label: 'Afplakken & afdekken' },
      { label: 'Twee lagen waar nodig' },
      { label: 'Behang verwijderen', included: false },
    ],
  },
];
const serviceBySlug = (s) => SERVICES.find((x) => x.slug === s);

/* ---------------- Blog data ---------------- */
const BLOGS = [
  {
    slug: 'vochtproblemen-stucwerk', cat: 'Stucwerk & muurverzorging', date: '2 juni 2025',
    title: 'Vochtproblemen en schade: veelvoorkomende fouten in stucwerk',
    excerpt: 'Vochtplekken, bladderend stucwerk of scheuren zijn vaak het gevolg van een verkeerde voorbereiding. Wij leggen uit waar het misgaat en hoe u het voorkomt.',
    body: [
      { p: 'Weinig zaken zijn zo vervelend als vochtplekken die telkens terugkomen of stucwerk dat na een paar maanden loslaat. In veel gevallen ligt de oorzaak niet bij het vocht zelf, maar bij een verkeerde voorbereiding of een te snelle uitvoering.' },
      { h: 'De meest gemaakte fouten' },
      { ul: ['Stucen op een vochtige of onvoldoende uitgeharde ondergrond', 'Geen of het verkeerde voorstrijkmiddel gebruiken', 'De onderliggende oorzaak van het vocht niet aanpakken', 'Te dik pleisteren, waardoor de laag niet goed droogt'] },
      { p: 'Elke fout lijkt klein, maar het resultaat is telkens hetzelfde: schade die terugkomt en werk dat opnieuw moet gebeuren. Goed stucwerk begint daarom altijd met een droge, stabiele en goed voorbereide ondergrond.' },
      { h: 'Hoe wij dit voorkomen' },
      { p: 'Wij beoordelen eerst de ondergrond en de oorzaak van het vocht voordat er ook maar één laag op gaat. Pas als de basis klopt, brengen wij het stucwerk aan met het juiste materiaal, de juiste opbouw en voldoende droogtijd. Zo krijgt u een strak resultaat dat blijft zitten. Goed stucwerk ziet u namelijk niet aan de bovenlaag, maar aan wat eronder zit. Een ondergrond die klopt, is de beste garantie tegen scheuren en vlekken later.' },
      { p: 'Twijfelt u of uw muur klaar is voor een nieuwe laag stucwerk? Laat de ondergrond beoordelen voordat er gepleisterd wordt. Een korte inspectie voorkomt kosten en teleurstelling achteraf, en geeft u vooraf duidelijkheid over de aanpak en de planning.' },
    ],
  },
  {
    slug: 'muurx-ambassadeur', cat: 'Samenwerken met MuurX', date: '19 mei 2025',
    title: 'Word MuurX-ambassadeur en verdien samen',
    excerpt: 'Kent u iemand die een klus wil laten uitvoeren? Verwijs ze door en verdien mee. Ontdek hoe ons ambassadeursprogramma werkt.',
    body: [
      { p: 'Tevreden klanten zijn onze beste ambassadeurs. Daarom belonen wij het als u ons aanbeveelt bij familie, vrienden of kennissen. Met het MuurX-ambassadeursprogramma verdient u mee aan elke klant die u bij ons aandraagt.' },
      { h: 'Hoe het werkt' },
      { ul: ['U verwijst iemand naar MuurX', 'Wij voeren de klus vakkundig uit', 'U verdient € 1,- per opgeleverde vierkante meter'] },
      { p: 'Zo simpel is het. Hoe groter het project dat u aandraagt, hoe meer u eraan overhoudt. Geen ingewikkelde voorwaarden, geen kleine lettertjes, gewoon een eerlijke beloning voor uw vertrouwen.' },
      { p: 'Binnenkort kunt u uw verwijzingen en verdiensten volgen in uw persoonlijke MuurX-dashboard. Interesse? Neem contact met ons op en word ambassadeur.' },
      { h: 'Voor wie is dit interessant?' },
      { p: 'Of u nu buren heeft die net een verbouwing plannen, familie die een nieuwe woning betrekt of vrienden die al jaren tegen een klus aanlopen. Iedere verwijzing telt mee, ongeacht de grootte van het project. U hoeft niets te regelen; wij nemen het contact en de uitvoering volledig uit handen.' },
    ],
  },
  {
    slug: 'muurverzorging-maatwerk', cat: 'Stucwerk & muurverzorging', date: '28 april 2025',
    title: 'Muurverzorging: het belang van maatwerk en voorbereiding',
    excerpt: 'Elke muur is anders. Waarom een aanpak op maat en een goede voorbereiding het verschil maken tussen een gemiddeld en een perfect resultaat.',
    body: [
      { p: 'Geen enkele muur is hetzelfde. De ondergrond, de leeftijd van de woning en het gewenste eindresultaat bepalen samen welke aanpak nodig is. Wie dat negeert, levert middelmatig werk. Wie er rekening mee houdt, levert vakwerk.' },
      { h: 'Maatwerk begint met kijken' },
      { p: 'Voordat wij starten, beoordelen wij de staat van de muur: is hij glad of ruw, droog of vochtig, nieuw of gerenoveerd? Op basis daarvan kiezen wij het juiste systeem, van dunpleister tot een volledige stuclaag.' },
      { h: 'Voorbereiding is het halve werk' },
      { ul: ['De muur reinigen en herstellen waar nodig', 'De juiste voorstrijk aanbrengen', 'De ruimte netjes afdekken en afplakken', 'Rekening houden met droogtijden'] },
      { p: 'Deze stappen kosten tijd, maar betalen zich altijd terug in een strakker en duurzamer resultaat. Kwaliteit is geen toeval, het is voorbereiding.' },
      { h: 'Elke muur verdient een eigen aanpak' },
      { p: 'Een muur in een jaren-dertig woning vraagt om een andere behandeling dan een gipsplaat in een nieuwbouwwoning. Door dit onderscheid vooraf te maken, voorkomen wij verrassingen tijdens de uitvoering en garanderen wij een resultaat dat aansluit bij de rest van uw woning.' },
    ],
  },
  {
    slug: 'impact-schilderwerk', cat: 'Schilderwerk & afwerking', date: '11 april 2025',
    title: 'De impact van professioneel schilderwerk op ruimtes',
    excerpt: 'Een frisse laag verf doet meer dan u denkt. Over hoe professioneel schilderwerk een ruimte laat ademen, beschermt en verrijkt.',
    body: [
      { p: 'Verf is meer dan kleur. Goed schilderwerk bepaalt de sfeer van een ruimte, beschermt uw wanden en kozijnen en geeft uw woning een verzorgde uitstraling. Het verschil tussen amateur- en vakwerk zit in de details.' },
      { h: 'Meer dan alleen kleur' },
      { ul: ['Strakke, scherpe lijnen langs randen en kozijnen', 'Een egale, dekkende afwerking zonder strepen', 'Duurzame verfsystemen die jarenlang meegaan', 'Bescherming tegen vocht, slijtage en vuil'] },
      { p: 'Een professioneel geschilderde ruimte voelt direct anders: rustiger, lichter en completer. Dat effect ontstaat niet vanzelf, maar door de juiste voorbereiding en een zorgvuldige uitvoering. Een goede schilder verkoopt namelijk geen verf, maar rust en ruimte. Het resultaat dat u koopt is de sfeer die overblijft nadat het werk klaar is.' },
      { h: 'Waarom voorbereiding het verschil maakt' },
      { p: 'Schuren, plamuren, ontvetten en de juiste grondlaag: het onzichtbare werk vóór het schilderen bepaalt minstens zoveel als de verflaag zelf. Sla je deze stappen over, dan zie je dat vroeg of laat terug in loskomende verf, zichtbare naden of een ongelijke glans.' },
      { p: 'Wij nemen de tijd voor deze voorbereiding bij elk project, groot of klein, zodat het eindresultaat niet alleen bij oplevering maar ook jaren later nog overtuigt.' },
    ],
  },
  {
    slug: 'investeren-vakmanschap', cat: 'Vakmanschap & kwaliteit', date: '24 maart 2025',
    title: 'De voordelen van investeren in vakmanschap voor uw woning',
    excerpt: 'Vakwerk kost meer dan een snelle klus, maar levert op de lange termijn veel meer op. Een blik op de waarde van echt vakmanschap.',
    body: [
      { p: 'Investeren in vakmanschap lijkt op korte termijn duurder, maar is op lange termijn bijna altijd voordeliger. Goed werk gaat langer mee, ziet er beter uit en voorkomt dure herstelkosten.' },
      { h: 'Waar u op de lange termijn van profiteert' },
      { ul: ['Minder onderhoud en herstel achteraf', 'Een hogere waarde van uw woning', 'Een strak resultaat dat jaren mooi blijft', 'Rust: het is in één keer goed gedaan'] },
      { p: 'Bij MuurX werken wij uitsluitend met ervaren vakmensen die trots zijn op hun werk. Die trots ziet u terug in elk detail en voelt u jarenlang in uw woning.' },
      { h: 'Vakmanschap is een investering, geen kostenpost' },
      { p: 'Een goedkope oplossing die na twee jaar weer hersteld moet worden, is uiteindelijk duurder dan vakwerk dat in één keer goed staat. Wij nemen daarom de tijd om het project goed te doorgronden, zodat u niet over een paar jaar weer voor dezelfde klus staat.' },
    ],
  },
  {
    slug: 'stucwerk-metselwerk-essentieel', cat: 'Vakmanschap & kwaliteit', date: '9 maart 2025',
    title: 'Waarom goed stucwerk en metselwerk essentieel is voor uw woning',
    excerpt: 'Stucwerk en metselwerk vormen letterlijk de basis van uw huis. Waarom kwaliteit hier geen luxe is, maar noodzaak.',
    body: [
      { p: 'Stucwerk en metselwerk zijn geen afwerking die u er even bij doet, ze vormen de basis en de bescherming van uw woning. Wanneer die basis klopt, staat de rest als een huis.' },
      { h: 'De basis van een gezonde woning' },
      { p: 'Strak metselwerk zorgt voor stevigheid en een nette gevel. Goed stucwerk beschermt de muren, egaliseert de ondergrond en maakt uw interieur af. Samen bepalen ze de uitstraling én de levensduur van uw huis.' },
      { h: 'Kwaliteit die u terugziet' },
      { ul: ['Stevige, nauwkeurige constructies', 'Egale wanden zonder scheuren of oneffenheden', 'Bescherming tegen vocht en slijtage', 'Een verzorgde uitstraling, binnen en buiten'] },
      { p: 'Kies daarom nooit voor de snelste of goedkoopste oplossing als het om de basis van uw woning gaat. Kies voor vakwerk dat blijft.' },
      { h: 'Onderhoud voorkomt grotere schade' },
      { p: 'Kleine scheuren, loszittende voegen of vochtplekken zijn vaak het eerste signaal dat er iets mis is met de basis van uw woning. Grijp op tijd in en de reparatie blijft klein; wacht te lang en de schade en de kosten lopen op.' },
    ],
  },
];
const blogBySlug = (s) => BLOGS.find((x) => x.slug === s);

function BlogThumb({ slug, w = 62, h = 56 }) {
  const photo = PHOTOS['blog-' + slug];
  if (photo) {
    return (
      <span data-photo-id={'blog-' + slug} style={{ width: w, height: h, flex: 'none', display: 'block', borderRadius: 'var(--radius-sm)', overflow: 'hidden', border: '1px solid var(--border-subtle)' }}>
        <img src={url(photo)} alt="" style={{ width: '100%', height: '100%', objectFit: 'cover', objectPosition: 'center', display: 'block' }} />
      </span>
    );
  }
  return (
    <span data-photo-id={'blog-' + slug} style={{ width: w, height: h, flex: 'none', display: 'grid', placeItems: 'center', borderRadius: 'var(--radius-sm)', background: 'linear-gradient(135deg,#16161A,#0B0B0C)', border: '1px solid var(--border-subtle)', overflow: 'hidden' }}>
      <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="var(--muurx-gold)" strokeWidth="1.3" strokeLinecap="round" strokeLinejoin="round" style={{ opacity: 0.85 }}>
        <path d="M3 8a2 2 0 0 1 2-2h2l1.5-2h7L19 6a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" /><circle cx="12" cy="12.5" r="3.2" />
      </svg>
    </span>
  );
}

function FooterBlogLink({ b }) {
  const [h, setH] = React.useState(false);
  return (
    <a href={url('blog/' + b.slug + '.html')} onMouseEnter={() => setH(true)} onMouseLeave={() => setH(false)}
      style={{ display: 'flex', gap: 13, alignItems: 'center', textDecoration: 'none' }}>
      <BlogThumb slug={b.slug} />
      <span style={{ minWidth: 0 }}>
        <span style={{ display: 'block', fontFamily: 'var(--font-sans)', fontWeight: 500, fontSize: 13, lineHeight: 1.35, color: h ? 'var(--muurx-gold)' : 'var(--muurx-white)', transition: 'color 160ms' }}>{b.title}</span>
        <span style={{ display: 'block', fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 11, color: 'var(--muurx-muted)', marginTop: 4 }}>{b.date}</span>
      </span>
    </a>
  );
}

/* ---------------- Photo placeholder ---------------- */
/* Real photos supplied so far, keyed by placeholder id. Add more as they come in. */
const PHOTOS = {
  'hero-bg': 'uploads/Muurx Bus hero sectie.webp',
  'over-team': 'uploads/Muur X Wand BeforeAfter.webp',
  'card-stucwerk': 'uploads/Stucwerk Dienst image.jpeg',
  'svc-hero-stucwerk': 'uploads/Stucwerk Dienst image.jpeg',
  'svc-work-stucwerk': 'uploads/Stucwerk Dienst image.jpeg',
  'card-dunpleister': 'uploads/Diensten Muurx  (1).webp',
  'card-schilderwerk': 'uploads/Schilderwerk.webp',
  'blog-vochtproblemen-stucwerk': 'uploads/blog-vochtproblemen-stucwerk.webp',
  'blog-muurx-ambassadeur': 'uploads/blog-muurx-ambassadeur.jpg',
  'blog-muurverzorging-maatwerk': 'uploads/WhatsApp Image 2026-07-09 at 15.43.19 (11).jpeg',
  'blog-impact-schilderwerk': 'uploads/blog-impact-schilderwerk.jpg',
  'blog-investeren-vakmanschap': 'uploads/blog-investeren-vakmanschap.webp',
  'blog-stucwerk-metselwerk-essentieel': 'uploads/blog-stucwerk-metselwerk-essentieel.webp',
};

function Placeholder({ id, ratio = '16 / 9', label, size, radius = 'var(--radius-md)', style }) {
  const photo = PHOTOS[id];
  if (photo) {
    return (
      <div
        data-photo-id={id}
        style={{
          position: 'relative', aspectRatio: ratio, width: '100%',
          borderRadius: radius, overflow: 'hidden', ...style,
        }}
      >
        <img
          src={url(photo)}
          alt=""
          style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', objectFit: 'cover', objectPosition: 'center' }}
        />
      </div>
    );
  }
  return (
    <div
      data-photo-id={id}
      style={{
        position: 'relative', aspectRatio: ratio, width: '100%',
        background: 'linear-gradient(135deg,#141418 0%,#0C0C0E 100%)',
        border: '1px dashed var(--hairline-strong)', borderRadius: radius,
        display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center',
        gap: 10, overflow: 'hidden', textAlign: 'center', padding: 20, ...style,
      }}
    >
      <svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="var(--muurx-gold)" strokeWidth="1.3" strokeLinecap="round" strokeLinejoin="round" style={{ opacity: 0.9 }}>
        <path d="M3 8a2 2 0 0 1 2-2h2l1.5-2h7L19 6h0a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
        <circle cx="12" cy="12.5" r="3.4" />
      </svg>
      <div style={{ fontFamily: 'var(--font-sans)', fontWeight: 600, fontSize: 12, letterSpacing: '0.16em', textTransform: 'uppercase', color: 'var(--muurx-gold)' }}>Foto placeholder</div>
      {label && <div style={{ fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 12, lineHeight: 1.5, color: 'var(--muurx-gray)', maxWidth: '38ch' }}>{label}</div>}
      <div style={{ fontFamily: 'var(--font-sans)', fontSize: 10, letterSpacing: '0.12em', color: 'var(--muurx-muted)' }}>
        id: {id}{size ? ' · ' + size : ''}
      </div>
    </div>
  );
}

/* ---------------- Nederland kaart (werkgebied) ---------------- */
/* Gefacetteerde, minimalistische NL-outline — strak en architecturaal, goud op transparant. */
const NL_PATH = 'M188,8 L222,24 L242,52 L232,72 L252,88 L268,112 L252,138 L268,158 L250,182 L266,204 L248,226 L258,252 L240,272 L248,300 L226,330 L232,358 L206,376 L182,354 L192,328 L172,310 L178,284 L152,296 L128,318 L98,326 L72,308 L58,282 L74,264 L52,248 L68,228 L46,214 L64,194 L52,172 L72,156 L64,132 L84,116 L70,92 L92,72 L82,48 L108,34 L96,58 L118,74 L108,96 L134,88 L128,60 L152,44 L146,20 L172,28 Z';
const NL_PINS = [
  { x: 168, y: 46, label: 'Tzum (Friesland)' },
  { x: 100, y: 210, label: 'Randstad' },
  { x: 150, y: 300, label: 'Noord-Brabant' },
  { x: 210, y: 340, label: 'Limburg' },
];

function NLMap({ style }) {
  return (
    <div style={{
      position: 'relative', aspectRatio: '3 / 4', width: '100%',
      border: '1px solid var(--hairline)', borderRadius: 'var(--radius-md)',
      background: 'transparent', display: 'flex', alignItems: 'center', justifyContent: 'center',
      padding: 28, boxSizing: 'border-box', ...style,
    }}>
      <svg viewBox="0 0 300 380" style={{ width: '100%', height: '100%', maxWidth: 280 }} aria-hidden="true">
        <defs>
          <radialGradient id="nlGlow" cx="50%" cy="45%" r="65%">
            <stop offset="0%" stopColor="var(--muurx-gold)" stopOpacity="0.16" />
            <stop offset="100%" stopColor="var(--muurx-gold)" stopOpacity="0" />
          </radialGradient>
          <filter id="nlPinGlow" x="-200%" y="-200%" width="500%" height="500%">
            <feGaussianBlur stdDeviation="4" result="blur" />
            <feMerge>
              <feMergeNode in="blur" />
              <feMergeNode in="SourceGraphic" />
            </feMerge>
          </filter>
        </defs>
        <path d={NL_PATH} fill="url(#nlGlow)" />
        <path d={NL_PATH} fill="none" stroke="var(--muurx-gold)" strokeWidth="1.4" strokeLinejoin="round" />
        {NL_PINS.map((p, i) => (
          <circle key={i} cx={p.x} cy={p.y} r="4.2" fill="var(--muurx-gold)" filter="url(#nlPinGlow)">
            <title>{p.label}</title>
          </circle>
        ))}
      </svg>
    </div>
  );
}

/* ---------------- Free quote form ---------------- */
function QuoteForm({ compact = false }) {
  const [sent, setSent] = React.useState(false);
  const [sending, setSending] = React.useState(false);
  const [err, setErr] = React.useState(null);
  const [f, setF] = React.useState({ naam: '', tel: '', email: '', dienst: '', m2: '', bericht: '' });
  const set = (k) => (e) => setF({ ...f, [k]: e.target.value });

  const submit = async (e) => {
    e.preventDefault();
    if (sending) return;
    setSending(true); setErr(null);
    const cfg = window.MUURX_CONFIG || {};
    const dienstLabel = (serviceBySlug(f.dienst) || {}).title || f.dienst;
    try {
      const res = await fetch(cfg.SUPABASE_URL + '/functions/v1/nieuwe-offerte', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + cfg.SUPABASE_ANON_KEY, apikey: cfg.SUPABASE_ANON_KEY },
        body: JSON.stringify({ naam: f.naam, telefoon: f.tel, email: f.email, dienst: dienstLabel, m2: f.m2, bericht: f.bericht }),
      });
      const data = await res.json().catch(() => ({}));
      if (!res.ok) { setErr(data.error || 'Verzenden mislukt. Probeer het later opnieuw of bel ons.'); setSending(false); return; }
      setSent(true);
    } catch (_) {
      setErr('Verzenden mislukt. Controleer uw verbinding of bel ons direct.');
    }
    setSending(false);
  };

  const field = {
    width: '100%', padding: '13px 14px', background: 'var(--muurx-black)',
    border: '1px solid var(--border-subtle)', borderRadius: 'var(--radius-sm)',
    color: 'var(--muurx-white)', fontFamily: 'var(--font-sans)', fontSize: 14, fontWeight: 300,
    outline: 'none', boxSizing: 'border-box',
  };
  const labelS = { fontFamily: 'var(--font-sans)', fontSize: 11, fontWeight: 500, letterSpacing: '0.12em', textTransform: 'uppercase', color: 'var(--muurx-gray)', marginBottom: 7, display: 'block' };
  const focus = (e) => { e.target.style.borderColor = 'var(--hairline-strong)'; };
  const blur = (e) => { e.target.style.borderColor = 'var(--border-subtle)'; };

  return (
    <div style={{
      position: 'relative', background: 'var(--muurx-panel)', border: '1px solid var(--border-subtle)',
      borderRadius: 'var(--radius-lg)', padding: 30, boxShadow: 'var(--shadow-lg)', overflow: 'hidden',
    }}>
      <div aria-hidden="true" style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 3, background: 'var(--muurx-gradient-gold)' }} />
      {sent ? (
        <div style={{ padding: '30px 6px', textAlign: 'center' }}>
          <div style={{ width: 54, height: 54, margin: '0 auto 18px', display: 'grid', placeItems: 'center', border: '1px solid var(--hairline-strong)', borderRadius: '50%' }}>
            <Icon name="check" size={26} strokeWidth={1.8} />
          </div>
          <h3 style={{ margin: '0 0 8px', fontFamily: 'var(--font-sans)', fontWeight: 600, fontSize: 22, color: 'var(--muurx-white)' }}>Bedankt!</h3>
          <p style={{ margin: 0, fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 14, lineHeight: 1.6, color: 'var(--muurx-gray)' }}>
            Wij hebben uw aanvraag ontvangen en nemen binnen 24 uur contact met u op.
          </p>
        </div>
      ) : (
        <React.Fragment>
          <div style={{ marginBottom: 6 }}><Overline tick={false}>Gratis &amp; vrijblijvend</Overline></div>
          <h3 style={{ margin: '8px 0 4px', fontFamily: 'var(--font-sans)', fontWeight: 700, fontSize: 26, lineHeight: 1.1, color: 'var(--muurx-white)' }}>Vraag uw offerte aan</h3>
          <p style={{ margin: '0 0 22px', fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 13, color: 'var(--muurx-gray)' }}>Reactie binnen 24 uur, geen kleine lettertjes.</p>
          <form onSubmit={submit} style={{ display: 'flex', flexDirection: 'column', gap: 15 }}>
            {err && <div style={{ margin: 0, padding: '11px 14px', borderRadius: 'var(--radius-sm)', border: '1px solid rgba(220,80,80,0.45)', background: 'rgba(220,80,80,0.08)', fontFamily: 'var(--font-sans)', fontSize: 13, fontWeight: 300, lineHeight: 1.5, color: '#E89B9B' }}>{err}</div>}
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }} className="mx-form-row">
              <div><label style={labelS}>Naam</label><input required value={f.naam} onChange={set('naam')} onFocus={focus} onBlur={blur} style={field} placeholder="Uw naam" /></div>
              <div><label style={labelS}>Telefoon</label><input required value={f.tel} onChange={set('tel')} onFocus={focus} onBlur={blur} style={field} placeholder="06 …" /></div>
            </div>
            <div><label style={labelS}>E-mail</label><input required type="email" value={f.email} onChange={set('email')} onFocus={focus} onBlur={blur} style={field} placeholder="naam@voorbeeld.nl" /></div>
            <div style={{ display: 'grid', gridTemplateColumns: '1.4fr 1fr', gap: 12 }} className="mx-form-row">
              <div><label style={labelS}>Dienst</label>
                <select required value={f.dienst} onChange={set('dienst')} onFocus={focus} onBlur={blur} style={{ ...field, appearance: 'none' }}>
                  <option value="" disabled>Kies een dienst</option>
                  {SERVICES.map((s) => <option key={s.slug} value={s.slug}>{s.title}</option>)}
                </select>
              </div>
              <div><label style={labelS}>Oppervlakte m² (optioneel)</label><input value={f.m2} onChange={set('m2')} onFocus={focus} onBlur={blur} style={field} placeholder="bijv. 40" /></div>
            </div>
            {!compact && (
              <div><label style={labelS}>Bericht</label><textarea value={f.bericht} onChange={set('bericht')} onFocus={focus} onBlur={blur} rows={3} style={{ ...field, resize: 'vertical' }} placeholder="Vertel kort over uw project…" /></div>
            )}
            <button type="submit" disabled={sending} style={{
              display: 'inline-flex', alignItems: 'center', justifyContent: 'center', gap: 12,
              width: '100%', padding: '16px 24px', marginTop: 4, cursor: sending ? 'default' : 'pointer',
              background: 'var(--muurx-gradient-gold)', color: '#141210', border: 'none', borderRadius: 'var(--radius-sm)',
              fontFamily: 'var(--font-sans)', fontWeight: 700, fontSize: 13, letterSpacing: '0.16em', textTransform: 'uppercase',
              boxShadow: 'var(--glow-gold-soft)', opacity: sending ? 0.6 : 1,
            }}
              onMouseEnter={(e) => { if (!sending) { e.currentTarget.style.boxShadow = 'var(--glow-gold)'; e.currentTarget.style.transform = 'translateY(-1px)'; } }}
              onMouseLeave={(e) => { e.currentTarget.style.boxShadow = 'var(--glow-gold-soft)'; e.currentTarget.style.transform = 'none'; }}
            >
              {sending ? 'Verzenden…' : 'Vraag gratis offerte aan'}
              {!sending && <Icon name="arrowRight" size={16} strokeWidth={1.8} color="#141210" />}
            </button>
            <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 8, marginTop: 2 }}>
              <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="var(--muurx-muted)" strokeWidth="1.6"><rect x="4" y="10" width="16" height="10" rx="2"/><path d="M8 10V7a4 4 0 0 1 8 0v3"/></svg>
              <span style={{ fontFamily: 'var(--font-sans)', fontSize: 11, letterSpacing: '0.08em', color: 'var(--muurx-muted)' }}>Uw gegevens worden veilig en vertrouwelijk behandeld</span>
            </div>
            {getRefCode() && (
              <div style={{ textAlign: 'center', marginTop: 4 }}>
                <span style={{ fontFamily: 'var(--font-sans)', fontSize: 11, letterSpacing: '0.08em', color: 'var(--muurx-muted)' }}>
                  Doorverwezen met code <span style={{ color: 'var(--muurx-gold)' }}>{getRefCode()}</span>
                </span>
              </div>
            )}
          </form>
        </React.Fragment>
      )}
    </div>
  );
}

/* ---------------- Header + Diensten dropdown ---------------- */
function SiteHeader({ active }) {
  const [open, setOpen] = React.useState(false);
  const [menu, setMenu] = React.useState(false);
  const navLink = (active) => ({
    fontFamily: 'var(--font-sans)', fontSize: 12, fontWeight: 500, letterSpacing: '0.14em',
    textTransform: 'uppercase', color: active ? 'var(--muurx-white)' : 'var(--muurx-gray)',
    textDecoration: 'none', cursor: 'pointer', padding: '8px 0', whiteSpace: 'nowrap',
  });
  const mobLink = (isActive) => ({
    display: 'block', padding: '13px 4px', fontFamily: 'var(--font-sans)', fontSize: 14, fontWeight: 500,
    letterSpacing: '0.12em', textTransform: 'uppercase', textDecoration: 'none',
    color: isActive ? 'var(--muurx-gold)' : 'var(--muurx-white)',
    borderBottom: '1px solid var(--border-subtle)',
  });
  const close = () => setMenu(false);
  /* Homepage-section items: smooth-scroll when already on the homepage,
     otherwise navigate to the homepage and jump to the section. */
  const onHome = active === 'home';
  const sectionLink = (hash) => (onHome ? '#' + hash : url('index.html') + '#' + hash);
  const homeClick = (e) => { if (onHome) { e.preventDefault(); window.scrollTo({ top: 0, behavior: 'smooth' }); } close(); };
  return (
    <React.Fragment>
    {menu && <div className="mx-menu-overlay" onClick={close} aria-hidden="true" style={{ position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.72)', zIndex: 40 }} />}
    <header className="mx-header" style={{
      position: 'sticky', top: 0, zIndex: 50, display: 'flex', alignItems: 'center', justifyContent: 'space-between',
      padding: '16px 32px', background: 'rgba(11,11,12,0.85)', backdropFilter: 'blur(12px)',
      borderBottom: '1px solid var(--border-subtle)',
    }}>
      <a href={url('index.html')} style={{ display: 'block' }}><Logo height={34} assetBase={ASSET_BASE()} /></a>
      <nav className="mx-nav-desktop" style={{ display: 'flex', alignItems: 'center', gap: 22 }}>
        <a href={url('index.html')} onClick={homeClick} style={navLink(active === 'home')}>Home</a>
        <div style={{ position: 'relative' }} onMouseEnter={() => setOpen(true)} onMouseLeave={() => setOpen(false)}>
          <span style={{ ...navLink(active === 'diensten'), display: 'inline-flex', alignItems: 'center', gap: 6 }}>
            Diensten
            <svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.4" style={{ transform: open ? 'rotate(180deg)' : 'none', transition: 'transform 160ms' }}><path d="M5 9l7 7 7-7"/></svg>
          </span>
          {open && (
            /* paddingTop overbrugt de ruimte tussen 'Diensten' en het menu, zodat
               de muis het menu kan bereiken zonder dat onMouseLeave het sluit */
            <div style={{ position: 'absolute', top: '100%', left: '50%', transform: 'translateX(-50%)', paddingTop: 8, width: 300, zIndex: 60 }}>
            <div style={{
              position: 'relative', background: 'var(--muurx-panel)', border: '1px solid var(--border-subtle)',
              borderRadius: 'var(--radius-md)', boxShadow: 'var(--shadow-lg)', padding: 8, overflow: 'hidden',
            }}>
              <div aria-hidden="true" style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 2, background: 'var(--muurx-gradient-gold)' }} />
              {SERVICES.map((s) => (
                <a key={s.slug} href={url('diensten/' + s.slug + '.html')} style={{ display: 'flex', alignItems: 'center', gap: 14, padding: '11px 12px', borderRadius: 'var(--radius-sm)', textDecoration: 'none' }}
                  onMouseEnter={(e) => { e.currentTarget.style.background = 'var(--muurx-concrete)'; }}
                  onMouseLeave={(e) => { e.currentTarget.style.background = 'transparent'; }}>
                  <span style={{ width: 34, height: 34, flex: 'none', display: 'grid', placeItems: 'center', border: '1px solid var(--hairline)', borderRadius: 'var(--radius-sm)' }}>
                    <Icon name={s.icon} size={18} />
                  </span>
                  <span>
                    <span style={{ display: 'block', fontFamily: 'var(--font-sans)', fontWeight: 600, fontSize: 14, color: 'var(--muurx-white)' }}>{s.title}</span>
                    <span style={{ display: 'block', fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 11, color: 'var(--muurx-muted)' }}>Meer over deze dienst</span>
                  </span>
                </a>
              ))}
            </div>
            </div>
          )}
        </div>
        <a href={url('projecten.html')} style={navLink(active === 'projecten')}>Projecten</a>
        <a href={url('contact.html') + '#over'} style={navLink(false)}>Over ons</a>
        <a href={url('partner.html')} style={navLink(active === 'partner')}>Partner worden</a>
        <a href={url('contact.html')} style={navLink(active === 'contact')}>Contact</a>
      </nav>
      <div style={{ display: 'flex', alignItems: 'center', gap: 14 }}>
        <a className="mx-login-top" href={url('login.html')} style={{ fontFamily: 'var(--font-sans)', fontSize: 12, fontWeight: 500, letterSpacing: '0.12em', textTransform: 'uppercase', color: 'var(--muurx-gold)', textDecoration: 'none' }}>Inloggen</a>
        <a href={url('contact.html')} style={{ textDecoration: 'none' }}><Button size="sm" icon="arrowRight">Offerte</Button></a>
        <button className="mx-burger" aria-label={menu ? 'Menu sluiten' : 'Menu openen'} aria-expanded={menu} onClick={() => setMenu(!menu)}>
          {menu ? (
            <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--muurx-gold)" strokeWidth="2" strokeLinecap="round"><path d="M6 6l12 12M18 6L6 18" /></svg>
          ) : (
            <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--muurx-gold)" strokeWidth="2" strokeLinecap="round"><path d="M4 7h16M4 12h16M4 17h16" /></svg>
          )}
        </button>
      </div>
      {menu && (
        <div className="mx-mobile-menu" style={{
          position: 'absolute', top: '100%', left: 0, right: 0, zIndex: 60,
          flexDirection: 'column', padding: '6px 20px 26px',
          background: 'var(--muurx-black)',
          borderBottom: '1px solid var(--hairline)', boxShadow: 'var(--shadow-lg)',
          maxHeight: 'calc(100vh - 70px)', overflowY: 'auto',
        }}>
          <a href={url('index.html')} onClick={homeClick} style={mobLink(active === 'home')}>Home</a>
          <div style={{ padding: '13px 4px 4px', fontFamily: 'var(--font-sans)', fontSize: 11, fontWeight: 500, letterSpacing: '0.18em', textTransform: 'uppercase', color: 'var(--muurx-gold)' }}>Diensten</div>
          {SERVICES.map((s) => (
            <a key={s.slug} href={url('diensten/' + s.slug + '.html')} onClick={close} style={{ display: 'flex', alignItems: 'center', gap: 12, padding: '11px 4px', textDecoration: 'none', borderBottom: '1px solid var(--border-subtle)' }}>
              <span style={{ width: 30, height: 30, flex: 'none', display: 'grid', placeItems: 'center', border: '1px solid var(--hairline)', borderRadius: 'var(--radius-sm)' }}>
                <Icon name={s.icon} size={16} />
              </span>
              <span style={{ fontFamily: 'var(--font-sans)', fontWeight: 500, fontSize: 14, color: 'var(--muurx-white)' }}>{s.title}</span>
            </a>
          ))}
          <a href={url('projecten.html')} onClick={close} style={mobLink(active === 'projecten')}>Projecten</a>
          <a href={url('contact.html') + '#over'} onClick={close} style={mobLink(false)}>Over ons</a>
          <a href={url('partner.html')} onClick={close} style={mobLink(active === 'partner')}>Partner worden</a>
          <a href={url('contact.html')} onClick={close} style={mobLink(active === 'contact')}>Contact</a>
          <a href={url('login.html')} onClick={close} style={{ ...mobLink(false), color: 'var(--muurx-gold)', borderBottom: 'none' }}>Inloggen</a>
          <a href={url('contact.html')} onClick={close} style={{ textDecoration: 'none', marginTop: 12 }}><Button icon="arrowRight">Vraag offerte aan</Button></a>
        </div>
      )}
    </header>
    </React.Fragment>
  );
}

/* ---------------- Footer ---------------- */
function FooterSocialIcon({ type }) {
  const common = { width: 18, height: 18, viewBox: '0 0 24 24', fill: 'none', stroke: 'var(--muurx-gold)', strokeWidth: '1.3', strokeLinecap: 'round', strokeLinejoin: 'round' };
  if (type === 'facebook') {
    return (
      <svg {...common}>
        <rect x="3" y="3" width="18" height="18" rx="4" />
        <path d="M14 8.5h-1.5a2 2 0 0 0-2 2V12H14l-.4 2.2h-2.1V21" />
      </svg>
    );
  }
  return (
    <svg {...common}>
      <rect x="3" y="3" width="18" height="18" rx="5" />
      <circle cx="12" cy="12" r="3.6" />
      <circle cx="17" cy="7" r="0.6" fill="var(--muurx-gold)" stroke="none" />
    </svg>
  );
}

function SiteFooter() {
  const navLinks = [
    { label: 'Home', href: url('index.html') },
    ...SERVICES.map((s) => ({ label: s.title, href: url('diensten/' + s.slug + '.html') })),
    { label: 'Projecten', href: url('projecten.html') },
    { label: 'Locatie', href: url('index.html') + '#locatie' },
    { label: 'Over ons', href: url('contact.html') + '#over' },
    { label: 'Partner worden', href: url('partner.html') },
    { label: 'Blog', href: url('blog.html') },
    { label: 'Contact', href: url('contact.html') },
  ];
  const colLabel = { fontFamily: 'var(--font-sans)', fontWeight: 500, fontSize: 11, letterSpacing: '0.18em', textTransform: 'uppercase', color: 'var(--muurx-gold)', marginBottom: 16 };
  const linkStyle = { display: 'block', fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 14, color: 'var(--muurx-gray)', textDecoration: 'none' };
  return (
    <React.Fragment>
    <footer id="contact" style={{ position: 'relative', overflow: 'hidden', background: 'radial-gradient(90% 130% at 12% 0%, rgba(198,160,82,0.15), rgba(11,11,12,0) 46%), linear-gradient(180deg, #101013 0%, #0B0B0C 62%)', padding: '84px 40px 40px' }}>
      <div aria-hidden="true" style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 1, background: 'var(--muurx-gradient-gold)', opacity: 0.5 }} />
      <div style={{ maxWidth: 1200, margin: '0 auto', position: 'relative' }}>
        <div className="mx-footer-grid" style={{ display: 'grid', gridTemplateColumns: '1.2fr 0.75fr 0.7fr 0.85fr 1.1fr', gap: 32, paddingBottom: 48 }}>
          <div>
            <Logo height={38} assetBase={ASSET_BASE()} />
            <p style={{ margin: '20px 0 0', maxWidth: '32ch', fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 14, lineHeight: 1.6, color: 'var(--muurx-gray)' }}>
              Professionele stukadoor- en klusdiensten via zorgvuldig geselecteerde partners. Actief door heel Nederland.
            </p>
          </div>
          <div>
            <div style={colLabel}>Navigatie</div>
            <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
              {navLinks.map((l, i) => <a key={i} href={l.href} style={linkStyle}>{l.label}</a>)}
            </div>
          </div>
          <div>
            <div style={colLabel}>Adres</div>
            <div style={{ fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 14, lineHeight: 1.8, color: 'var(--muurx-gray)' }}>Dekemastraat<br />Tzum, 8804 NZ<br />Nederland</div>
            <div style={{ marginTop: 4, fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 12, color: 'var(--muurx-muted)' }}>Let op: dit is geen bezoekadres.</div>
          </div>
          <div>
            <div style={colLabel}>Contact</div>
            <div style={{ display: 'flex', flexDirection: 'column', gap: 8, marginBottom: 20, fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 14 }}>
              <a href="tel:0638144883" style={{ ...linkStyle, color: 'var(--muurx-white)' }}>0638144883</a>
              <a href="mailto:muurx.info@gmail.com" style={{ ...linkStyle, color: 'var(--muurx-white)', wordBreak: 'break-all' }}>muurx.info@gmail.com</a>
            </div>
            <div style={colLabel}>Openingstijden</div>
            <div style={{ fontFamily: 'var(--font-sans)', fontWeight: 300, fontSize: 14, lineHeight: 1.7, color: 'var(--muurx-gray)', marginBottom: 20 }}>
              Maandag t/m vrijdag<br />09:00 – 18:00 uur
            </div>
            <div style={{ display: 'flex', gap: 12 }}>
              <a href="https://www.facebook.com/profile.php?id=61587981926264" target="_blank" rel="noopener noreferrer" style={{ width: 34, height: 34, display: 'grid', placeItems: 'center', border: '1px solid var(--hairline)', borderRadius: 'var(--radius-sm)' }}>
                <FooterSocialIcon type="facebook" />
              </a>
              <a href="https://www.instagram.com/muurx.stukadoor.fr01" target="_blank" rel="noopener noreferrer" style={{ width: 34, height: 34, display: 'grid', placeItems: 'center', border: '1px solid var(--hairline)', borderRadius: 'var(--radius-sm)' }}>
                <FooterSocialIcon type="instagram" />
              </a>
            </div>
            <div style={{ marginTop: 20 }}>
              <a href={url('index.html') + '#offerte'} style={{ textDecoration: 'none' }}><Button size="sm" icon="arrowRight">Vraag offerte aan</Button></a>
            </div>
          </div>
          <div>
            <div style={colLabel}>Onze Blogs</div>
            <div style={{ display: 'flex', flexDirection: 'column', gap: 16, marginBottom: 18 }}>
              {BLOGS.slice(0, 2).map((b) => <FooterBlogLink key={b.slug} b={b} />)}
            </div>
            <a href={url('blog.html')} style={{ display: 'inline-flex', alignItems: 'center', gap: 8, fontFamily: 'var(--font-sans)', fontWeight: 600, fontSize: 11, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--muurx-gold)', textDecoration: 'none' }}>
              Alle blogs <Icon name="arrowRight" size={14} strokeWidth={1.8} />
            </a>
          </div>
        </div>
        <GoldRule />
        <div style={{ display: 'flex', justifyContent: 'space-between', paddingTop: 24, flexWrap: 'wrap', gap: 10 }}>
          <span style={{ display: 'inline-flex', gap: 16, alignItems: 'center', fontFamily: 'var(--font-sans)', fontSize: 11, letterSpacing: '0.18em', textTransform: 'uppercase', color: 'var(--muurx-muted)' }}>
            <span>© 2026 MuurX</span>
            <a href={url('privacy.html')} style={{ color: 'var(--muurx-muted)', textDecoration: 'none' }}>Privacyverklaring</a>
          </span>
          <span style={{ fontFamily: 'var(--font-sans)', fontSize: 11, letterSpacing: '0.28em', textTransform: 'uppercase', color: 'var(--muurx-gold)' }}>Vakmanschap · Kwaliteit · Vertrouwen</span>
        </div>
      </div>
    </footer>
    <a href="https://wa.me/31638144883?text=Beste%20MuurX%2C%20ik%20had%20een%20vraag%20over" target="_blank" rel="noopener noreferrer" aria-label="Chat met ons op WhatsApp" style={{
        position: 'fixed', bottom: 26, right: 26, zIndex: 100, width: 58, height: 58, borderRadius: '50%',
        display: 'grid', placeItems: 'center', boxShadow: '0 8px 24px rgba(0,0,0,0.4)',
        transition: 'transform 160ms',
      }}
        onMouseEnter={(e) => { e.currentTarget.style.transform = 'translateY(-2px) scale(1.05)'; }}
        onMouseLeave={(e) => { e.currentTarget.style.transform = 'none'; }}>
        <img src={url('uploads/Whatsapp icon .webp')} alt="WhatsApp" style={{ width: '100%', height: '100%', display: 'block' }} />
      </a>
    </React.Fragment>
  );
}

Object.assign(window, { MuurXSite: { SERVICES, serviceBySlug, BLOGS, blogBySlug, BlogThumb, Placeholder, NLMap, FooterSocialIcon, QuoteForm, SiteHeader, SiteFooter, url, ASSET_BASE, MUURX_BEDRIJF } });
