{"version":3,"file":"HTML_embed.DgrbCDD9.mjs","names":["React.useRef","React.useState"],"sources":["https:/framerusercontent.com/modules/hNkKBFG5Hdq9PcPQ2fDj/WFE15Gjuj3eQ6t5OJs2O/HTML_embed.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType}from\"framer\";export default function HTMLEmbed(props){const{htmlFile,minHeight,fallbackHeight,maxHeight,autoHeight,headerOffset,backgroundColor,borderRadius,loadingText,errorText,style}=props;const iframeRef=React.useRef(null);const containerRef=React.useRef(null);const[html,setHtml]=React.useState(null);const[height,setHeight]=React.useState(fallbackHeight);const[loading,setLoading]=React.useState(false);const[error,setError]=React.useState(false);const[useDirectURL,setUseDirectURL]=React.useState(false);// =============================================================\n// CARGAR ARCHIVO HTML\n// =============================================================\nReact.useEffect(()=>{if(!htmlFile){setHtml(null);setLoading(false);setError(false);setUseDirectURL(false);setHeight(fallbackHeight);return;}let cancelled=false;async function loadHTML(){setLoading(true);setError(false);setHtml(null);setUseDirectURL(false);setHeight(fallbackHeight);try{const response=await fetch(htmlFile);if(!response.ok){throw new Error(`No se pudo cargar el archivo: ${response.status}`);}const text=await response.text();if(cancelled)return;const preparedHTML=prepareHTML(text,htmlFile,autoHeight);setHtml(preparedHTML);setLoading(false);}catch(err){console.warn(\"No se pudo cargar el HTML mediante fetch. Se usar\\xe1 el archivo directamente en el iframe.\",err);if(cancelled)return;/*\n                 * Algunos hosts/CDN pueden bloquear fetch por CORS.\n                 *\n                 * En ese caso cargamos directamente la URL en el iframe.\n                 *\n                 * IMPORTANTE:\n                 * en ese modo no podemos inyectar nuestro script dentro\n                 * del HTML y por lo tanto no podemos medir la altura real.\n                 */setUseDirectURL(true);setLoading(false);setHeight(fallbackHeight);}}loadHTML();return()=>{cancelled=true;};},[htmlFile,autoHeight,fallbackHeight]);// =============================================================\n// ESCUCHAR MENSAJES DEL HTML\n// =============================================================\nReact.useEffect(()=>{function receiveMessage(event){const data=event.data;if(!data)return;// ---------------------------------------------------------\n// AUTO HEIGHT\n// ---------------------------------------------------------\nif(data.type===\"FRAMER_HTML_HEIGHT\"&&autoHeight){const receivedHeight=Number(data.height);if(!Number.isFinite(receivedHeight))return;let nextHeight=Math.max(Math.ceil(receivedHeight),minHeight);if(maxHeight>0){nextHeight=Math.min(nextHeight,maxHeight);}setHeight(current=>{/*\n                     * Evitamos renders constantes por\n                     * diferencias subpixel insignificantes.\n                     */if(Math.abs(current-nextHeight)<2){return current;}return nextHeight;});return;}// ---------------------------------------------------------\n// NAVEGACIÓN INTERNA / ANCLAS\n// ---------------------------------------------------------\nif(data.type===\"FRAMER_HTML_ANCHOR\"){const targetTop=Number(data.top);if(!Number.isFinite(targetTop))return;if(!containerRef.current)return;const componentTop=containerRef.current.getBoundingClientRect().top+window.scrollY;const scrollPosition=componentTop+targetTop-headerOffset;window.scrollTo({top:Math.max(0,scrollPosition),behavior:\"smooth\"});}}window.addEventListener(\"message\",receiveMessage);return()=>{window.removeEventListener(\"message\",receiveMessage);};},[autoHeight,minHeight,maxHeight,headerOffset]);// =============================================================\n// SIN ARCHIVO\n// =============================================================\nif(!htmlFile){return /*#__PURE__*/_jsx(Placeholder,{style:style,height:minHeight,borderRadius:borderRadius,background:backgroundColor});}// =============================================================\n// LOADING\n// =============================================================\nif(loading){return /*#__PURE__*/_jsx(Status,{text:loadingText,height:minHeight,borderRadius:borderRadius,background:backgroundColor,style:style});}// =============================================================\n// ERROR\n// =============================================================\nif(error){return /*#__PURE__*/_jsx(Status,{text:errorText,height:minHeight,borderRadius:borderRadius,background:backgroundColor,style:style});}// =============================================================\n// ALTURA FINAL\n// =============================================================\nconst finalHeight=autoHeight?height:fallbackHeight;// =============================================================\n// RENDER\n// =============================================================\nreturn /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{/*\n                 * Primero dejamos que Framer pase\n                 * position, flexItem, etc.\n                 *\n                 * PERO después sobrescribimos width/height\n                 * para que Framer no pueda pisar\n                 * la altura calculada.\n                 */...style,width:\"100%\",height:`${finalHeight}px`,minHeight:`${minHeight}px`,position:style?.position??\"relative\",overflow:\"hidden\",borderRadius,background:backgroundColor,boxSizing:\"border-box\"},children:/*#__PURE__*/_jsx(\"iframe\",{ref:iframeRef,title:\"HTML Embed\",src:useDirectURL?htmlFile:undefined,srcDoc:!useDirectURL?html??undefined:undefined,scrolling:\"no\",style:{display:\"block\",width:\"100%\",height:\"100%\",border:\"none\",margin:0,padding:0,overflow:\"hidden\",background:\"transparent\"},allow:\"fullscreen; clipboard-read; clipboard-write\",onError:()=>{setError(true);}})});}// =============================================================\n// PREPARAR HTML\n// =============================================================\nfunction prepareHTML(originalHTML,fileURL,autoHeight){let html=originalHTML;// =============================================================\n// BASE URL\n// =============================================================\n/*\n     * Si el HTML utiliza imágenes, CSS, JS u otros recursos\n     * con URLs relativas, <base> hace que sigan apuntando\n     * a la carpeta donde estaba el archivo original.\n     */let baseURL=fileURL;try{const url=new URL(fileURL);const path=url.pathname;const folder=path.substring(0,path.lastIndexOf(\"/\")+1);baseURL=`${url.origin}${folder}`;}catch{/*\n         * Si no podemos parsear la URL\n         * simplemente seguimos.\n         */}const baseTag=`<base href=\"${escapeAttribute(baseURL)}\">`;if(/<head[^>]*>/i.test(html)){html=html.replace(/<head([^>]*)>/i,`<head$1>${baseTag}`);}else{html=`${baseTag}${html}`;}// =============================================================\n// ESTILOS AUXILIARES\n// =============================================================\n/*\n     * Evitamos que html/body generen una altura\n     * basada en el viewport del iframe.\n     */const helperStyles=`\n<style id=\"framer-html-embed-helper\">\n\n    html {\n        width: 100%;\n        height: auto !important;\n        min-height: 0 !important;\n\n        margin: 0 !important;\n        padding: 0 !important;\n\n        overflow-x: hidden !important;\n        overflow-y: hidden !important;\n    }\n\n    html,\nbody {\n    width: 100% !important;\n    height: auto !important;\n    min-height: 0 !important;\n\n    margin: 0 !important;\n    padding: 0 !important;\n\n    overflow-x: hidden !important;\n    overflow-y: hidden !important;\n}\n\n</style>\n`;if(/<\\/head>/i.test(html)){html=html.replace(/<\\/head>/i,`${helperStyles}</head>`);}else{html=`${helperStyles}${html}`;}if(!autoHeight)return html;// =============================================================\n// SCRIPT DE AUTO HEIGHT\n// =============================================================\nconst heightScript=`\n<script id=\"framer-html-embed-helper-script\">\n\n(function () {\n\n    // =========================================================\n    // VARIABLES\n    // =========================================================\n\n    let lastHeight = 0;\n    let raf = null;\n\n    let previousMeasuredHeight = 0;\n    let stableFrames = 0;\n\n    let settleTimer = null;\n\n\n    // =========================================================\n    // NAVEGACI\\xd3N INTERNA / ANCLAS\n    // =========================================================\n\n    document.addEventListener(\n        \"click\",\n        function(event) {\n\n            const target =\n                event.target instanceof Element\n                    ? event.target\n                    : null;\n\n            if (!target) return;\n\n            const link =\n                target.closest(\n                    'a[href^=\"#\"]'\n                );\n\n            if (!link) return;\n\n            const href =\n                link.getAttribute(\"href\");\n\n            if (!href || href === \"#\") {\n                return;\n            }\n\n            const id =\n                decodeURIComponent(\n                    href.substring(1)\n                );\n\n            const anchor =\n                document.getElementById(id);\n\n            if (!anchor) return;\n\n            event.preventDefault();\n\n            /*\n             * Posici\\xf3n del elemento\n             * dentro del documento HTML.\n             */\n\n            const rect =\n                anchor.getBoundingClientRect();\n\n            const top =\n                rect.top +\n                window.scrollY;\n\n            /*\n             * Le pedimos al componente Framer\n             * que haga el scroll de la p\\xe1gina.\n             */\n\n            window.parent.postMessage(\n                {\n                    type:\n                        \"FRAMER_HTML_ANCHOR\",\n\n                    top: top,\n\n                    id: id\n                },\n                \"*\"\n            );\n        }\n    );\n\n\n    // =========================================================\n    // CALCULAR ALTURA DEL DOCUMENTO\n    // =========================================================\n\n    function getDocumentHeight() {\n\n    const body = document.body;\n    const root = document.documentElement;\n\n    if (!body || !root) {\n        return 0;\n    }\n\n    let maxBottom = 0;\n\n    /*\n     * Tomamos como referencia el comienzo real del body.\n     */\n    const bodyRect =\n        body.getBoundingClientRect();\n\n    const bodyTop =\n        bodyRect.top +\n        window.scrollY;\n\n    /*\n     * Recorremos todos los elementos visibles.\n     *\n     * No usamos scrollHeight porque algunos HTML\n     * tienen wrappers con min-height, height:100%,\n     * grids, etc. que generan espacio vac\\xedo.\n     */\n    const elements =\n        document.querySelectorAll(\"body *\");\n\n    elements.forEach(function(element) {\n\n        try {\n\n            const style =\n                window.getComputedStyle(element);\n\n            /*\n             * Ignorar elementos que no ocupan\n             * espacio visual.\n             */\n            if (\n                style.display === \"none\" ||\n                style.visibility === \"hidden\"\n            ) {\n                return;\n            }\n\n            const rect =\n                element.getBoundingClientRect();\n\n            /*\n             * Ignoramos elementos sin tama\\xf1o.\n             */\n            if (\n                rect.width === 0 &&\n                rect.height === 0\n            ) {\n                return;\n            }\n\n            /*\n             * Elementos fixed no forman parte\n             * de la altura natural del documento.\n             */\n            if (\n                style.position === \"fixed\"\n            ) {\n                return;\n            }\n\n            const bottom =\n                rect.bottom +\n                window.scrollY -\n                bodyTop;\n\n            if (\n                Number.isFinite(bottom)\n            ) {\n                maxBottom =\n                    Math.max(\n                        maxBottom,\n                        bottom\n                    );\n            }\n\n        } catch (error) {}\n\n    });\n\n    /*\n     * Tambi\\xe9n contemplamos el propio body\n     * por si tiene padding inferior real.\n     */\n    const bodyBottom =\n        bodyRect.bottom +\n        window.scrollY -\n        bodyTop;\n\n    maxBottom =\n        Math.max(\n            maxBottom,\n            bodyBottom\n        );\n\n    return Math.max(\n        1,\n        Math.ceil(maxBottom)\n    );\n}\n\n\n    // =========================================================\n    // ENVIAR ALTURA A FRAMER\n    // =========================================================\n\n    function postHeight(height) {\n\n        if (!height) return;\n\n        if (\n            Math.abs(\n                height -\n                lastHeight\n            ) < 2\n        ) {\n            return;\n        }\n\n        lastHeight = height;\n\n        window.parent.postMessage(\n            {\n                type:\n                    \"FRAMER_HTML_HEIGHT\",\n\n                height:\n                    Math.ceil(height)\n            },\n            \"*\"\n        );\n    }\n\n\n    // =========================================================\n    // MEDICI\\xd3N ESTABILIZADA\n    // =========================================================\n\n    function sendHeight() {\n\n        if (raf) {\n            cancelAnimationFrame(\n                raf\n            );\n        }\n\n        stableFrames = 0;\n\n        previousMeasuredHeight = 0;\n\n\n        function measure() {\n\n            const height =\n                getDocumentHeight();\n\n            if (!height) {\n                return;\n            }\n\n\n            // -------------------------------------------------\n            // ENVIAMOS LA ALTURA\n            // -------------------------------------------------\n\n            postHeight(height);\n\n\n            // -------------------------------------------------\n            // DETECTAMOS SI EL LAYOUT YA EST\\xc1 ESTABLE\n            // -------------------------------------------------\n\n            if (\n                Math.abs(\n                    height -\n                    previousMeasuredHeight\n                ) < 2\n            ) {\n\n                stableFrames++;\n\n            } else {\n\n                stableFrames = 0;\n\n            }\n\n\n            previousMeasuredHeight =\n                height;\n\n\n            /*\n             * Esperamos varios frames consecutivos\n             * con la misma altura.\n             *\n             * Esto es importante porque:\n             *\n             * 1. HTML mide\n             * 2. Framer cambia iframe\n             * 3. responsive cambia\n             * 4. volvemos a medir\n             */\n\n            if (stableFrames < 4) {\n\n                raf =\n                    requestAnimationFrame(\n                        measure\n                    );\n\n            }\n\n        }\n\n\n        raf =\n            requestAnimationFrame(\n                measure\n            );\n\n    }\n\n\n    // =========================================================\n    // MEDICI\\xd3N RETARDADA\n    // =========================================================\n\n    function scheduleHeight() {\n\n        sendHeight();\n\n        if (settleTimer) {\n            clearTimeout(\n                settleTimer\n            );\n        }\n\n        settleTimer =\n            setTimeout(\n                sendHeight,\n                50\n            );\n    }\n\n\n    // =========================================================\n    // PRIMERA MEDICI\\xd3N\n    // =========================================================\n\n    if (\n        document.readyState ===\n        \"loading\"\n    ) {\n\n        document.addEventListener(\n            \"DOMContentLoaded\",\n            function() {\n\n                sendHeight();\n\n                setTimeout(\n                    sendHeight,\n                    50\n                );\n\n                setTimeout(\n                    sendHeight,\n                    150\n                );\n\n            }\n        );\n\n    } else {\n\n        sendHeight();\n\n    }\n\n\n    // =========================================================\n    // WINDOW LOAD\n    // =========================================================\n\n    window.addEventListener(\n        \"load\",\n        function () {\n\n            sendHeight();\n\n            /*\n             * Varias mediciones porque fuentes,\n             * im\\xe1genes, scripts y charts pueden\n             * terminar despu\\xe9s del load inicial.\n             */\n\n            setTimeout(\n                sendHeight,\n                50\n            );\n\n            setTimeout(\n                sendHeight,\n                150\n            );\n\n            setTimeout(\n                sendHeight,\n                300\n            );\n\n            setTimeout(\n                sendHeight,\n                700\n            );\n\n            setTimeout(\n                sendHeight,\n                1200\n            );\n\n            setTimeout(\n                sendHeight,\n                2000\n            );\n\n            setTimeout(\n                sendHeight,\n                3500\n            );\n\n        }\n    );\n\n\n    // =========================================================\n    // IM\\xc1GENES\n    // =========================================================\n\n    /*\n     * Escuchamos expl\\xedcitamente las im\\xe1genes.\n     *\n     * Algunas pueden cargar desde cache y otras\n     * mucho despu\\xe9s del load principal.\n     */\n\n    function watchImages() {\n\n        const images =\n            document.querySelectorAll(\n                \"img\"\n            );\n\n        images.forEach(\n            function(img) {\n\n                if (\n                    img.dataset\n                        .framerHeightWatched\n                ) {\n                    return;\n                }\n\n                img.dataset\n                    .framerHeightWatched =\n                    \"true\";\n\n\n                if (!img.complete) {\n\n                    img.addEventListener(\n                        \"load\",\n                        scheduleHeight\n                    );\n\n                    img.addEventListener(\n                        \"error\",\n                        scheduleHeight\n                    );\n\n                }\n\n            }\n        );\n\n    }\n\n    watchImages();\n\n\n    // =========================================================\n    // FUENTES\n    // =========================================================\n\n    if (\n        document.fonts &&\n        document.fonts.ready\n    ) {\n\n        document.fonts.ready.then(\n            function() {\n\n                sendHeight();\n\n                setTimeout(\n                    sendHeight,\n                    100\n                );\n\n            }\n        );\n\n    }\n\n\n    // =========================================================\n    // RESIZE OBSERVER\n    // =========================================================\n\n    if (\n        typeof ResizeObserver !==\n        \"undefined\"\n    ) {\n\n        const resizeObserver =\n            new ResizeObserver(\n                function () {\n\n                    scheduleHeight();\n\n                }\n            );\n\n\n        if (\n            document.documentElement\n        ) {\n\n            resizeObserver.observe(\n                document.documentElement\n            );\n\n        }\n\n\n        if (document.body) {\n\n            resizeObserver.observe(\n                document.body\n            );\n\n        }\n\n\n        /*\n         * Adem\\xe1s observamos los hijos\n         * principales del body.\n         */\n\n        Array\n            .from(\n                document.body\n                    ? document.body.children\n                    : []\n            )\n            .forEach(\n                function(element) {\n\n                    try {\n\n                        resizeObserver.observe(\n                            element\n                        );\n\n                    } catch (error) {}\n\n                }\n            );\n\n    }\n\n\n    // =========================================================\n    // MUTATION OBSERVER\n    // =========================================================\n\n    if (\n        typeof MutationObserver !==\n        \"undefined\"\n    ) {\n\n        const mutationObserver =\n            new MutationObserver(\n                function () {\n\n                    watchImages();\n\n                    scheduleHeight();\n\n                }\n            );\n\n\n        mutationObserver.observe(\n            document.documentElement,\n            {\n                childList: true,\n\n                subtree: true,\n\n                attributes: true,\n\n                characterData: true\n            }\n        );\n\n    }\n\n\n    // =========================================================\n    // RESIZE DEL IFRAME\n    // =========================================================\n\n    window.addEventListener(\n        \"resize\",\n        function () {\n\n            scheduleHeight();\n\n            setTimeout(\n                sendHeight,\n                100\n            );\n\n        }\n    );\n\n\n    // =========================================================\n    // ORIENTATION CHANGE\n    // =========================================================\n\n    window.addEventListener(\n        \"orientationchange\",\n        function () {\n\n            setTimeout(\n                sendHeight,\n                100\n            );\n\n            setTimeout(\n                sendHeight,\n                300\n            );\n\n        }\n    );\n\n\n    // =========================================================\n    // \\xdaLTIMA MEDICI\\xd3N DE SEGURIDAD\n    // =========================================================\n\n    /*\n     * Algunos HTML generados tienen scripts\n     * que renderizan contenido bastante tarde.\n     */\n\n    setTimeout(\n        sendHeight,\n        5000\n    );\n\n})();\n\n</script>\n`;if(/<\\/body>/i.test(html)){html=html.replace(/<\\/body>/i,`${heightScript}</body>`);}else{html+=heightScript;}return html;}// =============================================================\n// HELPERS\n// =============================================================\nfunction escapeAttribute(value){return value.replace(/&/g,\"&amp;\").replace(/\"/g,\"&quot;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\");}// =============================================================\n// PLACEHOLDER\n// =============================================================\nfunction Placeholder({height,borderRadius,background,style}){return /*#__PURE__*/_jsx(\"div\",{style:{...style,width:\"100%\",height:`${height}px`,minHeight:`${height}px`,borderRadius,background,border:\"1px dashed rgba(128,128,128,.35)\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",fontFamily:\"Inter, system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",fontSize:13,color:\"rgba(128,128,128,.8)\",textAlign:\"center\",padding:24,boxSizing:\"border-box\"},children:\"Select an HTML file\"});}// =============================================================\n// STATUS\n// =============================================================\nfunction Status({text,height,borderRadius,background,style}){return /*#__PURE__*/_jsx(\"div\",{style:{...style,width:\"100%\",height:`${height}px`,minHeight:`${height}px`,borderRadius,background,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",fontFamily:\"Inter, system-ui, -apple-system, BlinkMacSystemFont, sans-serif\",fontSize:13,color:\"#777\",padding:24,boxSizing:\"border-box\"},children:text});}// =============================================================\n// DEFAULT PROPS\n// =============================================================\nHTMLEmbed.defaultProps={minHeight:100,fallbackHeight:100,maxHeight:0,autoHeight:true,headerOffset:100,backgroundColor:\"transparent\",borderRadius:0,loadingText:\"Loading HTML…\",errorText:\"Could not load HTML.\"};// =============================================================\n// PROPERTY CONTROLS\n// =============================================================\naddPropertyControls(HTMLEmbed,{htmlFile:{type:ControlType.File,title:\"HTML\",allowedFileTypes:[\"html\",\"htm\"]},autoHeight:{type:ControlType.Boolean,title:\"Auto Height\",defaultValue:true,enabledTitle:\"Yes\",disabledTitle:\"No\"},headerOffset:{type:ControlType.Number,title:\"Header Offset\",defaultValue:100,min:0,max:500,step:1,unit:\"px\"},minHeight:{type:ControlType.Number,title:\"Min Height\",defaultValue:100,min:0,max:1e4,step:10,unit:\"px\"},fallbackHeight:{type:ControlType.Number,title:\"Fallback\",defaultValue:100,min:0,max:2e4,step:10,unit:\"px\"},maxHeight:{type:ControlType.Number,title:\"Max Height\",defaultValue:0,min:0,max:3e4,step:100,unit:\"px\",description:\"0 = unlimited\"},backgroundColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"transparent\"},borderRadius:{type:ControlType.Number,title:\"Radius\",defaultValue:0,min:0,max:100,step:1,unit:\"px\"},loadingText:{type:ControlType.String,title:\"Loading\",defaultValue:\"Loading HTML…\"},errorText:{type:ControlType.String,title:\"Error\",defaultValue:\"Could not load HTML.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"HTMLEmbed\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./HTML_embed.map"],"mappings":"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"}