melta-app 0.7.0 → 0.8.1

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 (33) hide show
  1. package/README.md +15 -11
  2. package/docs/architecture.md +2 -2
  3. package/eslint-rules/melta.d.mts +2 -1
  4. package/eslint-rules/melta.mjs +32 -5
  5. package/lib/module/a11y/tap-target.js +3 -9
  6. package/lib/module/a11y/tap-target.js.map +1 -1
  7. package/lib/module/components/TextField.js +5 -2
  8. package/lib/module/components/TextField.js.map +1 -1
  9. package/lib/module/components/Toast.js +8 -1
  10. package/lib/module/components/Toast.js.map +1 -1
  11. package/lib/module/components/textfield.styles.js +22 -0
  12. package/lib/module/components/textfield.styles.js.map +1 -1
  13. package/lib/module/components/toast.styles.js +6 -2
  14. package/lib/module/components/toast.styles.js.map +1 -1
  15. package/lib/module/theme/line-height.js +9 -2
  16. package/lib/module/theme/line-height.js.map +1 -1
  17. package/lib/typescript/src/a11y/tap-target.d.ts +0 -7
  18. package/lib/typescript/src/a11y/tap-target.d.ts.map +1 -1
  19. package/lib/typescript/src/components/TextField.d.ts.map +1 -1
  20. package/lib/typescript/src/components/Toast.d.ts.map +1 -1
  21. package/lib/typescript/src/components/textfield.styles.d.ts +12 -0
  22. package/lib/typescript/src/components/textfield.styles.d.ts.map +1 -1
  23. package/lib/typescript/src/components/toast.styles.d.ts +5 -1
  24. package/lib/typescript/src/components/toast.styles.d.ts.map +1 -1
  25. package/lib/typescript/src/theme/line-height.d.ts +9 -2
  26. package/lib/typescript/src/theme/line-height.d.ts.map +1 -1
  27. package/package.json +1 -1
  28. package/src/a11y/tap-target.ts +3 -9
  29. package/src/components/TextField.tsx +3 -0
  30. package/src/components/Toast.tsx +11 -1
  31. package/src/components/textfield.styles.ts +21 -0
  32. package/src/components/toast.styles.ts +5 -1
  33. package/src/theme/line-height.ts +9 -2
package/README.md CHANGED
@@ -23,8 +23,8 @@
23
23
  同じ欠陥を固定した E2E テストまで。
24
24
 
