Fortsetzung der Diskussion von Styling Discourse with variables: Show & Tell:
Ich schätze die Bemühungen, die Theming-Erfahrung von Discourse zu verbessern, sehr! Ich bin jedoch nicht ganz davon überzeugt, dass der Ansatz, viele CSS-Variablen hinzuzufügen, wie im obigen Thema geteilt, die optimale Lösung ist. Ich wollte dazu ein paar Gedanken teilen.
Ich habe diesen Ansatz selbst mit der Canvas Theme Template experimentiert, die im Wesentlichen eine Sammlung von einstellbaren Variablen für die Erstellung von Basisthemen bereitstellt:
: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);
/* Und viele mehr... */
}
Während dies für einfache Anpassungen recht gut funktioniert, bin ich bei der Skalierung dieses Ansatzes auf mehrere Einschränkungen gestoßen:
Kognitiver Aufwand und Auffindbarkeit
Eine umfangreiche Liste von Variablen erfordert im Wesentlichen eine Nachschlagetabelle. Dies fühlt sich von der Art und Weise, wie man typischerweise in einem komponenten-basierten Framework arbeitet, getrennt an, wo man tatsächlich erwartet, Komponenten zu stylen. Und vielleicht bin das nur ich, aber ich habe das Gefühl, dass das mentale Modell von “Ich möchte diese Komponente stylen” zu “Ich muss den richtigen Variablennamen finden” verschoben wird.
Mangelnde Kaskadierungslogik
Die aktuelle Implementierung weist hartcodierte Werte direkt Variablen zu, ohne eine ordnungsgemäße Kaskadenhierarchie zu etablieren:
--d-sidebar-link-color: var(--primary-high);
--d-nav-background-color--active: transparent;
--table-border-width: 1px;
Das bedeutet, dass es keine Vererbung von allgemeineren Variablen wie --link-color oder --border-width gibt. Wenn ich systematische Änderungen vornehmen möchte, muss ich mehrere spezifische Variablen aktualisieren, anstatt einen grundlegenden Wert zu ändern.
Lücke zwischen Design und Entwicklung
Ich denke, der Ansatz schafft Reibung bei der Arbeit zwischen Design-Tools (wie Figma) und der Implementierung. Designsysteme verwenden typischerweise semantische Variablen, die nicht eins zu eins mit diesen sehr implementierungsspezifischen Variablen übereinstimmen.
Ein alternativer Ansatz, der die Komponentenarchitektur nutzt
Ich denke, wir könnten das gleiche Ziel auf natürlichere Weise erreichen, indem wir grundlegende semantische Variablen mit zuverlässigem Komponentenziel kombinieren. Anstatt einer langen Liste spezifischer Variablen, was wäre, wenn wir uns auf eindeutige und konsistent benannte Komponentenklassen in ganz Discourse verlassen könnten? Dinge wie .d-sidebar, .d-topic-list, .d-header.
Kombinieren Sie dies dann mit einer kleineren Menge an grundlegenden Variablen, die tatsächlich so kaskadieren, wie CSS funktionieren soll:
/* Setzt die Designgrundlage */
:root {
--d-border-width: 2px;
--d-surface-color: #3498db;
--d-space-1: 1rem;
}
/* Überschreiben auf Komponentenebene, wenn Sie müssen */
.d-topic-list,
.d-sidebar {
--d-border-width: 1px;
}
Für mich fühlt sich das mehr so an, wie CSS natürlich funktioniert. Ich lege meine globalen Stile fest und verfeinere sie dann, wo nötig. Wenn ich ändern möchte, wie Rahmen in der gesamten App aussehen, ändere ich eine Variable. Wenn ich möchte, dass die Seitenleiste anders aussieht, ziele ich gezielt auf die Seitenleiste.

