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
@@ -9,14 +9,23 @@
9
9
  *
10
10
  * - RN では border を持たず bg subtle + text 色で表現する(status token に border 用の中間色が
11
11
  * 無いため。COLOR_ONLY_FORBIDDEN は title/message のテキストと icon slot で担保、recipe description)。
12
- * - dark mode は status.*.subtleDark / textDark 側を解決する。info variant のみ primary 固定
13
- * (dark token が無い既知の割り切り、web と同じ)。
12
+ * - status 色(mode ごとの subtle / text、info の primary 固定)の解決は status-colors.ts が SSOT。
14
13
  */
15
14
 
15
+ import { resolveStatusVariantColors } from "./status-colors.js";
16
+ import { CANONICAL_TAP_TARGET } from "../a11y/tap-target.js";
17
+
18
+ /** alert.contract の variant 語彙(status 共通語彙と 1:1)。 */
19
+
16
20
  /**
17
21
  * 構成キー(token キー)。component は Text にこのキーをそのまま渡し、resolver は同じキーから
18
22
  * style 値を解決する(component と resolver が別々のキーを持って drift する事故を防ぐ SSOT)。
19
23
  */
24
+ /**
25
+ * × の当たり判定(正典パターン: 視覚 24pt + hitSlop 10 = 実効 44pt)。
26
+ * Alert の × は右端に単独で立つ(Toast と違い隣接する操作要素が無い)ので横も 10 のままでよい。
27
+ */
28
+ export const ALERT_CLOSE_TAP_TARGET = CANONICAL_TAP_TARGET;
20
29
  export const ALERT_SPEC = {
21
30
  padding: "4",
22
31
  gap: "3",
@@ -28,35 +37,12 @@ export const ALERT_SPEC = {
28
37
 
29
38
  /** slot 構成(alert.recipe 各 variant の containerStyle / titleStyle / messageStyle と 1:1)。 */
30
39
 
31
- /**
32
- * variant → bg / text 色の解決。
33
- * - info: primary.50 / primary.800 固定(mode 非依存)。
34
- * - success / warning / error: status token(error は status キー上は danger)。
35
- * light は subtleLight / textLight、dark は subtleDark / textDark(recipe description の写像)。
36
- */
37
- export function resolveAlertColors(theme, mode, variant) {
38
- if (variant === "info") {
39
- return {
40
- bg: theme.color.primary["50"],
41
- text: theme.color.primary["800"]
42
- };
43
- }
44
- const status = theme.color.status[variant === "error" ? "danger" : variant];
45
- return mode === "dark" ? {
46
- bg: status.subtleDark,
47
- text: status.textDark
48
- } : {
49
- bg: status.subtleLight,
50
- text: status.textLight
51
- };
52
- }
53
-
54
40
  /** variant → 全 slot の style 解決(alert.recipe styleRefs の 1:1 写像)。 */
55
41
  export function resolveAlertStyles(theme, mode, variant) {
56
42
  const {
57
43
  bg,
58
44
  text
59
- } = resolveAlertColors(theme, mode, variant);
45
+ } = resolveStatusVariantColors(theme, mode, variant);
60
46
  return {
61
47
  containerStyle: {
62
48
  backgroundColor: bg,
@@ -1 +1 @@
1
- {"version":3,"names":["ALERT_SPEC","padding","gap","radius","titleFont","titleWeight","messageFont","resolveAlertColors","theme","mode","variant","bg","color","primary","text","status","subtleDark","textDark","subtleLight","textLight","resolveAlertStyles","containerStyle","backgroundColor","borderRadius","spacing","flexDirection","alignItems","titleStyle","fontSize","typography","fontWeight","messageStyle"],"sourceRoot":"../../../src","sources":["components/alert.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAcA;AACA;AACA;AACA;AACA,OAAO,MAAMA,UAAU,GAAG;EACxBC,OAAO,EAAE,GAAG;EACZC,GAAG,EAAE,GAAG;EACRC,MAAM,EAAE,IAAI;EACZC,SAAS,EAAE,MAAM;EACjBC,WAAW,EAAE,QAAQ;EACrBC,WAAW,EAAE;AACf,CAOC;;AAED;;AAuBA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,KAAkB,EAClBC,IAAe,EACfC,OAAqB,EACS;EAC9B,IAAIA,OAAO,KAAK,MAAM,EAAE;IACtB,OAAO;MAAEC,EAAE,EAAEH,KAAK,CAACI,KAAK,CAACC,OAAO,CAAC,IAAI,CAAC;MAAEC,IAAI,EAAEN,KAAK,CAACI,KAAK,CAACC,OAAO,CAAC,KAAK;IAAE,CAAC;EAC5E;EACA,MAAME,MAAM,GAAGP,KAAK,CAACI,KAAK,CAACG,MAAM,CAACL,OAAO,KAAK,OAAO,GAAG,QAAQ,GAAGA,OAAO,CAAC;EAC3E,OAAOD,IAAI,KAAK,MAAM,GAClB;IAAEE,EAAE,EAAEI,MAAM,CAACC,UAAU;IAAEF,IAAI,EAAEC,MAAM,CAACE;EAAS,CAAC,GAChD;IAAEN,EAAE,EAAEI,MAAM,CAACG,WAAW;IAAEJ,IAAI,EAAEC,MAAM,CAACI;EAAU,CAAC;AACxD;;AAEA;AACA,OAAO,SAASC,kBAAkBA,CAChCZ,KAAkB,EAClBC,IAAe,EACfC,OAAqB,EACR;EACb,MAAM;IAAEC,EAAE;IAAEG;EAAK,CAAC,GAAGP,kBAAkB,CAACC,KAAK,EAAEC,IAAI,EAAEC,OAAO,CAAC;EAC7D,OAAO;IACLW,cAAc,EAAE;MACdC,eAAe,EAAEX,EAAE;MACnBY,YAAY,EAAEf,KAAK,CAACL,MAAM,CAACH,UAAU,CAACG,MAAM,CAAC;MAC7CF,OAAO,EAAEO,KAAK,CAACgB,OAAO,CAACxB,UAAU,CAACC,OAAO,CAAC;MAC1CwB,aAAa,EAAE,KAAK;MACpBC,UAAU,EAAE,YAAY;MACxBxB,GAAG,EAAEM,KAAK,CAACgB,OAAO,CAACxB,UAAU,CAACE,GAAG;IACnC,CAAC;IACDyB,UAAU,EAAE;MACVf,KAAK,EAAEE,IAAI;MACXc,QAAQ,EAAEpB,KAAK,CAACqB,UAAU,CAACD,QAAQ,CAAC5B,UAAU,CAACI,SAAS,CAAC,CAACwB,QAAQ;MAClEE,UAAU,EAAEtB,KAAK,CAACqB,UAAU,CAACC,UAAU,CAAC9B,UAAU,CAACK,WAAW;IAChE,CAAC;IACD0B,YAAY,EAAE;MACZnB,KAAK,EAAEE,IAAI;MACXc,QAAQ,EAAEpB,KAAK,CAACqB,UAAU,CAACD,QAAQ,CAAC5B,UAAU,CAACM,WAAW,CAAC,CAACsB;IAC9D;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["resolveStatusVariantColors","CANONICAL_TAP_TARGET","ALERT_CLOSE_TAP_TARGET","ALERT_SPEC","padding","gap","radius","titleFont","titleWeight","messageFont","resolveAlertStyles","theme","mode","variant","bg","text","containerStyle","backgroundColor","borderRadius","spacing","flexDirection","alignItems","titleStyle","color","fontSize","typography","fontWeight","messageStyle"],"sourceRoot":"../../../src","sources":["components/alert.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA,SAASA,0BAA0B,QAA4B,oBAAoB;AACnF,SAASC,oBAAoB,QAAQ,uBAAuB;;AAE5D;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,GAAGD,oBAAoB;AAE1D,OAAO,MAAME,UAAU,GAAG;EACxBC,OAAO,EAAE,GAAG;EACZC,GAAG,EAAE,GAAG;EACRC,MAAM,EAAE,IAAI;EACZC,SAAS,EAAE,MAAM;EACjBC,WAAW,EAAE,QAAQ;EACrBC,WAAW,EAAE;AACf,CAOC;;AAED;;AAuBA;AACA,OAAO,SAASC,kBAAkBA,CAChCC,KAAkB,EAClBC,IAAe,EACfC,OAAqB,EACR;EACb,MAAM;IAAEC,EAAE;IAAEC;EAAK,CAAC,GAAGf,0BAA0B,CAACW,KAAK,EAAEC,IAAI,EAAEC,OAAO,CAAC;EACrE,OAAO;IACLG,cAAc,EAAE;MACdC,eAAe,EAAEH,EAAE;MACnBI,YAAY,EAAEP,KAAK,CAACL,MAAM,CAACH,UAAU,CAACG,MAAM,CAAC;MAC7CF,OAAO,EAAEO,KAAK,CAACQ,OAAO,CAAChB,UAAU,CAACC,OAAO,CAAC;MAC1CgB,aAAa,EAAE,KAAK;MACpBC,UAAU,EAAE,YAAY;MACxBhB,GAAG,EAAEM,KAAK,CAACQ,OAAO,CAAChB,UAAU,CAACE,GAAG;IACnC,CAAC;IACDiB,UAAU,EAAE;MACVC,KAAK,EAAER,IAAI;MACXS,QAAQ,EAAEb,KAAK,CAACc,UAAU,CAACD,QAAQ,CAACrB,UAAU,CAACI,SAAS,CAAC,CAACiB,QAAQ;MAClEE,UAAU,EAAEf,KAAK,CAACc,UAAU,CAACC,UAAU,CAACvB,UAAU,CAACK,WAAW;IAChE,CAAC;IACDmB,YAAY,EAAE;MACZJ,KAAK,EAAER,IAAI;MACXS,QAAQ,EAAEb,KAAK,CAACc,UAAU,CAACD,QAAQ,CAACrB,UAAU,CAACM,WAAW,CAAC,CAACe;IAC9D;EACF,CAAC;AACH","ignoreList":[]}
@@ -9,7 +9,7 @@
9
9
  */
10
10
 
11
11
  /** サイズ軸(contract sizes の height と 1:1。recipe sizes の width/height/dotSize/fontSize に対応)。 */
12
- const SIZE_TABLE = {
12
+ export const AVATAR_SIZE_SPEC = {
13
13
  small: {
14
14
  box: 32,
15
15
  dot: 8,
@@ -30,6 +30,28 @@ const SIZE_TABLE = {
30
30
  /** group の重なり(-spacing.2 相当。負値 token が無いため recipe と同じ literal)。 */
31
31
  export const AVATAR_GROUP_OVERLAP = -8;
32
32
 
33
+ /**
34
+ * initials の文字サイズ倍率の上限(size 別)。
35
+ *
36
+ * Avatar の器は **width = height の円**(recipe sizes の box)で、fontScale で伸びるのは
37
+ * 中身の文字だけ。器は伸びないので、上限を掛けないと OS の文字サイズ拡大で文字が円から
38
+ * はみ出す(円が楕円に見える / 文字が切れる)。
39
+ *
40
+ * 導出は「box ÷ その size が使う fontSize token の lineHeight」を**小数第1位で切り捨て**(安全側):
41
+ * small 32 ÷ 19(xs の lineHeight) = 1.68… → 1.6
42
+ * medium 40 ÷ 26(sm の lineHeight) = 1.53… → 1.5
43
+ * large 48 ÷ 36(base の lineHeight) = 1.33… → 1.3
44
+ *
45
+ * lineHeight(fontSize ではなく)を分母に採るのは、RN が確保する行ボックスの高さが
46
+ * 溢れの実体だから。theme を差し替えても壊れないよう、この導出そのものは
47
+ * avatar-conformance.test.ts が実 theme の値で再検算する。
48
+ */
49
+ export const AVATAR_INITIALS_MAX_FONT_SCALE = {
50
+ small: 1.6,
51
+ medium: 1.5,
52
+ large: 1.3
53
+ };
54
+
33
55
  /**
34
56
  * group variant(avatar.recipe の group.style / group.overlapStyle の 1:1 写像)。
35
57
  * container は横並び、2枚目以降の子に overlap(負 margin)を適用する。
@@ -48,7 +70,7 @@ export function resolveAvatarGroupStyle() {
48
70
  * variant / size → Avatar style の解決(avatar.recipe styleRefs の 1:1 写像)。
49
71
  */
50
72
  export function resolveAvatarStyle(theme, mode, variant, size) {
51
- const s = SIZE_TABLE[size];
73
+ const s = AVATAR_SIZE_SPEC[size];
52
74
  return {
53
75
  container: {
54
76
  width: s.box,
@@ -1 +1 @@
1
- {"version":3,"names":["SIZE_TABLE","small","box","dot","fontSize","medium","large","AVATAR_GROUP_OVERLAP","resolveAvatarGroupStyle","container","flexDirection","overlap","marginLeft","resolveAvatarStyle","theme","mode","variant","size","s","width","height","borderRadius","radius","full","overflow","backgroundColor","color","primary","alignItems","justifyContent","text","fontWeight","typography","borderWidth","borderColor","semantic","resolveAvatarStatusColor","status","success","base","warning"],"sourceRoot":"../../../src","sources":["components/avatar.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA;AACA,MAAMA,UAAU,GAAG;EACjBC,KAAK,EAAE;IAAEC,GAAG,EAAE,EAAE;IAAEC,GAAG,EAAE,CAAC;IAAEC,QAAQ,EAAE;EAAK,CAAC;EAC1CC,MAAM,EAAE;IAAEH,GAAG,EAAE,EAAE;IAAEC,GAAG,EAAE,EAAE;IAAEC,QAAQ,EAAE;EAAK,CAAC;EAC5CE,KAAK,EAAE;IAAEJ,GAAG,EAAE,EAAE;IAAEC,GAAG,EAAE,EAAE;IAAEC,QAAQ,EAAE;EAAO;AAC9C,CAAU;;AAEV;AACA,OAAO,MAAMG,oBAAoB,GAAG,CAAC,CAAC;;AAEtC;AACA;AACA;AACA;AACA,OAAO,SAASC,uBAAuBA,CAAA,EAGrC;EACA,OAAO;IACLC,SAAS,EAAE;MAAEC,aAAa,EAAE;IAAM,CAAC;IACnCC,OAAO,EAAE;MAAEC,UAAU,EAAEL;IAAqB;EAC9C,CAAC;AACH;AAmBA;AACA;AACA;AACA,OAAO,SAASM,kBAAkBA,CAChCC,KAAkB,EAClBC,IAAe,EACfC,OAA6B,EAC7BC,IAAgB,EACG;EACnB,MAAMC,CAAC,GAAGlB,UAAU,CAACiB,IAAI,CAAC;EAC1B,OAAO;IACLR,SAAS,EAAE;MACTU,KAAK,EAAED,CAAC,CAAChB,GAAG;MACZkB,MAAM,EAAEF,CAAC,CAAChB,GAAG;MACbmB,YAAY,EAAEP,KAAK,CAACQ,MAAM,CAACC,IAAI;MAC/B,IAAIP,OAAO,KAAK,OAAO,GACnB;QAAEQ,QAAQ,EAAE;MAAkB,CAAC,GAC/B;QACEC,eAAe,EAAEX,KAAK,CAACY,KAAK,CAACC,OAAO,CAAC,IAAI,CAAC;QAC1CC,UAAU,EAAE,QAAiB;QAC7BC,cAAc,EAAE;MAClB,CAAC;IACP,CAAC;IACDC,IAAI,EAAE;MACJJ,KAAK,EAAEZ,KAAK,CAACY,KAAK,CAACC,OAAO,CAAC,KAAK,CAAC;MACjCI,UAAU,EAAEjB,KAAK,CAACkB,UAAU,CAACD,UAAU,CAAC1B,MAAM;MAC9CD,QAAQ,EAAEU,KAAK,CAACkB,UAAU,CAAC5B,QAAQ,CAACc,CAAC,CAACd,QAAQ,CAAC,CAACA;IAClD,CAAC;IACDD,GAAG,EAAE;MACHgB,KAAK,EAAED,CAAC,CAACf,GAAG;MACZiB,MAAM,EAAEF,CAAC,CAACf,GAAG;MACbkB,YAAY,EAAEP,KAAK,CAACQ,MAAM,CAACC,IAAI;MAC/BU,WAAW,EAAE,CAAC;MACdC,WAAW,EAAEpB,KAAK,CAACY,KAAK,CAACS,QAAQ,CAACpB,IAAI,CAAC,CAAC,YAAY;IACtD;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASqB,wBAAwBA,CACtCtB,KAAkB,EAClBC,IAAe,EACfsB,MAAoB,EACZ;EACR,QAAQA,MAAM;IACZ,KAAK,QAAQ;MACX,OAAOvB,KAAK,CAACY,KAAK,CAACW,MAAM,CAACC,OAAO,CAACC,IAAI;IACxC,KAAK,MAAM;MACT,OAAOzB,KAAK,CAACY,KAAK,CAACW,MAAM,CAACG,OAAO,CAACD,IAAI;IACxC,KAAK,SAAS;MACZ,OAAOzB,KAAK,CAACY,KAAK,CAACS,QAAQ,CAACpB,IAAI,CAAC,CAAC,eAAe,CAAC;EACtD;AACF","ignoreList":[]}
1
+ {"version":3,"names":["AVATAR_SIZE_SPEC","small","box","dot","fontSize","medium","large","AVATAR_GROUP_OVERLAP","AVATAR_INITIALS_MAX_FONT_SCALE","resolveAvatarGroupStyle","container","flexDirection","overlap","marginLeft","resolveAvatarStyle","theme","mode","variant","size","s","width","height","borderRadius","radius","full","overflow","backgroundColor","color","primary","alignItems","justifyContent","text","fontWeight","typography","borderWidth","borderColor","semantic","resolveAvatarStatusColor","status","success","base","warning"],"sourceRoot":"../../../src","sources":["components/avatar.styles.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["isValidElement","CARD_INTERACTIVE","validateCardProps","variant","onPress","primaryAction","Object","prototype","hasOwnProperty","call","String","keys","join","problems","push"],"sourceRoot":"../../../src","sources":["components/card.validate.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,cAAc,QAAQ,OAAO;AAEtC,SAASC,gBAAgB,QAAQ,kBAAe;AAQhD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAAC;EAChCC,OAAO;EACPC,OAAO;EACPC;AACsB,CAAC,EAAY;EACnC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,OAAOF,OAAO,KAAK,QAAQ,EAAE;IAC/B,OAAO,CACL,kCAAkCA,OAAO,KAAK,IAAI,GAAG,MAAM,GAAG,OAAOA,OAAO,IAAI,CACjF;EACH;EACA,IAAI,CAACG,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACR,gBAAgB,EAAEE,OAAO,CAAC,EAAE;IACpE,OAAO,CACL,mBAAmBO,MAAM,CAACP,OAAO,CAAC,WAAW,GAC3C,GAAGG,MAAM,CAACK,IAAI,CAACV,gBAAgB,CAAC,CAACW,IAAI,CAAC,KAAK,CAAC,UAAU,CACzD;EACH;EAEA,IAAI,CAACX,gBAAgB,CAACE,OAAO,CAAC,EAAE;IAC9B,MAAMU,QAAkB,GAAG,EAAE;IAC7B,IAAIT,OAAO,IAAI,IAAI,EAAE;MACnBS,QAAQ,CAACC,IAAI,CAAC,iBAAiBX,OAAO,yCAAyC,CAAC;IAClF;IACA,IAAIE,aAAa,IAAI,IAAI,EAAE;MACzBQ,QAAQ,CAACC,IAAI,CAAC,iBAAiBX,OAAO,+CAA+C,CAAC;IACxF;IACA,OAAOU,QAAQ;EACjB;EAEA,MAAMA,QAAkB,GAAG,EAAE;EAE7B,IAAIT,OAAO,IAAI,IAAI,EAAE;IACnBS,QAAQ,CAACC,IAAI,CACX,iBAAiBX,OAAO,wCAC1B,CAAC;EACH,CAAC,MAAM,IAAI,OAAOC,OAAO,KAAK,UAAU,EAAE;IACxCS,QAAQ,CAACC,IAAI,CAAC,iBAAiBX,OAAO,sBAAsB,OAAOC,OAAO,IAAI,CAAC;EACjF;EAEA,IAAIC,aAAa,IAAI,IAAI,EAAE;IACzBQ,QAAQ,CAACC,IAAI,CACX,iBAAiBX,OAAO,wCAAwC,GAC9D,2CAA2C,GAC3C,qDACJ,CAAC;EACH,CAAC,MAAM,IAAI,eAACH,cAAc,CAACK,aAAa,CAAC,EAAE;IACzCQ,QAAQ,CAACC,IAAI,CACX,iBAAiBX,OAAO,mCAAmC,OAAOE,aAAa,IAAI,GACjF,qBACJ,CAAC;EACH;EAEA,OAAOQ,QAAQ;AACjB","ignoreList":[]}
1
+ {"version":3,"names":["isValidElement","CARD_INTERACTIVE","validateCardProps","variant","onPress","primaryAction","Object","prototype","hasOwnProperty","call","String","keys","join","problems","push"],"sourceRoot":"../../../src","sources":["components/card.validate.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,cAAc,QAAQ,OAAO;AAEtC,SAASC,gBAAgB,QAAQ,kBAAkB;AAQnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAAC;EAChCC,OAAO;EACPC,OAAO;EACPC;AACsB,CAAC,EAAY;EACnC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAI,OAAOF,OAAO,KAAK,QAAQ,EAAE;IAC/B,OAAO,CACL,kCAAkCA,OAAO,KAAK,IAAI,GAAG,MAAM,GAAG,OAAOA,OAAO,IAAI,CACjF;EACH;EACA,IAAI,CAACG,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACR,gBAAgB,EAAEE,OAAO,CAAC,EAAE;IACpE,OAAO,CACL,mBAAmBO,MAAM,CAACP,OAAO,CAAC,WAAW,GAC3C,GAAGG,MAAM,CAACK,IAAI,CAACV,gBAAgB,CAAC,CAACW,IAAI,CAAC,KAAK,CAAC,UAAU,CACzD;EACH;EAEA,IAAI,CAACX,gBAAgB,CAACE,OAAO,CAAC,EAAE;IAC9B,MAAMU,QAAkB,GAAG,EAAE;IAC7B,IAAIT,OAAO,IAAI,IAAI,EAAE;MACnBS,QAAQ,CAACC,IAAI,CAAC,iBAAiBX,OAAO,yCAAyC,CAAC;IAClF;IACA,IAAIE,aAAa,IAAI,IAAI,EAAE;MACzBQ,QAAQ,CAACC,IAAI,CAAC,iBAAiBX,OAAO,+CAA+C,CAAC;IACxF;IACA,OAAOU,QAAQ;EACjB;EAEA,MAAMA,QAAkB,GAAG,EAAE;EAE7B,IAAIT,OAAO,IAAI,IAAI,EAAE;IACnBS,QAAQ,CAACC,IAAI,CACX,iBAAiBX,OAAO,wCAC1B,CAAC;EACH,CAAC,MAAM,IAAI,OAAOC,OAAO,KAAK,UAAU,EAAE;IACxCS,QAAQ,CAACC,IAAI,CAAC,iBAAiBX,OAAO,sBAAsB,OAAOC,OAAO,IAAI,CAAC;EACjF;EAEA,IAAIC,aAAa,IAAI,IAAI,EAAE;IACzBQ,QAAQ,CAACC,IAAI,CACX,iBAAiBX,OAAO,wCAAwC,GAC9D,2CAA2C,GAC3C,qDACJ,CAAC;EACH,CAAC,MAAM,IAAI,eAACH,cAAc,CAACK,aAAa,CAAC,EAAE;IACzCQ,QAAQ,CAACC,IAAI,CACX,iBAAiBX,OAAO,mCAAmC,OAAOE,aAAa,IAAI,GACjF,qBACJ,CAAC;EACH;EAEA,OAAOQ,QAAQ;AACjB","ignoreList":[]}
@@ -11,13 +11,16 @@
11
11
  /**
12
12
  * recipe 由来の literal 値テーブル(token 化されていない数値。conformance が recipe と照合する)。
13
13
  * - box は 20px(web の 16px より大きいのはタッチ前提、recipe description)
14
- * - hitSlop は (44 - box 20) / 2 = 12。行全体 Pressable に足して実タッチ領域 44pt を確保
14
+ * - 実効タップ標的 44pt は行の minHeight で確保(A11Y_MIN_TAP_TARGET_44。規約 10-(b):
15
+ * 背景を持たない行は hitSlop でなく寸法で満たす — 旧実装の四方 hitSlop 12 は行全体
16
+ * Pressable に効くため、縦積みの隣接 Checkbox と当たり判定が最大 24pt 重なっていた
17
+ * (Codex レビュー指摘)。Radio の option 行と同じ手当てに統一)
15
18
  */
16
19
  export const CHECKBOX_SPEC = {
17
20
  boxSize: 20,
18
21
  boxBorderWidth: 2,
19
22
  disabledOpacity: 0.5,
20
- hitSlop: 12
23
+ rowMinHeight: 44
21
24
  };
22
25
 
23
26
  /** 見た目(色)に効く状態入力。disabled は opacity のみで色を変えないため含めない。 */
@@ -1 +1 @@
1
- {"version":3,"names":["CHECKBOX_SPEC","boxSize","boxBorderWidth","disabledOpacity","hitSlop","resolveCheckboxStyle","theme","mode","checked","indeterminate","error","sem","color","semantic","filled","boxStyle","width","height","borderWidth","borderColor","status","danger","base","primary","borderRadius","radius","sm","backgroundColor","labelStyle","fontSize","typography","gap","spacing","markColor"],"sourceRoot":"../../../src","sources":["components/checkbox.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,aAAa,GAAG;EAC3BC,OAAO,EAAE,EAAE;EACXC,cAAc,EAAE,CAAC;EACjBC,eAAe,EAAE,GAAG;EACpBC,OAAO,EAAE;AACX,CAAU;;AAEV;;AA2BA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAClCC,KAAkB,EAClBC,IAAe,EACf;EAAEC,OAAO;EAAEC,aAAa,GAAG,KAAK;EAAEC,KAAK,GAAG;AAA0B,CAAC,EACnD;EAClB,MAAMC,GAAG,GAAGL,KAAK,CAACM,KAAK,CAACC,QAAQ,CAACN,IAAI,CAAC;EACtC,MAAMO,MAAM,GAAGN,OAAO,IAAIC,aAAa;EACvC,OAAO;IACLM,QAAQ,EAAE;MACRC,KAAK,EAAEhB,aAAa,CAACC,OAAO;MAC5BgB,MAAM,EAAEjB,aAAa,CAACC,OAAO;MAC7BiB,WAAW,EAAElB,aAAa,CAACE,cAAc;MACzCiB,WAAW,EAAET,KAAK,GACdJ,KAAK,CAACM,KAAK,CAACQ,MAAM,CAACC,MAAM,CAACC,IAAI,GAC9BR,MAAM,GACJR,KAAK,CAACM,KAAK,CAACW,OAAO,CAAC,KAAK,CAAC,GAC1BZ,GAAG,CAAC,eAAe,CAAC;MAC1Ba,YAAY,EAAElB,KAAK,CAACmB,MAAM,CAACC,EAAE;MAC7BC,eAAe,EAAEb,MAAM,GAAGR,KAAK,CAACM,KAAK,CAACW,OAAO,CAAC,KAAK,CAAC,GAAGZ,GAAG,CAAC,UAAU;IACvE,CAAC;IACDiB,UAAU,EAAE;MACVC,QAAQ,EAAEvB,KAAK,CAACwB,UAAU,CAACD,QAAQ,CAACP,IAAI,CAACO,QAAQ;MACjDjB,KAAK,EAAED,GAAG,CAAC,cAAc;IAC3B,CAAC;IACDoB,GAAG,EAAEzB,KAAK,CAAC0B,OAAO,CAAC,GAAG,CAAC;IACvBC,SAAS,EAAEtB,GAAG,CAAC,gBAAgB;EACjC,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["CHECKBOX_SPEC","boxSize","boxBorderWidth","disabledOpacity","rowMinHeight","resolveCheckboxStyle","theme","mode","checked","indeterminate","error","sem","color","semantic","filled","boxStyle","width","height","borderWidth","borderColor","status","danger","base","primary","borderRadius","radius","sm","backgroundColor","labelStyle","fontSize","typography","gap","spacing","markColor"],"sourceRoot":"../../../src","sources":["components/checkbox.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,aAAa,GAAG;EAC3BC,OAAO,EAAE,EAAE;EACXC,cAAc,EAAE,CAAC;EACjBC,eAAe,EAAE,GAAG;EACpBC,YAAY,EAAE;AAChB,CAAU;;AAEV;;AA2BA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAClCC,KAAkB,EAClBC,IAAe,EACf;EAAEC,OAAO;EAAEC,aAAa,GAAG,KAAK;EAAEC,KAAK,GAAG;AAA0B,CAAC,EACnD;EAClB,MAAMC,GAAG,GAAGL,KAAK,CAACM,KAAK,CAACC,QAAQ,CAACN,IAAI,CAAC;EACtC,MAAMO,MAAM,GAAGN,OAAO,IAAIC,aAAa;EACvC,OAAO;IACLM,QAAQ,EAAE;MACRC,KAAK,EAAEhB,aAAa,CAACC,OAAO;MAC5BgB,MAAM,EAAEjB,aAAa,CAACC,OAAO;MAC7BiB,WAAW,EAAElB,aAAa,CAACE,cAAc;MACzCiB,WAAW,EAAET,KAAK,GACdJ,KAAK,CAACM,KAAK,CAACQ,MAAM,CAACC,MAAM,CAACC,IAAI,GAC9BR,MAAM,GACJR,KAAK,CAACM,KAAK,CAACW,OAAO,CAAC,KAAK,CAAC,GAC1BZ,GAAG,CAAC,eAAe,CAAC;MAC1Ba,YAAY,EAAElB,KAAK,CAACmB,MAAM,CAACC,EAAE;MAC7BC,eAAe,EAAEb,MAAM,GAAGR,KAAK,CAACM,KAAK,CAACW,OAAO,CAAC,KAAK,CAAC,GAAGZ,GAAG,CAAC,UAAU;IACvE,CAAC;IACDiB,UAAU,EAAE;MACVC,QAAQ,EAAEvB,KAAK,CAACwB,UAAU,CAACD,QAAQ,CAACP,IAAI,CAACO,QAAQ;MACjDjB,KAAK,EAAED,GAAG,CAAC,cAAc;IAC3B,CAAC;IACDoB,GAAG,EAAEzB,KAAK,CAAC0B,OAAO,CAAC,GAAG,CAAC;IACvBC,SAAS,EAAEtB,GAAG,CAAC,gBAAgB;EACjC,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["Surface","Image","Card","Skeleton","EmptyState","Screen","Header","Avatar","TextField","Toggle","Checkbox","Radio","Alert","Toast","Progress","Modal","ActionSheet","BottomSheet"],"sourceRoot":"../../../src","sources":["components/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAQ,cAAW;AACnC,SAASC,KAAK,QAAQ,YAAS;AAC/B,SAASC,IAAI,QAAQ,WAAQ;AAC7B,SAASC,QAAQ,QAAQ,eAAY;AACrC,SAASC,UAAU,QAAQ,iBAAc;AACzC,SAASC,MAAM,QAAQ,aAAU;AACjC,SAASC,MAAM,QAAQ,aAAU;AACjC,SAASC,MAAM,QAAQ,aAAU;AACjC,SAASC,SAAS,QAAQ,gBAAa;AACvC,SAASC,MAAM,QAAQ,aAAU;AACjC,SAASC,QAAQ,QAAQ,eAAY;AACrC,SAASC,KAAK,QAAQ,YAAS;AAC/B,SAASC,KAAK,QAAQ,YAAS;AAC/B,SAASC,KAAK,QAAQ,YAAS;AAC/B,SAASC,QAAQ,QAAQ,eAAY;AACrC,SAASC,KAAK,QAAQ,YAAS;AAC/B,SAASC,WAAW,QAAQ,kBAAe;AAC3C,SAASC,WAAW,QAAQ,kBAAe","ignoreList":[]}
1
+ {"version":3,"names":["Surface","Image","Card","Skeleton","EmptyState","Screen","Header","Avatar","TextField","Toggle","Checkbox","Radio","Alert","Toast","Progress","Modal","ActionSheet","BottomSheet"],"sourceRoot":"../../../src","sources":["components/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAQ,cAAc;AACtC,SAASC,KAAK,QAAQ,YAAY;AAClC,SAASC,IAAI,QAAQ,WAAW;AAChC,SAASC,QAAQ,QAAQ,eAAe;AACxC,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,SAASC,MAAM,QAAQ,aAAa;AACpC,SAASC,QAAQ,QAAQ,eAAe;AACxC,SAASC,KAAK,QAAQ,YAAY;AAClC,SAASC,KAAK,QAAQ,YAAY;AAClC,SAASC,KAAK,QAAQ,YAAY;AAClC,SAASC,QAAQ,QAAQ,eAAe;AACxC,SAASC,KAAK,QAAQ,YAAY;AAClC,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,SAASC,WAAW,QAAQ,kBAAkB","ignoreList":[]}
@@ -15,6 +15,15 @@
15
15
  * - sizes はタブレット以上で効く maxWidth(モバイルは width 100% - overlay padding が先に効く)。
16
16
  */
17
17
 
18
+ import { CANONICAL_TAP_TARGET } from "../a11y/tap-target.js";
19
+
20
+ /**
21
+ * title 行の × の当たり判定(正典パターン: 視覚 24pt + hitSlop 10 = 実効 44pt)。
22
+ *
23
+ * 以前は hitSlop=spacing.2(8)だけで、× のグリフ幅(fontSize.xl の "×" ≈ 13pt)+ 8×2 =
24
+ * 実効 29pt しか無かった(Toast / Alert の × は正典パターン済みだったので Modal だけ取り残されていた)。
25
+ */
26
+ export const MODAL_CLOSE_TAP_TARGET = CANONICAL_TAP_TARGET;
18
27
  /** size → panel の maxWidth(modal.recipe sizes の literal と 1:1)。 */
19
28
  export const MODAL_MAX_WIDTH = {
20
29
  small: 384,
@@ -1 +1 @@
1
- {"version":3,"names":["MODAL_MAX_WIDTH","small","medium","large","MODAL_OVERLAY_COLOR","resolveModalStyle","theme","mode","size","semantic","color","overlayStyle","flex","backgroundColor","justifyContent","alignItems","padding","spacing","panelStyle","borderRadius","radius","lg","width","maxWidth","panelElevation","elevation","overlay","titleStyle","fontSize","typography","fontWeight","bold","bodyStyle","marginTop","footerStyle","flexDirection","gap"],"sourceRoot":"../../../src","sources":["components/modal.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA,OAAO,MAAMA,eAA0C,GAAG;EACxDC,KAAK,EAAE,GAAG;EACVC,MAAM,EAAE,GAAG;EACXC,KAAK,EAAE;AACT,CAAC;;AAED;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAG,iBAAiB;AAoCpD;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,KAAkB,EAClBC,IAAe,EACf;EAAEC,IAAI,GAAG;AAA0B,CAAC,GAAG,CAAC,CAAC,EAC7B;EACZ,MAAMC,QAAQ,GAAGH,KAAK,CAACI,KAAK,CAACD,QAAQ,CAACF,IAAI,CAAC;EAC3C,OAAO;IACLI,YAAY,EAAE;MACZC,IAAI,EAAE,CAAC;MACPC,eAAe,EAAET,mBAAmB;MACpCU,cAAc,EAAE,QAAQ;MACxBC,UAAU,EAAE,QAAQ;MACpBC,OAAO,EAAEV,KAAK,CAACW,OAAO,CAAC,GAAG;IAC5B,CAAC;IACDC,UAAU,EAAE;MACVL,eAAe,EAAEJ,QAAQ,CAAC,YAAY,CAAC;MACvCU,YAAY,EAAEb,KAAK,CAACc,MAAM,CAACC,EAAE;MAC7BL,OAAO,EAAEV,KAAK,CAACW,OAAO,CAAC,GAAG,CAAC;MAC3BK,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAEvB,eAAe,CAACQ,IAAI;IAChC,CAAC;IACDgB,cAAc,EAAElB,KAAK,CAACmB,SAAS,CAACC,OAAO;IACvCC,UAAU,EAAE;MACVC,QAAQ,EAAEtB,KAAK,CAACuB,UAAU,CAACD,QAAQ,CAAC,KAAK,CAAC,CAACA,QAAQ;MACnDE,UAAU,EAAExB,KAAK,CAACuB,UAAU,CAACC,UAAU,CAACC,IAAI;MAC5CrB,KAAK,EAAED,QAAQ,CAAC,cAAc;IAChC,CAAC;IACDuB,SAAS,EAAE;MAAEC,SAAS,EAAE3B,KAAK,CAACW,OAAO,CAAC,GAAG;IAAE,CAAC;IAC5CiB,WAAW,EAAE;MACXC,aAAa,EAAE,KAAK;MACpBrB,cAAc,EAAE,UAAU;MAC1BsB,GAAG,EAAE9B,KAAK,CAACW,OAAO,CAAC,GAAG,CAAC;MACvBgB,SAAS,EAAE3B,KAAK,CAACW,OAAO,CAAC,GAAG;IAC9B;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["CANONICAL_TAP_TARGET","MODAL_CLOSE_TAP_TARGET","MODAL_MAX_WIDTH","small","medium","large","MODAL_OVERLAY_COLOR","resolveModalStyle","theme","mode","size","semantic","color","overlayStyle","flex","backgroundColor","justifyContent","alignItems","padding","spacing","panelStyle","borderRadius","radius","lg","width","maxWidth","panelElevation","elevation","overlay","titleStyle","fontSize","typography","fontWeight","bold","bodyStyle","marginTop","footerStyle","flexDirection","gap"],"sourceRoot":"../../../src","sources":["components/modal.styles.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASA,oBAAoB,QAAQ,uBAAuB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,GAAGD,oBAAoB;AAK1D;AACA,OAAO,MAAME,eAA0C,GAAG;EACxDC,KAAK,EAAE,GAAG;EACVC,MAAM,EAAE,GAAG;EACXC,KAAK,EAAE;AACT,CAAC;;AAED;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAG,iBAAiB;AAoCpD;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,KAAkB,EAClBC,IAAe,EACf;EAAEC,IAAI,GAAG;AAA0B,CAAC,GAAG,CAAC,CAAC,EAC7B;EACZ,MAAMC,QAAQ,GAAGH,KAAK,CAACI,KAAK,CAACD,QAAQ,CAACF,IAAI,CAAC;EAC3C,OAAO;IACLI,YAAY,EAAE;MACZC,IAAI,EAAE,CAAC;MACPC,eAAe,EAAET,mBAAmB;MACpCU,cAAc,EAAE,QAAQ;MACxBC,UAAU,EAAE,QAAQ;MACpBC,OAAO,EAAEV,KAAK,CAACW,OAAO,CAAC,GAAG;IAC5B,CAAC;IACDC,UAAU,EAAE;MACVL,eAAe,EAAEJ,QAAQ,CAAC,YAAY,CAAC;MACvCU,YAAY,EAAEb,KAAK,CAACc,MAAM,CAACC,EAAE;MAC7BL,OAAO,EAAEV,KAAK,CAACW,OAAO,CAAC,GAAG,CAAC;MAC3BK,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAEvB,eAAe,CAACQ,IAAI;IAChC,CAAC;IACDgB,cAAc,EAAElB,KAAK,CAACmB,SAAS,CAACC,OAAO;IACvCC,UAAU,EAAE;MACVC,QAAQ,EAAEtB,KAAK,CAACuB,UAAU,CAACD,QAAQ,CAAC,KAAK,CAAC,CAACA,QAAQ;MACnDE,UAAU,EAAExB,KAAK,CAACuB,UAAU,CAACC,UAAU,CAACC,IAAI;MAC5CrB,KAAK,EAAED,QAAQ,CAAC,cAAc;IAChC,CAAC;IACDuB,SAAS,EAAE;MAAEC,SAAS,EAAE3B,KAAK,CAACW,OAAO,CAAC,GAAG;IAAE,CAAC;IAC5CiB,WAAW,EAAE;MACXC,aAAa,EAAE,KAAK;MACpBrB,cAAc,EAAE,UAAU;MAC1BsB,GAAG,EAAE9B,KAAK,CAACW,OAAO,CAAC,GAAG,CAAC;MACvBgB,SAAS,EAAE3B,KAAK,CAACW,OAAO,CAAC,GAAG;IAC9B;EACF,CAAC;AACH","ignoreList":[]}
@@ -13,13 +13,22 @@
13
13
  * 実装ではこの共通部を variant に関わらず同値で返す(conformance が variant 間一致を照合)。
14
14
  */
15
15
 
16
- /** recipe 由来の literal 値テーブル(token 化されていない数値。conformance が recipe と照合する)。 */
16
+ import { MIN_TAP_TARGET } from "../a11y/tap-target.js";
17
+ /**
18
+ * recipe 由来の literal 値テーブル(token 化されていない数値。conformance が recipe と照合する)。
19
+ *
20
+ * `optionMinHeight` だけは recipe 外の a11y 手当て(A11Y_MIN_TAP_TARGET_44)。
21
+ * option 行の視覚高さは label(base)の lineHeight 36pt しかなく 44pt に届かないが、
22
+ * option 行は**背景を持たない**(card-style を除く。card は padding 16×2 で既に 68pt)ので
23
+ * hitSlop ではなく minHeight で下げ止める — 見た目は変わらず、hitSlop の重なりも原理的に起きない。
24
+ */
17
25
  export const RADIO_SPEC = {
18
26
  circleSize: 20,
19
27
  circleBorderWidth: 2,
20
28
  dotSize: 10,
21
29
  cardBorderWidth: 1,
22
- disabledOpacity: 0.5
30
+ disabledOpacity: 0.5,
31
+ optionMinHeight: MIN_TAP_TARGET
23
32
  };
24
33
  /**
25
34
  * variant → グループ全体の style 解決(radio.recipe styleRefs の 1:1 写像)。
@@ -1 +1 @@
1
- {"version":3,"names":["RADIO_SPEC","circleSize","circleBorderWidth","dotSize","cardBorderWidth","disabledOpacity","resolveRadioGroupStyle","theme","mode","variant","sem","color","semantic","containerStyle","flexDirection","flexWrap","gap","spacing","dotStyle","width","height","borderRadius","radius","full","backgroundColor","primary","labelStyle","fontSize","typography","base","groupLabelStyle","sm","fontWeight","medium","marginBottom","optionGap","errorTextStyle","xs","status","danger","textLight","marginTop","cardStyle","borderWidth","borderColor","md","padding","cardSelectedStyle","resolveRadioCircleStyle","selected","error","alignItems","justifyContent"],"sourceRoot":"../../../src","sources":["components/radio.styles.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["MIN_TAP_TARGET","RADIO_SPEC","circleSize","circleBorderWidth","dotSize","cardBorderWidth","disabledOpacity","optionMinHeight","resolveRadioGroupStyle","theme","mode","variant","sem","color","semantic","containerStyle","flexDirection","flexWrap","gap","spacing","dotStyle","width","height","borderRadius","radius","full","backgroundColor","primary","labelStyle","fontSize","typography","base","groupLabelStyle","sm","fontWeight","medium","marginBottom","optionGap","errorTextStyle","xs","status","danger","textLight","marginTop","cardStyle","borderWidth","borderColor","md","padding","cardSelectedStyle","resolveRadioCircleStyle","selected","error","alignItems","justifyContent"],"sourceRoot":"../../../src","sources":["components/radio.styles.ts"],"mappings":"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","ignoreList":[]}
@@ -1,33 +1,84 @@
1
1
  "use strict";
2
2
 
3
3
  /**
4
- * safe-area-registry — Screen が使う SafeAreaView 実装の差し替え点(adapter registry)。
4
+ * safe-area-registry — SafeArea 実装の差し替え点(adapter registry)。
5
5
  *
6
6
  * 本体エントリは依存ゼロ方針(P1)のため、default は RN core の SafeAreaView
7
7
  * (deprecated / iOS のみの最小対応)。react-native-safe-area-context を使う利用者は
8
8
  * subpath "melta-app/safe-area" の enableSafeAreaContext() をアプリ起動時に一度呼ぶと
9
- * Screen の SafeArea が context hook + View adapter に差し替わる(optional peer の前例 =
10
- * Icon × react-native-svg。ただし Screen は本体エントリ所属のため subpath 分離ではなく
11
- * registry で切り替える)。
9
+ * SafeArea が context hook + View adapter に差し替わる(optional peer の前例 =
10
+ * Icon × react-native-svg。ただし Screen / シート系は本体エントリ所属のため subpath 分離
11
+ * ではなく registry で切り替える)。
12
+ *
13
+ * 登録するのは**コンポーネントではなくファクトリ**(edges → コンポーネント)。
14
+ * 消費者ごとに必要な edge が違うため(Screen = 既定 or prop 指定 / ActionSheet・BottomSheet =
15
+ * 下端固定なので bottom + 左右のみ)、edges をグローバル 1 個で持てない。
16
+ *
17
+ * ⚠️ 生成物は edges の正規化キーで memo する。resolveSafeAreaView() は render 中に
18
+ * 呼ばれるので、毎回新しいコンポーネント型を返すと React が別 type とみなして
19
+ * subtree を unmount/remount する(state・入力中のテキストが消える)。
12
20
  *
13
21
  * ⚠️ RN 0.85 は react-native の SafeAreaView プロパティへの getter アクセス時点で
14
22
  * deprecation 警告を出す。adapter 登録済みの利用者に警告を出さないため、core への
15
- * アクセスは「未登録のまま Screen が render された時」まで遅延させる。
23
+ * アクセスは「未登録のまま render された時」まで遅延させる。
16
24
  */
17
25
 
18
26
  import * as ReactNative from "react-native";
19
27
 
20
- /** Screen が SafeArea 実装に要求する最小 props(core / safe-area-context 両対応)。 */
28
+ /**
29
+ * safe-area を適用する辺。react-native-safe-area-context の `Edge` と同値の union を
30
+ * 本体エントリ側に持つ(optional peer を型でも引かないため)。
31
+ */
32
+
33
+ /** 全 edge(未指定時の既定)。正規化の順序定義も兼ねる。 */
34
+ export const ALL_SAFE_AREA_EDGES = ["top", "right", "bottom", "left"];
35
+
36
+ /** 消費者(Screen / シート系)が SafeArea 実装に要求する最小 props(core / safe-area-context 両対応)。 */
37
+
38
+ /** edges を受け取って SafeAreaView 相当を返すファクトリ(正規化済みの edges が渡る)。 */
39
+
40
+ let factory = null;
41
+ let defaultEdges = ALL_SAFE_AREA_EDGES;
42
+ /** 正規化 edges キー → 生成済みコンポーネント(参照安定のための memo)。 */
43
+ const memo = new Map();
21
44
 
22
- let registered = null;
45
+ /** edges を「重複排除 + 固定順」に正規化する(["bottom","left"] と ["left","bottom"] を同一視)。 */
46
+ function normalizeEdges(edges) {
47
+ const requested = new Set(edges);
48
+ return ALL_SAFE_AREA_EDGES.filter(edge => requested.has(edge));
49
+ }
23
50
 
24
- /** SafeArea 実装を登録する(Screen の初回 render より前に呼ぶ)。 */
25
- export function setSafeAreaView(component) {
26
- registered = component;
51
+ /**
52
+ * SafeArea 実装のファクトリを登録する(初回 render より前に呼ぶ)。
53
+ *
54
+ * @param create edges → コンポーネントのファクトリ。同じ edges 集合には同じ参照が返るよう
55
+ * registry 側が memo するので、ファクトリ自体は毎回新規生成でよい。
56
+ * @param edges edges 未指定の消費者(= Screen の既定)に使う edge 集合。default は全 edge。
57
+ */
58
+ export function setSafeAreaView(create, edges = ALL_SAFE_AREA_EDGES) {
59
+ factory = create;
60
+ defaultEdges = normalizeEdges(edges);
61
+ memo.clear(); // 再登録で古い実装が memo に残らないようにする
27
62
  }
28
63
 
29
- /** 登録済み実装、無ければ RN core SafeAreaView(ここで初めて getter に触れる)。 */
30
- export function resolveSafeAreaView() {
31
- return registered ?? ReactNative.SafeAreaView;
64
+ /**
65
+ * edges に対応する SafeArea 実装を返す。同じ edges 集合には常に同じ参照を返す(memo)。
66
+ *
67
+ * @param edges 適用する辺。省略時は登録時の既定 edges(未登録なら全 edge)。
68
+ *
69
+ * ⚠️ 未登録時のフォールバックは RN core の SafeAreaView で、**edges は無視される**
70
+ * (core は「安全域と交差する辺すべて」に padding を入れる仕様で、辺を選べない。
71
+ * さらに Android では `Platform.select` により素の View = 完全 no-op)。
72
+ * edges 指定を実際に効かせたい場合は "melta-app/safe-area" の enableSafeAreaContext() が要る。
73
+ */
74
+ export function resolveSafeAreaView(edges) {
75
+ if (factory == null) return ReactNative.SafeAreaView;
76
+ const normalized = edges == null ? defaultEdges : normalizeEdges(edges);
77
+ const key = normalized.join(",");
78
+ const cached = memo.get(key);
79
+ if (cached != null) return cached;
80
+ const created = factory(normalized);
81
+ memo.set(key, created);
82
+ return created;
32
83
  }
33
84
  //# sourceMappingURL=safe-area-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ReactNative","registered","setSafeAreaView","component","resolveSafeAreaView","SafeAreaView"],"sourceRoot":"../../../src","sources":["components/safe-area-registry.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,KAAKA,WAAW,MAAM,cAAc;;AAE3C;;AASA,IAAIC,UAAmC,GAAG,IAAI;;AAE9C;AACA,OAAO,SAASC,eAAeA,CAACC,SAA2B,EAAQ;EACjEF,UAAU,GAAGE,SAAS;AACxB;;AAEA;AACA,OAAO,SAASC,mBAAmBA,CAAA,EAAqB;EACtD,OAAOH,UAAU,IAAKD,WAAW,CAACK,YAAiC;AACrE","ignoreList":[]}
1
+ {"version":3,"names":["ReactNative","ALL_SAFE_AREA_EDGES","factory","defaultEdges","memo","Map","normalizeEdges","edges","requested","Set","filter","edge","has","setSafeAreaView","create","clear","resolveSafeAreaView","SafeAreaView","normalized","key","join","cached","get","created","set"],"sourceRoot":"../../../src","sources":["components/safe-area-registry.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,KAAKA,WAAW,MAAM,cAAc;;AAE3C;AACA;AACA;AACA;;AAGA;AACA,OAAO,MAAMC,mBAAmB,GAAG,CACjC,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,CACoC;;AAE5C;;AAaA;;AAGA,IAAIC,OAAmC,GAAG,IAAI;AAC9C,IAAIC,YAAqC,GAAGF,mBAAmB;AAC/D;AACA,MAAMG,IAAI,GAAG,IAAIC,GAAG,CAA2B,CAAC;;AAEhD;AACA,SAASC,cAAcA,CAACC,KAA8B,EAA2B;EAC/E,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAeF,KAAK,CAAC;EAC9C,OAAON,mBAAmB,CAACS,MAAM,CAAEC,IAAI,IAAKH,SAAS,CAACI,GAAG,CAACD,IAAI,CAAC,CAAC;AAClE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,eAAeA,CAC7BC,MAA2B,EAC3BP,KAA8B,GAAGN,mBAAmB,EAC9C;EACNC,OAAO,GAAGY,MAAM;EAChBX,YAAY,GAAGG,cAAc,CAACC,KAAK,CAAC;EACpCH,IAAI,CAACW,KAAK,CAAC,CAAC,CAAC,CAAC;AAChB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CAACT,KAA+B,EAAoB;EACrF,IAAIL,OAAO,IAAI,IAAI,EAAE,OAAOF,WAAW,CAACiB,YAAY;EAEpD,MAAMC,UAAU,GAAGX,KAAK,IAAI,IAAI,GAAGJ,YAAY,GAAGG,cAAc,CAACC,KAAK,CAAC;EACvE,MAAMY,GAAG,GAAGD,UAAU,CAACE,IAAI,CAAC,GAAG,CAAC;EAChC,MAAMC,MAAM,GAAGjB,IAAI,CAACkB,GAAG,CAACH,GAAG,CAAC;EAC5B,IAAIE,MAAM,IAAI,IAAI,EAAE,OAAOA,MAAM;EAEjC,MAAME,OAAO,GAAGrB,OAAO,CAACgB,UAAU,CAAC;EACnCd,IAAI,CAACoB,GAAG,CAACL,GAAG,EAAEI,OAAO,CAAC;EACtB,OAAOA,OAAO;AAChB","ignoreList":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * status-colors — status 語彙(info / success / warning / error)→ 面の色(bg / text)の解決。
5
+ *
6
+ * Alert / Toast / TextField が同じ写像を各自に持っていた(Alert と Toast は完全重複、TextField は
7
+ * inline の同型ロジック)。status token の light/dark 切替と「error → token 上は danger」の
8
+ * 読み替えは**一箇所**にしないと、片方だけ直して drift する形になるためここへ集約する。
9
+ *
10
+ * react-native を import しない純粋モジュール(各 *.styles.ts と同じ規約)。
11
+ */
12
+
13
+ /** 契約側の status 語彙。token 側のキーとは error / danger だけ表記が違う。 */
14
+
15
+ /** theme.color.status のキー(token 側の表記)。 */
16
+
17
+ /** 解決結果(subtle な面の背景色と、その上に載る文字色)。 */
18
+
19
+ /** 契約語彙 → token キー(error は token では danger)。 */
20
+ export function toStatusTokenKey(variant) {
21
+ return variant === "error" ? "danger" : variant;
22
+ }
23
+
24
+ /**
25
+ * status token の subtle 面 + text 色を mode で解決する。
26
+ * light は subtleLight / textLight、dark は subtleDark / textDark(recipe description の写像)。
27
+ */
28
+ export function resolveStatusTokenColors(theme, mode, key) {
29
+ const status = theme.color.status[key];
30
+ return mode === "dark" ? {
31
+ bg: status.subtleDark,
32
+ text: status.textDark
33
+ } : {
34
+ bg: status.subtleLight,
35
+ text: status.textLight
36
+ };
37
+ }
38
+
39
+ /**
40
+ * status 語彙 → 面の色。
41
+ * info だけ primary.50 / primary.800 固定(status token に info が無い既知の割り切り、web と同じ。
42
+ * mode 非依存)。それ以外は status token を mode で解決する。
43
+ */
44
+ export function resolveStatusVariantColors(theme, mode, variant) {
45
+ if (variant === "info") {
46
+ return {
47
+ bg: theme.color.primary["50"],
48
+ text: theme.color.primary["800"]
49
+ };
50
+ }
51
+ return resolveStatusTokenColors(theme, mode, toStatusTokenKey(variant));
52
+ }
53
+ //# sourceMappingURL=status-colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["toStatusTokenKey","variant","resolveStatusTokenColors","theme","mode","key","status","color","bg","subtleDark","text","textDark","subtleLight","textLight","resolveStatusVariantColors","primary"],"sourceRoot":"../../../src","sources":["components/status-colors.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;;AAGA;;AAGA;;AAMA;AACA,OAAO,SAASA,gBAAgBA,CAACC,OAAuC,EAAkB;EACxF,OAAOA,OAAO,KAAK,OAAO,GAAG,QAAQ,GAAGA,OAAO;AACjD;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CACtCC,KAAkB,EAClBC,IAAe,EACfC,GAAmB,EACE;EACrB,MAAMC,MAAM,GAAGH,KAAK,CAACI,KAAK,CAACD,MAAM,CAACD,GAAG,CAAC;EACtC,OAAOD,IAAI,KAAK,MAAM,GAClB;IAAEI,EAAE,EAAEF,MAAM,CAACG,UAAU;IAAEC,IAAI,EAAEJ,MAAM,CAACK;EAAS,CAAC,GAChD;IAAEH,EAAE,EAAEF,MAAM,CAACM,WAAW;IAAEF,IAAI,EAAEJ,MAAM,CAACO;EAAU,CAAC;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,0BAA0BA,CACxCX,KAAkB,EAClBC,IAAe,EACfH,OAAsB,EACD;EACrB,IAAIA,OAAO,KAAK,MAAM,EAAE;IACtB,OAAO;MAAEO,EAAE,EAAEL,KAAK,CAACI,KAAK,CAACQ,OAAO,CAAC,IAAI,CAAC;MAAEL,IAAI,EAAEP,KAAK,CAACI,KAAK,CAACQ,OAAO,CAAC,KAAK;IAAE,CAAC;EAC5E;EACA,OAAOb,wBAAwB,CAACC,KAAK,EAAEC,IAAI,EAAEJ,gBAAgB,CAACC,OAAO,CAAC,CAAC;AACzE","ignoreList":[]}
@@ -17,25 +17,30 @@
17
17
  * conformance が recipe states.focus と照合する。
18
18
  */
19
19
 
20
+ import { resolveStatusTokenColors } from "./status-colors.js";
21
+
20
22
  /** 検証状態(textfield.contract の variant 語彙と 1:1)。 */
21
23
 
22
24
  /**
23
- * size → height / 横 padding / 入力文字 fontSize(textfield.recipe sizes と整合)。
24
- * height の literal は recipe の値を直書きし、conformance で recipe と照合する。
25
+ * size → 最小高さ / 横 padding / 入力文字 fontSize(textfield.recipe sizes と整合)。
26
+ * literal は recipe の値を直書きし、conformance で recipe と照合する。
27
+ *
28
+ * `minHeight`(`height` ではない)なのは fontScale 対策。height 固定だと OS の文字サイズ拡大で
29
+ * 入力文字が縦にクリップする(recipe 側も 0.7.0 で `minHeight` に変わっている)。
25
30
  */
26
31
  export const TEXTFIELD_SIZE_SPEC = {
27
32
  small: {
28
- height: 36,
33
+ minHeight: 36,
29
34
  px: "3",
30
35
  font: "sm"
31
36
  },
32
37
  medium: {
33
- height: 42,
38
+ minHeight: 42,
34
39
  px: "3",
35
40
  font: "base"
36
41
  },
37
42
  large: {
38
- height: 48,
43
+ minHeight: 48,
39
44
  px: "3",
40
45
  font: "lg"
41
46
  }
@@ -54,6 +59,8 @@ export function resolveTextFieldStyle(theme, mode, {
54
59
  const c = theme.color;
55
60
  const sem = c.semantic[mode];
56
61
  const spec = TEXTFIELD_SIZE_SPEC[size];
62
+ // status 色(error の面と errorText)は Alert / Toast と同じ写像を使う(status-colors.ts)
63
+ const danger = resolveStatusTokenColors(theme, mode, "danger");
57
64
 
58
65
  // variant → border / bg(recipe variants.*.inputStyle の写像)
59
66
  const colors = (() => {
@@ -66,7 +73,7 @@ export function resolveTextFieldStyle(theme, mode, {
66
73
  case "error":
67
74
  return {
68
75
  borderColor: c.status.danger.base,
69
- backgroundColor: mode === "light" ? c.status.danger.subtleLight : c.status.danger.subtleDark
76
+ backgroundColor: danger.bg
70
77
  };
71
78
  case "success":
72
79
  return {
@@ -82,7 +89,7 @@ export function resolveTextFieldStyle(theme, mode, {
82
89
  })();
83
90
  return {
84
91
  input: {
85
- height: spec.height,
92
+ minHeight: spec.minHeight,
86
93
  paddingHorizontal: theme.spacing[spec.px],
87
94
  fontSize: theme.typography.fontSize[spec.font].fontSize,
88
95
  borderWidth: 1,
@@ -103,7 +110,7 @@ export function resolveTextFieldStyle(theme, mode, {
103
110
  },
104
111
  errorText: {
105
112
  fontSize: theme.typography.fontSize.xs.fontSize,
106
- color: mode === "light" ? c.status.danger.textLight : c.status.danger.textDark,
113
+ color: danger.text,
107
114
  marginTop: theme.spacing["1"]
108
115
  }
109
116
  };
@@ -1 +1 @@
1
- {"version":3,"names":["TEXTFIELD_SIZE_SPEC","small","height","px","font","medium","large","resolveTextFieldStyle","theme","mode","variant","size","c","color","sem","semantic","spec","colors","borderColor","backgroundColor","status","danger","base","subtleLight","subtleDark","success","input","paddingHorizontal","spacing","fontSize","typography","borderWidth","borderRadius","radius","md","label","sm","fontWeight","marginBottom","helperText","xs","marginTop","errorText","textLight","textDark","resolveTextFieldFocusStyle","primary"],"sourceRoot":"../../../src","sources":["components/textfield.styles.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["resolveStatusTokenColors","TEXTFIELD_SIZE_SPEC","small","minHeight","px","font","medium","large","resolveTextFieldStyle","theme","mode","variant","size","c","color","sem","semantic","spec","danger","colors","borderColor","backgroundColor","status","base","bg","success","input","paddingHorizontal","spacing","fontSize","typography","borderWidth","borderRadius","radius","md","label","sm","fontWeight","marginBottom","helperText","xs","marginTop","errorText","text","resolveTextFieldFocusStyle","primary"],"sourceRoot":"../../../src","sources":["components/textfield.styles.ts"],"mappings":"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","ignoreList":[]}
@@ -10,10 +10,15 @@
10
10
  * - Alert と同系の bg subtle + text 色に elevation.sm を重ねる(浮いている通知、recipe description)。
11
11
  * elevation は iOS shadow* + Android elevation の複合 token のため containerStyle と分けて返し、
12
12
  * 呼び出し側が [containerStyle, elevation, style] の順で合成する(Surface と同じ扱い)。
13
- * - dark mode は status.*.subtleDark / textDark 側を解決する。info variant のみ primary 固定
14
- * (dark token が無い既知の割り切り、alert と同じ)。
13
+ * - status 色(mode ごとの subtle / text、info の primary 固定)の解決は status-colors.ts が SSOT
14
+ * (Alert と同じ写像を共有する)。
15
15
  */
16
16
 
17
+ import { resolveStatusVariantColors } from "./status-colors.js";
18
+ import { CANONICAL_TAP_TARGET } from "../a11y/tap-target.js";
19
+
20
+ /** toast.contract の variant 語彙(status 共通語彙と 1:1)。 */
21
+
17
22
  /**
18
23
  * 構成キー(token キー)。component は Text にこのキーをそのまま渡し、resolver は同じキーから
19
24
  * style 値を解決する(component と resolver が別々のキーを持って drift する事故を防ぐ SSOT)。
@@ -28,39 +33,45 @@ export const TOAST_SPEC = {
28
33
  };
29
34
 
30
35
  /**
31
- * slot 構成(toast.recipe 各 variant の containerStyle / messageStyle と 1:1。
32
- * containerStyle 内の elevation 参照だけは複合 token のため別 slot に分離して返す)。
36
+ * 右端に並ぶ 2 つの操作要素(action テキストと × ボタン)の当たり判定。
37
+ *
38
+ * **既存バグの修正**: 以前は両方とも hitSlop 10(全方向)で、両者の間隔は gap = spacing.3 = 12pt
39
+ * しかなかった。左右 10 + 10 = 20pt の当たり判定が 12pt の隙間に食い込み、**20 − 12 = 8pt ぶん
40
+ * 重なって**いた(重なった帯では手前に描画された × が勝つ = action を押したつもりが閉じる)。
41
+ *
42
+ * 規約(AGENTS.md): **横方向の hitSlop は隣接要素との gap の 1/2 を超えない**。
43
+ * gap 12 → 片側 6pt。これで両者の当たり判定はちょうど接し、重ならない。
44
+ * 縦は隣接する操作要素が無いので 10pt を維持する(正典パターンと同じ)。
45
+ *
46
+ * 横を 6 に削ると × の実効幅が 24 + 6×2 = 36pt と 44pt を割るため、**箱の下限を 32pt に広げて**
47
+ * 32 + 6×2 = 44pt を確保する(× は背景を持たないので幅を広げても見た目は変わらない)。
48
+ * action 側はテキスト幅が可変で静的に決められないため、縦のみ 44pt を保証する。
33
49
  */
50
+ export const TOAST_TAP_TARGET = {
51
+ /** action / × 共通の hitSlop(横だけ gap/2 = 6 に絞る)。 */
52
+ hitSlop: {
53
+ top: 10,
54
+ bottom: 10,
55
+ left: 6,
56
+ right: 6
57
+ },
58
+ /** × の箱の幅の下限(横 hitSlop を削ったぶん canonical の 24 から広げる。32 + 6×2 = 44)。 */
59
+ closeMinWidth: 32,
60
+ /** × の箱の高さ下限(正典パターンと同値)。 */
61
+ closeMinHeight: CANONICAL_TAP_TARGET.minHeight
62
+ };
34
63
 
35
64
  /**
36
- * variant → bg / text 色の解決。
37
- * - info: primary.50 / primary.800 固定(mode 非依存)。
38
- * - success / error / warning: status token(error は status キー上は danger)。
39
- * light は subtleLight / textLight、dark は subtleDark / textDark(recipe description の写像)。
65
+ * slot 構成(toast.recipe 各 variant の containerStyle / messageStyle と 1:1。
66
+ * containerStyle 内の elevation 参照だけは複合 token のため別 slot に分離して返す)。
40
67
  */
41
- export function resolveToastColors(theme, mode, variant) {
42
- if (variant === "info") {
43
- return {
44
- bg: theme.color.primary["50"],
45
- text: theme.color.primary["800"]
46
- };
47
- }
48
- const status = theme.color.status[variant === "error" ? "danger" : variant];
49
- return mode === "dark" ? {
50
- bg: status.subtleDark,
51
- text: status.textDark
52
- } : {
53
- bg: status.subtleLight,
54
- text: status.textLight
55
- };
56
- }
57
68
 
58
69
  /** variant → 全 slot の style 解決(toast.recipe styleRefs の 1:1 写像)。 */
59
70
  export function resolveToastStyles(theme, mode, variant) {
60
71
  const {
61
72
  bg,
62
73
  text
63
- } = resolveToastColors(theme, mode, variant);
74
+ } = resolveStatusVariantColors(theme, mode, variant);
64
75
  return {
65
76
  containerStyle: {
66
77
  backgroundColor: bg,