0%

ML. MASSAGE

document.addEventListener("DOMContentLoaded", function () {
    const startTime = Date.now(); // Record page script start time for preloader minimum display

    // =================================================================
    // SECTION: Preloader Setup & Logic
    // =================================================================
    const preloader = document.querySelector('.preloader-container');
    const preloaderCounter = document.querySelector('.preloader-counter');
    const vimeoDesktopIframe = document.getElementById('vimeo-desktop'); // Use your desktop ID
    const vimeoMobileIframe = document.getElementById('vimeo-mobile');   // Use your mobile ID
    const minimumDisplayTime = 1500; // Minimum preloader time in milliseconds (e.g., 1.5 seconds)

    let preloaderCount = 0;
    let pageLoadComplete = false;
    let videoReady = false;
    let preloaderHidden = false;
    let preloaderCounterInterval;
    let preloaderFailsafeTimeout;

    // --- Preloader Element Checks ---
    if (!preloader || !preloaderCounter) {
        console.warn('Preloader elements (.preloader-container or .preloader-counter) not found! Cannot initialize preloader.');
        // Attempt to hide preloader container if it exists but counter doesn't, to prevent blocking page
        if(preloader) {
            preloader.style.opacity = '0';
            preloader.style.visibility = 'hidden';
            preloader.style.display = 'none';
        }
        return; // Stop execution of preloader logic if elements are missing
    }

    // --- Determine visible Vimeo iframe ---
    let visibleVimeoIframe = null;
    if (vimeoDesktopIframe && vimeoDesktopIframe.offsetParent !== null) {
        // offsetParent is null if display:none (or parent is display:none)
        visibleVimeoIframe = vimeoDesktopIframe;
        console.log("Preloader: Detected visible video - Desktop");
    } else if (vimeoMobileIframe && vimeoMobileIframe.offsetParent !== null) {
        visibleVimeoIframe = vimeoMobileIframe;
        console.log("Preloader: Detected visible video - Mobile");
    } else {
        console.log("Preloader: No visible Vimeo background iframe detected on load.");
    }
    const shouldWaitForVideo = !!visibleVimeoIframe;
    // Initialize videoReady state: If no video visible, consider it 'ready'.
    videoReady = !shouldWaitForVideo;

    // --- Preloader Hide Function (with minimum display time) ---
    function checkAndHidePreloader() {
        // Prevent running if already hidden or elements missing
        if (preloaderHidden || !preloader || !preloaderCounter) return;

        // Check conditions: page loaded AND video ready (or not needed)
        if (pageLoadComplete && videoReady) {
            preloaderHidden = true; // Mark as hidden early to prevent race conditions
            console.log('Preloader: Conditions met. Calculating hide delay...');

            // Stop counter interval and failsafe timeout
            if (preloaderCounterInterval) clearInterval(preloaderCounterInterval);
            if (preloaderFailsafeTimeout) clearTimeout(preloaderFailsafeTimeout);

            // Ensure 100% is displayed
            preloaderCounter.textContent = '100%';

            // Calculate time needed to meet minimum display duration
            const elapsedTime = Date.now() - startTime;
            const delayNeeded = Math.max(0, minimumDisplayTime - elapsedTime);
            console.log(`Preloader: Elapsed: ${elapsedTime}ms, Delaying hide by: ${delayNeeded}ms to meet minimum of ${minimumDisplayTime}ms`);

            // Use calculated delay before starting fade-out animation
            setTimeout(() => {
                preloader.classList.add('preloader-hidden');
                preloader.setAttribute('aria-busy', 'false'); // Accessibility update

                // Remove from layout after animation (match CSS transition duration)
                setTimeout(() => {
                    preloader.style.display = 'none';
                    console.log('Preloader: Set display to none.');
                }, 500); // Should match your CSS transition duration for opacity/visibility
            }, delayNeeded);
        } else {
             // Optional log for debugging if called but conditions aren't met
             // console.log('checkAndHidePreloader called but conditions not met:', { pageLoadComplete, videoReady });
        }
    }

    // --- Preloader Failsafe Function ---
    function forceHidePreloader() {
        if (!preloaderHidden) {
            console.warn('Preloader failsafe triggered after timeout. Forcing hide.');
            pageLoadComplete = true; // Force completion states
            videoReady = true;
            checkAndHidePreloader(); // Attempt to hide gracefully
        }
    }

    // --- Preloader Event Listener: Window Load ---
    window.addEventListener('load', function() {
        console.log('Preloader: window.load event fired.');
        pageLoadComplete = true;
        checkAndHidePreloader();
    });

    // --- Preloader: Initialize Vimeo Player API (if needed) ---
    if (shouldWaitForVideo) {
        console.log("Preloader: Initializing Vimeo Player API for the visible iframe...");
        try {
            // Ensure the Vimeo Player API script is loaded before this runs
            if (typeof Vimeo === 'undefined' || !Vimeo.Player) {
                 console.error("Preloader: Vimeo Player API not loaded or available. Video readiness cannot be checked.");
                 videoReady = true; // Treat video as ready to not block indefinitely
                 checkAndHidePreloader(); // Check if page load is ready
            } else {
                const player = new Vimeo.Player(visibleVimeoIframe);

                player.on('playing', function() {
                    console.log('Preloader: Visible Vimeo player "playing" event fired.');
                    if (!videoReady) { // Ensure this runs only once
                        videoReady = true;
                        checkAndHidePreloader();
                    }
                });

                player.on('error', function(error) {
                    console.error('Preloader: Visible Vimeo player error:', error);
                    if (!videoReady) { // Prevent calling check multiple times
                        videoReady = true; // Don't block preloader on video error
                        checkAndHidePreloader();
                    }
                });

                 // Optional: Add loaded listener as a fallback in case playing never fires?
                 // player.on('loaded', function() { ... });
            }
        } catch (error) {
             console.error("Preloader: Error initializing or using Vimeo Player API:", error);
             if (!videoReady) { // Prevent calling check multiple times
                 videoReady = true; // Don't block preloader if API fails
                 checkAndHidePreloader();
             }
        }
    } else {
        console.log("Preloader: Skipping Vimeo Player API initialization (no visible video).");
    }

    // --- Preloader Counter Animation ---
    // Start only if conditions are not already met (preventing instant 100% jump if possible)
    if (!pageLoadComplete || !videoReady) {
        console.log("Preloader: Starting counter animation.");
        preloaderCounterInterval = setInterval(function() {
            if (preloaderHidden) { // Stop if hidden prematurely
                clearInterval(preloaderCounterInterval);
                return;
            }
            if (preloaderCount < 99) {
                preloaderCount++;
                preloaderCounter.textContent = preloaderCount + '%';
            } else {
                 // Stop incrementing counter at 99 if loading isn't finished.
                 // It will be forced to 100% in checkAndHidePreloader when ready.
                 // We can clear interval here if everything IS loaded, just waiting for min display time
                 if (pageLoadComplete && videoReady) {
                     clearInterval(preloaderCounterInterval);
                     console.log("Preloader: Counter reached 99%, conditions met, stopping interval.");
                 }
            }
        }, 30); // Adjust interval timing (e.g., 30-50ms)
    } else {
        // If conditions already met before interval logic runs (very fast load), attempt hide.
        console.log("Preloader: Conditions met before counter interval setup, attempting hide.");
        checkAndHidePreloader();
    }

    // --- Preloader Failsafe Timeout ---
    // Set a timeout to hide the preloader regardless after X seconds
    preloaderFailsafeTimeout = setTimeout(forceHidePreloader, 15000); // 15 seconds failsafe

}); // End DOMContentLoaded

