@cloudcrane/app-spec 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -2
  3. package/dist/src/a2ui.d.ts +12 -0
  4. package/dist/src/a2ui.js +89 -0
  5. package/dist/src/blueprint.d.ts +27 -0
  6. package/dist/src/blueprint.js +62 -0
  7. package/dist/src/canonical.d.ts +2 -0
  8. package/dist/src/canonical.js +8 -0
  9. package/dist/src/catalog.d.ts +7 -0
  10. package/dist/src/catalog.js +83 -0
  11. package/dist/src/index.d.ts +9 -0
  12. package/dist/src/index.js +11 -0
  13. package/dist/src/jsonschema.d.ts +2 -0
  14. package/dist/src/jsonschema.js +11 -0
  15. package/dist/src/leak.d.ts +3 -0
  16. package/dist/src/leak.js +141 -0
  17. package/dist/src/logic.d.ts +36 -0
  18. package/dist/src/logic.js +197 -0
  19. package/dist/src/schema.d.ts +418 -0
  20. package/dist/src/schema.js +137 -0
  21. package/dist/src/validate.d.ts +6 -0
  22. package/dist/src/validate.js +54 -0
  23. package/dist/vendor/a2ui/v0_9_1/catalogs/basic/catalog.json +1383 -0
  24. package/dist/vendor/a2ui/v0_9_1/common_types.json +305 -0
  25. package/dist/vendor/a2ui/v0_9_1/server_to_client.json +131 -0
  26. package/package.json +78 -3
  27. package/schema/app-spec.v1.json +460 -0
  28. package/vendor/a2ui/v0_9_1/LICENSE +227 -0
  29. package/vendor/a2ui/v0_9_1/VENDOR.json +6 -0
  30. package/vendor/a2ui/v0_9_1/catalogs/basic/catalog.json +1383 -0
  31. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/00_complex-layout.json +65 -0
  32. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/00_formatted-text.json +56 -0
  33. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/00_incremental.json +134 -0
  34. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/00_interactive-button.json +51 -0
  35. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/00_row-layout.json +40 -0
  36. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/00_simple-login-form.json +77 -0
  37. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/00_simple-text.json +27 -0
  38. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/01_flight-status.json +201 -0
  39. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/02_email-compose.json +185 -0
  40. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/03_calendar-day.json +166 -0
  41. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/04_weather-current.json +168 -0
  42. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/05_product-card.json +151 -0
  43. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/06_music-player.json +165 -0
  44. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/07_task-card.json +107 -0
  45. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/08_user-profile.json +190 -0
  46. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/09_login-form.json +214 -0
  47. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/10_notification-permission.json +105 -0
  48. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/11_purchase-complete.json +169 -0
  49. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/12_chat-message.json +144 -0
  50. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/13_coffee-order.json +253 -0
  51. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/14_sports-player.json +177 -0
  52. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/15_account-balance.json +126 -0
  53. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/16_workout-summary.json +160 -0
  54. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/17_event-detail.json +144 -0
  55. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/18_track-list.json +152 -0
  56. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/19_software-purchase.json +194 -0
  57. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/20_restaurant-card.json +140 -0
  58. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/21_shipping-status.json +137 -0
  59. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/22_credit-card.json +117 -0
  60. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/23_step-counter.json +149 -0
  61. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/24_recipe-card.json +204 -0
  62. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/25_contact-card.json +175 -0
  63. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/26_podcast-episode.json +123 -0
  64. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/27_stats-card.json +106 -0
  65. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/28_countdown-timer.json +135 -0
  66. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/29_movie-card.json +156 -0
  67. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/30_live-invitation-builder.json +205 -0
  68. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/31_incremental-dashboard.json +128 -0
  69. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/32_advanced-form-validator.json +166 -0
  70. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/33_financial-data-grid.json +171 -0
  71. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/34_child-list-template.json +80 -0
  72. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/35_markdown-text.json +44 -0
  73. package/vendor/a2ui/v0_9_1/catalogs/basic/examples/36_modal.json +65 -0
  74. package/vendor/a2ui/v0_9_1/client_capabilities.json +89 -0
  75. package/vendor/a2ui/v0_9_1/client_data_model.json +22 -0
  76. package/vendor/a2ui/v0_9_1/client_to_server.json +98 -0
  77. package/vendor/a2ui/v0_9_1/client_to_server_list.json +10 -0
  78. package/vendor/a2ui/v0_9_1/client_to_server_list_wrapper.json +14 -0
  79. package/vendor/a2ui/v0_9_1/common_types.json +305 -0
  80. package/vendor/a2ui/v0_9_1/sample.json +22 -0
  81. package/vendor/a2ui/v0_9_1/server_capabilities.json +26 -0
  82. package/vendor/a2ui/v0_9_1/server_to_client.json +132 -0
  83. package/vendor/a2ui/v0_9_1/server_to_client_list.json +10 -0
  84. package/vendor/a2ui/v0_9_1/server_to_client_list_wrapper.json +14 -0
