@lt-three/love3 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/README.md +40 -40
  2. package/dist/native/analytics/animation.d.ts +1 -1
  3. package/dist/native/analytics/animation.js +1 -1
  4. package/dist/native/analytics/chart.types.d.ts +3 -3
  5. package/dist/native/analytics/metric-card.d.ts +3 -3
  6. package/dist/native/analytics/metric-card.js +3 -3
  7. package/dist/native/analytics/multi-line-chart.d.ts +9 -8
  8. package/dist/native/analytics/multi-line-chart.js +14 -13
  9. package/dist/native/analytics/pie-chart.d.ts +7 -7
  10. package/dist/native/analytics/pie-chart.js +8 -8
  11. package/dist/native/analytics/single-number.d.ts +4 -4
  12. package/dist/native/analytics/single-number.js +2 -2
  13. package/dist/native/atom/avatar.d.ts +6 -6
  14. package/dist/native/atom/avatar.js +2 -2
  15. package/dist/native/atom/badge.d.ts +5 -5
  16. package/dist/native/atom/button.d.ts +12 -12
  17. package/dist/native/atom/button.js +8 -8
  18. package/dist/native/atom/checkbox.d.ts +4 -4
  19. package/dist/native/atom/checkbox.js +2 -2
  20. package/dist/native/atom/colored-value.d.ts +4 -4
  21. package/dist/native/atom/colored-value.js +4 -4
  22. package/dist/native/atom/image.d.ts +7 -7
  23. package/dist/native/atom/image.js +2 -2
  24. package/dist/native/atom/label.d.ts +5 -5
  25. package/dist/native/atom/label.js +2 -2
  26. package/dist/native/atom/link.d.ts +5 -5
  27. package/dist/native/atom/link.js +5 -5
  28. package/dist/native/atom/readout.d.ts +7 -7
  29. package/dist/native/atom/readout.js +3 -3
  30. package/dist/native/atom/search-input.d.ts +2 -2
  31. package/dist/native/atom/search-input.js +2 -2
  32. package/dist/native/atom/select.d.ts +14 -14
  33. package/dist/native/atom/select.js +8 -8
  34. package/dist/native/atom/separator.d.ts +2 -3
  35. package/dist/native/atom/separator.js +2 -3
  36. package/dist/native/atom/skeleton.d.ts +3 -3
  37. package/dist/native/atom/skeleton.js +3 -3
  38. package/dist/native/atom/slider.d.ts +6 -6
  39. package/dist/native/atom/slider.js +3 -3
  40. package/dist/native/atom/spinner.d.ts +4 -4
  41. package/dist/native/atom/spinner.js +2 -2
  42. package/dist/native/atom/switch.d.ts +4 -4
  43. package/dist/native/atom/switch.js +3 -3
  44. package/dist/native/atom/symbol.d.ts +7 -7
  45. package/dist/native/atom/symbol.js +7 -7
  46. package/dist/native/atom/symbol.types.d.ts +8 -8
  47. package/dist/native/atom/symbol.types.js +7 -7
  48. package/dist/native/atom/text-field.d.ts +15 -15
  49. package/dist/native/atom/text-field.js +5 -5
  50. package/dist/native/atom/theme-toggle.d.ts +7 -7
  51. package/dist/native/atom/theme-toggle.js +4 -4
  52. package/dist/native/atom/timezone-select.d.ts +5 -5
  53. package/dist/native/atom/timezone-select.js +4 -4
  54. package/dist/native/atom/typography.d.ts +2 -2
  55. package/dist/native/atom/typography.js +2 -2
  56. package/dist/native/base/button.d.ts +13 -13
  57. package/dist/native/base/button.js +4 -4
  58. package/dist/native/base/form.d.ts +15 -15
  59. package/dist/native/base/form.js +11 -11
  60. package/dist/native/base/glass-card.d.ts +3 -3
  61. package/dist/native/base/glass-card.js +3 -3
  62. package/dist/native/base/input.d.ts +8 -8
  63. package/dist/native/base/input.js +7 -7
  64. package/dist/native/base/sheet.d.ts +27 -27
  65. package/dist/native/base/sheet.js +15 -15
  66. package/dist/native/form/checkbox.d.ts +3 -3
  67. package/dist/native/form/checkbox.js +2 -2
  68. package/dist/native/form/date-picker.d.ts +9 -9
  69. package/dist/native/form/date-picker.js +9 -9
  70. package/dist/native/form/form.d.ts +5 -6
  71. package/dist/native/form/form.js +4 -5
  72. package/dist/native/form/radio-group.d.ts +5 -5
  73. package/dist/native/form/radio-group.js +4 -4
  74. package/dist/native/form/select.d.ts +2 -2
  75. package/dist/native/form/select.js +2 -2
  76. package/dist/native/form/slider.d.ts +2 -2
  77. package/dist/native/form/slider.js +2 -2
  78. package/dist/native/form/switch.d.ts +2 -2
  79. package/dist/native/form/switch.js +2 -2
  80. package/dist/native/form/text-area.d.ts +2 -2
  81. package/dist/native/form/text-area.js +1 -1
  82. package/dist/native/form/text-input.d.ts +5 -5
  83. package/dist/native/form/text-input.js +8 -8
  84. package/dist/native/layout/accordion.d.ts +5 -5
  85. package/dist/native/layout/accordion.js +2 -2
  86. package/dist/native/layout/card.d.ts +8 -8
  87. package/dist/native/layout/card.js +3 -3
  88. package/dist/native/layout/description.d.ts +2 -2
  89. package/dist/native/layout/description.js +2 -2
  90. package/dist/native/layout/error.d.ts +5 -5
  91. package/dist/native/layout/error.js +2 -2
  92. package/dist/native/layout/information.d.ts +4 -4
  93. package/dist/native/layout/information.js +3 -3
  94. package/dist/native/layout/locked.d.ts +15 -15
  95. package/dist/native/layout/locked.js +7 -7
  96. package/dist/native/layout/modal.d.ts +8 -8
  97. package/dist/native/layout/modal.js +5 -5
  98. package/dist/native/layout/not-found.d.ts +4 -4
  99. package/dist/native/layout/not-found.js +3 -3
  100. package/dist/native/layout/page-frame.d.ts +8 -8
  101. package/dist/native/layout/page-frame.js +3 -3
  102. package/dist/native/layout/panel.d.ts +5 -5
  103. package/dist/native/layout/panel.js +5 -5
  104. package/dist/native/layout/reorderable-list.d.ts +14 -14
  105. package/dist/native/layout/reorderable-list.js +10 -10
  106. package/dist/native/layout/sheet.d.ts +10 -10
  107. package/dist/native/layout/sheet.js +4 -4
  108. package/dist/native/layout/simple-dialog.d.ts +3 -3
  109. package/dist/native/layout/simple-dialog.js +2 -2
  110. package/dist/native/layout/simple-table.d.ts +18 -18
  111. package/dist/native/layout/simple-table.js +1 -1
  112. package/dist/native/layout/tab-bar.d.ts +10 -10
  113. package/dist/native/layout/tab-bar.js +4 -4
  114. package/dist/native/layout/tabs.d.ts +6 -6
  115. package/dist/native/layout/tabs.js +4 -4
  116. package/dist/native/layout/tuning-panel.d.ts +10 -10
  117. package/dist/native/layout/tuning-panel.js +15 -15
  118. package/dist/native/lib/autocomplete.d.ts +1 -1
  119. package/dist/native/lib/autocomplete.js +1 -1
  120. package/dist/native/lib/breakpoints.d.ts +3 -3
  121. package/dist/native/lib/breakpoints.js +3 -3
  122. package/dist/native/lib/chart-palette.d.ts +2 -2
  123. package/dist/native/lib/chart-palette.js +2 -2
  124. package/dist/native/lib/confirm.d.ts +15 -16
  125. package/dist/native/lib/confirm.js +9 -10
  126. package/dist/native/lib/control.d.ts +9 -9
  127. package/dist/native/lib/external-store.d.ts +4 -5
  128. package/dist/native/lib/keyboard.d.ts +7 -7
  129. package/dist/native/lib/keyboard.js +7 -7
  130. package/dist/native/lib/labels.d.ts +6 -6
  131. package/dist/native/lib/labels.js +6 -6
  132. package/dist/native/lib/loading.d.ts +3 -3
  133. package/dist/native/lib/loading.js +3 -3
  134. package/dist/native/lib/network.d.ts +5 -6
  135. package/dist/native/lib/network.js +5 -6
  136. package/dist/native/lib/scheme.d.ts +7 -7
  137. package/dist/native/lib/scheme.js +3 -3
  138. package/dist/native/lib/snackbar.d.ts +12 -13
  139. package/dist/native/lib/snackbar.js +7 -8
  140. package/dist/native/lib/theme.d.ts +15 -15
  141. package/dist/native/lib/theme.js +15 -15
  142. package/dist/native/lib/timezone.d.ts +13 -13
  143. package/dist/native/lib/timezone.js +13 -13
  144. package/dist/native/lib/token-color.d.ts +1 -1
  145. package/dist/native/lib/token-color.js +1 -1
  146. package/dist/native/lib/tuning-context.d.ts +2 -2
  147. package/dist/native/lib/tuning.d.ts +10 -10
  148. package/dist/native/lib/tuning.js +8 -8
  149. package/dist/native/lib/typography.d.ts +3 -3
  150. package/dist/native/lib/typography.js +3 -3
  151. package/dist/native/lib/utils.d.ts +3 -3
  152. package/dist/native/lib/utils.js +3 -3
  153. package/dist/native/once/confirm.d.ts +2 -2
  154. package/dist/native/once/confirm.js +2 -2
  155. package/dist/native/once/error-boundary.d.ts +3 -3
  156. package/dist/native/once/error-boundary.js +2 -2
  157. package/dist/native/once/loading-lock.d.ts +3 -3
  158. package/dist/native/once/loading-lock.js +3 -3
  159. package/dist/native/once/offline-banner.d.ts +6 -6
  160. package/dist/native/once/offline-banner.js +5 -5
  161. package/dist/native/once/snackbar.d.ts +7 -7
  162. package/dist/native/once/snackbar.js +5 -5
  163. package/dist/native/styles.css +21 -21
  164. package/dist/shared/analytics.d.ts +23 -23
  165. package/dist/shared/button.d.ts +1 -1
  166. package/dist/shared/form.d.ts +7 -7
  167. package/dist/shared/form.js +2 -2
  168. package/dist/tokens/contrast-pairs.d.ts +9 -9
  169. package/dist/tokens/contrast-pairs.js +10 -10
  170. package/dist/tokens/index.d.ts +1 -1
  171. package/dist/tokens/index.js +1 -1
  172. package/dist/tokens/styles.gen.css +87 -87
  173. package/dist/tokens/tokens.gen.d.ts +2 -2
  174. package/dist/tokens/tokens.gen.js +2 -2
  175. package/dist/tuning/catalog.d.ts +8 -8
  176. package/dist/tuning/catalog.js +9 -9
  177. package/dist/tuning/color.d.ts +4 -4
  178. package/dist/tuning/color.js +5 -5
  179. package/dist/tuning/css.d.ts +13 -13
  180. package/dist/tuning/css.js +17 -17
  181. package/dist/tuning/model.d.ts +11 -11
  182. package/dist/tuning/model.js +11 -11
  183. package/dist/tuning/native.d.ts +18 -18
  184. package/dist/tuning/native.js +18 -18
  185. package/dist/tuning/schema.d.ts +15 -15
  186. package/dist/tuning/schema.js +22 -22
  187. package/dist/tuning/types.d.ts +25 -25
  188. package/dist/tuning/types.js +6 -6
  189. package/dist/web/analytics/line-chart.d.ts +6 -6
  190. package/dist/web/analytics/line-chart.js +3 -3
  191. package/dist/web/analytics/metric-card.d.ts +6 -6
  192. package/dist/web/analytics/metric-card.js +5 -5
  193. package/dist/web/analytics/multi-line-chart.d.ts +23 -23
  194. package/dist/web/analytics/multi-line-chart.js +33 -33
  195. package/dist/web/atom/avatar.d.ts +1 -1
  196. package/dist/web/atom/checkbox.d.ts +6 -6
  197. package/dist/web/atom/checkbox.js +2 -2
  198. package/dist/web/atom/colored-value.d.ts +4 -4
  199. package/dist/web/atom/colored-value.js +4 -4
  200. package/dist/web/atom/help.d.ts +1 -1
  201. package/dist/web/atom/segmented-control.d.ts +13 -14
  202. package/dist/web/atom/segmented-control.js +6 -7
  203. package/dist/web/atom/select.d.ts +7 -7
  204. package/dist/web/atom/select.js +5 -5
  205. package/dist/web/atom/slider.d.ts +3 -3
  206. package/dist/web/atom/slider.js +2 -2
  207. package/dist/web/atom/switch.d.ts +3 -3
  208. package/dist/web/atom/text-area.d.ts +9 -8
  209. package/dist/web/atom/text-area.js +9 -8
  210. package/dist/web/atom/text-field.d.ts +5 -4
  211. package/dist/web/atom/text-field.js +5 -4
  212. package/dist/web/atom/toggle-chip.d.ts +6 -6
  213. package/dist/web/atom/toggle-chip.js +4 -4
  214. package/dist/web/atom/tooltip.d.ts +6 -6
  215. package/dist/web/atom/tooltip.js +2 -2
  216. package/dist/web/base/accordion.js +1 -1
  217. package/dist/web/base/breadcrumb.d.ts +1 -1
  218. package/dist/web/base/breadcrumb.js +1 -1
  219. package/dist/web/base/card.d.ts +3 -3
  220. package/dist/web/base/card.js +2 -2
  221. package/dist/web/base/dialog.d.ts +1 -1
  222. package/dist/web/base/dialog.js +1 -1
  223. package/dist/web/base/form.d.ts +7 -7
  224. package/dist/web/base/form.js +5 -5
  225. package/dist/web/base/pagination.d.ts +5 -5
  226. package/dist/web/base/pagination.js +1 -1
  227. package/dist/web/base/sheet.d.ts +1 -1
  228. package/dist/web/base/sheet.js +1 -1
  229. package/dist/web/base/slider.d.ts +1 -1
  230. package/dist/web/base/sonner.d.ts +2 -2
  231. package/dist/web/base/sonner.js +2 -2
  232. package/dist/web/base/spinner.js +1 -1
  233. package/dist/web/form/checkbox.d.ts +8 -8
  234. package/dist/web/form/checkbox.js +3 -3
  235. package/dist/web/form/radio-group.js +3 -3
  236. package/dist/web/form/select.js +1 -1
  237. package/dist/web/form/slider.d.ts +3 -3
  238. package/dist/web/form/slider.js +3 -3
  239. package/dist/web/form/switch.d.ts +3 -3
  240. package/dist/web/form/switch.js +4 -4
  241. package/dist/web/form/text-area.js +1 -1
  242. package/dist/web/form/text-input.d.ts +1 -1
  243. package/dist/web/form/text-input.js +1 -1
  244. package/dist/web/layout/accordion.d.ts +5 -5
  245. package/dist/web/layout/accordion.js +2 -2
  246. package/dist/web/layout/alert-modal.d.ts +11 -11
  247. package/dist/web/layout/alert-modal.js +7 -7
  248. package/dist/web/layout/card.d.ts +1 -1
  249. package/dist/web/layout/information.d.ts +9 -9
  250. package/dist/web/layout/information.js +7 -7
  251. package/dist/web/layout/modal.d.ts +1 -1
  252. package/dist/web/layout/page-frame.d.ts +14 -14
  253. package/dist/web/layout/page-frame.js +7 -7
  254. package/dist/web/layout/scroll-area.d.ts +1 -1
  255. package/dist/web/layout/sheet.d.ts +4 -4
  256. package/dist/web/layout/simple-table.d.ts +18 -18
  257. package/dist/web/layout/simple-table.js +2 -2
  258. package/dist/web/layout/tabs.d.ts +4 -4
  259. package/dist/web/layout/titled-modal.d.ts +10 -11
  260. package/dist/web/layout/titled-modal.js +7 -8
  261. package/dist/web/lib/css-vars.d.ts +6 -6
  262. package/dist/web/lib/css-vars.js +5 -5
  263. package/dist/web/lib/dialog.d.ts +4 -4
  264. package/dist/web/lib/labels.d.ts +8 -8
  265. package/dist/web/lib/labels.js +8 -8
  266. package/dist/web/lib/modal-open-focus.d.ts +7 -7
  267. package/dist/web/lib/modal-open-focus.js +9 -9
  268. package/dist/web/lib/restore-focus.d.ts +4 -4
  269. package/dist/web/lib/restore-focus.js +4 -4
  270. package/dist/web/styles.css +33 -33
  271. package/package.json +2 -2
