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

Pincel 'mágico' que deixa base uniforme está em promoção por menos de R$ 15

O pincel dos seus sonhos está com desconto - Divulgação
O pincel dos seus sonhos está com desconto Imagem: Divulgação

Victoria Theonila

Colaboração para Universa

02/03/2023 04h00Atualizada em 02/03/2023 10h55

Conhece o pincel reto de maquiagem facial? Um "upgrade" do tradicional pincel kabuki, essa nova versão em formato hexágonal, possui 200 mil cerdas sintéticas macias, firmes e mais curtas.

Logo, isso garante o máximo de conforto na hora de aplicar os produtos em todas as direções do rosto. E está em oferta por R$ 12,90 —uma redução de 50% em relação ao preço original de R$ 25,90.

Segundo a fabricante, esse pincel reto é ideal para maquiadores iniciantes e profissionais, que podem depositar e espalhar os produtos por todo o rosto em apenas dez segundos.

Por falar em produtos, a experiência com esse pincel é completa, uma vez que ele pode ser usado para aplicar (além da maquiagem) cosméticos líquidos, cremosos ou em pó.

Pincel reto de maquiagem facial com estojo portátil

Pincel reto de maquiagem facial com estojo portátil  - Divulgação - Divulgação
Pincel reto de maquiagem facial com estojo portátil
Imagem: Divulgação

Preço: R$ 12,90 (frete cobrado à parte)

Preço: R$ 21,90 (frete grátis para s Amazon)

  • Indicado para uma maquiagem rápida e natural
  • Fácil de segurar: Forma de diamante tridimensional para fácil manuseio
  • Não absorve o pó
  • Cerdas grossas: Macio ao toque para uma maquiagem mais natural

Avaliações dos consumidores

De acordo com as 6.959 avaliações dos consumidores da Amazon, o pincel reto de maquiagem facial tem uma nota de 4,6 de um total de 5. Confira o que alguns dos clientes disseram sobre o produto:

Gabriella Maciel: Aplico base com este pincel e, honestamente, fiquei perplexa com a suavidade e a textura que oferece. Parece mágica!!! Com apenas uma camada, a base fica de alta cobertura e super seca. Amei e comprei para minha mãe também.

Juliana: O pincel é ótimo! Espalha superbem a base/corretivo. Cerdas bem macias. Compraria novamente. Tamanho ótimo.

Flávia: Prático para ar a base, melhor que pincéis tradicionais. A capa ajuda a proteger e facilita o armazenamento.

Léia Gomes Santos: O melhor pincel que já usei. Até com o protetor solar ele é incrível. Me surpreendeu!

Danielle Rodrigues Lopes: Produto excelente e de qualidade. Detalhe na maciez das cerdas do pincel. Ele espalha tão bem a base que precisamos de pouca quantidade para um perfeito acabamento.

Daniele: Desliza bem. Cobertura completa e bem definida. Espalha quantidades pequenas e deixa a pele com aspecto mais natural.

Rodapé content commerce -  -