Skip to content

Commit 4bafdb8

Browse files
committed
docs: update README.md, add CLAUDE.md, and fix formatting
1 parent 2ab88d3 commit 4bafdb8

3 files changed

Lines changed: 136 additions & 2 deletions

File tree

CLAUDE.md

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
# CLAUDE.md - Guía de Desarrollo
2+
3+
## Descripción del Proyecto
4+
5+
Landing page informativa sobre "Vibe Coding" basada en el trabajo de Peter Wong.
6+
Proyecto construido con Deno Fresh con soporte para internacionalización
7+
(español e inglés) y tema oscuro.
8+
9+
## Stack Tecnológico
10+
11+
- **Runtime**: Deno
12+
- **Framework**: Fresh 1.7.3
13+
- **UI**: Preact 10.22.0
14+
- **CSS**: Tailwind CSS 3.4.1
15+
- **Deployment**: Cloudflare Workers (via Wrangler)
16+
17+
## Convenciones de Código
18+
19+
### Componentes Fresh
20+
21+
- **Components** (`/components/`): Componentes estáticos renderizados en
22+
servidor
23+
- **Islands** (`/islands/`): Componentes interactivos que se hidratan en cliente
24+
- Usar `PageProps` con generics para tipado de props en rutas
25+
- Handler functions en `Handlers<Data, MiddlewareState>`
26+
27+
### Nomenclatura
28+
29+
- Archivos: PascalCase (ej: `Footer.tsx`, `DarkMode.tsx`)
30+
- Componentes: PascalCase export default
31+
- Funciones utilities: camelCase
32+
- Interfaces: PascalCase con sufijo `Props` para componentes
33+
34+
### Props de Componentes
35+
36+
Usar interfaces explícitas con `readonly` para propiedades de solo lectura:
37+
38+
```tsx
39+
interface SectionWrapperContentProps {
40+
readonly title?: string;
41+
readonly attrClass?: string;
42+
readonly children: preact.ComponentChildren;
43+
}
44+
```
45+
46+
### Internacionalización
47+
48+
- Archivos JSON en `/locales` con estructura anidada por sección
49+
- Función `t(lang)` en `utils/i18n.ts` para cargar traducciones
50+
- Fallback automático a español si el idioma no existe
51+
- Usar `dangerouslySetInnerHTML` con `deno-lint-ignore react-no-danger` para
52+
HTML en traducciones
53+
54+
### Dark Mode
55+
56+
- Implementado con Tailwind `dark:` classes
57+
- Estado guardado en `localStorage` con key `theme`
58+
- Detecta preferencia del sistema via `prefers-color-scheme`
59+
60+
## Comandos Importantes
61+
62+
```bash
63+
deno task start # Desarrollo con hot-reload
64+
deno task check # Fmt + Lint + Type check (verificación completa)
65+
deno task build # Build de producción
66+
deno task deploy # Desplegar a Cloudflare Workers
67+
deno fmt # Formatear código
68+
deno lint # Verificar lint
69+
deno check **/*.ts # Verificar tipos
70+
```
71+
72+
## Patrones Comunes
73+
74+
### Ruta con Middleware State
75+
76+
```tsx
77+
interface MiddlewareState {
78+
lang: string;
79+
translations: typeof translations;
80+
}
81+
82+
interface Data {
83+
languages: string[];
84+
}
85+
86+
export const handler: Handlers<Data, MiddlewareState> = {
87+
async GET(_, ctx) {
88+
const languages = await getLanguages();
89+
return ctx.render({ languages });
90+
},
91+
};
92+
93+
export default function Home(
94+
{ state, data }: PageProps<Data, MiddlewareState>,
95+
) {
96+
// state contiene lang y translations del middleware
97+
// data contiene los datos del handler
98+
}
99+
```
100+
101+
### Componente Island con useEffect
102+
103+
```tsx
104+
"use client";
105+
import { useEffect, useState } from "preact/hooks";
106+
107+
export default function Component() {
108+
const [state, setState] = useState(initialValue);
109+
110+
useEffect(() => {
111+
// Efectos de cliente
112+
}, []);
113+
114+
return <button onClick={() => setState(!state)}>Toggle</button>;
115+
}
116+
```
117+
118+
## Archivos Importantes
119+
120+
- `deno.json` - Configuración de tareas, imports y lint
121+
- `fresh.config.ts` - Plugins de Fresh (Tailwind)
122+
- `tailwind.config.ts` - Configuración de Tailwind
123+
- `wrangler.jsonc` - Configuración de Cloudflare Workers
124+
- `.github/workflows/deploy.yml` - Pipeline de CI/CD
125+
126+
## Notas de Deployment
127+
128+
- El proyecto está configurado para Cloudflare Workers
129+
- Secrets necesarios para Wrangler si se agregan
130+
- El archivo `static/styles.css` es generado por Tailwind durante el build

routes/[lang]/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ export const handler: Handlers<Data, MiddlewareState> = {
2424
},
2525
};
2626

27-
export default function Home({ state, data }: PageProps<Data, MiddlewareState>) {
27+
export default function Home(
28+
{ state, data }: PageProps<Data, MiddlewareState>,
29+
) {
2830
const { lang, translations } = state;
2931
const { languages } = data;
3032
return (

routes/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ export const handler: Handlers<Data, MiddlewareState> = {
2323
},
2424
};
2525

26-
export default function Home({ state, data }: PageProps<Data, MiddlewareState>) {
26+
export default function Home(
27+
{ state, data }: PageProps<Data, MiddlewareState>,
28+
) {
2729
const { lang, translations } = state;
2830
const { languages } = data;
2931
return (

0 commit comments

Comments
 (0)