package/README.md CHANGED
@@ -1,43 +1,43 @@
1
1
  # @lt-three/love3
2
2
 
3
- <3(Less Than Three)共通のデザインシステム。Linear(linear.app)に寄せた、背景の階層・極薄の枠・淡い影・インディゴの主操作。
4
- web(React + Tailwind CSS v4)と React Native(NativeWind v5)で同じ見た目になる。トークン(色・角丸・影・書体)の実値は TS オブジェクトとしても読める。
3
+ The shared design system of <3 (Less Than Three): layered backgrounds, hairline borders, soft shadows, and an indigo primary action.
4
+ It looks the same on web (React + Tailwind CSS v4) and React Native (NativeWind v5). The actual token values (color, radius, shadow, typeface) can also be read as a TS object.
5
5
 
6
- ライセンスは MIT。
6
+ Licensed under MIT.
7
7
 
8
- ## インストール
8
+ ## Installation
9
9
 
10
10
  ```sh
11
11
  npm install @lt-three/love3
12
12
  ```
13
13
 
14
- - **web**: `react` `react-dom`(`>=19.3.0 <20`)と `tailwindcss`(v4)を入れる。web の部品が使う依存(Radix・`@tanstack/charts` など)はこのパッケージの `dependencies` に入っているので、別に入れなくてよい。
15
- - **React Native**: `react` `react-native` `nativewind`(v5)`react-native-css` `tailwindcss` に加えて、使う部品が引く native 側の依存を入れる(`expo`・`expo-router`・`react-native-reanimated`・`react-native-svg` など)。
16
- native 専用の依存は **optional な `peerDependencies`**。使わない部品の依存は入れなくてよい(どの部品がどれを引くかは `package.json` の `peerDependencies` と部品の import を見る)。
14
+ - **web**: install `react` and `react-dom` (`>=19.3.0 <20`) and `tailwindcss` (v4). The dependencies used by the web components (Radix, `@tanstack/charts`, and so on) are in this package's `dependencies`, so you do not need to install them separately.
15
+ - **React Native**: install `react`, `react-native`, `nativewind` (v5), `react-native-css`, and `tailwindcss`, plus the native dependencies pulled in by the components you use (`expo`, `expo-router`, `react-native-reanimated`, `react-native-svg`, and so on).
16
+ Native-only dependencies are **optional `peerDependencies`**. You do not need to install the dependencies of components you do not use (see the `peerDependencies` in `package.json` and the imports of each component to find out which component needs which).
17
17
 
