Dubbele spijlenpoort Mikado - Gecoat
Dubbele spijlenpoort Mikado - Gecoat
€1.536,95
€1.270,21
Incl. btw
Excl. btw
Dubbele spijlenpoort Mikado verkrijgbaar in diverse hoogte en breedtematen. Poort bestaat uit: poortvleugel, poortpalen, slotset, scharnieren & paaldoppen. Besteleenheid per stuk.
Lees meer .
Gratis verzending vanaf €700,-
Altijd 5 jaar garantie
Levering met eigen bezorgservice
Achteraf betalen mogelijk
Ergens anders goedkoper gezien?
Vragen over dit product of hulp nodig bij je bestelling?
Vragen over dit product of hulp nodig bij je bestelling?
Recent bekeken
0 / 5
0 sterren op basis van 0 beoordelingen
0 beoordelingen
© Copyright 2026 Hekwerk Direct
Kies uw taal
Nederlands
Kies uw valuta
€
EUR
Recent toegevoegd
Bestel nog voor €700,00 en de verzending is gratis
Beoordeel Dubbele spijlenpoort Mikado - Gecoat
Dit artikel is toegevoegd aan uw winkel wagen!
(function () {
const API_BASE = "https://hd-spijlen.michel-abchekwerk.workers.dev";
const TARGET_SLUG = "/spijlendirect-compleet-pakket";
// Alleen op deze pagina (robust: met/zonder .html, met trailing slash)
if (!location.pathname.includes(TARGET_SLUG)) return;
console.log("[HD] init", location.pathname);
// --------- kleine CSS fix tegen layout shift ----------
(function injectCss() {
const css = `
/* Zorg dat ons blok geen grid/float in de war brengt */
#hd-configurator { display:block; width:100%; clear:both; }
#hd-configurator .hd-wrap { width:100%; }
#hd-configurator .hd-wrap * { box-sizing:border-box; }
`;
const s = document.createElement("style");
s.textContent = css;
document.head.appendChild(s);
})();
function ready(fn) {
if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", fn);
else fn();
}
// --------- Helpers ----------
const fmtEUR = (n) => {
try {
return new Intl.NumberFormat("nl-NL", { style: "currency", currency: "EUR" }).format(n);
} catch {
return "€ " + (Math.round(n * 100) / 100).toFixed(2).replace(".", ",");
}
};
function getVatPref() {
try {
const v = localStorage.getItem("vat_type_pref") || "";
if (/excl/i.test(v)) return "excl";
if (/incl/i.test(v)) return "incl";
} catch {}
const c = document.cookie || "";
if (/vat_type_pref=excl/i.test(c)) return "excl";
if (/vat_type_pref=incl/i.test(c)) return "incl";
return "incl";
}
function roundingNote(m) {
if (!isFinite(m) || m <= 0) return "";
const vakken = Math.ceil(m / 2.2);
const eff = vakken * 2.2;
return `Wordt afgerond naar ${vakken} vak(ken) = ${eff.toFixed(1).replace(".", ",")}m`;
}
// --------- Koopblok vinden & verbergen ----------
function findAddToCartSpan() {
// 1) Specifiek op class (jij gaf die door)
const candidates = Array.from(
document.querySelectorAll("span.flex-grow-1.align-self-center.px-3")
);
// 2) Tekst check (niet strict gelijk — includes is veiliger)
const hit = candidates.find((s) =>
(s.textContent || "").trim().toLowerCase().includes("toevoegen aan winkelwagen")
);
if (hit) return hit;
// fallback: zoek op tekst in alle spans
const any = Array.from(document.querySelectorAll("span")).find((s) =>
(s.textContent || "").trim().toLowerCase().includes("toevoegen aan winkelwagen")
);
return any || null;
}
function findPurchaseContainerFromButton(btn) {
// We zoeken de “kleinste” ancestor die:
// - een select heeft (variant)
// - een qty input/spinner heeft OF een hoeveelheid veld
// - de add-to-cart button bevat
let el = btn;
for (let i = 0; i < 10 && el; i++) {
const hasSelect = !!el.querySelector("select");
const hasQty =
!!el.querySelector('input[type="number"]') ||
!!el.querySelector(".qty, .quantity, .quantity-selector, .input-group");
const hasBtn = !!el.querySelector("button, input[type=submit]");
if (hasSelect && hasBtn && hasQty) return el;
el = el.parentElement;
}
// fallback: verberg gewoon het form of parent
return btn.closest("form") || btn.parentElement;
}
function hideBuyBox() {
// sticky koopknop (als aanwezig)
const sticky = document.querySelector("#addtocart-sticky, .addtocart-sticky, .add-to-cart-sticky");
if (sticky) sticky.style.display = "none";
const span = findAddToCartSpan();
if (!span) return;
const btn = span.closest("button") || span.closest('[role="button"]');
if (!btn) return;
const container = findPurchaseContainerFromButton(btn);
if (container) {
container.style.display = "none";
container.setAttribute("data-hd-hidden", "1");
}
// Ook de “Maak een keuze” label-block wegdrukken als die elders staat
const labels = Array.from(document.querySelectorAll("label, .label"));
const choiceLabel = labels.find((l) => (l.textContent || "").toLowerCase().includes("maak een keuze"));
if (choiceLabel) {
const block =
choiceLabel.closest(".form-group, .product-options, .product__options, .row, .field") ||
choiceLabel.parentElement;
if (block) block.style.display = "none";
}
}
// Houd het weg als Lightspeed her-rendered
const mo = new MutationObserver(() => hideBuyBox());
mo.observe(document.documentElement, { childList: true, subtree: true });
// --------- Main ----------
ready(async () => {
// 1) koopblok alvast wegdrukken (kan later opnieuw verschijnen)
hideBuyBox();
// 2) mount
const mount = document.getElementById("hd-configurator");
if (!mount) {
console.warn("[HD] #hd-configurator niet gevonden. Zet
in productomschrijving.");
return;
}
// Defaults (later uitbreidbaar met extra velden)
const DEFAULTS = {
soortSpijlen: "Spijlen 25x25 vlak",
hoeken: "0",
muuraansluiting: "Geen",
soortPalen: "Grondpalen",
soortPaaldop: "Paalkap kunststof",
};
// 3) opties ophalen
let opt;
try {
opt = await fetch(API_BASE + "/api/options").then((r) => r.json());
} catch (e) {
opt = { ok: false, error: String(e) };
}
if (!opt.ok) {
mount.innerHTML = `
Configurator error
${opt.error || "Opties konden niet geladen worden."}
`;
return;
}
const kleuren = (opt.options.kleuren || []).filter((k) => /7016|9005/.test(k));
const hoogtes = opt.options.hoogtes || [];
// 4) UI renderen (neutraal, breekt layout niet)
mount.innerHTML = `
Configureer je spijlenpakket
`;
const elKleur = mount.querySelector("#hd-kleur");
const elHoogte = mount.querySelector("#hd-hoogte");
const elLengte = mount.querySelector("#hd-lengte");
const elRound = mount.querySelector("#hd-round");
const elBtn = mount.querySelector("#hd-calc");
const elPrice = mount.querySelector("#hd-price");
kleuren.forEach((k) => elKleur.add(new Option(k, k)));
hoogtes.forEach((h) => elHoogte.add(new Option(h, h)));
const updateRound = () => {
elRound.textContent = roundingNote(Number(elLengte.value || 0));
};
elLengte.addEventListener("input", updateRound);
updateRound();
async function quote() {
elBtn.disabled = true;
elBtn.style.opacity = "0.7";
const cfg = {
...DEFAULTS,
kleur: elKleur.value,
hoogte: elHoogte.value,
lengthM: Number(elLengte.value || 0),
};
let res;
try {
res = await fetch(API_BASE + "/api/quote", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ config: cfg }),
}).then((r) => r.json());
} catch (e) {
res = { ok: false, error: String(e) };
}
elBtn.disabled = false;
elBtn.style.opacity = "1";
if (!res.ok) {
elPrice.innerHTML = `
Prijs ophalen mislukt: ${res.error || "onbekend"}
`;
return;
}
const pref = getVatPref();
const main = pref === "excl" ? res.totalExcl : res.totalIncl;
elPrice.innerHTML = `
${fmtEUR(main)}
Incl. ${fmtEUR(res.totalIncl)} · Excl. ${fmtEUR(res.totalExcl)} · ${res.lengthLabel}
`;
// koopblok nogmaals wegdrukken (LS kan terugzetten)
hideBuyBox();
}
elBtn.addEventListener("click", quote);
quote();
// en nogmaals verbergen na init
hideBuyBox();
});
})();