Unser Team

Lisa

Lisa ist Masseurin mit medizinischem Hintergrund und arbeitet mit einem ganzheitlichen Verständnis für Körper und Gesundheit. Sie spezialisiert sich auf Anti-Cellulite-Massagen, Lymphdrainage und Entspannungsmassagen, die dabei helfen, Verspannungen zu lösen, Schwellungen zu reduzieren und die Haut sichtbar zu verbessern.

Durch eigene körperliche Transformation – sie hat 30 kg ohne radikale Diäten reduziert – versteht Lisa die Herausforderungen ihrer Kunden besonders gut. Dieses Wissen kombiniert sie mit professioneller Technik und einem individuellen Ansatz.

Als ausgebildete Ernährungsberaterin verbindet sie Massage, Ernährung und geeignete Pflegeempfehlungen zu einem stimmigen Konzept, das nachhaltige und sichtbare Ergebnisse unterstützt.

Kosmetologin

Nataliia

Nataliia ist erfahrene Kosmetikerin mit medizinischer Ausbildung. Sie bildet sich regelmäßig weiter, besucht Fachkurse und erweitert stetig ihre Qualifikationen. Darüber hinaus hat sie ein abgeschlossenes Hochschulstudium in Psychologie – ihre einfühlsame und achtsame Art im Umgang mit jedem Kunden spricht für sich.