18
- 公開物は `dist/`(ESM の `.js` と `.d.ts`)。ソースと同じ構造で、部品ごとに 1 ファイルずつ出る。使わない部品の依存は引かれない。
18
+ The published files are in `dist/` (ESM `.js` and `.d.ts`). They keep the same structure as the source, one file per component. The dependencies of components you do not use are not pulled in.
19
19
 
20
- ## 使い方
20
+ ## Usage
21
21
 
22
- | import | 中身 |
23
- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
24
- | `@lt-three/love3/styles.css` | Tailwind v4 の `@theme` とライト・ダーク。web と NativeWind で共通 |
25
- | `@lt-three/love3/tokens` | トークンの実値の TS オブジェクト(`tokens.light` / `tokens.dark`)・`cssVar`・型。CSS が使えない RN のチャート・Reanimated 向け。`node:` の組み込みも引かない |
26
- | `@lt-three/love3/tokens/contrast` | コントラストを検査する前景 / 背景の組(`CONTRAST_PAIRS`)と、理由つきの既知の例外(`KNOWN_CONTRAST_EXCEPTIONS`)。データだけ |
27
- | `@lt-three/love3/tuning` | トークンを実行時に上書きする「調整」の形式・検証・適用(`zod` だけを引く) |
28
- | `@lt-three/love3/web` / `@lt-three/love3/native` / `@lt-three/love3/shared` | 各レイヤーの入口(`index.ts`) |
29
- | `@lt-three/love3/web/atom/button.tsx` のように **拡張子つき** | web コンポーネント。`web/*.ts`(hook・util)と `web/*.tsx` |
30
- | `@lt-three/love3/web/styles.css` | web のアプリが CSS の入口で import する。Tailwind・フォント・トークン・ベーススタイル |
31
- | `@lt-three/love3/native/atom/button.tsx` のように **拡張子つき** | native コンポーネント |
32
- | `@lt-three/love3/native/styles.css` | **実機(Metro / NativeWind v5)の CSS の入口**。Tailwind・`nativewind/theme`・トークン・部品のクラスの検出と、`dark:` を `prefers-color-scheme` にする上書き |
33
- | `@lt-three/love3/shared/…`(`.ts` / `.tsx`) | web / native 共通の props 型・variant 定義 |
22
+ | import | contents |
23
+ | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
24
+ | `@lt-three/love3/styles.css` | Tailwind v4 `@theme` with light and dark. Shared by web and NativeWind |
25
+ | `@lt-three/love3/tokens` | The actual token values as a TS object (`tokens.light` / `tokens.dark`), `cssVar`, and types. For RN charts and Reanimated, where CSS is not available. Does not import `node:` built-ins |
26
+ | `@lt-three/love3/tokens/contrast` | The foreground / background pairs checked for contrast (`CONTRAST_PAIRS`) and the known exceptions with reasons (`KNOWN_CONTRAST_EXCEPTIONS`). Data only |
27
+ | `@lt-three/love3/tuning` | The format, validation, and application of "tuning", which overrides tokens at runtime (imports only `zod`) |
28
+ | `@lt-three/love3/web` / `@lt-three/love3/native` / `@lt-three/love3/shared` | The entry point of each layer (`index.ts`) |
29
+ | `@lt-three/love3/web/atom/button.tsx`, **with the extension** | Web components. `web/*.ts` (hooks and utilities) and `web/*.tsx` |
30
+ | `@lt-three/love3/web/styles.css` | Imported by a web app at its CSS entry. Tailwind, fonts, tokens, and base styles |
31
+ | `@lt-three/love3/native/atom/button.tsx`, **with the extension** | Native components |
32
+ | `@lt-three/love3/native/styles.css` | **The CSS entry for real devices (Metro / NativeWind v5)**. Tailwind, `nativewind/theme`, tokens, detection of component classes, and an override that maps `dark:` to `prefers-color-scheme` |
33
+ | `@lt-three/love3/shared/…` (`.ts` / `.tsx`) | Props types and variant definitions shared by web and native |
34
34
 
