{"id":7,"date":"2026-09-03T17:15:12","date_gmt":"2026-09-03T17:15:12","guid":{"rendered":"https:\/\/bluelake.milanoproduct.com\/inicio\/"},"modified":"2026-10-22T18:01:22","modified_gmt":"2026-10-22T18:01:22","slug":"inicio","status":"publish","type":"page","link":"https:\/\/bluelake.milanoproduct.com\/es\/","title":{"rendered":"Inicio"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"7\" class=\"elementor elementor-7\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3eb1688 primer-bloque e-flex e-con-boxed e-con e-parent\" data-id=\"3eb1688\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;video&quot;,&quot;background_video_link&quot;:&quot;https:\\\/\\\/www.youtube.com\\\/watch?v=kSOUNuIrL4k&quot;,&quot;background_play_on_mobile&quot;:&quot;yes&quot;,&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;laptop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-background-video-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-background-video-embed\" role=\"presentation\"><\/div>\n\t\t\t\t\t\t<\/div><div class=\"elementor-element elementor-element-25e886c e-con-full e-flex e-con e-child\" data-id=\"25e886c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8beac25 elementor-widget elementor-widget-html\" data-id=\"8beac25\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\n\/* =====================================================\n   CONTENEDOR DEL PROYECTO\n===================================================== *\/\n\n.contenedor-hover {\n    position: relative !important;\n\n    width: 100% !important;\n\n    overflow: visible !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n}\n\n\n\/* =====================================================\n   INFO\n   ARRIBA DEL V\u00cdDEO - NO LO MUEVE\n===================================================== *\/\n\n.contenedor-hover .contenedor-hover-info {\n    position: absolute !important;\n\n    left: 0 !important;\n    bottom: calc(100% + 12px) !important;\n\n    width: 100% !important;\n\n    z-index: 100 !important;\n\n    opacity: 0 !important;\n    visibility: hidden !important;\n\n    \/*\n     * Aparece desde abajo\n     *\/\n    transform: translateY(18px) !important;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.25s ease,\n        transform 0.45s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s linear 0.45s !important;\n}\n\n\n.contenedor-hover:hover .contenedor-hover-info {\n    opacity: 1 !important;\n    visibility: visible !important;\n\n    transform: translateY(0) !important;\n\n    pointer-events: auto !important;\n\n    transition:\n        opacity 0.25s ease,\n        transform 0.45s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s !important;\n}\n\n\n\/* =====================================================\n   VIDEO PRO\n===================================================== *\/\n\n.video-pro {\n    position: relative !important;\n\n    width: 100% !important;\n\n    overflow: hidden !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n\n    cursor: pointer;\n}\n\n\n\/*\n * Relaci\u00f3n 16:9\n *\/\n.video-pro .elementor-wrapper {\n    position: relative !important;\n\n    width: 100% !important;\n\n    aspect-ratio: 16 \/ 9 !important;\n\n    overflow: hidden !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n}\n\n\n\/* =====================================================\n   QUITAR PLAY DE ELEMENTOR\n===================================================== *\/\n\n.video-pro .elementor-custom-embed-play {\n    display: none !important;\n}\n\n\n\/* =====================================================\n   COVER\n   IMAGEN DESTACADA\n===================================================== *\/\n\n\/*\n * Elementor puede destruir su overlay al inicializar\n * YouTube. Por eso el JS crea .lz-video-cover.\n *\/\n\n.video-pro .lz-video-cover {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    z-index: 30 !important;\n\n    background-size: cover !important;\n    background-position: center center !important;\n    background-repeat: no-repeat !important;\n\n    opacity: 1 !important;\n    visibility: visible !important;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.14s ease,\n        visibility 0s linear 0.14s !important;\n}\n\n\n\/*\n * Solo desaparece cuando nosotros decidimos\n * que YouTube est\u00e1 listo para ense\u00f1arse.\n *\/\n.video-pro.lz-video-visible .lz-video-cover {\n    opacity: 0 !important;\n    visibility: hidden !important;\n\n    transition:\n        opacity 0.14s ease,\n        visibility 0s !important;\n}\n\n\n\/*\n * Overlay original Elementor.\n * Lo mantenemos solo para poder inicializarlo.\n *\/\n.video-pro .elementor-custom-embed-image-overlay {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    z-index: 20 !important;\n\n    background-size: cover !important;\n    background-position: center center !important;\n\n    border-radius: 0 !important;\n}\n\n\n\/*\n * Una vez hemos creado nuestra propia cover,\n * el overlay original queda debajo.\n *\/\n.video-pro.lz-cover-creada\n.elementor-custom-embed-image-overlay {\n    opacity: 0 !important;\n}\n\n\n\/* =====================================================\n   YOUTUBE\n===================================================== *\/\n\n.video-pro iframe {\n    position: absolute !important;\n\n    top: 50% !important;\n    left: 50% !important;\n\n    \/*\n     * El iframe es mayor que la caja.\n     *\n     * Con esto recortamos:\n     * - t\u00edtulo superior\n     * - avatar\n     * - logo de YouTube\n     * - zonas inferiores\n     *\/\n    width: 128% !important;\n    height: 128% !important;\n\n    min-width: 128% !important;\n    min-height: 128% !important;\n\n    max-width: none !important;\n\n    transform:\n        translate(-50%, -50%) !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n\n    \/*\n     * MUY IMPORTANTE.\n     *\n     * YouTube jam\u00e1s recibe mousemove,\n     * hover ni click.\n     *\/\n    pointer-events: none !important;\n}\n\n\n\/* =====================================================\n   FULLSCREEN\n===================================================== *\/\n\n.video-pro .elementor-wrapper:fullscreen {\n    width: 100vw !important;\n    height: 100vh !important;\n\n    aspect-ratio: auto !important;\n\n    background: #000 !important;\n}\n\n\n.video-pro .elementor-wrapper:fullscreen iframe {\n    \/*\n     * Seguimos con overscan tambi\u00e9n\n     * en pantalla completa.\n     *\/\n    width: 128% !important;\n    height: 128% !important;\n}\n\n\n\/* Safari *\/\n.video-pro .elementor-wrapper:-webkit-full-screen {\n    width: 100vw !important;\n    height: 100vh !important;\n\n    background: #000 !important;\n}\n\n\n\/* =====================================================\n   CERO REDONDEADOS\n===================================================== *\/\n\n.video-pro,\n.video-pro *,\n.contenedor-hover,\n.contenedor-hover * {\n    border-radius: 0 !important;\n}\n\n<\/style>\n\n\n<script>\n(() => {\n\n    'use strict';\n\n\n    \/*\n     * Evitar inicializar este c\u00f3digo dos veces.\n     *\/\n    if (window.__lzYoutubePortfolio) {\n        return;\n    }\n\n    window.__lzYoutubePortfolio = true;\n\n\n\n    \/* =====================================================\n       COMANDO YOUTUBE\n    ====================================================== *\/\n\n    function youtubeCommand(\n        iframe,\n        funcion,\n        args = []\n    ) {\n\n        if (\n            !iframe ||\n            !iframe.contentWindow\n        ) {\n            return;\n        }\n\n\n        iframe.contentWindow.postMessage(\n\n            JSON.stringify({\n                event: 'command',\n                func: funcion,\n                args: args\n            }),\n\n            '*'\n\n        );\n\n    }\n\n\n\n    \/* =====================================================\n       ASEGURAR PARAMETROS DEL IFRAME\n    ====================================================== *\/\n\n    function prepararSrcYoutube(iframe) {\n\n        if (\n            !iframe ||\n            iframe.dataset.lzSrcPreparado === '1'\n        ) {\n            return;\n        }\n\n\n        let src = iframe.getAttribute('src');\n\n        if (!src) {\n            return;\n        }\n\n\n        try {\n\n            const url =\n                new URL(\n                    src,\n                    window.location.href\n                );\n\n\n            \/*\n             * API JS.\n             *\/\n            url.searchParams.set(\n                'enablejsapi',\n                '1'\n            );\n\n\n            \/*\n             * YouTube debe arrancar silenciado\n             * para permitir reproducci\u00f3n autom\u00e1tica.\n             *\/\n            url.searchParams.set(\n                'mute',\n                '1'\n            );\n\n\n            \/*\n             * Sin controles normales.\n             *\/\n            url.searchParams.set(\n                'controls',\n                '0'\n            );\n\n\n            \/*\n             * Sin teclado.\n             *\/\n            url.searchParams.set(\n                'disablekb',\n                '1'\n            );\n\n\n            \/*\n             * No queremos el fullscreen\n             * propio de YouTube.\n             *\/\n            url.searchParams.set(\n                'fs',\n                '0'\n            );\n\n\n            url.searchParams.set(\n                'playsinline',\n                '1'\n            );\n\n\n            url.searchParams.set(\n                'rel',\n                '0'\n            );\n\n\n            url.searchParams.set(\n                'iv_load_policy',\n                '3'\n            );\n\n\n            \/*\n             * Nuestro JS controla el v\u00eddeo.\n             *\/\n            url.searchParams.set(\n                'autoplay',\n                '1'\n            );\n\n\n            const nuevoSrc =\n                url.toString();\n\n\n            if (nuevoSrc !== src) {\n\n                iframe.dataset.lzSrcPreparado =\n                    '1';\n\n\n                iframe.src =\n                    nuevoSrc;\n\n            } else {\n\n                iframe.dataset.lzSrcPreparado =\n                    '1';\n\n            }\n\n        } catch (error) {}\n\n    }\n\n\n\n    \/* =====================================================\n       PREPARAR WIDGET\n    ====================================================== *\/\n\n    function prepararWidget(widget) {\n\n\n        if (\n            widget.dataset.lzPortfolioReady === '1'\n        ) {\n            return;\n        }\n\n\n        widget.dataset.lzPortfolioReady = '1';\n\n\n        const wrapper =\n            widget.querySelector(\n                '.elementor-wrapper'\n            );\n\n\n        if (!wrapper) {\n            return;\n        }\n\n\n        let overlay =\n            widget.querySelector(\n                '.elementor-custom-embed-image-overlay'\n            );\n\n\n        let iframe = null;\n\n        let dentro = false;\n\n        let preparado = false;\n\n        let inicializando = false;\n\n        let revealTimer = null;\n\n\n\n        \/* =================================================\n           CREAR NUESTRA PROPIA COVER\n        ================================================= *\/\n\n        if (\n            overlay &&\n            !wrapper.querySelector(\n                '.lz-video-cover'\n            )\n        ) {\n\n            const cover =\n                document.createElement('div');\n\n\n            cover.className =\n                'lz-video-cover';\n\n\n            \/*\n             * Cogemos exactamente la imagen\n             * que Elementor est\u00e1 utilizando.\n             *\/\n            const estilos =\n                getComputedStyle(overlay);\n\n\n            cover.style.backgroundImage =\n                estilos.backgroundImage;\n\n\n            wrapper.appendChild(\n                cover\n            );\n\n\n            widget.classList.add(\n                'lz-cover-creada'\n            );\n\n        }\n\n\n\n        \/* =================================================\n           BUSCAR IFRAME\n        ================================================= *\/\n\n        function obtenerIframe() {\n\n            iframe =\n                widget.querySelector(\n                    'iframe'\n                );\n\n\n            if (iframe) {\n\n                prepararSrcYoutube(\n                    iframe\n                );\n\n            }\n\n\n            return iframe;\n\n        }\n\n\n\n        \/* =================================================\n           YOUTUBE SIEMPRE REPRODUCIENDO OCULTO\n        ================================================= *\/\n\n        function mantenerReproduccion() {\n\n            if (!obtenerIframe()) {\n                return;\n            }\n\n\n            youtubeCommand(\n                iframe,\n                'mute'\n            );\n\n\n            \/*\n             * IMPORTANTE:\n             *\n             * No pausamos YouTube.\n             *\n             * Se reproduce oculto debajo\n             * de la imagen destacada.\n             *\/\n            youtubeCommand(\n                iframe,\n                'playVideo'\n            );\n\n\n            preparado = true;\n\n        }\n\n\n\n        \/* =================================================\n           INICIALIZAR ELEMENTOR\n        ================================================= *\/\n\n        function inicializarYoutube() {\n\n            if (\n                inicializando ||\n                obtenerIframe()\n            ) {\n\n                if (iframe) {\n\n                    mantenerReproduccion();\n\n                }\n\n                return;\n            }\n\n\n            inicializando = true;\n\n\n            overlay =\n                widget.querySelector(\n                    '.elementor-custom-embed-image-overlay'\n                );\n\n\n            \/*\n             * Elementor crea el iframe\n             * cuando se activa su overlay.\n             *\n             * Nuestra imagen .lz-video-cover\n             * sigue encima, por lo que el usuario\n             * no ve este proceso.\n             *\/\n            if (overlay) {\n\n                overlay.click();\n\n            }\n\n\n\n            let intentos = 0;\n\n\n            const esperarIframe = () => {\n\n\n                intentos++;\n\n\n                if (obtenerIframe()) {\n\n\n                    inicializando = false;\n\n\n                    \/*\n                     * Dar un peque\u00f1o margen para\n                     * que termine de cargar el iframe.\n                     *\/\n                    setTimeout(() => {\n\n                        mantenerReproduccion();\n\n                    }, 100);\n\n\n                    return;\n\n                }\n\n\n                if (intentos < 120) {\n\n                    requestAnimationFrame(\n                        esperarIframe\n                    );\n\n                } else {\n\n                    inicializando = false;\n\n                }\n\n            };\n\n\n            esperarIframe();\n\n        }\n\n\n\n        \/* =================================================\n           OBSERVAR ELEMENTOR\n        ================================================= *\/\n\n        const observer =\n            new MutationObserver(() => {\n\n\n                if (\n                    obtenerIframe()\n                ) {\n\n                    mantenerReproduccion();\n\n                }\n\n            });\n\n\n        observer.observe(\n            wrapper,\n            {\n                childList: true,\n                subtree: true\n            }\n        );\n\n\n\n        \/* =================================================\n           PRE-CARGA CUANDO SE ACERCA A PANTALLA\n        ================================================= *\/\n\n        if (\n            'IntersectionObserver'\n            in window\n        ) {\n\n            const viewportObserver =\n                new IntersectionObserver(\n                    entries => {\n\n\n                        entries.forEach(entry => {\n\n\n                            if (\n                                entry.isIntersecting\n                            ) {\n\n                                \/*\n                                 * Inicializamos ANTES\n                                 * del hover.\n                                 *\n                                 * As\u00ed cuando llegas con\n                                 * el rat\u00f3n YouTube ya est\u00e1\n                                 * reproduci\u00e9ndose oculto.\n                                 *\/\n                                inicializarYoutube();\n\n                            }\n\n                        });\n\n                    },\n                    {\n                        \/*\n                         * Preparar incluso antes de que\n                         * la tarjeta entre completamente.\n                         *\/\n                        rootMargin:\n                            '400px 0px 400px 0px'\n                    }\n                );\n\n\n            viewportObserver.observe(\n                widget\n            );\n\n        }\n\n        else {\n\n            inicializarYoutube();\n\n        }\n\n\n\n        \/* =================================================\n           HOVER\n        ================================================= *\/\n\n        widget.addEventListener(\n            'mouseenter',\n            () => {\n\n\n                dentro = true;\n\n\n                clearTimeout(\n                    revealTimer\n                );\n\n\n                \/*\n                 * Si por alg\u00fan motivo a\u00fan no se hab\u00eda\n                 * preparado, hacerlo ahora.\n                 *\/\n                inicializarYoutube();\n\n\n                const mostrar = () => {\n\n\n                    if (!dentro) {\n                        return;\n                    }\n\n\n                    if (!obtenerIframe()) {\n\n                        requestAnimationFrame(\n                            mostrar\n                        );\n\n                        return;\n                    }\n\n\n                    \/*\n                     * MUY IMPORTANTE:\n                     *\n                     * YouTube YA est\u00e1 en PLAY.\n                     *\n                     * Solo lo llevamos al principio.\n                     * No hacemos pause -> play.\n                     *\/\n                    youtubeCommand(\n                        iframe,\n                        'mute'\n                    );\n\n\n                    youtubeCommand(\n                        iframe,\n                        'seekTo',\n                        [0, true]\n                    );\n\n\n                    youtubeCommand(\n                        iframe,\n                        'playVideo'\n                    );\n\n\n                    \/*\n                     * El v\u00eddeo est\u00e1 detr\u00e1s de la cover.\n                     *\n                     * Esperamos solo unos milisegundos\n                     * para que seekTo pinte el primer frame.\n                     *\/\n                    revealTimer =\n                        setTimeout(() => {\n\n\n                            if (!dentro) {\n                                return;\n                            }\n\n\n                            widget.classList.add(\n                                'lz-video-visible'\n                            );\n\n\n                        }, 90);\n\n                };\n\n\n                mostrar();\n\n            }\n        );\n\n\n\n        \/* =================================================\n           SALIR DEL HOVER\n        ================================================= *\/\n\n        widget.addEventListener(\n            'mouseleave',\n            () => {\n\n\n                dentro = false;\n\n\n                clearTimeout(\n                    revealTimer\n                );\n\n\n                \/*\n                 * PRIMERO tapamos YouTube.\n                 *\/\n                widget.classList.remove(\n                    'lz-video-visible'\n                );\n\n\n                if (!obtenerIframe()) {\n                    return;\n                }\n\n\n                \/*\n                 * Reiniciamos.\n                 *\n                 * PERO NO PAUSAMOS.\n                 *\n                 * Esta es la diferencia fundamental.\n                 *\/\n                youtubeCommand(\n                    iframe,\n                    'seekTo',\n                    [0, true]\n                );\n\n\n                youtubeCommand(\n                    iframe,\n                    'mute'\n                );\n\n\n                youtubeCommand(\n                    iframe,\n                    'playVideo'\n                );\n\n            }\n        );\n\n\n\n        \/* =================================================\n           CLICK -> FULLSCREEN\n        ================================================= *\/\n\n        widget.addEventListener(\n            'click',\n            event => {\n\n\n                \/*\n                 * Respetar cualquier enlace real.\n                 *\/\n                if (\n                    event.target.closest('a')\n                ) {\n                    return;\n                }\n\n\n                if (!obtenerIframe()) {\n                    return;\n                }\n\n\n                \/*\n                 * Seguimos reproduciendo.\n                 *\/\n                youtubeCommand(\n                    iframe,\n                    'mute'\n                );\n\n\n                youtubeCommand(\n                    iframe,\n                    'playVideo'\n                );\n\n\n                \/*\n                 * Fullscreen de NUESTRO wrapper.\n                 *\n                 * No usamos el fullscreen de YouTube.\n                 *\/\n                if (\n                    wrapper.requestFullscreen\n                ) {\n\n                    wrapper.requestFullscreen();\n\n                }\n\n                else if (\n                    wrapper.webkitRequestFullscreen\n                ) {\n\n                    wrapper.webkitRequestFullscreen();\n\n                }\n\n            }\n        );\n\n\n\n        \/* =================================================\n           SALIR DE FULLSCREEN\n        ================================================= *\/\n\n        document.addEventListener(\n            'fullscreenchange',\n            () => {\n\n\n                if (\n                    document.fullscreenElement ===\n                    wrapper\n                ) {\n                    return;\n                }\n\n\n                \/*\n                 * Si salimos del fullscreen y\n                 * tampoco estamos sobre la tarjeta,\n                 * volver a mostrar la imagen.\n                 *\/\n                if (\n                    !widget.matches(':hover')\n                ) {\n\n                    widget.classList.remove(\n                        'lz-video-visible'\n                    );\n\n\n                    if (iframe) {\n\n                        youtubeCommand(\n                            iframe,\n                            'seekTo',\n                            [0, true]\n                        );\n\n\n                        youtubeCommand(\n                            iframe,\n                            'playVideo'\n                        );\n\n                    }\n\n                }\n\n            }\n        );\n\n    }\n\n\n\n    \/* =====================================================\n       INICIAR TODOS\n    ====================================================== *\/\n\n    function iniciarTodos() {\n\n        document\n            .querySelectorAll(\n                '.video-pro'\n            )\n            .forEach(\n                prepararWidget\n            );\n\n    }\n\n\n\n    if (\n        document.readyState ===\n        'loading'\n    ) {\n\n        document.addEventListener(\n            'DOMContentLoaded',\n            iniciarTodos,\n            {\n                once: true\n            }\n        );\n\n    }\n\n    else {\n\n        iniciarTodos();\n\n    }\n\n\n\n    \/* =====================================================\n       LOOP GRID DE ELEMENTOR\n    ====================================================== *\/\n\n    new MutationObserver(() => {\n\n\n        document\n            .querySelectorAll(\n                '.video-pro:not([data-lz-portfolio-ready=\"1\"])'\n            )\n            .forEach(\n                prepararWidget\n            );\n\n\n    }).observe(\n        document.body,\n        {\n            childList: true,\n            subtree: true\n        }\n    );\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e53c64c e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"e53c64c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_translateY_effect&quot;:&quot;yes&quot;,&quot;motion_fx_translateY_direction&quot;:&quot;negative&quot;,&quot;motion_fx_scale_effect&quot;:&quot;yes&quot;,&quot;motion_fx_scale_direction&quot;:&quot;in-out&quot;,&quot;animation&quot;:&quot;fadeIn&quot;,&quot;motion_fx_translateY_speed&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:4,&quot;sizes&quot;:[]},&quot;motion_fx_translateY_affectedRange&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:0,&quot;end&quot;:100}},&quot;motion_fx_scale_speed&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:4,&quot;sizes&quot;:[]},&quot;motion_fx_scale_range&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:20,&quot;end&quot;:80}},&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;laptop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-47e0ca2 elementor-widget elementor-widget-image\" data-id=\"47e0ca2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/Blue-Lake-media-house-w-1024x1024.png\" class=\"attachment-large size-large wp-image-33\" alt=\"Blue Lake\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/Blue-Lake-media-house-w-1024x1024.png 1024w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/Blue-Lake-media-house-w-300x300.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/Blue-Lake-media-house-w-150x150.png 150w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/Blue-Lake-media-house-w-768x768.png 768w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/Blue-Lake-media-house-w.png 1182w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-50ae647 e-con-full e-flex e-con e-child\" data-id=\"50ae647\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fcddc6c elementor-widget elementor-widget-html\" data-id=\"fcddc6c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n.bl-years {\n  \/* DISE\u00d1O *\/\n  --by-color: #f5f5f3;\n  --by-font: \"Inter Tight\", Arial, sans-serif;\n  --by-font-size: 14px;\n\n  --by-gap: 8px;\n  --by-line-gap: 10px;\n  --by-line-width: 1px;\n  --by-line-height: 12px;\n\n  \/* MOVIMIENTO CONTINUO *\/\n  --by-wave-speed: 2.8s;\n  --by-grow: 1.65;\n  --by-shrink: 0.5;\n\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  gap: var(--by-gap);\n\n  width: max-content;\n  max-width: 100%;\n  min-height: 24px;\n\n  margin: 0;\n  padding: 0;\n\n  background: transparent;\n  color: var(--by-color);\n\n  font-family: var(--by-font);\n  font-size: var(--by-font-size);\n  font-weight: 400;\n  font-style: normal;\n\n  font-variant-numeric: tabular-nums;\n\n  line-height: 1;\n  letter-spacing: 0;\n\n  white-space: nowrap;\n  vertical-align: middle;\n  direction: ltr;\n}\n\n\n\/* TEXTOS *\/\n.bl-years .bl-years__start,\n.bl-years .bl-years__current {\n  display: block;\n  flex-shrink: 0;\n}\n\n\n\/* CONTENEDOR DE L\u00cdNEAS *\/\n.bl-years .bl-years__ticks {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n\n  gap: var(--by-line-gap);\n}\n\n\n.bl-years .bl-years__ticks:empty {\n  display: none;\n}\n\n\n\/* CADA L\u00cdNEA *\/\n.bl-years .bl-years__tick {\n  display: block;\n\n  flex: 0 0 var(--by-line-width);\n\n  width: var(--by-line-width);\n  height: var(--by-line-height);\n\n  transform-origin: center;\n}\n\n\n\/* L\u00cdNEA INTERIOR *\/\n.bl-years .bl-years__line {\n  display: block;\n\n  width: 100%;\n  height: 100%;\n\n  background: currentColor;\n\n  opacity: 0.35;\n\n  transform-origin: center;\n}\n\n\n\/* OCULTAR ANTES DE COMENZAR *\/\n.bl-years.bl-years--ready .bl-years__start,\n.bl-years.bl-years--ready .bl-years__current,\n.bl-years.bl-years--ready .bl-years__tick {\n  opacity: 0;\n}\n\n\n\/* 1. APARECE \u00a9 2021 *\/\n.bl-years.bl-years--started .bl-years__current {\n  animation:\n    bl-years-label\n    400ms\n    ease-out\n    both;\n}\n\n\n\/* 2. APARECEN LAS L\u00cdNEAS *\/\n.bl-years.bl-years--started .bl-years__tick {\n  animation:\n    bl-years-draw\n    var(--by-draw-time)\n    cubic-bezier(0.22, 1, 0.36, 1)\n    var(--by-reveal-delay)\n    both;\n}\n\n\n\/* 3. APARECE 26' *\/\n.bl-years.bl-years--started .bl-years__start {\n  animation:\n    bl-years-label\n    400ms\n    ease-out\n    var(--by-end-delay)\n    both;\n}\n\n\n\/* 4. MOVIMIENTO CONTINUO *\/\n.bl-years.bl-years--started .bl-years__line {\n  animation:\n    bl-years-wave\n    var(--by-wave-speed)\n    ease-in-out\n    calc(var(--by-loop-start) + var(--by-wave-delay))\n    infinite;\n}\n\n\n\/* PAUSAR CUANDO NO EST\u00c1 VISIBLE *\/\n.bl-years.bl-years--paused * {\n  animation-play-state: paused !important;\n}\n\n\n\/* ENTRADA DE TEXTOS *\/\n@keyframes bl-years-label {\n\n  from {\n    opacity: 0;\n    transform: translateY(4px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n\n}\n\n\n\/* APARICI\u00d3N DE LAS L\u00cdNEAS *\/\n@keyframes bl-years-draw {\n\n  from {\n    opacity: 0;\n    transform: scaleY(0);\n  }\n\n  to {\n    opacity: 1;\n    transform: scaleY(1);\n  }\n\n}\n\n\n\/* ONDA CONTINUA *\/\n@keyframes bl-years-wave {\n\n  0%,\n  100% {\n    transform: scaleY(1);\n    opacity: 0.35;\n  }\n\n  35% {\n    transform: scaleY(var(--by-grow));\n    opacity: 0.7;\n  }\n\n  70% {\n    transform: scaleY(var(--by-shrink));\n    opacity: 0.25;\n  }\n\n}\n\n\n\/* TEXTO PARA LECTORES DE PANTALLA *\/\n.bl-years .bl-years__sr {\n  position: absolute;\n\n  width: 1px;\n  height: 1px;\n\n  padding: 0;\n  margin: -1px;\n\n  overflow: hidden;\n\n  clip-path: inset(50%);\n\n  white-space: nowrap;\n\n  border: 0;\n}\n\n\n\/* REDUCIR MOVIMIENTO *\/\n@media (prefers-reduced-motion: reduce) {\n\n  .bl-years.bl-years--ready .bl-years__start,\n  .bl-years.bl-years--ready .bl-years__current,\n  .bl-years.bl-years--ready .bl-years__tick {\n\n    animation: none !important;\n\n    opacity: 1 !important;\n\n    transform: none !important;\n\n  }\n\n\n  .bl-years .bl-years__line {\n\n    animation: none !important;\n\n    transform: none !important;\n\n    opacity: 0.35 !important;\n\n  }\n\n}\n<\/style>\n\n\n<div\n  class=\"bl-years\"\n  data-bl-years\n  data-start-year=\"2021\"\n>\n\n  <span class=\"bl-years__sr\">\n    Desde 2021.\n  <\/span>\n\n\n  <!-- A\u00d1O INICIAL -->\n  <span\n    class=\"bl-years__current\"\n    aria-hidden=\"true\"\n  >\n    \u00a9 2021\n  <\/span>\n\n\n  <!-- L\u00cdNEAS -->\n  <span\n    class=\"bl-years__ticks\"\n    aria-hidden=\"true\"\n  ><\/span>\n\n\n  <!-- A\u00d1O ACTUAL -->\n  <span\n    class=\"bl-years__start\"\n    aria-hidden=\"true\"\n  ><\/span>\n\n<\/div>\n\n\n<script>\n(() => {\n\n  'use strict';\n\n\n  \/* ==========================\n     TIEMPOS DE ANIMACI\u00d3N\n  ========================== *\/\n\n  const ESPERA_INICIAL = 450;\n\n  const PASO_ENTRE_ANOS = 180;\n\n  const DURACION_LINEA = 400;\n\n  const DESFASE_ONDA = 180;\n\n\n\n  document\n    .querySelectorAll('[data-bl-years]')\n    .forEach(root => {\n\n\n      \/* EVITAR EJECUTAR DOS VECES *\/\n      if (root.dataset.yearsReady === '1') {\n        return;\n      }\n\n\n\n      \/* ELEMENTOS *\/\n      const initialLabel =\n        root.querySelector('.bl-years__current');\n\n      const currentLabel =\n        root.querySelector('.bl-years__start');\n\n      const ticks =\n        root.querySelector('.bl-years__ticks');\n\n      const accessible =\n        root.querySelector('.bl-years__sr');\n\n\n      if (\n        !initialLabel ||\n        !currentLabel ||\n        !ticks ||\n        !accessible\n      ) {\n        return;\n      }\n\n\n\n      \/* ==========================\n         A\u00d1OS\n      ========================== *\/\n\n      const currentYear =\n        new Date().getFullYear();\n\n\n      const startYear =\n        Number(\n          root.dataset.startYear || 2021\n        );\n\n\n      if (\n        !Number.isInteger(startYear) ||\n        startYear < 1900 ||\n        startYear > currentYear\n      ) {\n        return;\n      }\n\n\n      root.dataset.yearsReady = '1';\n\n\n\n      \/* ==========================\n         TEXTOS\n      ========================== *\/\n\n\n      \/* IZQUIERDA: \u00a9 2021 *\/\n      initialLabel.textContent =\n        `\u00a9 ${startYear}`;\n\n\n      \/* DERECHA: 26' \/ 27' \/ etc *\/\n      currentLabel.textContent =\n        `${String(currentYear).slice(-2)}'`;\n\n\n      \/* ACCESIBILIDAD *\/\n      accessible.textContent =\n        `Desde ${startYear} hasta ${currentYear}.`;\n\n\n\n      \/* ==========================\n         N\u00daMERO DE L\u00cdNEAS\n      ========================== *\/\n\n      const totalYears =\n        currentYear - startYear;\n\n\n      ticks.replaceChildren();\n\n\n\n      \/* ==========================\n         CREAR L\u00cdNEAS\n      ========================== *\/\n\n      for (\n        let i = 0;\n        i < totalYears;\n        i++\n      ) {\n\n        const tick =\n          document.createElement('span');\n\n        const line =\n          document.createElement('span');\n\n\n        tick.className =\n          'bl-years__tick';\n\n        line.className =\n          'bl-years__line';\n\n\n        tick.dataset.year =\n          String(startYear + i + 1);\n\n\n\n        \/* ENTRADA PROGRESIVA *\/\n        tick.style.setProperty(\n          '--by-reveal-delay',\n          `${\n            ESPERA_INICIAL +\n            i * PASO_ENTRE_ANOS\n          }ms`\n        );\n\n\n\n        \/* ONDA *\/\n        line.style.setProperty(\n          '--by-wave-delay',\n          `${\n            i * DESFASE_ONDA\n          }ms`\n        );\n\n\n        tick.appendChild(line);\n\n        ticks.appendChild(tick);\n\n      }\n\n\n\n      \/* ==========================\n         FINAL DE ENTRADA\n      ========================== *\/\n\n      const endDelay =\n        totalYears > 0\n\n          ? ESPERA_INICIAL +\n            (totalYears - 1) *\n            PASO_ENTRE_ANOS +\n            DURACION_LINEA\n\n          : ESPERA_INICIAL;\n\n\n\n      root.style.setProperty(\n        '--by-draw-time',\n        `${DURACION_LINEA}ms`\n      );\n\n\n      root.style.setProperty(\n        '--by-end-delay',\n        `${endDelay}ms`\n      );\n\n\n      root.style.setProperty(\n        '--by-loop-start',\n        `${endDelay + 500}ms`\n      );\n\n\n\n      root.classList.add(\n        'bl-years--ready'\n      );\n\n\n\n      \/* ==========================\n         VISIBILIDAD\n      ========================== *\/\n\n      let visible =\n        !(\n          'IntersectionObserver'\n          in window\n        );\n\n\n      let observer = null;\n\n\n\n      function sync() {\n\n\n        if (!root.isConnected) {\n\n\n          if (observer) {\n            observer.disconnect();\n          }\n\n\n          document.removeEventListener(\n            'visibilitychange',\n            sync\n          );\n\n\n          return;\n\n        }\n\n\n\n        const active =\n          visible &&\n          !document.hidden;\n\n\n\n        \/* INICIAR UNA SOLA VEZ *\/\n        if (active) {\n\n          root.classList.add(\n            'bl-years--started'\n          );\n\n        }\n\n\n\n        \/* PAUSAR FUERA DE PANTALLA *\/\n        root.classList.toggle(\n          'bl-years--paused',\n          !active\n        );\n\n      }\n\n\n\n      \/* ==========================\n         INTERSECTION OBSERVER\n      ========================== *\/\n\n      if (\n        'IntersectionObserver'\n        in window\n      ) {\n\n\n        observer =\n          new IntersectionObserver(\n            entries => {\n\n\n              const entry =\n                entries[\n                  entries.length - 1\n                ];\n\n\n              visible =\n                entry.isIntersecting &&\n                entry.intersectionRatio >= 0.2;\n\n\n              sync();\n\n\n            },\n            {\n              threshold: [0, 0.2]\n            }\n          );\n\n\n        observer.observe(root);\n\n      }\n\n\n\n      document.addEventListener(\n        'visibilitychange',\n        sync\n      );\n\n\n      sync();\n\n    });\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b97c6fc elementor-align-left boton-borde-animado, text-enlace elementor-widget elementor-widget-button\" data-id=\"b97c6fc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"mailto:info@bluelake.es\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">[ contact@bluelake.es ]<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8560bab elementor-align-left boton-borde-animado, text-enlace,  elementor-widget elementor-widget-button\" data-id=\"8560bab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-size-sm\" role=\"button\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Valencia  \u2013  Worldwide<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-04d6299 e-flex e-con-boxed e-con e-parent\" data-id=\"04d6299\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-7e0c3da e-con-full e-flex e-con e-child\" data-id=\"7e0c3da\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a96cc4e text-animation-write elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"a96cc4e\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_translateY_effect&quot;:&quot;yes&quot;,&quot;motion_fx_blur_effect&quot;:&quot;yes&quot;,&quot;motion_fx_blur_direction&quot;:&quot;out-in-out&quot;,&quot;motion_fx_blur_range&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:30,&quot;end&quot;:80}},&quot;motion_fx_translateY_speed&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:4,&quot;sizes&quot;:[]},&quot;motion_fx_translateY_affectedRange&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:0,&quot;end&quot;:100}},&quot;motion_fx_blur_level&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:7,&quot;sizes&quot;:[]},&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;laptop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Two guys making your brand look sexy<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0101e09 elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"0101e09\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"686\" height=\"1024\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_13_IMG_2895-1920x2864-1-686x1024.jpg\" class=\"attachment-large size-large wp-image-508\" alt=\"Two crew members laughing in a restaurant kitchen\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_13_IMG_2895-1920x2864-1-686x1024.jpg 686w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_13_IMG_2895-1920x2864-1-201x300.jpg 201w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_13_IMG_2895-1920x2864-1-768x1146.jpg 768w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_13_IMG_2895-1920x2864-1-1030x1536.jpg 1030w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_13_IMG_2895-1920x2864-1-1373x2048.jpg 1373w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_13_IMG_2895-1920x2864-1-scaled.jpg 1716w\" sizes=\"(max-width: 686px) 100vw, 686px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-fd90664 e-con-full e-flex e-con e-child\" data-id=\"fd90664\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6622877 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-html\" data-id=\"6622877\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_translateY_effect&quot;:&quot;yes&quot;,&quot;motion_fx_translateY_speed&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:3.4,&quot;sizes&quot;:[]},&quot;motion_fx_translateY_affectedRange&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:43,&quot;end&quot;:100}},&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;laptop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n.bl-reel {\n  \/* DISE\u00d1O *\/\n  --bl-color: #f5f5f3;\n  --bl-background: transparent;\n  --bl-font: \"Inter Tight\", Arial, sans-serif;\n  --bl-size: clamp(52px, 14vw, 240px);\n  --bl-weight: 700;\n\n  width: 50%;\n  max-width: 100%;\n  min-width: 0;\n  position: relative;\n  color: var(--bl-color);\n  background: var(--bl-background);\n  font-family: var(--bl-font);\n  font-size: var(--bl-size);\n  font-weight: var(--bl-weight);\n  font-style: normal;\n  font-kerning: none;\n  font-variant-ligatures: none;\n  line-height: 1.1;\n  text-align: left;\n}\n\n.bl-reel .bl-reel__title {\n  margin: 0;\n  padding: 0;\n  font: inherit;\n  color: inherit;\n  letter-spacing: 0;\n  text-transform: none;\n  text-align: left;\n}\n\n\/* M\u00e1scara de animaci\u00f3n *\/\n.bl-reel .bl-reel__stage {\n  position: relative;\n  display: block;\n  width: 100%;\n  height: 1.1em;\n  overflow: hidden;\n  white-space: nowrap;\n  text-align: left;\n}\n\n.bl-reel .bl-reel__word {\n  position: absolute;\n  inset: 0;\n}\n\n.bl-reel .bl-reel__letter {\n  position: absolute;\n  top: 0;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  white-space: pre;\n  text-align: left;\n}\n\n.bl-reel .bl-reel__measure {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: max-content;\n  font-size: 100px;\n  letter-spacing: 0;\n  white-space: pre;\n  visibility: hidden;\n  pointer-events: none;\n}\n\n\/* Texto accesible *\/\n.bl-reel .bl-reel__sr {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n  border: 0;\n}\n<\/style>\n\n\n<div class=\"bl-reel\" data-bl-reel>\n  <p class=\"bl-reel__title\">\n\n    <span class=\"bl-reel__sr\">\n      FILM \u00b7 PHOTO \u00b7 MEDIA HOUSE \u00b7 CREATIVE \u00b7 BLUE LAKE\n    <\/span>\n\n    <span class=\"bl-reel__stage\" aria-hidden=\"true\">\n      FILM\n    <\/span>\n\n  <\/p>\n\n  <span class=\"bl-reel__measure\" aria-hidden=\"true\"><\/span>\n<\/div>\n\n\n<script>\n(() => {\n  'use strict';\n\n  \/* PALABRAS *\/\n  const PALABRAS = [\n    'FILM',\n    'PHOTO',\n    'MEDIA HOUSE',\n    'CREATIVE',\n    'BLUE LAKE'\n  ];\n\n  \/* ANIMACI\u00d3N *\/\n  const PAUSA = 1300;\n  const DURACION = 600;\n  const CASCADA = 450;\n  const ESPACIADO = -0.04;\n  const CURVA = 'cubic-bezier(0.65, 0, 0.35, 1)';\n\n  document.querySelectorAll('[data-bl-reel]').forEach(root => {\n\n    if (root.dataset.blReady) return;\n\n    const stage = root.querySelector('.bl-reel__stage');\n    const measure = root.querySelector('.bl-reel__measure');\n    const accessible = root.querySelector('.bl-reel__sr');\n\n    if (!stage || !measure || !accessible) return;\n\n    root.dataset.blReady = '1';\n\n    const reduced = window.matchMedia(\n      '(prefers-reduced-motion: reduce)'\n    );\n\n    const words = PALABRAS.map(word => Array.from(word));\n\n    accessible.textContent = PALABRAS.join(' \u00b7 ');\n\n    let layouts = [];\n    let size = 0;\n    let current = 0;\n    let destination = 0;\n    let timer = 0;\n    let moving = false;\n\n    let visible = !('IntersectionObserver' in window);\n\n    let animations = [];\n\n\n    function getX(wordIndex, letterIndex) {\n\n      const layout = layouts[wordIndex];\n\n      const position =\n        layout.positions[letterIndex] ?? layout.width;\n\n      return position * size;\n    }\n\n\n    function createWord(index, offset = 0) {\n\n      const layer = document.createElement('span');\n\n      layer.className = 'bl-reel__word';\n\n\n      words[index].forEach((letter, i) => {\n\n        const span = document.createElement('span');\n\n        span.className = 'bl-reel__letter';\n\n        span.textContent = letter;\n\n        \/*\n         * ALINEACI\u00d3N IZQUIERDA\n         *\n         * Cada palabra empieza directamente\n         * desde el borde izquierdo.\n         *\/\n        span.style.left =\n          `${getX(index, i)}px`;\n\n        span.style.transform =\n          `translateY(${offset}%)`;\n\n        layer.appendChild(span);\n\n      });\n\n\n      return layer;\n    }\n\n\n    function fit() {\n\n      if (!root.isConnected) return;\n\n\n      if (moving) {\n\n        animations.forEach(animation => animation.finish());\n\n        return;\n\n      }\n\n\n      const widths = new Map();\n\n\n      layouts = words.map(word => {\n\n        let cursor = 0;\n\n\n        const positions = word.map(letter => {\n\n          if (!widths.has(letter)) {\n\n            measure.textContent = letter;\n\n\n            widths.set(\n              letter,\n              measure.getBoundingClientRect().width \/ 100\n            );\n\n          }\n\n\n          const position = cursor;\n\n\n          cursor +=\n            widths.get(letter) +\n            ESPACIADO;\n\n\n          return position;\n\n        });\n\n\n        return {\n          positions,\n          width: cursor - ESPACIADO\n        };\n\n      });\n\n\n      measure.textContent = '';\n\n\n      const maxWidth = Math.max(\n        ...layouts.map(layout => layout.width)\n      );\n\n\n      const wanted = parseFloat(\n        getComputedStyle(root).fontSize\n      );\n\n\n      \/*\n       * Mantiene el mismo tama\u00f1o durante\n       * todo el ciclo y evita que MEDIA HOUSE,\n       * por ejemplo, se salga del contenedor.\n       *\/\n      size = Math.min(\n        wanted,\n        Math.max(1, root.clientWidth - 24) \/ maxWidth\n      );\n\n\n      stage.style.fontSize = `${size}px`;\n\n      stage.replaceChildren(\n        createWord(current)\n      );\n\n    }\n\n\n    function sync() {\n\n      clearTimeout(timer);\n\n      timer = 0;\n\n\n      const active =\n        visible &&\n        !document.hidden &&\n        !reduced.matches &&\n        root.isConnected;\n\n\n      if (moving) {\n\n        animations.forEach(animation => {\n\n          if (reduced.matches) {\n\n            animation.finish();\n\n          } else if (active) {\n\n            animation.play();\n\n          } else {\n\n            animation.pause();\n\n          }\n\n        });\n\n      } else if (\n        active &&\n        typeof stage.animate === 'function'\n      ) {\n\n        timer = setTimeout(\n          change,\n          PAUSA\n        );\n\n      }\n\n    }\n\n\n    async function change() {\n\n      timer = 0;\n\n\n      if (!root.isConnected || moving) return;\n\n\n      moving = true;\n\n\n      destination =\n        (current + 1) % words.length;\n\n\n      const outgoing =\n        stage.firstElementChild;\n\n\n      const incoming =\n        createWord(destination, 100);\n\n\n      const fullWidth = Math.max(\n        layouts[current].width,\n        layouts[destination].width\n      );\n\n\n      stage.appendChild(incoming);\n\n\n      animations = [];\n\n\n      function animateWord(\n        layer,\n        index,\n        from,\n        to\n      ) {\n\n        Array\n          .from(layer.children)\n          .forEach((letter, i) => {\n\n            \/*\n             * Cascada de IZQUIERDA A DERECHA.\n             *\/\n            const position =\n              layouts[index].positions[i];\n\n\n            const delay =\n              fullWidth > 0\n                ? (position \/ fullWidth) * CASCADA\n                : 0;\n\n\n            animations.push(\n\n              letter.animate(\n\n                [\n                  {\n                    transform:\n                      `translateY(${from}%)`\n                  },\n                  {\n                    transform:\n                      `translateY(${to}%)`\n                  }\n                ],\n\n                {\n                  duration: DURACION,\n                  delay: Math.max(0, delay),\n                  easing: CURVA,\n                  fill: 'both'\n                }\n\n              )\n\n            );\n\n          });\n\n      }\n\n\n      \/* Letras salientes hacia arriba *\/\n      animateWord(\n        outgoing,\n        current,\n        0,\n        -100\n      );\n\n\n      \/* Letras entrantes desde abajo *\/\n      animateWord(\n        incoming,\n        destination,\n        100,\n        0\n      );\n\n\n      await Promise.all(\n        animations.map(\n          animation => animation.finished\n        )\n      );\n\n\n      current = destination;\n\n      moving = false;\n\n\n      animations.forEach(\n        animation => animation.cancel()\n      );\n\n\n      animations = [];\n\n\n      fit();\n\n      sync();\n\n    }\n\n\n    fit();\n\n\n    if ('ResizeObserver' in window) {\n\n      const resize =\n        new ResizeObserver(fit);\n\n      resize.observe(root);\n\n    }\n\n\n    window.addEventListener(\n      'resize',\n      fit,\n      { passive: true }\n    );\n\n\n    document.addEventListener(\n      'visibilitychange',\n      sync\n    );\n\n\n    reduced.addEventListener(\n      'change',\n      sync\n    );\n\n\n    if ('IntersectionObserver' in window) {\n\n      const observer =\n        new IntersectionObserver(entries => {\n\n          visible =\n            entries[0].isIntersecting;\n\n          sync();\n\n        }, {\n          threshold: 0\n        });\n\n\n      observer.observe(root);\n\n    }\n\n\n    if (document.fonts) {\n\n      document.fonts.ready.then(fit);\n\n    }\n\n\n    sync();\n\n  });\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e684013 e-con-full borde-animado e-flex e-con e-child\" data-id=\"e684013\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_blur_effect&quot;:&quot;yes&quot;,&quot;motion_fx_blur_direction&quot;:&quot;out-in-out&quot;,&quot;motion_fx_translateY_effect&quot;:&quot;yes&quot;,&quot;motion_fx_translateY_speed&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:4,&quot;sizes&quot;:[]},&quot;motion_fx_translateY_affectedRange&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:0,&quot;end&quot;:100}},&quot;motion_fx_blur_level&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:7,&quot;sizes&quot;:[]},&quot;motion_fx_blur_range&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:20,&quot;end&quot;:80}},&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;laptop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}\">\n\t\t<div class=\"elementor-element elementor-element-be0d19a e-con-full e-flex e-con e-child\" data-id=\"be0d19a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f17b06c elementor-widget elementor-widget-text-editor\" data-id=\"f17b06c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>BlueLake is a creative media house crafting bold visual stories through film, photography and creative direction<\/p><p>For ambitious brands, artists and projects.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-004ef8a elementor-align-left boton-borde-animado, text-enlace elementor-widget elementor-widget-button\" data-id=\"004ef8a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/bluelake.milanoproduct.com\/about\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"120\" height=\"120\" viewBox=\"0 0 120 120\" fill=\"none\"><mask id=\"path-1-inside-1_9_14\" fill=\"white\"><path d=\"M60 0H120V60H60V0Z\"><\/path><\/mask><path d=\"M120 0H126V-6H120V0ZM60 0V6H120V0V-6H60V0ZM120 0H114V60H120H126V0H120Z\" fill=\"white\" mask=\"url(#path-1-inside-1_9_14)\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Get to Know<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c157079 e-flex e-con-boxed e-con e-parent\" data-id=\"c157079\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-7e7c4b1 borde-animado e-flex e-con-boxed e-con e-child\" data-id=\"7e7c4b1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-ec834c3 e-con-full e-flex e-con e-child\" data-id=\"ec834c3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-faf0e36 text-animation-writting elementor-widget elementor-widget-text-editor\" data-id=\"faf0e36\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Brands and collaborators across film, culture, and design.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9e3b4fa elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"9e3b4fa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><section class=\"lzct-slider\" aria-label=\"Clientes con los que hemos trabajado\" data-speed=\"60\" style=\"--lzct-altura:75px;--lzct-ancho:180px;--lzct-espacio:60px;--lzct-altura-movil:55px;--lzct-ancho-movil:130px;--lzct-espacio-movil:35px;\"><div class=\"lzct-viewport\" id=\"lzct-1\" tabindex=\"0\" role=\"group\" aria-label=\"Logos de clientes\"><div class=\"lzct-track\"><ul class=\"lzct-group\" role=\"list\"><li class=\"lzct-item\"><img width=\"475\" height=\"305\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-45-times-square.png\" class=\"attachment-medium_large size-medium_large\" alt=\"45 Times Square Hotel\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-45-times-square.png 475w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-45-times-square-300x193.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-45-times-square-18x12.png 18w\" sizes=\"(max-width: 475px) 100vw, 475px\" \/><\/li><li class=\"lzct-item\"><img width=\"768\" height=\"187\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altadia-768x187.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Altadia\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altadia-768x187.png 768w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altadia-300x73.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altadia-18x4.png 18w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altadia.png 795w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/li><li class=\"lzct-item\"><img width=\"732\" height=\"266\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altus.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Altus\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altus.png 732w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altus-300x109.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-altus-18x7.png 18w\" sizes=\"(max-width: 732px) 100vw, 732px\" \/><\/li><li class=\"lzct-item\"><img width=\"748\" height=\"284\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-bless.png\" class=\"attachment-medium_large size-medium_large\" alt=\"BLESS Collection Hotels\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-bless.png 748w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-bless-300x114.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-bless-18x7.png 18w\" sizes=\"(max-width: 748px) 100vw, 748px\" \/><\/li><li class=\"lzct-item\"><img width=\"528\" height=\"259\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-coldfrank.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Coldfrank\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-coldfrank.png 528w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-coldfrank-300x147.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-coldfrank-18x9.png 18w\" sizes=\"(max-width: 528px) 100vw, 528px\" \/><\/li><li class=\"lzct-item\"><img width=\"564\" height=\"257\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-dusit.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Dusit Hotels &amp; Resorts\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-dusit.png 564w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-dusit-300x137.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-dusit-18x8.png 18w\" sizes=\"(max-width: 564px) 100vw, 564px\" \/><\/li><li class=\"lzct-item\"><img width=\"558\" height=\"339\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-estimar.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Estimar Hotels\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-estimar.png 558w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-estimar-300x182.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-estimar-18x12.png 18w\" sizes=\"(max-width: 558px) 100vw, 558px\" \/><\/li><li class=\"lzct-item\"><img width=\"418\" height=\"259\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-ghd.png\" class=\"attachment-medium_large size-medium_large\" alt=\"ghd\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-ghd.png 418w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-ghd-300x186.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-ghd-18x12.png 18w\" sizes=\"(max-width: 418px) 100vw, 418px\" \/><\/li><li class=\"lzct-item\"><img width=\"741\" height=\"141\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-google-cloud.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Google Cloud\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-google-cloud.png 741w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-google-cloud-300x57.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-google-cloud-18x3.png 18w\" sizes=\"(max-width: 741px) 100vw, 741px\" \/><\/li><li class=\"lzct-item\"><img width=\"741\" height=\"297\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-herbert-smith-freehills.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Herbert Smith Freehills\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-herbert-smith-freehills.png 741w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-herbert-smith-freehills-300x120.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-herbert-smith-freehills-18x7.png 18w\" sizes=\"(max-width: 741px) 100vw, 741px\" \/><\/li><li class=\"lzct-item\"><img width=\"766\" height=\"118\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jaecoo.png\" class=\"attachment-medium_large size-medium_large\" alt=\"JAECOO\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jaecoo.png 766w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jaecoo-300x46.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jaecoo-18x3.png 18w\" sizes=\"(max-width: 766px) 100vw, 766px\" \/><\/li><li class=\"lzct-item\"><img width=\"768\" height=\"438\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jbl-768x438.png\" class=\"attachment-medium_large size-medium_large\" alt=\"JBL\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jbl-768x438.png 768w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jbl-300x171.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jbl-18x10.png 18w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-jbl.png 904w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/li><li class=\"lzct-item\"><img width=\"768\" height=\"110\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mercadona-768x110.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Mercadona\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mercadona-768x110.png 768w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mercadona-300x43.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mercadona-1024x147.png 1024w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mercadona-18x3.png 18w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mercadona.png 1365w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/li><li class=\"lzct-item\"><img width=\"768\" height=\"246\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mezlan-768x246.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Mezlan\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mezlan-768x246.png 768w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mezlan-300x96.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mezlan-1024x328.png 1024w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mezlan-18x6.png 18w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-mezlan.png 1200w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/li><li class=\"lzct-item\"><img width=\"697\" height=\"246\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-onlyyou.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Only YOU Hotels\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-onlyyou.png 697w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-onlyyou-300x106.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-onlyyou-18x6.png 18w\" sizes=\"(max-width: 697px) 100vw, 697px\" \/><\/li><li class=\"lzct-item\"><img width=\"768\" height=\"221\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-palladium-768x221.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Palladium Hotel Group\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-palladium-768x221.png 768w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-palladium-300x86.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-palladium-18x5.png 18w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-palladium.png 787w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/li><li class=\"lzct-item\"><img width=\"700\" height=\"314\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-scalpers.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Scalpers\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-scalpers.png 700w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-scalpers-300x135.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-scalpers-18x8.png 18w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/li><li class=\"lzct-item\"><img width=\"694\" height=\"362\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-shangri-la.png\" class=\"attachment-medium_large size-medium_large\" alt=\"Shangri-La\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-shangri-la.png 694w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-shangri-la-300x156.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-shangri-la-18x9.png 18w\" sizes=\"(max-width: 694px) 100vw, 694px\" \/><\/li><li class=\"lzct-item\"><img width=\"573\" height=\"200\" src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-strive-white.png\" class=\"attachment-medium_large size-medium_large\" alt=\"strive+\" loading=\"eager\" decoding=\"async\" draggable=\"false\" srcset=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-strive-white.png 573w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-strive-white-300x105.png 300w, https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/logo-strive-white-18x6.png 18w\" sizes=\"(max-width: 573px) 100vw, 573px\" \/><\/li><\/ul><\/div><\/div><\/section><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-b2f7613 e-flex e-con-boxed e-con e-parent\" data-id=\"b2f7613\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7441e98 text-animation-write elementor-widget elementor-widget-heading\" data-id=\"7441e98\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;laptop&quot;,&quot;tablet&quot;]}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Featured<br><b>Works<\/b><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5d27b48 elementor-widget-mobile__width-inherit elementor-grid-3 elementor-grid-tablet-2 elementor-grid-mobile-1 elementor-widget elementor-widget-loop-grid\" data-id=\"5d27b48\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;template_id&quot;:&quot;819&quot;,&quot;row_gap&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;row_gap_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]},&quot;_skin&quot;:&quot;post&quot;,&quot;columns&quot;:&quot;3&quot;,&quot;columns_tablet&quot;:&quot;2&quot;,&quot;columns_mobile&quot;:&quot;1&quot;,&quot;edit_handle_selector&quot;:&quot;[data-elementor-type=\\&quot;loop-item\\&quot;]&quot;,&quot;row_gap_laptop&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;row_gap_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"loop-grid.post\">\n\t\t\t\t\t\t\t<div class=\"elementor-loop-container elementor-grid\">\n\t\t<style id=\"loop-dynamic-819\">.e-loop-item-1472 .elementor-element.elementor-element-c1f2f89:not(.elementor-motion-effects-element-type-background), .e-loop-item-1472 .elementor-element.elementor-element-c1f2f89 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-ALTADIA-6-SEC.jpg\");}<\/style><style id=\"loop-819\">.elementor-819 .elementor-element.elementor-element-4fc6e6c{--display:flex;--gap:0px 0px;--row-gap:0px;--column-gap:0px;--overlay-opacity:0.5;--margin-top:0px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;--padding-top:0px;--padding-bottom:0px;--padding-left:0px;--padding-right:0px;}.elementor-819 .elementor-element.elementor-element-4fc6e6c::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c > .elementor-background-video-container::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c > .e-con-inner > .elementor-background-video-container::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c > .elementor-background-slideshow::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c > .e-con-inner > .elementor-background-slideshow::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c > .elementor-motion-effects-container > .elementor-motion-effects-layer::before{--background-overlay:'';}.elementor-819 .elementor-element.elementor-element-4fc6e6c:hover::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c:hover > .elementor-background-video-container::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c:hover > .e-con-inner > .elementor-background-video-container::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c > .elementor-background-slideshow:hover::before, .elementor-819 .elementor-element.elementor-element-4fc6e6c > .e-con-inner > .elementor-background-slideshow:hover::before{--background-overlay:'';}.elementor-819 .elementor-element.elementor-element-4fc6e6c:hover{--overlay-opacity:0.5;}.elementor-819 .elementor-element.elementor-element-3cd0915{--display:flex;--flex-direction:row;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--flex-wrap-mobile:wrap;--justify-content:flex-start;--align-items:center;--gap:10px 10px;--row-gap:10px;--column-gap:10px;--overlay-opacity:0.5;--margin-top:0px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;--padding-top:0px;--padding-bottom:0px;--padding-left:0px;--padding-right:0px;}.elementor-819 .elementor-element.elementor-element-3cd0915::before, .elementor-819 .elementor-element.elementor-element-3cd0915 > .elementor-background-video-container::before, .elementor-819 .elementor-element.elementor-element-3cd0915 > .e-con-inner > .elementor-background-video-container::before, .elementor-819 .elementor-element.elementor-element-3cd0915 > .elementor-background-slideshow::before, .elementor-819 .elementor-element.elementor-element-3cd0915 > .e-con-inner > .elementor-background-slideshow::before, .elementor-819 .elementor-element.elementor-element-3cd0915 > .elementor-motion-effects-container > .elementor-motion-effects-layer::before{--background-overlay:'';}.elementor-819 .elementor-element.elementor-element-3cd0915:hover::before, .elementor-819 .elementor-element.elementor-element-3cd0915:hover > .elementor-background-video-container::before, .elementor-819 .elementor-element.elementor-element-3cd0915:hover > .e-con-inner > .elementor-background-video-container::before, .elementor-819 .elementor-element.elementor-element-3cd0915 > .elementor-background-slideshow:hover::before, .elementor-819 .elementor-element.elementor-element-3cd0915 > .e-con-inner > .elementor-background-slideshow:hover::before{--background-overlay:'';}.elementor-819 .elementor-element.elementor-element-3cd0915:hover{--overlay-opacity:0.5;}.elementor-widget-heading .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-weight:var( --e-global-typography-primary-font-weight );color:var( --e-global-color-primary );}.elementor-819 .elementor-element.elementor-element-ad50968 .elementor-heading-title{font-family:\"Inter Tight\", Sans-serif;font-size:20px;font-weight:600;letter-spacing:-0.7px;color:var( --e-global-color-accent );}.elementor-819 .elementor-element.elementor-element-9b7055f .elementor-heading-title{font-family:\"Inter Tight\", Sans-serif;font-size:18px;font-weight:500;letter-spacing:-0.5px;color:#15284D5C;}.elementor-819 .elementor-element.elementor-element-c1f2f89{--display:flex;--min-height:300px;--border-radius:0px 0px 0px 0px;--margin-top:0px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;--padding-top:0px;--padding-bottom:0px;--padding-left:0px;--padding-right:0px;}.elementor-819 .elementor-element.elementor-element-c1f2f89:not(.elementor-motion-effects-element-type-background), .elementor-819 .elementor-element.elementor-element-c1f2f89 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-position:center center;background-repeat:no-repeat;background-size:cover;}@media(min-width:768px){.elementor-819 .elementor-element.elementor-element-c1f2f89{--content-width:100%;}}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"819\" class=\"elementor elementor-819 e-loop-item e-loop-item-1472 post-1472 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-altadia\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-4fc6e6c e-con-full contenedor-hover e-flex e-con e-child\" data-id=\"4fc6e6c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-3cd0915 e-con-full contenedor-hover-info e-flex e-con e-child\" data-id=\"3cd0915\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ad50968 elementor-widget elementor-widget-heading\" data-id=\"ad50968\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Future Talent<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b7055f elementor-widget elementor-widget-heading\" data-id=\"9b7055f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>Altadia<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c1f2f89 video-pro e-flex e-con-boxed e-con e-child\" data-id=\"c1f2f89\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e046f62 elementor-widget elementor-widget-html\" data-id=\"e046f62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\n\/* =====================================================\n   TARJETA\n===================================================== *\/\n\n.contenedor-hover {\n    position: relative !important;\n\n    width: 100% !important;\n    aspect-ratio: 16 \/ 9 !important;\n\n    \/*\n     * Necesario para que la info pueda\n     * aparecer por encima.\n     *\/\n    overflow: visible !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n}\n\n\n\/* =====================================================\n   SHORTCODE\n===================================================== *\/\n\n.contenedor-hover .elementor-widget-shortcode {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    z-index: 5 !important;\n\n    overflow: hidden !important;\n\n    pointer-events: none !important;\n}\n\n.contenedor-hover\n.elementor-widget-shortcode\n> .elementor-widget-container,\n\n.contenedor-hover\n.elementor-shortcode {\n\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    overflow: hidden !important;\n}\n\n\n\/* =====================================================\n   CAPA YOUTUBE\n===================================================== *\/\n\n.lz-hover-video {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    overflow: hidden !important;\n\n    opacity: 0;\n    visibility: hidden;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s linear 0.15s;\n}\n\n\n\/* Mostrar v\u00eddeo *\/\n.contenedor-hover.lz-video-activo\n.lz-hover-video {\n\n    opacity: 1;\n    visibility: visible;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s;\n}\n\n\n\/* =====================================================\n   IFRAME\n===================================================== *\/\n\n.lz-hover-video iframe {\n    position: absolute !important;\n\n    top: 50% !important;\n    left: 50% !important;\n\n    \/*\n     * Overscan como background video.\n     *\n     * Recorta t\u00edtulo\/avatar\/logo situados\n     * en las zonas exteriores.\n     *\/\n    width: 135% !important;\n    height: 135% !important;\n\n    min-width: 135% !important;\n    min-height: 135% !important;\n\n    max-width: none !important;\n\n    transform:\n        translate(-50%, -50%) !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n\n    \/*\n     * YouTube jam\u00e1s recibe hover\/click.\n     *\/\n    pointer-events: none !important;\n}\n\n\n\/* =====================================================\n   INFO ARRIBA\n===================================================== *\/\n\n.contenedor-hover .contenedor-hover-info {\n\n    position: absolute !important;\n\n    left: 0 !important;\n\n    \/*\n     * Arriba de la imagen\/v\u00eddeo.\n     *\/\n    bottom: calc(100% + 12px) !important;\n\n    width: 100% !important;\n\n    z-index: 50 !important;\n\n    opacity: 0 !important;\n    visibility: hidden !important;\n\n    \/*\n     * Entra desde abajo.\n     *\/\n    transform: translateY(18px) !important;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s linear 0.5s !important;\n}\n\n\n\/* Info visible *\/\n.contenedor-hover:hover\n.contenedor-hover-info {\n\n    opacity: 1 !important;\n    visibility: visible !important;\n\n    transform: translateY(0) !important;\n\n    pointer-events: auto !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s !important;\n}\n\n\n\/* =====================================================\n   SIN REDONDEOS\n===================================================== *\/\n\n.contenedor-hover,\n.lz-hover-video,\n.lz-hover-video iframe {\n\n    border-radius: 0 !important;\n}\n\n\n\/* V\u00eddeo alojado (MP4) en el hover *\/\n.lz-hover-video video {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    object-fit: cover !important;\n    border: 0 !important;\n    border-radius: 0 !important;\n    pointer-events: none !important;\n}\n<\/style>\n\n\n<script>\n\/*\n * HOVER V\u00cdDEO YOUTUBE (Featured Works)\n * - El iframe se crea en el primer hover y se reutiliza (pausa\/play), no se recarga.\n * - Solo se muestra cuando YouTube confirma que est\u00e1 REPRODUCIENDO:\n *   nunca se ve spinner, bot\u00f3n play ni t\u00edtulo.\n * - Desactivado en dispositivos sin hover (t\u00e1ctil).\n *\/\n(() => {\n  'use strict';\n  if (window.__lzYoutubeHoverV2) return;\n  window.__lzYoutubeHoverV2 = true;\n\n  if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;\n\n  ['https:\/\/www.youtube-nocookie.com', 'https:\/\/www.youtube.com', 'https:\/\/i.ytimg.com'].forEach((h) => {\n    const l = document.createElement('link');\n    l.rel = 'preconnect'; l.href = h; l.crossOrigin = '';\n    document.head.appendChild(l);\n  });\n\n  const players = new Map(); \/\/ contentWindow -> estado de la tarjeta\n  let uid = 0;\n\n  window.addEventListener('message', (e) => {\n    if (!\/^https:\\\/\\\/(www\\.)?youtube(-nocookie)?\\.com$\/.test(e.origin)) return;\n    const p = players.get(e.source);\n    if (!p) return;\n    let d = e.data;\n    if (typeof d === 'string') { try { d = JSON.parse(d); } catch (err) { return; } }\n    if (!d) return;\n    let state = null;\n    if (d.event === 'onStateChange') state = d.info;\n    if (d.event === 'infoDelivery' && d.info && typeof d.info.playerState === 'number') state = d.info.playerState;\n    if (state === null) return;\n    p.playing = state === 1;\n    if (p.playing && p.dentro) p.mostrar();\n  });\n\n  function preparar(card) {\n    if (card.dataset.lzV2Ready === '1') return;\n    const capa = card.querySelector('.lz-hover-video');\n    if (capa && capa.dataset.videoSrc) { prepararMp4(card, capa); return; }\n    if (!capa || !capa.dataset.youtubeId) return;\n    card.dataset.lzV2Ready = '1';\n\n    const videoId = capa.dataset.youtubeId;\n    const p = { dentro: false, playing: false, iframe: null, listo: false, timer: null };\n\n    function cmd(func, args) {\n      if (!p.iframe || !p.iframe.contentWindow) return;\n      p.iframe.contentWindow.postMessage(JSON.stringify({ event: 'command', func: func, args: args || [], id: p.id, channel: 'widget' }), '*');\n    }\n\n    p.mostrar = () => {\n      clearTimeout(p.timer);\n      \/\/ margen m\u00ednimo para que YouTube retire cualquier overlay de arranque\n      p.timer = setTimeout(() => { if (p.dentro && p.playing) card.classList.add('lz-video-activo'); }, 200);\n    };\n\n    function crear() {\n      p.id = 'lzyt' + (++uid);\n      const f = document.createElement('iframe');\n      f.src = 'https:\/\/www.youtube-nocookie.com\/embed\/' + videoId +\n        '?autoplay=1&mute=1&controls=0&disablekb=1&fs=0&playsinline=1&rel=0&iv_load_policy=3&modestbranding=1' +\n        '&loop=1&playlist=' + videoId + '&enablejsapi=1&origin=' + encodeURIComponent(location.origin);\n      f.setAttribute('allow', 'autoplay; encrypted-media');\n      f.setAttribute('tabindex', '-1');\n      f.setAttribute('aria-hidden', 'true');\n      f.setAttribute('title', '');\n      f.addEventListener('load', () => {\n        players.set(f.contentWindow, p);\n        p.listo = true;\n        f.contentWindow.postMessage(JSON.stringify({ event: 'listening', id: p.id, channel: 'widget' }), '*');\n        cmd('addEventListener', ['onStateChange']);\n        cmd('mute');\n        if (p.dentro) cmd('playVideo'); else cmd('pauseVideo');\n      }, { once: true });\n      p.iframe = f;\n      capa.appendChild(f);\n    }\n\n    card.addEventListener('mouseenter', () => {\n      p.dentro = true;\n      if (!p.iframe) { crear(); return; }\n      if (p.listo) { cmd('seekTo', [0, true]); cmd('playVideo'); }\n      if (p.playing) p.mostrar();\n    });\n\n    card.addEventListener('mouseleave', () => {\n      p.dentro = false;\n      clearTimeout(p.timer);\n      card.classList.remove('lz-video-activo');\n      p.playing = false;\n      cmd('pauseVideo');\n    });\n  }\n\n  \/* V\u00eddeo alojado en la web (MP4\/WebM): mismo comportamiento que YouTube *\/\n  function prepararMp4(card, capa) {\n    card.dataset.lzV2Ready = '1';\n    let v = null, dentro = false;\n    function crear() {\n      v = document.createElement('video');\n      v.src = capa.dataset.videoSrc;\n      v.muted = true; v.loop = true; v.playsInline = true;\n      v.setAttribute('muted', ''); v.setAttribute('playsinline', '');\n      v.preload = 'metadata';\n      v.setAttribute('aria-hidden', 'true');\n      v.addEventListener('playing', () => { if (dentro) card.classList.add('lz-video-activo'); });\n      capa.appendChild(v);\n    }\n    card.addEventListener('mouseenter', () => {\n      dentro = true;\n      if (!v) crear();\n      const p = v.play(); if (p && p.catch) p.catch(() => {});\n    });\n    card.addEventListener('mouseleave', () => {\n      dentro = false;\n      card.classList.remove('lz-video-activo');\n      if (v) { v.pause(); try { v.currentTime = 0; } catch (e) {} }\n    });\n  }\n\n  function iniciar() { document.querySelectorAll('.contenedor-hover').forEach(preparar); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar, { once: true });\n  else iniciar();\n\n  new MutationObserver(() => {\n    document.querySelectorAll('.contenedor-hover:not([data-lz-v2-ready=\"1\"])').forEach(preparar);\n  }).observe(document.body, { childList: true, subtree: true });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0474ca2 elementor-widget elementor-widget-shortcode\" data-id=\"0474ca2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n        <div\n            class=\"lz-hover-video\"\n            data-video-src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/ALTADIA-6-SEC.mp4\"\n            aria-hidden=\"true\">\n        <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4db4f57 bl-card-extra elementor-widget elementor-widget-shortcode\" data-id=\"4db4f57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><span class=\"bl-card-data\" hidden data-type=\"yt\" data-vid=\"edHPMV2vFII\" data-src=\"\" data-title=\"Future Talent\"><\/span><a class=\"bl-card-link\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/future-talent\/\">[ View project ]<\/a><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<style id=\"loop-dynamic-819\">.e-loop-item-1471 .elementor-element.elementor-element-c1f2f89:not(.elementor-motion-effects-element-type-background), .e-loop-item-1471 .elementor-element.elementor-element-c1f2f89 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-COLDFRANK-6-SEC.jpg\");}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"819\" class=\"elementor elementor-819 e-loop-item e-loop-item-1471 post-1471 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-coldfrank\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-4fc6e6c e-con-full contenedor-hover e-flex e-con e-child\" data-id=\"4fc6e6c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-3cd0915 e-con-full contenedor-hover-info e-flex e-con e-child\" data-id=\"3cd0915\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ad50968 elementor-widget elementor-widget-heading\" data-id=\"ad50968\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Outrun your limits<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b7055f elementor-widget elementor-widget-heading\" data-id=\"9b7055f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>Coldfrank<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c1f2f89 video-pro e-flex e-con-boxed e-con e-child\" data-id=\"c1f2f89\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e046f62 elementor-widget elementor-widget-html\" data-id=\"e046f62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\n\/* =====================================================\n   TARJETA\n===================================================== *\/\n\n.contenedor-hover {\n    position: relative !important;\n\n    width: 100% !important;\n    aspect-ratio: 16 \/ 9 !important;\n\n    \/*\n     * Necesario para que la info pueda\n     * aparecer por encima.\n     *\/\n    overflow: visible !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n}\n\n\n\/* =====================================================\n   SHORTCODE\n===================================================== *\/\n\n.contenedor-hover .elementor-widget-shortcode {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    z-index: 5 !important;\n\n    overflow: hidden !important;\n\n    pointer-events: none !important;\n}\n\n.contenedor-hover\n.elementor-widget-shortcode\n> .elementor-widget-container,\n\n.contenedor-hover\n.elementor-shortcode {\n\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    overflow: hidden !important;\n}\n\n\n\/* =====================================================\n   CAPA YOUTUBE\n===================================================== *\/\n\n.lz-hover-video {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    overflow: hidden !important;\n\n    opacity: 0;\n    visibility: hidden;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s linear 0.15s;\n}\n\n\n\/* Mostrar v\u00eddeo *\/\n.contenedor-hover.lz-video-activo\n.lz-hover-video {\n\n    opacity: 1;\n    visibility: visible;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s;\n}\n\n\n\/* =====================================================\n   IFRAME\n===================================================== *\/\n\n.lz-hover-video iframe {\n    position: absolute !important;\n\n    top: 50% !important;\n    left: 50% !important;\n\n    \/*\n     * Overscan como background video.\n     *\n     * Recorta t\u00edtulo\/avatar\/logo situados\n     * en las zonas exteriores.\n     *\/\n    width: 135% !important;\n    height: 135% !important;\n\n    min-width: 135% !important;\n    min-height: 135% !important;\n\n    max-width: none !important;\n\n    transform:\n        translate(-50%, -50%) !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n\n    \/*\n     * YouTube jam\u00e1s recibe hover\/click.\n     *\/\n    pointer-events: none !important;\n}\n\n\n\/* =====================================================\n   INFO ARRIBA\n===================================================== *\/\n\n.contenedor-hover .contenedor-hover-info {\n\n    position: absolute !important;\n\n    left: 0 !important;\n\n    \/*\n     * Arriba de la imagen\/v\u00eddeo.\n     *\/\n    bottom: calc(100% + 12px) !important;\n\n    width: 100% !important;\n\n    z-index: 50 !important;\n\n    opacity: 0 !important;\n    visibility: hidden !important;\n\n    \/*\n     * Entra desde abajo.\n     *\/\n    transform: translateY(18px) !important;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s linear 0.5s !important;\n}\n\n\n\/* Info visible *\/\n.contenedor-hover:hover\n.contenedor-hover-info {\n\n    opacity: 1 !important;\n    visibility: visible !important;\n\n    transform: translateY(0) !important;\n\n    pointer-events: auto !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s !important;\n}\n\n\n\/* =====================================================\n   SIN REDONDEOS\n===================================================== *\/\n\n.contenedor-hover,\n.lz-hover-video,\n.lz-hover-video iframe {\n\n    border-radius: 0 !important;\n}\n\n\n\/* V\u00eddeo alojado (MP4) en el hover *\/\n.lz-hover-video video {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    object-fit: cover !important;\n    border: 0 !important;\n    border-radius: 0 !important;\n    pointer-events: none !important;\n}\n<\/style>\n\n\n<script>\n\/*\n * HOVER V\u00cdDEO YOUTUBE (Featured Works)\n * - El iframe se crea en el primer hover y se reutiliza (pausa\/play), no se recarga.\n * - Solo se muestra cuando YouTube confirma que est\u00e1 REPRODUCIENDO:\n *   nunca se ve spinner, bot\u00f3n play ni t\u00edtulo.\n * - Desactivado en dispositivos sin hover (t\u00e1ctil).\n *\/\n(() => {\n  'use strict';\n  if (window.__lzYoutubeHoverV2) return;\n  window.__lzYoutubeHoverV2 = true;\n\n  if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;\n\n  ['https:\/\/www.youtube-nocookie.com', 'https:\/\/www.youtube.com', 'https:\/\/i.ytimg.com'].forEach((h) => {\n    const l = document.createElement('link');\n    l.rel = 'preconnect'; l.href = h; l.crossOrigin = '';\n    document.head.appendChild(l);\n  });\n\n  const players = new Map(); \/\/ contentWindow -> estado de la tarjeta\n  let uid = 0;\n\n  window.addEventListener('message', (e) => {\n    if (!\/^https:\\\/\\\/(www\\.)?youtube(-nocookie)?\\.com$\/.test(e.origin)) return;\n    const p = players.get(e.source);\n    if (!p) return;\n    let d = e.data;\n    if (typeof d === 'string') { try { d = JSON.parse(d); } catch (err) { return; } }\n    if (!d) return;\n    let state = null;\n    if (d.event === 'onStateChange') state = d.info;\n    if (d.event === 'infoDelivery' && d.info && typeof d.info.playerState === 'number') state = d.info.playerState;\n    if (state === null) return;\n    p.playing = state === 1;\n    if (p.playing && p.dentro) p.mostrar();\n  });\n\n  function preparar(card) {\n    if (card.dataset.lzV2Ready === '1') return;\n    const capa = card.querySelector('.lz-hover-video');\n    if (capa && capa.dataset.videoSrc) { prepararMp4(card, capa); return; }\n    if (!capa || !capa.dataset.youtubeId) return;\n    card.dataset.lzV2Ready = '1';\n\n    const videoId = capa.dataset.youtubeId;\n    const p = { dentro: false, playing: false, iframe: null, listo: false, timer: null };\n\n    function cmd(func, args) {\n      if (!p.iframe || !p.iframe.contentWindow) return;\n      p.iframe.contentWindow.postMessage(JSON.stringify({ event: 'command', func: func, args: args || [], id: p.id, channel: 'widget' }), '*');\n    }\n\n    p.mostrar = () => {\n      clearTimeout(p.timer);\n      \/\/ margen m\u00ednimo para que YouTube retire cualquier overlay de arranque\n      p.timer = setTimeout(() => { if (p.dentro && p.playing) card.classList.add('lz-video-activo'); }, 200);\n    };\n\n    function crear() {\n      p.id = 'lzyt' + (++uid);\n      const f = document.createElement('iframe');\n      f.src = 'https:\/\/www.youtube-nocookie.com\/embed\/' + videoId +\n        '?autoplay=1&mute=1&controls=0&disablekb=1&fs=0&playsinline=1&rel=0&iv_load_policy=3&modestbranding=1' +\n        '&loop=1&playlist=' + videoId + '&enablejsapi=1&origin=' + encodeURIComponent(location.origin);\n      f.setAttribute('allow', 'autoplay; encrypted-media');\n      f.setAttribute('tabindex', '-1');\n      f.setAttribute('aria-hidden', 'true');\n      f.setAttribute('title', '');\n      f.addEventListener('load', () => {\n        players.set(f.contentWindow, p);\n        p.listo = true;\n        f.contentWindow.postMessage(JSON.stringify({ event: 'listening', id: p.id, channel: 'widget' }), '*');\n        cmd('addEventListener', ['onStateChange']);\n        cmd('mute');\n        if (p.dentro) cmd('playVideo'); else cmd('pauseVideo');\n      }, { once: true });\n      p.iframe = f;\n      capa.appendChild(f);\n    }\n\n    card.addEventListener('mouseenter', () => {\n      p.dentro = true;\n      if (!p.iframe) { crear(); return; }\n      if (p.listo) { cmd('seekTo', [0, true]); cmd('playVideo'); }\n      if (p.playing) p.mostrar();\n    });\n\n    card.addEventListener('mouseleave', () => {\n      p.dentro = false;\n      clearTimeout(p.timer);\n      card.classList.remove('lz-video-activo');\n      p.playing = false;\n      cmd('pauseVideo');\n    });\n  }\n\n  \/* V\u00eddeo alojado en la web (MP4\/WebM): mismo comportamiento que YouTube *\/\n  function prepararMp4(card, capa) {\n    card.dataset.lzV2Ready = '1';\n    let v = null, dentro = false;\n    function crear() {\n      v = document.createElement('video');\n      v.src = capa.dataset.videoSrc;\n      v.muted = true; v.loop = true; v.playsInline = true;\n      v.setAttribute('muted', ''); v.setAttribute('playsinline', '');\n      v.preload = 'metadata';\n      v.setAttribute('aria-hidden', 'true');\n      v.addEventListener('playing', () => { if (dentro) card.classList.add('lz-video-activo'); });\n      capa.appendChild(v);\n    }\n    card.addEventListener('mouseenter', () => {\n      dentro = true;\n      if (!v) crear();\n      const p = v.play(); if (p && p.catch) p.catch(() => {});\n    });\n    card.addEventListener('mouseleave', () => {\n      dentro = false;\n      card.classList.remove('lz-video-activo');\n      if (v) { v.pause(); try { v.currentTime = 0; } catch (e) {} }\n    });\n  }\n\n  function iniciar() { document.querySelectorAll('.contenedor-hover').forEach(preparar); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar, { once: true });\n  else iniciar();\n\n  new MutationObserver(() => {\n    document.querySelectorAll('.contenedor-hover:not([data-lz-v2-ready=\"1\"])').forEach(preparar);\n  }).observe(document.body, { childList: true, subtree: true });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0474ca2 elementor-widget elementor-widget-shortcode\" data-id=\"0474ca2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n        <div\n            class=\"lz-hover-video\"\n            data-video-src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/COLDFRANK-6-SEC.mp4\"\n            aria-hidden=\"true\">\n        <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4db4f57 bl-card-extra elementor-widget elementor-widget-shortcode\" data-id=\"4db4f57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><span class=\"bl-card-data\" hidden data-type=\"yt\" data-vid=\"TKIfGHTle_w\" data-src=\"\" data-title=\"Outrun your limits\"><\/span><a class=\"bl-card-link\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/outrun-your-limits\/\">[ View project ]<\/a><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<style id=\"loop-dynamic-819\">.e-loop-item-1470 .elementor-element.elementor-element-c1f2f89:not(.elementor-motion-effects-element-type-background), .e-loop-item-1470 .elementor-element.elementor-element-c1f2f89 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-JAECOO7-6-SEC.jpg\");}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"819\" class=\"elementor elementor-819 e-loop-item e-loop-item-1470 post-1470 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-jaecoo\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-4fc6e6c e-con-full contenedor-hover e-flex e-con e-child\" data-id=\"4fc6e6c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-3cd0915 e-con-full contenedor-hover-info e-flex e-con e-child\" data-id=\"3cd0915\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ad50968 elementor-widget elementor-widget-heading\" data-id=\"ad50968\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">New JAECOO 7<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b7055f elementor-widget elementor-widget-heading\" data-id=\"9b7055f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>JAECOO<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c1f2f89 video-pro e-flex e-con-boxed e-con e-child\" data-id=\"c1f2f89\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e046f62 elementor-widget elementor-widget-html\" data-id=\"e046f62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\n\/* =====================================================\n   TARJETA\n===================================================== *\/\n\n.contenedor-hover {\n    position: relative !important;\n\n    width: 100% !important;\n    aspect-ratio: 16 \/ 9 !important;\n\n    \/*\n     * Necesario para que la info pueda\n     * aparecer por encima.\n     *\/\n    overflow: visible !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n}\n\n\n\/* =====================================================\n   SHORTCODE\n===================================================== *\/\n\n.contenedor-hover .elementor-widget-shortcode {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    z-index: 5 !important;\n\n    overflow: hidden !important;\n\n    pointer-events: none !important;\n}\n\n.contenedor-hover\n.elementor-widget-shortcode\n> .elementor-widget-container,\n\n.contenedor-hover\n.elementor-shortcode {\n\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    overflow: hidden !important;\n}\n\n\n\/* =====================================================\n   CAPA YOUTUBE\n===================================================== *\/\n\n.lz-hover-video {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    overflow: hidden !important;\n\n    opacity: 0;\n    visibility: hidden;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s linear 0.15s;\n}\n\n\n\/* Mostrar v\u00eddeo *\/\n.contenedor-hover.lz-video-activo\n.lz-hover-video {\n\n    opacity: 1;\n    visibility: visible;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s;\n}\n\n\n\/* =====================================================\n   IFRAME\n===================================================== *\/\n\n.lz-hover-video iframe {\n    position: absolute !important;\n\n    top: 50% !important;\n    left: 50% !important;\n\n    \/*\n     * Overscan como background video.\n     *\n     * Recorta t\u00edtulo\/avatar\/logo situados\n     * en las zonas exteriores.\n     *\/\n    width: 135% !important;\n    height: 135% !important;\n\n    min-width: 135% !important;\n    min-height: 135% !important;\n\n    max-width: none !important;\n\n    transform:\n        translate(-50%, -50%) !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n\n    \/*\n     * YouTube jam\u00e1s recibe hover\/click.\n     *\/\n    pointer-events: none !important;\n}\n\n\n\/* =====================================================\n   INFO ARRIBA\n===================================================== *\/\n\n.contenedor-hover .contenedor-hover-info {\n\n    position: absolute !important;\n\n    left: 0 !important;\n\n    \/*\n     * Arriba de la imagen\/v\u00eddeo.\n     *\/\n    bottom: calc(100% + 12px) !important;\n\n    width: 100% !important;\n\n    z-index: 50 !important;\n\n    opacity: 0 !important;\n    visibility: hidden !important;\n\n    \/*\n     * Entra desde abajo.\n     *\/\n    transform: translateY(18px) !important;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s linear 0.5s !important;\n}\n\n\n\/* Info visible *\/\n.contenedor-hover:hover\n.contenedor-hover-info {\n\n    opacity: 1 !important;\n    visibility: visible !important;\n\n    transform: translateY(0) !important;\n\n    pointer-events: auto !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s !important;\n}\n\n\n\/* =====================================================\n   SIN REDONDEOS\n===================================================== *\/\n\n.contenedor-hover,\n.lz-hover-video,\n.lz-hover-video iframe {\n\n    border-radius: 0 !important;\n}\n\n\n\/* V\u00eddeo alojado (MP4) en el hover *\/\n.lz-hover-video video {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    object-fit: cover !important;\n    border: 0 !important;\n    border-radius: 0 !important;\n    pointer-events: none !important;\n}\n<\/style>\n\n\n<script>\n\/*\n * HOVER V\u00cdDEO YOUTUBE (Featured Works)\n * - El iframe se crea en el primer hover y se reutiliza (pausa\/play), no se recarga.\n * - Solo se muestra cuando YouTube confirma que est\u00e1 REPRODUCIENDO:\n *   nunca se ve spinner, bot\u00f3n play ni t\u00edtulo.\n * - Desactivado en dispositivos sin hover (t\u00e1ctil).\n *\/\n(() => {\n  'use strict';\n  if (window.__lzYoutubeHoverV2) return;\n  window.__lzYoutubeHoverV2 = true;\n\n  if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;\n\n  ['https:\/\/www.youtube-nocookie.com', 'https:\/\/www.youtube.com', 'https:\/\/i.ytimg.com'].forEach((h) => {\n    const l = document.createElement('link');\n    l.rel = 'preconnect'; l.href = h; l.crossOrigin = '';\n    document.head.appendChild(l);\n  });\n\n  const players = new Map(); \/\/ contentWindow -> estado de la tarjeta\n  let uid = 0;\n\n  window.addEventListener('message', (e) => {\n    if (!\/^https:\\\/\\\/(www\\.)?youtube(-nocookie)?\\.com$\/.test(e.origin)) return;\n    const p = players.get(e.source);\n    if (!p) return;\n    let d = e.data;\n    if (typeof d === 'string') { try { d = JSON.parse(d); } catch (err) { return; } }\n    if (!d) return;\n    let state = null;\n    if (d.event === 'onStateChange') state = d.info;\n    if (d.event === 'infoDelivery' && d.info && typeof d.info.playerState === 'number') state = d.info.playerState;\n    if (state === null) return;\n    p.playing = state === 1;\n    if (p.playing && p.dentro) p.mostrar();\n  });\n\n  function preparar(card) {\n    if (card.dataset.lzV2Ready === '1') return;\n    const capa = card.querySelector('.lz-hover-video');\n    if (capa && capa.dataset.videoSrc) { prepararMp4(card, capa); return; }\n    if (!capa || !capa.dataset.youtubeId) return;\n    card.dataset.lzV2Ready = '1';\n\n    const videoId = capa.dataset.youtubeId;\n    const p = { dentro: false, playing: false, iframe: null, listo: false, timer: null };\n\n    function cmd(func, args) {\n      if (!p.iframe || !p.iframe.contentWindow) return;\n      p.iframe.contentWindow.postMessage(JSON.stringify({ event: 'command', func: func, args: args || [], id: p.id, channel: 'widget' }), '*');\n    }\n\n    p.mostrar = () => {\n      clearTimeout(p.timer);\n      \/\/ margen m\u00ednimo para que YouTube retire cualquier overlay de arranque\n      p.timer = setTimeout(() => { if (p.dentro && p.playing) card.classList.add('lz-video-activo'); }, 200);\n    };\n\n    function crear() {\n      p.id = 'lzyt' + (++uid);\n      const f = document.createElement('iframe');\n      f.src = 'https:\/\/www.youtube-nocookie.com\/embed\/' + videoId +\n        '?autoplay=1&mute=1&controls=0&disablekb=1&fs=0&playsinline=1&rel=0&iv_load_policy=3&modestbranding=1' +\n        '&loop=1&playlist=' + videoId + '&enablejsapi=1&origin=' + encodeURIComponent(location.origin);\n      f.setAttribute('allow', 'autoplay; encrypted-media');\n      f.setAttribute('tabindex', '-1');\n      f.setAttribute('aria-hidden', 'true');\n      f.setAttribute('title', '');\n      f.addEventListener('load', () => {\n        players.set(f.contentWindow, p);\n        p.listo = true;\n        f.contentWindow.postMessage(JSON.stringify({ event: 'listening', id: p.id, channel: 'widget' }), '*');\n        cmd('addEventListener', ['onStateChange']);\n        cmd('mute');\n        if (p.dentro) cmd('playVideo'); else cmd('pauseVideo');\n      }, { once: true });\n      p.iframe = f;\n      capa.appendChild(f);\n    }\n\n    card.addEventListener('mouseenter', () => {\n      p.dentro = true;\n      if (!p.iframe) { crear(); return; }\n      if (p.listo) { cmd('seekTo', [0, true]); cmd('playVideo'); }\n      if (p.playing) p.mostrar();\n    });\n\n    card.addEventListener('mouseleave', () => {\n      p.dentro = false;\n      clearTimeout(p.timer);\n      card.classList.remove('lz-video-activo');\n      p.playing = false;\n      cmd('pauseVideo');\n    });\n  }\n\n  \/* V\u00eddeo alojado en la web (MP4\/WebM): mismo comportamiento que YouTube *\/\n  function prepararMp4(card, capa) {\n    card.dataset.lzV2Ready = '1';\n    let v = null, dentro = false;\n    function crear() {\n      v = document.createElement('video');\n      v.src = capa.dataset.videoSrc;\n      v.muted = true; v.loop = true; v.playsInline = true;\n      v.setAttribute('muted', ''); v.setAttribute('playsinline', '');\n      v.preload = 'metadata';\n      v.setAttribute('aria-hidden', 'true');\n      v.addEventListener('playing', () => { if (dentro) card.classList.add('lz-video-activo'); });\n      capa.appendChild(v);\n    }\n    card.addEventListener('mouseenter', () => {\n      dentro = true;\n      if (!v) crear();\n      const p = v.play(); if (p && p.catch) p.catch(() => {});\n    });\n    card.addEventListener('mouseleave', () => {\n      dentro = false;\n      card.classList.remove('lz-video-activo');\n      if (v) { v.pause(); try { v.currentTime = 0; } catch (e) {} }\n    });\n  }\n\n  function iniciar() { document.querySelectorAll('.contenedor-hover').forEach(preparar); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar, { once: true });\n  else iniciar();\n\n  new MutationObserver(() => {\n    document.querySelectorAll('.contenedor-hover:not([data-lz-v2-ready=\"1\"])').forEach(preparar);\n  }).observe(document.body, { childList: true, subtree: true });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0474ca2 elementor-widget elementor-widget-shortcode\" data-id=\"0474ca2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n        <div\n            class=\"lz-hover-video\"\n            data-video-src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/JAECOO7-6-SEC.mp4\"\n            aria-hidden=\"true\">\n        <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4db4f57 bl-card-extra elementor-widget elementor-widget-shortcode\" data-id=\"4db4f57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><span class=\"bl-card-data\" hidden data-type=\"yt\" data-vid=\"Pk4f9kMMT3M\" data-src=\"\" data-title=\"New JAECOO 7\"><\/span><a class=\"bl-card-link\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/new-jaecoo-7\/\">[ View project ]<\/a><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<style id=\"loop-dynamic-819\">.e-loop-item-1469 .elementor-element.elementor-element-c1f2f89:not(.elementor-motion-effects-element-type-background), .e-loop-item-1469 .elementor-element.elementor-element-c1f2f89 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-BENIDORM-6-SEC.jpg\");}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"819\" class=\"elementor elementor-819 e-loop-item e-loop-item-1469 post-1469 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-marina-resort-benidorm\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-4fc6e6c e-con-full contenedor-hover e-flex e-con e-child\" data-id=\"4fc6e6c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-3cd0915 e-con-full contenedor-hover-info e-flex e-con e-child\" data-id=\"3cd0915\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ad50968 elementor-widget elementor-widget-heading\" data-id=\"ad50968\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Benidorm<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b7055f elementor-widget elementor-widget-heading\" data-id=\"9b7055f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>Marina Resort Benidorm<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c1f2f89 video-pro e-flex e-con-boxed e-con e-child\" data-id=\"c1f2f89\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e046f62 elementor-widget elementor-widget-html\" data-id=\"e046f62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\n\/* =====================================================\n   TARJETA\n===================================================== *\/\n\n.contenedor-hover {\n    position: relative !important;\n\n    width: 100% !important;\n    aspect-ratio: 16 \/ 9 !important;\n\n    \/*\n     * Necesario para que la info pueda\n     * aparecer por encima.\n     *\/\n    overflow: visible !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n}\n\n\n\/* =====================================================\n   SHORTCODE\n===================================================== *\/\n\n.contenedor-hover .elementor-widget-shortcode {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    z-index: 5 !important;\n\n    overflow: hidden !important;\n\n    pointer-events: none !important;\n}\n\n.contenedor-hover\n.elementor-widget-shortcode\n> .elementor-widget-container,\n\n.contenedor-hover\n.elementor-shortcode {\n\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    overflow: hidden !important;\n}\n\n\n\/* =====================================================\n   CAPA YOUTUBE\n===================================================== *\/\n\n.lz-hover-video {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    overflow: hidden !important;\n\n    opacity: 0;\n    visibility: hidden;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s linear 0.15s;\n}\n\n\n\/* Mostrar v\u00eddeo *\/\n.contenedor-hover.lz-video-activo\n.lz-hover-video {\n\n    opacity: 1;\n    visibility: visible;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s;\n}\n\n\n\/* =====================================================\n   IFRAME\n===================================================== *\/\n\n.lz-hover-video iframe {\n    position: absolute !important;\n\n    top: 50% !important;\n    left: 50% !important;\n\n    \/*\n     * Overscan como background video.\n     *\n     * Recorta t\u00edtulo\/avatar\/logo situados\n     * en las zonas exteriores.\n     *\/\n    width: 135% !important;\n    height: 135% !important;\n\n    min-width: 135% !important;\n    min-height: 135% !important;\n\n    max-width: none !important;\n\n    transform:\n        translate(-50%, -50%) !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n\n    \/*\n     * YouTube jam\u00e1s recibe hover\/click.\n     *\/\n    pointer-events: none !important;\n}\n\n\n\/* =====================================================\n   INFO ARRIBA\n===================================================== *\/\n\n.contenedor-hover .contenedor-hover-info {\n\n    position: absolute !important;\n\n    left: 0 !important;\n\n    \/*\n     * Arriba de la imagen\/v\u00eddeo.\n     *\/\n    bottom: calc(100% + 12px) !important;\n\n    width: 100% !important;\n\n    z-index: 50 !important;\n\n    opacity: 0 !important;\n    visibility: hidden !important;\n\n    \/*\n     * Entra desde abajo.\n     *\/\n    transform: translateY(18px) !important;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s linear 0.5s !important;\n}\n\n\n\/* Info visible *\/\n.contenedor-hover:hover\n.contenedor-hover-info {\n\n    opacity: 1 !important;\n    visibility: visible !important;\n\n    transform: translateY(0) !important;\n\n    pointer-events: auto !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s !important;\n}\n\n\n\/* =====================================================\n   SIN REDONDEOS\n===================================================== *\/\n\n.contenedor-hover,\n.lz-hover-video,\n.lz-hover-video iframe {\n\n    border-radius: 0 !important;\n}\n\n\n\/* V\u00eddeo alojado (MP4) en el hover *\/\n.lz-hover-video video {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    object-fit: cover !important;\n    border: 0 !important;\n    border-radius: 0 !important;\n    pointer-events: none !important;\n}\n<\/style>\n\n\n<script>\n\/*\n * HOVER V\u00cdDEO YOUTUBE (Featured Works)\n * - El iframe se crea en el primer hover y se reutiliza (pausa\/play), no se recarga.\n * - Solo se muestra cuando YouTube confirma que est\u00e1 REPRODUCIENDO:\n *   nunca se ve spinner, bot\u00f3n play ni t\u00edtulo.\n * - Desactivado en dispositivos sin hover (t\u00e1ctil).\n *\/\n(() => {\n  'use strict';\n  if (window.__lzYoutubeHoverV2) return;\n  window.__lzYoutubeHoverV2 = true;\n\n  if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;\n\n  ['https:\/\/www.youtube-nocookie.com', 'https:\/\/www.youtube.com', 'https:\/\/i.ytimg.com'].forEach((h) => {\n    const l = document.createElement('link');\n    l.rel = 'preconnect'; l.href = h; l.crossOrigin = '';\n    document.head.appendChild(l);\n  });\n\n  const players = new Map(); \/\/ contentWindow -> estado de la tarjeta\n  let uid = 0;\n\n  window.addEventListener('message', (e) => {\n    if (!\/^https:\\\/\\\/(www\\.)?youtube(-nocookie)?\\.com$\/.test(e.origin)) return;\n    const p = players.get(e.source);\n    if (!p) return;\n    let d = e.data;\n    if (typeof d === 'string') { try { d = JSON.parse(d); } catch (err) { return; } }\n    if (!d) return;\n    let state = null;\n    if (d.event === 'onStateChange') state = d.info;\n    if (d.event === 'infoDelivery' && d.info && typeof d.info.playerState === 'number') state = d.info.playerState;\n    if (state === null) return;\n    p.playing = state === 1;\n    if (p.playing && p.dentro) p.mostrar();\n  });\n\n  function preparar(card) {\n    if (card.dataset.lzV2Ready === '1') return;\n    const capa = card.querySelector('.lz-hover-video');\n    if (capa && capa.dataset.videoSrc) { prepararMp4(card, capa); return; }\n    if (!capa || !capa.dataset.youtubeId) return;\n    card.dataset.lzV2Ready = '1';\n\n    const videoId = capa.dataset.youtubeId;\n    const p = { dentro: false, playing: false, iframe: null, listo: false, timer: null };\n\n    function cmd(func, args) {\n      if (!p.iframe || !p.iframe.contentWindow) return;\n      p.iframe.contentWindow.postMessage(JSON.stringify({ event: 'command', func: func, args: args || [], id: p.id, channel: 'widget' }), '*');\n    }\n\n    p.mostrar = () => {\n      clearTimeout(p.timer);\n      \/\/ margen m\u00ednimo para que YouTube retire cualquier overlay de arranque\n      p.timer = setTimeout(() => { if (p.dentro && p.playing) card.classList.add('lz-video-activo'); }, 200);\n    };\n\n    function crear() {\n      p.id = 'lzyt' + (++uid);\n      const f = document.createElement('iframe');\n      f.src = 'https:\/\/www.youtube-nocookie.com\/embed\/' + videoId +\n        '?autoplay=1&mute=1&controls=0&disablekb=1&fs=0&playsinline=1&rel=0&iv_load_policy=3&modestbranding=1' +\n        '&loop=1&playlist=' + videoId + '&enablejsapi=1&origin=' + encodeURIComponent(location.origin);\n      f.setAttribute('allow', 'autoplay; encrypted-media');\n      f.setAttribute('tabindex', '-1');\n      f.setAttribute('aria-hidden', 'true');\n      f.setAttribute('title', '');\n      f.addEventListener('load', () => {\n        players.set(f.contentWindow, p);\n        p.listo = true;\n        f.contentWindow.postMessage(JSON.stringify({ event: 'listening', id: p.id, channel: 'widget' }), '*');\n        cmd('addEventListener', ['onStateChange']);\n        cmd('mute');\n        if (p.dentro) cmd('playVideo'); else cmd('pauseVideo');\n      }, { once: true });\n      p.iframe = f;\n      capa.appendChild(f);\n    }\n\n    card.addEventListener('mouseenter', () => {\n      p.dentro = true;\n      if (!p.iframe) { crear(); return; }\n      if (p.listo) { cmd('seekTo', [0, true]); cmd('playVideo'); }\n      if (p.playing) p.mostrar();\n    });\n\n    card.addEventListener('mouseleave', () => {\n      p.dentro = false;\n      clearTimeout(p.timer);\n      card.classList.remove('lz-video-activo');\n      p.playing = false;\n      cmd('pauseVideo');\n    });\n  }\n\n  \/* V\u00eddeo alojado en la web (MP4\/WebM): mismo comportamiento que YouTube *\/\n  function prepararMp4(card, capa) {\n    card.dataset.lzV2Ready = '1';\n    let v = null, dentro = false;\n    function crear() {\n      v = document.createElement('video');\n      v.src = capa.dataset.videoSrc;\n      v.muted = true; v.loop = true; v.playsInline = true;\n      v.setAttribute('muted', ''); v.setAttribute('playsinline', '');\n      v.preload = 'metadata';\n      v.setAttribute('aria-hidden', 'true');\n      v.addEventListener('playing', () => { if (dentro) card.classList.add('lz-video-activo'); });\n      capa.appendChild(v);\n    }\n    card.addEventListener('mouseenter', () => {\n      dentro = true;\n      if (!v) crear();\n      const p = v.play(); if (p && p.catch) p.catch(() => {});\n    });\n    card.addEventListener('mouseleave', () => {\n      dentro = false;\n      card.classList.remove('lz-video-activo');\n      if (v) { v.pause(); try { v.currentTime = 0; } catch (e) {} }\n    });\n  }\n\n  function iniciar() { document.querySelectorAll('.contenedor-hover').forEach(preparar); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar, { once: true });\n  else iniciar();\n\n  new MutationObserver(() => {\n    document.querySelectorAll('.contenedor-hover:not([data-lz-v2-ready=\"1\"])').forEach(preparar);\n  }).observe(document.body, { childList: true, subtree: true });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0474ca2 elementor-widget elementor-widget-shortcode\" data-id=\"0474ca2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n        <div\n            class=\"lz-hover-video\"\n            data-video-src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/BENIDORM-6-SEC.mp4\"\n            aria-hidden=\"true\">\n        <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4db4f57 bl-card-extra elementor-widget elementor-widget-shortcode\" data-id=\"4db4f57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><span class=\"bl-card-data\" hidden data-type=\"yt\" data-vid=\"Y-V1IPKIsi8\" data-src=\"\" data-title=\"Benidorm\"><\/span><a class=\"bl-card-link\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/benidorm\/\">[ View project ]<\/a><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<style id=\"loop-dynamic-819\">.e-loop-item-1462 .elementor-element.elementor-element-c1f2f89:not(.elementor-motion-effects-element-type-background), .e-loop-item-1462 .elementor-element.elementor-element-c1f2f89 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-ALTUS-6-SEC.jpg\");}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"819\" class=\"elementor elementor-819 e-loop-item e-loop-item-1462 post-1462 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-altus\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-4fc6e6c e-con-full contenedor-hover e-flex e-con e-child\" data-id=\"4fc6e6c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-3cd0915 e-con-full contenedor-hover-info e-flex e-con e-child\" data-id=\"3cd0915\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ad50968 elementor-widget elementor-widget-heading\" data-id=\"ad50968\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Para todas tus vidas<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b7055f elementor-widget elementor-widget-heading\" data-id=\"9b7055f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>Altus<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c1f2f89 video-pro e-flex e-con-boxed e-con e-child\" data-id=\"c1f2f89\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e046f62 elementor-widget elementor-widget-html\" data-id=\"e046f62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\n\/* =====================================================\n   TARJETA\n===================================================== *\/\n\n.contenedor-hover {\n    position: relative !important;\n\n    width: 100% !important;\n    aspect-ratio: 16 \/ 9 !important;\n\n    \/*\n     * Necesario para que la info pueda\n     * aparecer por encima.\n     *\/\n    overflow: visible !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n}\n\n\n\/* =====================================================\n   SHORTCODE\n===================================================== *\/\n\n.contenedor-hover .elementor-widget-shortcode {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    z-index: 5 !important;\n\n    overflow: hidden !important;\n\n    pointer-events: none !important;\n}\n\n.contenedor-hover\n.elementor-widget-shortcode\n> .elementor-widget-container,\n\n.contenedor-hover\n.elementor-shortcode {\n\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    overflow: hidden !important;\n}\n\n\n\/* =====================================================\n   CAPA YOUTUBE\n===================================================== *\/\n\n.lz-hover-video {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    overflow: hidden !important;\n\n    opacity: 0;\n    visibility: hidden;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s linear 0.15s;\n}\n\n\n\/* Mostrar v\u00eddeo *\/\n.contenedor-hover.lz-video-activo\n.lz-hover-video {\n\n    opacity: 1;\n    visibility: visible;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s;\n}\n\n\n\/* =====================================================\n   IFRAME\n===================================================== *\/\n\n.lz-hover-video iframe {\n    position: absolute !important;\n\n    top: 50% !important;\n    left: 50% !important;\n\n    \/*\n     * Overscan como background video.\n     *\n     * Recorta t\u00edtulo\/avatar\/logo situados\n     * en las zonas exteriores.\n     *\/\n    width: 135% !important;\n    height: 135% !important;\n\n    min-width: 135% !important;\n    min-height: 135% !important;\n\n    max-width: none !important;\n\n    transform:\n        translate(-50%, -50%) !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n\n    \/*\n     * YouTube jam\u00e1s recibe hover\/click.\n     *\/\n    pointer-events: none !important;\n}\n\n\n\/* =====================================================\n   INFO ARRIBA\n===================================================== *\/\n\n.contenedor-hover .contenedor-hover-info {\n\n    position: absolute !important;\n\n    left: 0 !important;\n\n    \/*\n     * Arriba de la imagen\/v\u00eddeo.\n     *\/\n    bottom: calc(100% + 12px) !important;\n\n    width: 100% !important;\n\n    z-index: 50 !important;\n\n    opacity: 0 !important;\n    visibility: hidden !important;\n\n    \/*\n     * Entra desde abajo.\n     *\/\n    transform: translateY(18px) !important;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s linear 0.5s !important;\n}\n\n\n\/* Info visible *\/\n.contenedor-hover:hover\n.contenedor-hover-info {\n\n    opacity: 1 !important;\n    visibility: visible !important;\n\n    transform: translateY(0) !important;\n\n    pointer-events: auto !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s !important;\n}\n\n\n\/* =====================================================\n   SIN REDONDEOS\n===================================================== *\/\n\n.contenedor-hover,\n.lz-hover-video,\n.lz-hover-video iframe {\n\n    border-radius: 0 !important;\n}\n\n\n\/* V\u00eddeo alojado (MP4) en el hover *\/\n.lz-hover-video video {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    object-fit: cover !important;\n    border: 0 !important;\n    border-radius: 0 !important;\n    pointer-events: none !important;\n}\n<\/style>\n\n\n<script>\n\/*\n * HOVER V\u00cdDEO YOUTUBE (Featured Works)\n * - El iframe se crea en el primer hover y se reutiliza (pausa\/play), no se recarga.\n * - Solo se muestra cuando YouTube confirma que est\u00e1 REPRODUCIENDO:\n *   nunca se ve spinner, bot\u00f3n play ni t\u00edtulo.\n * - Desactivado en dispositivos sin hover (t\u00e1ctil).\n *\/\n(() => {\n  'use strict';\n  if (window.__lzYoutubeHoverV2) return;\n  window.__lzYoutubeHoverV2 = true;\n\n  if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;\n\n  ['https:\/\/www.youtube-nocookie.com', 'https:\/\/www.youtube.com', 'https:\/\/i.ytimg.com'].forEach((h) => {\n    const l = document.createElement('link');\n    l.rel = 'preconnect'; l.href = h; l.crossOrigin = '';\n    document.head.appendChild(l);\n  });\n\n  const players = new Map(); \/\/ contentWindow -> estado de la tarjeta\n  let uid = 0;\n\n  window.addEventListener('message', (e) => {\n    if (!\/^https:\\\/\\\/(www\\.)?youtube(-nocookie)?\\.com$\/.test(e.origin)) return;\n    const p = players.get(e.source);\n    if (!p) return;\n    let d = e.data;\n    if (typeof d === 'string') { try { d = JSON.parse(d); } catch (err) { return; } }\n    if (!d) return;\n    let state = null;\n    if (d.event === 'onStateChange') state = d.info;\n    if (d.event === 'infoDelivery' && d.info && typeof d.info.playerState === 'number') state = d.info.playerState;\n    if (state === null) return;\n    p.playing = state === 1;\n    if (p.playing && p.dentro) p.mostrar();\n  });\n\n  function preparar(card) {\n    if (card.dataset.lzV2Ready === '1') return;\n    const capa = card.querySelector('.lz-hover-video');\n    if (capa && capa.dataset.videoSrc) { prepararMp4(card, capa); return; }\n    if (!capa || !capa.dataset.youtubeId) return;\n    card.dataset.lzV2Ready = '1';\n\n    const videoId = capa.dataset.youtubeId;\n    const p = { dentro: false, playing: false, iframe: null, listo: false, timer: null };\n\n    function cmd(func, args) {\n      if (!p.iframe || !p.iframe.contentWindow) return;\n      p.iframe.contentWindow.postMessage(JSON.stringify({ event: 'command', func: func, args: args || [], id: p.id, channel: 'widget' }), '*');\n    }\n\n    p.mostrar = () => {\n      clearTimeout(p.timer);\n      \/\/ margen m\u00ednimo para que YouTube retire cualquier overlay de arranque\n      p.timer = setTimeout(() => { if (p.dentro && p.playing) card.classList.add('lz-video-activo'); }, 200);\n    };\n\n    function crear() {\n      p.id = 'lzyt' + (++uid);\n      const f = document.createElement('iframe');\n      f.src = 'https:\/\/www.youtube-nocookie.com\/embed\/' + videoId +\n        '?autoplay=1&mute=1&controls=0&disablekb=1&fs=0&playsinline=1&rel=0&iv_load_policy=3&modestbranding=1' +\n        '&loop=1&playlist=' + videoId + '&enablejsapi=1&origin=' + encodeURIComponent(location.origin);\n      f.setAttribute('allow', 'autoplay; encrypted-media');\n      f.setAttribute('tabindex', '-1');\n      f.setAttribute('aria-hidden', 'true');\n      f.setAttribute('title', '');\n      f.addEventListener('load', () => {\n        players.set(f.contentWindow, p);\n        p.listo = true;\n        f.contentWindow.postMessage(JSON.stringify({ event: 'listening', id: p.id, channel: 'widget' }), '*');\n        cmd('addEventListener', ['onStateChange']);\n        cmd('mute');\n        if (p.dentro) cmd('playVideo'); else cmd('pauseVideo');\n      }, { once: true });\n      p.iframe = f;\n      capa.appendChild(f);\n    }\n\n    card.addEventListener('mouseenter', () => {\n      p.dentro = true;\n      if (!p.iframe) { crear(); return; }\n      if (p.listo) { cmd('seekTo', [0, true]); cmd('playVideo'); }\n      if (p.playing) p.mostrar();\n    });\n\n    card.addEventListener('mouseleave', () => {\n      p.dentro = false;\n      clearTimeout(p.timer);\n      card.classList.remove('lz-video-activo');\n      p.playing = false;\n      cmd('pauseVideo');\n    });\n  }\n\n  \/* V\u00eddeo alojado en la web (MP4\/WebM): mismo comportamiento que YouTube *\/\n  function prepararMp4(card, capa) {\n    card.dataset.lzV2Ready = '1';\n    let v = null, dentro = false;\n    function crear() {\n      v = document.createElement('video');\n      v.src = capa.dataset.videoSrc;\n      v.muted = true; v.loop = true; v.playsInline = true;\n      v.setAttribute('muted', ''); v.setAttribute('playsinline', '');\n      v.preload = 'metadata';\n      v.setAttribute('aria-hidden', 'true');\n      v.addEventListener('playing', () => { if (dentro) card.classList.add('lz-video-activo'); });\n      capa.appendChild(v);\n    }\n    card.addEventListener('mouseenter', () => {\n      dentro = true;\n      if (!v) crear();\n      const p = v.play(); if (p && p.catch) p.catch(() => {});\n    });\n    card.addEventListener('mouseleave', () => {\n      dentro = false;\n      card.classList.remove('lz-video-activo');\n      if (v) { v.pause(); try { v.currentTime = 0; } catch (e) {} }\n    });\n  }\n\n  function iniciar() { document.querySelectorAll('.contenedor-hover').forEach(preparar); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar, { once: true });\n  else iniciar();\n\n  new MutationObserver(() => {\n    document.querySelectorAll('.contenedor-hover:not([data-lz-v2-ready=\"1\"])').forEach(preparar);\n  }).observe(document.body, { childList: true, subtree: true });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0474ca2 elementor-widget elementor-widget-shortcode\" data-id=\"0474ca2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n        <div\n            class=\"lz-hover-video\"\n            data-video-src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/ALTUS-6-SEC.mp4\"\n            aria-hidden=\"true\">\n        <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4db4f57 bl-card-extra elementor-widget elementor-widget-shortcode\" data-id=\"4db4f57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><span class=\"bl-card-data\" hidden data-type=\"yt\" data-vid=\"p4NG1InJFAU\" data-src=\"\" data-title=\"Para todas tus vidas\"><\/span><a class=\"bl-card-link\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/para-todas-tus-vidas\/\">[ View project ]<\/a><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<style id=\"loop-dynamic-819\">.e-loop-item-127 .elementor-element.elementor-element-c1f2f89:not(.elementor-motion-effects-element-type-background), .e-loop-item-127 .elementor-element.elementor-element-c1f2f89 > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-6-SEG-MEZLAN-WEB.jpg\");}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"819\" class=\"elementor elementor-819 e-loop-item e-loop-item-127 post-127 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-mezlan\" data-elementor-post-type=\"elementor_library\" data-custom-edit-handle=\"1\">\n\t\t\t<div class=\"elementor-element elementor-element-4fc6e6c e-con-full contenedor-hover e-flex e-con e-child\" data-id=\"4fc6e6c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-3cd0915 e-con-full contenedor-hover-info e-flex e-con e-child\" data-id=\"3cd0915\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ad50968 elementor-widget elementor-widget-heading\" data-id=\"ad50968\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">FW26<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b7055f elementor-widget elementor-widget-heading\" data-id=\"9b7055f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>Mezlan<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c1f2f89 video-pro e-flex e-con-boxed e-con e-child\" data-id=\"c1f2f89\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e046f62 elementor-widget elementor-widget-html\" data-id=\"e046f62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\n\/* =====================================================\n   TARJETA\n===================================================== *\/\n\n.contenedor-hover {\n    position: relative !important;\n\n    width: 100% !important;\n    aspect-ratio: 16 \/ 9 !important;\n\n    \/*\n     * Necesario para que la info pueda\n     * aparecer por encima.\n     *\/\n    overflow: visible !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n}\n\n\n\/* =====================================================\n   SHORTCODE\n===================================================== *\/\n\n.contenedor-hover .elementor-widget-shortcode {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    z-index: 5 !important;\n\n    overflow: hidden !important;\n\n    pointer-events: none !important;\n}\n\n.contenedor-hover\n.elementor-widget-shortcode\n> .elementor-widget-container,\n\n.contenedor-hover\n.elementor-shortcode {\n\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    overflow: hidden !important;\n}\n\n\n\/* =====================================================\n   CAPA YOUTUBE\n===================================================== *\/\n\n.lz-hover-video {\n    position: absolute !important;\n\n    inset: 0 !important;\n\n    width: 100% !important;\n    height: 100% !important;\n\n    overflow: hidden !important;\n\n    opacity: 0;\n    visibility: hidden;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s linear 0.15s;\n}\n\n\n\/* Mostrar v\u00eddeo *\/\n.contenedor-hover.lz-video-activo\n.lz-hover-video {\n\n    opacity: 1;\n    visibility: visible;\n\n    transition:\n        opacity 0.15s ease,\n        visibility 0s;\n}\n\n\n\/* =====================================================\n   IFRAME\n===================================================== *\/\n\n.lz-hover-video iframe {\n    position: absolute !important;\n\n    top: 50% !important;\n    left: 50% !important;\n\n    \/*\n     * Overscan como background video.\n     *\n     * Recorta t\u00edtulo\/avatar\/logo situados\n     * en las zonas exteriores.\n     *\/\n    width: 135% !important;\n    height: 135% !important;\n\n    min-width: 135% !important;\n    min-height: 135% !important;\n\n    max-width: none !important;\n\n    transform:\n        translate(-50%, -50%) !important;\n\n    border: 0 !important;\n    border-radius: 0 !important;\n\n    \/*\n     * YouTube jam\u00e1s recibe hover\/click.\n     *\/\n    pointer-events: none !important;\n}\n\n\n\/* =====================================================\n   INFO ARRIBA\n===================================================== *\/\n\n.contenedor-hover .contenedor-hover-info {\n\n    position: absolute !important;\n\n    left: 0 !important;\n\n    \/*\n     * Arriba de la imagen\/v\u00eddeo.\n     *\/\n    bottom: calc(100% + 12px) !important;\n\n    width: 100% !important;\n\n    z-index: 50 !important;\n\n    opacity: 0 !important;\n    visibility: hidden !important;\n\n    \/*\n     * Entra desde abajo.\n     *\/\n    transform: translateY(18px) !important;\n\n    pointer-events: none !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s linear 0.5s !important;\n}\n\n\n\/* Info visible *\/\n.contenedor-hover:hover\n.contenedor-hover-info {\n\n    opacity: 1 !important;\n    visibility: visible !important;\n\n    transform: translateY(0) !important;\n\n    pointer-events: auto !important;\n\n    transition:\n        opacity 0.3s ease,\n        transform 0.5s cubic-bezier(0.22, 1, 0.36, 1),\n        visibility 0s !important;\n}\n\n\n\/* =====================================================\n   SIN REDONDEOS\n===================================================== *\/\n\n.contenedor-hover,\n.lz-hover-video,\n.lz-hover-video iframe {\n\n    border-radius: 0 !important;\n}\n\n\n\/* V\u00eddeo alojado (MP4) en el hover *\/\n.lz-hover-video video {\n    position: absolute !important;\n    inset: 0 !important;\n    width: 100% !important;\n    height: 100% !important;\n    object-fit: cover !important;\n    border: 0 !important;\n    border-radius: 0 !important;\n    pointer-events: none !important;\n}\n<\/style>\n\n\n<script>\n\/*\n * HOVER V\u00cdDEO YOUTUBE (Featured Works)\n * - El iframe se crea en el primer hover y se reutiliza (pausa\/play), no se recarga.\n * - Solo se muestra cuando YouTube confirma que est\u00e1 REPRODUCIENDO:\n *   nunca se ve spinner, bot\u00f3n play ni t\u00edtulo.\n * - Desactivado en dispositivos sin hover (t\u00e1ctil).\n *\/\n(() => {\n  'use strict';\n  if (window.__lzYoutubeHoverV2) return;\n  window.__lzYoutubeHoverV2 = true;\n\n  if (!window.matchMedia('(hover: hover) and (pointer: fine)').matches) return;\n\n  ['https:\/\/www.youtube-nocookie.com', 'https:\/\/www.youtube.com', 'https:\/\/i.ytimg.com'].forEach((h) => {\n    const l = document.createElement('link');\n    l.rel = 'preconnect'; l.href = h; l.crossOrigin = '';\n    document.head.appendChild(l);\n  });\n\n  const players = new Map(); \/\/ contentWindow -> estado de la tarjeta\n  let uid = 0;\n\n  window.addEventListener('message', (e) => {\n    if (!\/^https:\\\/\\\/(www\\.)?youtube(-nocookie)?\\.com$\/.test(e.origin)) return;\n    const p = players.get(e.source);\n    if (!p) return;\n    let d = e.data;\n    if (typeof d === 'string') { try { d = JSON.parse(d); } catch (err) { return; } }\n    if (!d) return;\n    let state = null;\n    if (d.event === 'onStateChange') state = d.info;\n    if (d.event === 'infoDelivery' && d.info && typeof d.info.playerState === 'number') state = d.info.playerState;\n    if (state === null) return;\n    p.playing = state === 1;\n    if (p.playing && p.dentro) p.mostrar();\n  });\n\n  function preparar(card) {\n    if (card.dataset.lzV2Ready === '1') return;\n    const capa = card.querySelector('.lz-hover-video');\n    if (capa && capa.dataset.videoSrc) { prepararMp4(card, capa); return; }\n    if (!capa || !capa.dataset.youtubeId) return;\n    card.dataset.lzV2Ready = '1';\n\n    const videoId = capa.dataset.youtubeId;\n    const p = { dentro: false, playing: false, iframe: null, listo: false, timer: null };\n\n    function cmd(func, args) {\n      if (!p.iframe || !p.iframe.contentWindow) return;\n      p.iframe.contentWindow.postMessage(JSON.stringify({ event: 'command', func: func, args: args || [], id: p.id, channel: 'widget' }), '*');\n    }\n\n    p.mostrar = () => {\n      clearTimeout(p.timer);\n      \/\/ margen m\u00ednimo para que YouTube retire cualquier overlay de arranque\n      p.timer = setTimeout(() => { if (p.dentro && p.playing) card.classList.add('lz-video-activo'); }, 200);\n    };\n\n    function crear() {\n      p.id = 'lzyt' + (++uid);\n      const f = document.createElement('iframe');\n      f.src = 'https:\/\/www.youtube-nocookie.com\/embed\/' + videoId +\n        '?autoplay=1&mute=1&controls=0&disablekb=1&fs=0&playsinline=1&rel=0&iv_load_policy=3&modestbranding=1' +\n        '&loop=1&playlist=' + videoId + '&enablejsapi=1&origin=' + encodeURIComponent(location.origin);\n      f.setAttribute('allow', 'autoplay; encrypted-media');\n      f.setAttribute('tabindex', '-1');\n      f.setAttribute('aria-hidden', 'true');\n      f.setAttribute('title', '');\n      f.addEventListener('load', () => {\n        players.set(f.contentWindow, p);\n        p.listo = true;\n        f.contentWindow.postMessage(JSON.stringify({ event: 'listening', id: p.id, channel: 'widget' }), '*');\n        cmd('addEventListener', ['onStateChange']);\n        cmd('mute');\n        if (p.dentro) cmd('playVideo'); else cmd('pauseVideo');\n      }, { once: true });\n      p.iframe = f;\n      capa.appendChild(f);\n    }\n\n    card.addEventListener('mouseenter', () => {\n      p.dentro = true;\n      if (!p.iframe) { crear(); return; }\n      if (p.listo) { cmd('seekTo', [0, true]); cmd('playVideo'); }\n      if (p.playing) p.mostrar();\n    });\n\n    card.addEventListener('mouseleave', () => {\n      p.dentro = false;\n      clearTimeout(p.timer);\n      card.classList.remove('lz-video-activo');\n      p.playing = false;\n      cmd('pauseVideo');\n    });\n  }\n\n  \/* V\u00eddeo alojado en la web (MP4\/WebM): mismo comportamiento que YouTube *\/\n  function prepararMp4(card, capa) {\n    card.dataset.lzV2Ready = '1';\n    let v = null, dentro = false;\n    function crear() {\n      v = document.createElement('video');\n      v.src = capa.dataset.videoSrc;\n      v.muted = true; v.loop = true; v.playsInline = true;\n      v.setAttribute('muted', ''); v.setAttribute('playsinline', '');\n      v.preload = 'metadata';\n      v.setAttribute('aria-hidden', 'true');\n      v.addEventListener('playing', () => { if (dentro) card.classList.add('lz-video-activo'); });\n      capa.appendChild(v);\n    }\n    card.addEventListener('mouseenter', () => {\n      dentro = true;\n      if (!v) crear();\n      const p = v.play(); if (p && p.catch) p.catch(() => {});\n    });\n    card.addEventListener('mouseleave', () => {\n      dentro = false;\n      card.classList.remove('lz-video-activo');\n      if (v) { v.pause(); try { v.currentTime = 0; } catch (e) {} }\n    });\n  }\n\n  function iniciar() { document.querySelectorAll('.contenedor-hover').forEach(preparar); }\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', iniciar, { once: true });\n  else iniciar();\n\n  new MutationObserver(() => {\n    document.querySelectorAll('.contenedor-hover:not([data-lz-v2-ready=\"1\"])').forEach(preparar);\n  }).observe(document.body, { childList: true, subtree: true });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0474ca2 elementor-widget elementor-widget-shortcode\" data-id=\"0474ca2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n        <div\n            class=\"lz-hover-video\"\n            data-video-src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/6-SEG-MEZLAN-WEB.mp4\"\n            aria-hidden=\"true\">\n        <\/div>\n        <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4db4f57 bl-card-extra elementor-widget elementor-widget-shortcode\" data-id=\"4db4f57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><span class=\"bl-card-data\" hidden data-type=\"file\" data-vid=\"\" data-src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/ALTUS-6-SEC.mp4\" data-title=\"FW26\"><\/span><a class=\"bl-card-link\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/mezclan\/\">[ View project ]<\/a><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fe8ed49 elementor-align-right boton-borde-animado, text-enlace elementor-widget elementor-widget-button\" data-id=\"fe8ed49\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/bluelake.milanoproduct.com\/film\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t<span class=\"elementor-button-icon\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"120\" height=\"120\" viewBox=\"0 0 120 120\" fill=\"none\"><mask id=\"path-1-inside-1_9_15\" fill=\"white\"><path d=\"M60 0H120V60H60V0Z\"><\/path><\/mask><path d=\"M120 0H126V-6H120V0ZM60 0V6H120V0V-6H60V0ZM120 0H114V60H120H126V0H120Z\" fill=\"black\" mask=\"url(#path-1-inside-1_9_15)\"><\/path><\/svg>\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">How we work<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-bd48e5b e-flex e-con-boxed e-con e-parent\" data-id=\"bd48e5b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d9bfe92 proyectos-carrusel elementor-arrows-position-inside elementor-widget elementor-widget-loop-carousel\" data-id=\"d9bfe92\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;template_id&quot;:&quot;999&quot;,&quot;autoplay_speed&quot;:2000,&quot;image_spacing_custom&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:30,&quot;sizes&quot;:[]},&quot;_skin&quot;:&quot;post&quot;,&quot;slides_to_show&quot;:&quot;3&quot;,&quot;slides_to_show_laptop&quot;:&quot;3&quot;,&quot;slides_to_show_tablet&quot;:&quot;2&quot;,&quot;slides_to_show_mobile&quot;:&quot;1&quot;,&quot;slides_to_scroll&quot;:&quot;1&quot;,&quot;edit_handle_selector&quot;:&quot;.elementor-widget-container&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;infinite&quot;:&quot;yes&quot;,&quot;speed&quot;:500,&quot;offset_sides&quot;:&quot;none&quot;,&quot;arrows&quot;:&quot;yes&quot;,&quot;image_spacing_custom_laptop&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;image_spacing_custom_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"loop-carousel.post\">\n\t\t\t\t\t\t\t<div class=\"swiper elementor-loop-container elementor-grid\" dir=\"ltr\">\n\t\t\t\t<div class=\"swiper-wrapper\" aria-live=\"off\">\n\t\t<style id=\"loop-dynamic-999\">.e-loop-item-1469 .elementor-element.elementor-element-ebad4ab:not(.elementor-motion-effects-element-type-background), .e-loop-item-1469 .elementor-element.elementor-element-ebad4ab > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-BENIDORM-6-SEC.jpg\");}<\/style><style id=\"loop-999\">\/* Loop Foto: nombre del proyecto y cliente solo en hover, separados del borde *\/\n.proyecto-card .bl-photo-info{position:absolute!important;left:24px;right:24px;bottom:24px;z-index:5;width:auto!important;max-width:none!important;padding:0!important;flex-wrap:wrap;opacity:0;transform:translateY(10px);transition:opacity .35s ease,transform .5s cubic-bezier(.22,1,.36,1);pointer-events:none}\n.proyecto-card::after{content:&quot;&quot;;position:absolute;left:0;right:0;bottom:0;height:45%;background:linear-gradient(to top,rgba(10,20,40,.55),rgba(10,20,40,0));opacity:0;transition:opacity .35s ease;z-index:4;pointer-events:none}\n.proyecto-card:hover .bl-photo-info,.proyecto-card:focus-within .bl-photo-info{opacity:1;transform:none}\n.proyecto-card:hover::after,.proyecto-card:focus-within::after{opacity:1}\n@media (hover:none){.proyecto-card .bl-photo-info{opacity:1;transform:none}.proyecto-card::after{opacity:1}}\n@media (max-width:767px){.proyecto-card .bl-photo-info{left:16px;right:16px;bottom:16px}}\n@media (prefers-reduced-motion:reduce){.proyecto-card .bl-photo-info,.proyecto-card::after{transition:none}}.elementor-999 .elementor-element.elementor-element-ebad4ab{--display:flex;--min-height:500px;--justify-content:flex-end;--align-items:flex-start;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--margin-top:0px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;--padding-top:0px;--padding-bottom:0px;--padding-left:0px;--padding-right:0px;}.elementor-999 .elementor-element.elementor-element-ebad4ab:not(.elementor-motion-effects-element-type-background), .elementor-999 .elementor-element.elementor-element-ebad4ab > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-position:center center;background-repeat:no-repeat;background-size:cover;}.elementor-999 .elementor-element.elementor-element-f4a3c9c{--display:flex;--flex-direction:row;--container-widget-width:calc( ( 1 - var( --container-widget-flex-grow ) ) * 100% );--container-widget-height:100%;--container-widget-flex-grow:1;--container-widget-align-self:stretch;--flex-wrap-mobile:wrap;--justify-content:flex-start;--align-items:center;--gap:10px 10px;--row-gap:10px;--column-gap:10px;--overlay-opacity:0.5;--margin-top:0px;--margin-bottom:0px;--margin-left:0px;--margin-right:0px;--padding-top:0px;--padding-bottom:0px;--padding-left:0px;--padding-right:20px;}.elementor-999 .elementor-element.elementor-element-f4a3c9c::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c > .elementor-background-video-container::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c > .e-con-inner > .elementor-background-video-container::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c > .elementor-background-slideshow::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c > .e-con-inner > .elementor-background-slideshow::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c > .elementor-motion-effects-container > .elementor-motion-effects-layer::before{--background-overlay:'';}.elementor-999 .elementor-element.elementor-element-f4a3c9c:hover::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c:hover > .elementor-background-video-container::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c:hover > .e-con-inner > .elementor-background-video-container::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c > .elementor-background-slideshow:hover::before, .elementor-999 .elementor-element.elementor-element-f4a3c9c > .e-con-inner > .elementor-background-slideshow:hover::before{--background-overlay:'';}.elementor-999 .elementor-element.elementor-element-f4a3c9c:hover{--overlay-opacity:0.5;}.elementor-widget-heading .elementor-heading-title{font-family:var( --e-global-typography-primary-font-family ), Sans-serif;font-weight:var( --e-global-typography-primary-font-weight );color:var( --e-global-color-primary );}.elementor-999 .elementor-element.elementor-element-70bba82 .elementor-heading-title{font-family:\"Inter Tight\", Sans-serif;font-size:20px;font-weight:600;letter-spacing:-0.5px;color:#FFFFFF;}.elementor-999 .elementor-element.elementor-element-56e3912 .elementor-heading-title{font-family:\"Inter Tight\", Sans-serif;font-size:18px;font-weight:500;color:#FFFFFF5C;}.elementor-999 .elementor-element.elementor-element-56e3912{margin:0px 0px calc(var(--kit-widget-spacing, 0px) + 0px) 0px;padding:0px 0px 0px 0px;}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"999\" class=\"elementor elementor-999 swiper-slide e-loop-item e-loop-item-1469 post-1469 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-marina-resort-benidorm\" data-elementor-post-type=\"elementor_library\" role=\"group\" aria-roledescription=\"slide\" data-custom-edit-handle=\"1\">\n\t\t\t<a class=\"elementor-element elementor-element-ebad4ab e-con-full proyecto-card e-flex e-con e-child\" data-id=\"ebad4ab\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/benidorm\/\">\n\t\t\t\t<div class=\"elementor-element elementor-element-de3dfa4 elementor-widget elementor-widget-shortcode\" data-id=\"de3dfa4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f4a3c9c e-con-full bl-photo-info e-flex e-con e-child\" data-id=\"f4a3c9c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-70bba82 elementor-widget elementor-widget-heading\" data-id=\"70bba82\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Benidorm<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-56e3912 elementor-widget elementor-widget-heading\" data-id=\"56e3912\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>Marina Resort Benidorm<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8d06ef9 elementor-widget elementor-widget-html\" data-id=\"8d06ef9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\ndocument.addEventListener('DOMContentLoaded', function () {\n\n    const intervalos = new WeakMap();\n\n\n    \/**\n     * Mostrar una imagen concreta\n     *\/\n    function mostrarImagen(card, index) {\n\n        const imagenes = card.querySelectorAll('.proyecto-hover-img');\n\n        imagenes.forEach(function(img, i) {\n\n            img.classList.toggle(\n                'activa',\n                i === index\n            );\n\n        });\n\n    }\n\n\n    \/**\n     * Iniciar galer\u00eda\n     *\/\n    function iniciarGaleria(card) {\n\n        const imagenes = card.querySelectorAll('.proyecto-hover-img');\n\n        if (!imagenes.length) {\n            return;\n        }\n\n\n        \/* Evitar arrancarla dos veces *\/\n        detenerGaleria(card);\n\n\n        let actual = 0;\n\n\n        \/* Primera imagen inmediatamente *\/\n        mostrarImagen(card, actual);\n\n\n        \/* Si solo hay una imagen no necesitamos intervalo *\/\n        if (imagenes.length === 1) {\n            return;\n        }\n\n\n        const intervalo = setInterval(function () {\n\n            actual++;\n\n            if (actual >= imagenes.length) {\n                actual = 0;\n            }\n\n            mostrarImagen(card, actual);\n\n        }, 1000);\n\n\n        intervalos.set(card, intervalo);\n\n    }\n\n\n    \/**\n     * Detener galer\u00eda\n     *\/\n    function detenerGaleria(card) {\n\n        const intervalo = intervalos.get(card);\n\n        if (intervalo) {\n\n            clearInterval(intervalo);\n\n            intervalos.delete(card);\n\n        }\n\n\n        \/* Quitar todas las im\u00e1genes.\n           As\u00ed vuelve a verse la destacada de fondo *\/\n\n        card\n            .querySelectorAll('.proyecto-hover-img')\n            .forEach(function(img) {\n\n                img.classList.remove('activa');\n\n            });\n\n    }\n\n\n    \/**\n     * HOVER\n     *\n     * Usamos delegaci\u00f3n de eventos.\n     * Esto sigue funcionando aunque Elementor\/Swiper\n     * cree nuevos slides al pulsar las flechas.\n     *\/\n\n    document.addEventListener('mouseover', function(e) {\n\n        const card = e.target.closest('.proyecto-card');\n\n        if (!card) {\n            return;\n        }\n\n\n        \/*\n         * Evita volver a lanzar el evento al pasar\n         * de un elemento interno a otro dentro\n         * de la misma ficha.\n         *\/\n\n        if (\n            e.relatedTarget &&\n            card.contains(e.relatedTarget)\n        ) {\n            return;\n        }\n\n\n        iniciarGaleria(card);\n\n    });\n\n\n    document.addEventListener('mouseout', function(e) {\n\n        const card = e.target.closest('.proyecto-card');\n\n        if (!card) {\n            return;\n        }\n\n\n        \/*\n         * Si seguimos dentro de la misma ficha\n         * no hacemos nada.\n         *\/\n\n        if (\n            e.relatedTarget &&\n            card.contains(e.relatedTarget)\n        ) {\n            return;\n        }\n\n\n        detenerGaleria(card);\n\n    });\n\n});\n<\/script>\n\n\t\t\t\t<\/div>\n\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t<style id=\"loop-dynamic-999\">.e-loop-item-1462 .elementor-element.elementor-element-ebad4ab:not(.elementor-motion-effects-element-type-background), .e-loop-item-1462 .elementor-element.elementor-element-ebad4ab > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-ALTUS-6-SEC.jpg\");}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"999\" class=\"elementor elementor-999 swiper-slide e-loop-item e-loop-item-1462 post-1462 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-altus\" data-elementor-post-type=\"elementor_library\" role=\"group\" aria-roledescription=\"slide\" data-custom-edit-handle=\"1\">\n\t\t\t<a class=\"elementor-element elementor-element-ebad4ab e-con-full proyecto-card e-flex e-con e-child\" data-id=\"ebad4ab\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/para-todas-tus-vidas\/\">\n\t\t\t\t<div class=\"elementor-element elementor-element-de3dfa4 elementor-widget elementor-widget-shortcode\" data-id=\"de3dfa4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f4a3c9c e-con-full bl-photo-info e-flex e-con e-child\" data-id=\"f4a3c9c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-70bba82 elementor-widget elementor-widget-heading\" data-id=\"70bba82\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Para todas tus vidas<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-56e3912 elementor-widget elementor-widget-heading\" data-id=\"56e3912\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>Altus<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8d06ef9 elementor-widget elementor-widget-html\" data-id=\"8d06ef9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\ndocument.addEventListener('DOMContentLoaded', function () {\n\n    const intervalos = new WeakMap();\n\n\n    \/**\n     * Mostrar una imagen concreta\n     *\/\n    function mostrarImagen(card, index) {\n\n        const imagenes = card.querySelectorAll('.proyecto-hover-img');\n\n        imagenes.forEach(function(img, i) {\n\n            img.classList.toggle(\n                'activa',\n                i === index\n            );\n\n        });\n\n    }\n\n\n    \/**\n     * Iniciar galer\u00eda\n     *\/\n    function iniciarGaleria(card) {\n\n        const imagenes = card.querySelectorAll('.proyecto-hover-img');\n\n        if (!imagenes.length) {\n            return;\n        }\n\n\n        \/* Evitar arrancarla dos veces *\/\n        detenerGaleria(card);\n\n\n        let actual = 0;\n\n\n        \/* Primera imagen inmediatamente *\/\n        mostrarImagen(card, actual);\n\n\n        \/* Si solo hay una imagen no necesitamos intervalo *\/\n        if (imagenes.length === 1) {\n            return;\n        }\n\n\n        const intervalo = setInterval(function () {\n\n            actual++;\n\n            if (actual >= imagenes.length) {\n                actual = 0;\n            }\n\n            mostrarImagen(card, actual);\n\n        }, 1000);\n\n\n        intervalos.set(card, intervalo);\n\n    }\n\n\n    \/**\n     * Detener galer\u00eda\n     *\/\n    function detenerGaleria(card) {\n\n        const intervalo = intervalos.get(card);\n\n        if (intervalo) {\n\n            clearInterval(intervalo);\n\n            intervalos.delete(card);\n\n        }\n\n\n        \/* Quitar todas las im\u00e1genes.\n           As\u00ed vuelve a verse la destacada de fondo *\/\n\n        card\n            .querySelectorAll('.proyecto-hover-img')\n            .forEach(function(img) {\n\n                img.classList.remove('activa');\n\n            });\n\n    }\n\n\n    \/**\n     * HOVER\n     *\n     * Usamos delegaci\u00f3n de eventos.\n     * Esto sigue funcionando aunque Elementor\/Swiper\n     * cree nuevos slides al pulsar las flechas.\n     *\/\n\n    document.addEventListener('mouseover', function(e) {\n\n        const card = e.target.closest('.proyecto-card');\n\n        if (!card) {\n            return;\n        }\n\n\n        \/*\n         * Evita volver a lanzar el evento al pasar\n         * de un elemento interno a otro dentro\n         * de la misma ficha.\n         *\/\n\n        if (\n            e.relatedTarget &&\n            card.contains(e.relatedTarget)\n        ) {\n            return;\n        }\n\n\n        iniciarGaleria(card);\n\n    });\n\n\n    document.addEventListener('mouseout', function(e) {\n\n        const card = e.target.closest('.proyecto-card');\n\n        if (!card) {\n            return;\n        }\n\n\n        \/*\n         * Si seguimos dentro de la misma ficha\n         * no hacemos nada.\n         *\/\n\n        if (\n            e.relatedTarget &&\n            card.contains(e.relatedTarget)\n        ) {\n            return;\n        }\n\n\n        detenerGaleria(card);\n\n    });\n\n});\n<\/script>\n\n\t\t\t\t<\/div>\n\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t<style id=\"loop-dynamic-999\">.e-loop-item-127 .elementor-element.elementor-element-ebad4ab:not(.elementor-motion-effects-element-type-background), .e-loop-item-127 .elementor-element.elementor-element-ebad4ab > .elementor-motion-effects-container > .elementor-motion-effects-layer{background-image:url(\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/10\/poster-6-SEG-MEZLAN-WEB.jpg\");}<\/style>\t\t<div data-elementor-type=\"loop-item\" data-elementor-id=\"999\" class=\"elementor elementor-999 swiper-slide e-loop-item e-loop-item-127 post-127 proyectos type-proyectos status-publish has-post-thumbnail hentry categoria-proyecto-fotografia categoria-proyecto-video cliente-mezlan\" data-elementor-post-type=\"elementor_library\" role=\"group\" aria-roledescription=\"slide\" data-custom-edit-handle=\"1\">\n\t\t\t<a class=\"elementor-element elementor-element-ebad4ab e-con-full proyecto-card e-flex e-con e-child\" data-id=\"ebad4ab\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\" href=\"https:\/\/bluelake.milanoproduct.com\/es\/proyectos\/mezclan\/\">\n\t\t\t\t<div class=\"elementor-element elementor-element-de3dfa4 elementor-widget elementor-widget-shortcode\" data-id=\"de3dfa4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n    <div class=\"proyecto-hover-galeria\">\n\n        \n            <img decoding=\"async\"\n                src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_15_MAKING-OF-JAECOO-19-min-1920x2880-1-683x1024.jpg\"\n                class=\"proyecto-hover-img\"\n                alt=\"\"\n            >\n\n        \n            <img decoding=\"async\"\n                src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_21_DSCF3312EDITADA-min-1920x2880-1-683x1024.jpg\"\n                class=\"proyecto-hover-img\"\n                alt=\"\"\n            >\n\n        \n            <img decoding=\"async\"\n                src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/Los-5-mejores-lugares-atardecer-nueva-york-panoramica-del-empire-state-1024x683.jpg\"\n                class=\"proyecto-hover-img\"\n                alt=\"\"\n            >\n\n        \n            <img decoding=\"async\"\n                src=\"https:\/\/bluelake.milanoproduct.com\/wp-content\/uploads\/2026\/09\/imgi_11_DSCF7735-1920x2880-1-683x1024.jpg\"\n                class=\"proyecto-hover-img\"\n                alt=\"\"\n            >\n\n        \n    <\/div>\n\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f4a3c9c e-con-full bl-photo-info e-flex e-con e-child\" data-id=\"f4a3c9c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-70bba82 elementor-widget elementor-widget-heading\" data-id=\"70bba82\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">FW26<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-56e3912 elementor-widget elementor-widget-heading\" data-id=\"56e3912\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"> \/ <span>Mezlan<\/span><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8d06ef9 elementor-widget elementor-widget-html\" data-id=\"8d06ef9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\ndocument.addEventListener('DOMContentLoaded', function () {\n\n    const intervalos = new WeakMap();\n\n\n    \/**\n     * Mostrar una imagen concreta\n     *\/\n    function mostrarImagen(card, index) {\n\n        const imagenes = card.querySelectorAll('.proyecto-hover-img');\n\n        imagenes.forEach(function(img, i) {\n\n            img.classList.toggle(\n                'activa',\n                i === index\n            );\n\n        });\n\n    }\n\n\n    \/**\n     * Iniciar galer\u00eda\n     *\/\n    function iniciarGaleria(card) {\n\n        const imagenes = card.querySelectorAll('.proyecto-hover-img');\n\n        if (!imagenes.length) {\n            return;\n        }\n\n\n        \/* Evitar arrancarla dos veces *\/\n        detenerGaleria(card);\n\n\n        let actual = 0;\n\n\n        \/* Primera imagen inmediatamente *\/\n        mostrarImagen(card, actual);\n\n\n        \/* Si solo hay una imagen no necesitamos intervalo *\/\n        if (imagenes.length === 1) {\n            return;\n        }\n\n\n        const intervalo = setInterval(function () {\n\n            actual++;\n\n            if (actual >= imagenes.length) {\n                actual = 0;\n            }\n\n            mostrarImagen(card, actual);\n\n        }, 1000);\n\n\n        intervalos.set(card, intervalo);\n\n    }\n\n\n    \/**\n     * Detener galer\u00eda\n     *\/\n    function detenerGaleria(card) {\n\n        const intervalo = intervalos.get(card);\n\n        if (intervalo) {\n\n            clearInterval(intervalo);\n\n            intervalos.delete(card);\n\n        }\n\n\n        \/* Quitar todas las im\u00e1genes.\n           As\u00ed vuelve a verse la destacada de fondo *\/\n\n        card\n            .querySelectorAll('.proyecto-hover-img')\n            .forEach(function(img) {\n\n                img.classList.remove('activa');\n\n            });\n\n    }\n\n\n    \/**\n     * HOVER\n     *\n     * Usamos delegaci\u00f3n de eventos.\n     * Esto sigue funcionando aunque Elementor\/Swiper\n     * cree nuevos slides al pulsar las flechas.\n     *\/\n\n    document.addEventListener('mouseover', function(e) {\n\n        const card = e.target.closest('.proyecto-card');\n\n        if (!card) {\n            return;\n        }\n\n\n        \/*\n         * Evita volver a lanzar el evento al pasar\n         * de un elemento interno a otro dentro\n         * de la misma ficha.\n         *\/\n\n        if (\n            e.relatedTarget &&\n            card.contains(e.relatedTarget)\n        ) {\n            return;\n        }\n\n\n        iniciarGaleria(card);\n\n    });\n\n\n    document.addEventListener('mouseout', function(e) {\n\n        const card = e.target.closest('.proyecto-card');\n\n        if (!card) {\n            return;\n        }\n\n\n        \/*\n         * Si seguimos dentro de la misma ficha\n         * no hacemos nada.\n         *\/\n\n        if (\n            e.relatedTarget &&\n            card.contains(e.relatedTarget)\n        ) {\n            return;\n        }\n\n\n        detenerGaleria(card);\n\n    });\n\n});\n<\/script>\n\n\t\t\t\t<\/div>\n\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\" aria-label=\"Previous\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><mask id=\"mask0_109_2\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"24\" height=\"24\"><rect x=\"24\" y=\"24\" width=\"24\" height=\"24\" transform=\"rotate(-180 24 24)\" fill=\"#D9D9D9\"><\/rect><\/mask><g mask=\"url(#mask0_109_2)\"><path d=\"M9.1635 5.33637L10.2328 6.38062L5.35375 11.2596L21.5 11.2596L21.5 12.7594L5.34425 12.7594L10.2077 17.6384L9.1635 18.6826L2.4905 12.0094L9.1635 5.33637Z\" fill=\"white\"><\/path><\/g><\/svg>\t\t\t<\/div>\n\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\" aria-label=\"Next\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><mask id=\"mask0_109_5\" style=\"mask-type:alpha\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"24\" height=\"24\"><rect width=\"24\" height=\"24\" fill=\"#D9D9D9\"><\/rect><\/mask><g mask=\"url(#mask0_109_5)\"><path d=\"M14.8365 18.6636L13.7673 17.6194L18.6462 12.7404H2.5V11.2406H18.6558L13.7923 6.36163L14.8365 5.31738L21.5095 11.9906L14.8365 18.6636Z\" fill=\"white\"><\/path><\/g><\/svg>\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f60d152 e-con-full e-flex e-con e-child\" data-id=\"f60d152\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-7462dc0 e-con-full e-flex e-con e-child\" data-id=\"7462dc0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-2ca58f6 e-con-full e-flex e-con e-child\" data-id=\"2ca58f6\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-8c0923e e-con-full e-flex e-con e-child\" data-id=\"8c0923e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e2d2778 elementor-align-left boton-borde-animado, text-enlace elementor-widget elementor-widget-button\" data-id=\"e2d2778\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"\/photo\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">[ View more ]<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0cc3f9c e-con e-atomic-element e-flexbox-base e-default-div e-0cc3f9c-c3489eb \" data-id=\"0cc3f9c\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"0cc3f9c\">\n    \t\t<div class=\"elementor-element elementor-element-1ae4563 elementor-widget elementor-widget-html\" data-id=\"1ae4563\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* Ajustes visuales *\/\n.text-animation-write {\n  \/* Texto todav\u00eda no escrito *\/\n  --taw-gray: rgba(0, 0, 0, 0.30);\n}\n\n\/* Cada palabra *\/\n.text-animation-write .lztaw-word {\n  display: inline;\n\n  \/*\n   * Cambio PLANO:\n   * - Antes de --taw-fill = color actual\n   * - Despu\u00e9s de --taw-fill = gris\n   *\n   * No existe transici\u00f3n\/degradado entre ambos.\n   *\/\n  background-image: linear-gradient(\n    90deg,\n    currentColor 0%,\n    currentColor var(--taw-fill, 0%),\n    var(--taw-gray) var(--taw-fill, 0%),\n    var(--taw-gray) 100%\n  );\n\n  background-repeat: no-repeat;\n\n  -webkit-background-clip: text;\n  background-clip: text;\n\n  -webkit-text-fill-color: transparent;\n\n  -webkit-box-decoration-break: clone;\n  box-decoration-break: clone;\n\n  text-shadow: none;\n}\n\n\n\/* Accesibilidad *\/\n@media print, (prefers-reduced-motion: reduce), (forced-colors: active) {\n\n  .text-animation-write .lztaw-word {\n    background: none !important;\n    -webkit-text-fill-color: currentColor !important;\n  }\n\n}\n<\/style>\n\n\n<script>\n(() => {\n\n  'use strict';\n\n\n  \/* Evitar inicializaciones duplicadas *\/\n  if (window.__lienzzoTextWrite) return;\n\n  window.__lienzzoTextWrite = true;\n\n\n\n  \/* ==========================\n     AJUSTES DEL RECORRIDO\n  ========================== *\/\n\n  const INICIO = 0.95;\n\n  const FINAL = 0.85;\n\n\n\n  const clamp = value =>\n    Math.max(\n      0,\n      Math.min(1, value)\n    );\n\n\n\n  function init() {\n\n\n    \/* No modificar mientras editamos en Elementor *\/\n    if (\n      document.body.classList.contains(\n        'elementor-editor-active'\n      ) ||\n      window.elementorFrontend?.isEditMode?.()\n    ) {\n      return;\n    }\n\n\n\n    const blocks = [];\n\n\n\n    document\n      .querySelectorAll('.text-animation-write')\n      .forEach(root => {\n\n\n        const target =\n          root.querySelector(\n            '.elementor-heading-title'\n          ) ||\n          root.querySelector(\n            '.elementor-widget-container'\n          ) ||\n          root;\n\n\n\n        \/* ==========================\n           BUSCAR TEXTOS\n        ========================== *\/\n\n        const walker =\n          document.createTreeWalker(\n            target,\n            NodeFilter.SHOW_TEXT,\n            {\n              acceptNode(node) {\n\n                const parent =\n                  node.parentElement;\n\n\n                if (\n                  !node.nodeValue.trim() ||\n                  !parent ||\n                  parent.closest(\n                    '.text-animation-write'\n                  ) !== root ||\n                  parent.closest(\n                    'script, style, noscript, svg, textarea, ' +\n                    '.lztaw-word, [aria-hidden=\"true\"], ' +\n                    '[contenteditable=\"true\"]'\n                  )\n                ) {\n\n                  return NodeFilter.FILTER_REJECT;\n\n                }\n\n\n                return NodeFilter.FILTER_ACCEPT;\n\n              }\n            }\n          );\n\n\n\n        const nodes = [];\n\n\n        while (walker.nextNode()) {\n\n          nodes.push(\n            walker.currentNode\n          );\n\n        }\n\n\n\n        const words = [];\n\n        let total = 0;\n\n\n\n        \/* ==========================\n           CREAR PALABRAS\n        ========================== *\/\n\n        nodes.forEach(node => {\n\n\n          const fragment =\n            document.createDocumentFragment();\n\n\n\n          node.nodeValue\n            .split(\/(\\s+)\/)\n            .forEach(part => {\n\n\n              if (!part) return;\n\n\n\n              \/* Mantener espacios *\/\n              if (!part.trim()) {\n\n                fragment.appendChild(\n                  document.createTextNode(part)\n                );\n\n                return;\n\n              }\n\n\n\n              const span =\n                document.createElement('span');\n\n\n              span.className =\n                'lztaw-word';\n\n\n              span.textContent =\n                part;\n\n\n\n              words.push({\n\n                element: span,\n\n                start: total,\n\n                length: part.length,\n\n                last: null\n\n              });\n\n\n\n              total += part.length;\n\n\n              fragment.appendChild(span);\n\n            });\n\n\n\n          node.replaceWith(fragment);\n\n        });\n\n\n\n        if (words.length) {\n\n          blocks.push({\n\n            target,\n\n            words,\n\n            total,\n\n            progress: -1\n\n          });\n\n        }\n\n      });\n\n\n\n    if (!blocks.length) return;\n\n\n\n    let pending = false;\n\n\n\n    \/* ==========================\n       ACTUALIZAR ANIMACI\u00d3N\n    ========================== *\/\n\n    function update() {\n\n\n      pending = false;\n\n\n      const height =\n        window.innerHeight;\n\n\n      const scroll =\n        window.scrollY;\n\n\n      const maxScroll =\n        Math.max(\n          0,\n          document.documentElement.scrollHeight -\n          height\n        );\n\n\n\n      \/*\n       * Leer primero las posiciones\n       *\/\n      const states =\n        blocks.map(block => {\n\n\n          const rect =\n            block.target\n              .getBoundingClientRect();\n\n\n          if (!rect.height) {\n            return null;\n          }\n\n\n\n          const start =\n            scroll +\n            rect.top -\n            height * INICIO;\n\n\n\n          const end =\n            Math.min(\n              scroll +\n              rect.bottom -\n              height * FINAL,\n\n              maxScroll\n            );\n\n\n\n          const progress =\n            maxScroll === 0\n\n              ? 1\n\n              : clamp(\n                  (scroll - start) \/\n                  Math.max(\n                    1,\n                    end - start\n                  )\n                );\n\n\n          return {\n            block,\n            progress\n          };\n\n        });\n\n\n\n      \/* ==========================\n         RELLENAR TEXTO\n      ========================== *\/\n\n      states.forEach(state => {\n\n\n        if (!state) return;\n\n\n        const {\n          block,\n          progress\n        } = state;\n\n\n\n        if (\n          progress ===\n          block.progress\n        ) {\n          return;\n        }\n\n\n        block.progress =\n          progress;\n\n\n\n        const written =\n          progress *\n          block.total;\n\n\n\n        block.words.forEach(word => {\n\n\n          const fill =\n            (\n              clamp(\n                (\n                  written -\n                  word.start\n                ) \/\n                word.length\n              ) *\n              100\n            )\n              .toFixed(2) +\n            '%';\n\n\n\n          if (\n            fill !==\n            word.last\n          ) {\n\n            word.element\n              .style\n              .setProperty(\n                '--taw-fill',\n                fill\n              );\n\n\n            word.last =\n              fill;\n\n          }\n\n        });\n\n      });\n\n    }\n\n\n\n    \/* ==========================\n       REQUEST ANIMATION FRAME\n    ========================== *\/\n\n    function schedule() {\n\n\n      if (pending) return;\n\n\n      pending = true;\n\n\n      requestAnimationFrame(\n        update\n      );\n\n    }\n\n\n\n    window.addEventListener(\n      'scroll',\n      schedule,\n      {\n        passive: true\n      }\n    );\n\n\n    window.addEventListener(\n      'resize',\n      schedule\n    );\n\n\n    window.addEventListener(\n      'pageshow',\n      schedule\n    );\n\n\n    document.addEventListener(\n      'load',\n      schedule,\n      true\n    );\n\n\n\n    if (document.fonts) {\n\n      document.fonts\n        .ready\n        .then(schedule);\n\n    }\n\n\n\n    schedule();\n\n  }\n\n\n\n  if (\n    document.readyState ===\n    'loading'\n  ) {\n\n    document.addEventListener(\n      'DOMContentLoaded',\n      init,\n      {\n        once: true\n      }\n    );\n\n  } else {\n\n    init();\n\n  }\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e51e765 elementor-widget elementor-widget-html\" data-id=\"e51e765\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* Ocultar el texto mientras se prepara, solo cuando hay JavaScript. *\/\nhtml.lztw-loading .text-animation-writting:not(.lztw-ready) {\n  visibility: hidden;\n}\n\n\/* Letras transparentes: sin texto gris ni otra capa debajo. *\/\n.text-animation-writting.lztw-ready .lztw-char {\n  display: inline;\n  opacity: 0;\n}\n\n\/* Aparici\u00f3n autom\u00e1tica, letra a letra. *\/\n.text-animation-writting.lztw-visible .lztw-char {\n  animation: lztw-aparecer var(--lztw-duration, 350ms) ease-out both;\n  animation-delay: var(--lztw-delay, 0ms);\n}\n\n@keyframes lztw-aparecer {\n  from { opacity: 0; }\n  to   { opacity: 1; }\n}\n\n\/* Mostrar todo al acceder mediante teclado. *\/\n.text-animation-writting.lztw-instant .lztw-char {\n  opacity: 1;\n  animation: none;\n}\n\n\/* Mostrar el texto completo al imprimir o reducir el movimiento. *\/\n@media print, (prefers-reduced-motion: reduce) {\n  html .text-animation-writting {\n    visibility: visible !important;\n  }\n\n  .text-animation-writting .lztw-char {\n    opacity: 1 !important;\n    animation: none !important;\n  }\n}\n<\/style>\n\n<script>\n(() => {\n  'use strict';\n\n  \/\/ Evitar ejecutar el c\u00f3digo dos veces.\n  if (window.__lienzzoAutoWritting) return;\n  window.__lienzzoAutoWritting = true;\n\n  \/* AJUSTES: valores en milisegundos. *\/\n  const PASO = 35;      \/\/ Separaci\u00f3n entre la aparici\u00f3n de cada letra.\n  const DURACION = 350; \/\/ Duraci\u00f3n del fundido de cada letra.\n  const ESPERA = 100;   \/\/ Pausa inicial al entrar en pantalla.\n\n  const SELECTOR = '.text-animation-writting';\n  const html = document.documentElement;\n\n  const editing = () =>\n    document.body?.classList.contains('elementor-editor-active') ||\n    window.elementorFrontend?.isEditMode?.();\n\n  \/\/ Mantener el texto normal dentro del editor o sin animaciones.\n  if (\n    editing() ||\n    !('IntersectionObserver' in window) ||\n    window.matchMedia('(prefers-reduced-motion: reduce)').matches\n  ) return;\n\n  html.classList.add('lztw-loading');\n\n  \/\/ Evitar que el texto quede oculto si la carga se interrumpe.\n  const safety = setTimeout(() => {\n    html.classList.remove('lztw-loading');\n  }, 5000);\n\n  function init() {\n    try {\n      if (editing()) return;\n\n      \/\/ Separar letras respetando los caracteres compuestos.\n      const segmenter = typeof Intl.Segmenter === 'function'\n        ? new Intl.Segmenter(undefined, { granularity: 'grapheme' })\n        : null;\n\n      \/\/ Activar cada texto una sola vez al entrar en pantalla.\n      const observer = new IntersectionObserver(entries => {\n        entries.forEach(entry => {\n          if (!entry.isIntersecting) return;\n\n          entry.target.classList.add('lztw-visible');\n          observer.unobserve(entry.target);\n        });\n      }, { threshold: 0 });\n\n      document.querySelectorAll(SELECTOR).forEach(root => {\n        if (root.classList.contains('lztw-ready')) return;\n\n        const target =\n          root.querySelector('.elementor-heading-title') ||\n          root.querySelector('.elementor-widget-container') ||\n          root;\n\n        \/\/ Recorrer el texto conservando enlaces, negritas y p\u00e1rrafos.\n        const walker = document.createTreeWalker(\n          target,\n          NodeFilter.SHOW_TEXT,\n          {\n            acceptNode(node) {\n              const parent = node.parentElement;\n\n              const excluded = parent?.closest(\n                'script, style, noscript, svg, textarea, .lztw-char, ' +\n                '.screen-reader-text, .elementor-screen-only, ' +\n                '[aria-hidden=\"true\"], [contenteditable=\"true\"]'\n              );\n\n              return node.nodeValue.trim() && !excluded &&\n                parent?.closest(SELECTOR) === root\n                ? NodeFilter.FILTER_ACCEPT\n                : NodeFilter.FILTER_REJECT;\n            }\n          }\n        );\n\n        const nodes = [];\n\n        while (walker.nextNode()) {\n          nodes.push(walker.currentNode);\n        }\n\n        let index = 0;\n\n        nodes.forEach(node => {\n          const fragment = document.createDocumentFragment();\n\n          const letters = segmenter\n            ? Array.from(segmenter.segment(node.nodeValue), s => s.segment)\n            : Array.from(node.nodeValue);\n\n          letters.forEach(letter => {\n            \/\/ Conservar los espacios originales.\n            if (\/^\\s+$\/.test(letter)) {\n              fragment.appendChild(document.createTextNode(letter));\n              return;\n            }\n\n            const span = document.createElement('span');\n            span.className = 'lztw-char';\n            span.textContent = letter;\n\n            span.style.setProperty(\n              '--lztw-delay',\n              `${ESPERA + index * PASO}ms`\n            );\n\n            fragment.appendChild(span);\n            index++;\n          });\n\n          node.replaceWith(fragment);\n        });\n\n        if (!index) return;\n\n        root.style.setProperty('--lztw-duration', `${DURACION}ms`);\n        root.classList.add('lztw-ready');\n\n        observer.observe(root);\n\n        \/\/ Evitar enlaces invisibles al navegar con el teclado.\n        root.addEventListener('focusin', () => {\n          root.classList.add('lztw-instant');\n          observer.unobserve(root);\n        }, { once: true });\n      });\n    } finally {\n      clearTimeout(safety);\n      html.classList.remove('lztw-loading');\n    }\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init, { once: true });\n  } else {\n    init();\n  }\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a9ba110 elementor-widget elementor-widget-html\" data-id=\"a9ba110\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* CONFIGURACI\u00d3N DEL BORDE *\/\n.borde-animado {\n  --borde-color: #ffffff20;\n  --borde-grosor: 1px;\n  --borde-duracion: 1.4s;\n\n  position: relative;\n  border-top-width: 0 !important;\n}\n\n\/* L\u00ednea independiente: no utiliza los fondos de Elementor *\/\n.borde-animado > .linea-borde-animado {\n  position: absolute;\n  display: block;\n  top: 0;\n  left: 0;\n\n  width: 100%;\n  height: var(--borde-grosor);\n  margin: 0;\n  padding: 0;\n  background: var(--borde-color);\n\n  transform: scaleX(0);\n  transform-origin: left center;\n  transition: transform var(--borde-duracion)\n              cubic-bezier(0.22, 1, 0.36, 1);\n\n  pointer-events: none;\n  z-index: 3;\n}\n\n\/* Estado visible *\/\n.borde-animado.borde-visible > .linea-borde-animado {\n  transform: scaleX(1);\n}\n\n\/* Accesibilidad: sin animaci\u00f3n cuando se solicita menos movimiento *\/\n@media (prefers-reduced-motion: reduce) {\n  .borde-animado > .linea-borde-animado {\n    transform: scaleX(1);\n    transition: none;\n  }\n}\n<\/style>\n\n<script>\n(() => {\n  function iniciarBordes() {\n    const contenedores = document.querySelectorAll(\n      '.borde-animado:not([data-borde-iniciado])'\n    );\n\n    if (!contenedores.length) return;\n\n    const observador = 'IntersectionObserver' in window\n      ? new IntersectionObserver((entradas, observer) => {\n          entradas.forEach(entrada => {\n            if (!entrada.isIntersecting) return;\n\n            entrada.target.classList.add('borde-visible');\n\n            \/* Se anima una sola vez por carga de p\u00e1gina *\/\n            observer.unobserve(entrada.target);\n          });\n        }, {\n          threshold: 0,\n          rootMargin: '0px 0px -30px 0px'\n        })\n      : null;\n\n    contenedores.forEach(contenedor => {\n      contenedor.setAttribute('data-borde-iniciado', 'true');\n\n      const linea = document.createElement('span');\n      linea.className = 'linea-borde-animado';\n      linea.setAttribute('aria-hidden', 'true');\n      contenedor.appendChild(linea);\n\n      if (!observador) {\n        contenedor.classList.add('borde-visible');\n        return;\n      }\n\n      \/* Permite pintar el estado inicial antes de animar *\/\n      requestAnimationFrame(() => {\n        requestAnimationFrame(() => {\n          observador.observe(contenedor);\n        });\n      });\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', iniciarBordes, {\n      once: true\n    });\n  } else {\n    iniciarBordes();\n  }\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-efbf141 elementor-widget elementor-widget-html\" data-id=\"efbf141\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n.boton-borde-animado {\n  --borde-duracion: 0.8s;\n}\n\n\/* Conserva los colores y el grosor configurados en Elementor *\/\n.boton-borde-animado .elementor-button {\n  position: relative;\n  overflow: visible;\n\n  \/* Oculta visualmente el borde original sin perder sus ajustes *\/\n  border-image: linear-gradient(transparent, transparent) 1 !important;\n\n  \/* El color del borde se anima mediante las l\u00edneas inferiores *\/\n  transition-property:\n    color,\n    background-color,\n    box-shadow,\n    transform,\n    opacity !important;\n}\n\n\/* Dos l\u00edneas que heredan el borde inferior de Elementor *\/\n.boton-borde-animado .elementor-button::before,\n.boton-borde-animado .elementor-button::after {\n  content: \"\";\n  position: absolute;\n  top: 100%;\n  left: 0;\n\n  width: 100%;\n  height: 0;\n  margin: 0;\n  padding: 0;\n\n  box-sizing: content-box;\n  background: none;\n  border: 0;\n  border-bottom: inherit;\n\n  pointer-events: none;\n  z-index: 2;\n}\n\n\/* L\u00ednea base: conserva el color normal mientras entra el hover *\/\n.boton-borde-animado .elementor-button::before {\n  transition: border-bottom-color 0s linear;\n}\n\n\/* L\u00ednea animada: utiliza el color hover del propio bot\u00f3n *\/\n.boton-borde-animado .elementor-button::after {\n  transform: scaleX(0);\n  transform-origin: left center;\n\n  transition:\n    transform var(--borde-duracion)\n      cubic-bezier(0.22, 1, 0.36, 1),\n    border-bottom-color 0s linear var(--borde-duracion);\n}\n\n\/* Evita que toda la l\u00ednea cambie de color de golpe *\/\n.boton-borde-animado .elementor-button:hover::before,\n.boton-borde-animado .elementor-button:focus-visible::before {\n  transition-delay: var(--borde-duracion);\n}\n\n\/* Dibuja el borde de izquierda a derecha *\/\n.boton-borde-animado .elementor-button:hover::after,\n.boton-borde-animado .elementor-button:focus-visible::after {\n  transform: scaleX(1);\n  transition-delay: 0s, 0s;\n}\n\n\/* Accesibilidad *\/\n@media (prefers-reduced-motion: reduce) {\n  .boton-borde-animado .elementor-button::before,\n  .boton-borde-animado .elementor-button::after {\n    transition: none;\n  }\n}\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c1bcf5a elementor-widget elementor-widget-html\" data-id=\"c1bcf5a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n.text-enlace {\n  \/* AJUSTES DE LA ANIMACI\u00d3N *\/\n  --te-duracion: 500ms;\n  --te-paso: 22ms;\n}\n\n.lzte-word,\n.lzte-char,\n.lzte-copy {\n  text-decoration: inherit;\n}\n\n\/* M\u00e1scara: oculta las letras al salir por arriba o entrar por abajo. *\/\n.lzte-word {\n  display: inline-block;\n  overflow: hidden;\n  vertical-align: bottom;\n  white-space: nowrap;\n  padding-inline: 0.08em;\n  margin-inline: -0.08em;\n}\n\n\/* Letra original. *\/\n.lzte-char {\n  position: relative;\n  display: inline-block;\n  transform: translateY(0);\n\n  transition:\n    transform var(--te-duracion, 500ms)\n    cubic-bezier(0.76, 0, 0.24, 1);\n\n  transition-delay:\n    calc(var(--te-i, 0) * var(--te-paso, 22ms));\n}\n\n\/* Copia situada justo debajo de la original. *\/\n.lzte-copy {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  user-select: none;\n  pointer-events: none;\n}\n\n\/* Hover: ambas letras suben al mismo tiempo. *\/\n@media (hover: hover) {\n  .lzte-hover:hover .lzte-char {\n    transform: translateY(-100%);\n  }\n}\n\n\/* Activar tambi\u00e9n al enfocar el enlace con el teclado. *\/\n.lzte-hover:focus-visible .lzte-char {\n  transform: translateY(-100%);\n}\n\n\/* Texto original para lectores de pantalla. *\/\n.lzte-sr {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip-path: inset(50%);\n  white-space: nowrap;\n  border: 0;\n  user-select: none;\n}\n\n\/* Sin movimiento al imprimir o reducir las animaciones. *\/\n@media (prefers-reduced-motion: reduce), print {\n  .lzte-hover .lzte-char {\n    transform: none !important;\n    transition: none !important;\n  }\n}\n<\/style>\n\n<script>\n(() => {\n  'use strict';\n\n  \/\/ Evitar ejecutar el c\u00f3digo m\u00e1s de una vez.\n  if (window.__lienzzoTextEnlace) return;\n  window.__lienzzoTextEnlace = true;\n\n  const segmenter = typeof Intl.Segmenter === 'function'\n    ? new Intl.Segmenter('es', { granularity: 'grapheme' })\n    : null;\n\n  function prepare(target) {\n    if (target.classList.contains('lzte-hover')) return;\n\n    \/\/ Recorrer los textos sin sustituir enlaces ni otros elementos.\n    const walker = document.createTreeWalker(\n      target,\n      NodeFilter.SHOW_TEXT,\n      {\n        acceptNode(node) {\n          const excluded = node.parentElement?.closest(\n            'script, style, noscript, svg, textarea, ' +\n            '[aria-hidden=\"true\"], [contenteditable=\"true\"], ' +\n            '.lzte-sr, .screen-reader-text, .elementor-screen-only, ' +\n            '.elementor-button-icon, .elementor-icon, .sub-arrow'\n          );\n\n          return node.nodeValue.trim() && !excluded\n            ? NodeFilter.FILTER_ACCEPT\n            : NodeFilter.FILTER_REJECT;\n        }\n      }\n    );\n\n    const nodes = [];\n\n    while (walker.nextNode()) {\n      nodes.push(walker.currentNode);\n    }\n\n    let index = 0;\n\n    nodes.forEach(node => {\n      const fragment = document.createDocumentFragment();\n\n      \/\/ Conservar el texto completo para accesibilidad.\n      const original = document.createElement('span');\n      original.className = 'lzte-sr';\n      original.textContent = node.nodeValue;\n\n      fragment.appendChild(original);\n\n      \/\/ Separar por palabras conservando los espacios.\n      node.nodeValue.split(\/(\\s+)\/).forEach(part => {\n        if (!part) return;\n\n        if (\/^\\s+$\/.test(part)) {\n          fragment.appendChild(document.createTextNode(part));\n          return;\n        }\n\n        const word = document.createElement('span');\n        word.className = 'lzte-word';\n        word.setAttribute('aria-hidden', 'true');\n\n        const letters = segmenter\n          ? Array.from(\n              segmenter.segment(part),\n              item => item.segment\n            )\n          : Array.from(part);\n\n        letters.forEach(letter => {\n          const char = document.createElement('span');\n          char.className = 'lzte-char';\n          char.style.setProperty('--te-i', index++);\n          char.textContent = letter;\n\n          const copy = document.createElement('span');\n          copy.className = 'lzte-copy';\n          copy.textContent = letter;\n\n          char.appendChild(copy);\n          word.appendChild(char);\n        });\n\n        fragment.appendChild(word);\n      });\n\n      node.replaceWith(fragment);\n    });\n\n    if (index) {\n      target.classList.add('lzte-hover');\n    }\n  }\n\n  function init() {\n    \/\/ Mantener el contenido sin dividir mientras se edita.\n    if (\n      document.body.classList.contains('elementor-editor-active') ||\n      window.elementorFrontend?.isEditMode?.()\n    ) return;\n\n    document.querySelectorAll('.text-enlace').forEach(root => {\n      \/\/ Si hay varios enlaces, cada uno se anima por separado.\n      let targets = root.matches('a, button')\n        ? [root]\n        : Array.from(root.querySelectorAll('a, button'));\n\n      \/\/ Permitir tambi\u00e9n encabezados o textos sin enlace.\n      if (!targets.length) {\n        targets = [\n          root.querySelector('.elementor-heading-title') ||\n          root.querySelector('.elementor-widget-container') ||\n          root\n        ];\n      }\n\n      targets.forEach(prepare);\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener(\n      'DOMContentLoaded',\n      init,\n      { once: true }\n    );\n  } else {\n    init();\n  }\n\n  window.addEventListener('load', init, { once: true });\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a3945bb elementor-widget elementor-widget-html\" data-id=\"a3945bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\ndocument.addEventListener('DOMContentLoaded', function () {\n\n    function actualizarCentro(carrusel) {\n\n        const swiper = carrusel.querySelector('.swiper');\n\n        if (!swiper) return;\n\n        const slides = swiper.querySelectorAll('.swiper-slide');\n\n        if (!slides.length) return;\n\n\n        \/* Centro horizontal del carrusel *\/\n        const swiperRect = swiper.getBoundingClientRect();\n        const centroCarrusel =\n            swiperRect.left + (swiperRect.width \/ 2);\n\n\n        let slideCentral = null;\n        let distanciaMinima = Infinity;\n\n\n        slides.forEach(function(slide) {\n\n            const rect = slide.getBoundingClientRect();\n\n            const centroSlide =\n                rect.left + (rect.width \/ 2);\n\n            const distancia =\n                Math.abs(centroCarrusel - centroSlide);\n\n\n            if (distancia < distanciaMinima) {\n\n                distanciaMinima = distancia;\n                slideCentral = slide;\n\n            }\n\n        });\n\n\n        \/* Quitamos clase anterior *\/\n        slides.forEach(function(slide) {\n            slide.classList.remove('es-central');\n        });\n\n\n        \/* Marcamos la ficha central *\/\n        if (slideCentral) {\n            slideCentral.classList.add('es-central');\n        }\n\n    }\n\n\n\n    function iniciarCarruseles() {\n\n        document\n            .querySelectorAll('.proyectos-carrusel')\n            .forEach(function(carrusel) {\n\n                if (carrusel.dataset.centroIniciado) {\n                    return;\n                }\n\n                carrusel.dataset.centroIniciado = '1';\n\n\n                \/*\n                 * Primera detecci\u00f3n\n                 *\/\n                actualizarCentro(carrusel);\n\n\n                \/*\n                 * Durante movimiento \/ flechas \/ drag\n                 *\/\n                const swiper =\n                    carrusel.querySelector('.swiper');\n\n                if (swiper) {\n\n                    const observer = new MutationObserver(function() {\n\n                        requestAnimationFrame(function() {\n                            actualizarCentro(carrusel);\n                        });\n\n                    });\n\n\n                    observer.observe(swiper, {\n                        subtree: true,\n                        attributes: true,\n                        attributeFilter: ['style', 'class']\n                    });\n\n                }\n\n\n                \/*\n                 * Flechas\n                 *\/\n                carrusel.addEventListener('click', function() {\n\n                    setTimeout(function() {\n                        actualizarCentro(carrusel);\n                    }, 50);\n\n                    setTimeout(function() {\n                        actualizarCentro(carrusel);\n                    }, 500);\n\n                });\n\n            });\n\n    }\n\n\n    iniciarCarruseles();\n\n\n    \/*\n     * Responsive\n     *\/\n    window.addEventListener('resize', function() {\n\n        document\n            .querySelectorAll('.proyectos-carrusel')\n            .forEach(actualizarCentro);\n\n    });\n\n});\n<\/script>\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Desde 2021. \u00a9 2021 [ contact@bluelake.es ] Valencia \u2013 Worldwide Two guys making your brand look sexy FILM \u00b7 PHOTO \u00b7 MEDIA HOUSE \u00b7 CREATIVE \u00b7 BLUE LAKE FILM BlueLake is a creative media house crafting bold visual stories through film, photography and creative direction For ambitious brands, artists and projects. Get to Know Brands [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-7","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/bluelake.milanoproduct.com\/es\/wp-json\/wp\/v2\/pages\/7","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bluelake.milanoproduct.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bluelake.milanoproduct.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bluelake.milanoproduct.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bluelake.milanoproduct.com\/es\/wp-json\/wp\/v2\/comments?post=7"}],"version-history":[{"count":421,"href":"https:\/\/bluelake.milanoproduct.com\/es\/wp-json\/wp\/v2\/pages\/7\/revisions"}],"predecessor-version":[{"id":1575,"href":"https:\/\/bluelake.milanoproduct.com\/es\/wp-json\/wp\/v2\/pages\/7\/revisions\/1575"}],"wp:attachment":[{"href":"https:\/\/bluelake.milanoproduct.com\/es\/wp-json\/wp\/v2\/media?parent=7"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}