スタイリング
グローバル CSS、Tailwind v4、そして zfb におけるコンポーネントスコープなスタイリングの位置づけ。
zfb のスタイリングには 2 つのレイヤー(グローバル CSS と Tailwind v4)があり、それ以外のすべてに対しては 1 つの十分にサポートされたパターンがあります。マークアップそのものに付与するユーティリティクラスです。
グローバル CSS
デフォルトテンプレートには styles/ が付属しています。これはプレーンな CSS で、zfb の CSS パイプラインによって処理され、すべてのページから利用できます。デザイントークン、リセット、ベースとなるタイポグラフィなど、サイト全体に適用すべきものに使ってください。
:root {
--color-text: #1a1a1a;
--color-bg: #ffffff;
--font-body: system-ui, sans-serif;
}
body {
color: var(--color-text);
background: var(--color-bg);
font-family: var(--font-body);
}
CSS 内の import は期待どおりに動作します。スタイルを複数のファイルに分割し、global.css からまとめて読み込めます。
Tailwind v4
Tailwind v4 は zfb.config.{ts,json} から opt-in で有効化します。
{
"tailwind": {
"enabled": true
}
}
有効にすると、zfb-css クレートがビルドの一環として同梱の tailwindcss-v4 バイナリを実行します。プロジェクトごとに Tailwind をインストールする必要はありません。package.json に tailwindcss を追加することも、tailwind.config.js を保守することもありません。コンパイラは zfb 自体に組み込まれています。
Tailwind を有効にすると、ユーティリティクラスはあらゆる .tsx ファイルで動作します。
export default function Hero() {
return (
<section className="mx-auto max-w-2xl px-6 py-12">
<h1 className="text-3xl font-bold">Hello</h1>
</section>
);
}
Tailwind v4 の CSS ファーストな設定は global.css 内の @theme ディレクティブを通じてサポートされます。トークンのカスタマイズは JS の設定ファイルではなく CSS を編集して行います。
コンポーネントスコープなスタイリング
コンポーネントレベルのスタイリングには、十分にサポートされたパターンが 2 つあります。Tailwind ユーティリティクラスと CSS Modules です。
Tailwind ユーティリティクラス
最もシンプルなパターンは、サイト全体の関心事にはグローバル CSS を、コンポーネントレベルのスタイリングには Tailwind ユーティリティクラスを使う というものです。これによりビルドは高速に、ランタイムは些細なものに保たれ、Tailwind v4 のデザイントークンモデルにきれいにマッピングできます。
CSS Modules
真にコンポーネントスコープな CSS(コンポーネント間で衝突してはならないクラス名)には、zfb は CSS Modules をサポートしています。*.module.css という名前のファイルはすべて CSS Module です。そのクラス名はビルド時にスコープ付きでファイル安定な識別子へと書き換えられるため、2 つのコンポーネントが衝突することなく両方とも .button クラスを定義できます。
スタイルは .module.css ファイルに記述します。
.card {
border: 1px solid var(--color-border);
border-radius: 8px;
padding: 1rem;
}
.title {
font-weight: 700;
}
モジュールは デフォルトインポート でインポートし、インポートしたオブジェクトからクラス名を読み取ります。
import styles from "./card.module.css";
export default function Card() {
return (
<div className={styles.card}>
<h3 className={styles.title}>Hello</h3>
</div>
);
}
ビルド時に zfb は styles.card をスコープ付きのクラス名(例: KdPA9G_card)に解決します。レンダリングされた HTML はそのスコープ付きクラスを持ち、スコープ付き CSS は残りの CSS と同じハッシュ付きの dist/ スタイルシートに畳み込まれます。モジュールごとに別の .css ファイルが作られることはなく、ランタイムコストもありません。ルックアップはビルド中に解決されます。
仕組み:
import styles from ".は デフォルトインポート でなければなりません。/ x. module. css" stylesは元のクラス名をスコープ付きのものへマッピングするプレーンオブジェクトです。- クラスへはメンバーアクセスでアクセスします(
styles.cardまたはstyles["card"])。どちらも動作しますが、動的なキーによる計算アクセスは動作しません。書き換えがビルド時に行われるためです。 - プレーンな
.cssのインポート(.module.cssで終わら ない ファイル)は引き続きグローバル CSS として扱われます。スコープ化を opt-in するのは.module.cssサフィックスだけです。 .module.cssファイルは、pages/・components/・layouts/・content/配下の.tsx/.ts/.jsx/.jsファイルからインポートされたときに発見されます。
制限:
node_modulesから ベア specifier でインポートされる CSS Modules(例:import s from "@org/)はスコープ化されません。スコープ化されるのはプロジェクト相対のpkg/ x. module. css" .// .インポートだけです。. / :exportブロックとcomposesディレクティブはサポートされていません。プレーンなクラスセレクタを使ってください。
dist/ に出力されるもの
ビルドパイプラインは Tailwind と PostCSS を実行し、ハッシュ付きのスタイルシートを dist/assets/ に書き出し、レンダリングされた各 HTML ページに <link rel="stylesheet"> を注入します。スタイルシートの参照は安定しているため、CDN キャッシュは内容が変わるまでデプロイをまたいで保持できます。