{"id":21483,"date":"2025-11-24T11:31:35","date_gmt":"2025-11-24T14:31:35","guid":{"rendered":"https:\/\/culturas.cc\/congresso2025\/?page_id=21483"},"modified":"2025-11-27T13:38:24","modified_gmt":"2025-11-27T16:38:24","slug":"manifesto","status":"publish","type":"page","link":"https:\/\/culturas.cc\/congresso2025\/manifesto\/","title":{"rendered":"MANIFESTO PELA GENTILEZA"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"21483\" class=\"elementor elementor-21483\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7302df2 e-con-full e-flex e-con e-child\" data-id=\"7302df2\" data-element_type=\"container\" id=\"linhas-fundo\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-95dc3c2 e-con-full curtain-background e-flex e-con e-child\" data-id=\"95dc3c2\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-28f51fe elementor-widget elementor-widget-spacer\" data-id=\"28f51fe\" data-element_type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5105d78 elementor-widget elementor-widget-shortcode\" data-id=\"5105d78\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/p5.js\/1.4.0\/p5.min.js\"><\/script>\r\n<script>\r\n        const CORES = {\r\n            linhas: [\"#ffc600\", \"#ff8ace\", \"#4cc1ec\"],\r\n        };\r\n\r\n        const CONFIG_DESKTOP = {\r\n            linhasHorizontais: 25,\r\n            linhasVerticais: 25,\r\n            maxDistDeslocamento: 200,\r\n            forcaDeslocamentoFundo: 6,\r\n            espessuraLinhaFundo: 4,\r\n            larguraCortinaTopo: 80,\r\n            larguraCortinaBase: 450,\r\n            margemDesvio: 30\r\n        };\r\n\r\n        const CONFIG_MOBILE = {\r\n            linhasHorizontais: 35,\r\n            linhasVerticais: 35,\r\n            maxDistDeslocamento: 120,\r\n            forcaDeslocamentoFundo: 3,\r\n            espessuraLinhaFundo: 3,\r\n            larguraCortinaTopo: 50,\r\n            larguraCortinaBase: 280,\r\n            margemDesvio: 20\r\n        };\r\n\r\n        \/\/ VERS\u00c3O COM CORTINA (espa\u00e7o vazio central)\r\n        function criarCurtainSketch(container) {\r\n            return function(p) {\r\n                let linhasDeFundo = [];\r\n                let isMobile = false;\r\n                let CONFIG = CONFIG_DESKTOP;\r\n                let tempoUltimaAtualizacao = 0;\r\n                const INTERVALO_ATUALIZACAO = 16;\r\n\r\n                p.setup = function() {\r\n                    detectarDispositivo();\r\n                    \r\n                    let canvas = p.createCanvas(container.offsetWidth, container.offsetHeight);\r\n                    canvas.parent(container);\r\n                    canvas.elt.style.position = \"absolute\";\r\n                    canvas.elt.style.top = \"0\";\r\n                    canvas.elt.style.left = \"0\";\r\n                    canvas.elt.style.zIndex = \"1\";\r\n                    canvas.elt.style.pointerEvents = \"none\";\r\n\r\n                    gerarLinhasDeFundo();\r\n                };\r\n\r\n                function detectarDispositivo() {\r\n                    isMobile = \/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini\/i.test(navigator.userAgent) || \r\n                               window.innerWidth <= 768;\r\n                    CONFIG = isMobile ? CONFIG_MOBILE : CONFIG_DESKTOP;\r\n                }\r\n\r\n                p.draw = function() {\r\n                    let agora = p.millis();\r\n                    if (agora - tempoUltimaAtualizacao < INTERVALO_ATUALIZACAO) return;\r\n                    tempoUltimaAtualizacao = agora;\r\n\r\n                    p.clear();\r\n                    desenharFundo();\r\n                };\r\n\r\n                function getLarguraCortina(y) {\r\n                    let progressoAltura = p.constrain(y \/ p.height, 0, 1);\r\n                    return p.lerp(CONFIG.larguraCortinaTopo, CONFIG.larguraCortinaBase, progressoAltura);\r\n                }\r\n\r\n                function estaNoEspacoCortina(x, y) {\r\n                    let centroX = p.width \/ 2;\r\n                    let larguraAtual = getLarguraCortina(y) \/ 2 + CONFIG.margemDesvio;\r\n                    \r\n                    let naCortinaCentral = x >= centroX - larguraAtual && x <= centroX + larguraAtual;\r\n                    let naAreaInferior = y > p.height * 0.85;\r\n                    \r\n                    return naCortinaCentral || naAreaInferior;\r\n                }\r\n\r\n                function getLadoCortina(x) {\r\n                    let centroX = p.width \/ 2;\r\n                    return x < centroX ? 'esquerda' : 'direita';\r\n                }\r\n\r\n                function gerarLinhasDeFundo() {\r\n                    linhasDeFundo = [];\r\n                    \r\n                    function criarLinha(startX, startY, direcoes, maxIteracoes, ladoFixo) {\r\n                        let linha = {\r\n                            segmentos: [],\r\n                            cor: p.color(CORES.linhas[linhasDeFundo.length % CORES.linhas.length]),\r\n                            espessura: CONFIG.espessuraLinhaFundo,\r\n                            lado: ladoFixo\r\n                        };\r\n\r\n                        let x = startX, y = startY;\r\n                        let direcaoAtual = p.random(direcoes);\r\n                        let iteracoes = 0;\r\n                        let ultimosSegmentos = [];\r\n                        let centroX = p.width \/ 2;\r\n\r\n                        while (iteracoes < maxIteracoes) {\r\n                            iteracoes++;\r\n                            let len = isMobile ? p.random(50, 100) : p.random(80, 160);\r\n                            let inicioX = x, inicioY = y;\r\n                            let novoX = x, novoY = y;\r\n\r\n                            switch(direcaoAtual) {\r\n                                case \"horizontal\":\r\n                                    novoX += len;\r\n                                    break;\r\n                                case \"horizontal-inv\":\r\n                                    novoX -= len;\r\n                                    break;\r\n                                case \"vertical\":\r\n                                    novoY += len;\r\n                                    break;\r\n                                case \"vertical-inv\":\r\n                                    novoY -= len;\r\n                                    break;\r\n                                case \"diagonal-up\":\r\n                                    novoX += len * 0.7;\r\n                                    novoY -= len * 0.7;\r\n                                    break;\r\n                                case \"diagonal-down\":\r\n                                    novoX += len * 0.7;\r\n                                    novoY += len * 0.7;\r\n                                    break;\r\n                                case \"diagonal-up-inv\":\r\n                                    novoX -= len * 0.7;\r\n                                    novoY -= len * 0.7;\r\n                                    break;\r\n                                case \"diagonal-down-inv\":\r\n                                    novoX -= len * 0.7;\r\n                                    novoY += len * 0.7;\r\n                                    break;\r\n                            }\r\n\r\n                            let vaiCruzar = false;\r\n                            for (let t = 0; t <= 1; t += 0.1) {\r\n                                let checkX = p.lerp(inicioX, novoX, t);\r\n                                let checkY = p.lerp(inicioY, novoY, t);\r\n                                if (estaNoEspacoCortina(checkX, checkY)) {\r\n                                    vaiCruzar = true;\r\n                                    break;\r\n                                }\r\n                            }\r\n\r\n                            let vaiCruzarLado = false;\r\n                            if (ladoFixo === 'esquerda' && novoX > centroX - CONFIG.margemDesvio) {\r\n                                vaiCruzarLado = true;\r\n                            } else if (ladoFixo === 'direita' && novoX < centroX + CONFIG.margemDesvio) {\r\n                                vaiCruzarLado = true;\r\n                            }\r\n\r\n                            let estaVoltando = false;\r\n                            if (ultimosSegmentos.length > 2) {\r\n                                let segmentosRecentes = ultimosSegmentos.slice(-3);\r\n                                for (let seg of segmentosRecentes) {\r\n                                    let distFim = p.dist(novoX, novoY, seg.x1, seg.y1);\r\n                                    if (distFim < len * 0.4) {\r\n                                        estaVoltando = true;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                            }\r\n\r\n                            if (!vaiCruzar && !estaVoltando && !vaiCruzarLado) {\r\n                                let novoSegmento = { x1: inicioX, y1: inicioY, x2: novoX, y2: novoY };\r\n                                linha.segmentos.push(novoSegmento);\r\n                                \r\n                                ultimosSegmentos.push(novoSegmento);\r\n                                if (ultimosSegmentos.length > 3) {\r\n                                    ultimosSegmentos.shift();\r\n                                }\r\n                                \r\n                                x = novoX;\r\n                                y = novoY;\r\n                                \r\n                                if (p.random() < 0.3) {\r\n                                    direcaoAtual = p.random(direcoes);\r\n                                }\r\n                            } else {\r\n                                let direcoesDesvio = [];\r\n                                \r\n                                if (y > p.height * 0.75) {\r\n                                    if (ladoFixo === 'esquerda') {\r\n                                        direcoesDesvio = [\"horizontal-inv\", \"diagonal-up-inv\", \"vertical-inv\"];\r\n                                    } else {\r\n                                        direcoesDesvio = [\"horizontal\", \"diagonal-up\", \"vertical-inv\"];\r\n                                    }\r\n                                } else {\r\n                                    if (ladoFixo === 'esquerda') {\r\n                                        direcoesDesvio = [\"horizontal-inv\", \"diagonal-up-inv\", \"diagonal-down-inv\", \"vertical\"];\r\n                                    } else {\r\n                                        direcoesDesvio = [\"horizontal\", \"diagonal-up\", \"diagonal-down\", \"vertical\"];\r\n                                    }\r\n                                }\r\n                                \r\n                                let tentativas = 0;\r\n                                let encontrouDirecao = false;\r\n                                \r\n                                while (tentativas < 8 && !encontrouDirecao) {\r\n                                    direcaoAtual = p.random(direcoesDesvio);\r\n                                    tentativas++;\r\n                                    \r\n                                    let testX = x, testY = y;\r\n                                    switch(direcaoAtual) {\r\n                                        case \"horizontal\": testX += len; break;\r\n                                        case \"horizontal-inv\": testX -= len; break;\r\n                                        case \"vertical\": testY += len; break;\r\n                                        case \"vertical-inv\": testY -= len; break;\r\n                                        case \"diagonal-up\": testX += len * 0.7; testY -= len * 0.7; break;\r\n                                        case \"diagonal-down\": testX += len * 0.7; testY += len * 0.7; break;\r\n                                        case \"diagonal-up-inv\": testX -= len * 0.7; testY -= len * 0.7; break;\r\n                                        case \"diagonal-down-inv\": testX -= len * 0.7; testY += len * 0.7; break;\r\n                                    }\r\n                                    \r\n                                    let saiDoLado = false;\r\n                                    if (ladoFixo === 'esquerda' && testX > centroX - CONFIG.margemDesvio) {\r\n                                        saiDoLado = true;\r\n                                    } else if (ladoFixo === 'direita' && testX < centroX + CONFIG.margemDesvio) {\r\n                                        saiDoLado = true;\r\n                                    }\r\n                                    \r\n                                    let vaVoltar = false;\r\n                                    let segmentosCheck = ultimosSegmentos.slice(-2);\r\n                                    for (let seg of segmentosCheck) {\r\n                                        let distTest = p.dist(testX, testY, seg.x1, seg.y1);\r\n                                        if (distTest < len * 0.3) {\r\n                                            vaVoltar = true;\r\n                                            break;\r\n                                        }\r\n                                    }\r\n                                    \r\n                                    if (!vaVoltar && !saiDoLado) {\r\n                                        encontrouDirecao = true;\r\n                                    }\r\n                                }\r\n                                \r\n                                if (!encontrouDirecao) {\r\n                                    direcaoAtual = p.random(direcoesDesvio);\r\n                                }\r\n                            }\r\n\r\n                            if (x < -400 || x > p.width + 400 || y > p.height + 400) {\r\n                                break;\r\n                            }\r\n                        }\r\n                        \r\n                        return linha;\r\n                    }\r\n\r\n                    for (let i = 0; i < CONFIG.linhasHorizontais \/ 2; i++) {\r\n                        linhasDeFundo.push(criarLinha(\r\n                            p.random(-400, -100),\r\n                            p.random(-100, p.height * 0.7),\r\n                            [\"horizontal\", \"diagonal-up\", \"diagonal-down\", \"vertical\"],\r\n                            200,\r\n                            'esquerda'\r\n                        ));\r\n                    }\r\n\r\n                    for (let i = 0; i < CONFIG.linhasHorizontais \/ 2; i++) {\r\n                        linhasDeFundo.push(criarLinha(\r\n                            p.random(p.width + 100, p.width + 400),\r\n                            p.random(-100, p.height * 0.7),\r\n                            [\"horizontal-inv\", \"diagonal-up-inv\", \"diagonal-down-inv\", \"vertical\"],\r\n                            200,\r\n                            'direita'\r\n                        ));\r\n                    }\r\n                    \r\n                    for (let i = 0; i < CONFIG.linhasVerticais; i++) {\r\n                        let posX = p.random(-100, p.width + 100);\r\n                        let ladoLinha = posX < p.width \/ 2 ? 'esquerda' : 'direita';\r\n                        let direcoesPermitidas = ladoLinha === 'esquerda' \r\n                            ? [\"vertical\", \"diagonal-down-inv\", \"horizontal-inv\"]\r\n                            : [\"vertical\", \"diagonal-down\", \"horizontal\"];\r\n                        \r\n                        linhasDeFundo.push(criarLinha(\r\n                            posX,\r\n                            p.random(-400, -100),\r\n                            direcoesPermitidas,\r\n                            200,\r\n                            ladoLinha\r\n                        ));\r\n                    }\r\n                }\r\n\r\n                function desenharFundo() {\r\n                    p.strokeCap(p.ROUND);\r\n                    p.strokeJoin(p.ROUND);\r\n                    p.noFill();\r\n\r\n                    for (let linha of linhasDeFundo) {\r\n                        if (linha.segmentos.length === 0) continue;\r\n                        \r\n                        p.stroke(linha.cor);\r\n                        p.strokeWeight(linha.espessura);\r\n                        p.beginShape();\r\n                        \r\n                        let inicio = deslocarFundo(linha.segmentos[0].x1, linha.segmentos[0].y1);\r\n                        p.vertex(inicio.x, inicio.y);\r\n\r\n                        for (let i = 0; i < linha.segmentos.length; i++) {\r\n                            let seg = linha.segmentos[i];\r\n                            let fim = deslocarFundo(seg.x2, seg.y2);\r\n\r\n                            if (i === linha.segmentos.length - 1) {\r\n                                p.vertex(fim.x, fim.y);\r\n                            } else {\r\n                                let prox = linha.segmentos[i + 1];\r\n                                let raio = linha.espessura * 1.5;\r\n\r\n                                let dx1 = seg.x2 - seg.x1, dy1 = seg.y2 - seg.y1;\r\n                                let len1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);\r\n                                let dx2 = prox.x2 - prox.x1, dy2 = prox.y2 - prox.y1;\r\n                                let len2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\r\n\r\n                                if (len1 > 0 && len2 > 0) {\r\n                                    dx1 \/= len1; dy1 \/= len1; dx2 \/= len2; dy2 \/= len2;\r\n                                    let distIni = Math.min(raio, len1 * 0.3);\r\n                                    let distFim = Math.min(raio, len2 * 0.3);\r\n\r\n                                    let curvaIni = deslocarFundo(seg.x2 - dx1 * distIni, seg.y2 - dy1 * distIni);\r\n                                    let controle = deslocarFundo(seg.x2, seg.y2);\r\n                                    let curvaFim = deslocarFundo(seg.x2 + dx2 * distFim, seg.y2 + dy2 * distFim);\r\n\r\n                                    p.vertex(curvaIni.x, curvaIni.y);\r\n                                    p.quadraticVertex(controle.x, controle.y, curvaFim.x, curvaFim.y);\r\n                                }\r\n                            }\r\n                        }\r\n                        p.endShape();\r\n                    }\r\n                }\r\n\r\n                function deslocarFundo(x, y) {\r\n                    let dx = x - p.mouseX, dy = y - p.mouseY;\r\n                    let distSq = dx * dx + dy * dy;\r\n                    let maxDistSq = CONFIG.maxDistDeslocamento * CONFIG.maxDistDeslocamento;\r\n\r\n                    if (distSq < maxDistSq) {\r\n                        let d = Math.sqrt(distSq);\r\n                        let forca = p.map(d, 0, CONFIG.maxDistDeslocamento, CONFIG.forcaDeslocamentoFundo, 0);\r\n                        return { x: x + (dx \/ d) * forca, y: y + (dy \/ d) * forca };\r\n                    }\r\n                    return { x, y };\r\n                }\r\n\r\n                p.windowResized = function() {\r\n                    detectarDispositivo();\r\n                    p.resizeCanvas(container.offsetWidth, container.offsetHeight);\r\n                    gerarLinhasDeFundo();\r\n                };\r\n            };\r\n        }\r\n\r\n        \/\/ VERS\u00c3O COMPLETA (sem espa\u00e7o vazio)\r\n        function criarLinesSketch(container) {\r\n            return function(p) {\r\n                let linhasDeFundo = [];\r\n                let isMobile = false;\r\n                let CONFIG = CONFIG_DESKTOP;\r\n                let tempoUltimaAtualizacao = 0;\r\n                const INTERVALO_ATUALIZACAO = 16;\r\n\r\n                p.setup = function() {\r\n                    detectarDispositivo();\r\n                    \r\n                    let canvas = p.createCanvas(container.offsetWidth, container.offsetHeight);\r\n                    canvas.parent(container);\r\n                    canvas.elt.style.position = \"absolute\";\r\n                    canvas.elt.style.top = \"0\";\r\n                    canvas.elt.style.left = \"0\";\r\n                    canvas.elt.style.zIndex = \"1\";\r\n                    canvas.elt.style.pointerEvents = \"none\";\r\n\r\n                    gerarLinhasDeFundo();\r\n                };\r\n\r\n                function detectarDispositivo() {\r\n                    isMobile = \/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini\/i.test(navigator.userAgent) || \r\n                               window.innerWidth <= 768;\r\n                    CONFIG = isMobile ? CONFIG_MOBILE : CONFIG_DESKTOP;\r\n                }\r\n\r\n                p.draw = function() {\r\n                    let agora = p.millis();\r\n                    if (agora - tempoUltimaAtualizacao < INTERVALO_ATUALIZACAO) return;\r\n                    tempoUltimaAtualizacao = agora;\r\n\r\n                    p.clear();\r\n                    desenharFundo();\r\n                };\r\n\r\n                function gerarLinhasDeFundo() {\r\n                    linhasDeFundo = [];\r\n                    \r\n                    function criarLinha(startX, startY, direcoes, maxIteracoes) {\r\n                        let linha = {\r\n                            segmentos: [],\r\n                            cor: p.color(CORES.linhas[linhasDeFundo.length % CORES.linhas.length]),\r\n                            espessura: CONFIG.espessuraLinhaFundo\r\n                        };\r\n\r\n                        let x = startX, y = startY;\r\n                        let direcaoAtual = p.random(direcoes);\r\n                        let iteracoes = 0;\r\n                        let ultimosSegmentos = [];\r\n\r\n                        while (iteracoes < maxIteracoes) {\r\n                            iteracoes++;\r\n                            let len = isMobile ? p.random(50, 100) : p.random(80, 160);\r\n                            let inicioX = x, inicioY = y;\r\n                            let novoX = x, novoY = y;\r\n\r\n                            switch(direcaoAtual) {\r\n                                case \"horizontal\":\r\n                                    novoX += len;\r\n                                    break;\r\n                                case \"horizontal-inv\":\r\n                                    novoX -= len;\r\n                                    break;\r\n                                case \"vertical\":\r\n                                    novoY += len;\r\n                                    break;\r\n                                case \"vertical-inv\":\r\n                                    novoY -= len;\r\n                                    break;\r\n                                case \"diagonal-up\":\r\n                                    novoX += len * 0.7;\r\n                                    novoY -= len * 0.7;\r\n                                    break;\r\n                                case \"diagonal-down\":\r\n                                    novoX += len * 0.7;\r\n                                    novoY += len * 0.7;\r\n                                    break;\r\n                                case \"diagonal-up-inv\":\r\n                                    novoX -= len * 0.7;\r\n                                    novoY -= len * 0.7;\r\n                                    break;\r\n                                case \"diagonal-down-inv\":\r\n                                    novoX -= len * 0.7;\r\n                                    novoY += len * 0.7;\r\n                                    break;\r\n                            }\r\n\r\n                            let estaVoltando = false;\r\n                            if (ultimosSegmentos.length > 2) {\r\n                                let segmentosRecentes = ultimosSegmentos.slice(-3);\r\n                                for (let seg of segmentosRecentes) {\r\n                                    let distFim = p.dist(novoX, novoY, seg.x1, seg.y1);\r\n                                    if (distFim < len * 0.4) {\r\n                                        estaVoltando = true;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                            }\r\n\r\n                            if (!estaVoltando) {\r\n                                let novoSegmento = { x1: inicioX, y1: inicioY, x2: novoX, y2: novoY };\r\n                                linha.segmentos.push(novoSegmento);\r\n                                \r\n                                ultimosSegmentos.push(novoSegmento);\r\n                                if (ultimosSegmentos.length > 3) {\r\n                                    ultimosSegmentos.shift();\r\n                                }\r\n                                \r\n                                x = novoX;\r\n                                y = novoY;\r\n                                \r\n                                if (p.random() < 0.3) {\r\n                                    direcaoAtual = p.random(direcoes);\r\n                                }\r\n                            } else {\r\n                                let tentativas = 0;\r\n                                let encontrouDirecao = false;\r\n                                \r\n                                while (tentativas < 8 && !encontrouDirecao) {\r\n                                    direcaoAtual = p.random(direcoes);\r\n                                    tentativas++;\r\n                                    \r\n                                    let testX = x, testY = y;\r\n                                    switch(direcaoAtual) {\r\n                                        case \"horizontal\": testX += len; break;\r\n                                        case \"horizontal-inv\": testX -= len; break;\r\n                                        case \"vertical\": testY += len; break;\r\n                                        case \"vertical-inv\": testY -= len; break;\r\n                                        case \"diagonal-up\": testX += len * 0.7; testY -= len * 0.7; break;\r\n                                        case \"diagonal-down\": testX += len * 0.7; testY += len * 0.7; break;\r\n                                        case \"diagonal-up-inv\": testX -= len * 0.7; testY -= len * 0.7; break;\r\n                                        case \"diagonal-down-inv\": testX -= len * 0.7; testY += len * 0.7; break;\r\n                                    }\r\n                                    \r\n                                    let vaVoltar = false;\r\n                                    let segmentosCheck = ultimosSegmentos.slice(-2);\r\n                                    for (let seg of segmentosCheck) {\r\n                                        let distTest = p.dist(testX, testY, seg.x1, seg.y1);\r\n                                        if (distTest < len * 0.3) {\r\n                                            vaVoltar = true;\r\n                                            break;\r\n                                        }\r\n                                    }\r\n                                    \r\n                                    if (!vaVoltar) {\r\n                                        encontrouDirecao = true;\r\n                                    }\r\n                                }\r\n                                \r\n                                if (!encontrouDirecao) {\r\n                                    direcaoAtual = p.random(direcoes);\r\n                                }\r\n                            }\r\n\r\n                            if (x < -400 || x > p.width + 400 || y < -400 || y > p.height + 400) {\r\n                                break;\r\n                            }\r\n                        }\r\n                        \r\n                        return linha;\r\n                    }\r\n\r\n                    for (let i = 0; i < CONFIG.linhasHorizontais \/ 2; i++) {\r\n                        linhasDeFundo.push(criarLinha(\r\n                            p.random(-400, -100),\r\n                            p.random(-100, p.height + 100),\r\n                            [\"horizontal\", \"diagonal-up\", \"diagonal-down\", \"vertical\", \"vertical-inv\"],\r\n                            200\r\n                        ));\r\n                    }\r\n\r\n                    for (let i = 0; i < CONFIG.linhasHorizontais \/ 2; i++) {\r\n                        linhasDeFundo.push(criarLinha(\r\n                            p.random(p.width + 100, p.width + 400),\r\n                            p.random(-100, p.height + 100),\r\n                            [\"horizontal-inv\", \"diagonal-up-inv\", \"diagonal-down-inv\", \"vertical\", \"vertical-inv\"],\r\n                            200\r\n                        ));\r\n                    }\r\n                    \r\n                    for (let i = 0; i < CONFIG.linhasVerticais \/ 2; i++) {\r\n                        linhasDeFundo.push(criarLinha(\r\n                            p.random(-100, p.width + 100),\r\n                            p.random(-400, -100),\r\n                            [\"vertical\", \"diagonal-up\", \"diagonal-down\", \"horizontal\", \"horizontal-inv\"],\r\n                            200\r\n                        ));\r\n                    }\r\n\r\n                    for (let i = 0; i < CONFIG.linhasVerticais \/ 2; i++) {\r\n                        linhasDeFundo.push(criarLinha(\r\n                            p.random(-100, p.width + 100),\r\n                            p.random(p.height + 100, p.height + 400),\r\n                            [\"vertical-inv\", \"diagonal-up-inv\", \"diagonal-down-inv\", \"horizontal\", \"horizontal-inv\"],\r\n                            200\r\n                        ));\r\n                    }\r\n                }\r\n\r\n                function desenharFundo() {\r\n                    p.strokeCap(p.ROUND);\r\n                    p.strokeJoin(p.ROUND);\r\n                    p.noFill();\r\n\r\n                    for (let linha of linhasDeFundo) {\r\n                        if (linha.segmentos.length === 0) continue;\r\n                        \r\n                        p.stroke(linha.cor);\r\n                        p.strokeWeight(linha.espessura);\r\n                        p.beginShape();\r\n                        \r\n                        let inicio = deslocarFundo(linha.segmentos[0].x1, linha.segmentos[0].y1);\r\n                        p.vertex(inicio.x, inicio.y);\r\n\r\n                        for (let i = 0; i < linha.segmentos.length; i++) {\r\n                            let seg = linha.segmentos[i];\r\n                            let fim = deslocarFundo(seg.x2, seg.y2);\r\n\r\n                            if (i === linha.segmentos.length - 1) {\r\n                                p.vertex(fim.x, fim.y);\r\n                            } else {\r\n                                let prox = linha.segmentos[i + 1];\r\n                                let raio = linha.espessura * 1.5;\r\n\r\n                                let dx1 = seg.x2 - seg.x1, dy1 = seg.y2 - seg.y1;\r\n                                let len1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);\r\n                                let dx2 = prox.x2 - prox.x1, dy2 = prox.y2 - prox.y1;\r\n                                let len2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\r\n\r\n                                if (len1 > 0 && len2 > 0) {\r\n                                    dx1 \/= len1; dy1 \/= len1; dx2 \/= len2; dy2 \/= len2;\r\n                                    let distIni = Math.min(raio, len1 * 0.3);\r\n                                    let distFim = Math.min(raio, len2 * 0.3);\r\n\r\n                                    let curvaIni = deslocarFundo(seg.x2 - dx1 * distIni, seg.y2 - dy1 * distIni);\r\n                                    let controle = deslocarFundo(seg.x2, seg.y2);\r\n                                    let curvaFim = deslocarFundo(seg.x2 + dx2 * distFim, seg.y2 + dy2 * distFim);\r\n\r\n                                    p.vertex(curvaIni.x, curvaIni.y);\r\n                                    p.quadraticVertex(controle.x, controle.y, curvaFim.x, curvaFim.y);\r\n                                }\r\n                            }\r\n                        }\r\n                        p.endShape();\r\n                    }\r\n                }\r\n\r\n                function deslocarFundo(x, y) {\r\n                    let dx = x - p.mouseX, dy = y - p.mouseY;\r\n                    let distSq = dx * dx + dy * dy;\r\n                    let maxDistSq = CONFIG.maxDistDeslocamento * CONFIG.maxDistDeslocamento;\r\n\r\n                    if (distSq < maxDistSq) {\r\n                        let d = Math.sqrt(distSq);\r\n                        let forca = p.map(d, 0, CONFIG.maxDistDeslocamento, CONFIG.forcaDeslocamentoFundo, 0);\r\n                        return { x: x + (dx \/ d) * forca, y: y + (dy \/ d) * forca };\r\n                    }\r\n                    return { x, y };\r\n                }\r\n\r\n                p.windowResized = function() {\r\n                    detectarDispositivo();\r\n                    p.resizeCanvas(container.offsetWidth, container.offsetHeight);\r\n                    gerarLinhasDeFundo();\r\n                };\r\n            };\r\n        }\r\n\r\n        \/\/ Inicializar ambas as vers\u00f5es\r\n        document.addEventListener('DOMContentLoaded', function() {\r\n            \/\/ Cortinas (com espa\u00e7o vazio)\r\n            const curtainContainers = document.querySelectorAll('.curtain-background');\r\n            curtainContainers.forEach(container => {\r\n                new p5(criarCurtainSketch(container));\r\n            });\r\n\r\n            \/\/ Linhas completas (sem espa\u00e7o vazio)\r\n            const linesContainers = document.querySelectorAll('.lines-background');\r\n            linesContainers.forEach(container => {\r\n                new p5(criarLinesSketch(container));\r\n            });\r\n        });\r\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-68b0270 elementor-widget elementor-widget-spacer\" data-id=\"68b0270\" data-element_type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2b1fed2 e-flex e-con-boxed e-con e-child\" data-id=\"2b1fed2\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-587a833 e-con-full e-flex e-con e-child\" data-id=\"587a833\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ba32420 elementor-widget elementor-widget-heading\" data-id=\"ba32420\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Manifesto<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ba93223 elementor-widget elementor-widget-text-editor\" data-id=\"ba93223\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>O MANIFESTO PELA GENTILEZA nasce da urg\u00eancia de promovermos o respeito, a educa\u00e7\u00e3o e a empatia nas rela\u00e7\u00f5es humanas, como resposta \u00e0 crescente viol\u00eancia verbal e \u00e0 necessidade de cultivarmos uma sociedade mais humana e solid\u00e1ria.<\/p><p>Como universidade e como lugar de debate, investiga\u00e7\u00e3o e transforma\u00e7\u00e3o cultural, temos a oportunidade \u2013 e a responsabilidade \u2013 de afirmar que a gentileza n\u00e3o \u00e9 mero ideal abstrato, mas uma for\u00e7a colectiva com impacto real na vida comunit\u00e1ria e social. Convid\u00e1mos, por isso, toda a comunidade a dar corpo a esse compromisso, partilhando ideias, voz e pr\u00e1tica. Queremos que o MANIFESTO PELA GENTILEZA ecoe para al\u00e9m da Academia e se inscreva no tecido vivo da sociedade.<\/p><p>Desafi\u00e1mos os particiantes a completar sete frases diferentes atrav\u00e9s de um formul\u00e1rio an\u00f3nimo. Fizemos uma sele\u00e7\u00e3o de cerca de 50 frases e assim cri\u00e1mos a primeira vers\u00e3o oficial do MANIFESTO PELA GENTILEZA.<\/p><p>Esta \u00e9 apenas uma das m\u00faltiplas composi\u00e7\u00f5es que poderiam ser realizadas a partir das frases oferecidas pelos participantes neste desafio. Estamos muito gratos por estas 700 frases luminosas, que mostram como a gentileza pode ser uma ferramenta revolucion\u00e1ria.<\/p><p>Se pretender utilizar o formul\u00e1rio para criar o Manifesto pela Gentileza na sua institui\u00e7\u00e3o, com frases dos membros da sua comunidade, contacte-nos para<strong> cultura@reit.up.pt<\/strong>. Teremos prazer em adapt\u00e1-lo para que possa promover um Manifesto pela Gentileza com as palavras inspiradoras da sua comunidade.<\/p>\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 class=\"elementor-element elementor-element-297cf28 elementor-widget elementor-widget-spacer\" data-id=\"297cf28\" data-element_type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0a2a7db e-con-full e-flex e-con e-child\" data-id=\"0a2a7db\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-32bf732 e-con-full e-flex e-con e-child\" data-id=\"32bf732\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-13391b7 elementor-widget elementor-widget-text-editor\" data-id=\"13391b7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>MANIFESTO PELA GENTILEZA<\/strong><\/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-e19f2de elementor-widget elementor-widget-text-editor\" data-id=\"e19f2de\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"texto-gentileza\"><p>Neste mundo de vozes apressadas, julgamentos ligeiros e sil\u00eancios que ferem<\/p><p>Neste mundo de velocidades desiguais, ru\u00eddos insistentes e horizontes por vezes nublados<\/p><p>Neste mundo de atropelos, palavras duras e encontros raros<\/p><p>Neste mundo de epidemias, confinamentos e outras distopias<\/p><p>De incertezas e conflitos<\/p><p>De medos herdados<\/p><p>De trincheiras\u2026 onde a empatia falta<\/p><p><strong>Ser gentil \u00e9 um ato pol\u00edtico.<\/strong><\/p><p>Precisamos de gentileza porque ela \u00e9 a forma mais simples \u2013 e mais radical \u2013 de lembrar que ainda pertencemos uns aos outros<\/p><p>Precisamos de gentileza porque s\u00f3 ela devolve humanidade aos pequenos gestos<\/p><p>Precisamos de gentileza porque \u00e9 nos outros que vemos a nossa humanidade<\/p><p>Precisamos de gentileza porque \u00e9 o contraponto da rudeza<\/p><p>Porque apenas a gentileza gera gentileza<\/p><p>Precisamos de gentileza porque nos falta o ar!<\/p><p>Porque \u00e9 a ferramenta essencial do respeito.<\/p><p><strong>Porque apenas a gentileza nos pode salvar.<\/strong><\/p><p>A gentileza come\u00e7a quando aceitamos a diferen\u00e7a<\/p><p>Quando percebemos que cada gesto nosso tem o poder de inaugurar um novo come\u00e7o<\/p><p>Quando escolhemos ouvir antes de responder e compreender antes de julgar<\/p><p>A gentileza come\u00e7a quando tratamos algu\u00e9m com todo o respeito<\/p><p>Quando transformamos as pedras em flores<\/p><p>Quando levantamos quem cai<\/p><p>Quando re-paramos: quando praticamos presen\u00e7a.<\/p><p><strong>A gentileza come\u00e7a por dentro, aprende-se de raiz.<\/strong><\/p><p>A gentileza transforma-se em ponte quando o mundo s\u00f3 oferece abismos<\/p><p>A gentileza transforma-se em porta aberta, sorriso certo e descoberta<\/p><p>A gentileza transforma-se em colo em dias tristes<\/p><p>A gentileza transforma-se em gesto reparador<\/p><p>Em resist\u00eancia, em escudo contra o sarcasmo<\/p><p>Numa flor que brota num terreno in\u00f3spito<\/p><p>Num ato de dignidade, em intera\u00e7\u00e3o respeitosa.<\/p><p><strong>A gentileza n\u00e3o se transforma, a gentileza transforma<\/strong>.<\/p><p>A gentileza encontra lugar onde existe uma comunidade que pensa, debate e age<\/p><p>A gentileza encontra lugar onde o di\u00e1logo substitui a intoler\u00e2ncia<\/p><p>A gentileza encontra lugar numa verdadeira democracia<\/p><p>A gentileza encontra lugar onde o olhar se demora<\/p><p>Onde a empatia impera, na palavra amiga<\/p><p>A gentileza encontra lugar na verdade<\/p><p>A gentileza encontra lugar onde a vulnerabilidade \u00e9 recebida com cuidado.<\/p><p><strong>A gentileza encontra sempre lugar.<\/strong><\/p><p>A cultura \u00e9 gentil quando amplia vozes, devolve narrativas esquecidas e semeia futuros poss\u00edveis<\/p><p>A cultura \u00e9 gentil quando nos abra\u00e7a e inclui<\/p><p>A cultura \u00e9 gentil quando \u00e9 vivida com Verdade<\/p><p>A cultura \u00e9 gentil quando une as diferen\u00e7as na toler\u00e2ncia e diversidade<\/p><p>A cultura \u00e9 gentil quando acolhe vozes diferentes e as transforma num coro<\/p><p>A cultura \u00e9 gentil quando se faz ponte entre povos<\/p><p>A cultura \u00e9 gentil quando espalha a gentileza.<\/p><p><strong>A Cultura \u00e9 gentil quando acolhe e respeita todos.<\/strong><\/p><p>Por isso escolhemos a gentileza. Queremos uma comunidade onde o cuidado seja princ\u00edpio e pr\u00e1tica para o bem comum<\/p><p>Por isso escolhemos a gentileza. Queremos que ela abra caminhos onde antes s\u00f3 havia dist\u00e2ncia<\/p><p>Queremos ser o sil\u00eancio que desarma, a palavra que acolhe, o gesto que reconstr\u00f3i<\/p><p>Queremos contagiar o pr\u00f3ximo, reconquistar a esperan\u00e7a<\/p><p>Queremos que a palavra seja ponte<\/p><p>Queremos ser a voz ativa da transforma\u00e7\u00e3o<\/p><p>Queremos que a cultura reacenda esse pequeno milagre.<\/p><p><strong>Por isso escolhemos a gentileza<\/strong>.<\/p><p>Porque a gentileza \u00e9 a \u00fanica fronteira que acolhe<\/p><p>\u00c9 a \u00faltima linha de resist\u00eancia humana.<\/p><p><strong>Toda a gentileza \u00e9 uma declara\u00e7\u00e3o de amor.<\/strong><\/p><p><strong>Por isso escolhemos a gentileza.<\/strong><\/p><\/div>\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-931f5d0 elementor-widget elementor-widget-text-editor\" data-id=\"931f5d0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>INTERCULT, Universidade do Porto<\/strong><\/p><p><strong>25 novembro de 2025<\/strong><\/p>\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\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e16cbc0 e-flex e-con-boxed e-con e-parent\" data-id=\"e16cbc0\" data-element_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-00e3ae4 e-con-full e-flex e-con e-child\" data-id=\"00e3ae4\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-afd0eaf elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor\" data-id=\"afd0eaf\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-size: 16px\">Nem todas repostas puderam entrar no MANIFESTO, mas gostar\u00edamos de deixar registadas as frases criadas por nossos participantes:<\/span><\/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-fb79dc9 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"fb79dc9\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><div id=\"gentileza-phrases-widget\">\r\n    <style>\r\n        #gentileza-phrases-widget .gentileza-phrase-item {\r\n            margin: 15px 0;\r\n        }\r\n\t\t\r\n\t\t #gentileza-phrases-widget {\r\n           font-size:20px;\r\n        }\r\n        \r\n        #gentileza-phrases-widget .gentileza-static-text {\r\n            color: white;\r\n        }\r\n        \r\n        #gentileza-phrases-widget .gentileza-dynamic-text {\r\n            color: #FFC600;\r\n        }\r\n        \r\n        #gentileza-phrases-widget .gentileza-dynamic-text.fade-in {\r\n            animation: gentilezaFadeIn 0.5s ease-in;\r\n        }\r\n        \r\n        @keyframes gentilezaFadeIn {\r\n            from {\r\n                opacity: 0;\r\n            }\r\n            to {\r\n                opacity: 1;\r\n            }\r\n        }\r\n        \r\n        #gentileza-phrases-widget .gentileza-counter {\r\n            margin-top: 20px;\r\n            text-align: center;\r\n            color: #6B4CA3;\r\n            font-size: 0.9em;\r\n        }\r\n        \r\n        #gentileza-phrases-widget .gentileza-loading,\r\n        #gentileza-phrases-widget .gentileza-error {\r\n            text-align: center;\r\n            padding: 20px;\r\n        }\r\n    <\/style>\r\n    \r\n    <div id=\"gentileza-phrases-container\">\r\n        <div class=\"gentileza-loading\">Carregando respostas...<\/div>\r\n    <\/div>\r\n    <div class=\"gentileza-counter\" id=\"gentileza-counter\"><\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function() {\r\n    \/\/ ===== CONFIGURE AQUI =====\r\n    const CONFIG = {\r\n        apiKey: 'AIzaSyDaIQpRM1vR7i5RUXRVeg0XwpaiTfrAXa8',\r\n        sheetId: '1s_ADNcKT3CrNRUzgtSzEPkZfCrqCvzIEasQdtHFDV2w',\r\n        sheetName: 'Respostas ao formul\u00e1rio',\r\n        intervalo: 15000,\r\n        \r\n        perguntas: [\r\n            { texto: 'Neste mundo de ', range: 'B2:B101' },\r\n            { texto: 'Precisamos de gentileza porque ', range: 'C2:C101' },\r\n            { texto: 'A gentileza come\u00e7a quando ', range: 'D2:D101' },\r\n            { texto: 'A gentileza transforma-se ', range: 'E2:E101' },\r\n            { texto: 'A gentileza encontra lugar onde ', range: 'F2:F101' },\r\n            { texto: 'A Cultura \u00e9 gentil quando ', range: 'G2:G101' },\r\n            { texto: 'Por isso escolhemos a gentileza. Queremos ', range: 'H2:H101' }\r\n        ]\r\n    };\r\n    \/\/ ==========================\r\n    \r\n    let allResponses = [];\r\n    let currentResponseIndex = 0;\r\n    const phrasesContainer = document.getElementById('gentileza-phrases-container');\r\n    const counterElement = document.getElementById('gentileza-counter');\r\n    \r\n    function normalizeText(text) {\r\n        if (!text || text.length === 0) return text;\r\n        return text.charAt(0).toLowerCase() + text.slice(1);\r\n    }\r\n    \r\n    async function fetchSheetData() {\r\n        try {\r\n            allResponses = [];\r\n            \r\n            for (let i = 0; i < CONFIG.perguntas.length; i++) {\r\n                const pergunta = CONFIG.perguntas[i];\r\n                const fullRange = encodeURIComponent(`${CONFIG.sheetName}!${pergunta.range}`);\r\n                const url = `https:\/\/sheets.googleapis.com\/v4\/spreadsheets\/${CONFIG.sheetId}\/values\/${fullRange}?key=${CONFIG.apiKey}`;\r\n                \r\n                const response = await fetch(url);\r\n                const data = await response.json();\r\n                \r\n                if (data.values && data.values.length > 0) {\r\n                    const respostas = data.values\r\n                        .map(row => row[0])\r\n                        .filter(val => val && val.trim() !== '')\r\n                        .map(val => normalizeText(val.trim()));\r\n                    \r\n                    allResponses.push({\r\n                        pergunta: pergunta.texto,\r\n                        respostas: respostas.length > 0 ? respostas : ['...']\r\n                    });\r\n                } else {\r\n                    allResponses.push({\r\n                        pergunta: pergunta.texto,\r\n                        respostas: ['...']\r\n                    });\r\n                }\r\n            }\r\n            \r\n            if (allResponses.length === 0) {\r\n                throw new Error('Nenhuma resposta v\u00e1lida encontrada');\r\n            }\r\n            \r\n            createPhrasesStructure();\r\n            updateAllPhrases();\r\n            setInterval(updateAllPhrases, CONFIG.intervalo);\r\n            \r\n        } catch (error) {\r\n            console.error('Erro ao buscar dados:', error);\r\n            phrasesContainer.innerHTML = `<div class=\"gentileza-error\">Erro: ${error.message}<\/div>`;\r\n        }\r\n    }\r\n    \r\n    function createPhrasesStructure() {\r\n        phrasesContainer.innerHTML = '';\r\n        \r\n        allResponses.forEach((item, index) => {\r\n            const phraseDiv = document.createElement('div');\r\n            phraseDiv.className = 'gentileza-phrase-item';\r\n            phraseDiv.innerHTML = `\r\n                <span class=\"gentileza-static-text\">${item.pergunta}<\/span>\r\n                <span class=\"gentileza-dynamic-text\" id=\"gentileza-dynamic-${index}\">...<\/span>\r\n            `;\r\n            phrasesContainer.appendChild(phraseDiv);\r\n        });\r\n    }\r\n    \r\n    function updateAllPhrases() {\r\n        allResponses.forEach((item, index) => {\r\n            const dynamicElement = document.getElementById(`gentileza-dynamic-${index}`);\r\n            \r\n            if (dynamicElement && item.respostas.length > 0) {\r\n                const responseIndex = currentResponseIndex % item.respostas.length;\r\n                const currentResponse = item.respostas[responseIndex];\r\n                \r\n                dynamicElement.classList.remove('fade-in');\r\n                void dynamicElement.offsetWidth;\r\n                dynamicElement.textContent = currentResponse;\r\n                dynamicElement.classList.add('fade-in');\r\n            }\r\n        });\r\n        \r\n        const totalResponses = Math.min(...allResponses.map(item => item.respostas.length));\r\n        counterElement.textContent = `Conjunto ${(currentResponseIndex % totalResponses) + 1} de ${totalResponses}`;\r\n        \r\n        currentResponseIndex++;\r\n    }\r\n    \r\n    fetchSheetData();\r\n})();\r\n<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f51eb17 elementor-widget elementor-widget-spacer\" data-id=\"f51eb17\" data-element_type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/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\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Manifesto O MANIFESTO PELA GENTILEZA nasce da urg\u00eancia de promovermos o respeito, a educa\u00e7\u00e3o e a empatia nas rela\u00e7\u00f5es humanas, como resposta \u00e0 crescente viol\u00eancia verbal e \u00e0 necessidade de cultivarmos uma sociedade mais humana e solid\u00e1ria. Como universidade e como lugar de debate, investiga\u00e7\u00e3o e transforma\u00e7\u00e3o cultural, temos a oportunidade \u2013 e a responsabilidade&#8230; <\/p>\n<div class=\"clear\"><\/div>\n<p><a href=\"https:\/\/culturas.cc\/congresso2025\/manifesto\/\" class=\"gdlr-info-font excerpt-read-more\">Read More<\/a><\/p>\n","protected":false},"author":669,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"class_list":["post-21483","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/culturas.cc\/congresso2025\/wp-json\/wp\/v2\/pages\/21483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/culturas.cc\/congresso2025\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/culturas.cc\/congresso2025\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/culturas.cc\/congresso2025\/wp-json\/wp\/v2\/users\/669"}],"replies":[{"embeddable":true,"href":"https:\/\/culturas.cc\/congresso2025\/wp-json\/wp\/v2\/comments?post=21483"}],"version-history":[{"count":11,"href":"https:\/\/culturas.cc\/congresso2025\/wp-json\/wp\/v2\/pages\/21483\/revisions"}],"predecessor-version":[{"id":22946,"href":"https:\/\/culturas.cc\/congresso2025\/wp-json\/wp\/v2\/pages\/21483\/revisions\/22946"}],"wp:attachment":[{"href":"https:\/\/culturas.cc\/congresso2025\/wp-json\/wp\/v2\/media?parent=21483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}