Issue 2

  • Reparatur als Gestaltungselement

    PREISRECHNER

    Grobe Orientierung.

    Du bekommst hier einen realistischen Richtwert – damit du schnell weißt, ob wir im gleichen Budget-Raum sind.

    PREISMODELLE
    Kurz & klar.
    Basismodell
    Klar & funktional. Gute Lösung, wenige Sonderdetails.
    Guter Mix
    Ausgewogen. Mehr Details, sauberer Ausbau, stimmiges Gesamtbild.
    Bespoke
    Individuell gebaut. Hoher Detailgrad, Sonderlösungen, Design-Fokus.
    Was ist es? Küche Kästen / Einbauschrank Dachschrägenkorpus Garderobe Regal / Bücherregal Badezimmer (als Raum gedacht) Schlafzimmer (als Raum gedacht) Kinder- & Jugendzimmer (als Raum gedacht) Wohnzimmer (als Raum gedacht) Vorraum (als Raum gedacht) Hochebene / Podestlösung Handgefertigter Tisch (Massivholz)
    Was ist drinnen?
    Richtwert: Möbelbau.
    Raumgröße
    mittel
    Form Gerade / Zeile L-Form U-Form Form Gerade Über Eck In Nische / um Wände Laufmeter
    6 LFM
    Kastenhöhe 90 cm 150 cm 210 cm 250 cm (Standard) 330 cm Auszüge / Laden Keine Wenig Viele Offen hängen Wenig (mehr geschlossen) Viel auf Kleiderstange Viel auf Haken Geschlossen Alles offen Teilweise geschlossen Mehr geschlossen Oberkästen / Hochschränke Laufmeter
    0 LFM
    Orientierungswert
    Basismodell
    Guter Mix
    Bespoke

    Richtwert. Exakte Kalkulation erfolgt nach Planung & Aufmaß.

    Wenn das grob passt: schick uns die Positionen – wir melden uns mit den nächsten sinnvollen Schritten.
    /* ===== base layout (scoped) ===== */ .hg-vorort .hg-wrap{max-width:980px;margin:0 auto;padding:0 clamp(18px,3vw,52px);} .hg-vorort .hg-eyebrow{font-size:12px;font-weight:900;letter-spacing:.16em;text-transform:uppercase;margin:0 0 8px 0;opacity:.75;} .hg-vorort .hg-headline{margin:0;font-size:clamp(22px,3vw,34px);line-height:1.15;font-weight:950;} .hg-vorort .hg-lead{margin:10px 0 14px 0;max-width:760px;font-size:15px;line-height:1.55;font-weight:700;opacity:.9;} .hg-vorort .hg-calc{max-width:760px;margin:8px 0 0 0;} .hg-vorort .hg-calc-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;align-items:start;} @media (max-width:720px){ .hg-vorort .hg-calc-grid{grid-template-columns:1fr;} } .hg-vorort .hg-span-2{grid-column:span 2;} @media (max-width:720px){ .hg-vorort .hg-span-2{grid-column:auto;} } .hg-vorort .hg-calc-field{display:grid;gap:6px;align-content:start;} .hg-vorort .hg-calc-label{ font-size:13px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;margin:0; min-height:16px;line-height:16px;display:flex;align-items:flex-end; } .hg-vorort .hg-label-row{display:flex;align-items:center;gap:10px;} .hg-vorort .hg-info{ width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center; font-size:12px;font-weight:900;line-height:1;background:#000;color:#fff;box-shadow:inset 0 0 0 2px #000; cursor:help; user-select:none; } .hg-vorort .hg-info:focus{outline:2px solid rgba(0,0,0,.35); outline-offset:2px;} .hg-vorort .hg-calc-input{ width:100%;height:48px;padding:0 14px;background:#000;color:#fff;border:0;border-radius:8px; font:inherit;box-shadow:inset 0 0 0 2px #000;outline:none; } .hg-vorort .hg-calc-range{width:100%;-webkit-appearance:none;appearance:none;height:8px;background:#000;border-radius:999px;outline:none;} .hg-vorort .hg-calc-range::-webkit-slider-thumb{ -webkit-appearance:none;appearance:none;width:18px;height:18px;border-radius:999px;background:#fff;border:2px solid #000;cursor:pointer; } .hg-vorort .hg-calc-range::-moz-range-thumb{width:18px;height:18px;border-radius:999px;background:#fff;border:2px solid #000;cursor:pointer;} .hg-vorort .hg-calc-meta{margin-top:6px;} .hg-vorort .hg-calc-pill{ display:inline-flex;align-items:center;gap:10px;height:32px;padding:0 12px;background:#000;color:#fff; border-radius:999px;box-shadow:inset 0 0 0 2px #000;font-size:14px;font-weight:800; } .hg-vorort .hg-model-sub{font-weight:700;letter-spacing:.02em;opacity:.9;font-size:13px;white-space:nowrap;} .hg-vorort .hg-calc-kitchen{display:grid;grid-template-columns:1fr 1fr;gap:12px;} @media (max-width:720px){ .hg-vorort .hg-calc-kitchen{grid-template-columns:1fr;} } .hg-vorort .hg-calc-result{ margin-top:6px;padding:16px;border-radius:18px;box-shadow:inset 0 0 0 2px #000;background:#fff; } .hg-vorort .hg-calc-sub{font-size:13px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;margin:0 0 8px 0;opacity:.85;} .hg-vorort .hg-actions{display:flex;gap:10px;flex-wrap:wrap;} .hg-vorort .hg-calc-btn{ display:inline-flex;align-items:center;justify-content:center;height:48px;padding:0 22px; font-size:15px;font-weight:700;border-radius:4px;background:#000;color:#fff;border:0;cursor:pointer; } .hg-vorort .hg-calc-btn-ghost{background:#fff;color:#000;box-shadow:inset 0 0 0 2px #000;} .hg-vorort .hg-plus{display:inline-block;font-weight:900;font-size:18px;line-height:0;margin-right:10px;transform:translateY(-1px);} .hg-vorort .hg-calc-details{margin-top:12px;padding:12px 14px;border-radius:14px;box-shadow:inset 0 0 0 1px #222;background:#fff;font-size:15px;line-height:1.55;} .hg-vorort .hg-calc-note{ width:100%;min-height:46px;padding:12px 14px;background:#fff;color:#000;border:0;border-radius:10px; box-shadow:inset 0 0 0 2px #000;font:inherit;resize:vertical; } /* Text-Vorschau */ .hg-vorort .hg-preview{ padding:12px 14px;border-radius:14px;background:#fff;box-shadow:inset 0 0 0 2px #000;display:grid;gap:8px; } .hg-vorort .hg-preview-head{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;opacity:.85;} .hg-vorort .hg-preview-body{font-size:15px;line-height:1.5;font-weight:750;} .hg-vorort .hg-preview-meta{display:flex;gap:10px;flex-wrap:wrap;align-items:center;} .hg-vorort .hg-preview-hint{font-size:12px;font-weight:700;opacity:.72;} /* 3-Preis Grid – clean */ .hg-vorort .hg-pricegrid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;} @media (max-width:720px){ .hg-vorort .hg-pricegrid{grid-template-columns:1fr;} } .hg-vorort .hg-pricegrid-clean .hg-pricebox{ padding:12px 12px 14px;border-radius:14px;box-shadow:inset 0 0 0 2px #000;background:#fff; display:grid;grid-template-rows:auto auto;align-content:start;min-height:86px; } .hg-vorort .hg-pricegrid-clean .hg-pricebox-h{ font-size:11px;font-weight:900;letter-spacing:.16em;text-transform:uppercase;opacity:.78;margin:0 0 2px 0; } .hg-vorort .hg-pricegrid-clean .hg-pricebox-v{ font-size:24px;font-weight:950;line-height:1.05;letter-spacing:.01em;font-variant-numeric: tabular-nums; } /* Overlay */ .hg-vorort .hg-overlay{ position:fixed;inset:0;background:rgba(0,0,0,.55); display:flex;align-items:flex-end;justify-content:center;padding:18px;z-index:9999; } @media (min-width:760px){ .hg-vorort .hg-overlay{align-items:center;} } .hg-vorort .hg-modal{ width:min(720px, 100%);background:#fff;border-radius:18px; box-shadow:0 40px 120px rgba(0,0,0,.35), inset 0 0 0 2px #000;padding:16px; } .hg-vorort .hg-modal-head{ display:flex;align-items:flex-start;justify-content:space-between;gap:14px; padding-bottom:12px;margin-bottom:12px;border-bottom:1px solid rgba(0,0,0,.12); } .hg-vorort .hg-modal-eyebrow{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;margin:0 0 4px 0;} .hg-vorort .hg-modal-title{font-size:20px;font-weight:900;line-height:1.2;margin:0;} .hg-vorort .hg-modal-x{ width:44px;height:44px;border-radius:10px;border:0;background:#000;color:#fff;cursor:pointer;font-size:22px;line-height:1; } .hg-vorort .hg-cart{display:grid;gap:10px;} .hg-vorort .hg-cart-item{ display:grid;grid-template-columns:1fr auto;gap:10px;padding:12px;border-radius:12px;box-shadow:inset 0 0 0 2px #000; } .hg-vorort .hg-cart-top{display:flex;flex-direction:column;gap:6px;} .hg-vorort .hg-cart-label{font-size:14px;font-weight:900;line-height:1.2;} .hg-vorort .hg-cart-meta{font-size:13px;opacity:.82;line-height:1.45;white-space:pre-line;} .hg-vorort .hg-cart-pricecol{display:grid;gap:6px;align-content:start;justify-items:end;} .hg-vorort .hg-cart-price{font-size:14px;font-weight:900;white-space:nowrap;} .hg-vorort .hg-cart-price small{display:block;font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;opacity:.75;margin-bottom:2px;} .hg-vorort .hg-cart-remove{ margin-top:6px;height:36px;padding:0 12px;border-radius:10px;border:0;background:#fff;color:#000; box-shadow:inset 0 0 0 2px #000;cursor:pointer;font-weight:800; } .hg-vorort .hg-cart-sum{ display:flex;align-items:flex-start;justify-content:space-between;margin-top:12px;padding-top:12px;border-top:1px solid rgba(0,0,0,.12);gap:12px; } .hg-vorort .hg-cart-sum-label{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;} .hg-vorort .hg-cart-sum-vals{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;} .hg-vorort .hg-cart-sum-pill{ display:inline-flex;gap:8px;align-items:baseline;padding:8px 10px;border-radius:999px;box-shadow:inset 0 0 0 2px #000;font-weight:900; } .hg-vorort .hg-cart-sum-pill span{font-size:11px;letter-spacing:.12em;text-transform:uppercase;opacity:.75;} .hg-vorort .hg-cart-sum-pill b{font-size:14px;} .hg-vorort .hg-modal-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px;} /* Preismodelle */ .hg-vorort .hg-trust-min{ max-width:760px;margin:0 0 16px 0;padding:14px 0;background:#fff; border-top:1px solid rgba(0,0,0,.14);border-bottom:1px solid rgba(0,0,0,.14); } .hg-vorort .hg-trust-head{ padding:0 2px 10px;display:flex;align-items:baseline;justify-content:space-between;gap:12px; } .hg-vorort .hg-trust-kicker,.hg-vorort .hg-trust-title{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;} .hg-vorort .hg-trust-kicker{opacity:.75;} .hg-vorort .hg-trust-title{opacity:.9;} .hg-vorort .hg-trust-min-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:0;border-left:2px solid #000;} @media (max-width:720px){ .hg-vorort .hg-trust-min-grid{grid-template-columns:1fr;} } .hg-vorort .hg-trust-min-col{padding:10px 12px 12px;border-left:1px solid rgba(0,0,0,.14);} .hg-vorort .hg-trust-min-col:first-child{border-left:0;} .hg-vorort .hg-trust-min-h{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;margin:0 0 6px 0;} .hg-vorort .hg-trust-min-p{margin:0;font-size:13px;line-height:1.45;font-weight:700;opacity:.85;} .hg-vorort .hg-trust-min-toggle{ width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;cursor:pointer;border:0; } .hg-vorort .hg-trust-toggle-like-input{ height:48px;padding:0 14px;border-radius:8px;background:#000;color:#fff;box-shadow:inset 0 0 0 2px #000; font:inherit;font-weight:800;letter-spacing:.02em; } .hg-vorort .hg-trust-toggle-like-input:focus{ outline:2px solid rgba(0,0,0,.35); outline-offset:2px; } .hg-vorort .hg-trust-min-plus{ width:34px;height:34px;border-radius:10px;background:#fff;color:#000;display:flex;align-items:center;justify-content:center; font-weight:900;box-shadow:inset 0 0 0 2px #000; } .hg-vorort .hg-trust-deep{margin-top:12px;} .hg-vorort .hg-trust-deep-block{padding:12px;border-radius:14px;border:1px solid rgba(0,0,0,.14);background:#fff;} .hg-vorort .hg-trust-deep-head{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;margin:0 0 6px 0;} .hg-vorort .hg-trust-deep-body{font-size:13px;line-height:1.5;opacity:.88;font-weight:700;} /* CTA */ .hg-vorort .hg-cta{display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap;} .hg-vorort .hg-cta-text{font-size:13px;line-height:1.45;opacity:.85;font-weight:750;max-width:520px;} (function(){ function eur(n){ return Math.round(n).toLocaleString(„de-AT“) + “ €“; } function lerp(a,b,t){ return a + (b-a)*t; } function clamp(n,a,b){ return Math.max(a, Math.min(b,n)); } function esc(s){ return String(s).replace(/&/g,“&“).replace(//g,“>“) .replace(/“/g,“"“).replace(/’/g,“'“); } var GLOBAL_UPLIFT = 1.62; var TIERS = { base: { m:1.00 }, mix: { m:1.20 }, bespoke: { m:1.44 } }; var ROOM = { room_bad_raum: { label:“Badezimmer (als Raum gedacht)“, min: 6000, max:15000, minM2:6, maxM2:13 }, room_schlafzimmer: { label:“Schlafzimmer (als Raum gedacht)“, min:15000, max:30000, minM2:12, maxM2:20 }, room_kinderzimmer: { label:“Kinder- & Jugendzimmer (als Raum gedacht)“, min:15000, max:30000, minM2:10, maxM2:18 }, room_wohnzimmer_raum: { label:“Wohnzimmer (als Raum gedacht)“, min:15000, max:40000, minM2:17, maxM2:30 }, room_vorraum: { label:“Vorraum (als Raum gedacht)“, min:10000, max:25000, minM2:5, maxM2:16 }, room_podest: { label:“Hochebene / Podestlösung“, bespokeOnly:true, min:13000, max:28000 }, room_tisch: { label:“Handgefertigter Tisch (Massivholz)“, bespokeOnly:true, min: 4000, max: 6500 } }; var FORM = { line:1.00, l:1.06, u:1.12 }; var OTHER_FORM = { straight:1.00, corner:1.05, niche:1.10 }; var DRAWERS = { none:0, few:900, many:1800 }; var KITCHEN = { base_lfm: 1100, fronts_base_per_lfm: 410, fronts_wall_per_lfm: 640, wall_effort_per_lfm: 420, island_factor: 1.05, island_lfm: { „2“:2, „4“:4 } }; var FRONT_BASE_PER_M2 = (KITCHEN.fronts_base_per_lfm / 0.90); var OTHER = { kasten:1625, garderobe:1438, regal:690 }; var DACH = { firstLfm: 2.5, upliftFirst: 1.30 }; var WALL_H_FACTOR = { „210“:0.90, „250“:1.00, „330“:1.25 }; var HANG_FRONT_FACTOR = { low:1.00, rod:0.65, hooks:0.60 }; var REGAL_CLOSED = { open: { frontFactor:0.05, effort:1.00, label:“Alles offen“ }, part: { frontFactor:0.40, effort:1.06, label:“Teilweise geschlossen“ }, more: { frontFactor:0.70, effort:1.12, label:“Mehr geschlossen“ } }; function up(n){ return n * GLOBAL_UPLIFT; } function isRoomMode(what){ return !!ROOM[what]; } function volumeFactor(lfm){ var x = Math.max(2, Math.min(20, lfm)); if(x 0) area += wallLfm * (parseInt(wallH,10)/100); return Math.max(0, area); } var h = (parseInt(kH,10)/100); return Math.max(0, lfm * h); } function roomContentText(what, stage){ if(what === „room_bad_raum“){ return (stage===“klein“) ? „Bad klein: Waschtisch + Stauraum, Dusche/Badewanne, WC (Basis).“ : (stage===“mittel“) ? „Bad mittel: mehr Stauraum/Einbauten, mehr Details in Ausführung.“ : „Bad groß: mehr Stauraum + optional 2. Waschtisch, insgesamt mehr Fläche/Elemente.“; } if(what === „room_kinderzimmer“){ return (stage===“groß“) ? „Kinderzimmer groß: 2 Betten + 2 Schreibtische + mehr Stauraum/Regale.“ : „Kinderzimmer “ + stage + „: 1 Bett + 1 Schreibtisch + Kasten/Regal (je nach Größe mehr Elemente).“; } if(what === „room_wohnzimmer_raum“){ return (stage===“klein“) ? „Wohnzimmer klein: Sideboard/Lowboard + einzelne Einbauten.“ : (stage===“mittel“) ? „Wohnzimmer mittel: mehr Elemente (Sideboard + zusätzliche Kästen/Regale).“ : „Wohnzimmer groß: mehr Laufmeter (Wohnwand/Einbauten) + zusätzliche Elemente.“; } if(what === „room_vorraum“){ return (stage===“klein“) ? „Vorraum klein: Garderobenlösung + Schuhbereich.“ : (stage===“mittel“) ? „Vorraum mittel: mehr Garderobe + Bank/Schuh + zusätzliche Einbauten.“ : „Vorraum groß: mehr Garderobenlaufmeter + zusätzlicher Stauraum/Regalbereiche.“; } if(what === „room_schlafzimmer“){ return (stage===“klein“) ? „Schlafzimmer klein: Kastenlösung + Bettbereich/Sideelemente.“ : (stage===“mittel“) ? „Schlafzimmer mittel: mehr Einbauten + z.B. kleiner Arbeitsplatz/Details.“ : „Schlafzimmer groß: mehr Laufmeter Kasten + zusätzliche Einbauten/Details.“; } if(what === „room_podest“){ return (stage===“klein“) ? „Podest klein: kompakte Hochebene/Podest + Stiege.“ : (stage===“mittel“) ? „Podest mittel: mehr Fläche/Stauraum im Podest + mehr Detailgrad.“ : „Podest groß: mehr Fläche + mehr Stufen/Einbauten (komplexer).“; } if(what === „room_tisch“){ return (stage===“klein“) ? „Tisch klein: kompakter Massivholztisch.“ : (stage===“mittel“) ? „Tisch mittel: größerer Tisch (länger).“ : „Tisch groß: deutlich länger/größer (mehr Material + Konstruktion).“; } return „Raum/Paket: klein → groß bedeutet mehr Elemente/Fläche/Detailgrad.“; } function init(root){ function q(sel){ return root.querySelector(sel); } function qa(sel){ return Array.prototype.slice.call(root.querySelectorAll(sel)); } function get(key){ return q(‚[data-hg=“‚+key+'“]‘); } var el = { what: get(„what“), note: get(„note“), previewText: get(„previewText“), previewM2: get(„previewM2“), previewHint: get(„previewHint“), roomSizeField: get(„roomSizeField“), roomSize: get(„roomSize“), roomSizeLabel: get(„roomSizeLabel“), roomSizeSub: get(„roomSizeSub“), formField: get(„formField“), form: get(„form“), otherFormField: get(„otherFormField“), otherForm: get(„otherForm“), lfmField: get(„lfmField“), lfm: get(„lfm“), lfmVal: get(„lfmVal“), kastenField: get(„kastenField“), kastenH: get(„kastenH“), drawersField: get(„drawersField“), drawers: get(„drawers“), hangField: get(„hangField“), hang: get(„hang“), closedField: get(„closedField“), closed: get(„closed“), kitchenOnly: get(„kitchenOnly“), wallH: get(„wallH“), island: get(„island“), wallLfmField: get(„wallLfmField“), wallLfm: get(„wallLfm“), wallLfmVal: get(„wallLfmVal“), resultLabel: get(„resultLabel“), resBase: get(„resBase“), resMix: get(„resMix“), resBespoke: get(„resBespoke“), detailsBtn: get(„detailsBtn“), detailsBox: get(„detailsBox“), addBtn: get(„addBtn“), sendMailInline: get(„sendMailInline“), overlay: get(„overlay“), cartList: get(„cartList“), sumBase: get(„sumBase“), sumMix: get(„sumMix“), sumBespoke: get(„sumBespoke“), closeOverlay: get(„closeOverlay“), continueBtn: get(„continue“), clearCart: get(„clearCart“), sendMail: get(„sendMail“), deepBtn: get(„deepBtn“), deepBox: get(„deepBox“), deepPlus: get(„deepPlus“) }; if(!el.what || !el.resMix) return; var CART = []; var lastResult = null; function currentNote(){ var v = el.note ? (el.note.value || „“).trim() : „“; return v; } function roomT(){ var p = parseInt(el.roomSize.value, 10); if(!isFinite(p)) p = 50; var t = clamp(p,0,100)/100; var label = (t < 0.34) ? "klein" : (t < 0.67 ? "mittel" : "groß"); el.roomSizeLabel.textContent = label; return t; } function updateRoomM2(what, t){ var pack = ROOM[what]; if(!pack){ el.roomSizeSub.textContent = "—"; return; } if(pack.minM2 && pack.maxM2){ var now = lerp(pack.minM2, pack.maxM2, t); el.roomSizeSub.textContent = "ca. " + (Math.round(now*10)/10).toLocaleString("de-AT") + " m² (" + pack.minM2 + "–" + pack.maxM2 + " m²)"; return; } el.roomSizeSub.textContent = "Richtwert (klein → groß)"; } function setPreview(html, m2Text){ el.previewText.innerHTML = html || "—"; el.previewM2.textContent = m2Text || "—"; } function updatePreview(){ var what = el.what.value || "kueche"; var roomMode = isRoomMode(what); el.previewHint.textContent = (what === "kueche") ? "Richtwert: Möbelbau – Küche ohne Geräte." : "Richtwert: Möbelbau."; var note = currentNote(); if(roomMode){ var t = roomT(); updateRoomM2(what, t); var stage = (t < 0.34) ? "klein" : (t < 0.67 ? "mittel" : "groß"); var pack = ROOM[what]; var m2Txt = "Richtwert (klein → groß)"; if(pack && pack.minM2 && pack.maxM2){ var now = lerp(pack.minM2, pack.maxM2, t); m2Txt = "ca. " + (Math.round(now*10)/10).toLocaleString("de-AT") + " m² (" + pack.minM2 + "–" + pack.maxM2 + " m²)"; } var content = roomContentText(what, stage) + (note ? (" | Notiz: " + note) : ""); setPreview("„+esc(labelForWhat(what))+“
    „+esc(content), m2Txt); return; } var lfm = parseFloat(el.lfm.value || „6“); if(!isFinite(lfm)) lfm = 6; var kH = parseInt(el.kastenH.value || „250“,10); if(!isFinite(kH)) kH = 250; var drawers = el.drawers.value || „none“; if(what === „kueche“){ var form = el.form.value || „line“; var wallH = el.wallH.value || „0“; var withWall = (wallH !== „0“); var wallLfm = withWall ? (parseFloat(el.wallLfm.value || „0“) || 0) : 0; var islandSel = el.island.value || „none“; var areaM2 = computeFrontAreaM2(„kueche“, lfm, 250, wallH, wallLfm); var areaTxt = „Frontfläche ca. “ + (Math.round(areaM2*10)/10).toLocaleString(„de-AT“) + “ m²“; var txt = „Küche
    “ + „Grundküche: “ + lfm + “ LFM (“ + esc(formLabelKitchen(form)) + „). “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (withWall ? („Oberkästen / Hochschränke: Höhe “ + wallH + “ cm, “ + wallLfm + “ LFM. „) : „Oberkästen / Hochschränke: ohne. „) + (islandSel !== „none“ ? („Insel: “ + (islandSel===“2″ ? „klein (2 LFM)“ : „groß (4 LFM)“) + „. „) : „“) + (note ? („Notiz: “ + esc(note) + „. „) : „“) + „Orientierung für Möbelbau (ohne Geräte).“; setPreview(txt, areaTxt); return; } var otherForm = el.otherForm.value || „straight“; var area = computeFrontAreaM2(what, lfm, kH, „0“, 0); var areaTxt2 = „Frontfläche ca. “ + (Math.round(area*10)/10).toLocaleString(„de-AT“) + “ m²“; if(what === „garderobe“){ var hang = el.hang.value || „low“; setPreview( „Garderobe
    “ + lfm + “ LFM, Höhe “ + kH + “ cm. Form: “ + esc(formLabelOther(otherForm)) + „. “ + „Offen hängen: “ + esc(hangLabel(hang)) + „. “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (note ? („Notiz: “ + esc(note) + „. „) : „“), areaTxt2 ); return; } if(what === „regal“){ var closed = el.closed.value || „open“; var c = REGAL_CLOSED[closed] || REGAL_CLOSED.open; setPreview( „Regal / Bücherregal
    “ + lfm + “ LFM, Höhe “ + kH + “ cm. Form: “ + esc(formLabelOther(otherForm)) + „. “ + „Geschlossen: “ + esc(c.label) + „. “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (note ? („Notiz: “ + esc(note) + „. „) : „“), areaTxt2 ); return; } if(what === „dachschraege“){ setPreview( „Dachschrägenkorpus
    “ + lfm + “ LFM, Höhe “ + kH + “ cm. Form: “ + esc(formLabelOther(otherForm)) + „. “ + „Erste 2,5 LFM sind +30% (Dachschrägen-Start). “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (note ? („Notiz: “ + esc(note) + „. „) : „“), areaTxt2 ); return; } if(what === „kasten“){ setPreview( „Kästen / Einbauschrank
    “ + lfm + “ LFM, Höhe “ + kH + “ cm. Form: “ + esc(formLabelOther(otherForm)) + „. “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (note ? („Notiz: “ + esc(note) + „. „) : „“) + „Mehr LFM/Höhe = mehr Frontfläche & mehr Aufwand.“, areaTxt2 ); return; } setPreview(„—“,“—“); } function inputsToText(inputs){ var out = []; Object.keys(inputs || {}).forEach(function(k){ var v = inputs[k]; if(v === null || v === undefined) return; var s = String(v).trim(); if(!s) return; out.push(k + „: “ + s); }); return out.join(„\n“); } function cartToMailText(){ var lines = []; lines.push(„Handgedacht – Preisrechner Anfrage“); lines.push(„“); lines.push(„Hinweis: Richtwert nur für Möbelbau. Küchenpreise ohne Geräte.“); lines.push(„“); if(CART.length === 0){ lines.push(„Keine Positionen im Warenkorb.“); return lines.join(„\n“); } var sumB=0,sumM=0,sumS=0; CART.forEach(function(it, idx){ lines.push(„Position “ + (idx+1) + „: “ + it.label); lines.push(inputsToText(it.inputs)); if(it.note) lines.push(„Notiz: “ + it.note); if(it.prices && it.prices.base!=null){ lines.push(„Basismodell: “ + eur(it.prices.base)); sumB += it.prices.base; } if(it.prices && it.prices.mix!=null){ lines.push(„Guter Mix: “ + eur(it.prices.mix)); sumM += it.prices.mix; } if(it.prices && it.prices.bespoke!=null){ lines.push(„Bespoke: “ + eur(it.prices.bespoke)); sumS += it.prices.bespoke; } lines.push(„——————————–„); }); lines.push(„Summe Basismodell: “ + (sumB?eur(sumB):“—“)); lines.push(„Summe Guter Mix: “ + (sumM?eur(sumM):“—“)); lines.push(„Summe Bespoke: “ + (sumS?eur(sumS):“—“)); lines.push(„“); lines.push(„Nächster Schritt: Vor-Ort-Termin / Planung für exakte Kalkulation.“); return lines.join(„\n“); } function openMail(){ var to = „office@handgedacht.wien“; var subject = „Preisrechner – Anfrage“; var body = cartToMailText(); window.location.href = „mailto:“ + encodeURIComponent(to) + „?subject=“ + encodeURIComponent(subject) + „&body=“ + encodeURIComponent(body); } function compute3Prices(){ var what = el.what.value || „kueche“; var note = currentNote(); var inputs = { „Typ“: labelForWhat(what) }; var detailLines = []; updatePreview(); if(isRoomMode(what)){ var pack = ROOM[what]; var t = roomT(); updateRoomM2(what, t); var stage = (t < 0.34) ? "klein" : (t < 0.67 ? "mittel" : "groß"); var base = lerp(pack.min, pack.max, t); var mix = base * (TIERS.mix.m / TIERS.base.m); var bes = base * (TIERS.bespoke.m / TIERS.base.m); inputs["Größe"] = stage; if(pack.minM2 && pack.maxM2) inputs["Fläche"] = (pack.minM2+"–"+pack.maxM2+" m²"); inputs["Inhalt"] = roomContentText(what, stage); if(note) inputs["Notiz"] = note; detailLines.push("• Paket: „+esc(pack.label)+“„); detailLines.push(„• Größe: „+stage+“„); if(pack.minM2 && pack.maxM2) detailLines.push(„• Fläche: „+pack.minM2+“–“+pack.maxM2+“ m²„); detailLines.push(„• Inhalt: „+esc(roomContentText(what, stage))+“„); if(note) detailLines.push(„• Notiz: „+esc(note)+“„); if(pack.bespokeOnly){ return { label: labelForWhat(what), inputs: inputs, note: note, detailsHtml: detailLines.join(„
    „), prices: { base:null, mix:null, bespoke: base } }; } return { label: labelForWhat(what), inputs: inputs, note: note, detailsHtml: detailLines.join(„
    „), prices: { base: base, mix: mix, bespoke: bes } }; } var lfm = parseFloat(el.lfm.value || „0“); if(!isFinite(lfm)) lfm = 0; el.lfmVal.textContent = lfm; var vFac = volumeFactor(lfm); var corpusCost = 0, frontsCost = 0, otherCost = 0; var fFac = 1.0; if(what === „kueche“){ var form = el.form.value || „line“; fFac = FORM[form] || 1.0; var wallH = el.wallH.value || „0“; var withWall = (wallH !== „0“); var wallFactor = withWall ? (WALL_H_FACTOR[wallH] || 1.0) : 1.0; var wallLfm = withWall ? (parseFloat(el.wallLfm.value || „0“) || 0) : 0; el.wallLfmVal.textContent = wallLfm; var drawers = el.drawers.value || „none“; var islandSel = el.island.value || „none“; corpusCost += lfm * up(KITCHEN.base_lfm); frontsCost += lfm * up(KITCHEN.fronts_base_per_lfm); if(withWall && wallLfm > 0){ frontsCost += wallLfm * up(KITCHEN.fronts_wall_per_lfm * wallFactor); corpusCost += wallLfm * up(KITCHEN.wall_effort_per_lfm * wallFactor); } var d = DRAWERS[drawers] || 0; if(d) otherCost += up(d); if(islandSel !== „none“){ var islLfm = (KITCHEN.island_lfm[islandSel] || 0); corpusCost += (islLfm * up(KITCHEN.base_lfm)) * KITCHEN.island_factor; frontsCost += (islLfm * up(KITCHEN.fronts_base_per_lfm)) * KITCHEN.island_factor; } inputs[„Laufmeter (Grundküche)“] = lfm + “ LFM“; inputs[„Form“] = formLabelKitchen(form); inputs[„Auszüge“] = drawersLabel(drawers); inputs[„Oberkästen / Hochschränke“] = withWall ? („Höhe “ + wallH + “ cm“) : „Ohne“; inputs[„Oberkästen / Hochschränke Laufmeter“] = withWall ? (wallLfm + “ LFM“) : „—“; inputs[„Kücheninsel“] = (islandSel === „none“) ? „Keine“ : (islandSel===“2″ ? „Klein (2 LFM)“ : „Groß (4 LFM)“); detailLines.push(„• Küche: „+lfm+“ LFM„); detailLines.push(„• Form: „+esc(formLabelKitchen(form))+“„); detailLines.push(„• Auszüge: „+esc(drawersLabel(drawers))+“„); detailLines.push(„• Oberkästen / Hochschränke: „+(withWall ? („Höhe „+wallH+“ cm, „+wallLfm+“ LFM“) : „ohne“)+“„); if(islandSel !== „none“) detailLines.push(„• Insel: „+(islandSel===“2″?“klein (2 LFM)“:“groß (4 LFM)“)+“„); var areaM2 = computeFrontAreaM2(„kueche“, lfm, 250, wallH, wallLfm); inputs[„Frontfläche (ca.)“] = (Math.round(areaM2*10)/10).toLocaleString(„de-AT“) + “ m²“; detailLines.push(„• Frontfläche (ca.): „+(Math.round(areaM2*10)/10).toLocaleString(„de-AT“)+“ m²„); } else { var otherForm = el.otherForm.value || „straight“; var otherFormFac = OTHER_FORM[otherForm] || 1.0; var kH = parseInt(el.kastenH.value || „250“,10); if(!isFinite(kH)) kH = 250; var drawers2 = el.drawers.value || „none“; var d2 = DRAWERS[drawers2] || 0; if(d2) otherCost += up(d2); var hFactor = Math.max(0.36, Math.min(1.32, (kH / 250))); var basePerLfm; var closedSel = el.closed.value || „open“; var closedCfg = REGAL_CLOSED[closedSel] || REGAL_CLOSED.open; var hangSel = el.hang.value || „low“; var hangFrontFac = HANG_FRONT_FACTOR[hangSel] || 1.0; if(what === „dachschraege“){ basePerLfm = OTHER.kasten; var first = Math.min(DACH.firstLfm, lfm); var rest = Math.max(0, lfm – DACH.firstLfm); corpusCost += first * up(basePerLfm) * DACH.upliftFirst * hFactor * otherFormFac; corpusCost += rest * up(basePerLfm) * 1.0 * hFactor * otherFormFac; inputs[„Dachschräge“] = „Erste “ + DACH.firstLfm + “ LFM +30%“; detailLines.push(„• Dachschräge: erste 2,5 LFM +30%„); } else { basePerLfm = OTHER[what] || 1100; var effort = 1.0; if(what === „regal“) effort *= (closedCfg.effort || 1.0); corpusCost += lfm * up(basePerLfm) * hFactor * otherFormFac * effort; } var areaBase = computeFrontAreaM2(what, lfm, kH, „0“, 0); var areaForFronts = areaBase; if(what === „garderobe“) areaForFronts = areaBase * hangFrontFac; if(what === „regal“) areaForFronts = areaBase * (closedCfg.frontFactor || 0.05); frontsCost += areaForFronts * up(FRONT_BASE_PER_M2); inputs[„Laufmeter“] = lfm + “ LFM“; inputs[„Kastenhöhe“] = kH + “ cm“; inputs[„Form“] = formLabelOther(otherForm); inputs[„Auszüge“] = drawersLabel(drawers2); detailLines.push(„• „+esc(labelForWhat(what))+“: „+lfm+“ LFM„); detailLines.push(„• Höhe: „+kH+“ cm„); detailLines.push(„• Form: „+esc(formLabelOther(otherForm))+“„); detailLines.push(„• Auszüge: „+esc(drawersLabel(drawers2))+“„); if(what === „garderobe“){ inputs[„Offen hängen“] = hangLabel(hangSel); detailLines.push(„• Offen hängen: „+esc(hangLabel(hangSel))+“„); } if(what === „regal“){ inputs[„Geschlossen“] = closedCfg.label; detailLines.push(„• Geschlossen: „+esc(closedCfg.label)+“„); } inputs[„Frontfläche (ca.)“] = (Math.round(areaBase*10)/10).toLocaleString(„de-AT“) + “ m²“; detailLines.push(„• Frontfläche (ca.): „+(Math.round(areaBase*10)/10).toLocaleString(„de-AT“)+“ m²„); } var raw = (corpusCost + frontsCost + otherCost) * fFac * vFac; var baseTotal = raw * TIERS.base.m; var mixTotal = raw * TIERS.mix.m; var besTotal = raw * TIERS.bespoke.m; if(note){ inputs[„Notiz“] = note; detailLines.push(„• Notiz: „+esc(note)+“„); } return { label: labelForWhat(what), inputs: inputs, note: note, detailsHtml: detailLines.join(„
    „), prices: { base: baseTotal, mix: mixTotal, bespoke: besTotal } }; } function setResult(res, closeDetails){ el.resBase.textContent = (res.prices.base==null) ? „—“ : eur(res.prices.base); el.resMix.textContent = (res.prices.mix==null) ? „—“ : eur(res.prices.mix); el.resBespoke.textContent = (res.prices.bespoke==null) ? „—“ : eur(res.prices.bespoke); el.detailsBox.innerHTML = res.detailsHtml || „“; if(closeDetails) el.detailsBox.style.display = „none“; lastResult = res; } function render(){ var what = el.what.value || „kueche“; var roomMode = isRoomMode(what); el.roomSizeField.style.display = roomMode ? „grid“ : „none“; el.lfmField.style.display = roomMode ? „none“ : „grid“; el.kitchenOnly.style.display = (!roomMode && what===“kueche“) ? „grid“ : „none“; el.formField.style.display = (!roomMode && what===“kueche“) ? „grid“ : „none“; var otherLfmType = (!roomMode && what!==“kueche“ && (what===“kasten“ || what===“dachschraege“ || what===“garderobe“ || what===“regal“)); el.otherFormField.style.display = otherLfmType ? „grid“ : „none“; el.kastenField.style.display = otherLfmType ? „grid“ : „none“; el.drawersField.style.display = (!roomMode) ? „grid“ : „none“; el.hangField.style.display = (!roomMode && what===“garderobe“) ? „grid“ : „none“; el.closedField.style.display = (!roomMode && what===“regal“) ? „grid“ : „none“; var showWallLfm = (!roomMode && what===“kueche“ && (el.wallH.value || „0“) !== „0“); el.wallLfmField.style.display = showWallLfm ? „grid“ : „none“; if(!showWallLfm){ el.wallLfm.value = „0“; el.wallLfmVal.textContent = „0“; } el.resultLabel.textContent = roomMode ? „Richtwert (klein → groß)“ : (what===“kueche“ ? „Orientierungswert (Küche ohne Geräte)“ : „Orientierungswert (Möbelbau)“); var res = compute3Prices(); setResult(res, true); } function openOverlay(){ el.overlay.style.display = „flex“; el.overlay.setAttribute(„aria-hidden“,“false“); renderCart(); } function closeOverlay(){ el.overlay.style.display = „none“; el.overlay.setAttribute(„aria-hidden“,“true“); } function renderCart(){ if(CART.length === 0){ el.cartList.innerHTML = ‚
    ‚ + ‚
    ‚ + ‚
    Noch keine Positionen
    ‚ + ‚
    Tippe im Rechner auf „Neue Position hinzufügen“.
    ‚ + ‚
    ‚ + ‚
    ‚ + ‚
    ‚; el.sumBase.textContent = „—“; el.sumMix.textContent = „—“; el.sumBespoke.textContent = „—“; return; } var sumB=0,sumM=0,sumS=0; var html = „“; CART.forEach(function(it, idx){ var metaText = inputsToText(it.inputs || {}); if(it.note) metaText += (metaText ? „\n“ : „“) + „Notiz: “ + it.note; var b = (it.prices && it.prices.base!=null) ? it.prices.base : null; var m = (it.prices && it.prices.mix!=null) ? it.prices.mix : null; var s = (it.prices && it.prices.bespoke!=null) ? it.prices.bespoke : null; if(b!=null) sumB += b; if(m!=null) sumM += m; if(s!=null) sumS += s; html += ‚
    ‚ + ‚
    ‚ + ‚
    ‚ + esc(it.label) + ‚
    ‚ + ‚
    ‚ + esc(metaText) + ‚
    ‚ + ‚‚ + ‚
    ‚ + ‚
    ‚ + ‚
    Base‚ + (b==null?“—“:eur(b)) + ‚
    ‚ + ‚
    Mix‚ + (m==null?“—“:eur(m)) + ‚
    ‚ + ‚
    Bespoke‚ + (s==null?“—“:eur(s)) + ‚
    ‚ + ‚
    ‚ + ‚
    ‚; }); el.cartList.innerHTML = html; el.sumBase.textContent = sumB ? eur(sumB) : „—“; el.sumMix.textContent = sumM ? eur(sumM) : „—“; el.sumBespoke.textContent = sumS ? eur(sumS) : „—“; qa(„.hg-cart-remove“).forEach(function(btn){ btn.addEventListener(„click“, function(){ var i = parseInt(btn.getAttribute(„data-idx“),10); if(isFinite(i)) CART.splice(i,1); renderCart(); }); }); } function addCurrentToCart(){ if(!lastResult || !lastResult.prices) return; CART.push({ label: lastResult.label, inputs: lastResult.inputs || {}, note: lastResult.note || „“, prices: lastResult.prices || { base:null, mix:null, bespoke:null } }); openOverlay(); } function toggleDeepDive(){ var open = (el.deepBox.style.display !== „none“ && el.deepBox.style.display !== „“); el.deepBox.style.display = open ? „none“ : „block“; el.deepBtn.setAttribute(„aria-expanded“, String(!open)); el.deepPlus.textContent = open ? „+“ : „−“; } // Bind el.deepBtn.addEventListener(„click“, toggleDeepDive); el.what.addEventListener(„change“, render); el.roomSize.addEventListener(„input“, function(){ render(); }); el.note.addEventListener(„input“, function(){ updatePreview(); if(el.detailsBox.style.display === „block“) render(); }); el.form.addEventListener(„change“, render); el.lfm.addEventListener(„input“, render); el.drawers.addEventListener(„change“, render); el.wallH.addEventListener(„change“, render); el.wallLfm.addEventListener(„input“, render); el.island.addEventListener(„change“, render); el.otherForm.addEventListener(„change“, render); el.kastenH.addEventListener(„change“, render); el.hang.addEventListener(„change“, render); el.closed.addEventListener(„change“, render); el.detailsBtn.addEventListener(„click“, function(){ el.detailsBox.style.display = (el.detailsBox.style.display === „none“ || !el.detailsBox.style.display) ? „block“ : „none“; if(el.detailsBox.style.display === „block“) render(); }); el.addBtn.addEventListener(„click“, addCurrentToCart); el.closeOverlay.addEventListener(„click“, closeOverlay); el.continueBtn.addEventListener(„click“, closeOverlay); el.clearCart.addEventListener(„click“, function(){ CART = []; renderCart(); }); el.sendMail.addEventListener(„click“, function(){ if(CART.length) openMail(); }); el.sendMailInline.addEventListener(„click“, function(){ if(!CART.length) addCurrentToCart(); openMail(); }); el.overlay.addEventListener(„click“, function(e){ if(e.target === el.overlay) closeOverlay(); }); render(); } // init all instances on page function boot(){ document.querySelectorAll(„[data-hg-root]“).forEach(init); } if(document.readyState === „loading“) document.addEventListener(„DOMContentLoaded“, boot); else boot(); })();
  • If What / Stadtzeichen

    PREISRECHNER

    Grobe Orientierung.

    Du bekommst hier einen realistischen Richtwert – damit du schnell weißt, ob wir im gleichen Budget-Raum sind.

    PREISMODELLE
    Kurz & klar.
    Basismodell
    Klar & funktional. Gute Lösung, wenige Sonderdetails.
    Guter Mix
    Ausgewogen. Mehr Details, sauberer Ausbau, stimmiges Gesamtbild.
    Bespoke
    Individuell gebaut. Hoher Detailgrad, Sonderlösungen, Design-Fokus.
    Was ist es? Küche Kästen / Einbauschrank Dachschrägenkorpus Garderobe Regal / Bücherregal Badezimmer (als Raum gedacht) Schlafzimmer (als Raum gedacht) Kinder- & Jugendzimmer (als Raum gedacht) Wohnzimmer (als Raum gedacht) Vorraum (als Raum gedacht) Hochebene / Podestlösung Handgefertigter Tisch (Massivholz)
    Was ist drinnen?
    Richtwert: Möbelbau.
    Raumgröße
    mittel
    Form Gerade / Zeile L-Form U-Form Form Gerade Über Eck In Nische / um Wände Laufmeter
    6 LFM
    Kastenhöhe 90 cm 150 cm 210 cm 250 cm (Standard) 330 cm Auszüge / Laden Keine Wenig Viele Offen hängen Wenig (mehr geschlossen) Viel auf Kleiderstange Viel auf Haken Geschlossen Alles offen Teilweise geschlossen Mehr geschlossen Oberkästen / Hochschränke Laufmeter
    0 LFM
    Orientierungswert
    Basismodell
    Guter Mix
    Bespoke

    Richtwert. Exakte Kalkulation erfolgt nach Planung & Aufmaß.

    Wenn das grob passt: schick uns die Positionen – wir melden uns mit den nächsten sinnvollen Schritten.
    /* ===== base layout (scoped) ===== */ .hg-vorort .hg-wrap{max-width:980px;margin:0 auto;padding:0 clamp(18px,3vw,52px);} .hg-vorort .hg-eyebrow{font-size:12px;font-weight:900;letter-spacing:.16em;text-transform:uppercase;margin:0 0 8px 0;opacity:.75;} .hg-vorort .hg-headline{margin:0;font-size:clamp(22px,3vw,34px);line-height:1.15;font-weight:950;} .hg-vorort .hg-lead{margin:10px 0 14px 0;max-width:760px;font-size:15px;line-height:1.55;font-weight:700;opacity:.9;} .hg-vorort .hg-calc{max-width:760px;margin:8px 0 0 0;} .hg-vorort .hg-calc-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;align-items:start;} @media (max-width:720px){ .hg-vorort .hg-calc-grid{grid-template-columns:1fr;} } .hg-vorort .hg-span-2{grid-column:span 2;} @media (max-width:720px){ .hg-vorort .hg-span-2{grid-column:auto;} } .hg-vorort .hg-calc-field{display:grid;gap:6px;align-content:start;} .hg-vorort .hg-calc-label{ font-size:13px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;margin:0; min-height:16px;line-height:16px;display:flex;align-items:flex-end; } .hg-vorort .hg-label-row{display:flex;align-items:center;gap:10px;} .hg-vorort .hg-info{ width:18px;height:18px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center; font-size:12px;font-weight:900;line-height:1;background:#000;color:#fff;box-shadow:inset 0 0 0 2px #000; cursor:help; user-select:none; } .hg-vorort .hg-info:focus{outline:2px solid rgba(0,0,0,.35); outline-offset:2px;} .hg-vorort .hg-calc-input{ width:100%;height:48px;padding:0 14px;background:#000;color:#fff;border:0;border-radius:8px; font:inherit;box-shadow:inset 0 0 0 2px #000;outline:none; } .hg-vorort .hg-calc-range{width:100%;-webkit-appearance:none;appearance:none;height:8px;background:#000;border-radius:999px;outline:none;} .hg-vorort .hg-calc-range::-webkit-slider-thumb{ -webkit-appearance:none;appearance:none;width:18px;height:18px;border-radius:999px;background:#fff;border:2px solid #000;cursor:pointer; } .hg-vorort .hg-calc-range::-moz-range-thumb{width:18px;height:18px;border-radius:999px;background:#fff;border:2px solid #000;cursor:pointer;} .hg-vorort .hg-calc-meta{margin-top:6px;} .hg-vorort .hg-calc-pill{ display:inline-flex;align-items:center;gap:10px;height:32px;padding:0 12px;background:#000;color:#fff; border-radius:999px;box-shadow:inset 0 0 0 2px #000;font-size:14px;font-weight:800; } .hg-vorort .hg-model-sub{font-weight:700;letter-spacing:.02em;opacity:.9;font-size:13px;white-space:nowrap;} .hg-vorort .hg-calc-kitchen{display:grid;grid-template-columns:1fr 1fr;gap:12px;} @media (max-width:720px){ .hg-vorort .hg-calc-kitchen{grid-template-columns:1fr;} } .hg-vorort .hg-calc-result{ margin-top:6px;padding:16px;border-radius:18px;box-shadow:inset 0 0 0 2px #000;background:#fff; } .hg-vorort .hg-calc-sub{font-size:13px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;margin:0 0 8px 0;opacity:.85;} .hg-vorort .hg-actions{display:flex;gap:10px;flex-wrap:wrap;} .hg-vorort .hg-calc-btn{ display:inline-flex;align-items:center;justify-content:center;height:48px;padding:0 22px; font-size:15px;font-weight:700;border-radius:4px;background:#000;color:#fff;border:0;cursor:pointer; } .hg-vorort .hg-calc-btn-ghost{background:#fff;color:#000;box-shadow:inset 0 0 0 2px #000;} .hg-vorort .hg-plus{display:inline-block;font-weight:900;font-size:18px;line-height:0;margin-right:10px;transform:translateY(-1px);} .hg-vorort .hg-calc-details{margin-top:12px;padding:12px 14px;border-radius:14px;box-shadow:inset 0 0 0 1px #222;background:#fff;font-size:15px;line-height:1.55;} .hg-vorort .hg-calc-note{ width:100%;min-height:46px;padding:12px 14px;background:#fff;color:#000;border:0;border-radius:10px; box-shadow:inset 0 0 0 2px #000;font:inherit;resize:vertical; } /* Text-Vorschau */ .hg-vorort .hg-preview{ padding:12px 14px;border-radius:14px;background:#fff;box-shadow:inset 0 0 0 2px #000;display:grid;gap:8px; } .hg-vorort .hg-preview-head{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;opacity:.85;} .hg-vorort .hg-preview-body{font-size:15px;line-height:1.5;font-weight:750;} .hg-vorort .hg-preview-meta{display:flex;gap:10px;flex-wrap:wrap;align-items:center;} .hg-vorort .hg-preview-hint{font-size:12px;font-weight:700;opacity:.72;} /* 3-Preis Grid – clean */ .hg-vorort .hg-pricegrid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;} @media (max-width:720px){ .hg-vorort .hg-pricegrid{grid-template-columns:1fr;} } .hg-vorort .hg-pricegrid-clean .hg-pricebox{ padding:12px 12px 14px;border-radius:14px;box-shadow:inset 0 0 0 2px #000;background:#fff; display:grid;grid-template-rows:auto auto;align-content:start;min-height:86px; } .hg-vorort .hg-pricegrid-clean .hg-pricebox-h{ font-size:11px;font-weight:900;letter-spacing:.16em;text-transform:uppercase;opacity:.78;margin:0 0 2px 0; } .hg-vorort .hg-pricegrid-clean .hg-pricebox-v{ font-size:24px;font-weight:950;line-height:1.05;letter-spacing:.01em;font-variant-numeric: tabular-nums; } /* Overlay */ .hg-vorort .hg-overlay{ position:fixed;inset:0;background:rgba(0,0,0,.55); display:flex;align-items:flex-end;justify-content:center;padding:18px;z-index:9999; } @media (min-width:760px){ .hg-vorort .hg-overlay{align-items:center;} } .hg-vorort .hg-modal{ width:min(720px, 100%);background:#fff;border-radius:18px; box-shadow:0 40px 120px rgba(0,0,0,.35), inset 0 0 0 2px #000;padding:16px; } .hg-vorort .hg-modal-head{ display:flex;align-items:flex-start;justify-content:space-between;gap:14px; padding-bottom:12px;margin-bottom:12px;border-bottom:1px solid rgba(0,0,0,.12); } .hg-vorort .hg-modal-eyebrow{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;margin:0 0 4px 0;} .hg-vorort .hg-modal-title{font-size:20px;font-weight:900;line-height:1.2;margin:0;} .hg-vorort .hg-modal-x{ width:44px;height:44px;border-radius:10px;border:0;background:#000;color:#fff;cursor:pointer;font-size:22px;line-height:1; } .hg-vorort .hg-cart{display:grid;gap:10px;} .hg-vorort .hg-cart-item{ display:grid;grid-template-columns:1fr auto;gap:10px;padding:12px;border-radius:12px;box-shadow:inset 0 0 0 2px #000; } .hg-vorort .hg-cart-top{display:flex;flex-direction:column;gap:6px;} .hg-vorort .hg-cart-label{font-size:14px;font-weight:900;line-height:1.2;} .hg-vorort .hg-cart-meta{font-size:13px;opacity:.82;line-height:1.45;white-space:pre-line;} .hg-vorort .hg-cart-pricecol{display:grid;gap:6px;align-content:start;justify-items:end;} .hg-vorort .hg-cart-price{font-size:14px;font-weight:900;white-space:nowrap;} .hg-vorort .hg-cart-price small{display:block;font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;opacity:.75;margin-bottom:2px;} .hg-vorort .hg-cart-remove{ margin-top:6px;height:36px;padding:0 12px;border-radius:10px;border:0;background:#fff;color:#000; box-shadow:inset 0 0 0 2px #000;cursor:pointer;font-weight:800; } .hg-vorort .hg-cart-sum{ display:flex;align-items:flex-start;justify-content:space-between;margin-top:12px;padding-top:12px;border-top:1px solid rgba(0,0,0,.12);gap:12px; } .hg-vorort .hg-cart-sum-label{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;} .hg-vorort .hg-cart-sum-vals{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;} .hg-vorort .hg-cart-sum-pill{ display:inline-flex;gap:8px;align-items:baseline;padding:8px 10px;border-radius:999px;box-shadow:inset 0 0 0 2px #000;font-weight:900; } .hg-vorort .hg-cart-sum-pill span{font-size:11px;letter-spacing:.12em;text-transform:uppercase;opacity:.75;} .hg-vorort .hg-cart-sum-pill b{font-size:14px;} .hg-vorort .hg-modal-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px;} /* Preismodelle */ .hg-vorort .hg-trust-min{ max-width:760px;margin:0 0 16px 0;padding:14px 0;background:#fff; border-top:1px solid rgba(0,0,0,.14);border-bottom:1px solid rgba(0,0,0,.14); } .hg-vorort .hg-trust-head{ padding:0 2px 10px;display:flex;align-items:baseline;justify-content:space-between;gap:12px; } .hg-vorort .hg-trust-kicker,.hg-vorort .hg-trust-title{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;} .hg-vorort .hg-trust-kicker{opacity:.75;} .hg-vorort .hg-trust-title{opacity:.9;} .hg-vorort .hg-trust-min-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:0;border-left:2px solid #000;} @media (max-width:720px){ .hg-vorort .hg-trust-min-grid{grid-template-columns:1fr;} } .hg-vorort .hg-trust-min-col{padding:10px 12px 12px;border-left:1px solid rgba(0,0,0,.14);} .hg-vorort .hg-trust-min-col:first-child{border-left:0;} .hg-vorort .hg-trust-min-h{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;margin:0 0 6px 0;} .hg-vorort .hg-trust-min-p{margin:0;font-size:13px;line-height:1.45;font-weight:700;opacity:.85;} .hg-vorort .hg-trust-min-toggle{ width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;cursor:pointer;border:0; } .hg-vorort .hg-trust-toggle-like-input{ height:48px;padding:0 14px;border-radius:8px;background:#000;color:#fff;box-shadow:inset 0 0 0 2px #000; font:inherit;font-weight:800;letter-spacing:.02em; } .hg-vorort .hg-trust-toggle-like-input:focus{ outline:2px solid rgba(0,0,0,.35); outline-offset:2px; } .hg-vorort .hg-trust-min-plus{ width:34px;height:34px;border-radius:10px;background:#fff;color:#000;display:flex;align-items:center;justify-content:center; font-weight:900;box-shadow:inset 0 0 0 2px #000; } .hg-vorort .hg-trust-deep{margin-top:12px;} .hg-vorort .hg-trust-deep-block{padding:12px;border-radius:14px;border:1px solid rgba(0,0,0,.14);background:#fff;} .hg-vorort .hg-trust-deep-head{font-size:12px;font-weight:900;letter-spacing:.14em;text-transform:uppercase;margin:0 0 6px 0;} .hg-vorort .hg-trust-deep-body{font-size:13px;line-height:1.5;opacity:.88;font-weight:700;} /* CTA */ .hg-vorort .hg-cta{display:flex;gap:10px;align-items:center;justify-content:space-between;flex-wrap:wrap;} .hg-vorort .hg-cta-text{font-size:13px;line-height:1.45;opacity:.85;font-weight:750;max-width:520px;} (function(){ function eur(n){ return Math.round(n).toLocaleString(„de-AT“) + “ €“; } function lerp(a,b,t){ return a + (b-a)*t; } function clamp(n,a,b){ return Math.max(a, Math.min(b,n)); } function esc(s){ return String(s).replace(/&/g,“&“).replace(//g,“>“) .replace(/“/g,“"“).replace(/’/g,“'“); } var GLOBAL_UPLIFT = 1.62; var TIERS = { base: { m:1.00 }, mix: { m:1.20 }, bespoke: { m:1.44 } }; var ROOM = { room_bad_raum: { label:“Badezimmer (als Raum gedacht)“, min: 6000, max:15000, minM2:6, maxM2:13 }, room_schlafzimmer: { label:“Schlafzimmer (als Raum gedacht)“, min:15000, max:30000, minM2:12, maxM2:20 }, room_kinderzimmer: { label:“Kinder- & Jugendzimmer (als Raum gedacht)“, min:15000, max:30000, minM2:10, maxM2:18 }, room_wohnzimmer_raum: { label:“Wohnzimmer (als Raum gedacht)“, min:15000, max:40000, minM2:17, maxM2:30 }, room_vorraum: { label:“Vorraum (als Raum gedacht)“, min:10000, max:25000, minM2:5, maxM2:16 }, room_podest: { label:“Hochebene / Podestlösung“, bespokeOnly:true, min:13000, max:28000 }, room_tisch: { label:“Handgefertigter Tisch (Massivholz)“, bespokeOnly:true, min: 4000, max: 6500 } }; var FORM = { line:1.00, l:1.06, u:1.12 }; var OTHER_FORM = { straight:1.00, corner:1.05, niche:1.10 }; var DRAWERS = { none:0, few:900, many:1800 }; var KITCHEN = { base_lfm: 1100, fronts_base_per_lfm: 410, fronts_wall_per_lfm: 640, wall_effort_per_lfm: 420, island_factor: 1.05, island_lfm: { „2“:2, „4“:4 } }; var FRONT_BASE_PER_M2 = (KITCHEN.fronts_base_per_lfm / 0.90); var OTHER = { kasten:1625, garderobe:1438, regal:690 }; var DACH = { firstLfm: 2.5, upliftFirst: 1.30 }; var WALL_H_FACTOR = { „210“:0.90, „250“:1.00, „330“:1.25 }; var HANG_FRONT_FACTOR = { low:1.00, rod:0.65, hooks:0.60 }; var REGAL_CLOSED = { open: { frontFactor:0.05, effort:1.00, label:“Alles offen“ }, part: { frontFactor:0.40, effort:1.06, label:“Teilweise geschlossen“ }, more: { frontFactor:0.70, effort:1.12, label:“Mehr geschlossen“ } }; function up(n){ return n * GLOBAL_UPLIFT; } function isRoomMode(what){ return !!ROOM[what]; } function volumeFactor(lfm){ var x = Math.max(2, Math.min(20, lfm)); if(x 0) area += wallLfm * (parseInt(wallH,10)/100); return Math.max(0, area); } var h = (parseInt(kH,10)/100); return Math.max(0, lfm * h); } function roomContentText(what, stage){ if(what === „room_bad_raum“){ return (stage===“klein“) ? „Bad klein: Waschtisch + Stauraum, Dusche/Badewanne, WC (Basis).“ : (stage===“mittel“) ? „Bad mittel: mehr Stauraum/Einbauten, mehr Details in Ausführung.“ : „Bad groß: mehr Stauraum + optional 2. Waschtisch, insgesamt mehr Fläche/Elemente.“; } if(what === „room_kinderzimmer“){ return (stage===“groß“) ? „Kinderzimmer groß: 2 Betten + 2 Schreibtische + mehr Stauraum/Regale.“ : „Kinderzimmer “ + stage + „: 1 Bett + 1 Schreibtisch + Kasten/Regal (je nach Größe mehr Elemente).“; } if(what === „room_wohnzimmer_raum“){ return (stage===“klein“) ? „Wohnzimmer klein: Sideboard/Lowboard + einzelne Einbauten.“ : (stage===“mittel“) ? „Wohnzimmer mittel: mehr Elemente (Sideboard + zusätzliche Kästen/Regale).“ : „Wohnzimmer groß: mehr Laufmeter (Wohnwand/Einbauten) + zusätzliche Elemente.“; } if(what === „room_vorraum“){ return (stage===“klein“) ? „Vorraum klein: Garderobenlösung + Schuhbereich.“ : (stage===“mittel“) ? „Vorraum mittel: mehr Garderobe + Bank/Schuh + zusätzliche Einbauten.“ : „Vorraum groß: mehr Garderobenlaufmeter + zusätzlicher Stauraum/Regalbereiche.“; } if(what === „room_schlafzimmer“){ return (stage===“klein“) ? „Schlafzimmer klein: Kastenlösung + Bettbereich/Sideelemente.“ : (stage===“mittel“) ? „Schlafzimmer mittel: mehr Einbauten + z.B. kleiner Arbeitsplatz/Details.“ : „Schlafzimmer groß: mehr Laufmeter Kasten + zusätzliche Einbauten/Details.“; } if(what === „room_podest“){ return (stage===“klein“) ? „Podest klein: kompakte Hochebene/Podest + Stiege.“ : (stage===“mittel“) ? „Podest mittel: mehr Fläche/Stauraum im Podest + mehr Detailgrad.“ : „Podest groß: mehr Fläche + mehr Stufen/Einbauten (komplexer).“; } if(what === „room_tisch“){ return (stage===“klein“) ? „Tisch klein: kompakter Massivholztisch.“ : (stage===“mittel“) ? „Tisch mittel: größerer Tisch (länger).“ : „Tisch groß: deutlich länger/größer (mehr Material + Konstruktion).“; } return „Raum/Paket: klein → groß bedeutet mehr Elemente/Fläche/Detailgrad.“; } function init(root){ function q(sel){ return root.querySelector(sel); } function qa(sel){ return Array.prototype.slice.call(root.querySelectorAll(sel)); } function get(key){ return q(‚[data-hg=“‚+key+'“]‘); } var el = { what: get(„what“), note: get(„note“), previewText: get(„previewText“), previewM2: get(„previewM2“), previewHint: get(„previewHint“), roomSizeField: get(„roomSizeField“), roomSize: get(„roomSize“), roomSizeLabel: get(„roomSizeLabel“), roomSizeSub: get(„roomSizeSub“), formField: get(„formField“), form: get(„form“), otherFormField: get(„otherFormField“), otherForm: get(„otherForm“), lfmField: get(„lfmField“), lfm: get(„lfm“), lfmVal: get(„lfmVal“), kastenField: get(„kastenField“), kastenH: get(„kastenH“), drawersField: get(„drawersField“), drawers: get(„drawers“), hangField: get(„hangField“), hang: get(„hang“), closedField: get(„closedField“), closed: get(„closed“), kitchenOnly: get(„kitchenOnly“), wallH: get(„wallH“), island: get(„island“), wallLfmField: get(„wallLfmField“), wallLfm: get(„wallLfm“), wallLfmVal: get(„wallLfmVal“), resultLabel: get(„resultLabel“), resBase: get(„resBase“), resMix: get(„resMix“), resBespoke: get(„resBespoke“), detailsBtn: get(„detailsBtn“), detailsBox: get(„detailsBox“), addBtn: get(„addBtn“), sendMailInline: get(„sendMailInline“), overlay: get(„overlay“), cartList: get(„cartList“), sumBase: get(„sumBase“), sumMix: get(„sumMix“), sumBespoke: get(„sumBespoke“), closeOverlay: get(„closeOverlay“), continueBtn: get(„continue“), clearCart: get(„clearCart“), sendMail: get(„sendMail“), deepBtn: get(„deepBtn“), deepBox: get(„deepBox“), deepPlus: get(„deepPlus“) }; if(!el.what || !el.resMix) return; var CART = []; var lastResult = null; function currentNote(){ var v = el.note ? (el.note.value || „“).trim() : „“; return v; } function roomT(){ var p = parseInt(el.roomSize.value, 10); if(!isFinite(p)) p = 50; var t = clamp(p,0,100)/100; var label = (t < 0.34) ? "klein" : (t < 0.67 ? "mittel" : "groß"); el.roomSizeLabel.textContent = label; return t; } function updateRoomM2(what, t){ var pack = ROOM[what]; if(!pack){ el.roomSizeSub.textContent = "—"; return; } if(pack.minM2 && pack.maxM2){ var now = lerp(pack.minM2, pack.maxM2, t); el.roomSizeSub.textContent = "ca. " + (Math.round(now*10)/10).toLocaleString("de-AT") + " m² (" + pack.minM2 + "–" + pack.maxM2 + " m²)"; return; } el.roomSizeSub.textContent = "Richtwert (klein → groß)"; } function setPreview(html, m2Text){ el.previewText.innerHTML = html || "—"; el.previewM2.textContent = m2Text || "—"; } function updatePreview(){ var what = el.what.value || "kueche"; var roomMode = isRoomMode(what); el.previewHint.textContent = (what === "kueche") ? "Richtwert: Möbelbau – Küche ohne Geräte." : "Richtwert: Möbelbau."; var note = currentNote(); if(roomMode){ var t = roomT(); updateRoomM2(what, t); var stage = (t < 0.34) ? "klein" : (t < 0.67 ? "mittel" : "groß"); var pack = ROOM[what]; var m2Txt = "Richtwert (klein → groß)"; if(pack && pack.minM2 && pack.maxM2){ var now = lerp(pack.minM2, pack.maxM2, t); m2Txt = "ca. " + (Math.round(now*10)/10).toLocaleString("de-AT") + " m² (" + pack.minM2 + "–" + pack.maxM2 + " m²)"; } var content = roomContentText(what, stage) + (note ? (" | Notiz: " + note) : ""); setPreview("„+esc(labelForWhat(what))+“
    „+esc(content), m2Txt); return; } var lfm = parseFloat(el.lfm.value || „6“); if(!isFinite(lfm)) lfm = 6; var kH = parseInt(el.kastenH.value || „250“,10); if(!isFinite(kH)) kH = 250; var drawers = el.drawers.value || „none“; if(what === „kueche“){ var form = el.form.value || „line“; var wallH = el.wallH.value || „0“; var withWall = (wallH !== „0“); var wallLfm = withWall ? (parseFloat(el.wallLfm.value || „0“) || 0) : 0; var islandSel = el.island.value || „none“; var areaM2 = computeFrontAreaM2(„kueche“, lfm, 250, wallH, wallLfm); var areaTxt = „Frontfläche ca. “ + (Math.round(areaM2*10)/10).toLocaleString(„de-AT“) + “ m²“; var txt = „Küche
    “ + „Grundküche: “ + lfm + “ LFM (“ + esc(formLabelKitchen(form)) + „). “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (withWall ? („Oberkästen / Hochschränke: Höhe “ + wallH + “ cm, “ + wallLfm + “ LFM. „) : „Oberkästen / Hochschränke: ohne. „) + (islandSel !== „none“ ? („Insel: “ + (islandSel===“2″ ? „klein (2 LFM)“ : „groß (4 LFM)“) + „. „) : „“) + (note ? („Notiz: “ + esc(note) + „. „) : „“) + „Orientierung für Möbelbau (ohne Geräte).“; setPreview(txt, areaTxt); return; } var otherForm = el.otherForm.value || „straight“; var area = computeFrontAreaM2(what, lfm, kH, „0“, 0); var areaTxt2 = „Frontfläche ca. “ + (Math.round(area*10)/10).toLocaleString(„de-AT“) + “ m²“; if(what === „garderobe“){ var hang = el.hang.value || „low“; setPreview( „Garderobe
    “ + lfm + “ LFM, Höhe “ + kH + “ cm. Form: “ + esc(formLabelOther(otherForm)) + „. “ + „Offen hängen: “ + esc(hangLabel(hang)) + „. “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (note ? („Notiz: “ + esc(note) + „. „) : „“), areaTxt2 ); return; } if(what === „regal“){ var closed = el.closed.value || „open“; var c = REGAL_CLOSED[closed] || REGAL_CLOSED.open; setPreview( „Regal / Bücherregal
    “ + lfm + “ LFM, Höhe “ + kH + “ cm. Form: “ + esc(formLabelOther(otherForm)) + „. “ + „Geschlossen: “ + esc(c.label) + „. “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (note ? („Notiz: “ + esc(note) + „. „) : „“), areaTxt2 ); return; } if(what === „dachschraege“){ setPreview( „Dachschrägenkorpus
    “ + lfm + “ LFM, Höhe “ + kH + “ cm. Form: “ + esc(formLabelOther(otherForm)) + „. “ + „Erste 2,5 LFM sind +30% (Dachschrägen-Start). “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (note ? („Notiz: “ + esc(note) + „. „) : „“), areaTxt2 ); return; } if(what === „kasten“){ setPreview( „Kästen / Einbauschrank
    “ + lfm + “ LFM, Höhe “ + kH + “ cm. Form: “ + esc(formLabelOther(otherForm)) + „. “ + „Auszüge: “ + esc(drawersLabel(drawers)) + „. “ + (note ? („Notiz: “ + esc(note) + „. „) : „“) + „Mehr LFM/Höhe = mehr Frontfläche & mehr Aufwand.“, areaTxt2 ); return; } setPreview(„—“,“—“); } function inputsToText(inputs){ var out = []; Object.keys(inputs || {}).forEach(function(k){ var v = inputs[k]; if(v === null || v === undefined) return; var s = String(v).trim(); if(!s) return; out.push(k + „: “ + s); }); return out.join(„\n“); } function cartToMailText(){ var lines = []; lines.push(„Handgedacht – Preisrechner Anfrage“); lines.push(„“); lines.push(„Hinweis: Richtwert nur für Möbelbau. Küchenpreise ohne Geräte.“); lines.push(„“); if(CART.length === 0){ lines.push(„Keine Positionen im Warenkorb.“); return lines.join(„\n“); } var sumB=0,sumM=0,sumS=0; CART.forEach(function(it, idx){ lines.push(„Position “ + (idx+1) + „: “ + it.label); lines.push(inputsToText(it.inputs)); if(it.note) lines.push(„Notiz: “ + it.note); if(it.prices && it.prices.base!=null){ lines.push(„Basismodell: “ + eur(it.prices.base)); sumB += it.prices.base; } if(it.prices && it.prices.mix!=null){ lines.push(„Guter Mix: “ + eur(it.prices.mix)); sumM += it.prices.mix; } if(it.prices && it.prices.bespoke!=null){ lines.push(„Bespoke: “ + eur(it.prices.bespoke)); sumS += it.prices.bespoke; } lines.push(„——————————–„); }); lines.push(„Summe Basismodell: “ + (sumB?eur(sumB):“—“)); lines.push(„Summe Guter Mix: “ + (sumM?eur(sumM):“—“)); lines.push(„Summe Bespoke: “ + (sumS?eur(sumS):“—“)); lines.push(„“); lines.push(„Nächster Schritt: Vor-Ort-Termin / Planung für exakte Kalkulation.“); return lines.join(„\n“); } function openMail(){ var to = „office@handgedacht.wien“; var subject = „Preisrechner – Anfrage“; var body = cartToMailText(); window.location.href = „mailto:“ + encodeURIComponent(to) + „?subject=“ + encodeURIComponent(subject) + „&body=“ + encodeURIComponent(body); } function compute3Prices(){ var what = el.what.value || „kueche“; var note = currentNote(); var inputs = { „Typ“: labelForWhat(what) }; var detailLines = []; updatePreview(); if(isRoomMode(what)){ var pack = ROOM[what]; var t = roomT(); updateRoomM2(what, t); var stage = (t < 0.34) ? "klein" : (t < 0.67 ? "mittel" : "groß"); var base = lerp(pack.min, pack.max, t); var mix = base * (TIERS.mix.m / TIERS.base.m); var bes = base * (TIERS.bespoke.m / TIERS.base.m); inputs["Größe"] = stage; if(pack.minM2 && pack.maxM2) inputs["Fläche"] = (pack.minM2+"–"+pack.maxM2+" m²"); inputs["Inhalt"] = roomContentText(what, stage); if(note) inputs["Notiz"] = note; detailLines.push("• Paket: „+esc(pack.label)+“„); detailLines.push(„• Größe: „+stage+“„); if(pack.minM2 && pack.maxM2) detailLines.push(„• Fläche: „+pack.minM2+“–“+pack.maxM2+“ m²„); detailLines.push(„• Inhalt: „+esc(roomContentText(what, stage))+“„); if(note) detailLines.push(„• Notiz: „+esc(note)+“„); if(pack.bespokeOnly){ return { label: labelForWhat(what), inputs: inputs, note: note, detailsHtml: detailLines.join(„
    „), prices: { base:null, mix:null, bespoke: base } }; } return { label: labelForWhat(what), inputs: inputs, note: note, detailsHtml: detailLines.join(„
    „), prices: { base: base, mix: mix, bespoke: bes } }; } var lfm = parseFloat(el.lfm.value || „0“); if(!isFinite(lfm)) lfm = 0; el.lfmVal.textContent = lfm; var vFac = volumeFactor(lfm); var corpusCost = 0, frontsCost = 0, otherCost = 0; var fFac = 1.0; if(what === „kueche“){ var form = el.form.value || „line“; fFac = FORM[form] || 1.0; var wallH = el.wallH.value || „0“; var withWall = (wallH !== „0“); var wallFactor = withWall ? (WALL_H_FACTOR[wallH] || 1.0) : 1.0; var wallLfm = withWall ? (parseFloat(el.wallLfm.value || „0“) || 0) : 0; el.wallLfmVal.textContent = wallLfm; var drawers = el.drawers.value || „none“; var islandSel = el.island.value || „none“; corpusCost += lfm * up(KITCHEN.base_lfm); frontsCost += lfm * up(KITCHEN.fronts_base_per_lfm); if(withWall && wallLfm > 0){ frontsCost += wallLfm * up(KITCHEN.fronts_wall_per_lfm * wallFactor); corpusCost += wallLfm * up(KITCHEN.wall_effort_per_lfm * wallFactor); } var d = DRAWERS[drawers] || 0; if(d) otherCost += up(d); if(islandSel !== „none“){ var islLfm = (KITCHEN.island_lfm[islandSel] || 0); corpusCost += (islLfm * up(KITCHEN.base_lfm)) * KITCHEN.island_factor; frontsCost += (islLfm * up(KITCHEN.fronts_base_per_lfm)) * KITCHEN.island_factor; } inputs[„Laufmeter (Grundküche)“] = lfm + “ LFM“; inputs[„Form“] = formLabelKitchen(form); inputs[„Auszüge“] = drawersLabel(drawers); inputs[„Oberkästen / Hochschränke“] = withWall ? („Höhe “ + wallH + “ cm“) : „Ohne“; inputs[„Oberkästen / Hochschränke Laufmeter“] = withWall ? (wallLfm + “ LFM“) : „—“; inputs[„Kücheninsel“] = (islandSel === „none“) ? „Keine“ : (islandSel===“2″ ? „Klein (2 LFM)“ : „Groß (4 LFM)“); detailLines.push(„• Küche: „+lfm+“ LFM„); detailLines.push(„• Form: „+esc(formLabelKitchen(form))+“„); detailLines.push(„• Auszüge: „+esc(drawersLabel(drawers))+“„); detailLines.push(„• Oberkästen / Hochschränke: „+(withWall ? („Höhe „+wallH+“ cm, „+wallLfm+“ LFM“) : „ohne“)+“„); if(islandSel !== „none“) detailLines.push(„• Insel: „+(islandSel===“2″?“klein (2 LFM)“:“groß (4 LFM)“)+“„); var areaM2 = computeFrontAreaM2(„kueche“, lfm, 250, wallH, wallLfm); inputs[„Frontfläche (ca.)“] = (Math.round(areaM2*10)/10).toLocaleString(„de-AT“) + “ m²“; detailLines.push(„• Frontfläche (ca.): „+(Math.round(areaM2*10)/10).toLocaleString(„de-AT“)+“ m²„); } else { var otherForm = el.otherForm.value || „straight“; var otherFormFac = OTHER_FORM[otherForm] || 1.0; var kH = parseInt(el.kastenH.value || „250“,10); if(!isFinite(kH)) kH = 250; var drawers2 = el.drawers.value || „none“; var d2 = DRAWERS[drawers2] || 0; if(d2) otherCost += up(d2); var hFactor = Math.max(0.36, Math.min(1.32, (kH / 250))); var basePerLfm; var closedSel = el.closed.value || „open“; var closedCfg = REGAL_CLOSED[closedSel] || REGAL_CLOSED.open; var hangSel = el.hang.value || „low“; var hangFrontFac = HANG_FRONT_FACTOR[hangSel] || 1.0; if(what === „dachschraege“){ basePerLfm = OTHER.kasten; var first = Math.min(DACH.firstLfm, lfm); var rest = Math.max(0, lfm – DACH.firstLfm); corpusCost += first * up(basePerLfm) * DACH.upliftFirst * hFactor * otherFormFac; corpusCost += rest * up(basePerLfm) * 1.0 * hFactor * otherFormFac; inputs[„Dachschräge“] = „Erste “ + DACH.firstLfm + “ LFM +30%“; detailLines.push(„• Dachschräge: erste 2,5 LFM +30%„); } else { basePerLfm = OTHER[what] || 1100; var effort = 1.0; if(what === „regal“) effort *= (closedCfg.effort || 1.0); corpusCost += lfm * up(basePerLfm) * hFactor * otherFormFac * effort; } var areaBase = computeFrontAreaM2(what, lfm, kH, „0“, 0); var areaForFronts = areaBase; if(what === „garderobe“) areaForFronts = areaBase * hangFrontFac; if(what === „regal“) areaForFronts = areaBase * (closedCfg.frontFactor || 0.05); frontsCost += areaForFronts * up(FRONT_BASE_PER_M2); inputs[„Laufmeter“] = lfm + “ LFM“; inputs[„Kastenhöhe“] = kH + “ cm“; inputs[„Form“] = formLabelOther(otherForm); inputs[„Auszüge“] = drawersLabel(drawers2); detailLines.push(„• „+esc(labelForWhat(what))+“: „+lfm+“ LFM„); detailLines.push(„• Höhe: „+kH+“ cm„); detailLines.push(„• Form: „+esc(formLabelOther(otherForm))+“„); detailLines.push(„• Auszüge: „+esc(drawersLabel(drawers2))+“„); if(what === „garderobe“){ inputs[„Offen hängen“] = hangLabel(hangSel); detailLines.push(„• Offen hängen: „+esc(hangLabel(hangSel))+“„); } if(what === „regal“){ inputs[„Geschlossen“] = closedCfg.label; detailLines.push(„• Geschlossen: „+esc(closedCfg.label)+“„); } inputs[„Frontfläche (ca.)“] = (Math.round(areaBase*10)/10).toLocaleString(„de-AT“) + “ m²“; detailLines.push(„• Frontfläche (ca.): „+(Math.round(areaBase*10)/10).toLocaleString(„de-AT“)+“ m²„); } var raw = (corpusCost + frontsCost + otherCost) * fFac * vFac; var baseTotal = raw * TIERS.base.m; var mixTotal = raw * TIERS.mix.m; var besTotal = raw * TIERS.bespoke.m; if(note){ inputs[„Notiz“] = note; detailLines.push(„• Notiz: „+esc(note)+“„); } return { label: labelForWhat(what), inputs: inputs, note: note, detailsHtml: detailLines.join(„
    „), prices: { base: baseTotal, mix: mixTotal, bespoke: besTotal } }; } function setResult(res, closeDetails){ el.resBase.textContent = (res.prices.base==null) ? „—“ : eur(res.prices.base); el.resMix.textContent = (res.prices.mix==null) ? „—“ : eur(res.prices.mix); el.resBespoke.textContent = (res.prices.bespoke==null) ? „—“ : eur(res.prices.bespoke); el.detailsBox.innerHTML = res.detailsHtml || „“; if(closeDetails) el.detailsBox.style.display = „none“; lastResult = res; } function render(){ var what = el.what.value || „kueche“; var roomMode = isRoomMode(what); el.roomSizeField.style.display = roomMode ? „grid“ : „none“; el.lfmField.style.display = roomMode ? „none“ : „grid“; el.kitchenOnly.style.display = (!roomMode && what===“kueche“) ? „grid“ : „none“; el.formField.style.display = (!roomMode && what===“kueche“) ? „grid“ : „none“; var otherLfmType = (!roomMode && what!==“kueche“ && (what===“kasten“ || what===“dachschraege“ || what===“garderobe“ || what===“regal“)); el.otherFormField.style.display = otherLfmType ? „grid“ : „none“; el.kastenField.style.display = otherLfmType ? „grid“ : „none“; el.drawersField.style.display = (!roomMode) ? „grid“ : „none“; el.hangField.style.display = (!roomMode && what===“garderobe“) ? „grid“ : „none“; el.closedField.style.display = (!roomMode && what===“regal“) ? „grid“ : „none“; var showWallLfm = (!roomMode && what===“kueche“ && (el.wallH.value || „0“) !== „0“); el.wallLfmField.style.display = showWallLfm ? „grid“ : „none“; if(!showWallLfm){ el.wallLfm.value = „0“; el.wallLfmVal.textContent = „0“; } el.resultLabel.textContent = roomMode ? „Richtwert (klein → groß)“ : (what===“kueche“ ? „Orientierungswert (Küche ohne Geräte)“ : „Orientierungswert (Möbelbau)“); var res = compute3Prices(); setResult(res, true); } function openOverlay(){ el.overlay.style.display = „flex“; el.overlay.setAttribute(„aria-hidden“,“false“); renderCart(); } function closeOverlay(){ el.overlay.style.display = „none“; el.overlay.setAttribute(„aria-hidden“,“true“); } function renderCart(){ if(CART.length === 0){ el.cartList.innerHTML = ‚
    ‚ + ‚
    ‚ + ‚
    Noch keine Positionen
    ‚ + ‚
    Tippe im Rechner auf „Neue Position hinzufügen“.
    ‚ + ‚
    ‚ + ‚
    ‚ + ‚
    ‚; el.sumBase.textContent = „—“; el.sumMix.textContent = „—“; el.sumBespoke.textContent = „—“; return; } var sumB=0,sumM=0,sumS=0; var html = „“; CART.forEach(function(it, idx){ var metaText = inputsToText(it.inputs || {}); if(it.note) metaText += (metaText ? „\n“ : „“) + „Notiz: “ + it.note; var b = (it.prices && it.prices.base!=null) ? it.prices.base : null; var m = (it.prices && it.prices.mix!=null) ? it.prices.mix : null; var s = (it.prices && it.prices.bespoke!=null) ? it.prices.bespoke : null; if(b!=null) sumB += b; if(m!=null) sumM += m; if(s!=null) sumS += s; html += ‚
    ‚ + ‚
    ‚ + ‚
    ‚ + esc(it.label) + ‚
    ‚ + ‚
    ‚ + esc(metaText) + ‚
    ‚ + ‚‚ + ‚
    ‚ + ‚
    ‚ + ‚
    Base‚ + (b==null?“—“:eur(b)) + ‚
    ‚ + ‚
    Mix‚ + (m==null?“—“:eur(m)) + ‚
    ‚ + ‚
    Bespoke‚ + (s==null?“—“:eur(s)) + ‚
    ‚ + ‚
    ‚ + ‚
    ‚; }); el.cartList.innerHTML = html; el.sumBase.textContent = sumB ? eur(sumB) : „—“; el.sumMix.textContent = sumM ? eur(sumM) : „—“; el.sumBespoke.textContent = sumS ? eur(sumS) : „—“; qa(„.hg-cart-remove“).forEach(function(btn){ btn.addEventListener(„click“, function(){ var i = parseInt(btn.getAttribute(„data-idx“),10); if(isFinite(i)) CART.splice(i,1); renderCart(); }); }); } function addCurrentToCart(){ if(!lastResult || !lastResult.prices) return; CART.push({ label: lastResult.label, inputs: lastResult.inputs || {}, note: lastResult.note || „“, prices: lastResult.prices || { base:null, mix:null, bespoke:null } }); openOverlay(); } function toggleDeepDive(){ var open = (el.deepBox.style.display !== „none“ && el.deepBox.style.display !== „“); el.deepBox.style.display = open ? „none“ : „block“; el.deepBtn.setAttribute(„aria-expanded“, String(!open)); el.deepPlus.textContent = open ? „+“ : „−“; } // Bind el.deepBtn.addEventListener(„click“, toggleDeepDive); el.what.addEventListener(„change“, render); el.roomSize.addEventListener(„input“, function(){ render(); }); el.note.addEventListener(„input“, function(){ updatePreview(); if(el.detailsBox.style.display === „block“) render(); }); el.form.addEventListener(„change“, render); el.lfm.addEventListener(„input“, render); el.drawers.addEventListener(„change“, render); el.wallH.addEventListener(„change“, render); el.wallLfm.addEventListener(„input“, render); el.island.addEventListener(„change“, render); el.otherForm.addEventListener(„change“, render); el.kastenH.addEventListener(„change“, render); el.hang.addEventListener(„change“, render); el.closed.addEventListener(„change“, render); el.detailsBtn.addEventListener(„click“, function(){ el.detailsBox.style.display = (el.detailsBox.style.display === „none“ || !el.detailsBox.style.display) ? „block“ : „none“; if(el.detailsBox.style.display === „block“) render(); }); el.addBtn.addEventListener(„click“, addCurrentToCart); el.closeOverlay.addEventListener(„click“, closeOverlay); el.continueBtn.addEventListener(„click“, closeOverlay); el.clearCart.addEventListener(„click“, function(){ CART = []; renderCart(); }); el.sendMail.addEventListener(„click“, function(){ if(CART.length) openMail(); }); el.sendMailInline.addEventListener(„click“, function(){ if(!CART.length) addCurrentToCart(); openMail(); }); el.overlay.addEventListener(„click“, function(e){ if(e.target === el.overlay) closeOverlay(); }); render(); } // init all instances on page function boot(){ document.querySelectorAll(„[data-hg-root]“).forEach(init); } if(document.readyState === „loading“) document.addEventListener(„DOMContentLoaded“, boot); else boot(); })();

Tut mir Leid, aber zu deinem Suchbegriff konnte nichts gefunden werden. Versuche es mit anderen Schlüsselwörtern doch erneut.

Sign up to our newsletter and read Lens’ latest Stories in your inbox every week