Gestione dei Colori e Stili - lucadileo9/template-catalog GitHub Wiki

Panoramica

Questa documentazione descrive il sistema di stili e temi utilizzato nel progetto, pensato per supportare template completamente diversi tra loro, mantenendo però una base tecnica comune.

Il cuore del sistema è basato su:

  • Tailwind CSS per la parte utility-first
  • Variabili CSS (HSL) per gestire i colori in modo dinamico
  • ShadCN/UI per componenti riutilizzabili e facilmente tematizzabili

🎯 Obiettivo principale

Permettere a ogni template (evento, estetista, associazione, ecc.) di mostrarsi con un proprio look-and-feel distintivo — colore, font, layout — senza duplicazioni di codice e mantenendo pulitezza architetturale.

💡 Perché lo abbiamo fatto così?

La scelta di usare variabili HSL + Tailwind permette una personalizzazione avanzata dei colori senza dover ridefinire manualmente ogni classe. Inoltre, grazie al wrapping tramite classi come .template-evento, possiamo applicare stili specifici solo laddove necessario, evitando conflitti globali.


🛠️ Tecnologie utilizzate

Questo sistema tematico si basa su una combinazione mirata di strumenti moderni e flessibili:

✅ Next.js (App Router)

Supportiamo la nuova App Router di Next.js, dove i template sono organizzati in sotto-directory e caricati dinamicamente tramite [slug].

✅ Tailwind CSS

Usiamo Tailwind come framework principale per gli stili. I colori e le utility vengono estesi per supportare i temi definiti con CSS variables.

🔧 Configurazione speciale:
Tailwind è configurato per riconoscere i colori tramite hsl(var(--nome)), grazie all’estensione nel file tailwind.config.js. Questo approccio è ispirato alla struttura di ShadCN/UI.

✅ ShadCN/UI

I componenti dell’app seguono lo stile di ShadCN/UI, che a sua volta si basa su Radix UI e Tailwind.
ShadCN fornisce componenti stilizzabili che reagiscono automaticamente ai cambiamenti delle variabili CSS.

Esempio: Cambiando --primary in un tema, tutti i componenti che usano bg-primary cambieranno colore.

✅ Mix tra Tailwind e CSS custom

Oltre alle utility class, alcuni stili complessi (come gradienti o animazioni) vengono definiti direttamente in file CSS dedicati, usando sempre le stesse variabili.


#. 🎨 Architettura del sistema

🔄 Cos’è un “tema” in questo sistema?

Un "tema" rappresenta l’insieme degli stili che vengono applicati a un singolo template (evento, estetista, ecc.).
Ogni tema ha:

  • Un proprio file CSS (global.css)
  • Una classe wrapper nel file style.css (template-evento, template-estetista)
  • Una palette di colori definita con variabili HSL

🧩 Come funziona il caricamento

Ogni volta che un template viene caricato nel suo file layout è presente ad esempio

import '@evento/styles/globals.css';

Il che permette di importare la classe css con i temi/colori del template evento, che quindi potrà essere assegnata all'interno del codice Esempio:

<div className="template-evento">
  <Button>Cliccami</Button>
</div>

In questo caso, il button userà il colore --primary definito nel file di stile dell'evento.


⚙️ Struttura logica

app/
 └── globals.css         ← importa tutti i temi
/template
   └── evento/
         └── app/
              └── layout.tsx    ← usa className="template-evento"
         └── styles/
              └── global.css    ← definisce --background, --primary, ecc.

🌈 Definizione dei temi

Ogni template del progetto (evento, estetista, associazione, ecc.) è associato a un proprio tema CSS, definito come un set di variabili all’interno di file .css dedicati.

Queste variabili permettono a Tailwind (e quindi anche a ShadCN) di generare gli stili in base al template corrente.

✨ Cos’è un tema CSS?

Un “tema” è semplicemente un blocco di codice CSS che ridefinisce alcune variabili:

.template-evento: {
  --background: 210 30% 94%;
  --foreground: 145 30% 10%;
  --primary: 145 70% 45%;
  --primary-foreground: 0 0% 98%;
  --secondary: 140 25% 85%;
  --secondary-foreground: 145 30% 10%;
....
}

Così facendo, ogni componente che usa Tailwind (bg-primary, text-secondary, ecc.) si adatta automaticamente al tema.

🎯 Regole per una buona definizione del tema

  • Usa sempre .template-nome: per legarlosolo al template corrispondente.
  • Mantieni coerenza tra i colori usati (es. primari/secondari/muted).
  • Abbiamo deciso di utilizzare il formato esadecimale dei colori, perché più leggibile e comodo.

🧱 Applicazione del tema ai template

Per applicare un tema dinamicamente, basta aggiungere una classe al layout del template che stai caricando — questa classe attiverà il tema definito nel relativo file CSS.

🛠 Esempio pratico

File: /template/evento/layout.tsx

export default function EventoLayout({ children }: { children: React.ReactNode }) {
  return (
    <div className="template-evento">
      {children}
    </div>
  )
}

File: /template/estetista/layout.tsx

export default function EstetistaLayout({ children }: { children: React.ReactNode }) {
  return (
    <div className="template-estetista">
      {children}
    </div>
  )
}

Tailwind e ShadCN reagiranno al contesto in cui sono inclusi:
Se sei sotto <div class="template-evento">, i colori saranno quelli dell’evento;
se sei in <div class="template-estetista">, seguiranno lo stile estetista.


🖌️ Utilizzo delle variabili fuori dalle utility Tailwind

Tailwind genera classi stile bg-primary, text-secondary, ecc., solo se hai definito quelle variabili nel tailwind.config.js. Fuori da quel sistema, non puoi usarle direttamente come bg-[var(--primary)].

Tuttavia, puoi tranquillamente usare variabili definite a parte in JSX inline style, specie per casi avanzati come gradienti, shadow o animazioni complesse.

🪄 Esempio: gradiente viola fatto a mano con HSL

Immagina di voler creare un componente con uno sfondo a gradiente tra viola chiaro e viola scuro.

✅ Variabili definite nel tema

.template-evento: {
  --viola-chiaro: 240 100% 80%;     /* Viola chiaro */
  --viola-scuro: 240 100% 20%;     /* Viola scuro */
}

🧱 Usa il gradiente in JSX con style

export default function GradientBox() {
  return (
    <div style={{
      backgroundImage: 'linear-gradient(to bottom, hsl(var(--viola-chiaro)), hsl(var(--viola-scuro)))',
      padding: '2rem',
      color: 'white',
      borderRadius: '0.5rem'
    }}>
      Questo è un box con gradiente viola personalizzato.
    </div>
  )
}

Così, il gradiente funziona indipendentemente da Tailwind, e rispetta i valori definiti nel tema.


⚠️ Limitazioni da tenere a mente

❌ Non puoi fare: bg-[var(--nome)] → Tailwind non lo riconosce ✅ Puoi però usare: style={{ backgroundColor: 'hsl(var(--nome))' }} 🎯 Le utility Tailwind vanno sempre definite in tailwind.config.js per funzionare.


⚠️ **GitHub.com Fallback** ⚠️