ksk-design-system 1.43.0 → 1.45.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/AGENTS.md +10 -0
- package/CLAUDE.md +7 -0
- package/DESIGN.md +2 -2
- package/MIGRATION.md +4 -0
- package/PUBLISHING.md +4 -0
- package/README.md +1 -0
- package/RELEASE.md +2 -1
- package/UPDATING.md +145 -0
- package/bin/init.js +7 -0
- package/contracts/components.json +31 -7
- package/contracts/composition.json +126 -0
- package/contracts/design-context.json +24 -0
- package/contracts/screen-patterns.json +228 -0
- package/contracts/token-hex-cache.json +543 -0
- package/dist/index.js +3650 -3477
- package/dist/native/ui.js +1561 -1318
- package/dist/types/components/patterns/bottom-sheet-frame.d.ts +1 -1
- package/dist/types/components/patterns/commerce/bottom-tab-bar.d.ts +14 -1
- package/dist/types/components/patterns/document-page.d.ts +29 -0
- package/dist/types/components/patterns/prose.d.ts +21 -0
- package/dist/types/components/ui/date-picker.d.ts +14 -2
- package/dist/types/components/ui/dialog.d.ts +6 -1
- package/dist/types/components/ui/sheet.d.ts +41 -3
- package/dist/types/components/ui/skeleton.d.ts +22 -1
- package/dist/types/index.d.ts +6 -2
- package/dist/types/native/components/AutoGrowTextarea.d.ts +2 -2
- package/dist/types/native/components/CommitAutoGrowTextarea.d.ts +14 -0
- package/dist/types/native/components/CommitInput.d.ts +23 -0
- package/dist/types/native/components/CommitTextarea.d.ts +14 -0
- package/dist/types/native/components/ErrorBoundary.d.ts +53 -0
- package/dist/types/native/components/Form.d.ts +25 -0
- package/dist/types/native/components/Input.d.ts +2 -2
- package/dist/types/native/components/Textarea.d.ts +2 -2
- package/dist/types/native/components/Toast.d.ts +52 -2
- package/dist/types/native/components/index.d.ts +6 -1
- package/dist/types/native/use-commit-draft.d.ts +44 -0
- package/dist/types/native/use-web-composition-guard.d.ts +3 -0
- package/eslint/deprecated.js +1 -1
- package/package.json +7 -3
- package/scripts/codemod/README.md +15 -0
- package/scripts/codemod/check-migration.mjs +129 -0
- package/src/components/COMPONENT_LOOKUP.md +8 -6
- package/src/native/COMPONENT_LOOKUP.md +8 -1
- package/src/styles/glass.css +345 -28
- package/templates/AGENTS.md +3 -0
- package/templates/CLAUDE.md +3 -0
package/AGENTS.md
CHANGED
|
@@ -20,9 +20,15 @@ contracts/rules.json # 禁止パターン43件・AIアンチ
|
|
|
20
20
|
contracts/components.json # 全132コンポーネントの定義・バリアント・ルール
|
|
21
21
|
contracts/design-context.json # DESIGN.md と正本ファイルの関係・AI向け検査方針
|
|
22
22
|
tokens.json # カラー・スペーシング・シャドウトークン
|
|
23
|
+
contracts/token-hex-cache.json # semantic トークンのデフォルトテーマ解決済み hex(テーマ依存キーは meta.themeDependentKeys 参照・自動生成)
|
|
23
24
|
src/components/COMPONENT_LOOKUP.md # バリアント・インポートパス一覧(自動生成)
|
|
25
|
+
contracts/screen-patterns.json # 画面実装前にどのシェル/パターンを使うかの decisionTree・crudMatrix
|
|
26
|
+
contracts/composition.json # 選んだパターン内部の並べ方(骨格構造・余白リズム・カード階層・テキスト階層・CTA優先度)
|
|
24
27
|
```
|
|
25
28
|
|
|
29
|
+
画面(ページ/ダイアログ等)を実装・修正する場合は、まず `contracts/screen-patterns.json` の
|
|
30
|
+
decisionTree でシェル/パターンを選び、`contracts/composition.json` で内部の並べ方を確認すること。
|
|
31
|
+
|
|
26
32
|
UI コンポーネント・画面の生成/修正・レビューの前には、必ず
|
|
27
33
|
`.claude/skills/ksk-design-system/SKILL.md` を読み、その判断基準に従うこと
|
|
28
34
|
(トークン選定・コンポーネント選択・レビュー優先順位・例外運用。迷ったら同ディレクトリの `references/` を参照)。
|
|
@@ -32,6 +38,8 @@ UI コンポーネント・画面の生成/修正・レビューの前には、
|
|
|
32
38
|
|
|
33
39
|
コンポーネントを新規作成する前に `COMPONENT_LOOKUP.md` で同等品がないか確認すること。
|
|
34
40
|
|
|
41
|
+
Storybook 全体を横断で視覚監査する(定期監査・リリース前総点検)場合は `.claude/skills/audit-pages/SKILL.md` の手順に従うこと。
|
|
42
|
+
|
|
35
43
|
---
|
|
36
44
|
|
|
37
45
|
## 必須: ファイル編集後に実行するコマンド
|
|
@@ -118,6 +126,8 @@ Brand色を差し替え(10行)→ Primitive Layer → Semantic Layer → Bri
|
|
|
118
126
|
| **tokens.json** | カラー・スペーシング・シャドウトークンの機械可読定義 |
|
|
119
127
|
| **src/components/COMPONENT_LOOKUP.md** | 全112コンポーネントのバリアント・インポートパス(自動生成) |
|
|
120
128
|
| **DESIGN.md** | AI エージェント向け視覚言語サマリ(トークン+意図・voice・motion) |
|
|
129
|
+
| **contracts/screen-patterns.json** | 画面実装前にどのシェル/パターンを使うかを決める decisionTree・crudMatrix |
|
|
130
|
+
| **contracts/composition.json** | 選んだパターン内部の並べ方(骨格構造・余白リズム・カード階層・テキスト階層・CTA優先度) |
|
|
121
131
|
|
|
122
132
|
---
|
|
123
133
|
|
package/CLAUDE.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
UI を書く前に必ず確認すること:
|
|
6
6
|
|
|
7
|
+
- [ ] 画面の骨格は `contracts/screen-patterns.json` の decisionTree で選んだか
|
|
7
8
|
- [ ] 既存コンポーネントを `src/components/COMPONENT_LOOKUP.md` で確認したか(手書き・再定義は禁止)
|
|
8
9
|
- [ ] 色は semantic token(`var(--Surface-*)` / `var(--Brand-Primary)` 等)か。Tailwind標準色・生 `#hex` は禁止
|
|
9
10
|
- [ ] `border` は色を併記したか(`border-[var(--Border-Low-Emphasis)]` 等)。Tailwind v4 では無色 border は currentColor になり、消費側の濃色テキストで黒ずむ(preset.css の base layer が保険だが明示が原則)
|
|
@@ -77,8 +78,11 @@ Brand色を差し替え(10行)→ Primitive Layer → Semantic Layer → Bri
|
|
|
77
78
|
| **contracts/rules.json** | 禁止パターン32件・AIアンチパターン10件・アクセシビリティ要件 |
|
|
78
79
|
| **contracts/design-context.json** | `DESIGN.md` の役割・正本ファイル・外部 DESIGN.md 参照方針 |
|
|
79
80
|
| **tokens.json** | カラー・スペーシング・シャドウトークンの機械可読定義 |
|
|
81
|
+
| **contracts/token-hex-cache.json** | semantic トークンのデフォルトテーマ解決済み hex(テーマ依存キーは meta.themeDependentKeys 参照・自動生成) |
|
|
80
82
|
| **src/components/COMPONENT_LOOKUP.md** | 全112コンポーネントのバリアント・インポートパス一覧(自動生成) |
|
|
81
83
|
| **DESIGN.md** | AI エージェント向け視覚言語サマリ(トークン+意図・voice・motion) |
|
|
84
|
+
| **contracts/screen-patterns.json** | 画面実装前にどのシェル/パターンを使うかを決める decisionTree・crudMatrix |
|
|
85
|
+
| **contracts/composition.json** | 選んだパターン内部の並べ方(骨格構造・余白リズム・カード階層・テキスト階層・CTA優先度) |
|
|
82
86
|
|
|
83
87
|
**セッション開始時 / コードを書く前に必ず読む:**
|
|
84
88
|
1. `contracts/rules.json` の `prohibited` と `aiPatterns`(AIが典型的に犯すパターン集)を確認
|
|
@@ -86,9 +90,12 @@ Brand色を差し替え(10行)→ Primitive Layer → Semantic Layer → Bri
|
|
|
86
90
|
3. `contracts/design-context.json` で `DESIGN.md` と正本ファイルの関係を確認
|
|
87
91
|
4. `src/components/COMPONENT_LOOKUP.md` で既存コンポーネントを確認(手書き・再定義の防止)
|
|
88
92
|
5. `tokens.json` でカラー・余白・影・タイポのトークンを確認
|
|
93
|
+
6. 画面(ページ/ダイアログ等)を実装する場合は `contracts/screen-patterns.json` の decisionTree でシェル/パターンを選び、`contracts/composition.json` で内部の並べ方を確認
|
|
89
94
|
|
|
90
95
|
**`.tsx` を編集したら `bash scripts/lint-scratch.sh`、コンポーネント増減時は `npm run check` を実行すること。**
|
|
91
96
|
|
|
97
|
+
Storybook 全体を横断で視覚監査する(定期監査・リリース前総点検・「全ページ確認して」)場合は `.claude/skills/audit-pages/SKILL.md` を使う。
|
|
98
|
+
|
|
92
99
|
---
|
|
93
100
|
|
|
94
101
|
## ディレクトリ構成
|
package/DESIGN.md
CHANGED
|
@@ -116,9 +116,9 @@ KSK の必須正本・publish 依存にせず、KSK 固有の multi-theme / nati
|
|
|
116
116
|
|---|---|---|
|
|
117
117
|
| ブランド | `var(--Brand-Primary)` | `#2563EB` |
|
|
118
118
|
| 背景(白/薄灰) | `var(--Surface-Primary)` / `-Secondary` | `#FFFFFF` / `#F9FAFB` |
|
|
119
|
-
| 文字(強/中/弱) | `var(--Text-High/Medium/Low-Emphasis)` | `#111827` / `#374151` / `#6B7280` |
|
|
119
|
+
| 文字(強/中/弱) | `var(--Text-High/Medium/Low-Emphasis)` <!-- docs-drift-ignore: --Text-High/Medium/Low-Emphasis --> | `#111827` / `#374151` / `#6B7280` |
|
|
120
120
|
| 罫線 | `var(--Border-Low-Emphasis)` | `#E5E7EB` |
|
|
121
|
-
| 状態 | `--Success/Warning/Caution/Info-Base` | `#16A34A` / `#EA580C` / `#DC2626` / `#2563EB` |
|
|
121
|
+
| 状態 | `--Success/Warning/Caution/Info-Base` <!-- docs-drift-ignore: --Success/Warning/Caution/Info-Base --> | `#16A34A` / `#EA580C` / `#DC2626` / `#2563EB` |
|
|
122
122
|
|
|
123
123
|
- **状態色の正本**: 上記は `*-Base`(テキスト/アイコン基準=Primitive **600**)。`tokens.json` を正本とし、本表はその要約。
|
|
124
124
|
バッジ/ピル等の強調 **fill** は別ロール `--Surface-*-Strong`(Primitive **500**)で、わざと一段明るい。役割が違うだけで矛盾ではない。
|
package/MIGRATION.md
CHANGED
package/PUBLISHING.md
CHANGED
|
@@ -158,3 +158,7 @@ bash scripts/update-consumers.sh <version> <影響リポ...>
|
|
|
158
158
|
v1.36.0 以降は npm registry 経由配布。GitHub Actions による自動 publish はなく、
|
|
159
159
|
ローカルの `npm login` 済み環境から `scripts/release.sh` で公開する。
|
|
160
160
|
CI/CD に戻す場合は、NPM_TOKEN の Secrets 登録と workflow の再作成をセットで行うこと。
|
|
161
|
+
|
|
162
|
+
## 関連
|
|
163
|
+
|
|
164
|
+
- [UPDATING.md](./UPDATING.md) — 消費側(DS を npm 依存に持つプロジェクト)向けのアップデート手順
|
package/README.md
CHANGED
|
@@ -186,6 +186,7 @@ DS コンポーネントを最大限活用したモックが `src/prototypes/`
|
|
|
186
186
|
- **ライブ Storybook**: https://ksk-design-system.vercel.app — 全コンポーネントのバリアント・テーマ切り替えを操作可能
|
|
187
187
|
- **npm**: https://www.npmjs.com/package/ksk-design-system
|
|
188
188
|
- 設計思想・トークン体系の詳細は `CLAUDE.md` / `DESIGN.md` を参照
|
|
189
|
+
- バージョンアップ時の確認事項・PR 手順は `UPDATING.md` を参照
|
|
189
190
|
|
|
190
191
|
## 📈 ダウンロード数
|
|
191
192
|
|
package/RELEASE.md
CHANGED
|
@@ -70,7 +70,7 @@ GitHub Releases にコピペできるテンプレ:
|
|
|
70
70
|
|
|
71
71
|
```md
|
|
72
72
|
### Breaking Changes
|
|
73
|
-
- `OldComponent` を削除。`NewComponent`
|
|
73
|
+
- `OldComponent` を削除。`NewComponent` を使ってください。<!-- docs-drift-ignore: OldComponent NewComponent -->
|
|
74
74
|
自動移行: `npx ksk-design-system codemod v1-to-v2 ./src`
|
|
75
75
|
- 詳細: [MIGRATION.md](./MIGRATION.md)
|
|
76
76
|
```
|
|
@@ -80,3 +80,4 @@ GitHub Releases にコピペできるテンプレ:
|
|
|
80
80
|
- [PUBLISHING.md](./PUBLISHING.md) — 実際の手順
|
|
81
81
|
- [MIGRATION.md](./MIGRATION.md) — メジャー毎の移行ガイド
|
|
82
82
|
- [scripts/codemod/README.md](./scripts/codemod/README.md) — codemod 雛形と使い方
|
|
83
|
+
- [UPDATING.md](./UPDATING.md) — 消費側(DS を npm 依存に持つプロジェクト)向けのアップデート手順
|
package/UPDATING.md
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# Updating Guide — `ksk-design-system` を使うプロジェクト向け
|
|
2
|
+
|
|
3
|
+
`ksk-design-system` を npm 依存として利用しているプロジェクト(消費リポ)が、
|
|
4
|
+
バージョンアップ時に何を確認し、どう作業すればよいかをまとめたガイド。
|
|
5
|
+
|
|
6
|
+
DS 本体側のリリース運用は [RELEASE.md](./RELEASE.md) / [PUBLISHING.md](./PUBLISHING.md)、
|
|
7
|
+
破壊変更の詳細は [MIGRATION.md](./MIGRATION.md) を参照。本ファイルは**消費側**の視点に特化する。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 前提
|
|
12
|
+
|
|
13
|
+
- `package.json` の依存は通常キャレット指定(`"ksk-design-system": "^1.x.x"`)。
|
|
14
|
+
`npm install` するだけでは **patch/minor は自動では上がらない**(lockfile が既存バージョンを固定するため)。
|
|
15
|
+
実際にバージョンを上げるのは `npm install ksk-design-system@latest` 等を明示的に実行したときだけ。
|
|
16
|
+
- したがって「アップデート」は自動で降ってくるものではなく、**意図的な PR 作業**として扱う。
|
|
17
|
+
無警戒に `npm update` を通常の依存更新作業に混ぜない。
|
|
18
|
+
|
|
19
|
+
## 2. 1.x でのバージョンの読み方
|
|
20
|
+
|
|
21
|
+
[Semantic Versioning](https://semver.org/lang/ja/) に従う。`X.Y.Z` の各桁の意味:
|
|
22
|
+
|
|
23
|
+
| 種別 | 意味 | 対応要否 |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| **patch**(`X.Y.Z` の Z) | バグ修正・内部最適化のみ | 対応不要。そのまま上げてよい |
|
|
26
|
+
| **minor**(`X.Y.Z` の Y) | 新コンポーネント・新 prop 追加など機能追加。既存 API は壊れない想定だが、**視覚的な変更**(デフォルト値の見た目調整など)が入ることがある。まれに識別子の rename 等「要対応」の変更も minor で入る | 上げた後は画面を目視確認。**必ず [MIGRATION.md](./MIGRATION.md) の当該バージョン節を確認**する |
|
|
27
|
+
| **major**(`X.Y.Z` の X) | 2.0 以降、正式な破壊変更を含むリリース | [MIGRATION.md](./MIGRATION.md) 必読。codemod / 手動移行が前提 |
|
|
28
|
+
|
|
29
|
+
**実例(minor だが要対応だったケース)**: v1.34.0 で npm パッケージ名が `@ksk/design-system` → `ksk-design-system` に変更された。
|
|
30
|
+
機能的な破壊変更ではないため minor リリースだったが、消費側は `import` 文とpackage.json の依存名を一括置換する必要があった。
|
|
31
|
+
「minor だから確認不要」と決めつけず、必ず MIGRATION.md の該当バージョン節に目を通すこと。
|
|
32
|
+
|
|
33
|
+
## 3. いつ・誰が上げるか
|
|
34
|
+
|
|
35
|
+
DS メンテナが新バージョンを `npm publish` した後、`scripts/update-consumers.sh` を実行して
|
|
36
|
+
対象の消費リポに対して一括で bump PR を自動起票する(各リポに `chore/bump-ds-<version>` ブランチを作成し、
|
|
37
|
+
`package.json` の書き換え・`npm install`・commit・push・`gh pr create` まで自動で行う)。
|
|
38
|
+
|
|
39
|
+
- 対象リポの一覧は `scripts/update-consumers.sh` のデフォルト引数が正本。バージョンや対象は都度変わりうるため、本書に固定のリポ名・リポ数は書かない。
|
|
40
|
+
- 各消費リポ側の作業は、**起票された PR の内容を確認してマージする**こと(下記チェックリスト参照)。
|
|
41
|
+
- 緊急のホットフィックス(本番障害対応)の場合も同じ流れで、影響リポに絞って配布されることがある。
|
|
42
|
+
|
|
43
|
+
## 4. 手順(消費リポ側で手動アップデートする場合)
|
|
44
|
+
|
|
45
|
+
一括 PR を待たずに自分で上げる場合、または一括 PR の内容を検証する場合の手順:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 1. 現在のバージョンと最新版を確認
|
|
49
|
+
npm view ksk-design-system version
|
|
50
|
+
cat node_modules/ksk-design-system/package.json | grep '"version"'
|
|
51
|
+
|
|
52
|
+
# 2. 作業ブランチを切る
|
|
53
|
+
git checkout -b chore/bump-ds-<version>
|
|
54
|
+
|
|
55
|
+
# 3. 最新化
|
|
56
|
+
npm install ksk-design-system@latest
|
|
57
|
+
# 特定バージョンを指定する場合:
|
|
58
|
+
# npm install ksk-design-system@1.44.0
|
|
59
|
+
|
|
60
|
+
# 4. 非推奨 API の残存を検査(read-only。書き換えは行わない)
|
|
61
|
+
npx ksk-design-system check-migration ./src
|
|
62
|
+
|
|
63
|
+
# 5. 検出があれば MIGRATION.md の該当バージョン節の手順に従って移行する
|
|
64
|
+
# (codemod が提供されているバージョンは MIGRATION.md に実行コマンドが記載される。
|
|
65
|
+
# 提供がないバージョンは MIGRATION.md の before/after に沿って手動で置換)
|
|
66
|
+
git diff # 移行で src を書き換えた場合は意図通りか必ず目視確認
|
|
67
|
+
|
|
68
|
+
# 6. ビルド・lint・テスト
|
|
69
|
+
npm run build
|
|
70
|
+
npm run lint
|
|
71
|
+
npm test
|
|
72
|
+
|
|
73
|
+
# 7. 目視確認(視覚変更があり得る minor 以上は特に)
|
|
74
|
+
npm run dev # または storybook 等、対象プロジェクトの起動コマンド
|
|
75
|
+
|
|
76
|
+
# 8. commit / push / PR
|
|
77
|
+
# 依存ファイルに加え、移行(codemod / 手動置換)で書き換えたソースも忘れずに stage する
|
|
78
|
+
git add package.json package-lock.json
|
|
79
|
+
git add <移行で変更した src 配下のファイル> # 変更がある場合。git status で漏れがないか確認
|
|
80
|
+
git commit -m "chore: ksk-design-system を <version> に更新"
|
|
81
|
+
git push -u origin chore/bump-ds-<version>
|
|
82
|
+
gh pr create
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
手動移行が必要な項目(codemod で拾いきれないもの)は [MIGRATION.md](./MIGRATION.md) の
|
|
86
|
+
「移行作業の進め方」節を参照。
|
|
87
|
+
|
|
88
|
+
## 5. していい・ダメ早見表
|
|
89
|
+
|
|
90
|
+
| していい | ダメ |
|
|
91
|
+
|---|---|
|
|
92
|
+
| `^1.x.x` のようなキャレット指定で依存を宣言する | `"*"` や `"latest"` で依存バージョンを固定禁止にする(意図しない破壊変更を無警戒に取り込む) |
|
|
93
|
+
| `npm install ksk-design-system@latest` で明示的に更新する | `node_modules/ksk-design-system` の中身を直接編集する(次の `npm install` で消え、変更が誰にも共有されない) |
|
|
94
|
+
| アップデート専用の PR(`chore/bump-ds-*`)を切る | 機能開発 PR に依存バージョン更新を混ぜる(レビューが困難になり、ロールバック時に機能ごと戻ってしまう) |
|
|
95
|
+
| `npx ksk-design-system check-migration ./src` で非推奨 API の残存を確認する | 警告を無視して非推奨 API を放置したままメジャーへ上げる |
|
|
96
|
+
| MIGRATION.md を確認してから minor/major を上げる | バージョン種別だけを見て「minor だから安全」と確認を省略する |
|
|
97
|
+
|
|
98
|
+
## 6. トラブル時
|
|
99
|
+
|
|
100
|
+
### ロールバック
|
|
101
|
+
|
|
102
|
+
問題が出た場合は前バージョンに戻す:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npm install ksk-design-system@<前のバージョン>
|
|
106
|
+
git diff package.json package-lock.json # 意図通り戻ったか確認
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
戻した後は、DS 側の Issue に再現手順を添えて報告する(下記「Issue 起票先」参照)。
|
|
110
|
+
|
|
111
|
+
### npm キャッシュが反映されない
|
|
112
|
+
|
|
113
|
+
`npm view ksk-design-system version` で最新バージョンが取得できない、
|
|
114
|
+
または `npm install` 後もバージョンが変わらない場合:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
npm cache verify # まずキャッシュの整合性を確認
|
|
118
|
+
npm install ksk-design-system@<version> # バージョンを明示して再取得
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
publish 直後は registry への反映に数分かかることがあるため、少し待ってから再実行する。
|
|
122
|
+
それでも解決しない場合は `npm cache clean --force` の後に上記の再取得を試す。
|
|
123
|
+
**追跡済みの `package-lock.json` を削除しないこと**(lockfile 全体が再生成され、
|
|
124
|
+
無関係な依存まで差分に混ざる)。
|
|
125
|
+
|
|
126
|
+
### peer dependency 警告
|
|
127
|
+
|
|
128
|
+
`npm install` 時に React / Tailwind CSS のバージョン不一致警告が出ることがある。
|
|
129
|
+
`package.json#peerDependencies` の範囲を確認し、警告の対象パッケージ自体を先に更新してから
|
|
130
|
+
`ksk-design-system` を上げる。警告を `--force` / `--legacy-peer-deps` で握りつぶして進めない。
|
|
131
|
+
|
|
132
|
+
### Issue 起票先
|
|
133
|
+
|
|
134
|
+
DS 本体のバグ・想定外の破壊変更に遭遇した場合は、
|
|
135
|
+
`ksk-design-system` リポジトリ([GitHub](https://github.com/ekusiek716/ksk-design-system))に Issue を起票する。
|
|
136
|
+
再現手順・バージョン(更新前後)・エラーメッセージを添えること。
|
|
137
|
+
|
|
138
|
+
## 7. 関連ドキュメント
|
|
139
|
+
|
|
140
|
+
| ファイル | 役割 |
|
|
141
|
+
|---|---|
|
|
142
|
+
| [RELEASE.md](./RELEASE.md) | DS 側のリリースサイクル・運用ルール(メンテナ向け) |
|
|
143
|
+
| [PUBLISHING.md](./PUBLISHING.md) | DS 側の公開・配布手順(`npm publish` 〜 `update-consumers.sh`。メンテナ向け) |
|
|
144
|
+
| [MIGRATION.md](./MIGRATION.md) | バージョン間の変更点・破壊変更の詳細(消費側が上げる際に必読) |
|
|
145
|
+
| **本ファイル(UPDATING.md)** | 消費側がアップデート PR をどう作業するかの手順書 |
|
package/bin/init.js
CHANGED
|
@@ -36,6 +36,7 @@ if (cmd === "help" || cmd === "--help" || cmd === "-h") {
|
|
|
36
36
|
npx ksk-ds lint src DS-first ルール違反を検査
|
|
37
37
|
npx ksk-ds lint src --format json CI 向け JSON 出力
|
|
38
38
|
npx ksk-ds lint --changed Git 差分のみ検査
|
|
39
|
+
npx ksk-ds check-migration ./src 非推奨 API の残存を検査(read-only)
|
|
39
40
|
`)
|
|
40
41
|
process.exit(0)
|
|
41
42
|
}
|
|
@@ -46,6 +47,12 @@ if (cmd === "lint") {
|
|
|
46
47
|
process.exit(status)
|
|
47
48
|
}
|
|
48
49
|
|
|
50
|
+
if (cmd === "check-migration") {
|
|
51
|
+
const { runCheckMigrationCli } = await import("../scripts/codemod/check-migration.mjs")
|
|
52
|
+
const status = runCheckMigrationCli(args.slice(1))
|
|
53
|
+
process.exit(status)
|
|
54
|
+
}
|
|
55
|
+
|
|
49
56
|
if (cmd === "demo") {
|
|
50
57
|
runDemo(args.slice(1))
|
|
51
58
|
process.exit(0)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "KSK Design System — Component Contracts",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.45.0",
|
|
5
5
|
"description": "全コンポーネントの構造化定義。バリアント・アクセシビリティ要件・使用ルールを機械可読形式で管理。",
|
|
6
6
|
"counts": {
|
|
7
7
|
"ui": 61,
|
|
8
|
-
"patterns":
|
|
8
|
+
"patterns": 54,
|
|
9
9
|
"commerce": 12,
|
|
10
10
|
"admin": 8,
|
|
11
11
|
"shells": 3,
|
|
12
|
-
"total":
|
|
12
|
+
"total": 138
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
"ui": [
|
|
@@ -294,7 +294,7 @@
|
|
|
294
294
|
{
|
|
295
295
|
"name": "Sheet",
|
|
296
296
|
"path": "src/components/ui/sheet.tsx",
|
|
297
|
-
"description": "サイドパネル・ボトムシート。フィルター・メニュー・補助入力に使用。モーダルより軽いコンテキストに。snapPoints でスナップ式、swipeToClose で下スワイプ閉じを有効化。autoFocus / restoreFocusOnClose / closeOnEsc / bodyScrollLock でフォーカス・スクロール挙動を制御可能。",
|
|
297
|
+
"description": "サイドパネル・ボトムシート。フィルター・メニュー・補助入力に使用。モーダルより軽いコンテキストに。snapPoints でスナップ式、swipeToClose で下スワイプ閉じを有効化。autoFocus / restoreFocusOnClose / closeOnEsc / bodyScrollLock でフォーカス・スクロール挙動を制御可能。 多段(シートの上にシート)では open 順に overlay/content の z-index が自動繰り上げされ、zIndex / overlayClassName で上書き可能。",
|
|
298
298
|
"subcomponents": [
|
|
299
299
|
"SheetTrigger",
|
|
300
300
|
"SheetContent",
|
|
@@ -428,10 +428,13 @@
|
|
|
428
428
|
{
|
|
429
429
|
"name": "Skeleton",
|
|
430
430
|
"path": "src/components/ui/skeleton.tsx",
|
|
431
|
-
"description": "読み込み中プレースホルダ。width/height/rounded shorthand 対応。",
|
|
431
|
+
"description": "読み込み中プレースホルダ。width/height/rounded shorthand 対応。SkeletonText は lines 指定の複数行テキストプレースホルダ(最終行短縮)。",
|
|
432
432
|
"rules": [
|
|
433
433
|
"数値は px、文字列は CSS 値として渡る",
|
|
434
434
|
"rounded: none/sm/md/lg/xl/2xl/full プリセット"
|
|
435
|
+
],
|
|
436
|
+
"subcomponents": [
|
|
437
|
+
"SkeletonText"
|
|
435
438
|
]
|
|
436
439
|
},
|
|
437
440
|
{
|
|
@@ -967,6 +970,24 @@
|
|
|
967
970
|
"Color + icon + text. Include retry action."
|
|
968
971
|
]
|
|
969
972
|
},
|
|
973
|
+
{
|
|
974
|
+
"name": "Prose",
|
|
975
|
+
"path": "src/components/patterns/prose.tsx",
|
|
976
|
+
"description": "静的文書(プライバシーポリシー・利用規約等)の本文レンダラー。sections: {title, body: string[]}[] を受けて見出し+段落を統一タイポで描画する。native の Prose.tsx と props 形が一致。",
|
|
977
|
+
"rules": [
|
|
978
|
+
"見出しは typo-heading-md、段落は typo-body-md",
|
|
979
|
+
"DocumentPage の子として使う想定だが単体でも利用可"
|
|
980
|
+
]
|
|
981
|
+
},
|
|
982
|
+
{
|
|
983
|
+
"name": "DocumentPage",
|
|
984
|
+
"path": "src/components/patterns/document-page.tsx",
|
|
985
|
+
"description": "プライバシーポリシー・利用規約などの静的文書ページ。タイトル・最終更新日・本文(Prose)を固定スペーシングで組む。native の DocumentScreen.tsx に対応(web は単体ページのため命名を DocumentPage とし、戻るナビは呼び出し側のシェルに委ねる)。",
|
|
986
|
+
"rules": [
|
|
987
|
+
"本文は max-w-2xl に収めて読みやすい行長にする",
|
|
988
|
+
"戻るナビは持たない。必要なら呼び出し側のレイアウトシェルで用意する"
|
|
989
|
+
]
|
|
990
|
+
},
|
|
970
991
|
{
|
|
971
992
|
"name": "SectionHeader",
|
|
972
993
|
"path": "src/components/patterns/section-header.tsx",
|
|
@@ -1620,9 +1641,10 @@
|
|
|
1620
1641
|
{
|
|
1621
1642
|
"name": "BottomSheetFrame",
|
|
1622
1643
|
"path": "src/components/patterns/bottom-sheet-frame.tsx",
|
|
1623
|
-
"description": "SheetContent の responsive outer frame preset。mobile-full / mobile-form / desktop-floating を宣言し、DetailSheetScaffold と KeyboardAwareSheetFooter を内側で合成する。",
|
|
1644
|
+
"description": "SheetContent の responsive outer frame preset。mobile-full / mobile-page(iOS ページシート風・上端 2rem ギャップ)/ mobile-form / desktop-floating を宣言し、DetailSheetScaffold と KeyboardAwareSheetFooter を内側で合成する。",
|
|
1624
1645
|
"variants": [
|
|
1625
1646
|
"mobile-full",
|
|
1647
|
+
"mobile-page",
|
|
1626
1648
|
"mobile-form",
|
|
1627
1649
|
"desktop-floating"
|
|
1628
1650
|
],
|
|
@@ -1848,7 +1870,7 @@
|
|
|
1848
1870
|
{
|
|
1849
1871
|
"name": "BottomTabBar",
|
|
1850
1872
|
"path": "src/components/patterns/commerce/bottom-tab-bar.tsx",
|
|
1851
|
-
"description": "SP 下部固定タブナビゲーション。default と pill(iOS 26 Liquid Glass)バリアント。pill は centerAction・ラベル表示・inverse tone・mobile shell max-width・floatingPosition(left/center/right
|
|
1873
|
+
"description": "SP 下部固定タブナビゲーション。default と pill(iOS 26 Liquid Glass)バリアント。pill は centerAction・ラベル表示・inverse tone・mobile shell max-width・floatingPosition(left/center/right)に対応。選択カプセルはアイコン+ラベルを包む水滴(droplet)で、タブ切替時にスライドして移動する。scrollEdge でバー背後に progressive blur(iOS 26 scroll edge effect)を敷ける。",
|
|
1852
1874
|
"features": [
|
|
1853
1875
|
"badge",
|
|
1854
1876
|
"centerAction",
|
|
@@ -1859,6 +1881,8 @@
|
|
|
1859
1881
|
"maxWidth",
|
|
1860
1882
|
"inverse-tone",
|
|
1861
1883
|
"floatingPosition",
|
|
1884
|
+
"sliding-selection-platter",
|
|
1885
|
+
"scrollEdge",
|
|
1862
1886
|
"native Expo Router tabBar adapter",
|
|
1863
1887
|
"native hidden routes"
|
|
1864
1888
|
],
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
{
|
|
2
|
+
"meta": {
|
|
3
|
+
"name": "KSK Design System — Composition Contracts",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "選んだ画面パターン内部で、シェル骨格・余白リズム・カード階層・テキスト階層・CTA優先度をどう組むかを定義する機械可読契約。roleSeparation: contracts/screen-patterns.json が「どのパターン(シェル・crud・遷移)を使うか」を decisionTree で決め、本ファイルはその内部を「どう並べるか」を pageSkeletons/spacingRhythm/cardHierarchy/textHierarchy/ctaHierarchy で決める。requiredComponents/optionalComponents は contracts/components.json の実在名と一致すること(scripts/check-screen-contracts.mjs で検証)。"
|
|
6
|
+
},
|
|
7
|
+
"pageSkeletons": {
|
|
8
|
+
"mobile": {
|
|
9
|
+
"requiredComponents": ["MobileAppShell"],
|
|
10
|
+
"optionalComponents": ["MobileAppHeader", "BottomTabBar", "MobileTabBar", "MobileFloatingActionButton", "NavigationBar"],
|
|
11
|
+
"implementation": "src/components/patterns/mobile-app-shell.tsx",
|
|
12
|
+
"structure": [
|
|
13
|
+
"MobileAppShell (min-h-dvh, bg-[var(--Surface-Secondary)], mx-auto max-width=430 で中央プレビュー)",
|
|
14
|
+
" header slot: sticky top-0 z-40 (MobileAppHeader 等)",
|
|
15
|
+
" main (bottomPadding prop により pb-20/pb-28 をシェル側が自動付与。消費側で個別に padding-bottom を積み増さない)",
|
|
16
|
+
" content wrapper (contentClassName)",
|
|
17
|
+
" bottomNav slot: fixed inset-x-0 bottom-0 z-40, pb-[env(safe-area-inset-bottom)] をシェルが処理",
|
|
18
|
+
" fab slot: bottomNav の上に浮くレイヤーとしてシェルが配置"
|
|
19
|
+
],
|
|
20
|
+
"rules": [
|
|
21
|
+
"下部固定要素(BottomTabBar/MobileFloatingActionButton)分の余白は MobileAppShell の bottomPadding prop(\"bottom-nav\" | \"bottom-nav-fab\")に持たせる。ページ側で pb-* を手書きしない(シェルとの二重計上を防ぐ)",
|
|
22
|
+
"safe-area-inset-bottom の吸収はシェルの責務。消費側コンポーネントで env(safe-area-inset-bottom) を再実装しない",
|
|
23
|
+
"モバイル起点のプロダクトが PC 対応する場合は desktopSidebar slot を使い、同一シェル内で lg: 分岐する(screen-patterns.json の判断基準と同じ。デスクトップ起点の業務/Web ページであれば最初から AppShell を選ぶ — MobileAppShell からの差し替えや viewport 分岐での併用はしない)"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"desktop": {
|
|
27
|
+
"requiredComponents": ["AppShell"],
|
|
28
|
+
"optionalComponents": ["Breadcrumb", "SectionHeader", "SubNav"],
|
|
29
|
+
"implementation": "src/components/patterns/shells/app-shell.tsx",
|
|
30
|
+
"structure": [
|
|
31
|
+
"AppShell (flex flex-col min-h-screen, bg-[var(--Surface-Primary)])",
|
|
32
|
+
" topBar slot: sticky top-0 z-40, border-b, h-14, px-4",
|
|
33
|
+
" main (flex-1。bottomNav が渡された場合のみ pb-16 をシェルが自動付与)",
|
|
34
|
+
" bottomNav slot: fixed bottom-0 inset-x-0 z-40, h-14(PC でモバイル的下部ナビを使う場合のみ)"
|
|
35
|
+
],
|
|
36
|
+
"rules": [
|
|
37
|
+
"topBar の高さ(h-14=56px)は固定値。ページ側で高さを変えたい場合は topBar 内の要素で padding 調整し、シェルの h-14 自体は変更しない",
|
|
38
|
+
"bottomNav を渡すページは main に pb-16 が自動で付くため、ページ側で追加の下部余白を積まない"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"admin": {
|
|
42
|
+
"requiredComponents": ["AdminShell"],
|
|
43
|
+
"optionalComponents": ["DataTable", "SearchPanel", "StatusTabs", "BulkActions"],
|
|
44
|
+
"implementation": "src/components/patterns/shells/admin-shell.tsx",
|
|
45
|
+
"structure": [
|
|
46
|
+
"AdminShell (flex h-screen, bg-[var(--Surface-Secondary)])",
|
|
47
|
+
" sidebar slot: aside hidden lg:flex, border-r, bg-[var(--Surface-Primary)], ScrollArea でラップ済み(sidebarWidth prop で幅調整、既定 w-64)",
|
|
48
|
+
" header slot: 任意。border-b, h-16, px-6",
|
|
49
|
+
" main: flex-1 overflow-auto p-6(ページコンテンツの外周余白はここで確保済み)"
|
|
50
|
+
],
|
|
51
|
+
"rules": [
|
|
52
|
+
"main の p-6(24px)がページ外周の既定余白。ページ側で二重に外周 padding を足さない",
|
|
53
|
+
"sidebar は lg 未満で hidden になる(モバイル用の代替ナビは呼び出し側の責務。AdminShell 自体はモバイル用ドロワーを持たない)",
|
|
54
|
+
"sidebarWidth を変える場合、hidden lg:flex は維持し幅クラスのみ差し替える"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
"marketing": {
|
|
58
|
+
"requiredComponents": ["MarketingShell"],
|
|
59
|
+
"optionalComponents": ["Footer", "BannerCarousel", "CountdownHero", "PhotoHero"],
|
|
60
|
+
"implementation": "src/components/patterns/shells/marketing-shell.tsx",
|
|
61
|
+
"structure": [
|
|
62
|
+
"MarketingShell (flex flex-col min-h-screen, bg-[var(--Surface-Primary)])",
|
|
63
|
+
" header slot: sticky top-0 z-40, bg-[var(--Surface-Primary)]/95 backdrop-blur, h-16, px-6 lg:px-16",
|
|
64
|
+
" main: flex-1",
|
|
65
|
+
" footer slot: border-t, bg-[var(--Surface-Secondary)], py-12, px-6 lg:px-16"
|
|
66
|
+
],
|
|
67
|
+
"rules": [
|
|
68
|
+
"左右の外周余白は px-6(モバイル)/ lg:px-16(デスクトップ)をシェルの header/footer が既に持つ。main 直下のセクションはページ側で同じ px-6 lg:px-16 を明示して揃える(シェルは main 自体に横 padding を強制しないため)",
|
|
69
|
+
"header は backdrop-blur 前提の半透明背景。header 直下に実質同色の不透明要素を重ねる場合は視覚的な二重線に注意する"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"spacingRhythm": {
|
|
74
|
+
"levels": [
|
|
75
|
+
{ "level": 0, "spacing": "4px (gap-1)", "usage": "ラベルと補助テキストなど、同一要素内の密接な関連情報" },
|
|
76
|
+
{ "level": 1, "spacing": "8px〜12px (gap-2 / gap-3)", "usage": "アイコンとテキスト、ボタン同士の横並び、FormActions の要素間" },
|
|
77
|
+
{ "level": 2, "spacing": "16px (gap-4)", "usage": "FormSection 内のフィールド間、カード内のブロック間" },
|
|
78
|
+
{ "level": 3, "spacing": "24px (gap-6)", "usage": "FormRoot のセクション間、ページ内の主要ブロック間の既定リズム" }
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
"cardHierarchy": {
|
|
82
|
+
"layers": [
|
|
83
|
+
{ "depth": 0, "token": "var(--Surface-Secondary)", "usage": "ページ/シェルの背景(AdminShell・MobileAppShell 等の基底面)" },
|
|
84
|
+
{ "depth": 1, "token": "var(--Surface-Primary)", "usage": "最初の浮き上がり面。Card / シート / ヘッダー・サイドバーなどページ背景の上に乗る面" },
|
|
85
|
+
{ "depth": 2, "token": "var(--Surface-Tertiary)", "usage": "Card 内部でさらに一段沈める領域(コードブロック風の埋め込み、入れ子カード等)" },
|
|
86
|
+
{ "depth": 3, "token": "var(--Surface-Quaternary)", "usage": "選択・ホバーなどインタラクション状態の強調背景(常設の階層としては使わない)" }
|
|
87
|
+
],
|
|
88
|
+
"note": "hex 値は書かない。実測値が要る場合は contracts/token-hex-cache.json(デフォルトテーマ解決済み)を参照する。"
|
|
89
|
+
},
|
|
90
|
+
"textHierarchy": {
|
|
91
|
+
"tree": [
|
|
92
|
+
{ "role": "画面タイトル / H1", "typo": "typo-heading-2xl", "color": "var(--Text-High-Emphasis)" },
|
|
93
|
+
{ "role": "セクション見出し / H2", "typo": "typo-heading-xl", "color": "var(--Text-High-Emphasis)" },
|
|
94
|
+
{ "role": "カード見出し / H3", "typo": "typo-heading-md", "color": "var(--Text-High-Emphasis)" },
|
|
95
|
+
{ "role": "本文", "typo": "typo-body-md", "color": "var(--Text-High-Emphasis)" },
|
|
96
|
+
{ "role": "補助本文 / 説明文", "typo": "typo-body-sm", "color": "var(--Text-Medium-Emphasis)" },
|
|
97
|
+
{ "role": "ラベル(フォーム・ボタン・ナビ)", "typo": "typo-label-md", "color": "var(--Text-High-Emphasis)" },
|
|
98
|
+
{ "role": "メタ情報 / タイムスタンプ", "typo": "typo-label-sm", "color": "var(--Text-Low-Emphasis)" },
|
|
99
|
+
{ "role": "法的表記 / 注釈", "typo": "typo-caption", "color": "var(--Text-Low-Emphasis)" },
|
|
100
|
+
{ "role": "暗背景・画像上のテキスト", "typo": "typo-on-image", "color": "var(--Text-on-Inverse)" }
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"ctaHierarchy": {
|
|
104
|
+
"priority": [
|
|
105
|
+
{ "variant": "default", "role": "primary", "note": "1ビューポート1つまで。最重要 CTA(保存・購入・次へ 等)" },
|
|
106
|
+
{ "variant": "accent", "role": "primary-decorative", "note": "primary と同格だがブランドグラデーションで一段強く目立たせたい特別な CTA(ヒーローセクション等)。default と併用しない" },
|
|
107
|
+
{ "variant": "secondary", "role": "secondary", "note": "primary と並ぶ選択肢・戻る" },
|
|
108
|
+
{ "variant": "secondary-switch", "role": "secondary-selected", "note": "secondary のトグル選択状態(選択中のフィルタ切替等)" },
|
|
109
|
+
{ "variant": "tertiary", "role": "tertiary", "note": "primary/secondary より弱い並列アクション" },
|
|
110
|
+
{ "variant": "ghost", "role": "low-emphasis", "note": "文字寄りの補助操作" },
|
|
111
|
+
{ "variant": "link", "role": "inline", "note": "本文内リンク相当の操作" },
|
|
112
|
+
{ "variant": "destructive", "role": "danger", "note": "削除・取り消し等。alert-dialog / ConfirmDialog 内で使うことが多い" },
|
|
113
|
+
{ "variant": "inverse", "role": "primary-on-dark", "note": "暗背景・ヒーローセクション上の primary 相当" },
|
|
114
|
+
{ "variant": "ghost-inverse", "role": "low-emphasis-on-dark", "note": "暗背景上の ghost 相当" },
|
|
115
|
+
{ "variant": "glass", "role": "primary-on-glass", "note": "Liquid Glass 背景上の CTA" },
|
|
116
|
+
{ "variant": "glass-inverse", "role": "primary-on-glass-dark", "note": "暗背景上の Liquid Glass CTA" },
|
|
117
|
+
{ "variant": "glass-accent", "role": "primary-on-glass-accent", "note": "FAB 等、glass より一段強い主要アクション" }
|
|
118
|
+
],
|
|
119
|
+
"rules": [
|
|
120
|
+
"primary(default)は1ビューポートにつき1つまで。同一ビューポートに複数の primary CTA を並べない",
|
|
121
|
+
"destructive は確認なしの即時実行トリガーにしない。alert-dialog / ConfirmDialog を経由させる",
|
|
122
|
+
"同一画面で glass 系と非 glass 系の CTA variant を隣接して混在させない(背景コンテキストが揃っている範囲でのみ glass 系を使う)",
|
|
123
|
+
"CTA の優先度は上記 priority 配列の並び順を優先度の正本とする。同一画面に variant が複数出る場合、視覚的な強さの順序は配列順と一致させる"
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -53,6 +53,30 @@
|
|
|
53
53
|
"storybook coverage hints",
|
|
54
54
|
"DS-first recipes"
|
|
55
55
|
]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"path": "contracts/token-hex-cache.json",
|
|
59
|
+
"owns": [
|
|
60
|
+
"default-theme resolved semantic hex values (generated sidecar; theme-dependent keys listed in meta.themeDependentKeys)"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"path": "contracts/screen-patterns.json",
|
|
65
|
+
"owns": [
|
|
66
|
+
"screen shell/pattern selection (decisionTree)",
|
|
67
|
+
"crud-to-pattern mapping",
|
|
68
|
+
"edit UI selection criteria (dialog vs page vs focused workspace)"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"path": "contracts/composition.json",
|
|
73
|
+
"owns": [
|
|
74
|
+
"page skeleton structure per shell",
|
|
75
|
+
"spacing rhythm",
|
|
76
|
+
"card/surface depth hierarchy",
|
|
77
|
+
"text hierarchy (typo-* x Text-* tokens)",
|
|
78
|
+
"CTA priority hierarchy (Button variant ordering)"
|
|
79
|
+
]
|
|
56
80
|
}
|
|
57
81
|
],
|
|
58
82
|
"designMd": {
|