ksk-design-system 1.56.0 → 1.58.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.
Files changed (50) hide show
  1. package/AGENTS.md +11 -0
  2. package/CLAUDE.md +11 -0
  3. package/DESIGN.md +46 -0
  4. package/MIGRATION.md +43 -0
  5. package/bin/check-migration.js +517 -0
  6. package/bin/init.js +3 -2
  7. package/bin/lint.js +79 -4
  8. package/bin/product-theme-override.js +52 -0
  9. package/contracts/components.json +61 -13
  10. package/contracts/deprecations.json +92 -0
  11. package/contracts/product-theme-overrides.json +171 -0
  12. package/contracts/rules.json +14 -2
  13. package/contracts/token-hex-cache.json +1 -1
  14. package/dist/class-names.js +1 -1
  15. package/dist/index.js +4533 -4361
  16. package/dist/native/ui.js +1665 -1552
  17. package/dist/{native-VkkXnB0e.js → native-DlR32_Lk.js} +8 -0
  18. package/dist/native.js +1 -1
  19. package/dist/{server-variants-usol4GK5.js → server-variants-B3uIQjUG.js} +24 -24
  20. package/dist/types/components/patterns/admin/data-table.d.ts +53 -4
  21. package/dist/types/components/patterns/chip-selector.d.ts +23 -7
  22. package/dist/types/components/patterns/list-item.d.ts +35 -2
  23. package/dist/types/components/patterns/search-bar.d.ts +9 -1
  24. package/dist/types/components/ui/alert-dialog.d.ts +1 -1
  25. package/dist/types/components/ui/dialog.d.ts +1 -1
  26. package/dist/types/components/ui/dropdown-menu.d.ts +1 -1
  27. package/dist/types/components/ui/pagination.d.ts +21 -4
  28. package/dist/types/components/ui/portal-container.d.ts +50 -0
  29. package/dist/types/components/ui/select.d.ts +3 -0
  30. package/dist/types/index.d.ts +7 -1
  31. package/dist/types/lib/build-page-items.d.ts +22 -0
  32. package/dist/types/lib/server-variants/button-variants.d.ts +7 -0
  33. package/dist/types/native/components/AppHeader.d.ts +9 -1
  34. package/dist/types/native/components/ChipSelector.d.ts +22 -1
  35. package/dist/types/native/components/Dialog.d.ts +17 -1
  36. package/dist/types/native/components/ListItem.d.ts +28 -1
  37. package/dist/types/native/components/Sheet.d.ts +10 -0
  38. package/dist/types/native/components/index.d.ts +3 -3
  39. package/dist/types/native/index.d.ts +2 -0
  40. package/dist/types/native/safe-area.d.ts +62 -0
  41. package/dist/types/native/theme/SafeAreaInsetsProvider.d.ts +18 -0
  42. package/dist/types/tokens/native/scales.d.ts +8 -0
  43. package/package.json +5 -2
  44. package/scripts/codemod/README.md +10 -8
  45. package/src/components/COMPONENT_LOOKUP.md +6 -5
  46. package/src/preset.css +8 -0
  47. package/src/styles/product-theme.css +90 -0
  48. package/src/styles/source-safelist.css +36 -4
  49. package/tokens.json +3 -1
  50. package/scripts/codemod/check-migration.mjs +0 -129
package/AGENTS.md CHANGED
@@ -38,6 +38,7 @@ UI を書く前に必ず確認すること:
38
38
  - [ ] CSS でベンダープレフィックス併記する場合、**`-webkit-` を先・標準形を後**に書いたか(消費側の minifier が同一プロパティとして dedupe し後勝ちのみ残すため。逆順だと Firefox で静かに無効化。`node scripts/check-prefix-order.mjs` が CI で検出)
