melta-app 0.5.3 → 0.7.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 (298) hide show
  1. package/README.md +493 -186
  2. package/docs/architecture.md +99 -0
  3. package/eslint-rules/melta.d.mts +44 -0
  4. package/lib/module/a11y/tap-target.js +41 -0
  5. package/lib/module/a11y/tap-target.js.map +1 -0
  6. package/lib/module/components/ActionSheet.js +20 -6
  7. package/lib/module/components/ActionSheet.js.map +1 -1
  8. package/lib/module/components/Alert.js +11 -7
  9. package/lib/module/components/Alert.js.map +1 -1
  10. package/lib/module/components/Avatar.js +7 -2
  11. package/lib/module/components/Avatar.js.map +1 -1
  12. package/lib/module/components/BottomSheet.js +11 -3
  13. package/lib/module/components/BottomSheet.js.map +1 -1
  14. package/lib/module/components/Card.js +4 -3
  15. package/lib/module/components/Card.js.map +1 -1
  16. package/lib/module/components/Checkbox.js +8 -5
  17. package/lib/module/components/Checkbox.js.map +1 -1
  18. package/lib/module/components/EmptyState.js +2 -1
  19. package/lib/module/components/EmptyState.js.map +1 -1
  20. package/lib/module/components/Header.js.map +1 -1
  21. package/lib/module/components/Image.js +5 -3
  22. package/lib/module/components/Image.js.map +1 -1
  23. package/lib/module/components/Modal.js +12 -4
  24. package/lib/module/components/Modal.js.map +1 -1
  25. package/lib/module/components/Progress.js +2 -1
  26. package/lib/module/components/Progress.js.map +1 -1
  27. package/lib/module/components/Radio.js +11 -3
  28. package/lib/module/components/Radio.js.map +1 -1
  29. package/lib/module/components/Screen.js +28 -3
  30. package/lib/module/components/Screen.js.map +1 -1
  31. package/lib/module/components/Skeleton.js +2 -1
  32. package/lib/module/components/Skeleton.js.map +1 -1
  33. package/lib/module/components/Surface.js +2 -1
  34. package/lib/module/components/Surface.js.map +1 -1
  35. package/lib/module/components/TextField.js +16 -4
  36. package/lib/module/components/TextField.js.map +1 -1
  37. package/lib/module/components/Toast.js +17 -9
  38. package/lib/module/components/Toast.js.map +1 -1
  39. package/lib/module/components/Toggle.js +13 -4
  40. package/lib/module/components/Toggle.js.map +1 -1
  41. package/lib/module/components/alert.styles.js +12 -26
  42. package/lib/module/components/alert.styles.js.map +1 -1
  43. package/lib/module/components/avatar.styles.js +24 -2
  44. package/lib/module/components/avatar.styles.js.map +1 -1
  45. package/lib/module/components/card.validate.js.map +1 -1
  46. package/lib/module/components/checkbox.styles.js +5 -2
  47. package/lib/module/components/checkbox.styles.js.map +1 -1
  48. package/lib/module/components/index.js.map +1 -1
  49. package/lib/module/components/modal.styles.js +9 -0
  50. package/lib/module/components/modal.styles.js.map +1 -1
  51. package/lib/module/components/radio.styles.js +11 -2
  52. package/lib/module/components/radio.styles.js.map +1 -1
  53. package/lib/module/components/safe-area-registry.js +64 -13
  54. package/lib/module/components/safe-area-registry.js.map +1 -1
  55. package/lib/module/components/status-colors.js +53 -0
  56. package/lib/module/components/status-colors.js.map +1 -0
  57. package/lib/module/components/textfield.styles.js +15 -8
  58. package/lib/module/components/textfield.styles.js.map +1 -1
  59. package/lib/module/components/toast.styles.js +36 -25
  60. package/lib/module/components/toast.styles.js.map +1 -1
  61. package/lib/module/components/toggle.styles.js +20 -0
  62. package/lib/module/components/toggle.styles.js.map +1 -1
  63. package/lib/module/icons/Icon.js +4 -1
  64. package/lib/module/icons/Icon.js.map +1 -1
  65. package/lib/module/icons/icon.styles.js +32 -1
  66. package/lib/module/icons/icon.styles.js.map +1 -1
  67. package/lib/module/icons/index.js.map +1 -1
  68. package/lib/module/index.js.map +1 -1
  69. package/lib/module/primitives/Button.js +23 -11
  70. package/lib/module/primitives/Button.js.map +1 -1
  71. package/lib/module/primitives/Metric.js +2 -1
  72. package/lib/module/primitives/Metric.js.map +1 -1
  73. package/lib/module/primitives/Row.js.map +1 -1
  74. package/lib/module/primitives/Stack.js.map +1 -1
  75. package/lib/module/primitives/Tag.js +15 -7
  76. package/lib/module/primitives/Tag.js.map +1 -1
  77. package/lib/module/primitives/Text.js +28 -7
  78. package/lib/module/primitives/Text.js.map +1 -1
  79. package/lib/module/primitives/_internal/focus-ring.js.map +1 -1
  80. package/lib/module/primitives/button.styles.js +58 -8
  81. package/lib/module/primitives/button.styles.js.map +1 -1
  82. package/lib/module/primitives/index.js.map +1 -1
  83. package/lib/module/primitives/metric.styles.js +4 -1
  84. package/lib/module/primitives/metric.styles.js.map +1 -1
  85. package/lib/module/primitives/tag.styles.js +42 -3
  86. package/lib/module/primitives/tag.styles.js.map +1 -1
  87. package/lib/module/primitives/text.styles.js +10 -5
  88. package/lib/module/primitives/text.styles.js.map +1 -1
  89. package/lib/module/safe-area/index.js +11 -5
  90. package/lib/module/safe-area/index.js.map +1 -1
  91. package/lib/module/theme/ThemeProvider.js +5 -2
  92. package/lib/module/theme/ThemeProvider.js.map +1 -1
  93. package/lib/module/theme/define-theme.js +27 -1
  94. package/lib/module/theme/define-theme.js.map +1 -1
  95. package/lib/module/theme/index.js +7 -8
  96. package/lib/module/theme/index.js.map +1 -1
  97. package/lib/module/theme/letter-spacing.js +20 -0
  98. package/lib/module/theme/letter-spacing.js.map +1 -0
  99. package/lib/module/theme/line-height.js +52 -0
  100. package/lib/module/theme/line-height.js.map +1 -0
  101. package/lib/module/theme/native-theme.js +8 -7
  102. package/lib/module/theme/native-theme.js.map +1 -1
  103. package/lib/typescript/src/a11y/tap-target.d.ts +34 -0
  104. package/lib/typescript/src/a11y/tap-target.d.ts.map +1 -0
  105. package/lib/typescript/src/components/ActionSheet.d.ts +8 -1
  106. package/lib/typescript/src/components/ActionSheet.d.ts.map +1 -1
  107. package/lib/typescript/src/components/Alert.d.ts +9 -2
  108. package/lib/typescript/src/components/Alert.d.ts.map +1 -1
  109. package/lib/typescript/src/components/Avatar.d.ts +1 -1
  110. package/lib/typescript/src/components/Avatar.d.ts.map +1 -1
  111. package/lib/typescript/src/components/BottomSheet.d.ts +4 -1
  112. package/lib/typescript/src/components/BottomSheet.d.ts.map +1 -1
  113. package/lib/typescript/src/components/Card.d.ts +2 -2
  114. package/lib/typescript/src/components/Checkbox.d.ts +3 -3
  115. package/lib/typescript/src/components/Checkbox.d.ts.map +1 -1
  116. package/lib/typescript/src/components/Image.d.ts +4 -3
  117. package/lib/typescript/src/components/Image.d.ts.map +1 -1
  118. package/lib/typescript/src/components/Modal.d.ts +9 -3
  119. package/lib/typescript/src/components/Modal.d.ts.map +1 -1
  120. package/lib/typescript/src/components/Progress.d.ts +1 -1
  121. package/lib/typescript/src/components/Progress.d.ts.map +1 -1
  122. package/lib/typescript/src/components/Radio.d.ts +3 -2
  123. package/lib/typescript/src/components/Radio.d.ts.map +1 -1
  124. package/lib/typescript/src/components/Screen.d.ts +28 -5
  125. package/lib/typescript/src/components/Screen.d.ts.map +1 -1
  126. package/lib/typescript/src/components/Skeleton.d.ts +1 -1
  127. package/lib/typescript/src/components/Skeleton.d.ts.map +1 -1
  128. package/lib/typescript/src/components/Surface.d.ts +1 -1
  129. package/lib/typescript/src/components/Surface.d.ts.map +1 -1
  130. package/lib/typescript/src/components/TextField.d.ts +11 -4
  131. package/lib/typescript/src/components/TextField.d.ts.map +1 -1
  132. package/lib/typescript/src/components/Toast.d.ts +10 -3
  133. package/lib/typescript/src/components/Toast.d.ts.map +1 -1
  134. package/lib/typescript/src/components/Toggle.d.ts +3 -2
  135. package/lib/typescript/src/components/Toggle.d.ts.map +1 -1
  136. package/lib/typescript/src/components/action-sheet.styles.d.ts +1 -1
  137. package/lib/typescript/src/components/action-sheet.styles.d.ts.map +1 -1
  138. package/lib/typescript/src/components/alert.styles.d.ts +14 -14
  139. package/lib/typescript/src/components/alert.styles.d.ts.map +1 -1
  140. package/lib/typescript/src/components/avatar.styles.d.ts +36 -1
  141. package/lib/typescript/src/components/avatar.styles.d.ts.map +1 -1
  142. package/lib/typescript/src/components/bottom-sheet.styles.d.ts +1 -1
  143. package/lib/typescript/src/components/bottom-sheet.styles.d.ts.map +1 -1
  144. package/lib/typescript/src/components/card.styles.d.ts +1 -1
  145. package/lib/typescript/src/components/card.styles.d.ts.map +1 -1
  146. package/lib/typescript/src/components/card.validate.d.ts +1 -1
  147. package/lib/typescript/src/components/card.validate.d.ts.map +1 -1
  148. package/lib/typescript/src/components/checkbox.styles.d.ts +6 -3
  149. package/lib/typescript/src/components/checkbox.styles.d.ts.map +1 -1
  150. package/lib/typescript/src/components/empty-state.styles.d.ts +1 -1
  151. package/lib/typescript/src/components/empty-state.styles.d.ts.map +1 -1
  152. package/lib/typescript/src/components/header.styles.d.ts +1 -1
  153. package/lib/typescript/src/components/header.styles.d.ts.map +1 -1
  154. package/lib/typescript/src/components/image.styles.d.ts +1 -1
  155. package/lib/typescript/src/components/image.styles.d.ts.map +1 -1
  156. package/lib/typescript/src/components/index.d.ts +18 -18
  157. package/lib/typescript/src/components/index.d.ts.map +1 -1
  158. package/lib/typescript/src/components/modal.styles.d.ts +13 -2
  159. package/lib/typescript/src/components/modal.styles.d.ts.map +1 -1
  160. package/lib/typescript/src/components/progress.styles.d.ts +1 -1
  161. package/lib/typescript/src/components/progress.styles.d.ts.map +1 -1
  162. package/lib/typescript/src/components/radio.styles.d.ts +10 -2
  163. package/lib/typescript/src/components/radio.styles.d.ts.map +1 -1
  164. package/lib/typescript/src/components/safe-area-registry.d.ts +47 -11
  165. package/lib/typescript/src/components/safe-area-registry.d.ts.map +1 -1
  166. package/lib/typescript/src/components/screen.styles.d.ts +1 -1
  167. package/lib/typescript/src/components/screen.styles.d.ts.map +1 -1
  168. package/lib/typescript/src/components/skeleton.styles.d.ts +1 -1
  169. package/lib/typescript/src/components/skeleton.styles.d.ts.map +1 -1
  170. package/lib/typescript/src/components/status-colors.d.ts +33 -0
  171. package/lib/typescript/src/components/status-colors.d.ts.map +1 -0
  172. package/lib/typescript/src/components/surface.styles.d.ts +1 -1
  173. package/lib/typescript/src/components/surface.styles.d.ts.map +1 -1
  174. package/lib/typescript/src/components/textfield.styles.d.ts +9 -5
  175. package/lib/typescript/src/components/textfield.styles.d.ts.map +1 -1
  176. package/lib/typescript/src/components/toast.styles.d.ts +34 -14
  177. package/lib/typescript/src/components/toast.styles.d.ts.map +1 -1
  178. package/lib/typescript/src/components/toggle.styles.d.ts +17 -1
  179. package/lib/typescript/src/components/toggle.styles.d.ts.map +1 -1
  180. package/lib/typescript/src/icons/Icon.d.ts +12 -6
  181. package/lib/typescript/src/icons/Icon.d.ts.map +1 -1
  182. package/lib/typescript/src/icons/icon.styles.d.ts +14 -2
  183. package/lib/typescript/src/icons/icon.styles.d.ts.map +1 -1
  184. package/lib/typescript/src/icons/index.d.ts +3 -3
  185. package/lib/typescript/src/icons/index.d.ts.map +1 -1
  186. package/lib/typescript/src/index.d.ts +4 -4
  187. package/lib/typescript/src/index.d.ts.map +1 -1
  188. package/lib/typescript/src/primitives/Button.d.ts +8 -4
  189. package/lib/typescript/src/primitives/Button.d.ts.map +1 -1
  190. package/lib/typescript/src/primitives/Metric.d.ts +1 -1
  191. package/lib/typescript/src/primitives/Metric.d.ts.map +1 -1
  192. package/lib/typescript/src/primitives/Row.d.ts +2 -2
  193. package/lib/typescript/src/primitives/Row.d.ts.map +1 -1
  194. package/lib/typescript/src/primitives/Stack.d.ts +2 -2
  195. package/lib/typescript/src/primitives/Stack.d.ts.map +1 -1
  196. package/lib/typescript/src/primitives/Tag.d.ts +2 -2
  197. package/lib/typescript/src/primitives/Tag.d.ts.map +1 -1
  198. package/lib/typescript/src/primitives/Text.d.ts +20 -6
  199. package/lib/typescript/src/primitives/Text.d.ts.map +1 -1
  200. package/lib/typescript/src/primitives/button.styles.d.ts +44 -7
  201. package/lib/typescript/src/primitives/button.styles.d.ts.map +1 -1
  202. package/lib/typescript/src/primitives/index.d.ts +6 -6
  203. package/lib/typescript/src/primitives/index.d.ts.map +1 -1
  204. package/lib/typescript/src/primitives/metric.styles.d.ts +1 -1
  205. package/lib/typescript/src/primitives/metric.styles.d.ts.map +1 -1
  206. package/lib/typescript/src/primitives/row.styles.d.ts +1 -1
  207. package/lib/typescript/src/primitives/row.styles.d.ts.map +1 -1
  208. package/lib/typescript/src/primitives/stack.styles.d.ts +1 -1
  209. package/lib/typescript/src/primitives/stack.styles.d.ts.map +1 -1
  210. package/lib/typescript/src/primitives/tag.styles.d.ts +34 -1
  211. package/lib/typescript/src/primitives/tag.styles.d.ts.map +1 -1
  212. package/lib/typescript/src/primitives/text.styles.d.ts +2 -4
  213. package/lib/typescript/src/primitives/text.styles.d.ts.map +1 -1
  214. package/lib/typescript/src/safe-area/index.d.ts +19 -5
  215. package/lib/typescript/src/safe-area/index.d.ts.map +1 -1
  216. package/lib/typescript/src/theme/ThemeProvider.d.ts +2 -2
  217. package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
  218. package/lib/typescript/src/theme/define-theme.d.ts +15 -2
  219. package/lib/typescript/src/theme/define-theme.d.ts.map +1 -1
  220. package/lib/typescript/src/theme/index.d.ts +14 -13
  221. package/lib/typescript/src/theme/index.d.ts.map +1 -1
  222. package/lib/typescript/src/theme/letter-spacing.d.ts +15 -0
  223. package/lib/typescript/src/theme/letter-spacing.d.ts.map +1 -0
  224. package/lib/typescript/src/theme/line-height.d.ts +44 -0
  225. package/lib/typescript/src/theme/line-height.d.ts.map +1 -0
  226. package/lib/typescript/src/theme/native-theme.d.ts +1 -1
  227. package/lib/typescript/src/theme/native-theme.d.ts.map +1 -1
  228. package/lib/typescript/src/theme/types.d.ts +10 -1
  229. package/lib/typescript/src/theme/types.d.ts.map +1 -1
  230. package/llms.txt +2 -1
  231. package/package.json +22 -7
  232. package/src/a11y/tap-target.ts +38 -0
  233. package/src/components/ActionSheet.tsx +25 -15
  234. package/src/components/Alert.tsx +37 -10
  235. package/src/components/Avatar.tsx +12 -4
  236. package/src/components/BottomSheet.tsx +16 -13
  237. package/src/components/Card.tsx +9 -8
  238. package/src/components/Checkbox.tsx +12 -9
  239. package/src/components/EmptyState.tsx +7 -6
  240. package/src/components/Header.tsx +4 -4
  241. package/src/components/Image.tsx +9 -7
  242. package/src/components/Modal.tsx +22 -6
  243. package/src/components/Progress.tsx +5 -4
  244. package/src/components/Radio.tsx +11 -6
  245. package/src/components/Screen.tsx +66 -8
  246. package/src/components/Skeleton.tsx +6 -5
  247. package/src/components/Surface.tsx +5 -4
  248. package/src/components/TextField.tsx +25 -7
  249. package/src/components/Toast.tsx +33 -11
  250. package/src/components/Toggle.tsx +15 -6
  251. package/src/components/action-sheet.styles.ts +1 -1
  252. package/src/components/alert.styles.ts +13 -25
  253. package/src/components/avatar.styles.ts +25 -3
  254. package/src/components/bottom-sheet.styles.ts +1 -1
  255. package/src/components/card.styles.ts +1 -1
  256. package/src/components/card.validate.ts +2 -2
  257. package/src/components/checkbox.styles.ts +6 -3
  258. package/src/components/empty-state.styles.ts +1 -1
  259. package/src/components/header.styles.ts +1 -1
  260. package/src/components/image.styles.ts +1 -1
  261. package/src/components/index.ts +18 -18
  262. package/src/components/modal.styles.ts +11 -2
  263. package/src/components/progress.styles.ts +1 -1
  264. package/src/components/radio.styles.ts +11 -2
  265. package/src/components/safe-area-registry.ts +81 -14
  266. package/src/components/screen.styles.ts +1 -1
  267. package/src/components/skeleton.styles.ts +1 -1
  268. package/src/components/status-colors.ts +59 -0
  269. package/src/components/surface.styles.ts +1 -1
  270. package/src/components/textfield.styles.ts +18 -15
  271. package/src/components/toast.styles.ts +32 -25
  272. package/src/components/toggle.styles.ts +21 -1
  273. package/src/icons/Icon.tsx +13 -8
  274. package/src/icons/icon.styles.ts +38 -3
  275. package/src/icons/index.ts +3 -3
  276. package/src/index.ts +4 -4
  277. package/src/primitives/Button.tsx +28 -14
  278. package/src/primitives/Metric.tsx +5 -4
  279. package/src/primitives/Row.tsx +4 -4
  280. package/src/primitives/Stack.tsx +4 -4
  281. package/src/primitives/Tag.tsx +29 -11
  282. package/src/primitives/Text.tsx +42 -9
  283. package/src/primitives/_internal/focus-ring.tsx +1 -1
  284. package/src/primitives/button.styles.ts +63 -10
  285. package/src/primitives/index.ts +6 -6
  286. package/src/primitives/metric.styles.ts +9 -2
  287. package/src/primitives/row.styles.ts +1 -1
  288. package/src/primitives/stack.styles.ts +1 -1
  289. package/src/primitives/tag.styles.ts +43 -4
  290. package/src/primitives/text.styles.ts +10 -6
  291. package/src/safe-area/index.ts +21 -7
  292. package/src/theme/ThemeProvider.tsx +8 -5
  293. package/src/theme/define-theme.ts +33 -2
  294. package/src/theme/index.ts +18 -16
  295. package/src/theme/letter-spacing.ts +17 -0
  296. package/src/theme/line-height.ts +53 -0
  297. package/src/theme/native-theme.ts +9 -8
  298. package/src/theme/types.ts +10 -1
