Todo o conteúdo do Vilanova está armazenado em arquivos estáticos no repositório Git:
- ✅ Fácil de editar (JSON é legível)
- ✅ Versionado (Git rastreia todas as mudanças)
- ✅ Sem banco de dados (simplicidade)
- ✅ Aberto (qualquer um pode contribuir via PR)
- ✅ Futuro: editável via forms no site (salvando no repo)
vilanova/
├── public/data/ ← Fonte de verdade (usado pelo site)
│ ├── cantorias.json
│ ├── acervo.json
│ └── estilos.json
├── repentes/ ← Arquivos originais + transcrições
│ ├── cantorias.json (cópia para public/data/)
│ ├── acervo-estruturado.json (cópia para public/data/)
│ └── *.txt (transcrições)
└── estilos/ ← Documentação dos estilos
├── README.md
├── galope-beira-mar.md
├── oitava.md
├── martelo-alagoano.md
└── desafio-mote-decassilabos.md
Propósito: Lista simplificada de cantorias para overview rápido
Estrutura:
{
"cantorias": [
{
"id": "unique-id",
"titulo": "Nome da Cantoria",
"cantadores": [
{ "nome": "Cantador 1", "perfil": null }
],
"estilo": "Nome do Estilo",
"local": "Cidade, Estado",
"ano": 2023,
"duracao": "4:27",
"links": {
"youtube": "URL",
"spotify": null
},
"tags": ["tag1", "tag2"],
"descricao": "Descrição curta",
"destaque": true,
"transcricao_disponivel": true,
"transcricao_path": "/repentes/arquivo.txt"
}
],
"metadata": {
"total_cantorias": 8,
"com_transcricao": 8,
"com_youtube": 3
}
}Uso no site: Páginas de lista rápida, estatísticas gerais
Propósito: Dados completos com todas as estrofes estruturadas
Estrutura:
{
"repentes": [
{
"id": "unique-id",
"slug": "url-friendly-slug",
"titulo": "Título Completo",
"estilo": {
"nome": "Galope à Beira-Mar",
"slug": "galope-beira-mar",
"versos_por_estrofe": 10,
"metrica": "hendecassílabos (11 sílabas)",
"esquema_rima": "ABBAACCDDC",
"mote_fixo": "Texto do mote"
},
"cantadores": [
{
"nome": "Nome Completo",
"slug": "nome-slug",
"apelido": "Apelido"
}
],
"local": "Cidade, Estado",
"ano": 2023,
"contexto": "Descrição do contexto",
"estrofes": [
{
"numero": 1,
"cantador": "Nome do Cantador",
"versos": [
"verso 1",
"verso 2",
"..."
],
"tema": "Tema da estrofe"
}
],
"links": {
"youtube": "URL",
"spotify": null
},
"transcricao_path": "/repentes/arquivo.txt",
"destaque": true
}
],
"metadata": {
"total_repentes": 8,
"total_estrofes_catalogadas": 34
}
}Uso no site:
- Páginas de detalhe de cantorias
- Agregação de cantadores
- Busca em versos
- Análise de estilos por cantador
Propósito: Catálogo de estilos com informações técnicas
Estrutura:
{
"estilos": [
{
"slug": "galope-beira-mar",
"nome": "Galope à Beira-Mar",
"resumo": "Descrição curta",
"definicao": "Definição completa",
"historia": "História de origem",
"estrutura": {
"metrica": "hendecassílabos (11 sílabas)",
"versos_por_estrofe": 10,
"esquema_rima": "ABBAACCDDC",
"tonicas": "Posições 2, 5, 8 e 11",
"obrigatoriedade": "Regras especiais"
},
"dificuldade": "Avançado",
"nivel_numero": 3,
"exemplo": "Estrofe de exemplo completa",
"exemplo_autor": "Autor do exemplo",
"temas_comuns": ["tema1", "tema2"],
"curiosidade": "Fato interessante",
"cantorias_count": 4
}
],
"metadata": {
"total_estilos": 4,
"por_dificuldade": {
"intermediario": 1,
"avancado": 2,
"mestre": 1
}
}
}Uso no site:
- Páginas de lista e detalhe de estilos
- Informações técnicas em páginas de cantoria
- Guia educativo
Não há arquivo JSON de cantadores. São agregados dinamicamente de acervo.json:
// view/src/lib/cantadores.ts
export function agregarCantadores(cantorias: Cantoria[]): Cantador[] {
// Extrai cantadores únicos
// Conta cantorias por cantador
// Identifica estilos que cada um canta
// Encontra parceiros frequentes
// Calcula estatísticas
}Resultado:
{
slug: "valdir-teles",
nome: "Valdir Teles",
apelido?: "Apelido",
cantorias: [Cantoria, Cantoria],
estilos: ["Galope à Beira-Mar", "Martelo Alagoano"],
parceiros: [
{ nome: "Moacir", slug: "moacir", count: 1 },
{ nome: "Zé Cardoso", slug: "ze-cardoso", count: 1 }
],
stats: {
totalCantorias: 2,
totalEstrofes: 16,
estiloMaisFrequente: "Galope à Beira-Mar"
}
}// /cantorias
import acervoData from "../../../public/data/acervo.json";
const cantorias = acervoData.repentes;
// /estilos
import estilosData from "../../../public/data/estilos.json";
const estilos = estilosData.estilos;
// /cantadores
import acervoData from "../../../public/data/acervo.json";
import { agregarCantadores } from "../lib/cantadores";
const cantadores = agregarCantadores(acervoData.repentes);// /cantorias/:slug
const cantoria = acervoData.repentes.find(r => r.slug === slug);
// /estilos/:slug
const estilo = estilosData.estilos.find(e => e.slug === slug);
// /cantadores/:slug
const cantador = agregarCantadores(acervoData.repentes)
.find(c => c.slug === slug);/repentes/cantorias.json → /public/data/cantorias.json
/repentes/acervo-estruturado.json → /public/data/acervo.json
Quando editar: Copiar manualmente ou criar script:
cp repentes/cantorias.json public/data/cantorias.json
cp repentes/acervo-estruturado.json public/data/acervo.jsondocs/estilos/*.md → public/data/estilos.json (gerado manualmente)
Processo:
- Edite
docs/estilos/galope-beira-mar.md(documentação) - Atualize
/public/data/estilos.json(dados estruturados)
Futuro: Script automatizado de conversão
Cantoria
├─→ Cantadores (N:N)
├─→ Estilo (N:1)
└─→ Estrofes (1:N)
Cantador
└─→ Cantorias (N:N)
└─→ Estilos (agregado)
└─→ Parceiros (agregado)
Estilo
└─→ Cantorias (1:N)
└─→ Cantadores (agregado)
Todas as páginas incluem links para entidades relacionadas:
- Página de Cantoria: Links para cantadores individuais e estilo
- Página de Estilo: Links para cantorias e cantadores
- Página de Cantador: Links para cantorias, estilos e parceiros
- ✅ Dados vêm de JSON estático
- ✅ Renderização client-side (React)
⚠️ SEO limitado (conteúdo carrega em runtime)
- Listas permanecem dinâmicas
- Páginas de detalhe podem ser pré-renderizadas com script Deno
- SSG (Static Site Generation) para SEO perfeito
- Editar JSON diretamente
- Commit e push
- Site reflete mudanças automaticamente
- Form de edição no site
- Salva diretamente no repositório via API
- Commit automático
- Deploy automático
- Git como banco de dados
- JSON como formato de dados
- Markdown como documentação
- Agregação em runtime (cantadores)
- Sem build steps complexos
- Tudo versionado e auditável
Esta arquitetura garante simplicidade, transparência e facilita contribuições da comunidade.