Documentazione · src/engine/styling
Stili e classi
Da dove nascono le classi, e perché non esiste una safelist da mantenere. Tre file nel motore e due store che Tailwind legge direttamente.
Le classi le genera Tailwind, dagli store
Non esiste una safelist. Tailwind fa `@source` direttamente sui file dello Studio — `db.viewmodes.json` e `db.styles.json` — e genera esattamente le classi che i viewMode e gli stili usano davvero.
Due conseguenze. In produzione il CSS è minimale per costruzione: nessuno deve ricordarsi di potarlo. E le varianti arbitrarie (`[&_p]:m-0`, `hover:text-primary`) funzionano senza doverle enumerare, perché Tailwind le vede scritte nel file.
È anche il motivo per cui gli store sono file e non righe di database, ed è la dipendenza più importante da non rompere: spostare la forma in database significherebbe reintrodurre la safelist il giorno stesso.
Il `className` è configurazione, non relazione
Il campo `className` di un viewMode o di un’istanza è una stringa di classi Tailwind. Non è validato contro un elenco, e non perché ci si fidi: le classi vivono negli store, che sono la stessa sorgente da cui Tailwind le genera. Se le scrivi lì, esistono.
Sull’ISTANZA di un blocco il `className` si somma a quello del viewMode. Serve per lo scostamento locale — una spaziatura, un colore su questa sezione e non sulle altre. Quando lo stesso scostamento compare tre volte, non è più uno scostamento: è uno stile, e va nella style guide.
styling/resolveStyles.ts— la composizione libera passa verbatim: nessuna safelist contro cui validarestyling/resolveViewModeStyles.ts— gli stili dichiarati dal viewMode e dai suoi slot
La style guide: uno stile nominato, un punto solo
Gli aspetti RICORRENTI — ombra, raggio, superficie, bordo, tipografia — non si scrivono come classi nel `className` di ogni viewMode. Si definiscono una volta come stili nominati in `db.styles.json` e si richiamano per nome dal viewMode o dallo slot.
Il guadagno è la propagazione: modifichi lo stile in un punto e cambiano tutti i viewMode che lo includono. Lo stile diventa la fonte di verità dell’aspetto, invece della classe copiata in trenta posti — che è la forma in cui l’aspetto si perde nel tempo.
Ogni stile ha una categoria: Tipografia, Elevazione, Contorno, Superfici, o Generico per i compositi. Essendo il motore su elementi determinati, sapere quali TIPI di aspetto esistono è informazione, non burocrazia. I colori restano nella palette, i font nei settings, le variabili dei componenti nel loro tab: nessun doppione.
Due modi di scrivere uno stile
Uno stile può portare CSS grezzo: genera una regola `.us-<nome>`, usa `var(--color-*)` per seguire la palette, ed è la strada giusta per ombre, superfici e gradienti — cose che in Tailwind si scriverebbero male.
Oppure può portare classi Tailwind (`shadow-sm`, `rounded-md`), e allora si ragiona nel vocabolario della propria style guide. Queste le genera Tailwind, che scansiona `db.styles.json`. Il CSS grezzo non passa da Tailwind: è una regola emessa a runtime.
Il token `us-<nome>` funziona in qualunque `className`: viene espanso nelle classi dello stile che nomina. Un token che nomina uno stile `css`, o uno che non esiste, viene lasciato com’è — nel primo caso è già una classe valida, nel secondo è innocuo.
styling/resolveClassName.ts— espande i token `us-<nome>` nelle classi dello stile riferito
I temi non sono un foglio di stile in più
Un tema è una palette più dei font. Le variabili del tema attivo vengono emesse come CSS var nel layout, quindi cambiare tema ri-stila tutto senza toccare né il contenuto né i viewMode.
La differenziazione STRUTTURALE — raggi, bordi, ombre, spaziature, tipografia — non sta nel tema: sta nei `themeStyles` dei viewMode, indicizzati per nome di tema. È la distinzione che tiene i temi leggeri: tredici temi in catalogo non sono tredici copie della style guide.
src/theme/index.ts— le variabili complete di un tema: base ⊕ palette ⊕ font ⊕ `vars`src/utils/generateCssVars.ts— le variabili emesse come CSS var dal layoutsrc/utils/hexToRgb.ts— la conversione che serve alle var colore con opacità