{"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-04-20T21:15:00","modified_gmt":"2026-04-20T21:15:00","slug":"home","status":"publish","type":"page","link":"https:\/\/ivannascimento.com\/astrogasp\/","title":{"rendered":"Home"},"content":{"rendered":"<section class=\"l-section wpb_row height_medium\"><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\"><div class=\"vc_column-inner\">    <div id=\"wrap_rive_69e6bd924551f\" style=\"width: 100%; height: 400px;\">\n        <canvas id=\"rive_69e6bd924551f\" style=\"width: 100%; height: 100%;\"><\/canvas>\n    <\/div>\n\n    \n    <script>\n    (function() {\n        const isDebug = false;\n        const log = (m) => { if (isDebug) { const el = document.getElementById('log-rive_69e6bd924551f'); if(el) el.innerHTML = m + '<br>' + el.innerHTML; } };\n        \n        let mappings = [{\"d_type\":\"math\"}]; if (!Array.isArray(mappings)) mappings = [];\n        let vm_mappings = [{\"v_type\":\"number\",\"v_source\":\"acf\",\"v_action\":\"none\"}]; if (!Array.isArray(vm_mappings)) vm_mappings = [];\n        let currentStates = {};\n        let acfValues = {};\n        let initialVmData = {};\n        let isReady = false;\n        let saveTimers = {};\n\n        \/\/ TRADUTOR DE CORES\n        const parseColor = (colorVal) => {\n            let r = 0, g = 0, b = 0, a = 255;\n            if (typeof colorVal === 'string') {\n                colorVal = colorVal.trim();\n                if (colorVal.startsWith('#')) {\n                    let hex = colorVal.substring(1);\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); }\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); }\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); }\n                } else if (colorVal.startsWith('rgba') || colorVal.startsWith('rgb')) {\n                    let match = colorVal.match(\/[\\d.]+\/g);\n                    if (match && match.length >= 3) {\n                        r = parseInt(match[0]); g = parseInt(match[1]); b = parseInt(match[2]);\n                        if (match.length === 4) a = Math.round(parseFloat(match[3]) * 255);\n                    }\n                }\n            } else if (typeof colorVal === 'object' && colorVal !== null) {\n                r = colorVal.red !== undefined ? parseInt(colorVal.red) : parseInt(colorVal.r || 0);\n                g = colorVal.green !== undefined ? parseInt(colorVal.green) : parseInt(colorVal.g || 0);\n                b = colorVal.blue !== undefined ? parseInt(colorVal.blue) : parseInt(colorVal.b || 0);\n                let alphaVal = colorVal.alpha !== undefined ? parseFloat(colorVal.alpha) : parseFloat(colorVal.a !== undefined ? colorVal.a : 1);\n                a = alphaVal <= 1 ? Math.round(alphaVal * 255) : parseInt(alphaVal);\n            }\n            return ((a << 24) | (r << 16) | (g << 8) | b) >>> 0;\n        };\n\n        const init = () => {\n            const canvas = document.getElementById('rive_69e6bd924551f');\n            if (!canvas || canvas.dataset.loaded || typeof rive === 'undefined') return;\n            canvas.dataset.loaded = \"true\";\n\n            const r = new rive.Rive({\n                src: 'https:\/\/ivannascimento.com\/astrogasp\/wp-content\/uploads\/2026\/04\/astrogasp-v2.riv',\n                canvas: canvas,\n                autoplay: false,\n                stateMachines: 'stateMachine',\n                autoBind: true,\n                onLoad: () => {\n                    r.resizeDrawingSurfaceToCanvas();\n                    const inputs = r.stateMachineInputs('stateMachine');\n                    \n                    const syncAll = () => {\n                        try {\n                            if (Object.keys(initialVmData).length > 0 && typeof r.viewModelByName === 'function') {\n                                Object.keys(initialVmData).forEach(modelName => {\n                                    const vm = r.viewModelByName(modelName);\n                                    const vmi = vm ? vm.defaultInstance() : null;\n                                    if (vmi) {\n                                        const props = initialVmData[modelName];\n                                        Object.keys(props).forEach(propName => {\n                                            const data = props[propName];\n                                            \n                                            \/\/ Pula inje\u00e7\u00e3o se for apenas ouvinte de evento\n                                            if (data.source === 'action_only') return;\n\n                                            \/\/ LEITURA DO LOCAL STORAGE (Se essa for a origem)\n                                            if (data.source === 'local_storage') {\n                                                let lsVal = localStorage.getItem('rive_ls_' + propName);\n                                                if (lsVal !== null) {\n                                                    if (lsVal === 'true') data.value = true;\n                                                    else if (lsVal === 'false') data.value = false;\n                                                    else if (!isNaN(lsVal)) data.value = parseFloat(lsVal);\n                                                    else data.value = lsVal;\n                                                }\n                                            }\n\n                                            \/\/ S\u00f3 processa a inje\u00e7\u00e3o e a A\u00e7\u00e3o Web se tiver algum valor (do ACF, Fixo ou LocalStorage)\n                                            if (data.value !== null && data.value !== undefined) {\n                                                \n                                                \/\/ INJE\u00c7\u00c3O NO RIVE\n                                                if (data.type === 'color' && typeof vmi.color === 'function') {\n                                                    let p = vmi.color(propName);\n                                                    if (p) p.value = parseColor(data.value);\n                                                } else {\n                                                    let p = null;\n                                                    if (data.type === 'number' && typeof vmi.number === 'function') p = vmi.number(propName);\n                                                    else if (data.type === 'string' && typeof vmi.string === 'function') p = vmi.string(propName);\n                                                    else if (data.type === 'bool' && typeof vmi.boolean === 'function') p = vmi.boolean(propName);\n                                                    else if (typeof vmi.property === 'function') p = vmi.property(propName);\n                                                    \n                                                    if (p && 'value' in p) p.value = data.value;\n                                                }\n\n                                                \/\/ EXECUTA A\u00c7\u00c3O WEB (CSS) AUTOMATICAMENTE NO CARREGAMENTO DA P\u00c1GINA\n                                                const mConfig = vm_mappings.find(map => map.v_instance === propName && map.v_model_name === modelName);\n                                                if (mConfig && mConfig.v_action && mConfig.v_action !== 'none') {\n                                                    const targetEl = mConfig.v_action_target ? document.querySelector(mConfig.v_action_target) : document.body;\n                                                    \n                                                    if (mConfig.v_action === 'element_class' && mConfig.v_action_class && targetEl) {\n                                                        if (data.value === true || data.value === 'true' || data.value === 1) targetEl.classList.add(mConfig.v_action_class);\n                                                        else targetEl.classList.remove(mConfig.v_action_class);\n                                                    }\n                                                    if (mConfig.v_action === 'css_var' && mConfig.v_action_target) {\n                                                        document.documentElement.style.setProperty(mConfig.v_action_target, data.value);\n                                                    }\n                                                    if (mConfig.v_action === 'set_text' && mConfig.v_action_target) {\n                                                        const el = document.getElementById(mConfig.v_action_target);\n                                                        if (el) el.innerHTML = data.value;\n                                                    }\n                                                }\n                                            }\n                                        });\n                                        if (typeof r.bindViewModelInstance === 'function') r.bindViewModelInstance(vmi);\n                                    }\n                                });\n                            }\n                        } catch (e) { log(\"Erro Inje\u00e7\u00e3o VM: \" + e.message); }\n\n                        if (inputs) {\n                            Object.keys(currentStates).forEach(key => {\n                                const input = inputs.find(i => i.name === key);\n                                if (input) input.value = currentStates[key];\n                            });\n                        }\n                        if (typeof r.advance === 'function') r.advance(0);\n                    };\n\n                    syncAll(); \n                    r.play();\n                    setTimeout(syncAll, 50); \n                    setTimeout(() => { isReady = true; log(\"Motor Pronto.\"); }, 1000);\n                },\n                \n                onStateChange: () => {\n                    if (!isReady || !mappings) return;\n                    const smInputs = r.stateMachineInputs('stateMachine');\n                    if (!smInputs) return;\n                    \n                    mappings.forEach(m => {\n                        if (m.d_type === 'math') return; \n                        const input = smInputs.find(i => i.name === m.r_input);\n                        if (input && input.value !== currentStates[m.r_input]) {\n                            currentStates[m.r_input] = input.value;\n                            clearTimeout(saveTimers[m.r_input]);\n                            saveTimers[m.r_input] = setTimeout(() => {\n                                fetch('https:\/\/ivannascimento.com\/astrogasp\/wp-json\/rivepro\/v1\/sync\/', {\n                                    method: 'POST', headers: {'Content-Type': 'application\/json'},\n                                    body: JSON.stringify({ post_id: 11, field: m.a_field, value: input.value })\n                                });\n                            }, 800);\n                        }\n                    });\n                }\n            });\n\n            r.on(rive.EventType.RiveEvent, (event) => {\n                const eventName = event.data.name;\n                const eventProps = event.data.properties || {}; \n                \n                log(\"Rive disparou: \" + eventName);\n                \n                \/\/ ROTA 1: DATA BINDING & A\u00c7\u00d5ES WEB\n                vm_mappings.forEach(m => {\n                    if (m.v_event === eventName) {\n                        let baseValue = eventProps[m.v_instance];\n                        \n                        if (baseValue !== undefined) {\n                            let finalValue = baseValue;\n                            \n                            if (m.v_mod && m.v_type === 'number') {\n                                const modVal = parseFloat(m.v_mod);\n                                if (!isNaN(modVal)) finalValue = parseFloat(baseValue) + modVal;\n                            }\n\n                            \/\/ A\u00c7\u00d5ES WEB (CSS \/ HTML)\n                            const targetEl = m.v_action_target ? document.querySelector(m.v_action_target) : document.body;\n                            \n                            if (m.v_action === 'element_class' && m.v_action_class) {\n                                if (targetEl) {\n                                    if (finalValue === true || finalValue === 'true' || finalValue === 1) {\n                                        targetEl.classList.add(m.v_action_class);\n                                        log(\"Classe \" + m.v_action_class + \" aplicada.\");\n                                    } else {\n                                        targetEl.classList.remove(m.v_action_class);\n                                        log(\"Classe \" + m.v_action_class + \" removida.\");\n                                    }\n                                }\n                            }\n                            if (m.v_action === 'css_var' && m.v_action_target) {\n                                document.documentElement.style.setProperty(m.v_action_target, finalValue);\n                            }\n                            if (m.v_action === 'set_text' && m.v_action_target) {\n                                const el = document.getElementById(m.v_action_target);\n                                if (el) el.innerHTML = finalValue;\n                            }\n                            \n                            \/\/ GRAVADORES (ACF OU LOCAL STORAGE)\n                            if (m.v_source === 'acf') {\n                                fetch('https:\/\/ivannascimento.com\/astrogasp\/wp-json\/rivepro\/v1\/sync\/', {\n                                    method: 'POST', headers: {'Content-Type': 'application\/json'},\n                                    body: JSON.stringify({ post_id: 11, field: m.v_acf, value: finalValue })\n                                });\n                            } else if (m.v_source === 'local_storage') {\n                                localStorage.setItem('rive_ls_' + m.v_instance, finalValue);\n                                log(\"Prefer\u00eancia salva no navegador!\");\n                            }\n                        }\n                    }\n                });\n\n                \/\/ ROTA 2: MATEM\u00c1TICA CL\u00c1SSICA E SALVAMENTO SEGURO\n                mappings.forEach(m => {\n                    if (m.d_type === 'math' && m.r_input === eventName) {\n                        const op = parseFloat(m.math_op || '0');\n                        acfValues[m.a_field] = (parseFloat(acfValues[m.a_field]) || 0) + op;\n                        \n                        const smInputs = r.stateMachineInputs('stateMachine');\n                        const input = smInputs ? smInputs.find(i => i.name === m.math_target) : null;\n                        \n                        if (input) { \n                            input.value = acfValues[m.a_field]; \n                            if (typeof r.advance === 'function') r.advance(0);\n                        }\n                        \n                        fetch('https:\/\/ivannascimento.com\/astrogasp\/wp-json\/rivepro\/v1\/sync\/', {\n                            method: 'POST', headers: {'Content-Type': 'application\/json'},\n                            body: JSON.stringify({ post_id: 11, field: m.a_field, value: acfValues[m.a_field] })\n                        });\n                    }\n                });\n            });\n\n            \/\/ INTERATIVIDADE H\u00cdBRIDA\n            const mode = 'none';\n            const targetType = 'sm';\n            const vmModelName = '';\n            const vmInstX = '';\n            const vmInstY = '';\n\n            if (mode === 'cursor' || mode === 'scroll') {\n                window.addEventListener(mode === 'cursor' ? 'mousemove' : 'scroll', (e) => {\n                    let valX = 0;\n                    let valY = 0;\n                    const b = canvas.getBoundingClientRect();\n\n                    if (mode === 'cursor') {\n                        valX = Math.max(0, Math.min(100, ((e.clientX - b.left) \/ b.width) * 100));\n                        valY = Math.max(0, Math.min(100, ((e.clientY - b.top) \/ b.height) * 100));\n                    } else {\n                        const windowH = window.innerHeight;\n                        const progress = ((windowH - b.top) \/ (windowH + b.height)) * 100;\n                        const sStart = parseFloat('0' || '0');\n                        const sEnd = parseFloat('100' || '100');\n                        valX = Math.max(0, Math.min(100, (progress - sStart) \/ (sEnd - sStart) * 100));\n                    }\n\n                    if (targetType === 'sm') {\n                        const smInputs = r.stateMachineInputs('stateMachine');\n                        if (smInputs) {\n                            let updated = false;\n                            const inX = smInputs.find(i => i.name === '');\n                            const inY = smInputs.find(i => i.name === '');\n                            if (inX) { inX.value = valX; updated = true; }\n                            if (inY && mode === 'cursor') { inY.value = valY; updated = true; }\n                            \n                            if (updated && typeof r.advance === 'function') r.advance(0);\n                        }\n                    } else if (targetType === 'vm' && vmModelName) {\n                        try {\n                            if (typeof r.viewModelByName === 'function') {\n                                const vm = r.viewModelByName(vmModelName);\n                                const vmi = vm ? vm.defaultInstance() : null;\n                                if (vmi) {\n                                    let updated = false;\n                                    \n                                    if (vmInstX) {\n                                        let pX = null;\n                                        if (typeof vmi.number === 'function') pX = vmi.number(vmInstX);\n                                        else if (typeof vmi.property === 'function') pX = vmi.property(vmInstX);\n                                        if (pX) { pX.value = valX; updated = true; }\n                                    }\n                                    if (vmInstY && mode === 'cursor') {\n                                        let pY = null;\n                                        if (typeof vmi.number === 'function') pY = vmi.number(vmInstY);\n                                        else if (typeof vmi.property === 'function') pY = vmi.property(vmInstY);\n                                        if (pY) { pY.value = valY; updated = true; }\n                                    }\n                                    \n                                    if (updated && typeof r.advance === 'function') {\n                                        r.advance(0);\n                                    }\n                                }\n                            }\n                        } catch (e) { \/* Prote\u00e7\u00e3o silenciosa para garantir fluidez do scroll *\/ }\n                    }\n                }, { passive: true });\n            }\n        };\n\n        if (typeof rive === 'undefined') {\n            const s = document.createElement('script');\n            s.src = 'https:\/\/unpkg.com\/@rive-app\/canvas@latest';\n            s.onload = init;\n            document.head.appendChild(s);\n        } else { init(); }\n    })();\n    <\/script>\n    <\/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":25,"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/pages\/11\/revisions"}],"predecessor-version":[{"id":41,"href":"https:\/\/ivannascimento.com\/astrogasp\/wp-json\/wp\/v2\/pages\/11\/revisions\/41"}],"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}]}}