Landing page informativa sobre "Vibe Coding" basada en el trabajo de Peter Wong. Proyecto construido con Deno Fresh con soporte para internacionalización (español e inglés) y tema oscuro.
- Runtime: Deno
- Framework: Fresh 1.7.3
- UI: Preact 10.22.0
- CSS: Tailwind CSS 3.4.1
- Deployment: Cloudflare Workers (via Wrangler)
- Components (
/components/): Componentes estáticos renderizados en servidor - Islands (
/islands/): Componentes interactivos que se hidratan en cliente - Usar
PagePropscon generics para tipado de props en rutas - Handler functions en
Handlers<Data, MiddlewareState>
- Archivos: PascalCase (ej:
Footer.tsx,DarkMode.tsx) - Componentes: PascalCase export default
- Funciones utilities: camelCase
- Interfaces: PascalCase con sufijo
Propspara componentes
Usar interfaces explícitas con readonly para propiedades de solo lectura:
interface SectionWrapperContentProps {
readonly title?: string;
readonly attrClass?: string;
readonly children: preact.ComponentChildren;
}- Archivos JSON en
/localescon estructura anidada por sección - Función
t(lang)enutils/i18n.tspara cargar traducciones - Fallback automático a español si el idioma no existe
- Usar
dangerouslySetInnerHTMLcondeno-lint-ignore react-no-dangerpara HTML en traducciones
- Implementado con Tailwind
dark:classes - Estado guardado en
localStoragecon keytheme - Detecta preferencia del sistema via
prefers-color-scheme
deno task start # Desarrollo con hot-reload
deno task check # Fmt + Lint + Type check (verificación completa)
deno task build # Build de producción
deno task deploy # Desplegar a Cloudflare Workers
deno fmt # Formatear código
deno lint # Verificar lint
deno check **/*.ts # Verificar tiposinterface MiddlewareState {
lang: string;
translations: typeof translations;
}
interface Data {
languages: string[];
}
export const handler: Handlers<Data, MiddlewareState> = {
async GET(_, ctx) {
const languages = await getLanguages();
return ctx.render({ languages });
},
};
export default function Home(
{ state, data }: PageProps<Data, MiddlewareState>,
) {
// state contiene lang y translations del middleware
// data contiene los datos del handler
}"use client";
import { useEffect, useState } from "preact/hooks";
export default function Component() {
const [state, setState] = useState(initialValue);
useEffect(() => {
// Efectos de cliente
}, []);
return <button onClick={() => setState(!state)}>Toggle</button>;
}deno.json- Configuración de tareas, imports y lintfresh.config.ts- Plugins de Fresh (Tailwind)tailwind.config.ts- Configuración de Tailwindwrangler.jsonc- Configuración de Cloudflare Workers.github/workflows/deploy.yml- Pipeline de CI/CD
- El proyecto está configurado para Cloudflare Workers
- Secrets necesarios para Wrangler si se agregan
- El archivo
static/styles.csses generado por Tailwind durante el build