Catálogo vivo das seções e componentes que já rodaram em produção nos meus sites. Existe para responder rápido a duas perguntas:
- "Já fiz isso antes?" →
CATALOGO.md - "Como era mesmo?" → a ficha do componente, com código, padrão editorial e as armadilhas.
Cada componente entra aqui normalizado: mesmos tokens, mesmos prefixos, mesmos ganchos de movimento. É o que permite juntar um hero de um projeto com um leque de outro e um rodapé de um terceiro sem conflito de CSS.
No ar: https://biblioteca-sites.pages.dev
Como navegar
| Onde | Para quê |
|---|---|
index.html |
o showroom — tudo rodando lado a lado, com busca |
CATALOGO.md |
índice por categoria e fila |
catalogo.json |
o mesmo índice, para busca automática |
CLAUDE.md |
o contrato — token, grid, prefixo, movimento, JS |
core/ |
o que todo site herda: tokens, base, movimento, primitivas, temas |
_modelo/ |
esqueleto para catalogar um componente novo |
projetos/ |
o que saiu de cada site de origem |
No repo, leia os .md. No site publicado, cada .md tem um .html irmão, gerado, com os links já reescritos entre si.
Consumir por HTTP
O site é estático e o rastreamento é liberado, então uma sessão de IA sem o repo na máquina resolve tudo por URL:
https://biblioteca-sites.pages.dev/catalogo.json
https://biblioteca-sites.pages.dev/CLAUDE.html
https://biblioteca-sites.pages.dev/componentes/hero/full-bleed-media/ficha.html
O site não é indexado por buscador — isso vem do X-Robots-Tag no _headers, não de um bloqueio no robots.txt. O motivo dessa escolha está comentado nos dois arquivos.
Usar num site novo
1. copie core/tokens.css + core/base.css + core/motion.css + core/motion.js
2. duplique core/temas/_modelo.css → core/temas/<cliente>.css e preencha cores e fontes
3. escolha as seções no CATALOGO.md
4. cole markup.html + estilo.css + script.js de cada uma
5. troque fotos e textos seguindo o "padrão editorial" da ficha
A ordem das folhas importa: tokens → tema → base → motion → componentes.
Regra que sustenta tudo: o componente nunca é editado para caber no cliente. Quem muda é o tema. Se o tema não resolve, o componente ganha uma variação documentada na ficha — não um remendo local.
O conteúdo dos markup.html é fictício de propósito, dimensionado para o layout. Nenhum deles traz dado de cliente real.
Catalogar algo novo
Copie _modelo/ para componentes/<categoria>/<nome>/, preencha, e rode os dois geradores:
python bin/indice.py # catalogo.json + CATALOGO.md + showroom + as fichas em HTML
bash bin/previews.sh # preview.html de cada componente, a partir do markup.html
python bin/valida.py # confere que nenhum caminho relativo aponta para o vazio
O que é gerado e nunca se escreve à mão: catalogo.json, as tabelas do catálogo, os cards e os filtros do showroom, os preview.html e todos os .html de ficha. A fonte é o componente.json, o markup.html e o .md. O que se escreve à mão é a ficha e o código.
Fluxo completo em CLAUDE.md §9.
Dependência de geração
bin/indice.py precisa de uma biblioteca para converter as fichas em HTML:
python -m pip install markdown
É a única dependência do projeto, e ela existe só na sua máquina, na hora de gerar. Nada disso vai para o ar: o que é servido continua sendo HTML, CSS e JS sem dependência externa — e o Content-Security-Policy do _headers transforma isso em regra do servidor.
Publicar
O site é o próprio repositório: sem build, sem passo de deploy. O Cloudflare Pages está ligado ao GitHub e publica sozinho a cada git push na main.
python bin/indice.py && bash bin/previews.sh && python bin/valida.py
git add -A && git commit -m "..." && git push
O deploy leva menos de um minuto. Se você mexeu num .md, num componente.json ou num markup.html e não rodou os geradores, o que vai ao ar fica velho — o Pages não roda build, o que está no repo é o que é servido.
| Projeto Pages | biblioteca-sites |
| Repositório | bielera/biblioteca-sites (privado) |
| Branch de produção | main |
| Build command | nenhum |
| Output directory | / (a raiz) |
O conteúdo é público; o repositório continua privado.
Se o site parar de acompanhar os commits
Sintoma: você faz push, o GitHub mostra o check Cloudflare Pages · Deploy successful, e mesmo assim biblioteca-sites.pages.dev continua no estado antigo.
Não é falha de build. É a branch de produção do projeto não estar em main: os deploys saem como preview, cada um numa URL própria (<hash>.biblioteca-sites.pages.dev), e a produção fica congelada no primeiro.
Como confirmar em dez segundos:
python bin/valida-ar.py
Ele compara o que está no ar com o disco por conteúdo. Se acusar dezenas de divergentes e ausentes logo depois de um push bem-sucedido, é isto.
O conserto é no painel, em Settings → Builds & deployments → Production branch → main. Não há como fazer pela CLI: wrangler não configura a integração Git de um projeto Pages.
Por que o bin/valida-ar.py olha conteúdo, e não o código de status
O site responde 200 para qualquer endereço, servindo o index.html no lugar (SPA fallback). Um teste que só olhasse o status passaria com 100% mesmo com o deploy inteiro faltando — foi exatamente o que aconteceu aqui antes de a ferramenta existir.
Há um 404.html na raiz para o Pages servir um erro de verdade. Se mesmo assim uma URL inexistente devolver o showroom com 200, o projeto está em modo SPA (not_found_handling) e só o painel resolve.
Ver rodando local
python -m http.server 4380
E abra http://localhost:4380/. Há um .claude/launch.json com o nome biblioteca para o preview do Claude Code.
Os previews abrem com duplo-clique também, sem servidor — inclusive a busca do showroom, que filtra o DOM em vez de buscar o catalogo.json justamente para isso.
Fonte licenciada dando 404 é esperado. O .gitignore cobre core/temas/fontes/ e o @font-face do tema aponta para lá. Os previews caem no fallback da pilha e continuam legíveis. Não conserte subindo as fontes.
Stack
HTML estático, CSS puro com custom properties, JS vanilla em IIFE. Sem framework, sem build, sem dependência externa em produção. O alvo é um snippet que cola igual em página estática, em .astro ou em bloco HTML do Elementor.
Estado
| Componentes catalogados | 25 — 17 estáveis, 3 experimentais, 4 externos, 1 em revisão |
| Categorias com conteúdo | 11 de 11 |
| Sem JavaScript | 10 de 25 |
| Projetos varridos | 2 de 7 (Liberta Wealth e Gabriel Rocha Studio) |
| Dependências em produção | 0 |
O que falta em cada frente está no fim do CATALOGO.md.