ナビゲーション

スタイルの作成

グローバルスタイル

一つのアプリエントリーを読み込み、担当ごとに共通 CSS を分け、ドキュメントの既定値、コンポーネントルール、ルートのスタイルを適切な範囲に置きます。

このページの内容

#概要

すべてのページで必要なスタイルを、アプリの一か所から読み込むようにします。そのエントリーで複数のソースファイルをインポートできます。共通値、ドキュメントの既定値、コンポーネントルールを各担当のソースに置き、同じアプリスタイルシートから組み立てます。

先にフレームワークへのインストールを完了してください。以下の例は既存の CSS エントリーを拡張するもので、二つ目の Master CSS のインストールは不要です。

#一つのアプリエントリーから始める

アプリがすでに読み込むスタイルシートの先頭に、既定のインポートを保持します:

styles/app.css
@import '@master/css';

このインポートは、theme, base, defaults, components, utilities の順序を含むプリセット定義とベーススタイルを取り込みます。インテグレーションはこのエントリーでプロジェクトの生成 CSS を配信します。各インストールガイドに従い、アプリのルート、ルートレイアウト、ビルドエントリーからインポートしてください。

ソースファイルを分けても、別の完全なエントリーは不要です。自身のファイルを app.css からインポートします:

styles/app.css
@import '@master/css';@import './theme.css';@import './defaults.css';@import './components.css';

複数のソースファイル、一つのアプリエントリー

アプリのルートからエントリーを読み込みます。担当ごとにソースを分け、各インポート先で @master/css を再び @import する必要はありません。

テキストによる説明
  1. 一度読み込む. アプリのルートは、既定の @master/css インポートで始まる app.css を読み込みます。
  2. 担当ごとに分ける. app.css は共通値の theme.css、ネイティブなドキュメント既定値の defaults.css、共通コンポーネントルールの components.css をインポートします。
  3. 一つのグラフを保つ. これらのインポートが一つのエントリーグラフを組み立てます。三つのソースファイルそれぞれに完全な Master CSS エントリーのインポートは不要です。

これらのファイルは一つのエントリーグラフを作ります。共通の定義は app.css に直接書いても、インポート先に書いても利用できます。各ルートスタイルシートで完全な Master CSS エントリーを再度インポートしないでください。各ファイルがエントリーになり、グローバルなネイティブ CSS が重複する場合があります。


#ドキュメントの既定値を設定する

プリセットのリセットは base に残します。製品のドキュメント既定値は defaults に置き、通常のコンポーネントとユーティリティの宣言で上書きできるようにします:

styles/defaults.css
@layer defaults {  body {    background-color: var(--color-surface-base);    color: var(--color-text-body);  }}

追加のクラスなしで既定値を受け取る要素には、ネイティブのセレクターを使います。範囲を意識してください。グローバルな button ルールは、すべての機能内のボタンにも届きます。一つの製品上の役割に属するルールには、コンポーネントクラスを使います。

プリセットのベーススタイルは、すでにフォントトークンをドキュメントに適用しています。書体を選ぶには、タイポグラフィに従って変更してください。宣言が競合する場合はカスケードレイヤーを参照します。後から読み込んでも、より強いレイヤーへ移るわけではありません。


ドキュメントの既定値は DOM を下る

継承はドキュメントツリーに従います。ローカル宣言は設定するプロパティだけを置き換えます。

テキストによる説明

body の既定値が二つの子孫へテキスト設定を供給し、ローカルな code フォントは code 要素内だけでファミリーを上書きする。

#共通グラフに含めるものを決める

共通の判断定義する場所次に読む内容
利用箇所を一緒に変える値theme.css の @themeテーマトークン
すべてのページに必要な既定値@layer defaults のネイティブセレクター上の例
繰り返し使う製品要素@layer components のネイティブクラススタイルの再利用
使用時に生成するクラスの機能インポートしたスタイルシートの @utility下のヘルパー例
繰り返す CSS 宣言や入れ子のスタイル@mixin を @apply で展開CSS の再利用
名前付きのビューポート・コンテナー条件@custom-media または @custom-containerレスポンシブデザイン

インポートする theme.css は、プロジェクトに必要な値から始めます:

styles/theme.css
@theme {  --spacing-card: 1.5rem;}

このトークンは p-card、gap-card と、そのキーに対応するほかの間隔ファミリーを登録します。宣言はプロジェクトが必要とするときに出力されます。エントリーグラフに置いても通常のトークンが静的になるわけではありません。

意味が共通だから定義を共有します。今同じ数値を使う二つの機能にも、別々のトークンが必要な場合があります。一つの要素が複数のクラスを使うだけでは、コンポーネント抽象が必要とは限りません。

#コンポーネントの担当を明確にする

たとえば共通の通知は components.css に置けます:

