melta-app 0.6.0 → 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 (295) hide show
  1. package/README.md +220 -12
  2. package/docs/architecture.md +11 -4
  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 +13 -5
  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 +2 -2
  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 +6 -7
  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 +14 -1
  94. package/lib/module/theme/define-theme.js.map +1 -1
  95. package/lib/module/theme/index.js +6 -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 +9 -0
  100. package/lib/module/theme/line-height.js.map +1 -1
  101. package/lib/module/theme/native-theme.js +1 -1
  102. package/lib/typescript/src/a11y/tap-target.d.ts +34 -0
  103. package/lib/typescript/src/a11y/tap-target.d.ts.map +1 -0
  104. package/lib/typescript/src/components/ActionSheet.d.ts +8 -1
  105. package/lib/typescript/src/components/ActionSheet.d.ts.map +1 -1
  106. package/lib/typescript/src/components/Alert.d.ts +9 -2
  107. package/lib/typescript/src/components/Alert.d.ts.map +1 -1
  108. package/lib/typescript/src/components/Avatar.d.ts +1 -1
  109. package/lib/typescript/src/components/Avatar.d.ts.map +1 -1
  110. package/lib/typescript/src/components/BottomSheet.d.ts +4 -1
  111. package/lib/typescript/src/components/BottomSheet.d.ts.map +1 -1
  112. package/lib/typescript/src/components/Card.d.ts +2 -2
  113. package/lib/typescript/src/components/Checkbox.d.ts +3 -3
  114. package/lib/typescript/src/components/Checkbox.d.ts.map +1 -1
  115. package/lib/typescript/src/components/Image.d.ts +4 -3
  116. package/lib/typescript/src/components/Image.d.ts.map +1 -1
  117. package/lib/typescript/src/components/Modal.d.ts +9 -3
  118. package/lib/typescript/src/components/Modal.d.ts.map +1 -1
  119. package/lib/typescript/src/components/Progress.d.ts +1 -1
  120. package/lib/typescript/src/components/Progress.d.ts.map +1 -1
  121. package/lib/typescript/src/components/Radio.d.ts +3 -2
  122. package/lib/typescript/src/components/Radio.d.ts.map +1 -1
  123. package/lib/typescript/src/components/Screen.d.ts +28 -5
  124. package/lib/typescript/src/components/Screen.d.ts.map +1 -1
  125. package/lib/typescript/src/components/Skeleton.d.ts +1 -1
  126. package/lib/typescript/src/components/Skeleton.d.ts.map +1 -1
  127. package/lib/typescript/src/components/Surface.d.ts +1 -1
  128. package/lib/typescript/src/components/Surface.d.ts.map +1 -1
  129. package/lib/typescript/src/components/TextField.d.ts +11 -4
  130. package/lib/typescript/src/components/TextField.d.ts.map +1 -1
  131. package/lib/typescript/src/components/Toast.d.ts +10 -3
  132. package/lib/typescript/src/components/Toast.d.ts.map +1 -1
  133. package/lib/typescript/src/components/Toggle.d.ts +3 -2
  134. package/lib/typescript/src/components/Toggle.d.ts.map +1 -1
  135. package/lib/typescript/src/components/action-sheet.styles.d.ts +1 -1
  136. package/lib/typescript/src/components/action-sheet.styles.d.ts.map +1 -1
  137. package/lib/typescript/src/components/alert.styles.d.ts +14 -14
  138. package/lib/typescript/src/components/alert.styles.d.ts.map +1 -1
  139. package/lib/typescript/src/components/avatar.styles.d.ts +36 -1
  140. package/lib/typescript/src/components/avatar.styles.d.ts.map +1 -1
  141. package/lib/typescript/src/components/bottom-sheet.styles.d.ts +1 -1
  142. package/lib/typescript/src/components/bottom-sheet.styles.d.ts.map +1 -1
  143. package/lib/typescript/src/components/card.styles.d.ts +1 -1
  144. package/lib/typescript/src/components/card.styles.d.ts.map +1 -1
  145. package/lib/typescript/src/components/card.validate.d.ts +1 -1
  146. package/lib/typescript/src/components/card.validate.d.ts.map +1 -1
  147. package/lib/typescript/src/components/checkbox.styles.d.ts +6 -3
  148. package/lib/typescript/src/components/checkbox.styles.d.ts.map +1 -1
  149. package/lib/typescript/src/components/empty-state.styles.d.ts +1 -1
  150. package/lib/typescript/src/components/empty-state.styles.d.ts.map +1 -1
  151. package/lib/typescript/src/components/header.styles.d.ts +1 -1
  152. package/lib/typescript/src/components/header.styles.d.ts.map +1 -1
  153. package/lib/typescript/src/components/image.styles.d.ts +1 -1
  154. package/lib/typescript/src/components/image.styles.d.ts.map +1 -1
  155. package/lib/typescript/src/components/index.d.ts +18 -18
  156. package/lib/typescript/src/components/index.d.ts.map +1 -1
  157. package/lib/typescript/src/components/modal.styles.d.ts +13 -2
  158. package/lib/typescript/src/components/modal.styles.d.ts.map +1 -1
  159. package/lib/typescript/src/components/progress.styles.d.ts +1 -1
  160. package/lib/typescript/src/components/progress.styles.d.ts.map +1 -1
  161. package/lib/typescript/src/components/radio.styles.d.ts +10 -2
  162. package/lib/typescript/src/components/radio.styles.d.ts.map +1 -1
  163. package/lib/typescript/src/components/safe-area-registry.d.ts +47 -11
  164. package/lib/typescript/src/components/safe-area-registry.d.ts.map +1 -1
  165. package/lib/typescript/src/components/screen.styles.d.ts +1 -1
  166. package/lib/typescript/src/components/screen.styles.d.ts.map +1 -1
  167. package/lib/typescript/src/components/skeleton.styles.d.ts +1 -1
  168. package/lib/typescript/src/components/skeleton.styles.d.ts.map +1 -1
  169. package/lib/typescript/src/components/status-colors.d.ts +33 -0
  170. package/lib/typescript/src/components/status-colors.d.ts.map +1 -0
  171. package/lib/typescript/src/components/surface.styles.d.ts +1 -1
  172. package/lib/typescript/src/components/surface.styles.d.ts.map +1 -1
  173. package/lib/typescript/src/components/textfield.styles.d.ts +9 -5
  174. package/lib/typescript/src/components/textfield.styles.d.ts.map +1 -1
  175. package/lib/typescript/src/components/toast.styles.d.ts +34 -14
  176. package/lib/typescript/src/components/toast.styles.d.ts.map +1 -1
  177. package/lib/typescript/src/components/toggle.styles.d.ts +17 -1
  178. package/lib/typescript/src/components/toggle.styles.d.ts.map +1 -1
  179. package/lib/typescript/src/icons/Icon.d.ts +12 -6
  180. package/lib/typescript/src/icons/Icon.d.ts.map +1 -1
  181. package/lib/typescript/src/icons/icon.styles.d.ts +14 -2
  182. package/lib/typescript/src/icons/icon.styles.d.ts.map +1 -1
  183. package/lib/typescript/src/icons/index.d.ts +3 -3
  184. package/lib/typescript/src/icons/index.d.ts.map +1 -1
  185. package/lib/typescript/src/index.d.ts +4 -4
  186. package/lib/typescript/src/index.d.ts.map +1 -1
  187. package/lib/typescript/src/primitives/Button.d.ts +8 -4
  188. package/lib/typescript/src/primitives/Button.d.ts.map +1 -1
  189. package/lib/typescript/src/primitives/Metric.d.ts +1 -1
  190. package/lib/typescript/src/primitives/Metric.d.ts.map +1 -1
  191. package/lib/typescript/src/primitives/Row.d.ts +2 -2
  192. package/lib/typescript/src/primitives/Row.d.ts.map +1 -1
  193. package/lib/typescript/src/primitives/Stack.d.ts +2 -2
  194. package/lib/typescript/src/primitives/Stack.d.ts.map +1 -1
  195. package/lib/typescript/src/primitives/Tag.d.ts +2 -2
  196. package/lib/typescript/src/primitives/Tag.d.ts.map +1 -1
  197. package/lib/typescript/src/primitives/Text.d.ts +20 -6
  198. package/lib/typescript/src/primitives/Text.d.ts.map +1 -1
  199. package/lib/typescript/src/primitives/button.styles.d.ts +44 -7
  200. package/lib/typescript/src/primitives/button.styles.d.ts.map +1 -1
  201. package/lib/typescript/src/primitives/index.d.ts +6 -6
  202. package/lib/typescript/src/primitives/index.d.ts.map +1 -1
  203. package/lib/typescript/src/primitives/metric.styles.d.ts +1 -1
  204. package/lib/typescript/src/primitives/metric.styles.d.ts.map +1 -1
  205. package/lib/typescript/src/primitives/row.styles.d.ts +1 -1
  206. package/lib/typescript/src/primitives/row.styles.d.ts.map +1 -1
  207. package/lib/typescript/src/primitives/stack.styles.d.ts +1 -1
  208. package/lib/typescript/src/primitives/stack.styles.d.ts.map +1 -1
  209. package/lib/typescript/src/primitives/tag.styles.d.ts +34 -1
  210. package/lib/typescript/src/primitives/tag.styles.d.ts.map +1 -1
  211. package/lib/typescript/src/primitives/text.styles.d.ts +2 -4
  212. package/lib/typescript/src/primitives/text.styles.d.ts.map +1 -1
  213. package/lib/typescript/src/safe-area/index.d.ts +19 -5
  214. package/lib/typescript/src/safe-area/index.d.ts.map +1 -1
  215. package/lib/typescript/src/theme/ThemeProvider.d.ts +2 -2
  216. package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
  217. package/lib/typescript/src/theme/define-theme.d.ts +15 -2
  218. package/lib/typescript/src/theme/define-theme.d.ts.map +1 -1
  219. package/lib/typescript/src/theme/index.d.ts +14 -14
  220. package/lib/typescript/src/theme/index.d.ts.map +1 -1
  221. package/lib/typescript/src/theme/letter-spacing.d.ts +15 -0
  222. package/lib/typescript/src/theme/letter-spacing.d.ts.map +1 -0
  223. package/lib/typescript/src/theme/line-height.d.ts +10 -0
  224. package/lib/typescript/src/theme/line-height.d.ts.map +1 -1
  225. package/lib/typescript/src/theme/native-theme.d.ts +1 -1
  226. package/lib/typescript/src/theme/native-theme.d.ts.map +1 -1
  227. package/lib/typescript/src/theme/types.d.ts +1 -1
  228. package/package.json +22 -7
  229. package/src/a11y/tap-target.ts +38 -0
  230. package/src/components/ActionSheet.tsx +25 -15
  231. package/src/components/Alert.tsx +37 -10
  232. package/src/components/Avatar.tsx +12 -4
  233. package/src/components/BottomSheet.tsx +16 -13
  234. package/src/components/Card.tsx +9 -8
  235. package/src/components/Checkbox.tsx +12 -9
  236. package/src/components/EmptyState.tsx +7 -6
  237. package/src/components/Header.tsx +4 -4
  238. package/src/components/Image.tsx +9 -7
  239. package/src/components/Modal.tsx +22 -6
  240. package/src/components/Progress.tsx +5 -4
  241. package/src/components/Radio.tsx +11 -6
  242. package/src/components/Screen.tsx +66 -8
  243. package/src/components/Skeleton.tsx +6 -5
  244. package/src/components/Surface.tsx +5 -4
  245. package/src/components/TextField.tsx +25 -7
  246. package/src/components/Toast.tsx +33 -11
  247. package/src/components/Toggle.tsx +15 -6
  248. package/src/components/action-sheet.styles.ts +1 -1
  249. package/src/components/alert.styles.ts +13 -25
  250. package/src/components/avatar.styles.ts +25 -3
  251. package/src/components/bottom-sheet.styles.ts +1 -1
  252. package/src/components/card.styles.ts +1 -1
  253. package/src/components/card.validate.ts +2 -2
  254. package/src/components/checkbox.styles.ts +6 -3
  255. package/src/components/empty-state.styles.ts +1 -1
  256. package/src/components/header.styles.ts +1 -1
  257. package/src/components/image.styles.ts +1 -1
  258. package/src/components/index.ts +18 -18
  259. package/src/components/modal.styles.ts +11 -2
  260. package/src/components/progress.styles.ts +1 -1
  261. package/src/components/radio.styles.ts +11 -2
  262. package/src/components/safe-area-registry.ts +81 -14
  263. package/src/components/screen.styles.ts +1 -1
  264. package/src/components/skeleton.styles.ts +1 -1
  265. package/src/components/status-colors.ts +59 -0
  266. package/src/components/surface.styles.ts +1 -1
  267. package/src/components/textfield.styles.ts +18 -15
  268. package/src/components/toast.styles.ts +32 -25
  269. package/src/components/toggle.styles.ts +21 -1
  270. package/src/icons/Icon.tsx +13 -8
  271. package/src/icons/icon.styles.ts +38 -3
  272. package/src/icons/index.ts +3 -3
  273. package/src/index.ts +4 -4
  274. package/src/primitives/Button.tsx +28 -14
  275. package/src/primitives/Metric.tsx +5 -4
  276. package/src/primitives/Row.tsx +4 -4
  277. package/src/primitives/Stack.tsx +4 -4
  278. package/src/primitives/Tag.tsx +29 -11
  279. package/src/primitives/Text.tsx +28 -11
  280. package/src/primitives/_internal/focus-ring.tsx +1 -1
  281. package/src/primitives/button.styles.ts +63 -10
  282. package/src/primitives/index.ts +6 -6
  283. package/src/primitives/metric.styles.ts +3 -3
  284. package/src/primitives/row.styles.ts +1 -1
  285. package/src/primitives/stack.styles.ts +1 -1
  286. package/src/primitives/tag.styles.ts +43 -4
  287. package/src/primitives/text.styles.ts +7 -12
  288. package/src/safe-area/index.ts +21 -7
  289. package/src/theme/ThemeProvider.tsx +8 -5
  290. package/src/theme/define-theme.ts +15 -2
  291. package/src/theme/index.ts +14 -17
  292. package/src/theme/letter-spacing.ts +17 -0
  293. package/src/theme/line-height.ts +9 -0
  294. package/src/theme/native-theme.ts +2 -2
  295. package/src/theme/types.ts +1 -1