@@ -0,0 +1,117 @@
1
+ {
2
+ "name": "Credit Card",
3
+ "description": "Example of credit card",
4
+ "messages": [
5
+ {
6
+ "version": "v0.9",
7
+ "createSurface": {
8
+ "surfaceId": "gallery-credit-card",
9
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
10
+ "sendDataModel": true
11
+ }
12
+ },
13
+ {
14
+ "version": "v0.9",
15
+ "updateComponents": {
16
+ "surfaceId": "gallery-credit-card",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Card",
21
+ "child": "main-column"
22
+ },
23
+ {
24
+ "id": "main-column",
25
+ "component": "Column",
26
+ "children": ["card-type-row", "card-number", "card-details"]
27
+ },
28
+ {
29
+ "id": "card-type-row",
30
+ "component": "Row",
31
+ "children": ["card-icon", "card-type"],
32
+ "justify": "spaceBetween",
33
+ "align": "center"
34
+ },
35
+ {
36
+ "id": "card-icon",
37
+ "component": "Icon",
38
+ "name": "payment"
39
+ },
40
+ {
41
+ "id": "card-type",
42
+ "component": "Text",
43
+ "text": {
44
+ "path": "/cardType"
45
+ },
46
+ "variant": "h4"
47
+ },
48
+ {
49
+ "id": "card-number",
50
+ "component": "Text",
51
+ "text": {
52
+ "path": "/cardNumber"
53
+ },
54
+ "variant": "h2"
55
+ },
56
+ {
57
+ "id": "card-details",
58
+ "component": "Row",
59
+ "children": ["holder-col", "expiry-col"],
60
+ "justify": "spaceBetween"
61
+ },
62
+ {
63
+ "id": "holder-col",
64
+ "component": "Column",
65
+ "children": ["holder-label", "holder-name"]
66
+ },
67
+ {
68
+ "id": "holder-label",
69
+ "component": "Text",
70
+ "text": "CARD HOLDER",
71
+ "variant": "caption"
72
+ },
73
+ {
74
+ "id": "holder-name",
75
+ "component": "Text",
76
+ "text": {
77
+ "path": "/holderName"
78
+ },
79
+ "variant": "body"
80
+ },
81
+ {
82
+ "id": "expiry-col",
83
+ "component": "Column",
84
+ "children": ["expiry-label", "expiry-date"],
85
+ "align": "end"
86
+ },
87
+ {
88
+ "id": "expiry-label",
89
+ "component": "Text",
90
+ "text": "EXPIRES",
91
+ "variant": "caption"
92
+ },
93
+ {
94
+ "id": "expiry-date",
95
+ "component": "Text",
96
+ "text": {
97
+ "path": "/expiryDate"
98
+ },
99
+ "variant": "body"
100
+ }
101
+ ]
102
+ }
103
+ },
104
+ {
105
+ "version": "v0.9",
106
+ "updateDataModel": {
107
+ "surfaceId": "gallery-credit-card",
108
+ "value": {
109
+ "cardType": "VISA",
110
+ "cardNumber": "\u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 \u2022\u2022\u2022\u2022 4242",
111
+ "holderName": "SARAH JOHNSON",
112
+ "expiryDate": "09/27"
113
+ }
114
+ }
115
+ }
116
+ ]
117
+ }
@@ -0,0 +1,149 @@
1
+ {
2
+ "name": "Step Counter",
3
+ "description": "Example of step counter demonstrating number formatting.",
4
+ "messages": [
5
+ {
6
+ "version": "v0.9",
7
+ "createSurface": {
8
+ "surfaceId": "gallery-step-counter",
9
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
10
+ "sendDataModel": true
11
+ }
12
+ },
13
+ {
14
+ "version": "v0.9",
15
+ "updateComponents": {
16
+ "surfaceId": "gallery-step-counter",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Card",
21
+ "child": "main-column"
22
+ },
23
+ {
24
+ "id": "main-column",
25
+ "component": "Column",
26
+ "children": ["header", "steps-display", "goal-text", "divider", "stats-row"],
27
+ "align": "center"
28
+ },
29
+ {
30
+ "id": "header",
31
+ "component": "Row",
32
+ "children": ["steps-icon", "title"],
33
+ "align": "center"
34
+ },
35
+ {
36
+ "id": "steps-icon",
37
+ "component": "Icon",
38
+ "name": "person"
39
+ },
40
+ {
41
+ "id": "title",
42
+ "component": "Text",
43
+ "text": "Today's Steps",
44
+ "variant": "h4"
45
+ },
46
+ {
47
+ "id": "steps-display",
48
+ "component": "Text",
49
+ "text": {
50
+ "call": "formatNumber",
51
+ "args": {
52
+ "value": {
53
+ "path": "/steps"
54
+ }
55
+ },
56
+ "returnType": "string"
57
+ },
58
+ "variant": "h1"
59
+ },
60
+ {
61
+ "id": "goal-text",
62
+ "component": "Text",
63
+ "text": {
64
+ "call": "formatString",
65
+ "args": {
66
+ "value": "${/progress}% of ${formatNumber(value: ${/goal})} goal"
67
+ },
68
+ "returnType": "string"
69
+ },
70
+ "variant": "body"
71
+ },
72
+ {
73
+ "id": "divider",
74
+ "component": "Divider"
75
+ },
76
+ {
77
+ "id": "stats-row",
78
+ "component": "Row",
79
+ "children": ["distance-col", "calories-col"],
80
+ "justify": "spaceAround"
81
+ },
82
+ {
83
+ "id": "distance-col",
84
+ "component": "Column",
85
+ "children": ["distance-value", "distance-label"],
86
+ "align": "center"
87
+ },
88
+ {
89
+ "id": "distance-value",
90
+ "component": "Text",
91
+ "text": {
92
+ "call": "formatString",
93
+ "args": {
94
+ "value": "${/distance} mi"
95
+ },
96
+ "returnType": "string"
97
+ },
98
+ "variant": "h3"
99
+ },
100
+ {
101
+ "id": "distance-label",
102
+ "component": "Text",
103
+ "text": "Distance",
104
+ "variant": "caption"
105
+ },
106
+ {
107
+ "id": "calories-col",
108
+ "component": "Column",
109
+ "children": ["calories-value", "calories-label"],
110
+ "align": "center"
111
+ },
112
+ {
113
+ "id": "calories-value",
114
+ "component": "Text",
115
+ "text": {
116
+ "call": "formatNumber",
117
+ "args": {
118
+ "value": {
119
+ "path": "/calories"
120
+ }
121
+ },
122
+ "returnType": "string"
123
+ },
124
+ "variant": "h3"
125
+ },
126
+ {
127
+ "id": "calories-label",
128
+ "component": "Text",
129
+ "text": "Calories",
130
+ "variant": "caption"
131
+ }
132
+ ]
133
+ }
134
+ },
135
+ {
136
+ "version": "v0.9",
137
+ "updateDataModel": {
138
+ "surfaceId": "gallery-step-counter",
139
+ "value": {
140
+ "steps": 8432,
141
+ "goal": 10000,
142
+ "progress": 84,
143
+ "distance": 3.8,
144
+ "calories": 312
145
+ }
146
+ }
147
+ }
148
+ ]
149
+ }
@@ -0,0 +1,204 @@
1
+ {
2
+ "name": "Recipe Card",
3
+ "description": "Example of recipe card demonstrating Tabs and pluralization.",
4
+ "messages": [
5
+ {
6
+ "version": "v0.9",
7
+ "createSurface": {
8
+ "surfaceId": "gallery-recipe-card",
9
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
10
+ "sendDataModel": true
11
+ }
12
+ },
13
+ {
14
+ "version": "v0.9",
15
+ "updateComponents": {
16
+ "surfaceId": "gallery-recipe-card",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Card",
21
+ "child": "tabs-container"
22
+ },
23
+ {
24
+ "id": "tabs-container",
25
+ "component": "Tabs",
26
+ "tabs": [
27
+ {
28
+ "title": "Overview",
29
+ "child": "overview-col"
30
+ },
31
+ {
32
+ "title": "Ingredients",
33
+ "child": "ingredients-list"
34
+ },
35
+ {
36
+ "title": "Instructions",
37
+ "child": "instructions-list"
38
+ }
39
+ ]
40
+ },
41
+ {
42
+ "id": "overview-col",
43
+ "component": "Column",
44
+ "children": ["recipe-image", "overview-content"]
45
+ },
46
+ {
47
+ "id": "recipe-image",
48
+ "component": "Image",
49
+ "url": {
50
+ "path": "/image"
51
+ },
52
+ "fit": "cover"
53
+ },
54
+ {
55
+ "id": "overview-content",
56
+ "component": "Column",
57
+ "children": ["title", "rating-row", "times-row", "servings"]
58
+ },
59
+ {
60
+ "id": "title",
61
+ "component": "Text",
62
+ "text": {
63
+ "path": "/title"
64
+ },
65
+ "variant": "h3"
66
+ },
67
+ {
68
+ "id": "rating-row",
69
+ "component": "Row",
70
+ "children": ["star-icon", "rating", "review-count"],
71
+ "align": "center"
72
+ },
73
+ {
74
+ "id": "star-icon",
75
+ "component": "Icon",
76
+ "name": "star"
77
+ },
78
+ {
79
+ "id": "rating",
80
+ "component": "Text",
81
+ "text": {
82
+ "path": "/rating"
83
+ },
84
+ "variant": "body"
85
+ },
86
+ {
87
+ "id": "review-count",
88
+ "component": "Text",
89
+ "text": {
90
+ "call": "formatString",
91
+ "args": {
92
+ "value": "(${formatNumber(value: ${/reviewCount})} ${pluralize(value: ${/reviewCount}, one: 'review', other: 'reviews')})"
93
+ },
94
+ "returnType": "string"
95
+ },
96
+ "variant": "caption"
97
+ },
98
+ {
99
+ "id": "times-row",
100
+ "component": "Row",
101
+ "children": ["prep-time", "cook-time"]
102
+ },
103
+ {
104
+ "id": "prep-time",
105
+ "component": "Row",
106
+ "children": ["prep-icon", "prep-text"],
107
+ "align": "center"
108
+ },
109
+ {
110
+ "id": "prep-icon",
111
+ "component": "Icon",
112
+ "name": "calendarToday"
113
+ },
114
+ {
115
+ "id": "prep-text",
116
+ "component": "Text",
117
+ "text": {
118
+ "path": "/prepTime"
119
+ },
120
+ "variant": "caption"
121
+ },
122
+ {
123
+ "id": "cook-time",
124
+ "component": "Row",
125
+ "children": ["cook-icon", "cook-text"],
126
+ "align": "center"
127
+ },
128
+ {
129
+ "id": "cook-icon",
130
+ "component": "Icon",
131
+ "name": "warning"
132
+ },
133
+ {
134
+ "id": "cook-text",
135
+ "component": "Text",
136
+ "text": {
137
+ "path": "/cookTime"
138
+ },
139
+ "variant": "caption"
140
+ },
141
+ {
142
+ "id": "servings",
143
+ "component": "Text",
144
+ "text": {
145
+ "path": "/servings"
146
+ },
147
+ "variant": "caption"
148
+ },
149
+ {
150
+ "id": "ingredients-list",
151
+ "component": "Column",
152
+ "children": {
153
+ "path": "/ingredients",
154
+ "componentId": "item-template"
155
+ }
156
+ },
157
+ {
158
+ "id": "instructions-list",
159
+ "component": "Column",
160
+ "children": {
161
+ "path": "/instructions",
162
+ "componentId": "item-template"
163
+ }
164
+ },
165
+ {
166
+ "id": "item-template",
167
+ "component": "Text",
168
+ "text": {
169
+ "path": "text"
170
+ },
171
+ "variant": "body"
172
+ }
173
+ ]
174
+ }
175
+ },
176
+ {
177
+ "version": "v0.9",
178
+ "updateDataModel": {
179
+ "surfaceId": "gallery-recipe-card",
180
+ "value": {
181
+ "image": "https://images.unsplash.com/photo-1546069901-ba9599a7e63c?w=300&h=180&fit=crop",
182
+ "title": "Mediterranean Quinoa Bowl",
183
+ "rating": "4.9",
184
+ "reviewCount": 1247,
185
+ "prepTime": "15 min prep",
186
+ "cookTime": "20 min cook",
187
+ "servings": "Serves 4",
188
+ "ingredients": [
189
+ {"text": "1 cup quinoa"},
190
+ {"text": "2 cups water"},
191
+ {"text": "1 cucumber, diced"},
192
+ {"text": "1 cup cherry tomatoes, halved"}
193
+ ],
194
+ "instructions": [
195
+ {"text": "1. Rinse quinoa and bring to a boil in water."},
196
+ {"text": "2. Reduce heat and simmer for 15 minutes."},
197
+ {"text": "3. Fluff with a fork and let cool."},
198
+ {"text": "4. Mix with diced vegetables."}
199
+ ]
200
+ }
201
+ }
202
+ }
203
+ ]
204
+ }
@@ -0,0 +1,175 @@
1
+ {
2
+ "name": "Contact Card",
3
+ "description": "Example of contact card",
4
+ "messages": [
5
+ {
6
+ "version": "v0.9",
7
+ "createSurface": {
8
+ "surfaceId": "gallery-contact-card",
9
+ "catalogId": "https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json",
10
+ "sendDataModel": true
11
+ }
12
+ },
13
+ {
14
+ "version": "v0.9",
15
+ "updateComponents": {
16
+ "surfaceId": "gallery-contact-card",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Card",
21
+ "child": "main-column"
22
+ },
23
+ {
24
+ "id": "main-column",
25
+ "component": "Column",
26
+ "children": ["avatar-image", "name", "title", "divider", "contact-info", "actions"],
27
+ "align": "center"
28
+ },
29
+ {
30
+ "id": "avatar-image",
31
+ "component": "Image",
32
+ "url": {
33
+ "path": "/avatar"
34
+ },
35
+ "fit": "cover",
36
+ "variant": "avatar"
37
+ },
38
+ {
39
+ "id": "name",
40
+ "component": "Text",
41
+ "text": {
42
+ "path": "/name"
43
+ },
44
+ "variant": "h2"
45
+ },
46
+ {
47
+ "id": "title",
48
+ "component": "Text",
49
+ "text": {
50
+ "path": "/title"
51
+ },
52
+ "variant": "body"
53
+ },
54
+ {
55
+ "id": "divider",
56
+ "component": "Divider"
57
+ },
58
+ {
59
+ "id": "contact-info",
60
+ "component": "Column",
61
+ "children": ["phone-row", "email-row", "location-row"]
62
+ },
63
+ {
64
+ "id": "phone-row",
65
+ "component": "Row",
66
+ "children": ["phone-icon", "phone-text"],
67
+ "align": "center"
68
+ },
69
+ {
70
+ "id": "phone-icon",
71
+ "component": "Icon",
72
+ "name": "phone"
73
+ },
74
+ {
75
+ "id": "phone-text",
76
+ "component": "Text",
77
+ "text": {
78
+ "path": "/phone"
79
+ },
80
+ "variant": "body"
81
+ },
82
+ {
83
+ "id": "email-row",
84
+ "component": "Row",
85
+ "children": ["email-icon", "email-text"],
86
+ "align": "center"
87
+ },
88
+ {
89
+ "id": "email-icon",
90
+ "component": "Icon",
91
+ "name": "mail"
92
+ },
93
+ {
94
+ "id": "email-text",
95
+ "component": "Text",
96
+ "text": {
97
+ "path": "/email"
98
+ },
99
+ "variant": "body"
100
+ },
101
+ {
102
+ "id": "location-row",
103
+ "component": "Row",
104
+ "children": ["location-icon", "location-text"],
105
+ "align": "center"
106
+ },
107
+ {
108
+ "id": "location-icon",
109
+ "component": "Icon",
110
+ "name": "locationOn"
111
+ },
112
+ {
113
+ "id": "location-text",
114
+ "component": "Text",
115
+ "text": {
116
+ "path": "/location"
117
+ },
118
+ "variant": "body"
119
+ },
120
+ {
121
+ "id": "actions",
122
+ "component": "Row",
123
+ "children": ["call-btn", "message-btn"]
124
+ },
125
+ {
126
+ "id": "call-btn-text",
127
+ "component": "Text",
128
+ "text": "Call"
129
+ },
130
+ {
131
+ "id": "call-btn",
132
+ "component": "Button",
133
+ "child": "call-btn-text",
134
+ "action": {
135
+ "event": {
136
+ "name": "call",
137
+ "context": {}
138
+ }
139
+ }
140
+ },
141
+ {
142
+ "id": "message-btn-text",
143
+ "component": "Text",
144
+ "text": "Message"
145
+ },
146
+ {
147
+ "id": "message-btn",
148
+ "component": "Button",
149
+ "child": "message-btn-text",
150
+ "action": {
151
+ "event": {
152
+ "name": "message",
153
+ "context": {}
154
+ }
155
+ }
156
+ }
157
+ ]
158
+ }
159
+ },
160
+ {
161
+ "version": "v0.9",
162
+ "updateDataModel": {
163
+ "surfaceId": "gallery-contact-card",
164
+ "value": {
165
+ "avatar": "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=100&h=100&fit=crop",
166
+ "name": "David Park",
167
+ "title": "Engineering Manager",
168
+ "phone": "+1 (555) 234-5678",
169
+ "email": "david.park@company.com",
170
+ "location": "San Francisco, CA"
171
+ }
172
+ }
173
+ }
174
+ ]
175
+ }