詳細度の衝突
セレクタの上書き合戦が始まり、!important
が増殖する。修正するほどカスケードが複雑になる悪循環。
セレクタの上書き合戦が始まり、!important
が増殖する。修正するほどカスケードが複雑になる悪循環。
色の値がファイルに散らばり、ダークモード対応で破綻する。プリミティブ値とセマンティック値の区別がない。
prefers-reduced-motion
の対応がファイルに散在し、抜け漏れが発生する。仕組みで担保できていない。
oklch 色コード、フォントスタック、数値スケール。意味を持たない「素材」を一箇所に集約する。
Tokens に意味のある名前を与える。--color-main
のように。ダークモードは Theme だけで切り替わる。
リセット CSS と要素セレクタのデフォルト。:where()
でゼロ詳細度を維持する。
セクション、グリッド、スタック。中身の見た目に関与せず「配置と空間」だけを担当する。
別のサイトにそのまま持っていけるパーツ。ボタン、カード、見出し、バッジなど。
このサイトのデザインに依存するパーツ。ヘッダー、フッター、ヒーローセクションなど。
アニメーションを分離し、prefers-reduced-motion
対応を一元管理する。
最後の手段。他の層で解決できない微調整のみ。!important
で最高優先度を保証する。
ブラウザネイティブの @layer
でカスケードを制御。セレクタの詳細度に依存しない、宣言的な優先順位管理。
プリミティブ値(Tokens)とセマンティック値(Theme)を明確に分離。ダークモードは Theme 層の切り替えだけで完結。
Sass も PostCSS も不要。ブラウザが直接解釈するモダン CSS だけで構築。ビルドツールへの依存から解放される。