{"id":5556,"date":"2026-09-04T11:26:40","date_gmt":"2026-09-04T10:26:40","guid":{"rendered":"https:\/\/www.kirstin-ellen-vietze.de\/?page_id=5556"},"modified":"2026-09-05T11:26:48","modified_gmt":"2026-09-05T10:26:48","slug":"terminwunsch","status":"publish","type":"page","link":"https:\/\/www.kirstin-ellen-vietze.de\/en\/terminwunsch\/","title":{"rendered":"Terminwunsch"},"content":{"rendered":"<div class=\"wpb-content-wrapper\" id=\"wpb-content-root\"><div data-vc-full-width=\"true\" data-vc-full-width-temp=\"true\" data-vc-full-width-init=\"false\" data-vc-stretch-content=\"true\" class=\"vc_row wpb_row vc_row-fluid vc_custom_1788519008515 vc_row-o-full-height vc_row-o-columns-middle vc_row-flex\"><div class=\"wpb_column vc_column_container vc_col-sm-12\"><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\">\n\t<div class=\"wpb_raw_code wpb_raw_html wpb_content_element\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<!-- KEV \u00b7 Terminwunschliste f\u00fcr WordPress \/ WPBakery: vollst\u00e4ndig in einen HTML-Block kopieren -->\n<section id=\"kev-terminwunsch-app\" aria-labelledby=\"kevTerminTitle\">\n  <div class=\"kev-tw-shell\">\n    <div class=\"kev-tw-titlebar\">\n      <h2 id=\"kevTerminTitle\" class=\"kev-tw-title\">Dein Terminwunsch <span>bei Kirstin Ellen Vietze<\/span><\/h2>\n    <\/div>\n    <form id=\"kevTerminForm\" novalidate>\n      <div class=\"kev-tw-hours\">\n        <button id=\"kevTwHoursToggle\" class=\"kev-tw-hours__toggle\" type=\"button\" aria-expanded=\"false\" aria-controls=\"kevTwHoursPanel\">\n          <span id=\"kevTwHoursDot\" class=\"kev-tw-hours__dot\" aria-hidden=\"true\"><\/span>\n          <span class=\"kev-tw-hours__copy\">\n            <strong id=\"kevTwHoursStatus\">\u00d6ffnungszeiten werden gepr\u00fcft \u2026<\/strong>\n            <small id=\"kevTwHoursMeta\"><\/small>\n          <\/span>\n          <svg class=\"kev-tw-hours__chevron\" width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" aria-hidden=\"true\"><path d=\"M1 1.5 6 6.5l5-5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n        <\/button>\n        <div id=\"kevTwHoursPanel\" class=\"kev-tw-hours__panel\" hidden>\n          <div id=\"kevTwHoursList\" class=\"kev-tw-hours__list\" role=\"list\"><\/div>\n          <div class=\"kev-tw-hours__rules\" aria-label=\"Besondere \u00d6ffnungstage\">\n            <span><b>Mo<\/b> nur ungerade Kalenderwochen<\/span>\n            <span><b>Sa<\/b> nur gerade Kalenderwochen<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n      <div class=\"kev-tw-progress\" aria-label=\"Fortschritt\">\n        <span class=\"is-active\" data-progress=\"1\"><b>1<\/b><i>Kontakt<\/i><\/span>\n        <span data-progress=\"2\"><b>2<\/b><i>Leistung<\/i><\/span>\n        <span data-progress=\"3\"><b>3<\/b><i>Stylist<\/i><\/span>\n        <span data-progress=\"4\"><b>4<\/b><i>Wunschzeit<\/i><\/span>\n        <span data-progress=\"5\"><b>5<\/b><i>Absenden<\/i><\/span>\n      <\/div>\n\n      <fieldset class=\"kev-tw-step is-active\" data-step=\"1\">\n        <legend>Wie d\u00fcrfen wir dich erreichen?<\/legend>\n        <p class=\"kev-tw-intro\">Wir nutzen deine Daten ausschlie\u00dflich, um dich wegen dieses Terminwunsches zu kontaktieren.<\/p>\n        <div class=\"kev-tw-fields kev-tw-fields--two\">\n          <label>\n            <span>Vor- und Nachname <em>*<\/em><\/span>\n            <input id=\"kevTwName\" name=\"customer\" type=\"text\" autocomplete=\"name\" placeholder=\"z. B. Maria Mustermann\" required maxlength=\"120\">\n          <\/label>\n          <label>\n            <span>Telefonnummer <em>*<\/em><\/span>\n            <input id=\"kevTwPhone\" name=\"phone\" type=\"tel\" autocomplete=\"tel\" inputmode=\"tel\" placeholder=\"z. B. 0176 12345678\" required minlength=\"7\" maxlength=\"40\">\n          <\/label>\n        <\/div>\n      <\/fieldset>\n\n      <fieldset class=\"kev-tw-step\" data-step=\"3\" hidden>\n        <legend id=\"kevTwStylistTitle\">Bei wem m\u00f6chtest du deinen Termin?<\/legend>\n        <p id=\"kevTwStylistIntro\" class=\"kev-tw-intro\">W\u00e4hle deine bevorzugte Stylistin oder deinen bevorzugten Stylisten.<\/p>\n        <div id=\"kevTwStylists\" class=\"kev-tw-stylists\" role=\"radiogroup\" aria-label=\"Stylistin oder Stylist ausw\u00e4hlen\"><\/div>\n        <section id=\"kevTwColorStylistBlock\" class=\"kev-tw-color-stylist\" hidden aria-labelledby=\"kevTwColorStylistTitle\">\n          <h3 id=\"kevTwColorStylistTitle\">Und wer darf deine Coloration \u00fcbernehmen?<\/h3>\n          <p>Kirstin \u00fcbernimmt deinen Schnitt. F\u00fcr die Farbe w\u00e4hlst du bitte eine weitere Person aus dem Team.<\/p>\n          <div id=\"kevTwColorStylists\" class=\"kev-tw-stylists kev-tw-stylists--secondary\" role=\"radiogroup\" aria-label=\"Stylistin oder Stylist f\u00fcr die Coloration ausw\u00e4hlen\"><\/div>\n        <\/section>\n      <\/fieldset>\n\n      <fieldset class=\"kev-tw-step\" data-step=\"2\" hidden>\n        <legend>Was m\u00f6chtest du machen lassen?<\/legend>\n        <p class=\"kev-tw-intro\">Du kannst je Bereich eine Leistung ausw\u00e4hlen. Mindestens eine Auswahl ist erforderlich.<\/p>\n        <div id=\"kevTwServices\" class=\"kev-tw-services\"><\/div>\n      <\/fieldset>\n\n      <fieldset class=\"kev-tw-step\" data-step=\"4\" hidden>\n        <legend>Wann passt es dir?<\/legend>\n        <p class=\"kev-tw-intro\">Je genauer deine Verf\u00fcgbarkeit ist, desto besser k\u00f6nnen wir einen frei gewordenen Termin zuordnen. Wir gleichen deinen Wunsch behutsam mit unserer \u00d6ffnungszeit und der voraussichtlichen Termindauer ab.<\/p>\n        <div class=\"kev-tw-fields kev-tw-fields--two kev-tw-dates\">\n          <label>\n            <span>Ab Datum <em>*<\/em><\/span>\n            <input id=\"kevTwDateFrom\" type=\"date\" required>\n          <\/label>\n          <label>\n            <span>Bis Datum <em>*<\/em><\/span>\n            <input id=\"kevTwDateTo\" type=\"date\" required>\n          <\/label>\n        <\/div>\n        <div class=\"kev-tw-duration-card\" aria-live=\"polite\">\n          <span>Voraussichtliche Termindauer<\/span>\n          <strong id=\"kevTwDuration\">Wird aus deinen Leistungen berechnet<\/strong>\n          <small>Augen-Services planen wir bei einer Coloration nach M\u00f6glichkeit innerhalb der Einwirkzeit ein.<\/small>\n        <\/div>\n        <div id=\"kevTwWeekdaysBlock\" class=\"kev-tw-weekdays-block\">\n          <strong>An diesen Tagen passt es<\/strong>\n          <div id=\"kevTwWeekdays\" class=\"kev-tw-weekdays\" role=\"group\" aria-label=\"M\u00f6gliche Wochentage\"><\/div>\n        <\/div>\n        <div class=\"kev-tw-availability-head\">\n          <div><strong>M\u00f6glicher Startbeginn<\/strong><span>Fr\u00fchester und sp\u00e4tester Start \u00b7 ausschlie\u00dflich im 30-Minuten-Takt<\/span><\/div>\n          <button id=\"kevTwAddWindow\" class=\"kev-tw-link-button\" type=\"button\">+ Weitere Zeit<\/button>\n        <\/div>\n        <div id=\"kevTwTimeWindows\" class=\"kev-tw-time-windows\"><\/div>\n        <div id=\"kevTwScheduleNotice\" class=\"kev-tw-schedule-notice\" aria-live=\"polite\" hidden><\/div>\n      <\/fieldset>\n\n      <fieldset class=\"kev-tw-step\" data-step=\"5\" hidden>\n        <legend>Fast geschafft<\/legend>\n        <div id=\"kevTwSummary\" class=\"kev-tw-summary\" aria-live=\"polite\"><\/div>\n        <label class=\"kev-tw-note\">\n          <span>M\u00f6chtest du uns noch etwas mitteilen? <small>optional<\/small><\/span>\n          <textarea id=\"kevTwNote\" maxlength=\"500\" placeholder=\"z. B. bestehender Termin, besonders flexibel oder ein kurzer Hinweis\"><\/textarea>\n        <\/label>\n        <p class=\"kev-tw-privacy\">Mit dem Absenden erkl\u00e4rst du dich damit einverstanden, dass wir deine Angaben f\u00fcr die Bearbeitung deines Terminwunsches verwenden.<\/p>\n      <\/fieldset>\n\n      <div id=\"kevTwMessage\" class=\"kev-tw-message\" role=\"alert\" aria-live=\"polite\" hidden><\/div>\n      <div class=\"kev-tw-actions\">\n        <button id=\"kevTwBack\" class=\"kev-tw-button kev-tw-button--secondary\" type=\"button\" hidden>Zur\u00fcck<\/button>\n        <button id=\"kevTwNext\" class=\"kev-tw-button\" type=\"button\">Weiter<\/button>\n        <button id=\"kevTwSubmit\" class=\"kev-tw-button\" type=\"submit\" hidden>Terminwunsch senden<\/button>\n      <\/div>\n    <\/form>\n\n    <div id=\"kevTwSuccess\" class=\"kev-tw-success\" hidden aria-live=\"polite\">\n      <span class=\"kev-tw-success__mark\" aria-hidden=\"true\">\u2713<\/span>\n      <h3>Danke, dein Terminwunsch ist eingetragen.<\/h3>\n      <p>Wir melden uns telefonisch, sobald wir einen passenden freien Termin f\u00fcr dich haben.<\/p>\n      <button id=\"kevTwRestart\" class=\"kev-tw-button kev-tw-button--secondary\" type=\"button\">Weiteren Terminwunsch eintragen<\/button>\n    <\/div>\n\n    <input id=\"kevTwWebsite\" class=\"kev-tw-honeypot\" type=\"text\" tabindex=\"-1\" autocomplete=\"off\" aria-hidden=\"true\">\n  <\/div>\n<\/section>\n\n<style>\n  #kev-terminwunsch-app{--tw-ink:#101a34;--tw-navy:#111d3a;--tw-blue:#2d477c;--tw-line:#d7deea;--tw-muted:#61708e;--tw-gold:#d8a82f;--tw-gold-deep:#ce9e26;--tw-gold-bright:#e8bd4f;--tw-gold-light:#fff3cc;--tw-bg:#f4f6fa;--tw-radius:18px;width:100%;max-width:100%;min-width:0;overflow-x:hidden;overflow-x:clip;color:var(--tw-ink);font:500 16px\/1.5 \"Lato\",system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;touch-action:pan-y pinch-zoom;-webkit-text-size-adjust:100%;}\n  #kev-terminwunsch-app *{box-sizing:border-box;}\n  #kev-terminwunsch-app [hidden]{display:none!important;}\n  #kev-terminwunsch-app .kev-tw-shell{position:relative;isolation:isolate;width:100%;max-width:860px;min-width:0;margin:0 auto;overflow:hidden;border:1px solid rgba(206,158,38,.48);border-radius:26px;background:#fff;box-shadow:0 3px 9px rgba(22,20,17,.05),0 24px 65px rgba(29,25,18,.16);}\n  #kev-terminwunsch-app h2,#kev-terminwunsch-app h3,#kev-terminwunsch-app p{margin-top:0;}\n  #kev-terminwunsch-app .kev-tw-titlebar{position:relative;overflow:hidden;padding:31px 36px 30px;background:radial-gradient(circle at 88% -30%,rgba(255,255,255,.68),transparent 42%),linear-gradient(125deg,var(--tw-gold-deep) 0%,var(--tw-gold) 48%,var(--tw-gold-bright) 100%);}\n  #kev-terminwunsch-app .kev-tw-titlebar::before{position:absolute;inset:0;background:linear-gradient(110deg,transparent 0 42%,rgba(255,255,255,.2) 50%,transparent 58%);content:\"\";pointer-events:none;}\n  #kev-terminwunsch-app .kev-tw-titlebar::after{position:absolute;right:36px;bottom:18px;width:72px;height:2px;border-radius:999px;background:rgba(10,10,10,.52);content:\"\";}\n  #kev-terminwunsch-app .kev-tw-title{position:relative;z-index:1;max-width:680px;margin:0;color:#0a0a0a!important;font-size:clamp(27px,5vw,37px)!important;font-weight:900;letter-spacing:-.032em;line-height:1.05;overflow-wrap:anywhere;}\n  #kev-terminwunsch-app .kev-tw-title span{display:block;margin-top:8px;font-size:.5em;font-weight:800;letter-spacing:.075em;line-height:1.3;text-transform:uppercase;}\n  #kev-terminwunsch-app form{width:100%;max-width:100%;min-width:0;padding:28px 34px 34px;background:linear-gradient(180deg,#fffaf0 0,#fffdf8 90px,#fff 230px);}\n  #kev-terminwunsch-app .kev-tw-hours{margin:0 0 14px;border:1px solid rgba(168,135,77,.27);border-radius:17px;background:rgba(255,255,255,.9);box-shadow:0 8px 25px rgba(69,56,29,.06);}\n  #kev-terminwunsch-app .kev-tw-hours__toggle{display:grid;width:100%;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:11px;margin:0;border:0;border-radius:16px;background:transparent;padding:12px 14px;color:var(--tw-ink);font:inherit;text-align:left;cursor:pointer;touch-action:manipulation;}\n  #kev-terminwunsch-app .kev-tw-hours__toggle:hover{background:rgba(255,248,226,.62);}\n  #kev-terminwunsch-app .kev-tw-hours__toggle:focus-visible{outline:3px solid rgba(216,168,47,.3);outline-offset:2px;}\n  #kev-terminwunsch-app .kev-tw-hours__dot{position:relative;width:11px;height:11px;border-radius:50%;background:#a49c8e;box-shadow:0 0 0 4px rgba(164,156,142,.12);}\n  #kev-terminwunsch-app .kev-tw-hours__dot.is-open{background:#5d9b70;box-shadow:0 0 0 4px rgba(93,155,112,.14);}\n  #kev-terminwunsch-app .kev-tw-hours__dot.is-open::after{position:absolute;inset:-5px;border:1px solid #6ca67d;border-radius:50%;content:\"\";animation:kevTwHoursPulse 2.2s ease-out infinite;}\n  #kev-terminwunsch-app .kev-tw-hours__dot.is-closed{background:#bc695b;box-shadow:0 0 0 4px rgba(188,105,91,.13);}\n  #kev-terminwunsch-app .kev-tw-hours__copy{display:grid;gap:1px;min-width:0;}\n  #kev-terminwunsch-app .kev-tw-hours__copy strong{color:#2c2a26;font-size:14px;font-weight:900;}\n  #kev-terminwunsch-app .kev-tw-hours__copy small{color:var(--tw-muted);font-size:12px;font-weight:650;line-height:1.35;}\n  #kev-terminwunsch-app .kev-tw-hours__chevron{color:#876b25;transition:transform .2s ease;}\n  #kev-terminwunsch-app .kev-tw-hours__toggle[aria-expanded=\"true\"] .kev-tw-hours__chevron{transform:rotate(180deg);}\n  #kev-terminwunsch-app .kev-tw-hours__panel{padding:6px 14px 14px;border-top:1px solid rgba(168,135,77,.18);}\n  #kev-terminwunsch-app .kev-tw-hours__list{display:grid;margin:0;padding:0;}\n  #kev-terminwunsch-app .kev-tw-hours__row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:15px;min-height:40px;padding:8px 2px;border-bottom:1px solid #ece6db;color:#514a3f;font-size:13px;}\n  #kev-terminwunsch-app .kev-tw-hours__row:last-child{border-bottom:0;}\n  #kev-terminwunsch-app .kev-tw-hours__day{display:flex;align-items:center;gap:8px;min-width:0;font-weight:750;}\n  #kev-terminwunsch-app .kev-tw-hours__time{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;}\n  #kev-terminwunsch-app .kev-tw-hours__row.is-today{color:#4f3c0d;}\n  #kev-terminwunsch-app .kev-tw-hours__row.is-today .kev-tw-hours__day{font-weight:900;}\n  #kev-terminwunsch-app .kev-tw-hours__row.is-closed{color:#9a9183;}\n  #kev-terminwunsch-app .kev-tw-hours__today{display:inline-grid;place-items:center;min-height:22px;border:1px solid rgba(206,158,38,.34);border-radius:999px;background:#fff5d8;color:#6d5213;padding:2px 8px;font-size:12px;font-weight:900;line-height:1;}\n  #kev-terminwunsch-app .kev-tw-hours__rules{display:flex;flex-wrap:wrap;gap:7px;margin-top:9px;padding-top:10px;border-top:1px solid rgba(168,135,77,.16);}\n  #kev-terminwunsch-app .kev-tw-hours__rules span{display:inline-flex;align-items:center;gap:5px;min-height:27px;border:1px solid #e4dccd;border-radius:999px;background:#fbfaf7;color:#756c5c;padding:4px 9px;font-size:12px;font-weight:650;line-height:1.2;}\n  #kev-terminwunsch-app .kev-tw-hours__rules b{color:#765817;font-weight:900;}\n  #kev-terminwunsch-app .kev-tw-progress{display:grid;grid-template-columns:repeat(5,1fr);gap:7px;margin:0 0 24px;padding:13px 14px;border:1px solid rgba(168,135,77,.2);border-radius:17px;background:rgba(255,255,255,.86);box-shadow:0 8px 25px rgba(69,56,29,.065);}\n  #kev-terminwunsch-app .kev-tw-progress>span{display:grid;grid-template-columns:24px minmax(0,1fr);align-items:center;gap:6px;min-width:0;color:#9aa6be;font-size:12px;font-weight:750;}\n  #kev-terminwunsch-app .kev-tw-progress b{display:grid;place-items:center;width:27px;height:27px;border:1px solid #d8cfbd;border-radius:50%;background:#fffdf8;box-shadow:0 2px 7px rgba(39,32,19,.07);font-size:12px;}\n  #kev-terminwunsch-app .kev-tw-progress i{overflow:hidden;font-style:normal;text-overflow:ellipsis;white-space:nowrap;}\n  #kev-terminwunsch-app .kev-tw-progress>span.is-active{color:var(--tw-navy);}\n  #kev-terminwunsch-app .kev-tw-progress>span.is-active b{border-color:var(--tw-gold-deep);background:linear-gradient(145deg,var(--tw-gold-bright),var(--tw-gold));box-shadow:0 4px 12px rgba(206,158,38,.3);color:#17120a;}\n  #kev-terminwunsch-app .kev-tw-progress>span.is-done{color:#387054;}\n  #kev-terminwunsch-app .kev-tw-progress>span.is-done b{border-color:#69ad84;background:#eaf7ef;color:#236340;}\n  #kev-terminwunsch-app .kev-tw-step{min-width:0;margin:0;padding:25px;border:0;border-radius:20px;background:rgba(255,255,255,.96);box-shadow:inset 0 0 0 1px rgba(168,135,77,.2),0 13px 34px rgba(37,31,19,.075);animation:kevTwFade .22s ease both;}\n  #kev-terminwunsch-app .kev-tw-step legend{width:100%;margin:0 0 6px;padding:0;color:#171717;font-size:25px;font-weight:900;letter-spacing:-.025em;}\n  #kev-terminwunsch-app .kev-tw-intro{margin-bottom:22px;color:var(--tw-muted);}\n  #kev-terminwunsch-app .kev-tw-fields{display:grid;gap:15px;}\n  #kev-terminwunsch-app .kev-tw-fields--two{grid-template-columns:repeat(2,minmax(0,1fr));}\n  #kev-terminwunsch-app label{display:grid;gap:7px;min-width:0;color:#34415d;font-size:14px;font-weight:750;}\n  #kev-terminwunsch-app label>span em{color:#bc4e42;font-style:normal;}\n  #kev-terminwunsch-app input,#kev-terminwunsch-app select,#kev-terminwunsch-app textarea{display:block;width:100%;max-width:100%;min-width:0;min-height:49px;border:1px solid #d6cebd;border-radius:13px;outline:0;background:linear-gradient(180deg,#fff,#fffdfa);box-shadow:inset 0 1px 2px rgba(38,31,18,.03),0 4px 12px rgba(42,34,20,.035);color:var(--tw-ink);padding:11px 13px;font-family:inherit;font-size:16px!important;font-weight:500;line-height:1.35;touch-action:manipulation;transition:border-color .16s ease,box-shadow .16s ease,background .16s ease;}\n  #kev-terminwunsch-app select{text-overflow:ellipsis;}\n  #kev-terminwunsch-app textarea{min-height:100px;resize:vertical;}\n  #kev-terminwunsch-app input:focus,#kev-terminwunsch-app select:focus,#kev-terminwunsch-app textarea:focus{border-color:var(--tw-gold);background:#fff;box-shadow:0 0 0 4px rgba(216,168,47,.16),0 8px 20px rgba(72,56,21,.07);}\n  #kev-terminwunsch-app .kev-tw-stylists{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:11px;}\n  #kev-terminwunsch-app .kev-tw-color-stylist{margin-top:22px;padding:20px;border:1px solid rgba(206,158,38,.34);border-radius:18px;background:linear-gradient(145deg,#fffdf8,#fff6db);box-shadow:0 9px 24px rgba(89,68,19,.07);}\n  #kev-terminwunsch-app .kev-tw-color-stylist h3{margin:0 0 4px;color:#5c4610;font-size:17px;}\n  #kev-terminwunsch-app .kev-tw-color-stylist p{margin:0 0 14px;color:#75623a;font-size:14px;}\n  #kev-terminwunsch-app .kev-tw-stylists--secondary{grid-template-columns:repeat(4,minmax(0,1fr));}\n  #kev-terminwunsch-app .kev-tw-stylists--secondary .kev-tw-stylist{min-height:132px;background:rgba(255,255,255,.78);}\n  #kev-terminwunsch-app .kev-tw-stylists--secondary .kev-tw-stylist img{width:62px;height:62px;}\n  #kev-terminwunsch-app .kev-tw-stylist{position:relative;display:grid;min-width:0;max-width:100%;justify-items:center;align-content:center;gap:10px;min-height:154px;padding:15px 9px;border:1px solid #ded7c9;border-radius:19px;background:linear-gradient(155deg,#fff,#fcfaf5);box-shadow:0 7px 18px rgba(42,34,20,.055);color:var(--tw-ink);cursor:pointer;text-align:center;touch-action:manipulation;transition:transform .16s ease,border-color .16s ease,box-shadow .16s ease,background .16s ease;}\n  #kev-terminwunsch-app .kev-tw-stylist:hover{transform:translateY(-2px);border-color:var(--tw-gold);box-shadow:0 13px 25px rgba(66,50,17,.12);}\n  #kev-terminwunsch-app .kev-tw-stylist input{position:absolute;opacity:0;pointer-events:none;}\n  #kev-terminwunsch-app .kev-tw-stylist img{width:78px;height:78px;border:3px solid #f0dfaa;border-radius:50%;object-fit:cover;background:#eee9df;box-shadow:0 6px 16px rgba(31,26,17,.14);}\n  #kev-terminwunsch-app .kev-tw-stylist span{font-size:14px;font-weight:800;line-height:1.2;}\n  #kev-terminwunsch-app .kev-tw-stylist.is-selected{border-color:var(--tw-gold-deep);background:linear-gradient(150deg,#fffdf8,#fff3cc);box-shadow:0 0 0 3px rgba(216,168,47,.17),0 13px 28px rgba(68,51,15,.1);}\n  #kev-terminwunsch-app .kev-tw-stylist.is-selected::after{position:absolute;top:8px;right:8px;display:grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--tw-gold);color:#17120a;content:\"\u2713\";font-size:13px;font-weight:900;}\n  #kev-terminwunsch-app .kev-tw-services{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));align-items:start;gap:13px;}\n  #kev-terminwunsch-app .kev-tw-service-group{position:relative;overflow:hidden;padding:18px 15px 16px;border:1px solid #ded7c9;border-radius:18px;background:linear-gradient(155deg,#fff,#fcfaf5);box-shadow:0 8px 22px rgba(48,39,22,.055);}\n  #kev-terminwunsch-app .kev-tw-service-group::before{position:absolute;inset:0 0 auto;height:3px;background:linear-gradient(90deg,var(--tw-gold-deep),var(--tw-gold-bright));content:\"\";}\n  #kev-terminwunsch-app .kev-tw-service-group h3{margin:0 0 13px;color:#29241b;font-size:15px;font-weight:900;}\n  #kev-terminwunsch-app .kev-tw-service-options{display:grid;gap:8px;}\n  #kev-terminwunsch-app .kev-tw-service-option{position:relative;display:block;max-width:100%;cursor:pointer;touch-action:manipulation;}\n  #kev-terminwunsch-app .kev-tw-service-option input{position:absolute;opacity:0;pointer-events:none;}\n  #kev-terminwunsch-app .kev-tw-service-option span{display:grid;align-items:center;min-height:42px;border:1px solid #ded8cd;border-radius:12px;background:rgba(255,255,255,.9);padding:8px 11px;color:#3d372d;font-size:14px;font-weight:700;line-height:1.25;transition:border-color .16s ease,background .16s ease,box-shadow .16s ease,transform .16s ease;}\n  #kev-terminwunsch-app .kev-tw-stylist span,#kev-terminwunsch-app .kev-tw-service-option span,#kev-terminwunsch-app .kev-tw-step legend,#kev-terminwunsch-app .kev-tw-step p{overflow-wrap:anywhere;}\n  #kev-terminwunsch-app .kev-tw-service-option input:checked+span{border-color:var(--tw-gold-deep);background:linear-gradient(145deg,#fff9e6,var(--tw-gold-light));box-shadow:0 0 0 2px rgba(216,168,47,.14),0 5px 13px rgba(80,60,16,.07);color:#392d0d;transform:translateY(-1px);}\n  #kev-terminwunsch-app .kev-tw-weekdays-block{margin:21px 0 19px;}\n  #kev-terminwunsch-app .kev-tw-duration-card{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:3px 18px;margin:17px 0 4px;padding:15px 17px;border:1px solid rgba(206,158,38,.34);border-radius:16px;background:linear-gradient(145deg,#fffdf8,#fff5d8);box-shadow:0 8px 20px rgba(83,63,18,.055);}\n  #kev-terminwunsch-app .kev-tw-duration-card span{color:#6d5a2c;font-size:12px;font-weight:850;letter-spacing:.045em;text-transform:uppercase;}\n  #kev-terminwunsch-app .kev-tw-duration-card strong{grid-row:1 \/ span 2;grid-column:2;color:#2e260f;font-size:18px;font-weight:900;white-space:nowrap;}\n  #kev-terminwunsch-app .kev-tw-duration-card small{color:#756c5b;font-size:12px;font-weight:600;line-height:1.4;}\n  #kev-terminwunsch-app .kev-tw-weekdays-block>strong,#kev-terminwunsch-app .kev-tw-availability-head strong{display:block;color:#2e3a55;font-size:15px;}\n  #kev-terminwunsch-app .kev-tw-weekdays{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;}\n  #kev-terminwunsch-app .kev-tw-weekday{position:relative;cursor:pointer;}\n  #kev-terminwunsch-app .kev-tw-weekday input{position:absolute;opacity:0;pointer-events:none;}\n  #kev-terminwunsch-app .kev-tw-weekday span{display:grid;place-items:center;min-width:48px;min-height:42px;border:1px solid #d8d1c4;border-radius:12px;background:#fff;box-shadow:0 3px 10px rgba(46,38,24,.04);color:#4b4437;font-size:14px;font-weight:800;}\n  #kev-terminwunsch-app .kev-tw-weekday input:checked+span{border-color:var(--tw-gold-deep);background:linear-gradient(145deg,var(--tw-gold-bright),var(--tw-gold));box-shadow:0 5px 13px rgba(109,80,15,.17);color:#17120a;}\n  #kev-terminwunsch-app .kev-tw-availability-head{display:flex;align-items:end;justify-content:space-between;gap:14px;padding-top:5px;}\n  #kev-terminwunsch-app .kev-tw-availability-head span{display:block;margin-top:2px;color:var(--tw-muted);font-size:13px;}\n  #kev-terminwunsch-app .kev-tw-link-button{border:1px solid rgba(206,158,38,.35);border-radius:999px;background:#fffaf0;color:#75560f;padding:8px 12px;font:800 14px\/1.25 inherit;cursor:pointer;touch-action:manipulation;}\n  #kev-terminwunsch-app .kev-tw-link-button:hover{text-decoration:underline;}\n  #kev-terminwunsch-app .kev-tw-time-windows{display:grid;gap:10px;margin-top:12px;}\n  #kev-terminwunsch-app .kev-tw-time-window{display:grid;width:100%;max-width:100%;min-width:0;grid-template-columns:minmax(155px,.95fr) minmax(145px,.95fr) minmax(105px,.65fr) minmax(105px,.65fr) 44px;grid-template-areas:\"day type from to remove\";align-items:end;gap:9px;padding:15px;border:1px solid #ddd5c6;border-left:4px solid var(--tw-gold);border-radius:16px;background:linear-gradient(145deg,#fff,#fcfaf5);box-shadow:0 7px 19px rgba(48,39,22,.05);}\n  #kev-terminwunsch-app .kev-tw-time-window [data-window-day]{grid-area:day;}\n  #kev-terminwunsch-app .kev-tw-time-window [data-window-type-wrap]{grid-area:type;}\n  #kev-terminwunsch-app .kev-tw-time-window [data-window-from-wrap]{grid-area:from;}\n  #kev-terminwunsch-app .kev-tw-time-window [data-window-end]{grid-area:to;}\n  #kev-terminwunsch-app .kev-tw-time-window.is-exact{grid-template-columns:minmax(155px,1fr) minmax(165px,1fr) minmax(125px,.8fr) 44px;grid-template-areas:\"day type from remove\";}\n  #kev-terminwunsch-app .kev-tw-time-window.is-single-date{grid-template-columns:minmax(180px,1fr) minmax(130px,.8fr) minmax(130px,.8fr) 44px;grid-template-areas:\"type from to remove\";}\n  #kev-terminwunsch-app .kev-tw-time-window.is-single-date.is-exact{grid-template-columns:minmax(190px,1fr) minmax(150px,1fr) 44px;grid-template-areas:\"type from remove\";}\n  #kev-terminwunsch-app .kev-tw-time-window>*{min-width:0;max-width:100%;}\n  #kev-terminwunsch-app .kev-tw-time-window label{font-size:12px;}\n  #kev-terminwunsch-app .kev-tw-time-window input,#kev-terminwunsch-app .kev-tw-time-window select{min-height:43px;padding:9px;}\n  #kev-terminwunsch-app .kev-tw-remove-window{grid-area:remove;display:grid;place-items:center;width:42px;max-width:42px;min-width:42px;height:42px;min-height:42px;margin:0;padding:0;border:1px solid #e1c9c4;border-radius:12px;background:linear-gradient(145deg,#fff,#fff8f6);box-shadow:0 4px 11px rgba(95,46,37,.07);color:#99483e;cursor:pointer;touch-action:manipulation;transition:border-color .16s ease,background .16s ease,box-shadow .16s ease,transform .16s ease;}\n  #kev-terminwunsch-app .kev-tw-remove-window svg{display:block;width:18px;height:18px;pointer-events:none;}\n  #kev-terminwunsch-app .kev-tw-remove-window:hover{transform:translateY(-1px);border-color:#cf8d82;background:#fff0ed;box-shadow:0 7px 15px rgba(118,50,39,.12);}\n  #kev-terminwunsch-app .kev-tw-schedule-notice{margin-top:14px;padding:15px 17px;border:1px solid #dfa89f;border-left:5px solid #bd4f43;border-radius:15px;background:linear-gradient(145deg,#fff8f6,#fff1ee);box-shadow:0 8px 20px rgba(116,51,40,.07);color:#6f302a;font-size:13px;line-height:1.5;}\n  #kev-terminwunsch-app .kev-tw-schedule-notice>strong{display:block;margin-bottom:5px;color:#8b3028;font-size:14px;font-weight:900;}\n  #kev-terminwunsch-app .kev-tw-schedule-notice ul{display:grid;gap:5px;margin:0 0 8px;padding-left:19px;}\n  #kev-terminwunsch-app .kev-tw-schedule-notice p{margin:0;color:#74453f;font-size:12px;font-weight:700;}\n  #kev-terminwunsch-app .kev-tw-message{margin-top:20px;border:1px solid #d67d72;border-radius:10px;background:#fff3f1;padding:11px 13px;color:#8a322b;font-size:14px;font-weight:700;}\n  #kev-terminwunsch-app .kev-tw-actions{display:flex;justify-content:space-between;gap:10px;margin-top:25px;padding:20px 3px 0;border-top:1px solid rgba(168,135,77,.23);}\n  #kev-terminwunsch-app .kev-tw-actions .kev-tw-button:not([hidden])~.kev-tw-button:not([hidden]){margin-left:auto;}\n  #kev-terminwunsch-app .kev-tw-button{max-width:100%;min-height:50px;border:1px solid var(--tw-gold-deep);border-radius:13px;background:linear-gradient(45deg,var(--tw-gold-deep) 0%,var(--tw-gold) 48%,var(--tw-gold-bright) 100%);background-size:140% 100%;box-shadow:0 8px 19px rgba(154,112,13,.2);color:#0a0a0a;padding:12px 20px;font:900 15px\/1.2 inherit;cursor:pointer;touch-action:manipulation;transition:transform .16s ease,background-position .22s ease,box-shadow .16s ease,opacity .16s ease;}\n  #kev-terminwunsch-app .kev-tw-button:hover{transform:translateY(-1px);background-position:100% 0;box-shadow:0 11px 23px rgba(154,112,13,.26);}\n  #kev-terminwunsch-app .kev-tw-button:disabled{cursor:wait;opacity:.64;transform:none;}\n  #kev-terminwunsch-app .kev-tw-button--secondary{border-color:#d5cdbc;background:#fff;box-shadow:0 5px 14px rgba(47,39,24,.07);color:#40392d;}\n  #kev-terminwunsch-app .kev-tw-button--secondary:hover{background:#f3f6fb;}\n  #kev-terminwunsch-app .kev-tw-summary{display:grid;gap:10px;margin:0 0 18px;padding:20px;border:1px solid rgba(206,158,38,.34);border-radius:17px;background:linear-gradient(145deg,#fffdf8,#fff5d8);box-shadow:0 9px 24px rgba(83,63,18,.07);}\n  #kev-terminwunsch-app .kev-tw-summary h3{margin:0;color:#5c4610;font-size:15px;}\n  #kev-terminwunsch-app .kev-tw-summary dl{display:grid;grid-template-columns:128px minmax(0,1fr);gap:7px 14px;margin:0;color:#3d4963;font-size:14px;}\n  #kev-terminwunsch-app .kev-tw-summary dt{color:#68748b;font-weight:750;}\n  #kev-terminwunsch-app .kev-tw-summary dd{min-width:0;margin:0;font-weight:800;overflow-wrap:anywhere;}\n  #kev-terminwunsch-app .kev-tw-note small{color:var(--tw-muted);font-size:12px;font-weight:600;}\n  #kev-terminwunsch-app .kev-tw-privacy{margin:13px 0 0;color:var(--tw-muted);font-size:13px;}\n  #kev-terminwunsch-app .kev-tw-success{padding:52px 30px;background:linear-gradient(180deg,#fffaf0,#fff 48%);text-align:center;}\n  #kev-terminwunsch-app .kev-tw-success__mark{display:grid;place-items:center;width:62px;height:62px;margin:0 auto 18px;border:1px solid var(--tw-gold-deep);border-radius:50%;background:linear-gradient(145deg,var(--tw-gold-bright),var(--tw-gold));box-shadow:0 9px 24px rgba(132,96,12,.22);color:#17120a;font-size:30px;font-weight:900;}\n  #kev-terminwunsch-app .kev-tw-success h3{margin-bottom:9px;font-size:25px;letter-spacing:-.02em;}\n  #kev-terminwunsch-app .kev-tw-success p{max-width:510px;margin:0 auto 23px;color:var(--tw-muted);}\n  #kev-terminwunsch-app .kev-tw-honeypot{position:absolute!important;left:-10000px!important;width:1px!important;height:1px!important;opacity:0!important;}\n  @keyframes kevTwFade{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:translateY(0)}}\n  @keyframes kevTwHoursPulse{from{transform:scale(.65);opacity:.75}to{transform:scale(1.9);opacity:0}}\n  @media (max-width:720px){#kev-terminwunsch-app .kev-tw-titlebar{padding:25px 22px;}#kev-terminwunsch-app .kev-tw-titlebar::after{right:22px;bottom:15px;}#kev-terminwunsch-app form{padding:22px 18px 25px;}#kev-terminwunsch-app .kev-tw-services{grid-template-columns:1fr;}#kev-terminwunsch-app .kev-tw-stylists,#kev-terminwunsch-app .kev-tw-stylists--secondary{grid-template-columns:repeat(2,minmax(0,1fr));}#kev-terminwunsch-app .kev-tw-time-window{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-areas:\"day type\" \"from to\" \". remove\";}#kev-terminwunsch-app .kev-tw-time-window.is-exact{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-areas:\"day type\" \"from remove\";}#kev-terminwunsch-app .kev-tw-time-window.is-single-date{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-areas:\"type type\" \"from to\" \". remove\";}#kev-terminwunsch-app .kev-tw-time-window.is-single-date.is-exact{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-areas:\"type type\" \"from remove\";}#kev-terminwunsch-app .kev-tw-remove-window{justify-self:end;}#kev-terminwunsch-app .kev-tw-time-window [data-window-end][hidden]{display:none;}}\n  @media (max-width:420px){#kev-terminwunsch-app .kev-tw-hours__row{grid-template-columns:1fr;gap:2px;padding:9px 2px;}#kev-terminwunsch-app .kev-tw-hours__time{text-align:left;white-space:normal;}#kev-terminwunsch-app .kev-tw-hours__rules{display:grid;grid-template-columns:1fr;}#kev-terminwunsch-app .kev-tw-hours__rules span{justify-content:flex-start;}}\n  @media (max-width:500px){#kev-terminwunsch-app{padding:7px;}#kev-terminwunsch-app .kev-tw-shell{border-radius:19px;box-shadow:0 14px 36px rgba(29,25,18,.14);}#kev-terminwunsch-app .kev-tw-titlebar{padding:23px 17px 24px;}#kev-terminwunsch-app .kev-tw-titlebar::after{right:17px;bottom:13px;width:48px;}#kev-terminwunsch-app form{padding:16px 10px 18px;}#kev-terminwunsch-app .kev-tw-title{font-size:27px!important;}#kev-terminwunsch-app .kev-tw-title span{font-size:.47em;letter-spacing:.06em;}#kev-terminwunsch-app .kev-tw-progress{gap:2px;margin-bottom:14px;padding:10px 7px;border-radius:14px;}#kev-terminwunsch-app .kev-tw-progress>span{display:grid;grid-template-columns:1fr;justify-items:center;font-size:12px;text-align:center;}#kev-terminwunsch-app .kev-tw-progress b{width:26px;height:26px;}#kev-terminwunsch-app .kev-tw-progress i{max-width:100%;}#kev-terminwunsch-app .kev-tw-step{padding:19px 15px;border-radius:17px;}#kev-terminwunsch-app .kev-tw-step legend{font-size:22px;}#kev-terminwunsch-app .kev-tw-fields--two{grid-template-columns:1fr;}#kev-terminwunsch-app .kev-tw-dates{gap:10px;}#kev-terminwunsch-app .kev-tw-duration-card{grid-template-columns:1fr;gap:4px;padding:14px;}#kev-terminwunsch-app .kev-tw-duration-card strong{grid-row:auto;grid-column:auto;font-size:17px;white-space:normal;}#kev-terminwunsch-app .kev-tw-stylist{min-height:139px;border-radius:16px;}#kev-terminwunsch-app .kev-tw-stylist img{width:66px;height:66px;}#kev-terminwunsch-app .kev-tw-color-stylist{padding:15px;border-radius:16px;}#kev-terminwunsch-app .kev-tw-weekdays{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));}#kev-terminwunsch-app .kev-tw-weekday span{width:100%;min-width:0;}#kev-terminwunsch-app .kev-tw-availability-head{align-items:start;flex-direction:column;}#kev-terminwunsch-app .kev-tw-time-window,#kev-terminwunsch-app .kev-tw-time-window.is-exact,#kev-terminwunsch-app .kev-tw-time-window.is-single-date,#kev-terminwunsch-app .kev-tw-time-window.is-single-date.is-exact{grid-template-columns:minmax(0,1fr);padding:13px 12px;border-radius:14px;}#kev-terminwunsch-app .kev-tw-time-window{grid-template-areas:\"day\" \"type\" \"from\" \"to\" \"remove\";}#kev-terminwunsch-app .kev-tw-time-window.is-exact{grid-template-areas:\"day\" \"type\" \"from\" \"remove\";}#kev-terminwunsch-app .kev-tw-time-window.is-single-date{grid-template-areas:\"type\" \"from\" \"to\" \"remove\";}#kev-terminwunsch-app .kev-tw-time-window.is-single-date.is-exact{grid-template-areas:\"type\" \"from\" \"remove\";}#kev-terminwunsch-app .kev-tw-remove-window{justify-self:end;}#kev-terminwunsch-app .kev-tw-actions{align-items:stretch;flex-direction:column-reverse;padding-right:0;padding-left:0;}#kev-terminwunsch-app .kev-tw-actions .kev-tw-button:not([hidden])~.kev-tw-button:not([hidden]){margin-left:0;}#kev-terminwunsch-app .kev-tw-button{width:100%;}#kev-terminwunsch-app .kev-tw-summary{padding:15px;}#kev-terminwunsch-app .kev-tw-summary dl{grid-template-columns:1fr;gap:1px;}#kev-terminwunsch-app .kev-tw-summary dd{margin-bottom:7px;}}\n  @media (prefers-reduced-motion:reduce){#kev-terminwunsch-app *,#kev-terminwunsch-app *::before,#kev-terminwunsch-app *::after{scroll-behavior:auto!important;animation-duration:.01ms!important;transition-duration:.01ms!important;}}\n<\/style>\n\n<script type=\"module\">\n  import { initializeApp } from \"https:\/\/www.gstatic.com\/firebasejs\/12.4.0\/firebase-app.js\";\n  import { getDatabase, ref, set, serverTimestamp } from \"https:\/\/www.gstatic.com\/firebasejs\/12.4.0\/firebase-database.js\";\n\n  const firebaseConfig = {\n    apiKey: \"AIzaSyAbXNeYuiyto7eFxJ9nD0YgsUtj2b1iapw\",\n    authDomain: \"getr-9e2fe.firebaseapp.com\",\n    projectId: \"getr-9e2fe\",\n    storageBucket: \"getr-9e2fe.firebasestorage.app\",\n    messagingSenderId: \"794918654915\",\n    appId: \"1:794918654915:web:7841e0ec3c459bcde5a376\",\n    databaseURL: \"https:\/\/getr-9e2fe-default-rtdb.europe-west1.firebasedatabase.app\"\n  };\n\n  const stylists = [\n    [\"kirstin\",\"Kirstin Ellen Vietze\",\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/08\/Gruppe-maskieren283.png\"],\n    [\"sabrina\",\"Sabrina\",\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2025\/06\/Bild2-e1749562614522.png\"],\n    [\"paraskevi\",\"Paraskevi\",\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/08\/Gruppe-maskieren282.png\"],\n    [\"franziska\",\"Franziska\",\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/08\/Franziska-Schoenebeck.png\"],\n    [\"bahareh\",\"Bahareh\",\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/08\/Bahareh-Pourali.png\"],\n    [\"raffat\",\"Raffat\",\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/11\/Foto-Raffat-unbearbeitet-modified-e1732111628418.png\"],\n    [\"vanessa\",\"Vanessa\",\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/08\/Gruppe-maskieren-278-round.png\"],\n    [\"khalil\",\"Khalil\",\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2025\/02\/MA-Team-Coach-8-1.png\"]\n  ].map(([id,name,image]) => ({id,name,image}));\n\n  const serviceGroups = [\n    {id:\"schnitt\",name:\"Schnitt\",options:[[\"schneiden-foehnen\",\"Schneiden & F\u00f6hnen\",60],[\"calligraphy-cut\",\"Calligraphy Cut\",60],[\"cut-go\",\"Cut & Go\",60],[\"heisse-schere\",\"Hei\u00dfe Schere\",60]]},\n    {id:\"coloration\",name:\"Coloration\",options:[[\"ansatzfarbe\",\"Ansatzfarbe\",90],[\"straehnen\",\"Str\u00e4hnen\",120],[\"blondierung\",\"Blondierung\",120]]},\n    {id:\"weitere\",name:\"Weitere Leistungen\",options:[[\"augenbrauen-faerben\",\"Augenbrauen f\u00e4rben\",30],[\"augenbrauen-definieren\",\"Augenbrauen definieren\",30],[\"wimpern-faerben\",\"Wimpern f\u00e4rben\",30],[\"treatment\",\"Treatment\",30]]}\n  ];\n  const services = new Map(serviceGroups.flatMap(group => group.options).map(([id,name,duration]) => [id,{name,duration}]));\n  const weekdays = [[1,\"Mo\",\"Montag\"],[2,\"Di\",\"Dienstag\"],[3,\"Mi\",\"Mittwoch\"],[4,\"Do\",\"Donnerstag\"],[5,\"Fr\",\"Freitag\"],[6,\"Sa\",\"Samstag\"]].map(([id,short,name]) => ({id,short,name}));\n  const openingHours = new Map([\n    [1,{open:\"12:00\",close:\"18:00\",parity:\"odd\"}],\n    [2,{open:\"09:00\",close:\"18:00\",parity:\"all\"}],\n    [3,{open:\"11:00\",close:\"20:00\",parity:\"all\"}],\n    [4,{open:\"10:00\",close:\"20:00\",parity:\"all\"}],\n    [5,{open:\"09:00\",close:\"19:00\",parity:\"all\"}],\n    [6,{open:\"09:00\",close:\"15:00\",parity:\"even\"}]\n  ]);\n  const colorServiceIds = new Set(serviceGroups.find(group => group.id === \"coloration\").options.map(([id]) => id));\n  const eyeServiceIds = new Set([\"augenbrauen-faerben\",\"augenbrauen-definieren\",\"wimpern-faerben\"]);\n  const timeChoiceValues = Array.from({length:23},(_,index) => `${String(9 + Math.floor(index \/ 2)).padStart(2,\"0\")}:${index % 2 ? \"30\" : \"00\"}`);\n\n  const root = document.getElementById(\"kev-terminwunsch-app\");\n  if(root){\n    const app = initializeApp(firebaseConfig, \"kevWebsiteWaitlist\");\n    const database = getDatabase(app);\n    const form = root.querySelector(\"#kevTerminForm\");\n    const hoursToggle = root.querySelector(\"#kevTwHoursToggle\");\n    const hoursPanel = root.querySelector(\"#kevTwHoursPanel\");\n    const hoursDot = root.querySelector(\"#kevTwHoursDot\");\n    const hoursStatus = root.querySelector(\"#kevTwHoursStatus\");\n    const hoursMeta = root.querySelector(\"#kevTwHoursMeta\");\n    const hoursList = root.querySelector(\"#kevTwHoursList\");\n    const nameInput = root.querySelector(\"#kevTwName\");\n    const phoneInput = root.querySelector(\"#kevTwPhone\");\n    const dateFrom = root.querySelector(\"#kevTwDateFrom\");\n    const dateTo = root.querySelector(\"#kevTwDateTo\");\n    const stylistsNode = root.querySelector(\"#kevTwStylists\");\n    const colorStylistsNode = root.querySelector(\"#kevTwColorStylists\");\n    const colorStylistBlock = root.querySelector(\"#kevTwColorStylistBlock\");\n    const stylistTitle = root.querySelector(\"#kevTwStylistTitle\");\n    const stylistIntro = root.querySelector(\"#kevTwStylistIntro\");\n    const servicesNode = root.querySelector(\"#kevTwServices\");\n    const weekdaysNode = root.querySelector(\"#kevTwWeekdays\");\n    const weekdaysBlock = root.querySelector(\"#kevTwWeekdaysBlock\");\n    const windowsNode = root.querySelector(\"#kevTwTimeWindows\");\n    const addWindow = root.querySelector(\"#kevTwAddWindow\");\n    const durationNode = root.querySelector(\"#kevTwDuration\");\n    const scheduleNotice = root.querySelector(\"#kevTwScheduleNotice\");\n    const message = root.querySelector(\"#kevTwMessage\");\n    const summary = root.querySelector(\"#kevTwSummary\");\n    const noteInput = root.querySelector(\"#kevTwNote\");\n    const next = root.querySelector(\"#kevTwNext\");\n    const back = root.querySelector(\"#kevTwBack\");\n    const submit = root.querySelector(\"#kevTwSubmit\");\n    const success = root.querySelector(\"#kevTwSuccess\");\n    const restart = root.querySelector(\"#kevTwRestart\");\n    const honeypot = root.querySelector(\"#kevTwWebsite\");\n    let step = 1;\n    let dateToChanged = false;\n\n    const pad = value => String(value).padStart(2,\"0\");\n    const today = () => { const now = new Date(); return `${now.getFullYear()}-${pad(now.getMonth()+1)}-${pad(now.getDate())}`; };\n    const parseDate = value => { const [year,month,day] = String(value).split(\"-\").map(Number); return new Date(year,month-1,day); };\n    const minute = value => { const [hour,minutes] = String(value || \"00:00\").split(\":\").map(Number); return hour * 60 + minutes; };\n    const asTime = value => `${pad(Math.floor(value \/ 60))}:${pad(value % 60)}`;\n    const dateLabel = value => new Intl.DateTimeFormat(\"de-DE\",{day:\"2-digit\",month:\"2-digit\",year:\"numeric\"}).format(parseDate(value));\n    const dayLabel = id => weekdays.find(day => day.id === Number(id))?.short || \"\";\n    const dayName = id => Number(id) === 0 ? \"Sonntag\" : (weekdays.find(day => day.id === Number(id))?.name || \"diesem Tag\");\n    const selectedStylist = () => root.querySelector(\"input[name='kevTwStylist']:checked\")?.value || \"\";\n    const selectedColorStylist = () => root.querySelector(\"input[name='kevTwColorStylist']:checked\")?.value || \"\";\n    const selectedServices = () => [...root.querySelectorAll(\"input[data-service]:checked\")].map(input => input.value);\n    const selectedDays = () => {\n      if(dateFrom.value && dateFrom.value === dateTo.value) return [parseDate(dateFrom.value).getDay()];\n      return [...root.querySelectorAll(\"input[name='kevTwDay']:checked\")].map(input => Number(input.value));\n    };\n    const isSingleDate = () => Boolean(dateFrom.value && dateFrom.value === dateTo.value);\n    const escapeText = value => String(value ?? \"\").replace(\/[&<>\"']\/g, character => ({\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"}[character]));\n    const hasCutService = () => selectedServices().some(id => serviceGroups[0].options.some(([serviceId]) => serviceId === id));\n    const hasColorService = () => selectedServices().some(id => serviceGroups[1].options.some(([serviceId]) => serviceId === id));\n    const needsColorStylist = () => hasCutService() && hasColorService() && selectedStylist() === \"kirstin\";\n    const estimatedDuration = (ids = selectedServices()) => {\n      const hasColor = ids.some(id => colorServiceIds.has(id));\n      return ids.reduce((sum,id) => sum + (hasColor && eyeServiceIds.has(id) ? 0 : (services.get(id)?.duration || 0)),0);\n    };\n\n    stylistsNode.innerHTML = stylists.map(item => `<label class=\"kev-tw-stylist\"><input type=\"radio\" name=\"kevTwStylist\" value=\"${item.id}\"><img decoding=\"async\" src=\"${item.image}\" alt=\"${item.name}\" loading=\"lazy\"><span>${item.name}<\/span><\/label>`).join(\"\");\n    colorStylistsNode.innerHTML = stylists.filter(item => item.id !== \"kirstin\").map(item => `<label class=\"kev-tw-stylist\"><input type=\"radio\" name=\"kevTwColorStylist\" value=\"${item.id}\"><img decoding=\"async\" src=\"${item.image}\" alt=\"${item.name}\" loading=\"lazy\"><span>${item.name}<\/span><\/label>`).join(\"\");\n    servicesNode.innerHTML = serviceGroups.map(group => `<section class=\"kev-tw-service-group\"><h3>${group.name}<\/h3><div class=\"kev-tw-service-options\">${group.options.map(([id,name]) => `<label class=\"kev-tw-service-option\"><input type=\"radio\" name=\"kevTwService-${group.id}\" value=\"${id}\" data-service><span>${name}<\/span><\/label>`).join(\"\")}<\/div><\/section>`).join(\"\");\n    weekdaysNode.innerHTML = weekdays.map(day => `<label class=\"kev-tw-weekday\" title=\"${day.name}\"><input type=\"checkbox\" name=\"kevTwDay\" value=\"${day.id}\" checked><span>${day.short}<\/span><\/label>`).join(\"\");\n\n    function showMessage(text){\n      message.textContent = text || \"\";\n      message.hidden = !text;\n    }\n    function updateStep(){\n      if(root.contains(document.activeElement) && typeof document.activeElement.blur === \"function\") document.activeElement.blur();\n      root.querySelectorAll(\"[data-step]\").forEach(node => { const active = Number(node.dataset.step) === step; node.hidden = !active; node.classList.toggle(\"is-active\",active); });\n      root.querySelectorAll(\"[data-progress]\").forEach(node => { const number = Number(node.dataset.progress); node.classList.toggle(\"is-active\",number === step); node.classList.toggle(\"is-done\",number < step); });\n      back.hidden = step === 1;\n      next.hidden = step === 5;\n      submit.hidden = step !== 5;\n      if(step === 3) updateStylistStep();\n      if(step === 4) renderScheduleReview();\n      if(step === 5) renderSummary();\n      showMessage(\"\");\n      requestAnimationFrame(() => root.scrollIntoView({behavior:window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ? \"auto\" : \"smooth\",block:\"start\"}));\n    }\n    function setSelectedStylistCard(container, value){\n      container.querySelectorAll(\".kev-tw-stylist\").forEach(card => card.classList.toggle(\"is-selected\",card.querySelector(\"input\").value === value));\n    }\n    function updateStylistStep(){\n      const hasCut = hasCutService();\n      const hasColor = hasColorService();\n      if(hasCut){\n        stylistTitle.textContent = \"Wer darf deinen Schnitt \u00fcbernehmen?\";\n        stylistIntro.textContent = hasColor ? \"W\u00e4hle zuerst die Person f\u00fcr deinen Schnitt.\" : \"W\u00e4hle deine bevorzugte Stylistin oder deinen bevorzugten Stylisten.\";\n      }else if(hasColor){\n        stylistTitle.textContent = \"Wer darf deine Coloration \u00fcbernehmen?\";\n        stylistIntro.textContent = \"W\u00e4hle deine bevorzugte Stylistin oder deinen bevorzugten Stylisten.\";\n      }else{\n        stylistTitle.textContent = \"Bei wem m\u00f6chtest du deinen Termin?\";\n        stylistIntro.textContent = \"W\u00e4hle deine bevorzugte Stylistin oder deinen bevorzugten Stylisten.\";\n      }\n      const showColorStylist = needsColorStylist();\n      colorStylistBlock.hidden = !showColorStylist;\n      if(!showColorStylist){\n        root.querySelectorAll(\"input[name='kevTwColorStylist']\").forEach(input => { input.checked = false; });\n        setSelectedStylistCard(colorStylistsNode, \"\");\n      }\n    }\n    function weekdayOptions(selected = \"all\"){\n      const days = selectedDays().filter(day => day >= 1 && day <= 6);\n      return `<option value=\"all\">Alle ausgew\u00e4hlten Tage<\/option>${days.map(day => `<option value=\"${day}\" ${String(day) === String(selected) ? \"selected\" : \"\"}>${dayLabel(day)}<\/option>`).join(\"\")}`;\n    }\n    function timeOptions(selected = \"09:00\"){\n      const safeSelected = timeChoiceValues.includes(selected) ? selected : \"09:00\";\n      return timeChoiceValues.map(value => `<option value=\"${value}\" ${value === safeSelected ? \"selected\" : \"\"}>${value} Uhr<\/option>`).join(\"\");\n    }\n    function addTimeWindow(values = {day:\"all\",type:\"range\",from:\"09:00\",to:\"18:00\"}){\n      const exact = values.type === \"exact\";\n      const row = document.createElement(\"div\");\n      row.className = `kev-tw-time-window${exact ? \" is-exact\" : \"\"}`;\n      row.dataset.timeWindow = \"\";\n      row.innerHTML = `<label data-window-day><span>Tag<\/span><select data-window-day-select>${weekdayOptions(values.day)}<\/select><\/label><label data-window-type-wrap><span>Auswahl<\/span><select data-window-type><option value=\"range\" ${exact ? \"\" : \"selected\"}>Startzeitraum<\/option><option value=\"exact\" ${exact ? \"selected\" : \"\"}>Genaue Startzeit<\/option><\/select><\/label><label data-window-from-wrap><span data-window-from-label>${exact ? \"Startzeit\" : \"Fr\u00fchester Start\"}<\/span><select data-window-from required>${timeOptions(values.from)}<\/select><\/label><label data-window-end ${exact ? \"hidden\" : \"\"}><span>Sp\u00e4tester Start<\/span><select data-window-to required>${timeOptions(values.to)}<\/select><\/label><button class=\"kev-tw-remove-window\" type=\"button\" aria-label=\"Zeitfenster entfernen\" title=\"Zeitfenster entfernen\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 7h16M9 7V4h6v3m-8 0 1 13h8l1-13M10 11v5m4-5v5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><\/button>`;\n      windowsNode.append(row);\n      syncSingleDateState();\n      renderScheduleReview();\n    }\n    function timeWindows(){\n      return [...windowsNode.querySelectorAll(\"[data-time-window]\")].map(row => {\n        const type = row.querySelector(\"[data-window-type]\").value;\n        const from = row.querySelector(\"[data-window-from]\").value;\n        const to = type === \"exact\" ? from : row.querySelector(\"[data-window-to]\").value;\n        return {day:isSingleDate() ? \"all\" : row.querySelector(\"[data-window-day-select]\").value,type,from,to};\n      });\n    }\n    function updateWindowDays(){\n      const single = isSingleDate();\n      windowsNode.querySelectorAll(\"[data-time-window]\").forEach(row => {\n        row.classList.toggle(\"is-single-date\",single);\n        const select = row.querySelector(\"[data-window-day-select]\");\n        const former = select.value;\n        select.innerHTML = weekdayOptions(former);\n      });\n    }\n    function syncSingleDateState(){\n      const single = isSingleDate();\n      weekdaysBlock.hidden = single;\n      if(single){\n        const weekday = parseDate(dateFrom.value).getDay();\n        root.querySelectorAll(\"input[name='kevTwDay']\").forEach(input => { input.checked = Number(input.value) === weekday; });\n      }\n      windowsNode.querySelectorAll(\"[data-window-day]\").forEach(node => { node.hidden = single; });\n      updateWindowDays();\n    }\n    function validateTimeWindows(){\n      const windows = timeWindows();\n      if(!windows.length) return \"Bitte mindestens eine passende Uhrzeit angeben.\";\n      for(const window of windows){\n        if(!window.from || !window.to) return \"Bitte jede Uhrzeit vollst\u00e4ndig angeben.\";\n        if(window.type === \"range\" && minute(window.to) <= minute(window.from)) return \"Der sp\u00e4teste Start muss nach dem fr\u00fchesten Start liegen.\";\n      }\n      return \"\";\n    }\n    function isoWeekNumber(value){\n      const date = new Date(Date.UTC(value.getFullYear(),value.getMonth(),value.getDate()));\n      const weekday = date.getUTCDay() || 7;\n      date.setUTCDate(date.getUTCDate() + 4 - weekday);\n      const yearStart = new Date(Date.UTC(date.getUTCFullYear(),0,1));\n      return Math.ceil((((date - yearStart) \/ 86400000) + 1) \/ 7);\n    }\n    function addCalendarDays(value,amount){const date = new Date(value);date.setDate(date.getDate() + amount);return date;}\n    function dateKey(value){return `${value.getFullYear()}-${pad(value.getMonth()+1)}-${pad(value.getDate())}`;}\n    function easterSunday(year){\n      const a=year%19,b=Math.floor(year\/100),c=year%100,d=Math.floor(b\/4),e=b%4,f=Math.floor((b+8)\/25),g=Math.floor((b-f+1)\/3),h=(19*a+b-d-g+15)%30,i=Math.floor(c\/4),k=c%4,l=(32+2*e+2*i-h-k)%7,m=Math.floor((a+11*h+22*l)\/451),month=Math.floor((h+l-7*m+114)\/31),day=(h+l-7*m+114)%31+1;\n      return new Date(year,month-1,day);\n    }\n    function berlinHoliday(value){\n      const year=value.getFullYear(),holidays=new Map([[`${year}-01-01`,\"Neujahr\"],[`${year}-03-08`,\"Internationaler Frauentag\"],[`${year}-05-01`,\"Tag der Arbeit\"],[`${year}-10-03`,\"Tag der Deutschen Einheit\"],[`${year}-12-25`,\"1. Weihnachtsfeiertag\"],[`${year}-12-26`,\"2. Weihnachtsfeiertag\"]]);\n      const easter=easterSunday(year);\n      [[-2,\"Karfreitag\"],[1,\"Ostermontag\"],[39,\"Christi Himmelfahrt\"],[50,\"Pfingstmontag\"]].forEach(([offset,label]) => holidays.set(dateKey(addCalendarDays(easter,offset)),label));\n      return holidays.get(dateKey(value)) || \"\";\n    }\n    function effectiveOpening(value){\n      const holiday=berlinHoliday(value);\n      if(holiday)return {open:null,close:null,reason:`an diesem Feiertag (${holiday})`};\n      const weekday=value.getDay(),entry=openingHours.get(weekday);\n      if(!entry)return {open:null,close:null,reason:\"an diesem Wochentag regul\u00e4r\"};\n      const odd=isoWeekNumber(value)%2===1;\n      if(entry.parity===\"odd\"&&!odd)return {open:null,close:null,reason:\"in dieser geraden Kalenderwoche (Montag \u00f6ffnet nur in ungeraden Kalenderwochen)\"};\n      if(entry.parity===\"even\"&&odd)return {open:null,close:null,reason:\"in dieser ungeraden Kalenderwoche (Samstag \u00f6ffnet nur in geraden Kalenderwochen)\"};\n      return entry;\n    }\n    function findNextOpening(fromDate){\n      for(let offset=1;offset<=21;offset+=1){\n        const date=addCalendarDays(fromDate,offset),hours=effectiveOpening(date);\n        if(hours.open&&hours.close)return {date,hours,offset};\n      }\n      return null;\n    }\n    function renderOpeningHours(){\n      const now=new Date(),hours=effectiveOpening(now),nowMinutes=now.getHours()*60+now.getMinutes();\n      const openNow=Boolean(hours.open&&hours.close&&nowMinutes>=minute(hours.open)&&nowMinutes<minute(hours.close));\n      hoursDot.className=`kev-tw-hours__dot ${openNow?\"is-open\":\"is-closed\"}`;\n      if(openNow){\n        hoursStatus.textContent=\"Jetzt ge\u00f6ffnet\";\n        hoursMeta.textContent=`bis ${hours.close} Uhr`;\n      }else if(hours.open&&nowMinutes<minute(hours.open)){\n        hoursStatus.textContent=\"Aktuell geschlossen\";\n        hoursMeta.textContent=`\u00f6ffnet heute um ${hours.open} Uhr \u00b7 bis ${hours.close} Uhr`;\n      }else{\n        const nextOpening=findNextOpening(now);\n        hoursStatus.textContent=\"Aktuell geschlossen\";\n        if(nextOpening){\n          const when=nextOpening.offset===1?\"morgen\":new Intl.DateTimeFormat(\"de-DE\",{weekday:\"long\",day:\"2-digit\",month:\"2-digit\"}).format(nextOpening.date);\n          const holiday=berlinHoliday(now);\n          hoursMeta.textContent=`${holiday?`${holiday} \u00b7 `:\"\"}\u00f6ffnet ${when} um ${nextOpening.hours.open} Uhr`;\n        }else hoursMeta.textContent=\"Die n\u00e4chsten \u00d6ffnungszeiten folgen in K\u00fcrze.\";\n      }\n\n      const isoDay=now.getDay()||7,monday=new Date(now);\n      monday.setDate(now.getDate()-(isoDay-1));\n      monday.setHours(0,0,0,0);\n      hoursList.innerHTML=[1,2,3,4,5,6,7].map(day => {\n        const date=addCalendarDays(monday,day-1),effective=effectiveOpening(date),holiday=berlinHoliday(date),isToday=dateKey(date)===dateKey(now);\n        const label=day===7?\"Sonntag\":dayName(day);\n        const time=holiday?`${holiday} \u00b7 geschlossen`:(effective.open?`${effective.open} \u2013 ${effective.close} Uhr`:\"geschlossen\");\n        return `<div class=\"kev-tw-hours__row ${isToday?\"is-today \":\"\"}${effective.open?\"\":\"is-closed\"}\" role=\"listitem\"><span class=\"kev-tw-hours__day\">${label}${isToday?'<small class=\"kev-tw-hours__today\">Heute<\/small>':\"\"}<\/span><span class=\"kev-tw-hours__time\">${time}<\/span><\/div>`;\n      }).join(\"\");\n    }\n    function occurrencesForDay(day){\n      if(!dateFrom.value||!dateTo.value)return [];\n      const end=parseDate(dateTo.value),dates=[];\n      for(let cursor=parseDate(dateFrom.value),checked=0;cursor<=end&&checked<740;cursor=addCalendarDays(cursor,1),checked+=1){if(cursor.getDay()===Number(day))dates.push(new Date(cursor));}\n      return dates;\n    }\n    function scheduleReview(){\n      const duration=estimatedDuration(),warnings=[];\n      if(!duration||!dateFrom.value||!dateTo.value)return {duration,warnings};\n      timeWindows().forEach(preference => {\n        const targetDays=preference.day===\"all\"?selectedDays():[Number(preference.day)];\n        targetDays.filter(day => day>=0&&day<=6).forEach(day => {\n          const dates=occurrencesForDay(day);\n          if(!dates.length)return;\n          const openDates=dates.map(date => ({date,hours:effectiveOpening(date)})).filter(item => item.hours.open&&item.hours.close);\n          if(!openDates.length){\n            const first=dates[0],reason=effectiveOpening(first).reason;\n            warnings.push(isSingleDate()?`${dateLabel(dateKey(first))}: Der Salon ist ${reason} geschlossen.`:`${dayName(day)}: Im gew\u00e4hlten Zeitraum ist der Salon an diesem Wochentag nicht ge\u00f6ffnet.`);\n            return;\n          }\n          const {open,close}=openDates[0].hours,start=minute(preference.from),latest=minute(preference.to),openAt=minute(open),closeAt=minute(close),latestPossible=closeAt-duration;\n          if(preference.type===\"exact\"){\n            const end=start+duration;\n            if(start<openAt)warnings.push(`${dayName(day)}: ${preference.from} Uhr liegt vor der \u00d6ffnung um ${open} Uhr.`);\n            else if(end>closeAt)warnings.push(`${dayName(day)}: Bei einem Start um ${preference.from} Uhr endet dein Termin voraussichtlich um ${asTime(end)} Uhr. Ge\u00f6ffnet ist bis ${close} Uhr.`);\n            return;\n          }\n          const feasibleStart=Math.max(start,openAt),feasibleEnd=Math.min(latest,latestPossible);\n          if(feasibleStart>feasibleEnd){\n            warnings.push(`${dayName(day)}: In diesem Startzeitraum l\u00e4sst sich der Termin von ca. ${durationLabel(duration)} nicht vollst\u00e4ndig innerhalb der \u00d6ffnungszeit ${open}\u2013${close} Uhr einplanen.`);\n          }else if(latest>latestPossible){\n            warnings.push(`${dayName(day)}: Bei ca. ${durationLabel(duration)} ist dein sp\u00e4tester Wunschstart ${preference.to} Uhr zu sp\u00e4t. Passend w\u00e4re ein Start bis ${asTime(latestPossible)} Uhr (ge\u00f6ffnet bis ${close} Uhr).`);\n          }\n        });\n      });\n      return {duration,warnings:[...new Set(warnings)].slice(0,8)};\n    }\n    function renderScheduleReview(){\n      const review=scheduleReview();\n      durationNode.textContent=review.duration?`ca. ${durationLabel(review.duration)}`:\"Wird aus deinen Leistungen berechnet\";\n      if(!review.warnings.length){scheduleNotice.hidden=true;scheduleNotice.innerHTML=\"\";return review;}\n      const visible=review.warnings.slice(0,4),more=review.warnings.length-visible.length;\n      scheduleNotice.innerHTML=`<strong>Ein Teil deines Wunsches braucht eine kurze Pr\u00fcfung<\/strong><ul>${visible.map(item => `<li>${escapeText(item)}<\/li>`).join(\"\")}<\/ul>${more?`<p>Weitere ${more} ${more===1?\"Abweichung\":\"Abweichungen\"} pr\u00fcft unser Team ebenfalls. <\/p>`:\"\"}<p>Du kannst deinen Terminwunsch trotzdem senden. Wir pr\u00fcfen pers\u00f6nlich, was m\u00f6glich ist, und melden uns bei dir.<\/p>`;\n      scheduleNotice.hidden=false;\n      return review;\n    }\n    function validateCurrentStep(){\n      if(step === 1){\n        if(!nameInput.value.trim()){showMessage(\"Bitte gib deinen Vor- und Nachnamen an.\");nameInput.focus();return false;}\n        if(phoneInput.value.trim().length < 7){showMessage(\"Bitte gib eine g\u00fcltige Telefonnummer an.\");phoneInput.focus();return false;}\n      }\n      if(step === 2 && !selectedServices().length){showMessage(\"Bitte w\u00e4hle mindestens eine Dienstleistung aus.\");return false;}\n      if(step === 3 && !selectedStylist()){showMessage(\"Bitte w\u00e4hle eine Stylistin oder einen Stylisten aus.\");return false;}\n      if(step === 3 && needsColorStylist() && !selectedColorStylist()){showMessage(\"Bitte w\u00e4hle auch die Person f\u00fcr deine Coloration aus.\");return false;}\n      if(step === 4){\n        if(!dateFrom.value || !dateTo.value){showMessage(\"Bitte gib deinen Wunschzeitraum an.\");return false;}\n        if(dateTo.value < dateFrom.value){showMessage(\"Das Datum \u201eBis\u201c liegt vor dem Startdatum.\");return false;}\n        if(!selectedDays().length){showMessage(\"Bitte w\u00e4hle mindestens einen passenden Wochentag aus.\");return false;}\n        const timeError = validateTimeWindows();\n        if(timeError){showMessage(timeError);return false;}\n      }\n      return true;\n    }\n    function durationLabel(minutes){return minutes < 60 ? `${minutes} Minuten` : minutes % 60 ? `${Math.floor(minutes \/ 60)} Std. ${minutes % 60} Min.` : `${minutes \/ 60} Stunden`;}\n    function availabilityLabel(){\n      return timeWindows().map(window => {\n        const day = isSingleDate() ? \"\" : (window.day === \"all\" ? \"an allen ausgew\u00e4hlten Tagen \u00b7 \" : `${dayLabel(window.day)} \u00b7 `);\n        return window.type === \"exact\" ? `${day}Start um ${window.from} Uhr` : `${day}Start zwischen ${window.from} und ${window.to} Uhr`;\n      }).join(\"<br>\");\n    }\n    function renderSummary(){\n      const stylist = stylists.find(item => item.id === selectedStylist());\n      const colorStylist = stylists.find(item => item.id === selectedColorStylist());\n      const serviceNames = selectedServices().map(id => services.get(id)?.name).filter(Boolean);\n      const review = scheduleReview();\n      const duration = review.duration;\n      const dateRange = dateFrom.value === dateTo.value ? dateLabel(dateFrom.value) : `${dateLabel(dateFrom.value)} bis ${dateLabel(dateTo.value)}`;\n      const stylistAssignment = colorStylist ? `${stylist?.name || \"\u2013\"} (Schnitt) \u00b7 ${colorStylist.name} (Coloration)` : (stylist?.name || \"\u2013\");\n      summary.innerHTML = `<h3>Dein Terminwunsch auf einen Blick<\/h3><dl><dt>Kontakt<\/dt><dd>${escapeText(nameInput.value.trim())} \u00b7 ${escapeText(phoneInput.value.trim())}<\/dd><dt>Stylist<\/dt><dd>${escapeText(stylistAssignment)}<\/dd><dt>Leistung<\/dt><dd>${escapeText(serviceNames.join(\" \u00b7 \"))}${duration ? ` \u00b7 ca. ${durationLabel(duration)}` : \"\"}<\/dd><dt>Zeitraum<\/dt><dd>${escapeText(dateRange)}<\/dd><dt>Startm\u00f6glichkeit<\/dt><dd>${availabilityLabel()}<\/dd>${review.warnings.length?`<dt>Zeitpr\u00fcfung<\/dt><dd style=\"color:#a0372f\">Ein Teil der Wunschzeit liegt au\u00dferhalb der voraussichtlich passenden \u00d6ffnungszeit. Unser Team pr\u00fcft sie pers\u00f6nlich.<\/dd>`:\"\"}<\/dl>`;\n    }\n    function resetForm(){\n      form.reset();\n      dateToChanged = false;\n      dateFrom.value = today();\n      dateTo.value = dateFrom.value;\n      windowsNode.innerHTML = \"\";\n      addTimeWindow();\n      root.querySelectorAll(\"input[name='kevTwDay']\").forEach(input => { input.checked = true; });\n      step = 1;\n      success.hidden = true;\n      form.hidden = false;\n      updateStylistStep();\n      renderScheduleReview();\n      updateStep();\n    }\n    function identifier(){return `web_${Date.now()}_${crypto.randomUUID?.().slice(0,8) || Math.random().toString(36).slice(2,10)}`;}\n\n    addTimeWindow();\n    dateFrom.min = today();\n    dateTo.min = today();\n    dateFrom.value = today();\n    dateTo.value = today();\n    syncSingleDateState();\n    renderOpeningHours();\n\n    hoursToggle.addEventListener(\"click\",() => {const open=hoursPanel.hidden;hoursPanel.hidden=!open;hoursToggle.setAttribute(\"aria-expanded\",String(open));});\n    stylistsNode.addEventListener(\"change\",event => { setSelectedStylistCard(stylistsNode,event.target.value);updateStylistStep(); });\n    colorStylistsNode.addEventListener(\"change\",event => setSelectedStylistCard(colorStylistsNode,event.target.value));\n    servicesNode.addEventListener(\"change\",() => {updateStylistStep();renderScheduleReview();});\n    dateFrom.addEventListener(\"change\",() => { dateTo.min = dateFrom.value; if(!dateToChanged || dateTo.value < dateFrom.value) dateTo.value = dateFrom.value; syncSingleDateState();renderScheduleReview(); });\n    dateTo.addEventListener(\"change\",() => { dateToChanged = true; syncSingleDateState();renderScheduleReview(); });\n    weekdaysNode.addEventListener(\"change\",() => {updateWindowDays();renderScheduleReview();});\n    addWindow.addEventListener(\"click\",() => addTimeWindow());\n    windowsNode.addEventListener(\"change\",event => { const row = event.target.closest(\"[data-time-window]\"); if(!row)return; if(event.target.matches(\"[data-window-type]\")){const exact = event.target.value === \"exact\";row.classList.toggle(\"is-exact\",exact);row.querySelector(\"[data-window-end]\").hidden = exact;row.querySelector(\"[data-window-from-label]\").textContent = exact ? \"Startzeit\" : \"Fr\u00fchester Start\";if(exact)row.querySelector(\"[data-window-to]\").value = row.querySelector(\"[data-window-from]\").value;}else if(event.target.matches(\"[data-window-from]\")&&row.querySelector(\"[data-window-type]\").value===\"exact\"){row.querySelector(\"[data-window-to]\").value=event.target.value;}renderScheduleReview(); });\n    windowsNode.addEventListener(\"click\",event => { const remove = event.target.closest(\".kev-tw-remove-window\");if(!remove)return;const rows = windowsNode.querySelectorAll(\"[data-time-window]\");if(rows.length === 1){showMessage(\"Mindestens eine Uhrzeit wird ben\u00f6tigt.\");return;}remove.closest(\"[data-time-window]\").remove();renderScheduleReview(); });\n    next.addEventListener(\"click\",() => { if(validateCurrentStep()){step += 1;updateStep();} });\n    back.addEventListener(\"click\",() => { step -= 1;updateStep(); });\n    restart.addEventListener(\"click\",resetForm);\n    window.setInterval(renderOpeningHours,60000);\n    form.addEventListener(\"submit\",async event => {\n      event.preventDefault();\n      if(!validateCurrentStep())return;\n      if(honeypot.value){form.hidden = true;success.hidden = false;return;}\n      const windows = timeWindows();\n      const serviceIds = selectedServices();\n      const review = scheduleReview();\n      const entry = {\n        id: identifier(),\n        customer: nameInput.value.trim(),\n        phone: phoneInput.value.trim(),\n        stylist: selectedStylist(),\n        colorStylist: selectedColorStylist(),\n        services: serviceIds,\n        dateFrom: dateFrom.value,\n        dateTo: dateTo.value,\n        timeFrom: asTime(Math.min(...windows.map(window => minute(window.from)))),\n        timeTo: asTime(Math.max(...windows.map(window => minute(window.to)))),\n        timeWindows: windows,\n        timeWindowSemantics: \"start-times\",\n        days: selectedDays(),\n        estimatedDurationMinutes: review.duration,\n        scheduleConflict: review.warnings.length > 0,\n        scheduleWarnings: review.warnings,\n        existingDate: \"\",\n        existingTime: \"\",\n        note: noteInput.value.trim(),\n        status: \"open\",\n        createdAt: Date.now(),\n        submittedAt: serverTimestamp(),\n        source: \"website\"\n      };\n      submit.disabled = true;\n      submit.textContent = \"Wird gesendet \u2026\";\n      try{\n        await set(ref(database,`waitlistEntries\/${entry.id}`),entry);\n        form.hidden = true;\n        success.hidden = false;\n      }catch(error){\n        console.error(\"Terminwunsch konnte nicht gespeichert werden\",error);\n        showMessage(\"Dein Terminwunsch konnte gerade nicht gesendet werden. Bitte versuche es gleich noch einmal oder ruf uns an.\");\n      }finally{\n        submit.disabled = false;\n        submit.textContent = \"Terminwunsch senden\";\n      }\n    });\n  }\n<\/script>\n\n\t\t<\/div>\n\t<\/div>\n<\/div><\/div><\/div><\/div><div class=\"vc_row-full-width vc_clearfix\"><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"Dein Terminwunsch bei Kirstin Ellen Vietze \u00d6ffnungszeiten werden gepr\u00fcft \u2026 Mo nur ungerade Kalenderwochen Sa nur gerade Kalenderwochen 1Kontakt 2Leistung 3Stylist 4Wunschzeit 5Absenden Wie d\u00fcrfen wir dich erreichen? Wir nutzen deine Daten ausschlie\u00dflich, um dich wegen dieses Terminwunsches zu kontaktieren. Vor- und Nachname * Telefonnummer * Bei wem m\u00f6chtest du deinen Termin? W\u00e4hle deine bevorzugte [...]","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"class_list":["post-5556","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Terminwunsch - Kirstin Ellen Vietze<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.kirstin-ellen-vietze.de\/en\/terminwunsch\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terminwunsch - Kirstin Ellen Vietze\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.kirstin-ellen-vietze.de\/en\/terminwunsch\/\" \/>\n<meta property=\"og:site_name\" content=\"Kirstin Ellen Vietze\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kirstinellenvietze\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-05T10:26:48+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/\",\"url\":\"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/\",\"name\":\"Terminwunsch - Kirstin Ellen Vietze\",\"isPartOf\":{\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/#website\"},\"datePublished\":\"2026-09-04T10:26:40+00:00\",\"dateModified\":\"2026-09-05T10:26:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/www.kirstin-ellen-vietze.de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terminwunsch\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/#website\",\"url\":\"https:\/\/www.kirstin-ellen-vietze.de\/\",\"name\":\"Kirstin Ellen Vietze\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.kirstin-ellen-vietze.de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/#organization\",\"name\":\"Kirstin Ellen Vietze\",\"url\":\"https:\/\/www.kirstin-ellen-vietze.de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/04\/logo_dark.png\",\"contentUrl\":\"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/04\/logo_dark.png\",\"width\":149,\"height\":52,\"caption\":\"Kirstin Ellen Vietze\"},\"image\":{\"@id\":\"https:\/\/www.kirstin-ellen-vietze.de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kirstinellenvietze\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Terminwunsch - Kirstin Ellen Vietze","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.kirstin-ellen-vietze.de\/en\/terminwunsch\/","og_locale":"en_US","og_type":"article","og_title":"Terminwunsch - Kirstin Ellen Vietze","og_url":"https:\/\/www.kirstin-ellen-vietze.de\/en\/terminwunsch\/","og_site_name":"Kirstin Ellen Vietze","article_publisher":"https:\/\/www.facebook.com\/kirstinellenvietze\/","article_modified_time":"2026-09-05T10:26:48+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/","url":"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/","name":"Terminwunsch - Kirstin Ellen Vietze","isPartOf":{"@id":"https:\/\/www.kirstin-ellen-vietze.de\/#website"},"datePublished":"2026-09-04T10:26:40+00:00","dateModified":"2026-09-05T10:26:48+00:00","breadcrumb":{"@id":"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.kirstin-ellen-vietze.de\/terminwunsch\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/www.kirstin-ellen-vietze.de\/"},{"@type":"ListItem","position":2,"name":"Terminwunsch"}]},{"@type":"WebSite","@id":"https:\/\/www.kirstin-ellen-vietze.de\/#website","url":"https:\/\/www.kirstin-ellen-vietze.de\/","name":"Kirstin Ellen Vietze","description":"","publisher":{"@id":"https:\/\/www.kirstin-ellen-vietze.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.kirstin-ellen-vietze.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.kirstin-ellen-vietze.de\/#organization","name":"Kirstin Ellen Vietze","url":"https:\/\/www.kirstin-ellen-vietze.de\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.kirstin-ellen-vietze.de\/#\/schema\/logo\/image\/","url":"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/04\/logo_dark.png","contentUrl":"https:\/\/www.kirstin-ellen-vietze.de\/wp-content\/uploads\/2024\/04\/logo_dark.png","width":149,"height":52,"caption":"Kirstin Ellen Vietze"},"image":{"@id":"https:\/\/www.kirstin-ellen-vietze.de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kirstinellenvietze\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.kirstin-ellen-vietze.de\/en\/wp-json\/wp\/v2\/pages\/5556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kirstin-ellen-vietze.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.kirstin-ellen-vietze.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.kirstin-ellen-vietze.de\/en\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kirstin-ellen-vietze.de\/en\/wp-json\/wp\/v2\/comments?post=5556"}],"version-history":[{"count":13,"href":"https:\/\/www.kirstin-ellen-vietze.de\/en\/wp-json\/wp\/v2\/pages\/5556\/revisions"}],"predecessor-version":[{"id":5569,"href":"https:\/\/www.kirstin-ellen-vietze.de\/en\/wp-json\/wp\/v2\/pages\/5556\/revisions\/5569"}],"wp:attachment":[{"href":"https:\/\/www.kirstin-ellen-vietze.de\/en\/wp-json\/wp\/v2\/media?parent=5556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}