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

Cardi B desabafa sobre cabelos e mostra diversas versões dos próprios fios

Cardi B fez desabafo sobre cabelos - Reprodução/Instagram
Cardi B fez desabafo sobre cabelos Imagem: Reprodução/Instagram

De Splash, em São Paulo

13/11/2021 23h22

Cardi B, 29 anos, publicou um longo desabafo em seu Instagram na noite de hoje. No texto, ela fala sobre a maneira como enxerga o seu cabelo e como tem lidado com os comentários das pessoas sobre as suas madeixas.

De acordo com a publicação, alguns seguidores questionam a textura do cabelo da rapper, que publicou um vídeo com o seu visual natural. Segundo ela, os comentários giram em torno do fato de ela ser birracial e, por isso, não ter manter um padrão quanto ao cabelo.

"Por que toda vez que posto meu cabelo natural eu ouço: 'você é birracial, você deveria ter cabelo comprido'?", escreveu. "Além de isso não ser verdade, é bastante enganador. Venho postando fotos da minha jornada capilar há anos e ser birracial não significa que seu cabelo seja sempre longo e encaracolado", continuou.

Cardi B contou que desde muito nova ela tenta lidar com o cabelo. Para ela, a internet abriu diferentes possibilidades e a ajudou a entender o melhor processo para cuidar do visual.

"Desde criança tenho problemas com a maneira como lido com meu cabelo e, há alguns anos, descobri diferentes métodos que funcionam para mim, e olhe para o comprimento dele agora", relatou. "Eles tentarão nos fazer acreditar que nosso cabelo não vai crescer tanto, mas não é verdade."

Muitos produtos que usávamos naquela época não eram bons para o nosso cabelo, mas era tudo o que tínhamos para escolher, e também não tínhamos dinheiro para ir ao salão regularmente, se é que o fazíamos. Agora todos temos melhores opções, bons produtos íveis e aprendendo no YouTube e TikTok sobre como cuidar melhor de nossos cabelo.

Ao final do texto, a cantora encorajou outras mulheres a aceitarem e amares suas madeixas, assim como ela. "Quero que as mulheres não-brancas, com padrões de cachos mais enrolados, saibam que não existe um 'cabelo ruim'. Não existe cabelo ruim, e cabelo 'bom' não significa uma textura específica. Todo cabelo é bom!"

O texto acompanhou diversas fotos e um vídeo que mostram diferentes cabelos que Cardi B teve ao longo dos anos.

Recentemente, ela deu luz o seu segundo filho e ganhou uma mansão de US$1,5 milhões, cerca de R$ 8 milhões, em Las Terrenas, na República Dominicana.