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

Cantora surpreende com look de 30 mil cristais espalhados dos pés à cabeça

Doja Cat em desfila da grife Schiaparelli - Reprodução/Instagram
Doja Cat em desfila da grife Schiaparelli Imagem: Reprodução/Instagram

De Nossa

24/01/2023 14h41

Doja Cat viveu um momento fashionista nesta segunda (23) digno do impacto de Lady Gaga e seu vestido de carne do VMA de 2010.

A cantora acompanhou o desfile de Primavera/Verão 2023 de Alta-Costura da Schiaparelli no Petit Palais, em Paris, coberta da cabeça aos pés em tecidos e 30 mil cristais Swarovski.

As pedrarias podiam ser vistas até ao redor dos olhos da artista, que encarnou uma interpretação do "Inferno" de Dante Alighieri — tema também do desfile da grife sa — em look assinado pelo diretor criativo da casa, Daniel Roseberry.

Segundo a Vogue britânica, a proposta era transformá-la em uma espécie de escultura viva na primeira fila do evento, com um visual de "brilho difuso, cintilante e subversivo".

Doja Cat de Schiaparelli - Reprodução/Instagram - Reprodução/Instagram
Doja Cat de Schiaparelli
Imagem: Reprodução/Instagram

Doja trabalhou ao lado do stylist Brett Alan Nelson na produção, que era composta de um vestido em corset de seda com saia com aplicações de contas de madeira, botas de cano longo, echarpe e máxi brincos, todos em tom de vermelho vibrante como sangue.

Já o restante do corpo e do rosto da cantora recebeu 30 mil cristais, aplicados, um a um, pela célebre maquiadora Pat McGrath. Toda a maquiagem e finalização da beleza de Doja durou 4 horas e 58 minutos, segundo Pat, que agradeceu à pop star pela sua "sublime paciência" durante o processo.

O resultado foi descrito como "Disco Inferno", uma interpretação dos níveis do inferno da obra do italiano, mas com toques da moda das casas noturnas dos anos 70.

"Ficou uma obra-prima mágica e de fascinante e cintilante brilhantismo", descreveu a maquiadora.