;(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

Modelo Ludmila Cassemiro ouve que seu cabelo 'assusta' e denuncia racismo

Ludmila Cassemiro sofreu racismo por causa de seu cabelo - Reprodução/Instagram
Ludmila Cassemiro sofreu racismo por causa de seu cabelo Imagem: Reprodução/Instagram

De Splash, em São Paulo

12/10/2021 15h59

Ludmila Cassemiro expôs em suas redes sociais uma ofensa racista que recebeu enquanto caminhava pelo bairro Cachoeirinha, em Belo Horizonte. A modelo e atriz ouviu de um homem desconhecido, que se dizia fotógrafo, que seu cabelo incomodava e assustava as pessoas.

"Eu acabei de vivenciar uma situação racista. Eu estava indo para a academia, ando ali no bairro Cachoeirinha, e um cara me parou e falou para mim que o meu cabelo incomodava, que fazia tempo que ele queria me falar isso. Que o meu cabelo assustava as pessoas. E que ele como fotógrafo tinha autoridade para falar sobre o meu cabelo e a forma que eu o uso", contou Ludmilla,

Ela postou o vídeo do diálogo em seguida:

Homem: A base dele [do cabelo] e a ponta é a mesma.

Ludmila: Então o meu cabelo assusta?

Homem: Assusta.

Ludmila: Entendi

Homem: Eu sempre quis falar isso pra você.

Ludmila: A sua língua também [assusta].

Homem: Exatamente. Mas eu sou fotógrafo, posso falar.

Ludmila: E eu sou modelo.

Homem: Se for contar o número de pessoas que você assusta...

Ludmila: Você é racista.

Homem: Não é racista, não.

Ludmila: Ah, não? Eu não quero te ouvir. Guarda o seu racismo pra você.

A modelo continuou o vídeo contando que essa é uma situação recorrente e que o caso que ela expôs não foi isolado. "O nosso cabelo é lido como palpável de críticas. As pessoas se sentem no direito de marginalizar os nossos elementos."

Em seguida, Ludmila —que também é ativista e comunicadora— explica que o cabelo dela e de outras pessoas pretas não é apenas um elemento estético, e sim um elemento político. "Faz parte do nosso corpo enquanto uma existência política. É um símbolo de resistência da nossa cultura."

Ela ainda disse que esses constantes ataques afetam a saúde mental e o conforto de apenas existir e caminhar em paz. Ludmila disse que já perdeu chances no mercado de trabalho, outras em que foi demitida, entre outros problemas que enfrentou por causa de sua imagem.

"Isso pode acontecer todos os dias. Mas eu não vou desistir de ter voz e não vou abrir mão do meu lugar de fala. Eu não vou desistir de lutar pelo meu povo e exercer o meu trabalho social. Eu levo e continuo levando a ideia de enquanto ferirem a minha existência eu vou resistir. Por mais que doa."