{"id":11,"date":"2026-04-20T19:18:07","date_gmt":"2026-04-20T19:18:07","guid":{"rendered":"https:\/\/ivannascimento.com\/astrogasp\/?page_id=11"},"modified":"2026-05-07T17:39:53","modified_gmt":"2026-05-07T17:39:53","slug":"home","status":"publish","type":"page","link":"https:\/\/ivannascimento.com\/astrogasp\/","title":{"rendered":"Home"},"content":{"rendered":"<section class=\"l-section wpb_row us_custom_4af741be height_auto full_height valign_center width_full\"><div class=\"l-section-h i-cf\"><div class=\"g-cols vc_row via_grid cols_1 laptops-cols_inherit tablets-cols_inherit mobiles-cols_1 valign_top type_default stacking_default\"><div class=\"wpb_column vc_column_container us_custom_418f9620\"><div class=\"vc_column-inner\"><div class=\"w-vwrapper us_custom_fd403803 align_center valign_middle\" style=\"--vwrapper-gap:0rem\">    <div id=\"wrap_rive_6a35aee21a5c6\" style=\"width: 100%; height: 100dvh; position: relative;\">\r\n        <canvas id=\"rive_6a35aee21a5c6\" style=\"width: 100%; height: 100%; display: block; position: absolute; top: 0; left: 0;\"><\/canvas>\r\n    <\/div>\r\n\r\n    \r\n    <script>\r\n    (function() {\r\n        const isDebug = false;\r\n        const log = (m) => { if (isDebug) { const el = document.getElementById('log-rive_6a35aee21a5c6'); if(el) el.innerHTML = m + '<br>' + el.innerHTML; } };\r\n        \r\n        let mappings = [{\"d_type\":\"math\"}]; if (!Array.isArray(mappings)) mappings = [];\r\n        let vm_mappings = [{\"v_type\":\"number\",\"v_source\":\"acf\",\"v_action\":\"none\"}]; if (!Array.isArray(vm_mappings)) vm_mappings = [];\r\n        let currentStates = {};\r\n        let acfValues = {};\r\n        let initialVmData = {};\r\n        let isReady = false;\r\n        let saveTimers = {};\r\n\r\n        const parseColor = (colorVal) => {\r\n            let r = 0, g = 0, b = 0, a = 255;\r\n            if (typeof colorVal === 'string') {\r\n                colorVal = colorVal.trim();\r\n                if (colorVal.startsWith('#')) {\r\n                    let hex = colorVal.substring(1);\r\n                    if (hex.length === 3) { r = parseInt(hex[0]+hex[0],16); g = parseInt(hex[1]+hex[1],16); b = parseInt(hex[2]+hex[2],16); }\r\n                    else if (hex.length === 6) { r = parseInt(hex.substring(0,2),16); g = parseInt(hex.substring(2,4),16); b = parseInt(hex.substring(4,6),16); }\r\n                    else if (hex.length === 8) { a = parseInt(hex.substring(0,2),16); r = parseInt(hex.substring(2,4),16); g = parseInt(hex.substring(4,6),16); b = parseInt(hex.substring(6,8),16); }\r\n                } else if (colorVal.startsWith('rgba') || colorVal.startsWith('rgb')) {\r\n                    let match = colorVal.match(\/[\\d.]+\/g);\r\n                    if (match && match.length >= 3) {\r\n                        r = parseInt(match[0]); g = parseInt(match[1]); b = parseInt(match[2]);\r\n                        if (match.length === 4) a = Math.round(parseFloat(match[3]) * 255);\r\n                    }\r\n                }\r\n            } else if (typeof colorVal === 'object' && colorVal !== null) {\r\n                r = colorVal.red !== undefined ? parseInt(colorVal.red) : parseInt(colorVal.r || 0);\r\n                g = colorVal.green !== undefined ? parseInt(colorVal.green) : parseInt(colorVal.g || 0);\r\n                b = colorVal.blue !== undefined ? parseInt(colorVal.blue) : parseInt(colorVal.b || 0);\r\n                let alphaVal = colorVal.alpha !== undefined ? parseFloat(colorVal.alpha) : parseFloat(colorVal.a !== undefined ? colorVal.a : 1);\r\n                a = alphaVal <= 1 ? Math.round(alphaVal * 255) : parseInt(alphaVal);\r\n            }\r\n            return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\r\n        };\r\n\r\n        const init = () => {\r\n            const canvas = document.getElementById('rive_6a35aee21a5c6');\r\n            if (!canvas || canvas.dataset.loaded || typeof rive === 'undefined') return;\r\n            canvas.dataset.loaded = \"true\";\r\n\r\n            const r = new rive.Rive({\r\n                src: 'https:\/\/astrogasp.ivannascimento.com\/wp-content\/uploads\/2026\/05\/astrogasp-v5.riv',\r\n                canvas: canvas,\r\n                autoplay: false,\r\n                stateMachines: 'stateMachine',\r\n                autoBind: true,\r\n                onLoad: () => {\r\n                    const safeResize = () => {\r\n                        if (!r || typeof r.resizeDrawingSurfaceToCanvas !== 'function') return;\r\n                        const rect = canvas.getBoundingClientRect();\r\n                        let currentDPR = window.devicePixelRatio || 1;\r\n                        \r\n                        log(\"Engine: canvas | Render: \" + Math.round(rect.width) + \"x\" + Math.round(rect.height) + \" @ \" + currentDPR + \"x\");\r\n                        \r\n                        try { r.resizeDrawingSurfaceToCanvas(currentDPR); } \r\n                        catch(e) { r.resizeDrawingSurfaceToCanvas(); }\r\n                    };\r\n\r\n                    setTimeout(safeResize, 150);\r\n                    window.addEventListener('resize', safeResize);\r\n\r\n                    const inputs = r.stateMachineInputs('stateMachine');\r\n                    \r\n                    const syncAll = () => {\r\n                        try {\r\n                            if (Object.keys(initialVmData).length > 0 && typeof r.viewModelByName === 'function') {\r\n                                Object.keys(initialVmData).forEach(modelName => {\r\n                                    const vm = r.viewModelByName(modelName);\r\n                                    const vmi = vm ? vm.defaultInstance() : null;\r\n                                    if (vmi) {\r\n                                        const props = initialVmData[modelName];\r\n                                        Object.keys(props).forEach(propName => {\r\n                                            const data = props[propName];\r\n                                            \r\n                                            if (data.source === 'action_only') return;\r\n\r\n                                            if (data.source === 'local_storage') {\r\n                                                let lsVal = localStorage.getItem('rive_ls_' + propName);\r\n                                                if (lsVal !== null) {\r\n                                                    if (lsVal === 'true') data.value = true;\r\n                                                    else if (lsVal === 'false') data.value = false;\r\n                                                    else if (!isNaN(lsVal)) data.value = parseFloat(lsVal);\r\n                                                    else data.value = lsVal;\r\n                                                }\r\n                                            }\r\n\r\n                                            if (data.value !== null && data.value !== undefined) {\r\n                                                \r\n                                                if (data.type === 'color' && typeof vmi.color === 'function') {\r\n                                                    let p = vmi.color(propName);\r\n                                                    if (p) p.value = parseColor(data.value);\r\n                                                } else {\r\n                                                    let p = null;\r\n                                                    if (data.type === 'number' && typeof vmi.number === 'function') p = vmi.number(propName);\r\n                                                    else if (data.type === 'string' && typeof vmi.string === 'function') p = vmi.string(propName);\r\n                                                    else if (data.type === 'bool' && typeof vmi.boolean === 'function') p = vmi.boolean(propName);\r\n                                                    else if (typeof vmi.property === 'function') p = vmi.property(propName);\r\n                                                    \r\n                                                    if (p && 'value' in p) p.value = data.value;\r\n                                                }\r\n\r\n                                                const mConfig = vm_mappings.find(map => map.v_instance === propName && map.v_model_name === modelName);\r\n                                                if (mConfig && mConfig.v_action && mConfig.v_action !== 'none') {\r\n                                                    const targetEl = mConfig.v_action_target ? document.querySelector(mConfig.v_action_target) : document.body;\r\n                                                    \r\n                                                    if (mConfig.v_action === 'element_class' && mConfig.v_action_class && targetEl) {\r\n                                                        if (data.value === true || data.value === 'true' || data.value === 1) targetEl.classList.add(mConfig.v_action_class);\r\n                                                        else targetEl.classList.remove(mConfig.v_action_class);\r\n                                                    }\r\n                                                    if (mConfig.v_action === 'css_var' && mConfig.v_action_target) {\r\n                                                        document.documentElement.style.setProperty(mConfig.v_action_target, data.value);\r\n                                                    }\r\n                                                    if (mConfig.v_action === 'set_text' && mConfig.v_action_target) {\r\n                                                        const el = document.getElementById(mConfig.v_action_target);\r\n                                                        if (el) el.innerHTML = data.value;\r\n                                                    }\r\n                                                }\r\n                                            }\r\n                                        });\r\n                                        if (typeof r.bindViewModelInstance === 'function') r.bindViewModelInstance(vmi);\r\n                                    }\r\n                                });\r\n                            }\r\n                        } catch (e) { log(\"Erro Inje\u00e7\u00e3o VM: \" + e.message); }\r\n\r\n                        if (inputs) {\r\n                            Object.keys(currentStates).forEach(key => {\r\n                                const input = inputs.find(i => i.name === key);\r\n                                if (input) input.value = currentStates[key];\r\n                            });\r\n                        }\r\n                        if (typeof r.advance === 'function') r.advance(0);\r\n                    };\r\n\r\n                    syncAll(); \r\n                    r.play();\r\n                    setTimeout(syncAll, 50); \r\n                    setTimeout(() => { isReady = true; log(\"Motor Pronto.\"); }, 1000);\r\n                },\r\n                \r\n                onStateChange: () => {\r\n                    if (!isReady || !mappings) return;\r\n                    const smInputs = r.stateMachineInputs('stateMachine');\r\n                    if (!smInputs) return;\r\n                    \r\n                    mappings.forEach(m => {\r\n                        if (m.d_type === 'math') return; \r\n                        const input = smInputs.find(i => i.name === m.r_input);\r\n                        if (input && input.value !== currentStates[m.r_input]) {\r\n                            currentStates[m.r_input] = input.value;\r\n                            clearTimeout(saveTimers[m.r_input]);\r\n                            saveTimers[m.r_input] = setTimeout(() => {\r\n                                fetch('https:\/\/ivannascimento.com\/astrogasp\/wp-json\/rivepro\/v1\/sync\/', {\r\n                                    method: 'POST', headers: {'Content-Type': 'application\/json'},\r\n                                    body: JSON.stringify({ post_id: 11, field: m.a_field, value: input.value })\r\n                                });\r\n                            }, 800);\r\n                        }\r\n                    });\r\n                }\r\n            });\r\n\r\n            r.on(rive.EventType.RiveEvent, (event) => {\r\n                const eventName = event.data.name;\r\n                const eventProps = event.data.properties || {}; \r\n                \r\n                log(\"Rive disparou: \" + eventName);\r\n                \r\n                vm_mappings.forEach(m => {\r\n                    if (m.v_event === eventName) {\r\n                        let baseValue = eventProps[m.v_instance];\r\n                        \r\n                        if (baseValue !== undefined) {\r\n                            let finalValue = baseValue;\r\n                            \r\n                            if (m.v_mod && m.v_type === 'number') {\r\n                                const modVal = parseFloat(m.v_mod);\r\n                                if (!isNaN(modVal)) finalValue = parseFloat(baseValue) + modVal;\r\n                            }\r\n\r\n                            const targetEl = m.v_action_target ? document.querySelector(m.v_action_target) : document.body;\r\n                            \r\n                            if (m.v_action === 'element_class' && m.v_action_class) {\r\n                                if (targetEl) {\r\n                                    if (finalValue === true || finalValue === 'true' || finalValue === 1) {\r\n                                        targetEl.classList.add(m.v_action_class);\r\n                                        log(\"Classe aplicada.\");\r\n                                    } else {\r\n                                        targetEl.classList.remove(m.v_action_class);\r\n                                        log(\"Classe removida.\");\r\n                                    }\r\n                                }\r\n                            }\r\n                            if (m.v_action === 'css_var' && m.v_action_target) {\r\n                                document.documentElement.style.setProperty(m.v_action_target, finalValue);\r\n                            }\r\n                            if (m.v_action === 'set_text' && m.v_action_target) {\r\n                                const el = document.getElementById(m.v_action_target);\r\n                                if (el) el.innerHTML = finalValue;\r\n                            }\r\n                            \r\n                            if (m.v_source === 'acf') {\r\n                                fetch('https:\/\/ivannascimento.com\/astrogasp\/wp-json\/rivepro\/v1\/sync\/', {\r\n                                    method: 'POST', headers: {'Content-Type': 'application\/json'},\r\n                                    body: JSON.stringify({ post_id: 11, field: m.v_acf, value: finalValue })\r\n                                });\r\n                            } else if (m.v_source === 'local_storage') {\r\n                                localStorage.setItem('rive_ls_' + m.v_instance, finalValue);\r\n                                log(\"Salvo no navegador!\");\r\n                            }\r\n                        }\r\n                    }\r\n                });\r\n\r\n                mappings.forEach(m => {\r\n                    if (m.d_type === 'math' && m.r_input === eventName) {\r\n                        const op = parseFloat(m.math_op || '0');\r\n                        acfValues[m.a_field] = (parseFloat(acfValues[m.a_field]) || 0) + op;\r\n                        \r\n                        const smInputs = r.stateMachineInputs('stateMachine');\r\n                        const input = smInputs ? smInputs.find(i => i.name === m.math_target) : null;\r\n                        \r\n                        if (input) { \r\n                            input.value = acfValues[m.a_field]; \r\n                            if (typeof r.advance === 'function') r.advance(0);\r\n                        }\r\n                        \r\n                        fetch('https:\/\/ivannascimento.com\/astrogasp\/wp-json\/rivepro\/v1\/sync\/', {\r\n                            method: 'POST', headers: {'Content-Type': 'application\/json'},\r\n                            body: JSON.stringify({ post_id: 11, field: m.a_field, value: acfValues[m.a_field] })\r\n                        });\r\n                    }\r\n                });\r\n            });\r\n\r\n            const mode = 'none';\r\n            const targetType = 'sm';\r\n            const vmModelName = '';\r\n            const vmInstX = '';\r\n            const vmInstY = '';\r\n\r\n            if (mode === 'cursor' || mode === 'scroll') {\r\n                window.addEventListener(mode === 'cursor' ? 'mousemove' : 'scroll', (e) => {\r\n                    let valX = 0;\r\n                    let valY = 0;\r\n                    const b = canvas.getBoundingClientRect();\r\n\r\n                    if (mode === 'cursor') {\r\n                        valX = Math.max(0, Math.min(100, ((e.clientX - b.left) \/ b.width) * 100));\r\n                        valY = Math.max(0, Math.min(100, ((e.clientY - b.top) \/ b.height) * 100));\r\n                    } else {\r\n                        const windowH = window.innerHeight;\r\n                        const progress = ((windowH - b.top) \/ (windowH + b.height)) * 100;\r\n                        const sStart = parseFloat('0' || '0');\r\n                        const sEnd = parseFloat('100' || '100');\r\n                        valX = Math.max(0, Math.min(100, (progress - sStart) \/ (sEnd - sStart) * 100));\r\n                    }\r\n\r\n                    if (targetType === 'sm') {\r\n                        const smInputs = r.stateMachineInputs('stateMachine');\r\n                        if (smInputs) {\r\n                            let updated = false;\r\n                            const inX = smInputs.find(i => i.name === '');\r\n                            const inY = smInputs.find(i => i.name === '');\r\n                            if (inX) { inX.value = valX; updated = true; }\r\n                            if (inY && mode === 'cursor') { inY.value = valY; updated = true; }\r\n                            \r\n                            if (updated && typeof r.advance === 'function') r.advance(0);\r\n                        }\r\n                    } else if (targetType === 'vm' && vmModelName) {\r\n                        try {\r\n                            if (typeof r.viewModelByName === 'function') {\r\n                                const vm = r.viewModelByName(vmModelName);\r\n                                const vmi = vm ? vm.defaultInstance() : null;\r\n                                if (vmi) {\r\n                                    let updated = false;\r\n                                    \r\n                                    if (vmInstX) {\r\n                                        let pX = null;\r\n                                        if (typeof vmi.number === 'function') pX = vmi.number(vmInstX);\r\n                                        else if (typeof vmi.property === 'function') pX = vmi.property(vmInstX);\r\n                                        if (pX) { pX.value = valX; updated = true; }\r\n                                    }\r\n                                    if (vmInstY && mode === 'cursor') {\r\n                                        let pY = null;\r\n                                        if (typeof vmi.number === 'function') pY = vmi.number(vmInstY);\r\n                                        else if (typeof vmi.property === 'function') pY = vmi.property(vmInstY);\r\n                                        if (pY) { pY.value = valY; updated = true; }\r\n                                    }\r\n                                    \r\n                                    if (updated && typeof r.advance === 'function') {\r\n                                        r.advance(0);\r\n                                    }\r\n                                }\r\n                            }\r\n                        } catch (e) { \/* Prote\u00e7\u00e3o silenciosa para garantir fluidez do scroll *\/ }\r\n                    }\r\n                }, { passive: true });\r\n            }\r\n        };\r\n\r\n        if (typeof rive === 'undefined') {\r\n            const s = document.createElement('script');\r\n            \/\/ O SCRIPT M\u00c1GICO: Agora ele l\u00ea do WPBakery qual motor injetar!\r\n            s.src = 'https:\/\/unpkg.com\/@rive-app\/canvas@latest';\r\n            s.onload = init;\r\n            document.head.appendChild(s);\r\n        } else { init(); }\r\n    })();\r\n    <\/script>\r\n    <\/div><\/div><\/div><\/div><\/div><\/section>\n","protected":false},"excerpt":{"rendered":"","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-11","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/pages\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":56,"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/pages\/11\/revisions"}],"predecessor-version":[{"id":75,"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/pages\/11\/revisions\/75"}],"wp:attachment":[{"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/media?parent=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}