@@ -0,0 +1,434 @@
<!DOCTYPE html>
< html lang = "de" >
< head >
< meta charset = "UTF-8" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" / >
< title > Happy Nails Nürnberg — Nagelstudio | Termin online buchen< / title >
< meta name = "description" content = "Maniküre, Gel- & Shellac-Nägel und individuelles Nageldesign in Nürnberg. Jetzt bequem online einen Termin buchen." / >
< link rel = "preconnect" href = "https://fonts.googleapis.com" / >
< link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin / >
< link href = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Playfair+Display:wght@500;600;700&display=swap" rel = "stylesheet" / >
< style >
: root {
--bg : #fdf6f4 ;
--bg-2 : #f8e9e5 ;
--card : #ffffff ;
--ink : #3b2a2e ;
--muted : #9a8589 ;
--gold : #c77f93 ;
--gold-2 : #e0a7b6 ;
--line : #f1e1de ;
--radius : 16 px ;
--shadow : 0 18 px 50 px rgba ( 180 , 120 , 130 , .18 ) ;
}
* { box-sizing : border-box ; margin : 0 ; padding : 0 ; }
html { scroll-behavior : smooth ; }
body {
font-family : 'Inter' , system-ui , - apple-system , Segoe UI , Roboto , sans-serif ;
background : var ( - - bg ) ; color : var ( - - ink ) ;
line-height : 1.65 ; -webkit- font-smoothing : antialiased ;
}
h1 , h2 , h3 , . display { font-family : 'Playfair Display' , Georgia , serif ; letter-spacing : .2 px ; line-height : 1.1 ; }
a { color : inherit ; text-decoration : none ; }
. wrap { width : min ( 1120 px , 92 vw ) ; margin-inline : auto ; }
section { padding : 92 px 0 ; }
. eyebrow { color : var ( - - gold ) ; font-weight : 600 ; letter-spacing : 3 px ; text-transform : uppercase ; font-size : .72 rem ; }
/* demo ribbon */
. demo-bar {
background : repeating-linear-gradient ( 45 deg , #f6ddd6 , #f6ddd6 12 px , #f9e7e2 12 px , #f9e7e2 24 px ) ;
color : #a05468 ; font-size : .76 rem ; letter-spacing : 1.5 px ; text-transform : uppercase ;
text-align : center ; padding : 7 px 12 px ; border-bottom : 1 px solid var ( - - line ) ;
}
/* nav */
header . nav { position : sticky ; top : 0 ; z-index : 50 ; background : rgba ( 253 , 246 , 244 , .85 ) ; backdrop-filter : blur ( 10 px ) ; border-bottom : 1 px solid var ( - - line ) ; }
. nav-inner { display : flex ; align-items : center ; justify-content : space-between ; height : 68 px ; }
. brand { font-family : 'Playfair Display' , serif ; font-size : 1.55 rem ; font-weight : 700 ; letter-spacing : .5 px ; }
. brand span { color : var ( - - gold ) ; }
nav ul { display : flex ; gap : 30 px ; list-style : none ; align-items : center ; }
nav a { color : var ( - - muted ) ; font-size : .92 rem ; font-weight : 500 ; transition : color .2 s ; }
nav a : hover { color : var ( - - ink ) ; }
. btn {
display : inline-block ; background : linear-gradient ( 180 deg , var ( - - gold -2 ) , var ( - - gold ) ) ;
color : #fff ; font-weight : 700 ; padding : 12 px 22 px ; border-radius : 999 px ;
border : 0 ; cursor : pointer ; font-size : .95 rem ; transition : transform .15 s , box-shadow .2 s ;
box-shadow : 0 8 px 22 px rgba ( 199 , 127 , 147 , .32 ) ;
}
. btn : hover { transform : translateY ( -2 px ) ; box-shadow : 0 12 px 28 px rgba ( 199 , 127 , 147 , .45 ) ; }
. btn . ghost { background : transparent ; color : var ( - - ink ) ; border : 1 px solid var ( - - line ) ; box-shadow : none ; }
. nav-toggle { display : none ; background : none ; border : 0 ; color : var ( - - ink ) ; font-size : 1.6 rem ; cursor : pointer ; }
/* hero */
. hero { position : relative ; background :
linear-gradient ( rgba ( 253 , 246 , 244 , .40 ) , rgba ( 253 , 246 , 244 , .78 ) ) ,
url ( "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40'%3E%3Crect width='40' height='40' fill='%23fbeae5'/%3E%3Ccircle cx='20' cy='20' r='1.4' fill='%23f0cdc5'/%3E%3C/svg%3E" ) ;
border-bottom : 1 px solid var ( - - line ) ; }
. hero-inner { padding : 96 px 0 104 px ; max-width : 720 px ; }
. hero h1 { font-size : clamp ( 2.6 rem , 7 vw , 4.6 rem ) ; margin : 14 px 0 6 px ; }
. hero h1 em { color : var ( - - gold ) ; font-style : italic ; }
. hero p { color : var ( - - muted ) ; font-size : 1.18 rem ; max-width : 540 px ; margin : 18 px 0 30 px ; }
. hero-cta { display : flex ; gap : 14 px ; flex-wrap : wrap ; }
. hero-meta { margin-top : 34 px ; display : flex ; gap : 28 px ; flex-wrap : wrap ; color : var ( - - muted ) ; font-size : .9 rem ; }
. hero-meta b { color : var ( - - ink ) ; }
/* services */
. sec-head { max-width : 620 px ; margin-bottom : 46 px ; }
. sec-head h2 { font-size : clamp ( 2.2 rem , 5 vw , 3.2 rem ) ; margin-top : 8 px ; }
. sec-head p { color : var ( - - muted ) ; margin-top : 10 px ; }
. grid { display : grid ; gap : 18 px ; }
. services { grid-template-columns : repeat ( auto - fit , minmax ( 240 px , 1 fr ) ) ; }
. svc { background : var ( - - card ) ; border : 1 px solid var ( - - line ) ; border-radius : var ( - - radius ) ; padding : 26 px ; transition : transform .18 s , border-color .2 s ; box-shadow : 0 6 px 18 px rgba ( 180 , 120 , 130 , .06 ) ; }
. svc : hover { transform : translateY ( -4 px ) ; border-color : var ( - - gold ) ; }
. svc . ic { font-size : 1.8 rem ; }
. svc h3 { font-size : 1.45 rem ; margin : 14 px 0 6 px ; }
. svc p { color : var ( - - muted ) ; font-size : .92 rem ; min-height : 42 px ; }
. svc . price { color : var ( - - gold ) ; font-weight : 700 ; font-size : 1.05 rem ; margin-top : 12 px ; font-family : 'Inter' ; }
/* booking */
. booking { background : var ( - - bg -2 ) ; border-top : 1 px solid var ( - - line ) ; border-bottom : 1 px solid var ( - - line ) ; }
. booking-grid { display : grid ; grid-template-columns : 1.05 fr 1 fr ; gap : 40 px ; align-items : center ; }
. booking-card { background : var ( - - card ) ; border : 1 px solid var ( - - line ) ; border-radius : var ( - - radius ) ; padding : 26 px ; box-shadow : var ( - - shadow ) ; }
. gcal-head { display : flex ; align-items : center ; gap : 10 px ; color : var ( - - muted ) ; font-size : .82 rem ; border-bottom : 1 px solid var ( - - line ) ; padding-bottom : 14 px ; margin-bottom : 18 px ; }
. gcal-dot { flex : 0 0 auto ; width : 9 px ; height : 9 px ; border-radius : 50 % ; background : #4caf7d ; box-shadow : 0 0 0 3 px rgba ( 76 , 175 , 125 , .18 ) ; margin-right : 12 px ; }
. slots { display : grid ; grid-template-columns : repeat ( 3 , 1 fr ) ; gap : 10 px ; }
. slot { text-align : center ; padding : 11 px 6 px ; border : 1 px solid var ( - - line ) ; border-radius : 9 px ; color : var ( - - ink ) ; font-size : .9 rem ; cursor : pointer ; transition : .15 s ; background : #fdf3f1 ; }
. slot : hover { border-color : var ( - - gold ) ; color : var ( - - gold ) ; }
. slot . off { opacity : .4 ; text-decoration : line-through ; cursor : not-allowed ; }
. booking ul . points { list-style : none ; display : grid ; gap : 14 px ; margin : 22 px 0 28 px ; }
. booking ul . points li { padding-left : 30 px ; position : relative ; color : var ( - - muted ) ; }
. booking ul . points li :: before { content : "✓" ; position : absolute ; left : 0 ; color : var ( - - gold ) ; font-weight : 700 ; }
. booking-embed { background : var ( - - card ) ; border : 1 px solid var ( - - line ) ; border-radius : var ( - - radius ) ; padding : 8 px ; box-shadow : var ( - - shadow ) ; }
/* Fixed height so the embedded booking wizard fits without its own scrollbar.
The wizard's brand colour + compact layout are handled server-side (EA). */
. booking-embed iframe { width : 100 % ; height : 760 px ; min-height : 0 ; border : 0 ; border-radius : 10 px ; display : block ; background : #fff ; }
@ media ( max-width : 800px ) { . booking-embed iframe { height : 1180 px ; } }
/* hours / about */
. split { display : grid ; grid-template-columns : 1 fr 1 fr ; gap : 40 px ; align-items : start ; }
. hours { width : 100 % ; border-collapse : collapse ; }
. hours td { padding : 12 px 0 ; border-bottom : 1 px solid var ( - - line ) ; color : var ( - - muted ) ; }
. hours td : last-child { text-align : right ; color : var ( - - ink ) ; font-weight : 500 ; }
/* contact */
. contact { background : var ( - - bg -2 ) ; border-top : 1 px solid var ( - - line ) ; }
form . lead { background : var ( - - card ) ; border : 1 px solid var ( - - line ) ; border-radius : var ( - - radius ) ; padding : 28 px ; max-width : 560 px ; box-shadow : var ( - - shadow ) ; }
. field { margin-bottom : 16 px ; }
. field label { display : block ; font-size : .85 rem ; color : var ( - - muted ) ; margin-bottom : 6 px ; }
. field input , . field textarea , . field select {
width : 100 % ; background : #fdf3f1 ; border : 1 px solid var ( - - line ) ; border-radius : 9 px ;
color : var ( - - ink ) ; padding : 12 px 14 px ; font : inherit ; font-size : .95 rem ;
}
. field input : focus , . field textarea : focus , . field select : focus { outline : 2 px solid var ( - - gold ) ; border-color : var ( - - gold ) ; }
. form-note { font-size : .78 rem ; color : var ( - - muted ) ; margin-top : 10 px ; }
. toast { display : none ; margin-top : 14 px ; padding : 12 px 14 px ; border-radius : 9 px ; background : #eef9ef ; border : 1 px solid #cdeccf ; color : #3b7a44 ; font-size : .9 rem ; }
/* footer */
footer { padding : 54 px 0 40 px ; border-top : 1 px solid var ( - - line ) ; color : var ( - - muted ) ; font-size : .9 rem ; }
. foot-grid { display : flex ; justify-content : space-between ; flex-wrap : wrap ; gap : 24 px ; }
footer . brand { color : var ( - - ink ) ; }
@ media ( max-width : 820px ) {
nav ul { display : none ; }
. nav-toggle { display : block ; }
nav . open ul { display : flex ; position : absolute ; inset : 68 px 0 auto 0 ; flex-direction : column ; background : var ( - - bg -2 ) ; padding : 18 px 6 vw ; gap : 18 px ; border-bottom : 1 px solid var ( - - line ) ; }
. booking-grid , . split { grid-template-columns : 1 fr ; }
section { padding : 64 px 0 ; }
}
< / style >
< / head >
< body >
< header class = "nav" >
< div class = "wrap nav-inner" >
< a href = "#top" class = "brand" > HAPPY< span > NAILS< / span > < / a >
< nav id = "nav" >
< ul >
< li > < a href = "#leistungen" > Leistungen< / a > < / li >
< li > < a href = "#buchen" > Termin buchen< / a > < / li >
< li > < a href = "#zeiten" > Öffnungszeiten< / a > < / li >
< li > < a href = "#kontakt" > Kontakt< / a > < / li >
< li > < a href = "#buchen" class = "btn" > Termin buchen< / a > < / li >
< / ul >
< / nav >
< button class = "nav-toggle" aria-label = "Menü" onclick = "document.getElementById('nav').classList.toggle('open')" > ☰< / button >
< / div >
< / header >
< main id = "top" >
<!-- HERO -->
< section class = "hero" id = "hero" >
< div class = "wrap hero-inner" >
< span class = "eyebrow" > Nagelstudio · Nürnberg< / span >
< h1 > Schöne Nägel.< br > < em > Zum Wohlfühlen.< / em > < / h1 >
< p > Maniküre, Gel- & Shellac-Nägel und individuelles Nageldesign — mit Liebe und ruhiger Hand gemacht. Sichern Sie sich Ihren Termin in 30 Sekunden online.< / p >
< div class = "hero-cta" >
< a href = "#buchen" class = "btn" > Termin online buchen< / a >
<!-- Telefonnummer aus dem öffentlichen Instagram - Profil — bitte vor dem Versand prüfen. -->
< a href = "tel:+4917667426558" class = "btn ghost" > ☎ 0176 6742 6558< / a >
< / div >
< div class = "hero-meta" >
< span > ⭐ < b > 4,9< / b > · Top bewertet< / span >
< span > 💅 Liebe zum Detail< / span >
< span > 📍 Mitten in Nürnberg< / span >
< / div >
< / div >
< / section >
<!-- SERVICES -->
< section id = "leistungen" >
< div class = "wrap" >
< div class = "sec-head" >
< span class = "eyebrow" > Leistungen< / span >
< h2 > Was wir für Sie tun< / h2 >
< p > Faire Preise, gepflegte Atmosphäre — und ein Ergebnis, das man gerne herzeigt.< / p >
< / div >
< div class = "grid services" >
< article class = "svc" > < div class = "ic" > 💅< / div > < h3 > Maniküre< / h3 > < p > Pflege, Form und Lack für gepflegte, natürliche Hände.< / p > < div class = "price" > ab 25 €< / div > < / article >
< article class = "svc" > < div class = "ic" > ✨< / div > < h3 > Gel- & Shellac-Nägel< / h3 > < p > Langanhaltend, glänzend und in Ihrer Wunschfarbe.< / p > < div class = "price" > ab 45 €< / div > < / article >
< article class = "svc" > < div class = "ic" > 🦶< / div > < h3 > Pediküre< / h3 > < p > Wohltuende Fußpflege — entspannt und gründlich.< / p > < div class = "price" > ab 35 €< / div > < / article >
< article class = "svc" > < div class = "ic" > 🎨< / div > < h3 > Nageldesign & Nail Art< / h3 > < p > Individuelle Designs, French, Steinchen, Muster — ganz nach Wunsch.< / p > < div class = "price" > ab 5 € / Nagel< / div > < / article >
< / div >
< / div >
< / section >
<!-- BOOKING -->
< section class = "booking" id = "buchen" >
< div class = "wrap" >
< div class = "sec-head" style = "margin-bottom:28px;" >
< span class = "eyebrow" > Termin buchen< / span >
< h2 > Wählen Sie Ihren Termin.< / h2 >
< p > Buchen Sie direkt hier rund um die Uhr — sofortige Bestätigung, automatische Erinnerung am Vortag, kein Hin und Her per DM.< / p >
< / div >
<!-- Online - Terminbuchung: eingebettete Self - hosted - Buchung (Easy!Appointments). -->
< div class = "booking-embed" >
< iframe id = "booking-frame" src = "https://booking.mivanchenko.de/index.php/booking?provider=4"
title = "Online-Terminbuchung" loading = "lazy" > < / iframe >
< / div >
<!-- Buchungs - iframe an seinen Inhalt anpassen (kein Scrollbalken). -->
< script >
( function ( ) {
var frame = document . getElementById ( 'booking-frame' ) ;
window . addEventListener ( 'message' , function ( e ) {
if ( e . origin !== 'https://booking.mivanchenko.de' ) return ;
var h = e . data && e . data . eaBookingHeight ;
if ( frame && typeof h === 'number' && h > 200 ) {
frame . style . height = h + 'px' ;
}
} ) ;
} ) ( ) ;
< / script >
< / div >
< / section >
<!-- HOURS / ABOUT -->
< section id = "zeiten" >
< div class = "wrap split" >
< div >
< span class = "eyebrow" > Über uns< / span >
< h2 style = "font-size:clamp(2rem,4.5vw,2.8rem);margin:8px 0 14px;" > Ihr Wohlfühl-Moment in Nürnberg.< / h2 >
< p style = "color:var(--muted)" > Bei Happy Nails nehmen wir uns Zeit für Sie. In ruhiger, gepflegter Atmosphäre kümmern wir uns um Ihre Hände und Füße — sorgfältig, hygienisch und mit einem Auge fürs Detail. Kommen Sie vorbei und gönnen Sie sich eine kleine Auszeit.< / p >
< / div >
< div >
< span class = "eyebrow" > Öffnungszeiten< / span >
<!-- Platzhalter - Zeiten — in der Live - Version durch die echten Zeiten ersetzen. -->
< table class = "hours" style = "margin-top:14px;" >
< tr > < td > Dienstag – Freitag< / td > < td > 09:30 – 19:00< / td > < / tr >
< tr > < td > Samstag< / td > < td > 09:00 – 16:00< / td > < / tr >
< tr > < td > Sonntag & Montag< / td > < td > geschlossen< / td > < / tr >
< / table >
< p class = "form-note" style = "margin-top:16px;" > 📍 Nürnberg · genaue Adresse in der Live-Version< / p >
< / div >
< / div >
< / section >
<!-- CONTACT / LEAD FORM -->
< section class = "contact" id = "kontakt" >
< div class = "wrap" >
< div class = "sec-head" >
< span class = "eyebrow" > Kontakt< / span >
< h2 > Frage stellen oder Rückruf anfordern< / h2 >
< p > Schreiben Sie uns kurz — wir melden uns am selben Tag.< / p >
< / div >
<!-- Demo: dieses Formular postet an einen n8n - Webhook - > CRM (Leads) + Telegram. -->
< form class = "lead" onsubmit = "return submitLead(event, this)" >
< input type = "hidden" name = "client_id" value = "C-0002" / >
< input type = "hidden" name = "source" value = "happynails-site" / >
< div class = "field" > < label for = "a-name" > Name< / label > < input id = "a-name" name = "name" type = "text" placeholder = "Ihr Name" required / > < / div >
< div class = "field" > < label for = "a-contact" > E-Mail oder Telefon< / label > < input id = "a-contact" name = "contact" type = "text" placeholder = "name@example.de" required / > < / div >
< div class = "field" > < label for = "a-svc" > Gewünschte Leistung< / label >
< select id = "a-svc" name = "service" > < option > Maniküre< / option > < option > Gel- & Shellac-Nägel< / option > < option > Pediküre< / option > < option > Nageldesign & Nail Art< / option > < option > Auffüllen / Refill< / option > < option > Sonstiges< / option > < / select >
< / div >
< div class = "field" > < label for = "a-msg" > Nachricht (optional)< / label > < textarea id = "a-msg" name = "message" rows = "3" placeholder = "Wunschtermin, Frage, …" > < / textarea > < / div >
< button class = "btn" type = "submit" > Anfrage senden< / button >
< div class = "toast" > ✓ Danke! Ihre Anfrage ist eingegangen — wir melden uns.< / div >
< p class = "form-note" > Mit dem Absenden stimmen Sie der Verarbeitung Ihrer Angaben zur Kontaktaufnahme zu.< / p >
< / form >
< / div >
< / section >
< / main >
< footer >
< div class = "wrap foot-grid" >
< div >
< div class = "brand" > HAPPY< span style = "color:var(--gold)" > NAILS< / span > < / div >
< p style = "margin-top:8px;" > Nagelstudio · Nürnberg< / p >
< / div >
< div >
< p > < b style = "color:var(--ink)" > Öffnungszeiten< / b > < / p >
< p > Di– Fr 09:30– 19 · Sa 09– 16< / p >
< / div >
< div >
< p > < b style = "color:var(--ink)" > Kontakt< / b > < / p >
< p > 0176 6742 6558 · @happynailsnuernberg< / p >
< / div >
< / div >
< div class = "wrap" style = "margin-top:30px;opacity:.6;font-size:.8rem;" > © 2026 Happy Nails Nürnberg · Impressum · Datenschutz< / div >
< / footer >
< script >
// Lead-Formular -> n8n Webhook -> CRM (Leads) + Telegram-Benachrichtigung.
const LEAD _WEBHOOK = 'https://n8n.mivanchenko.de/webhook/lead-intake' ;
async function submitLead ( e , form ) {
e . preventDefault ( ) ;
const btn = form . querySelector ( 'button[type=submit]' ) ;
const toast = form . querySelector ( '.toast' ) ;
const data = Object . fromEntries ( new FormData ( form ) . entries ( ) ) ;
const old = btn . textContent ;
btn . disabled = true ; btn . textContent = 'Senden…' ;
try {
const r = await fetch ( LEAD _WEBHOOK , {
method : 'POST' ,
headers : { 'Content-Type' : 'application/json' } ,
body : JSON . stringify ( data ) ,
} ) ;
if ( ! r . ok ) throw new Error ( r . status ) ;
toast . textContent = '✓ Danke! Ihre Anfrage ist eingegangen — wir melden uns.' ;
toast . style . display = 'block' ;
form . reset ( ) ;
} catch ( err ) {
toast . textContent = '⚠ Senden fehlgeschlagen — bitte erneut versuchen oder direkt anrufen.' ;
toast . style . display = 'block' ;
} finally {
btn . disabled = false ; btn . textContent = old ;
}
return false ;
}
< / script >
< script >
// Keep the demo booking header on today's date so the example never looks stale.
( function ( ) {
const M = [ 'Januar' , 'Februar' , 'März' , 'April' , 'Mai' , 'Juni' , 'Juli' , 'August' , 'September' , 'Oktober' , 'November' , 'Dezember' ] ;
const t = new Date ( ) ;
const el = document . getElementById ( 'bookDate' ) ;
if ( el ) el . textContent = 'heute, ' + t . getDate ( ) + '. ' + M [ t . getMonth ( ) ] ;
} ) ( ) ;
< / script >
< script > window . CB _CTX = { client _id : "C-0002" , source : "happynails-site-callback" } ; < / script >
<!-- ===== Rückruf - Widget (lead capture popup) ===== -->
< style >
. cb-fab { position : fixed ; right : 18 px ; bottom : 18 px ; z-index : 900 ; background : var ( - - gold ) ; color : #fff ; border : 0 ; border-radius : 999 px ; padding : 13 px 20 px ; font : 600 .95 rem system-ui , - apple-system , Segoe UI , Roboto , sans-serif ; box-shadow : 0 10 px 26 px rgba ( 199 , 127 , 147 , .32 ) ; cursor : pointer ; transition : transform .15 s , background .2 s ; }
. cb-fab : hover { transform : translateY ( -2 px ) ; background : #b56a80 ; }
. cb-overlay { position : fixed ; inset : 0 ; z-index : 1000 ; background : rgba ( 60 , 30 , 40 , .45 ) ; backdrop-filter : blur ( 3 px ) ; display : none ; align-items : center ; justify-content : center ; padding : 18 px ; }
. cb-overlay . open { display : flex ; }
. cb-modal { position : relative ; width : min ( 440 px , 100 % ) ; background : #fff ; color : #3b2a2e ; border-radius : 16 px ; box-shadow : 0 24 px 60 px rgba ( 0 , 0 , 0 , .30 ) ; padding : 28 px 26 px 22 px ; font-family : system-ui , - apple-system , Segoe UI , Roboto , sans-serif ; max-height : 92 vh ; overflow : auto ; animation : cbIn .18 s ease ; }
@ keyframes cbIn { from { opacity : 0 ; transform : translateY ( 14 px ) ; } to { opacity : 1 ; transform : none ; } }
. cb-modal h3 { margin : 0 0 4 px ; font-size : 1.35 rem ; }
. cb-sub { margin : 0 0 18 px ; color : #9a8589 ; font-size : .9 rem ; }
. cb-x { position : absolute ; top : 10 px ; right : 13 px ; background : none ; border : 0 ; font-size : 1.7 rem ; line-height : 1 ; color : #c9b3b7 ; cursor : pointer ; }
. cb-x : hover { color : #3b2a2e ; }
. cb-modal label { display : block ; font-size : .82 rem ; font-weight : 600 ; margin-bottom : 13 px ; }
. cb-modal label . o { color : #b6a3a7 ; font-weight : 400 ; }
. cb-modal input , . cb-modal textarea { width : 100 % ; margin-top : 5 px ; font : inherit ; font-size : .94 rem ; color : #3b2a2e ; background : #fdf3f1 ; border : 1 px solid #f1e1de ; border-radius : 9 px ; padding : 10 px 12 px ; resize : vertical ; }
. cb-modal input : focus , . cb-modal textarea : focus { outline : none ; border-color : var ( - - gold ) ; background : #fff ; }
. cb-submit { width : 100 % ; margin-top : 4 px ; background : var ( - - gold ) ; color : #fff ; border : 0 ; border-radius : 999 px ; padding : 13 px ; font : 600 1 rem system-ui ; cursor : pointer ; transition : background .2 s ; }
. cb-submit : hover { background : #b56a80 ; }
. cb-submit : disabled { opacity : .6 ; cursor : default ; }
. cb-toast { display : none ; margin-top : 14 px ; padding : 11 px 13 px ; border-radius : 9 px ; font-size : .88 rem ; font-weight : 500 ; }
. cb-toast . ok { background : #eef9ef ; color : #3b7a44 ; border : 1 px solid #cdeccf ; }
. cb-toast . err { background : #fdecec ; color : #9b2226 ; border : 1 px solid #f3c7c7 ; }
. cb-open { margin-left : 10 px ; background : rgba ( 160 , 84 , 104 , .10 ) ; color : inherit ; border : 1 px solid rgba ( 160 , 84 , 104 , .30 ) ; border-radius : 999 px ; padding : 3 px 13 px ; font : 600 .74 rem system-ui ; cursor : pointer ; letter-spacing : .4 px ; vertical-align : middle ; }
. cb-open : hover { background : rgba ( 160 , 84 , 104 , .20 ) ; }
@ media ( max-width : 560px ) { . cb-fab { right : 12 px ; bottom : 12 px ; padding : 11 px 17 px ; } }
< / style >
< button class = "cb-fab" type = "button" onclick = "cbOpen()" aria-label = "Rückruf anfordern" > 📞 Rückruf< / button >
< div class = "cb-overlay" id = "cbOverlay" onclick = "cbBg(event)" >
< div class = "cb-modal" role = "dialog" aria-modal = "true" aria-labelledby = "cbTitle" >
< button class = "cb-x" type = "button" onclick = "cbClose()" aria-label = "Schließen" > × < / button >
< h3 id = "cbTitle" > Rückruf anfordern< / h3 >
< p class = "cb-sub" > Name & Nummer genügen — wir melden uns bei Ihnen. Alles andere ist optional.< / p >
< form onsubmit = "return cbSubmit(event, this)" >
< input type = "hidden" name = "client_id" / >
< input type = "hidden" name = "source" / >
< label > Name *
< input name = "name" required autocomplete = "name" placeholder = "Vor- und Nachname" / >
< / label >
< label > Telefon *
< input name = "phone" required autocomplete = "tel" inputmode = "tel" placeholder = "+49 …" / >
< / label >
< label > Gewünschte Leistung < span class = "o" > (optional)< / span >
< input name = "service" placeholder = "Maniküre, Gelnägel, Pediküre …" / >
< / label >
< label > Nachricht < span class = "o" > (optional)< / span >
< textarea name = "message" rows = "2" placeholder = "Worum geht es?" > < / textarea >
< / label >
< button class = "cb-submit" type = "submit" > Rückruf anfordern< / button >
< div class = "cb-toast" id = "cbToast" > < / div >
< / form >
< / div >
< / div >
< script >
const CB _WEBHOOK = 'https://n8n.mivanchenko.de/webhook/lead-intake' ;
const cbCtx = window . CB _CTX || { client _id : 'PREVIEW' , source : 'callback' } ;
function cbOpen ( ) {
const o = document . getElementById ( 'cbOverlay' ) ;
o . querySelector ( '[name=client_id]' ) . value = cbCtx . client _id ;
o . querySelector ( '[name=source]' ) . value = cbCtx . source ;
o . classList . add ( 'open' ) ;
document . body . style . overflow = 'hidden' ;
setTimeout ( ( ) => o . querySelector ( '[name=name]' ) . focus ( ) , 60 ) ;
}
function cbClose ( ) {
document . getElementById ( 'cbOverlay' ) . classList . remove ( 'open' ) ;
document . body . style . overflow = '' ;
}
function cbBg ( e ) { if ( e . target . id === 'cbOverlay' ) cbClose ( ) ; }
document . addEventListener ( 'keydown' , e => { if ( e . key === 'Escape' ) cbClose ( ) ; } ) ;
async function cbSubmit ( e , form ) {
e . preventDefault ( ) ;
const btn = form . querySelector ( '.cb-submit' ) ;
const toast = document . getElementById ( 'cbToast' ) ;
const d = Object . fromEntries ( new FormData ( form ) . entries ( ) ) ;
let msg = ( d . message || '' ) . trim ( ) ;
const payload = {
client _id : d . client _id , source : d . source ,
name : d . name , phone : d . phone ,
service _interest : d . service || '' , message : msg
} ;
const old = btn . textContent ;
btn . disabled = true ; btn . textContent = 'Senden…' ;
toast . style . display = 'none' ;
try {
const r = await fetch ( CB _WEBHOOK , { method : 'POST' , headers : { 'Content-Type' : 'application/json' } , body : JSON . stringify ( payload ) } ) ;
if ( ! r . ok ) throw new Error ( r . status ) ;
toast . className = 'cb-toast ok' ;
toast . textContent = '✓ Danke! Wir rufen Sie zurück.' ;
toast . style . display = 'block' ;
form . reset ( ) ;
setTimeout ( cbClose , 2200 ) ;
} catch ( err ) {
toast . className = 'cb-toast err' ;
toast . textContent = '⚠ Senden fehlgeschlagen. Bitte erneut versuchen.' ;
toast . style . display = 'block' ;
} finally {
btn . disabled = false ; btn . textContent = old ;
}
return false ;
}
< / script >
<!-- ===== /Rückruf - Widget ===== -->
< / body >
< / html >