35
- **ワイルドカードの export は拡張子つきのキー**(`./web/*.tsx` / `./web/*.ts`)。exports は拡張子を探してくれないので、利用側も拡張子つきで import する
36
- (TypeScript では `allowImportingTsExtensions` を有効にする)。拡張子なし(`.../atom/button`)は解決できない。指定子が指す先は `dist/` の `.js` と型宣言の `.d.ts`。
35
+ **Wildcard exports use keys with the file extension** (`./web/*.tsx` / `./web/*.ts`). `exports` does not search for extensions, so consumers import with the extension too
36
+ (enable `allowImportingTsExtensions` in TypeScript). Without the extension (`.../atom/button`) the specifier does not resolve. Specifiers point to the `.js` files and the `.d.ts` type declarations in `dist/`.
37
37
 
38
38
  ### web
39
39
 
40
- CSS の入口で 1 度だけ import する。
40
+ Import it once at your CSS entry.
41
41
 
42
42
  ```css
43
43
  @import "@lt-three/love3/web/styles.css";
@@ -47,41 +47,41 @@ CSS の入口で 1 度だけ import する。
47
47
  import { Button } from "@lt-three/love3/web/atom/button.tsx";
48
48
  ```
49
49
 
50
- 部品が使う Tailwind のクラスは、この CSS の `@source` が `dist/` から拾う。アプリ自身のソースは、バンドラのプロジェクトルートを基準にした Tailwind の自動検出に任せる。
51
- ダークは `<html class="dark">` で切り替える。
50
+ The Tailwind classes used by the components are picked up from `dist/` by `@source` in this CSS. Your own app source is left to Tailwind's automatic detection, based on the bundler's project root.
51
+ Switch to dark with `<html class="dark">`.
52
52
 
53
53
  ### React Native
54
54
 
55
- アプリの `global.css` で 1 度だけ import する(NativeWind v5 / react-native-css が Tailwind v4 としてコンパイルする)。
55
+ Import it once in your app's `global.css` (NativeWind v5 / react-native-css compiles it as Tailwind v4).
56
56
 
57
57
  ```css
58
58
  @import "@lt-three/love3/native/styles.css";
59
59
  ```
60
60
 
61
- native の `dark:` は**クラスではなく OS の配色設定**(`prefers-color-scheme`)で解決する。`.dark` を祖先セレクタに持つと、react-native-css がそのビューを container として扱い、
62
- 子孫の ScrollView が pan を受け取れなくなるため。アプリ内のテーマ設定は `Appearance.setColorScheme()` で切り替える。
61
+ On native, `dark:` is resolved by **the OS color scheme** (`prefers-color-scheme`), not by a class. With `.dark` as an ancestor selector, react-native-css treats that view as a container,
62
+ and a descendant ScrollView can no longer receive pans. Switch the in-app theme with `Appearance.setColorScheme()`.
63
63
 
64
- iOS の SwiftUI Charts を使う部品(`line-chart.ios.tsx` / `pie-chart.ios.tsx`)は、iOS のアプリが拡張子つきで明示して import する。
64
+ The components that use SwiftUI Charts on iOS (`line-chart.ios.tsx` / `pie-chart.ios.tsx`) are imported explicitly, with the extension, by the iOS app.
65
65
 
66
- ### トークン
66
+ ### Tokens
67
67
 
68
68
  ```ts
69
69
  import { cssVar, tokens } from "@lt-three/love3/tokens";
70
70
 
71
- tokens.light["ink-900"]; // 実値("#1b1c20")
71
+ tokens.light["ink-900"]; // the actual value ("#1b1c20")
72
72
  cssVar("ink-900"); // "var(--ink-900)"
73
73
  ```
74
74
 
75
- 変数名は shadcn 互換の名前(`--background` / `--primary` など)に、`--ink-*` / `--line*` / `--lt-three` などの生トークンを足したもの。
75
+ The variable names are shadcn-compatible names (`--background`, `--primary`, and so on) plus raw tokens such as `--ink-*`, `--line*`, and `--lt-three`.
76
76
 
77
- ## 注意: `.theme-light` はセマンティックなクラスを明るくしない
77
+ ## Note: `.theme-light` does not lighten semantic classes
78
78
 
79
- `.theme-light`(ライト固定のスコープ)が再定義するのは**生トークンだけ**(`--ink-*` / `--line*` / `--frame` / `--paper` / `--raised` / `--overlay` / `--wash` / `--scrim` / `--shadow-color` / `--action-ink` / `--state-*` / `--chart-*`)。
80
- `--background` / `--foreground` / `--primary` などのセマンティックな変数は `:root` で `var(--paper)` のように宣言されていて、**宣言した要素で解決されてから子孫へ継承される**。
81
- そのため `<html class="dark">` の下に `.theme-light` を置いても、その子孫で `bg-background` / `text-foreground` / `bg-primary` などは**暗いまま**になる
82
- (`bg-paper` / `text-ink-900` のような生トークンのクラスなら明るくなる)。
83
- love3 の部品は `.theme-light` を使わない。常にライトにしたいページでは、`.theme-light` の中で生トークンのクラスを使うか、`.theme-light` にもセマンティックな変数の再宣言を足す。
79
+ `.theme-light` (a scope that forces light) redefines **only the raw tokens** (`--ink-*` / `--line*` / `--frame` / `--paper` / `--raised` / `--overlay` / `--wash` / `--scrim` / `--shadow-color` / `--action-ink` / `--state-*` / `--chart-*`).
80
+ Semantic variables such as `--background` / `--foreground` / `--primary` are declared on `:root` as `var(--paper)` and the like, and **are resolved on the element that declares them, then inherited by descendants**.
81
+ So even if you put `.theme-light` under `<html class="dark">`, classes such as `bg-background` / `text-foreground` / `bg-primary` **stay dark** in its descendants
82
+ (classes of raw tokens such as `bg-paper` / `text-ink-900` do become light).
83
+ love3 components do not use `.theme-light`. On a page that must always be light, use raw-token classes inside `.theme-light`, or also redeclare the semantic variables in `.theme-light`.
84
84
 
85
- ## ライセンス
85
+ ## License
86
86
 
87
87
  [MIT](./LICENSE)
@@ -1,4 +1,4 @@
1
1
  //#region src/native/analytics/animation.d.ts
2
- /** チャートのアニメーション時間(ms)。web の analytics/animation と同じ値に揃える。 */
2
+ /** Chart animation duration (ms). Kept identical to the web analytics animation. */
3
3
  export declare const animationDuration = 250;
