@momo-kits/native-kits 0.158.1-beta.1-debug → 0.158.1-beta.2-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/compose/build.gradle.kts +1 -1
  2. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/BottomSheet.kt +15 -1
  3. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/ModalScreen.kt +15 -1
  4. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigation.kt +1 -0
  5. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/NavigationContainer.kt +4 -1
  6. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/Navigator.kt +11 -9
  7. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/StackScreen.kt +56 -1
  8. package/compose/src/commonMain/kotlin/vn/momo/kits/navigation/tracking/ScreenTracker.kt +167 -0
  9. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Example.xcscheme +32 -0
  10. package/example/ios/Example.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  11. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  12. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/WorkspaceSettings.xcsettings +16 -0
  13. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +6 -0
  14. package/example/ios/Example.xcworkspace/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +5 -0
  15. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +58 -0
  16. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/Pods-Example.xcscheme +58 -0
  17. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
  18. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
  19. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
  20. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +58 -0
  21. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/lottie-ios.xcscheme +58 -0
  22. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sonnguyen.xcuserdatad/xcschemes/xcschememanagement.plist +60 -0
  23. package/gradle.properties +1 -1
  24. package/local.properties +2 -2
  25. package/package.json +1 -1
  26. package/.claude/settings.local.json +0 -11
  27. package/.claude/skills/design-system/SKILL.md +0 -88
  28. package/.claude/skills/design-system/references/components/avatar.md +0 -134
  29. package/.claude/skills/design-system/references/components/badge.md +0 -127
  30. package/.claude/skills/design-system/references/components/bottom-tab.md +0 -177
  31. package/.claude/skills/design-system/references/components/bottomsheet.md +0 -170
  32. package/.claude/skills/design-system/references/components/button.md +0 -206
  33. package/.claude/skills/design-system/references/components/carousel.md +0 -117
  34. package/.claude/skills/design-system/references/components/checkbox.md +0 -98
  35. package/.claude/skills/design-system/references/components/chip.md +0 -146
  36. package/.claude/skills/design-system/references/components/collapse.md +0 -120
  37. package/.claude/skills/design-system/references/components/date-picker.md +0 -119
  38. package/.claude/skills/design-system/references/components/divider.md +0 -84
  39. package/.claude/skills/design-system/references/components/icon.md +0 -130
  40. package/.claude/skills/design-system/references/components/image.md +0 -81
  41. package/.claude/skills/design-system/references/components/information.md +0 -107
  42. package/.claude/skills/design-system/references/components/input-dropdown.md +0 -138
  43. package/.claude/skills/design-system/references/components/input-money.md +0 -157
  44. package/.claude/skills/design-system/references/components/input-otp.md +0 -132
  45. package/.claude/skills/design-system/references/components/input-phone-number.md +0 -140
  46. package/.claude/skills/design-system/references/components/input-search.md +0 -124
  47. package/.claude/skills/design-system/references/components/input-text-area.md +0 -133
  48. package/.claude/skills/design-system/references/components/input.md +0 -152
  49. package/.claude/skills/design-system/references/components/loader.md +0 -87
  50. package/.claude/skills/design-system/references/components/pagination.md +0 -105
  51. package/.claude/skills/design-system/references/components/popup-notify.md +0 -128
  52. package/.claude/skills/design-system/references/components/progress-info.md +0 -114
  53. package/.claude/skills/design-system/references/components/radio.md +0 -86
  54. package/.claude/skills/design-system/references/components/rating.md +0 -126
  55. package/.claude/skills/design-system/references/components/skeleton.md +0 -120
  56. package/.claude/skills/design-system/references/components/slider.md +0 -141
  57. package/.claude/skills/design-system/references/components/snackbar.md +0 -97
  58. package/.claude/skills/design-system/references/components/stepper.md +0 -100
  59. package/.claude/skills/design-system/references/components/steps.md +0 -91
  60. package/.claude/skills/design-system/references/components/suggest-action.md +0 -95
  61. package/.claude/skills/design-system/references/components/swipe.md +0 -121
  62. package/.claude/skills/design-system/references/components/switch.md +0 -98
  63. package/.claude/skills/design-system/references/components/tab-view.md +0 -120
  64. package/.claude/skills/design-system/references/components/tag.md +0 -118
  65. package/.claude/skills/design-system/references/components/text.md +0 -151
  66. package/.claude/skills/design-system/references/components/toast.md +0 -99
  67. package/.claude/skills/design-system/references/components/tooltip.md +0 -138
  68. package/.claude/skills/design-system/references/components/top-nav-miniapp.md +0 -94
  69. package/.claude/skills/design-system/references/components/top-nav.md +0 -226
  70. package/.claude/skills/design-system/references/components/uploader.md +0 -115
  71. package/.claude/skills/design-system/references/navigation/bottom-tab.md +0 -131
  72. package/.claude/skills/design-system/references/navigation/bottomsheet.md +0 -161
  73. package/.claude/skills/design-system/references/navigation/modal.md +0 -133
  74. package/.claude/skills/design-system/references/navigation/navigation-options.md +0 -225
  75. package/.claude/skills/design-system/references/navigation/navigator.md +0 -111
  76. package/.claude/skills/design-system/references/navigation/setup.md +0 -134
  77. package/.claude/skills/design-system/references/navigation/stack.md +0 -128
  78. package/.claude/skills/design-system/references/spec-convention.md +0 -80
  79. package/.claude/skills/design-system/references/tokens/colors.md +0 -131
  80. package/.claude/skills/design-system/references/tokens/spacing-radius.md +0 -144
  81. package/.claude/skills/design-system/references/tokens/theme.md +0 -125
  82. package/.claude/skills/design-system/references/tokens/typography.md +0 -135
  83. package/.claude/skills/design-system-kits/SKILL.md +0 -102
  84. package/.claude/skills/design-system-kits/references/code-convention.md +0 -118
  85. package/.claude/skills/design-system-kits/references/components/avatar.md +0 -45
  86. package/.claude/skills/design-system-kits/references/components/badge.md +0 -27
  87. package/.claude/skills/design-system-kits/references/components/button.md +0 -65
  88. package/.claude/skills/design-system-kits/references/components/carousel.md +0 -51
  89. package/.claude/skills/design-system-kits/references/components/checkbox.md +0 -39
  90. package/.claude/skills/design-system-kits/references/components/chip.md +0 -54
  91. package/.claude/skills/design-system-kits/references/components/collapse.md +0 -63
  92. package/.claude/skills/design-system-kits/references/components/date-picker.md +0 -36
  93. package/.claude/skills/design-system-kits/references/components/divider.md +0 -21
  94. package/.claude/skills/design-system-kits/references/components/icon.md +0 -382
  95. package/.claude/skills/design-system-kits/references/components/image.md +0 -62
  96. package/.claude/skills/design-system-kits/references/components/information.md +0 -61
  97. package/.claude/skills/design-system-kits/references/components/input-dropdown.md +0 -92
  98. package/.claude/skills/design-system-kits/references/components/input-money.md +0 -128
  99. package/.claude/skills/design-system-kits/references/components/input-otp.md +0 -85
  100. package/.claude/skills/design-system-kits/references/components/input-phone-number.md +0 -96
  101. package/.claude/skills/design-system-kits/references/components/input-search.md +0 -127
  102. package/.claude/skills/design-system-kits/references/components/input-text-area.md +0 -100
  103. package/.claude/skills/design-system-kits/references/components/input.md +0 -126
  104. package/.claude/skills/design-system-kits/references/components/loader.md +0 -41
  105. package/.claude/skills/design-system-kits/references/components/pagination.md +0 -47
  106. package/.claude/skills/design-system-kits/references/components/popup-notify.md +0 -69
  107. package/.claude/skills/design-system-kits/references/components/popup-promotion.md +0 -35
  108. package/.claude/skills/design-system-kits/references/components/progress-info.md +0 -55
  109. package/.claude/skills/design-system-kits/references/components/radio.md +0 -42
  110. package/.claude/skills/design-system-kits/references/components/rating.md +0 -36
  111. package/.claude/skills/design-system-kits/references/components/skeleton.md +0 -25
  112. package/.claude/skills/design-system-kits/references/components/slider.md +0 -53
  113. package/.claude/skills/design-system-kits/references/components/snackbar.md +0 -52
  114. package/.claude/skills/design-system-kits/references/components/stepper.md +0 -46
  115. package/.claude/skills/design-system-kits/references/components/steps.md +0 -57
  116. package/.claude/skills/design-system-kits/references/components/suggest-action.md +0 -44
  117. package/.claude/skills/design-system-kits/references/components/swipe.md +0 -44
  118. package/.claude/skills/design-system-kits/references/components/switch.md +0 -43
  119. package/.claude/skills/design-system-kits/references/components/tab-view.md +0 -56
  120. package/.claude/skills/design-system-kits/references/components/tag.md +0 -50
  121. package/.claude/skills/design-system-kits/references/components/text.md +0 -56
  122. package/.claude/skills/design-system-kits/references/components/toast.md +0 -51
  123. package/.claude/skills/design-system-kits/references/components/tooltip.md +0 -95
  124. package/.claude/skills/design-system-kits/references/components/uploader.md +0 -48
  125. package/.claude/skills/design-system-kits/references/design-spec-structure.md +0 -356
  126. package/.claude/skills/design-system-kits/references/design-spec-to-code.md +0 -596
  127. package/.claude/skills/design-system-kits/references/navigation/bottom-tab.md +0 -155
  128. package/.claude/skills/design-system-kits/references/navigation/bottomsheet.md +0 -94
  129. package/.claude/skills/design-system-kits/references/navigation/modal.md +0 -125
  130. package/.claude/skills/design-system-kits/references/navigation/navigation-options.md +0 -430
  131. package/.claude/skills/design-system-kits/references/navigation/navigator.md +0 -177
  132. package/.claude/skills/design-system-kits/references/navigation/setup.md +0 -94
  133. package/.claude/skills/design-system-kits/references/navigation/stack.md +0 -152
  134. package/.claude/skills/design-system-kits/references/screen-layout-rule.md +0 -125
  135. package/.claude/skills/design-system-kits/references/tokens/colors.md +0 -183
  136. package/.claude/skills/design-system-kits/references/tokens/spacing-radius.md +0 -45
  137. package/.claude/skills/design-system-kits/references/tokens/theme.md +0 -97
  138. package/.claude/skills/design-system-kits/references/tokens/typography.md +0 -105
  139. package/.claude/skills/vibe-design/SKILL.md +0 -306
@@ -1,356 +0,0 @@
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 |