Issue 2
-

/* ===== 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))+“PREISRECHNER
Grobe Orientierung.
Du bekommst hier einen realistischen Richtwert – damit du schnell weißt, ob wir im gleichen Budget-Raum sind.
PREISMODELLEKurz & klar.BasismodellKlar & funktional. Gute Lösung, wenige Sonderdetails.Guter MixAusgewogen. Mehr Details, sauberer Ausbau, stimmiges Gesamtbild.BespokeIndividuell 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)Raumgröße Form Gerade / Zeile L-Form U-Form Form Gerade Über Eck In Nische / um Wände Laufmeter 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 LaufmeterWas ist drinnen?—OrientierungswertBasismodell—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.
„+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 = ‚‚ + ‚‚; 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 += ‚‚ + ‚‚ + ‚Noch keine Positionen‚ + ‚‚ + ‚‚ + ‚—‚ + ‚‚; }); 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(); })();‚ + ‚‚ + ‚‚ + esc(it.label) + ‚‚ + ‚‚ + ‚‚ + ‚‚ + ‚‚ + ‚Base‚ + (b==null?“—“:eur(b)) + ‚‚ + ‚Mix‚ + (m==null?“—“:eur(m)) + ‚‚ + ‚Bespoke‚ + (s==null?“—“:eur(s)) + ‚‚ + ‚ -

/* ===== 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))+“PREISRECHNER
Grobe Orientierung.
Du bekommst hier einen realistischen Richtwert – damit du schnell weißt, ob wir im gleichen Budget-Raum sind.
PREISMODELLEKurz & klar.BasismodellKlar & funktional. Gute Lösung, wenige Sonderdetails.Guter MixAusgewogen. Mehr Details, sauberer Ausbau, stimmiges Gesamtbild.BespokeIndividuell 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)Raumgröße Form Gerade / Zeile L-Form U-Form Form Gerade Über Eck In Nische / um Wände Laufmeter 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 LaufmeterWas ist drinnen?—OrientierungswertBasismodell—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.
„+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 = ‚‚ + ‚‚; 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 += ‚‚ + ‚‚ + ‚Noch keine Positionen‚ + ‚‚ + ‚‚ + ‚—‚ + ‚‚; }); 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(); })();‚ + ‚‚ + ‚‚ + esc(it.label) + ‚‚ + ‚‚ + ‚‚ + ‚‚ + ‚‚ + ‚Base‚ + (b==null?“—“:eur(b)) + ‚‚ + ‚Mix‚ + (m==null?“—“:eur(m)) + ‚‚ + ‚Bespoke‚ + (s==null?“—“:eur(s)) + ‚‚ + ‚
Tut mir Leid, aber zu deinem Suchbegriff konnte nichts gefunden werden. Versuche es mit anderen Schlüsselwörtern doch erneut.

