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

Sobrinha de Kamala Harris é CEO de marca de roupas feministas; conheça

Meena Harrys decidiu empreender quando viu o crescimento das vendas das peças que produzia - Reprodução / Instagram
Meena Harrys decidiu empreender quando viu o crescimento das vendas das peças que produzia Imagem: Reprodução / Instagram

De Universa

20/01/2021 12h17

As t-shirts feministas de Meena Haris, de 36 anos, sobrinha da vice-presidente dos Estados Unidos, Kamala Harris, fazem sucesso entre ativistas e famosas. Serena Williams, Lizzo e Viola Davis são alguns dos nomes que a sua marca, "Phenomenal", já vestiram.

Tudo começou como um hobby: Meena era diretora de estratégia e liderança da Uber e lançou algumas camisetas com dizeres feministas para reverter a renda para instituições de caridade. As vendas, no entanto, tomaram outras proporções quando o movimento Black Lives Matter ganhou força nos Estados Unidos, em 2020.

Em julho, Naomi Campbell vestiu uma camiseta com os dizeres "Phenomenally black" (que pode ser trazido como "fenomenalmente negra") em um evento de moda. Já em setembro, Regina King recebeu o Emmy de melhor atriz com uma t-shirt com a imagem de Breonna Taylor, mulher negra assassinada pela polícia americana, com a frase "Say her name" ("Digam o nome dela").

Com tamanha repercussão, Meena deixou o posto de executiva da Uber para se tornar CEO da sua própria marca — e, embora tenha estabelecido alguns limites para o envolvimento da "Phenomenal" na campanha da tia, Kamala Harris, e de Joe Biden para as eleições à presidência, também produziu algumas peças em apoio aos candidatos.

Entre as produções, estavam moletons com as iniciais "MVP", que significam "Mrs Vice President" ("Senhora vice-residente") e "I'm speaking" ("Eu estou falando"), em referência ao momento em que Kamala repreendeu o concorrente Mike Pence por interrompê-la durante um debate.

Em entrevista ao The New York Times, Meena explicou que sua marca de roupas e órios não tinha o intuito de promover a candidatura de uma integrante da família, porém, ressaltou que a sua relação com a vice-presidente eleita é um fato que não pode ser separado de sua história e, consequentemente, de seu negócio.