Continuant la discussion de Styling Discourse with variables: Show & Tell :
J’apprécie totalement les efforts déployés pour améliorer l’expérience de création de thèmes de Discourse ! Cependant, je ne suis pas entièrement convaincu que l’approche consistant à ajouter de nombreuses variables CSS, comme partagé dans le sujet ci-dessus, soit la solution optimale. Je voulais partager quelques réflexions à ce sujet.
J’ai moi-même expérimenté cette approche via le Canvas Theme Template, qui fournit essentiellement une collection de variables ajustables pour construire des thèmes de 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);
/* Et plusieurs autres... */
}
Bien que cela fonctionne raisonnablement bien pour des ajustements simples, j’ai rencontré plusieurs limitations en essayant de faire évoluer cette approche :
Charge cognitive et découvrabilité
Une liste étendue de variables nécessite essentiellement une table de correspondance. Cela semble déconnecté de la façon dont on travaillerait typiquement dans un framework basé sur des composants, où l’on s’attendrait en fait à styliser des composants. Et peut-être que c’est juste moi, mais j’ai l’impression que cela déplace le modèle mental de « Je veux styliser ce composant » à « Je dois trouver le bon nom de variable ».
Manque de logique en cascade
L’implémentation actuelle attribue des valeurs codées en dur directement aux variables sans établir une hiérarchie de cascade appropriée :
--d-sidebar-link-color: var(--primary-high);
--d-nav-background-color--active: transparent;
--table-border-width: 1px;
Cela signifie qu’il n’y a pas d’héritage des variables plus générales comme --link-color ou --border-width. Si je veux apporter des changements systématiques, je dois mettre à jour plusieurs variables spécifiques au lieu de changer une valeur fondamentale.
Écart conception-développement
Je pense que l’approche crée des frictions lors du travail entre les outils de conception (comme Figma) et l’implémentation. Les systèmes de conception utilisent généralement des variables sémantiques qui ne correspondent pas un à un avec ces variables très spécifiques à l’implémentation.
Une approche alternative qui embrasse l’architecture des composants
Je pense que nous pourrions atteindre le même objectif plus naturellement en combinant des variables sémantiques de base avec un ciblage de composants fiable. Au lieu d’avoir une longue liste de variables spécifiques, que se passerait-il si nous pouvions compter sur des classes de composants uniques et nommées de manière cohérente dans tout Discourse ? Des choses comme .d-sidebar, .d-topic-list, .d-header.
Ensuite, associez cela à un ensemble plus restreint de variables fondamentales qui font réellement cascader les choses comme le CSS est censé fonctionner :
/* Définir les fondations du design */
:root {
--d-border-width: 2px;
--d-surface-color: #3498db;
--d-space-1: 1rem;
}
/* Redéfinir au niveau du composant lorsque nécessaire */
.d-topic-list,
.d-sidebar {
--d-border-width: 1px;
}
Pour moi, cela ressemble davantage à la façon dont le CSS fonctionne naturellement. Je définis mes styles globaux, puis je les affine si nécessaire. Quand je veux changer l’apparence des bordures dans toute l’application, je change une variable. Quand je veux que la barre latérale soit différente, je cible spécifiquement la barre latérale.

