Natal 2026# O melhor presente já existe. Só falta dar-lhe forma.

Transforma as tuas fotografias em álbuns, decoração e presentes personalizados.

 [Descobrir presentes](#produtos)

Promoções de Natal

## Encontra a oferta certa para os teus presentes.

 ``

[](#)

A tempo do Natal

## Os melhores presentes levam o seu tempo.

Consulta os prazos de encomenda para os receberes a tempo do Natal.

Seleção de Natal

## Há um presente para cada história.

Como funciona

## Das tuas fotografias à árvore de Natal.

1. 01### Escolhe o teu presente

    Álbuns, fotografias, decoração ou pequenos objetos personalizados.
2. 02### Personaliza online

    Escolhe o design, carrega as tuas fotografias e ajusta os detalhes ao teu gosto.
3. 03### Recebe em casa

    Produzimos em Portugal e entregamos em tua casa em poucos dias.

## Não sabes o que oferecer? Começa pelas fotografias.

[![](https://billing.dreambooks.es/images/campanhas/2026/novembro/natal/album.jpg)### Um álbum para folhear

Reúne as tuas fotografias favoritas num álbum feito por ti.

Criar álbum](https://billing.dreambooks.es/albuns-de-fotos)[![](https://billing.dreambooks.es/images/campanhas/2026/novembro/natal/decoracao.jpg)### Fotografias para decorar

Dá um lugar especial às tuas fotografias com telas, quadros e molduras.

Descobrir decoração](https://billing.dreambooks.es/quadros-decorativos)[![](https://billing.dreambooks.es/images/campanhas/2026/novembro/natal/presentes.jpg)### Presentes com um toque pessoal

Canecas, puzzles e outros presentes com um toque pessoal.

Ver presentes](https://billing.dreambooks.es/presentes-personalizados)[![](https://billing.dreambooks.es/images/campanhas/2026/novembro/natal/voucher.jpg)### Para criar mais tarde

Compra um voucher e escolhe as fotografias quando quiseres.

Descobrir vouchers](https://billing.dreambooks.es/voucher-album-de-fotos)

## Condições das campanhas

### 02 de Nov a 20 de Dez - 20% em todo o site e 30% acima de 50€

Campanha válida de 02 de novembro a 20 de dezembro. Usa o código GIFT20 no checkout para teres 20% de desconto em toda a loja. Em compras superiores a 50€, o desconto de 30% é aplicado com o código GIFT30. Não acumulável com outros descontos. Não é aplicável a máquinas e rolos fotográficos analógicos.

### 18 a 27 de Dez - 40% em Vouchers

Campanha válida de 18 a 27 de dezembro de 2026. 40% de desconto em vouchers de álbuns de fotos com o código GIFT40. Os vouchers são válidos até 3 meses após a compra. Promoção não acumulável com outros descontos ou campanhas em vigor.

### 28 a 31 de Dez: 30% em todo o site

Campanha válida de dia 28 a 31 de dezembro de 2026. Desconto de 30% com código NEWYEAR30, sem valor mínimo de compra, em todos os produtos selecionados. Não acumulável com outras promoções, vales de desconto ou produtos da linha analógica.

`); const i = proximoPrazo(); if (i &gt; -1) slides.push(`Encomenda até ${prazoTexto(i)} para receber no Natal [Ver prazos](#prazos)

`); const track = $('promo-track'); track.innerHTML = slides.join(''); track.classList.toggle('rotating', slides.length &gt; 1); } function renderHeroDeadline(){ const i = proximoPrazo(); const el = $('hero-deadline'); el.hidden = i -1) $('hero-deadline-txt').innerHTML = `Próximo prazo de encomenda para o Natal: **${prazoTexto(i)}**. [Ver prazos](#prazos)`; } function renderSwitcher(){ const sw = $('offer-switch'); sw.innerHTML = ''; sw.hidden = cfg.ofertas.length { const b = document.createElement('button'); b.type = 'button'; b.setAttribute('role','tab'); b.id = 'tab-' + k; b.setAttribute('aria-controls','offer-panel'); b.textContent = OFERTAS[k].tab; b.addEventListener('click', () =&gt; setOferta(k)); b.addEventListener('keydown', e =&gt; { if (e.key !== 'ArrowRight' &amp;&amp; e.key !== 'ArrowLeft') return; const n = cfg.ofertas.length, j = (idx + (e.key === 'ArrowRight' ? 1 : n - 1)) % n; setOferta(cfg.ofertas[j]); $('tab-' + cfg.ofertas[j]).focus(); }); sw.appendChild(b); }); } function setOferta(k){ ofertaAtiva = k; const o = OFERTAS[k]; $('o-title').textContent = o.titulo; $('o-text').textContent = o.texto; $('o-code').textContent = o.code; $('o-cond').textContent = o.cond; document.querySelectorAll('[data-copy]').forEach(b =&gt; b.setAttribute('aria-label','Copiar código ' + o.code)); const cta = $('o-cta'); cta.hidden = !o.cta; if (o.cta){ const a = cta.querySelector('a'); a.textContent = o.cta.t; a.href = flat(o.cta.href); } document.querySelectorAll('#offer-switch [role=tab]').forEach(b =&gt; { const on = b.id === 'tab-' + k; b.setAttribute('aria-selected', on); b.tabIndex = on ? 0 : -1; }); if (cfg.ofertas.length &gt; 1) $('offer-panel').setAttribute('aria-labelledby','tab-' + k); else $('offer-panel').removeAttribute('aria-labelledby'); renderSticky(); renderGrid(); } function renderTickets(){ const sec = $('prazos'); if (!sec) return; const prox = proximoPrazo(); sec.hidden = prox ${prazoTexto(prox)}.`; $('tickets').innerHTML = PRAZOS.map((p,i) => { const fechado = diasEntre(HOJE, p.data) ${dDia(p.data)}${MES\_CURTO\[dMes(p.data)\]}${diaSemana(p.data)}

 ${status}Encomenda até ${prazoTexto(i)}: ${p.o}

 <a :="" aria-hidden="true" class="btn-ghost" data-u="${flat(p.cta.href)}" tabindex="-1">${p.cta.t}</a>

 `; }).join(''); } function renderTabs(){ const t = $('tabs'); t.innerHTML = ''; CATS.forEach((c,idx) =&gt; { const b = document.createElement('button'); b.type = 'button'; b.className = 'tab'; b.id = 'cat-' + c.id; b.setAttribute('role','tab'); b.setAttribute('aria-controls','grid'); b.setAttribute('aria-selected', c.id === catAtiva); b.tabIndex = c.id === catAtiva ? 0 : -1; b.textContent = c.label; b.addEventListener('click', () =&gt; { catAtiva = c.id; renderTabs(); renderGrid(); }); b.addEventListener('keydown', e =&gt; { if (e.key !== 'ArrowRight' &amp;&amp; e.key !== 'ArrowLeft') return; const n = CATS.length, j = (idx + (e.key === 'ArrowRight' ? 1 : n - 1)) % n; catAtiva = CATS[j].id; renderTabs(); renderGrid(); $('cat-' + catAtiva).focus(); }); t.appendChild(b); }); $('grid').setAttribute('aria-labelledby','cat-' + catAtiva); } function renderGrid(){ const o = OFERTAS[ofertaAtiva]; const meta = $('grid-meta'); meta.textContent = o.pct &gt; 0 ? `Preços com o código ${o.code}${o.minimo ? ', em compras superiores a ' + o.minimo + '€' : ''}.` : ''; meta.hidden = !meta.textContent; $('grid').innerHTML = PRODUTOS[catAtiva].map((p,i) =&gt; { const pct = (p.analog || p.progressivo) ? 0 : o.pct; let badge = '', preco; if (p.p === null){ preco = ''; } else if (pct &gt; 0){ badge = `−${pct}%`; preco = `desde${fmt(p.p)}${fmt(p.p\*(1-pct/100))}${p.un||''}`; if (o.minimo) preco += `Acima de ${o.minimo}€ em compras`; } else { preco = `desde${fmt(p.p)}${p.un||''}`; } if (p.progressivo) badge = 'Até −50%'; if (p.p === null &amp;&amp; pct &gt; 0) badge = `−${pct}%`; let prazo = ''; if (p.prazo !== null &amp;&amp; p.prazo !== undefined &amp;&amp; diasEntre(HOJE, PRAZOS[p.prazo].data) &gt;= 0){ const d = PRAZOS[p.prazo].data; prazo = `${SVG\_CAL}Encomenda até ${dDia(d)} ${MES\_CURTO\[dMes(d)\]} para o Natal

`; } return `${p.i ? `![]()` : ''}${badge}

### ${p.n}

${preco}

 ${prazo} <a class="btn-nav" data-u="${flat(p.u || CATURL[catAtiva])}">Ver produto</a>

 `; }).join(''); } function renderSticky(){ const o = OFERTAS[ofertaAtiva]; const i = proximoPrazo(); $('sticky-info').innerHTML = o.sticky + (i &gt; -1 ? `Próximo prazo de Natal: ${prazoTexto(i)}` : ''); } function renderCondicoes(){ document.querySelectorAll('.cond-item').forEach(el => { const on = cfg.cond.includes(el.dataset.cond); el.classList.toggle('current', on); el.hidden = !on; }); } function aplicarData(){ cfg = pickCfg(); renderHeroDeadline(); renderSwitcher(); renderTickets(); renderTabs(); renderCondicoes(); setOferta(cfg.ofertas[0]); document.querySelectorAll('.proto [data-sim]').forEach(b => b.setAttribute('aria-pressed', b.dataset.sim === HOJE)); } /* ========================================================== 5. INTERAÇÕES ========================================================== */ document.addEventListener('click', async e => { const b = e.target.closest('[data-copy]'); if (!b) return; const code = OFERTAS[ofertaAtiva].code; try { await navigator.clipboard.writeText(code); } catch(err) { const t = document.createElement('textarea'); t.value = code; document.body.appendChild(t); t.select(); try { document.execCommand('copy'); } catch(_){} t.remove(); } document.querySelectorAll('[data-copy]').forEach(x => { x.textContent = 'Código copiado'; x.classList.add('copied'); }); clearTimeout(window.__cp); window.__cp = setTimeout(() => document.querySelectorAll('[data-copy]').forEach(x => { x.textContent = 'Copiar código'; x.classList.remove('copied'); }), 2200); }); /* Sticky: visível depois do hero, escondido enquanto o switcher está no ecrã */ const sticky = $('sticky'), hero = document.querySelector('.nt-lp .hero'), promos = $('promocoes'); function onScroll(){ const past = hero.getBoundingClientRect().bottom 0; const on = past && !inPromos; sticky.classList.toggle('show', on); sticky.setAttribute('aria-hidden', !on); sticky.querySelector('button').tabIndex = on ? 0 : -1; } addEventListener('scroll', onScroll, { passive:true }); /* Simulador de datas (protótipo/QA) */ const SIMS = [ ['2026-11-15','2 nov – 15 dez'], ['2026-12-17','17 dez'], ['2026-12-19','18 – 20 dez'], ['2026-12-21','21 dez'], ['2026-12-23','22 – 27 dez'], ['2026-12-29','28 – 31 dez'] ]; const proto = $('proto') || document.createElement('div'); /* só existe para Super Users */ SIMS.forEach(([d,l]) => { const b = document.createElement('button'); b.type = 'button'; b.dataset.sim = d; b.textContent = l; b.addEventListener('click', () => { HOJE = d; aplicarData(); proto.classList.add('collapsed'); }); proto.appendChild(b); }); if ($('proto-toggle')) $('proto-toggle').addEventListener('click', () => proto.classList.toggle('collapsed')); aplicarData(); })();