@@ -11,9 +11,10 @@
11
11
  * import { enableSafeAreaContext } from "melta-app/safe-area";
12
12
  * enableSafeAreaContext();
13
13
  *
14
- * これで Screen の SafeArea が useSafeAreaInsets() + View の adapter に切り替わる。
15
- * Provider の context 値を render 中に同期参照して padding を付けるため、native
16
- * SafeAreaView の layout/state 更新を待たず、初回 render から inset が反映される。
14
+ * これで Screen / ActionSheet / BottomSheet の SafeArea が useSafeAreaInsets() + View の
15
+ * adapter に切り替わる。Provider の context 値を render 中に同期参照して padding を付けるため、
16
+ * native SafeAreaView の layout/state 更新を待たず、初回 render から inset が反映される。
17
+ * Android でも効く(RN core の SafeAreaView は Android では完全 no-op)。
17
18
  *
18
19
  * ⚠️ 前提: アプリの root に SafeAreaProvider が必要(無いと useSafeAreaInsets が throw
19
20
  * する)。初回 render から正しい inset を使うには Provider に initialMetrics も渡す。
@@ -35,13 +36,21 @@ import {
35
36
  setSafeAreaView,
36
37
  type SafeAreaViewLike,
37
38
  type SafeAreaViewLikeProps,
38
- } from "../components/safe-area-registry";
39
+ } from "../components/safe-area-registry.js";
39
40
 
