Continuando la discussione da Styling Discourse with variables: Show & Tell:
Apprezzo molto lo sforzo per migliorare l’esperienza di theming di Discourse! Tuttavia, non sono del tutto convinto che l’approccio di aggiungere molte variabili CSS come condiviso nell’argomento sopra sia la soluzione ottimale. Volevo condividere alcuni pensieri sul perché.
Ho sperimentato io stesso questo approccio attraverso il Canvas Theme Template, che fornisce essenzialmente una raccolta di variabili regolabili per la creazione di temi di base:
:root {
/* Layout */
--d-max-width: 1110px;
--canvas-nav-space: 0.75rem;
--canvas-content-padding: 1.5rem;
--canvas-topic-list-padding: 0.8em;
/* Base Styles */
--canvas-background: var(--secondary);
--canvas-surface: var(--secondary);
--canvas-border: 1px solid var(--primary-500);
--canvas-border-light: 1px solid var(--primary-200);
/* Border Radius */
--d-border-radius: 2px;
--d-border-radius-large: 2px;
--d-button-border-radius: 2px;
--d-input-border-radius: var(--d-button-border-radius);
--d-nav-pill-border-radius: var(--d-button-border-radius);
/* Button Styles */
--canvas-button-padding: 0.5em 0.65em;
--canvas-button-primary-padding: 0.5em 0.65em;
/* Header */
--canvas-header-height: 4rem;
--canvas-header-background: var(--header_background);
--canvas-header-border: none;
--canvas-header-shadow: var(--shadow-header);
/* Sidebar */
--d-sidebar-width: 17em;
--d-sidebar-background: var(--secondary);
--canvas-sidebar-border: 1px solid var(--primary-low);
--canvas-sidebar-scrollbar: var(--scrollbarWidth);
--d-sidebar-row-height: 2.2em;
--d-sidebar-highlight-background: var(--primary-low);
/* E molte altre... */
}
Sebbene questo funzioni ragionevolmente bene per aggiustamenti semplici, ho riscontrato diverse limitazioni nel tentativo di scalare questo approccio:
Sovraccarico cognitivo e scopribilità
Un elenco esteso di variabili richiede essenzialmente una tabella di ricerca. Questo sembra scollegato da come si lavorerebbe tipicamente in un framework basato su componenti, dove ci si aspetterebbe di stilizzare i componenti. E forse sono solo io, ma sento che sposta il modello mentale da “Voglio stilizzare questo componente” a “Devo trovare il nome della variabile giusta”.
Mancanza di logica a cascata
L’implementazione attuale assegna valori hardcoded direttamente alle variabili senza stabilire una corretta gerarchia a cascata:
--d-sidebar-link-color: var(--primary-high);
--d-nav-background-color--active: transparent;
--table-border-width: 1px;
Ciò significa che non c’è ereditarietà da variabili più generali come --link-color o --border-width. Se voglio apportare modifiche sistematiche, devo aggiornare più variabili specifiche invece di cambiare un valore fondamentale.
Divario design-sviluppo
Penso che l’approccio crei attrito quando si lavora tra strumenti di design (come Figma) e l’implementazione. I sistemi di design utilizzano tipicamente variabili semantiche che non si mappano uno a uno con queste variabili molto specifiche dell’implementazione.
Un approccio alternativo che abbraccia l’architettura dei componenti
Penso che potremmo raggiungere lo stesso obiettivo in modo più naturale combinando variabili semantiche di base con un targeting affidabile dei componenti. Invece di avere un lungo elenco di variabili specifiche, cosa succederebbe se potessimo contare su classi di componenti uniche e nominate in modo coerente in tutto Discourse? Cose come .d-sidebar, .d-topic-list, .d-header.
Quindi, abbinalo a un set più piccolo di variabili fondamentali che effettivamente si propagano nel modo in cui il CSS è destinato a funzionare:
/* Imposta le fondamenta del design */
:root {
--d-border-width: 2px;
--d-surface-color: #3498db;
--d-space-1: 1rem;
}
/* Sovrascrivi a livello di componente quando necessario */
.d-topic-list,
.d-sidebar {
--d-border-width: 1px;
}
Per me, questo assomiglia di più a come funziona naturalmente il CSS. Imposto i miei stili globali, poi li perfeziono dove necessario. Quando voglio cambiare l’aspetto dei bordi in tutta l’app, cambio una variabile. Quando voglio che la barra laterale sia diversa, seleziono specificamente la barra laterale.