Natalia arbeitet mit hochwertigen professionellen Kosmetikmarken, darunter:
• Anubis Barcelona – moderne spanische Kosmetik, die für alle Hauttypen geeignet ist und sichtbare Ergebnisse liefert
• Derma Series – medizinisch inspirierte Pflege für anspruchsvolle Haut
• Ella Baché – französische Dermokosmetik mit natürlichen Inhaltsstoffen
• HydroPeptide – innovative Wirkstoffpflege mit Peptiden für Anti-Aging und Hauterneuerung
• Thalgo – Meereskosmetik aus Frankreich, reich an marinen Wirkstoffen

Dank ihrer vielseitigen Ausbildung und ihres ganzheitlichen Ansatzes bietet Natalia individuelle Behandlungen, die nicht nur die Haut, sondern auch das allgemeine Wohlbefinden verbessern.

Iryna

Iryna ist talentierte Masseurin, die ihre Fähigkeiten ständig erweitert und perfektioniert. Sie hat zusätzliche Fortbildungen absolviert und wird derzeit von Masseur Yury weiter ausgebildet.
Mit einem Abschluss in Biologie bringt Irina fundierte Kenntnisse in Anatomie und Physiologie mit, was ihr bei der Behandlung von individuellen Bedürfnissen hilft. Ihr Ziel ist es, dass Sie den Unterschied spüren und sehen

Yury

Yury ist erfahrener Masseur mit 15 Jahren Berufserfahrung und einer medizinischen Ausbildung. Er ist bekannt für seine einfühlsame Herangehensweise und seine Expertise in verschiedenen Massagetechniken.
Er beherrscht außerdem die wohltuende hawaiische Lomi-Lomi-Massage und bietet praktische Sitzungen im Nagelstehen sowie Gesundheitsberatung an.
Yury hat bei dem renommierten Massagetherapeuten und Spa-Lehrer Andrej Syrtschenko einzigartige Techniken erlernt, z.B. die Körpermodellierung
oder die Power-Massage die Techniken wirken Wunder und verbessern das allgemeine Wohlbefinden. Yury kombiniert diese Methoden, um schnellstmöglich die besten Ergebnisse zu erzielen. de

Maryna

Ich bin Maryna – Inhaberin eines exklusiven Massagesalons im Zentrum von Hamburg. Seit 2022 lebe ich in Deutschland, und im Jahr 2023 habe ich meinen eigenen Massagesalon eröffnet.

Ich spezialisiere mich auf professionelle Gesichtsmassagen und biete eine Vielzahl an Techniken an, darunter:
• Klassische Gesichtsmassage
• Buccal-Massage (Massage über die Mundhöhle)
• Lymphdrainage fürs Gesicht
• Myofasziale Gesichtsmassage
• Myolifting-Massage
• Spanische Chiromassage

In meinen Behandlungen kombiniere ich gezielt verschiedene Methoden, um individuell auf die Bedürfnisse meiner Kund*innen einzugehen und optimale Ergebnisse zu erzielen – sei es zur Entspannung, Regeneration oder ästhetischen Verbesserung.

Neben den Behandlungen biete ich auch Schulungen und Weiterbildungen in Gesichts- und Körpermassage für Fachkräfte und Interessierte an.

Mitarbeiterin

Anna

Anna unterstützt unser Team im Hintergrund. Sie kümmert sich um die Terminvereinbarungen, beantwortet Fragen und ist die erste Ansprechpartnerin für unsere Kundinnen und Kunden. Durch ihre zuverlässige und freundliche Art sorgt sie dafür, dass die Kommunikation immer angenehm und unkompliziert verläuft.

Anfrageformular

Buchung

Salonregeln

  1. Bei einer Absage weniger als 24 Stunden vor dem Termin ist eine Zahlung von 50% des Dienstleistungspreises erforderlich.

     

  2. Verspätung: Wenn Sie mehr als 10 Minuten zu spät kommen, wird die Massagezeit entsprechend verkürzt.

     

  3. Abonement: Wenn Sie ein Abonement gekauft haben und die Buchung weniger als 24 Stunden vor dem Termin absagen, verfällt die Massageeinheit.