40
41
  const ALL_EDGES = ["top", "right", "bottom", "left"] as const satisfies readonly Edge[];
41
42
 
42
43
  /** enableSafeAreaContext() の設定。edges 省略時は従来相当の全 edge。 */
43
44
  export interface EnableSafeAreaContextOptions {
44
- /** Screen に適用する edge。tab bar 等が担当する edge は除外する。 */
45
+ /**
46
+ * **Screen の既定 edge**(`edges` prop を渡さなかった Screen に適用される)。
47
+ * tab bar 等が担当する edge は除外する。
48
+ *
49
+ * ⚠️ 0.5.x までは「アプリ全体で 1 個のグローバル」だったが、edge は消費者ごとに
50
+ * 決まるべきものなので既定値の意味に変わった。ActionSheet / BottomSheet は画面下端に
51
+ * 出る都合上、ここの指定に関わらず自前の edge(bottom + 左右)を使う。
52
+ * 画面ごとに変えたい場合は `<Screen edges={["top"]} />` のように Screen 側で指定する。
53
+ */
45
54
  edges?: readonly Edge[];
46
55
  }
47
56
 
@@ -100,7 +109,12 @@ function createContextSafeAreaView(selectedEdges: readonly Edge[]): SafeAreaView
100
109
  return ContextSafeAreaView;