39
39
  - [ ] flex 行(flex-col でない flex)で shrink-0 の兄弟と可変テキストを並べるとき、テキスト側に `flex-1`(+ 必要なら `min-w-[...]` 下限)を付けたか(`min-w-0` だけだと 1 文字ずつ折り返すまで潰れる。issue #293。`node scripts/check-flex-shrink.mjs` が CI で検出、例外は `ksk-lint-ignore KFX001 -- 理由`)
40
40
  - [ ] クラス名は**完全な文字列**で書いたか(`` `bg-${color}` `` のような動的合成は静的抽出できず消費側で CSS が生成されない。分岐は三項演算子か cva variant で。`scripts/generate-source-safelist.mjs` が検出)
41
+ - [ ] コントロールの寸法(高さ・横 padding・角丸・カード余白)を書くとき、固定の `h-10` / `px-4` / `p-6` ではなく product theme の公開変数(`h-[var(--Control-Height-Md)]` / `p-[var(--Product-Card-Padding)]`)を参照したか(issue #364。許可リストは `contracts/product-theme-overrides.json`。Button 系は `--Control-*`、Input/Textarea/SelectTrigger は `--Field-*` とスケールが別)
41
42
  - [ ] `.tsx` 編集後に `bash scripts/lint-scratch.sh`、コンポーネント増減時は `npm run check` を実行したか
42
43
  - [ ] `FormField` を import する前にどちらか確認したか(react-hook-form の Controller と統合するなら `RhfFormField`=`ui/form` の `FormField` を index.ts で別名 export したもの。単純な label+error 表示は `patterns/form-field` の `FormField`。迷ったら後者)
43
44
 
@@ -77,6 +78,7 @@ tokens.json # カラー・スペーシング・シ
77
78
  contracts/token-hex-cache.json # semantic トークンのデフォルトテーマ解決済み hex(テーマ依存キーは meta.themeDependentKeys 参照・自動生成)
78
79
  src/components/COMPONENT_LOOKUP.md # バリアント・インポートパス一覧(自動生成)
79
80
  contracts/screen-patterns.json # 画面実装前にどのシェル/パターンを使うかの decisionTree・crudMatrix
81
+ contracts/product-theme-overrides.json # プロダクト単位で上書きしてよい CSS 変数の許可リスト(寸法・面)
80
82
  contracts/composition.json # 選んだパターン内部の並べ方(骨格構造・余白リズム・カード階層・テキスト階層・CTA優先度)
81
83
  ```
82
84
 
@@ -220,6 +222,8 @@ Brand色を差し替え(10行)→ Primitive Layer → Semantic Layer → Bri
220
222
  | **src/components/COMPONENT_LOOKUP.md** | 全コンポーネントのバリアント・インポートパス一覧(自動生成) |
221
223
  | **DESIGN.md** | AI エージェント向け視覚言語サマリ(トークン+意図・voice・motion) |
222
224
  | **contracts/screen-patterns.json** | 画面実装前にどのシェル/パターンを使うかを決める decisionTree・crudMatrix |
225
+ | **contracts/deprecations.json** | 非推奨 API の正本台帳(移行先・削除予定。MIGRATION.md の一覧節と check-migration CLI の入力) |
226
+ | **contracts/product-theme-overrides.json** | プロダクト単位で上書きしてよい CSS 変数の許可リスト(寸法・面。既定値は src/styles/product-theme.css・lint は P049) |
223
227
  | **contracts/composition.json** | 選んだパターン内部の並べ方(骨格構造・余白リズム・カード階層・テキスト階層・CTA優先度) |
224
228
 
225
229
  ---
@@ -241,6 +245,7 @@ src/
241
245
  │ ├── semantic.css # Layer 2: 用途別トークン
242
246
  │ ├── typography.css # typo-* ユーティリティ
243
247
  │ ├── motion.css # duration / easing トークン(--Motion-*)
248
+ │ ├── product-theme.css # プロダクト単位で上書きしてよい寸法・面の公開変数(issue #364)
244
249
  │ └── source-safelist.css # @source safelist(自動生成・手で編集しない / issue #258)
245
250
  ├── themes/ # default / orange / green / violet / blue
246
251
  ├── preset.css # 外部プロジェクト向けプリセット
@@ -270,6 +275,12 @@ npm run generate:lookup
270
275
  # DESIGN.md contract 検査
271
276
  npm run lint:design
272
277
 
278
+ # 非推奨 API 台帳の整合検査(台帳 ⇔ 実ソースの @deprecated JSDoc)
279
+ npm run lint:deprecations
280
+
281
+ # MIGRATION.md の「非推奨 API 一覧」節を台帳から再生成
282
+ npm run generate:migration-doc
283
+
273
284
  # @source safelist 再生成(新しい Tailwind クラスを使ったら実行)
274
285
  npm run generate:safelist
275
286
 
package/CLAUDE.md CHANGED
@@ -38,6 +38,7 @@ UI を書く前に必ず確認すること:
38
38
  - [ ] CSS でベンダープレフィックス併記する場合、**`-webkit-` を先・標準形を後**に書いたか(消費側の minifier が同一プロパティとして dedupe し後勝ちのみ残すため。逆順だと Firefox で静かに無効化。`node scripts/check-prefix-order.mjs` が CI で検出)
39
39
  - [ ] flex 行(flex-col でない flex)で shrink-0 の兄弟と可変テキストを並べるとき、テキスト側に `flex-1`(+ 必要なら `min-w-[...]` 下限)を付けたか(`min-w-0` だけだと 1 文字ずつ折り返すまで潰れる。issue #293。`node scripts/check-flex-shrink.mjs` が CI で検出、例外は `ksk-lint-ignore KFX001 -- 理由`)
40
40
  - [ ] クラス名は**完全な文字列**で書いたか(`` `bg-${color}` `` のような動的合成は静的抽出できず消費側で CSS が生成されない。分岐は三項演算子か cva variant で。`scripts/generate-source-safelist.mjs` が検出)
41
+ - [ ] コントロールの寸法(高さ・横 padding・角丸・カード余白)を書くとき、固定の `h-10` / `px-4` / `p-6` ではなく product theme の公開変数(`h-[var(--Control-Height-Md)]` / `p-[var(--Product-Card-Padding)]`)を参照したか(issue #364。許可リストは `contracts/product-theme-overrides.json`。Button 系は `--Control-*`、Input/Textarea/SelectTrigger は `--Field-*` とスケールが別)
41
42
  - [ ] `.tsx` 編集後に `bash scripts/lint-scratch.sh`、コンポーネント増減時は `npm run check` を実行したか
42
43
  - [ ] `FormField` を import する前にどちらか確認したか(react-hook-form の Controller と統合するなら `RhfFormField`=`ui/form` の `FormField` を index.ts で別名 export したもの。単純な label+error 表示は `patterns/form-field` の `FormField`。迷ったら後者)
43
44
 
@@ -67,6 +68,7 @@ tokens.json # カラー・スペーシング・シ
67
68
  contracts/token-hex-cache.json # semantic トークンのデフォルトテーマ解決済み hex(テーマ依存キーは meta.themeDependentKeys 参照・自動生成)
68
69
  src/components/COMPONENT_LOOKUP.md # バリアント・インポートパス一覧(自動生成)
69
70
  contracts/screen-patterns.json # 画面実装前にどのシェル/パターンを使うかの decisionTree・crudMatrix
71
+ contracts/product-theme-overrides.json # プロダクト単位で上書きしてよい CSS 変数の許可リスト(寸法・面)
70
72
  contracts/composition.json # 選んだパターン内部の並べ方(骨格構造・余白リズム・カード階層・テキスト階層・CTA優先度)
71
73
  ```
72
74
 
@@ -220,6 +222,8 @@ Brand色を差し替え(10行)→ Primitive Layer → Semantic Layer → Bri
220
222
  | **src/components/COMPONENT_LOOKUP.md** | 全コンポーネントのバリアント・インポートパス一覧(自動生成) |
221
223
  | **DESIGN.md** | AI エージェント向け視覚言語サマリ(トークン+意図・voice・motion) |
222
224
  | **contracts/screen-patterns.json** | 画面実装前にどのシェル/パターンを使うかを決める decisionTree・crudMatrix |
225
+ | **contracts/deprecations.json** | 非推奨 API の正本台帳(移行先・削除予定。MIGRATION.md の一覧節と check-migration CLI の入力) |
226
+ | **contracts/product-theme-overrides.json** | プロダクト単位で上書きしてよい CSS 変数の許可リスト(寸法・面。既定値は src/styles/product-theme.css・lint は P049) |
223
227
  | **contracts/composition.json** | 選んだパターン内部の並べ方(骨格構造・余白リズム・カード階層・テキスト階層・CTA優先度) |
224
228
 
225
229
  ---
@@ -241,6 +245,7 @@ src/
241
245
  │ ├── semantic.css # Layer 2: 用途別トークン
242
246
  │ ├── typography.css # typo-* ユーティリティ
243
247
  │ ├── motion.css # duration / easing トークン(--Motion-*)
248
+ │ ├── product-theme.css # プロダクト単位で上書きしてよい寸法・面の公開変数(issue #364)
244
249
  │ └── source-safelist.css # @source safelist(自動生成・手で編集しない / issue #258)
245
250
  ├── themes/ # default / orange / green / violet / blue
246
251
  ├── preset.css # 外部プロジェクト向けプリセット
@@ -270,6 +275,12 @@ npm run generate:lookup
270
275
  # DESIGN.md contract 検査
271
276
  npm run lint:design
272
277
 
278
+ # 非推奨 API 台帳の整合検査(台帳 ⇔ 実ソースの @deprecated JSDoc)
279
+ npm run lint:deprecations
280
+
281
+ # MIGRATION.md の「非推奨 API 一覧」節を台帳から再生成
282
+ npm run generate:migration-doc
283
+
273
284
  # @source safelist 再生成(新しい Tailwind クラスを使ったら実行)
274
285
  npm run generate:safelist
275
286
 
package/DESIGN.md CHANGED
@@ -171,6 +171,10 @@ KSK の必須正本・publish 依存にせず、KSK 固有の multi-theme / nati
171
171
  影は5段(`--shadow-sm/md/lg/dialog/tooltip`)。面は md、浮く要素(dropdown/popover)は lg、
172
172
  モーダルは dialog。**境界は影+1px罫線**で表現し、濃い影の多用は避ける。
173
173
 
174
+ 横スクロール中の固定列だけは方向付きの影を使う(`--shadow-sticky-inline-start` /
175
+ `--shadow-sticky-inline-end`)。命名は論理方向で、inline-start = 行の先頭側に固定された列が
176
+ 末尾方向へ落とす影。生の `rgba()` を直書きせず、必ずこのトークンを参照する。
177
+
174
178
  ## Shapes
175
179
 
176
180
  角丸はトークン化(ベタ書き禁止)。**面 < モーダル < シート**の順で丸くなる。
@@ -265,6 +269,48 @@ Portal に載る要素(Dialog / Sheet / Popover / Toast 等)は DOM 上の
265
269
  `z-10` / `z-20` のような小さい素の値は「コンポーネント内部の重なり」用途で、
266
270
  このグローバルスケールの対象外。
267
271
 
272
+ ## Product Theme Override(プロダクト単位の寸法調整)
273
+
274
+ マルチテーマ(Brand 10行差し替え)が切り替えるのは**色だけ**。コントロールの高さ・横 padding・
275
+ 角丸・カードの余白は、消費プロダクトが CSS 変数を上書きして調整する。className を何十箇所も
276
+ 書き換える運用(exam-kit の Card 角丸13箇所 = issue #332)を、変数1行に畳むための層。
277
+
278
+ 既定値は `src/styles/product-theme.css`、**上書きしてよい変数の許可リストは
279
+ `contracts/product-theme-overrides.json` が正本**。ここに無い変数(`--Hover-*` / `--Z-*` /
280
+ `--glass-*` など)は内部実装で、上書きすると DS を上げた瞬間に静かに壊れる。
281
+ `npx ksk-ds lint <consumer>/src` の **P049** が消費側 CSS を検査する。
282
+
283
+ | family | 変数 | 既定値 | 使う部品 |
284
+ |---|---|---|---|
285
+ | Control | `--Control-Height-{Xs,Sm,Md,Lg,Xl}` | 24 / 32 / 40 / 48 / 56px | Button の size |
286
+ | Control | `--Control-Padding-X-{Xs,Sm,Md,Lg,Xl}` | 8 / 12 / 16 / 24 / 32px | Button の size |
287
+ | Control | `--Control-Gap` / `--Control-Radius` | 8px / ピル | Button のアイコン間隔・角丸 |
288
+ | Field | `--Field-Height-{Sm,Md,Lg}` | 36 / 48 / 56px | Input / SelectTrigger |
289
+ | Field | `--Field-Padding-X-{Sm,Md,Lg}` / `--Field-Padding-Y` | 10 / 12 / 16px / 8px | Input / Textarea / SelectTrigger |
290
+ | Field | `--Field-Min-Height` / `--Field-Radius` | 80px / 8px | Textarea / フィールド共通の角丸 |
291
+ | Product | `--Product-Card-Padding` / `--Product-Card-Gap` | 24px / 24px | Card(default バリアント) |
292
+ | Product | `--Product-Page-Padding-Y` | 24px | AdminShell の `<main>` 縦 padding |
293
+ | Chip | `--Chip-Radius` | ピル | Chip の pill 角丸 |
294
+ | Tabs | `--Control-Height-Md` / `--Control-Padding-X-{Sm,Md}` / `--Control-Radius` / `--Field-Radius` | 40px / 12・16px / ピル / 8px | TabsList / TabsTrigger(Control・Field を再利用) |
295
+
296
+ - **Control と Field はスケールが別**。ksk のフィールドは元々ボタンより背が高く(Input は 48px、
297
+ Button の既定は 40px)、横 padding も狭い。片方に畳むとどちらかの実寸が変わるので分けている。
298
+ - 参照は arbitrary value(`h-[var(--Control-Height-Md)]`)。Motion / Layering / Radius と同じ
299
+ 「semantic 変数を Tailwind の任意値で読む」流儀に揃えてある。`@theme` のユーティリティ化はしない
300
+ (`:root` 以外のスコープに当てた上書きが効かなくなるため)。
301
+ - 上書きは `:root` でも任意の要素でもよい。カスケードだけで解決するので Server Component のまま使える。
302
+ - タップ領域(`Button size="icon-xl"` = 44px)と FAB(58px)は意図的にこのスケールの外に置いている。
303
+ product theme で縮められると HIG の最小タップ領域を割るため。同じ理由で **Chip の高さ・横 padding**
304
+ (sm/md/lg の縦 margin が「44px タッチターゲット - 本体高さ」の手計算値)と **Tabs の pill 高さ
305
+ (44px、Control スケールの 40/48px のどちらとも不一致)** も配線していない。
306
+ - **Checkbox / RadioGroup / Switch**(20px の `size-5` トグル)は「コントロールの高さ」という概念が
307
+ 当てはまらないため、この契約の対象外。
308
+ - **AppShell / MarketingShell / MobileAppShell** はページ本文の padding をシェル自身が持たず
309
+ (`Container` の gutter か呼び出し側の `contentClassName` に委ねている)、対象外。
310
+ `AdminShell` の `<main>` だけが `--Product-Page-Padding-Y` を持つ。
311
+ - 色は従来どおり semantic トークン(`--Surface-*` / `--Text-*` / `--Brand-*`)と Brand ランプの
312
+ 上書きで調整する。カードの面は `--card-surface`、角丸は `--Radius-Surface` が既存の公開シーム。
313
+
268
314
  ## Components
269
315
 
270
316
  代表例(トークン参照で構成)。
package/MIGRATION.md CHANGED
@@ -3,6 +3,40 @@
3
3
  メジャーバージョン間の移行ガイド。
4
4
  patch / minor は原則破壊変更なし、自動アップグレード可(例外: **v1.34.0 で npm パッケージ名を変更**。import の置換が必要。下記参照)。
5
5
 
6
+ <!-- deprecations:start(自動生成・手で編集しない) -->
7
+
8
+ ## 非推奨 API 一覧
9
+
10
+ 正本は [`contracts/deprecations.json`](./contracts/deprecations.json)。この節はそこから生成しています。
11
+
12
+ 消費側での残存件数は次のコマンドで数えられます(read-only・残件があれば exit 1):
13
+
14
+ ```bash
15
+ npx ksk-ds check-migration ./src
16
+ ```
17
+
18
+ | API | 使われ方 | 移行先 | 非推奨にした版 | 削除予定 |
19
+ | --- | --- | --- | --- | --- |
20
+ | `ListItem.interactive` | `<ListItem interactive>` | href または onClick を ListItem 自体へ渡す | 1.46.0 | v2.0.0 |
21
+ | `ChipSelector.multiple` | `<ChipSelector multiple>` | selectionMode(multiple={false} は selectionMode="single"、multiple は selectionMode="multiple") | unreleased | v2.0.0 |
22
+ | `PillToggle.onValueChange` | `<PillToggle onValueChange>` | onChange | 1.49.0 | v2.0.0 |
23
+ | `ProductCard.deliveryLabel` | `<ProductCard deliveryLabel>` | なし(v1.30.0 以降は描画されないため、渡している箇所は削除する) | 1.30.1 | v2.0.0 |
24
+ | `Progress.tone` | `<Progress tone>` | variant | 1.40.1 | v2.0.0 |
25
+
26
+ 各エントリの補足:
27
+
28
+ - **ListItem.interactive**(issue #207) — 外側の Link / button でラップする既存コードの視覚互換用に残している。 実装: src/components/patterns/list-item.tsx
29
+ - **ChipSelector.multiple**(issue #352) — 既定が true(複数選択)で「渡し忘れると静かに壊れる側」に倒れているため新規実装では使わない。 実装: src/components/patterns/chip-selector.tsx / src/native/components/ChipSelector.tsx
30
+ - **PillToggle.onValueChange**(issue #264) — 後方互換エイリアス。onChange を併せて渡した場合は onChange が優先される。 実装: src/components/ui/pill-toggle.tsx
31
+ - **ProductCard.deliveryLabel** — 既存 consumer の型互換のためだけに残している no-op prop。 実装: src/components/patterns/commerce/product-card.tsx
32
+ - **Progress.tone** — React Native 版のみ。既存 RN consumer 向けの互換。 実装: src/native/components/Progress.tsx
33
+
34
+ 削除は「全消費リポで `check-migration` の残件が 0」を条件に、`削除予定` のメジャーリリースで行います。
35
+
36
+ <!-- deprecations:end -->
37
+
38
+ ---
39
+
6
40
  ## v2.0 (未リリース)
7
41
 
8
42
  まだメジャー破壊変更の予定はなし。
@@ -133,6 +167,15 @@ export default [
133
167
 
134
168
  これで codemod が拾えなかった旧 API の使用を検出できる。
135
169
 
170
+ ### Step 3.5. 非推奨 API の残存を数える
171
+
172
+ ```bash
173
+ npx ksk-ds check-migration ./src
174
+ ```
175
+
176
+ `contracts/deprecations.json` の非推奨 API が何件残っているかを、識別子別・ファイル別に出す
177
+ (read-only・残件があれば exit 1 なので CI にも置ける)。
178
+
136
179
  ### Step 4. 動作確認
137
180
 
138
181
  ```bash