From 10b15868bc717f94d20ef8eb5fe8fba420863e95 Mon Sep 17 00:00:00 2001 From: Francisco Solla Date: Mon, 21 Sep 2026 11:56:18 -0300 Subject: [PATCH] =?UTF-8?q?docs(S25,S26):=20planos=20+=20designs=20?= =?UTF-8?q?=E2=80=94=20player=20pr=C3=B3prio=20da=20R=C3=A1dio=201313=20e?= =?UTF-8?q?=20cr=C3=A9dito=20do=20artista=20(Related=20#1239=20#1240)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ngle-titulo-credito-artista-ui-design.html | 492 +++++++++++++ docs/plans/jingle-titulo-credito-artista.md | 106 +++ .../plans/radio-player-proprio-ui-design.html | 683 ++++++++++++++++++ docs/plans/radio-player-proprio.md | 110 +++ 4 files changed, 1391 insertions(+) create mode 100644 docs/plans/jingle-titulo-credito-artista-ui-design.html create mode 100644 docs/plans/jingle-titulo-credito-artista.md create mode 100644 docs/plans/radio-player-proprio-ui-design.html create mode 100644 docs/plans/radio-player-proprio.md diff --git a/docs/plans/jingle-titulo-credito-artista-ui-design.html b/docs/plans/jingle-titulo-credito-artista-ui-design.html new file mode 100644 index 00000000..b94a7ad0 --- /dev/null +++ b/docs/plans/jingle-titulo-credito-artista-ui-design.html @@ -0,0 +1,492 @@ + + + + + + + Design S26 · Título e crédito do artista no jingle + + + +
+ Design tier: openai/gpt-5.6-sol · gate humano obrigatório +
+
+
+

+ Gate visual · S26 +

+

+ O nome do artista não vira reticências +

+

+ O card mantém capa, controles, progresso e download. Só o bloco textual muda: título-base + em até duas linhas e feat. artista em linha + própria, menor e sempre visível. +

+
+ 1280px · 3 títulos reais390px · tocando + provas de estresseSem ativo novo +
+
+ +
+
+

+ Cena 01 · desktop 1280 · parado e tocando +

+

+ Os três créditos reais cabem sem diminuir a capa +

+
+
+
+
+
+
+
+

+ Jingles oficiais +

+

+ Dê o play. O próximo ritmo é seu. +

+
+ Um jingle toca por vez. +
+
+
+
+ Capa oficial do jingle Forró +
+
+
+ +
+

Jorge Solla 1313

+

feat. Felipe Forrozeiro

+

Pronto para tocar

+
+
+
+
+
+ Tempo —:—Duração —:— +
+
+ ↓ Baixar MP3 +

+ jorge-solla-1313-jingle-forro.mp3 +

+
+
+
+
+ Capa oficial do jingle Axé +
+
+
+ +
+

Jorge Solla 1313

+

feat. Nagib Barroso

+

+ Em reprodução +

+
+
+
+
+
+ Tempo 0:38Duração 1:40 +
+
+ ↓ Baixar MP3 +

+ jorge-solla-1313-jingle-axe.mp3 +

+
+
+
+
+ Capa oficial do jingle Pagodão +
+
+
+ +
+

Jorge Solla 1313

+

feat. É O MT

+

Pronto para tocar

+
+
+
+
+
+ Tempo —:—Duração —:— +
+
+ ↓ Baixar MP3 +

+ jorge-solla-1313-jingle-pagodao.mp3 +

+
+
+
+
+
+
+
+ +
+
+

+ Cena 02 · mobile 390 · tocando +

+

+ Crédito permanece entre título e estado +

+
+
+

+ Jingles oficiais +

+

Dê o play

+

Um jingle toca por vez.

+
+
+ Capa oficial do jingle Forró +
+
+
+ +
+

Jorge Solla 1313

+

feat. Felipe Forrozeiro

+

+ Em reprodução +

+
+
+
+
+
+ Tempo 0:38Duração 1:40 +
+
+ ↓ Baixar MP3 +

+ jorge-solla-1313-jingle-forro.mp3 +

+
+
+
+
+ +
+
+

+ Cena 03 · mobile 390 · prova de estresse +

+

+ Título-base longo e fallback sem crédito +

+
+
+
+

+ Título-base no limite · parado +

+
+
+
+ Capa existente · não alterada +
+
+
+ +
+

Nome muito longo do jingle oficial da campanha

+

feat. Nome do artista

+

Pronto para tocar

+
+
+
+ ↓ Baixar MP3 +
+
+
+

+ No conteúdo real, o título-base cabe em até duas linhas. Este placeholder extremo + passa de duas para provar o fail-safe: nada recebe truncate e o crédito + continua inteiro. +

+
+ +
+

+ Sem “(feat. …)” · fallback +

+
+
+
+ Capa oficial do jingle Axé +
+
+
+ +
+

Axé

+

Pronto para tocar

+
+
+
+ ↓ Baixar MP3 +
+
+
+

+ Sem crédito, nenhuma linha vazia é reservada: o card segue natural e apenas deixa de + truncar o título. +

+
+
+
+ +
+

+ Especificação visual aprovada no gate +

+
+
+

Título-base

+

+ Exo 2, 24px (22px no estresse), peso 900, entrelinha 1.02. Os títulos reais ocupam até + duas linhas; não há corte silencioso. +

+
+
+

Crédito

+

+ feat. Nome do artista, sem parênteses, 13px, peso 700, cor + --campaign-muted. Nunca truncado. +

+
+
+

Continuidade

+

+ Capas existentes, botão amarelo, estado, progresso, download, raios e sombras + permanecem como hoje. +

+
+
+
+
+ + diff --git a/docs/plans/jingle-titulo-credito-artista.md b/docs/plans/jingle-titulo-credito-artista.md new file mode 100644 index 00000000..0755ac07 --- /dev/null +++ b/docs/plans/jingle-titulo-credito-artista.md @@ -0,0 +1,106 @@ +# Card de jingle — título completo e crédito "(feat. …)" visível (S26) + +Status: rascunho +Atualizado em: 2026-09-21 +Issue: #1240 +Priority: P2 +Impeccable: B — encaixe fino no card de jingle existente (home + `/jingles`), sem redesenhar a seção +Design UI: docs/plans/jingle-titulo-credito-artista-ui-design.html +Appetite: ~0,5 dia eng; um outcome verificável — o título não corta e o crédito do artista aparece no card +Responsável: — + +## Intenção + +Os jingles oficiais são de Jorge Solla 1313 **com** artistas convidados, e o card não conta isso. Em produção o título chega como `Jorge Solla 1313 (feat. Felipe Forrozeiro)`, mas o card impõe uma única linha com reticências e o nome do parceiro some: lê-se `Jorge Solla 1313 (fe…`. O mesmo acontece com Nagib Barroso e É O MT. Crédito de artista é reconhecimento devido a quem fez a música — e é informação de escolha: o militante procura e repassa "o jingle do fulano". + +A decisão é de layout, não de dado: nenhum título publicado será reescrito. O `(feat. …)` passa a viver numa linha própria, em corpo menor, abaixo do título-base, que pode ocupar até duas linhas. O crédito não pode sumir em estado nenhum — parado ou tocando, na home ou em `/jingles` — e o card é o mesmo nos dois lugares. + +## Persona e fluxo + +- **Persona / contexto:** visitante/militante no celular, chegando pela home ou por `/jingles` (link no WhatsApp, busca); de perto, a assessoria que ouve e repassa o material. +- **Job principal:** identificar de relance o jingle e o artista que participa, sem que o nome do parceiro fique escondido atrás de reticências. +- **Fluxo desejado:** vê o card → lê o título completo (até 2 linhas) e, abaixo, o crédito `feat. ` em corpo menor → toca/pausa (crédito continua lá) → baixa o MP3 com o nome de hoje. +- **Anti-goals de produto:** não vira ficha técnica nem discografia; não muda capa, áudio, slug, ordem, published ou download; não redesenha a seção de som nem o player da rádio (irmã S25); não cria dado novo de artista. + +### Esboço de fluxo (B) + +```text +[card na home ou /jingles] +→ título-base completo (até 2 linhas, sem esconder o crédito) +→ linha "feat. " em corpo menor — visível parado e tocando +→ play/pausa (um por vez) → Baixar MP3 (nome do arquivo inalterado) +``` + +### Design UI (B) + +- Design UI (gate): `docs/plans/jingle-titulo-credito-artista-ui-design.html` +- Cenas exigidas: card a 390 (mobile) e 1280 (desktop), parado e tocando, com os 3 títulos reais; e o caso extremo de título-base longo (2+ linhas) provando que o crédito nunca é cortado. O artefato é a fonte de verdade do port; o tamanho exato da fonte do título-base e a cor de apoio do crédito ficam no design. + +## Objetivo e aceite + +- O título-base de cada jingle aparece por inteiro em até 2 linhas (nada de reticências antes do crédito), na home e em `/jingles`. +- O crédito `feat. ` aparece sempre numa linha própria, em corpo menor e cor de apoio, nos estados parado e tocando, nas duas superfícies. +- O crédito nunca recebe `truncate`; se o título-base for longo, ele quebra — o crédito permanece legível. +- Os 3 títulos reais de produção ficam legíveis de ponta a ponta, com o artista creditado. +- Aria-labels continuam com o título completo (crédito incluso) no play/pausar, no progresso e no download; a linha do crédito é conteúdo real, não decoração. +- Nada do dado muda: títulos, capas, áudio, slug, ordem, published e o nome do arquivo baixado seguem exatamente como estão. +- Jingle sem `(feat. …)` (ex.: `Axé`) continua com o layout de hoje, agora sem truncamento. + +## Dados (intenção) + +- **Vou apresentar dados?** Não — N/A: esta fatia não apresenta métrica, agregado nem decisão de dados; o que se lê é o título já publicado. +- **Decisões desbloqueadas:** nenhuma — nenhum ator decide algo a partir de dado novo. +- **Forma:** _adiada ao plano de implementação_ — restrição de produto: nada de telemetria nova nem de superfície de dados; sem PII/Consent. + +## Dados da decisão (literais) + +- ID `S26`; slug `jingle-titulo-credito-artista`; tipo `feature`; Priority `P2`; Impeccable `B`. +- Design UI (gate): `docs/plans/jingle-titulo-credito-artista-ui-design.html`. +- Títulos reais em produção (verificados em `/jingles` de jorgesolla1313.com.br, 2026-09-21): `Jorge Solla 1313 (feat. Felipe Forrozeiro)`, `Jorge Solla 1313 (feat. Nagib Barroso)`, `Jorge Solla 1313 (feat. É O MT)`. +- Defeito literal: o card corta o título em 1 linha com `truncate` e o `(feat. …)` não aparece. +- Regra literal de exibição: separar o segmento `(feat. …)` do título **apenas na exibição** — o segmento vira a linha de crédito, o restante é o título-base; sem segmento, o card fica como hoje. +- Aria-labels preservam o título completo: `Tocar/Pausar jingle `, `Progresso do jingle `, `Baixar em MP3`. +- Download inalterado (deriva do slug): `jorge-solla-1313-jingle-axe.mp3`, `jorge-solla-1313-jingle-forro.mp3`, `jorge-solla-1313-jingle-pagodao.mp3`. +- Sem schema/migration; sem editar conteúdo em produção; o mesmo card serve home (até 3 jingles) e `/jingles`. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `src/components/jingles/JingleCards.tsx` — dono do card (heading `:191-193`, bloco play+texto `:178-203`, estados `:194-201`, aria-labels `:184/:208/:237`); `src/lib/jingle.ts` é a casa natural de uma função pura de quebra título/crédito (`toJingleViewModel` `:57-75`), se o executor preferir derivar no view model. +- **Precedente a olhar:** planos S21 `docs/plans/jingles-site-publico.md` (dono do card) e S22 `docs/plans/jingles-radio-homepage.md`; testes que pinam título/aria — `tests/unit/jingle.unit.spec.ts`, `tests/unit/jinglePlayer.unit.spec.tsx`, `tests/unit/jingleHomeSection.unit.spec.tsx`; e2e `tests/e2e/frontendJingles.e2e.spec.ts`. +- **Risco de acoplamento:** o card é único para home e `/jingles` (`JingleHomeSection.tsx:81` passa `headingLevel="h4"`) — corrigir no dono, sem twin; a home segue estática; não tocar no player da rádio (S25) nem no schema/`Jingle.ts`; grid `:143` e filename truncado `:242` ficam como estão. + +## Dependências + +- Nenhuma (S21/S22/S24 entregues; S25 é irmã, não pré-requisito). + +## Fora de escopo + +- Campo/relação de artista ou `feat` na collection `Jingle` — migration + reedição dos 3 registros (alternativa registrada; gatilho de revisita em Questões). +- Renomear/encurtar títulos, ou mexer em capa, áudio, slug, ordem e published no admin/produção. +- Redesenhar a seção de som, o grid de jingles ou o player da rádio (S25). +- Metadata/OG de `/jingles` (`page.tsx:56-57` usa título fixo) — não muda. +- Ajustar a descrição do campo `title` no admin (`Jingle.ts:48-50`, hoje "Nome curto … (ex.: Axé)") — curadoria futura, se a revisita do campo estruturado acontecer. + +## Rabbit holes de produto + +- **"Já que dá para separar, cria o campo do artista".** Se alguém "só completar": migration + curadoria dos títulos + risco de divergência entre título e campo. **Corte neste item:** layout apenas, extração na exibição; sucessor só com o gatilho de filtrar/ordenar por artista. +- **"Reescreve os títulos no admin para o card caber".** Se alguém "só completar": edita conteúdo publicado e mexe no que já foi distribuído. **Corte neste item:** não se toca no dado; quem se ajusta é o layout. +- **"Redesenha a seção para caber título grande".** Se alguém "só completar": vira reabertura do S21/S22/S24 e da home. **Corte neste item:** encaixe fino no card; grid, capa e player ficam. +- **"Aproveita e melhora a tipografia da seção inteira".** Se alguém "só completar": reabre o design das seções anteriores. **Corte neste item:** mudam só o heading do card e a linha de crédito. + +## Questões em aberto (produto) + +- **O crédito mora no título ou vira campo estruturado?** **Opções:** A) extrair `(feat. …)` na exibição, sem schema (recomendado) | B) campo `feat`/artista na collection com migration + reedição dos 3 títulos | C) manter tudo no título e só reduzir a fonte. **Recomendação:** A — resolve crédito e corte sem tocar em dado publicado; B fica como sucessora **se** surgir necessidade de filtrar/ordenar por artista ou de títulos curtos por ritmo (Axé/Forró/Pagodão), com gatilho explícito; C não garante que o crédito apareça. _(assumido — validar com produto no gate)_ +- **A linha do crédito mantém os parênteses do título?** **Opções:** A) `(feat. Felipe Forrozeiro)` literal | B) `feat. Felipe Forrozeiro` sem parênteses, já que a linha própria sinaliza o crédito. **Recomendação:** B — mais limpo na segunda linha; o texto integral continua nos aria-labels. _(assumido — validar no gate, o design decide o rótulo final)_ +- **Título sem crédito muda de layout?** **Opções:** sim (padronizar as duas linhas) | não (só sem truncar). **Recomendação:** não — ausência de `(feat. …)` não inventa linha nem muda o card de hoje; só deixa de cortar. _(assumido — validar no gate)_ + +## Referências + +- Issue irmã S25 (player da rádio) — não é dependência; esta fatia não toca no player. +- Design UI (gate): `docs/plans/jingle-titulo-credito-artista-ui-design.html`. +- `src/components/jingles/JingleCards.tsx` — dono do card (heading, estados, aria-labels, download). +- `src/lib/jingle.ts` — derivados do título no view model, se a extração virar função pura. +- `src/components/jingles/JingleHomeSection.tsx` — home (headingLevel `h4`, até 3 jingles). +- `src/collections/Jingle.ts` — schema (não muda); descrição atual do campo em `:48-50`. +- Página em produção: `https://jorgesolla1313.com.br/jingles` (títulos reais verificados em 2026-09-21). +- `AGENTS.md` — convenções de identificadores/copy e "edite o dono, sem twin". diff --git a/docs/plans/radio-player-proprio-ui-design.html b/docs/plans/radio-player-proprio-ui-design.html new file mode 100644 index 00000000..6dbb8521 --- /dev/null +++ b/docs/plans/radio-player-proprio-ui-design.html @@ -0,0 +1,683 @@ + + + + + + + Design S25 · Player próprio da Rádio 1313 + + + +
+ Design tier: openai/gpt-5.6-sol · gate humano obrigatório +
+
+
+

+ Gate visual · S25 +

+

+ Player próprio da Rádio 1313 +

+

+ Um player horizontal, discreto e inteiramente da campanha substitui o iframe. O play é o + único controle dominante; compartilhar permanece secundário. Nenhum dado de “tocando + agora”, duração ou ouvintes é inventado. +

+
+ 1280px · seção cheia + 390px · compacta + NEEDS ASSET · confirmar arte oficial do player +
+
+ +
+
+

+ Cena 01 · desktop 1280 · 3 jingles · rádio parada +

+

+ Player primeiro, grade existente logo abaixo +

+
+
+
+
+
+
+

+ A trilha da nossa caminhada +

+

Cante, baixe e espalhe

+

+ Ouça a Rádio Jorge Solla 1313 e os jingles oficiais da campanha. Dê o play e baixe + o seu preferido para levar com você. +

+
+ +
+
+
+ Estrela oficial da campanha Jorge Solla 1313 +
+
+
+ Ao + vivo + Rádio online +
+

+ Rádio Jorge Solla 1313 +

+

Pronta para tocar

+
+
+ + +
+
+
+

+ NEEDS ASSET · estrela oficial usada como candidato, confirmar arte final +

+ +
+
+

+ Jingles oficiais +

+

+ Dê o play. O próximo ritmo é seu. +

+
+ Um áudio toca por vez. +
+
+
+ Capa oficial do jingle Axé +
+
+ +
+

+ Jorge Solla 1313 +

+

+ feat. Nagib Barroso +

+

Pronto para tocar

+
+
+
+
+ Tempo —:—Duração —:— +
+ Baixar MP3 +
+
+
+ Capa oficial do jingle Forró +
+
+ +
+

+ Jorge Solla 1313 +

+

+ feat. Felipe Forrozeiro +

+

Pronto para tocar

+
+
+
+
+ Tempo —:—Duração —:— +
+ Baixar MP3 +
+
+
+ Capa oficial do jingle Pagodão +
+
+ +
+

+ Jorge Solla 1313 +

+

+ feat. É O MT +

+

Pronto para tocar

+
+
+
+
+ Tempo —:—Duração —:— +
+ Baixar MP3 +
+
+
+ +
+
+
+
+ +
+
+

+ Cena 02 · mobile 390 · 0 jingles · rádio tocando +

+

+ Variante compacta sem parecer vazia +

+
+
+
+
+
+

+ A trilha da nossa caminhada +

+

+ Sintonize com a Rádio 1313 +

+

+ Ainda não há jingles publicados por aqui. Enquanto isso, ouça a Rádio Jorge Solla + 1313. +

+
+
+
+
+ Estrela oficial da campanha Jorge Solla 1313 +
+
+ Ao vivo +

+ Rádio Jorge Solla 1313 +

+

Em reprodução

+
+ +
+
+ +
+
+

+ NEEDS ASSET · confirmar arte final do player +

+
+
+
+ +
+
+

+ Cenas 03–05 · estados críticos +

+

+ Conectando, erro e compartilhar são explícitos +

+
+
+
+

+ Carregando / conectando +

+
+
+
+ +
+
+ Ao vivo +

+ Rádio Jorge Solla 1313 +

+

+ Conectando à rádio… +

+
+ +
+
+

+ Mesmo footprint do estado parado; nunca spinner infinito. +

+
+ +
+

+ Erro / fail-soft +

+
+
+
+ + + + +
+
+

A rádio não conectou

+

+ Tente de novo ou ouça na página da rádio. +

+
+
+
+ Ouvir no Zeno +
+
+
+ +
+

+ Compartilhar · popover aberto +

+
+

Compartilhar a rádio

+

+ Ouça a Rádio Jorge Solla 1313 — https://zeno.fm/radio/jorge-solla-1313/ +

+
+ +
+
+

+ Controle próprio e secundário no player; o popover oferece as duas saídas aprovadas. +

+
+
+
+ +
+
+

+ Decisão visual +

+

Discreto, sem cromado de terceiro

+
    +
  • • Moldura de 14px, borda e sombra já usadas na seção.
  • +
  • • Play amarelo é o único controle dominante.
  • +
  • • “Ao vivo” identifica o stream sem inventar programação.
  • +
  • • Compartilhar é outline/link, nunca segundo CTA primário.
  • +
  • • Sem timeline: rádio ao vivo não promete duração.
  • +
+
+
+

+ NEEDS ASSET +

+

+ Arte do player pede confirmação no gate +

+

+ A cena usa provisoriamente a estrela oficial do kit 1313 sobre disco + branco, conforme o README. Se houver capa específica da rádio no kit, ela substitui + somente esse quadrado. Não criar capa, ilustração ou banco de imagem. +

+
+
+
+ + diff --git a/docs/plans/radio-player-proprio.md b/docs/plans/radio-player-proprio.md new file mode 100644 index 00000000..01d38465 --- /dev/null +++ b/docs/plans/radio-player-proprio.md @@ -0,0 +1,110 @@ +# Player próprio da Rádio 1313 na home (S25) + +Status: rascunho +Atualizado em: 2026-09-21 +Issue: #1239 +Priority: P2 +Impeccable: C — componente novo (player) dentro da seção de som existente da home +Design UI: docs/plans/radio-player-proprio-ui-design.html +Appetite: ~1 dia eng; um outcome verificável — a rádio toca num player próprio, discreto, sem marca zeno, com CTA de compartilhar +Responsável: — + +## Intenção + +O embed oficial do zeno.fm que o S24 (#1235) montou na home ficou pequeno: o iframe de 150/168px corta título e capa e carrega a marca zeno. O humano quer um player próprio, mais discreto e com a cara da campanha, sobre o mesmo stream (`https://stream.zeno.fm/hys86kx6k16tv`), mais um CTA de compartilhar que manda o link público da rádio no Zeno. + +Esta Issue é a **sucessora explícita** do S24: nova evidência de produto reverte os anti-goals dele ("não vira player custom", "não cria framework de consent/CSP"). Planos de Issues `done`/`in-prod` são imutáveis — `docs/plans/radio-embed-direto.md` não é editado nem reaberto; a reversão de propósito fica registrada aqui. + +Ganho colateral a registrar com honestidade: o iframe do S24 traz GA `G-2T527NZWVM` + redes de anúncio em todo pageview da home (trade-off assumido lá). Com player próprio + `preload="none"`, nenhum request de terceiro sai antes do gesto de play; a conexão com o stream só acontece ali. Isso **reverte o trade-off para melhor**, mas não promete analytics nem contador — não há dado nosso novo. + +## Persona e fluxo + +- **Persona / contexto:** visitante e militante que chega pela home no celular (link no WhatsApp, busca, indicação), com pressa e em conexão qualquer. +- **Job principal:** ouvir a Rádio Jorge Solla 1313 num player que parece da campanha e poder mandar o link da rádio para alguém. +- **Fluxo desejado:** abre a home → rola até a seção de som → vê o player discreto "Rádio Jorge Solla 1313" com indicador "Ao vivo" → dá play e ouve (a conexão com o stream começa só agora); se um jingle estiver tocando, ele pausa → toca o "Compartilhar" e escolhe WhatsApp (mensagem pronta) ou copiar link → se o play falhar, vê um estado honesto com link para ouvir no Zeno. +- **Anti-goals de produto:** não redesenha a seção de som nem a grade/`/jingles`; não vira proxy nem player de streaming próprio; não autoplay com som; não busca "tocando agora" nem analytics/contador; não cria consent/CSP novo; não mexe em schema. + +### Esboço de fluxo (C) + +```text +[visitante na home] → seção de som +→ player próprio: "Rádio Jorge Solla 1313" · [Ao vivo] · [▶] · [Compartilhar] +→ dá play → conecta no stream (sem request de terceiro antes) · toca + [jingle tocando] → pausa o jingle · [play no jingle] → pausa a rádio +→ "Compartilhar" → WhatsApp (mensagem pronta) | copiar link → feedback +[play falha/estola] → estado de erro + "ouvir no Zeno" + compartilhar (nunca spinner infinito) +[0 jingles] → rádio sozinha (compact) · [N jingles] → grade + "Ver todos" → /jingles +``` + +### Design UI (C) + +- Design UI (gate): `docs/plans/radio-player-proprio-ui-design.html` — cenas: 390 mobile, 1280 desktop, variante compacta (0 jingles) e estados do player (parado, carregando, ao vivo, erro). Capa/arte é NEEDS ASSET: ativo oficial do kit 1313 (`public/campaign-kit/README.md`) ou disco neutro — nunca inventar capa nem usar banco de imagens. + +## Objetivo e aceite + +- O iframe zeno some da home; o player próprio é a única superfície de rádio da seção, com título fixo "Rádio Jorge Solla 1313" e indicador "Ao vivo" — sem corte de título/capa. +- Só toca com gesto do visitante; com `preload="none"` nenhum request ao stream ou a terceiros acontece antes do play. +- Um áudio por vez na seção de som: play na rádio pausa o jingle em reprodução e vice-versa. +- Compartilhar envia a mensagem literal `Ouça a Rádio Jorge Solla 1313 — https://zeno.fm/radio/jorge-solla-1313/` (WhatsApp + copiar link com feedback), reusando o padrão público. +- Fail-soft: play que falha ou estola vira estado de erro com alternativa honesta (ouvir no Zeno / compartilhar) — nunca spinner infinito. +- Kill switch do S21 e variante compact preservados: 0 jingles → rádio sozinha; com jingles, grade e "Ver todos" seguem abaixo; `/jingles` e o player dos jingles ficam intocados além da exclusividade. +- Home segue estática (leitura única de `getPublishedJingleItems()`, cache tag `jingles`); sem PII nova, sem Consent novo; MetaPixel da home intocado; sem overflow horizontal a 390px e operável por teclado com rótulos acessíveis. + +## Dados (intenção) + +- **Vou apresentar dados?** Não — **N/A**: nenhum dado nosso é apresentado ou coletado; não há contador de ouvintes, analytics de reprodução nem metadados "tocando agora". A decisão do visitante é ouvir agora, não ler números. +- **Decisões desbloqueadas:** N/A — sem métrica que desbloqueie escolha de ator. +- **Forma:** N/A — sem dado agregado a definir. + +## Dados da decisão (literais) + +- ID `S25`; slug `radio-player-proprio`; tipo `feature`; Priority `P2`; Impeccable `C`; rota: a home `/` (sem rota nova). +- Stream a tocar: `https://stream.zeno.fm/hys86kx6k16tv` → 302 para CDN `stream-*.surfernetwork.com` com token assinado por request; resposta final `content-type: audio/mpeg`, `icy-name: Jorge Solla 1313`, 128 kbps, 44.1 kHz; **sem headers CORS/ACAO** (playback em `