styles/components.css
@layer components {  .notice {    padding: var(--spacing-md);    border: 1px solid var(--color-line-divider);    border-radius: var(--radius-md);    background-color: var(--color-surface-raised);    color: var(--color-text-body);  }}
<aside class="notice">Your changes are saved locally.</aside>

このネイティブセレクターは .notice にスタイルを付けますが、notice というユーティリティは登録しません。共通の状態と条件はコンポーネントルール内に書きます。Master CSS の修飾子を受け取るクラスレシピには @utility を使ってください。スタイルの再利用で動く例を比較しています。

エントリーグラフのネイティブ CSS は、未使用のコンポーネントルールも含め既定で出力されます。ネイティブの枝刈りは明示的に選びます。ネイティブの枝刈りを参照してください。定義を参照可能にするだけのために、大きなルート専用スタイルシートをグローバルグラフへ移さないでください。


#共通のヘルパーを追加する

グローバル定義は、可能なすべてのクラスにルールを生成せず、複数の機能に必要な動作を表せます。以下のヘルパーは関連リンクを配置し、画面外の内容のレンダリングを省き、印刷ではグループを除外します:

共通ヘルパーで一組のリンクを作る

@utility flow {  display: grid;  gap: var(--spacing-md);}@utility content-auto {  content-visibility: auto;  contain-intrinsic-size: auto 32rem;}@utility print-hidden {  @media print {    display: none;  }}
生成された CSS
@layer theme {  :root,  :host {    --color-zinc-30: oklch(78% .0025 265);    --color-zinc-70: oklch(39.8% .0028 265);    --color-zinc-90: oklch(24.6% .0022 265)  }  :root,  :host {    --color-surface-raised: light-dark(var(--color-white), var(--color-zinc-90));    --color-line-divider: light-dark(oklch(0% 0 none / .12), oklch(100% 0 none / .12));    --color-text-body: light-dark(var(--color-zinc-70), var(--color-zinc-30))  }  :root,  :host {    --color-white: oklch(100% 0 none)  }  :root,  :host {    --font-weight-regular: 400;    --font-size-sm: .875rem;    --font-size-lg: 1.125rem;    --text-sm: var(--font-size-sm);    --text-sm--line-height: 1.5;    --text-sm--letter-spacing: 0;    --text-lg: var(--font-size-lg);    --text-lg--line-height: 1.5;    --text-lg--letter-spacing: 0;    --radius-md: .375rem;    --spacing-md: 1rem  }}@layer utilities {  .text-lg {    font-size: var(--text-lg);    line-height: var(--text-lg--line-height, normal);    letter-spacing: var(--text-lg--letter-spacing, normal)  }  .text-sm {    font-size: var(--text-sm);    line-height: var(--text-sm--line-height, normal);    letter-spacing: var(--text-sm--letter-spacing, normal)  }  .content-auto {    content-visibility: auto;    contain-intrinsic-size: auto 32rem  }  .flow {    display: grid;    gap: var(--spacing-md)  }  @media print {    .print-hidden {      display: none    }  }  .bg-surface-raised {    background-color: var(--color-surface-raised)  }  .b-line-divider {    border-color: var(--color-line-divider)  }  .r-md {    border-radius: var(--radius-md)  }  .b-solid {    border-style: solid  }  .b\(1\) {    border-width: calc(1 * 1px)  }  .fg-text-body {    color: var(--color-text-body)  }  .font-regular {    font-weight: var(--font-weight-regular)  }  .m\(0\) {    margin: calc(0 * 1px)  }  .p-md {    padding: var(--spacing-md)  }  .underline {    text-decoration-line: underline  }}
flow がグリッドと間隔を供給し、print-hidden は印刷時にグループを除きます。content-auto は画面外のレンダリングを省けます。32rem の内在サイズはフォールバックの見積もりで、固定のセクション高さではありません。

定義を既存の Master CSS インポートの後に置くか、アプリのエントリーから utilities.css をインポートします。クラスはマークアップで検出されると CSS を生成します。アプリの印刷プレビューで print-hidden を確認し、リンクを印刷にも出すならクラスを削除してください。自身のレイアウトの内容に合う内在サイズの見積もりを選びます。


ページ横断の確認と出力に基づく最適化手順は、CSS 配信の最適化を参照してください。

#ローカルの配信をローカルに保つ

アプリのエントリーはページ間で共通のスタイルに集中させます。インテグレーションがルートのスタイルシートへプロジェクト定義を供給するため、完全な Master CSS インポートの追加は不要です。グラフ外の追加定義には @reference を使いますが、参照したネイティブ CSS は配信しません。ローカルルールの配信は引き続きルートのローダーが担います。

この設定はルートレベルのスタイル、別々のアプリに独立したエントリーグラフが必要な場合はモノレポを参照してください。グローバルファイルを分けたら、定義を使うページと使わないページを確認します。共通スタイルは引き続きアプリのエントリーから届き、ルート専用ルールはローカルの担当に残る必要があります。