AgentSkillsCN

css-writing-rules

适用于带有 Shadow DOM 的 Web Components 的 CSS 编码规范。在以下场景中使用:(1) 为组件编写新的 CSS 样式;(2) 审查 CSS 代码;(3) 实施设计令牌;(4) 构建响应式布局;(5) 管理 CSS 变量。内容涵盖 @layer 结构、::part() 样式化、变量模式、无障碍设计(如降低动画效果、支持任意悬停状态)以及命名规范。

SKILL.md
--- frontmatter
name: css-writing-rules
description: CSS coding guidelines for Web Components with Shadow DOM. Use when (1) writing new CSS styles for components, (2) reviewing CSS code, (3) implementing design tokens, (4) creating responsive layouts, (5) managing CSS variables. Covers @layer structure, ::part() styling, variable patterns, accessibility (reduced motion, any-hover), and naming conventions.

CSS Writing Rules

Web ComponentsプロジェクトにおけるCSS実装ガイドライン。monosusコーディングガイドラインとプロジェクト固有ルールを統合。

Quick Reference

Critical Rules(必須遵守)

  1. !important禁止 - @layerで詳細度を管理
  2. ::part()必須 - Shadow DOM内でクラスではなくpart属性を使用
  3. Div Soup禁止 - 不要なwrapper div削除、最小限のDOM構造を維持
  4. 変数マッピングは一度だけ - プロパティ定義は1箇所、状態変化は変数再代入
  5. ネスト1階層 - @layer・疑似クラス・メディアクエリを除く
  6. 状態はHTML属性 - .is-openではなく[open][aria-expanded="true"]
  7. グローバルトークン必須 - #000000ではなくvar(--color-neutral-black)

Prohibited(絶対禁止)

css
/* NG: !important */
color: red !important;

/* NG: カラーキーワード */
color: black;  /* → var(--color-neutral-black) */

/* NG: ハードコード色値 */
--dads-button-color: #000000;  /* → var(--color-neutral-black) */

/* NG: html font-size 62.5% */
html { font-size: 62.5%; }

/* NG: Shadow DOM内でクラス */
<div class="accordion-summary">  /* → part="summary" */

/* NG: 状態クラス */
.is-open { }  /* → [open] { } */
html
<!-- NG: Div Soup(不要なwrapper div) -->
<div part="outer">
  <div part="wrapper">
    <div part="container">
      <slot></slot>
    </div>
  </div>
</div>

<!-- OK: フラット構造 -->
<blockquote part="blockquote">
  <slot name="lead" part="lead"></slot>
  <slot part="body"></slot>
</blockquote>

Decision Tree

ユースケース参照ドキュメント
コンポーネントのCSS実装web-components.md
マークアップ・テンプレート設計web-components.md(Div Soup禁止セクション)
@layer構造の設定layer-structure.md
CSS変数の設計css-variables.md
レスポンシブ対応media-queries.md
セレクタの書き方selectors-and-nesting.md
クラス・変数の命名naming-rules.md
基本原則の確認core-principles.md

Core Workflow

新規コンポーネントCSS作成

  1. @layer配置を決定(通常はcomponents
  2. CSS変数構造を設計
    • セマンティックトークン → ローカルトークン → プロパティ
  3. ベーススタイル定義
    • [part="base"]でプロパティ-変数マッピング
  4. 状態バリエーション追加
    • 変数再代入のみ(プロパティ再定義禁止)
  5. アクセシビリティ対応
    • prefers-reduced-motion
    • @media (any-hover: hover)
  6. レスポンシブ対応

CSSレビュー時チェックリスト

  • !importantが使用されていない
  • @layerが適切に使用されている
  • ネストが1階層以内
  • 状態管理がHTML属性で行われている
  • 変数命名が--category-unit/value形式
  • プロパティ定義が1箇所のみ
  • アクセシビリティ対応(motion、hover)
  • カラーキーワード未使用(HEX/RGB/HSL)

Token Architecture

code
Primitive Tokens        Semantic Tokens         Local Tokens           Properties
--color-blue-900   →   --button-primary-bg  →  --dads-button-bg   →  background-color

正しいパターン

css
/* ベース: プロパティ-変数マッピング(一度だけ) */
[part="base"] {
  background-color: var(--dads-button-background);
  color: var(--dads-button-color);
}

/* 状態: 変数再代入のみ */
:host([variant="solid"]:hover) {
  --dads-button-background: var(--button-primary-bg-hover);
}

トークン定義(TypeScript)

typescript
// 文字列として定義
const tokenText = `
  :host {
    --button-primary-bg: var(--color-primitive-blue-900);
  }
`;

// 最後にcss関数で変換
export const tokens = css`${tokenText}`;

重要: CSSStyleSheetオブジェクトを文字列テンプレート内で展開しないこと

Style Application Order

typescript
styles: withReset([
  applyDADSTokens(),    // 1. グローバルトークン
  buttonTokens,          // 2. コンポーネントトークン
  buttonStyles,          // 3. スタイル定義
  applyDADSFocusStyles() // 4. フォーカススタイル
], 'minimal')

Reference Files

詳細なルールは以下のリファレンスを参照:

ファイル内容
core-principles.md基本原則、禁止事項、ツール設定
layer-structure.md@layer 8層構造と役割
selectors-and-nesting.mdセレクタパターン、ネスト制限、状態管理
media-queries.mdレスポンシブ、アクセシビリティ、単位
css-variables.md変数パターン、トークン設計、スコープ
naming-rules.mdクラス・変数の命名規則
web-components.mdDiv Soup禁止、::part()、Shadow DOM、リセットCSS

Relationship with Other Docs

このスキルは /docs/css-variable-pattern.md の内容を包含・拡張したものです。

ドキュメント用途
/docs/css-variable-pattern.md人間向けクイックリファレンス
このスキルClaude Code向け包括的ガイドライン

変更時は両方を更新してください。

Sources