@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.
Files changed (139) hide show
  1. package/.claude/settings.local.json +11 -0
  2. package/.claude/skills/design-system/SKILL.md +88 -0
  3. package/.claude/skills/design-system/references/components/avatar.md +134 -0
  4. package/.claude/skills/design-system/references/components/badge.md +127 -0
  5. package/.claude/skills/design-system/references/components/bottom-tab.md +177 -0
  6. package/.claude/skills/design-system/references/components/bottomsheet.md +170 -0
  7. package/.claude/skills/design-system/references/components/button.md +206 -0
  8. package/.claude/skills/design-system/references/components/carousel.md +117 -0
  9. package/.claude/skills/design-system/references/components/checkbox.md +98 -0
  10. package/.claude/skills/design-system/references/components/chip.md +146 -0
  11. package/.claude/skills/design-system/references/components/collapse.md +120 -0
  12. package/.claude/skills/design-system/references/components/date-picker.md +119 -0
  13. package/.claude/skills/design-system/references/components/divider.md +84 -0
  14. package/.claude/skills/design-system/references/components/icon.md +130 -0
  15. package/.claude/skills/design-system/references/components/image.md +81 -0
  16. package/.claude/skills/design-system/references/components/information.md +107 -0
  17. package/.claude/skills/design-system/references/components/input-dropdown.md +138 -0
  18. package/.claude/skills/design-system/references/components/input-money.md +157 -0
  19. package/.claude/skills/design-system/references/components/input-otp.md +132 -0
  20. package/.claude/skills/design-system/references/components/input-phone-number.md +140 -0
  21. package/.claude/skills/design-system/references/components/input-search.md +124 -0
  22. package/.claude/skills/design-system/references/components/input-text-area.md +133 -0
  23. package/.claude/skills/design-system/references/components/input.md +152 -0
  24. package/.claude/skills/design-system/references/components/loader.md +87 -0
  25. package/.claude/skills/design-system/references/components/pagination.md +105 -0
  26. package/.claude/skills/design-system/references/components/popup-notify.md +128 -0
  27. package/.claude/skills/design-system/references/components/progress-info.md +114 -0
  28. package/.claude/skills/design-system/references/components/radio.md +86 -0
  29. package/.claude/skills/design-system/references/components/rating.md +126 -0
  30. package/.claude/skills/design-system/references/components/skeleton.md +120 -0
  31. package/.claude/skills/design-system/references/components/slider.md +141 -0
  32. package/.claude/skills/design-system/references/components/snackbar.md +97 -0
  33. package/.claude/skills/design-system/references/components/stepper.md +100 -0
  34. package/.claude/skills/design-system/references/components/steps.md +91 -0
  35. package/.claude/skills/design-system/references/components/suggest-action.md +95 -0
  36. package/.claude/skills/design-system/references/components/swipe.md +121 -0
  37. package/.claude/skills/design-system/references/components/switch.md +98 -0
  38. package/.claude/skills/design-system/references/components/tab-view.md +120 -0
  39. package/.claude/skills/design-system/references/components/tag.md +118 -0
  40. package/.claude/skills/design-system/references/components/text.md +151 -0
  41. package/.claude/skills/design-system/references/components/toast.md +99 -0
  42. package/.claude/skills/design-system/references/components/tooltip.md +138 -0
  43. package/.claude/skills/design-system/references/components/top-nav-miniapp.md +94 -0
  44. package/.claude/skills/design-system/references/components/top-nav.md +226 -0
  45. package/.claude/skills/design-system/references/components/uploader.md +115 -0
  46. package/.claude/skills/design-system/references/navigation/bottom-tab.md +131 -0
  47. package/.claude/skills/design-system/references/navigation/bottomsheet.md +161 -0
  48. package/.claude/skills/design-system/references/navigation/modal.md +133 -0
  49. package/.claude/skills/design-system/references/navigation/navigation-options.md +225 -0
  50. package/.claude/skills/design-system/references/navigation/navigator.md +111 -0
  51. package/.claude/skills/design-system/references/navigation/setup.md +134 -0
  52. package/.claude/skills/design-system/references/navigation/stack.md +128 -0
  53. package/.claude/skills/design-system/references/spec-convention.md +80 -0
  54. package/.claude/skills/design-system/references/tokens/colors.md +131 -0
  55. package/.claude/skills/design-system/references/tokens/spacing-radius.md +144 -0
  56. package/.claude/skills/design-system/references/tokens/theme.md +125 -0
  57. package/.claude/skills/design-system/references/tokens/typography.md +135 -0
  58. package/.claude/skills/design-system-kits/SKILL.md +102 -0
  59. package/.claude/skills/design-system-kits/references/code-convention.md +118 -0
  60. package/.claude/skills/design-system-kits/references/components/avatar.md +45 -0
  61. package/.claude/skills/design-system-kits/references/components/badge.md +27 -0
  62. package/.claude/skills/design-system-kits/references/components/button.md +65 -0
  63. package/.claude/skills/design-system-kits/references/components/carousel.md +51 -0
  64. package/.claude/skills/design-system-kits/references/components/checkbox.md +39 -0
  65. package/.claude/skills/design-system-kits/references/components/chip.md +54 -0
  66. package/.claude/skills/design-system-kits/references/components/collapse.md +63 -0
  67. package/.claude/skills/design-system-kits/references/components/date-picker.md +36 -0
  68. package/.claude/skills/design-system-kits/references/components/divider.md +21 -0
  69. package/.claude/skills/design-system-kits/references/components/icon.md +382 -0
  70. package/.claude/skills/design-system-kits/references/components/image.md +62 -0
  71. package/.claude/skills/design-system-kits/references/components/information.md +61 -0
  72. package/.claude/skills/design-system-kits/references/components/input-dropdown.md +92 -0
  73. package/.claude/skills/design-system-kits/references/components/input-money.md +128 -0
  74. package/.claude/skills/design-system-kits/references/components/input-otp.md +85 -0
  75. package/.claude/skills/design-system-kits/references/components/input-phone-number.md +96 -0
  76. package/.claude/skills/design-system-kits/references/components/input-search.md +127 -0
  77. package/.claude/skills/design-system-kits/references/components/input-text-area.md +100 -0
  78. package/.claude/skills/design-system-kits/references/components/input.md +126 -0
  79. package/.claude/skills/design-system-kits/references/components/loader.md +41 -0
  80. package/.claude/skills/design-system-kits/references/components/pagination.md +47 -0
  81. package/.claude/skills/design-system-kits/references/components/popup-notify.md +69 -0
  82. package/.claude/skills/design-system-kits/references/components/popup-promotion.md +35 -0
  83. package/.claude/skills/design-system-kits/references/components/progress-info.md +55 -0
  84. package/.claude/skills/design-system-kits/references/components/radio.md +42 -0
  85. package/.claude/skills/design-system-kits/references/components/rating.md +36 -0
  86. package/.claude/skills/design-system-kits/references/components/skeleton.md +25 -0
  87. package/.claude/skills/design-system-kits/references/components/slider.md +53 -0
  88. package/.claude/skills/design-system-kits/references/components/snackbar.md +52 -0
  89. package/.claude/skills/design-system-kits/references/components/stepper.md +46 -0
  90. package/.claude/skills/design-system-kits/references/components/steps.md +57 -0
  91. package/.claude/skills/design-system-kits/references/components/suggest-action.md +44 -0
  92. package/.claude/skills/design-system-kits/references/components/swipe.md +44 -0
  93. package/.claude/skills/design-system-kits/references/components/switch.md +43 -0
  94. package/.claude/skills/design-system-kits/references/components/tab-view.md +56 -0
  95. package/.claude/skills/design-system-kits/references/components/tag.md +50 -0
  96. package/.claude/skills/design-system-kits/references/components/text.md +56 -0
  97. package/.claude/skills/design-system-kits/references/components/toast.md +51 -0
  98. package/.claude/skills/design-system-kits/references/components/tooltip.md +95 -0
  99. package/.claude/skills/design-system-kits/references/components/uploader.md +48 -0
  100. package/.claude/skills/design-system-kits/references/design-spec-structure.md +356 -0
  101. package/.claude/skills/design-system-kits/references/design-spec-to-code.md +596 -0
  102. package/.claude/skills/design-system-kits/references/navigation/bottom-tab.md +155 -0
  103. package/.claude/skills/design-system-kits/references/navigation/bottomsheet.md +94 -0
  104. package/.claude/skills/design-system-kits/references/navigation/modal.md +125 -0
  105. package/.claude/skills/design-system-kits/references/navigation/navigation-options.md +430 -0
  106. package/.claude/skills/design-system-kits/references/navigation/navigator.md +177 -0
  107. package/.claude/skills/design-system-kits/references/navigation/setup.md +94 -0
  108. package/.claude/skills/design-system-kits/references/navigation/stack.md +152 -0
  109. package/.claude/skills/design-system-kits/references/screen-layout-rule.md +125 -0
  110. package/.claude/skills/design-system-kits/references/tokens/colors.md +183 -0
  111. package/.claude/skills/design-system-kits/references/tokens/spacing-radius.md +45 -0
  112. package/.claude/skills/design-system-kits/references/tokens/theme.md +97 -0
  113. package/.claude/skills/design-system-kits/references/tokens/typography.md +105 -0
  114. package/.claude/skills/vibe-design/SKILL.md +306 -0
  115. package/compose/build.gradle.kts +1 -1
  116. package/compose/src/androidMain/kotlin/vn/momo/kits/platform/Platform.android.kt +7 -0
  117. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
  118. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
  119. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
  120. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
  121. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupPromotion.kt +2 -2
  122. package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +338 -0
  123. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
  124. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +348 -0
  125. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
  126. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
  127. package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
  128. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
  129. package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +531 -0
  130. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
  131. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +3 -0
  132. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +5 -2
  133. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/AutomationId.kt +2 -11
  134. package/compose/src/commonMain/kotlin/vn/momo/kits/platform/Platform.kt +5 -1
  135. package/compose/src/iosMain/kotlin/vn/momo/kits/platform/Platform.ios.kt +12 -0
  136. package/gradle.properties +1 -1
  137. package/ios/Popup/PopupPromotion.swift +2 -2
  138. package/local.properties +8 -0
  139. 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 |