ksk-design-system 1.51.2 → 1.53.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 +11 -0
- package/CLAUDE.md +11 -0
- package/contracts/components.json +14 -6
- package/contracts/token-hex-cache.json +1 -1
- package/dist/index.js +1652 -1645
- package/dist/native/ui.js +209 -156
- package/dist/types/components/patterns/quick-action-grid.d.ts +8 -1
- package/dist/types/components/ui/date-time-picker.d.ts +1 -1
- package/dist/types/components/ui/skeleton.d.ts +2 -0
- package/dist/types/components/ui/status-action-badge.d.ts +8 -0
- package/dist/types/native/components/Checkbox.d.ts +13 -1
- package/dist/types/native/components/NumberInput.d.ts +1 -1
- package/dist/types/native/components/QuickActionGrid.d.ts +8 -1
- package/dist/types/native/components/Spinner.d.ts +7 -1
- package/dist/types/native/components/StatusActionBadge.d.ts +8 -0
- package/package.json +2 -1
- package/src/components/COMPONENT_LOOKUP.md +1 -1
package/AGENTS.md
CHANGED
|
@@ -40,6 +40,17 @@ UI を書く前に必ず確認すること:
|
|
|
40
40
|
- [ ] `.tsx` 編集後に `bash scripts/lint-scratch.sh`、コンポーネント増減時は `npm run check` を実行したか
|
|
41
41
|
- [ ] `FormField` を import する前にどちらか確認したか(react-hook-form の Controller と統合するなら `RhfFormField`=`ui/form` の `FormField` を index.ts で別名 export したもの。単純な label+error 表示は `patterns/form-field` の `FormField`。迷ったら後者)
|
|
42
42
|
|
|
43
|
+
### 新規・変更するコンポーネントの API チェック(2026-08 の consumer 実機点検で3件連続した型)
|
|
44
|
+
|
|
45
|
+
「DS 部品の既定値が consumer の想定とズレていた」不具合が同じ週に3件出た(#308 / #311 / exam-kit 側で発覚した ChipSelector の複数選択既定)。部品の props を設計・変更するときは次を確認する:
|
|
46
|
+
|
|
47
|
+
- [ ] **押せる要素は、押せると見て分かる面を既定で持つか**。素の Pressable + テキストだけの操作子を作らない。面・タップ領域(44pt)は `IconButton` 等の既存部品に委ねる(#308: Calendar の月送り矢印が面を持たず、consumer から差し替え口も無かった)
|
|
48
|
+
- [ ] **インタラクティブな部品は a11y 既定値を自分で持つか**。`accessibilityRole` と、状態(selected / disabled / checked)の `accessibilityState` 反映は**呼び出し側の義務にしない**。呼び出し側の明示値が優先される形で部品が既定を持つ(#311: Chip が role を持たず、スクリーンリーダーにただのテキストとして扱われた)
|
|
49
|
+
- [ ] **モードを持つ部品(単一/複数選択・開閉など)の既定値は、間違えて使うと壊れる側にしていないか**。既定で済ませた呼び出しが静かに誤動作する組み合わせ(例: ChipSelector の既定 `multiple=true` を単一選択のつもりで使うと、押しても values[0] が現在値のまま切り替わらない)は、既定を安全側へ倒すか、必須 prop にして省略をコンパイルエラーにする
|
|
50
|
+
- [ ] **名前付きスロット(meta / description 等)は「何を・どこに置くか」を JSDoc に書いたか**。書いていないスロットは consumer に流用され、想定外の位置崩れになる(#309: ActionTile の meta に選択チェックを入れられ、左下に浮いた)
|
|
51
|
+
|
|
52
|
+
いずれも lint では拾えない設計判断なので、レビューではこの4点を明示的に見る。
|
|
53
|
+
|
|
43
54
|
---
|
|
44
55
|
|
|
45
56
|
## このDSについて
|
package/CLAUDE.md
CHANGED
|
@@ -40,6 +40,17 @@ UI を書く前に必ず確認すること:
|
|
|
40
40
|
- [ ] `.tsx` 編集後に `bash scripts/lint-scratch.sh`、コンポーネント増減時は `npm run check` を実行したか
|
|
41
41
|
- [ ] `FormField` を import する前にどちらか確認したか(react-hook-form の Controller と統合するなら `RhfFormField`=`ui/form` の `FormField` を index.ts で別名 export したもの。単純な label+error 表示は `patterns/form-field` の `FormField`。迷ったら後者)
|
|
42
42
|
|
|
43
|
+
### 新規・変更するコンポーネントの API チェック(2026-08 の consumer 実機点検で3件連続した型)
|
|
44
|
+
|
|
45
|
+
「DS 部品の既定値が consumer の想定とズレていた」不具合が同じ週に3件出た(#308 / #311 / exam-kit 側で発覚した ChipSelector の複数選択既定)。部品の props を設計・変更するときは次を確認する:
|
|
46
|
+
|
|
47
|
+
- [ ] **押せる要素は、押せると見て分かる面を既定で持つか**。素の Pressable + テキストだけの操作子を作らない。面・タップ領域(44pt)は `IconButton` 等の既存部品に委ねる(#308: Calendar の月送り矢印が面を持たず、consumer から差し替え口も無かった)
|
|
48
|
+
- [ ] **インタラクティブな部品は a11y 既定値を自分で持つか**。`accessibilityRole` と、状態(selected / disabled / checked)の `accessibilityState` 反映は**呼び出し側の義務にしない**。呼び出し側の明示値が優先される形で部品が既定を持つ(#311: Chip が role を持たず、スクリーンリーダーにただのテキストとして扱われた)
|
|
49
|
+
- [ ] **モードを持つ部品(単一/複数選択・開閉など)の既定値は、間違えて使うと壊れる側にしていないか**。既定で済ませた呼び出しが静かに誤動作する組み合わせ(例: ChipSelector の既定 `multiple=true` を単一選択のつもりで使うと、押しても values[0] が現在値のまま切り替わらない)は、既定を安全側へ倒すか、必須 prop にして省略をコンパイルエラーにする
|
|
50
|
+
- [ ] **名前付きスロット(meta / description 等)は「何を・どこに置くか」を JSDoc に書いたか**。書いていないスロットは consumer に流用され、想定外の位置崩れになる(#309: ActionTile の meta に選択チェックを入れられ、左下に浮いた)
|
|
51
|
+
|
|
52
|
+
いずれも lint では拾えない設計判断なので、レビューではこの4点を明示的に見る。
|
|
53
|
+
|
|
43
54
|
---
|
|
44
55
|
|
|
45
56
|
## 必須: セッション開始時に読み込むファイル
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "KSK Design System — Component Contracts",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.53.0",
|
|
5
5
|
"description": "全コンポーネントの構造化定義。バリアント・アクセシビリティ要件・使用ルールを機械可読形式で管理。",
|
|
6
6
|
"counts": {
|
|
7
7
|
"ui": 67,
|
|
@@ -244,7 +244,8 @@
|
|
|
244
244
|
"description": "チェックボックス。label/description/count を渡すと自動で行型レイアウトに(filter sidebar 型)。",
|
|
245
245
|
"variants": [],
|
|
246
246
|
"accessibility": [
|
|
247
|
-
"Must pair with <Label>"
|
|
247
|
+
"Must pair with <Label>",
|
|
248
|
+
"native (src/native/components/CheckboxField.tsx, RadioGroup.tsx): accessibilityState に加え aria-checked / aria-disabled を既定で併記する(react-native-web 0.21 は accessibilityState を aria-* へ変換しないため。RN peerDependency >=0.74.0 の aria-* props を直接渡す)。行内の装飾用インナー Checkbox/丸印は aria-hidden も併記して二重の role=checkbox/radio を防ぐ"
|
|
248
249
|
],
|
|
249
250
|
"rules": [
|
|
250
251
|
"label を渡すと <label> でラップされ行全体がクリッカブルになる",
|
|
@@ -780,7 +781,8 @@
|
|
|
780
781
|
],
|
|
781
782
|
"accessibility": [
|
|
782
783
|
"role=\"status\"",
|
|
783
|
-
"aria-label=\"読み込み中\""
|
|
784
|
+
"aria-label=\"読み込み中\"",
|
|
785
|
+
"native (src/native/components/Spinner.tsx): label prop(既定 \"読み込み中\")を持ち、accessibilityLabel / aria-label の両方に既定で渡す。呼び出し側の明示値が優先される"
|
|
784
786
|
],
|
|
785
787
|
"rules": [
|
|
786
788
|
"--Brand-Primary 色で回転"
|
|
@@ -2052,7 +2054,7 @@
|
|
|
2052
2054
|
"name": "QuickActionGrid / ActionTile",
|
|
2053
2055
|
"exported": false,
|
|
2054
2056
|
"path": "src/components/patterns/quick-action-grid.tsx",
|
|
2055
|
-
"description": "ショートカット/絵文字 action の button tile と grid。icon/emoji、label、description、meta、selected/disabled/loading state、2/3/4 column または auto-fit を持つ。",
|
|
2057
|
+
"description": "ショートカット/絵文字 action の button tile と grid。icon/emoji、label、description、meta、indicator、selected/disabled/loading state、2/3/4 column または auto-fit を持つ。",
|
|
2056
2058
|
"variants": [
|
|
2057
2059
|
"neutral",
|
|
2058
2060
|
"selected",
|
|
@@ -2064,13 +2066,19 @@
|
|
|
2064
2066
|
],
|
|
2065
2067
|
"accessibility": [
|
|
2066
2068
|
"button semantics",
|
|
2067
|
-
"aria-pressed when selected"
|
|
2069
|
+
"aria-pressed when selected (selected prop または variant=\"selected\" のどちらでも true)",
|
|
2070
|
+
"選択状態は色だけでなく既定チェック(indicator省略時)でも伝える(WCAG 1.4.1)",
|
|
2071
|
+
"既定チェックは読み上げ対象外(aria-hidden / accessibilityElementsHidden)。選択状態の正本は aria-pressed(web) / accessibilityState.selected(native)"
|
|
2068
2072
|
],
|
|
2069
2073
|
"rules": [
|
|
2070
2074
|
"card + button の hybrid を consumer 側で手組みしない",
|
|
2071
2075
|
"shortcut row/grid の columns/gap を consumer 側で決め打ちしない",
|
|
2072
2076
|
"children には ActionTile を使う",
|
|
2073
|
-
"選択状態は selected prop を使う"
|
|
2077
|
+
"選択状態は selected prop を使う",
|
|
2078
|
+
"meta はカード下段右端の補足情報専用。選択インジケータには indicator prop を使う(issue #309)",
|
|
2079
|
+
"indicator はラベル行右端(loading 時 Spinner の位置)に表示。省略時は選択状態でDS標準チェックが既定表示される。null/undefined/falseはいずれも「指定なし」として扱われ、選択中なら既定チェックへフォールバックする",
|
|
2080
|
+
"loading は indicator / 既定チェックより優先して表示される",
|
|
2081
|
+
"native では indicator に文字列・数値を渡してもよい(DS 側が Text にラップする)。それ以外の ReactNode はそのまま描画されるため、consumer が Text 相当で包む"
|
|
2074
2082
|
],
|
|
2075
2083
|
"subcomponents": [
|
|
2076
2084
|
"QuickActionGrid",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"meta": {
|
|
3
3
|
"name": "KSK Design System — Semantic Token Hex Cache",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.53.0",
|
|
5
5
|
"description": "semantic / semanticDark トークン(var(--Primitive-*) 参照)を実 hex に解決したサイドカー生成物。hex はデフォルト(Blue)テーマでの解決値であり、Brand 系(meta.themeDependentKeys に列挙)はテーマ差し替え(orange/green/violet 等)で実色が変わる。テーマ別の完全解決値は `ksk-design-system/native` エクスポート(バンドル済み native トークンモジュール)の themes を参照。tokens.json 本体のスキーマは変更せず、AI がこのファイルだけで実色を把握できるようにし、primitive 値の変更による semantic 実色のドリフトを --check で機械検出する。",
|
|
6
6
|
"generatedBy": "scripts/generate-token-hex-cache.mjs",
|
|
7
7
|
"theme": "default",
|