Todos los cambios notables en este proyecto serán documentados en este archivo bajo el estándar Keep a Changelog.
.gitignore: Configuración base para omitir dependencias de Node, archivos de entorno local y directorios generados por los builds de Astro.LICENSE.md: Implementación de los términos de propiedad intelectual con reserva absoluta de derechos y validez legal bajo la normativa colombiana.README.md: Creación de la documentación inicial del proyecto, detallando la arquitectura de software, stack tecnológico e identidad de marca.CHANGELOG.md: Inicialización de este archivo para el seguimiento estructurado del ciclo de vida y control de versiones del repositorio.
- Estructura base del framework Astro configurada para Generación de Sitios Estáticos (SSG).
- Entorno de TypeScript estricto mediante el archivo
tsconfig.json. - Archivo de directrices operativas
CLAUDE.mdpara el contexto de asistentes de IA.
- Guía de inicialización en la documentación para reflejar el uso de pnpm en lugar de npm.
- Corregida la sección de estructura del repositorio en el
README.mdpara adaptarla a la configuración actual del entorno.
- Actualizada la sección del stack tecnológico en el
README.mdpara remover Tailwind CSS y referencias a plataformas externas de despliegue, reflejando el enfoque de CSS nativo y pnpm.
src/content.config.ts: Definición de Astro Content Collections para gestionar contenido multiidioma con esquema tipado (título, descripción, nombre de página, idioma, imagen OG).src/pages/index.astro: Enrutador principal de idiomas con detección automática basada enaccept-languageheader (defecto español). Incluye:- Diseño visual con gradiente atardecer-océano (8 pasos: púrpura oscuro → naranja → azul cielo)
- Esferas flotantes animadas con blur y opacidad
- Logo prominente (200x200px) con animación pulse
- Títulos y subtítulos con fuentes Plus Jakarta Sans e Inter Variable
- Botones de acción para rutas localizadas (es/en)
- Redirección automática comentada para activar en producción
scripts/builders/og-base.ts: Template actualizado para generación de imágenes OpenGraph con estética coherente:- Fondo con gradiente matching del sitio (135deg, 8 pasos)
- Esferas de fondo difuminadas (naranja y azul)
- Logo centrado de 120px con drop-shadow
- Tipografía Plus Jakarta Sans con gradiente de texto para headlines
- Layout vertical centrado
CLAUDE.md: Corregido gestor de paquetes depnpmaBuncon todos los comandos actualizados:bun install(instalar dependencias)bun run dev(servidor de desarrollo)bun run build(build para producción)bun run preview(previsualización)bun run prebuild(generar imágenes OG)
README.md:- Actualizado gestor de paquetes a Bun con descripción de ventajas
- Todos los comandos de pnpm → bun run
- Añadida sección "Generar Imágenes OG" con comando prebuild
- Completada y detallada la sección "Estructura del Repositorio" con árbol visual del proyecto incluyendo:
- Rutas localizadas (
en/,es/) - Estructura completa de
src/(layouts, pages, components, data, styles, assets) - Carpeta
scripts/con builders de OG images - Directorio
public/images/og/para imágenes generadas - Explicación de directorios clave
- Rutas localizadas (
- TypeScript estricto en todo el código
- Paleta de colores: Atardecer/Océano (#051c36, #0a1929, #5a2a60, #d65a3a, #ff8c42, #87ceeb)
- Animaciones CSS:
float(20s-30s) para esferas,pulse-logo(3s) para logo - Responsive: Media queries en 768px y 480px
src/components/ui/RouterPage.astroysrc/styles/router-page.css: nueva experiencia visual de transición inicial con fondo ambientado, marca, acciones de idioma y estado de detección del navegador.src/pages/404.astro: página 404 personalizada con la misma estética del router y acciones de retorno al inicio.public/images/og/en/home.pngypublic/images/og/es/home.png: actualización de las imágenes Open Graph de la home para reflejar la nueva identidad visual.
src/pages/index.astro: reemplazada la landing anterior por una vista de enrutamiento inicial que detecta el idioma del navegador y redirige a la ruta correspondiente.src/layouts/Layout.astro: ajuste del layout principal para incluir metadatos SEO más completos, tags de Open Graph/Twitter, carga de fuentes y configuración básica de Google Ads.src/styles/global.css: añadidos estilos base para el esquema de color oscuro, tipografía general y reset visual del documento.README.md: documentación actualizada para reflejar la estructura y los scripts del proyecto en su estado actual.package.json: configuración del proyecto ajustada para incluir dependencias y scripts alineados con la nueva experiencia y la generación de assets.
- Se incorporaron nuevas dependencias para tipografías avanzadas y Partytown.
- Se reorganizó la estructura de páginas para soportar una entrada de idioma más consistente en el flujo de navegación.
- Sistema de diseño "atardecer" modular en
src/styles/, repartido por responsabilidad para localizar cada cosa con facilidad:tokens.css: fuente de verdad del sistema — paleta cruda, temperatura (gradientes y resplandores del atardecer), color semántico, escala de spacing «marea», tipografía fluida, radios y elevación, movimiento (duraciones y curvas), grid de 12 columnas con breakout y capas z-index.reset.css: reset moderno del documento.base.css: estilos de elementos base — titulares con jerarquía real, cuerpo, enlaces con subrayado que «atardece», código/mono y foco visible accesible.layout.css: primitivas de composición (.u-gridcon breakout,.stack,.cluster,.section).tones.css: temperatura de sección ([data-tone]night/sea/sand) para que el sitio «atardezca» al hacer scroll.identity.css: helpers de identidad de marca (.text-sunset,.eyebrow).motion.css: accesibilidad del movimiento (prefers-reduced-motion).
src/styles/global.css: convertido en punto de entrada (barrel) que solo orquesta los parciales del sistema en orden de cascada; ya no contiene reglas propias.src/layouts/Layout.astro: carga de tipografías alineada a la variante variable de Plus Jakarta Sans.package.json: reemplazada la dependencia estática@fontsource/plus-jakarta-sanspor la variable@fontsource-variable/plus-jakarta-sans.
- Resolución de la tipografía Plus Jakarta Sans: el paquete variable no estaba declarado y el
@importcon specifier pelado fallaba en postcss (ENOENT), lo que rompía el renderizado de cualquier página que cargaraglobal.css. Ahora la dependencia se declara y las fuentes se importan por ruta explícita (.../index.css).
- La separación en parciales conserva el mismo orden de cascada que el archivo único anterior, sin cambios visuales.
- Los estilos específicos de componentes se cargan desde su propio componente (patrón ya usado por
router-page.css), no desde el barrel global.
src/components/global/Navbar.astroysrc/styles/navbar.css: cabecera responsiva del sitio — barra sticky translúcida con filo de atardecer, navegación con voz mono y numeración01/02/03, switch de idioma (ES↔EN) y CTA. En móvil (<60rem) la navegación se colapsa en un overlay a pantalla completa con bloqueo de scroll del documento; accesible por teclado (aria-expanded,inert, cierre conEscape).src/components/ui/CTA.astroysrc/styles/cta.css: botón de acción de marca «el faro del atardecer». Componente parametrizado (href/size) pero de estilo fijo: en reposo el atardecer orbita el contorno, una brasa arde en el interior, un haz de luz barre la superficie y un sol late junto al texto; al pasar/enfocar «rompe el molde» (se descuadra e inclina con una onda expansiva). Contraste AA en ambos estados y respetaprefers-reduced-motion.src/components/pages/Home.astroysrc/styles/home.css: composición de la página de inicio como única fuente de la verdad, parametrizada por idioma.
src/assets/logo.svg,public/favicon.svgypublic/favicon.ico: llaves separadas del sol para que el conjunto respire y quede más cuadrado y simétrico (antes parecía un «ojo» con pupila vertical).src/pages/es/index.astroysrc/pages/en/index.astro: reducidas a delegar en el componenteHomepasando el idioma, eliminando la estructura y los estilos duplicados entre ambas.src/data/i18n.tsysrc/data/locales/{es,en}.ts: ampliado el esquema connav.cta,nav.openMenu,nav.closeMenuyhero.eyebrow.
- Los estilos de cada componente se movieron a su propia hoja en
src/styles/importada desde el componente (patrón derouter-page.css); los componentes ya no llevan<style>inline. - El comportamiento de cliente (toggle del menú, bloqueo de scroll, medición de la altura de la barra) permanece colocado en el
<script>del propioNavbar.astro.
src/components/pages/NotFound.astroysrc/styles/not-found.css: página 404 «el náufrago». El «0» del 404 es el sol del logo hundiéndose en el horizonte; los «4» flotan como boyas y el mar (panel conbackdrop-filter) sumerge la mitad inferior. Textos y coordenadas de puerto en voz mono; una sola ruta con textos ES/EN según el navegador.src/components/pages/Router.astroysrc/styles/router.css: nueva página de entrada «la carta de navegación». Una brújula construida con el sol del logo (sus 8 rayos son la rosa de los vientos) busca el rumbo y, al detectar el idioma, la aguja se asienta (resorte amortiguado) sobre la orillaes/en. Responsive con contenedor acotado al viewport.src/styles/identity.css: helper.brand-mono— marca mínima «{ ctgcode }» para páginas fuera del flujo (router, 404); las llaves se abren al hover y se recogen al pulsar.src/styles/base.css: barra de scroll con estética de atardecer (pulgar ámbar→coral→ocaso sobre carril de mar profundo).src/components/ui/CTA.astroysrc/styles/cta.css: refracción térmica («aire caliente») sobre el texto del CTA al hover, con ruido de turbulencia que muta en el tiempo (SVGfeTurbulence+feDisplacementMap).src/data/i18n.tsysrc/data/locales/{es,en}.ts: seccionesnotFoundyrouteren el esquema y ambos idiomas.
src/pages/404.astroysrc/pages/index.astro: reducidas a delegar en los componentesNotFoundyRouter.src/pages/index.astro: la entrada detecta el idioma del navegador, orienta la brújula y redirige automáticamente (window.location.replace) a la ruta localizada.
- Bloqueo de la interacción en móvil por el long-press nativo de los
<a>: al mantener pulsado un enlace, el callout/preview y el arrastre nativos podían quedar colgados y capturar los toques, dejando el sitio inservible hasta recargar. Cortado a nivel global en eladebase.css(-webkit-touch-callout,-webkit-user-drag,touch-action: manipulation); los controles añadenuser-select: noneydraggable="false".
src/components/ui/RouterPage.astroysrc/styles/router-page.css: reemplazados por la nueva página de entrada (Router.astro/router.css).
- Las páginas fuera del flujo (
404, entrada) siguen el patrón del proyecto: ruta delgada → componente encomponents/pages/→ hoja propia ensrc/styles/. - Toda animación respeta
prefers-reduced-motion; en el CTA se apaga además el filtro SVG (que el@mediaglobal de movimiento no alcanza al SMIL).
src/components/global/Footer.astroysrc/styles/footer.css: cierre del sitio «el fondo del mar» — el opuesto de la navbar. El sol del logo se hunde tras el filo superior, la navegación son marcas de profundidad de una sonda (numeración01–04), un botón de luz fría (bioluminiscencia turquesa) vuelve a la superficie, y al fondo la marca «CTGCODE» yace medio hundida, recortada y disuelta por un mask hacia la oscuridad. Incluye la invitación de cierre con el CTA.src/styles/tones.css: nuevo tono de sección[data-tone="abyss"](un paso más hondo que la noche) para el footer.src/data/i18n.tsysrc/data/locales/{es,en}.ts: secciónfooteren el esquema y ambos idiomas.
src/data/locales/{es,en}.ts: elheroadopta el eslogan oficial de la marca — «Construyendo el futuro digital desde el Caribe» (título) y una descripción alineada («Desarrollo de software a la medida y soluciones web de alto rendimiento desde Cartagena para el mundo»). El<title>SEO de la home pasa a reflejar el eslogan.src/components/pages/Home.astro: monta elFooteral pie de la página.README.md: eslogan oficial en la introducción.
.github/workflows/deploy.yml: workflow de despliegue continuo a GitHub Pages (build de Astro y publicación automática en cada push amain).
astro.config.mjs:output: "static"explícito para el build de GitHub Pages.
- CI: dependencia
libasoundajustada para compatibilidad con la imagen reciente de Ubuntu en el runner de despliegue.
- Hero de la home «la mesa de trabajo a la hora dorada» (
src/components/pages/Home.astro+src/styles/home.css): la primera cara del sitio, con composición asimétrica sobre una rejilla de 12 columnas. Titular fragmentado en tres voces y tres sangrías (mono → display en gradiente → remate con cursor que respira) y una ventana de código desfasada en diagonal donde un snippet TypeScript se escribe en vivo (resaltado de sintaxis hecho en build, sin JS de librerías) y, al terminar, «compila»: el sol tras la ventana se enciende, la luz de estado vira a turquesa y la salida reporta200 OK. Decoradores de mesa de trabajo — sello circular giratorio, stickers de código pegados torcidos, coordenadas de Cartagena al margen y línea de horizonte —, microinteracciones con propósito y entrada escalonada; todo respetaprefers-reduced-motion. src/data/i18n.tsysrc/data/locales/{es,en}.ts: elherocrece con el snippet de código, el título segmentado, los estados de compilación, la salida del build y los chips.
- Responsive del hero: se saca el hero de
u-gridy se acota con su propio contenedor, de modo que la ventana de código ya no desborda en móvil (su scroll horizontal queda contenido dentro de la ventana). El titular en gradiente deja de recortar los descendentes (la «g» de «digital»).
- Ruteo por idioma sin redirección (SEO): el español (idioma por defecto) pasa a vivir en la raíz
/como contenido real e indexable, y los idiomas adicionales bajo/<lang>(por ahora/en). Se elimina la página de enrutamiento con redirección automática, que impedía a Google rastrear el contenido real del sitio. src/layouts/Layout.astro: el idioma llega por prop (no porAstro.params), lo que da URLs canónicas correctas por idioma; se añaden alternativashreflang(es-CO,en,x-default) yog:localedinámico para SEO multiidioma.theme-coloractualizado a#0a1c2b(el fondo real del sitio).NavbaryFooter: los enlaces y el intercambio de idioma se reconstruyen con el nuevo helper de rutas.src/data/i18n.ts: nuevo helperlocalizedPath(lang, subpath)como fuente única de rutas localizadas.
src/components/global/LangNotice.astroysrc/styles/lang-notice.css: aviso discreto que, solo si el idioma del navegador difiere del de la página y existe esa versión, invita a cambiar de idioma —en el idioma de destino—. No redirige de forma automática: solo cambia si el usuario pulsa, y recuerda el descarte.src/data/locales/{es,en}.ts: secciónlangNotice.
src/components/pages/Router.astroysrc/styles/router.css: la página de enrutamiento por redirección, ya innecesaria. También la rutasrc/pages/es/(el español ahora es la raíz) y la secciónrouterdel esquema i18n.
src/components/global/CookieBanner.astroysrc/styles/cookie-banner.css: banner de consentimiento de cookies. Aparece solo si el usuario aún no ha decidido; al aceptar o rechazar actualiza el consentimiento en gtag y guarda la preferencia (no se vuelve a preguntar). No bloquea la interacción y habla el idioma de la página.src/data/locales/{es,en}.ts: seccióncookies.
src/layouts/Layout.astro: implementado Google Consent Mode v2. El consentimiento arranca denegado (ad_storage,ad_user_data,ad_personalization,analytics_storage) antes de cargargtag.js; solo se concede si el usuario acepta, y la preferencia guardada se reaplica en cada visita. Los scripts de Google Tag pasan al hilo principal (el orden que exige el consentimiento no lo garantiza Partytown). El banner se monta en todas las páginas.src/components/global/LangNotice.astro: espera a que se resuelva el consentimiento de cookies antes de mostrarse, para no solapar dos avisos.
- Rendimiento · fuentes: se cargan solo por el eje
wght(wght.css; se descartan italic/opsz que no se usaban) y una sola vez (se elimina la importación duplicada entreLayoutyglobal.css). Se precargan (<link rel="preload">) los.woff2latin del contenido visible para mejorar LCP y CLS. El subconjunto latin ya se descargaba solo víaunicode-range. - Rendimiento · Google Tag:
gtag.jsse carga ahora de forma diferida (requestIdleCallbacko primera interacción). Elconsent default(denegado) y los comandosconfigse encolan de inmediato, así que no se pierde medición y el arranque deja de ejecutar ~90 KB de terceros en el hilo principal.
@astrojs/partytown: quedó sin uso al diferirgtag.js; se retira la integración deastro.config.mjsy la dependencia (menos peso muerto).
- Accesibilidad · contraste (AA):
- El
eyebrowsobre secciones claras ([data-tone="sand"]) usaba ámbar sobre crema (ilegible); ahora vira a un ocaso oscuro mediante el nuevo token--color-eyebrow. - El selector de idioma de la navbar sube de
--color-text-subtlea--color-text-muted. - Los índices numerados (
01/02…) de navbar y footer suben su opacidad de 0.55 a 0.75.
- El
- Accesibilidad · árbol para agentes: el aviso de idioma dejaba
role="status"sobre un<aside>(rol no apropiado para ese elemento); pasa a<div role="status">.
- SEO · dominio de producción:
siteConfig.urlpasa dehttp://localhost:4321ahttps://ctgcode.com. Las URLs canónicas, loshreflangy losog:urldejan de apuntar alocalhosty usan el dominio real; así casan con elsitemap-index.xmly elrobots.txtya generados.
- El footer absorbe el contacto y se convierte en el cierre de venta (
Footer.astro+footer.css): bajo «¿Zarpamos?» vive ahora el formulario de contacto (nombre, correo y «tu idea»), cuyo submit es el propio CTA «el faro del atardecer». Los campos son pozos en el lecho marino que se encienden en ámbar al enfocarlos, con etiquetas en la voz mono (// nombre). Al lado, el directorio en columnas: navegación (la sonda01–04), canales de atención (WhatsApp Business, Instagram, Facebook, LinkedIn y correo, con códigoswa/ig/fb/in/@) e información legal (Política de privacidad y Términos y condiciones, con rutas localizadas por idioma). - El ancla
#contactvive ahora en el footer: los CTA de la navbar y del hero aterrizan directamente en el formulario, en cualquier página que use el footer. src/components/pages/Home.astro: se elimina la sección independiente de contacto (absorbida por el footer).src/data/i18n.tsysrc/data/locales/{es,en}.ts: elfootercrece con el formulario (etiquetas y placeholders), los encabezados de grupo y los textos/slugs legales.