Imported from AgusT613/personal-portfolio (
AGENTS.md). Install upstream withnpx skills add AgusT613/personal-portfolio. Copyright stays with the author.
AGENTS.md - GuĂa de Desarrollo y Arquitectura del Proyecto
Este documento es una guĂa exhaustiva para agentes de Inteligencia Artificial y desarrolladores de software que trabajen en este repositorio. Describe la arquitectura, patrones de diseño, convenciones de cĂłdigo, flujo de internacionalizaciĂłn, estilos y directrices para realizar cambios, ampliaciones o rediseños de manera consistente.
1. Resumen del Proyecto
- PropĂłsito: Portafolio personal y profesional de desarrollo de software de AgustĂn (Facundo) Torres.
- TecnologĂas Principales:
- Framework: Astro v7.2.4 (SSG - Static Site Generation).
- Estilos: Tailwind CSS v4.3.3 vĂa
@tailwindcss/vite+ CSS Modular y Scoped. - Lenguaje: TypeScript / JavaScript (ESM).
- TipografĂa: Roboto Slab gestionada mediante
fontProviders.fontsource()enastro.config.mjs. - Internacionalización (i18n): Sistema bilingüe nativo (Español
espor defecto, Inglésen).
2. Estructura del Directorio
Nota: Las carpetas
node_modules/,dist/,.astro/yprivate/contienen artefactos compilados, dependencias o datos privados. No deben modificarse manualmente ni versionarse.
personal-portfolio/
├── public/ # Archivos estáticos servidos directamente en la raĂz
│ ├── favicon.ico # Ícono del sitio
│ ├── portrait.jpg # Foto de perfil para la secciĂłn "Sobre MĂ"
│ ├── profile_image.png # Avatar principal del Hero
│ ├── torres-facundo-cv-en.pdf # CV descargable en inglés
│ ├── torres-facundo-cv-es.pdf # CV descargable en español
│ └── projects/ # Capturas y vistas previas de proyectos
│ ├── don_bosco_labs/
│ ├── ecommerce/
│ ├── entrevista_tecnica_uno/
│ └── itbank_homebanking/
├── src/
│ ├── components/ # Componentes reutilizables y secciones
│ │ ├── about_me/ # SecciĂłn "Sobre MĂ" (AboutMe.astro + about_me.css)
│ │ ├── experience/ # Sección de experiencia laboral / formación
│ │ ├── footer/ # Pie de página y enlaces de contacto
│ │ ├── header/ # Navegación lateral/superior fija y responsive
│ │ ├── hero/ # Banner principal de presentación
│ │ ├── icons/ # Componentes SVG de Ăconos y banderas de idiomas
│ │ ├── project/ # Sección y tarjetas de proyectos
│ │ ├── Badge.astro # Etiqueta visual para skills / tags
│ │ ├── CopyEmailBtn.astro # Botón interactivo para copiar email al portapapeles
│ │ ├── CustomActionBtn.astro # Botón base reutilizable con estilos comunes
│ │ ├── CustomH3.astro # TipografĂa H3 estandarizada y responsive
│ │ ├── CustomParagraph.astro # Párrafo base estilizado
│ │ ├── DownloadCVBtn.astro # Botón de descarga de CV con soporte i18n
│ │ ├── KeyWord.astro # Resaltador de palabras clave en texto
│ │ ├── LanguagePicker.astro # Selector desplegable de idioma
│ │ ├── MessageContainer.astro # Notificación flotante (toast) al copiar email
│ │ ├── TechnologiesUsed.astro # Lista de badges de tecnologĂas con Ăconos
│ │ ├── TitleSection.astro # TĂtulo de secciĂłn h2 unificado
│ │ └── ToggleMenu.astro # Botones colapsar/expandir menú lateral
│ ├── i18n/ # Sistema de internacionalización
│ │ ├── lang/
│ │ │ ├── english.ts # Diccionario de textos en inglés
│ │ │ └── spanish.ts # Diccionario de textos en español
│ │ ├── ui.ts # Configuración de lenguajes disponibles y ui map
│ │ └── utils.ts # Helpers getLangFromUrl() y useTranslations()
│ ├── layouts/
│ │ ├── Layout.astro # Layout principal HTML (Head, Header, Body, Footer)
│ │ └── layout.css # Estilos de la grilla principal (grid-wrapper)
│ ├── pages/
│ │ ├── [lang]/
│ │ │ └── index.astro # Página principal dinámica según idioma (/es, /en)
│ │ └── index.astro # Página raĂz (manejada por redirecciĂłn i18n de Astro)
│ ├── styles/
│ │ └── global.css # Import de Tailwind v4, fuentes y variables globales
│ ├── types/
│ │ └── index.ts # Interfaces TypeScript del dominio (IProject, IExperience, etc.)
│ ├── utils/
│ │ └── icons.js # Registro centralizado de Ăconos tecnolĂłgicos
│ └── env.d.ts # Declaraciones de tipos para el entorno Astro
├── astro.config.mjs # Configuración de Astro, i18n, Tailwind Vite y Fuentes
├── package.json # Dependencias y scripts del proyecto
├── tailwind.config.mjs # Configuración de animaciones y keyframes de Tailwind
└── tsconfig.json # Configuración de TypeScript
3. Arquitectura y Patrones Clave
3.1. Sistema de InternacionalizaciĂłn (i18n)
El proyecto utiliza un sistema de i18n basado en rutas (/[lang]):
- ConfiguraciĂłn en
astro.config.mjs:i18n: { defaultLocale: "es", locales: ["es", "en"], routing: { prefixDefaultLocale: true, redirectToDefaultLocale: true, }, } - Diccionarios (
src/i18n/lang/):- Todos los textos visibles en pantalla deben extraerse a
spanish.tsyenglish.ts. - Se utiliza una nomenclatura con notaciĂłn de puntos:
categoria.seccion.elemento(por ejemplo:hero.greeting,experience.red.mascotera.title).
- Todos los textos visibles en pantalla deben extraerse a
- Uso en Componentes:
--- import { getLangFromUrl, useTranslations } from "../../i18n/utils"; const t = useTranslations(getLangFromUrl(Astro.url)); --- <h2>{t("experience.section.title")}</h2>
3.2. Layout y Header Sticky Superior
- Estructura: Definida en
src/layouts/Layout.astroysrc/layouts/layout.cssconflex-direction: column. - Header Superior Sticky (
src/components/header/Header.astro+header.css):- Barra de navegaciĂłn fija en la parte superior (
position: sticky; top: 0; width: 100%; z-index: 50;) con efecto blur translĂşcido (backdrop-filter: blur(16px)). - Izquierda: Componente
LanguagePicker.astromostrando el Ăcono de idioma y el nombre del idioma activo con selector desplegable en CSS puro. - Centro / Derecha (Desktop > 768px): Enlaces horizontales directos a las secciones.
- MĂłvil (<= 768px): BotĂłn hamburguesa (
#drop-drown-btn) que abre el menĂş overlay a pantalla completa (#drop-down-nav-bar-container).
- Barra de navegaciĂłn fija en la parte superior (
3.3. DetecciĂłn de SecciĂłn Activa (Scroll Spy)
En src/pages/[lang]/index.astro, un script del cliente con IntersectionObserver monitorea la visibilidad de cada <section>. Al hacer scroll:
- Asigna la clase
current-section-focusedal enlace de navegaciĂłn correspondiente, aplicando un subrayado indicador y resaltado de color. - Maneja
document.onvisibilitychangepara pausar y reanudar el observador cuando la pestaña pierde foco.
3.4. Catálogo Centralizado de Íconos (src/utils/icons.js)
Los componentes de Ăconos SVG residen en src/components/icons/. Cada Ăcono propaga {...Astro.props} para aceptar clases Tailwind personalizadas.
Para evitar imports redundantes en mĂşltiples componentes, src/utils/icons.js exporta un objeto ICONS con objetos de tecnologĂa ({ icon, label }) y referencias directas a componentes de Ăconos.
3.5. Modelos de Datos (src/types/index.ts)
ITechnologiesUsed:{ icon: any; label: string; }IImage:{ src: string; alt: string; }IProjectLinks:{ href: string; label: string; icon: any; }IProject:{ name: string; description: string; technologies: ITechnologiesUsed[]; image: IImage; links: IProjectLinks[]; }IExperience:{ title: string; date: string; description: string; tags: string[]; settings: IExperienceSettings; }
4. GuĂa para Implementaciones y Modificaciones
4.1. CĂłmo agregar un nuevo Proyecto
- Guardar la imagen:
Colocar la imagen de vista previa en
public/projects/<nombre_proyecto>/preview.png. - Agregar los textos traducidos:
En
src/i18n/lang/spanish.tsysrc/i18n/lang/english.ts:// Spanish "project.<id>.description": "DescripciĂłn en español...", "project.<id>.img.alt": "Texto alternativo...", // English "project.<id>.description": "Description in English...", "project.<id>.img.alt": "Alt text...", - Registrar las tecnologĂas en
src/utils/icons.js: Si el proyecto usa una tecnologĂa nueva, crear su componente SVG ensrc/components/icons/<Tech>.astroy agregarlo al objetoICONS. - Agregar el objeto a la lista
PROJECTSensrc/components/project/ProjectSection.astro:{ name: "Nombre del Proyecto", description: t("project.<id>.description"), technologies: [ICONS.NextJS, ICONS.Tailwind], image: { src: "/projects/<nombre_proyecto>/preview.png", alt: t("project.<id>.img.alt"), }, links: [ { href: "https://github.com/...", label: "GitHub Frontend", icon: ICONS.GitHub, }, { href: "https://demo.vercel.app/", label: t("project.section.webpage.btn.label"), icon: ICONS.RedirectIcon, }, ], }
4.2. CĂłmo agregar una nueva Experiencia Laboral / FormaciĂłn
- Agregar textos i18n:
En
spanish.tsyenglish.ts:"experience.<id>.title": "...", "experience.<id>.date": "...", "experience.<id>.description": "...", - Agregar entrada en
EXPERIENCESensrc/components/experience/ExperienceSection.astro:{ title: t("experience.<id>.title"), date: t("experience.<id>.date"), description: t("experience.<id>.description"), tags: ["React", "TypeScript", "TailwindCSS"], settings: { hasProjectUrls: true, projectUrl: "https://...", }, }
4.3. CĂłmo agregar un nuevo Idioma
- Crear el archivo de traducciones
src/i18n/lang/<idioma>.ts. - Actualizar
src/i18n/ui.tsagregando la clave del idioma y exportándolo enui. - Actualizar
astro.config.mjsagregando el cĂłdigo de idioma ai18n.locales. - Actualizar
getStaticPaths()ensrc/pages/[lang]/index.astroagregando{ params: { lang: "<nuevo_idioma>" } }. - Agregar el Ăcono de la bandera en
src/components/icons/languages/e integrarlo ensrc/components/LanguagePicker.astro. - Añadir el archivo PDF del CV correspondiente en
public/y configurar su enlace en el diccionario.
5. Convenciones y Reglas de Desarrollo
5.1. Reglas Generales
- No duplicar textos hardcodeados: Cualquier texto legible por el usuario final debe pasar obligatoriamente por el sistema i18n (
t(...)). - Preservar la accesibilidad (a11y): Asegurarse de mantener atributos
aria-label,alten imágenes y enlaces semánticos contarget="_blank"y estructura jerárquica de encabezados (h1,h2,h3). - Consistencia de estilos: Utilizar Tailwind CSS v4 para espaciado, colores y tipografĂa. Para reglas de media query complejas vinculadas a componentes individuales, utilizar archivos
.csscomplementarios en la misma carpeta del componente. - Rendimiento e Interactividad: Astro favorece el envĂo de cero JavaScript por defecto. Mantener los scripts del cliente ligeros en
<script>nativos sin frameworks pesados innecesarios, a menos que se requiera interactividad compleja (en cuyo caso usar Astro Islands conclient:loadoclient:visible).
5.2. Scripts de NPM Disponibles
| Comando | DescripciĂłn |
|---|---|
npm run dev |
Inicia el servidor de desarrollo local de Astro. |
npm run build |
Compila el sitio estático para producción en la carpeta dist/. |
npm run preview |
Previsualiza localmente el build generado en dist/. |
npm run astro |
Ejecuta comandos CLI directos de Astro. |
6. Oportunidades de Mejora y Recomendaciones para Futuros Rediseños
Para agentes o desarrolladores que realicen mejoras en la base de cĂłdigo:
- Optimización de Imágenes con
astro:assets: Actualmente varias imágenes se cargan con<img>directo desde/public. Se recomienda migrar a<Image />o<Picture />deastro:assetsensrc/assets/para optimización automática de formatos (WebP/AVIF), lazy-loading y prevención de CLS. - Migración a Astro Content Collections:
Para proyectos y experiencias, migrar de arrays estáticos en componentes a colecciones tipadas (
src/content/projects/ysrc/content/experience/) con esquemas Zod ensrc/content.config.ts. - Tipado Estricto de ĂŤconos:
Refactorizar
src/utils/icons.jsa TypeScript (icons.ts) y sustituir los tiposanyensrc/types/index.tsporastro.HTMLAttributes<'svg'>oComponentde Astro. - Toast / Message Container State:
El botĂłn de copiado de email manipula clases CSS directamente. Se podrĂa encapsular como un Web Component autĂłnomo (
<copy-email-button>) o usar un custom event desacoplado.