melta-app 0.1.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 (311) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +197 -0
  3. package/THIRD_PARTY_LICENSES.md +198 -0
  4. package/lib/module/components/ActionSheet.js +87 -0
  5. package/lib/module/components/ActionSheet.js.map +1 -0
  6. package/lib/module/components/Alert.js +93 -0
  7. package/lib/module/components/Alert.js.map +1 -0
  8. package/lib/module/components/Avatar.js +93 -0
  9. package/lib/module/components/Avatar.js.map +1 -0
  10. package/lib/module/components/BottomSheet.js +69 -0
  11. package/lib/module/components/BottomSheet.js.map +1 -0
  12. package/lib/module/components/Card.js +93 -0
  13. package/lib/module/components/Card.js.map +1 -0
  14. package/lib/module/components/Checkbox.js +115 -0
  15. package/lib/module/components/Checkbox.js.map +1 -0
  16. package/lib/module/components/EmptyState.js +70 -0
  17. package/lib/module/components/EmptyState.js.map +1 -0
  18. package/lib/module/components/Header.js +53 -0
  19. package/lib/module/components/Header.js.map +1 -0
  20. package/lib/module/components/Image.js +67 -0
  21. package/lib/module/components/Image.js.map +1 -0
  22. package/lib/module/components/Modal.js +95 -0
  23. package/lib/module/components/Modal.js.map +1 -0
  24. package/lib/module/components/Progress.js +113 -0
  25. package/lib/module/components/Progress.js.map +1 -0
  26. package/lib/module/components/Radio.js +134 -0
  27. package/lib/module/components/Radio.js.map +1 -0
  28. package/lib/module/components/Screen.js +57 -0
  29. package/lib/module/components/Screen.js.map +1 -0
  30. package/lib/module/components/Skeleton.js +169 -0
  31. package/lib/module/components/Skeleton.js.map +1 -0
  32. package/lib/module/components/Surface.js +49 -0
  33. package/lib/module/components/Surface.js.map +1 -0
  34. package/lib/module/components/TextField.js +84 -0
  35. package/lib/module/components/TextField.js.map +1 -0
  36. package/lib/module/components/Toast.js +105 -0
  37. package/lib/module/components/Toast.js.map +1 -0
  38. package/lib/module/components/Toggle.js +77 -0
  39. package/lib/module/components/Toggle.js.map +1 -0
  40. package/lib/module/components/action-sheet.styles.js +70 -0
  41. package/lib/module/components/action-sheet.styles.js.map +1 -0
  42. package/lib/module/components/alert.styles.js +80 -0
  43. package/lib/module/components/alert.styles.js.map +1 -0
  44. package/lib/module/components/avatar.styles.js +94 -0
  45. package/lib/module/components/avatar.styles.js.map +1 -0
  46. package/lib/module/components/bottom-sheet.styles.js +55 -0
  47. package/lib/module/components/bottom-sheet.styles.js.map +1 -0
  48. package/lib/module/components/card.styles.js +50 -0
  49. package/lib/module/components/card.styles.js.map +1 -0
  50. package/lib/module/components/checkbox.styles.js +55 -0
  51. package/lib/module/components/checkbox.styles.js.map +1 -0
  52. package/lib/module/components/empty-state.styles.js +60 -0
  53. package/lib/module/components/empty-state.styles.js.map +1 -0
  54. package/lib/module/components/header.styles.js +33 -0
  55. package/lib/module/components/header.styles.js.map +1 -0
  56. package/lib/module/components/image.styles.js +37 -0
  57. package/lib/module/components/image.styles.js.map +1 -0
  58. package/lib/module/components/index.js +26 -0
  59. package/lib/module/components/index.js.map +1 -0
  60. package/lib/module/components/modal.styles.js +68 -0
  61. package/lib/module/components/modal.styles.js.map +1 -0
  62. package/lib/module/components/progress.styles.js +55 -0
  63. package/lib/module/components/progress.styles.js.map +1 -0
  64. package/lib/module/components/radio.styles.js +96 -0
  65. package/lib/module/components/radio.styles.js.map +1 -0
  66. package/lib/module/components/screen.styles.js +38 -0
  67. package/lib/module/components/screen.styles.js.map +1 -0
  68. package/lib/module/components/skeleton.styles.js +114 -0
  69. package/lib/module/components/skeleton.styles.js.map +1 -0
  70. package/lib/module/components/surface.styles.js +37 -0
  71. package/lib/module/components/surface.styles.js.map +1 -0
  72. package/lib/module/components/textfield.styles.js +121 -0
  73. package/lib/module/components/textfield.styles.js.map +1 -0
  74. package/lib/module/components/toast.styles.js +81 -0
  75. package/lib/module/components/toast.styles.js.map +1 -0
  76. package/lib/module/components/toggle.styles.js +69 -0
  77. package/lib/module/components/toggle.styles.js.map +1 -0
  78. package/lib/module/contracts/contract-types.js +192 -0
  79. package/lib/module/contracts/contract-types.js.map +1 -0
  80. package/lib/module/icons/Icon.js +57 -0
  81. package/lib/module/icons/Icon.js.map +1 -0
  82. package/lib/module/icons/glyphs.js +257 -0
  83. package/lib/module/icons/glyphs.js.map +1 -0
  84. package/lib/module/icons/icon.styles.js +28 -0
  85. package/lib/module/icons/icon.styles.js.map +1 -0
  86. package/lib/module/icons/index.js +14 -0
  87. package/lib/module/icons/index.js.map +1 -0
  88. package/lib/module/index.js +20 -0
  89. package/lib/module/index.js.map +1 -0
  90. package/lib/module/package.json +1 -0
  91. package/lib/module/primitives/Button.js +105 -0
  92. package/lib/module/primitives/Button.js.map +1 -0
  93. package/lib/module/primitives/Metric.js +68 -0
  94. package/lib/module/primitives/Metric.js.map +1 -0
  95. package/lib/module/primitives/Row.js +43 -0
  96. package/lib/module/primitives/Row.js.map +1 -0
  97. package/lib/module/primitives/Stack.js +39 -0
  98. package/lib/module/primitives/Stack.js.map +1 -0
  99. package/lib/module/primitives/Tag.js +160 -0
  100. package/lib/module/primitives/Tag.js.map +1 -0
  101. package/lib/module/primitives/Text.js +54 -0
  102. package/lib/module/primitives/Text.js.map +1 -0
  103. package/lib/module/primitives/_internal/focus-ring.js +57 -0
  104. package/lib/module/primitives/_internal/focus-ring.js.map +1 -0
  105. package/lib/module/primitives/button.styles.js +88 -0
  106. package/lib/module/primitives/button.styles.js.map +1 -0
  107. package/lib/module/primitives/index.js +11 -0
  108. package/lib/module/primitives/index.js.map +1 -0
  109. package/lib/module/primitives/metric.styles.js +54 -0
  110. package/lib/module/primitives/metric.styles.js.map +1 -0
  111. package/lib/module/primitives/row.styles.js +53 -0
  112. package/lib/module/primitives/row.styles.js.map +1 -0
  113. package/lib/module/primitives/stack.styles.js +37 -0
  114. package/lib/module/primitives/stack.styles.js.map +1 -0
  115. package/lib/module/primitives/tag.styles.js +56 -0
  116. package/lib/module/primitives/tag.styles.js.map +1 -0
  117. package/lib/module/primitives/text.styles.js +33 -0
  118. package/lib/module/primitives/text.styles.js.map +1 -0
  119. package/lib/module/theme/ThemeProvider.js +41 -0
  120. package/lib/module/theme/ThemeProvider.js.map +1 -0
  121. package/lib/module/theme/index.js +19 -0
  122. package/lib/module/theme/index.js.map +1 -0
  123. package/lib/module/theme/native-theme.js +201 -0
  124. package/lib/module/theme/native-theme.js.map +1 -0
  125. package/lib/module/theme/types.js +4 -0
  126. package/lib/module/theme/types.js.map +1 -0
  127. package/lib/typescript/package.json +1 -0
  128. package/lib/typescript/src/components/ActionSheet.d.ts +45 -0
  129. package/lib/typescript/src/components/ActionSheet.d.ts.map +1 -0
  130. package/lib/typescript/src/components/Alert.d.ts +43 -0
  131. package/lib/typescript/src/components/Alert.d.ts.map +1 -0
  132. package/lib/typescript/src/components/Avatar.d.ts +45 -0
  133. package/lib/typescript/src/components/Avatar.d.ts.map +1 -0
  134. package/lib/typescript/src/components/BottomSheet.d.ts +36 -0
  135. package/lib/typescript/src/components/BottomSheet.d.ts.map +1 -0
  136. package/lib/typescript/src/components/Card.d.ts +46 -0
  137. package/lib/typescript/src/components/Card.d.ts.map +1 -0
  138. package/lib/typescript/src/components/Checkbox.d.ts +40 -0
  139. package/lib/typescript/src/components/Checkbox.d.ts.map +1 -0
  140. package/lib/typescript/src/components/EmptyState.d.ts +36 -0
  141. package/lib/typescript/src/components/EmptyState.d.ts.map +1 -0
  142. package/lib/typescript/src/components/Header.d.ts +34 -0
  143. package/lib/typescript/src/components/Header.d.ts.map +1 -0
  144. package/lib/typescript/src/components/Image.d.ts +41 -0
  145. package/lib/typescript/src/components/Image.d.ts.map +1 -0
  146. package/lib/typescript/src/components/Modal.d.ts +46 -0
  147. package/lib/typescript/src/components/Modal.d.ts.map +1 -0
  148. package/lib/typescript/src/components/Progress.d.ts +39 -0
  149. package/lib/typescript/src/components/Progress.d.ts.map +1 -0
  150. package/lib/typescript/src/components/Radio.d.ts +52 -0
  151. package/lib/typescript/src/components/Radio.d.ts.map +1 -0
  152. package/lib/typescript/src/components/Screen.d.ts +42 -0
  153. package/lib/typescript/src/components/Screen.d.ts.map +1 -0
  154. package/lib/typescript/src/components/Skeleton.d.ts +37 -0
  155. package/lib/typescript/src/components/Skeleton.d.ts.map +1 -0
  156. package/lib/typescript/src/components/Surface.d.ts +31 -0
  157. package/lib/typescript/src/components/Surface.d.ts.map +1 -0
  158. package/lib/typescript/src/components/TextField.d.ts +45 -0
  159. package/lib/typescript/src/components/TextField.d.ts.map +1 -0
  160. package/lib/typescript/src/components/Toast.d.ts +45 -0
  161. package/lib/typescript/src/components/Toast.d.ts.map +1 -0
  162. package/lib/typescript/src/components/Toggle.d.ts +39 -0
  163. package/lib/typescript/src/components/Toggle.d.ts.map +1 -0
  164. package/lib/typescript/src/components/action-sheet.styles.d.ts +65 -0
  165. package/lib/typescript/src/components/action-sheet.styles.d.ts.map +1 -0
  166. package/lib/typescript/src/components/alert.styles.d.ts +61 -0
  167. package/lib/typescript/src/components/alert.styles.d.ts.map +1 -0
  168. package/lib/typescript/src/components/avatar.styles.d.ts +60 -0
  169. package/lib/typescript/src/components/avatar.styles.d.ts.map +1 -0
  170. package/lib/typescript/src/components/bottom-sheet.styles.d.ts +50 -0
  171. package/lib/typescript/src/components/bottom-sheet.styles.d.ts.map +1 -0
  172. package/lib/typescript/src/components/card.styles.d.ts +27 -0
  173. package/lib/typescript/src/components/card.styles.d.ts.map +1 -0
  174. package/lib/typescript/src/components/checkbox.styles.d.ts +55 -0
  175. package/lib/typescript/src/components/checkbox.styles.d.ts.map +1 -0
  176. package/lib/typescript/src/components/empty-state.styles.d.ts +58 -0
  177. package/lib/typescript/src/components/empty-state.styles.d.ts.map +1 -0
  178. package/lib/typescript/src/components/header.styles.d.ts +30 -0
  179. package/lib/typescript/src/components/header.styles.d.ts.map +1 -0
  180. package/lib/typescript/src/components/image.styles.d.ts +28 -0
  181. package/lib/typescript/src/components/image.styles.d.ts.map +1 -0
  182. package/lib/typescript/src/components/index.d.ts +23 -0
  183. package/lib/typescript/src/components/index.d.ts.map +1 -0
  184. package/lib/typescript/src/components/modal.styles.d.ts +66 -0
  185. package/lib/typescript/src/components/modal.styles.d.ts.map +1 -0
  186. package/lib/typescript/src/components/progress.styles.d.ts +44 -0
  187. package/lib/typescript/src/components/progress.styles.d.ts.map +1 -0
  188. package/lib/typescript/src/components/radio.styles.d.ts +91 -0
  189. package/lib/typescript/src/components/radio.styles.d.ts.map +1 -0
  190. package/lib/typescript/src/components/screen.styles.d.ts +34 -0
  191. package/lib/typescript/src/components/screen.styles.d.ts.map +1 -0
  192. package/lib/typescript/src/components/skeleton.styles.d.ts +105 -0
  193. package/lib/typescript/src/components/skeleton.styles.d.ts.map +1 -0
  194. package/lib/typescript/src/components/surface.styles.d.ts +31 -0
  195. package/lib/typescript/src/components/surface.styles.d.ts.map +1 -0
  196. package/lib/typescript/src/components/textfield.styles.d.ts +75 -0
  197. package/lib/typescript/src/components/textfield.styles.d.ts.map +1 -0
  198. package/lib/typescript/src/components/toast.styles.d.ts +62 -0
  199. package/lib/typescript/src/components/toast.styles.d.ts.map +1 -0
  200. package/lib/typescript/src/components/toggle.styles.d.ts +53 -0
  201. package/lib/typescript/src/components/toggle.styles.d.ts.map +1 -0
  202. package/lib/typescript/src/contracts/contract-types.d.ts +193 -0
  203. package/lib/typescript/src/contracts/contract-types.d.ts.map +1 -0
  204. package/lib/typescript/src/icons/Icon.d.ts +40 -0
  205. package/lib/typescript/src/icons/Icon.d.ts.map +1 -0
  206. package/lib/typescript/src/icons/glyphs.d.ts +259 -0
  207. package/lib/typescript/src/icons/glyphs.d.ts.map +1 -0
  208. package/lib/typescript/src/icons/icon.styles.d.ts +20 -0
  209. package/lib/typescript/src/icons/icon.styles.d.ts.map +1 -0
  210. package/lib/typescript/src/icons/index.d.ts +12 -0
  211. package/lib/typescript/src/icons/index.d.ts.map +1 -0
  212. package/lib/typescript/src/index.d.ts +12 -0
  213. package/lib/typescript/src/index.d.ts.map +1 -0
  214. package/lib/typescript/src/primitives/Button.d.ts +48 -0
  215. package/lib/typescript/src/primitives/Button.d.ts.map +1 -0
  216. package/lib/typescript/src/primitives/Metric.d.ts +38 -0
  217. package/lib/typescript/src/primitives/Metric.d.ts.map +1 -0
  218. package/lib/typescript/src/primitives/Row.d.ts +37 -0
  219. package/lib/typescript/src/primitives/Row.d.ts.map +1 -0
  220. package/lib/typescript/src/primitives/Stack.d.ts +33 -0
  221. package/lib/typescript/src/primitives/Stack.d.ts.map +1 -0
  222. package/lib/typescript/src/primitives/Tag.d.ts +43 -0
  223. package/lib/typescript/src/primitives/Tag.d.ts.map +1 -0
  224. package/lib/typescript/src/primitives/Text.d.ts +45 -0
  225. package/lib/typescript/src/primitives/Text.d.ts.map +1 -0
  226. package/lib/typescript/src/primitives/_internal/focus-ring.d.ts +31 -0
  227. package/lib/typescript/src/primitives/_internal/focus-ring.d.ts.map +1 -0
  228. package/lib/typescript/src/primitives/button.styles.d.ts +29 -0
  229. package/lib/typescript/src/primitives/button.styles.d.ts.map +1 -0
  230. package/lib/typescript/src/primitives/index.d.ts +8 -0
  231. package/lib/typescript/src/primitives/index.d.ts.map +1 -0
  232. package/lib/typescript/src/primitives/metric.styles.d.ts +43 -0
  233. package/lib/typescript/src/primitives/metric.styles.d.ts.map +1 -0
  234. package/lib/typescript/src/primitives/row.styles.d.ts +50 -0
  235. package/lib/typescript/src/primitives/row.styles.d.ts.map +1 -0
  236. package/lib/typescript/src/primitives/stack.styles.d.ts +34 -0
  237. package/lib/typescript/src/primitives/stack.styles.d.ts.map +1 -0
  238. package/lib/typescript/src/primitives/tag.styles.d.ts +32 -0
  239. package/lib/typescript/src/primitives/tag.styles.d.ts.map +1 -0
  240. package/lib/typescript/src/primitives/text.styles.d.ts +26 -0
  241. package/lib/typescript/src/primitives/text.styles.d.ts.map +1 -0
  242. package/lib/typescript/src/theme/ThemeProvider.d.ts +32 -0
  243. package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -0
  244. package/lib/typescript/src/theme/index.d.ts +15 -0
  245. package/lib/typescript/src/theme/index.d.ts.map +1 -0
  246. package/lib/typescript/src/theme/native-theme.d.ts +3 -0
  247. package/lib/typescript/src/theme/native-theme.d.ts.map +1 -0
  248. package/lib/typescript/src/theme/types.d.ts +121 -0
  249. package/lib/typescript/src/theme/types.d.ts.map +1 -0
  250. package/package.json +120 -0
  251. package/src/components/ActionSheet.tsx +112 -0
  252. package/src/components/Alert.tsx +84 -0
  253. package/src/components/Avatar.tsx +110 -0
  254. package/src/components/BottomSheet.tsx +81 -0
  255. package/src/components/Card.tsx +102 -0
  256. package/src/components/Checkbox.tsx +107 -0
  257. package/src/components/EmptyState.tsx +64 -0
  258. package/src/components/Header.tsx +51 -0
  259. package/src/components/Image.tsx +89 -0
  260. package/src/components/Modal.tsx +113 -0
  261. package/src/components/Progress.tsx +124 -0
  262. package/src/components/Radio.tsx +151 -0
  263. package/src/components/Screen.tsx +62 -0
  264. package/src/components/Skeleton.tsx +154 -0
  265. package/src/components/Surface.tsx +37 -0
  266. package/src/components/TextField.tsx +102 -0
  267. package/src/components/Toast.tsx +103 -0
  268. package/src/components/Toggle.tsx +94 -0
  269. package/src/components/action-sheet.styles.ts +102 -0
  270. package/src/components/alert.styles.ts +115 -0
  271. package/src/components/avatar.styles.ts +110 -0
  272. package/src/components/bottom-sheet.styles.ts +78 -0
  273. package/src/components/card.styles.ts +56 -0
  274. package/src/components/checkbox.styles.ts +83 -0
  275. package/src/components/empty-state.styles.ts +98 -0
  276. package/src/components/header.styles.ts +44 -0
  277. package/src/components/image.styles.ts +36 -0
  278. package/src/components/index.ts +23 -0
  279. package/src/components/modal.styles.ts +106 -0
  280. package/src/components/progress.styles.ts +74 -0
  281. package/src/components/radio.styles.ts +132 -0
  282. package/src/components/screen.styles.ts +44 -0
  283. package/src/components/skeleton.styles.ts +155 -0
  284. package/src/components/surface.styles.ts +50 -0
  285. package/src/components/textfield.styles.ts +135 -0
  286. package/src/components/toast.styles.ts +115 -0
  287. package/src/components/toggle.styles.ts +73 -0
  288. package/src/contracts/contract-types.ts +199 -0
  289. package/src/icons/Icon.tsx +65 -0
  290. package/src/icons/glyphs.ts +54 -0
  291. package/src/icons/icon.styles.ts +37 -0
  292. package/src/icons/index.ts +12 -0
  293. package/src/index.ts +24 -0
  294. package/src/primitives/Button.tsx +114 -0
  295. package/src/primitives/Metric.tsx +67 -0
  296. package/src/primitives/Row.tsx +54 -0
  297. package/src/primitives/Stack.tsx +42 -0
  298. package/src/primitives/Tag.tsx +126 -0
  299. package/src/primitives/Text.tsx +71 -0
  300. package/src/primitives/_internal/focus-ring.tsx +59 -0
  301. package/src/primitives/button.styles.ts +69 -0
  302. package/src/primitives/index.ts +8 -0
  303. package/src/primitives/metric.styles.ts +75 -0
  304. package/src/primitives/row.styles.ts +66 -0
  305. package/src/primitives/stack.styles.ts +47 -0
  306. package/src/primitives/tag.styles.ts +65 -0
  307. package/src/primitives/text.styles.ts +42 -0
  308. package/src/theme/ThemeProvider.tsx +60 -0
  309. package/src/theme/index.ts +18 -0
  310. package/src/theme/native-theme.ts +215 -0
  311. package/src/theme/types.ts +137 -0
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Avatar — ユーザーアバター(Image / Initials / Status / Group)。
5
+ * contract: avatar(web 契約 v2.0.0 の app 実装)。dogfood 不足-4 の解消。
6
+ *
7
+ * - variant は props から暗黙決定: source があれば image、無ければ initials(name から生成)。
8
+ * contract の group variant は Avatar.Group(重ね表示コンテナ、-spacing.2 相当のオーバーラップ)。
9
+ * - status(online / away / offline)指定時は右下に statusDot(bg-surface の ring 付き)。
10
+ * - a11y: role img + accessibilityLabel=name(contract required)。
11
+ * - 決定ロジックは pure resolver(avatar.styles.ts)に分離 — recipe との機械照合対象。
12
+ */
13
+
14
+ import { Children, useMemo } from "react";
15
+ import { Image as RNImage, Text as RNText, View } from "react-native";
16
+ import { useTheme } from "../theme/index.js";
17
+ import { CONTRACTS } from "../contracts/contract-types.js";
18
+ import { resolveAvatarGroupStyle, resolveAvatarStatusColor, resolveAvatarStyle } from "./avatar.styles.js";
19
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
20
+ /** name → initials(先頭2文字。空白区切りなら各語の頭文字を優先: "Taro Tanaka" → "TT")。 */
21
+ function toInitials(name) {
22
+ const words = name.trim().split(/\s+/).filter(Boolean);
23
+ if (words.length >= 2) return (words[0][0] + words[1][0]).toUpperCase();
24
+ return name.trim().slice(0, 2).toUpperCase();
25
+ }
26
+ export function Avatar({
27
+ name,
28
+ source,
29
+ size = "medium",
30
+ status,
31
+ style,
32
+ testID
33
+ }) {
34
+ const {
35
+ theme,
36
+ mode
37
+ } = useTheme();
38
+ const variant = source ? "image" : "initials";
39
+ const resolved = useMemo(() => resolveAvatarStyle(theme, mode, variant, size), [theme, mode, variant, size]);
40
+ const dotColor = status ? resolveAvatarStatusColor(theme, mode, status) : undefined;
41
+
42
+ // clip(overflow hidden)は内側の円に閉じ、statusDot は外側(クリップされない層)に置く。
43
+ // accessible 明示で「1つの読み上げ単位」にする(非 Touchable の View は暗黙では discoverable でない)
44
+ return /*#__PURE__*/_jsxs(View, {
45
+ style: [{
46
+ width: resolved.container.width,
47
+ height: resolved.container.height
48
+ }, style],
49
+ accessible: true,
50
+ accessibilityRole: "image",
51
+ accessibilityLabel: name,
52
+ testID: testID,
53
+ children: [/*#__PURE__*/_jsx(View, {
54
+ style: resolved.container,
55
+ children: source ? /*#__PURE__*/_jsx(RNImage, {
56
+ source: source,
57
+ style: {
58
+ width: "100%",
59
+ height: "100%"
60
+ }
61
+ }) : /*#__PURE__*/_jsx(RNText, {
62
+ style: resolved.text,
63
+ children: toInitials(name)
64
+ })
65
+ }), status ? /*#__PURE__*/_jsx(View, {
66
+ style: [resolved.dot, {
67
+ backgroundColor: dotColor,
68
+ position: "absolute",
69
+ right: 0,
70
+ bottom: 0
71
+ }]
72
+ }) : null]
73
+ });
74
+ }
75
+ /** 複数アバターの重ね表示(contract の group variant)。2枚目以降を負 margin で重ねる。 */
76
+ function AvatarGroup({
77
+ style,
78
+ testID,
79
+ children
80
+ }) {
81
+ const group = resolveAvatarGroupStyle();
82
+ return /*#__PURE__*/_jsx(View, {
83
+ style: [group.container, style],
84
+ testID: testID,
85
+ children: Children.map(children, (child, index) => /*#__PURE__*/_jsx(View, {
86
+ style: index > 0 ? group.overlap : null,
87
+ children: child
88
+ }))
89
+ });
90
+ }
91
+ Avatar.Group = AvatarGroup;
92
+ Avatar.__contract = CONTRACTS.avatar;
93
+ //# sourceMappingURL=Avatar.js.map
@@ -0,0 +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":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,EAAEC,OAAO,QAAwB,OAAO;AACzD,SACEC,KAAK,IAAIC,OAAO,EAChBC,IAAI,IAAIC,MAAM,EACdC,IAAI,QAIC,cAAc;AACrB,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SACEC,uBAAuB,EACvBC,wBAAwB,EACxBC,kBAAkB,QAIb,oBAAiB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAezB;AACA,SAASC,UAAUA,CAACC,IAAY,EAAU;EACxC,MAAMC,KAAK,GAAGD,IAAI,CAACE,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,KAAK,CAAC,CAACC,MAAM,CAACC,OAAO,CAAC;EACtD,IAAIJ,KAAK,CAACK,MAAM,IAAI,CAAC,EAAE,OAAO,CAACL,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAGA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAEM,WAAW,CAAC,CAAC;EACvE,OAAOP,IAAI,CAACE,IAAI,CAAC,CAAC,CAACM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACD,WAAW,CAAC,CAAC;AAC9C;AAEA,OAAO,SAASE,MAAMA,CAAC;EAAET,IAAI;EAAEU,MAAM;EAAEC,IAAI,GAAG,QAAQ;EAAEC,MAAM;EAAEC,KAAK;EAAEC;AAAoB,CAAC,EAAE;EAC5F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAG1B,QAAQ,CAAC,CAAC;EAClC,MAAM2B,OAAO,GAAGP,MAAM,GAAG,OAAO,GAAG,UAAU;EAE7C,MAAMQ,QAAQ,GAAGlC,OAAO,CACtB,MAAMU,kBAAkB,CAACqB,KAAK,EAAEC,IAAI,EAAEC,OAAO,EAAEN,IAAI,CAAC,EACpD,CAACI,KAAK,EAAEC,IAAI,EAAEC,OAAO,EAAEN,IAAI,CAC7B,CAAC;EACD,MAAMQ,QAAQ,GAAGP,MAAM,GAAGnB,wBAAwB,CAACsB,KAAK,EAAEC,IAAI,EAAEJ,MAAM,CAAC,GAAGQ,SAAS;;EAEnF;EACA;EACA,oBACEtB,KAAA,CAACT,IAAI;IACHwB,KAAK,EAAE,CAAC;MAAEQ,KAAK,EAAEH,QAAQ,CAACI,SAAS,CAACD,KAAK;MAAEE,MAAM,EAAEL,QAAQ,CAACI,SAAS,CAACC;IAAO,CAAC,EAAEV,KAAK,CAAE;IACvFW,UAAU;IACVC,iBAAiB,EAAC,OAAO;IACzBC,kBAAkB,EAAE1B,IAAK;IACzBc,MAAM,EAAEA,MAAO;IAAAa,QAAA,gBAEf/B,IAAA,CAACP,IAAI;MAACwB,KAAK,EAAEK,QAAQ,CAACI,SAAU;MAAAK,QAAA,EAC7BjB,MAAM,gBACLd,IAAA,CAACV,OAAO;QAACwB,MAAM,EAAEA,MAAO;QAACG,KAAK,EAAE;UAAEQ,KAAK,EAAE,MAAM;UAAEE,MAAM,EAAE;QAAO;MAAE,CAAE,CAAC,gBAErE3B,IAAA,CAACR,MAAM;QAACyB,KAAK,EAAEK,QAAQ,CAACU,IAAK;QAAAD,QAAA,EAAE5B,UAAU,CAACC,IAAI;MAAC,CAAS;IACzD,CACG,CAAC,EACNY,MAAM,gBACLhB,IAAA,CAACP,IAAI;MACHwB,KAAK,EAAE,CACLK,QAAQ,CAACW,GAAG,EACZ;QAAEC,eAAe,EAAEX,QAAQ;QAAEY,QAAQ,EAAE,UAAU;QAAEC,KAAK,EAAE,CAAC;QAAEC,MAAM,EAAE;MAAE,CAAC;IACxE,CACH,CAAC,GACA,IAAI;EAAA,CACJ,CAAC;AAEX;AAQA;AACA,SAASC,WAAWA,CAAC;EAAErB,KAAK;EAAEC,MAAM;EAAEa;AAA2B,CAAC,EAAE;EAClE,MAAMQ,KAAK,GAAG3C,uBAAuB,CAAC,CAAC;EACvC,oBACEI,IAAA,CAACP,IAAI;IAACwB,KAAK,EAAE,CAACsB,KAAK,CAACb,SAAS,EAAET,KAAK,CAAE;IAACC,MAAM,EAAEA,MAAO;IAAAa,QAAA,EACnD5C,QAAQ,CAACqD,GAAG,CAACT,QAAQ,EAAE,CAACU,KAAK,EAAEC,KAAK,kBACnC1C,IAAA,CAACP,IAAI;MAACwB,KAAK,EAAEyB,KAAK,GAAG,CAAC,GAAGH,KAAK,CAACI,OAAO,GAAG,IAAK;MAAAZ,QAAA,EAAEU;IAAK,CAAO,CAC7D;EAAC,CACE,CAAC;AAEX;AAEA5B,MAAM,CAAC+B,KAAK,GAAGN,WAAW;AAC1BzB,MAAM,CAACgC,UAAU,GAAGlD,SAAS,CAACmD,MAAM","ignoreList":[]}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * BottomSheet — 画面下から出る汎用シート container(content は自由 slot)。
5
+ * contract: bottom-sheet(appFirst、feedback)。RN core Modal(transparent + slide)+
6
+ * 下端 sheet(上角のみ radius)。ActionSheet がリスト特化なのに対しこちらは容器。
7
+ *
8
+ * - grabber は装飾バー。a11y ツリーから除外する(importantForAccessibility="no" +
9
+ * accessibilityElementsHidden。recipe description 参照)。
10
+ * - スワイプで閉じるジェスチャは実装しない(overlay tap + Android back で閉じる、Phase 外)。
11
+ * - sheet は下端密着(bg-surface)のため、SafeAreaView を sheet の内側に置いて
12
+ * 下余白(ホームインジケータ)まで sheet 背景で覆いつつ content を安全域に収める。
13
+ * - sheet 側は onStartShouldSetResponder で touch を claim し、overlay tap でだけ閉じる。
14
+ * - style の決定は pure resolver(bottom-sheet.styles.ts)に分離 — recipe との機械照合対象。
15
+ */
16
+
17
+ import { useMemo } from "react";
18
+ import { Modal as RNModal, Pressable, SafeAreaView, Text as RNText, View } from "react-native";
19
+ import { useTheme } from "../theme/index.js";
20
+ import { CONTRACTS } from "../contracts/contract-types.js";
21
+ import { resolveBottomSheetStyle } from "./bottom-sheet.styles.js";
22
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
23
+ export function BottomSheet({
24
+ visible,
25
+ onClose,
26
+ title,
27
+ testID,
28
+ children
29
+ }) {
30
+ const {
31
+ theme,
32
+ mode
33
+ } = useTheme();
34
+ const styles = useMemo(() => resolveBottomSheetStyle(theme, mode), [theme, mode]);
35
+ return /*#__PURE__*/_jsx(RNModal, {
36
+ visible: visible,
37
+ transparent: true,
38
+ animationType: "slide",
39
+ onRequestClose: onClose,
40
+ statusBarTranslucent: true,
41
+ children: /*#__PURE__*/_jsx(Pressable, {
42
+ style: styles.overlayStyle,
43
+ onPress: onClose,
44
+ accessible: false,
45
+ children: /*#__PURE__*/_jsx(View, {
46
+ style: styles.sheetStyle,
47
+ accessibilityViewIsModal: true,
48
+ onStartShouldSetResponder: () => true,
49
+ testID: testID,
50
+ children: /*#__PURE__*/_jsxs(SafeAreaView, {
51
+ children: [/*#__PURE__*/_jsx(View, {
52
+ style: styles.grabberStyle,
53
+ importantForAccessibility: "no",
54
+ accessibilityElementsHidden: true
55
+ }), title != null && /*#__PURE__*/_jsx(RNText, {
56
+ style: styles.titleStyle,
57
+ accessibilityRole: "header",
58
+ children: title
59
+ }), /*#__PURE__*/_jsx(View, {
60
+ style: styles.contentStyle,
61
+ children: children
62
+ })]
63
+ })
64
+ })
65
+ })
66
+ });
67
+ }
68
+ BottomSheet.__contract = CONTRACTS.bottomSheet;
69
+ //# sourceMappingURL=BottomSheet.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Card — コンテンツコンテナ component(設計書 §1)。contract: card。
5
+ *
6
+ * - 土台の解決(bg/radius/elevation/border/padding)は pure resolver(card.styles.ts の
7
+ * resolveCardShape)に一元化し、非インタラクティブ(View)・インタラクティブ(Pressable) の
8
+ * 両分岐で共有する(DRY、形状二重定義を防ぐ)。recipe との機械照合は
9
+ * scripts/lib/card-conformance.test.ts が行う。
10
+ * - variant: basic/media は非インタラクティブ、action/link は Pressable。
11
+ * action/link は pressed 時 elevation.sm→md(§2 hover→pressed mapping)。
12
+ * focus-within は RN 非サポートとして Phase1 明示 drop(§2)。
13
+ * - 型で action/link は onPress 必須を強制(§4 の DU 精神。無言で非対話に落ちる事故を防ぐ)。
14
+ * - Card は Image/Metric に依存しない(§1)。media/header/footer/children に呼び出し側が差し込む。
15
+ * ツー活カードは D2I が slot に Image+Metric を compose する。
16
+ * - media variant は overflow:hidden で角丸に画像をクリップし、body だけにパディング(contract と整合)。
17
+ */
18
+
19
+ import { Pressable, View } from "react-native";
20
+ import { useTheme } from "../theme/index.js";
21
+ import { useFocusRing, FocusRing } from "../primitives/_internal/focus-ring.js";
22
+ import { CONTRACTS } from "../contracts/contract-types.js";
23
+ import { CARD_INTERACTIVE, resolveCardShape, resolveCardBodyStyle } from "./card.styles.js";
24
+
25
+ // action/link(インタラクティブ)は onPress 必須、basic/media は onPress を取らない(§4 DU 精神)。
26
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
27
+ export function Card({
28
+ variant = "basic",
29
+ header,
30
+ footer,
31
+ media,
32
+ onPress,
33
+ accessibilityLabel,
34
+ style,
35
+ testID,
36
+ children
37
+ }) {
38
+ const {
39
+ theme,
40
+ mode
41
+ } = useTheme();
42
+ const {
43
+ focused,
44
+ focusHandlers
45
+ } = useFocusRing();
46
+ const interactive = CARD_INTERACTIVE[variant] && onPress != null;
47
+ const isMedia = variant === "media";
48
+ const inner = /*#__PURE__*/_jsxs(_Fragment, {
49
+ children: [media != null && /*#__PURE__*/_jsx(View, {
50
+ children: media
51
+ }), /*#__PURE__*/_jsxs(View, {
52
+ style: resolveCardBodyStyle(theme, variant),
53
+ children: [header, children, footer]
54
+ })]
55
+ });
56
+
57
+ // media は内側 clip View で角丸クリップ(外枠の影を消さないため overflow は内側だけに置く、M-1)。
58
+ // borderRadius は外枠 radius.lg から border 分を引かず同値でクリップ(視覚差は実機で微調整可)。
59
+ const content = isMedia ? /*#__PURE__*/_jsx(View, {
60
+ style: {
61
+ borderRadius: theme.radius.lg,
62
+ overflow: "hidden"
63
+ },
64
+ children: inner
65
+ }) : inner;
66
+ if (!interactive) {
67
+ return /*#__PURE__*/_jsx(View, {
68
+ testID: testID,
69
+ style: [resolveCardShape(theme, mode, variant), style],
70
+ children: content
71
+ });
72
+ }
73
+
74
+ // action/link: pressed 時 elevation.sm→md、focus 時 ring overlay。
75
+ return /*#__PURE__*/_jsxs(Pressable, {
76
+ ...focusHandlers,
77
+ onPress: onPress,
78
+ accessibilityRole: "button",
79
+ accessibilityLabel: accessibilityLabel,
80
+ testID: testID,
81
+ style: ({
82
+ pressed
83
+ }) => [resolveCardShape(theme, mode, variant, pressed), style],
84
+ children: [content, /*#__PURE__*/_jsx(FocusRing, {
85
+ visible: focused,
86
+ radius: theme.radius.lg
87
+ })]
88
+ });
89
+ }
90
+
91
+ // Phase 2 conformance test 用の contract メタ(§2 A-3)。
92
+ Card.__contract = CONTRACTS.card;
93
+ //# sourceMappingURL=Card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Pressable","View","useTheme","useFocusRing","FocusRing","CONTRACTS","CARD_INTERACTIVE","resolveCardShape","resolveCardBodyStyle","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","Card","variant","header","footer","media","onPress","accessibilityLabel","style","testID","children","theme","mode","focused","focusHandlers","interactive","isMedia","inner","content","borderRadius","radius","lg","overflow","accessibilityRole","pressed","visible","__contract","card"],"sourceRoot":"../../../src","sources":["components/Card.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,SAAS,EAAEC,IAAI,QAAwC,cAAc;AAC9E,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,YAAY,EAAEC,SAAS,QAAQ,uCAAoC;AAC5E,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,gBAAgB,EAAEC,gBAAgB,EAAEC,oBAAoB,QAAQ,kBAAe;;AAaxF;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA,EAAAC,QAAA,IAAAC,SAAA;AAOA,OAAO,SAASC,IAAIA,CAAC;EACnBC,OAAO,GAAG,OAAO;EACjBC,MAAM;EACNC,MAAM;EACNC,KAAK;EACLC,OAAO;EACPC,kBAAkB;EAClBC,KAAK;EACLC,MAAM;EACNC;AACS,CAAC,EAAE;EACZ,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGxB,QAAQ,CAAC,CAAC;EAClC,MAAM;IAAEyB,OAAO;IAAEC;EAAc,CAAC,GAAGzB,YAAY,CAAC,CAAC;EACjD,MAAM0B,WAAW,GAAGvB,gBAAgB,CAACU,OAAO,CAAC,IAAII,OAAO,IAAI,IAAI;EAChE,MAAMU,OAAO,GAAGd,OAAO,KAAK,OAAO;EAEnC,MAAMe,KAAK,gBACTnB,KAAA,CAAAE,SAAA;IAAAU,QAAA,GACGL,KAAK,IAAI,IAAI,iBAAIT,IAAA,CAACT,IAAI;MAAAuB,QAAA,EAAEL;IAAK,CAAO,CAAC,eACtCP,KAAA,CAACX,IAAI;MAACqB,KAAK,EAAEd,oBAAoB,CAACiB,KAAK,EAAET,OAAO,CAAE;MAAAQ,QAAA,GAC/CP,MAAM,EACNO,QAAQ,EACRN,MAAM;IAAA,CACH,CAAC;EAAA,CACP,CACH;;EAED;EACA;EACA,MAAMc,OAAO,GAAGF,OAAO,gBACrBpB,IAAA,CAACT,IAAI;IAACqB,KAAK,EAAE;MAAEW,YAAY,EAAER,KAAK,CAACS,MAAM,CAACC,EAAE;MAAEC,QAAQ,EAAE;IAAS,CAAE;IAAAZ,QAAA,EAAEO;EAAK,CAAO,CAAC,GAElFA,KACD;EAED,IAAI,CAACF,WAAW,EAAE;IAChB,oBACEnB,IAAA,CAACT,IAAI;MAACsB,MAAM,EAAEA,MAAO;MAACD,KAAK,EAAE,CAACf,gBAAgB,CAACkB,KAAK,EAAEC,IAAI,EAAEV,OAAO,CAAC,EAAEM,KAAK,CAAE;MAAAE,QAAA,EAC1EQ;IAAO,CACJ,CAAC;EAEX;;EAEA;EACA,oBACEpB,KAAA,CAACZ,SAAS;IAAA,GACJ4B,aAAa;IACjBR,OAAO,EAAEA,OAAQ;IACjBiB,iBAAiB,EAAC,QAAQ;IAC1BhB,kBAAkB,EAAEA,kBAAmB;IACvCE,MAAM,EAAEA,MAAO;IACfD,KAAK,EAAEA,CAAC;MAAEgB;IAAQ,CAAC,KAAK,CAAC/B,gBAAgB,CAACkB,KAAK,EAAEC,IAAI,EAAEV,OAAO,EAAEsB,OAAO,CAAC,EAAEhB,KAAK,CAAE;IAAAE,QAAA,GAEhFQ,OAAO,eACRtB,IAAA,CAACN,SAAS;MAACmC,OAAO,EAAEZ,OAAQ;MAACO,MAAM,EAAET,KAAK,CAACS,MAAM,CAACC;IAAG,CAAE,CAAC;EAAA,CAC/C,CAAC;AAEhB;;AAEA;AACApB,IAAI,CAACyB,UAAU,GAAGnC,SAAS,CAACoC,IAAI","ignoreList":[]}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Checkbox — 複数選択フォームコントロール(form-input 第1弾)。contract: checkbox。
5
+ *
6
+ * - RN にネイティブ checkbox が無いため Pressable(行全体タップ)+ 描画で実装する。
7
+ * checkmark は rotate した View の L 字 border、indeterminate は横棒
8
+ * (react-native-svg 非依存 = 本体エントリの依存ゼロ維持。recipe description 参照)。
9
+ * - box は 20px(web の 16px より大きいのはタッチ前提)。実タッチ領域は hitSlop 12 で
10
+ * 44pt(20 + 12×2)を確保する。
11
+ * - label 必須(FORM_NO_LABEL_OMIT を props 型で強制)。label は Text primitive
12
+ * (base/text-default = recipe labelStyle と同値)。
13
+ * - states(contract → prop の写像): checked/unchecked → checked:boolean、
14
+ * indeterminate → indeterminate:boolean(variant "indeterminate"。a11y は "mixed")、
15
+ * error → error:boolean(borderColor 差分、checked より優先)、disabled → prop
16
+ * (opacity 0.5 + 非活性)。focus は Phase1 非対応(recipe にも focus 差分なし)。
17
+ * - 色・寸法の決定は pure resolver(checkbox.styles.ts)に分離。
18
+ * recipes/app/checkbox.recipe.json との機械照合は scripts/lib/checkbox-conformance.test.ts が行う。
19
+ */
20
+
21
+ import { useMemo } from "react";
22
+ import { Pressable, View } from "react-native";
23
+ import { Text } from "../primitives/Text.js";
24
+ import { useTheme } from "../theme/index.js";
25
+ import { CONTRACTS } from "../contracts/contract-types.js";
26
+ import { CHECKBOX_SPEC, resolveCheckboxStyle } from "./checkbox.styles.js";
27
+
28
+ /** checkmark / 横棒の幾何値(recipe に token 化されていない描画トリック側の定数)。 */
29
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
30
+ const CHECKMARK = {
31
+ width: 10,
32
+ height: 6,
33
+ borderWidth: 2,
34
+ offsetY: -1
35
+ };
36
+ const INDETERMINATE_BAR = {
37
+ width: 10,
38
+ height: 2
39
+ };
40
+ export function Checkbox({
41
+ label,
42
+ checked,
43
+ onChange,
44
+ indeterminate = false,
45
+ disabled = false,
46
+ error = false,
47
+ testID
48
+ }) {
49
+ const {
50
+ theme,
51
+ mode
52
+ } = useTheme();
53
+ const resolved = useMemo(() => resolveCheckboxStyle(theme, mode, {
54
+ checked,
55
+ indeterminate,
56
+ error
57
+ }), [theme, mode, checked, indeterminate, error]);
58
+ return /*#__PURE__*/_jsxs(Pressable, {
59
+ onPress: () => onChange(!checked),
60
+ disabled: disabled,
61
+ hitSlop: CHECKBOX_SPEC.hitSlop,
62
+ accessibilityRole: "checkbox",
63
+ accessibilityState: {
64
+ checked: indeterminate ? "mixed" : checked,
65
+ disabled
66
+ },
67
+ accessibilityLabel: label,
68
+ testID: testID,
69
+ style: {
70
+ flexDirection: "row",
71
+ alignItems: "center",
72
+ gap: resolved.gap,
73
+ opacity: disabled ? CHECKBOX_SPEC.disabledOpacity : 1
74
+ },
75
+ children: [/*#__PURE__*/_jsx(View, {
76
+ style: [resolved.boxStyle, {
77
+ alignItems: "center",
78
+ justifyContent: "center"
79
+ }],
80
+ children: indeterminate ?
81
+ /*#__PURE__*/
82
+ // 横棒(一部選択)。markColor = text-on-accent(states.checked.markColor と同源)。
83
+ _jsx(View, {
84
+ style: {
85
+ width: INDETERMINATE_BAR.width,
86
+ height: INDETERMINATE_BAR.height,
87
+ backgroundColor: resolved.markColor
88
+ }
89
+ }) : checked ?
90
+ /*#__PURE__*/
91
+ // L 字 border を -45deg 回転させた checkmark(svg 非依存の描画トリック)。
92
+ _jsx(View, {
93
+ style: {
94
+ width: CHECKMARK.width,
95
+ height: CHECKMARK.height,
96
+ borderLeftWidth: CHECKMARK.borderWidth,
97
+ borderBottomWidth: CHECKMARK.borderWidth,
98
+ borderColor: resolved.markColor,
99
+ marginTop: CHECKMARK.offsetY,
100
+ transform: [{
101
+ rotate: "-45deg"
102
+ }]
103
+ }
104
+ }) : null
105
+ }), /*#__PURE__*/_jsx(Text, {
106
+ variant: "base",
107
+ color: "text-default",
108
+ children: label
109
+ })]
110
+ });
111
+ }
112
+
113
+ // Phase 2 conformance test 用の contract メタ(§2 A-3)。
114
+ Checkbox.__contract = CONTRACTS.checkbox;
115
+ //# sourceMappingURL=Checkbox.js.map
@@ -0,0 +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":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,SAAS,EAAEC,IAAI,QAAQ,cAAc;AAC9C,SAASC,IAAI,QAAQ,uBAAoB;AACzC,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,aAAa,EAAEC,oBAAoB,QAAQ,sBAAmB;;AAEvE;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AACA,MAAMC,SAAS,GAAG;EAAEC,KAAK,EAAE,EAAE;EAAEC,MAAM,EAAE,CAAC;EAAEC,WAAW,EAAE,CAAC;EAAEC,OAAO,EAAE,CAAC;AAAE,CAAU;AAChF,MAAMC,iBAAiB,GAAG;EAAEJ,KAAK,EAAE,EAAE;EAAEC,MAAM,EAAE;AAAE,CAAU;AAe3D,OAAO,SAASI,QAAQA,CAAC;EACvBC,KAAK;EACLC,OAAO;EACPC,QAAQ;EACRC,aAAa,GAAG,KAAK;EACrBC,QAAQ,GAAG,KAAK;EAChBC,KAAK,GAAG,KAAK;EACbC;AACa,CAAC,EAAE;EAChB,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGvB,QAAQ,CAAC,CAAC;EAClC,MAAMwB,QAAQ,GAAG5B,OAAO,CACtB,MAAMO,oBAAoB,CAACmB,KAAK,EAAEC,IAAI,EAAE;IAAEP,OAAO;IAAEE,aAAa;IAAEE;EAAM,CAAC,CAAC,EAC1E,CAACE,KAAK,EAAEC,IAAI,EAAEP,OAAO,EAAEE,aAAa,EAAEE,KAAK,CAC7C,CAAC;EAED,oBACEb,KAAA,CAACV,SAAS;IACR4B,OAAO,EAAEA,CAAA,KAAMR,QAAQ,CAAC,CAACD,OAAO,CAAE;IAClCG,QAAQ,EAAEA,QAAS;IACnBO,OAAO,EAAExB,aAAa,CAACwB,OAAQ;IAC/BC,iBAAiB,EAAC,UAAU;IAC5BC,kBAAkB,EAAE;MAAEZ,OAAO,EAAEE,aAAa,GAAG,OAAO,GAAGF,OAAO;MAAEG;IAAS,CAAE;IAC7EU,kBAAkB,EAAEd,KAAM;IAC1BM,MAAM,EAAEA,MAAO;IACfS,KAAK,EAAE;MACLC,aAAa,EAAE,KAAK;MACpBC,UAAU,EAAE,QAAQ;MACpBC,GAAG,EAAET,QAAQ,CAACS,GAAG;MACjBC,OAAO,EAAEf,QAAQ,GAAGjB,aAAa,CAACiC,eAAe,GAAG;IACtD,CAAE;IAAAC,QAAA,gBAEF/B,IAAA,CAACP,IAAI;MAACgC,KAAK,EAAE,CAACN,QAAQ,CAACa,QAAQ,EAAE;QAAEL,UAAU,EAAE,QAAQ;QAAEM,cAAc,EAAE;MAAS,CAAC,CAAE;MAAAF,QAAA,EAClFlB,aAAa;MAAA;MACZ;MACAb,IAAA,CAACP,IAAI;QACHgC,KAAK,EAAE;UACLrB,KAAK,EAAEI,iBAAiB,CAACJ,KAAK;UAC9BC,MAAM,EAAEG,iBAAiB,CAACH,MAAM;UAChC6B,eAAe,EAAEf,QAAQ,CAACgB;QAC5B;MAAE,CACH,CAAC,GACAxB,OAAO;MAAA;MACT;MACAX,IAAA,CAACP,IAAI;QACHgC,KAAK,EAAE;UACLrB,KAAK,EAAED,SAAS,CAACC,KAAK;UACtBC,MAAM,EAAEF,SAAS,CAACE,MAAM;UACxB+B,eAAe,EAAEjC,SAAS,CAACG,WAAW;UACtC+B,iBAAiB,EAAElC,SAAS,CAACG,WAAW;UACxCgC,WAAW,EAAEnB,QAAQ,CAACgB,SAAS;UAC/BI,SAAS,EAAEpC,SAAS,CAACI,OAAO;UAC5BiC,SAAS,EAAE,CAAC;YAAEC,MAAM,EAAE;UAAS,CAAC;QAClC;MAAE,CACH,CAAC,GACA;IAAI,CACJ,CAAC,eACPzC,IAAA,CAACN,IAAI;MAACgD,OAAO,EAAC,MAAM;MAACC,KAAK,EAAC,cAAc;MAAAZ,QAAA,EACtCrB;IAAK,CACF,CAAC;EAAA,CACE,CAAC;AAEhB;;AAEA;AACAD,QAAQ,CAACmC,UAAU,GAAGhD,SAAS,CAACiD,QAAQ","ignoreList":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * EmptyState — データ無し時のプレースホルダー(設計書 §1)。contract: empty-state。
5
+ * Text + Button の compose(§1)。icon + title + description + 任意の action。
6
+ *
7
+ * - title は見出しとして読み上げ(Text role="heading")。
8
+ * - action は Button(contained) を内部 compose。
9
+ * - 中央寄せレイアウト。色は token(title=text-heading, description=text-muted)。
10
+ * - 色・寸法の決定は pure resolver(empty-state.styles.ts)に分離。Text へ渡すキーも
11
+ * EMPTY_STATE_SPEC(同ファイル)を SSOT として共有し、
12
+ * recipes/app/empty-state.recipe.json との機械照合は scripts/lib/empty-state-conformance.test.ts が行う。
13
+ */
14
+
15
+ import { useMemo } from "react";
16
+ import { View } from "react-native";
17
+ import { Text } from "../primitives/Text.js";
18
+ import { Button } from "../primitives/Button.js";
19
+ import { useTheme } from "../theme/index.js";
20
+ import { CONTRACTS } from "../contracts/contract-types.js";
21
+ import { EMPTY_STATE_SPEC, resolveEmptyStateStyles } from "./empty-state.styles.js";
22
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
23
+ export function EmptyState({
24
+ icon,
25
+ title,
26
+ description,
27
+ action,
28
+ style,
29
+ testID
30
+ }) {
31
+ const {
32
+ theme,
33
+ mode
34
+ } = useTheme();
35
+ const styles = useMemo(() => resolveEmptyStateStyles(theme, mode), [theme, mode]);
36
+ return /*#__PURE__*/_jsxs(View, {
37
+ testID: testID,
38
+ style: [styles.style, style],
39
+ children: [icon != null && /*#__PURE__*/_jsx(View, {
40
+ children: icon
41
+ }), /*#__PURE__*/_jsx(Text, {
42
+ variant: EMPTY_STATE_SPEC.titleFont,
43
+ role: "heading",
44
+ weight: EMPTY_STATE_SPEC.titleWeight,
45
+ color: EMPTY_STATE_SPEC.titleColor,
46
+ style: {
47
+ textAlign: styles.titleStyle.textAlign
48
+ },
49
+ children: title
50
+ }), description != null && /*#__PURE__*/_jsx(Text, {
51
+ variant: EMPTY_STATE_SPEC.descriptionFont,
52
+ color: EMPTY_STATE_SPEC.descriptionColor,
53
+ style: {
54
+ textAlign: styles.descriptionStyle.textAlign
55
+ },
56
+ children: description
57
+ }), action != null && /*#__PURE__*/_jsx(View, {
58
+ style: styles.actionStyle,
59
+ children: /*#__PURE__*/_jsx(Button, {
60
+ variant: "contained",
61
+ label: action.label,
62
+ onPress: action.onPress
63
+ })
64
+ })]
65
+ });
66
+ }
67
+
68
+ // Phase 2 conformance test 用の contract メタ(§2 A-3)。
69
+ EmptyState.__contract = CONTRACTS.emptyState;
70
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Header — 画面ヘッダー primitive(title + leading? / trailing? slot + 下 border)。
5
+ * contract: header(app 先行定義、melta-contracts)。dogfood 不足-3 の解消。
6
+ * Screen の header slot に差して使う想定(単体でも使える)。
7
+ *
8
+ * - title は melta の Text(xl / bold / text-heading / heading role)で描画し、
9
+ * heading として読み上げられる(contract a11y required)。
10
+ * - titleWrapStyle の flex:1 で title が余白を占有し trailing を右端へ押す。
11
+ * - 決定ロジックは pure resolver(header.styles.ts)に分離 — recipe との機械照合対象。
12
+ */
13
+
14
+ import { useMemo } from "react";
15
+ import { View } from "react-native";
16
+ import { useTheme } from "../theme/index.js";
17
+ import { CONTRACTS } from "../contracts/contract-types.js";
18
+ import { Text } from "../primitives/Text.js";
19
+ import { resolveHeaderStyle } from "./header.styles.js";
20
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
21
+ export function Header({
22
+ title,
23
+ leading,
24
+ trailing,
25
+ style,
26
+ testID
27
+ }) {
28
+ const {
29
+ theme,
30
+ mode
31
+ } = useTheme();
32
+ const {
33
+ containerStyle,
34
+ titleWrapStyle
35
+ } = useMemo(() => resolveHeaderStyle(theme, mode), [theme, mode]);
36
+ return /*#__PURE__*/_jsxs(View, {
37
+ style: [containerStyle, style],
38
+ testID: testID,
39
+ children: [leading, /*#__PURE__*/_jsx(View, {
40
+ style: titleWrapStyle,
41
+ children: /*#__PURE__*/_jsx(Text, {
42
+ variant: "xl",
43
+ weight: "bold",
44
+ color: "text-heading",
45
+ role: "heading",
46
+ numberOfLines: 1,
47
+ children: title
48
+ })
49
+ }), trailing]
50
+ });
51
+ }
52
+ Header.__contract = CONTRACTS.header;
53
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","View","useTheme","CONTRACTS","Text","resolveHeaderStyle","jsx","_jsx","jsxs","_jsxs","Header","title","leading","trailing","style","testID","theme","mode","containerStyle","titleWrapStyle","children","variant","weight","color","role","numberOfLines","__contract","header"],"sourceRoot":"../../../src","sources":["components/Header.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,IAAI,QAAwC,cAAc;AACnE,SAASC,QAAQ,QAAQ,mBAAU;AACnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,IAAI,QAAQ,uBAAoB;AACzC,SAASC,kBAAkB,QAA0B,oBAAiB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAavE,OAAO,SAASC,MAAMA,CAAC;EAAEC,KAAK;EAAEC,OAAO;EAAEC,QAAQ;EAAEC,KAAK;EAAEC;AAAoB,CAAC,EAAE;EAC/E,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGf,QAAQ,CAAC,CAAC;EAElC,MAAM;IAAEgB,cAAc;IAAEC;EAAe,CAAC,GAAGnB,OAAO,CAChD,MAAMK,kBAAkB,CAACW,KAAK,EAAEC,IAAI,CAAC,EACrC,CAACD,KAAK,EAAEC,IAAI,CACd,CAAC;EAED,oBACER,KAAA,CAACR,IAAI;IAACa,KAAK,EAAE,CAACI,cAAc,EAAEJ,KAAK,CAAE;IAACC,MAAM,EAAEA,MAAO;IAAAK,QAAA,GAClDR,OAAO,eACRL,IAAA,CAACN,IAAI;MAACa,KAAK,EAAEK,cAAe;MAAAC,QAAA,eAC1Bb,IAAA,CAACH,IAAI;QAACiB,OAAO,EAAC,IAAI;QAACC,MAAM,EAAC,MAAM;QAACC,KAAK,EAAC,cAAc;QAACC,IAAI,EAAC,SAAS;QAACC,aAAa,EAAE,CAAE;QAAAL,QAAA,EACnFT;MAAK,CACF;IAAC,CACH,CAAC,EACNE,QAAQ;EAAA,CACL,CAAC;AAEX;AAEAH,MAAM,CAACgB,UAAU,GAAGvB,SAAS,CAACwB,MAAM","ignoreList":[]}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Image — 画像表示 component(設計書 §1)。contract: image(app 先行定義)。
5
+ *
6
+ * - Phase 1 は RN コア Image。expo-image は Phase 2(blurhash / 高度 cache 要件化時)。
7
+ * 差し替えコスト最小化のためここで包む(呼び出し側は melta-app の Image だけ見る)。
8
+ * - contentFit("cover"|"contain") → RN の resizeMode に変換。
9
+ * - onError 時に fallback(ReactNode)を表示。fallback 未指定なら何も出さない。
10
+ * - radius は token キーのみ(生数値不可、§5)。shape の解決は pure resolver
11
+ * (image.styles.ts)に分離。recipes/app/image.recipe.json との機械照合は
12
+ * scripts/lib/image-conformance.test.ts が行う。
13
+ */
14
+
15
+ import { useState } from "react";
16
+ import { Image as RNImage, View } from "react-native";
17
+ import { useTheme } from "../theme/index.js";
18
+ import { CONTRACTS } from "../contracts/contract-types.js";
19
+ import { resolveImageShape } from "./image.styles.js";
20
+ import { jsx as _jsx } from "react/jsx-runtime";
21
+ export function Image({
22
+ source,
23
+ aspectRatio,
24
+ radius,
25
+ contentFit = "cover",
26
+ fallback,
27
+ accessibilityLabel,
28
+ style,
29
+ testID
30
+ }) {
31
+ const {
32
+ theme
33
+ } = useTheme();
34
+ const [errored, setErrored] = useState(false);
35
+
36
+ // shape は ImageStyle / ViewStyle 双方に有効な共通サブセット(resolver 参照)なので、
37
+ // RNImage と fallback View で同じ値を共用できる。
38
+ const shape = resolveImageShape(theme, {
39
+ aspectRatio,
40
+ radius
41
+ });
42
+ if (errored && fallback != null) {
43
+ // caller の style(width/height/flex 等の layout)を fallback にも反映する(通常画像と同寸法)。
44
+ // ImageStyle ⊃ ViewStyle ではないが layout プロパティは共通なので cast で流す
45
+ // (overflow:"scroll" 等 Image 固有値を caller が入れた稀ケースのみ無視される)。
46
+ return /*#__PURE__*/_jsx(View, {
47
+ style: [shape, style],
48
+ testID: testID,
49
+ accessible: accessibilityLabel != null,
50
+ accessibilityLabel: accessibilityLabel,
51
+ children: fallback
52
+ });
53
+ }
54
+ return /*#__PURE__*/_jsx(RNImage, {
55
+ testID: testID,
56
+ source: source,
57
+ resizeMode: contentFit,
58
+ onError: () => setErrored(true),
59
+ accessible: accessibilityLabel != null,
60
+ accessibilityLabel: accessibilityLabel,
61
+ style: [shape, style]
62
+ });
63
+ }
64
+
65
+ // Phase 2 conformance test 用の contract メタ(§2 A-3)。
66
+ Image.__contract = CONTRACTS.image;
67
+ //# sourceMappingURL=Image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useState","Image","RNImage","View","useTheme","CONTRACTS","resolveImageShape","jsx","_jsx","source","aspectRatio","radius","contentFit","fallback","accessibilityLabel","style","testID","theme","errored","setErrored","shape","accessible","children","resizeMode","onError","__contract","image"],"sourceRoot":"../../../src","sources":["components/Image.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,QAAwB,OAAO;AAChD,SACEC,KAAK,IAAIC,OAAO,EAChBC,IAAI,QAKC,cAAc;AACrB,SAASC,QAAQ,QAAQ,mBAAU;AAEnC,SAASC,SAAS,QAAQ,gCAA6B;AACvD,SAASC,iBAAiB,QAAQ,mBAAgB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAiBnD,OAAO,SAASP,KAAKA,CAAC;EACpBQ,MAAM;EACNC,WAAW;EACXC,MAAM;EACNC,UAAU,GAAG,OAAO;EACpBC,QAAQ;EACRC,kBAAkB;EAClBC,KAAK;EACLC;AACU,CAAC,EAAE;EACb,MAAM;IAAEC;EAAM,CAAC,GAAGb,QAAQ,CAAC,CAAC;EAC5B,MAAM,CAACc,OAAO,EAAEC,UAAU,CAAC,GAAGnB,QAAQ,CAAC,KAAK,CAAC;;EAE7C;EACA;EACA,MAAMoB,KAAK,GAAGd,iBAAiB,CAACW,KAAK,EAAE;IAAEP,WAAW;IAAEC;EAAO,CAAC,CAAC;EAE/D,IAAIO,OAAO,IAAIL,QAAQ,IAAI,IAAI,EAAE;IAC/B;IACA;IACA;IACA,oBACEL,IAAA,CAACL,IAAI;MACHY,KAAK,EAAE,CAACK,KAAK,EAAEL,KAAK,CAAqC;MACzDC,MAAM,EAAEA,MAAO;MACfK,UAAU,EAAEP,kBAAkB,IAAI,IAAK;MACvCA,kBAAkB,EAAEA,kBAAmB;MAAAQ,QAAA,EAEtCT;IAAQ,CACL,CAAC;EAEX;EAEA,oBACEL,IAAA,CAACN,OAAO;IACNc,MAAM,EAAEA,MAAO;IACfP,MAAM,EAAEA,MAA8B;IACtCc,UAAU,EAAEX,UAAW;IACvBY,OAAO,EAAEA,CAAA,KAAML,UAAU,CAAC,IAAI,CAAE;IAChCE,UAAU,EAAEP,kBAAkB,IAAI,IAAK;IACvCA,kBAAkB,EAAEA,kBAAmB;IACvCC,KAAK,EAAE,CAACK,KAAK,EAAEL,KAAK;EAAE,CACvB,CAAC;AAEN;;AAEA;AACAd,KAAK,CAACwB,UAAU,GAAGpB,SAAS,CAACqB,KAAK","ignoreList":[]}