4
4
  //#endregion
@@ -1,5 +1,5 @@
1
1
  //#region src/native/analytics/animation.ts
2
- /** チャートのアニメーション時間(ms)。web の analytics/animation と同じ値に揃える。 */
2
+ /** Chart animation duration (ms). Kept identical to the web analytics animation. */
3
3
  const animationDuration = 250;
4
4
 
5
5
  //#endregion
@@ -9,15 +9,15 @@ export type PieSlice = {
9
9
  type ChartCommonProps = ChartCommonProps$1 & {
10
10
  style?: ViewStyle;
11
11
  /**
12
- * ネイティブチャート非対応プラットフォームで出す文言。
13
- * 共有パッケージなので既定値のみ持ち、翻訳は使用側が渡す。
12
+ * Text shown on platforms without native chart support.
13
+ * This is a shared package, so it only provides a default; consumers pass their own translation.
14
14
  */
15
15
  fallbackText?: string;
16
16
  };
17
17
  export type LineChartProps = ChartCommonProps & LineChartSharedProps;
18
18
  export type PieChartProps = ChartCommonProps & {
19
19
  data: PieSlice[];
20
- /** 中心を空けたドーナツ表示にする。 */
20
+ /** Renders a donut with a hollow center. */
21
21
  donut?: boolean;
22
22
  };
23
23
  export type MultiLineChartProps = ChartCommonProps & MultiLineChartSharedProps;
@@ -2,9 +2,9 @@ import { MetricCardSharedProps } from "../../shared/analytics.js";
2
2
  //#region src/native/analytics/metric-card.d.ts
3
3
  export type MetricCardProps = MetricCardSharedProps;
4
4
  /**
5
- * 面付きの単一指標。`@lt-three/web` の analytics/metric-card に対応する。
6
- * 中身(ラベル + 大型の等幅数値 + 補助)は `atom/readout` が持ち、
7
- * ここは web と同じく Card 外装を着せる役だけを担う。
5
+ * A single metric on a surface. Mirrors the web analytics metric-card.
6
+ * The content (label + large monospaced number + secondary text) lives in `atom/readout`;
7
+ * as on the web, this component only wraps it in the card chrome.
8
8
  */
9
9
  export declare function MetricCard({ label, value, subValue, trend, className }: MetricCardProps): import("react").JSX.Element;
10
10
  //#endregion
@@ -6,9 +6,9 @@ import { jsx } from "react/jsx-runtime";
6
6
 
7
7
  //#region src/native/analytics/metric-card.tsx
8
8
  /**
9
- * 面付きの単一指標。`@lt-three/web` の analytics/metric-card に対応する。
10
- * 中身(ラベル + 大型の等幅数値 + 補助)は `atom/readout` が持ち、
11
- * ここは web と同じく Card 外装を着せる役だけを担う。
9
+ * A single metric on a surface. Mirrors the web analytics metric-card.
10
+ * The content (label + large monospaced number + secondary text) lives in `atom/readout`;
11
+ * as on the web, this component only wraps it in the card chrome.
12
12
  */
13
13
  function MetricCard({ label, value, subValue, trend, className }) {
14
14
  const up = useTokenColor("--state-success");
@@ -1,17 +1,18 @@
1
1
  import { MultiLineChartProps } from "./chart.types.js";
2
2
  //#region src/native/analytics/multi-line-chart.d.ts
3
3
  /**
4
- * 複数系列の折れ線。移植元は `@lt-three/web` の analytics/line-chart(Recharts・複数キー)で、web の love3 では
5
- * `analytics/multi-line-chart`(`@tanstack/charts`)が対応する(props は `shared/analytics.ts` で同じ)。
4
+ * Multi-series line chart. The web counterpart is `analytics/multi-line-chart` (`@tanstack/charts`)
5
+ * (the props are shared via `shared/analytics.ts`).
6
6
  *
7
- * **`@expo/ui` の Chart は 1 系列しか描けない**(型定義にも line/area は single-series と
8
- * 明記されている)ので、同じ軸に 2 本以上載せたいものはこちらを使う。残高とエクイティの
9
- * ように単位も軸も同じ系列を 2 枚のカードに分けると、上下を見比べないと関係が読めない。
7
+ * **The `@expo/ui` Chart can only draw a single series** (its type definitions also state that
8
+ * line/area are single-series), so use this component when two or more series share an axis.
9
+ * Splitting series with the same unit and axis (such as balance and equity) across two cards
10
+ * makes the relationship hard to read without comparing them vertically.
10
11
  *
11
- * 描画は react-native-svg。SwiftUI Charts と違って外枠は描かず、目盛りの罫線だけを敷く
12
- * (使用側が `Panel` で囲うと枠が二重になるため)。
12
+ * Drawing uses react-native-svg. Unlike SwiftUI Charts it draws no outer frame, only the tick lines
13
+ * (a consumer wrapping it in a `Panel` would otherwise get a double border).
13
14
  *
14
- * タップすると、その位置の各系列の値を読み出す。折れ線は目盛りだけだと概形しか読めない。
15
+ * Tapping reads out each series' value at that position, since tick marks alone only convey the rough shape.
15
16
  */
16
17
  export declare function MultiLineChart({ series, height, formatValue, emptyText, style, accessibilityLabel }: MultiLineChartProps): import("react").JSX.Element;
17
18
  //#endregion
@@ -8,17 +8,18 @@ import Svg, { Circle, Line, Path, Text as Text$1 } from "react-native-svg";
8
8
 
9
9
  //#region src/native/analytics/multi-line-chart.tsx
10
10
  /**
11
- * 複数系列の折れ線。移植元は `@lt-three/web` の analytics/line-chart(Recharts・複数キー)で、web の love3 では
12
- * `analytics/multi-line-chart`(`@tanstack/charts`)が対応する(props は `shared/analytics.ts` で同じ)。
11
+ * Multi-series line chart. The web counterpart is `analytics/multi-line-chart` (`@tanstack/charts`)
12
+ * (the props are shared via `shared/analytics.ts`).
13
13
  *
14
- * **`@expo/ui` の Chart は 1 系列しか描けない**(型定義にも line/area は single-series と
15
- * 明記されている)ので、同じ軸に 2 本以上載せたいものはこちらを使う。残高とエクイティの
16
- * ように単位も軸も同じ系列を 2 枚のカードに分けると、上下を見比べないと関係が読めない。
14
+ * **The `@expo/ui` Chart can only draw a single series** (its type definitions also state that
15
+ * line/area are single-series), so use this component when two or more series share an axis.
16
+ * Splitting series with the same unit and axis (such as balance and equity) across two cards
17
+ * makes the relationship hard to read without comparing them vertically.
17
18
  *
18
- * 描画は react-native-svg。SwiftUI Charts と違って外枠は描かず、目盛りの罫線だけを敷く
19
- * (使用側が `Panel` で囲うと枠が二重になるため)。
19
+ * Drawing uses react-native-svg. Unlike SwiftUI Charts it draws no outer frame, only the tick lines
20
+ * (a consumer wrapping it in a `Panel` would otherwise get a double border).
20
21
  *
21
- * タップすると、その位置の各系列の値を読み出す。折れ線は目盛りだけだと概形しか読めない。
22
+ * Tapping reads out each series' value at that position, since tick marks alone only convey the rough shape.
22
23
  */
23
24
  function MultiLineChart({ series, height = 220, formatValue = (value) => String(Math.round(value)), emptyText = "データがありません", style, accessibilityLabel }) {
24
25
  const line = useTokenColor("--line");
@@ -173,9 +174,9 @@ function MultiLineChart({ series, height = 220, formatValue = (value) => String(
173
174
  });
174
175
  }
175
176
  /**
176
- * 押した位置(押した要素の左端からの x)。実機は `locationX`。
177
- * react-native-web の `onPress` は DOM の click を渡す(`locationX` が無い)ので、そのときは要素の左端との差で求める。
178
- * 位置の無い click(キーボード等)は null。
177
+ * The pressed position (x from the left edge of the pressed element). On a device this is `locationX`.
178
+ * react-native-web's `onPress` passes a DOM click (no `locationX`), so in that case it is computed from the difference to the element's left edge.
179
+ * Returns null for a click without a position (keyboard, etc.).
179
180
  */
180
181
  function pressX(event) {
181
182
  const { locationX } = event.nativeEvent;
@@ -185,12 +186,12 @@ function pressX(event) {
185
186
  const target = event.currentTarget;
186
187
  return dom.clientX - target.getBoundingClientRect().left;
187
188
  }
188
- /** 系列を 1 本の SVG パスにする。 */
189
+ /** Turns a series into a single SVG path. */
189
190
  function pathOf(entry, toX, toY) {
190
191
  const count = entry.points.length;
191
192
  return entry.points.map((point, index) => `${index === 0 ? "M" : "L"}${toX(index, count, point.t)},${toY(point.y)}`).join(" ");
192
193
  }
193
- /** 押した x にいちばん近い点を、その描画位置ごと返す。 */
194
+ /** Returns the point nearest to the pressed x, together with its drawn position. */
194
195
  function nearestPoint(entry, pickedX, toX) {
195
196
  const count = entry.points.length;
196
197
  let best;
@@ -1,15 +1,15 @@
1
1
  import { PieChartProps } from "./chart.types.js";
2
2
  //#region src/native/analytics/pie-chart.d.ts
3
3
  /**
4
- * 円グラフ(react-native-svg)。移植元の既定(Android / web)実装。iOS の SwiftUI Charts 版(`pie-chart.ios.tsx`)は
5
- * `@expo/ui` が要るので、placeholder の仕組み(G5)と一緒に足す。足すまでは iOS もこの実装で描く。
4
+ * Pie chart (react-native-svg). The default implementation for Android and web. The iOS SwiftUI Charts version (`pie-chart.ios.tsx`)
5
+ * needs `@expo/ui`, so iOS is drawn with this implementation too unless the app imports that file explicitly.
6
6
  *
7
- * 描画は `multi-line-chart` と同じ react-native-svg。**「iOS のみ」のプレースホルダに
8
- * しない**のは、勝敗比率・ロング / ショート・銘柄内訳がこのコンポーネントだけで出ており、
9
- * Android では画面の主役が丸ごと文言に置き換わってしまうため。
7
+ * Drawing uses the same react-native-svg as `multi-line-chart`. It is **not** an "iOS only"
8
+ * placeholder because a screen's main content can be produced by this component alone,
9
+ * and on Android that content would be replaced entirely by a text message.
10
10
  *
11
- * **凡例はここで持たない。** 使用側(口座のチャート)が色付きの内訳リストを円の下に
12
- * 必ず並べるので、ここで凡例を出すと同じものが 2 段になる。円の高さもそのぶん削れる。
11
+ * **No legend here.** Consumers are expected to list the colored breakdown below the circle,
12
+ * so a legend here would show the same thing twice and eat into the circle's height.
13
13
  */
14
14
  export declare function PieChart({ data, donut, height, style, accessibilityLabel }: PieChartProps): import("react").JSX.Element;
15
15
  //#endregion
@@ -7,15 +7,15 @@ import Svg, { Circle, Path } from "react-native-svg";
7
7
 
8
8
  //#region src/native/analytics/pie-chart.tsx
9
9
  /**
10
- * 円グラフ(react-native-svg)。移植元の既定(Android / web)実装。iOS の SwiftUI Charts 版(`pie-chart.ios.tsx`)は
11
- * `@expo/ui` が要るので、placeholder の仕組み(G5)と一緒に足す。足すまでは iOS もこの実装で描く。
10
+ * Pie chart (react-native-svg). The default implementation for Android and web. The iOS SwiftUI Charts version (`pie-chart.ios.tsx`)
11
+ * needs `@expo/ui`, so iOS is drawn with this implementation too unless the app imports that file explicitly.
12
12
  *
13
- * 描画は `multi-line-chart` と同じ react-native-svg。**「iOS のみ」のプレースホルダに
14
- * しない**のは、勝敗比率・ロング / ショート・銘柄内訳がこのコンポーネントだけで出ており、
15
- * Android では画面の主役が丸ごと文言に置き換わってしまうため。
13
+ * Drawing uses the same react-native-svg as `multi-line-chart`. It is **not** an "iOS only"
14
+ * placeholder because a screen's main content can be produced by this component alone,
15
+ * and on Android that content would be replaced entirely by a text message.
16
16
  *
17
- * **凡例はここで持たない。** 使用側(口座のチャート)が色付きの内訳リストを円の下に
18
- * 必ず並べるので、ここで凡例を出すと同じものが 2 段になる。円の高さもそのぶん削れる。
17
+ * **No legend here.** Consumers are expected to list the colored breakdown below the circle,
18
+ * so a legend here would show the same thing twice and eat into the circle's height.
19
19
  */
20
20
  function PieChart({ data, donut, height = 220, style, accessibilityLabel }) {
21
21
  const palette = useChartPalette();
@@ -57,7 +57,7 @@ function PieChart({ data, donut, height = 220, style, accessibilityLabel }) {
57
57
  })
58
58
  });
59
59
  }
60
- /** 各スライスを SVG のパスにする。12 時から時計回りに並べる(SwiftUI Charts と同じ向き)。 */
60
+ /** Turns each slice into an SVG path. Slices run clockwise from 12 o'clock (the same direction as SwiftUI Charts). */
61
61
  function slicePaths(data, total, radius, inner) {
62
62
  let angle = -Math.PI / 2;
63
63
  return data.map((slice) => {
@@ -4,16 +4,16 @@ export type SingleNumberProps = {
4
4
  subTitle?: string;
5
5
  value: number | null;
6
6
  unit?: string;
7
- /** 比較対象の値。渡すと差分と増減率を併記する。 */
7
+ /** Value to compare against. When given, the difference and the percentage change are shown alongside. */
8
8
  compareValue?: number;
9
9
  compareTitle?: string;
10
- /** 増が悪い指標(コスト等)で色を反転する。 */
10
+ /** Flips the colors for metrics where an increase is bad (cost, etc.). */
11
11
  reverseColor?: boolean;
12
12
  className?: string;
13
13
  };
14
14
  /**
15
- * raised 面(surface 角丸・1px の極薄の罫線)に大きな数値を載せる指標。
16
- * `@lt-three/web` の analytics/single-number に対応する。増減は state の色(面が反転しないので、同じテーマの値でよい)。
15
+ * A metric showing a large number on a raised surface (surface corner radius, 1px hairline border).
16
+ * Mirrors the web analytics single-number. Increase/decrease uses the state colors (the surface does not invert, so the same theme values work).
17
17
  */
18
18
  export declare function SingleNumber({ title, subTitle, value, unit, compareValue, compareTitle, reverseColor, className }: SingleNumberProps): import("react").JSX.Element;
19
19
  //#endregion
@@ -8,8 +8,8 @@ import Feather from "@expo/vector-icons/Feather";
8
8
 
9
9
  //#region src/native/analytics/single-number.tsx
10
10
  /**
11
- * raised 面(surface 角丸・1px の極薄の罫線)に大きな数値を載せる指標。
12
- * `@lt-three/web` の analytics/single-number に対応する。増減は state の色(面が反転しないので、同じテーマの値でよい)。
11
+ * A metric showing a large number on a raised surface (surface corner radius, 1px hairline border).
12
+ * Mirrors the web analytics single-number. Increase/decrease uses the state colors (the surface does not invert, so the same theme values work).
13
13
  */
14
14
  function SingleNumber({ title, subTitle, value, unit, compareValue, compareTitle, reverseColor, className }) {
15
15
  const up = useTokenColor("--state-success");
@@ -2,20 +2,20 @@ import { ReactElement } from "react";
2
2
  //#region src/native/atom/avatar.d.ts
3
3
  export type AvatarProps = {
4
4
  src?: string;
5
- /** 画像の代替テキスト。既定は空(飾り。隣に名前が出ている前提)。名前の無い単独の顔なら、人の名前を渡す(web と同じ) */
5
+ /** Alternative text for the image. Empty by default (decorative; assumes a name is shown next to it). For a standalone face with no name, pass the person's name (same as the web) */
6
6
  alt?: string;
7
7
  /**
8
- * 画像が無い / 失敗したときに出すもの(イニシャル等)。文字列は Text で包む。**省略・空文字は人物アイコン**
9
- * (web は空文字だと何も出さない)。数値は受けない(RN は View の直下の文字を描けない。文字列にして渡す)。
8
+ * What to show when there is no image or loading failed (initials, etc.). A string is wrapped in Text. **Omitted or empty shows a person icon**
9
+ * (the web shows nothing for an empty string). Numbers are not accepted (RN cannot render text directly under a View; pass a string).
10
10
  */
11
11
  fallback?: string | ReactElement;
12
- /** 一辺の px。既定は web の `size-6` と同じ 24。 */
12
+ /** Side length in px. Defaults to 24, the same as the web `size-6`. */
13
13
  size?: number;
14
14
  className?: string;
15
15
  };
16
16
  /**
17
- * `@lt-three/web` の atom/avatar と同じ構成(画像 + フォールバック)。
18
- * web の Avatar と同じ円(`rounded-full`)で描く。
17
+ * Same structure as the web atom/avatar (image + fallback).
18
+ * Drawn as a circle (`rounded-full`), like the web Avatar.
19
19
  */
20
20
  export declare function Avatar({ src, alt, fallback, size, className }: AvatarProps): import("react").JSX.Element;
21
21
  //#endregion
@@ -9,8 +9,8 @@ import { Image } from "expo-image";
9
9
 
10
10
  //#region src/native/atom/avatar.tsx
11
11
  /**
12
- * `@lt-three/web` の atom/avatar と同じ構成(画像 + フォールバック)。
13
- * web の Avatar と同じ円(`rounded-full`)で描く。
12
+ * Same structure as the web atom/avatar (image + fallback).
13
+ * Drawn as a circle (`rounded-full`), like the web Avatar.
14
14
  */
15
15
  function Avatar({ src, alt = "", fallback, size = 24, className }) {
16
16
  const [failed, setFailed] = useState(false);
@@ -9,16 +9,16 @@ export type BadgeProps = {
9
9
  children: ReactNode;
10
10
  variant?: BadgeVariants;
11
11
  /**
12
- * タップ可能にする(フィルタチップ等)。web の Badge には無い native 固有の追加で、
13
- * 見た目は変えずに `hitSlop` で 44pt 相当のタップ領域を確保する。
12
+ * Makes the badge tappable (filter chips, etc.). A native-only addition not present in the web Badge;
13
+ * it keeps the look unchanged and secures a tap area equivalent to 44pt via `hitSlop`.
14
14
  */
15
15
  onPress?: () => void;
16
16
  /**
17
- * 読み上げ・E2E 用の名前。同じ文言のチップが軸をまたいで並ぶとき
18
- * (どの軸の「すべて」なのか)に必ず渡す。
17
+ * Name for screen readers and E2E. Always pass it when chips with the same text appear
18
+ * across different axes (to tell which axis a given "All" belongs to).
19
19
  */
20
20
  accessibilityLabel?: string;
21
- /** 選択中のチップであることを読み上げ・E2E に伝える。 */
21
+ /** Tells screen readers and E2E that this chip is selected. */
22
22
  selected?: boolean;
23
23
  className?: string;
24
24
  textClassName?: string;
@@ -2,17 +2,17 @@ import { ReactNode } from "react";
2
2
  import { VariantProps } from "class-variance-authority";
3
3
  //#region src/native/atom/button.d.ts
4
4
  /**
5
- * `@lt-three/web` の base/button と同じバリアント・同じ見た目(インディゴの主操作・raised 面+薄い枠・control 角丸)を持つボタン。
6
- * 高さだけは、指で押す前提で web より大きい(既定 36)。
5
+ * A button with the same variants and look as the web base/button (indigo primary action, raised surface + faint border, control corner radius).
6
+ * Only the height differs: it is larger than the web's (default 36) because it is pressed with a finger.
7
7
  *
8
- * `base/button`(`@expo/ui`)が OS ネイティブのボタン(iOS 26 の Liquid Glass 等)を出すのに対し、
9
- * こちらは RN の `Pressable` なのでトークンで塗れる。**web と同じ見た目にしたい場所はこちらを使う。**
8
+ * Where `base/button` (`@expo/ui`) renders an OS-native button (iOS 26 Liquid Glass, etc.),
9
+ * this one is an RN `Pressable`, so it can be painted with tokens. **Use this one wherever it should look the same as the web.**
10
10
  *
11
- * web の `hover:` は RN に無いので、押下中の `pressed` に読み替えてある。
11
+ * The web's `hover:` does not exist in RN, so it is mapped to `pressed` while pressed.
12
12
  *
13
- * web の Button は `inline-flex` なので内容幅に縮む。RN の `Pressable` は親の cross axis
14
- * いっぱいに伸びるため `self-start` で同じ挙動にする。画面幅いっぱいの CTA にしたいときは
15
- * 使用側で `className="self-stretch"` を渡す。
13
+ * The web Button is `inline-flex`, so it shrinks to its content. An RN `Pressable` stretches across
14
+ * the parent's cross axis, so `self-start` gives it the same behavior. For a full-width CTA,
15
+ * pass `className="self-stretch"` from the consumer.
16
16
  */
17
17
  declare const buttonVariants: (props?: ({
18
18
  variant?: "<3" | "default" | "destructive" | "ghost" | "link" | "outline" | "plate" | "secondary" | null | undefined;
@@ -28,14 +28,14 @@ export type ButtonProps = ButtonVariants & {
28
28
  onPress?: () => void;
29
29
  disabled?: boolean;
30
30
  /**
31
- * ラベルの左右に置く要素。web は lucide のコンポーネント型を取るが、native は
32
- * `@expo/vector-icons` / `expo-symbols` など描画系がまちまちなので描画済みの要素を受け取る。
31
+ * Elements placed to the left and right of the label. The web takes a lucide component type, but native
32
+ * icon renderers vary (`@expo/vector-icons`, `expo-symbols`, etc.), so it takes already-rendered elements.
33
33
  */
34
34
  iconLeft?: ReactNode;
35
35
  iconRight?: ReactNode;
36
36
  /**
37
- * 読み上げ・E2E 用の名前。**一覧の中で同じ文言のボタンが並ぶとき(行ごとの「削除」等)は
38
- * 必ず渡す。** 付けないと VoiceOver でどの行のボタンか分からず、E2E も掴み分けられない。
37
+ * Name for screen readers and E2E. **Always pass it when buttons with the same text appear in a list
38
+ * (a per-row "Delete", etc.).** Without it VoiceOver cannot tell which row a button belongs to, and E2E cannot target them individually.
39
39
  */
40
40
  accessibilityLabel?: string;
41
41
  className?: string;
@@ -7,17 +7,17 @@ import { cva } from "class-variance-authority";
7
7
 
8
8
  //#region src/native/atom/button.tsx
9
9
  /**
10
- * `@lt-three/web` の base/button と同じバリアント・同じ見た目(インディゴの主操作・raised 面+薄い枠・control 角丸)を持つボタン。
11
- * 高さだけは、指で押す前提で web より大きい(既定 36)。
10
+ * A button with the same variants and look as the web base/button (indigo primary action, raised surface + faint border, control corner radius).
11
+ * Only the height differs: it is larger than the web's (default 36) because it is pressed with a finger.
12
12
  *
13
- * `base/button`(`@expo/ui`)が OS ネイティブのボタン(iOS 26 の Liquid Glass 等)を出すのに対し、
14
- * こちらは RN の `Pressable` なのでトークンで塗れる。**web と同じ見た目にしたい場所はこちらを使う。**
13
+ * Where `base/button` (`@expo/ui`) renders an OS-native button (iOS 26 Liquid Glass, etc.),
14
+ * this one is an RN `Pressable`, so it can be painted with tokens. **Use this one wherever it should look the same as the web.**
15
15
  *
16
- * web の `hover:` は RN に無いので、押下中の `pressed` に読み替えてある。
16
+ * The web's `hover:` does not exist in RN, so it is mapped to `pressed` while pressed.
17
17
  *
18
- * web の Button は `inline-flex` なので内容幅に縮む。RN の `Pressable` は親の cross axis
19
- * いっぱいに伸びるため `self-start` で同じ挙動にする。画面幅いっぱいの CTA にしたいときは
20
- * 使用側で `className="self-stretch"` を渡す。
18
+ * The web Button is `inline-flex`, so it shrinks to its content. An RN `Pressable` stretches across
19
+ * the parent's cross axis, so `self-start` gives it the same behavior. For a full-width CTA,
20
+ * pass `className="self-stretch"` from the consumer.
21
21
  */
22
22
  const buttonVariants = cva("flex-row items-center justify-center gap-2 self-start rounded-control border border-transparent", {
23
23
  variants: {
@@ -4,9 +4,9 @@ import { ReactNode } from "react";
4
4
  export type CheckboxProps = NamedControlA11yProps & {
5
5
  checked: boolean;
6
6
  onCheckedChange: (checked: boolean) => void;
7
- /** チェックボックスの右に表示するラベル。タップ領域に含まれる。 */
7
+ /** Label shown to the right of the checkbox. It is part of the tap area. */
8
8
  label?: ReactNode;
9
- /** 読み上げ名。ラベルが文字列ならそれを使うので、ラベルが無い・文字列でないときに渡す。 */
9
+ /** Name for screen readers. A string label is used as-is, so pass this when there is no label or it is not a string. */
10
10
  accessibilityLabel?: string;
11
11
  disabled?: boolean;
12
12
  invalid?: boolean;
@@ -14,8 +14,8 @@ export type CheckboxProps = NamedControlA11yProps & {
14
14
  wrapperClassName?: string;
15
15
  };
16
16
  /**
17
- * `@lt-three/web` の base/checkbox と同じ 16px の control 角丸の四角。
18
- * 未選択は raised 面 + line-control の枠(3:1)、チェック時はインディゴ塗り + 白のチェック。
17
+ * A 16px square with the control corner radius, identical to the web base/checkbox.
18
+ * Unchecked is a raised surface + a line-control border (3:1); checked is an indigo fill + a white check.
19
19
  */
20
20
  export declare function Checkbox({ checked, onCheckedChange, label, accessibilityLabel, disabled, invalid, className, wrapperClassName, accessibilityHint, id, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid }: CheckboxProps): import("react").JSX.Element;
21
21
  //#endregion
@@ -8,8 +8,8 @@ import Feather from "@expo/vector-icons/Feather";
8
8
 
9
9
  //#region src/native/atom/checkbox.tsx
10
10
  /**
11
- * `@lt-three/web` の base/checkbox と同じ 16px の control 角丸の四角。
12
- * 未選択は raised 面 + line-control の枠(3:1)、チェック時はインディゴ塗り + 白のチェック。
11
+ * A 16px square with the control corner radius, identical to the web base/checkbox.
12
+ * Unchecked is a raised surface + a line-control border (3:1); checked is an indigo fill + a white check.
13
13
  */
14
14
  function Checkbox({ checked, onCheckedChange, label, accessibilityLabel, disabled, invalid, className, wrapperClassName, accessibilityHint, id, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid }) {
15
15
  const isInvalid = invalid ?? ariaInvalid;
@@ -3,10 +3,10 @@ import { ReactNode } from "react";
3
3
  //#region src/native/atom/colored-value.d.ts
4
4
  export type ColoredValueProps<TValue> = ColoredValueSharedProps<TValue>;
5
5
  /**
6
- * 符号で色が変わる数値。web の atom/colored-value(love3)と同じ API(`shared/analytics.ts`)。
7
- * 既定色は Tailwind の固定パレット(green-500 / red-500)でなく、トークンの `state-success` / `state-error`
8
- * (ダークでも 4.5:1 を保つ)。
9
- * 数値なので等幅(タブラー)で描く。
6
+ * A number whose color changes with its sign. Same API as the web atom/colored-value (`shared/analytics.ts`).
7
+ * The default colors are the tokens `state-success` / `state-error` rather than Tailwind's fixed palette (green-500 / red-500),
8
+ * and they keep 4.5:1 contrast in dark mode too.
9
+ * Being a number, it is drawn monospaced (tabular).
10
10
  */
11
11
  export declare function ColoredValue<TValue>({ value, format, isPositive, isNegative, positiveColor, negativeColor, className }: ColoredValueProps<TValue>): ReactNode;
12
12
  //#endregion
@@ -5,10 +5,10 @@ import { jsx } from "react/jsx-runtime";
5
5
 
6
6
  //#region src/native/atom/colored-value.tsx
7
7
  /**
8
- * 符号で色が変わる数値。web の atom/colored-value(love3)と同じ API(`shared/analytics.ts`)。
9
- * 既定色は Tailwind の固定パレット(green-500 / red-500)でなく、トークンの `state-success` / `state-error`
10
- * (ダークでも 4.5:1 を保つ)。
11
- * 数値なので等幅(タブラー)で描く。
8
+ * A number whose color changes with its sign. Same API as the web atom/colored-value (`shared/analytics.ts`).
9
+ * The default colors are the tokens `state-success` / `state-error` rather than Tailwind's fixed palette (green-500 / red-500),
10
+ * and they keep 4.5:1 contrast in dark mode too.
11
+ * Being a number, it is drawn monospaced (tabular).
12
12
  */
13
13
  function ColoredValue({ value, format, isPositive, isNegative, positiveColor = "text-state-success", negativeColor = "text-state-error", className }) {
14
14
  const formatted = format ? format(value) : String(value);