SCSS セクション構成
各 Block の SCSS ファイルは、次の順番でセクションを並べます:
- 基本構造: Block のレイアウト + Variant
--shared: Block 配下専用の共通クラス(必要なときだけ)--interaction: 状態変化やインタラクション関連(必要なときだけ)
SCSS ファイル全体の構造例
.sample-block { // 基本構造 ----------------------------------- display: block;
&[data-variant="primary"] { ... }
> .sample-header { // 子 Block / Element のレイアウト }
> .sample-body { // 子 Block / Element のレイアウト }
// --shared ---------------------------------------- .btn { // この Block 配下だけで使う共通スタイル }
// --interaction ----------------------------------- @at-root & { &:hover { ... } &[data-state="active"] { ... } &[aria-expanded="true"] { ... } }}基本構造セクション
「原則の一文」を具体化したもの。詳細なルールは Stylelint が検証します。
プロパティ配置の早見表
| カテゴリ | 代表的なプロパティ例 | 書く場所 |
|---|---|---|
| コンテナ | display:flex/grid, gap, justify-*, align-* | Block 本体 |
| アイテム(親から) | margin-top, flex, order, align-self | 親 Block の > .child-block(> .element にも適用) |
| 内部 | text-align, line-height, padding, size(sizeInternal) | 子 Block / Element 自身 |
注: 上表は概念上の分類です。Stylelint ルールが配置を検証するのは一部のみ:
padding/overflow/ size 系(sizeInternal有効時)。text-alignやline-heightは概念的には内部ですが、lint の検査対象ではありません。
判断基準
- コンテナ: 直下の子をどう並べるか → Block 本体に書く
- アイテム: 親の都合で子の配置・余白・伸縮を調整する → 親 Block の
> .child-block/> .elementに書く(size はデフォルト internal — 詳細) - 子が複雑になった: 子要素が「自分の子を並べる役割」を持つ → 新しい Block として切り出す
—shared セクション
Block 配下ツリー内だけで使い回す共通クラスをまとめます。
// --shared ----------------------------------------記述ルール:
- 任意の子孫要素を対象にしてよく、
>の強制はなし - ルート Block 直下に配置
—interaction セクション
状態変化やインタラクション関連スタイルをまとめます。
// --interaction -----------------------------------@at-root & { // ...}対象:
data-state/aria-*状態:hover,:focus-visible,:active- アニメーション・トランジション関連
記述ルール:
- ルート Block 直下に配置
- 疑似クラスは対象セレクタにネストして書く
記述例:
.button-container { display: inline-block; padding: 10px 20px; background: #fff;
// --interaction ----------------------------------- @at-root & { opacity: 0; transform: translateY(10px); transition: opacity 0.3s ease, transform 0.3s ease;
> .icon { &:hover { opacity: 0.8; } }
&[data-state="visible"] { opacity: 1; transform: translateY(0); }
&:hover { transform: translateY(-2px); } }}