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

Famosa youtuber maquiadora revela ser transexual após sofrer chantagem

Nikkie Tutorials, caracterizada como Princesa Elza de Frozen - Reprodução/Instagram
Nikkie Tutorials, caracterizada como Princesa Elza de Frozen Imagem: Reprodução/Instagram

Colaboração para o UOL, de São Paulo

13/01/2020 18h42

Os internautas ligados no YouTube tiveram uma surpresa na manhã de hoje: uma das Youtubers de maquiagem mais famosas do mundo, conhecida como Nikkie Tutoriais, assumiu ser transexual.

A holandesa possui um dos canais do tipo mais famosos da plataforma, com cerca de 12 milhões de seguidores e mais de um bilhão de visualizações. Ela já fez parcerias com nomes como Lady Gaga, Kim Kardashian e Jessie J.

O canal de Nikkie começou em 2008, mas viralizou em 2015 quando apareceu em um dos vídeos maquiando apenas metade do rosto para mostrar quanto uma boa maquiagem pode transformar o rosto de uma pessoa. O vídeo já tem 40 milhões de visualizações.

Em um vídeo recém publicado em seu canal, Nikkie relatou sua história de transição, contando que começou a usar roupas femininas aos 7 anos e que começou a tomar hormônios aos 14, finalizando aos 19, quando completou o tratamento.

Na gravação, ela diz que pensava em falar sobre sua situação, mas adiantou sua decisão por estar sendo chantageada por pessoas que ameaçaram revelar a história publicamente.

"Eu sempre quis contar essa parte da minha história, mas queria fazer isso da minha forma. Porém aparentemente vivemos em um mundo onde outras pessoas odeiam aqueles que são quem realmente são. Eu tenho sido chantageada por pessoas que queriam 'vazar' minha história para a imprensa", começou.

Em seguida, detalhou a situação: "Num primeiro momento foi aterrorizante saber que existem pessoas que não sabem respeitar a identidade das pessoas. É cruel e nojento. E eu sei que vocês estão assistindo. Eles disseram que queriam vazar porque eu estava mentindo, eu não conto a verdade ou que eu tinha medo que as pessoas soubessem quem eu sou", frisou.

"Eu não tenho medo. Então para essas pessoas que acharam que iam arruinar minha vida com isso, essa é pra vocês", disse.