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

Fabi Gomes

OPINIÃO

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

Cabelo dos sonhos: uma eterna busca pela perfeição -e, sim- por aprovação

Cabelo dos sonhos - CoffeeAndMilk/Getty Images
Cabelo dos sonhos Imagem: CoffeeAndMilk/Getty Images

Colunista de Universa

11/10/2022 04h00

Já viram o novo equipamento para deixar seus cabelos bem perfeitões? Imagina um aparelho que é um secador de cabelos, uma chapinha e um babyliss, tudo num lance só?

É tipo um transformer da beleza, tá ligada? Um monstrengo de alta potência. Você move de um lado para outro e a coisa vira chapinha, move de outro, encaixa tipo um legão do futuro e ele se transforma num babyliss. Diz que o aparelho tem alta performance e promete fazer tudo em tempo recorde.

Se ligou que eu usei a expressão perfeitões ali no início? Pois é, o supra sumo em lançamento de tendências atuais, o TikTok, tem sido tomado de assalto por vídeos com cabelos fofões (o tal fluffy blowout), um híbrido entre volume, disciplina, movimento e glamour. Basicamente o estilo que remete às supermodels dos anos 1990, que logo remetem ao estilo Locomotivas, Panteras, etc? Estamos, novamente, no campo das supermulheres.

Volto com a lupa pra perfeição: você só alcança esse tipo de explosão visual quando empenha produtos, utensílios, mão de obra e tempo na construção dele. Se ainda não me fiz clara, não lembro de ter visto pessoas humanas que andam por aí possuírem essa tal estética, naturalmente. Em 99% das vezes, para, insisto, construir esse estilo, você precisa dar um talento, gastar tempo e grana.

E aí, algum problema com isso? Uhum, problema nenhum. Só acho bom que a gente sempre olhe com cuidado pros lugares e estéticas com as quais estamos "nos divertindo" e buscando "satisfação" (ou seria melhor falar aprovação?).

Bem, análises à parte, o lançamento é de fato revolucionário em se tratando de produtos multifunção, sem mencionar a economia de espaço —ao invés de três trambolhos, você só precisa de um para fazer o cabelo dos sonhos. Para quem pode, é sempre bom ter uma engenhoca dessas à mão. Tanto para quando estamos a fim de pirar o cabeção em diferentes estilos, quanto para aqueles momentos de, mais uma vez, resolvermos deitar pra perfeição, disciplina e algum desperdício de tempo. O transformer atende pelo nome de Shark FlexStyle System ainda não está disponível em terras tropicais. Mas você pode encomendá-lo por 250 doletas (mais impostos e tals). Pensando no custo benefício, nem tá tão caro, se compararmos com um pote de manteiga que tá pra base de 40 conto em qualquer mercadinho.

Vem conversar comigo? Me escreve no @fabi.gomes