25
25
  - **ドキュメントは契約からの生成物** — 下の[コンポーネント表](#コンポーネント)・[llms.txt](https://app.melta.tsubotax.com/llms.txt)・showcase の統計は `melta-contracts` から生成し、手書きの表はこのリポに存在しない。腐りは drift 検査が落とす([scripts/check-drift.ts](./scripts/check-drift.ts) / [CI](./.github/workflows/check.yml))
26
- - **消費者プロジェクトでの実導入検証(2026-08-04)** — 別リポジトリの自プロジェクト(非公開 RN アプリ)に npm 経由で導入し、AI が違反コードを書いた直後に検出 → 修正フィードバック → 自己修正、のループを実測で確認。導入時に見つかった hook の欠陥(実行失敗時に無言で素通りする)は同日中に本体へ還元し、故障系を含む E2E 14 ケースで固定([scripts/lib/hook-lint.test.ts](./scripts/lib/hook-lint.test.ts) / [CHANGELOG 0.5.3](./CHANGELOG.md#053--2026-08-04))
27
- - **「npm install すれば動く」の機械証明** — pack → tarball 実体検査 → [attw](https://github.com/arethetypeswrong/arethetypeswrong.github.io) で exports の型解決を resolution mode ごとに検査 → fixture へ install → 本体 / icons / safe-area / eslint-plugin の import + typecheck を **`moduleResolution` 3 種(bundler / node16 / nodenext)すべてで**実行 → lint plugin を実 import してルール 4 本と推奨 severity を照合、までを公開ゲートにしている([scripts/check-installability.sh](./scripts/check-installability.sh)。`npm run release` の必須ステップ)
26
+ - **消費者プロジェクトでの実導入検証(2026-08-04)** — 別リポジトリの自プロジェクト(非公開 RN アプリ)に npm 経由で導入し、AI が違反コードを書いた直後に検出 → 修正フィードバック → 自己修正、のループを実測で確認。導入時に見つかった hook の欠陥(実行失敗時に無言で素通りする)は同日中に本体へ還元し、故障系を含む E2E 15 ケースで固定 — 0.5.3 で 14、0.8.0 の no-raw-lineheight 追加で 15([scripts/lib/hook-lint.test.ts](./scripts/lib/hook-lint.test.ts) / [CHANGELOG 0.5.3](./CHANGELOG.md#053--2026-08-04))
27
+ - **「npm install すれば動く」の機械証明** — pack → tarball 実体検査 → [attw](https://github.com/arethetypeswrong/arethetypeswrong.github.io) で exports の型解決を resolution mode ごとに検査 → fixture へ install → 本体 / icons / safe-area / eslint-plugin の import + typecheck を **`moduleResolution` 3 種(bundler / node16 / nodenext)すべてで**実行 → lint plugin を実 import してルール 5 本と推奨 severity を照合、までを公開ゲートにしている([scripts/check-installability.sh](./scripts/check-installability.sh)。`npm run release` の必須ステップ)
28
28
 
29
29
  ## Quickstart
30
30
 
@@ -118,7 +118,7 @@ production ビルドでは `__DEV__` を偽(または未定義)のままに
118
118
 
119
119
  ## 利用側コードの lint 強制層(`melta-app/eslint-plugin`)
120
120
 
121
- melta 契約からの逸脱を機械検知する eslint カスタムルール 4 本を同梱している。
121
+ melta 契約からの逸脱を機械検知する eslint カスタムルール 5 本を同梱している。
122
122
  消費者プロジェクトの flat config に組み込むと、生値の直書きが**使う側のコードで**止まる。
123
123
 
124
124
  ### 動く完全例
@@ -147,7 +147,7 @@ export default [
147
147
  ];
148
148
  ```
149
149
 
150
- **成功判定**: 生値を書いたファイルで `npx eslint .` を実行すると、4 ルールが名前付きで出る。
150
+ **成功判定**: 生値を書いたファイルで `npx eslint .` を実行すると、違反したルールが名前付きで出る(この fixture は 5 本中 4 本を踏む)。
151
151
 
152
152
  ```
153
153
  src/Bad.tsx
@@ -162,12 +162,12 @@ src/Bad.tsx
162
162
  `theme.*` 経由で書き直すと 0 件になる。ここまでが「利用側に強制層が入った」状態。
163
163
 
164
164
  > この例は eslint 9.39 / `@react-native/eslint-config` 0.85.3 / melta-app 0.5.3 の
165
- > 使い捨て fixture(tarball install)で実行して確認したもの。ルール 4 本の実在と severity は
165
+ > 使い捨て fixture(tarball install)で実行して確認したもの(no-raw-lineheight 追加前の 0.5.3 時点)。ルール 5 本の実在と severity は
166
166
  > `check:installability` が毎リリース照合する。
167
167
 
168
168
  ### `configs.recommended` の中身
169
169
 
170
- `configs.recommended`(flat config 形式)は plugin の登録とルール 4 本の severity を含む。
170
+ `configs.recommended`(flat config 形式)は plugin の登録とルール 5 本の severity を含む。
171
171
  **severity の正本は plugin 側**なので、消費者がドキュメントから写して持つ必要はない。
172
172
 
173
173
  | ルール | 既定 severity | 内容 |
@@ -176,6 +176,7 @@ src/Bad.tsx
176
176
  | `melta/no-raw-radius` | error | `borderRadius` の数値直書き → `theme.radius.*` |
177
177
  | `melta/no-raw-spacing` | warn | `padding`/`margin`/`gap` の数値直書き(false positive あり) |
178
178
  | `melta/no-raw-fontsize` | warn | `fontSize` の数値直書き |
179
+ | `melta/no-raw-lineheight` | warn | `lineHeight` の数値直書き(生値はフォントの必要行間を素通りし、Android で濁点が欠ける。詰める場合は theme の `minLineHeightRatio` 宣言とセットで — 機序は `src/theme/line-height.ts`) |
179
180
 
180
181
  ⚠️ **base config は省略できない。** `meltaPlugin.configs.recommended` は parser も `files` も
181
182
  持たない(適用範囲を消費者側に委ねる設計)。実測される挙動は 2 つ:
@@ -217,10 +218,11 @@ export default [
217
218
  {
218
219
  plugins: { melta: meltaPlugin },
219
220
  rules: {
220
- "melta/no-raw-color": "error", // 生 hex/rgb/hsl → theme.color.*
221
- "melta/no-raw-radius": "error", // borderRadius 数値直書き → theme.radius.*
222
- "melta/no-raw-spacing": "warn", // padding/margin/gap 数値直書き(false positive あり)
223
- "melta/no-raw-fontsize": "warn", // fontSize 数値直書き
221
+ "melta/no-raw-color": "error", // 生 hex/rgb/hsl → theme.color.*
222
+ "melta/no-raw-radius": "error", // borderRadius 数値直書き → theme.radius.*
223
+ "melta/no-raw-spacing": "warn", // padding/margin/gap 数値直書き(false positive あり)
224
+ "melta/no-raw-fontsize": "warn", // fontSize 数値直書き
225
+ "melta/no-raw-lineheight": "warn", // lineHeight 数値直書き(Android の字形欠け防止)
224
226
  },
225
227
  },
226
228
  ];
@@ -365,7 +367,9 @@ const listRef = useRef<ScrollView>(null);
365
367
  | `Toggle` medium / large | track 24 / 28 | 縦 hitSlop 10 / 8 | 44 |
366
368
  | `Checkbox` の行 | box 20(行は label 込み) | `minHeight: 44` | 44 |
367
369
 
368
- - **背景を持つ要素は hitSlop、持たない要素は `minHeight`**。背景がある要素を minHeight で伸ばすと見た目が変わるため
370
+ - **背景を持つ要素は hitSlop、持たない行は `minHeight`**。背景がある要素を minHeight で伸ばすと見た目が変わるため。
371
+ 例外は × / action のような**小型の固定標的**で、見えない箱(minWidth/minHeight)+ hitSlop の複合
372
+ (正典パターン 24+10、Toast のように横 hitSlop を絞る席では箱を 32 に広げて 44 を維持)
369
373
  - **横方向の hitSlop は隣接する操作要素との gap の 1/2 まで**。超えると当たり判定が重なって押し違いが起きる
370
374
  (`Toast` の action と × はこれで実際に 8pt 重なっていた。0.7.0 で修正)
371
375
  - ⚠️ **iconOnly の `Button` だけは横にも hitSlop が付く**(幅 32/40 では 44pt に届かないため)。
@@ -74,14 +74,14 @@ npm run ios # または android / web
74
74
  - ✅ ライブラリ化(root=ライブラリ / example=カタログアプリ、peerDeps react + react-native、runtime deps ゼロ)
75
75
  - ✅ `melta-contracts` を npm 依存として購読(recipes/app の styleRefs 同梱)
76
76
  - ✅ conformance: 契約源 ↔ 生成メタ ↔ `__contract` 宣言の照合 + consumer テスト(契約 subset / token 実在 / contractVersion 同期)+ styleRefs conformance(全実装コンポーネント展開済み)+ RN mount smoke(light/dark × 全公開コンポーネント)
77
- - ✅ ハーネス: design lint(CI `--max-warnings 0` + PostToolUse hook)/ drift 検査(README・docs・catalog・allowlist 突合)/ installability ゲート(pack → tarball 実体検査 → attw で exports の型解決を resolution mode ごとに検査 → fixture へ install → 本体 / icons / safe-area / eslint-plugin の import + typecheck を moduleResolution 3 種(bundler / node16 / nodenext)で実行 → eslint plugin を実 import してルール 4 本の実在を照合 → exports の解決先確認。`npm run release` チェーンの必須ステップ)
77
+ - ✅ ハーネス: design lint(CI `--max-warnings 0` + PostToolUse hook)/ drift 検査(README・docs・catalog・allowlist 突合)/ installability ゲート(pack → tarball 実体検査 → attw で exports の型解決を resolution mode ごとに検査 → fixture へ install → 本体 / icons / safe-area / eslint-plugin の import + typecheck を moduleResolution 3 種(bundler / node16 / nodenext)で実行 → eslint plugin を実 import してルール 5 本の実在を照合 → exports の解決先確認。`npm run release` チェーンの必須ステップ)
78
78
  - ✅ layout 6 個(Stack / Row / Screen / Header / Icon / Avatar)— dogfood 不足 1〜4 を解消、ProjectFeedScreen は公開 primitive だけで構成
79
79
  - Screen の SafeArea は adapter registry 化済み: default は RN core SafeAreaView(依存ゼロ維持)、`melta-app/safe-area` の `enableSafeAreaContext()` で react-native-safe-area-context に差し替え可(optional peer)
80
80
  - ✅ form / feedback 10 個(TextField / Toggle / Checkbox / Radio / Alert / Toast / Progress / Modal / ActionSheet / BottomSheet)— checkbox / radio は Pressable + 描画(svg 非依存)、ActionSheet / BottomSheet は select / dropdown の adapted 変換先の受け皿
81
81
  - ✅ showcase(https://app.melta.tsubotax.com — melta-ui 様式シェル + 実 RN カタログの Live 埋め込み。表・統計は契約からビルド時生成)
82
82
  - ✅ AI 入口: [llms.txt](https://app.melta.tsubotax.com/llms.txt)(契約から生成・drift 検査対象)+ [patterns.md](./patterns.md)(フォームの組み方規範。スニペットは実コードと機械同期)
83
83
  - ✅ lint 強制層の npm 配布(0.5.2): `melta-app/eslint-plugin` を公開 subpath 化。消費者プロジェクトの flat config に組めば、生値の直書きが消費者側でも lint で止まる。推奨 severity は `configs.recommended` で配布(0.5.3。消費者が手書きで写さない)
84
- - ✅ 消費者プロジェクトでの実導入検証(2026-08-04): 別リポジトリの自プロジェクト(非公開 RN アプリ)に npm 経由で導入し、AI が違反コードを書いた直後に検出 → 修正フィードバック → 自己修正、のループを実測で確認。導入時に見つかった hook の欠陥(実行失敗時に無言で素通りする)は同日中に本体へ還元し、故障系を含む E2E 14 ケースで固定(0.5.3)
84
+ - ✅ 消費者プロジェクトでの実導入検証(2026-08-04): 別リポジトリの自プロジェクト(非公開 RN アプリ)に npm 経由で導入し、AI が違反コードを書いた直後に検出 → 修正フィードバック → 自己修正、のループを実測で確認。導入時に見つかった hook の欠陥(実行失敗時に無言で素通りする)は同日中に本体へ還元し、故障系を含む E2E 15 ケースで固定(0.5.3 で 14、0.8.0 の no-raw-lineheight 追加で 15
85
85
  - ✅ [npm publish(0.5.3)](https://www.npmjs.com/package/melta-app)
86
86
  - ⬜ React Native Directory 登録([PR #2606](https://github.com/react-native-community/directory/pull/2606) レビュー待ち)
87
87
 
@@ -26,7 +26,8 @@ export type MeltaRuleName =
26
26
  | "no-raw-color"
27
27
  | "no-raw-radius"
28
28
  | "no-raw-spacing"
29
- | "no-raw-fontsize";
29
+ | "no-raw-fontsize"
30
+ | "no-raw-lineheight";
30
31
 
31
32
  /** flat config の 1 要素として展開できる推奨設定。 */
32
33
  export interface MeltaFlatConfig {
@@ -1,13 +1,16 @@
1
1
  /**
2
2
  * melta design lint ルール(設計書 §5、D-1)。
3
3
  *
4
- * RN で機械検知できる raw 値の 4 類型のみを対象とする補助線(AST 検知は変数経由/spread で漏れるので
4
+ * RN で機械検知できる raw 値の 5 類型のみを対象とする補助線(AST 検知は変数経由/spread で漏れるので
5
5
  * 純度の本丸は A-3 conformance)。token 経由(theme.* の MemberExpression)は許可、生値を弾く。
6
6
  *
7
- * - no-raw-color : hex/rgb/hsl の文字列リテラル → error
8
- * - no-raw-radius : borderRadius 系プロパティに数値リテラル直書き → error
9
- * - no-raw-spacing : padding/margin/gap 系に数値リテラル直書き → warn(false positive 多)
10
- * - no-raw-fontsize: fontSize に数値リテラル直書き → warn
7
+ * - no-raw-color : hex/rgb/hsl の文字列リテラル → error
8
+ * - no-raw-radius : borderRadius 系プロパティに数値リテラル直書き → error
9
+ * - no-raw-spacing : padding/margin/gap 系に数値リテラル直書き → warn(false positive 多)
10
+ * - no-raw-fontsize : fontSize に数値リテラル直書き → warn
11
+ * - no-raw-lineheight: lineHeight に数値リテラル直書き → warn(W8。生の lineHeight は
12
+ * フォントの必要行間(Android の CustomLineHeightSpan が字形を削る下限)を素通りする。
13
+ * theme.typography.fontSize.* の対を使うか、詰めるなら minLineHeightRatio 宣言とセットで)
11
14
  *
12
15
  * この severity は `meltaPlugin.configs.recommended`(flat config)として機械可読な形で配布する。
13
16
  * 消費者が手で書き写すとドリフト源になるため(rally-nav の外部導入 T6、2026-08-04)、
@@ -98,6 +101,29 @@ export const meltaPlugin = {
98
101
  };
99
102
  },
100
103
  },
104
+ "no-raw-lineheight": {
105
+ meta: {
106
+ type: "suggestion",
107
+ docs: {
108
+ description:
109
+ "lineHeight は theme.typography.fontSize.* の対を使う(生数値はフォントの必要行間を素通りし、Android で字形が欠ける)",
110
+ },
111
+ },
112
+ create(context) {
113
+ return {
114
+ Property(node) {
115
+ if (keyName(node) === "lineHeight" && isRawNumber(node.value)) {
116
+ context.report({
117
+ node,
118
+ message:
119
+ "lineHeight の生数値は theme.typography.fontSize.* の対を推奨。" +
120
+ "詰める場合も theme の minLineHeightRatio 宣言とセットで(Android は下限を割ると濁点が欠ける)。",
121
+ });
122
+ }
123
+ },
124
+ };
125
+ },
126
+ },
101
127
  },
102
128
  };
103
129
 
@@ -110,6 +136,7 @@ const RECOMMENDED_RULES = {
110
136
  "melta/no-raw-radius": "error",
111
137
  "melta/no-raw-spacing": "warn",
112
138
  "melta/no-raw-fontsize": "warn",
139
+ "melta/no-raw-lineheight": "warn",
113
140
  };
114
141
 
115
142
  // flat config 慣行に従い、plugin 自身を参照する config は定義後に後付けする(自己参照の循環を避ける)。
@@ -29,13 +29,7 @@ export const CANONICAL_TAP_TARGET = {
29
29
  hitSlop: 10
30
30
  };
31
31
 
32
- /**
33
- * 視覚寸法 `visual` を実効 44pt に届かせるのに必要な**片側** hitSlop(切り上げ 安全側)。
34
- *
35
- * ⚠️ 実装の hitSlop 値をこの関数で計算しないこと(上のコメント参照)。
36
- * 使うのは (a) 値を決めるときの検算、(b) conformance テストの期待値算出。
37
- */
38
- export function requiredHitSlop(visual) {
39
- return Math.max(0, Math.ceil((MIN_TAP_TARGET - visual) / 2));
40
- }
32
+ // requiredHitSlop(必要 hitSlop の導出関数)は置かない — 実装値は literal 規約で導出禁止、
33
+ // テスト側も「実効 = 視覚 + slop×2 >= 44」を直接検算するため使い道が無い(dead code 化して撤去、
34
+ // Codex スパン監査 2026-08-06)。値を決めるときの検算は手計算 ceil((44 − 視覚) / 2) で足りる。
41
35
  //# sourceMappingURL=tap-target.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["MIN_TAP_TARGET","CANONICAL_TAP_TARGET","minWidth","minHeight","hitSlop","requiredHitSlop","visual","Math","max","ceil"],"sourceRoot":"../../../src","sources":["a11y/tap-target.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,MAAMA,cAAc,GAAG,EAAE;;AAEhC;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,GAAG;EAClCC,QAAQ,EAAE,EAAE;EACZC,SAAS,EAAE,EAAE;EACbC,OAAO,EAAE;AACX,CAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAACC,MAAc,EAAU;EACtD,OAAOC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,IAAI,CAAC,CAACT,cAAc,GAAGM,MAAM,IAAI,CAAC,CAAC,CAAC;AAC9D","ignoreList":[]}
1
+ {"version":3,"names":["MIN_TAP_TARGET","CANONICAL_TAP_TARGET","minWidth","minHeight","hitSlop"],"sourceRoot":"../../../src","sources":["a11y/tap-target.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,MAAMA,cAAc,GAAG,EAAE;;AAEhC;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,GAAG;EAClCC,QAAQ,EAAE,EAAE;EACZC,SAAS,EAAE,EAAE;EACbC,OAAO,EAAE;AACX,CAAU;;AAEV;AACA;AACA","ignoreList":[]}
@@ -26,7 +26,7 @@ import { useMemo, useState } from "react";
26
26
  import { Platform, TextInput, View, Text as RNText } from "react-native";
27
27
  import { useTheme } from "../theme/index.js";
28
28
  import { CONTRACTS } from "../contracts/contract-types.js";
29
- import { resolveTextFieldStyle, resolveTextFieldFocusStyle } from "./textfield.styles.js";
29
+ import { resolveTextFieldHitSlop, resolveTextFieldStyle, resolveTextFieldFocusStyle } from "./textfield.styles.js";
30
30
 
31
31
  /**
32
32
  * Android の EditText は高さ下限(minHeight)と組み合わさると既定の縦 padding で文字が
@@ -107,7 +107,10 @@ export function TextField({
107
107
  children: [/*#__PURE__*/_jsx(RNText, {
108
108
  style: resolved.label,
109
109
  children: label
110
- }), /*#__PURE__*/_jsx(TextInput, {
110
+ }), /*#__PURE__*/_jsx(TextInput
111
+ // small 36 / medium 42 の視覚寸法のまま実効タップ標的 44 を満たす(規約 10、値は literal)
112
+ , {
113
+ hitSlop: resolveTextFieldHitSlop(size),
111
114
  value: value,
112
115
  onChangeText: onChangeText,
113
116
  placeholder: placeholder,
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","useState","Platform","TextInput","View","Text","RNText","useTheme","CONTRACTS","resolveTextFieldStyle","resolveTextFieldFocusStyle","jsx","_jsx","jsxs","_jsxs","resolveInputVerticalFix","os","paddingVertical","paddingBottom","textAlignVertical","INPUT_VERTICAL_FIX","OS","defaultErrorAccessibilityLabel","label","errorText","TextField","value","onChangeText","placeholder","variant","disabled","size","helperText","formatErrorAccessibilityLabel","keyboardType","autoCapitalize","autoCorrect","maxLength","returnKeyType","onSubmitEditing","onBlur","onFocus","style","testID","theme","mode","colors","focused","setFocused","effectiveVariant","resolved","focusStyle","showError","children","placeholderTextColor","editable","accessibilityLabel","accessibilityState","e","input","accessibilityLiveRegion","__contract","textfield"],"sourceRoot":"../../../src","sources":["components/TextField.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","useState","Platform","TextInput","View","Text","RNText","useTheme","CONTRACTS","resolveTextFieldHitSlop","resolveTextFieldStyle","resolveTextFieldFocusStyle","jsx","_jsx","jsxs","_jsxs","resolveInputVerticalFix","os","paddingVertical","paddingBottom","textAlignVertical","INPUT_VERTICAL_FIX","OS","defaultErrorAccessibilityLabel","label","errorText","TextField","value","onChangeText","placeholder","variant","disabled","size","helperText","formatErrorAccessibilityLabel","keyboardType","autoCapitalize","autoCorrect","maxLength","returnKeyType","onSubmitEditing","onBlur","onFocus","style","testID","theme","mode","colors","focused","setFocused","effectiveVariant","resolved","focusStyle","showError","children","hitSlop","placeholderTextColor","editable","accessibilityLabel","accessibilityState","e","input","accessibilityLiveRegion","__contract","textfield"],"sourceRoot":"../../../src","sources":["components/TextField.tsx"],"mappings":"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","ignoreList":[]}
@@ -75,7 +75,14 @@ export function Toast({
75
75
  _jsx(Pressable, {
76
76
  onPress: onAction,
77
77
  accessibilityRole: "button",
78
- hitSlop: TOAST_TAP_TARGET.hitSlop,
78
+ hitSlop: TOAST_TAP_TARGET.hitSlop
79
+ // 短いラベル("OK" 等)でも横の実効 44 を割らないよう × と同じ幅下限(背景なし = 見た目不変)
80
+ ,
81
+ style: {
82
+ minWidth: TOAST_TAP_TARGET.actionMinWidth,
83
+ alignItems: "center",
84
+ justifyContent: "center"
85
+ },
79
86
  children: /*#__PURE__*/_jsx(Text, {
80
87
  variant: TOAST_SPEC.messageFont,
81
88
  weight: TOAST_SPEC.messageWeight,
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","TOAST_SPEC","TOAST_TAP_TARGET","resolveToastStyles","jsx","_jsx","jsxs","_jsxs","Toast","variant","message","description","onClose","actionLabel","onAction","closeAccessibilityLabel","style","testID","theme","mode","styles","accessibilityLiveRegion","containerStyle","elevation","children","flex","gap","spacing","messageFont","weight","messageWeight","color","messageStyle","onPress","accessibilityRole","hitSlop","textDecorationLine","accessibilityLabel","minWidth","closeMinWidth","minHeight","closeMinHeight","alignItems","justifyContent","__contract","toast"],"sourceRoot":"../../../src","sources":["components/Toast.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","TOAST_SPEC","TOAST_TAP_TARGET","resolveToastStyles","jsx","_jsx","jsxs","_jsxs","Toast","variant","message","description","onClose","actionLabel","onAction","closeAccessibilityLabel","style","testID","theme","mode","styles","accessibilityLiveRegion","containerStyle","elevation","children","flex","gap","spacing","messageFont","weight","messageWeight","color","messageStyle","onPress","accessibilityRole","hitSlop","minWidth","actionMinWidth","alignItems","justifyContent","textDecorationLine","accessibilityLabel","closeMinWidth","minHeight","closeMinHeight","__contract","toast"],"sourceRoot":"../../../src","sources":["components/Toast.tsx"],"mappings":"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","ignoreList":[]}
@@ -46,6 +46,28 @@ export const TEXTFIELD_SIZE_SPEC = {
46
46
  }
47
47
  };
48
48
 
49
+ /**
50
+ * TextInput への縦 hitSlop(片側)。small 36 / medium 42 は視覚寸法(recipe の minHeight)を
51
+ * 変えずに実効タップ標的 44 を満たすための手当て(A11Y_MIN_TAP_TARGET_44・規約 10。
52
+ * Codex スパン監査 2026-08-06: TextField が 44pt 横断の対象から漏れていた)。
53
+ * 横は付けない(input は親幅いっぱいで既に広い)。値は literal(規約 10: 導出しない)。
54
+ */
55
+ export const TEXTFIELD_VERTICAL_HIT_SLOP = {
56
+ small: 4,
57
+ medium: 1,
58
+ large: 0
59
+ };
60
+
61
+ /** size → TextInput に渡す hitSlop。0 のときは undefined(prop を付けない)。 */
62
+ export function resolveTextFieldHitSlop(size) {
63
+ const slop = TEXTFIELD_VERTICAL_HIT_SLOP[size];
64
+ if (slop === 0) return undefined;
65
+ return {
66
+ top: slop,
67
+ bottom: slop
68
+ };
69
+ }
70
+
49
71
  /** resolver の出力(label → input → helperText / errorText の縦構成の各パート)。 */
50
72
 
51
73
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["resolveStatusTokenColors","TEXTFIELD_SIZE_SPEC","small","minHeight","px","font","medium","large","resolveTextFieldStyle","theme","mode","variant","size","c","color","sem","semantic","spec","danger","colors","borderColor","backgroundColor","status","base","bg","success","input","paddingHorizontal","spacing","fontSize","typography","borderWidth","borderRadius","radius","md","label","sm","fontWeight","marginBottom","helperText","xs","marginTop","errorText","text","resolveTextFieldFocusStyle","primary"],"sourceRoot":"../../../src","sources":["components/textfield.styles.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["resolveStatusTokenColors","TEXTFIELD_SIZE_SPEC","small","minHeight","px","font","medium","large","TEXTFIELD_VERTICAL_HIT_SLOP","resolveTextFieldHitSlop","size","slop","undefined","top","bottom","resolveTextFieldStyle","theme","mode","variant","c","color","sem","semantic","spec","danger","colors","borderColor","backgroundColor","status","base","bg","success","input","paddingHorizontal","spacing","fontSize","typography","borderWidth","borderRadius","radius","md","label","sm","fontWeight","marginBottom","helperText","xs","marginTop","errorText","text","resolveTextFieldFocusStyle","primary"],"sourceRoot":"../../../src","sources":["components/textfield.styles.ts"],"mappings":"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","ignoreList":[]}
@@ -45,7 +45,9 @@ export const TOAST_SPEC = {
45
45
  *
46
46
  * 横を 6 に削ると × の実効幅が 24 + 6×2 = 36pt と 44pt を割るため、**箱の下限を 32pt に広げて**
47
47
  * 32 + 6×2 = 44pt を確保する(× は背景を持たないので幅を広げても見た目は変わらない)。
48
- * action 側はテキスト幅が可変で静的に決められないため、縦のみ 44pt を保証する。
48
+ * action 側も同じ手当て: テキスト幅は可変だが「短いラベル("OK" 等)で 44pt を割る」のは
49
+ * × と同型の問題なので、見えない箱の幅下限 32 + 横 hitSlop 6×2 = 44 で静的に保証する
50
+ * (Codex スパン監査 2026-08-06。従来は縦のみ保証で、横は「実運用では超える」頼みだった)。
49
51
  */
50
52
  export const TOAST_TAP_TARGET = {
51
53
  /** action / × 共通の hitSlop(横だけ gap/2 = 6 に絞る)。 */
@@ -58,7 +60,9 @@ export const TOAST_TAP_TARGET = {
58
60
  /** × の箱の幅の下限(横 hitSlop を削ったぶん canonical の 24 から広げる。32 + 6×2 = 44)。 */
59
61
  closeMinWidth: 32,
60
62
  /** × の箱の高さ下限(正典パターンと同値)。 */
61
- closeMinHeight: CANONICAL_TAP_TARGET.minHeight
63
+ closeMinHeight: CANONICAL_TAP_TARGET.minHeight,
64
+ /** action の箱の幅の下限(× と同じ 32 + 6×2 = 44。背景なしなので見た目不変)。 */
65
+ actionMinWidth: 32
62
66
  };
63
67
 
64
68
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["resolveStatusVariantColors","CANONICAL_TAP_TARGET","TOAST_SPEC","padding","gap","radius","elevation","messageFont","messageWeight","TOAST_TAP_TARGET","hitSlop","top","bottom","left","right","closeMinWidth","closeMinHeight","minHeight","resolveToastStyles","theme","mode","variant","bg","text","containerStyle","backgroundColor","borderRadius","spacing","flexDirection","alignItems","messageStyle","color","fontSize","typography","fontWeight"],"sourceRoot":"../../../src","sources":["components/toast.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA,SAASA,0BAA0B,QAA4B,oBAAoB;AACnF,SAASC,oBAAoB,QAAQ,uBAAuB;;AAE5D;;AAGA;AACA;AACA;AACA;AACA,OAAO,MAAMC,UAAU,GAAG;EACxBC,OAAO,EAAE,GAAG;EACZC,GAAG,EAAE,GAAG;EACRC,MAAM,EAAE,IAAI;EACZC,SAAS,EAAE,IAAI;EACfC,WAAW,EAAE,IAAI;EACjBC,aAAa,EAAE;AACjB,CAOC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAG;EAC9B;EACAC,OAAO,EAAE;IAAEC,GAAG,EAAE,EAAE;IAAEC,MAAM,EAAE,EAAE;IAAEC,IAAI,EAAE,CAAC;IAAEC,KAAK,EAAE;EAAE,CAAC;EACnD;EACAC,aAAa,EAAE,EAAE;EACjB;EACAC,cAAc,EAAEf,oBAAoB,CAACgB;AACvC,CAAU;;AAEV;AACA;AACA;AACA;;AAoBA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,KAAkB,EAClBC,IAAe,EACfC,OAAqB,EACR;EACb,MAAM;IAAEC,EAAE;IAAEC;EAAK,CAAC,GAAGvB,0BAA0B,CAACmB,KAAK,EAAEC,IAAI,EAAEC,OAAO,CAAC;EACrE,OAAO;IACLG,cAAc,EAAE;MACdC,eAAe,EAAEH,EAAE;MACnBI,YAAY,EAAEP,KAAK,CAACd,MAAM,CAACH,UAAU,CAACG,MAAM,CAAC;MAC7CF,OAAO,EAAEgB,KAAK,CAACQ,OAAO,CAACzB,UAAU,CAACC,OAAO,CAAC;MAC1CyB,aAAa,EAAE,KAAK;MACpBC,UAAU,EAAE,QAAQ;MACpBzB,GAAG,EAAEe,KAAK,CAACQ,OAAO,CAACzB,UAAU,CAACE,GAAG;IACnC,CAAC;IACDE,SAAS,EAAEa,KAAK,CAACb,SAAS,CAACJ,UAAU,CAACI,SAAS,CAAC;IAChDwB,YAAY,EAAE;MACZC,KAAK,EAAER,IAAI;MACXS,QAAQ,EAAEb,KAAK,CAACc,UAAU,CAACD,QAAQ,CAAC9B,UAAU,CAACK,WAAW,CAAC,CAACyB,QAAQ;MACpEE,UAAU,EAAEf,KAAK,CAACc,UAAU,CAACC,UAAU,CAAChC,UAAU,CAACM,aAAa;IAClE;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["resolveStatusVariantColors","CANONICAL_TAP_TARGET","TOAST_SPEC","padding","gap","radius","elevation","messageFont","messageWeight","TOAST_TAP_TARGET","hitSlop","top","bottom","left","right","closeMinWidth","closeMinHeight","minHeight","actionMinWidth","resolveToastStyles","theme","mode","variant","bg","text","containerStyle","backgroundColor","borderRadius","spacing","flexDirection","alignItems","messageStyle","color","fontSize","typography","fontWeight"],"sourceRoot":"../../../src","sources":["components/toast.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA,SAASA,0BAA0B,QAA4B,oBAAoB;AACnF,SAASC,oBAAoB,QAAQ,uBAAuB;;AAE5D;;AAGA;AACA;AACA;AACA;AACA,OAAO,MAAMC,UAAU,GAAG;EACxBC,OAAO,EAAE,GAAG;EACZC,GAAG,EAAE,GAAG;EACRC,MAAM,EAAE,IAAI;EACZC,SAAS,EAAE,IAAI;EACfC,WAAW,EAAE,IAAI;EACjBC,aAAa,EAAE;AACjB,CAOC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAG;EAC9B;EACAC,OAAO,EAAE;IAAEC,GAAG,EAAE,EAAE;IAAEC,MAAM,EAAE,EAAE;IAAEC,IAAI,EAAE,CAAC;IAAEC,KAAK,EAAE;EAAE,CAAC;EACnD;EACAC,aAAa,EAAE,EAAE;EACjB;EACAC,cAAc,EAAEf,oBAAoB,CAACgB,SAAS;EAC9C;EACAC,cAAc,EAAE;AAClB,CAAU;;AAEV;AACA;AACA;AACA;;AAoBA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,KAAkB,EAClBC,IAAe,EACfC,OAAqB,EACR;EACb,MAAM;IAAEC,EAAE;IAAEC;EAAK,CAAC,GAAGxB,0BAA0B,CAACoB,KAAK,EAAEC,IAAI,EAAEC,OAAO,CAAC;EACrE,OAAO;IACLG,cAAc,EAAE;MACdC,eAAe,EAAEH,EAAE;MACnBI,YAAY,EAAEP,KAAK,CAACf,MAAM,CAACH,UAAU,CAACG,MAAM,CAAC;MAC7CF,OAAO,EAAEiB,KAAK,CAACQ,OAAO,CAAC1B,UAAU,CAACC,OAAO,CAAC;MAC1C0B,aAAa,EAAE,KAAK;MACpBC,UAAU,EAAE,QAAQ;MACpB1B,GAAG,EAAEgB,KAAK,CAACQ,OAAO,CAAC1B,UAAU,CAACE,GAAG;IACnC,CAAC;IACDE,SAAS,EAAEc,KAAK,CAACd,SAAS,CAACJ,UAAU,CAACI,SAAS,CAAC;IAChDyB,YAAY,EAAE;MACZC,KAAK,EAAER,IAAI;MACXS,QAAQ,EAAEb,KAAK,CAACc,UAAU,CAACD,QAAQ,CAAC/B,UAAU,CAACK,WAAW,CAAC,CAAC0B,QAAQ;MACpEE,UAAU,EAAEf,KAAK,CAACc,UAAU,CAACC,UAAU,CAACjC,UAAU,CAACM,aAAa;IAClE;EACF,CAAC;AACH","ignoreList":[]}
@@ -11,8 +11,15 @@
11
11
  *
12
12
  * 下限は使用フォントのメトリクス(ascent + descent)に依存するが、melta はフォントを同梱しない
13
13
  * (system フォント運用)ので、既定は **Android の日本語 system フォント Noto Sans CJK JP の
14
- * 実測 1.448**(hhea: (1160 + 288) / 1000。AOSP 版・Google Fonts 版とも同値、2026-08-06 実測)
15
- * を切り上げた 1.45 とする。iOS(Hiragino 1.50 相当)にはこの clip 機序が無いので基準にしない。
14
+ * 実測 1.448** を切り上げた 1.45 とする。iOS(Hiragino 1.50 相当)にはこの clip 機序が無いので
15
+ * 基準にしない。
16
+ *
17
+ * この 1.448 は手実測メモではなく**CI が毎回機械検算する**(W8):
18
+ * scripts/lib/line-height-floor.test.ts が、実フォントから抽出した生メトリクス fixture
19
+ * (scripts/lib/fixtures/reference-font-metrics.json、sha256 + 取得元 URL 付き)に
20
+ * RN CustomLineHeightSpan の式 `max(A+D, 2·winAsc−A+D, 2·winDesc−D+A)/unitsPerEm` を適用し、
21
+ * DEFAULT_MIN_LINE_HEIGHT_RATIO = ceil(実測×100)/100 の完全一致を強制する。
22
+ * 参照フォントを差し替えるときは scripts/extract-font-metrics.ts で再抽出する(手順はそこに記載)。
16
23
  *
17
24
  * フォントを同梱する消費者は、そのフォントの実測比率を theme の
18
25
  * `typography.minLineHeightRatio` で宣言する(例: LINE Seed JP = 1.61)。
@@ -1 +1 @@
1
- {"version":3,"names":["DEFAULT_MIN_LINE_HEIGHT_RATIO","minRatioOf","theme","typography","minLineHeightRatio","minLineHeightFor","fontSize","minRatio","Math","ceil","clampLineHeight","declaredLineHeight","max"],"sourceRoot":"../../../src","sources":["theme/line-height.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAMA,6BAA6B,GAAG,IAAI;;AAEjD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,KAAsD,EAAU;EACzF,OAAOA,KAAK,CAACC,UAAU,CAACC,kBAAkB,IAAIJ,6BAA6B;AAC7E;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASK,gBAAgBA,CAACC,QAAgB,EAAEC,QAAgB,EAAU;EAC3E,OAAOC,IAAI,CAACC,IAAI,CAACH,QAAQ,GAAGC,QAAQ,CAAC;AACvC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASG,eAAeA,CAC7BJ,QAAgB,EAChBK,kBAA0B,EAC1BJ,QAAgB,EACR;EACR,OAAOC,IAAI,CAACI,GAAG,CAACD,kBAAkB,EAAEN,gBAAgB,CAACC,QAAQ,EAAEC,QAAQ,CAAC,CAAC;AAC3E","ignoreList":[]}
1
+ {"version":3,"names":["DEFAULT_MIN_LINE_HEIGHT_RATIO","minRatioOf","theme","typography","minLineHeightRatio","minLineHeightFor","fontSize","minRatio","Math","ceil","clampLineHeight","declaredLineHeight","max"],"sourceRoot":"../../../src","sources":["theme/line-height.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO,MAAMA,6BAA6B,GAAG,IAAI;;AAEjD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,UAAUA,CAACC,KAAsD,EAAU;EACzF,OAAOA,KAAK,CAACC,UAAU,CAACC,kBAAkB,IAAIJ,6BAA6B;AAC7E;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASK,gBAAgBA,CAACC,QAAgB,EAAEC,QAAgB,EAAU;EAC3E,OAAOC,IAAI,CAACC,IAAI,CAACH,QAAQ,GAAGC,QAAQ,CAAC;AACvC;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASG,eAAeA,CAC7BJ,QAAgB,EAChBK,kBAA0B,EAC1BJ,QAAgB,EACR;EACR,OAAOC,IAAI,CAACI,GAAG,CAACD,kBAAkB,EAAEN,gBAAgB,CAACC,QAAQ,EAAEC,QAAQ,CAAC,CAAC;AAC3E","ignoreList":[]}
@@ -24,11 +24,4 @@ export declare const CANONICAL_TAP_TARGET: {
24
24
  readonly minHeight: 24;
25
25
  readonly hitSlop: 10;
26
26
  };
27
- /**
28
- * 視覚寸法 `visual` を実効 44pt に届かせるのに必要な**片側** hitSlop(切り上げ = 安全側)。
29
- *
30
- * ⚠️ 実装の hitSlop 値をこの関数で計算しないこと(上のコメント参照)。
31
- * 使うのは (a) 値を決めるときの検算、(b) conformance テストの期待値算出。
32
- */
33
- export declare function requiredHitSlop(visual: number): number;
34
27
  //# sourceMappingURL=tap-target.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tap-target.d.ts","sourceRoot":"","sources":["../../../../src/a11y/tap-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,iEAAiE;AACjE,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD"}
1
+ {"version":3,"file":"tap-target.d.ts","sourceRoot":"","sources":["../../../../src/a11y/tap-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,iEAAiE;AACjE,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../../../src/components/TextField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EACL,QAAQ,EAIR,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;GAWG;AAEH,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,QAAQ,CAAC,EAAE,GAAG,SAAS,CAMzE;AAcD,UAAU,cAAc;IACtB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAC1C,uFAAuF;IACvF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,6BAA6B,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,iCAAiC;IACjC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,CAAC;IAC/D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,eAAe,CAAC,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACpD,mEAAmE;IACnE,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,YAAY,EACZ,WAAW,EACX,OAAmB,EACnB,QAAgB,EAChB,IAAe,EACf,UAAU,EACV,SAAS,EACT,6BAA8D,EAC9D,YAAY,EACZ,cAAc,EACd,WAAW,EACX,SAAS,EACT,aAAa,EACb,eAAe,EACf,MAAM,EACN,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,cAAc,2CAmDhB;yBAxEe,SAAS"}
1
+ {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../../../src/components/TextField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EACL,QAAQ,EAIR,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;GAWG;AAEH,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,OAAO,QAAQ,CAAC,EAAE,GAAG,SAAS,CAMzE;AAcD,UAAU,cAAc;IACtB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAC1C,uFAAuF;IACvF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,6BAA6B,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7E,iCAAiC;IACjC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,CAAC;IAC/D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,eAAe,CAAC,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACpD,mEAAmE;IACnE,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,YAAY,EACZ,WAAW,EACX,OAAmB,EACnB,QAAgB,EAChB,IAAe,EACf,UAAU,EACV,SAAS,EACT,6BAA8D,EAC9D,YAAY,EACZ,cAAc,EACd,WAAW,EACX,SAAS,EACT,aAAa,EACb,eAAe,EACf,MAAM,EACN,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,cAAc,2CAqDhB;yBA1Ee,SAAS"}
@@ -1 +1 @@
1
- {"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../../../src/components/Toast.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAmB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAI/E,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,UAAU;IAClB,+BAA+B;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,OAAO,EACP,WAAW,EACX,OAAO,EACP,WAAW,EACX,QAAQ,EACR,uBAA+B,EAC/B,KAAK,EACL,MAAM,GACP,EAAE,UAAU,2CA0DZ;yBApEe,KAAK"}
1
+ {"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../../../../src/components/Toast.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAmB,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAI/E,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,UAAU;IAClB,+BAA+B;IAC/B,OAAO,EAAE,YAAY,CAAC;IACtB,cAAc;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,OAAO,EACP,WAAW,EACX,OAAO,EACP,WAAW,EACX,QAAQ,EACR,uBAA+B,EAC/B,KAAK,EACL,MAAM,GACP,EAAE,UAAU,2CAoEZ;yBA9Ee,KAAK"}
@@ -30,6 +30,18 @@ export declare const TEXTFIELD_SIZE_SPEC: Record<TextFieldSize, {
30
30
  px: SpacingKey;
31
31
  font: FontSizeKey;
32
32
  }>;
33
+ /**
34
+ * TextInput への縦 hitSlop(片側)。small 36 / medium 42 は視覚寸法(recipe の minHeight)を
35
+ * 変えずに実効タップ標的 44 を満たすための手当て(A11Y_MIN_TAP_TARGET_44・規約 10。
36
+ * Codex スパン監査 2026-08-06: TextField が 44pt 横断の対象から漏れていた)。
37
+ * 横は付けない(input は親幅いっぱいで既に広い)。値は literal(規約 10: 導出しない)。
38
+ */
39
+ export declare const TEXTFIELD_VERTICAL_HIT_SLOP: Record<TextFieldSize, number>;
40
+ /** size → TextInput に渡す hitSlop。0 のときは undefined(prop を付けない)。 */
41
+ export declare function resolveTextFieldHitSlop(size: TextFieldSize): {
42
+ top: number;
43
+ bottom: number;
44
+ } | undefined;
33
45
  /** resolver の出力(label → input → helperText / errorText の縦構成の各パート)。 */
34
46
  export interface TextFieldResolvedStyle {
35
47
  input: {
@@ -1 +1 @@
1
- {"version":3,"file":"textfield.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/textfield.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,eAAe,EACf,UAAU,EACX,MAAM,mBAAmB,CAAC;AAG3B,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAC5E,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,aAAa,EACb;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAKzD,CAAC;AAEF,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE;QACL,mDAAmD;QACnD,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,kEAAkE;QAClE,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,eAAe,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,SAAS,EACf,EACE,OAAmB,EACnB,IAAe,GAChB,GAAE;IAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAAC,IAAI,CAAC,EAAE,aAAa,CAAA;CAAO,GAC3D,sBAAsB,CAgDxB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAEtF"}
1
+ {"version":3,"file":"textfield.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/textfield.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,eAAe,EACf,UAAU,EACX,MAAM,mBAAmB,CAAC;AAG3B,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAC5E,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,aAAa,EACb;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAKzD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAIrE,CAAC;AAEF,iEAAiE;AACjE,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,aAAa,GAClB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAI7C;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE;QACL,mDAAmD;QACnD,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,kEAAkE;QAClE,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,eAAe,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,SAAS,EACf,EACE,OAAmB,EACnB,IAAe,GAChB,GAAE;IAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAAC,IAAI,CAAC,EAAE,aAAa,CAAA;CAAO,GAC3D,sBAAsB,CAgDxB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAEtF"}
@@ -40,7 +40,9 @@ export declare const TOAST_SPEC: {
40
40
  *
41
41
  * 横を 6 に削ると × の実効幅が 24 + 6×2 = 36pt と 44pt を割るため、**箱の下限を 32pt に広げて**
42
42
  * 32 + 6×2 = 44pt を確保する(× は背景を持たないので幅を広げても見た目は変わらない)。
43
- * action 側はテキスト幅が可変で静的に決められないため、縦のみ 44pt を保証する。
43
+ * action 側も同じ手当て: テキスト幅は可変だが「短いラベル("OK" 等)で 44pt を割る」のは
44
+ * × と同型の問題なので、見えない箱の幅下限 32 + 横 hitSlop 6×2 = 44 で静的に保証する
45
+ * (Codex スパン監査 2026-08-06。従来は縦のみ保証で、横は「実運用では超える」頼みだった)。
44
46
  */
45
47
  export declare const TOAST_TAP_TARGET: {
46
48
  /** action / × 共通の hitSlop(横だけ gap/2 = 6 に絞る)。 */
@@ -54,6 +56,8 @@ export declare const TOAST_TAP_TARGET: {
54
56
  readonly closeMinWidth: 32;
55
57
  /** × の箱の高さ下限(正典パターンと同値)。 */
56
58
  readonly closeMinHeight: 24;
59
+ /** action の箱の幅の下限(× と同じ 32 + 6×2 = 44。背景なしなので見た目不変)。 */
60
+ readonly actionMinWidth: 32;
57
61
  };
58
62
  /**
59
63
  * slot 構成(toast.recipe 各 variant の containerStyle / messageStyle と 1:1。
@@ -1 +1 @@
1
- {"version":3,"file":"toast.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/toast.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAEV,cAAc,EAGd,eAAe,EACf,WAAW,EAGX,SAAS,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGpF,qDAAqD;AACrD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;CActB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB;IAC3B,iDAAiD;;;;;;;IAEjD,sEAAsE;;IAEtE,4BAA4B;;CAEpB,CAAC;AAEX;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE;QACd,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,KAAK,CAAC;QACrB,UAAU,EAAE,QAAQ,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,kEAAkE;IAClE,SAAS,EAAE,cAAc,CAAC;IAC1B,kDAAkD;IAClD,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,eAAe,CAAC;KAC7B,CAAC;CACH;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,GACpB,WAAW,CAkBb"}
1
+ {"version":3,"file":"toast.styles.d.ts","sourceRoot":"","sources":["../../../../src/components/toast.styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAEV,cAAc,EAGd,eAAe,EACf,WAAW,EAGX,SAAS,EACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGpF,qDAAqD;AACrD,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;CActB,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB;IAC3B,iDAAiD;;;;;;;IAEjD,sEAAsE;;IAEtE,4BAA4B;;IAE5B,wDAAwD;;CAEhD,CAAC;AAEX;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE;QACd,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,KAAK,CAAC;QACrB,UAAU,EAAE,QAAQ,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,kEAAkE;IAClE,SAAS,EAAE,cAAc,CAAC;IAC1B,kDAAkD;IAClD,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,eAAe,CAAC;KAC7B,CAAC;CACH;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,GACpB,WAAW,CAkBb"}
@@ -9,8 +9,15 @@
9
9
  *
10
10
  * 下限は使用フォントのメトリクス(ascent + descent)に依存するが、melta はフォントを同梱しない
11
11
  * (system フォント運用)ので、既定は **Android の日本語 system フォント Noto Sans CJK JP の
12
- * 実測 1.448**(hhea: (1160 + 288) / 1000。AOSP 版・Google Fonts 版とも同値、2026-08-06 実測)
13
- * を切り上げた 1.45 とする。iOS(Hiragino 1.50 相当)にはこの clip 機序が無いので基準にしない。
12
+ * 実測 1.448** を切り上げた 1.45 とする。iOS(Hiragino 1.50 相当)にはこの clip 機序が無いので
13
+ * 基準にしない。
14
+ *
15
+ * この 1.448 は手実測メモではなく**CI が毎回機械検算する**(W8):
16
+ * scripts/lib/line-height-floor.test.ts が、実フォントから抽出した生メトリクス fixture
17
+ * (scripts/lib/fixtures/reference-font-metrics.json、sha256 + 取得元 URL 付き)に
18
+ * RN CustomLineHeightSpan の式 `max(A+D, 2·winAsc−A+D, 2·winDesc−D+A)/unitsPerEm` を適用し、
19
+ * DEFAULT_MIN_LINE_HEIGHT_RATIO = ceil(実測×100)/100 の完全一致を強制する。
20
+ * 参照フォントを差し替えるときは scripts/extract-font-metrics.ts で再抽出する(手順はそこに記載)。
14
21
  *
15
22
  * フォントを同梱する消費者は、そのフォントの実測比率を theme の
16
23
  * `typography.minLineHeightRatio` で宣言する(例: LINE Seed JP = 1.61)。
@@ -1 +1 @@
1
- {"version":3,"file":"line-height.d.ts","sourceRoot":"","sources":["../../../../src/theme/line-height.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;GAGG;AACH,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAEzF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,EAAE,MAAM,GACf,MAAM,CAER"}
1
+ {"version":3,"file":"line-height.d.ts","sourceRoot":"","sources":["../../../../src/theme/line-height.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;GAGG;AACH,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,UAAU,EAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAEzF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,MAAM,EAC1B,QAAQ,EAAE,MAAM,GACf,MAAM,CAER"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "melta-app",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "melta for APP — melta デザインシステムの React Native UI kit。melta-contracts(デザイン契約)を single source of truth に RN 実装でその契約を満たす。アプリ本体ではなくライブラリ。",
5
5
  "license": "MIT",
6
6
  "homepage": "https://app.melta.tsubotax.com",
@@ -27,12 +27,6 @@ export const CANONICAL_TAP_TARGET = {
27
27
  hitSlop: 10,
28
28
  } as const;
29
29
 
30
- /**
31
- * 視覚寸法 `visual` を実効 44pt に届かせるのに必要な**片側** hitSlop(切り上げ 安全側)。
32
- *
33
- * ⚠️ 実装の hitSlop 値をこの関数で計算しないこと(上のコメント参照)。
34
- * 使うのは (a) 値を決めるときの検算、(b) conformance テストの期待値算出。
35
- */
36
- export function requiredHitSlop(visual: number): number {
37
- return Math.max(0, Math.ceil((MIN_TAP_TARGET - visual) / 2));
38
- }
30
+ // requiredHitSlop(必要 hitSlop の導出関数)は置かない — 実装値は literal 規約で導出禁止、
31
+ // テスト側も「実効 = 視覚 + slop×2 >= 44」を直接検算するため使い道が無い(dead code 化して撤去、
32
+ // Codex スパン監査 2026-08-06)。値を決めるときの検算は手計算 ceil((44 − 視覚) / 2) で足りる。
@@ -36,6 +36,7 @@ import {
36
36
  import { useTheme } from "../theme/index.js";
37
37
  import { CONTRACTS } from "../contracts/contract-types.js";
38
38
  import {
39
+ resolveTextFieldHitSlop,
39
40
  resolveTextFieldStyle,
40
41
  resolveTextFieldFocusStyle,
41
42
  type TextFieldSize,
@@ -149,6 +150,8 @@ export function TextField({
149
150
  <View style={style} testID={testID}>
150
151
  <RNText style={resolved.label}>{label}</RNText>
151
152
  <TextInput
153
+ // small 36 / medium 42 の視覚寸法のまま実効タップ標的 44 を満たす(規約 10、値は literal)
154
+ hitSlop={resolveTextFieldHitSlop(size)}
152
155
  value={value}
153
156
  onChangeText={onChangeText}
154
157
  placeholder={placeholder}
@@ -88,7 +88,17 @@ export function Toast({
88
88
  {actionLabel != null && onAction != null && (
89
89
  // 横 hitSlop は gap/2(= 6)まで。10 のままだと隣の × と当たり判定が 8pt 重なり、
90
90
  // 手前に描かれる × が勝って「元に戻す」が押せない(toast.styles.ts の TOAST_TAP_TARGET 参照)。
91
- <Pressable onPress={onAction} accessibilityRole="button" hitSlop={TOAST_TAP_TARGET.hitSlop}>
91
+ <Pressable
92
+ onPress={onAction}
93
+ accessibilityRole="button"
94
+ hitSlop={TOAST_TAP_TARGET.hitSlop}
95
+ // 短いラベル("OK" 等)でも横の実効 44 を割らないよう × と同じ幅下限(背景なし = 見た目不変)
96
+ style={{
97
+ minWidth: TOAST_TAP_TARGET.actionMinWidth,
98
+ alignItems: "center",
99
+ justifyContent: "center",
100
+ }}
101
+ >
92
102
  <Text
93
103
  variant={TOAST_SPEC.messageFont}
94
104
  weight={TOAST_SPEC.messageWeight}
@@ -44,6 +44,27 @@ export const TEXTFIELD_SIZE_SPEC: Record<
44
44
  large: { minHeight: 48, px: "3", font: "lg" },
45
45
  };
46
46
 
47
+ /**
48
+ * TextInput への縦 hitSlop(片側)。small 36 / medium 42 は視覚寸法(recipe の minHeight)を
49
+ * 変えずに実効タップ標的 44 を満たすための手当て(A11Y_MIN_TAP_TARGET_44・規約 10。
50
+ * Codex スパン監査 2026-08-06: TextField が 44pt 横断の対象から漏れていた)。
51
+ * 横は付けない(input は親幅いっぱいで既に広い)。値は literal(規約 10: 導出しない)。
52
+ */
53
+ export const TEXTFIELD_VERTICAL_HIT_SLOP: Record<TextFieldSize, number> = {
54
+ small: 4,
55
+ medium: 1,
56
+ large: 0,
57
+ };
58
+
59
+ /** size → TextInput に渡す hitSlop。0 のときは undefined(prop を付けない)。 */
60
+ export function resolveTextFieldHitSlop(
61
+ size: TextFieldSize,
62
+ ): { top: number; bottom: number } | undefined {
63
+ const slop = TEXTFIELD_VERTICAL_HIT_SLOP[size];
64
+ if (slop === 0) return undefined;
65
+ return { top: slop, bottom: slop };
66
+ }
67
+
47
68
  /** resolver の出力(label → input → helperText / errorText の縦構成の各パート)。 */
48
69
  export interface TextFieldResolvedStyle {
49
70
  input: {
@@ -62,7 +62,9 @@ export const TOAST_SPEC = {
62
62
  *
63
63
  * 横を 6 に削ると × の実効幅が 24 + 6×2 = 36pt と 44pt を割るため、**箱の下限を 32pt に広げて**
64
64
  * 32 + 6×2 = 44pt を確保する(× は背景を持たないので幅を広げても見た目は変わらない)。
65
- * action 側はテキスト幅が可変で静的に決められないため、縦のみ 44pt を保証する。
65
+ * action 側も同じ手当て: テキスト幅は可変だが「短いラベル("OK" 等)で 44pt を割る」のは
66
+ * × と同型の問題なので、見えない箱の幅下限 32 + 横 hitSlop 6×2 = 44 で静的に保証する
67
+ * (Codex スパン監査 2026-08-06。従来は縦のみ保証で、横は「実運用では超える」頼みだった)。
66
68
  */
67
69
  export const TOAST_TAP_TARGET = {
68
70
  /** action / × 共通の hitSlop(横だけ gap/2 = 6 に絞る)。 */
@@ -71,6 +73,8 @@ export const TOAST_TAP_TARGET = {
71
73
  closeMinWidth: 32,
72
74
  /** × の箱の高さ下限(正典パターンと同値)。 */
73
75
  closeMinHeight: CANONICAL_TAP_TARGET.minHeight,
76
+ /** action の箱の幅の下限(× と同じ 32 + 6×2 = 44。背景なしなので見た目不変)。 */
77
+ actionMinWidth: 32,
74
78
  } as const;
75
79
 
76
80
  /**
@@ -9,8 +9,15 @@
9
9
  *
10
10
  * 下限は使用フォントのメトリクス(ascent + descent)に依存するが、melta はフォントを同梱しない
11
11
  * (system フォント運用)ので、既定は **Android の日本語 system フォント Noto Sans CJK JP の
12
- * 実測 1.448**(hhea: (1160 + 288) / 1000。AOSP 版・Google Fonts 版とも同値、2026-08-06 実測)
13
- * を切り上げた 1.45 とする。iOS(Hiragino 1.50 相当)にはこの clip 機序が無いので基準にしない。
12
+ * 実測 1.448** を切り上げた 1.45 とする。iOS(Hiragino 1.50 相当)にはこの clip 機序が無いので
13
+ * 基準にしない。
14
+ *
15
+ * この 1.448 は手実測メモではなく**CI が毎回機械検算する**(W8):
16
+ * scripts/lib/line-height-floor.test.ts が、実フォントから抽出した生メトリクス fixture
17
+ * (scripts/lib/fixtures/reference-font-metrics.json、sha256 + 取得元 URL 付き)に
18
+ * RN CustomLineHeightSpan の式 `max(A+D, 2·winAsc−A+D, 2·winDesc−D+A)/unitsPerEm` を適用し、
19
+ * DEFAULT_MIN_LINE_HEIGHT_RATIO = ceil(実測×100)/100 の完全一致を強制する。
20
+ * 参照フォントを差し替えるときは scripts/extract-font-metrics.ts で再抽出する(手順はそこに記載)。
14
21
  *
15
22
  * フォントを同梱する消費者は、そのフォントの実測比率を theme の
16
23
  * `typography.minLineHeightRatio` で宣言する(例: LINE Seed JP = 1.61)。