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

Sobremesa gelada de Ninho

Fácil

Ingredientes

Creme

  • 2 caixa(s) de leite condensado (790 gramas)
  • 10 colher(es) de sopa de leite em pó
  • 3 colher(es) de sopa de amido de milho
  • 200 grama(s) de creme de leite (1 caixa)
  • 1 colher(es) de sopa de manteiga
  • 500 mililitro (ml) de leite integral
  • 200 mililitro (ml) de creme tipo chantili

Ganache e montagem

  • 200 grama(s) de chocolate nobre meio amargo picado
  • 200 grama(s) de creme de leite (1 caixa)
  • Creme de avelã a gosto
  • Cacau em pó para finalizar

Modo de preparo

Creme

Em uma a com o fogo desligado, junte o leite condensado ao leite em pó e ao amido de milho. Depois, adicione o creme de leite, a manteiga e o leite.

Leve ao fogo médio/baixo e mexa sempre para não queimar. Cozinhe até que o creme engrossar e soltar bolhas mais densas.

Retire do fogo, despeje em um recipiente e cubra com plástico filme até esfriar totalmente.

Enquanto isso, bata o creme de leite em picos firmes. Com uma espátula e delicadeza, junte o chantili ao creme branco.

Ganache e montagem

Derreta o chocolate em banho-maria ou no micro-ondas em potência média-alta, conferindo de 30 em 30 segundos.

Adicione o creme de leite e misture até homogeneizar.

Para montagem, espalho um pouco de creme de avelã nas bordas da travessa de vidro. Coloque metade do creme branco e, em seguida, espalhe pequenas porções de creme de avelã espaçadamente. Dê uma leve mexida no creme para criar um efeito marmorizado.

Despeje o restante do creme deixando pelo menos 1 centímetro de espaço até a borda da travessa.

Repita o processo com o creme de avelã e leve para geladeira por no mínimo 1 hora.

Despeje todo o ganache por cima, deixe a camada uniforme e retorne para geladeira por mais 30 minutos.

Finalize polvilhando cacau em pó levemente com ajuda de uma peneira.
Eu Mereço | Gelado de Ninho - Salted Caramel - Salted Caramel
Imagem: Salted Caramel

Eu Mereço!

Em Nossa, plataforma de lifestyle do UOL, domingo será sinônimo de sobremesa. O tradicional dia da preguiça ganha o aconchego açucarado dessa nova série de receitas que encantam pela aparência e pelo paladar. Acompanhe todos os episódios no Canal UOL e no canal do YouTube de Nossa — inscreva-se!