@momo-kits/native-kits 0.157.5-debug → 0.158.1-beta.1-debug
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/.claude/settings.local.json +11 -0
- package/.claude/skills/design-system/SKILL.md +88 -0
- package/.claude/skills/design-system/references/components/avatar.md +134 -0
- package/.claude/skills/design-system/references/components/badge.md +127 -0
- package/.claude/skills/design-system/references/components/bottom-tab.md +177 -0
- package/.claude/skills/design-system/references/components/bottomsheet.md +170 -0
- package/.claude/skills/design-system/references/components/button.md +206 -0
- package/.claude/skills/design-system/references/components/carousel.md +117 -0
- package/.claude/skills/design-system/references/components/checkbox.md +98 -0
- package/.claude/skills/design-system/references/components/chip.md +146 -0
- package/.claude/skills/design-system/references/components/collapse.md +120 -0
- package/.claude/skills/design-system/references/components/date-picker.md +119 -0
- package/.claude/skills/design-system/references/components/divider.md +84 -0
- package/.claude/skills/design-system/references/components/icon.md +130 -0
- package/.claude/skills/design-system/references/components/image.md +81 -0
- package/.claude/skills/design-system/references/components/information.md +107 -0
- package/.claude/skills/design-system/references/components/input-dropdown.md +138 -0
- package/.claude/skills/design-system/references/components/input-money.md +157 -0
- package/.claude/skills/design-system/references/components/input-otp.md +132 -0
- package/.claude/skills/design-system/references/components/input-phone-number.md +140 -0
- package/.claude/skills/design-system/references/components/input-search.md +124 -0
- package/.claude/skills/design-system/references/components/input-text-area.md +133 -0
- package/.claude/skills/design-system/references/components/input.md +152 -0
- package/.claude/skills/design-system/references/components/loader.md +87 -0
- package/.claude/skills/design-system/references/components/pagination.md +105 -0
- package/.claude/skills/design-system/references/components/popup-notify.md +128 -0
- package/.claude/skills/design-system/references/components/progress-info.md +114 -0
- package/.claude/skills/design-system/references/components/radio.md +86 -0
- package/.claude/skills/design-system/references/components/rating.md +126 -0
- package/.claude/skills/design-system/references/components/skeleton.md +120 -0
- package/.claude/skills/design-system/references/components/slider.md +141 -0
- package/.claude/skills/design-system/references/components/snackbar.md +97 -0
- package/.claude/skills/design-system/references/components/stepper.md +100 -0
- package/.claude/skills/design-system/references/components/steps.md +91 -0
- package/.claude/skills/design-system/references/components/suggest-action.md +95 -0
- package/.claude/skills/design-system/references/components/swipe.md +121 -0
- package/.claude/skills/design-system/references/components/switch.md +98 -0
- package/.claude/skills/design-system/references/components/tab-view.md +120 -0
- package/.claude/skills/design-system/references/components/tag.md +118 -0
- package/.claude/skills/design-system/references/components/text.md +151 -0
- package/.claude/skills/design-system/references/components/toast.md +99 -0
- package/.claude/skills/design-system/references/components/tooltip.md +138 -0
- package/.claude/skills/design-system/references/components/top-nav-miniapp.md +94 -0
- package/.claude/skills/design-system/references/components/top-nav.md +226 -0
- package/.claude/skills/design-system/references/components/uploader.md +115 -0
- package/.claude/skills/design-system/references/navigation/bottom-tab.md +131 -0
- package/.claude/skills/design-system/references/navigation/bottomsheet.md +161 -0
- package/.claude/skills/design-system/references/navigation/modal.md +133 -0
- package/.claude/skills/design-system/references/navigation/navigation-options.md +225 -0
- package/.claude/skills/design-system/references/navigation/navigator.md +111 -0
- package/.claude/skills/design-system/references/navigation/setup.md +134 -0
- package/.claude/skills/design-system/references/navigation/stack.md +128 -0
- package/.claude/skills/design-system/references/spec-convention.md +80 -0
- package/.claude/skills/design-system/references/tokens/colors.md +131 -0
- package/.claude/skills/design-system/references/tokens/spacing-radius.md +144 -0
- package/.claude/skills/design-system/references/tokens/theme.md +125 -0
- package/.claude/skills/design-system/references/tokens/typography.md +135 -0
- package/.claude/skills/design-system-kits/SKILL.md +102 -0
- package/.claude/skills/design-system-kits/references/code-convention.md +118 -0
- package/.claude/skills/design-system-kits/references/components/avatar.md +45 -0
- package/.claude/skills/design-system-kits/references/components/badge.md +27 -0
- package/.claude/skills/design-system-kits/references/components/button.md +65 -0
- package/.claude/skills/design-system-kits/references/components/carousel.md +51 -0
- package/.claude/skills/design-system-kits/references/components/checkbox.md +39 -0
- package/.claude/skills/design-system-kits/references/components/chip.md +54 -0
- package/.claude/skills/design-system-kits/references/components/collapse.md +63 -0
- package/.claude/skills/design-system-kits/references/components/date-picker.md +36 -0
- package/.claude/skills/design-system-kits/references/components/divider.md +21 -0
- package/.claude/skills/design-system-kits/references/components/icon.md +382 -0
- package/.claude/skills/design-system-kits/references/components/image.md +62 -0
- package/.claude/skills/design-system-kits/references/components/information.md +61 -0
- package/.claude/skills/design-system-kits/references/components/input-dropdown.md +92 -0
- package/.claude/skills/design-system-kits/references/components/input-money.md +128 -0
- package/.claude/skills/design-system-kits/references/components/input-otp.md +85 -0
- package/.claude/skills/design-system-kits/references/components/input-phone-number.md +96 -0
- package/.claude/skills/design-system-kits/references/components/input-search.md +127 -0
- package/.claude/skills/design-system-kits/references/components/input-text-area.md +100 -0
- package/.claude/skills/design-system-kits/references/components/input.md +126 -0
- package/.claude/skills/design-system-kits/references/components/loader.md +41 -0
- package/.claude/skills/design-system-kits/references/components/pagination.md +47 -0
- package/.claude/skills/design-system-kits/references/components/popup-notify.md +69 -0
- package/.claude/skills/design-system-kits/references/components/popup-promotion.md +35 -0
- package/.claude/skills/design-system-kits/references/components/progress-info.md +55 -0
- package/.claude/skills/design-system-kits/references/components/radio.md +42 -0
- package/.claude/skills/design-system-kits/references/components/rating.md +36 -0
- package/.claude/skills/design-system-kits/references/components/skeleton.md +25 -0
- package/.claude/skills/design-system-kits/references/components/slider.md +53 -0
- package/.claude/skills/design-system-kits/references/components/snackbar.md +52 -0
- package/.claude/skills/design-system-kits/references/components/stepper.md +46 -0
- package/.claude/skills/design-system-kits/references/components/steps.md +57 -0
- package/.claude/skills/design-system-kits/references/components/suggest-action.md +44 -0
- package/.claude/skills/design-system-kits/references/components/swipe.md +44 -0
- package/.claude/skills/design-system-kits/references/components/switch.md +43 -0
- package/.claude/skills/design-system-kits/references/components/tab-view.md +56 -0
- package/.claude/skills/design-system-kits/references/components/tag.md +50 -0
- package/.claude/skills/design-system-kits/references/components/text.md +56 -0
- package/.claude/skills/design-system-kits/references/components/toast.md +51 -0
- package/.claude/skills/design-system-kits/references/components/tooltip.md +95 -0
- package/.claude/skills/design-system-kits/references/components/uploader.md +48 -0
- package/.claude/skills/design-system-kits/references/design-spec-structure.md +356 -0
- package/.claude/skills/design-system-kits/references/design-spec-to-code.md +596 -0
- package/.claude/skills/design-system-kits/references/navigation/bottom-tab.md +155 -0
- package/.claude/skills/design-system-kits/references/navigation/bottomsheet.md +94 -0
- package/.claude/skills/design-system-kits/references/navigation/modal.md +125 -0
- package/.claude/skills/design-system-kits/references/navigation/navigation-options.md +430 -0
- package/.claude/skills/design-system-kits/references/navigation/navigator.md +177 -0
- package/.claude/skills/design-system-kits/references/navigation/setup.md +94 -0
- package/.claude/skills/design-system-kits/references/navigation/stack.md +152 -0
- package/.claude/skills/design-system-kits/references/screen-layout-rule.md +125 -0
- package/.claude/skills/design-system-kits/references/tokens/colors.md +183 -0
- package/.claude/skills/design-system-kits/references/tokens/spacing-radius.md +45 -0
- package/.claude/skills/design-system-kits/references/tokens/theme.md +97 -0
- package/.claude/skills/design-system-kits/references/tokens/typography.md +105 -0
- package/.claude/skills/vibe-design/SKILL.md +306 -0
- package/compose/build.gradle.kts +1 -1
- package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +7 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +2 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +3 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +5 -2
- package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +2 -11
- package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +5 -1
- package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +12 -0
- package/gradle.properties +1 -1
- package/ios/Popup/PopupPromotion.swift +2 -2
- package/local.properties +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
# Design Spec JSON Structure
|
|
2
|
+
|
|
3
|
+
Design specs define a full screen. This reference explains the JSON schema — what each field means and how it is structured.
|
|
4
|
+
|
|
5
|
+
For **how to translate this JSON into platform code**, see `design-spec-to-code.md`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Top-Level Schema
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"meta": { }, // Screen metadata (name, version, description)
|
|
14
|
+
"components": [ ], // Custom component blueprints (reusable sub-components)
|
|
15
|
+
"header": { }, // Header configuration (title, back, right buttons)
|
|
16
|
+
"body": { }, // Scrollable body content
|
|
17
|
+
"footer": { }, // Sticky footer content
|
|
18
|
+
"tabs": null, // BottomTab config (null = no tabs, object = BottomTab wrapper)
|
|
19
|
+
"tracking": { }, // Analytics event definitions
|
|
20
|
+
"localization": { }, // i18n strings (vi, en)
|
|
21
|
+
"actions": { } // Handler implementations (description + code)
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## `meta`
|
|
28
|
+
|
|
29
|
+
Screen identity. `screenName` becomes the component/function name.
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"meta": {
|
|
34
|
+
"screenName": "MoneyTransferScreen",
|
|
35
|
+
"version": "1.0.0",
|
|
36
|
+
"description": "Human-readable purpose of this screen"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
| Field | Type | Purpose |
|
|
42
|
+
|-------|------|---------|
|
|
43
|
+
| `screenName` | `string` | Component name |
|
|
44
|
+
| `version` | `string` | Spec version |
|
|
45
|
+
| `description` | `string` | Human-readable summary |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## `components`
|
|
50
|
+
|
|
51
|
+
Array of custom component **blueprints**. Each defines a reusable sub-component referenced in `body.children` or `footer.children`.
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"type": "SecurityBanner",
|
|
56
|
+
"props": {
|
|
57
|
+
"description": "string",
|
|
58
|
+
"aiLabel": "string",
|
|
59
|
+
"onPressMore": "function"
|
|
60
|
+
},
|
|
61
|
+
"styles": { "flexDirection": "row", "backgroundColor": "Colors.green_08" },
|
|
62
|
+
"children": [
|
|
63
|
+
{ "type": "Icon", "props": { "source": "24_check_circle", "size": 24, "color": "Colors.green_03" } },
|
|
64
|
+
{ "type": "Text", "props": { "typography": "body_default_regular", "children": "{description}" }, "styles": { "flex": 1 } },
|
|
65
|
+
{ "type": "Tag", "props": { "label": "{aiLabel}", "icon": "16_sparkle", "customColor": "Colors.pink_03" } }
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Fields
|
|
71
|
+
|
|
72
|
+
| Field | Type | Purpose |
|
|
73
|
+
|-------|------|---------|
|
|
74
|
+
| `type` | `string` | Component name (PascalCase) |
|
|
75
|
+
| `props` | `object` | Input props — key = name, value = type hint |
|
|
76
|
+
| `styles` | `object` | Root container style (optional) |
|
|
77
|
+
| `children` | `array` | Child elements using same `{ type, props, styles, children }` structure |
|
|
78
|
+
|
|
79
|
+
### Prop Type Hints
|
|
80
|
+
|
|
81
|
+
| Spec value | Meaning |
|
|
82
|
+
|------------|---------|
|
|
83
|
+
| `"string"` | Text value |
|
|
84
|
+
| `"number"` | Numeric value |
|
|
85
|
+
| `"function"` | Callback/handler |
|
|
86
|
+
| `"array"` | List of items |
|
|
87
|
+
| `"boolean"` | True/false |
|
|
88
|
+
|
|
89
|
+
### Child Element Format
|
|
90
|
+
|
|
91
|
+
Each child uses the same consistent structure with `type`, `props`, `styles`, and optionally `children`:
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
{ "type": "ComponentName", "props": { "prop1": "value1" }, "styles": { "flex": 1 } }
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- **Design system components** (Icon, Text, Tag, Chip, Button, Image, etc.) come from the component library
|
|
98
|
+
- **`View`** and **`Pressable`** are platform primitives (RN) or layout wrappers (Compose)
|
|
99
|
+
- Children can be **nested** — a `View` or `Pressable` can have its own `children` array
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## `header`
|
|
104
|
+
|
|
105
|
+
Configures the screen header. See `navigation-options.md` for detailed header type references.
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"header": {
|
|
110
|
+
"type": "Header",
|
|
111
|
+
"props": {
|
|
112
|
+
"useBack": true,
|
|
113
|
+
"headerType": "extended",
|
|
114
|
+
"headerTitle": {
|
|
115
|
+
"type": "user",
|
|
116
|
+
"data": { "title": "{name}", "subTitle": "{phone}", "image": "{avatar}" }
|
|
117
|
+
},
|
|
118
|
+
"headerRight": {
|
|
119
|
+
"useShortcut": false,
|
|
120
|
+
"useMore": false,
|
|
121
|
+
"useCloseIcon": false,
|
|
122
|
+
"tools": [
|
|
123
|
+
{
|
|
124
|
+
"title": { "vi": "Tiện ích", "en": "Tools" },
|
|
125
|
+
"items": [
|
|
126
|
+
{ "icon": "24_help_center", "name": { "vi": "Trợ giúp", "en": "Help" }, "key": "help" }
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Props
|
|
137
|
+
|
|
138
|
+
| Prop | Type | Purpose |
|
|
139
|
+
|------|------|---------|
|
|
140
|
+
| `useBack` | `boolean` | Show back button |
|
|
141
|
+
| `headerType` | `string` | `"default"` / `"extended"` / `"none"` |
|
|
142
|
+
| `headerTitle` | `string \| object` | Simple string or typed title object |
|
|
143
|
+
| `headerBackground` | `string` | Background image URL |
|
|
144
|
+
| `useShadowHeader` | `boolean` | Shadow below header |
|
|
145
|
+
| `headerRight` | `object` | Right toolbar configuration |
|
|
146
|
+
|
|
147
|
+
### `headerTitle` Types
|
|
148
|
+
|
|
149
|
+
| `type` | Shows | `data` fields |
|
|
150
|
+
|--------|-------|---------------|
|
|
151
|
+
| `"user"` | Avatar + name + subtitle | `title`, `subTitle`, `image`, `dotColor`, `icons` |
|
|
152
|
+
| `"location"` | Location with chevron | `location`, `description` |
|
|
153
|
+
| `"journey"` | Start/end points | `start`, `end`, `description`, `icon` |
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## `body`
|
|
158
|
+
|
|
159
|
+
Screen body content. References components defined in `components` array.
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"body": {
|
|
164
|
+
"scrollable": true,
|
|
165
|
+
"style": { "flex": 1, "backgroundColor": "Colors.black_02" },
|
|
166
|
+
"children": [
|
|
167
|
+
{ "type": "SecurityBanner", "props": { "description": "{securityText}" } },
|
|
168
|
+
{ "type": "TransferCard", "props": { "amount": "{transferAmount}" } }
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
| Field | Type | Purpose |
|
|
175
|
+
|-------|------|---------|
|
|
176
|
+
| `scrollable` | `boolean` | Whether body scrolls |
|
|
177
|
+
| `style` | `object` | Body container style |
|
|
178
|
+
| `children` | `array` | Ordered list of components to render |
|
|
179
|
+
|
|
180
|
+
Each child references either:
|
|
181
|
+
- A **custom component** from `components[]` (matched by `type`)
|
|
182
|
+
- A **design system component** (Button, Text, etc.) used directly
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## `footer`
|
|
187
|
+
|
|
188
|
+
Sticky footer at the bottom of the screen.
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
{
|
|
192
|
+
"footer": {
|
|
193
|
+
"style": { "padding": "Spacing.M", "backgroundColor": "Colors.black_01" },
|
|
194
|
+
"children": [
|
|
195
|
+
{
|
|
196
|
+
"type": "Button",
|
|
197
|
+
"props": { "title": "{text}", "type": "disabled", "size": "large", "full": true }
|
|
198
|
+
}
|
|
199
|
+
]
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
| Field | Type | Purpose |
|
|
205
|
+
|-------|------|---------|
|
|
206
|
+
| `style` | `object` | Footer container style (**note: skip padding/margin/backgroundColor in code — Screen/Navigation footer already provides spacing and shadow**) |
|
|
207
|
+
| `children` | `array` | Components inside footer |
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## `tabs`
|
|
212
|
+
|
|
213
|
+
Optional BottomTab configuration. When `null`, the screen is a standalone screen. When an object, a `{ScreenName}Tab` wrapper component is generated using `BottomTab`.
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"tabs": {
|
|
218
|
+
"indexActive": 0,
|
|
219
|
+
"floatingButton": {
|
|
220
|
+
"icon": "ic_scan",
|
|
221
|
+
"label": "Quét mọi QR",
|
|
222
|
+
"screen": "ScanScreen"
|
|
223
|
+
},
|
|
224
|
+
"items": [
|
|
225
|
+
{
|
|
226
|
+
"name": "MoneyTransfer",
|
|
227
|
+
"label": "Chuyển tiền",
|
|
228
|
+
"icon": "ic_transfer"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"name": "Profile",
|
|
232
|
+
"label": "Tôi",
|
|
233
|
+
"icon": "ic_profile",
|
|
234
|
+
"screen": "ProfileScreen"
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
| Field | Type | Purpose |
|
|
242
|
+
|-------|------|---------|
|
|
243
|
+
| `null` | — | No tabs — screen is standalone |
|
|
244
|
+
| `object` | `TabsConfig` | Defines BottomTab tabs — generates a `{ScreenName}Tab` wrapper |
|
|
245
|
+
|
|
246
|
+
### TabsConfig Fields
|
|
247
|
+
|
|
248
|
+
| Field | Type | Purpose |
|
|
249
|
+
|-------|------|---------|
|
|
250
|
+
| `indexActive` | `number` | Index into `items` array — that tab renders the screen from this spec |
|
|
251
|
+
| `floatingButton` | `object \| {}` | Center floating button config. `{}` = no floating button |
|
|
252
|
+
| `items` | `TabItem[]` | Regular tab items (excludes floating button) |
|
|
253
|
+
|
|
254
|
+
### FloatingButton Fields
|
|
255
|
+
|
|
256
|
+
| Field | Type | Purpose |
|
|
257
|
+
|-------|------|---------|
|
|
258
|
+
| `icon` | `string` | Floating button icon source |
|
|
259
|
+
| `label` | `string` | Button label text or `{variable}` reference |
|
|
260
|
+
| `screen` | `string` | Component name to navigate to on press |
|
|
261
|
+
|
|
262
|
+
### TabItem Fields
|
|
263
|
+
|
|
264
|
+
| Field | Type | Purpose |
|
|
265
|
+
|-------|------|---------|
|
|
266
|
+
| `name` | `string` | Tab route identifier |
|
|
267
|
+
| `label` | `string` | Tab bar label text or `{variable}` reference |
|
|
268
|
+
| `icon` | `string` | Tab icon source |
|
|
269
|
+
| `screen` | `string` | Component name for non-active tabs |
|
|
270
|
+
| `badgeLabel` | `string` | Optional badge: `""` = dot, `"3"` = count |
|
|
271
|
+
|
|
272
|
+
- The tab at `items[indexActive]` maps to the screen from this spec's `header`/`body`/`footer`
|
|
273
|
+
- Other tabs reference external screen components by `screen` name (placeholder screens are generated if they don't exist)
|
|
274
|
+
- The `initialRouteName` defaults to `items[indexActive].name`
|
|
275
|
+
- When `floatingButton` is not empty (`{}`), it becomes the BottomTab's `floatingButton` prop (centered FAB)
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## `tracking`
|
|
280
|
+
|
|
281
|
+
Analytics event definitions. Each event has a name, description, and typed properties.
|
|
282
|
+
|
|
283
|
+
```json
|
|
284
|
+
{
|
|
285
|
+
"tracking": {
|
|
286
|
+
"events": [
|
|
287
|
+
{
|
|
288
|
+
"name": "TransferAmountChanged",
|
|
289
|
+
"description": "User changed the transfer amount",
|
|
290
|
+
"properties": { "amount": "string", "timestamp": "string" }
|
|
291
|
+
}
|
|
292
|
+
]
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## `localization`
|
|
300
|
+
|
|
301
|
+
i18n strings keyed by locale code. `vi` is the default for Vietnamese apps.
|
|
302
|
+
|
|
303
|
+
```json
|
|
304
|
+
{
|
|
305
|
+
"localization": {
|
|
306
|
+
"vi": { "recipientName": "Anh Dũng Hồng", "quickMessageList": ["msg1", "msg2"] },
|
|
307
|
+
"en": { "recipientName": "Anh Dũng Hồng", "quickMessageList": ["msg1", "msg2"] }
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Use as default state values, placeholder text, and display strings.
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## `actions`
|
|
317
|
+
|
|
318
|
+
Handler implementations. Each has a description and a code snippet.
|
|
319
|
+
|
|
320
|
+
```json
|
|
321
|
+
{
|
|
322
|
+
"actions": {
|
|
323
|
+
"handleChangeAmount": {
|
|
324
|
+
"description": "Updates the transfer amount value",
|
|
325
|
+
"code": "setTransferAmount(value);"
|
|
326
|
+
},
|
|
327
|
+
"handlePressGreetingCard": {
|
|
328
|
+
"description": "Opens the greeting card picker modal",
|
|
329
|
+
"code": "navigation.navigate('GreetingCardPicker');"
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Token Syntax (applies everywhere)
|
|
338
|
+
|
|
339
|
+
Design token strings reference design system values. **Never hardcode raw values.**
|
|
340
|
+
|
|
341
|
+
| Spec string | Meaning |
|
|
342
|
+
|-------------|---------|
|
|
343
|
+
| `"Colors.pink_03"` | Color token |
|
|
344
|
+
| `"Spacing.L"` | Spacing token (16) |
|
|
345
|
+
| `"Radius.M"` | Border radius token (12) |
|
|
346
|
+
|
|
347
|
+
## Variable Reference Syntax (applies everywhere)
|
|
348
|
+
|
|
349
|
+
Values wrapped in `{...}` are dynamic references to props, state, or data:
|
|
350
|
+
|
|
351
|
+
| Spec value | Meaning |
|
|
352
|
+
|------------|---------|
|
|
353
|
+
| `"{amount}"` | Prop or state variable |
|
|
354
|
+
| `"{onPress}"` | Callback prop |
|
|
355
|
+
| `"{quickMessages[0]}"` | Array element access |
|
|
356
|
+
| `"{greetingCardImage}"` | Data variable |
|