101
110
  }
102
111
 
103
- /** Screen の SafeArea を context 同期参照の View adapter に切り替える。 */
112
+ /**
113
+ * melta の SafeArea を context 同期参照の View adapter に切り替える。
114
+ *
115
+ * registry には**ファクトリ**を渡す(消費者ごとに edges が違うため)。同じ edges 集合には
116
+ * 同じコンポーネント参照が返るよう memo するのは registry 側の責務。
117
+ */
104
118
  export function enableSafeAreaContext(options: EnableSafeAreaContextOptions = {}): void {
105
- setSafeAreaView(createContextSafeAreaView(options.edges ?? ALL_EDGES));
119
+ setSafeAreaView(createContextSafeAreaView, options.edges ?? ALL_EDGES);
106
120
  }
@@ -14,9 +14,9 @@
14
14
 
15
15
  import { createContext, useContext, useMemo, type ReactNode } from "react";
16
16
  import { useColorScheme } from "react-native";
17
- import { nativeTheme } from "./native-theme";
18
- import { defineTheme, isDev, resolveMode, type ResolvedCapabilities, type ResolvedNativeTheme, type ThemeModeViolation } from "./define-theme";
19
- import type { NativeTheme, SemanticColors, ThemeMode } from "./types";
17
+ import { nativeTheme } from "./native-theme.js";
18
+ import { defineTheme, isDev, resolveMode, type ResolvedCapabilities, type ResolvedNativeTheme, type ThemeModeViolation } from "./define-theme.js";
19
+ import type { NativeTheme, SemanticColors, ThemeMode } from "./types.js";
20
20
 
