diff --git a/DESIGN.md b/DESIGN.md
index 63ad590d..e78c5d61 100644
--- a/DESIGN.md
+++ b/DESIGN.md
@@ -292,6 +292,8 @@ This file is the living owner of Teqo's visual decisions — a working document,
**Public campaign archive actions (C233, 2026-09-26).** On campaign-branded public archive/read surfaces, the primary action is campaign red with white text. Kit yellow is an orientation and keyboard-focus signal — hero edge, restrained eyebrow, current-location underline, and high-contrast focus outline — never the competing CTA fill. This keeps one action dominant, separates public campaign expression from Petition Gold, and makes keyboard location unmistakable over both light and dark media surfaces.
+**Multi-media content gallery (C240, 2026-10-01).** A public piece with multiple media uses one stable stage plus position (“N de M”), previous/next controls, and a horizontally scrollable thumbnail strip; never shrink every thumbnail to force the whole set on screen. Download belongs to the selected media, while the single primary action shares the official source post — do not offer an ambiguous “download all” or make media-sharing compete with the source link. Partial arrival is an internal neutral processing state; the public gallery appears only when the complete set is ready. This keeps the action model honest across image-only, mixed video, and large carousels without inventing a second album product.
+
How rules change:
- **Decide, then update the owner.** When a better pattern wins — anti-slop review (`design-taste-frontend` / `gpt-taste`), a reference study (`awesome-design-md`), a redesign pass (`redesign-existing-projects`), or implementation judgment — update this file in the **same change** and say why. A pattern that only lives in code or in an agent's head is drift, not design.
diff --git a/docs/plans/central-conteudos-carrossel-ui-design.html b/docs/plans/central-conteudos-carrossel-ui-design.html
new file mode 100644
index 00000000..cd57e22f
--- /dev/null
+++ b/docs/plans/central-conteudos-carrossel-ui-design.html
@@ -0,0 +1,1585 @@
+
+
+
+
+
+
+
+ Design — C240 · Carrossel como conteúdo de primeira classe
+
+
+
+
+
+
+
+ C240 · design hi-fi certificado
+
+ O carrossel é uma peça completa — não uma limitação.
+
+
+ Ficha interna e superfície pública do carrossel como conteúdo de primeira classe: a
+ plataforma baixa automaticamente todas as mídias dos filhos pela API oficial, a ficha lê
+ Carrossel com a sua galeria (sem caixa âmbar de falha), e o eleitor vê a galeria
+ com Baixar (cada mídia) e Compartilhar (post oficial). Visitante: ler,
+ baixar e repassar. Assessoria: importar completo, revisar e publicar.
+
+
+
+ Literais travados no gate (não reabrir no design):
+ tipo visível “Carrossel” (sem “álbum”); baixa automática de todas as mídias
+ (imagens e vídeos) pela API oficial, sem anexo manual e sem scraping; vídeos-filhos entram
+ na transcrição/catálogo; público com galeria + Baixar (cada mídia) +
+ Compartilhar (post oficial) + Copiar link; recibo conta carrossel como
+ conteúdo criado (sem bloco de ressalva de peça-link); ficha interna sem caixa âmbar “por
+ que o arquivo não foi baixado”; as 52 peças existentes (40 publicadas, 12 rascunhos)
+ ganham o mesmo tratamento.
+
+
+
+ Observação: os selos Rascunho, Publicado, Processando e
+ Pronto abaixo são estados do produto (vocabulário já existente da Central),
+ não uma certificação deste artefato. Os textos em caixa alta nesta página são anotação do
+ board de design, não chrome do app. As mídias reais aparecem marcadas como
+ NEEDS ASSET.
+
+ A coluna de mídia deixa de ser um único preview de 300 px e passa a ser a galeria do
+ carrossel: palco + trilha de miniaturas + “N de M”. O cabeçalho ganha a identidade
+ Carrossel. Nenhuma caixa âmbar: a peça lê como conteúdo completo.
+
+ As 8 mídias do carrossel foram baixadas pela API oficial e a ficha foi
+ catalogada — inclusive a transcrição do vídeo-filho. Revise os campos antes de
+ publicar.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AÇÕES DO CABEÇALHO
+
+ Rascunho
+
+
+ → depois de publicado a ação vira o kill switch:
+
+ Publicado
+
+
+
+
+
+
+
+ CENA 02
+
Ficha interna · mobile 390 · “baixando mídias” sem linguagem de falha
+ Baixando mídias… 3 de 8.
+ As demais chegam em segundo plano; a ficha já pode ser revisada. A peça
+ publica quando as mídias estiverem prontas.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CONTRATO DA FICHA
+
Identidade Carrossel + galeria das mídias
+
+ O estado parcial usa o painel neutro “Baixando mídias… N de M”. Não há caixa âmbar,
+ motivo de limitação nem pedido de anexo manual: baixar os filhos é o fluxo normal.
+
+
+ Peças de carrossel já criadas (importações anteriores/backfill) passam a ler assim:
+ a mesma galeria e a mesma identidade, sem box de ressalva.
+
+
+
+
+
+
+
+
+ CENA 04
+
Recibo da importação · carrossel conta como conteúdo criado
+
+
+
+
+
+
+
+
Importação concluída
+
+ As novidades já estão na Central como rascunho. Nada foi publicado.
+
+
+
+
+ N
+ novas criadas
+
+
+ N
+ já estavam
+
+
+ —
+ falharam
+
+
+
+
+ Criadas por tipo
+ Vídeo · N
+
+
+ Carrossel · N
+
+ Foto · N
+
+
+
+ Carrosséis entram como conteúdo criado, com as mídias dos filhos baixadas
+ automaticamente pela API oficial. O bloco de ressalva de peça-link só aparece para
+ link não encontrado ou Instagram indisponível.
+
+
+
+
+
+
+
+
+
+
+
+
+ CENA 05
+
Catálogo público /conteudos · desktop 1280 · card do Carrossel e filtro Tipo
+
+
+ Capa = primeiro filho (recomendação A do plano). A indicação de múltiplas mídias fica
+ sobre a capa (8 mídias, ícone de imagens) e o tipo aparece na tag Carrossel.
+ O filtro Tipo ganha Carrossel.
+
+ Legenda oficial da publicação: Jorge Solla explica por que reduzir a jornada protege
+ a saúde de quem trabalha. Arraste para ver as 8 mídias e baixe a que quiser.
+
+
+
+
+
Tema
+
Trabalho e saúde
+
+
+
Local
+
Salvador
+
+
+
Mídias
+
8 · 7 fotos, 1 vídeo
+
+
+
Origem
+
Instagram
+
+
+
+
+
+
+
+
+ O compartilhamento usa o link da publicação no Instagram. As mídias foram baixadas
+ do perfil oficial; baixe cada uma pela galeria.
+
+
+
+
+
+
+
+
+ CENA 08
+
+ Página pública · mobile 390 · galeria com dots + sheet de compartilhamento existente
+
+
+
+
+
+ ←Central de Conteúdos
+
+
+
+
NEEDS ASSET · MÍDIA 1
+ 1 de 8 · Foto
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Carrossel
+
+
+ Fim da escala 6×1 é saúde
+
+
+ Arraste para ver as 8 mídias. Baixe a que quiser e repasse a que fizer sentido.
+
+
+
+
+
+
+
+
+
+
+
+
+
Peça esse voto no WhatsApp
+
A mensagem é sua: revise antes de abrir.
+
+
+
+
+
+
+
+ Sem destinatário e sem envio automático. Compartilhar e copiar usam o link do post
+ oficial; Baixar esta mídia permanece uma ação separada da galeria.
+
+
+
+
+
+
+
+
+ CENA 09
+
Estados críticos da galeria · só imagens · com vídeo · grande · mídias chegando
+
+
+
+
+
SÓ IMAGENS · 5 MÍDIAS
+
+
NEEDS ASSET · MÍDIA 1
+ 1 de 5 · Foto
+
+
+
+
+
+ 5 fotos · sem vídeo
+
+
+ Nenhum selo de play; o contador e a trilha bastam. A legenda segue pesquisável, sem
+ transcrição de vídeo.
+
+
+
+
+
+
COM VÍDEO · POSTER → PLAYER
+
+
NEEDS ASSET · POSTER DO VÍDEO-FILHO
+ 3 de 8 · Vídeo
+ 00:42
+
+
+
+
+ NEEDS ASSET · VÍDEO EM REPRODUÇÃO (controles nativos)
+
+
+
+
+
+
+
+
+ O vídeo só monta o player após o gesto; o vídeo-filho entra na transcrição da peça.
+
+
+
+
+
+
GRANDE · 12 MÍDIAS
+
+
NEEDS ASSET · MÍDIA 1
+ 1 de 12 · Foto
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+
+
+
+
+ A trilha rola; o contador “N de M” e os botões ‹ › mantêm a navegação sem mapa de
+ miniaturas pressionado.
+
+
+
+
+
+
+
+
+ FICHA INTERNA · MÍDIAS AINDA CHEGANDO
+
+
+
NEEDS ASSET · MÍDIA 1
+ 1 de 8 · Foto
+
+
+ 1
+ 2
+
+
+
+
+
+ Baixando mídias… 3 de 8. Estados honestos, sem caixa de
+ falha e sem bloquear o que já chegou.
+
+
+
+ Este é um estado da ficha interna. No público, a galeria só aparece depois que
+ todas as mídias estão prontas; o eleitor nunca recebe um slide incompleto.
+
+
+
+
+
+
LEGENDA / TEXTO DA PEÇA
+
+
NEEDS ASSET · MÍDIA 1
+ 1 de 8 · Foto
+
+
+
+ Carrossel
+
+
Fim da escala 6×1 é saúde
+
+ Legenda oficial da publicação exibida sob a galeria — é ela que dá contexto a cada
+ mídia e alimenta a busca (junto da transcrição do vídeo-filho).
+
+
+ A legenda é a mesma em todas as mídias: não há texto por slide.
+
+
+
+
+
+
+
+ CERTIFICAÇÃO VISUAL
+
Contrato do port e escolhas que o gate humano confirma
+
+
+
+ Design hi-fi certificado pelo designer de referência. A implementação deve portar estas
+ cenas com paridade; a aprovação final continua sendo decisão humana no gate.
+
+
+
+ Identidade. “Carrossel” aparece como tipo na ficha, no
+ card, na página e no filtro. O design não usa “álbum” em nenhum ponto.
+
+
+ Hierarquia pública. No card, Compartilhar é o
+ único CTA primário e Ver galeria abre a peça. Na página,
+ Baixar esta mídia
+ pertence ao slide selecionado; não existe download ambíguo do conjunto.
+
+
+ Compartilhamento. Compartilhar e Copiar link usam o
+ post oficial do Instagram. Compartilhar mídia não compete com esse gesto; a mídia é
+ obtida exclusivamente pelo botão de download do slide.
+
+
+ Capa e navegação. O primeiro filho é a capa. A galeria
+ combina palco, contador “N de M”, setas e trilha rolável; carrossel grande não
+ comprime miniaturas para caber.
+
+
+ Processamento. “Baixando mídias… N de M” é um estado
+ neutro da ficha em desktop e mobile. Publicar fica indisponível até todas chegarem; a
+ superfície pública nunca mostra slide parcial.
+
+
+ Vídeo-filho. Poster e duração antecedem o play; o
+ player só carrega após gesto, nunca reproduz automaticamente ao trocar de slide. A
+ legenda e a transcrição dos vídeos alimentam a leitura e a busca.
+
+
+ Recibo e legado. Carrossel entra na contagem criada e
+ no recorte por tipo, sem ressalva de peça-link. As 52 peças existentes recebem a mesma
+ identidade, galeria e estados das novas.
+
+
+ Acessibilidade do port. Galeria como região nomeada;
+ setas com nome acessível; posição anunciada em texto; miniaturas como lista com estado
+ selecionado; navegação por teclado, foco visível e respeito a movimento reduzido.
+
+
+ Assets. Nenhum SVG próprio foi necessário (ícones
+ lucide inline). As mídias reais seguem marcadas como NEEDS ASSET.
+
+
+
+ Pendência do gate humano: confirmar a direção visual certificada — capa no primeiro
+ filho, Compartilhar como CTA primário e publicação pública somente com a galeria
+ completa. A forma de dados e o mecanismo de processamento permanecem decisões de
+ engenharia.
+
+
+
+
+
+
diff --git a/docs/plans/central-conteudos-carrossel.md b/docs/plans/central-conteudos-carrossel.md
new file mode 100644
index 00000000..c1663a84
--- /dev/null
+++ b/docs/plans/central-conteudos-carrossel.md
@@ -0,0 +1,99 @@
+# C240 — Central de Conteúdos — carrossel do Instagram como conteúdo de primeira classe
+
+Status: rascunho
+Atualizado em: 2026-10-01
+Issue: #1399
+Priority: P1
+Impeccable: C — encaixe nas telas existentes (ficha interna C211 + catálogo/página pública S27), com um componente novo (galeria multi-mídia)
+Design UI: docs/plans/central-conteudos-carrossel-ui-design.html
+Appetite: ~3–4 dias eng; um outcome verificável
+Responsável: —
+
+## Intenção
+
+O carrossel é o formato mais frequente do perfil oficial e hoje entra na Central pela porta dos fundos: vira "peça-link com motivo" e a ficha o apresenta como limitação ("Carrossel: sem arquivo único para baixar"), sem mídia alguma. A decisão original do C220 foi consciente ("carrossel não vira álbum"), mas o dono a reabriu em 2026-09-29 com evidência de produto nova: o carrossel deve ser **conteúdo de primeira classe** — a plataforma baixa automaticamente todas as mídias (imagens e vídeos) dos filhos pela API oficial do próprio perfil, transcreve/cataloga os vídeos como nas demais peças, e o público vê uma **galeria com Baixar (cada mídia) e Compartilhar** (post oficial). Há 50 carrosséis na janela de 60 dias do perfil e a esteira de importação está prestes a trazê-los; sem este item eles nascem incompletos e a assessoria aprende a ler conteúdo legítimo como erro.
+
+**Decisão de produto registrada (reabre anti-goal do C220):** baixar os filhos do carrossel pela via oficial é permitido e desejado; a mídia da plataforma passa a ter casa na Central como as demais peças. Nada de scraping/terceiro — segue o caminho oficial do C212/C220.
+
+## Persona e fluxo
+
+- **Persona / contexto:** assessoria de comunicação (`communicator`; `coordinator`/`candidate` também) importando o perfil e publicando peças; eleitor que consome e repassa o conteúdo na Central pública.
+- **Job principal:** importar um carrossel e recebê-lo completo (todas as mídias), catalogado e pronto para publicar; eleitor: ver a galeria, baixar e compartilhar.
+- **Fluxo desejado:** importa do perfil / cola o link → as mídias do carrossel são baixadas automaticamente, os vídeos transcritos e a peça catalogada → a ficha interna mostra "Carrossel" com suas mídias (não uma falha) → publica → o eleitor vê a galeria e usa Baixar (cada mídia) e Compartilhar (post oficial).
+- **Anti-goals de produto:** não baixar mídia de terceiro (permanente); não exigir anexo manual (a promessa é automático); não publicar automaticamente; não criar segundo modelo de conteúdo/segunda peça; não virar galeria de vaidade com player/slideshow próprio do Instagram.
+
+### Esboço de fluxo (C)
+
+```text
+[Importar do perfil / Adicionar por link] → carrossel reconhecido como "Carrossel"
+ → API oficial entrega os filhos (media_type + media_url): imagens e vídeos baixados automaticamente
+ → vídeos dos filhos entram na transcrição; peça catalogada (título, descrição, temas, cidade)
+ → ficha interna: identidade Carrossel + galeria das mídias; sem caixa de falha
+ → publicação → catálogo e página pública: galeria + Baixar (cada mídia) + Compartilhar (post oficial)
+ → recibo da importação conta carrosséis como conteúdo trazido
+[outcome: carrossel deixa de ser peça-link sem mídia e passa a ser conteúdo completo da Central]
+```
+
+### Design UI (C)
+
+- Design UI (gate): `docs/plans/central-conteudos-carrossel-ui-design.html` (a produzir)
+
+## Objetivo e aceite
+
+- Um carrossel importado do perfil (ou adicionado por link) baixa automaticamente **todas** as mídias dos filhos pela API oficial, sem scraping e sem anexo manual.
+- A peça do carrossel tem identidade própria ("Carrossel") na Central e nunca aparece com a linguagem de falha/limitação que existe hoje.
+- Vídeos dentro do carrossel entram na transcrição/catálogo (busca por fala/tema consistente com as demais peças).
+- Publicado, o carrossel aparece no catálogo e na página pública com galeria das mídias e ações **Baixar** (cada mídia) e **Compartilhar** (post oficial), mantendo o compartilhamento do link do Instagram.
+- O recibo da importação conta o carrossel como conteúdo trazido (não como "peça-link com motivo").
+- Peças de carrossel já criadas (importações anteriores / backfill) ganham o mesmo tratamento e mídias — nada fica preso no formato antigo.
+- Guardrails: só o perfil próprio via API oficial (C212); mídia de terceiro nunca é baixada; nada é publicado automaticamente; curadoria e kill switch continuam por peça; sem PII nova.
+
+## Dados (intenção)
+
+- **Vou apresentar dados?** Não — apresentação de um tipo de conteúdo, não analytics (C213 segue dono da circulação).
+- **Decisões desbloqueadas:** N/A — a decisão da assessoria é editorial ("publicar ou não o carrossel").
+- **Forma:** N/A — sem números novos em tela.
+
+## Dados da decisão (literais)
+
+- Nome visível do tipo: **"Carrossel"** (sem sinônimo "álbum").
+- Ações públicas do carrossel: **Baixar** (cada mídia da galeria) e **Compartilhar** (WhatsApp/link do post oficial) — além de **Copiar link** como nas demais peças.
+- Recibo da importação: carrossel entra na contagem de conteúdo criado com o rótulo do tipo, e não no bloco de ressalvas de peça-link.
+- Ficha interna: o motivo `carrossel` deixa de representar limitação; a peça lê como conteúdo completo.
+- Transcrição: vídeos-filhos entram no mesmo pipeline de transcrição das demais peças.
+
+## Direção no codebase (hipótese)
+
+- **Áreas prováveis:** `src/lib/contentPiece.ts` (tipos/labels/razões), `src/utilities/content/contentPieceLink.ts` (resolução do link e download dos filhos), `src/utilities/content/contentPieceJob.ts` (processar N mídias; transcrever vídeos-filhos), `src/utilities/content/contentPieceCataloging.ts`, ficha interna `src/app/(campaign)/campanha/(app)/comunicacao/conteudos/[id]/page.tsx`, catálogo/página pública `src/components/conteudos/` e `src/lib/contentPieceCatalog.ts`, rotas de mídia `src/app/(frontend)/conteudos/[slug]/`, recibo do importador `src/components/campaign/content/ImportContentPieceProfileDialog.tsx`.
+- **Precedente a olhar:** o fluxo single-media do C211/C220/C230 (que este item generaliza), `MEDIA_FIELDS` com `children{media_type,media_url,thumbnail_url}` (já presente), a galeria/carrossel do site público (`src/components/CampaignCarousel.tsx`) como referência de linguagem, e a taxonomia `video|foto|texto|audio|card`.
+- **Risco de acoplamento:** o modelo atual é uma mídia por peça (`contentPiece.media`) — a generalização para N mídias precisa preservar as peças existentes e as rotas públicas (`/conteudos//midia`, frame, OG); `linkFailureReason` é lido por ficha, importador e testes (não quebrar `nao-encontrado`/`indisponivel`/`sem-credencial`); o S27 já renderiza peça-link — a entrega encaixa nele, sem segundo modelo.
+
+## Dependências
+
+- **Suaves:** C211 (peça/ficha), C220 (link→peça), C230 (importar do perfil), S27 (catálogo/página pública), C226 (frame) — todos entregues.
+- **Relação com a operação de importação de 60 dias:** o backfill de 60 dias **já rodou** (2026-09-29) e criou **52 peças de carrossel** — 40 publicadas e 12 rascunhos — todas como peça-link sem arquivo; o aceite cobre o tratamento e as mídias dessas peças existentes.
+
+## Fora de escopo
+
+- Stories, destaques e demais formatos sem arquivo.
+- Reprocessar carrosséis de terceiros (permanente).
+- Player/slideshow próprio com reprodução automática ou embed do Instagram.
+- Qualquer mudança no board/feed da home ou na circulação (C213).
+- Download em pacote único (zip) — se pedido depois, item novo.
+
+## Rabbit holes de produto
+
+- **"Já que baixa os filhos, monta um álbum/zip".** Se alguém "só completar": pacote, álbum paralelo, storage duplicado. **Corte:** galeria com download por mídia; pacote é item futuro.
+- **"Então cria um tipo novo para tudo que é link"** (YouTube, rádio). Se alguém "só completar": taxonomia paralela. **Corte:** o item trata o carrossel; os demais seguem como estão.
+- **"Publica o carrossel automaticamente".** Se alguém "só completar": auto-publicação. **Corte:** curadoria continua humana.
+
+## Questões em aberto (produto)
+
+- **Ordem de execução na Central (galeria antes/depois da transcrição)?** **Opções:** A) peça publica quando as mídias estiverem prontas e o catálogo completa depois (como as demais) | B) segurar até transcrição concluir. **Recomendação:** A — mesmo contrato do C211 (job em background). _(assumido — validar com produto)_
+- **Capa do carrossel no catálogo?** **Opções:** A) primeiro filho (comportamento atual do thumbnail) | B) escolha manual na ficha. **Recomendação:** A, com troca manual opcional se o picker já existir. _(assumido — validar com produto)_
+
+## Referências
+
+- GitHub Issue #— (após registro); design UI (gate): `docs/plans/central-conteudos-carrossel-ui-design.html`.
+- Planos irmãos: `central-conteudos-ingestao.md` (C211) · `central-conteudos-link-instagram.md` (C220) · `central-conteudos-importar-perfil.md` (C230) · `central-conteudos-publica.md` (S27) · `central-conteudos-preview-frame-video.md` (C226).
+- Arquivos-pista: `src/utilities/socialFeed/instagramFeed.ts:106-115` (MEDIA_FIELDS com children) · `src/utilities/content/contentPieceLink.ts:304-313` (ramo carrossel atual) · `src/lib/contentPiece.ts:355-379` (motivos) · `src/components/conteudos/ContentPieceDetail.tsx` · `src/components/conteudos/ContentPieceCard.tsx` · `src/components/campaign/content/ImportContentPieceProfileDialog.tsx:50-64` (recibo).