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

Marina Santa Helena

Emily in Paris: o sucesso de uma série cor de rosa com roupas caras demais

Cena de Emily  in Paris - Reprodução/Instagram
Cena de Emily in Paris Imagem: Reprodução/Instagram

Colunista do UOL

24/10/2020 13h39Atualizada em 24/10/2020 13h39

Alguns dias atrás, amiga me mandou mensagem: você já viu "Emily in Paris"? Vai assistir agora! Você que trabalha com moda vai adorar! E eu, no auge do cansaço, dormindo 5 horas por noite pra tentar dar conta de todas as tarefas da vida, sorri, agradeci e, bem capricornianamente, resmunguei pra mim mesma: quem liga? Mais uma série cor de rosa, de menina felizinha com guarda-roupa caro demais pro bolso de qualquer pessoa comum.

Escrita pelo mesmo autor de "Sex And The City", uma das séries dos anos 90 que mais envelheceu mal e cujo motivo de popularidade permanece um mistério até hoje, a estreia de Emily in Paris ou batida pra mim. Acho que isso tem muito a ver com o falta de tempo, mas principalmente por ser uma dessas séries que já chegam com vários motivos para ser deixada de lado: história clichê da garota fadinha sonhadora com styling duvidoso, o clássico personagem cintilante que tá na história só pra resolver os problemas maiores e mais profundos dos homens ao seu redor.

Ironicamente, menos de semana depois, eis que tô aqui escrevendo esse texto logo após ter maratonado a série inteira, procurando desesperadamente no Google quando sai a segunda temporada, de que marca era aquele casaco florido que Emily usou e todos os looks da Camille. Pois é, aqui dominamos a arte de cuspir pra cima.

Mesmo com todos os problemas da série, com todas as críticas aos estereótipos ses (desculpa, ses, mas talvez vocês mereçam um pouquinho), ainda fiquei com vontade de ver mais. De ar por todos os plot twists previsíveis, de ver a millennial trabalhando pouco e sendo bem-sucedida, cruzando a cidade a pé no salto mais desconfortável, despertando paixões em todo homem que cruzar seu caminho.

Depois da TV, acabei zapeando o perfil da Emily no Instagram e deu até pra ver os posts das selfies que ela faz durante as gravações. E, assim como na série, o número de seguidores está decolando a cada episódio.

No que se refere à moda, o tal styling duvidoso é todo pensado para ser assim, com todos os lenços, estampas xadrez, boinas e lugares comuns do que imaginamos ser o vestuário dos parisienses. Patrícia Field, a stylist que também criou os figurinos de O Diabo Veste Prada, dá atenção a cada detalhes para retratar o que Emily é no final das contas: a menina básica do interior dos EUA que aspira ser fashionista ou a "ringarde", como eles falam na série.

Aliás a história da ringarde, ou seja, da pessoa cafona e fora de moda, também rende momentos interessantes na série, quando se cria uma rivalidade entre velho e novo, com o estilista clássico Pierre Cadault resistindo à adoção de uma linha street wear em sua marca.

Talvez se deva ao fato desse último ano ter sido tão difícil. Talvez porque a vida esteja precisando de mais leveza ultimamente. Ou quem sabe pelo conforto que dá consumir um tantinho de romance besta em Paris - regado a muito vinho e croissants - totalmente desconectado da realidade.

O negócio é que Emily in Paris é uma série fácil, ou como costumo falar aqui, série de fazer a unha. É algo para colocar na TV, maratonar como um guilty pleasure delicioso (principalmente nas partes em que aparece o chef Gabriel) e esquecer dos problemas.