21
21
  export type { ThemeMode };
22
22
 
@@ -41,8 +41,11 @@ const ThemeContext = createContext<ThemeContextValue | null>(null);
41
41
 
42
42
  /**
43
43
  * 既定 theme。melta-contracts 由来の codegen 結果を注入経路と同じ形に通す(自分でも dogfood する)。
44
- * 副作用として dev では `nativeTheme` の入れ子オブジェクト(トークン群)も freeze される
45
- * — 生成物のトークンを実行時に書き換える経路は元々無いので、意図した副作用として許容する。
44
+ *
45
+ * dev で freeze されるのは **`defineTheme()` の戻り値**(= `useTheme().theme` として配られる
46
+ * 解決済み theme)で、入れ子のトークン群まで再帰的に凍る。公開 export の `nativeTheme` 自体は
47
+ * `defineTheme` 内の `cloneTokenTree` で参照が切り離されているので**凍らない**
48
+ * (0.4.3 で意図的にこう変えた: 凍らせると `{ ...nativeTheme }` からの正当な派生が dev で壊れるため)。
46
49
  */
47
50
  const DEFAULT_THEME: ResolvedNativeTheme = defineTheme({ ...nativeTheme, id: "melta" });
48
51
 
@@ -32,7 +32,7 @@ import type {
32
32
  StatusColors,
33
33
  ThemeColor,
34
34
  ThemeMode,
35
- } from "./types";
35
+ } from "./types.js";
36
36
 
37
37
  // ---------------------------------------------------------------------------
38
38
  // dev 判定
