;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Maria Carolina Trevisan

OPINIÃO

Texto em que o autor apresenta e defende suas ideias e opiniões, a partir da interpretação de fatos e dados.

Carta aos meus leitores

Pomba pousa sobre faixa durante ato em favor da anistia a exilados e presos políticos, na praça da Sé, em São Paulo, em 21 de agosto de 1979 - Jorge Araújo/Folhapress
Pomba pousa sobre faixa durante ato em favor da anistia a exilados e presos políticos, na praça da Sé, em São Paulo, em 21 de agosto de 1979 Imagem: Jorge Araújo/Folhapress

Colunista do UOL

04/05/2022 13h41

Caros leitores,

Esta coluna foi minha casa durante quase cinco anos. Nesse período, tratei de política com a lupa dos direitos humanos, o foco principal do meu caminho profissional e acadêmico. Escrevi sobre violência policial, violência contra a mulher, sequelas da ditadura, ameaças à democracia, fome, desigualdade social, pandemia de covid-19, racismo e política.

Aqui, fiz também análises do cenário político, sempre com base nas pesquisas de opinião, em entrevistas com boas fontes, na escuta de pessoas comuns, na observação atenta, em estudos que aprofundassem os temas abordados. Procurei que todas as denúncias de violações de direitos humanos publicadas aqui tivessem um olhar delicado, com respeito, escrita firme e precisa.

Nesse tempo, fui acompanhada por vocês, meus leitores. Alguns foram críticos, outros discutiram as pautas comigo. Nunca me senti sozinha nessa estrada. Por isso, agradeço a atenção e a leitura.

Sou muito grata aos meus leitores, aos meus colegas, às minhas fontes e às pessoas com quem conversei para conseguir escrever as colunas. O jornalismo bem feito é um dos pilares que sustenta a democracia. Nosso papel, como repórteres e também como colunistas, é endereçar temas que a sociedade precisa tratar, cobrar os que estão no poder, fiscalizar políticas públicas, denunciar violações e apontar saídas.

Fiz esse trabalho com dedicação. Por isso, guardo essa trajetória em um lugar especial das veredas da vida.

O país vive hoje um momento delicado. Seguirei contribuindo por um país mais justo para todos, menos desigual, menos racista.

Escolhi o dia 2 de outubro de 2017 como a data de nascimento da minha coluna. Foi também nesse dia que ocorreu a mais grave violação de direitos humanos contra pessoas sob custódia do Estado no Brasil, o Massacre do Carandiru. Quase 30 anos depois, não houve responsabilização e há pouca reparação às famílias.

É por respeito a vocês, leitores, que escrevo esta última coluna. E me despeço deste espaço.

Muito obrigada por me acompanharem. Continuaremos juntos.

Um grande abraço.

Maria Carolina Trevisan