AstroGlass se caractérise par un système de thèmes dynamique hautement flexible, construit sur Tailwind CSS v4 et l’architecture des composants d’Astro.
Aperçu de l’Architecture
Le système de thèmes se compose de trois couches principales :
- Registre des Thèmes : Définitions pour chaque thème dans
src/config/themes.ts. - Propriétés Personnalisées CSS : Variables sensibles aux thèmes définies dans
src/styles/_themes.css. - Rendu Dynamique : La page
[theme].astrorend dynamiquement la variante correcte du composant pour chaque section.
Registre des Thèmes
Chaque thème est enregistré dans src/config/themes.ts. Cela centralise les métadonnées du thème et les rend disponibles pour l’ensemble de l’application.
- src/
- config/
- themes.ts
- config/
Chaque définition de thème comprend :
export const themes: ThemeDefinition[] = [ { id: 'liquid', name: 'Liquid', color: 'from-blue-500 to-cyan-400', // Classes de dégradé Tailwind icon: '💧', sections: ['Header', 'Hero', 'About', 'Features', 'Portfolio', 'Pricing', 'Testimonial', 'FAQ', 'CTA', 'Contact', 'Footer'], enabled: true, premium: false, description: 'Design fluide, organique avec des animations douces', }, // Glass, Neo, Luxury, Minimal, Aurora...];Variables CSS
Les couleurs et les effets spécifiques aux thèmes sont contrôlés par des propriétés personnalisées CSS. Les variables sont limitées à un attribut data-theme sur la balise <html> ou <body>.
[data-theme="liquid"] { --p: 260 80% 60%; /* Primaire */ --s: 310 80% 60%; /* Secondaire */ --a: 190 90% 60%; /* Accent */ --b1: 220 20% 10%; /* Arrière-plan de base */ --bc: 220 20% 90%; /* Contenu de base (texte) */}Les composants les consomment via hsl(var(--p)) ou les utilitaires Tailwind :
<div class="bg-[hsl(var(--p))] text-[hsl(var(--bc))]"> Contenu Thématique</div>Les variables utilisent des noms courts (--p, --s, --a, --b1, --bc, --er, --su) pour rester cohérentes avec la convention de nommage inspirée de DaisyUI utilisée dans tout le projet.
Rendu Dynamique des Composants
Les pages de thèmes sont générées par src/pages/[theme].astro. Ce fichier utilise une carte de composants pour sélectionner dynamiquement la variante correcte pour chaque section :
---const componentMap = { liquid: { Header: HeaderLiquid, Hero: HeroLiquid, About: AboutLiquid, Features: FeaturesLiquid, // ... les 12+ sections }, glass: { /* ... */ }, neo: { /* ... */ }, luxury: { /* ... */ }, minimal: { /* ... */ }, aurora: { /* ... */ },};
const components = componentMap[themeId];---
<components.Header /><components.Hero /><components.About /><!-- ... -->Chaque variante de section est un composant Astro autonome. Il utilise useTranslations() en interne pour tout le texte — aucune prop externe n’est nécessaire. Cela permet à chaque thème d’avoir des structures HTML complètement différentes tout en maintenant une API uniforme.
Créer un Nouveau Thème
-
Ajouter la Définition du Thème
Ajoutez l’objet de définition du thème à
src/config/themes.ts. -
Définir les Variables CSS
Définissez les variables CSS du nouveau thème dans
src/styles/_themes.css. -
Créer des Composants de Section
Créez des variantes de composants spécifiques au thème pour chaque section, par ex.,
src/components/sections/hero/HeroMonTheme.astro. -
Enregistrer dans la Carte des Composants
Ajoutez les composants du nouveau thème au
componentMapdanssrc/pages/[theme].astro. -
Ajouter des Traductions
Ajoutez toute nouvelle chaîne localisée aux fichiers JSON dans
src/locales/.