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

SPFW para quem não vê: projeto leva cegos para "ouvir" os desfiles de moda

Mellina Hernandes Reis e Daniela Elis Fonseca - Natalia Eiras/UOL
Mellina Hernandes Reis e Daniela Elis Fonseca Imagem: Natalia Eiras/UOL

Natália Eiras

De Universa

17/10/2019 04h00Atualizada em 17/10/2019 09h44

Na primeira fileira do desfile do Projeto Estufa, Dario Caldas, especialista em tendências de comportamento e moda, estava, nesta quarta-feira (16), com um microfone na mão e um caderno aberto. Ele estava descrevendo os looks que avam para seis pessoas com deficiência visual que foram "escutar" o desfile das marcas Victor Hugo e MiPinta. "Estou ouvindo um barulho, o que é?", falou umas delas, pedindo para que Dario descrevesse uma composição cheia de miçangas bordadas.

Esta foi a primeira vez que um desfile da São Paulo Fashion Week, evento que acontece até sexta-feira (18), teve audiodescrição. A iniciativa é da Secretaria Municipal da Pessoa com Deficiência da Prefeitura de São Paulo, foi colocada em prática em desfiles do Projeto Estufa, parte da programação da semana de moda, e tem descrição de especialistas como Lilian Pacce, Érika Palomino e Dario Caldas.

A criadora de conteúdo Mellina Hernandes Reis, 36, e a estudante Daniela Elis Fonseca, 40, foram duas das pessoas com deficiência visual que acompanharam os desfiles desta quarta-feira. Acompanhadas de seus cães-guias, elas ouviram a descrição de visuais que incluíam blusas de tela, brincos de strass e roupas feitas com sacolas de feira.

"Já tinha vindo prestigiar um desfile, mas essa é a primeira vez que consigo ter uma noção exata do que está acontecendo na arela", fala Mellina, que tem visão parcial. A iniciativa da Secretaria Municipal da Pessoa com Deficiência já existia no Carnaval, com o projeto "Samba na Mão", e na Virada Cultural. Apesar de muita gente achar que moda tem a ver com estética, a dupla entende que vestir-se bem é, também, uma experiência sensorial. "No dia a dia, tenho a ajuda de vendedores e pessoas próximas para conseguir fazer uma combinação. Peço para o atendente me descrever como é a estampa e como são as cores", afirma Daniela. "E, quando coloca a roupa no corpo, percebo, pelo caimento no corpo se ela ficou boa ou não. Não é porque eu não vejo que eu não tenho cores favoritas e posso ter um estilo predileto", complementa.

Dario descreve desfile para deficientes visuais - Natalia Eiras/UOL - Natalia Eiras/UOL
Imagem: Natalia Eiras/UOL

Dario Caldas, que já foi professor em faculdades de moda, nunca havia feito uma audiodescrição. Para fazer um bom trabalho na SPFW, ele foi estudar um pouco os outros desfiles das marcas que descreveu, além de ter ado um bom tempo no backstage anotando detalhes das peças que estariam na arela.

"Queria entender quais eram os materiais e textura. Por que não adianta eu adjetivar as pessoas. Precisava descrever fielmente o que eu estava vendo para que elas pudessem concretizar mentalmente o que estava acontecendo", diz ele para Universa. "Foi desafiador, mas importante."

Daniela e Mellina concordam com Dario e esperam que mais eventos tenham iniciativas semelhantes. Os desfiles do Projeto Estufa desta quinta-feira (17) também terão audiodescrição. "Nós queremos estar em todos os espaços", diz a criadora de conteúdo. "No fim das contas, nós também somos consumidoras de moda", pontua Daniela.