@wotnak/json-render-react-native 0.0.0-pr.slots.9c5563f
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/LICENSE +201 -0
- package/README.md +229 -0
- package/dist/catalog.d.mts +515 -0
- package/dist/catalog.d.ts +515 -0
- package/dist/catalog.js +425 -0
- package/dist/catalog.js.map +1 -0
- package/dist/catalog.mjs +9 -0
- package/dist/catalog.mjs.map +1 -0
- package/dist/chunk-QYY3Q42V.mjs +400 -0
- package/dist/chunk-QYY3Q42V.mjs.map +1 -0
- package/dist/chunk-T27PQA6P.mjs +83 -0
- package/dist/chunk-T27PQA6P.mjs.map +1 -0
- package/dist/index.d.mts +590 -0
- package/dist/index.d.ts +590 -0
- package/dist/index.js +2694 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2227 -0
- package/dist/index.mjs.map +1 -0
- package/dist/schema.d.mts +102 -0
- package/dist/schema.d.ts +102 -0
- package/dist/schema.js +108 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.mjs +9 -0
- package/dist/schema.mjs.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
// src/catalog.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var standardComponentDefinitions = {
|
|
4
|
+
// ==========================================================================
|
|
5
|
+
// Layout Components
|
|
6
|
+
// ==========================================================================
|
|
7
|
+
Container: {
|
|
8
|
+
props: z.object({
|
|
9
|
+
padding: z.number().nullable(),
|
|
10
|
+
paddingHorizontal: z.number().nullable(),
|
|
11
|
+
paddingVertical: z.number().nullable(),
|
|
12
|
+
margin: z.number().nullable(),
|
|
13
|
+
backgroundColor: z.string().nullable(),
|
|
14
|
+
borderRadius: z.number().nullable(),
|
|
15
|
+
flex: z.number().nullable()
|
|
16
|
+
}),
|
|
17
|
+
slots: ["default"],
|
|
18
|
+
description: "Generic container wrapper. Use for grouping elements with padding, margin, and background color.",
|
|
19
|
+
example: { padding: 16, backgroundColor: "#FFFFFF" }
|
|
20
|
+
},
|
|
21
|
+
Row: {
|
|
22
|
+
props: z.object({
|
|
23
|
+
gap: z.number().nullable(),
|
|
24
|
+
alignItems: z.enum(["flex-start", "center", "flex-end", "stretch", "baseline"]).nullable(),
|
|
25
|
+
justifyContent: z.enum([
|
|
26
|
+
"flex-start",
|
|
27
|
+
"center",
|
|
28
|
+
"flex-end",
|
|
29
|
+
"space-between",
|
|
30
|
+
"space-around",
|
|
31
|
+
"space-evenly"
|
|
32
|
+
]).nullable(),
|
|
33
|
+
flexWrap: z.enum(["wrap", "nowrap"]).nullable(),
|
|
34
|
+
padding: z.number().nullable(),
|
|
35
|
+
flex: z.number().nullable()
|
|
36
|
+
}),
|
|
37
|
+
slots: ["default"],
|
|
38
|
+
description: "Horizontal flex layout. Use for placing elements side by side.",
|
|
39
|
+
example: { gap: 12, alignItems: "center" }
|
|
40
|
+
},
|
|
41
|
+
Column: {
|
|
42
|
+
props: z.object({
|
|
43
|
+
gap: z.number().nullable(),
|
|
44
|
+
alignItems: z.enum(["flex-start", "center", "flex-end", "stretch", "baseline"]).nullable(),
|
|
45
|
+
justifyContent: z.enum([
|
|
46
|
+
"flex-start",
|
|
47
|
+
"center",
|
|
48
|
+
"flex-end",
|
|
49
|
+
"space-between",
|
|
50
|
+
"space-around",
|
|
51
|
+
"space-evenly"
|
|
52
|
+
]).nullable(),
|
|
53
|
+
padding: z.number().nullable(),
|
|
54
|
+
flex: z.number().nullable()
|
|
55
|
+
}),
|
|
56
|
+
slots: ["default"],
|
|
57
|
+
description: "Vertical flex layout. Use for stacking elements top to bottom.",
|
|
58
|
+
example: { gap: 12, padding: 16 }
|
|
59
|
+
},
|
|
60
|
+
ScrollContainer: {
|
|
61
|
+
props: z.object({
|
|
62
|
+
horizontal: z.boolean().nullable(),
|
|
63
|
+
showsScrollIndicator: z.boolean().nullable(),
|
|
64
|
+
padding: z.number().nullable(),
|
|
65
|
+
backgroundColor: z.string().nullable()
|
|
66
|
+
}),
|
|
67
|
+
slots: ["default"],
|
|
68
|
+
description: "Scrollable container. Use for content that may overflow the screen."
|
|
69
|
+
},
|
|
70
|
+
SafeArea: {
|
|
71
|
+
props: z.object({
|
|
72
|
+
backgroundColor: z.string().nullable()
|
|
73
|
+
}),
|
|
74
|
+
slots: ["default"],
|
|
75
|
+
description: "Safe area container that respects device notches and system bars. Use as the outermost wrapper for screens."
|
|
76
|
+
},
|
|
77
|
+
Spacer: {
|
|
78
|
+
props: z.object({
|
|
79
|
+
size: z.number().nullable(),
|
|
80
|
+
flex: z.number().nullable()
|
|
81
|
+
}),
|
|
82
|
+
slots: [],
|
|
83
|
+
description: "Empty space between elements. Set size for fixed spacing or flex for flexible spacing."
|
|
84
|
+
},
|
|
85
|
+
Pressable: {
|
|
86
|
+
props: z.object({}),
|
|
87
|
+
events: ["press", "longPress"],
|
|
88
|
+
slots: ["default"],
|
|
89
|
+
description: "Touchable wrapper that triggers events on press. Wrap any element to make it tappable. Bind on.press to setState to update state for visibility-driven UIs like tabs."
|
|
90
|
+
},
|
|
91
|
+
Divider: {
|
|
92
|
+
props: z.object({
|
|
93
|
+
direction: z.enum(["horizontal", "vertical"]).nullable(),
|
|
94
|
+
color: z.string().nullable(),
|
|
95
|
+
thickness: z.number().nullable(),
|
|
96
|
+
margin: z.number().nullable()
|
|
97
|
+
}),
|
|
98
|
+
slots: [],
|
|
99
|
+
description: "Thin line separator between content sections."
|
|
100
|
+
},
|
|
101
|
+
// ==========================================================================
|
|
102
|
+
// Content Components
|
|
103
|
+
// ==========================================================================
|
|
104
|
+
Heading: {
|
|
105
|
+
props: z.object({
|
|
106
|
+
text: z.string(),
|
|
107
|
+
level: z.enum(["h1", "h2", "h3", "h4"]).nullable(),
|
|
108
|
+
color: z.string().nullable(),
|
|
109
|
+
align: z.enum(["left", "center", "right"]).nullable()
|
|
110
|
+
}),
|
|
111
|
+
slots: [],
|
|
112
|
+
description: "Heading text at various levels. h1 is largest, h4 is smallest.",
|
|
113
|
+
example: { text: "Welcome", level: "h1" }
|
|
114
|
+
},
|
|
115
|
+
Paragraph: {
|
|
116
|
+
props: z.object({
|
|
117
|
+
text: z.string(),
|
|
118
|
+
color: z.string().nullable(),
|
|
119
|
+
align: z.enum(["left", "center", "right"]).nullable(),
|
|
120
|
+
numberOfLines: z.number().nullable(),
|
|
121
|
+
fontSize: z.number().nullable()
|
|
122
|
+
}),
|
|
123
|
+
slots: [],
|
|
124
|
+
description: "Body text paragraph. Use for descriptions and longer content.",
|
|
125
|
+
example: { text: "This is a paragraph of body text." }
|
|
126
|
+
},
|
|
127
|
+
Label: {
|
|
128
|
+
props: z.object({
|
|
129
|
+
text: z.string(),
|
|
130
|
+
color: z.string().nullable(),
|
|
131
|
+
bold: z.boolean().nullable(),
|
|
132
|
+
size: z.enum(["xs", "sm", "md"]).nullable()
|
|
133
|
+
}),
|
|
134
|
+
slots: [],
|
|
135
|
+
description: "Small utility text. Use for captions, form labels, and secondary information.",
|
|
136
|
+
example: { text: "Status", size: "sm" }
|
|
137
|
+
},
|
|
138
|
+
Image: {
|
|
139
|
+
props: z.object({
|
|
140
|
+
src: z.string(),
|
|
141
|
+
alt: z.string().nullable(),
|
|
142
|
+
width: z.number().nullable(),
|
|
143
|
+
height: z.number().nullable(),
|
|
144
|
+
resizeMode: z.enum(["cover", "contain", "stretch", "center"]).nullable(),
|
|
145
|
+
borderRadius: z.number().nullable()
|
|
146
|
+
}),
|
|
147
|
+
slots: [],
|
|
148
|
+
description: "Image display. Provide a source URL and optional dimensions.",
|
|
149
|
+
example: {
|
|
150
|
+
src: "https://picsum.photos/300/200",
|
|
151
|
+
alt: "Photo",
|
|
152
|
+
width: 300,
|
|
153
|
+
height: 200
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
Avatar: {
|
|
157
|
+
props: z.object({
|
|
158
|
+
src: z.string().nullable(),
|
|
159
|
+
initials: z.string().nullable(),
|
|
160
|
+
size: z.enum(["sm", "md", "lg", "xl"]).nullable(),
|
|
161
|
+
backgroundColor: z.string().nullable()
|
|
162
|
+
}),
|
|
163
|
+
slots: [],
|
|
164
|
+
description: "Circular avatar showing an image or initials. Use for user profiles and contacts.",
|
|
165
|
+
example: { initials: "JD", size: "md" }
|
|
166
|
+
},
|
|
167
|
+
Badge: {
|
|
168
|
+
props: z.object({
|
|
169
|
+
label: z.string(),
|
|
170
|
+
variant: z.enum(["default", "info", "success", "warning", "error"]).nullable()
|
|
171
|
+
}),
|
|
172
|
+
slots: [],
|
|
173
|
+
description: "Small colored indicator with a label. Use for status, counts, and categories.",
|
|
174
|
+
example: { label: "New", variant: "info" }
|
|
175
|
+
},
|
|
176
|
+
Chip: {
|
|
177
|
+
props: z.object({
|
|
178
|
+
label: z.string(),
|
|
179
|
+
selected: z.boolean().nullable(),
|
|
180
|
+
backgroundColor: z.string().nullable()
|
|
181
|
+
}),
|
|
182
|
+
events: ["press", "remove"],
|
|
183
|
+
slots: [],
|
|
184
|
+
description: "Tag or filter chip. Bind on.remove for removable chips, on.press for selectable chips."
|
|
185
|
+
},
|
|
186
|
+
// ==========================================================================
|
|
187
|
+
// Input Components
|
|
188
|
+
// ==========================================================================
|
|
189
|
+
Button: {
|
|
190
|
+
props: z.object({
|
|
191
|
+
label: z.string(),
|
|
192
|
+
variant: z.enum(["primary", "secondary", "danger", "outline", "ghost"]).nullable(),
|
|
193
|
+
size: z.enum(["sm", "md", "lg"]).nullable(),
|
|
194
|
+
disabled: z.boolean().nullable(),
|
|
195
|
+
loading: z.boolean().nullable()
|
|
196
|
+
}),
|
|
197
|
+
events: ["press"],
|
|
198
|
+
slots: [],
|
|
199
|
+
description: "Pressable button with label. Set variant for styling. Bind on.press for the handler to call on press.",
|
|
200
|
+
example: { label: "Submit", variant: "primary" }
|
|
201
|
+
},
|
|
202
|
+
TextInput: {
|
|
203
|
+
props: z.object({
|
|
204
|
+
placeholder: z.string().nullable(),
|
|
205
|
+
value: z.string().nullable(),
|
|
206
|
+
secureTextEntry: z.boolean().nullable(),
|
|
207
|
+
keyboardType: z.enum(["default", "email-address", "numeric", "phone-pad", "url"]).nullable(),
|
|
208
|
+
multiline: z.boolean().nullable(),
|
|
209
|
+
numberOfLines: z.number().nullable(),
|
|
210
|
+
label: z.string().nullable(),
|
|
211
|
+
flex: z.number().nullable()
|
|
212
|
+
}),
|
|
213
|
+
events: ["submit", "focus", "blur"],
|
|
214
|
+
slots: [],
|
|
215
|
+
description: "Text input field. Use $bindState to bind to the state model for two-way binding. The value typed by the user is stored at the bound path.",
|
|
216
|
+
example: {
|
|
217
|
+
placeholder: "Enter text...",
|
|
218
|
+
label: "Name"
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
Switch: {
|
|
222
|
+
props: z.object({
|
|
223
|
+
checked: z.boolean().nullable(),
|
|
224
|
+
label: z.string().nullable(),
|
|
225
|
+
disabled: z.boolean().nullable()
|
|
226
|
+
}),
|
|
227
|
+
events: ["change"],
|
|
228
|
+
slots: [],
|
|
229
|
+
description: "Toggle switch. Use $bindState to bind to the state model."
|
|
230
|
+
},
|
|
231
|
+
Checkbox: {
|
|
232
|
+
props: z.object({
|
|
233
|
+
checked: z.boolean().nullable(),
|
|
234
|
+
label: z.string().nullable(),
|
|
235
|
+
disabled: z.boolean().nullable()
|
|
236
|
+
}),
|
|
237
|
+
events: ["change"],
|
|
238
|
+
slots: [],
|
|
239
|
+
description: "Checkbox for boolean selections. Use $bindState to bind to the state model."
|
|
240
|
+
},
|
|
241
|
+
Slider: {
|
|
242
|
+
props: z.object({
|
|
243
|
+
min: z.number().nullable(),
|
|
244
|
+
max: z.number().nullable(),
|
|
245
|
+
step: z.number().nullable(),
|
|
246
|
+
value: z.number().nullable(),
|
|
247
|
+
label: z.string().nullable(),
|
|
248
|
+
color: z.string().nullable()
|
|
249
|
+
}),
|
|
250
|
+
slots: [],
|
|
251
|
+
description: "Range slider for numeric values. Use $bindState to bind to the state model."
|
|
252
|
+
},
|
|
253
|
+
SearchBar: {
|
|
254
|
+
props: z.object({
|
|
255
|
+
placeholder: z.string().nullable(),
|
|
256
|
+
value: z.string().nullable()
|
|
257
|
+
}),
|
|
258
|
+
events: ["submit"],
|
|
259
|
+
slots: [],
|
|
260
|
+
description: "Search input with icon. Bind on.submit to trigger search on submit."
|
|
261
|
+
},
|
|
262
|
+
// ==========================================================================
|
|
263
|
+
// Feedback Components
|
|
264
|
+
// ==========================================================================
|
|
265
|
+
Spinner: {
|
|
266
|
+
props: z.object({
|
|
267
|
+
size: z.enum(["small", "large"]).nullable(),
|
|
268
|
+
color: z.string().nullable()
|
|
269
|
+
}),
|
|
270
|
+
slots: [],
|
|
271
|
+
description: "Loading spinner indicator. Use while content is loading."
|
|
272
|
+
},
|
|
273
|
+
ProgressBar: {
|
|
274
|
+
props: z.object({
|
|
275
|
+
progress: z.number(),
|
|
276
|
+
color: z.string().nullable(),
|
|
277
|
+
trackColor: z.string().nullable(),
|
|
278
|
+
height: z.number().nullable()
|
|
279
|
+
}),
|
|
280
|
+
slots: [],
|
|
281
|
+
description: "Horizontal progress bar. Set progress from 0 to 1."
|
|
282
|
+
},
|
|
283
|
+
// ==========================================================================
|
|
284
|
+
// Composite Components
|
|
285
|
+
// ==========================================================================
|
|
286
|
+
Card: {
|
|
287
|
+
props: z.object({
|
|
288
|
+
title: z.string().nullable(),
|
|
289
|
+
subtitle: z.string().nullable(),
|
|
290
|
+
padding: z.number().nullable(),
|
|
291
|
+
backgroundColor: z.string().nullable(),
|
|
292
|
+
borderRadius: z.number().nullable(),
|
|
293
|
+
elevated: z.boolean().nullable()
|
|
294
|
+
}),
|
|
295
|
+
slots: ["default"],
|
|
296
|
+
description: "Elevated card container with optional title. Use for grouping related content.",
|
|
297
|
+
example: { title: "Details", padding: 16, elevated: true }
|
|
298
|
+
},
|
|
299
|
+
ListItem: {
|
|
300
|
+
props: z.object({
|
|
301
|
+
title: z.string(),
|
|
302
|
+
subtitle: z.string().nullable(),
|
|
303
|
+
leading: z.string().nullable(),
|
|
304
|
+
trailing: z.string().nullable(),
|
|
305
|
+
showChevron: z.boolean().nullable()
|
|
306
|
+
}),
|
|
307
|
+
events: ["press"],
|
|
308
|
+
slots: [],
|
|
309
|
+
description: "List row with title, subtitle, and optional leading/trailing text. Bind on.press for the press handler.",
|
|
310
|
+
example: {
|
|
311
|
+
title: "Settings",
|
|
312
|
+
subtitle: "Manage your preferences",
|
|
313
|
+
showChevron: true
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
Modal: {
|
|
317
|
+
props: z.object({
|
|
318
|
+
visible: z.boolean(),
|
|
319
|
+
title: z.string().nullable(),
|
|
320
|
+
animationType: z.enum(["slide", "fade", "none"]).nullable()
|
|
321
|
+
}),
|
|
322
|
+
slots: ["default"],
|
|
323
|
+
description: "Modal overlay dialog. Use $bindState on visible to bind visibility to the state model."
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
var standardActionDefinitions = {
|
|
327
|
+
navigate: {
|
|
328
|
+
params: z.object({
|
|
329
|
+
screen: z.string(),
|
|
330
|
+
params: z.record(z.string(), z.unknown()).nullable()
|
|
331
|
+
}),
|
|
332
|
+
description: "Navigate to a screen. Calls the user-provided navigation function."
|
|
333
|
+
},
|
|
334
|
+
goBack: {
|
|
335
|
+
params: z.object({}),
|
|
336
|
+
description: "Navigate back to the previous screen."
|
|
337
|
+
},
|
|
338
|
+
showAlert: {
|
|
339
|
+
params: z.object({
|
|
340
|
+
title: z.string(),
|
|
341
|
+
message: z.string().nullable(),
|
|
342
|
+
buttons: z.array(
|
|
343
|
+
z.object({
|
|
344
|
+
text: z.string(),
|
|
345
|
+
style: z.enum(["default", "cancel", "destructive"]).nullable(),
|
|
346
|
+
action: z.string().nullable()
|
|
347
|
+
})
|
|
348
|
+
).nullable()
|
|
349
|
+
}),
|
|
350
|
+
description: "Show a native alert dialog using Alert.alert()."
|
|
351
|
+
},
|
|
352
|
+
share: {
|
|
353
|
+
params: z.object({
|
|
354
|
+
message: z.string(),
|
|
355
|
+
url: z.string().nullable(),
|
|
356
|
+
title: z.string().nullable()
|
|
357
|
+
}),
|
|
358
|
+
description: "Open the native share sheet using Share.share()."
|
|
359
|
+
},
|
|
360
|
+
openURL: {
|
|
361
|
+
params: z.object({
|
|
362
|
+
url: z.string()
|
|
363
|
+
}),
|
|
364
|
+
description: "Open a URL in the default browser using Linking.openURL()."
|
|
365
|
+
},
|
|
366
|
+
setState: {
|
|
367
|
+
params: z.object({
|
|
368
|
+
statePath: z.string(),
|
|
369
|
+
value: z.unknown()
|
|
370
|
+
}),
|
|
371
|
+
description: "Update a value in the state model at the given statePath."
|
|
372
|
+
},
|
|
373
|
+
pushState: {
|
|
374
|
+
params: z.object({
|
|
375
|
+
statePath: z.string(),
|
|
376
|
+
value: z.unknown(),
|
|
377
|
+
clearStatePath: z.string().optional()
|
|
378
|
+
}),
|
|
379
|
+
description: 'Append an item to an array in the state model. The value can contain { $state: "/statePath" } references to read from current state, and "$id" to auto-generate a unique ID. Use clearStatePath to reset another path after pushing (e.g. clear an input field). Example: { statePath: "/todos", value: { id: "$id", title: { $state: "/newTodoText" }, completed: false }, clearStatePath: "/newTodoText" }.'
|
|
380
|
+
},
|
|
381
|
+
removeState: {
|
|
382
|
+
params: z.object({
|
|
383
|
+
statePath: z.string(),
|
|
384
|
+
index: z.number()
|
|
385
|
+
}),
|
|
386
|
+
description: "Remove an item from an array in the state model at the given index."
|
|
387
|
+
},
|
|
388
|
+
refresh: {
|
|
389
|
+
params: z.object({
|
|
390
|
+
target: z.string().nullable()
|
|
391
|
+
}),
|
|
392
|
+
description: "Trigger a data refresh. Optionally specify a target to refresh."
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
export {
|
|
397
|
+
standardComponentDefinitions,
|
|
398
|
+
standardActionDefinitions
|
|
399
|
+
};
|
|
400
|
+
//# sourceMappingURL=chunk-QYY3Q42V.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/catalog.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// =============================================================================\n// Standard Component Definitions for React Native\n// =============================================================================\n\n/**\n * Standard component definitions for React Native catalogs.\n *\n * These can be used directly or extended with custom components.\n * All components are built using React Native core primitives only.\n */\nexport const standardComponentDefinitions = {\n // ==========================================================================\n // Layout Components\n // ==========================================================================\n\n Container: {\n props: z.object({\n padding: z.number().nullable(),\n paddingHorizontal: z.number().nullable(),\n paddingVertical: z.number().nullable(),\n margin: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n borderRadius: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Generic container wrapper. Use for grouping elements with padding, margin, and background color.\",\n example: { padding: 16, backgroundColor: \"#FFFFFF\" },\n },\n\n Row: {\n props: z.object({\n gap: z.number().nullable(),\n alignItems: z\n .enum([\"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\"])\n .nullable(),\n justifyContent: z\n .enum([\n \"flex-start\",\n \"center\",\n \"flex-end\",\n \"space-between\",\n \"space-around\",\n \"space-evenly\",\n ])\n .nullable(),\n flexWrap: z.enum([\"wrap\", \"nowrap\"]).nullable(),\n padding: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Horizontal flex layout. Use for placing elements side by side.\",\n example: { gap: 12, alignItems: \"center\" },\n },\n\n Column: {\n props: z.object({\n gap: z.number().nullable(),\n alignItems: z\n .enum([\"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\"])\n .nullable(),\n justifyContent: z\n .enum([\n \"flex-start\",\n \"center\",\n \"flex-end\",\n \"space-between\",\n \"space-around\",\n \"space-evenly\",\n ])\n .nullable(),\n padding: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Vertical flex layout. Use for stacking elements top to bottom.\",\n example: { gap: 12, padding: 16 },\n },\n\n ScrollContainer: {\n props: z.object({\n horizontal: z.boolean().nullable(),\n showsScrollIndicator: z.boolean().nullable(),\n padding: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Scrollable container. Use for content that may overflow the screen.\",\n },\n\n SafeArea: {\n props: z.object({\n backgroundColor: z.string().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Safe area container that respects device notches and system bars. Use as the outermost wrapper for screens.\",\n },\n\n Spacer: {\n props: z.object({\n size: z.number().nullable(),\n flex: z.number().nullable(),\n }),\n slots: [],\n description:\n \"Empty space between elements. Set size for fixed spacing or flex for flexible spacing.\",\n },\n\n Pressable: {\n props: z.object({}),\n events: [\"press\", \"longPress\"],\n slots: [\"default\"],\n description:\n \"Touchable wrapper that triggers events on press. Wrap any element to make it tappable. Bind on.press to setState to update state for visibility-driven UIs like tabs.\",\n },\n\n Divider: {\n props: z.object({\n direction: z.enum([\"horizontal\", \"vertical\"]).nullable(),\n color: z.string().nullable(),\n thickness: z.number().nullable(),\n margin: z.number().nullable(),\n }),\n slots: [],\n description: \"Thin line separator between content sections.\",\n },\n\n // ==========================================================================\n // Content Components\n // ==========================================================================\n\n Heading: {\n props: z.object({\n text: z.string(),\n level: z.enum([\"h1\", \"h2\", \"h3\", \"h4\"]).nullable(),\n color: z.string().nullable(),\n align: z.enum([\"left\", \"center\", \"right\"]).nullable(),\n }),\n slots: [],\n description:\n \"Heading text at various levels. h1 is largest, h4 is smallest.\",\n example: { text: \"Welcome\", level: \"h1\" },\n },\n\n Paragraph: {\n props: z.object({\n text: z.string(),\n color: z.string().nullable(),\n align: z.enum([\"left\", \"center\", \"right\"]).nullable(),\n numberOfLines: z.number().nullable(),\n fontSize: z.number().nullable(),\n }),\n slots: [],\n description:\n \"Body text paragraph. Use for descriptions and longer content.\",\n example: { text: \"This is a paragraph of body text.\" },\n },\n\n Label: {\n props: z.object({\n text: z.string(),\n color: z.string().nullable(),\n bold: z.boolean().nullable(),\n size: z.enum([\"xs\", \"sm\", \"md\"]).nullable(),\n }),\n slots: [],\n description:\n \"Small utility text. Use for captions, form labels, and secondary information.\",\n example: { text: \"Status\", size: \"sm\" },\n },\n\n Image: {\n props: z.object({\n src: z.string(),\n alt: z.string().nullable(),\n width: z.number().nullable(),\n height: z.number().nullable(),\n resizeMode: z.enum([\"cover\", \"contain\", \"stretch\", \"center\"]).nullable(),\n borderRadius: z.number().nullable(),\n }),\n slots: [],\n description: \"Image display. Provide a source URL and optional dimensions.\",\n example: {\n src: \"https://picsum.photos/300/200\",\n alt: \"Photo\",\n width: 300,\n height: 200,\n },\n },\n\n Avatar: {\n props: z.object({\n src: z.string().nullable(),\n initials: z.string().nullable(),\n size: z.enum([\"sm\", \"md\", \"lg\", \"xl\"]).nullable(),\n backgroundColor: z.string().nullable(),\n }),\n slots: [],\n description:\n \"Circular avatar showing an image or initials. Use for user profiles and contacts.\",\n example: { initials: \"JD\", size: \"md\" },\n },\n\n Badge: {\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"default\", \"info\", \"success\", \"warning\", \"error\"])\n .nullable(),\n }),\n slots: [],\n description:\n \"Small colored indicator with a label. Use for status, counts, and categories.\",\n example: { label: \"New\", variant: \"info\" },\n },\n\n Chip: {\n props: z.object({\n label: z.string(),\n selected: z.boolean().nullable(),\n backgroundColor: z.string().nullable(),\n }),\n events: [\"press\", \"remove\"],\n slots: [],\n description:\n \"Tag or filter chip. Bind on.remove for removable chips, on.press for selectable chips.\",\n },\n\n // ==========================================================================\n // Input Components\n // ==========================================================================\n\n Button: {\n props: z.object({\n label: z.string(),\n variant: z\n .enum([\"primary\", \"secondary\", \"danger\", \"outline\", \"ghost\"])\n .nullable(),\n size: z.enum([\"sm\", \"md\", \"lg\"]).nullable(),\n disabled: z.boolean().nullable(),\n loading: z.boolean().nullable(),\n }),\n events: [\"press\"],\n slots: [],\n description:\n \"Pressable button with label. Set variant for styling. Bind on.press for the handler to call on press.\",\n example: { label: \"Submit\", variant: \"primary\" },\n },\n\n TextInput: {\n props: z.object({\n placeholder: z.string().nullable(),\n value: z.string().nullable(),\n secureTextEntry: z.boolean().nullable(),\n keyboardType: z\n .enum([\"default\", \"email-address\", \"numeric\", \"phone-pad\", \"url\"])\n .nullable(),\n multiline: z.boolean().nullable(),\n numberOfLines: z.number().nullable(),\n label: z.string().nullable(),\n flex: z.number().nullable(),\n }),\n events: [\"submit\", \"focus\", \"blur\"],\n slots: [],\n description:\n \"Text input field. Use $bindState to bind to the state model for two-way binding. The value typed by the user is stored at the bound path.\",\n example: {\n placeholder: \"Enter text...\",\n label: \"Name\",\n },\n },\n\n Switch: {\n props: z.object({\n checked: z.boolean().nullable(),\n label: z.string().nullable(),\n disabled: z.boolean().nullable(),\n }),\n events: [\"change\"],\n slots: [],\n description: \"Toggle switch. Use $bindState to bind to the state model.\",\n },\n\n Checkbox: {\n props: z.object({\n checked: z.boolean().nullable(),\n label: z.string().nullable(),\n disabled: z.boolean().nullable(),\n }),\n events: [\"change\"],\n slots: [],\n description:\n \"Checkbox for boolean selections. Use $bindState to bind to the state model.\",\n },\n\n Slider: {\n props: z.object({\n min: z.number().nullable(),\n max: z.number().nullable(),\n step: z.number().nullable(),\n value: z.number().nullable(),\n label: z.string().nullable(),\n color: z.string().nullable(),\n }),\n slots: [],\n description:\n \"Range slider for numeric values. Use $bindState to bind to the state model.\",\n },\n\n SearchBar: {\n props: z.object({\n placeholder: z.string().nullable(),\n value: z.string().nullable(),\n }),\n events: [\"submit\"],\n slots: [],\n description:\n \"Search input with icon. Bind on.submit to trigger search on submit.\",\n },\n\n // ==========================================================================\n // Feedback Components\n // ==========================================================================\n\n Spinner: {\n props: z.object({\n size: z.enum([\"small\", \"large\"]).nullable(),\n color: z.string().nullable(),\n }),\n slots: [],\n description: \"Loading spinner indicator. Use while content is loading.\",\n },\n\n ProgressBar: {\n props: z.object({\n progress: z.number(),\n color: z.string().nullable(),\n trackColor: z.string().nullable(),\n height: z.number().nullable(),\n }),\n slots: [],\n description: \"Horizontal progress bar. Set progress from 0 to 1.\",\n },\n\n // ==========================================================================\n // Composite Components\n // ==========================================================================\n\n Card: {\n props: z.object({\n title: z.string().nullable(),\n subtitle: z.string().nullable(),\n padding: z.number().nullable(),\n backgroundColor: z.string().nullable(),\n borderRadius: z.number().nullable(),\n elevated: z.boolean().nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Elevated card container with optional title. Use for grouping related content.\",\n example: { title: \"Details\", padding: 16, elevated: true },\n },\n\n ListItem: {\n props: z.object({\n title: z.string(),\n subtitle: z.string().nullable(),\n leading: z.string().nullable(),\n trailing: z.string().nullable(),\n showChevron: z.boolean().nullable(),\n }),\n events: [\"press\"],\n slots: [],\n description:\n \"List row with title, subtitle, and optional leading/trailing text. Bind on.press for the press handler.\",\n example: {\n title: \"Settings\",\n subtitle: \"Manage your preferences\",\n showChevron: true,\n },\n },\n\n Modal: {\n props: z.object({\n visible: z.boolean(),\n title: z.string().nullable(),\n animationType: z.enum([\"slide\", \"fade\", \"none\"]).nullable(),\n }),\n slots: [\"default\"],\n description:\n \"Modal overlay dialog. Use $bindState on visible to bind visibility to the state model.\",\n },\n};\n\n// =============================================================================\n// Standard Action Definitions for React Native\n// =============================================================================\n\n/**\n * Standard action definitions for React Native catalogs.\n *\n * These use React Native core APIs (Alert, Share, Linking) and\n * user-provided functions (navigate).\n */\nexport const standardActionDefinitions = {\n navigate: {\n params: z.object({\n screen: z.string(),\n params: z.record(z.string(), z.unknown()).nullable(),\n }),\n description:\n \"Navigate to a screen. Calls the user-provided navigation function.\",\n },\n\n goBack: {\n params: z.object({}),\n description: \"Navigate back to the previous screen.\",\n },\n\n showAlert: {\n params: z.object({\n title: z.string(),\n message: z.string().nullable(),\n buttons: z\n .array(\n z.object({\n text: z.string(),\n style: z.enum([\"default\", \"cancel\", \"destructive\"]).nullable(),\n action: z.string().nullable(),\n }),\n )\n .nullable(),\n }),\n description: \"Show a native alert dialog using Alert.alert().\",\n },\n\n share: {\n params: z.object({\n message: z.string(),\n url: z.string().nullable(),\n title: z.string().nullable(),\n }),\n description: \"Open the native share sheet using Share.share().\",\n },\n\n openURL: {\n params: z.object({\n url: z.string(),\n }),\n description: \"Open a URL in the default browser using Linking.openURL().\",\n },\n\n setState: {\n params: z.object({\n statePath: z.string(),\n value: z.unknown(),\n }),\n description: \"Update a value in the state model at the given statePath.\",\n },\n\n pushState: {\n params: z.object({\n statePath: z.string(),\n value: z.unknown(),\n clearStatePath: z.string().optional(),\n }),\n description:\n 'Append an item to an array in the state model. The value can contain { $state: \"/statePath\" } references to read from current state, and \"$id\" to auto-generate a unique ID. Use clearStatePath to reset another path after pushing (e.g. clear an input field). Example: { statePath: \"/todos\", value: { id: \"$id\", title: { $state: \"/newTodoText\" }, completed: false }, clearStatePath: \"/newTodoText\" }.',\n },\n\n removeState: {\n params: z.object({\n statePath: z.string(),\n index: z.number(),\n }),\n description:\n \"Remove an item from an array in the state model at the given index.\",\n },\n\n refresh: {\n params: z.object({\n target: z.string().nullable(),\n }),\n description:\n \"Trigger a data refresh. Optionally specify a target to refresh.\",\n },\n};\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Type for a component definition\n */\nexport type ComponentDefinition = {\n props: z.ZodType;\n slots: string[];\n events?: string[];\n description: string;\n};\n\n/**\n * Type for an action definition\n */\nexport type ActionDefinition = {\n params: z.ZodType;\n description: string;\n};\n"],"mappings":";AAAA,SAAS,SAAS;AAYX,IAAM,+BAA+B;AAAA;AAAA;AAAA;AAAA,EAK1C,WAAW;AAAA,IACT,OAAO,EAAE,OAAO;AAAA,MACd,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,MACvC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,MACrC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,MACrC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,MAClC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,IACD,OAAO,CAAC,SAAS;AAAA,IACjB,aACE;AAAA,IACF,SAAS,EAAE,SAAS,IAAI,iBAAiB,UAAU;AAAA,EACrD;AAAA,EAEA,KAAK;AAAA,IACH,OAAO,EAAE,OAAO;AAAA,MACd,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MACzB,YAAY,EACT,KAAK,CAAC,cAAc,UAAU,YAAY,WAAW,UAAU,CAAC,EAChE,SAAS;AAAA,MACZ,gBAAgB,EACb,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS;AAAA,MACZ,UAAU,EAAE,KAAK,CAAC,QAAQ,QAAQ,CAAC,EAAE,SAAS;AAAA,MAC9C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,IACD,OAAO,CAAC,SAAS;AAAA,IACjB,aACE;AAAA,IACF,SAAS,EAAE,KAAK,IAAI,YAAY,SAAS;AAAA,EAC3C;AAAA,EAEA,QAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,MACd,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MACzB,YAAY,EACT,KAAK,CAAC,cAAc,UAAU,YAAY,WAAW,UAAU,CAAC,EAChE,SAAS;AAAA,MACZ,gBAAgB,EACb,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS;AAAA,MACZ,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,IACD,OAAO,CAAC,SAAS;AAAA,IACjB,aACE;AAAA,IACF,SAAS,EAAE,KAAK,IAAI,SAAS,GAAG;AAAA,EAClC;AAAA,EAEA,iBAAiB;AAAA,IACf,OAAO,EAAE,OAAO;AAAA,MACd,YAAY,EAAE,QAAQ,EAAE,SAAS;AAAA,MACjC,sBAAsB,EAAE,QAAQ,EAAE,SAAS;AAAA,MAC3C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,IACvC,CAAC;AAAA,IACD,OAAO,CAAC,SAAS;AAAA,IACjB,aACE;AAAA,EACJ;AAAA,EAEA,UAAU;AAAA,IACR,OAAO,EAAE,OAAO;AAAA,MACd,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,IACvC,CAAC;AAAA,IACD,OAAO,CAAC,SAAS;AAAA,IACjB,aACE;AAAA,EACJ;AAAA,EAEA,QAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,MACd,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aACE;AAAA,EACJ;AAAA,EAEA,WAAW;AAAA,IACT,OAAO,EAAE,OAAO,CAAC,CAAC;AAAA,IAClB,QAAQ,CAAC,SAAS,WAAW;AAAA,IAC7B,OAAO,CAAC,SAAS;AAAA,IACjB,aACE;AAAA,EACJ;AAAA,EAEA,SAAS;AAAA,IACP,OAAO,EAAE,OAAO;AAAA,MACd,WAAW,EAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,MACvD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aAAa;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA,IACP,OAAO,EAAE,OAAO;AAAA,MACd,MAAM,EAAE,OAAO;AAAA,MACf,OAAO,EAAE,KAAK,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,MACjD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,OAAO,EAAE,KAAK,CAAC,QAAQ,UAAU,OAAO,CAAC,EAAE,SAAS;AAAA,IACtD,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aACE;AAAA,IACF,SAAS,EAAE,MAAM,WAAW,OAAO,KAAK;AAAA,EAC1C;AAAA,EAEA,WAAW;AAAA,IACT,OAAO,EAAE,OAAO;AAAA,MACd,MAAM,EAAE,OAAO;AAAA,MACf,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,OAAO,EAAE,KAAK,CAAC,QAAQ,UAAU,OAAO,CAAC,EAAE,SAAS;AAAA,MACpD,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,MACnC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,IAChC,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aACE;AAAA,IACF,SAAS,EAAE,MAAM,oCAAoC;AAAA,EACvD;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,EAAE,OAAO;AAAA,MACd,MAAM,EAAE,OAAO;AAAA,MACf,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,MAAM,EAAE,QAAQ,EAAE,SAAS;AAAA,MAC3B,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,IAC5C,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aACE;AAAA,IACF,SAAS,EAAE,MAAM,UAAU,MAAM,KAAK;AAAA,EACxC;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,EAAE,OAAO;AAAA,MACd,KAAK,EAAE,OAAO;AAAA,MACd,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,YAAY,EAAE,KAAK,CAAC,SAAS,WAAW,WAAW,QAAQ,CAAC,EAAE,SAAS;AAAA,MACvE,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,IACpC,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aAAa;AAAA,IACb,SAAS;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,MACd,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MACzB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,MAChD,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,IACvC,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aACE;AAAA,IACF,SAAS,EAAE,UAAU,MAAM,MAAM,KAAK;AAAA,EACxC;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,EAAE,OAAO;AAAA,MACd,OAAO,EAAE,OAAO;AAAA,MAChB,SAAS,EACN,KAAK,CAAC,WAAW,QAAQ,WAAW,WAAW,OAAO,CAAC,EACvD,SAAS;AAAA,IACd,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aACE;AAAA,IACF,SAAS,EAAE,OAAO,OAAO,SAAS,OAAO;AAAA,EAC3C;AAAA,EAEA,MAAM;AAAA,IACJ,OAAO,EAAE,OAAO;AAAA,MACd,OAAO,EAAE,OAAO;AAAA,MAChB,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,MAC/B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,IACvC,CAAC;AAAA,IACD,QAAQ,CAAC,SAAS,QAAQ;AAAA,IAC1B,OAAO,CAAC;AAAA,IACR,aACE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,MACd,OAAO,EAAE,OAAO;AAAA,MAChB,SAAS,EACN,KAAK,CAAC,WAAW,aAAa,UAAU,WAAW,OAAO,CAAC,EAC3D,SAAS;AAAA,MACZ,MAAM,EAAE,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,MAC1C,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,MAC/B,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,IAChC,CAAC;AAAA,IACD,QAAQ,CAAC,OAAO;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,aACE;AAAA,IACF,SAAS,EAAE,OAAO,UAAU,SAAS,UAAU;AAAA,EACjD;AAAA,EAEA,WAAW;AAAA,IACT,OAAO,EAAE,OAAO;AAAA,MACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,MACjC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AAAA,MACtC,cAAc,EACX,KAAK,CAAC,WAAW,iBAAiB,WAAW,aAAa,KAAK,CAAC,EAChE,SAAS;AAAA,MACZ,WAAW,EAAE,QAAQ,EAAE,SAAS;AAAA,MAChC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,MACnC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,IACD,QAAQ,CAAC,UAAU,SAAS,MAAM;AAAA,IAClC,OAAO,CAAC;AAAA,IACR,aACE;AAAA,IACF,SAAS;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,MACd,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,MAC9B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,IACjC,CAAC;AAAA,IACD,QAAQ,CAAC,QAAQ;AAAA,IACjB,OAAO,CAAC;AAAA,IACR,aAAa;AAAA,EACf;AAAA,EAEA,UAAU;AAAA,IACR,OAAO,EAAE,OAAO;AAAA,MACd,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,MAC9B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,IACjC,CAAC;AAAA,IACD,QAAQ,CAAC,QAAQ;AAAA,IACjB,OAAO,CAAC;AAAA,IACR,aACE;AAAA,EACJ;AAAA,EAEA,QAAQ;AAAA,IACN,OAAO,EAAE,OAAO;AAAA,MACd,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MACzB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MACzB,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aACE;AAAA,EACJ;AAAA,EAEA,WAAW;AAAA,IACT,OAAO,EAAE,OAAO;AAAA,MACd,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,MACjC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC;AAAA,IACD,QAAQ,CAAC,QAAQ;AAAA,IACjB,OAAO,CAAC;AAAA,IACR,aACE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA,IACP,OAAO,EAAE,OAAO;AAAA,MACd,MAAM,EAAE,KAAK,CAAC,SAAS,OAAO,CAAC,EAAE,SAAS;AAAA,MAC1C,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aAAa;AAAA,EACf;AAAA,EAEA,aAAa;AAAA,IACX,OAAO,EAAE,OAAO;AAAA,MACd,UAAU,EAAE,OAAO;AAAA,MACnB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,MAChC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,IACR,aAAa;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AAAA,IACJ,OAAO,EAAE,OAAO;AAAA,MACd,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,MACrC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,MAClC,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,IACjC,CAAC;AAAA,IACD,OAAO,CAAC,SAAS;AAAA,IACjB,aACE;AAAA,IACF,SAAS,EAAE,OAAO,WAAW,SAAS,IAAI,UAAU,KAAK;AAAA,EAC3D;AAAA,EAEA,UAAU;AAAA,IACR,OAAO,EAAE,OAAO;AAAA,MACd,OAAO,EAAE,OAAO;AAAA,MAChB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,IACpC,CAAC;AAAA,IACD,QAAQ,CAAC,OAAO;AAAA,IAChB,OAAO,CAAC;AAAA,IACR,aACE;AAAA,IACF,SAAS;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,EAAE,OAAO;AAAA,MACd,SAAS,EAAE,QAAQ;AAAA,MACnB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,eAAe,EAAE,KAAK,CAAC,SAAS,QAAQ,MAAM,CAAC,EAAE,SAAS;AAAA,IAC5D,CAAC;AAAA,IACD,OAAO,CAAC,SAAS;AAAA,IACjB,aACE;AAAA,EACJ;AACF;AAYO,IAAM,4BAA4B;AAAA,EACvC,UAAU;AAAA,IACR,QAAQ,EAAE,OAAO;AAAA,MACf,QAAQ,EAAE,OAAO;AAAA,MACjB,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IACrD,CAAC;AAAA,IACD,aACE;AAAA,EACJ;AAAA,EAEA,QAAQ;AAAA,IACN,QAAQ,EAAE,OAAO,CAAC,CAAC;AAAA,IACnB,aAAa;AAAA,EACf;AAAA,EAEA,WAAW;AAAA,IACT,QAAQ,EAAE,OAAO;AAAA,MACf,OAAO,EAAE,OAAO;AAAA,MAChB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,SAAS,EACN;AAAA,QACC,EAAE,OAAO;AAAA,UACP,MAAM,EAAE,OAAO;AAAA,UACf,OAAO,EAAE,KAAK,CAAC,WAAW,UAAU,aAAa,CAAC,EAAE,SAAS;AAAA,UAC7D,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,CAAC;AAAA,MACH,EACC,SAAS;AAAA,IACd,CAAC;AAAA,IACD,aAAa;AAAA,EACf;AAAA,EAEA,OAAO;AAAA,IACL,QAAQ,EAAE,OAAO;AAAA,MACf,SAAS,EAAE,OAAO;AAAA,MAClB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,MACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC;AAAA,IACD,aAAa;AAAA,EACf;AAAA,EAEA,SAAS;AAAA,IACP,QAAQ,EAAE,OAAO;AAAA,MACf,KAAK,EAAE,OAAO;AAAA,IAChB,CAAC;AAAA,IACD,aAAa;AAAA,EACf;AAAA,EAEA,UAAU;AAAA,IACR,QAAQ,EAAE,OAAO;AAAA,MACf,WAAW,EAAE,OAAO;AAAA,MACpB,OAAO,EAAE,QAAQ;AAAA,IACnB,CAAC;AAAA,IACD,aAAa;AAAA,EACf;AAAA,EAEA,WAAW;AAAA,IACT,QAAQ,EAAE,OAAO;AAAA,MACf,WAAW,EAAE,OAAO;AAAA,MACpB,OAAO,EAAE,QAAQ;AAAA,MACjB,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,IACtC,CAAC;AAAA,IACD,aACE;AAAA,EACJ;AAAA,EAEA,aAAa;AAAA,IACX,QAAQ,EAAE,OAAO;AAAA,MACf,WAAW,EAAE,OAAO;AAAA,MACpB,OAAO,EAAE,OAAO;AAAA,IAClB,CAAC;AAAA,IACD,aACE;AAAA,EACJ;AAAA,EAEA,SAAS;AAAA,IACP,QAAQ,EAAE,OAAO;AAAA,MACf,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC;AAAA,IACD,aACE;AAAA,EACJ;AACF;","names":[]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// src/schema.ts
|
|
2
|
+
import { defineSchema } from "@json-render/core";
|
|
3
|
+
var schema = defineSchema(
|
|
4
|
+
(s) => ({
|
|
5
|
+
// What the AI-generated SPEC looks like
|
|
6
|
+
spec: s.object({
|
|
7
|
+
/** Root element key */
|
|
8
|
+
root: s.string(),
|
|
9
|
+
/** Flat map of elements by key */
|
|
10
|
+
elements: s.record(
|
|
11
|
+
s.object({
|
|
12
|
+
/** Component type from catalog */
|
|
13
|
+
type: s.ref("catalog.components"),
|
|
14
|
+
/** Component props */
|
|
15
|
+
props: s.propsOf("catalog.components"),
|
|
16
|
+
/** Child element keys (flat reference) */
|
|
17
|
+
children: s.array(s.string()),
|
|
18
|
+
/** Visibility condition */
|
|
19
|
+
visible: s.any()
|
|
20
|
+
})
|
|
21
|
+
)
|
|
22
|
+
}),
|
|
23
|
+
// What the CATALOG must provide
|
|
24
|
+
catalog: s.object({
|
|
25
|
+
/** Component definitions */
|
|
26
|
+
components: s.map({
|
|
27
|
+
/** Zod schema for component props */
|
|
28
|
+
props: s.zod(),
|
|
29
|
+
/** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */
|
|
30
|
+
slots: s.array(s.string()),
|
|
31
|
+
/** Description for AI generation hints */
|
|
32
|
+
description: s.string(),
|
|
33
|
+
/** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */
|
|
34
|
+
example: s.any()
|
|
35
|
+
}),
|
|
36
|
+
/** Action definitions (optional) */
|
|
37
|
+
actions: s.map({
|
|
38
|
+
/** Zod schema for action params */
|
|
39
|
+
params: s.zod(),
|
|
40
|
+
/** Description for AI generation hints */
|
|
41
|
+
description: s.string()
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
}),
|
|
45
|
+
{
|
|
46
|
+
defaultRules: [
|
|
47
|
+
// Layout patterns
|
|
48
|
+
"FIXED BOTTOM BAR PATTERN: When building a screen with a fixed header and/or fixed bottom tab bar, the outermost vertical layout component must have flex:1 so it fills the screen. The scrollable content area must also have flex:1. Structure: screen wrapper > vertical layout(flex:1, gap:0) > [header, content wrapper(flex:1) > [scroll container(...)], bottom-tabs]. Both the outer layout AND the content wrapper need flex:1. ONLY use components from the AVAILABLE COMPONENTS list.",
|
|
49
|
+
"NEVER place a bottom tab bar or fixed footer inside a scroll container. It must be a sibling AFTER the flex:1 container that holds the scroll content.",
|
|
50
|
+
// Element integrity
|
|
51
|
+
"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist. A missing child element causes that entire branch of the UI to be invisible.",
|
|
52
|
+
"SELF-CHECK: After generating all elements, mentally walk the tree from root. Every key in every children array must resolve to a defined element. If you find a gap, output the missing element immediately.",
|
|
53
|
+
'When building repeating content backed by a state array (e.g. todos, posts, cart items), use the "repeat" field on a container element from the AVAILABLE COMPONENTS list. Example: { "type": "<ContainerComponent>", "props": { "gap": 8 }, "repeat": { "statePath": "/todos", "key": "id" }, "children": ["todo-item"] }. Inside repeated children, use { "$item": "field" } to read a field from the current item, and { "$index": true } for the current array index. For two-way binding to an item field use { "$bindItem": "completed" }. Do NOT hardcode individual elements for each array item.',
|
|
54
|
+
// Visible field placement
|
|
55
|
+
'CRITICAL: The "visible" field goes on the ELEMENT object, NOT inside "props". Correct: {"type":"<ComponentName>","props":{},"visible":{"$state":"/activeTab","eq":"home"},"children":[...]}. WRONG: {"type":"<ComponentName>","props":{},"visible":{...},"children":[...]} with visible inside props.',
|
|
56
|
+
// Tab navigation pattern
|
|
57
|
+
"TAB NAVIGATION PATTERN: When building a UI with multiple tabs, use a pressable/tappable component + setState action + visible conditions to make tabs functional. ONLY use components from the AVAILABLE COMPONENTS list.",
|
|
58
|
+
'Each tab button should be a pressable component wrapping its icon/label children, with action "setState" and actionParams { "statePath": "/activeTab", "value": "tabName" }.',
|
|
59
|
+
`Each tab's content section should have a visible condition: { "$state": "/activeTab", "eq": "tabName" }.`,
|
|
60
|
+
"The first tab's content should NOT have a visible condition (so it shows by default when no tab is selected yet). All other tabs MUST have a visible condition.",
|
|
61
|
+
// Tab active state highlighting (using dynamic props)
|
|
62
|
+
"TAB ACTIVE STYLING: Use $cond dynamic props on icon elements inside each tab button so a single icon changes appearance based on the active tab.",
|
|
63
|
+
' - For the icon name: { "$cond": { "$state": "/activeTab", "eq": "thisTabName" }, "$then": "home", "$else": "home-outline" }',
|
|
64
|
+
' - For the icon color: { "$cond": { "$state": "/activeTab", "eq": "thisTabName" }, "$then": "#007AFF", "$else": "#8E8E93" }',
|
|
65
|
+
" - For labels, use $cond on the color prop similarly.",
|
|
66
|
+
' - For the FIRST/DEFAULT tab, use { "$cond": [{ "$state": "/activeTab", "eq": "thisTabName" }], "$then": "#007AFF", "$else": "#8E8E93" } so it appears active before any tab is tapped. When no tab is selected yet, include a default tab with no visible condition.',
|
|
67
|
+
// Push/pop screen navigation (all screens in one spec)
|
|
68
|
+
'SCREEN NAVIGATION: Use a pressable component with action "push" and actionParams { "screen": "screenName" } to navigate to a new screen. Use action "pop" to go back. All screens must be defined in the SAME spec. ONLY use components from the AVAILABLE COMPONENTS list.',
|
|
69
|
+
'Each screen section uses a visible condition on /currentScreen: { "$state": "/currentScreen", "eq": "screenName" }. The default/home screen should show by default (no visible condition) and all other screens should have the appropriate visible condition.',
|
|
70
|
+
"push automatically maintains a /navStack in the state model so pop always returns to the previous screen.",
|
|
71
|
+
'Include a back button on pushed screens using action "pop". Example: pressable(action:"pop") > row layout > back icon + back label. ONLY use components from the AVAILABLE COMPONENTS list.',
|
|
72
|
+
"Use push/pop for drill-down flows: tapping a list item to see details, opening a profile, etc. Use setState + visible conditions for tab switching within a screen.",
|
|
73
|
+
'Example: A list screen with items that push to detail: a pressable component with action:"push" and actionParams:{screen:"detail"} wrapping each list item. The detail screen section has visible:{"$state":"/currentScreen","eq":"detail"} and contains a back button with action:"pop". ONLY use components from the AVAILABLE COMPONENTS list.'
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
var elementTreeSchema = schema;
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
schema,
|
|
81
|
+
elementTreeSchema
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=chunk-T27PQA6P.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema.ts"],"sourcesContent":["import { defineSchema } from \"@json-render/core\";\n\n/**\n * The schema for @json-render/react-native\n *\n * Defines:\n * - Spec: A flat tree of elements with keys, types, props, and children references\n * - Catalog: Components with props schemas, and optional actions\n */\nexport const schema = defineSchema(\n (s) => ({\n // What the AI-generated SPEC looks like\n spec: s.object({\n /** Root element key */\n root: s.string(),\n /** Flat map of elements by key */\n elements: s.record(\n s.object({\n /** Component type from catalog */\n type: s.ref(\"catalog.components\"),\n /** Component props */\n props: s.propsOf(\"catalog.components\"),\n /** Child element keys (flat reference) */\n children: s.array(s.string()),\n /** Visibility condition */\n visible: s.any(),\n }),\n ),\n }),\n\n // What the CATALOG must provide\n catalog: s.object({\n /** Component definitions */\n components: s.map({\n /** Zod schema for component props */\n props: s.zod(),\n /** Slots for this component. Use ['default'] for children, or named slots like ['header', 'footer'] */\n slots: s.array(s.string()),\n /** Description for AI generation hints */\n description: s.string(),\n /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */\n example: s.any(),\n }),\n /** Action definitions (optional) */\n actions: s.map({\n /** Zod schema for action params */\n params: s.zod(),\n /** Description for AI generation hints */\n description: s.string(),\n }),\n }),\n }),\n {\n defaultRules: [\n // Layout patterns\n \"FIXED BOTTOM BAR PATTERN: When building a screen with a fixed header and/or fixed bottom tab bar, the outermost vertical layout component must have flex:1 so it fills the screen. The scrollable content area must also have flex:1. Structure: screen wrapper > vertical layout(flex:1, gap:0) > [header, content wrapper(flex:1) > [scroll container(...)], bottom-tabs]. Both the outer layout AND the content wrapper need flex:1. ONLY use components from the AVAILABLE COMPONENTS list.\",\n \"NEVER place a bottom tab bar or fixed footer inside a scroll container. It must be a sibling AFTER the flex:1 container that holds the scroll content.\",\n\n // Element integrity\n \"CRITICAL INTEGRITY CHECK: Before outputting ANY element that references children, you MUST have already output (or will output) each child as its own element. If an element has children: ['a', 'b'], then elements 'a' and 'b' MUST exist. A missing child element causes that entire branch of the UI to be invisible.\",\n \"SELF-CHECK: After generating all elements, mentally walk the tree from root. Every key in every children array must resolve to a defined element. If you find a gap, output the missing element immediately.\",\n 'When building repeating content backed by a state array (e.g. todos, posts, cart items), use the \"repeat\" field on a container element from the AVAILABLE COMPONENTS list. Example: { \"type\": \"<ContainerComponent>\", \"props\": { \"gap\": 8 }, \"repeat\": { \"statePath\": \"/todos\", \"key\": \"id\" }, \"children\": [\"todo-item\"] }. Inside repeated children, use { \"$item\": \"field\" } to read a field from the current item, and { \"$index\": true } for the current array index. For two-way binding to an item field use { \"$bindItem\": \"completed\" }. Do NOT hardcode individual elements for each array item.',\n\n // Visible field placement\n 'CRITICAL: The \"visible\" field goes on the ELEMENT object, NOT inside \"props\". Correct: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{\"$state\":\"/activeTab\",\"eq\":\"home\"},\"children\":[...]}. WRONG: {\"type\":\"<ComponentName>\",\"props\":{},\"visible\":{...},\"children\":[...]} with visible inside props.',\n\n // Tab navigation pattern\n \"TAB NAVIGATION PATTERN: When building a UI with multiple tabs, use a pressable/tappable component + setState action + visible conditions to make tabs functional. ONLY use components from the AVAILABLE COMPONENTS list.\",\n 'Each tab button should be a pressable component wrapping its icon/label children, with action \"setState\" and actionParams { \"statePath\": \"/activeTab\", \"value\": \"tabName\" }.',\n 'Each tab\\'s content section should have a visible condition: { \"$state\": \"/activeTab\", \"eq\": \"tabName\" }.',\n \"The first tab's content should NOT have a visible condition (so it shows by default when no tab is selected yet). All other tabs MUST have a visible condition.\",\n\n // Tab active state highlighting (using dynamic props)\n \"TAB ACTIVE STYLING: Use $cond dynamic props on icon elements inside each tab button so a single icon changes appearance based on the active tab.\",\n ' - For the icon name: { \"$cond\": { \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }, \"$then\": \"home\", \"$else\": \"home-outline\" }',\n ' - For the icon color: { \"$cond\": { \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }, \"$then\": \"#007AFF\", \"$else\": \"#8E8E93\" }',\n \" - For labels, use $cond on the color prop similarly.\",\n ' - For the FIRST/DEFAULT tab, use { \"$cond\": [{ \"$state\": \"/activeTab\", \"eq\": \"thisTabName\" }], \"$then\": \"#007AFF\", \"$else\": \"#8E8E93\" } so it appears active before any tab is tapped. When no tab is selected yet, include a default tab with no visible condition.',\n\n // Push/pop screen navigation (all screens in one spec)\n 'SCREEN NAVIGATION: Use a pressable component with action \"push\" and actionParams { \"screen\": \"screenName\" } to navigate to a new screen. Use action \"pop\" to go back. All screens must be defined in the SAME spec. ONLY use components from the AVAILABLE COMPONENTS list.',\n 'Each screen section uses a visible condition on /currentScreen: { \"$state\": \"/currentScreen\", \"eq\": \"screenName\" }. The default/home screen should show by default (no visible condition) and all other screens should have the appropriate visible condition.',\n \"push automatically maintains a /navStack in the state model so pop always returns to the previous screen.\",\n 'Include a back button on pushed screens using action \"pop\". Example: pressable(action:\"pop\") > row layout > back icon + back label. ONLY use components from the AVAILABLE COMPONENTS list.',\n \"Use push/pop for drill-down flows: tapping a list item to see details, opening a profile, etc. Use setState + visible conditions for tab switching within a screen.\",\n 'Example: A list screen with items that push to detail: a pressable component with action:\"push\" and actionParams:{screen:\"detail\"} wrapping each list item. The detail screen section has visible:{\"$state\":\"/currentScreen\",\"eq\":\"detail\"} and contains a back button with action:\"pop\". ONLY use components from the AVAILABLE COMPONENTS list.',\n ],\n },\n);\n\n/**\n * Type for the React Native schema\n */\nexport type ReactNativeSchema = typeof schema;\n\n/**\n * Infer the spec type from a catalog\n */\nexport type ReactNativeSpec<TCatalog> = typeof schema extends {\n createCatalog: (catalog: TCatalog) => { _specType: infer S };\n}\n ? S\n : never;\n\n// Backward compatibility aliases\n/** @deprecated Use `schema` instead */\nexport const elementTreeSchema = schema;\n/** @deprecated Use `ReactNativeSchema` instead */\nexport type ElementTreeSchema = ReactNativeSchema;\n/** @deprecated Use `ReactNativeSpec` instead */\nexport type ElementTreeSpec<T> = ReactNativeSpec<T>;\n"],"mappings":";AAAA,SAAS,oBAAoB;AAStB,IAAM,SAAS;AAAA,EACpB,CAAC,OAAO;AAAA;AAAA,IAEN,MAAM,EAAE,OAAO;AAAA;AAAA,MAEb,MAAM,EAAE,OAAO;AAAA;AAAA,MAEf,UAAU,EAAE;AAAA,QACV,EAAE,OAAO;AAAA;AAAA,UAEP,MAAM,EAAE,IAAI,oBAAoB;AAAA;AAAA,UAEhC,OAAO,EAAE,QAAQ,oBAAoB;AAAA;AAAA,UAErC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA;AAAA,UAE5B,SAAS,EAAE,IAAI;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA;AAAA,IAGD,SAAS,EAAE,OAAO;AAAA;AAAA,MAEhB,YAAY,EAAE,IAAI;AAAA;AAAA,QAEhB,OAAO,EAAE,IAAI;AAAA;AAAA,QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA;AAAA,QAEzB,aAAa,EAAE,OAAO;AAAA;AAAA,QAEtB,SAAS,EAAE,IAAI;AAAA,MACjB,CAAC;AAAA;AAAA,MAED,SAAS,EAAE,IAAI;AAAA;AAAA,QAEb,QAAQ,EAAE,IAAI;AAAA;AAAA,QAEd,aAAa,EAAE,OAAO;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EACA;AAAA,IACE,cAAc;AAAA;AAAA,MAEZ;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAGA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAkBO,IAAM,oBAAoB;","names":[]}
|