<!DOCTYPE html>
<!-- Built on Frappe. https://frappeframework.com/ -->
<html lang="en" dir="ltr">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
	<meta name="generator" content="frappe">

	
	<meta name="description" content="Diese Seite ist nicht verfügbar."><meta name="robots" content="noindex, follow"><meta name="title" content="Behandlung nicht gefunden — GYLIZA"><meta name="language" content="en"><meta property="og:type"  content="article"><meta property="og:title"  content="Behandlung nicht gefunden — GYLIZA"><meta property="og:description"  content="Diese Seite ist nicht verfügbar."><meta name="twitter:title" content="Behandlung nicht gefunden — GYLIZA"><meta name="twitter:description" content="Diese Seite ist nicht verfügbar."><meta name="twitter:card" content="summary">


	<title>Behandlung nicht gefunden — GYLIZA</title>

	
	<link
		rel="shortcut icon"
		href="/assets/erpnext/images/erpnext-favicon.svg"
		type="image/x-icon"
	>
	<!-- GYLIZA item booking duration injection -->
<script>
frappe.ready(function () {
	if (window.__gyliza_booking_item_loaded) return;
	window.__gyliza_booking_item_loaded = true;

	const itemButton = document.querySelector("[data-item-code]");
	if (!itemButton) return;

	const itemCode = itemButton.getAttribute("data-item-code");
	if (!itemCode) return;

	frappe.call({
		method: "gyliza_get_booking_item",
		args: { item_code: itemCode },
		callback: function (r) {
			const item = r.message;
			if (!item || !item.duration) return;

			const target =
				document.querySelector(".product-title") ||
				document.querySelector("h1") ||
				document.querySelector(".page_content");

			if (!target || document.querySelector(".gyliza-booking-box")) return;

			const box = document.createElement("div");
			box.className = "gyliza-booking-box";
			box.style.margin = "1rem 0";
			box.innerHTML = `
				<p style="margin: 0 0 0.75rem; font-weight: 600;">Duration: ${item.duration} min</p>
				<a class="btn btn-primary" href="/book-service?item_code=${encodeURIComponent(item.item_code)}">
					Book Now
				</a>
			`;
			target.insertAdjacentElement("afterend", box);
		}
	});
});
</script>
<!-- /GYLIZA item booking duration injection --><link type="text/css" rel="stylesheet" href="/assets/frappe/dist/css/website.bundle.OYYFSB5K.css">
<link type="text/css" rel="stylesheet" href="/assets/erpnext/dist/css/erpnext-web.bundle.A5WQIEOR.css">
<link type="text/css" rel="stylesheet" href="/assets/webshop/dist/css/webshop-web.bundle.NNT5VTSX.css">
		
	

	<script>
		window.frappe = {};
		window._version_number = "{{ build_version }}";
		frappe.ready_events = [];
		frappe.ready = function(fn) {
			frappe.ready_events.push(fn);
		}
		window.dev_server = 0;
		window.socketio_port = 9000;
		window.show_language_picker = 1;
	</script>
</head>
<body frappe-session-status="logged-out" data-path="sitemap.xml" class="">

		<nav class="navbar navbar-light navbar-expand-lg">
<div class="container">
<a class="navbar-brand" href="/"><span>Home</span></a>
<button aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation" class="navbar-toggler" data-target="#navbarSupportedContent" data-toggle="collapse" type="button">
<span>
<svg class="icon icon-lg">
<use href="#icon-menu"></use>
</svg>
</span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="mr-auto navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/all-products">
		Products
	</a>
</li>
</ul>
<ul class="ml-auto navbar-nav">
<li class="shopping-cart cart-icon hidden">
<a class="nav-link" href="/cart">
<svg class="icon icon-lg">
<use href="#icon-assets"></use>
</svg>
<span class="badge badge-primary shopping-badge" id="cart-count"></span>
</a>
</li>
<li class="wishlist wishlist-icon hidden">
<a class="nav-link" href="/wishlist">
<svg class="icon icon-lg">
<use href="#icon-heart"></use>
</svg>
<span class="badge badge-primary shopping-badge" id="wish-count"></span>
</a>
</li>
<!-- post login tools -->
<li class="nav-item">
<a class="nav-link btn-login-area" href="/login">Login</a>
</li>
</ul>
</div>
<div class="form-group mb-0 hide" id="language-switcher">
<select class="form-control"></select>
</div>
</div>
</nav>










<div id="page--project-name" data-path="sitemap.xml"source-type="Generator" data-doctype="Web Page"source-content-type="HTML">
	
<div class="page-content-wrapper">
	<!-- breadcrumbs -->
	<div class="page-breadcrumbs">
		
    
    
    

	</div>

	
	<main class="">
		<div class="page-header-wrapper">
			<div class="page-header">
				
			</div>

			
		</div>

		<div class="page_content"><div class="webpage-content">
	
	<article class="web-page-content" id="-project-name" style="text-align: Left">
	<script>(()=>{const BLOCK=/\/assets\/(frappe|erpnext|webshop)\/dist\/|\/website_script\.js/;const killCSS=l=>{try{l.media='print'}catch(e){}try{l.disabled=!0}catch(e){}try{l.rel='preload';l.as='style'}catch(e){}l.remove()};const k=()=>{document.querySelectorAll('link[rel="stylesheet"],link[rel="preload"]').forEach(l=>{const h=l.href||l.getAttribute('href')||'';if(BLOCK.test(h))killCSS(l)});document.querySelectorAll('script[src]').forEach(s=>{const v=s.src||s.getAttribute('src')||'';if(BLOCK.test(v))s.remove()});document.querySelectorAll('nav.navbar,.web-footer,.page-footer,.page-breadcrumbs,.page-header-wrapper').forEach(e=>e.remove())};const origCE=document.createElement.bind(document);document.createElement=function(t,...r){const el=origCE(t,...r);const tag=String(t||'').toLowerCase();if(tag==='script'||tag==='link'){const prop=tag==='script'?'src':'href';try{const d=Object.getOwnPropertyDescriptor(tag==='script'?HTMLScriptElement.prototype:HTMLLinkElement.prototype,prop);Object.defineProperty(el,prop,{configurable:!0,get(){return d.get.call(this)},set(v){if(typeof v==='string'&&BLOCK.test(v))return;d.set.call(this,v)}})}catch(e){}}return el};k();document.addEventListener("DOMContentLoaded",k);new MutationObserver(k).observe(document.documentElement,{childList:!0,subtree:!0})})();</script>
