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

Essa roupa tem história: "Minha primeira peça de grife valeu cada centavo"

Giovana Romani comprou peça em bazar e a incorporou para diversas ocasiões especiais da sua vida - Arquivo Pessoal
Giovana Romani comprou peça em bazar e a incorporou para diversas ocasiões especiais da sua vida Imagem: Arquivo Pessoal

Maria Carolina Gimenez

Colaboração para Nossa

14/04/2020 04h00

Giovana Romani

Giovana Romani

Profissão

Redatora-chefe

Minha roupa com história

Casaqueto brilhante, meio dourado e prateado, com tecido similar ao jacquard

Minha roupa de estimação já foi comigo de festa infantil até show do Elton John, ando por várias — várias, mesmo — edições de São Paulo Fashion Week e balés em Nova York.

Trata-se de um casaqueto brilhante, meio dourado, meio prateado, de um tecido indefinido (acho que jacquard é o que mais se aproxima), comprado em um bazar da Diane von Furstenberg.

Foi uma das primeiras peças de grife que adquiri com meu salário, embora não tenha comprado muitas depois. Valeu cada centavo de tanto que usei —e ainda uso!

Romani - Arquivo Pessoal - Arquivo Pessoal
Imagem: Arquivo Pessoal
Resgatar ele na memória foi uma oportunidade de colocá-lo de novo nos meus looks, pois ei tanto tempo grávida no ano ado (e, portanto, longe do meu guarda-roupa original), que havia esquecido o quanto sou feliz com esse pedaço de tecido brilhante me abraçando.

E vale um clichê: um casaco brilhante estruturado deixa qualquer roupa básica arrumada no ato. Amanhã, para levar meu bebê na pediatra e depois jantar com amigas, usaria com mom jeans, camiseta branca e sandálias de salto grosso. Para um show, substituiria a calça por uma de couro, mais skinny, e tênis. Um balé? Pantacourt mais salto e dá-lhe o casaquinho.

Como usar

Pantacourt

Aliar o casaqueto com uma pantacourt pode ser um look versátil: com uma sandália ou tênis adequa super bem para uma ocasião mais casual, com um salto funciona para eventos mais formais.

Estampados

Procure por opções com estampas versáteis, dessa forma a peça pode se tornar um coringa para o look -- proporcionando mais modernidade aos visuais todos neutros, assim como no modelo tweed.