Navidad 2026# El mejor regalo ya existe. Solo falta darle forma.

Convierte tus fotografías en álbumes, decoración y regalos personalizados.

 [Descubrir regalos](#produtos)

Ofertas de Navidad

## Encuentra la oferta que mejor encaja con tus regalos.

 ``

[](#)

A tiempo para Navidad

## Los mejores regalos llevan su tiempo.

Haz tu pedido antes de estas fechas para recibirlo a tiempo para Navidad.

Selección de Navidad

## Hay un regalo para cada historia.

Cómo funciona

## De tus fotos al árbol de Navidad.

1. 01### Elige tu regalo

    Álbumes, fotografías, decoración o pequeños detalles personalizados.
2. 02### Personalízalo online

    Elige el diseño, sube tus fotografías y ajusta cada detalle a tu gusto.
3. 03### Recíbelo en casa

    Fabricamos en Portugal y enviamos tu pedido a casa en pocos días.

## ¿No sabes qué regalar? Empieza por las fotos.

[![](https://www.dreambooks.es/images/campanhas/2026/novembro/natal/album.jpg)### Un álbum para volver a abrir

Reúne tus fotos favoritas en un álbum creado por ti.

Crear álbum](https://www.dreambooks.es/albumes-de-fotos)[![](https://www.dreambooks.es/images/campanhas/2026/novembro/natal/decoracao.jpg)### Fotografías para decorar

Dales otro lugar a tus fotos con lienzos, cuadros y marcos.

Descubrir decoración](https://www.dreambooks.es/cuadros-decorativos)[![](https://www.dreambooks.es/images/campanhas/2026/novembro/natal/presentes.jpg)### Regalos con un toque personal

Tazas, puzles y pequeños detalles personalizados con tus fotos.

Ver regalos](https://www.dreambooks.es/regalos-originales)[![](https://www.dreambooks.es/images/campanhas/2026/novembro/natal/voucher.jpg)### Para crear más adelante

Regala un vale y deja que quien lo reciba elija las fotografías.

Descubrir vales](https://www.dreambooks.es/voucher-album-de-fotos)

## Condiciones de las campañas

### 2 de noviembre a 20 de diciembre: 30 % en toda la web y 40 % en pedidos de más de 60 €

Promoción válida del 2 de noviembre al 20 de diciembre de 2026. Utiliza el código REGALO30 en el checkout para conseguir un 30 % de descuento en toda la tienda. En compras superiores a 60 €, disfruta de un 40 % de descuento con el código REGALO40. No acumulable a otros descuentos. No aplicable a cámaras ni carretes fotográficos analógicos.

### 18 a 27 de diciembre: 50 % en vales

Promoción válida del 18 al 27 de diciembre de 2026. Consigue un 50 % de descuento en vales para álbumes de fotos utilizando el código GIFT50. Los vales regalo tienen una validez de 3 meses desde la fecha de compra. Promoción no acumulable a otros descuentos ni promociones vigentes.

### 28 a 31 de diciembre: 40 % en toda la web

Promoción válida del 28 al 31 de diciembre de 2026. Disfruta de un 40 % de descuento en productos seleccionados utilizando el código NEWYEAR40 al finalizar tu compra, sin importe mínimo. Promoción no acumulable a otras promociones, vales de descuento ni productos de la línea 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 plazo de pedido para Navidad: **${prazoTexto(i)}**. [Ver plazos](#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)\]}Último día para pedir

 ${status}Pedido hasta el ${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 ? `Precios con el código ${o.code}${o.minimo ? ', en 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}${SPC}%`; preco = `desde${fmt(p.p)}${fmt(p.p\*(1-pct/100))}${p.un||''}`; if (o.minimo) preco += `En compras superiores a ${o.minimo} €`; } else { preco = `desde${fmt(p.p)}${p.un||''}`; } if (p.progressivo) badge = 'Hasta −50 %'; if (p.p === null &amp;&amp; pct &gt; 0) badge = `−${pct}${SPC}%`; 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}Pedido hasta el ${dDia(d)} ${MES\_CURTO\[dMes(d)\]} para Navidad

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

### ${p.n}

${preco}

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

 `; }).join(''); } function renderSticky(){ const o = OFERTAS[ofertaAtiva]; const i = proximoPrazo(); $('sticky-info').innerHTML = o.sticky + (i &gt; -1 ? `Próximo plazo de Navidad: ${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 dic'], ['2026-12-14','14 dic'], ['2026-12-19','18 – 20 dic'], ['2026-12-21','21 dic'], ['2026-12-23','22 – 27 dic'], ['2026-12-29','28 – 31 dic'] ]; 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(); })();
