Styling Discourse with variables: Show & Tell の議論を続けます。
Discourse のテーマ設定エクスペリエンスを改善するための取り組みは非常に高く評価していますが、上記のトピックで共有されているような多数の CSS 変数を追加するアプローチが最適な解決策であるとは確信が持てません。その理由について、いくつか考えを共有したいと思います。
このアプローチは、Canvas Theme Template を通じて自分で実験してきました。これは、基本的にベーステーマを構築するための調整可能な変数のコレクションを提供します。
: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);
/* And several more... */
}
これは単純な調整にはかなりうまく機能しますが、このアプローチをスケーリングする際にはいくつかの制限に直面しました。
認知負荷と検出可能性
変数の広範なリストは、基本的にルックアップテーブルを必要とします。これは、コンポーネントベースのフレームワークで通常作業する方法とはかけ離れているように感じます。コンポーネントを実際にスタイル設定することを期待するでしょう。そして、それは私だけかもしれませんが、メンタルモデルが「このコンポーネントをスタイル設定したい」から「適切な変数名を見つける必要がある」にシフトしているように感じます。
カスケードロジックの欠如
現在の実装では、適切なカスケード階層を確立せずに、ハードコーディングされた値を直接変数に割り当てています。
--d-sidebar-link-color: var(--primary-high);
--d-nav-background-color--active: transparent;
--table-border-width: 1px;
これは、--link-color や --border-width のようなより一般的な変数からの継承がないことを意味します。体系的な変更を行いたい場合、1 つの基本的な値を変更する代わりに、複数の特定の変数を更新する必要があります。
デザインから開発へのギャップ
このアプローチは、デザインツール(Figma など)と実装の間で作業する際に摩擦を生み出すと思います。デザインシステムは通常、これらの非常に実装固有の変数と 1 対 1 でマッピングされないセマンティック変数を使用します。
コンポーネントアーキテクチャを採用した代替アプローチ
基本的なセマンティック変数と信頼性の高いコンポーネントターゲティングを組み合わせることで、同じ目標をより自然に達成できると思います。特定の変数の長いリストを持つ代わりに、Discourse 全体で一意で一貫した名前のコンポーネントクラスを確実に利用できるとしたらどうでしょうか? .d-sidebar、.d-topic-list、.d-header のようなものです。
次に、CSS が本来機能するように、実際にカスケードする小規模な基本的な変数のセットとペアにします。
/* Set the design foundation */
:root {
--d-border-width: 2px;
--d-surface-color: #3498db;
--d-space-1: 1rem;
}
/* Override at the component level when you need to */
.d-topic-list,
.d-sidebar {
--d-border-width: 1px;
}
私にとっては、これは CSS が自然に機能する方法に近いです。グローバルスタイルを設定し、必要に応じて調整します。アプリ全体で境界線の表示方法を変更したい場合は、1 つの変数を変更します。サイドバーを変更したい場合は、サイドバーを具体的にターゲットにします。

