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

A Pepeca tá ON

Série de Universa promove viagem de autoconhecimento pela sexualidade feminina com participação de Maria Bopp

Oi! Você já cumprimentou a sua pepeca hoje? A pergunta pode soar esquisita, mas esse estranhamento também revela a falta de intimidade que muitas mulheres têm com o próprio corpo. E que acabam afetando a autoimagem e a autoestima de muitas delas.

Para naturalizar essa conversa, Universa lançou uma série de vídeos de animação sobre sexualidade feminina que tem como protagonistas Rita, uma mulher como você, e a pepeca —ela mesma! Juntas, elas exploram o corpo feminino, o ciclo menstrual, os anticoncepcionais e o orgasmo —quatro temas fundamentais para Universa— de um jeito leve e divertido, como a relação com o seu corpo também pode (e deve) ser. Que o diga a atriz e "blogueirinha" Maria Bopp, convidada a emprestar sua voz à pepeca.

A websérie "A Pepeca tá ON", publicada com uma série de conteúdos especiais, é um projeto em coprodução com a produtora paulistana Consulado e apoio da farmacêutica Bayer. Aperta o play e vem com a gente. O prazer é todo seu!

Episódio 1

O Mapa da Vulva: um tour pelo seu corpo

Uma transa ruim é o ponto de partida para a personagem Rita embarcar em um tour guiado pelo próprio corpo e descobrir que o autoconhecimento é a chave para ter prazer —sozinha ou acompanhada. É assim que tem início a websérie "A Pepeca tá ON". Essa aventura é conduzida pela vulva de Rita, dublada pela atriz Maria Bopp.

Episódio 2

Menstrualândia: a montanha-russa de emoções do seu ciclo menstrual

Depois de conhecer melhor seu próprio corpo, no segundo episódio de "A Pepeca On!", Rita se vê apreensiva esperando uma velha conhecida que estava demorando a chegar. Aliviada ao perceber que está menstruada, ela embarca em uma aventura divertida pela Menstrualândia, o ciclo menstrual de Rita, a fim de compreender o que sente e o que acontece com seu corpo em cada período do mês.

Episódio 3

Forever Contraceptivos: explorando as opções do mercado

No terceiro episódio da série, a personagem Rita a por um momento de tensão ao imaginar que pode estar grávida. Depois do resultado negativo, ela decide explorar uma loja de departamentos para conhecer as opções de métodos contraceptivos disponíveis no mercado. E, com a ajuda da pepeca, entende que, além de evitar uma gestação indesejada, também é fundamental se prevenir das infecções sexualmente transmissíveis (ISTs).

Episódio 4

De Repente, Orgasmo: seu corpo em festa

No quarto e último episódio da websérie, com a condução da pepeca, interpretada por Maria Bopp, Rita descobre como o próprio corpo se prepara para chegar ao orgasmo. Em clima de festa, uma central de controle muito animada dá comandos para as áreas erógenas e mostra como o organismo chega ao ápice dessa onda de prazer.

Topo