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

Coronavírus: designer cria viseiras para proteger clientes em restaurantes

Plex"Eat, viseiras de acrílico para restaurantes criadas pelo designer Christophe Gernigon - Divulgação
Plex'Eat, viseiras de acrílico para restaurantes criadas pelo designer Christophe Gernigon Imagem: Divulgação

De Nossa

14/05/2020 10h12

As companhias aéreas e restaurante estão reformulando suas dinâmicas para atender seus clientes com a pandemia do coronavírus. A mais nova ideia é uma viseira de proteção em estabelecimentos gastronômicos.

Assim como as redomas em poltronas de aviões e as estufas de vidro, o projeto do designer de interiores Christophe Gernigon projetou sinos de acrílico pendurados no teto, para que possam ser usados em cima das cadeiras nas mesas do restaurante.

Viseiras de Christophe Gernigon - Divulgação - Divulgação
Viseiras de acrílico prometem criar proteção para clientes em restaurantes
Imagem: Divulgação

"Eu estava preocupado com os restaurantes. Pensei então em um dispositivo que nos permitiria encontrar convívio em torno de uma mesa, mas sem correr riscos ", explicou ele à CNN.

A ideia partiu de uma poltrona descoberta em uma loja conceitual na Ásia, que era acompanhada por um sino, que permitia ouvir música de forma privada.

Viseiras de Christopher - Divulgação - Divulgação
Projeto ainda está em fases de teste, mas empresa já estaria cogitando utilizá-las
Imagem: Divulgação

Nomeado como "Plex'Eat", o projeto está em fase de testes para produção. Uma empresa teria entrado em contato com o designer para estudar um possível marketing para a criação.

Christophe Gernigon diz que, mesmo se realmente for lançado, ainda é cedo para ter uma estimativa do preço das viseiras.

Cone do silêncio?

Cone do Silêncio - Reprodução - Reprodução
Cena do seriado "Agente 86", em que os personagens usam o "cone do silêncio"
Imagem: Reprodução

As viseiras de acrílico se assemelham curiosamente ao "cone do silêncio", mostrado na série de televisão cômica dos Estados Unidos "Agente 86", transmitida nos anos 60.

O aparelho, projetado para conversas entre agentes secretos, tornava impossível ouvir a conversa entre os que estavam usando o dispositivo.

Na cultura popular norte-americana, o termo "cone de silêncio" é uma gíria que implica em manter segredo sobre as informações compartilhadas e que a conversa não deve ser reada posteriormente para quem não estava presente.