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

Doces natalinos: 15 receitas para abalar na ceia, do brownie 'Noel' ao pavê

Morango vira chapéu de Papai Noel em sobremesa especial para a data - Getty Images/iStockphoto
Morango vira chapéu de Papai Noel em sobremesa especial para a data Imagem: Getty Images/iStockphoto

De Nossa

18/12/2021 04h00

Sobremesas perfeitas para o Natal são aquelas para comer em família. Elas podem ter um ar sofisticado, como uma bela torta de figo ou seguir a tradição, caso da rabanada.

Os doces também servem para fazer a alegria da criançada — quem resiste a um brownie, um brigadeiro ou um bombom de travessa?

Selecionamos 15 guloseimas pensadas especialmente para a data e que são capazes de agradar muita gente. Confira todas as opções abaixo e, para ver a receita completa, clique sobre a imagem que desejar:

Brigadeiro de Natal

Dificuldade Fácil
45 porções
90 min
Ver receita completa

Torta de figo

Dificuldade Fácil
8 porções
170 min
Ver receita completa

Bolo de mel, capim-limão e abacaxi

Dificuldade Fácil
Ver receita completa

Brownie natalino

Dificuldade Fácil
15 porções
45 min
Ver receita completa

Bolo de nozes

Dificuldade Médio
Ver receita completa

Rosca natalina

Dificuldade Fácil
10 porções
210 min
Ver receita completa

Rocambole de morango

Dificuldade Médio
10 porções
45 min
Ver receita completa

Panna cotta festiva

Dificuldade Médio
8 porções
50 min
Ver receita completa

Pudim de panetone

Dificuldade Fácil
10 porções
240 min
Ver receita completa

Rabanada com chocolate

Dificuldade Fácil
20 porções
30 min
Ver receita completa

Minibolo de Reis

20 porções
45 min
Ver receita completa

Rabanada com doce de ovos

Dificuldade Fácil
10 porções
60 min
Ver receita completa

Pavê de abacaxi com coco

Dificuldade Fácil
12 porções
55 min
Ver receita completa

Bombom de morango na travessa

Dificuldade Médio
12 porções
55 min
Ver receita completa

Brigatone (brigadeiro recheado com panetone)

40 porções
55 min
Ver receita completa