<script>(()=>{const fix=b=>{if(b&&b.tagName==="BUTTON"&&!b.hasAttribute("type"))b.setAttribute("type","button")};const sweep=()=>document.querySelectorAll("button:not([type])").forEach(fix);sweep();document.addEventListener("DOMContentLoaded",sweep);document.addEventListener("click",e=>fix(e.target&&e.target.closest&&e.target.closest("button")),!0);})();</script>
<link rel="preconnect" href="https://cdn.tailwindcss.com" crossorigin/><link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>
<link rel="preload" as="image" href="/files/gyliza_logo.svg" fetchpriority="high"/>
<script src="https://cdn.tailwindcss.com?plugins=forms,typography,aspect-ratio"></script>
<link rel="preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" media="print" onload="this.media='all';this.onload=null"/><noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" crossorigin="anonymous" referrerpolicy="no-referrer"/></noscript>
<link href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&family=Playfair+Display:wght@400;500;600&display=swap" rel="stylesheet" media="print" onload="this.media='all';this.onload=null"/><noscript><link href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400;700&family=Playfair+Display:wght@400;500;600&display=swap" rel="stylesheet"/></noscript>
<script>
tailwind.config = { theme: { extend: {
  screens: { 'xs': { 'max': '380px' } },
  colors: { sage: { 500:"#9FACA1",300:"#BBC6BD",100:"#D6DED7" }, olive: { 900:"#252418",800:"#333324" }, beige: { 300:"#D8CBBC" }, paper: { 50:"#F1EEEC" }, copper: { 500:"#AA8B73",600:"#8B6F58",700:"#6F5743" } },
  fontFamily: { sans: ["Lato","sans-serif"], serif: ['"Playfair Display"',"serif"] },
  keyframes: { gylRise: { '0%':{opacity:'0',transform:'translateY(18px)'},'100%':{opacity:'1',transform:'translateY(0)'} } },
  animation: { 'gyl-rise': 'gylRise .7s cubic-bezier(.22,.61,.36,1) both' }
} } };
</script>
<style type="text/tailwindcss">
@layer base {
  .navbar, .top-bar, .website-navbar, .web-header, .web-footer, .page-footer, .page-breadcrumbs { @apply !hidden; }
  [x-cloak] { @apply !hidden; }
  html, body { @apply max-w-[100vw] !h-auto !min-h-[100vh] !overflow-x-clip !overflow-y-auto; }
  body { @apply !m-0 !bg-[#d6dbd4] !pt-0 font-sans text-olive-900 selection:bg-olive-900 selection:text-paper-50; }
  .web-page-wrapper, .page-container, .main-section { @apply !static !h-auto !min-h-[100vh] !overflow-x-hidden; }
  * { -webkit-tap-highlight-color: transparent; }
  :root { --safe-top: env(safe-area-inset-top, 0px); --safe-bottom: env(safe-area-inset-bottom, 0px); }
}
</style>
<style>
.gyl-bg { background: radial-gradient(circle at 14% 16%, rgba(255,255,255,.72) 0, transparent 38%), radial-gradient(circle at 86% 24%, rgba(241,238,236,.58) 0, transparent 44%), radial-gradient(circle at 32% 90%, rgba(216,203,188,.24) 0, transparent 52%), linear-gradient(180deg,#d8ddd7 0%,#cfd5ce 58%,#c8d0c9 100%); }
.gyl-noise { background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); }
@keyframes gylZoom { 0% { transform: scale(1); } 100% { transform: scale(1.08); } }
.gyl-hero-img { animation: gylZoom 18s ease-in-out infinite alternate; will-change: transform; }
.gyl-prose p { margin-bottom: .6rem; } .gyl-prose ul { list-style: disc; padding-left: 1.25rem; } .gyl-prose li { margin-bottom: .2rem; }
@media (prefers-reduced-motion: reduce) { .gyl-hero-img { animation: none !important; } [class*="animate-"] { animation: none !important; } }
.gyl-xscroll { scrollbar-width: thin; } .gyl-xscroll::-webkit-scrollbar { height: 6px; } .gyl-xscroll::-webkit-scrollbar-thumb { border-radius: 9999px; background: rgba(37,36,24,.25); }
</style>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.13.10/dist/cdn.min.js"></script>









<div x-data="serviceDetail()" class="relative min-h-[100dvh] font-sans text-olive-900">
  <div class="pointer-events-none fixed inset-0 -z-[2] gyl-bg"></div>
  <div class="pointer-events-none fixed inset-0 -z-10 gyl-noise opacity-[.04] mix-blend-overlay"></div>

  <!-- fixed top header (app shell) -->
  <header class="fixed inset-x-0 top-0 z-40 w-full border-b border-white/40 px-4 pb-3 pt-[calc(0.9rem+var(--safe-top))] shadow-[0_4px_20px_-18px_rgba(37,36,24,0.3)] backdrop-blur-[16px]">
    <div class="mx-auto flex w-full max-w-[30rem] items-center justify-between gap-2">
      <a href="/mobile" aria-label="GYLIZA" class="inline-flex h-[42px] max-w-full items-center rounded-full border border-white/55 bg-white/45 px-4 shadow-[0_10px_30px_-5px_rgba(0,0,0,0.12)] backdrop-blur-xl"><img src="/files/gyliza_logo.svg" alt="GYLIZA Premium Beauty & Spa" width="140" height="32" decoding="async" fetchpriority="high" class="block h-[30px] w-auto max-w-[8.5rem] invert mix-blend-multiply xs:max-w-[6.8rem]" /></a>
      <div class="flex shrink-0 items-center gap-1.5">
        <div class="relative">
          <button @click="auth.loggedIn ? (acctOpen = !acctOpen) : openAuthModal('login')" aria-label="Konto" class="flex h-[42px] w-[42px] items-center justify-center rounded-full border border-white/55 bg-white/45 text-olive-900 shadow-[0_10px_30px_-5px_rgba(0,0,0,0.12)] backdrop-blur-xl transition active:scale-95">
            <i x-show="!auth.loggedIn" class="fa-regular fa-user text-lg" aria-hidden="true"></i>
            <span x-show="auth.loggedIn" x-cloak class="font-serif text-[15px] font-bold leading-none" x-text="profileInitial()"></span>
          </button>
          <div x-show="acctOpen" x-cloak x-transition @click.outside="acctOpen=false" class="absolute right-0 top-[50px] z-50 w-48 rounded-2xl border border-white/60 bg-white/95 p-2 shadow-xl backdrop-blur-xl">
            <p class="truncate px-3 pb-1.5 pt-1 text-[12px] font-bold text-olive-900" x-text="(auth.user && (auth.user.full_name || auth.user.email)) || 'Mein Konto'"></p>
            <a href="/mobile?tab=orders" class="block rounded-xl px-3 py-2 text-[12px] font-bold text-olive-900/80 transition hover:bg-olive-900/5">Meine Bestellungen</a>
            <button @click="logout()" class="block w-full rounded-xl px-3 py-2 text-left text-[12px] font-bold text-red-600 transition hover:bg-red-50">Abmelden</button>
          </div>
        </div>
        <a href="/mobile" aria-label="Zurück zur Übersicht" class="flex h-[42px] w-[42px] items-center justify-center rounded-full border border-white/55 bg-white/45 text-olive-900 shadow-[0_10px_30px_-5px_rgba(0,0,0,0.12)] backdrop-blur-xl transition active:scale-95"><i class="fa-solid fa-arrow-left text-lg" aria-hidden="true"></i></a>
      </div>
    </div>
  </header>

  <main class="mx-auto w-full max-w-[30rem] px-4 pb-[calc(6.5rem+var(--safe-bottom))] pt-[6.25rem]">
    <div class="bg-white/40 border border-white/50 shadow-[0_4px_20px_-5px_rgba(0,0,0,0.08),inset_0_0_0_1px_rgba(255,255,255,0.2)] backdrop-blur-[16px] mt-6 rounded-[2rem] p-8 text-center">
      <div class="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-white/60 text-copper-700 shadow-sm"><i class="fa-regular fa-face-frown text-3xl" aria-hidden="true"></i></div>
      <h1 class="font-serif text-2xl text-olive-900">Behandlung nicht gefunden</h1>
      <p class="mt-2 text-[13px] leading-relaxed text-olive-900/60">Diese Seite ist nicht (mehr) verfügbar. Entdecke alle Behandlungen in unserem Studio.</p>
      <a href="/mobile" class="mt-5 inline-flex w-full items-center justify-center gap-2 rounded-full bg-olive-900 px-5 py-3.5 text-[12px] font-bold uppercase tracking-[0.18em] text-paper-50 shadow-md transition active:scale-95"><i class="fa-solid fa-arrow-left" aria-hidden="true"></i> Zur Übersicht</a>
    </div><p class="mt-6 text-center text-[10px] font-bold uppercase tracking-[0.16em] text-olive-900/45">© <span id="gylyr"></span> Gyliza Beauty · <a href="https://www.risessolutions.com" target="_blank" rel="noopener noreferrer" class="transition hover:text-copper-700">risessolutions.com</a></p>
    <script>(function(){var e=document.getElementById('gylyr');if(e)e.textContent=new Date().getFullYear();})();</script>
  </main>

  <!-- fixed bottom nav -->
  <div class="fixed left-0 right-0 z-50 w-full px-4 bottom-[calc(.45rem+var(--safe-bottom))]">
    <div class="mx-auto flex max-w-[26rem] items-end justify-between gap-[0.2rem] rounded-full border border-white/70 bg-paper-50/80 p-[0.55rem] shadow-[0_14px_42px_-14px_rgba(37,36,24,0.18),inset_0_1px_0_rgba(255,255,255,0.68)] backdrop-blur-[22px]">
      <a href="/mobile" class="relative flex min-w-[3.55rem] flex-col items-center justify-center gap-[0.32rem] rounded-full px-[0.28rem] pb-[0.48rem] pt-[0.55rem] transition-all duration-200 active:scale-[0.97] [&_span]:font-bold [&_span]:uppercase [&_span]:leading-none [&_span]:tracking-[0.13em] text-olive-900/65"><i class="fa-solid fa-house text-lg" aria-hidden="true"></i><span class="text-[6.5px]">Start</span></a>
      <a href="/mobile?tab=shop" class="relative flex min-w-[3.55rem] flex-col items-center justify-center gap-[0.32rem] rounded-full px-[0.28rem] pb-[0.48rem] pt-[0.55rem] transition-all duration-200 active:scale-[0.97] [&_span]:font-bold [&_span]:uppercase [&_span]:leading-none [&_span]:tracking-[0.13em] text-olive-900/65"><i class="fa-solid fa-bag-shopping text-lg" aria-hidden="true"></i><span class="text-[6.5px]">Shop</span></a>
      <a href="#booking" class="relative flex min-w-[3.55rem] flex-col items-center justify-center gap-[0.32rem] rounded-full px-[0.28rem] pb-[0.48rem] pt-[0.55rem] transition-all duration-200 active:scale-[0.97] [&_span]:font-bold [&_span]:uppercase [&_span]:leading-none [&_span]:tracking-[0.13em] bg-white/40 text-black/80 border border-white/50 shadow-[0_10px_30px_-5px_rgba(0,0,0,0.12)] backdrop-blur-xl -translate-y-px [&_i]:scale-[1.04] [&_i]:-translate-y-px"><i class="fa-regular fa-calendar-check text-lg" aria-hidden="true"></i><span class="text-[6.5px]">Buchen</span></a>
      <a href="/mobile?tab=orders" class="relative flex min-w-[3.55rem] flex-col items-center justify-center gap-[0.32rem] rounded-full px-[0.28rem] pb-[0.48rem] pt-[0.55rem] transition-all duration-200 active:scale-[0.97] [&_span]:font-bold [&_span]:uppercase [&_span]:leading-none [&_span]:tracking-[0.13em] text-olive-900/65"><i class="fa-solid fa-receipt text-lg" aria-hidden="true"></i><span class="text-[6.5px]">Bestellungen</span></a>
      <a href="/mobile?tab=more" class="relative flex min-w-[3.55rem] flex-col items-center justify-center gap-[0.32rem] rounded-full px-[0.28rem] pb-[0.48rem] pt-[0.55rem] transition-all duration-200 active:scale-[0.97] [&_span]:font-bold [&_span]:uppercase [&_span]:leading-none [&_span]:tracking-[0.13em] text-olive-900/65"><i class="fa-solid fa-bars text-lg" aria-hidden="true"></i><span class="text-[6.5px]">Mehr</span></a>
    </div>
  </div>

  <!-- login / register bottom sheet -->
  <div x-show="authModal.open" x-cloak class="fixed inset-0 z-[80] flex flex-col justify-end">
    <div class="absolute inset-0 bg-olive-900/40 backdrop-blur-sm" @click="closeAuthModal()"></div>
    <div class="relative mx-auto w-full max-w-[30rem] rounded-t-[2rem] bg-white/95 p-6 pb-[calc(2rem+var(--safe-bottom))] shadow-2xl backdrop-blur-2xl" x-transition:enter="transition ease-out duration-300" x-transition:enter-start="translate-y-full" x-transition:enter-end="translate-y-0" x-transition:leave="transition ease-in duration-200" x-transition:leave-start="translate-y-0" x-transition:leave-end="translate-y-full">
      <div class="mx-auto mb-5 h-1.5 w-12 rounded-full bg-olive-900/20"></div>
      <div class="flex items-start justify-between gap-4">
        <div><p class="text-[9px] font-bold uppercase tracking-[0.22em] text-copper-700" x-text="authModal.mode==='login' ? 'Willkommen zurück' : 'Neu hier'"></p><h2 class="mt-1 font-serif text-2xl text-olive-900" x-text="authModal.mode==='login' ? 'Anmelden' : 'Konto erstellen'"></h2></div>
        <button @click="closeAuthModal()" aria-label="Schließen" class="flex h-8 w-8 items-center justify-center rounded-full bg-olive-900/5 text-olive-900 transition active:scale-90"><i class="fa-solid fa-xmark" aria-hidden="true"></i></button>
      </div>
      <form @submit.prevent="submitAuth()" class="mt-5 space-y-3">
        <label x-show="authModal.mode==='signup'" x-cloak class="block"><span class="mb-1.5 block text-[11px] font-bold uppercase tracking-wider text-olive-900/65">Vollständiger Name</span><input type="text" x-model="authModal.fullName" autocomplete="name" class="w-full text-sm rounded-[1.25rem] border border-olive-900/10 bg-white focus:bg-white/90 focus:ring-2 focus:ring-copper-500 text-olive-900 px-4 py-3.5 outline-none shadow-sm transition" placeholder="Vor- und Nachname" /></label>
        <label class="block"><span class="mb-1.5 block text-[11px] font-bold uppercase tracking-wider text-olive-900/65">E-Mail</span><input type="email" x-model="authModal.email" autocomplete="email" class="w-full text-sm rounded-[1.25rem] border border-olive-900/10 bg-white focus:bg-white/90 focus:ring-2 focus:ring-copper-500 text-olive-900 px-4 py-3.5 outline-none shadow-sm transition" placeholder="name@beispiel.de" /></label>
        <label x-show="authModal.mode==='login'" class="block"><span class="mb-1.5 block text-[11px] font-bold uppercase tracking-wider text-olive-900/65">Passwort</span><input type="password" x-model="authModal.password" autocomplete="current-password" class="w-full text-sm rounded-[1.25rem] border border-olive-900/10 bg-white focus:bg-white/90 focus:ring-2 focus:ring-copper-500 text-olive-900 px-4 py-3.5 outline-none shadow-sm transition" placeholder="••••••••" /></label>
        <button type="submit" :disabled="authModal.loading" class="w-full rounded-full bg-olive-900 px-5 py-4 text-[12px] font-bold uppercase tracking-[0.18em] text-paper-50 shadow-md transition active:scale-95 disabled:opacity-50"><span x-text="authModal.loading ? 'Bitte warten…' : (authModal.mode==='login' ? 'Anmelden' : 'Registrieren')"></span></button>
      </form>
      <button @click="authModal.mode = authModal.mode==='login' ? 'signup' : 'login'" class="mt-4 w-full text-center text-[12px] font-bold text-olive-900/70 underline decoration-copper-500/30 underline-offset-4"><span x-text="authModal.mode==='login' ? 'Kein Konto? Jetzt registrieren' : 'Bereits ein Konto? Anmelden'"></span></button>
    </div>
  </div>

  <!-- toast -->
  <div x-show="notice" x-cloak x-transition.opacity role="status" aria-live="polite" class="fixed left-1/2 top-[calc(4.5rem+var(--safe-top))] z-[90] -translate-x-1/2 rounded-full bg-olive-900 px-5 py-3 text-[13px] font-bold text-paper-50 shadow-xl" x-text="notice"></div>
</div>

<script>
function serviceDetail() {
  return {
    serviceName: "",
    route: "",
    duration: 0,
    price: 0,
    holidays: [],
    hoursArr: [], dates: [],
    bookingDate: '', bookingTime: '',
    slots: [], slotsLoading: false, slotsClosed: false, slotReq: 0,
    form: { name: '', email: '', phone: '' },
    submitting: false, booked: false, confirmation: { label: '' },
    notice: '', noticeTimeout: null,
    auth: { loading: true, loggedIn: false, user: null },
    authModal: { open: false, mode: 'login', loading: false, email: '', password: '', fullName: '' },
    acctOpen: false, editContact: false,

    openingHours: () => [],

    init() { this.hoursArr = this.openingHours(); this.dates = this.buildDates(); this.syncAuthState(); },

    isHoliday(iso) { return this.holidays.indexOf(iso) !== -1; },
    showNotice(msg) { this.notice = msg; clearTimeout(this.noticeTimeout); this.noticeTimeout = setTimeout(() => this.notice = '', 4500); },
    vibrate(p) { try { navigator.vibrate?.(p); } catch (e) {} },
    scrollToBooking() { const el = document.getElementById('booking'); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); this.vibrate(20); },
    bookingStep() { if (!this.bookingDate) return 1; if (!this.bookingTime) return 2; return 3; },

    todayOpeningSummary() {
      if (!this.hoursArr.length) return '';
      const now = new Date();
      const iso = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0') + '-' + String(now.getDate()).padStart(2, '0');
      const t = this.hoursArr[(now.getDay() + 6) % 7];
      if (!t || t.closed || this.isHoliday(iso)) return 'Heute geschlossen';
      const m = String(t.hours).match(/(\d{1,2}):(\d{2})\D+(\d{1,2}):(\d{2})/);
      if (!m) return 'Heute geöffnet · ' + t.hours + ' Uhr';
      const cur = now.getHours() * 60 + now.getMinutes();
      const open = (+m[1]) * 60 + (+m[2]), close = (+m[3]) * 60 + (+m[4]);
      if (cur < open) return 'Öffnet heute um ' + m[1].padStart(2, '0') + ':' + m[2] + ' Uhr';
      if (cur >= close) return 'Heute geschlossen';
      return 'Heute geöffnet · ' + t.hours + ' Uhr';
    },

    buildDates() {
      const out = [];
      const dowFmt = new Intl.DateTimeFormat('de-DE', { weekday: 'short' });
      const monFmt = new Intl.DateTimeFormat('de-DE', { month: 'short' });
      const longFmt = new Intl.DateTimeFormat('de-DE', { weekday: 'long', day: 'numeric', month: 'long' });
      for (let i = 0; i <= 20; i++) {
        const d = new Date(); d.setHours(12, 0, 0, 0); d.setDate(d.getDate() + i);
        const iso = d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');
        const row = this.hoursArr[(d.getDay() + 6) % 7];
        const closed = !!(row && row.closed) || this.isHoliday(iso);
        out.push({ iso, label: i === 0 ? 'Heute' : (i === 1 ? 'Morgen' : dowFmt.format(d)), day: String(d.getDate()), month: monFmt.format(d), closed, aria: longFmt.format(d) + (closed ? ' (geschlossen)' : '') });
      }
      return out;
    },

    async api(method, args = {}) {
      const body = new URLSearchParams(Object.entries(args).filter(([, v]) => v != null && v !== ''));
      const res = await fetch('/api/method/' + method, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Frappe-CSRF-Token': (window.frappe && window.frappe.csrf_token) || '' }, body });
      const raw = await res.text();
      let data = null; try { data = JSON.parse(raw); } catch (e) {}
      if (!res.ok || (data && data.exc)) {
        let msg = '';
        try { if (data && data._server_messages) msg = JSON.parse(data._server_messages).map(m => JSON.parse(m).message).join(', '); } catch (e) {}
        throw new Error(msg || 'API_ERROR');
      }
      return data ? data.message : null;
    },

    deMsg(m) {
      const s = String(m || '');
      const map = { 'Sunday is closed': 'Sonntags geschlossen.', 'Booking cannot start before 10:00': 'Buchung erst ab 10:00 Uhr möglich.', 'Booking cannot end after 20:00': 'Die Behandlung muss bis 20:00 Uhr enden.', 'Item not found': 'Behandlung nicht gefunden.', 'This item has no valid Duration': 'Diese Behandlung ist nicht online buchbar.', 'Missing required booking data': 'Bitte fülle alle Pflichtfelder aus.', 'Invalid login': 'E-Mail oder Passwort ist falsch.', 'Incorrect password': 'E-Mail oder Passwort ist falsch.', 'User disabled': 'Dieses Konto ist deaktiviert.' };
      for (const k in map) if (s.indexOf(k) !== -1) return map[k];
      if (/failed to fetch|networkerror|load failed|api_error/i.test(s)) return 'Verbindungsfehler. Bitte versuche es erneut.';
      return s || 'Es ist ein Fehler aufgetreten.';
    },

    // ---- auth ----
    profileInitial() { const u = this.auth.user; return String((u && (u.full_name || u.first_name || u.email || u.name)) || 'K').trim().charAt(0).toUpperCase(); },
    openAuthModal(mode) { this.authModal = { open: true, mode: mode || 'login', loading: false, email: this.form.email || '', password: '', fullName: this.form.name || '' }; this.acctOpen = false; },
    closeAuthModal() { this.authModal.open = false; },
    markLoggedOut() { this.auth = { loading: false, loggedIn: false, user: null }; },
    prefillFromUser() {
      const u = this.auth.user; if (!u) return;
      const em = (u.email && String(u.email).indexOf('@') !== -1) ? u.email : ((u.name && String(u.name).indexOf('@') !== -1) ? u.name : '');
      let nm = (u.full_name || '').trim();
      if (!nm && (u.first_name || u.last_name)) nm = ((u.first_name || '') + ' ' + (u.last_name || '')).trim();
      if (nm && nm !== em && !this.form.name) this.form.name = nm;
      if (em && !this.form.email) this.form.email = em;
      if ((u.mobile_no || u.phone) && !this.form.phone) this.form.phone = u.mobile_no || u.phone;
    },
    async syncAuthState() {
      this.auth.loading = true;
      const c = (document.cookie.match(/(?:^|;\s*)user_id=([^;]+)/) || [])[1];
      const cu = c ? decodeURIComponent(c) : '';
      if (!cu || cu === 'Guest') { this.markLoggedOut(); return; }
      try {
        const who = await this.api('frappe.auth.get_logged_user');
        if (!who || who === 'Guest') { this.markLoggedOut(); return; }
        this.auth = { loading: false, loggedIn: true, user: { name: who, email: who } };
        this.prefillFromUser();
        await this.loadProfile(who);
      } catch (e) { this.markLoggedOut(); }
    },
    async loadProfile(name) {
      try { const d = await this.api('frappe.client.get', { doctype: 'User', name }); if (d) { this.auth.user = d; this.auth.loggedIn = true; this.prefillFromUser(); } }
      catch (e) {} finally { this.auth.loading = false; }
    },
    async submitAuth() {
      const a = this.authModal;
      if (!a.email || (a.mode === 'login' && !a.password) || (a.mode === 'signup' && !a.fullName)) { this.showNotice('Bitte fülle alle Pflichtfelder aus.'); return; }
      a.loading = true;
      try {
        if (a.mode === 'login') {
          await this.api('login', { usr: a.email.trim(), pwd: a.password });
          this.closeAuthModal(); await this.syncAuthState(); this.showNotice('Willkommen zurück!');
        } else {
          await this.api('frappe.core.doctype.user.user.sign_up', { email: a.email.trim(), full_name: a.fullName.trim(), redirect_to: window.location.href });
          a.mode = 'login'; a.password = ''; this.showNotice('Konto erstellt – bitte anmelden.');
        }
      } catch (e) { this.showNotice(this.deMsg(e.message)); }
      finally { a.loading = false; }
    },
    async logout() { try { await this.api('logout'); } catch (e) {} this.markLoggedOut(); this.acctOpen = false; this.showNotice('Abgemeldet.'); },

    // ---- booking ----
    selectDate(d) { if (d.closed || this.bookingDate === d.iso) return; this.bookingDate = d.iso; this.bookingTime = ''; this.slots = []; this.slotsClosed = false; this.vibrate(20); this.loadSlots(); },
    selectTime(s) { if (!s.available) return; this.bookingTime = s.time; this.vibrate(20); },
    get availableCount() { return (this.slots || []).filter(s => s && s.available).length; },
    async loadSlots() {
      if (!this.bookingDate) return;
      const date = this.bookingDate, token = ++this.slotReq;
      this.slotsLoading = true;
      try {
        const res = await this.api('gyliza_get_available_slots', { date, duration: this.duration || 30 });
        if (token !== this.slotReq || date !== this.bookingDate) return;
        this.slots = (res && res.slots) || []; this.slotsClosed = !!(res && res.closed);
      } catch (e) { if (token !== this.slotReq) return; this.slots = []; this.slotsClosed = false; this.showNotice(this.deMsg(e.message)); }
      finally { if (token === this.slotReq) this.slotsLoading = false; }
    },
    validEmail(v) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(v || '').trim()); },
    canBook() { return !!(this.bookingDate && this.bookingTime && this.form.name.trim() && this.validEmail(this.form.email)); },
    ctaLabel() { return this.bookingTime ? ('Termin anfragen · ' + this.fmtSelection()) : 'Termin anfragen'; },
    fmtSelection() {
      if (!this.bookingDate || !this.bookingTime) return '';
      const d = new Date(this.bookingDate + 'T' + this.bookingTime + ':00');
      return new Intl.DateTimeFormat('de-DE', { weekday: 'short', day: '2-digit', month: 'short' }).format(d) + ' · ' + this.bookingTime + ' Uhr';
    },
    async submitBooking() {
      if (!this.canBook() || this.submitting) return;
      this.submitting = true;
      try {
        await this.api('gyliza_create_booking', { route: this.route, booking_start_datetime: this.bookingDate + ' ' + this.bookingTime + ':00', customer_name: this.form.name.trim(), customer_email: this.form.email.trim(), customer_phone: this.form.phone.trim() });
        this.confirmation = { label: this.fmtSelection() }; this.booked = true; this.vibrate([30, 40, 30]);
        window.scrollTo({ top: 0, behavior: 'smooth' });
      } catch (e) { this.showNotice(this.deMsg(e.message)); }
      finally { this.submitting = false; }
    },
    resetBooking() { this.booked = false; this.bookingDate = ''; this.bookingTime = ''; this.slots = []; this.slotsClosed = false; this.form = { name: '', email: '', phone: '' }; this.prefillFromUser(); this.$nextTick(() => { const el = document.getElementById('booking'); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); }); }
  };
}
</script>
	</article>
	