@@ -0,0 +1,99 @@
1
+ # melta-app アーキテクチャ / 開発台帳
2
+
3
+ > このリポジトリを**触る人**向けの台帳。**使う人**向けの情報(Install / lint 強制層 / コンポーネント表 /
4
+ > テーマ注入 / 制約)は [README](../README.md) にある。ここは README から分離した詳細で、
5
+ > 内容は削っていない(README 側には要約とリンクだけを置く)。
6
+
7
+ ## ディレクトリ
8
+
9
+ ```
10
+ melta-app/
11
+ src/ ライブラリ本体(npm 配布物)
12
+ theme/
13
+ types.ts NativeTheme の型
14
+ native-theme.ts ⚠️ 自動生成(melta-contracts → RN 正規化済み)
15
+ index.ts theme エントリ(ThemeProvider / useTheme / nativeTheme)
16
+ primitives/ Text / Button / Tag / Metric / Stack / Row
17
+ components/ Card / Image / Surface / Skeleton / EmptyState / Screen / Header /
18
+ Avatar / TextField / Toggle / Checkbox / Radio / Alert / Toast /
19
+ Progress / Modal / ActionSheet / BottomSheet
20
+ icons/ Icon + glyphs(subpath エントリ melta-app/icons、react-native-svg 隔離)
21
+ contracts/
22
+ contract-types.ts ⚠️ 自動生成(契約メタ CONTRACTS + 型)
23
+ index.ts 公開エントリ
24
+ example/ カタログアプリ(Expo、publish 除外)
25
+ App.tsx / catalog/ / screens/
26
+ scripts/
27
+ generate-native-theme.ts melta-contracts/tokens.json → src/theme/native-theme.ts
28
+ generate-contract-types.ts 契約 JSON → src/contracts/contract-types.ts
29
+ check-drift.ts README / docs / catalog / allowlist の drift 検査(--write で heal)
30
+ check-installability.sh pack → attw → install → import → typecheck の公開ゲート
31
+ lib/ token 正規化 + conformance / consumer テスト
32
+ ```
33
+
34
+ ## style resolver
35
+
36
+ 見た目の値の解決は component(`.tsx`)ではなく隣の `<component>.styles.ts`(react-native を値 import しない
37
+ pure module)に置く。node の `tsx --test` から直接実行できることが conformance テストの前提になっている。
38
+ 書き方の規約(`<COMPONENT>_SPEC` / slot 単位の戻り値 / 命名 / 共有 module)は [AGENTS.md](../AGENTS.md) が正。
39
+ resolver は3世代が混在しているので、**現行世代を規範とする**(初代の `button.styles.ts` を写さない)。
40
+
41
+ ## トークン正規化(web → RN)
42
+
43
+ `scripts/lib/normalize-tokens.ts` が変換する。壊れやすい箇所はテスト必須。
44
+
45
+ | トークン | web | RN |
46
+ |---|---|---|
47
+ | color | hex / rgba | そのまま(semantic は light/dark mode 切替) |
48
+ | spacing / radius / fontSize | rem + px | px の数値を採用(RN は unitless) |
49
+ | shadow | CSS box-shadow | iOS shadow* + Android elevation に分解(1 ViewStyle に同居) |
50
+ | fontFamily | 配列 | 単一文字列(先頭採用、未ロード時 OS デフォルト fallback) |
51
+ | lineHeight | 比率("2.0") | `fontSize × ratio` を px 算出(四捨五入)し、安全下限 `ceil(fontSize × minLineHeightRatio)`(既定 1.45)でクランプ(RN Android の字形欠け対策。根拠は `src/theme/line-height.ts`) |
52
+ | letterSpacing | em | **em ratio の数値で保持**(fontSize 相対のため token 単体で px 化不可。適用側が `fontSize × ratio` で解決) |
53
+ | motion duration | "150ms" | 150(数値) |
54
+ | motion easing | cubic-bezier | `[a,b,c,d]` tuple(`Easing.bezier(...)` に展開) |
55
+
56
+ ## 開発
57
+
58
+ ```bash
59
+ npm install # melta-contracts(npm 公開済み)も devDependencies として入る
60
+
61
+ # theme + contract 型を生成(melta-contracts のノードを読む。
62
+ # 未 install 時のみ隣の melta-ui を fallback で読む開発モード)
63
+ npm run generate
64
+
65
+ # 変換・conformance・consumer テスト
66
+ npm test
67
+
68
+ # 実機 / シミュレータでカタログを確認
69
+ npm run ios # または android / web
70
+ ```
71
+
72
+ ## 実装ステータス(詳細)
73
+
74
+ - ✅ ライブラリ化(root=ライブラリ / example=カタログアプリ、peerDeps react + react-native、runtime deps ゼロ)
75
+ - ✅ `melta-contracts` を npm 依存として購読(recipes/app の styleRefs 同梱)
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` チェーンの必須ステップ)
78
+ - ✅ layout 6 個(Stack / Row / Screen / Header / Icon / Avatar)— dogfood 不足 1〜4 を解消、ProjectFeedScreen は公開 primitive だけで構成
79
+ - Screen の SafeArea は adapter registry 化済み: default は RN core SafeAreaView(依存ゼロ維持)、`melta-app/safe-area` の `enableSafeAreaContext()` で react-native-safe-area-context に差し替え可(optional peer)
80
+ - ✅ form / feedback 10 個(TextField / Toggle / Checkbox / Radio / Alert / Toast / Progress / Modal / ActionSheet / BottomSheet)— checkbox / radio は Pressable + 描画(svg 非依存)、ActionSheet / BottomSheet は select / dropdown の adapted 変換先の受け皿
81
+ - ✅ showcase(https://app.melta.tsubotax.com — melta-ui 様式シェル + 実 RN カタログの Live 埋め込み。表・統計は契約からビルド時生成)
82
+ - ✅ AI 入口: [llms.txt](https://app.melta.tsubotax.com/llms.txt)(契約から生成・drift 検査対象)+ [patterns.md](./patterns.md)(フォームの組み方規範。スニペットは実コードと機械同期)
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)
85
+ - ✅ [npm publish(0.5.3)](https://www.npmjs.com/package/melta-app)
86
+ - ⬜ React Native Directory 登録([PR #2606](https://github.com/react-native-community/directory/pull/2606) レビュー待ち)
87
+
88
+ ## CI(.github/workflows/check.yml)
89
+
90
+ push / PR で以下を順に回す。CI には兄弟ディレクトリ(melta-ui)が存在しないため、`npm run generate`
91
+ が通ること自体が「npm 経路(melta-contracts)だけで生成できる」証明になっている。
92
+
93
+ 1. `npm run generate` → 生成物の差分ゼロ(再生成漏れの検知)
94
+ 2. `npm run typecheck`(lib + example + scripts)
95
+ 3. `npm run lint`(`--max-warnings 0`)
96
+ 4. `npm test`(consumer + conformance)
97
+ 5. `npm run check:drift`(README / docs / catalog / allowlist)
98
+ 6. `npm run test:rn`(RN mount smoke)
99
+ 7. `npm run check:installability`(pack → attw → install → import → typecheck ×3 解決)
@@ -0,0 +1,44 @@
1
+ /**
2
+ * melta design lint プラグインの型宣言(melta.mjs の手書き型)。
3
+ *
4
+ * `melta.mjs` は実装の正本。この宣言は npm 利用者(moduleResolution: node16/nodenext)が
5
+ * `melta-app/eslint-plugin` を型付きで import できるようにするためだけに存在する。
6
+ * 実装を変えたらこちらも手で追随させる(ルール名は check-installability が機械照合している)。
7
+ *
8
+ * ESLint 本体の型(`eslint` / `@types/eslint`)には**意図的に依存しない**。
9
+ * eslint は melta-app の dependencies ではないため、import すると
10
+ * 「eslint 未 install の利用者で型が壊れる」経路を作ってしまう。
11
+ * flat config に差し込むのに必要な最小限を構造的に宣言する。
12
+ */
13
+
14
+ /** ESLint のルール実装(AST visitor を返す `create` と表示用 `meta`)。 */
15
+ export interface MeltaRule {
16
+ meta: {
17
+ type: "problem" | "suggestion" | "layout";
18
+ docs: { description: string };
19
+ };
20
+ // AST ノード型は eslint の型に依存しないため unknown 止まり(消費者は呼び出さない)。
21
+ create(context: unknown): Record<string, (...args: never[]) => void>;
22
+ }
23
+
24
+ /** このプラグインが提供するルール ID(`melta/` prefix なし)。 */
25
+ export type MeltaRuleName =
26
+ | "no-raw-color"
27
+ | "no-raw-radius"
28
+ | "no-raw-spacing"
29
+ | "no-raw-fontsize";
30
+
31
+ /** flat config の 1 要素として展開できる推奨設定。 */
32
+ export interface MeltaFlatConfig {
33
+ name: string;
34
+ plugins: { melta: MeltaPlugin };
35
+ /** severity の正本は melta.mjs の RECOMMENDED_RULES(ドキュメントではない)。 */
36
+ rules: Record<string, "error" | "warn" | "off">;
37
+ }
38
+
39
+ export interface MeltaPlugin {
40
+ rules: Record<MeltaRuleName, MeltaRule>;
41
+ configs: { recommended: MeltaFlatConfig };
42
+ }
43
+
44
+ export declare const meltaPlugin: MeltaPlugin;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * tap-target — 実効タップ標的 44pt(横断方針)の数値 SSOT。
5
+ *
6
+ * 正本は melta-contracts の `A11Y_MIN_TAP_TARGET_44`(rules.json):
7
+ * 「すべての操作要素は実効タップ標的 44pt を下回らない。視覚寸法は契約どおり据え置き、
8
+ * 当たり判定だけを広げる。app は視覚 24pt + hitSlop 10 の正典パターンか minHeight で下限を保証する
9
+ * (height 固定は fontScale でクリップするので使わない)」。
10
+ *
11
+ * ここは「44」という数と正典パターンの寸法を**一箇所**に置くための pure module。
12
+ * 各コンポーネントの hitSlop 値そのものは **literal で各 `*.styles.ts` に置く**(ここから
13
+ * 自動導出しない)。導出にすると視覚寸法が変わったとき hitSlop も一緒に動いてしまい、
14
+ * conformance テスト(scripts/lib/tap-target-conformance.test.ts)が構造的に fail-open になるため。
15
+ *
16
+ * react-native を import しない純粋モジュール(`*.styles.ts` と同じ規約)。
17
+ */
18
+
19
+ /** 実効タップ標的の下限(pt)。WCAG 2.2 SC 2.5.5(AAA)水準を melta の横断方針として採る。 */
20
+ export const MIN_TAP_TARGET = 44;
21
+
22
+ /**
23
+ * 正典パターン: 視覚 24pt の箱 + hitSlop 10 → 実効 44pt。
24
+ * 背景を持たない小さな操作要素(Tag removable の × / Toast の × / Alert の × / Modal の ×)はこれ。
25
+ */
26
+ export const CANONICAL_TAP_TARGET = {
27
+ minWidth: 24,
28
+ minHeight: 24,
29
+ hitSlop: 10
30
+ };
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
+ }
41
+ //# sourceMappingURL=tap-target.js.map
@@ -0,0 +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":[]}
@@ -11,17 +11,28 @@
11
11
  * 色だけでなくラベル文言でも破壊的操作と分かる文言にするのは呼び出し側の責務(contract a11y)。
12
12
  * - 先頭 action の borderTop は title が無い場合は消す(title がある時だけ区切りとして意味を持つ)。
13
13
  * - action の onPress 後は onClose も呼ぶ(選択 = シートを閉じる)。
14
- * - sheet 群は SafeAreaView で包み下余白(ホームインジケータ)を確保(recipe description 参照)。
14
+ * - 下余白(ホームインジケータ)は SafeArea で確保する(recipe description 参照)。位置は
15
+ * **最下部の面である cancel ブロックの内側**(BottomSheet と同じ「内側」方針に統一)。
16
+ * 0.5.x までは sheet 群の外側に置いていたため、iOS では inset 帯に overlay の黒が見えていた。
17
+ * 内側に移したことで inset 帯まで bg-surface で塗られる代わり、cancel ブロックは
18
+ * inset のぶん背が高くなる(ラベルは上寄りに見える)=意図した見た目の変更。
19
+ * edge は bottom + 左右のみ(top は overlay 側で、シートは上端に接しない)。
20
+ * SafeArea 実装は registry 経由(safe-area-registry.ts)— "melta-app/safe-area" を
21
+ * 有効化したアプリでは Android でも inset が入る(RN core の SafeAreaView は Android で no-op)。
15
22
  * - sheet 側は onStartShouldSetResponder で touch を claim し、overlay tap でだけ閉じる。
16
23
  * - style の決定は pure resolver(action-sheet.styles.ts)に分離 — recipe との機械照合対象。
17
24
  */
18
25
 
19
26
  import { useMemo } from "react";
20
- import { Modal as RNModal, Pressable, SafeAreaView, Text as RNText, View } from "react-native";
27
+ import { Modal as RNModal, Pressable, Text as RNText, View } from "react-native";
21
28
  import { useTheme } from "../theme/index.js";
22
29
  import { CONTRACTS } from "../contracts/contract-types.js";
23
30
  import { resolveActionSheetStyle } from "./action-sheet.styles.js";
31
+ import { resolveSafeAreaView } from "./safe-area-registry.js";
32
+
33
+ /** シートは画面下端に密着するので top inset は不要。 */
24
34
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
35
+ const SHEET_EDGES = ["bottom", "left", "right"];
25
36
  export function ActionSheet({
26
37
  visible,
27
38
  onClose,
@@ -35,6 +46,7 @@ export function ActionSheet({
35
46
  mode
36
47
  } = useTheme();
37
48
  const styles = useMemo(() => resolveActionSheetStyle(theme, mode), [theme, mode]);
49
+ const SafeArea = resolveSafeAreaView(SHEET_EDGES);
38
50
  return /*#__PURE__*/_jsx(RNModal, {
39
51
  visible: visible,
40
52
  transparent: true,
@@ -45,7 +57,7 @@ export function ActionSheet({
45
57
  style: styles.overlayStyle,
46
58
  onPress: onClose,
47
59
  accessible: false,
48
- children: /*#__PURE__*/_jsxs(SafeAreaView, {
60
+ children: /*#__PURE__*/_jsxs(View, {
49
61
  accessibilityViewIsModal: true,
50
62
  onStartShouldSetResponder: () => true,
51
63
  testID: testID,
@@ -74,9 +86,11 @@ export function ActionSheet({
74
86
  accessibilityRole: "button",
75
87
  onPress: onClose,
76
88
  style: styles.cancelStyle,
77
- children: /*#__PURE__*/_jsx(RNText, {
78
- style: styles.cancelTextStyle,
79
- children: cancelLabel
89
+ children: /*#__PURE__*/_jsx(SafeArea, {
90
+ children: /*#__PURE__*/_jsx(RNText, {
91
+ style: styles.cancelTextStyle,
92
+ children: cancelLabel
93
+ })
80
94
  })
81
95
  })]
82
96
  })
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Modal","RNModal","Pressable","SafeAreaView","Text","RNText","View","useTheme","CONTRACTS","resolveActionSheetStyle","jsx","_jsx","jsxs","_jsxs","ActionSheet","visible","onClose","title","actions","cancelLabel","testID","theme","mode","styles","transparent","animationType","onRequestClose","statusBarTranslucent","children","style","overlayStyle","onPress","accessible","accessibilityViewIsModal","onStartShouldSetResponder","sheetStyle","titleStyle","map","action","index","accessibilityRole","actionStyle","borderTopWidth","destructive","destructiveTextStyle","actionTextStyle","label","cancelStyle","cancelTextStyle","__contract","actionSheet"],"sourceRoot":"../../../src","sources":["components/ActionSheet.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","Modal","RNModal","Pressable","Text","RNText","View","useTheme","CONTRACTS","resolveActionSheetStyle","resolveSafeAreaView","jsx","_jsx","jsxs","_jsxs","SHEET_EDGES","ActionSheet","visible","onClose","title","actions","cancelLabel","testID","theme","mode","styles","SafeArea","transparent","animationType","onRequestClose","statusBarTranslucent","children","style","overlayStyle","onPress","accessible","accessibilityViewIsModal","onStartShouldSetResponder","sheetStyle","titleStyle","map","action","index","accessibilityRole","actionStyle","borderTopWidth","destructive","destructiveTextStyle","actionTextStyle","label","cancelStyle","cancelTextStyle","__contract","actionSheet"],"sourceRoot":"../../../src","sources":["components/ActionSheet.tsx"],"mappings":"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","ignoreList":[]}
@@ -7,6 +7,8 @@
7
7
  * - RN では border を持たず bg subtle + text 色で表現(status token に border 用の中間色が無い、
8
8
  * recipe description)。COLOR_ONLY_FORBIDDEN は title/message のテキストと icon slot で担保する設計。
9
9
  * - icon は ReactNode slot(EmptyState 前例。Icon を差すなら melta-app/icons を利用者が opt-in)。
10
+ * - × の accessibilityLabel は既定 "閉じる"(closeAccessibilityLabel で差し替え可能)。
11
+ * 当たり判定は正典パターン(24 + hitSlop 10 = 44pt)。
10
12
  * - a11y(§2 web→RN mapping): web の role=alert(error/warning) / status(info/success) を、
11
13
  * error/warning → accessibilityRole="alert"、info/success → accessibilityLiveRegion="polite"
12
14
  * (Android のみ有効。RN に status role が無いための写像)に落とす。
@@ -20,7 +22,7 @@ import { Pressable, View } from "react-native";
20
22
  import { Text } from "../primitives/Text.js";
21
23
  import { useTheme } from "../theme/index.js";
22
24
  import { CONTRACTS } from "../contracts/contract-types.js";
23
- import { ALERT_SPEC, resolveAlertStyles } from "./alert.styles.js";
25
+ import { ALERT_CLOSE_TAP_TARGET, ALERT_SPEC, resolveAlertStyles } from "./alert.styles.js";
24
26
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
25
27
  export function Alert({
26
28
  variant,
@@ -28,6 +30,7 @@ export function Alert({
28
30
  message,
29
31
  icon,
30
32
  onClose,
33
+ closeAccessibilityLabel = "閉じる",
31
34
  style,
32
35
  testID
33
36
  }) {
@@ -65,15 +68,15 @@ export function Alert({
65
68
  })]
66
69
  }), onClose != null &&
67
70
  /*#__PURE__*/
68
- // 最小タップターゲット確保: min 24 + hitSlop(Tag removable と同じ手当て)。
71
+ // 最小タップターゲット確保: 正典パターン 24 + hitSlop 10 = 実効 44pt(Tag removable と同型)。
69
72
  _jsx(Pressable, {
70
73
  onPress: onClose,
71
74
  accessibilityRole: "button",
72
- accessibilityLabel: "\u9589\u3058\u308B",
73
- hitSlop: 10,
75
+ accessibilityLabel: closeAccessibilityLabel,
76
+ hitSlop: ALERT_CLOSE_TAP_TARGET.hitSlop,
74
77
  style: {
75
- minWidth: 24,
76
- minHeight: 24,
78
+ minWidth: ALERT_CLOSE_TAP_TARGET.minWidth,
79
+ minHeight: ALERT_CLOSE_TAP_TARGET.minHeight,
77
80
  alignItems: "center",
78
81
  justifyContent: "center"
79
82
  },
@@ -88,6 +91,7 @@ export function Alert({
88
91
  });
89
92
  }
90
93
 
91
- // Phase 2 conformance test 用の contract メタ(§2 A-3)。
94
+ // conformance test 用の contract メタ(§2 A-3)。scripts/lib/conformance.test.ts が
95
+ // 「この宣言が正しい contract を指しているか」を静的スキャンで照合する。
92
96
  Alert.__contract = CONTRACTS.alert;
93
97
  //# sourceMappingURL=Alert.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","ALERT_SPEC","resolveAlertStyles","jsx","_jsx","jsxs","_jsxs","Alert","variant","title","message","icon","onClose","style","testID","theme","mode","styles","urgent","accessibilityRole","undefined","accessibilityLiveRegion","containerStyle","children","flex","gap","spacing","titleFont","weight","titleWeight","color","titleStyle","messageFont","messageStyle","onPress","accessibilityLabel","hitSlop","minWidth","minHeight","alignItems","justifyContent","__contract","alert"],"sourceRoot":"../../../src","sources":["components/Alert.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,SAAS,EAAEC,IAAI,QAAwC,cAAc;AAC9E,SAASC,IAAI,QAAQ,uBAAoB;AACzC,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,UAAU,EAAEC,kBAAkB,QAA2B,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAiBnF,OAAO,SAASC,KAAKA,CAAC;EAAEC,OAAO;EAAEC,KAAK;EAAEC,OAAO;EAAEC,IAAI;EAAEC,OAAO;EAAEC,KAAK;EAAEC;AAAmB,CAAC,EAAE;EAC3F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGjB,QAAQ,CAAC,CAAC;EAClC,MAAMkB,MAAM,GAAGtB,OAAO,CAAC,MAAMO,kBAAkB,CAACa,KAAK,EAAEC,IAAI,EAAER,OAAO,CAAC,EAAE,CAACO,KAAK,EAAEC,IAAI,EAAER,OAAO,CAAC,CAAC;EAC9F,MAAMU,MAAM,GAAGV,OAAO,KAAK,OAAO,IAAIA,OAAO,KAAK,SAAS;EAE3D,oBACEF,KAAA,CAACT,IAAI;IACHsB,iBAAiB,EAAED,MAAM,GAAG,OAAO,GAAGE,SAAU;IAChDC,uBAAuB,EAAEH,MAAM,GAAGE,SAAS,GAAG,QAAS;IACvDN,MAAM,EAAEA,MAAO;IACfD,KAAK,EAAE,CAACI,MAAM,CAACK,cAAc,EAAET,KAAK,CAAE;IAAAU,QAAA,GAErCZ,IAAI,IAAI,IAAI,iBAAIP,IAAA,CAACP,IAAI;MAAA0B,QAAA,EAAEZ;IAAI,CAAO,CAAC,eACpCL,KAAA,CAACT,IAAI;MAACgB,KAAK,EAAE;QAAEW,IAAI,EAAE,CAAC;QAAEC,GAAG,EAAEV,KAAK,CAACW,OAAO,CAAC,GAAG;MAAE,CAAE;MAAAH,QAAA,GAC/Cd,KAAK,IAAI,IAAI,iBACZL,IAAA,CAACN,IAAI;QACHU,OAAO,EAAEP,UAAU,CAAC0B,SAAU;QAC9BC,MAAM,EAAE3B,UAAU,CAAC4B,WAAY;QAC/BhB,KAAK,EAAE;UAAEiB,KAAK,EAAEb,MAAM,CAACc,UAAU,CAACD;QAAM,CAAE;QAAAP,QAAA,EAEzCd;MAAK,CACF,CACP,eACDL,IAAA,CAACN,IAAI;QAACU,OAAO,EAAEP,UAAU,CAAC+B,WAAY;QAACnB,KAAK,EAAE;UAAEiB,KAAK,EAAEb,MAAM,CAACgB,YAAY,CAACH;QAAM,CAAE;QAAAP,QAAA,EAChFb;MAAO,CACJ,CAAC;IAAA,CACH,CAAC,EACNE,OAAO,IAAI,IAAI;IAAA;IACd;IACAR,IAAA,CAACR,SAAS;MACRsC,OAAO,EAAEtB,OAAQ;MACjBO,iBAAiB,EAAC,QAAQ;MAC1BgB,kBAAkB,EAAC,oBAAK;MACxBC,OAAO,EAAE,EAAG;MACZvB,KAAK,EAAE;QAAEwB,QAAQ,EAAE,EAAE;QAAEC,SAAS,EAAE,EAAE;QAAEC,UAAU,EAAE,QAAQ;QAAEC,cAAc,EAAE;MAAS,CAAE;MAAAjB,QAAA,eAEvFnB,IAAA,CAACN,IAAI;QAACU,OAAO,EAAC,IAAI;QAACK,KAAK,EAAE;UAAEiB,KAAK,EAAEb,MAAM,CAACgB,YAAY,CAACH;QAAM,CAAE;QAAAP,QAAA,EAAC;MAEhE,CAAM;IAAC,CACE,CACZ;EAAA,CACG,CAAC;AAEX;;AAEA;AACAhB,KAAK,CAACkC,UAAU,GAAGzC,SAAS,CAAC0C,KAAK","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","ALERT_CLOSE_TAP_TARGET","ALERT_SPEC","resolveAlertStyles","jsx","_jsx","jsxs","_jsxs","Alert","variant","title","message","icon","onClose","closeAccessibilityLabel","style","testID","theme","mode","styles","urgent","accessibilityRole","undefined","accessibilityLiveRegion","containerStyle","children","flex","gap","spacing","titleFont","weight","titleWeight","color","titleStyle","messageFont","messageStyle","onPress","accessibilityLabel","hitSlop","minWidth","minHeight","alignItems","justifyContent","__contract","alert"],"sourceRoot":"../../../src","sources":["components/Alert.tsx"],"mappings":"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","ignoreList":[]}
@@ -15,7 +15,7 @@ import { Children, useMemo } from "react";
15
15
  import { Image as RNImage, Text as RNText, View } from "react-native";
16
16
  import { useTheme } from "../theme/index.js";
17
17
  import { CONTRACTS } from "../contracts/contract-types.js";
18
- import { resolveAvatarGroupStyle, resolveAvatarStatusColor, resolveAvatarStyle } from "./avatar.styles.js";
18
+ import { AVATAR_INITIALS_MAX_FONT_SCALE, resolveAvatarGroupStyle, resolveAvatarStatusColor, resolveAvatarStyle } from "./avatar.styles.js";
19
19
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
20
20
  /** name → initials(先頭2文字。空白区切りなら各語の頭文字を優先: "Taro Tanaka" → "TT")。 */
21
21
  function toInitials(name) {
@@ -58,8 +58,13 @@ export function Avatar({
58
58
  width: "100%",
59
59
  height: "100%"
60
60
  }
61
- }) : /*#__PURE__*/_jsx(RNText, {
61
+ }) :
62
+ /*#__PURE__*/
63
+ // 器(円)は fontScale で伸びないので、文字側に size 別の上限を掛けて溢れを防ぐ
64
+ // (根拠と導出は avatar.styles.ts の AVATAR_INITIALS_MAX_FONT_SCALE)。
65
+ _jsx(RNText, {
62
66
  style: resolved.text,
67
+ maxFontSizeMultiplier: AVATAR_INITIALS_MAX_FONT_SCALE[size],
63
68
  children: toInitials(name)
64
69
  })
65
70
  }), status ? /*#__PURE__*/_jsx(View, {
@@ -1 +1 @@
1
- {"version":3,"names":["Children","useMemo","Image","RNImage","Text","RNText","View","useTheme","CONTRACTS","resolveAvatarGroupStyle","resolveAvatarStatusColor","resolveAvatarStyle","jsx","_jsx","jsxs","_jsxs","toInitials","name","words","trim","split","filter","Boolean","length","toUpperCase","slice","Avatar","source","size","status","style","testID","theme","mode","variant","resolved","dotColor","undefined","width","container","height","accessible","accessibilityRole","accessibilityLabel","children","text","dot","backgroundColor","position","right","bottom","AvatarGroup","group","map","child","index","overlap","Group","__contract","avatar"],"sourceRoot":"../../../src","sources":["components/Avatar.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Children","useMemo","Image","RNImage","Text","RNText","View","useTheme","CONTRACTS","AVATAR_INITIALS_MAX_FONT_SCALE","resolveAvatarGroupStyle","resolveAvatarStatusColor","resolveAvatarStyle","jsx","_jsx","jsxs","_jsxs","toInitials","name","words","trim","split","filter","Boolean","length","toUpperCase","slice","Avatar","source","size","status","style","testID","theme","mode","variant","resolved","dotColor","undefined","width","container","height","accessible","accessibilityRole","accessibilityLabel","children","text","maxFontSizeMultiplier","dot","backgroundColor","position","right","bottom","AvatarGroup","group","map","child","index","overlap","Group","__contract","avatar"],"sourceRoot":"../../../src","sources":["components/Avatar.tsx"],"mappings":"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","ignoreList":[]}
@@ -8,18 +8,25 @@
8
8
  * - grabber は装飾バー。a11y ツリーから除外する(importantForAccessibility="no" +
9
9
  * accessibilityElementsHidden。recipe description 参照)。
10
10
  * - スワイプで閉じるジェスチャは実装しない(overlay tap + Android back で閉じる、Phase 外)。
11
- * - sheet は下端密着(bg-surface)のため、SafeAreaView を sheet の内側に置いて
11
+ * - sheet は下端密着(bg-surface)のため、SafeArea を sheet の内側に置いて
12
12
  * 下余白(ホームインジケータ)まで sheet 背景で覆いつつ content を安全域に収める。
13
+ * edge は bottom + 左右のみ(top は overlay 側で、シートは上端に接しない)。
14
+ * SafeArea 実装は registry 経由(safe-area-registry.ts)— "melta-app/safe-area" を
15
+ * 有効化したアプリでは Android でも inset が入る(RN core の SafeAreaView は Android で no-op)。
13
16
  * - sheet 側は onStartShouldSetResponder で touch を claim し、overlay tap でだけ閉じる。
14
17
  * - style の決定は pure resolver(bottom-sheet.styles.ts)に分離 — recipe との機械照合対象。
15
18
  */
16
19
 
17
20
  import { useMemo } from "react";
18
- import { Modal as RNModal, Pressable, SafeAreaView, Text as RNText, View } from "react-native";
21
+ import { Modal as RNModal, Pressable, Text as RNText, View } from "react-native";
19
22
  import { useTheme } from "../theme/index.js";
20
23
  import { CONTRACTS } from "../contracts/contract-types.js";
21
24
  import { resolveBottomSheetStyle } from "./bottom-sheet.styles.js";
25
+ import { resolveSafeAreaView } from "./safe-area-registry.js";
26
+
27
+ /** シートは画面下端に密着するので top inset は不要。 */
22
28
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
29
+ const SHEET_EDGES = ["bottom", "left", "right"];
23
30
  export function BottomSheet({
24
31
  visible,
25
32
  onClose,
@@ -32,6 +39,7 @@ export function BottomSheet({
32
39
  mode
33
40
  } = useTheme();
34
41
  const styles = useMemo(() => resolveBottomSheetStyle(theme, mode), [theme, mode]);
42
+ const SafeArea = resolveSafeAreaView(SHEET_EDGES);
35
43
  return /*#__PURE__*/_jsx(RNModal, {
36
44
  visible: visible,
37
45
  transparent: true,
@@ -47,7 +55,7 @@ export function BottomSheet({
47
55
  accessibilityViewIsModal: true,
48
56
  onStartShouldSetResponder: () => true,
49
57
  testID: testID,
50
- children: /*#__PURE__*/_jsxs(SafeAreaView, {
58
+ children: /*#__PURE__*/_jsxs(SafeArea, {
51
59
  children: [/*#__PURE__*/_jsx(View, {
52
60
  style: styles.grabberStyle,
53
61
  importantForAccessibility: "no",
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Modal","RNModal","Pressable","SafeAreaView","Text","RNText","View","useTheme","CONTRACTS","resolveBottomSheetStyle","jsx","_jsx","jsxs","_jsxs","BottomSheet","visible","onClose","title","testID","children","theme","mode","styles","transparent","animationType","onRequestClose","statusBarTranslucent","style","overlayStyle","onPress","accessible","sheetStyle","accessibilityViewIsModal","onStartShouldSetResponder","grabberStyle","importantForAccessibility","accessibilityElementsHidden","titleStyle","accessibilityRole","contentStyle","__contract","bottomSheet"],"sourceRoot":"../../../src","sources":["components/BottomSheet.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SACEC,KAAK,IAAIC,OAAO,EAChBC,SAAS,EACTC,YAAY,EACZC,IAAI,IAAIC,MAAM,EACdC,IAAI,QACC,cAAc;AACrB,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,uBAAuB,QAA+B,0BAAuB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAavF,OAAO,SAASC,WAAWA,CAAC;EAAEC,OAAO;EAAEC,OAAO;EAAEC,KAAK;EAAEC,MAAM;EAAEC;AAA2B,CAAC,EAAE;EAC3F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGd,QAAQ,CAAC,CAAC;EAElC,MAAMe,MAAM,GAAGvB,OAAO,CACpB,MAAMU,uBAAuB,CAACW,KAAK,EAAEC,IAAI,CAAC,EAC1C,CAACD,KAAK,EAAEC,IAAI,CACd,CAAC;EAED,oBACEV,IAAA,CAACV,OAAO;IACNc,OAAO,EAAEA,OAAQ;IACjBQ,WAAW;IACXC,aAAa,EAAC,OAAO;IACrBC,cAAc,EAAET,OAAQ;IACxBU,oBAAoB;IAAAP,QAAA,eAEpBR,IAAA,CAACT,SAAS;MAACyB,KAAK,EAAEL,MAAM,CAACM,YAAa;MAACC,OAAO,EAAEb,OAAQ;MAACc,UAAU,EAAE,KAAM;MAAAX,QAAA,eACzER,IAAA,CAACL,IAAI;QACHqB,KAAK,EAAEL,MAAM,CAACS,UAAW;QACzBC,wBAAwB;QACxBC,yBAAyB,EAAEA,CAAA,KAAM,IAAK;QACtCf,MAAM,EAAEA,MAAO;QAAAC,QAAA,eAEfN,KAAA,CAACV,YAAY;UAAAgB,QAAA,gBAEXR,IAAA,CAACL,IAAI;YACHqB,KAAK,EAAEL,MAAM,CAACY,YAAa;YAC3BC,yBAAyB,EAAC,IAAI;YAC9BC,2BAA2B;UAAA,CAC5B,CAAC,EACDnB,KAAK,IAAI,IAAI,iBACZN,IAAA,CAACN,MAAM;YAACsB,KAAK,EAAEL,MAAM,CAACe,UAAW;YAACC,iBAAiB,EAAC,QAAQ;YAAAnB,QAAA,EACzDF;UAAK,CACA,CACT,eACDN,IAAA,CAACL,IAAI;YAACqB,KAAK,EAAEL,MAAM,CAACiB,YAAa;YAAApB,QAAA,EAAEA;UAAQ,CAAO,CAAC;QAAA,CACvC;MAAC,CACX;IAAC,CACE;EAAC,CACL,CAAC;AAEd;AAEAL,WAAW,CAAC0B,UAAU,GAAGhC,SAAS,CAACiC,WAAW","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","Modal","RNModal","Pressable","Text","RNText","View","useTheme","CONTRACTS","resolveBottomSheetStyle","resolveSafeAreaView","jsx","_jsx","jsxs","_jsxs","SHEET_EDGES","BottomSheet","visible","onClose","title","testID","children","theme","mode","styles","SafeArea","transparent","animationType","onRequestClose","statusBarTranslucent","style","overlayStyle","onPress","accessible","sheetStyle","accessibilityViewIsModal","onStartShouldSetResponder","grabberStyle","importantForAccessibility","accessibilityElementsHidden","titleStyle","accessibilityRole","contentStyle","__contract","bottomSheet"],"sourceRoot":"../../../src","sources":["components/BottomSheet.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,KAAK,IAAIC,OAAO,EAAEC,SAAS,EAAEC,IAAI,IAAIC,MAAM,EAAEC,IAAI,QAAQ,cAAc;AAChF,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,SAAS,QAAQ,gCAAgC;AAC1D,SAASC,uBAAuB,QAA+B,0BAA0B;AACzF,SAASC,mBAAmB,QAA2B,yBAAyB;;AAEhF;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AACA,MAAMC,WAAoC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAaxE,OAAO,SAASC,WAAWA,CAAC;EAAEC,OAAO;EAAEC,OAAO;EAAEC,KAAK;EAAEC,MAAM;EAAEC;AAA2B,CAAC,EAAE;EAC3F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGhB,QAAQ,CAAC,CAAC;EAElC,MAAMiB,MAAM,GAAGxB,OAAO,CACpB,MAAMS,uBAAuB,CAACa,KAAK,EAAEC,IAAI,CAAC,EAC1C,CAACD,KAAK,EAAEC,IAAI,CACd,CAAC;EAED,MAAME,QAAQ,GAAGf,mBAAmB,CAACK,WAAW,CAAC;EAEjD,oBACEH,IAAA,CAACV,OAAO;IACNe,OAAO,EAAEA,OAAQ;IACjBS,WAAW;IACXC,aAAa,EAAC,OAAO;IACrBC,cAAc,EAAEV,OAAQ;IACxBW,oBAAoB;IAAAR,QAAA,eAEpBT,IAAA,CAACT,SAAS;MAAC2B,KAAK,EAAEN,MAAM,CAACO,YAAa;MAACC,OAAO,EAAEd,OAAQ;MAACe,UAAU,EAAE,KAAM;MAAAZ,QAAA,eACzET,IAAA,CAACN,IAAI;QACHwB,KAAK,EAAEN,MAAM,CAACU,UAAW;QACzBC,wBAAwB;QACxBC,yBAAyB,EAAEA,CAAA,KAAM,IAAK;QACtChB,MAAM,EAAEA,MAAO;QAAAC,QAAA,eAEfP,KAAA,CAACW,QAAQ;UAAAJ,QAAA,gBAEPT,IAAA,CAACN,IAAI;YACHwB,KAAK,EAAEN,MAAM,CAACa,YAAa;YAC3BC,yBAAyB,EAAC,IAAI;YAC9BC,2BAA2B;UAAA,CAC5B,CAAC,EACDpB,KAAK,IAAI,IAAI,iBACZP,IAAA,CAACP,MAAM;YAACyB,KAAK,EAAEN,MAAM,CAACgB,UAAW;YAACC,iBAAiB,EAAC,QAAQ;YAAApB,QAAA,EACzDF;UAAK,CACA,CACT,eACDP,IAAA,CAACN,IAAI;YAACwB,KAAK,EAAEN,MAAM,CAACkB,YAAa;YAAArB,QAAA,EAAEA;UAAQ,CAAO,CAAC;QAAA,CAC3C;MAAC,CACP;IAAC,CACE;EAAC,CACL,CAAC;AAEd;AAEAL,WAAW,CAAC2B,UAAU,GAAGnC,SAAS,CAACoC,WAAW","ignoreList":[]}
@@ -9,7 +9,7 @@
9
9
  * scripts/lib/card-conformance.test.ts が行う。
10
10
  * - variant: basic/media は非インタラクティブ、action/link は Pressable。
11
11
  * action/link は pressed 時 elevation.sm→md(§2 hover→pressed mapping)。
12
- * focus-within は RN 非サポートとして Phase1 明示 drop(§2)。
12
+ * focus-within は RN 非サポートとして明示 drop(§2)。
13
13
  * - 型で action/link は onPress 必須を強制(§4 の DU 精神。無言で非対話に落ちる事故を防ぐ)。
14
14
  * - **カード面自体は操作要素にしない**(contract 2.1.0 の a11y.required)。面の Pressable は
15
15
  * `accessibilityRole` を名乗らず `accessible={false}`。理由は2つ:
@@ -23,7 +23,7 @@
23
23
  * react-native-web では実際に `<article>` 要素になる)。accessibilityRole 系とは別系統。
24
24
  * - **focus ring は Card では描かない**。フォーカスを受けるのは `primaryAction` 側で、
25
25
  * melta の Button は自前の ring を持つ。カードにも出すと1回のフォーカスで ring が二重に描かれる。
26
- * contract の focus-within は RN 非サポートとして Phase1 で明示 drop 済み(app recipe に記録あり)で、
26
+ * contract の focus-within は RN 非サポートとして明示 drop 済み(app recipe に記録あり)で、
27
27
  * web だけ動く実装を残すとプラットフォーム非対称になるため、実装ごと持たない。
28
28
  * - `accessibilityLabel` は 0.5.0 で削除した。面が `accessible={false}` なので native では
29
29
  * 原理的に読まれず、web だけ `aria-label` として効く非対称な prop だった。
@@ -127,6 +127,7 @@ export function Card({
127
127
  });
128
128
  }
129
129
 
130
- // Phase 2 conformance test 用の contract メタ(§2 A-3)。
130
+ // conformance test 用の contract メタ(§2 A-3)。scripts/lib/conformance.test.ts が
131
+ // 「この宣言が正しい contract を指しているか」を静的スキャンで照合する。
131
132
  Card.__contract = CONTRACTS.card;
132
133
  //# sourceMappingURL=Card.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","Pressable","View","useTheme","CONTRACTS","isDev","CARD_INTERACTIVE","resolveCardShape","resolveCardBodyStyle","validateCardProps","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","reported","Set","Card","variant","header","footer","media","onPress","primaryAction","style","testID","children","theme","mode","interactive","problem","has","add","console","error","isMedia","inner","content","borderRadius","radius","lg","overflow","role","accessible","pressed","__contract","card"],"sourceRoot":"../../../src","sources":["components/Card.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","Pressable","View","useTheme","CONTRACTS","isDev","CARD_INTERACTIVE","resolveCardShape","resolveCardBodyStyle","validateCardProps","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","reported","Set","Card","variant","header","footer","media","onPress","primaryAction","style","testID","children","theme","mode","interactive","problem","has","add","console","error","isMedia","inner","content","borderRadius","radius","lg","overflow","role","accessible","pressed","__contract","card"],"sourceRoot":"../../../src","sources":["components/Card.tsx"],"mappings":"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","ignoreList":[]}
@@ -6,14 +6,14 @@
6
6
  * - RN にネイティブ checkbox が無いため Pressable(行全体タップ)+ 描画で実装する。
7
7
  * checkmark は rotate した View の L 字 border、indeterminate は横棒
8
8
  * (react-native-svg 非依存 = 本体エントリの依存ゼロ維持。recipe description 参照)。
9
- * - box は 20px(web の 16px より大きいのはタッチ前提)。実タッチ領域は hitSlop 12 で
10
- * 44pt(20 + 12×2)を確保する。
9
+ * - box は 20px(web の 16px より大きいのはタッチ前提)。実効タップ標的は行の
10
+ * minHeight 44 で確保する(規約 10-(b): 背景を持たない行は hitSlop でなく寸法)。
11
11
  * - label 必須(FORM_NO_LABEL_OMIT を props 型で強制)。label は Text primitive
12
12
  * (base/text-default = recipe labelStyle と同値)。
13
13
  * - states(contract → prop の写像): checked/unchecked → checked:boolean、
14
14
  * indeterminate → indeterminate:boolean(variant "indeterminate"。a11y は "mixed")、
15
15
  * error → error:boolean(borderColor 差分、checked より優先)、disabled → prop
16
- * (opacity 0.5 + 非活性)。focus は Phase1 非対応(recipe にも focus 差分なし)。
16
+ * (opacity 0.5 + 非活性)。focus は非対応(recipe にも focus 差分なし)。
17
17
  * - 色・寸法の決定は pure resolver(checkbox.styles.ts)に分離。
18
18
  * recipes/app/checkbox.recipe.json との機械照合は scripts/lib/checkbox-conformance.test.ts が行う。
19
19
  */
@@ -58,7 +58,6 @@ export function Checkbox({
58
58
  return /*#__PURE__*/_jsxs(Pressable, {
59
59
  onPress: () => onChange(!checked),
60
60
  disabled: disabled,
61
- hitSlop: CHECKBOX_SPEC.hitSlop,
62
61
  accessibilityRole: "checkbox",
63
62
  accessibilityState: {
64
63
  checked: indeterminate ? "mixed" : checked,
@@ -70,6 +69,9 @@ export function Checkbox({
70
69
  flexDirection: "row",
71
70
  alignItems: "center",
72
71
  gap: resolved.gap,
72
+ // 実効タップ標的 44pt。背景を持たない行なので hitSlop でなく minHeight(規約 10-(b)、
73
+ // 縦積みの隣接行と当たり判定が重ならない)
74
+ minHeight: CHECKBOX_SPEC.rowMinHeight,
73
75
  opacity: disabled ? CHECKBOX_SPEC.disabledOpacity : 1
74
76
  },
75
77
  children: [/*#__PURE__*/_jsx(View, {
@@ -110,6 +112,7 @@ export function Checkbox({
110
112
  });
111
113
  }
112
114
 
113
- // Phase 2 conformance test 用の contract メタ(§2 A-3)。
115
+ // conformance test 用の contract メタ(§2 A-3)。scripts/lib/conformance.test.ts が
116
+ // 「この宣言が正しい contract を指しているか」を静的スキャンで照合する。
114
117
  Checkbox.__contract = CONTRACTS.checkbox;
115
118
  //# sourceMappingURL=Checkbox.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","CHECKBOX_SPEC","resolveCheckboxStyle","jsx","_jsx","jsxs","_jsxs","CHECKMARK","width","height","borderWidth","offsetY","INDETERMINATE_BAR","Checkbox","label","checked","onChange","indeterminate","disabled","error","testID","theme","mode","resolved","onPress","hitSlop","accessibilityRole","accessibilityState","accessibilityLabel","style","flexDirection","alignItems","gap","opacity","disabledOpacity","children","boxStyle","justifyContent","backgroundColor","markColor","borderLeftWidth","borderBottomWidth","borderColor","marginTop","transform","rotate","variant","color","__contract","checkbox"],"sourceRoot":"../../../src","sources":["components/Checkbox.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","CHECKBOX_SPEC","resolveCheckboxStyle","jsx","_jsx","jsxs","_jsxs","CHECKMARK","width","height","borderWidth","offsetY","INDETERMINATE_BAR","Checkbox","label","checked","onChange","indeterminate","disabled","error","testID","theme","mode","resolved","onPress","accessibilityRole","accessibilityState","accessibilityLabel","style","flexDirection","alignItems","gap","minHeight","rowMinHeight","opacity","disabledOpacity","children","boxStyle","justifyContent","backgroundColor","markColor","borderLeftWidth","borderBottomWidth","borderColor","marginTop","transform","rotate","variant","color","__contract","checkbox"],"sourceRoot":"../../../src","sources":["components/Checkbox.tsx"],"mappings":"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","ignoreList":[]}
@@ -65,6 +65,7 @@ export function EmptyState({
65
65
  });
66
66
  }
67
67
 
68
- // Phase 2 conformance test 用の contract メタ(§2 A-3)。
68
+ // conformance test 用の contract メタ(§2 A-3)。scripts/lib/conformance.test.ts が
69
+ // 「この宣言が正しい contract を指しているか」を静的スキャンで照合する。
69
70
  EmptyState.__contract = CONTRACTS.emptyState;
70
71
  //# sourceMappingURL=EmptyState.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","View","Text","Button","useTheme","CONTRACTS","EMPTY_STATE_SPEC","resolveEmptyStateStyles","jsx","_jsx","jsxs","_jsxs","EmptyState","icon","title","description","action","style","testID","theme","mode","styles","children","variant","titleFont","role","weight","titleWeight","color","titleColor","textAlign","titleStyle","descriptionFont","descriptionColor","descriptionStyle","actionStyle","label","onPress","__contract","emptyState"],"sourceRoot":"../../../src","sources":["components/EmptyState.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,IAAI,QAAwC,cAAc;AACnE,SAASC,IAAI,QAAQ,uBAAoB;AACzC,SAASC,MAAM,QAAQ,yBAAsB;AAC7C,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,gBAAgB,EAAEC,uBAAuB,QAAQ,yBAAsB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAWjF,OAAO,SAASC,UAAUA,CAAC;EAAEC,IAAI;EAAEC,KAAK;EAAEC,WAAW;EAAEC,MAAM;EAAEC,KAAK;EAAEC;AAAwB,CAAC,EAAE;EAC/F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGhB,QAAQ,CAAC,CAAC;EAClC,MAAMiB,MAAM,GAAGrB,OAAO,CAAC,MAAMO,uBAAuB,CAACY,KAAK,EAAEC,IAAI,CAAC,EAAE,CAACD,KAAK,EAAEC,IAAI,CAAC,CAAC;EACjF,oBACET,KAAA,CAACV,IAAI;IAACiB,MAAM,EAAEA,MAAO;IAACD,KAAK,EAAE,CAACI,MAAM,CAACJ,KAAK,EAAEA,KAAK,CAAE;IAAAK,QAAA,GAChDT,IAAI,IAAI,IAAI,iBAAIJ,IAAA,CAACR,IAAI;MAAAqB,QAAA,EAAET;IAAI,CAAO,CAAC,eACpCJ,IAAA,CAACP,IAAI;MACHqB,OAAO,EAAEjB,gBAAgB,CAACkB,SAAU;MACpCC,IAAI,EAAC,SAAS;MACdC,MAAM,EAAEpB,gBAAgB,CAACqB,WAAY;MACrCC,KAAK,EAAEtB,gBAAgB,CAACuB,UAAW;MACnCZ,KAAK,EAAE;QAAEa,SAAS,EAAET,MAAM,CAACU,UAAU,CAACD;MAAU,CAAE;MAAAR,QAAA,EAEjDR;IAAK,CACF,CAAC,EACNC,WAAW,IAAI,IAAI,iBAClBN,IAAA,CAACP,IAAI;MACHqB,OAAO,EAAEjB,gBAAgB,CAAC0B,eAAgB;MAC1CJ,KAAK,EAAEtB,gBAAgB,CAAC2B,gBAAiB;MACzChB,KAAK,EAAE;QAAEa,SAAS,EAAET,MAAM,CAACa,gBAAgB,CAACJ;MAAU,CAAE;MAAAR,QAAA,EAEvDP;IAAW,CACR,CACP,EACAC,MAAM,IAAI,IAAI,iBACbP,IAAA,CAACR,IAAI;MAACgB,KAAK,EAAEI,MAAM,CAACc,WAAY;MAAAb,QAAA,eAC9Bb,IAAA,CAACN,MAAM;QAACoB,OAAO,EAAC,WAAW;QAACa,KAAK,EAAEpB,MAAM,CAACoB,KAAM;QAACC,OAAO,EAAErB,MAAM,CAACqB;MAAQ,CAAE;IAAC,CACxE,CACP;EAAA,CACG,CAAC;AAEX;;AAEA;AACAzB,UAAU,CAAC0B,UAAU,GAAGjC,SAAS,CAACkC,UAAU","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","View","Text","Button","useTheme","CONTRACTS","EMPTY_STATE_SPEC","resolveEmptyStateStyles","jsx","_jsx","jsxs","_jsxs","EmptyState","icon","title","description","action","style","testID","theme","mode","styles","children","variant","titleFont","role","weight","titleWeight","color","titleColor","textAlign","titleStyle","descriptionFont","descriptionColor","descriptionStyle","actionStyle","label","onPress","__contract","emptyState"],"sourceRoot":"../../../src","sources":["components/EmptyState.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,IAAI,QAAwC,cAAc;AACnE,SAASC,IAAI,QAAQ,uBAAuB;AAC5C,SAASC,MAAM,QAAQ,yBAAyB;AAChD,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,SAAS,QAAQ,gCAAgC;AAC1D,SAASC,gBAAgB,EAAEC,uBAAuB,QAAQ,yBAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAWpF,OAAO,SAASC,UAAUA,CAAC;EAAEC,IAAI;EAAEC,KAAK;EAAEC,WAAW;EAAEC,MAAM;EAAEC,KAAK;EAAEC;AAAwB,CAAC,EAAE;EAC/F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGhB,QAAQ,CAAC,CAAC;EAClC,MAAMiB,MAAM,GAAGrB,OAAO,CAAC,MAAMO,uBAAuB,CAACY,KAAK,EAAEC,IAAI,CAAC,EAAE,CAACD,KAAK,EAAEC,IAAI,CAAC,CAAC;EACjF,oBACET,KAAA,CAACV,IAAI;IAACiB,MAAM,EAAEA,MAAO;IAACD,KAAK,EAAE,CAACI,MAAM,CAACJ,KAAK,EAAEA,KAAK,CAAE;IAAAK,QAAA,GAChDT,IAAI,IAAI,IAAI,iBAAIJ,IAAA,CAACR,IAAI;MAAAqB,QAAA,EAAET;IAAI,CAAO,CAAC,eACpCJ,IAAA,CAACP,IAAI;MACHqB,OAAO,EAAEjB,gBAAgB,CAACkB,SAAU;MACpCC,IAAI,EAAC,SAAS;MACdC,MAAM,EAAEpB,gBAAgB,CAACqB,WAAY;MACrCC,KAAK,EAAEtB,gBAAgB,CAACuB,UAAW;MACnCZ,KAAK,EAAE;QAAEa,SAAS,EAAET,MAAM,CAACU,UAAU,CAACD;MAAU,CAAE;MAAAR,QAAA,EAEjDR;IAAK,CACF,CAAC,EACNC,WAAW,IAAI,IAAI,iBAClBN,IAAA,CAACP,IAAI;MACHqB,OAAO,EAAEjB,gBAAgB,CAAC0B,eAAgB;MAC1CJ,KAAK,EAAEtB,gBAAgB,CAAC2B,gBAAiB;MACzChB,KAAK,EAAE;QAAEa,SAAS,EAAET,MAAM,CAACa,gBAAgB,CAACJ;MAAU,CAAE;MAAAR,QAAA,EAEvDP;IAAW,CACR,CACP,EACAC,MAAM,IAAI,IAAI,iBACbP,IAAA,CAACR,IAAI;MAACgB,KAAK,EAAEI,MAAM,CAACc,WAAY;MAAAb,QAAA,eAC9Bb,IAAA,CAACN,MAAM;QAACoB,OAAO,EAAC,WAAW;QAACa,KAAK,EAAEpB,MAAM,CAACoB,KAAM;QAACC,OAAO,EAAErB,MAAM,CAACqB;MAAQ,CAAE;IAAC,CACxE,CACP;EAAA,CACG,CAAC;AAEX;;AAEA;AACA;AACAzB,UAAU,CAAC0B,UAAU,GAAGjC,SAAS,CAACkC,UAAU","ignoreList":[]}