@cakejp/design-system 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,7 +7,53 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ---
9
9
 
10
- ## [0.3.0] - 2026-05-04 (Unreleased)
10
+ ## [0.6.0] - 2026-06-11
11
+
12
+ ### ✨ Added
13
+
14
+ - **ListItem**: インタラクティブ(`href` / `onClick`)な行に hover 背景(`Surface-Tertiary`)と focus-visible リング(`Focus-High-Emphasis`)を追加。`onClick` のみの場合は `role="button"` + Enter / Space キー操作にも対応。表示専用行(href/onClick なし)は変化なし (#21)
15
+
16
+ ### 🐛 Fixed
17
+
18
+ - **border(全コンポーネント)**: 色指定のない `border` を持つ 16 コンポーネントに border 色を明示し、Tailwind v4 のグローバル base reset 非依存に。消費側がリセットを取り込まないと罫線が要素の文字色へ化ける問題を防止。回帰防止 lint(`scripts/check-border-color.mjs`)と「`dist/index.css` import 必須」の明記を追加 (#20)
19
+ - **文脈非依存性(text / icon / bg)**: 消費側の文字色・背景を継承して崩れる箇所を全コンポーネント監査で修正(敵対的検証で実害 12 / 誤検出 19 を仕分け)。Storybook に継承漏れを目視検出する「Hostile ctx」トグルを追加 (#23)
20
+ - **ListItem**: href(リンク)行で `onClick` / `aria-*` / `data-*` が内側要素に残り、キーボード操作時に発火しない問題を修正。props と focus を anchor に集約 (#24)
21
+
22
+ ### 🛡 Internal
23
+
24
+ - **lint**: `check-border-color` が CVA 定義内の border も走査するよう拡張(色なし border の回帰防止を強化) (#24)
25
+ - **Storybook**: 「Hostile ctx」検出ツールが Radix Portal(Dialog/Popover 等)の継承漏れも検出できるよう body へのスタイル適用に対応 (#24)
26
+
27
+ ---
28
+
29
+ ## [0.5.0] - 2026-06-08
30
+
31
+ ### 🚨 Breaking Changes
32
+
33
+ - **SectionHeader**: デフォルトの横余白 `px-4` を撤廃。従来の見た目を維持するには親要素側で `px-4` を付与してください (#14)
34
+
35
+ ### ✨ Added
36
+
37
+ - **FormField**: `descriptionPosition` prop を追加(`"above"` | `"below"`)。グリッド横並び配置で description の有無による入力要素の縦位置ズレを `"below"` で回避可能 (#16)
38
+
39
+ ### 🐛 Fixed
40
+
41
+ - **Input / Textarea**: ホバー時に緑ボーダー(`Focus-High-Emphasis`)を表示するように統一。Select / Checkbox と同じフィードバックに揃えた (#16)
42
+ - **Select / Checkbox / SearchBar**: ホバー/フォーカス時のボーダー色をオレンジ(`Brand-Cake-Orange`)から緑(`Focus-High-Emphasis`)に修正。フォーム要素全体でフォーカス色を統一 (#15)
43
+ - ボーダー色の `transition` に `border-color` を追加し、ホバー時のアニメーションをスムーズ化 (#16)
44
+
45
+ ### 🛡 Internal
46
+
47
+ - SSR 後方互換テスト(17ケース)と tokens.json↔semantic.css 同期テストを追加 (#12)
48
+ - GitHub Actions CI を追加(PR + push:main で品質ゲート + テスト自動実行) (#12)
49
+ - lint-scratch: `<a href>` ルールに `lint-scratch-allow` コメント除外を追加 (#12)
50
+ - check-responsive: `grep` + `pipefail` によるサイレント失敗を修正 (#12)
51
+ - Codex 設定(`.codex/`)とプロジェクトスキル(`.agents/skills/`)を追加 (#13)
52
+ - Chip の States ストーリーに状態説明 JSDoc を追加 (#10)
53
+
54
+ ---
55
+
56
+ ## [0.3.0] - 2026-05-04
11
57
 
12
58
  ### 🚨 Breaking Changes
13
59
 
package/CLAUDE.md CHANGED
@@ -1,35 +1,32 @@
1
- # Cake.jp Design System — 設計ルールブック
1
+ # Cake.jp Design System — 利用ガイド
2
+
3
+ > **このファイルは `@cakejp/design-system` を利用するプロジェクト向けです。**
4
+ > DS リポジトリ自体の開発には **CLAUDE_DEV.md** を参照してください。
2
5
 
3
6
  ## 目的
4
7
 
5
8
  Cake.jp のフロントエンドとデザインシステムを正式に接続する。
6
- PdM や社長が AI(Claude 等)で HTML モックを作る際、このリポジトリを参照して高精度なモックを生成できるようにする。
7
- デザイナー・フロントエンドがいなくても、モック → バックエンド開発へそのまま移行できる品質を目指す。
9
+ PdM や社長が AI(Claude 等)で HTML モックを作る際、このパッケージを参照して高精度なモックを生成できるようにする。
8
10
 
9
11
  ---
10
12
 
11
- ## 重要: コードを書く前に必ず読むこと
13
+ ## コードを書く前に必ず読むこと
12
14
 
13
- **コードを1行でも書く前に、以下のファイルを必ず読み込むこと。**
15
+ **コードを1行でも書く前に、以下のファイルを読み込むこと。**
16
+ パスは `node_modules/@cakejp/design-system/` 配下、または DS リポジトリ直下。
14
17
 
15
18
  | ファイル | 内容 | いつ読むか |
16
19
  |---------|------|----------|
17
20
  | **contracts/rules.json** | 禁止パターン・アクセシビリティ要件・ライティングルール | **コード生成前に必ず** |
18
- | **contracts/components.json** | 全103コンポーネントの定義(variants・rules・accessibility) | コンポーネント作成・修正時 |
21
+ | **contracts/components.json** | 全コンポーネントの定義(variants・rules・accessibility) | コンポーネント利用・画面作成時 |
19
22
  | **tokens.json** | カラー・タイポグラフィ・スペーシング・影・角丸 | トークン値を参照する時 |
20
- | **CLAUDE_PRODUCTION.md** | 本番実装参照ルール・Figmaチェックリスト・本番サイト対応表 | 本番再現・新規コンポーネント作成時 |
21
-
22
- > ※ Codex を使う場合は **AGENTS.md** を参照すること(明示的なファイル読み込み手順を記載)。
23
+ | **CLAUDE_PRODUCTION.md** | 本番実装参照ルール・Figmaチェックリスト・本番サイト対応表 | 本番再現・新規画面作成時 |
23
24
 
24
25
  ---
25
26
 
26
- ## ❌ スクラッチコード禁止ルール(強制)
27
-
28
- > 「読みます」ではなく「書く前にブロックする」ゲートとして運用すること。
27
+ ## スクラッチコード禁止ルール
29
28
 
30
- ### 書く前ゲート(以下のパターンを書こうとしたら必ずDSを確認すること)
31
-
32
- 下記のいずれかを CSS または JSX に追加しようとした場合、**書く手を止めて** `contracts/components.json` と Storybook で同等パターンを探すこと:
29
+ 下記のいずれかを CSS または JSX に追加しようとした場合、**書く手を止めて** `contracts/components.json` で同等パターンを探すこと:
33
30
 
34
31
  | 追加しようとしているもの | DSで確認すること |
35
32
  |------------------------|----------------|
@@ -39,128 +36,24 @@ PdM や社長が AI(Claude 等)で HTML モックを作る際、このリポ
39
36
  | カスタムボーダー半径(`border-radius: ...px`) | `tokens.json` の `radius.*` を使う |
40
37
  | カスタムフォントサイズ・ウェイト | `tokens.json` の `typography.*` を使う |
41
38
  | 新しい `<div>` ラッパーでレイアウト構造を作る | Card, Section, Stack 等のコンポーネントに置き換えられないか確認 |
39
+ | 生の `<button>` `<input>` `<select>` `<textarea>` `<table>` | DS の Button / Input / Select / Textarea / DataTable を使う |
42
40
 
43
41
  **確認手順:**
44
42
  1. `contracts/components.json` で該当コンポーネントを検索
45
- 2. Storybook(`npm run storybook`)で実際の見た目を確認
46
- 3. DSに存在しない場合のみ、カスタム実装を許可(その場合はコメントで理由を記載)
47
-
48
- ### 書いた後ゲート(強制)
49
-
50
- `.tsx` `.css` `.module.css` を**1ファイルでも編集したら必ず実行**:
51
-
52
- ```bash
53
- bash scripts/lint-scratch.sh
54
- ```
55
-
56
- エラーが出た場合: **そのエラーを修正するまで次のタスクに進んではならない。**
57
-
58
- > lint-scratch.sh が通っていないコードは未完成扱い。
59
-
60
- ---
61
-
62
- ## ドキュメント構成
63
-
64
- | ファイル | 内容 |
65
- |---------|------|
66
- | **CLAUDE.md**(本ファイル) | 概要・技術スタック・コマンド(Claude Code用) |
67
- | **AGENTS.md** | 同上(Codex用。セッション開始時の読み込み指示・編集後コマンドを明記) |
68
- | **contracts/components.json** | 全103コンポーネントの構造化定義(バリアント・アクセシビリティ要件) |
69
- | **contracts/rules.json** | 禁止パターン・アクセシビリティ要件・タイポグラフィ定義 |
70
- | **tokens.json** | カラー・スペーシング・シャドウトークンの機械可読定義 |
71
- | **CLAUDE_PRODUCTION.md** | 本番実装参照ルール・Figmaチェックリスト(Cake.jp固有) |
72
-
73
- ---
74
-
75
- ## デザインリソース
76
-
77
- | リソース | URL |
78
- |---------|-----|
79
- | Figma Design System | https://www.figma.com/design/ExHuJOWJChJtk0qiskqEsI/Cake.jp-Design-System?node-id=18168-44099 |
43
+ 2. DSに存在しない場合のみ、カスタム実装を許可(その場合はコメントで理由を記載)
80
44
 
81
45
  ---
82
46
 
83
47
  ## 技術スタック
84
48
 
85
49
  - React 19 + TypeScript
86
- - Vite(ビルド)
87
50
  - Tailwind CSS v4(`@import "tailwindcss"` 構文。`@tailwind base` は v3 記法で使用禁止)
88
51
  - shadcn/ui(Radix UI ベース、Cake.jp テーマ適用済み)
89
- - Storybook(`@storybook/react-vite`)
90
52
  - CVA(class-variance-authority)でバリアント管理
91
53
  - Lucide React + iconsax-react(アイコン)
92
54
 
93
55
  ---
94
56
 
95
- ## ディレクトリ構成
96
-
97
- ```
98
- src/
99
- ├── components/
100
- │ ├── foundations/ # shadcn ベース汎用 UI(46個・全事業共通)
101
- │ ├── primitives/ # 業界汎用パターン(35個・jobboard等他事業でも再利用可)
102
- │ ├── ec/ # Cake.jp / EC 事業特化(23個・商品・配送・クーポン等)
103
- │ └── pages/ # ページ単位のストーリー
104
- ├── prototypes/ # /mock スキルで生成されたプロトタイプ
105
- ├── lib/
106
- │ └── utils.ts # cn() ユーティリティ
107
- └── index.css # カラートークン定義 + Tailwind 設定
108
- ```
109
-
110
- ### 3層構造の依存ルール
111
-
112
- ```
113
- ec/ ← Cake.jp 特化(最上位)
114
- ↓
115
- primitives/ ← 業界汎用パターン
116
- ↓
117
- foundations/ ← shadcn ベース(最下位)
118
- ```
119
-
120
- - `foundations/` は他層に依存しない
121
- - `primitives/` は `foundations/` のみ参照可
122
- - `ec/` は `foundations/` と `primitives/` を参照可
123
- - **逆方向の依存は禁止**(primitives から ec を import する等)
124
-
125
- ---
126
-
127
- ## コマンド
128
-
129
- ```bash
130
- # 開発サーバー(Storybook)
131
- npm run storybook
132
-
133
- # プロトタイプビューアー
134
- npm run dev
135
- # → http://localhost:5173/prototypes
136
-
137
- # ビルド
138
- npm run build-storybook
139
-
140
- # パッケージビルド(npm install 時に自動実行)
141
- npm run build:lib
142
-
143
- # 型チェック
144
- npx tsc --noEmit
145
-
146
- # リント
147
- npm run lint
148
-
149
- # スクラッチ検出(実装後に必ず実行)
150
- bash scripts/lint-scratch.sh
151
-
152
- # コンポーネント再利用チェック
153
- bash scripts/check-story-reuse.sh
154
-
155
- # ドリフト検出(コンポーネント追加後に実行)
156
- bash scripts/check-drift.sh
157
-
158
- # 全チェック一括実行
159
- npm run check
160
- ```
161
-
162
- ---
163
-
164
57
  ## カラートークン早見表
165
58
 
166
59
  | 用途 | トークン |
@@ -177,12 +70,13 @@ npm run check
177
70
 
178
71
  ---
179
72
 
180
- ## コンポーネント追加時のチェックリスト
73
+ ## AI 生成コードの典型的な誤り
181
74
 
182
- 新しいコンポーネントを追加したら、以下を必ず更新:
75
+ `contracts/rules.json` の `aiPatterns` セクションで詳細を確認すること。主な注意点:
183
76
 
184
- - [ ] `src/index.tsx` にエクスポートを追加
185
- - [ ] `contracts/components.json` にコンポーネント定義を追加
186
- - [ ] `contracts/components.json` の `meta.counts` を更新
187
- - [ ] `bash scripts/check-drift.sh` を実行して乖離がないことを確認
188
- - [ ] Storybook のストーリーファイル(`.stories.tsx`)を作成
77
+ - **価格表記**: `¥{数字,区切り}(税込)` — `円` `税込み` `(税込)` は禁止
78
+ - **日付表記**: `M月D日(曜日)` — `YYYY/MM/DD` や英語表記禁止
79
+ - **aria-label**: 日本語で記述 — 英語 aria-label 禁止
80
+ - **input type="date"**: 使用禁止 — Popover と Calendar を組み合わせる
81
+ - **Tag に onClick**: 禁止 — 押せるものは Chip を使う
82
+ - **SectionHeader 手書き**: 禁止 — `SectionHeader` コンポーネントを使う
package/README.md CHANGED
@@ -19,6 +19,11 @@ import "@cakejp/design-system/dist/index.css"
19
19
  <Button>カートに入れる</Button>
20
20
  ```
21
21
 
22
+ > **`dist/index.css` の import は必須。**
23
+ > このCSSにはカラートークン定義に加え、Tailwind v4 のベースレイヤー(`* { border-color: var(--border) }` 等)が含まれます。
24
+ > import しないと、Tailwind v4 の border-color 既定が `currentColor` のままになり、コンポーネントの罫線や枠線がその要素の文字色に化けます(例: テーブルの行罫線が黒くなる)。
25
+ > 自前の Tailwind 設定にマージしたい場合は `@cakejp/design-system/preset`(base レイヤー込み)を参照してください。
26
+
22
27
  ## 構造
23
28
 
24
29
  3-tier アーキテクチャ:
package/bin/init.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // @cakejp/design-system init
4
4
  // Consumer プロジェクトに AI (Claude / Codex) 向けルールファイルを設置する。
5
5
  // AI エージェントは node_modules 配下のファイルを自動で読まないため、
6
- // プロジェクトルートに AGENTS.md / CLAUDE.md(node_modules 内の DS ルールを
6
+ // プロジェクトルートに AGENTS.md / CLAUDE.md(node_modules 内の DS 利用ガイドを
7
7
  // 参照する薄いポインタ)を置く必要がある。
8
8
  //
9
9
  // Usage:
@@ -128,7 +128,7 @@ if (created > 0) {
128
128
  console.log(`
129
129
  次のステップ:
130
130
  1. AI (Claude Code / Codex) を再起動してルールを読み込ませる
131
- 2. UI を作る前に必ず node_modules/@cakejp/design-system/{AGENTS.md,CLAUDE.md,contracts/*,tokens.json} を AI に読ませる
131
+ 2. UI を作る前に必ず node_modules/@cakejp/design-system/{CLAUDE.md,contracts/*,tokens.json} を AI に読ませる
132
132
  3. スクラッチコード(ハードコードカラー・余白・角丸等)を書かない運用を徹底する
133
133
  `)
134
134
  }
@@ -424,8 +424,12 @@
424
424
  {
425
425
  "name": "FormField",
426
426
  "path": "src/components/primitives/form-field.tsx",
427
+ "variants": {
428
+ "descriptionPosition": ["above", "below"]
429
+ },
427
430
  "rules": [
428
- "Label+Input+エラーメッセージをセットで管理"
431
+ "Label+Input+エラーメッセージをセットで管理",
432
+ "グリッド横並び時は descriptionPosition='below' で高さを揃える"
429
433
  ]
430
434
  },
431
435
  {
@@ -407,6 +407,23 @@
407
407
  "message": "AI生成パターン: 左端カラーストライプ禁止(Alert含む)",
408
408
  "fix": "border rounded-lg で全周ボーダー"
409
409
  },
410
+ {
411
+ "id": "B1",
412
+ "severity": "error",
413
+ "category": "component",
414
+ "scope": "designSystemInternal",
415
+ "appliesTo": ["components/foundations/", "components/primitives/", "components/ec/"],
416
+ "pattern": "border 幅ユーティリティ(border / border-b / border-l 等)に色クラスが同居していない",
417
+ "message": "DSコンポーネントで色指定のない border を使わない。Tailwind v4 の border-color 既定は currentColor。消費アプリが preset.css のグローバル base リセット(* { @apply border-border })を取り込まない場合、罫線が要素の文字色に化ける(例: テーブル行に text-[var(--Text-High-Emphasis)] を付けると罫線が黒 #1C1A1A になる)。コンポーネントはグローバルリセットに依存せず自前で border 色を持つこと。",
418
+ "fix": "同じ className 内に border-[var(--Border-Medium-Emphasis)] 等を明示する(透明が意図なら border-transparent)。検査: npm run lint:border(scripts/check-border-color.mjs)"
419
+ },
420
+ {
421
+ "id": "AI5",
422
+ "severity": "warning",
423
+ "category": "ai-pattern",
424
+ "message": "文脈非依存違反: text色/背景/アイコン色を明示せず親の継承や Tailwind v4 既定(border/ring/outline=currentColor)に委ねる。消費側が濃色テキストや色付き背景を敷くと文字・アイコン・枠が化ける。サーフェス(カード/オーバーレイ等)が bg 未指定だと親背景が透ける。",
425
+ "fix": "テキスト要素に text-[var(--Text-*)]、サーフェスに bg-[var(--Surface-*)] を明示。Content/オーバーレイ系ラッパは text-popover-foreground 等で子を隔離する。Storybook ツールバーの『Hostile ctx』を loud にして漏れ(マゼンタ化・背景透け)を目視確認する。"
426
+ },
410
427
  {
411
428
  "id": "AI3",
412
429
  "severity": "warning",