</div></div>

		<div class="page-footer"></div>
	</main>
	
</div>

</div>


<footer class="web-footer">
<div class="container">
<div class="footer-logo-extension">
<div class="row">
<div class="text-left col-md-6"><div>
<img alt="Footer Logo" class="footer-logo" src="/files/logo12.png"/>
</div></div>
<div class="text-right col-md-6">
</div>
</div>
</div>
<div class="footer-links">
<div class="row">
<div class="footer-col-left col-sm-6"></div>
<div class="footer-col-right col-sm-6"></div>
</div>
</div>
<div class="footer-info">
<div class="row">
<div class="footer-col-left col-sm-6 col-12">
			
			© GYLIZA
			
			
		</div>
<div class="footer-col-right col-sm-6 col-12 footer-powered">
			GYLIZA
		</div>
</div>
</div>
</div>
</footer><div id="all-symbols" style="display:none"></div><script type="text/javascript">fetch(`/assets/frappe/icons/lucide/icons.svg?v=${window._version_number}`, {credentials: "same-origin"}).then((r) => r.text()).then((svg) => {let c = document.getElementById("all-symbols"); c.insertAdjacentHTML("beforeend", svg);});</script><script type="text/javascript">fetch(`/assets/frappe/icons/timeless/icons.svg?v=${window._version_number}`, {credentials: "same-origin"}).then((r) => r.text()).then((svg) => {let c = document.getElementById("all-symbols"); c.insertAdjacentHTML("beforeend", svg);});</script><script type="text/javascript">fetch(`/assets/frappe/icons/espresso/icons.svg?v=${window._version_number}`, {credentials: "same-origin"}).then((r) => r.text()).then((svg) => {let c = document.getElementById("all-symbols"); c.insertAdjacentHTML("beforeend", svg);});</script><script type="text/javascript">fetch(`/assets/erpnext/icons/pos-icons.svg?v=${window._version_number}`, {credentials: "same-origin"}).then((r) => r.text()).then((svg) => {let c = document.getElementById("all-symbols"); c.insertAdjacentHTML("beforeend", svg);});</script>
	<!-- js should be loaded in body! -->
	<script>
		frappe.boot = {"lang":"en","apps_data":{"apps":[],"is_desk_apps":1,"default_path":""},"sysdefaults":{"float_precision":3,"date_format":"dd.mm.yyyy","time_format":"HH:mm","first_day_of_the_week":"Sunday","number_format":"#.###,##","currency":"EUR"},"time_zone":{"system":"Europe/Berlin","user":"Europe/Berlin"},"assets_json":{"billing.bundle.js":"/assets/frappe/dist/js/billing.bundle.XJXMQXLI.js","bootstrap-4-web.bundle.js":"/assets/frappe/dist/js/bootstrap-4-web.bundle.OGQ7JEDG.js","calendar.bundle.js":"/assets/frappe/dist/js/calendar.bundle.4A4YITIU.js","controls.bundle.js":"/assets/frappe/dist/js/controls.bundle.LZU2JDXR.js","data_import_tools.bundle.js":"/assets/frappe/dist/js/data_import_tools.bundle.V4VQPX7R.js","desk.bundle.js":"/assets/frappe/dist/js/desk.bundle.AEH5OW4V.js","dialog.bundle.js":"/assets/frappe/dist/js/dialog.bundle.UG7TYIHA.js","form.bundle.js":"/assets/frappe/dist/js/form.bundle.LQXQTS2O.js","frappe-web.bundle.js":"/assets/frappe/dist/js/frappe-web.bundle.CQ6TQUZV.js","libs.bundle.js":"/assets/frappe/dist/js/libs.bundle.JEM3HUCP.js","list.bundle.js":"/assets/frappe/dist/js/list.bundle.2KV6LCIC.js","logtypes.bundle.js":"/assets/frappe/dist/js/logtypes.bundle.WKQH7KBM.js","onboarding_tours.bundle.js":"/assets/frappe/dist/js/onboarding_tours.bundle.RAUR6X4Z.js","photoswipe.bundle.js":"/assets/frappe/dist/js/photoswipe.bundle.YSXZQA64.js","report.bundle.js":"/assets/frappe/dist/js/report.bundle.G6IX464W.js","sentry.bundle.js":"/assets/frappe/dist/js/sentry.bundle.AX44GVWW.js","syntax_highlighting.bundle.js":"/assets/frappe/dist/js/syntax_highlighting.bundle.YHGNRCUE.js","telemetry.bundle.js":"/assets/frappe/dist/js/telemetry.bundle.3ICFTNWB.js","video_player.bundle.js":"/assets/frappe/dist/js/video_player.bundle.DUYYLSFO.js","web_form.bundle.js":"/assets/frappe/dist/js/web_form.bundle.6CHUSVBI.js","form_builder.bundle.js":"/assets/frappe/dist/js/form_builder.bundle.TJDI53IC.js","print_format_builder.bundle.js":"/assets/frappe/dist/js/print_format_builder.bundle.EY2DZ4XK.js","workflow_builder.bundle.js":"/assets/frappe/dist/js/workflow_builder.bundle.O2QPXUEI.js","build_events.bundle.js":"/assets/frappe/dist/js/build_events.bundle.BCX32TWL.js","file_uploader.bundle.js":"/assets/frappe/dist/js/file_uploader.bundle.N7O4VGGR.js","user_onboarding.bundle.js":"/assets/frappe/dist/js/user_onboarding.bundle.RGMWXG2C.js","kanban_board.bundle.js":"/assets/frappe/dist/js/kanban_board.bundle.WBHS2NSO.js","desk.bundle.css":"/assets/frappe/dist/css/desk.bundle.QT2SEZSD.css","email.bundle.css":"/assets/frappe/dist/css/email.bundle.YBNP2CTK.css","login.bundle.css":"/assets/frappe/dist/css/login.bundle.J2OFSM4O.css","print.bundle.css":"/assets/frappe/dist/css/print.bundle.CJHQYT3M.css","print_format.bundle.css":"/assets/frappe/dist/css/print_format.bundle.LPKQ73KY.css","report.bundle.css":"/assets/frappe/dist/css/report.bundle.JN7NQZZ2.css","web_form.bundle.css":"/assets/frappe/dist/css/web_form.bundle.R7W4N56G.css","website.bundle.css":"/assets/frappe/dist/css/website.bundle.OYYFSB5K.css","bank-reconciliation-tool.bundle.js":"/assets/erpnext/dist/js/bank-reconciliation-tool.bundle.3OD5XE4B.js","erpnext.bundle.js":"/assets/erpnext/dist/js/erpnext.bundle.4LXW4GEH.js","item-dashboard.bundle.js":"/assets/erpnext/dist/js/item-dashboard.bundle.7LUKZCYJ.js","point-of-sale.bundle.js":"/assets/erpnext/dist/js/point-of-sale.bundle.OX5FLGUM.js","bom_configurator.bundle.js":"/assets/erpnext/dist/js/bom_configurator.bundle.5GOR6CXI.js","erpnext-web.bundle.css":"/assets/erpnext/dist/css/erpnext-web.bundle.A5WQIEOR.css","erpnext.bundle.css":"/assets/erpnext/dist/css/erpnext.bundle.QWP7JQZ5.css","erpnext_email.bundle.css":"/assets/erpnext/dist/css/erpnext_email.bundle.3A2QDOF4.css","hierarchy-chart.bundle.js":"/assets/hrms/dist/js/hierarchy-chart.bundle.5E224PCR.js","hrms.bundle.js":"/assets/hrms/dist/js/hrms.bundle.QS2GRVNQ.js","interview.bundle.js":"/assets/hrms/dist/js/interview.bundle.C7CDEMYA.js","performance.bundle.js":"/assets/hrms/dist/js/performance.bundle.63UL5NS7.js","hrms.bundle.css":"/assets/hrms/dist/css/hrms.bundle.F5MK2K33.css","education.bundle.js":"/assets/education/dist/js/education.bundle.PSPI3YNS.js","web.bundle.js":"/assets/webshop/dist/js/web.bundle.WLOGYSZO.js","webshop-web.bundle.css":"/assets/webshop/dist/css/webshop-web.bundle.NNT5VTSX.css","ff_integration.bundle.js":"/assets/drive/dist/js/ff_integration.bundle.I432YRHI.js","raven.bundle.js":"/assets/raven/dist/js/raven.bundle.GI3OGDMP.js","raven_chat.bundle.jsx":"/assets/raven/dist/raven_chat.bundle.FGXUOTBN.js","raven.bundle.css":"/assets/raven/dist/css/raven.bundle.Y3GJZNGR.css","healthcare.bundle.js":"/assets/healthcare/dist/js/healthcare.bundle.RUIYC4KU.js","risess_ai.bundle.js":"/assets/risess_ai/dist/js/risess_ai.bundle.MIR7RBJX.js","rtl_desk.bundle.css":"/assets/frappe/dist/css-rtl/desk.bundle.GP2RC4JL.css","rtl_email.bundle.css":"/assets/frappe/dist/css-rtl/email.bundle.3MMDJJLA.css","rtl_login.bundle.css":"/assets/frappe/dist/css-rtl/login.bundle.GFJCR5FD.css","rtl_print.bundle.css":"/assets/frappe/dist/css-rtl/print.bundle.32UO5GUX.css","rtl_print_format.bundle.css":"/assets/frappe/dist/css-rtl/print_format.bundle.MY5B67NO.css","rtl_report.bundle.css":"/assets/frappe/dist/css-rtl/report.bundle.4LW3T6J4.css","rtl_web_form.bundle.css":"/assets/frappe/dist/css-rtl/web_form.bundle.BICFDIUZ.css","rtl_website.bundle.css":"/assets/frappe/dist/css-rtl/website.bundle.FKY4OPCQ.css","rtl_erpnext-web.bundle.css":"/assets/erpnext/dist/css-rtl/erpnext-web.bundle.SQPK3CS3.css","rtl_erpnext.bundle.css":"/assets/erpnext/dist/css-rtl/erpnext.bundle.W7OPT2WV.css","rtl_erpnext_email.bundle.css":"/assets/erpnext/dist/css-rtl/erpnext_email.bundle.OZN7P3B4.css","rtl_hrms.bundle.css":"/assets/hrms/dist/css-rtl/hrms.bundle.X3JXR3VK.css","rtl_webshop-web.bundle.css":"/assets/webshop/dist/css-rtl/webshop-web.bundle.CVK7ITHO.css","rtl_raven.bundle.css":"/assets/raven/dist/css-rtl/raven.bundle.XAMTD4SQ.css"},"sitename":"gyliza-beauty.apps.risessolutions.com","is_fc_site":0}
		// for backward compatibility of some libs
		frappe.sys_defaults = frappe.boot.sysdefaults;
	</script>
	<script type="text/javascript" src="/assets/frappe/dist/js/frappe-web.bundle.CQ6TQUZV.js"></script>
	
	<script type="text/javascript" src="/website_script.js"></script>
	<script type="text/javascript" src="/assets/webshop/dist/js/web.bundle.WLOGYSZO.js"></script>
	<script>frappe.csrf_token = "None";</script></body>
</html>