@@ -214,13 +214,19 @@ const FONT_WEIGHT_KEYS = keysOf<Record<FontWeightKey, true>>({
214
214
  * プロパティにも true を返すので、それで判定すると「持っていない mode に置いた番人の getter」を
215
215
  * 値として数えてしまい、解決後の theme に対して常に light / dark 両方を返す(0.4.0 の不具合)。
216
216
  * 入力(素のデータプロパティ)と解決後(番人つき)のどちらに対しても正しく答える必要がある。
217
+ *
218
+ * @experimental 公開しているが安定 API ではない。挙動・シグネチャは予告なく変わりうる。
217
219
  */
218
220
  export function declaredModes(semantic: Partial<Record<ThemeMode, SemanticColors>>): ThemeMode[] {
219
221
  const withValue = new Set(Object.keys(semantic));
220
222
  return MODES.filter((mode) => withValue.has(mode));
221
223
  }
222
224
 
223
- /** colorScheme capability を `color.semantic` のキー集合から導出する。 */
225
+ /**
226
+ * colorScheme capability を `color.semantic` のキー集合から導出する。
227
+ *
228
+ * @experimental 公開しているが安定 API ではない。挙動・シグネチャは予告なく変わりうる。
229
+ */
224
230
  export function deriveColorScheme(
225
231
  semantic: Partial<Record<ThemeMode, SemanticColors>>,
226
232
  ): ColorSchemeCapability {
@@ -239,6 +245,8 @@ export function deriveColorScheme(
239
245
  * 未知の値は**黙って light-dark 扱いにしない**。TypeScript を使わない消費者や、将来
240
246
  * capability の値が増えたときに、誤った値が「両対応の theme」として通ってしまうと、
241
247
  * 持っていない mode で描画されて初めて壊れる(=原因から遠い場所で落ちる)。
248
+ *
249
+ * @experimental 公開しているが安定 API ではない。挙動・シグネチャは予告なく変わりうる。
242
250
  */
243
251
  export function supportedModes(colorScheme: ColorSchemeCapability): ThemeMode[] {
244
252
  switch (colorScheme) {
@@ -268,6 +276,8 @@ export function supportedModes(colorScheme: ColorSchemeCapability): ThemeMode[]
268
276
  * - **`forcedMode` との不一致は報告する**。宣言同士の矛盾=呼び出し側の間違いなので violation を返す。
269
277
  * ただし throw はしない(clamp して描き続ける)。厳格に落としたいテストや compiler が
270
278
  * violation を error に昇格させる側の責務にする。
279
+ *
280
+ * @experimental 公開しているが安定 API ではない。挙動・シグネチャ・violation の内容は予告なく変わりうる。
271
281
  */
272
282
  export function resolveMode(
273
283
  colorScheme: ColorSchemeCapability,
@@ -504,6 +514,9 @@ function deepFreeze(value: unknown): void {
504
514
  *
505
515
  * dev では validateTheme を1回通し、問題があれば throw する(構造が壊れた theme は
506
516
  * 後段で必ず事故になるので早く落とす)。production では検査ごと省く。
517
+ *
518
+ * dev では**戻り値だけ**が入れ子まで再帰 freeze される。入力オブジェクトと公開 export の
519
+ * `nativeTheme` は `cloneTokenTree` で参照を切ってあるので凍らない(0.4.3 で意図的にこうした)。
507
520
  */
508
521
  export function defineTheme(options: ThemeOptions): ResolvedNativeTheme {
509
522
  if (isDev) {
@@ -4,16 +4,22 @@
4
4
  * 消費者ブランドの theme を注入する口は define-theme.ts(`defineTheme`)。
5
5
  */
6
6
 
7
- export * from "./types";
8
- export { nativeTheme } from "./native-theme";
9
- export { ThemeProvider, useTheme } from "./ThemeProvider";
10
- export type { ThemeContextValue, ThemeMode } from "./ThemeProvider";
11
- export { defineTheme } from "./define-theme";
7
+ export * from "./types.js";
8
+ export { nativeTheme } from "./native-theme.js";
9
+ export { ThemeProvider, useTheme } from "./ThemeProvider.js";
10
+ export type { ThemeContextValue, ThemeMode } from "./ThemeProvider.js";
11
+ export { defineTheme } from "./define-theme.js";
12
12
  export {
13
13
  DEFAULT_MIN_LINE_HEIGHT_RATIO,
14
14
  minLineHeightFor,
15
15
  clampLineHeight,
16
- } from "./line-height";
16
+ } from "./line-height.js";
17
+ /**
18
+ * letterSpacingRatio(em 相当の比率)を適用先の fontSize から letterSpacing(pt) に解決する helper。
19
+ * 実体は pure module(./letter-spacing)。resolver 側は index を経由せず直接 import する
20
+ * (index は ThemeProvider = react-native を引くため)。
21
+ */
22
+ export { resolveLetterSpacing } from "./letter-spacing.js";
17
23
  /**
18
24
  * 以下は theme の解決規則を外から検証・再利用するためのヘルパ。
19
25
  * **@experimental — 安定 API ではない。** 挙動・シグネチャ・メッセージは予告なく変わりうる。
@@ -25,20 +31,11 @@ export {
25
31
  supportedModes,
26
32
  deriveColorScheme,
27
33
  declaredModes,
28
- } from "./define-theme";
34
+ } from "./define-theme.js";
29
35
  export type {
30
36
  ColorSchemeCapability,
31
37
  ResolvedCapabilities,
32
38
  ResolvedNativeTheme,
33
39
  ThemeModeViolation,
34
40
  ThemeOptions,
35
- } from "./define-theme";
36
-
37
- /**
38
- * letterSpacingRatio(em 相当の比率)を、適用先の fontSize から RN の letterSpacing(pt) に解決する。
39
- * 例: resolveLetterSpacing(18, theme.typography.letterSpacingRatio.body)
40
- * theme.typography.letterSpacingRatio.* をそのまま style.letterSpacing に入れる誤用を避けるための helper。
41
- */
42
- export function resolveLetterSpacing(fontSize: number, ratio: number): number {
43
- return fontSize * ratio;
44
- }
41
+ } from "./define-theme.js";
@@ -0,0 +1,17 @@
1
+ /**
2
+ * letter-spacing — letterSpacingRatio(em 相当の比率)→ RN の letterSpacing(pt) の解決。
3
+ *
4
+ * theme/index.ts は ThemeProvider(react-native 依存)を re-export するので、pure style resolver や
5
+ * node テストから index 経由でこの helper を引くと RN を巻き込んでしまう。そのため実体は
6
+ * line-height.ts と同じく **pure module** に置き、index.ts は re-export だけする
7
+ * (公開 API の位置と名前は不変)。以前は index.ts に実体があり、pure 側は同じ式を直書きしていた。
8
+ */
9
+
10
+ /**
11
+ * letterSpacingRatio(em 相当の比率)を、適用先の fontSize から RN の letterSpacing(pt) に解決する。
12
+ * 例: resolveLetterSpacing(18, theme.typography.letterSpacingRatio.body)
13
+ * theme.typography.letterSpacingRatio.* をそのまま style.letterSpacing に入れる誤用を避けるための helper。
14
+ */
15
+ export function resolveLetterSpacing(fontSize: number, ratio: number): number {
16
+ return fontSize * ratio;
17
+ }
@@ -23,6 +23,15 @@
23
23
  */
24
24
  export const DEFAULT_MIN_LINE_HEIGHT_RATIO = 1.45;
25
25
 
26
+ /**
27
+ * theme が宣言する最小行間比を取り出す(未宣言なら既定へ倒す)。
28
+ * `theme.typography.minLineHeightRatio ?? DEFAULT_MIN_LINE_HEIGHT_RATIO` を各 resolver が
29
+ * 写経すると、既定へ倒す規則が一箇所ずつ腐る(片方だけ ?? を落とす等)ためここに集約する。
30
+ */
31
+ export function minRatioOf(theme: { typography: { minLineHeightRatio?: number } }): number {
32
+ return theme.typography.minLineHeightRatio ?? DEFAULT_MIN_LINE_HEIGHT_RATIO;
33
+ }
34
+
26
35
  /**
27
36
  * fontSize に対する安全な最小 lineHeight(px)。
28
37
  * **切り上げ**であることが要点: 四捨五入だと 32 × 1.45 = 46.4 → 46 で下限を割る。
@@ -2,7 +2,7 @@
2
2
  // 生成元: scripts/generate-native-theme.ts(入力 melta-contracts tokens.json)
3
3
  // tokens version: 1.0.0
4
4
 
5
- import type { NativeTheme } from "./types";
5
+ import type { NativeTheme } from "./types.js";
6
6
 
7
7
  export const nativeTheme: NativeTheme = {
8
8
  "color": {
@@ -38,7 +38,7 @@ export const nativeTheme: NativeTheme = {
38
38
  },
39
39
  "dark": {
40
40
  "bg-page": "#0f172a",
41
- "bg-page-alt": "#1e293b",
41
+ "bg-page-alt": "#334155",
42
42
  "bg-surface": "#1e293b",
43
43
  "bg-surface-alt": "#0f172a",
44
44
  "text-heading": "#f1f5f9",
@@ -77,7 +77,7 @@ export interface ThemeTypography {
77
77
  /**
78
78
  * 初期は system default(未指定 = OS デフォルトフォント)。RN の fontFamily は string 一本で
79
79
  * web の fallback 配列のようには効かず、Inter 等を焼くと expo-font でのロード必須になり実機で崩れる。
80
- * Inter / JetBrains Mono の embed は expo-font 導入後に generator へ font マップを渡す Phase 2。
80
+ * Inter / JetBrains Mono の embed は expo-font を導入し、generator へ font マップを渡す形になる(未着手)。
81
81
  * それまでは sans/mono とも未指定(= OS の sans / monospace)にする。
82
82
  */
83
83
  fontFamily: { sans?: string; mono?: string };