@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,165 @@
1
+ {
2
+ "name": "Music Player",
3
+ "description": "Example of music player",
4
+ "messages": [
5
+ {
6
+ "version": "v0.9",
7
+ "createSurface": {
8
+ "surfaceId": "gallery-music-player",
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-music-player",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Card",
21
+ "child": "main-column"
22
+ },
23
+ {
24
+ "id": "main-column",
25
+ "component": "Column",
26
+ "children": ["album-art", "track-info", "progress", "time-row", "controls"],
27
+ "align": "center"
28
+ },
29
+ {
30
+ "id": "album-art",
31
+ "component": "Image",
32
+ "url": {
33
+ "path": "/albumArt"
34
+ },
35
+ "fit": "cover"
36
+ },
37
+ {
38
+ "id": "track-info",
39
+ "component": "Column",
40
+ "children": ["song-title", "artist"],
41
+ "align": "center"
42
+ },
43
+ {
44
+ "id": "song-title",
45
+ "component": "Text",
46
+ "text": {
47
+ "path": "/title"
48
+ },
49
+ "variant": "h3"
50
+ },
51
+ {
52
+ "id": "artist",
53
+ "component": "Text",
54
+ "text": {
55
+ "path": "/artist"
56
+ },
57
+ "variant": "caption"
58
+ },
59
+ {
60
+ "id": "progress",
61
+ "component": "Slider",
62
+ "value": {
63
+ "path": "/progress"
64
+ },
65
+ "max": 1
66
+ },
67
+ {
68
+ "id": "time-row",
69
+ "component": "Row",
70
+ "children": ["current-time", "total-time"],
71
+ "justify": "spaceBetween"
72
+ },
73
+ {
74
+ "id": "current-time",
75
+ "component": "Text",
76
+ "text": {
77
+ "path": "/currentTime"
78
+ },
79
+ "variant": "caption"
80
+ },
81
+ {
82
+ "id": "total-time",
83
+ "component": "Text",
84
+ "text": {
85
+ "path": "/totalTime"
86
+ },
87
+ "variant": "caption"
88
+ },
89
+ {
90
+ "id": "controls",
91
+ "component": "Row",
92
+ "children": ["prev-btn", "play-btn", "next-btn"],
93
+ "justify": "center"
94
+ },
95
+ {
96
+ "id": "prev-btn-icon",
97
+ "component": "Icon",
98
+ "name": "skipPrevious"
99
+ },
100
+ {
101
+ "id": "prev-btn",
102
+ "component": "Button",
103
+ "child": "prev-btn-icon",
104
+ "action": {
105
+ "event": {
106
+ "name": "previous",
107
+ "context": {}
108
+ }
109
+ }
110
+ },
111
+ {
112
+ "id": "play-btn-icon",
113
+ "component": "Icon",
114
+ "name": {
115
+ "path": "/playIcon"
116
+ }
117
+ },
118
+ {
119
+ "id": "play-btn",
120
+ "component": "Button",
121
+ "child": "play-btn-icon",
122
+ "action": {
123
+ "event": {
124
+ "name": "playPause",
125
+ "context": {}
126
+ }
127
+ }
128
+ },
129
+ {
130
+ "id": "next-btn-icon",
131
+ "component": "Icon",
132
+ "name": "skipNext"
133
+ },
134
+ {
135
+ "id": "next-btn",
136
+ "component": "Button",
137
+ "child": "next-btn-icon",
138
+ "action": {
139
+ "event": {
140
+ "name": "next",
141
+ "context": {}
142
+ }
143
+ }
144
+ }
145
+ ]
146
+ }
147
+ },
148
+ {
149
+ "version": "v0.9",
150
+ "updateDataModel": {
151
+ "surfaceId": "gallery-music-player",
152
+ "value": {
153
+ "albumArt": "https://images.unsplash.com/photo-1493225457124-a3eb161ffa5f?w=300&h=300&fit=crop",
154
+ "title": "Blinding Lights",
155
+ "artist": "The Weeknd",
156
+ "album": "After Hours",
157
+ "progress": 0.45,
158
+ "currentTime": "1:48",
159
+ "totalTime": "4:22",
160
+ "playIcon": "pause"
161
+ }
162
+ }
163
+ }
164
+ ]
165
+ }
@@ -0,0 +1,107 @@
1
+ {
2
+ "name": "Task Card",
3
+ "description": "Example of task card demonstrating CheckBox and DateTimeInput.",
4
+ "messages": [
5
+ {
6
+ "version": "v0.9",
7
+ "createSurface": {
8
+ "surfaceId": "gallery-task-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-task-card",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Card",
21
+ "child": "main-row"
22
+ },
23
+ {
24
+ "id": "main-row",
25
+ "component": "Row",
26
+ "children": ["status-checkbox", "content", "priority"],
27
+ "align": "start"
28
+ },
29
+ {
30
+ "id": "status-checkbox",
31
+ "component": "CheckBox",
32
+ "label": "",
33
+ "value": {
34
+ "path": "/completed"
35
+ }
36
+ },
37
+ {
38
+ "id": "content",
39
+ "component": "Column",
40
+ "children": ["title", "description", "meta-row"]
41
+ },
42
+ {
43
+ "id": "title",
44
+ "component": "Text",
45
+ "text": {
46
+ "path": "/title"
47
+ },
48
+ "variant": "h3"
49
+ },
50
+ {
51
+ "id": "description",
52
+ "component": "Text",
53
+ "text": {
54
+ "path": "/description"
55
+ },
56
+ "variant": "body"
57
+ },
58
+ {
59
+ "id": "meta-row",
60
+ "component": "Row",
61
+ "children": ["due-date-input", "project"],
62
+ "align": "center"
63
+ },
64
+ {
65
+ "id": "due-date-input",
66
+ "component": "DateTimeInput",
67
+ "label": "Due",
68
+ "value": {
69
+ "path": "/dueDate"
70
+ },
71
+ "enableDate": true,
72
+ "enableTime": true
73
+ },
74
+ {
75
+ "id": "project",
76
+ "component": "Text",
77
+ "text": {
78
+ "path": "/project"
79
+ },
80
+ "variant": "caption"
81
+ },
82
+ {
83
+ "id": "priority",
84
+ "component": "Icon",
85
+ "name": {
86
+ "path": "/priorityIcon"
87
+ }
88
+ }
89
+ ]
90
+ }
91
+ },
92
+ {
93
+ "version": "v0.9",
94
+ "updateDataModel": {
95
+ "surfaceId": "gallery-task-card",
96
+ "value": {
97
+ "completed": false,
98
+ "title": "Review pull request",
99
+ "description": "Review and approve the authentication module changes.",
100
+ "dueDate": "2025-12-15T17:00:00Z",
101
+ "project": "Backend",
102
+ "priorityIcon": "warning"
103
+ }
104
+ }
105
+ }
106
+ ]
107
+ }
@@ -0,0 +1,190 @@
1
+ {
2
+ "name": "User Profile",
3
+ "description": "Example of user profile demonstrating number formatting.",
4
+ "messages": [
5
+ {
6
+ "version": "v0.9",
7
+ "createSurface": {
8
+ "surfaceId": "gallery-user-profile",
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-user-profile",
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", "info", "bio", "stats-row", "follow-btn"],
27
+ "align": "center"
28
+ },
29
+ {
30
+ "id": "header",
31
+ "component": "Image",
32
+ "url": {
33
+ "path": "/avatar"
34
+ },
35
+ "fit": "cover",
36
+ "variant": "avatar"
37
+ },
38
+ {
39
+ "id": "info",
40
+ "component": "Column",
41
+ "children": ["name", "username"],
42
+ "align": "center"
43
+ },
44
+ {
45
+ "id": "name",
46
+ "component": "Text",
47
+ "text": {
48
+ "path": "/name"
49
+ },
50
+ "variant": "h2"
51
+ },
52
+ {
53
+ "id": "username",
54
+ "component": "Text",
55
+ "text": {
56
+ "path": "/username"
57
+ },
58
+ "variant": "caption"
59
+ },
60
+ {
61
+ "id": "bio",
62
+ "component": "Text",
63
+ "text": {
64
+ "path": "/bio"
65
+ },
66
+ "variant": "body"
67
+ },
68
+ {
69
+ "id": "stats-row",
70
+ "component": "Row",
71
+ "children": ["followers-col", "following-col", "posts-col"],
72
+ "justify": "spaceAround"
73
+ },
74
+ {
75
+ "id": "followers-col",
76
+ "component": "Column",
77
+ "children": ["followers-count", "followers-label"],
78
+ "align": "center"
79
+ },
80
+ {
81
+ "id": "followers-count",
82
+ "component": "Text",
83
+ "text": {
84
+ "call": "formatNumber",
85
+ "args": {
86
+ "value": {
87
+ "path": "/followers"
88
+ }
89
+ },
90
+ "returnType": "string"
91
+ },
92
+ "variant": "h3"
93
+ },
94
+ {
95
+ "id": "followers-label",
96
+ "component": "Text",
97
+ "text": "Followers",
98
+ "variant": "caption"
99
+ },
100
+ {
101
+ "id": "following-col",
102
+ "component": "Column",
103
+ "children": ["following-count", "following-label"],
104
+ "align": "center"
105
+ },
106
+ {
107
+ "id": "following-count",
108
+ "component": "Text",
109
+ "text": {
110
+ "call": "formatNumber",
111
+ "args": {
112
+ "value": {
113
+ "path": "/following"
114
+ }
115
+ },
116
+ "returnType": "string"
117
+ },
118
+ "variant": "h3"
119
+ },
120
+ {
121
+ "id": "following-label",
122
+ "component": "Text",
123
+ "text": "Following",
124
+ "variant": "caption"
125
+ },
126
+ {
127
+ "id": "posts-col",
128
+ "component": "Column",
129
+ "children": ["posts-count", "posts-label"],
130
+ "align": "center"
131
+ },
132
+ {
133
+ "id": "posts-count",
134
+ "component": "Text",
135
+ "text": {
136
+ "call": "formatNumber",
137
+ "args": {
138
+ "value": {
139
+ "path": "/posts"
140
+ }
141
+ },
142
+ "returnType": "string"
143
+ },
144
+ "variant": "h3"
145
+ },
146
+ {
147
+ "id": "posts-label",
148
+ "component": "Text",
149
+ "text": "Posts",
150
+ "variant": "caption"
151
+ },
152
+ {
153
+ "id": "follow-btn-text",
154
+ "component": "Text",
155
+ "text": {
156
+ "path": "/followText"
157
+ }
158
+ },
159
+ {
160
+ "id": "follow-btn",
161
+ "component": "Button",
162
+ "child": "follow-btn-text",
163
+ "action": {
164
+ "event": {
165
+ "name": "follow",
166
+ "context": {}
167
+ }
168
+ }
169
+ }
170
+ ]
171
+ }
172
+ },
173
+ {
174
+ "version": "v0.9",
175
+ "updateDataModel": {
176
+ "surfaceId": "gallery-user-profile",
177
+ "value": {
178
+ "avatar": "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&h=150&fit=crop",
179
+ "name": "Sarah Chen",
180
+ "username": "@sarahchen",
181
+ "bio": "Product Designer at Tech Co. Creating delightful experiences.",
182
+ "followers": 12400,
183
+ "following": 892,
184
+ "posts": 347,
185
+ "followText": "Follow"
186
+ }
187
+ }
188
+ }
189
+ ]
190
+ }
@@ -0,0 +1,214 @@
1
+ {
2
+ "name": "Login Form with Validation",
3
+ "description": "Example of login form demonstrating validation checks and logic.",
4
+ "messages": [
5
+ {
6
+ "version": "v0.9",
7
+ "createSurface": {
8
+ "surfaceId": "gallery-login-form",
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-login-form",
17
+ "components": [
18
+ {
19
+ "id": "root",
20
+ "component": "Card",
21
+ "child": "main-column"
22
+ },
23
+ {
24
+ "id": "main-column",
25
+ "component": "Column",
26
+ "children": [
27
+ "header",
28
+ "email-field",
29
+ "password-field",
30
+ "login-btn",
31
+ "divider",
32
+ "signup-text"
33
+ ]
34
+ },
35
+ {
36
+ "id": "header",
37
+ "component": "Column",
38
+ "children": ["title", "subtitle"],
39
+ "align": "center"
40
+ },
41
+ {
42
+ "id": "title",
43
+ "component": "Text",
44
+ "text": "Welcome back",
45
+ "variant": "h2"
46
+ },
47
+ {
48
+ "id": "subtitle",
49
+ "component": "Text",
50
+ "text": "Sign in to your account",
51
+ "variant": "caption"
52
+ },
53
+ {
54
+ "id": "email-field",
55
+ "component": "TextField",
56
+ "value": {
57
+ "path": "/email"
58
+ },
59
+ "label": "Email",
60
+ "checks": [
61
+ {
62
+ "condition": {
63
+ "call": "required",
64
+ "args": {
65
+ "value": {
66
+ "path": "/email"
67
+ }
68
+ }
69
+ },
70
+ "message": "Email is required"
71
+ },
72
+ {
73
+ "condition": {
74
+ "call": "email",
75
+ "args": {
76
+ "value": {
77
+ "path": "/email"
78
+ }
79
+ }
80
+ },
81
+ "message": "Please enter a valid email address"
82
+ }
83
+ ]
84
+ },
85
+ {
86
+ "id": "password-field",
87
+ "component": "TextField",
88
+ "value": {
89
+ "path": "/password"
90
+ },
91
+ "label": "Password",
92
+ "variant": "obscured",
93
+ "checks": [
94
+ {
95
+ "condition": {
96
+ "call": "required",
97
+ "args": {
98
+ "value": {
99
+ "path": "/password"
100
+ }
101
+ }
102
+ },
103
+ "message": "Password is required"
104
+ },
105
+ {
106
+ "condition": {
107
+ "call": "length",
108
+ "args": {
109
+ "value": {
110
+ "path": "/password"
111
+ },
112
+ "min": 8
113
+ }
114
+ },
115
+ "message": "Password must be at least 8 characters long"
116
+ }
117
+ ]
118
+ },
119
+ {
120
+ "id": "login-btn-text",
121
+ "component": "Text",
122
+ "text": "Sign in"
123
+ },
124
+ {
125
+ "id": "login-btn",
126
+ "component": "Button",
127
+ "child": "login-btn-text",
128
+ "checks": [
129
+ {
130
+ "condition": {
131
+ "call": "and",
132
+ "args": {
133
+ "values": [
134
+ {
135
+ "call": "email",
136
+ "args": {
137
+ "value": {
138
+ "path": "/email"
139
+ }
140
+ }
141
+ },
142
+ {
143
+ "call": "length",
144
+ "args": {
145
+ "value": {
146
+ "path": "/password"
147
+ },
148
+ "min": 8
149
+ }
150
+ }
151
+ ]
152
+ }
153
+ },
154
+ "message": "Please fix errors before signing in"
155
+ }
156
+ ],
157
+ "action": {
158
+ "event": {
159
+ "name": "login",
160
+ "context": {
161
+ "email": {
162
+ "path": "/email"
163
+ }
164
+ }
165
+ }
166
+ }
167
+ },
168
+ {
169
+ "id": "divider",
170
+ "component": "Divider"
171
+ },
172
+ {
173
+ "id": "signup-text",
174
+ "component": "Row",
175
+ "children": ["no-account", "signup-link"],
176
+ "justify": "center"
177
+ },
178
+ {
179
+ "id": "no-account",
180
+ "component": "Text",
181
+ "text": "Don't have an account?",
182
+ "variant": "caption"
183
+ },
184
+ {
185
+ "id": "signup-link-text",
186
+ "component": "Text",
187
+ "text": "Sign up"
188
+ },
189
+ {
190
+ "id": "signup-link",
191
+ "component": "Button",
192
+ "child": "signup-link-text",
193
+ "action": {
194
+ "event": {
195
+ "name": "signup",
196
+ "context": {}
197
+ }
198
+ }
199
+ }
200
+ ]
201
+ }
202
+ },
203
+ {
204
+ "version": "v0.9",
205
+ "updateDataModel": {
206
+ "surfaceId": "gallery-login-form",
207
+ "value": {
208
+ "email": "",
209
+ "password": ""
210
+ }
211
+ }
212
+ }
213
+ ]
214
+ }