AstroGlass presenta un sistema de temas dinámicos altamente flexible construido sobre Tailwind CSS v4 y la arquitectura de componentes de Astro.
Visión General de la Arquitectura
El sistema de temas consta de tres capas principales:
- Registro de Temas: Definiciones para cada tema en
src/config/themes.ts. - Propiedades Personalizadas de CSS: Variables que reconocen el tema definidas en
src/styles/_themes.css. - Representación Dinámica: La página
[theme].astrorenderiza dinámicamente la variante correcta del componente para cada sección.
Registro de Temas
Cada tema se registra en src/config/themes.ts. Esto centraliza los metadatos de los temas y los hace disponibles para toda la aplicación.
- src/
- config/
- themes.ts
- config/
Cada definición de tema incluye:
export const themes: ThemeDefinition[] = [ { id: 'liquid', name: 'Liquid', color: 'from-blue-500 to-cyan-400', // Clases de gradiente de Tailwind icon: '💧', sections: ['Header', 'Hero', 'About', 'Features', 'Portfolio', 'Pricing', 'Testimonial', 'FAQ', 'CTA', 'Contact', 'Footer'], enabled: true, premium: false, description: 'Diseño orgánico y fluido con animaciones suaves', }, // Glass, Neo, Luxury, Minimal, Aurora...];Variables CSS
Los colores y los efectos específicos del tema se controlan mediante propiedades personalizadas CSS. Las variables se limitan a un atributo data-theme en la etiqueta <html> o <body>.
[data-theme="liquid"] { --p: 260 80% 60%; /* Primario */ --s: 310 80% 60%; /* Secundario */ --a: 190 90% 60%; /* Acento */ --b1: 220 20% 10%; /* Fondo base */ --bc: 220 20% 90%; /* Contenido base (texto) */}Los componentes las consumen a través de hsl(var(--p)) o utilidades de Tailwind:
<div class="bg-[hsl(var(--p))] text-[hsl(var(--bc))]"> Contenido Tematizado</div>Las variables usan nombres cortos (--p, --s, --a, --b1, --bc, --er, --su) para mantenerse consistentes con la convención de nomenclatura inspirada en DaisyUI que se utiliza a lo largo de todo el proyecto.
Representación Dinámica de Componentes
Las páginas de temas se renderizan mediante src/pages/[theme].astro. Este archivo utiliza un mapa de componentes para seleccionar dinámicamente la variante correcta para cada sección:
---const componentMap = { liquid: { Header: HeaderLiquid, Hero: HeroLiquid, About: AboutLiquid, Features: FeaturesLiquid, // ... las 12+ secciones }, glass: { /* ... */ }, neo: { /* ... */ }, luxury: { /* ... */ }, minimal: { /* ... */ }, aurora: { /* ... */ },};
const components = componentMap[themeId];---
<components.Header /><components.Hero /><components.About /><!-- ... -->Cada variante de sección es un componente autónomo de Astro. Se usa useTranslations() de forma interna para todo el texto — no se necesitan propiedades externas (props). Esto permite que cada tema pueda tener estructuras HTML completamente diferentes a la vez que se mantiene una API uniforme.
Creación de un Nuevo Tema
-
Añadir la Definición del Tema
Añada el objeto de definición del tema a
src/config/themes.ts. -
Definir Variables CSS
Defina las variables CSS del nuevo tema en
src/styles/_themes.css. -
Crear Componentes de la Sección
Cree nuevas variantes específicas del tema del componente para cada sección cruzada de base, por ej.,
src/components/sections/hero/HeroMiTema.astro. -
Registrarlo en el Mapa de Componentes
Agregue los componentes del nuevo tema al registro de
componentMapque está adentro desrc/pages/[theme].astro. -
Añadir Traducciones
Añade y actualiza en listado cualquier cadena para que esta sea una de nueva entrada en la traducción local de este archivo respectivo y añada dentro su representación nueva localizada correspondiente JSON para
src/locales/.