# v0.1.7

**Data de lançamento:** 8 de maio de 2026

## Novas Funcionalidades

### Armazenamento de Assets em S3

- Uma nova configuração opcional `ASSETS_STORAGE_MODE=s3` permite que as lojas enviem uploads para um bucket compatível com S3 e os sirvam a partir de um CDN, em vez do diretório local padrão `data/files/`
- Quando o modo S3 está ativo, cada imagem enviada é pré-gerada em larguras comuns (200/400/600/800/1200) como variantes WebP e armazenada junto do original, para que a loja possa servir imagens de tamanho correto sem conversão em tempo real
- Um novo limite opcional `ASSETS_MAX_BYTES` controla o armazenamento cumulativo de ficheiros (tanto em modo local como S3), para que um fluxo de uploads descontrolado não dispare a fatura do bucket — os limites por upload (5 MB imagem / 50 MB vídeo) permanecem inalterados
- Um script único `migrate-assets-to-s3.mjs` é incluído na imagem Docker; executá-lo dentro de um contentor envia os ficheiros locais existentes para o bucket, reescreve as URLs guardadas para o CDN e pré-gera as variantes

### Exportações CSV de Utilizadores e Encomendas

- A lista de Utilizadores tem um novo botão **Exportar Utilizadores** que descarrega a vista atual em CSV
- A lista de Encomendas tem um novo botão **Exportar Encomendas** que descarrega a vista atual em CSV
- Ambos os endpoints estão protegidos contra CSRF e têm rate limiting

### Imagens Responsivas na Loja

- Cards de produto, páginas de produto, slides do slideshow, secções imagem-com-texto, mosaicos de coleções e outras imagens da loja agora são renderizados com `srcSet` e `sizes`, alinhados às larguras WebP pré-geradas (200/400/600/800/1200)
- Telemóveis e tablets carregam a menor variante que cabe no seu viewport em vez de carregar sempre o asset de tamanho desktop, reduzindo o peso da página e melhorando os Core Web Vitals em ligações lentas

### Telemetria de Erros

- Quando a **Telemetria da Plataforma** está ativada em Definições → Integrações, exceções no servidor e erros não tratados no cliente (`window.onerror`, rejeições de promises não tratadas) são reportados anonimamente à equipa Capyshop como eventos `$exception`
- Nenhum dado pessoal, informação de cliente ou detalhe da loja é encaminhado — o interruptor de telemetria existente controla todo o pipeline, e desligá-lo também interrompe o reporte de erros

### Carregamento de Fontes do Construtor de Páginas

- Títulos e subtítulos de slideshow, títulos/subtítulos/corpo de imagem-com-texto, e fontes do corpo de secções de texto escolhidas no construtor de páginas são agora carregadas automaticamente com a página
- Anteriormente apenas a fonte global do tema era carregada, o que significava que as escolhas de fonte do admin nas secções da página inicial caíam silenciosamente na fonte padrão na primeira renderização

### Localização do Checkout Stripe

- O Stripe Elements (o formulário de cartão integrado) agora é montado no idioma selecionado pelo cliente, para que rótulos de campos, mensagens de erro e o botão "Pagar" correspondam ao resto do checkout

## Melhorias

- O carregamento de webfonts já não bloqueia a renderização — a loja renderiza imediatamente e a webfont entra assim que estiver carregada, eliminando o anterior "ecrã em branco até o Google Fonts responder"
- Target de build atualizado para browsers modernos (Chrome 111+, Edge 111+, Firefox 128+, Safari 16+) para que o bundle deixe de incluir polyfills ES6 que nenhum browser atual precisa
- Tamanhos refinados nos gráficos do dashboard, da visão geral de analytics e do funil de analytics para visualização mais clara
- O pipeline de release da imagem Docker passou para um workflow dedicado acionado por GitHub Releases, condicionado a uma execução de CI verde em `main` para o mesmo commit — sem mais pushes de imagem ad-hoc

## Correções de Segurança

- Todos os endpoints da API que alteram estado (POST/PATCH/PUT/DELETE) agora validam a `Origin` do pedido contra `TRUSTED_ORIGINS` e rejeitam discrepâncias; apenas os webhooks Stripe ficam isentos, uma vez que se autenticam por assinatura em vez de cookie
- O proxy do assistente IA (`/api/admin/chat`, `/api/admin/generate-text`) e o endpoint de registo agora contabilizam todas as chamadas no rate limit — não apenas as falhadas — para defender contra esgotamento de API paga e abuso de criação de contas em massa
