Skip to content

Commit fa013b3

Browse files
Conteúdo real: bio, data do episódio 1 e formulário conectado
- Sobre: bio real do Samuelson Brito (fundador do Java Amazonas). - Episódio 1 marcado como não publicado (estreia adiada para 23/08/2026 por questão de saúde do convidado) — EpisodeCard agora distingue publicado vs. "estreia em breve" e nunca linka/embeda um vídeo que ainda não está no ar. - Registra locale pt-BR (@angular/common/locales/pt) para o DatePipe funcionar no prerender; datas formatadas em UTC para não variar por fuso horário do visitante. - Patrocinadores: access key do Web3Forms configurada, formulário pronto para receber contatos reais.
1 parent ecaca4f commit fa013b3

8 files changed

Lines changed: 63 additions & 24 deletions

File tree

‎.claude/docs/plano-de-desenvolvimento.md‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
## Objetivo
44

5-
O Descompila volta ao ar em formato de podcast, com o episódio [#01 — "O Desafio dos Professores na Era da Inteligência Artificial"](https://www.youtube.com/watch?v=DunHrDCzHuA) (convidado: Jean Lobo) abrindo a nova fase. O site dá um lar a esse conteúdo fora do YouTube: reforça a marca, apresenta os episódios e, assim que existirem, dá visibilidade a patrocinadores e cursos.
5+
O Descompila volta ao ar em formato de podcast, com o episódio #01 — "O Desafio dos Professores na Era da Inteligência Artificial" (convidado: Jean Lobo) abrindo a nova fase. O site dá um lar a esse conteúdo fora do YouTube: reforça a marca, apresenta os episódios e, assim que existirem, dá visibilidade a patrocinadores e cursos.
6+
7+
**Nota**: a estreia do episódio 1 foi adiada (problema de saúde do convidado) para **23/08/2026**. O site trata episódios não publicados como "estreia em breve" — sem embed nem link do YouTube — até a data de fato acontecer e o vídeo ficar público. Não usar mais o link `DunHrDCzHuA` como referência de vídeo já publicado em nenhuma comunicação até a estreia real ser confirmada.
68

79
Identidade visual detalhada em [`identidade-visual.md`](identidade-visual.md).
810

@@ -25,7 +27,7 @@ Angular direto no GitHub Pages, sem backend — todo o conteúdo é estático ou
2527

2628
- **Angular 22 (standalone, zoneless)**, com `outputMode: "static"` — cada rota é prerenderizada em build time para um `index.html` próprio (sem servidor Node em produção, sem Express). Isso também elimina a necessidade do truque clássico do `404.html`: como cada rota já existe como arquivo estático real, o GitHub Pages serve `/episodios/`, `/sobre/` etc. diretamente, sem redirecionamento client-side.
2729
- **Hospedagem**: página de organização do GitHub Pages, repositório `descompila.github.io` → servido na raiz (`https://descompila.github.io/`), `base-href` do Angular configurado como `/`. Dá pra apontar domínio próprio depois sem mudar a estrutura.
28-
- **Conteúdo dos episódios**: lista mantida manualmente como array JSON/TS no repositório (id do vídeo, título, data, convidado, patrocinadores do episódio). Simples de editar a cada episódio novo, sem chave de API exposta no cliente — reavaliar integração com a YouTube Data API quando houver mais episódios.
30+
- **Conteúdo dos episódios**: lista mantida manualmente em `src/app/core/data/episodios.ts` (número, título, convidado, data, `publicado: boolean`, id do vídeo — `youtubeId` fica `null` enquanto não publicado). O componente `EpisodeCard` usa `publicado` para decidir entre mostrar o player/link do YouTube ou um selo "estreia em breve" com a data prevista, sem nunca linkar um vídeo que ainda não está no ar. Simples de editar a cada episódio novo, sem chave de API exposta no cliente — reavaliar integração com a YouTube Data API quando houver mais episódios.
2931
- **GitHub Actions** (`.github/workflows/deploy.yml`) builda e publica `dist/descompila/browser` no GitHub Pages a cada push na `main`, via `actions/upload-pages-artifact` + `actions/deploy-pages`.
3032

3133
## SEO moderno
@@ -50,18 +52,18 @@ Fases pequenas e sequenciais — cada uma entrega algo que já poderia ir ao ar
5052

5153
1. **Fase 0 — Fundação** ✅ concluída: repositório `descompila/descompila.github.io` criado, projeto Angular 22 (standalone, zoneless, `outputMode: static`) com ESLint + Prettier, estrutura de pastas (`pages/`, `shared/layout/`), rotas lazy para as 5 páginas com header/footer navegáveis, favicon/ícones gerados a partir do símbolo da logo, `base-href` `/`.
5254
2. **Fase 1 — Design system** ✅ concluída: tokens de cor/tipografia (CSS custom properties, com suporte a tema claro/escuro via `prefers-color-scheme`), IBM Plex Sans/Mono self-hosted via `@fontsource`, componentes `Button` e `Card` reutilizáveis, Header/Footer com as logos reais.
53-
3. **Fase 2 — Páginas principais** (~1–2 semanas): Home, Episódios (com o episódio 1 já publicado), Sobre e Patrocinadores (com formulário de captação já funcional — ver [`patrocinadores.md`](patrocinadores.md)), com conteúdo real desde o início.
55+
3. **Fase 2 — Páginas principais** ✅ concluída: Home (hero + próximo episódio), Episódios (grid alimentado por `episodios.ts`, trata publicado vs. "estreia em breve"), Sobre (propósito real + bio do apresentador) e Patrocinadores (formulário funcional via Web3Forms, ver [`patrocinadores.md`](patrocinadores.md)) com conteúdo real.
5456
4. **Fase 3 — SEO e performance** (~3–5 dias): meta tags por rota, JSON-LD, sitemap, checagem de Core Web Vitals.
5557
5. **Fase 4 — CI/CD e lançamento**: ✅ pipeline no ar (`.github/workflows/deploy.yml`, deploy automático a cada push na `main`); falta apenas testar em produção com conteúdo real (Fase 2) e divulgar no canal.
5658
6. **Fase 5 — Patrocinadores e cursos** (contínuo): páginas "em breve" evoluem para reais assim que houver patrocinador ou curso confirmado.
5759

58-
**Status atual**: site no ar em <https://descompila.github.io/> com identidade visual aplicada (cores, tipografia, logos, header/footer, botões e cards). Conteúdo das páginas ainda é placeholder — próximo passo é a Fase 2 (páginas principais com conteúdo real).
60+
**Status atual**: site no ar em <https://descompila.github.io/> com identidade visual aplicada e conteúdo real em todas as páginas principais. Próximo passo é a Fase 3 (SEO técnico: meta tags por rota, JSON-LD, sitemap).
5961

6062
## Decisões já confirmadas
6163

6264
- **Hospedagem**: página de organização do GitHub Pages, repositório `Descompila/descompila.github.io`, servida em `https://descompila.github.io/`, não domínio próprio por enquanto.
6365
- **Episódios**: lista mantida manualmente no código, sem integração com a API do YouTube por ora.
64-
- **Captação de patrocinadores**: formulário via Formspree/Web3Forms (sem backend), leads controlados numa planilha simples — ver [`patrocinadores.md`](patrocinadores.md).
66+
- **Captação de patrocinadores**: formulário via Web3Forms (sem backend), access key já configurada em `patrocinadores.ts`; leads controlados numa planilha simples — ver [`patrocinadores.md`](patrocinadores.md).
6567
- **Nome do repositório**: `descompila.github.io`, na organização `descompila` (github.com/descompila) — usado no `base-href` (`/`) e nas URLs. Site publicado em <https://descompila.github.io/>.
6668

6769
## Referência

‎src/app/app.config.ts‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core';
1+
import { ApplicationConfig, LOCALE_ID, provideBrowserGlobalErrorListeners } from '@angular/core';
22
import { provideRouter } from '@angular/router';
3+
import { registerLocaleData } from '@angular/common';
4+
import localePt from '@angular/common/locales/pt';
35

46
import { routes } from './app.routes';
57
import { provideClientHydration } from '@angular/platform-browser';
68

9+
registerLocaleData(localePt, 'pt-BR');
10+
711
export const appConfig: ApplicationConfig = {
812
providers: [
913
provideBrowserGlobalErrorListeners(),
1014
provideRouter(routes),
1115
provideClientHydration(),
16+
{ provide: LOCALE_ID, useValue: 'pt-BR' },
1217
],
1318
};

‎src/app/core/data/episodios.ts‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ export interface Episodio {
22
numero: number;
33
titulo: string;
44
convidado: string;
5-
/** Data de publicação (YYYY-MM-DD). null enquanto não confirmada. */
6-
data: string | null;
7-
youtubeId: string;
5+
/** Data de publicação (se já publicado) ou de estreia prevista (YYYY-MM-DD). */
6+
data: string;
7+
publicado: boolean;
8+
youtubeId: string | null;
89
descricao: string;
910
}
1011

@@ -13,8 +14,9 @@ export const EPISODIOS: Episodio[] = [
1314
numero: 1,
1415
titulo: 'O Desafio dos Professores na Era da Inteligência Artificial',
1516
convidado: 'Jean Lobo',
16-
data: null, // TODO: confirmar data exata de publicação
17-
youtubeId: 'DunHrDCzHuA',
17+
data: '2026-08-23',
18+
publicado: false,
19+
youtubeId: null,
1820
descricao:
1921
'Uma conversa sobre os desafios que professores enfrentam para ensinar tecnologia e se adaptar à era da inteligência artificial.',
2022
},

‎src/app/pages/home/home.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ <h1>Educação de tecnologia, simplificada para todos.</h1>
1212
</section>
1313

1414
<section class="container">
15-
<h2>Episódio mais recente</h2>
15+
<h2>{{ ultimoEpisodio.publicado ? 'Episódio mais recente' : 'Próximo episódio' }}</h2>
1616
<app-episode-card class="episode" [episodio]="ultimoEpisodio" />
1717
</section>

‎src/app/pages/patrocinadores/patrocinadores.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { Component, signal } from '@angular/core';
22
import { Button } from '../../shared/ui/button/button';
33
import { Card } from '../../shared/ui/card/card';
44

5-
// TODO: substituir pela access key gerada em https://web3forms.com (ver .claude/docs/patrocinadores.md)
6-
const WEB3FORMS_ACCESS_KEY = '';
5+
const WEB3FORMS_ACCESS_KEY = '26565cff-e293-40b4-8dd4-300180fca945';
76

87
@Component({
98
selector: 'app-patrocinadores',

‎src/app/pages/sobre/sobre.html‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,20 @@ <h1>Sobre o Descompila</h1>
1414
</p>
1515

1616
<h2>Quem apresenta</h2>
17+
<p class="host-name">Samuelson Brito</p>
1718
<p>
18-
<!-- TODO: bio do Samuelson Brito — aguardando texto -->
19-
Samuelson Brito.
19+
Desenvolvedor de software com foco em Java e backend, atuando desde 2014 na área de tecnologia.
20+
Tem experiência com Java, Spring Boot, microsserviços, APIs e arquitetura de software, além de
21+
interesse e atuação em Inteligência Artificial aplicada ao desenvolvimento.
22+
</p>
23+
<p>
24+
Também é fundador do <strong>Java Amazonas</strong>, comunidade que busca fortalecer o
25+
ecossistema Java na região, promovendo eventos, palestras, workshops e conexão entre
26+
profissionais, estudantes e empresas.
27+
</p>
28+
<p>
29+
Apaixonado por tecnologia, educação e comunidade, gosta de compartilhar conhecimento e
30+
incentivar o crescimento da área de desenvolvimento de software na Amazônia.
2031
</p>
2132

2233
<app-button variant="secondary" [href]="canalUrl">Canal no YouTube</app-button>

‎src/app/pages/sobre/sobre.scss‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.lede {
2+
font-size: 1.1rem;
3+
color: var(--color-ink-soft);
4+
}
5+
6+
.host-name {
7+
font-weight: 700;
8+
font-size: 1.05rem;
9+
margin-bottom: var(--space-2);
10+
}

‎src/app/shared/ui/episode-card/episode-card.html‎

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
<app-card class="episode-card">
2-
<span class="eyebrow">Episódio {{ episodio().numero.toString().padStart(2, '0') }}</span>
2+
<span class="eyebrow">
3+
@if (episodio().publicado) {
4+
Episódio {{ episodio().numero.toString().padStart(2, '0') }}
5+
} @else {
6+
Episódio {{ episodio().numero.toString().padStart(2, '0') }} · Estreia em breve
7+
}
8+
</span>
39
<h3>{{ episodio().titulo }}</h3>
410
<p class="meta">
5-
Com {{ episodio().convidado }}
6-
@if (episodio().data) {
7-
· {{ episodio().data | date: "d 'de' MMMM 'de' y" : undefined : 'pt-BR' }}
11+
Com {{ episodio().convidado }} ·
12+
@if (episodio().publicado) {
13+
{{ episodio().data | date: "d 'de' MMMM 'de' y" : 'UTC' }}
14+
} @else {
15+
estreia {{ episodio().data | date: "d 'de' MMMM" : 'UTC' }}
816
}
917
</p>
1018

11-
@if (showPlayer()) {
19+
@if (episodio().publicado && showPlayer()) {
1220
<div class="player">
1321
<iframe
1422
[src]="embedUrl()"
@@ -27,8 +35,10 @@ <h3>{{ episodio().titulo }}</h3>
2735
</div>
2836
} @else {
2937
<p class="descricao">{{ episodio().descricao }}</p>
30-
<app-button variant="ghost" [href]="'https://www.youtube.com/watch?v=' + episodio().youtubeId">
31-
Assistir no YouTube →
32-
</app-button>
38+
@if (episodio().publicado && episodio().youtubeId; as videoId) {
39+
<app-button variant="ghost" [href]="'https://www.youtube.com/watch?v=' + videoId">
40+
Assistir no YouTube →
41+
</app-button>
42+
}
3343
}
3444
</app-card>

0 commit comments

Comments
 (0)