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.
- package/README.md +493 -186
- package/docs/architecture.md +99 -0
- package/eslint-rules/melta.d.mts +44 -0
- package/lib/module/a11y/tap-target.js +41 -0
- package/lib/module/a11y/tap-target.js.map +1 -0
- package/lib/module/components/ActionSheet.js +20 -6
- package/lib/module/components/ActionSheet.js.map +1 -1
- package/lib/module/components/Alert.js +11 -7
- package/lib/module/components/Alert.js.map +1 -1
- package/lib/module/components/Avatar.js +7 -2
- package/lib/module/components/Avatar.js.map +1 -1
- package/lib/module/components/BottomSheet.js +11 -3
- package/lib/module/components/BottomSheet.js.map +1 -1
- package/lib/module/components/Card.js +4 -3
- package/lib/module/components/Card.js.map +1 -1
- package/lib/module/components/Checkbox.js +8 -5
- package/lib/module/components/Checkbox.js.map +1 -1
- package/lib/module/components/EmptyState.js +2 -1
- package/lib/module/components/EmptyState.js.map +1 -1
- package/lib/module/components/Header.js.map +1 -1
- package/lib/module/components/Image.js +5 -3
- package/lib/module/components/Image.js.map +1 -1
- package/lib/module/components/Modal.js +12 -4
- package/lib/module/components/Modal.js.map +1 -1
- package/lib/module/components/Progress.js +2 -1
- package/lib/module/components/Progress.js.map +1 -1
- package/lib/module/components/Radio.js +11 -3
- package/lib/module/components/Radio.js.map +1 -1
- package/lib/module/components/Screen.js +28 -3
- package/lib/module/components/Screen.js.map +1 -1
- package/lib/module/components/Skeleton.js +2 -1
- package/lib/module/components/Skeleton.js.map +1 -1
- package/lib/module/components/Surface.js +2 -1
- package/lib/module/components/Surface.js.map +1 -1
- package/lib/module/components/TextField.js +16 -4
- package/lib/module/components/TextField.js.map +1 -1
- package/lib/module/components/Toast.js +17 -9
- package/lib/module/components/Toast.js.map +1 -1
- package/lib/module/components/Toggle.js +13 -4
- package/lib/module/components/Toggle.js.map +1 -1
- package/lib/module/components/alert.styles.js +12 -26
- package/lib/module/components/alert.styles.js.map +1 -1
- package/lib/module/components/avatar.styles.js +24 -2
- package/lib/module/components/avatar.styles.js.map +1 -1
- package/lib/module/components/card.validate.js.map +1 -1
- package/lib/module/components/checkbox.styles.js +5 -2
- package/lib/module/components/checkbox.styles.js.map +1 -1
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/components/modal.styles.js +9 -0
- package/lib/module/components/modal.styles.js.map +1 -1
- package/lib/module/components/radio.styles.js +11 -2
- package/lib/module/components/radio.styles.js.map +1 -1
- package/lib/module/components/safe-area-registry.js +64 -13
- package/lib/module/components/safe-area-registry.js.map +1 -1
- package/lib/module/components/status-colors.js +53 -0
- package/lib/module/components/status-colors.js.map +1 -0
- package/lib/module/components/textfield.styles.js +15 -8
- package/lib/module/components/textfield.styles.js.map +1 -1
- package/lib/module/components/toast.styles.js +36 -25
- package/lib/module/components/toast.styles.js.map +1 -1
- package/lib/module/components/toggle.styles.js +20 -0
- package/lib/module/components/toggle.styles.js.map +1 -1
- package/lib/module/icons/Icon.js +4 -1
- package/lib/module/icons/Icon.js.map +1 -1
- package/lib/module/icons/icon.styles.js +32 -1
- package/lib/module/icons/icon.styles.js.map +1 -1
- package/lib/module/icons/index.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/primitives/Button.js +23 -11
- package/lib/module/primitives/Button.js.map +1 -1
- package/lib/module/primitives/Metric.js +2 -1
- package/lib/module/primitives/Metric.js.map +1 -1
- package/lib/module/primitives/Row.js.map +1 -1
- package/lib/module/primitives/Stack.js.map +1 -1
- package/lib/module/primitives/Tag.js +15 -7
- package/lib/module/primitives/Tag.js.map +1 -1
- package/lib/module/primitives/Text.js +28 -7
- package/lib/module/primitives/Text.js.map +1 -1
- package/lib/module/primitives/_internal/focus-ring.js.map +1 -1
- package/lib/module/primitives/button.styles.js +58 -8
- package/lib/module/primitives/button.styles.js.map +1 -1
- package/lib/module/primitives/index.js.map +1 -1
- package/lib/module/primitives/metric.styles.js +4 -1
- package/lib/module/primitives/metric.styles.js.map +1 -1
- package/lib/module/primitives/tag.styles.js +42 -3
- package/lib/module/primitives/tag.styles.js.map +1 -1
- package/lib/module/primitives/text.styles.js +10 -5
- package/lib/module/primitives/text.styles.js.map +1 -1
- package/lib/module/safe-area/index.js +11 -5
- package/lib/module/safe-area/index.js.map +1 -1
- package/lib/module/theme/ThemeProvider.js +5 -2
- package/lib/module/theme/ThemeProvider.js.map +1 -1
- package/lib/module/theme/define-theme.js +27 -1
- package/lib/module/theme/define-theme.js.map +1 -1
- package/lib/module/theme/index.js +7 -8
- package/lib/module/theme/index.js.map +1 -1
- package/lib/module/theme/letter-spacing.js +20 -0
- package/lib/module/theme/letter-spacing.js.map +1 -0
- package/lib/module/theme/line-height.js +52 -0
- package/lib/module/theme/line-height.js.map +1 -0
- package/lib/module/theme/native-theme.js +8 -7
- package/lib/module/theme/native-theme.js.map +1 -1
- package/lib/typescript/src/a11y/tap-target.d.ts +34 -0
- package/lib/typescript/src/a11y/tap-target.d.ts.map +1 -0
- package/lib/typescript/src/components/ActionSheet.d.ts +8 -1
- package/lib/typescript/src/components/ActionSheet.d.ts.map +1 -1
- package/lib/typescript/src/components/Alert.d.ts +9 -2
- package/lib/typescript/src/components/Alert.d.ts.map +1 -1
- package/lib/typescript/src/components/Avatar.d.ts +1 -1
- package/lib/typescript/src/components/Avatar.d.ts.map +1 -1
- package/lib/typescript/src/components/BottomSheet.d.ts +4 -1
- package/lib/typescript/src/components/BottomSheet.d.ts.map +1 -1
- package/lib/typescript/src/components/Card.d.ts +2 -2
- package/lib/typescript/src/components/Checkbox.d.ts +3 -3
- package/lib/typescript/src/components/Checkbox.d.ts.map +1 -1
- package/lib/typescript/src/components/Image.d.ts +4 -3
- package/lib/typescript/src/components/Image.d.ts.map +1 -1
- package/lib/typescript/src/components/Modal.d.ts +9 -3
- package/lib/typescript/src/components/Modal.d.ts.map +1 -1
- package/lib/typescript/src/components/Progress.d.ts +1 -1
- package/lib/typescript/src/components/Progress.d.ts.map +1 -1
- package/lib/typescript/src/components/Radio.d.ts +3 -2
- package/lib/typescript/src/components/Radio.d.ts.map +1 -1
- package/lib/typescript/src/components/Screen.d.ts +28 -5
- package/lib/typescript/src/components/Screen.d.ts.map +1 -1
- package/lib/typescript/src/components/Skeleton.d.ts +1 -1
- package/lib/typescript/src/components/Skeleton.d.ts.map +1 -1
- package/lib/typescript/src/components/Surface.d.ts +1 -1
- package/lib/typescript/src/components/Surface.d.ts.map +1 -1
- package/lib/typescript/src/components/TextField.d.ts +11 -4
- package/lib/typescript/src/components/TextField.d.ts.map +1 -1
- package/lib/typescript/src/components/Toast.d.ts +10 -3
- package/lib/typescript/src/components/Toast.d.ts.map +1 -1
- package/lib/typescript/src/components/Toggle.d.ts +3 -2
- package/lib/typescript/src/components/Toggle.d.ts.map +1 -1
- package/lib/typescript/src/components/action-sheet.styles.d.ts +1 -1
- package/lib/typescript/src/components/action-sheet.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/alert.styles.d.ts +14 -14
- package/lib/typescript/src/components/alert.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/avatar.styles.d.ts +36 -1
- package/lib/typescript/src/components/avatar.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/bottom-sheet.styles.d.ts +1 -1
- package/lib/typescript/src/components/bottom-sheet.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/card.styles.d.ts +1 -1
- package/lib/typescript/src/components/card.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/card.validate.d.ts +1 -1
- package/lib/typescript/src/components/card.validate.d.ts.map +1 -1
- package/lib/typescript/src/components/checkbox.styles.d.ts +6 -3
- package/lib/typescript/src/components/checkbox.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/empty-state.styles.d.ts +1 -1
- package/lib/typescript/src/components/empty-state.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/header.styles.d.ts +1 -1
- package/lib/typescript/src/components/header.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/image.styles.d.ts +1 -1
- package/lib/typescript/src/components/image.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/index.d.ts +18 -18
- package/lib/typescript/src/components/index.d.ts.map +1 -1
- package/lib/typescript/src/components/modal.styles.d.ts +13 -2
- package/lib/typescript/src/components/modal.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/progress.styles.d.ts +1 -1
- package/lib/typescript/src/components/progress.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/radio.styles.d.ts +10 -2
- package/lib/typescript/src/components/radio.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/safe-area-registry.d.ts +47 -11
- package/lib/typescript/src/components/safe-area-registry.d.ts.map +1 -1
- package/lib/typescript/src/components/screen.styles.d.ts +1 -1
- package/lib/typescript/src/components/screen.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/skeleton.styles.d.ts +1 -1
- package/lib/typescript/src/components/skeleton.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/status-colors.d.ts +33 -0
- package/lib/typescript/src/components/status-colors.d.ts.map +1 -0
- package/lib/typescript/src/components/surface.styles.d.ts +1 -1
- package/lib/typescript/src/components/surface.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/textfield.styles.d.ts +9 -5
- package/lib/typescript/src/components/textfield.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/toast.styles.d.ts +34 -14
- package/lib/typescript/src/components/toast.styles.d.ts.map +1 -1
- package/lib/typescript/src/components/toggle.styles.d.ts +17 -1
- package/lib/typescript/src/components/toggle.styles.d.ts.map +1 -1
- package/lib/typescript/src/icons/Icon.d.ts +12 -6
- package/lib/typescript/src/icons/Icon.d.ts.map +1 -1
- package/lib/typescript/src/icons/icon.styles.d.ts +14 -2
- package/lib/typescript/src/icons/icon.styles.d.ts.map +1 -1
- package/lib/typescript/src/icons/index.d.ts +3 -3
- package/lib/typescript/src/icons/index.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +4 -4
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/primitives/Button.d.ts +8 -4
- package/lib/typescript/src/primitives/Button.d.ts.map +1 -1
- package/lib/typescript/src/primitives/Metric.d.ts +1 -1
- package/lib/typescript/src/primitives/Metric.d.ts.map +1 -1
- package/lib/typescript/src/primitives/Row.d.ts +2 -2
- package/lib/typescript/src/primitives/Row.d.ts.map +1 -1
- package/lib/typescript/src/primitives/Stack.d.ts +2 -2
- package/lib/typescript/src/primitives/Stack.d.ts.map +1 -1
- package/lib/typescript/src/primitives/Tag.d.ts +2 -2
- package/lib/typescript/src/primitives/Tag.d.ts.map +1 -1
- package/lib/typescript/src/primitives/Text.d.ts +20 -6
- package/lib/typescript/src/primitives/Text.d.ts.map +1 -1
- package/lib/typescript/src/primitives/button.styles.d.ts +44 -7
- package/lib/typescript/src/primitives/button.styles.d.ts.map +1 -1
- package/lib/typescript/src/primitives/index.d.ts +6 -6
- package/lib/typescript/src/primitives/index.d.ts.map +1 -1
- package/lib/typescript/src/primitives/metric.styles.d.ts +1 -1
- package/lib/typescript/src/primitives/metric.styles.d.ts.map +1 -1
- package/lib/typescript/src/primitives/row.styles.d.ts +1 -1
- package/lib/typescript/src/primitives/row.styles.d.ts.map +1 -1
- package/lib/typescript/src/primitives/stack.styles.d.ts +1 -1
- package/lib/typescript/src/primitives/stack.styles.d.ts.map +1 -1
- package/lib/typescript/src/primitives/tag.styles.d.ts +34 -1
- package/lib/typescript/src/primitives/tag.styles.d.ts.map +1 -1
- package/lib/typescript/src/primitives/text.styles.d.ts +2 -4
- package/lib/typescript/src/primitives/text.styles.d.ts.map +1 -1
- package/lib/typescript/src/safe-area/index.d.ts +19 -5
- package/lib/typescript/src/safe-area/index.d.ts.map +1 -1
- package/lib/typescript/src/theme/ThemeProvider.d.ts +2 -2
- package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
- package/lib/typescript/src/theme/define-theme.d.ts +15 -2
- package/lib/typescript/src/theme/define-theme.d.ts.map +1 -1
- package/lib/typescript/src/theme/index.d.ts +14 -13
- package/lib/typescript/src/theme/index.d.ts.map +1 -1
- package/lib/typescript/src/theme/letter-spacing.d.ts +15 -0
- package/lib/typescript/src/theme/letter-spacing.d.ts.map +1 -0
- package/lib/typescript/src/theme/line-height.d.ts +44 -0
- package/lib/typescript/src/theme/line-height.d.ts.map +1 -0
- package/lib/typescript/src/theme/native-theme.d.ts +1 -1
- package/lib/typescript/src/theme/native-theme.d.ts.map +1 -1
- package/lib/typescript/src/theme/types.d.ts +10 -1
- package/lib/typescript/src/theme/types.d.ts.map +1 -1
- package/llms.txt +2 -1
- package/package.json +22 -7
- package/src/a11y/tap-target.ts +38 -0
- package/src/components/ActionSheet.tsx +25 -15
- package/src/components/Alert.tsx +37 -10
- package/src/components/Avatar.tsx +12 -4
- package/src/components/BottomSheet.tsx +16 -13
- package/src/components/Card.tsx +9 -8
- package/src/components/Checkbox.tsx +12 -9
- package/src/components/EmptyState.tsx +7 -6
- package/src/components/Header.tsx +4 -4
- package/src/components/Image.tsx +9 -7
- package/src/components/Modal.tsx +22 -6
- package/src/components/Progress.tsx +5 -4
- package/src/components/Radio.tsx +11 -6
- package/src/components/Screen.tsx +66 -8
- package/src/components/Skeleton.tsx +6 -5
- package/src/components/Surface.tsx +5 -4
- package/src/components/TextField.tsx +25 -7
- package/src/components/Toast.tsx +33 -11
- package/src/components/Toggle.tsx +15 -6
- package/src/components/action-sheet.styles.ts +1 -1
- package/src/components/alert.styles.ts +13 -25
- package/src/components/avatar.styles.ts +25 -3
- package/src/components/bottom-sheet.styles.ts +1 -1
- package/src/components/card.styles.ts +1 -1
- package/src/components/card.validate.ts +2 -2
- package/src/components/checkbox.styles.ts +6 -3
- package/src/components/empty-state.styles.ts +1 -1
- package/src/components/header.styles.ts +1 -1
- package/src/components/image.styles.ts +1 -1
- package/src/components/index.ts +18 -18
- package/src/components/modal.styles.ts +11 -2
- package/src/components/progress.styles.ts +1 -1
- package/src/components/radio.styles.ts +11 -2
- package/src/components/safe-area-registry.ts +81 -14
- package/src/components/screen.styles.ts +1 -1
- package/src/components/skeleton.styles.ts +1 -1
- package/src/components/status-colors.ts +59 -0
- package/src/components/surface.styles.ts +1 -1
- package/src/components/textfield.styles.ts +18 -15
- package/src/components/toast.styles.ts +32 -25
- package/src/components/toggle.styles.ts +21 -1
- package/src/icons/Icon.tsx +13 -8
- package/src/icons/icon.styles.ts +38 -3
- package/src/icons/index.ts +3 -3
- package/src/index.ts +4 -4
- package/src/primitives/Button.tsx +28 -14
- package/src/primitives/Metric.tsx +5 -4
- package/src/primitives/Row.tsx +4 -4
- package/src/primitives/Stack.tsx +4 -4
- package/src/primitives/Tag.tsx +29 -11
- package/src/primitives/Text.tsx +42 -9
- package/src/primitives/_internal/focus-ring.tsx +1 -1
- package/src/primitives/button.styles.ts +63 -10
- package/src/primitives/index.ts +6 -6
- package/src/primitives/metric.styles.ts +9 -2
- package/src/primitives/row.styles.ts +1 -1
- package/src/primitives/stack.styles.ts +1 -1
- package/src/primitives/tag.styles.ts +43 -4
- package/src/primitives/text.styles.ts +10 -6
- package/src/safe-area/index.ts +21 -7
- package/src/theme/ThemeProvider.tsx +8 -5
- package/src/theme/define-theme.ts +33 -2
- package/src/theme/index.ts +18 -16
- package/src/theme/letter-spacing.ts +17 -0
- package/src/theme/line-height.ts +53 -0
- package/src/theme/native-theme.ts +9 -8
- package/src/theme/types.ts +10 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# melta-app アーキテクチャ / 開発台帳
|
|
2
|
+
|
|
3
|
+
> このリポジトリを**触る人**向けの台帳。**使う人**向けの情報(Install / lint 強制層 / コンポーネント表 /
|
|
4
|
+
> テーマ注入 / 制約)は [README](../README.md) にある。ここは README から分離した詳細で、
|
|
5
|
+
> 内容は削っていない(README 側には要約とリンクだけを置く)。
|
|
6
|
+
|
|
7
|
+
## ディレクトリ
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
melta-app/
|
|
11
|
+
src/ ライブラリ本体(npm 配布物)
|
|
12
|
+
theme/
|
|
13
|
+
types.ts NativeTheme の型
|
|
14
|
+
native-theme.ts ⚠️ 自動生成(melta-contracts → RN 正規化済み)
|
|
15
|
+
index.ts theme エントリ(ThemeProvider / useTheme / nativeTheme)
|
|
16
|
+
primitives/ Text / Button / Tag / Metric / Stack / Row
|
|
17
|
+
components/ Card / Image / Surface / Skeleton / EmptyState / Screen / Header /
|
|
18
|
+
Avatar / TextField / Toggle / Checkbox / Radio / Alert / Toast /
|
|
19
|
+
Progress / Modal / ActionSheet / BottomSheet
|
|
20
|
+
icons/ Icon + glyphs(subpath エントリ melta-app/icons、react-native-svg 隔離)
|
|
21
|
+
contracts/
|
|
22
|
+
contract-types.ts ⚠️ 自動生成(契約メタ CONTRACTS + 型)
|
|
23
|
+
index.ts 公開エントリ
|
|
24
|
+
example/ カタログアプリ(Expo、publish 除外)
|
|
25
|
+
App.tsx / catalog/ / screens/
|
|
26
|
+
scripts/
|
|
27
|
+
generate-native-theme.ts melta-contracts/tokens.json → src/theme/native-theme.ts
|
|
28
|
+
generate-contract-types.ts 契約 JSON → src/contracts/contract-types.ts
|
|
29
|
+
check-drift.ts README / docs / catalog / allowlist の drift 検査(--write で heal)
|
|
30
|
+
check-installability.sh pack → attw → install → import → typecheck の公開ゲート
|
|
31
|
+
lib/ token 正規化 + conformance / consumer テスト
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## style resolver
|
|
35
|
+
|
|
36
|
+
見た目の値の解決は component(`.tsx`)ではなく隣の `<component>.styles.ts`(react-native を値 import しない
|
|
37
|
+
pure module)に置く。node の `tsx --test` から直接実行できることが conformance テストの前提になっている。
|
|
38
|
+
書き方の規約(`<COMPONENT>_SPEC` / slot 単位の戻り値 / 命名 / 共有 module)は [AGENTS.md](../AGENTS.md) が正。
|
|
39
|
+
resolver は3世代が混在しているので、**現行世代を規範とする**(初代の `button.styles.ts` を写さない)。
|
|
40
|
+
|
|
41
|
+
## トークン正規化(web → RN)
|
|
42
|
+
|
|
43
|
+
`scripts/lib/normalize-tokens.ts` が変換する。壊れやすい箇所はテスト必須。
|
|
44
|
+
|
|
45
|
+
| トークン | web | RN |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| color | hex / rgba | そのまま(semantic は light/dark mode 切替) |
|
|
48
|
+
| spacing / radius / fontSize | rem + px | px の数値を採用(RN は unitless) |
|
|
49
|
+
| shadow | CSS box-shadow | iOS shadow* + Android elevation に分解(1 ViewStyle に同居) |
|
|
50
|
+
| fontFamily | 配列 | 単一文字列(先頭採用、未ロード時 OS デフォルト fallback) |
|
|
51
|
+
| lineHeight | 比率("2.0") | `fontSize × ratio` を px 算出(四捨五入)し、安全下限 `ceil(fontSize × minLineHeightRatio)`(既定 1.45)でクランプ(RN Android の字形欠け対策。根拠は `src/theme/line-height.ts`) |
|
|
52
|
+
| letterSpacing | em | **em ratio の数値で保持**(fontSize 相対のため token 単体で px 化不可。適用側が `fontSize × ratio` で解決) |
|
|
53
|
+
| motion duration | "150ms" | 150(数値) |
|
|
54
|
+
| motion easing | cubic-bezier | `[a,b,c,d]` tuple(`Easing.bezier(...)` に展開) |
|
|
55
|
+
|
|
56
|
+
## 開発
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm install # melta-contracts(npm 公開済み)も devDependencies として入る
|
|
60
|
+
|
|
61
|
+
# theme + contract 型を生成(melta-contracts のノードを読む。
|
|
62
|
+
# 未 install 時のみ隣の melta-ui を fallback で読む開発モード)
|
|
63
|
+
npm run generate
|
|
64
|
+
|
|
65
|
+
# 変換・conformance・consumer テスト
|
|
66
|
+
npm test
|
|
67
|
+
|
|
68
|
+
# 実機 / シミュレータでカタログを確認
|
|
69
|
+
npm run ios # または android / web
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 実装ステータス(詳細)
|
|
73
|
+
|
|
74
|
+
- ✅ ライブラリ化(root=ライブラリ / example=カタログアプリ、peerDeps react + react-native、runtime deps ゼロ)
|
|
75
|
+
- ✅ `melta-contracts` を npm 依存として購読(recipes/app の styleRefs 同梱)
|
|
76
|
+
- ✅ conformance: 契約源 ↔ 生成メタ ↔ `__contract` 宣言の照合 + consumer テスト(契約 subset / token 実在 / contractVersion 同期)+ styleRefs conformance(全実装コンポーネント展開済み)+ RN mount smoke(light/dark × 全公開コンポーネント)
|
|
77
|
+
- ✅ ハーネス: design lint(CI `--max-warnings 0` + PostToolUse hook)/ drift 検査(README・docs・catalog・allowlist 突合)/ installability ゲート(pack → tarball 実体検査 → attw で exports の型解決を resolution mode ごとに検査 → fixture へ install → 本体 / icons / safe-area / eslint-plugin の import + typecheck を moduleResolution 3 種(bundler / node16 / nodenext)で実行 → eslint plugin を実 import してルール 4 本の実在を照合 → exports の解決先確認。`npm run release` チェーンの必須ステップ)
|
|
78
|
+
- ✅ layout 6 個(Stack / Row / Screen / Header / Icon / Avatar)— dogfood 不足 1〜4 を解消、ProjectFeedScreen は公開 primitive だけで構成
|
|
79
|
+
- Screen の SafeArea は adapter registry 化済み: default は RN core SafeAreaView(依存ゼロ維持)、`melta-app/safe-area` の `enableSafeAreaContext()` で react-native-safe-area-context に差し替え可(optional peer)
|
|
80
|
+
- ✅ form / feedback 10 個(TextField / Toggle / Checkbox / Radio / Alert / Toast / Progress / Modal / ActionSheet / BottomSheet)— checkbox / radio は Pressable + 描画(svg 非依存)、ActionSheet / BottomSheet は select / dropdown の adapted 変換先の受け皿
|
|
81
|
+
- ✅ showcase(https://app.melta.tsubotax.com — melta-ui 様式シェル + 実 RN カタログの Live 埋め込み。表・統計は契約からビルド時生成)
|
|
82
|
+
- ✅ AI 入口: [llms.txt](https://app.melta.tsubotax.com/llms.txt)(契約から生成・drift 検査対象)+ [patterns.md](./patterns.md)(フォームの組み方規範。スニペットは実コードと機械同期)
|
|
83
|
+
- ✅ lint 強制層の npm 配布(0.5.2): `melta-app/eslint-plugin` を公開 subpath 化。消費者プロジェクトの flat config に組めば、生値の直書きが消費者側でも lint で止まる。推奨 severity は `configs.recommended` で配布(0.5.3。消費者が手書きで写さない)
|
|
84
|
+
- ✅ 消費者プロジェクトでの実導入検証(2026-08-04): 別リポジトリの自プロジェクト(非公開 RN アプリ)に npm 経由で導入し、AI が違反コードを書いた直後に検出 → 修正フィードバック → 自己修正、のループを実測で確認。導入時に見つかった hook の欠陥(実行失敗時に無言で素通りする)は同日中に本体へ還元し、故障系を含む E2E 14 ケースで固定(0.5.3)
|
|
85
|
+
- ✅ [npm publish(0.5.3)](https://www.npmjs.com/package/melta-app)
|
|
86
|
+
- ⬜ React Native Directory 登録([PR #2606](https://github.com/react-native-community/directory/pull/2606) レビュー待ち)
|
|
87
|
+
|
|
88
|
+
## CI(.github/workflows/check.yml)
|
|
89
|
+
|
|
90
|
+
push / PR で以下を順に回す。CI には兄弟ディレクトリ(melta-ui)が存在しないため、`npm run generate`
|
|
91
|
+
が通ること自体が「npm 経路(melta-contracts)だけで生成できる」証明になっている。
|
|
92
|
+
|
|
93
|
+
1. `npm run generate` → 生成物の差分ゼロ(再生成漏れの検知)
|
|
94
|
+
2. `npm run typecheck`(lib + example + scripts)
|
|
95
|
+
3. `npm run lint`(`--max-warnings 0`)
|
|
96
|
+
4. `npm test`(consumer + conformance)
|
|
97
|
+
5. `npm run check:drift`(README / docs / catalog / allowlist)
|
|
98
|
+
6. `npm run test:rn`(RN mount smoke)
|
|
99
|
+
7. `npm run check:installability`(pack → attw → install → import → typecheck ×3 解決)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* melta design lint プラグインの型宣言(melta.mjs の手書き型)。
|
|
3
|
+
*
|
|
4
|
+
* `melta.mjs` は実装の正本。この宣言は npm 利用者(moduleResolution: node16/nodenext)が
|
|
5
|
+
* `melta-app/eslint-plugin` を型付きで import できるようにするためだけに存在する。
|
|
6
|
+
* 実装を変えたらこちらも手で追随させる(ルール名は check-installability が機械照合している)。
|
|
7
|
+
*
|
|
8
|
+
* ESLint 本体の型(`eslint` / `@types/eslint`)には**意図的に依存しない**。
|
|
9
|
+
* eslint は melta-app の dependencies ではないため、import すると
|
|
10
|
+
* 「eslint 未 install の利用者で型が壊れる」経路を作ってしまう。
|
|
11
|
+
* flat config に差し込むのに必要な最小限を構造的に宣言する。
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** ESLint のルール実装(AST visitor を返す `create` と表示用 `meta`)。 */
|
|
15
|
+
export interface MeltaRule {
|
|
16
|
+
meta: {
|
|
17
|
+
type: "problem" | "suggestion" | "layout";
|
|
18
|
+
docs: { description: string };
|
|
19
|
+
};
|
|
20
|
+
// AST ノード型は eslint の型に依存しないため unknown 止まり(消費者は呼び出さない)。
|
|
21
|
+
create(context: unknown): Record<string, (...args: never[]) => void>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** このプラグインが提供するルール ID(`melta/` prefix なし)。 */
|
|
25
|
+
export type MeltaRuleName =
|
|
26
|
+
| "no-raw-color"
|
|
27
|
+
| "no-raw-radius"
|
|
28
|
+
| "no-raw-spacing"
|
|
29
|
+
| "no-raw-fontsize";
|
|
30
|
+
|
|
31
|
+
/** flat config の 1 要素として展開できる推奨設定。 */
|
|
32
|
+
export interface MeltaFlatConfig {
|
|
33
|
+
name: string;
|
|
34
|
+
plugins: { melta: MeltaPlugin };
|
|
35
|
+
/** severity の正本は melta.mjs の RECOMMENDED_RULES(ドキュメントではない)。 */
|
|
36
|
+
rules: Record<string, "error" | "warn" | "off">;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface MeltaPlugin {
|
|
40
|
+
rules: Record<MeltaRuleName, MeltaRule>;
|
|
41
|
+
configs: { recommended: MeltaFlatConfig };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export declare const meltaPlugin: MeltaPlugin;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* tap-target — 実効タップ標的 44pt(横断方針)の数値 SSOT。
|
|
5
|
+
*
|
|
6
|
+
* 正本は melta-contracts の `A11Y_MIN_TAP_TARGET_44`(rules.json):
|
|
7
|
+
* 「すべての操作要素は実効タップ標的 44pt を下回らない。視覚寸法は契約どおり据え置き、
|
|
8
|
+
* 当たり判定だけを広げる。app は視覚 24pt + hitSlop 10 の正典パターンか minHeight で下限を保証する
|
|
9
|
+
* (height 固定は fontScale でクリップするので使わない)」。
|
|
10
|
+
*
|
|
11
|
+
* ここは「44」という数と正典パターンの寸法を**一箇所**に置くための pure module。
|
|
12
|
+
* 各コンポーネントの hitSlop 値そのものは **literal で各 `*.styles.ts` に置く**(ここから
|
|
13
|
+
* 自動導出しない)。導出にすると視覚寸法が変わったとき hitSlop も一緒に動いてしまい、
|
|
14
|
+
* conformance テスト(scripts/lib/tap-target-conformance.test.ts)が構造的に fail-open になるため。
|
|
15
|
+
*
|
|
16
|
+
* react-native を import しない純粋モジュール(`*.styles.ts` と同じ規約)。
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/** 実効タップ標的の下限(pt)。WCAG 2.2 SC 2.5.5(AAA)水準を melta の横断方針として採る。 */
|
|
20
|
+
export const MIN_TAP_TARGET = 44;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 正典パターン: 視覚 24pt の箱 + hitSlop 10 → 実効 44pt。
|
|
24
|
+
* 背景を持たない小さな操作要素(Tag removable の × / Toast の × / Alert の × / Modal の ×)はこれ。
|
|
25
|
+
*/
|
|
26
|
+
export const CANONICAL_TAP_TARGET = {
|
|
27
|
+
minWidth: 24,
|
|
28
|
+
minHeight: 24,
|
|
29
|
+
hitSlop: 10
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 視覚寸法 `visual` を実効 44pt に届かせるのに必要な**片側** hitSlop(切り上げ = 安全側)。
|
|
34
|
+
*
|
|
35
|
+
* ⚠️ 実装の hitSlop 値をこの関数で計算しないこと(上のコメント参照)。
|
|
36
|
+
* 使うのは (a) 値を決めるときの検算、(b) conformance テストの期待値算出。
|
|
37
|
+
*/
|
|
38
|
+
export function requiredHitSlop(visual) {
|
|
39
|
+
return Math.max(0, Math.ceil((MIN_TAP_TARGET - visual) / 2));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=tap-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MIN_TAP_TARGET","CANONICAL_TAP_TARGET","minWidth","minHeight","hitSlop","requiredHitSlop","visual","Math","max","ceil"],"sourceRoot":"../../../src","sources":["a11y/tap-target.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,MAAMA,cAAc,GAAG,EAAE;;AAEhC;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,GAAG;EAClCC,QAAQ,EAAE,EAAE;EACZC,SAAS,EAAE,EAAE;EACbC,OAAO,EAAE;AACX,CAAU;;AAEV;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAACC,MAAc,EAAU;EACtD,OAAOC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,IAAI,CAAC,CAACT,cAAc,GAAGM,MAAM,IAAI,CAAC,CAAC,CAAC;AAC9D","ignoreList":[]}
|
|
@@ -11,17 +11,28 @@
|
|
|
11
11
|
* 色だけでなくラベル文言でも破壊的操作と分かる文言にするのは呼び出し側の責務(contract a11y)。
|
|
12
12
|
* - 先頭 action の borderTop は title が無い場合は消す(title がある時だけ区切りとして意味を持つ)。
|
|
13
13
|
* - action の onPress 後は onClose も呼ぶ(選択 = シートを閉じる)。
|
|
14
|
-
* -
|
|
14
|
+
* - 下余白(ホームインジケータ)は SafeArea で確保する(recipe description 参照)。位置は
|
|
15
|
+
* **最下部の面である cancel ブロックの内側**(BottomSheet と同じ「内側」方針に統一)。
|
|
16
|
+
* 0.5.x までは sheet 群の外側に置いていたため、iOS では inset 帯に overlay の黒が見えていた。
|
|
17
|
+
* 内側に移したことで inset 帯まで bg-surface で塗られる代わり、cancel ブロックは
|
|
18
|
+
* inset のぶん背が高くなる(ラベルは上寄りに見える)=意図した見た目の変更。
|
|
19
|
+
* edge は bottom + 左右のみ(top は overlay 側で、シートは上端に接しない)。
|
|
20
|
+
* SafeArea 実装は registry 経由(safe-area-registry.ts)— "melta-app/safe-area" を
|
|
21
|
+
* 有効化したアプリでは Android でも inset が入る(RN core の SafeAreaView は Android で no-op)。
|
|
15
22
|
* - sheet 側は onStartShouldSetResponder で touch を claim し、overlay tap でだけ閉じる。
|
|
16
23
|
* - style の決定は pure resolver(action-sheet.styles.ts)に分離 — recipe との機械照合対象。
|
|
17
24
|
*/
|
|
18
25
|
|
|
19
26
|
import { useMemo } from "react";
|
|
20
|
-
import { Modal as RNModal, Pressable,
|
|
27
|
+
import { Modal as RNModal, Pressable, Text as RNText, View } from "react-native";
|
|
21
28
|
import { useTheme } from "../theme/index.js";
|
|
22
29
|
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
23
30
|
import { resolveActionSheetStyle } from "./action-sheet.styles.js";
|
|
31
|
+
import { resolveSafeAreaView } from "./safe-area-registry.js";
|
|
32
|
+
|
|
33
|
+
/** シートは画面下端に密着するので top inset は不要。 */
|
|
24
34
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
35
|
+
const SHEET_EDGES = ["bottom", "left", "right"];
|
|
25
36
|
export function ActionSheet({
|
|
26
37
|
visible,
|
|
27
38
|
onClose,
|
|
@@ -35,6 +46,7 @@ export function ActionSheet({
|
|
|
35
46
|
mode
|
|
36
47
|
} = useTheme();
|
|
37
48
|
const styles = useMemo(() => resolveActionSheetStyle(theme, mode), [theme, mode]);
|
|
49
|
+
const SafeArea = resolveSafeAreaView(SHEET_EDGES);
|
|
38
50
|
return /*#__PURE__*/_jsx(RNModal, {
|
|
39
51
|
visible: visible,
|
|
40
52
|
transparent: true,
|
|
@@ -45,7 +57,7 @@ export function ActionSheet({
|
|
|
45
57
|
style: styles.overlayStyle,
|
|
46
58
|
onPress: onClose,
|
|
47
59
|
accessible: false,
|
|
48
|
-
children: /*#__PURE__*/_jsxs(
|
|
60
|
+
children: /*#__PURE__*/_jsxs(View, {
|
|
49
61
|
accessibilityViewIsModal: true,
|
|
50
62
|
onStartShouldSetResponder: () => true,
|
|
51
63
|
testID: testID,
|
|
@@ -74,9 +86,11 @@ export function ActionSheet({
|
|
|
74
86
|
accessibilityRole: "button",
|
|
75
87
|
onPress: onClose,
|
|
76
88
|
style: styles.cancelStyle,
|
|
77
|
-
children: /*#__PURE__*/_jsx(
|
|
78
|
-
|
|
79
|
-
|
|
89
|
+
children: /*#__PURE__*/_jsx(SafeArea, {
|
|
90
|
+
children: /*#__PURE__*/_jsx(RNText, {
|
|
91
|
+
style: styles.cancelTextStyle,
|
|
92
|
+
children: cancelLabel
|
|
93
|
+
})
|
|
80
94
|
})
|
|
81
95
|
})]
|
|
82
96
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMemo","Modal","RNModal","Pressable","
|
|
1
|
+
{"version":3,"names":["useMemo","Modal","RNModal","Pressable","Text","RNText","View","useTheme","CONTRACTS","resolveActionSheetStyle","resolveSafeAreaView","jsx","_jsx","jsxs","_jsxs","SHEET_EDGES","ActionSheet","visible","onClose","title","actions","cancelLabel","testID","theme","mode","styles","SafeArea","transparent","animationType","onRequestClose","statusBarTranslucent","children","style","overlayStyle","onPress","accessible","accessibilityViewIsModal","onStartShouldSetResponder","sheetStyle","titleStyle","map","action","index","accessibilityRole","actionStyle","borderTopWidth","destructive","destructiveTextStyle","actionTextStyle","label","cancelStyle","cancelTextStyle","__contract","actionSheet"],"sourceRoot":"../../../src","sources":["components/ActionSheet.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
* - RN では border を持たず bg subtle + text 色で表現(status token に border 用の中間色が無い、
|
|
8
8
|
* recipe description)。COLOR_ONLY_FORBIDDEN は title/message のテキストと icon slot で担保する設計。
|
|
9
9
|
* - icon は ReactNode slot(EmptyState 前例。Icon を差すなら melta-app/icons を利用者が opt-in)。
|
|
10
|
+
* - × の accessibilityLabel は既定 "閉じる"(closeAccessibilityLabel で差し替え可能)。
|
|
11
|
+
* 当たり判定は正典パターン(24 + hitSlop 10 = 44pt)。
|
|
10
12
|
* - a11y(§2 web→RN mapping): web の role=alert(error/warning) / status(info/success) を、
|
|
11
13
|
* error/warning → accessibilityRole="alert"、info/success → accessibilityLiveRegion="polite"
|
|
12
14
|
* (Android のみ有効。RN に status role が無いための写像)に落とす。
|
|
@@ -20,7 +22,7 @@ import { Pressable, View } from "react-native";
|
|
|
20
22
|
import { Text } from "../primitives/Text.js";
|
|
21
23
|
import { useTheme } from "../theme/index.js";
|
|
22
24
|
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
23
|
-
import { ALERT_SPEC, resolveAlertStyles } from "./alert.styles.js";
|
|
25
|
+
import { ALERT_CLOSE_TAP_TARGET, ALERT_SPEC, resolveAlertStyles } from "./alert.styles.js";
|
|
24
26
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
25
27
|
export function Alert({
|
|
26
28
|
variant,
|
|
@@ -28,6 +30,7 @@ export function Alert({
|
|
|
28
30
|
message,
|
|
29
31
|
icon,
|
|
30
32
|
onClose,
|
|
33
|
+
closeAccessibilityLabel = "閉じる",
|
|
31
34
|
style,
|
|
32
35
|
testID
|
|
33
36
|
}) {
|
|
@@ -65,15 +68,15 @@ export function Alert({
|
|
|
65
68
|
})]
|
|
66
69
|
}), onClose != null &&
|
|
67
70
|
/*#__PURE__*/
|
|
68
|
-
// 最小タップターゲット確保:
|
|
71
|
+
// 最小タップターゲット確保: 正典パターン 24 + hitSlop 10 = 実効 44pt(Tag removable と同型)。
|
|
69
72
|
_jsx(Pressable, {
|
|
70
73
|
onPress: onClose,
|
|
71
74
|
accessibilityRole: "button",
|
|
72
|
-
accessibilityLabel:
|
|
73
|
-
hitSlop:
|
|
75
|
+
accessibilityLabel: closeAccessibilityLabel,
|
|
76
|
+
hitSlop: ALERT_CLOSE_TAP_TARGET.hitSlop,
|
|
74
77
|
style: {
|
|
75
|
-
minWidth:
|
|
76
|
-
minHeight:
|
|
78
|
+
minWidth: ALERT_CLOSE_TAP_TARGET.minWidth,
|
|
79
|
+
minHeight: ALERT_CLOSE_TAP_TARGET.minHeight,
|
|
77
80
|
alignItems: "center",
|
|
78
81
|
justifyContent: "center"
|
|
79
82
|
},
|
|
@@ -88,6 +91,7 @@ export function Alert({
|
|
|
88
91
|
});
|
|
89
92
|
}
|
|
90
93
|
|
|
91
|
-
//
|
|
94
|
+
// conformance test 用の contract メタ(§2 A-3)。scripts/lib/conformance.test.ts が
|
|
95
|
+
// 「この宣言が正しい contract を指しているか」を静的スキャンで照合する。
|
|
92
96
|
Alert.__contract = CONTRACTS.alert;
|
|
93
97
|
//# sourceMappingURL=Alert.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","ALERT_SPEC","resolveAlertStyles","jsx","_jsx","jsxs","_jsxs","Alert","variant","title","message","icon","onClose","style","testID","theme","mode","styles","urgent","accessibilityRole","undefined","accessibilityLiveRegion","containerStyle","children","flex","gap","spacing","titleFont","weight","titleWeight","color","titleStyle","messageFont","messageStyle","onPress","accessibilityLabel","hitSlop","minWidth","minHeight","alignItems","justifyContent","__contract","alert"],"sourceRoot":"../../../src","sources":["components/Alert.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,SAAS,EAAEC,IAAI,QAAwC,cAAc;AAC9E,SAASC,IAAI,QAAQ,
|
|
1
|
+
{"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","ALERT_CLOSE_TAP_TARGET","ALERT_SPEC","resolveAlertStyles","jsx","_jsx","jsxs","_jsxs","Alert","variant","title","message","icon","onClose","closeAccessibilityLabel","style","testID","theme","mode","styles","urgent","accessibilityRole","undefined","accessibilityLiveRegion","containerStyle","children","flex","gap","spacing","titleFont","weight","titleWeight","color","titleStyle","messageFont","messageStyle","onPress","accessibilityLabel","hitSlop","minWidth","minHeight","alignItems","justifyContent","__contract","alert"],"sourceRoot":"../../../src","sources":["components/Alert.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -15,7 +15,7 @@ import { Children, useMemo } from "react";
|
|
|
15
15
|
import { Image as RNImage, Text as RNText, View } from "react-native";
|
|
16
16
|
import { useTheme } from "../theme/index.js";
|
|
17
17
|
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
18
|
-
import { resolveAvatarGroupStyle, resolveAvatarStatusColor, resolveAvatarStyle } from "./avatar.styles.js";
|
|
18
|
+
import { AVATAR_INITIALS_MAX_FONT_SCALE, resolveAvatarGroupStyle, resolveAvatarStatusColor, resolveAvatarStyle } from "./avatar.styles.js";
|
|
19
19
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
20
20
|
/** name → initials(先頭2文字。空白区切りなら各語の頭文字を優先: "Taro Tanaka" → "TT")。 */
|
|
21
21
|
function toInitials(name) {
|
|
@@ -58,8 +58,13 @@ export function Avatar({
|
|
|
58
58
|
width: "100%",
|
|
59
59
|
height: "100%"
|
|
60
60
|
}
|
|
61
|
-
}) :
|
|
61
|
+
}) :
|
|
62
|
+
/*#__PURE__*/
|
|
63
|
+
// 器(円)は fontScale で伸びないので、文字側に size 別の上限を掛けて溢れを防ぐ
|
|
64
|
+
// (根拠と導出は avatar.styles.ts の AVATAR_INITIALS_MAX_FONT_SCALE)。
|
|
65
|
+
_jsx(RNText, {
|
|
62
66
|
style: resolved.text,
|
|
67
|
+
maxFontSizeMultiplier: AVATAR_INITIALS_MAX_FONT_SCALE[size],
|
|
63
68
|
children: toInitials(name)
|
|
64
69
|
})
|
|
65
70
|
}), status ? /*#__PURE__*/_jsx(View, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Children","useMemo","Image","RNImage","Text","RNText","View","useTheme","CONTRACTS","resolveAvatarGroupStyle","resolveAvatarStatusColor","resolveAvatarStyle","jsx","_jsx","jsxs","_jsxs","toInitials","name","words","trim","split","filter","Boolean","length","toUpperCase","slice","Avatar","source","size","status","style","testID","theme","mode","variant","resolved","dotColor","undefined","width","container","height","accessible","accessibilityRole","accessibilityLabel","children","text","dot","backgroundColor","position","right","bottom","AvatarGroup","group","map","child","index","overlap","Group","__contract","avatar"],"sourceRoot":"../../../src","sources":["components/Avatar.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,QAAQ,EAAEC,OAAO,QAAwB,OAAO;AACzD,SACEC,KAAK,IAAIC,OAAO,EAChBC,IAAI,IAAIC,MAAM,EACdC,IAAI,QAIC,cAAc;AACrB,SAASC,QAAQ,QAAQ,
|
|
1
|
+
{"version":3,"names":["Children","useMemo","Image","RNImage","Text","RNText","View","useTheme","CONTRACTS","AVATAR_INITIALS_MAX_FONT_SCALE","resolveAvatarGroupStyle","resolveAvatarStatusColor","resolveAvatarStyle","jsx","_jsx","jsxs","_jsxs","toInitials","name","words","trim","split","filter","Boolean","length","toUpperCase","slice","Avatar","source","size","status","style","testID","theme","mode","variant","resolved","dotColor","undefined","width","container","height","accessible","accessibilityRole","accessibilityLabel","children","text","maxFontSizeMultiplier","dot","backgroundColor","position","right","bottom","AvatarGroup","group","map","child","index","overlap","Group","__contract","avatar"],"sourceRoot":"../../../src","sources":["components/Avatar.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -8,18 +8,25 @@
|
|
|
8
8
|
* - grabber は装飾バー。a11y ツリーから除外する(importantForAccessibility="no" +
|
|
9
9
|
* accessibilityElementsHidden。recipe description 参照)。
|
|
10
10
|
* - スワイプで閉じるジェスチャは実装しない(overlay tap + Android back で閉じる、Phase 外)。
|
|
11
|
-
* - sheet は下端密着(bg-surface)のため、
|
|
11
|
+
* - sheet は下端密着(bg-surface)のため、SafeArea を sheet の内側に置いて
|
|
12
12
|
* 下余白(ホームインジケータ)まで sheet 背景で覆いつつ content を安全域に収める。
|
|
13
|
+
* edge は bottom + 左右のみ(top は overlay 側で、シートは上端に接しない)。
|
|
14
|
+
* SafeArea 実装は registry 経由(safe-area-registry.ts)— "melta-app/safe-area" を
|
|
15
|
+
* 有効化したアプリでは Android でも inset が入る(RN core の SafeAreaView は Android で no-op)。
|
|
13
16
|
* - sheet 側は onStartShouldSetResponder で touch を claim し、overlay tap でだけ閉じる。
|
|
14
17
|
* - style の決定は pure resolver(bottom-sheet.styles.ts)に分離 — recipe との機械照合対象。
|
|
15
18
|
*/
|
|
16
19
|
|
|
17
20
|
import { useMemo } from "react";
|
|
18
|
-
import { Modal as RNModal, Pressable,
|
|
21
|
+
import { Modal as RNModal, Pressable, Text as RNText, View } from "react-native";
|
|
19
22
|
import { useTheme } from "../theme/index.js";
|
|
20
23
|
import { CONTRACTS } from "../contracts/contract-types.js";
|
|
21
24
|
import { resolveBottomSheetStyle } from "./bottom-sheet.styles.js";
|
|
25
|
+
import { resolveSafeAreaView } from "./safe-area-registry.js";
|
|
26
|
+
|
|
27
|
+
/** シートは画面下端に密着するので top inset は不要。 */
|
|
22
28
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
29
|
+
const SHEET_EDGES = ["bottom", "left", "right"];
|
|
23
30
|
export function BottomSheet({
|
|
24
31
|
visible,
|
|
25
32
|
onClose,
|
|
@@ -32,6 +39,7 @@ export function BottomSheet({
|
|
|
32
39
|
mode
|
|
33
40
|
} = useTheme();
|
|
34
41
|
const styles = useMemo(() => resolveBottomSheetStyle(theme, mode), [theme, mode]);
|
|
42
|
+
const SafeArea = resolveSafeAreaView(SHEET_EDGES);
|
|
35
43
|
return /*#__PURE__*/_jsx(RNModal, {
|
|
36
44
|
visible: visible,
|
|
37
45
|
transparent: true,
|
|
@@ -47,7 +55,7 @@ export function BottomSheet({
|
|
|
47
55
|
accessibilityViewIsModal: true,
|
|
48
56
|
onStartShouldSetResponder: () => true,
|
|
49
57
|
testID: testID,
|
|
50
|
-
children: /*#__PURE__*/_jsxs(
|
|
58
|
+
children: /*#__PURE__*/_jsxs(SafeArea, {
|
|
51
59
|
children: [/*#__PURE__*/_jsx(View, {
|
|
52
60
|
style: styles.grabberStyle,
|
|
53
61
|
importantForAccessibility: "no",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMemo","Modal","RNModal","Pressable","
|
|
1
|
+
{"version":3,"names":["useMemo","Modal","RNModal","Pressable","Text","RNText","View","useTheme","CONTRACTS","resolveBottomSheetStyle","resolveSafeAreaView","jsx","_jsx","jsxs","_jsxs","SHEET_EDGES","BottomSheet","visible","onClose","title","testID","children","theme","mode","styles","SafeArea","transparent","animationType","onRequestClose","statusBarTranslucent","style","overlayStyle","onPress","accessible","sheetStyle","accessibilityViewIsModal","onStartShouldSetResponder","grabberStyle","importantForAccessibility","accessibilityElementsHidden","titleStyle","accessibilityRole","contentStyle","__contract","bottomSheet"],"sourceRoot":"../../../src","sources":["components/BottomSheet.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,KAAK,IAAIC,OAAO,EAAEC,SAAS,EAAEC,IAAI,IAAIC,MAAM,EAAEC,IAAI,QAAQ,cAAc;AAChF,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,SAAS,QAAQ,gCAAgC;AAC1D,SAASC,uBAAuB,QAA+B,0BAA0B;AACzF,SAASC,mBAAmB,QAA2B,yBAAyB;;AAEhF;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AACA,MAAMC,WAAoC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAaxE,OAAO,SAASC,WAAWA,CAAC;EAAEC,OAAO;EAAEC,OAAO;EAAEC,KAAK;EAAEC,MAAM;EAAEC;AAA2B,CAAC,EAAE;EAC3F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGhB,QAAQ,CAAC,CAAC;EAElC,MAAMiB,MAAM,GAAGxB,OAAO,CACpB,MAAMS,uBAAuB,CAACa,KAAK,EAAEC,IAAI,CAAC,EAC1C,CAACD,KAAK,EAAEC,IAAI,CACd,CAAC;EAED,MAAME,QAAQ,GAAGf,mBAAmB,CAACK,WAAW,CAAC;EAEjD,oBACEH,IAAA,CAACV,OAAO;IACNe,OAAO,EAAEA,OAAQ;IACjBS,WAAW;IACXC,aAAa,EAAC,OAAO;IACrBC,cAAc,EAAEV,OAAQ;IACxBW,oBAAoB;IAAAR,QAAA,eAEpBT,IAAA,CAACT,SAAS;MAAC2B,KAAK,EAAEN,MAAM,CAACO,YAAa;MAACC,OAAO,EAAEd,OAAQ;MAACe,UAAU,EAAE,KAAM;MAAAZ,QAAA,eACzET,IAAA,CAACN,IAAI;QACHwB,KAAK,EAAEN,MAAM,CAACU,UAAW;QACzBC,wBAAwB;QACxBC,yBAAyB,EAAEA,CAAA,KAAM,IAAK;QACtChB,MAAM,EAAEA,MAAO;QAAAC,QAAA,eAEfP,KAAA,CAACW,QAAQ;UAAAJ,QAAA,gBAEPT,IAAA,CAACN,IAAI;YACHwB,KAAK,EAAEN,MAAM,CAACa,YAAa;YAC3BC,yBAAyB,EAAC,IAAI;YAC9BC,2BAA2B;UAAA,CAC5B,CAAC,EACDpB,KAAK,IAAI,IAAI,iBACZP,IAAA,CAACP,MAAM;YAACyB,KAAK,EAAEN,MAAM,CAACgB,UAAW;YAACC,iBAAiB,EAAC,QAAQ;YAAApB,QAAA,EACzDF;UAAK,CACA,CACT,eACDP,IAAA,CAACN,IAAI;YAACwB,KAAK,EAAEN,MAAM,CAACkB,YAAa;YAAArB,QAAA,EAAEA;UAAQ,CAAO,CAAC;QAAA,CAC3C;MAAC,CACP;IAAC,CACE;EAAC,CACL,CAAC;AAEd;AAEAL,WAAW,CAAC2B,UAAU,GAAGnC,SAAS,CAACoC,WAAW","ignoreList":[]}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* scripts/lib/card-conformance.test.ts が行う。
|
|
10
10
|
* - variant: basic/media は非インタラクティブ、action/link は Pressable。
|
|
11
11
|
* action/link は pressed 時 elevation.sm→md(§2 hover→pressed mapping)。
|
|
12
|
-
* focus-within は RN
|
|
12
|
+
* focus-within は RN 非サポートとして明示 drop(§2)。
|
|
13
13
|
* - 型で action/link は onPress 必須を強制(§4 の DU 精神。無言で非対話に落ちる事故を防ぐ)。
|
|
14
14
|
* - **カード面自体は操作要素にしない**(contract 2.1.0 の a11y.required)。面の Pressable は
|
|
15
15
|
* `accessibilityRole` を名乗らず `accessible={false}`。理由は2つ:
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* react-native-web では実際に `<article>` 要素になる)。accessibilityRole 系とは別系統。
|
|
24
24
|
* - **focus ring は Card では描かない**。フォーカスを受けるのは `primaryAction` 側で、
|
|
25
25
|
* melta の Button は自前の ring を持つ。カードにも出すと1回のフォーカスで ring が二重に描かれる。
|
|
26
|
-
* contract の focus-within は RN
|
|
26
|
+
* contract の focus-within は RN 非サポートとして明示 drop 済み(app recipe に記録あり)で、
|
|
27
27
|
* web だけ動く実装を残すとプラットフォーム非対称になるため、実装ごと持たない。
|
|
28
28
|
* - `accessibilityLabel` は 0.5.0 で削除した。面が `accessible={false}` なので native では
|
|
29
29
|
* 原理的に読まれず、web だけ `aria-label` として効く非対称な prop だった。
|
|
@@ -127,6 +127,7 @@ export function Card({
|
|
|
127
127
|
});
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
//
|
|
130
|
+
// conformance test 用の contract メタ(§2 A-3)。scripts/lib/conformance.test.ts が
|
|
131
|
+
// 「この宣言が正しい contract を指しているか」を静的スキャンで照合する。
|
|
131
132
|
Card.__contract = CONTRACTS.card;
|
|
132
133
|
//# sourceMappingURL=Card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","Pressable","View","useTheme","CONTRACTS","isDev","CARD_INTERACTIVE","resolveCardShape","resolveCardBodyStyle","validateCardProps","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","reported","Set","Card","variant","header","footer","media","onPress","primaryAction","style","testID","children","theme","mode","interactive","problem","has","add","console","error","isMedia","inner","content","borderRadius","radius","lg","overflow","role","accessible","pressed","__contract","card"],"sourceRoot":"../../../src","sources":["components/Card.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,QAA2C,OAAO;AACpE,SAASC,SAAS,EAAEC,IAAI,QAAwC,cAAc;AAC9E,SAASC,QAAQ,QAAQ,
|
|
1
|
+
{"version":3,"names":["useEffect","Pressable","View","useTheme","CONTRACTS","isDev","CARD_INTERACTIVE","resolveCardShape","resolveCardBodyStyle","validateCardProps","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","reported","Set","Card","variant","header","footer","media","onPress","primaryAction","style","testID","children","theme","mode","interactive","problem","has","add","console","error","isMedia","inner","content","borderRadius","radius","lg","overflow","role","accessible","pressed","__contract","card"],"sourceRoot":"../../../src","sources":["components/Card.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
* - RN にネイティブ checkbox が無いため Pressable(行全体タップ)+ 描画で実装する。
|
|
7
7
|
* checkmark は rotate した View の L 字 border、indeterminate は横棒
|
|
8
8
|
* (react-native-svg 非依存 = 本体エントリの依存ゼロ維持。recipe description 参照)。
|
|
9
|
-
* - box は 20px(web の 16px
|
|
10
|
-
*
|
|
9
|
+
* - box は 20px(web の 16px より大きいのはタッチ前提)。実効タップ標的は行の
|
|
10
|
+
* minHeight 44 で確保する(規約 10-(b): 背景を持たない行は hitSlop でなく寸法)。
|
|
11
11
|
* - label 必須(FORM_NO_LABEL_OMIT を props 型で強制)。label は Text primitive
|
|
12
12
|
* (base/text-default = recipe labelStyle と同値)。
|
|
13
13
|
* - states(contract → prop の写像): checked/unchecked → checked:boolean、
|
|
14
14
|
* indeterminate → indeterminate:boolean(variant "indeterminate"。a11y は "mixed")、
|
|
15
15
|
* error → error:boolean(borderColor 差分、checked より優先)、disabled → prop
|
|
16
|
-
* (opacity 0.5 + 非活性)。focus
|
|
16
|
+
* (opacity 0.5 + 非活性)。focus は非対応(recipe にも focus 差分なし)。
|
|
17
17
|
* - 色・寸法の決定は pure resolver(checkbox.styles.ts)に分離。
|
|
18
18
|
* recipes/app/checkbox.recipe.json との機械照合は scripts/lib/checkbox-conformance.test.ts が行う。
|
|
19
19
|
*/
|
|
@@ -58,7 +58,6 @@ export function Checkbox({
|
|
|
58
58
|
return /*#__PURE__*/_jsxs(Pressable, {
|
|
59
59
|
onPress: () => onChange(!checked),
|
|
60
60
|
disabled: disabled,
|
|
61
|
-
hitSlop: CHECKBOX_SPEC.hitSlop,
|
|
62
61
|
accessibilityRole: "checkbox",
|
|
63
62
|
accessibilityState: {
|
|
64
63
|
checked: indeterminate ? "mixed" : checked,
|
|
@@ -70,6 +69,9 @@ export function Checkbox({
|
|
|
70
69
|
flexDirection: "row",
|
|
71
70
|
alignItems: "center",
|
|
72
71
|
gap: resolved.gap,
|
|
72
|
+
// 実効タップ標的 44pt。背景を持たない行なので hitSlop でなく minHeight(規約 10-(b)、
|
|
73
|
+
// 縦積みの隣接行と当たり判定が重ならない)
|
|
74
|
+
minHeight: CHECKBOX_SPEC.rowMinHeight,
|
|
73
75
|
opacity: disabled ? CHECKBOX_SPEC.disabledOpacity : 1
|
|
74
76
|
},
|
|
75
77
|
children: [/*#__PURE__*/_jsx(View, {
|
|
@@ -110,6 +112,7 @@ export function Checkbox({
|
|
|
110
112
|
});
|
|
111
113
|
}
|
|
112
114
|
|
|
113
|
-
//
|
|
115
|
+
// conformance test 用の contract メタ(§2 A-3)。scripts/lib/conformance.test.ts が
|
|
116
|
+
// 「この宣言が正しい contract を指しているか」を静的スキャンで照合する。
|
|
114
117
|
Checkbox.__contract = CONTRACTS.checkbox;
|
|
115
118
|
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","CHECKBOX_SPEC","resolveCheckboxStyle","jsx","_jsx","jsxs","_jsxs","CHECKMARK","width","height","borderWidth","offsetY","INDETERMINATE_BAR","Checkbox","label","checked","onChange","indeterminate","disabled","error","testID","theme","mode","resolved","onPress","
|
|
1
|
+
{"version":3,"names":["useMemo","Pressable","View","Text","useTheme","CONTRACTS","CHECKBOX_SPEC","resolveCheckboxStyle","jsx","_jsx","jsxs","_jsxs","CHECKMARK","width","height","borderWidth","offsetY","INDETERMINATE_BAR","Checkbox","label","checked","onChange","indeterminate","disabled","error","testID","theme","mode","resolved","onPress","accessibilityRole","accessibilityState","accessibilityLabel","style","flexDirection","alignItems","gap","minHeight","rowMinHeight","opacity","disabledOpacity","children","boxStyle","justifyContent","backgroundColor","markColor","borderLeftWidth","borderBottomWidth","borderColor","marginTop","transform","rotate","variant","color","__contract","checkbox"],"sourceRoot":"../../../src","sources":["components/Checkbox.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -65,6 +65,7 @@ export function EmptyState({
|
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
//
|
|
68
|
+
// conformance test 用の contract メタ(§2 A-3)。scripts/lib/conformance.test.ts が
|
|
69
|
+
// 「この宣言が正しい contract を指しているか」を静的スキャンで照合する。
|
|
69
70
|
EmptyState.__contract = CONTRACTS.emptyState;
|
|
70
71
|
//# sourceMappingURL=EmptyState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMemo","View","Text","Button","useTheme","CONTRACTS","EMPTY_STATE_SPEC","resolveEmptyStateStyles","jsx","_jsx","jsxs","_jsxs","EmptyState","icon","title","description","action","style","testID","theme","mode","styles","children","variant","titleFont","role","weight","titleWeight","color","titleColor","textAlign","titleStyle","descriptionFont","descriptionColor","descriptionStyle","actionStyle","label","onPress","__contract","emptyState"],"sourceRoot":"../../../src","sources":["components/EmptyState.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,IAAI,QAAwC,cAAc;AACnE,SAASC,IAAI,QAAQ,
|
|
1
|
+
{"version":3,"names":["useMemo","View","Text","Button","useTheme","CONTRACTS","EMPTY_STATE_SPEC","resolveEmptyStateStyles","jsx","_jsx","jsxs","_jsxs","EmptyState","icon","title","description","action","style","testID","theme","mode","styles","children","variant","titleFont","role","weight","titleWeight","color","titleColor","textAlign","titleStyle","descriptionFont","descriptionColor","descriptionStyle","actionStyle","label","onPress","__contract","emptyState"],"sourceRoot":"../../../src","sources":["components/EmptyState.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,OAAO,QAAwB,OAAO;AAC/C,SAASC,IAAI,QAAwC,cAAc;AACnE,SAASC,IAAI,QAAQ,uBAAuB;AAC5C,SAASC,MAAM,QAAQ,yBAAyB;AAChD,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,SAAS,QAAQ,gCAAgC;AAC1D,SAASC,gBAAgB,EAAEC,uBAAuB,QAAQ,yBAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAWpF,OAAO,SAASC,UAAUA,CAAC;EAAEC,IAAI;EAAEC,KAAK;EAAEC,WAAW;EAAEC,MAAM;EAAEC,KAAK;EAAEC;AAAwB,CAAC,EAAE;EAC/F,MAAM;IAAEC,KAAK;IAAEC;EAAK,CAAC,GAAGhB,QAAQ,CAAC,CAAC;EAClC,MAAMiB,MAAM,GAAGrB,OAAO,CAAC,MAAMO,uBAAuB,CAACY,KAAK,EAAEC,IAAI,CAAC,EAAE,CAACD,KAAK,EAAEC,IAAI,CAAC,CAAC;EACjF,oBACET,KAAA,CAACV,IAAI;IAACiB,MAAM,EAAEA,MAAO;IAACD,KAAK,EAAE,CAACI,MAAM,CAACJ,KAAK,EAAEA,KAAK,CAAE;IAAAK,QAAA,GAChDT,IAAI,IAAI,IAAI,iBAAIJ,IAAA,CAACR,IAAI;MAAAqB,QAAA,EAAET;IAAI,CAAO,CAAC,eACpCJ,IAAA,CAACP,IAAI;MACHqB,OAAO,EAAEjB,gBAAgB,CAACkB,SAAU;MACpCC,IAAI,EAAC,SAAS;MACdC,MAAM,EAAEpB,gBAAgB,CAACqB,WAAY;MACrCC,KAAK,EAAEtB,gBAAgB,CAACuB,UAAW;MACnCZ,KAAK,EAAE;QAAEa,SAAS,EAAET,MAAM,CAACU,UAAU,CAACD;MAAU,CAAE;MAAAR,QAAA,EAEjDR;IAAK,CACF,CAAC,EACNC,WAAW,IAAI,IAAI,iBAClBN,IAAA,CAACP,IAAI;MACHqB,OAAO,EAAEjB,gBAAgB,CAAC0B,eAAgB;MAC1CJ,KAAK,EAAEtB,gBAAgB,CAAC2B,gBAAiB;MACzChB,KAAK,EAAE;QAAEa,SAAS,EAAET,MAAM,CAACa,gBAAgB,CAACJ;MAAU,CAAE;MAAAR,QAAA,EAEvDP;IAAW,CACR,CACP,EACAC,MAAM,IAAI,IAAI,iBACbP,IAAA,CAACR,IAAI;MAACgB,KAAK,EAAEI,MAAM,CAACc,WAAY;MAAAb,QAAA,eAC9Bb,IAAA,CAACN,MAAM;QAACoB,OAAO,EAAC,WAAW;QAACa,KAAK,EAAEpB,MAAM,CAACoB,KAAM;QAACC,OAAO,EAAErB,MAAM,CAACqB;MAAQ,CAAE;IAAC,CACxE,CACP;EAAA,CACG,CAAC;AAEX;;AAEA;AACA;AACAzB,UAAU,CAAC0B,UAAU,GAAGjC,SAAS,CAACkC,UAAU","ignoreList":[]}
|