@bravostudioai/react 0.1.1 → 0.1.3

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.
@@ -0,0 +1,511 @@
1
+ import { sanitizePropName as l, getComponentPropType as G, getComponentPropName as W } from "./parser.js";
2
+ function K(U, I, y, b, m, c, g, P, h, d = !1) {
3
+ const E = [], N = [], a = [], r = [], u = [], k = [];
4
+ m.forEach((o) => {
5
+ E.push(` ${o.propName}?: ${o.propType};`);
6
+ }), c.forEach((o) => {
7
+ const n = l(o.groupName);
8
+ a.push(` ${n}?: string;`), a.push(
9
+ ` on${n[0].toUpperCase()}${n.slice(
10
+ 1
11
+ )}Change?: (value: string) => void;`
12
+ );
13
+ });
14
+ const A = [];
15
+ g.forEach((o) => {
16
+ const n = l(o.formName), p = `${n[0].toUpperCase()}${n.slice(
17
+ 1
18
+ )}FormData`, s = [];
19
+ o.inputs.forEach(($) => {
20
+ const S = $.propName, v = G($.type, $.name);
21
+ s.push(` ${S}: ${v};`);
22
+ }), A.push(`export interface ${p} {
23
+ ${s.join(`
24
+ `)}
25
+ }`), r.push(
26
+ ` on${n[0].toUpperCase()}${n.slice(
27
+ 1
28
+ )}Submit?: (formData: ${p}) => void;`
29
+ );
30
+ }), P.forEach((o) => {
31
+ const n = o.propName, p = n[0].toUpperCase() + n.slice(1);
32
+ u.push(` ${n}?: string;`), u.push(
33
+ ` ${n}Options?: Array<string | { value: string; label: string }>;`
34
+ ), u.push(
35
+ ` on${p}Change?: (value: string) => void;`
36
+ );
37
+ }), h.forEach((o) => {
38
+ const n = o.propName, p = n[0].toUpperCase() + n.slice(1);
39
+ k.push(` on${p}Click?: () => void;`);
40
+ }), b.forEach((o) => {
41
+ if (o.arrayContainer && o.arrayContainer.components.length > 0) {
42
+ const p = o.arrayContainer, s = `${p.propName[0].toUpperCase()}${p.propName.slice(
43
+ 1
44
+ )}Item`;
45
+ E.push(` ${p.propName}: ${s}[];`);
46
+ }
47
+ const n = l(o.name || "container");
48
+ N.push(` ${n}CurrentIndex?: number;`), N.push(
49
+ ` on${n[0].toUpperCase()}${n.slice(
50
+ 1
51
+ )}IndexChange?: (index: number) => void;`
52
+ );
53
+ });
54
+ const x = [
55
+ ...E,
56
+ ...N,
57
+ ...a,
58
+ ...r,
59
+ ...u,
60
+ ...k
61
+ ], z = x.length > 0, D = z ? `export interface ${y}Props {
62
+ ${x.join(`
63
+ `)}
64
+ }` : "", O = b.filter((o) => o.arrayContainer && o.arrayContainer.components.length > 0).map((o) => {
65
+ const n = o.arrayContainer, p = `${n.propName[0].toUpperCase()}${n.propName.slice(
66
+ 1
67
+ )}Item`, s = n.components.map(($) => ` ${$.propName}: ${$.propType};`).join(`
68
+ `);
69
+ return `export interface ${p} {
70
+ ${s}
71
+ }`;
72
+ }).join(`
73
+
74
+ `), M = A.join(`
75
+
76
+ `), j = [], T = [];
77
+ m.forEach((o) => {
78
+ const n = W(o.type);
79
+ j.push(` // ${o.name}
80
+ ...(props.${o.propName} !== undefined && { "${o.id}": { ${n}: props.${o.propName} } as any }),`);
81
+ }), P.forEach((o) => {
82
+ j.push(` // ${o.name}
83
+ ...((props.${o.propName} !== undefined || props.${o.propName}Options !== undefined) && {
84
+ "${o.id}": {
85
+ ...(props.${o.propName} !== undefined && { value: props.${o.propName} }),
86
+ ...(props.${o.propName}Options !== undefined && { options: props.${o.propName}Options }),
87
+ } as any
88
+ }),`);
89
+ }), b.forEach((o) => {
90
+ if (o.arrayContainer && o.arrayContainer.components.length > 0) {
91
+ const $ = o.arrayContainer, S = $.components.map((v) => {
92
+ const B = W(v.type);
93
+ return ` // ${v.name}
94
+ "${v.id}": {
95
+ ${B}: item.${v.propName},
96
+ }`;
97
+ }).join(`,
98
+ `);
99
+ j.push(` // ${$.name}
100
+ "${$.id}": props.${$.propName}.map((item) => ({
101
+ ${S}
102
+ })),`);
103
+ }
104
+ const n = l(o.name || "container"), p = `${n[0].toUpperCase()}${n.slice(
105
+ 1
106
+ )}IndexChange`, s = [];
107
+ o.id && (s.push(` // ${o.name}`), s.push(` "${o.id}": {`), s.push(
108
+ ` currentIndex: props.${n}CurrentIndex,`
109
+ ), s.push(` onIndexChange: props.on${p},`), s.push(" }")), s.length > 0 && T.push(s.join(`
110
+ `));
111
+ });
112
+ const F = T.length > 0 ? `
113
+ repeatingContainerControls={{
114
+ ${T.join(`,
115
+ `)}
116
+ }}` : "", w = [], e = [];
117
+ (c.length > 0 || g.length > 0 || P.length > 0 || h.length > 0) && (e.push(" const handleAction = (payload: any) => {"), e.push(" const { action } = payload?.bravo || {};"), e.push(""), P.length > 0 && (e.push(" // Handle select input changes"), e.push(
118
+ ' if (action?.action === "input-change" || action?.action === "select-change") {'
119
+ ), e.push(" const nodeId = action?.nodeId;"), e.push(" const value = action?.params?.value;"), e.push(""), P.forEach((o) => {
120
+ const n = o.propName, s = `on${n[0].toUpperCase() + n.slice(1)}Change`;
121
+ e.push(` // ${o.name}`), e.push(
122
+ ` if (nodeId === "${o.id}" && props.${s}) {`
123
+ ), e.push(` props.${s}(value);`), e.push(" return;"), e.push(" }");
124
+ }), e.push(" }"), e.push("")), h.length > 0 && (e.push(" // Handle button clicks"), e.push(
125
+ ' if (action?.action === "remote" || action?.action === "tap" || action?.action === "link") {'
126
+ ), e.push(" const nodeId = action?.nodeId;"), e.push(""), h.forEach((o) => {
127
+ const n = o.propName, s = `on${n[0].toUpperCase() + n.slice(1)}Click`;
128
+ e.push(` // ${o.name}`), e.push(
129
+ ` if (nodeId === "${o.id}" && props.${s}) {`
130
+ ), e.push(` props.${s}();`), e.push(" return;"), e.push(" }");
131
+ }), e.push(" }"), e.push("")), c.length > 0 && (e.push(
132
+ ' if (action?.action === "input-group-change") {'
133
+ ), e.push(
134
+ " const { groupName, value } = action.params;"
135
+ ), c.forEach((o) => {
136
+ const n = l(o.groupName), p = `on${n[0].toUpperCase()}${n.slice(
137
+ 1
138
+ )}Change`;
139
+ e.push(
140
+ ` if (groupName === "${o.groupName}" && props.${p}) {`
141
+ ), e.push(` props.${p}(value);`), e.push(" return;"), e.push(" }");
142
+ }), e.push(" }"), e.push("")), g.length > 0 && (e.push(' if (action?.action === "submit") {'), e.push(" // Get form inputs from Encore state"), e.push(
143
+ ` const formInputs = useEncoreState.getState().formInputs["${I}"] || {};`
144
+ ), e.push(" const submitNodeId = action?.nodeId;"), e.push(""), g.forEach((o, n) => {
145
+ const p = l(o.formName), s = `on${p[0].toUpperCase()}${p.slice(
146
+ 1
147
+ )}Submit`;
148
+ n > 0 && e.push(""), e.push(
149
+ ` // Form: ${o.formName} (${o.formId})`
150
+ ), o.submitButtonId ? e.push(
151
+ ` if (submitNodeId === "${o.submitButtonId}" && props.${s}) {`
152
+ ) : g.length === 1 ? e.push(` if (props.${s}) {`) : e.push(` if (props.${s}) {`), e.push(" // Extract form inputs for this form");
153
+ const $ = `${p[0].toUpperCase()}${p.slice(
154
+ 1
155
+ )}FormData`;
156
+ e.push(
157
+ ` const formData: ${$} = {`
158
+ );
159
+ const S = [];
160
+ o.inputs.forEach((v) => {
161
+ const B = v.propName;
162
+ S.push(
163
+ ` ${B}: formInputs["${v.id}"]`
164
+ );
165
+ }), e.push(S.join(`,
166
+ `)), e.push(" };"), e.push(` props.${s}(formData);`), e.push(
167
+ " // Note: Default form submission will still proceed after callback"
168
+ ), e.push(" }");
169
+ }), e.push(" }")), e.push(" };")), c.forEach((o) => {
170
+ const n = l(o.groupName);
171
+ w.push(
172
+ ` ...(props.${n} !== undefined && { ${n}: props.${n} }),`
173
+ );
174
+ });
175
+ const t = w.length > 0 ? `
176
+ inputGroups={{
177
+ ${w.join(`
178
+ `)}
179
+ }}` : "", f = e.length > 0 ? `
180
+ onAction={handleAction}` : "", i = z ? `props: ${y}Props` : "", C = D ? `${D}
181
+
182
+ ` : "";
183
+ return `/**
184
+ * ${y}
185
+ *
186
+ * Wrapper component for Encore Studio app.
187
+ * See README.md for detailed documentation.
188
+ */
189
+
190
+ import { EncoreApp${g.length > 0 ? ", useEncoreState" : ""} } from "@bravostudioai/react";
191
+ ${d ? 'import productionData from "./data.json";' : ""}
192
+
193
+ ${O ? `${O}
194
+
195
+ ` : ""}${M ? `${M}
196
+
197
+ ` : ""}${C}export function ${y}(${i}) {
198
+ ${e.length > 0 ? e.join(`
199
+ `) : ""}
200
+ return (
201
+ <EncoreApp
202
+ appId="${U}"
203
+ pageId="${I}"
204
+ ${d ? `appDefinition={productionData.app}
205
+ pageDefinition={productionData.page}
206
+ componentCode={productionData.componentCode}` : ""}
207
+ data={{
208
+ ${j.join(`
209
+ `)}
210
+ }}${F}${t}${f}
211
+ />
212
+ );
213
+ }
214
+
215
+ export default ${y};
216
+ `;
217
+ }
218
+ function L(U, I, y, b, m, c, g, P, h, d, E) {
219
+ const N = [], a = [], r = [], u = [];
220
+ g.forEach((e) => {
221
+ N.push(`### \`${e.propName}\` (${e.propType}, optional)
222
+
223
+ ${e.name} (${e.type}) - Component ID: ${e.id}`);
224
+ }), c.forEach((e) => {
225
+ if (e.arrayContainer && e.arrayContainer.components.length > 0) {
226
+ const i = e.arrayContainer, C = i.components.map((o) => `- \`${o.propName}\` (${o.propType}): ${o.name} (${o.type}) - Component ID: ${o.id}`).join(`
227
+ `);
228
+ N.push(`### \`${i.propName}\` (${i.propName[0].toUpperCase()}${i.propName.slice(
229
+ 1
230
+ )}Item[])
231
+
232
+ Array of items for "${i.name}" container (ID: ${i.id})
233
+
234
+ **Properties:**
235
+
236
+ ${C}`);
237
+ }
238
+ const t = l(e.name || "container"), f = `${t[0].toUpperCase()}${t.slice(
239
+ 1
240
+ )}IndexChange`;
241
+ a.push(`### \`${t}CurrentIndex\` (number, optional)
242
+
243
+ Controls the currently visible slide/index for the "${e.name}" container (ID: ${e.id}).
244
+
245
+ When provided, the slider operates in controlled mode - the parent component controls which slide is displayed. When not provided, the slider manages its own state.
246
+
247
+ ### \`on${f}\` ((index: number) => void, optional)
248
+
249
+ Callback fired when the user navigates to a different slide. Called with the new slide index (0-based).
250
+
251
+ This event fires whenever the slide changes, whether by user interaction, automatic advancement, or programmatic control.`);
252
+ });
253
+ const k = N.length > 0 ? N.join(`
254
+
255
+ `) : "This component currently has no data-bound props.", A = a.length > 0 ? `## Control Props
256
+
257
+ These props allow you to imperatively control repeating containers (sliders, lists, etc.) and receive notifications when the current index changes.
258
+
259
+ ${a.join(`
260
+
261
+ `)}` : "", x = [];
262
+ P.forEach((e) => {
263
+ const t = l(e.groupName), f = `on${t[0].toUpperCase()}${t.slice(
264
+ 1
265
+ )}Change`, i = e.elements.map((C) => `- "${C.name}"`).join(`
266
+ `);
267
+ x.push(`### \`${t}\` (string, optional)
268
+
269
+ Sets which element is active in the "${e.groupName}" input group (type: ${e.groupType}).
270
+
271
+ **Available elements:**
272
+ ${i}
273
+
274
+ ### \`${f}\` ((value: string) => void, optional)
275
+
276
+ Callback fired when the user selects a different element in the "${e.groupName}" input group. Called with the name of the selected element.`);
277
+ });
278
+ const z = x.length > 0 ? `## Input Group Props
279
+
280
+ These props allow you to control input groups (radio button-like behavior) and receive notifications when the selection changes.
281
+
282
+ ${x.join(`
283
+
284
+ `)}` : "", D = [];
285
+ h.forEach((e) => {
286
+ const t = l(e.formName), f = `on${t[0].toUpperCase()}${t.slice(
287
+ 1
288
+ )}Submit`, i = `${t[0].toUpperCase()}${t.slice(
289
+ 1
290
+ )}FormData`, C = e.inputs.map((o) => {
291
+ const n = o.propName, p = G(o.type, o.name);
292
+ return `- \`${n}\` (${p}) - ${o.name}`;
293
+ }).join(`
294
+ `);
295
+ D.push(`### \`${f}\` ((formData: ${i}) => void, optional)
296
+
297
+ Callback fired when the "${e.formName}" form is submitted. Called with a typed object containing all form input values with human-readable property names.
298
+
299
+ **Form data shape:**
300
+ \`\`\`typescript
301
+ interface ${i} {
302
+ ${e.inputs.map((o) => {
303
+ const n = o.propName, p = G(o.type, o.name);
304
+ return ` ${n}: ${p};`;
305
+ }).join(`
306
+ `)}
307
+ }
308
+ \`\`\`
309
+
310
+ **Form inputs:**
311
+ ${C}`);
312
+ });
313
+ const O = D.length > 0 ? `## Form Submission Props
314
+
315
+ These props allow you to handle form submissions and access form input values.
316
+
317
+ ${D.join(`
318
+
319
+ `)}` : "";
320
+ d.forEach((e) => {
321
+ const t = e.propName, i = `on${t[0].toUpperCase() + t.slice(1)}Change`, C = `${t}Options`;
322
+ r.push(`### \`${t}\` (string, optional)
323
+
324
+ Controls the selected value of the "${e.name}" dropdown (Component ID: ${e.id}).
325
+
326
+ When provided, the select input operates in controlled mode - the parent component controls the current value.
327
+
328
+ ### \`${C}\` (Array<string | { value: string; label: string }>, optional)
329
+
330
+ Sets the available options for the "${e.name}" dropdown. Can be an array of strings (used as both value and label) or an array of objects with \`value\` and \`label\` properties.
331
+
332
+ **Example:**
333
+ \`\`\`tsx
334
+ // Simple string array
335
+ ${C}={["Option 1", "Option 2", "Option 3"]}
336
+
337
+ // Object array with separate values and labels
338
+ ${C}={[
339
+ { value: "opt1", label: "Option 1" },
340
+ { value: "opt2", label: "Option 2" },
341
+ ]}
342
+ \`\`\`
343
+
344
+ ### \`${i}\` ((value: string) => void, optional)
345
+
346
+ Callback fired when the user selects a different option in the "${e.name}" dropdown. Called with the selected value.`);
347
+ });
348
+ const M = r.length > 0 ? `## Select Input Props
349
+
350
+ These props allow you to control select/dropdown inputs and respond to value changes.
351
+
352
+ ${r.join(`
353
+
354
+ `)}` : "";
355
+ E.forEach((e) => {
356
+ const t = e.propName, i = `on${t[0].toUpperCase() + t.slice(1)}Click`;
357
+ u.push(`### \`${i}\` (() => void, optional)
358
+
359
+ Callback fired when the "${e.name}" button is clicked (Component ID: ${e.id}).
360
+
361
+ Action type: \`${e.actionType}\``);
362
+ });
363
+ const j = u.length > 0 ? `## Action Button Props
364
+
365
+ These props allow you to respond to button clicks and other user interactions.
366
+
367
+ ${u.join(`
368
+
369
+ `)}` : "", T = `## Props
370
+
371
+ ### Data Props
372
+
373
+ ${k}
374
+
375
+ ${A}
376
+
377
+ ${z}
378
+
379
+ ${O}
380
+
381
+ ${M}
382
+
383
+ ${j}`, F = c.length > 0 && c[0].arrayContainer ? `<${m}
384
+ ${c.map(
385
+ (e) => e.arrayContainer ? `${e.arrayContainer.propName}={[
386
+ {
387
+ ${e.arrayContainer?.components.map(
388
+ (t) => `${t.propName}: "${t.type === "component:image" ? "https://example.com/image.jpg" : "Example value"}"`
389
+ ).join(`,
390
+ `)}
391
+ }
392
+ ]}` : ""
393
+ ).filter(Boolean).join(`
394
+ `)}
395
+ />` : `<${m} />`;
396
+ let w = "";
397
+ if (c.length > 0 && c[0]) {
398
+ const e = c[0], t = l(e.name || "container"), f = `${t[0].toUpperCase()}${t.slice(
399
+ 1
400
+ )}IndexChange`;
401
+ w = `## Controlling Slides
402
+
403
+ You can imperatively control which slide is displayed and listen for slide changes:
404
+
405
+ \`\`\`tsx
406
+ import { useState } from "react";
407
+ import { ${m} } from "./${m}";
408
+
409
+ function MyComponent() {
410
+ const [currentSlide, setCurrentSlide] = useState(0);
411
+
412
+ return (
413
+ <>
414
+ <button onClick={() => setCurrentSlide((prev) => Math.max(0, prev - 1))}>
415
+ Previous
416
+ </button>
417
+ <button onClick={() => setCurrentSlide((prev) => prev + 1)}>
418
+ Next
419
+ </button>
420
+ <${m}
421
+ ${c.map(
422
+ (i) => i.arrayContainer ? `${i.arrayContainer.propName}={[/* array of items */]}` : ""
423
+ ).filter(Boolean).join(`
424
+ `)}
425
+ ${t}CurrentIndex={currentSlide}
426
+ on${f}={(index) => setCurrentSlide(index)}
427
+ />
428
+ </>
429
+ );
430
+ }
431
+ \`\`\``;
432
+ }
433
+ return `# ${m}
434
+
435
+ Encore App Wrapper Component
436
+
437
+ This component wraps the Encore Studio app **"${y}"** (App ID: \`${U}\`) for the page **"${b}"** (Page ID: \`${I}\`).
438
+
439
+ The component automatically maps props to data-bound components within the app. Components marked with \`encore:data\` tags are exposed as props, allowing you to dynamically populate content.
440
+
441
+ ${T}
442
+
443
+ ## Usage
444
+
445
+ \`\`\`tsx
446
+ import { ${m} } from "./${m}";
447
+
448
+ function MyComponent() {
449
+ return (
450
+ <${m}
451
+ ${c.map(
452
+ (e) => e.arrayContainer ? `${e.arrayContainer.propName}={[/* array of items */]}` : ""
453
+ ).filter(Boolean).join(`
454
+ `)}
455
+ />
456
+ );
457
+ }
458
+ \`\`\`
459
+
460
+ ## Example
461
+
462
+ \`\`\`tsx
463
+ ${F}
464
+ \`\`\`
465
+
466
+ ${w}
467
+ `;
468
+ }
469
+ function R(U, I, y, b, m, c, g, P) {
470
+ const h = [], d = [], E = l(I);
471
+ b.forEach((a) => {
472
+ h.push(a.propName);
473
+ }), m.forEach((a) => {
474
+ const r = l(a.groupName);
475
+ h.push(r), d.push(`on${r[0].toUpperCase()}${r.slice(1)}Change`);
476
+ }), c.forEach((a) => {
477
+ const r = l(a.formName);
478
+ d.push(
479
+ `on${r[0].toUpperCase()}${r.slice(1)}Submit`
480
+ );
481
+ }), g.forEach((a) => {
482
+ const r = a.propName, u = r[0].toUpperCase() + r.slice(1);
483
+ h.push(r), h.push(`${r}Options`), d.push(`on${u}Change`);
484
+ }), P.forEach((a) => {
485
+ const r = a.propName, u = r[0].toUpperCase() + r.slice(1);
486
+ d.push(`on${u}Click`);
487
+ }), y.forEach((a) => {
488
+ a.arrayContainer && a.arrayContainer.components.length > 0 && h.push(a.arrayContainer.propName);
489
+ const r = l(a.name || "container"), u = `${r[0].toUpperCase()}${r.slice(
490
+ 1
491
+ )}IndexChange`;
492
+ h.push(`${r}CurrentIndex`), d.push(`on${u}`);
493
+ });
494
+ const N = `<${E}
495
+ ${h.map((a) => `${a}={${a}}`).join(`
496
+ `)}
497
+ ${d.map((a) => `${a}={${a}}`).join(`
498
+ `)}
499
+ />`;
500
+ return {
501
+ props: h,
502
+ events: d,
503
+ jsx: N
504
+ };
505
+ }
506
+ export {
507
+ K as generateComponentCode,
508
+ R as generateComponentMetadata,
509
+ L as generateReadme
510
+ };
511
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sources":["../../src/codegen/generator.ts"],"sourcesContent":["import {\n ComponentInfo,\n SliderInfo,\n InputGroupInfo,\n FormInfo,\n SelectInputInfo,\n ActionButtonInfo,\n} from \"./types\";\nimport {\n getComponentPropType,\n getComponentPropName,\n sanitizePropName,\n} from \"./parser\";\n\nexport interface ComponentMetadata {\n props: string[];\n events: string[];\n jsx: string;\n}\n\nexport function generateComponentCode(\n appId: string,\n pageId: string,\n componentName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[],\n isProduction: boolean = false\n): string {\n // Generate prop types\n const propTypes: string[] = [];\n const controlPropTypes: string[] = [];\n const inputGroupPropTypes: string[] = [];\n const formPropTypes: string[] = [];\n const selectInputPropTypes: string[] = [];\n const actionButtonPropTypes: string[] = [];\n\n // Add standalone component props\n standaloneComponents.forEach((comp) => {\n propTypes.push(` ${comp.propName}?: ${comp.propType};`);\n });\n\n // Add input group props\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n inputGroupPropTypes.push(` ${propName}?: string;`);\n inputGroupPropTypes.push(\n ` on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change?: (value: string) => void;`\n );\n });\n\n // Generate form data interfaces and props\n const formDataInterfaces: string[] = [];\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n\n // Generate interface for form data with human-readable property names\n const formDataProps: string[] = [];\n form.inputs.forEach((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n formDataProps.push(` ${inputPropName}: ${inputType};`);\n });\n\n formDataInterfaces.push(`export interface ${formDataTypeName} {\n${formDataProps.join(\"\\n\")}\n}`);\n\n // Add the callback prop with proper typing\n formPropTypes.push(\n ` on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit?: (formData: ${formDataTypeName}) => void;`\n );\n });\n\n // Add standalone select input props (controlled value + onChange + options)\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n selectInputPropTypes.push(` ${propName}?: string;`);\n selectInputPropTypes.push(\n ` ${propName}Options?: Array<string | { value: string; label: string }>;`\n );\n selectInputPropTypes.push(\n ` on${capitalizedPropName}Change?: (value: string) => void;`\n );\n });\n\n // Add action button props (onClick)\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n actionButtonPropTypes.push(` on${capitalizedPropName}Click?: () => void;`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n const itemTypeName = `${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item`;\n propTypes.push(` ${container.propName}: ${itemTypeName}[];`);\n }\n\n // Add control props for each slider/repeating container\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n controlPropTypes.push(` ${sliderPropName}CurrentIndex?: number;`);\n controlPropTypes.push(\n ` on${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange?: (index: number) => void;`\n );\n });\n\n const allPropTypes = [\n ...propTypes,\n ...controlPropTypes,\n ...inputGroupPropTypes,\n ...formPropTypes,\n ...selectInputPropTypes,\n ...actionButtonPropTypes,\n ];\n const hasProps = allPropTypes.length > 0;\n const propsInterface = hasProps\n ? `export interface ${componentName}Props {\n${allPropTypes.join(\"\\n\")}\n}`\n : \"\";\n\n const itemTypes = sliders\n .filter((s) => s.arrayContainer && s.arrayContainer.components.length > 0)\n .map((slider) => {\n const container = slider.arrayContainer!;\n const itemTypeName = `${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item`;\n const itemProps = container.components\n .map((comp) => {\n return ` ${comp.propName}: ${comp.propType};`;\n })\n .join(\"\\n\");\n return `export interface ${itemTypeName} {\n${itemProps}\n}`;\n })\n .join(\"\\n\\n\");\n\n const formDataTypes = formDataInterfaces.join(\"\\n\\n\");\n\n // Generate data mapping\n const dataMapping: string[] = [];\n const controlMapping: string[] = [];\n\n // Add standalone component mappings\n standaloneComponents.forEach((comp) => {\n const propKey = getComponentPropName(comp.type);\n dataMapping.push(` // ${comp.name}\n ...(props.${comp.propName} !== undefined && { \"${comp.id}\": { ${propKey}: props.${comp.propName} } as any }),`);\n });\n\n // Add select input mappings (for controlled values and options)\n selectInputs.forEach((input) => {\n dataMapping.push(` // ${input.name}\n ...((props.${input.propName} !== undefined || props.${input.propName}Options !== undefined) && { \n \"${input.id}\": { \n ...(props.${input.propName} !== undefined && { value: props.${input.propName} }),\n ...(props.${input.propName}Options !== undefined && { options: props.${input.propName}Options }),\n } as any \n }),`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n const itemMapping = container.components\n .map((comp) => {\n const propKey = getComponentPropName(comp.type);\n return ` // ${comp.name}\n \"${comp.id}\": {\n ${propKey}: item.${comp.propName},\n }`;\n })\n .join(\",\\n\");\n\n dataMapping.push(` // ${container.name}\n \"${container.id}\": props.${container.propName}.map((item) => ({\n${itemMapping}\n })),`);\n }\n\n // Generate control mapping for each slider\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n const controlEntry: string[] = [];\n if (slider.id) {\n controlEntry.push(` // ${slider.name}`);\n controlEntry.push(` \"${slider.id}\": {`);\n controlEntry.push(\n ` currentIndex: props.${sliderPropName}CurrentIndex,`\n );\n controlEntry.push(` onIndexChange: props.on${controlPropName},`);\n controlEntry.push(` }`);\n }\n if (controlEntry.length > 0) {\n controlMapping.push(controlEntry.join(\"\\n\"));\n }\n });\n\n const repeatingContainerControlsCode =\n controlMapping.length > 0\n ? `\\n repeatingContainerControls={{\n${controlMapping.join(\",\\n\")}\n }}`\n : \"\";\n\n // Generate input group mappings\n const inputGroupMapping: string[] = [];\n const inputGroupHandlers: string[] = [];\n\n // Start action handler if we have input groups, forms, select inputs, or action buttons\n if (\n inputGroups.length > 0 ||\n forms.length > 0 ||\n selectInputs.length > 0 ||\n actionButtons.length > 0\n ) {\n inputGroupHandlers.push(` const handleAction = (payload: any) => {`);\n inputGroupHandlers.push(` const { action } = payload?.bravo || {};`);\n inputGroupHandlers.push(``);\n\n // Add select input handling\n if (selectInputs.length > 0) {\n inputGroupHandlers.push(` // Handle select input changes`);\n inputGroupHandlers.push(\n ` if (action?.action === \"input-change\" || action?.action === \"select-change\") {`\n );\n inputGroupHandlers.push(` const nodeId = action?.nodeId;`);\n inputGroupHandlers.push(` const value = action?.params?.value;`);\n inputGroupHandlers.push(``);\n\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName =\n propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Change`;\n inputGroupHandlers.push(` // ${input.name}`);\n inputGroupHandlers.push(\n ` if (nodeId === \"${input.id}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}(value);`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add action button handling\n if (actionButtons.length > 0) {\n inputGroupHandlers.push(` // Handle button clicks`);\n inputGroupHandlers.push(\n ` if (action?.action === \"remote\" || action?.action === \"tap\" || action?.action === \"link\") {`\n );\n inputGroupHandlers.push(` const nodeId = action?.nodeId;`);\n inputGroupHandlers.push(``);\n\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName =\n propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Click`;\n inputGroupHandlers.push(` // ${button.name}`);\n inputGroupHandlers.push(\n ` if (nodeId === \"${button.id}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}();`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add input group handling\n if (inputGroups.length > 0) {\n inputGroupHandlers.push(\n ` if (action?.action === \"input-group-change\") {`\n );\n inputGroupHandlers.push(\n ` const { groupName, value } = action.params;`\n );\n\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n const handlerPropName = `on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change`;\n inputGroupHandlers.push(\n ` if (groupName === \"${group.groupName}\" && props.${handlerPropName}) {`\n );\n inputGroupHandlers.push(` props.${handlerPropName}(value);`);\n inputGroupHandlers.push(` return;`);\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n inputGroupHandlers.push(``);\n }\n\n // Add form submission handling\n if (forms.length > 0) {\n inputGroupHandlers.push(` if (action?.action === \"submit\") {`);\n inputGroupHandlers.push(` // Get form inputs from Encore state`);\n inputGroupHandlers.push(\n ` const formInputs = useEncoreState.getState().formInputs[\"${pageId}\"] || {};`\n );\n inputGroupHandlers.push(` const submitNodeId = action?.nodeId;`);\n inputGroupHandlers.push(``);\n\n forms.forEach((form, index) => {\n const formPropName = sanitizePropName(form.formName);\n const handlerPropName = `on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit`;\n\n if (index > 0) {\n inputGroupHandlers.push(``);\n }\n inputGroupHandlers.push(\n ` // Form: ${form.formName} (${form.formId})`\n );\n // Check if this form's submit button was clicked (if submitButtonId is available)\n if (form.submitButtonId) {\n inputGroupHandlers.push(\n ` if (submitNodeId === \"${form.submitButtonId}\" && props.${handlerPropName}) {`\n );\n } else if (forms.length === 1) {\n // If only one form, don't check submit button ID\n inputGroupHandlers.push(` if (props.${handlerPropName}) {`);\n } else {\n // Multiple forms but no submit button ID - check all\n inputGroupHandlers.push(` if (props.${handlerPropName}) {`);\n }\n inputGroupHandlers.push(` // Extract form inputs for this form`);\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n inputGroupHandlers.push(\n ` const formData: ${formDataTypeName} = {`\n );\n const formDataEntries: string[] = [];\n form.inputs.forEach((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n formDataEntries.push(\n ` ${inputPropName}: formInputs[\"${input.id}\"]`\n );\n });\n inputGroupHandlers.push(formDataEntries.join(\",\\n\"));\n inputGroupHandlers.push(` };`);\n inputGroupHandlers.push(` props.${handlerPropName}(formData);`);\n inputGroupHandlers.push(\n ` // Note: Default form submission will still proceed after callback`\n );\n inputGroupHandlers.push(` }`);\n });\n\n inputGroupHandlers.push(` }`);\n }\n\n inputGroupHandlers.push(` };`);\n }\n\n // Generate input groups code\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n inputGroupMapping.push(\n ` ...(props.${propName} !== undefined && { ${propName}: props.${propName} }),`\n );\n });\n\n const inputGroupsCode =\n inputGroupMapping.length > 0\n ? `\\n inputGroups={{\n${inputGroupMapping.join(\"\\n\")}\n }}`\n : \"\";\n\n const onActionCode =\n inputGroupHandlers.length > 0 ? `\\n onAction={handleAction}` : \"\";\n\n const propsParameter = hasProps ? `props: ${componentName}Props` : \"\";\n const propsInterfaceSection = propsInterface ? `${propsInterface}\\n\\n` : \"\";\n\n return `/**\n * ${componentName}\n * \n * Wrapper component for Encore Studio app.\n * See README.md for detailed documentation.\n */\n\nimport { EncoreApp${\n forms.length > 0 ? \", useEncoreState\" : \"\"\n } } from \"@bravostudioai/react\";\n${isProduction ? `import productionData from \"./data.json\";` : \"\"}\n\n${itemTypes ? `${itemTypes}\\n\\n` : \"\"}${\n formDataTypes ? `${formDataTypes}\\n\\n` : \"\"\n }${propsInterfaceSection}export function ${componentName}(${propsParameter}) {\n${inputGroupHandlers.length > 0 ? inputGroupHandlers.join(\"\\n\") : \"\"}\n return (\n <EncoreApp\n appId=\"${appId}\"\n pageId=\"${pageId}\"\n ${\n isProduction\n ? `appDefinition={productionData.app}\n pageDefinition={productionData.page}\n componentCode={productionData.componentCode}`\n : \"\"\n }\n data={{\n${dataMapping.join(\"\\n\")}\n }}${repeatingContainerControlsCode}${inputGroupsCode}${onActionCode}\n />\n );\n}\n\nexport default ${componentName};\n`;\n}\n\nexport function generateReadme(\n appId: string,\n pageId: string,\n appName: string,\n pageName: string,\n componentName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[]\n): string {\n const componentDocs: string[] = [];\n const controlDocs: string[] = [];\n const selectInputDocs: string[] = [];\n const actionButtonDocs: string[] = [];\n\n // Add standalone component documentation\n standaloneComponents.forEach((comp) => {\n componentDocs.push(`### \\`${comp.propName}\\` (${comp.propType}, optional)\n\n${comp.name} (${comp.type}) - Component ID: ${comp.id}`);\n });\n\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n const container = slider.arrayContainer;\n\n // Generate component documentation\n const compDocs = container.components\n .map((comp) => {\n return `- \\`${comp.propName}\\` (${comp.propType}): ${comp.name} (${comp.type}) - Component ID: ${comp.id}`;\n })\n .join(\"\\n\");\n\n componentDocs.push(`### \\`${\n container.propName\n }\\` (${container.propName[0].toUpperCase()}${container.propName.slice(\n 1\n )}Item[])\n\nArray of items for \"${container.name}\" container (ID: ${container.id})\n\n**Properties:**\n\n${compDocs}`);\n }\n\n // Generate control documentation for each slider/repeating container\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n controlDocs.push(`### \\`${sliderPropName}CurrentIndex\\` (number, optional)\n\nControls the currently visible slide/index for the \"${slider.name}\" container (ID: ${slider.id}).\n\nWhen provided, the slider operates in controlled mode - the parent component controls which slide is displayed. When not provided, the slider manages its own state.\n\n### \\`on${controlPropName}\\` ((index: number) => void, optional)\n\nCallback fired when the user navigates to a different slide. Called with the new slide index (0-based).\n\nThis event fires whenever the slide changes, whether by user interaction, automatic advancement, or programmatic control.`);\n });\n\n const dataPropsSection =\n componentDocs.length > 0\n ? componentDocs.join(\"\\n\\n\")\n : \"This component currently has no data-bound props.\";\n\n const controlPropsSection =\n controlDocs.length > 0\n ? `## Control Props\n\nThese props allow you to imperatively control repeating containers (sliders, lists, etc.) and receive notifications when the current index changes.\n\n${controlDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate input group documentation\n const inputGroupDocs: string[] = [];\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n const handlerPropName = `on${propName[0].toUpperCase()}${propName.slice(\n 1\n )}Change`;\n const elementsList = group.elements\n .map((el) => `- \"${el.name}\"`)\n .join(\"\\n\");\n\n inputGroupDocs.push(`### \\`${propName}\\` (string, optional)\n\nSets which element is active in the \"${group.groupName}\" input group (type: ${group.groupType}).\n\n**Available elements:**\n${elementsList}\n\n### \\`${handlerPropName}\\` ((value: string) => void, optional)\n\nCallback fired when the user selects a different element in the \"${group.groupName}\" input group. Called with the name of the selected element.`);\n });\n\n const inputGroupPropsSection =\n inputGroupDocs.length > 0\n ? `## Input Group Props\n\nThese props allow you to control input groups (radio button-like behavior) and receive notifications when the selection changes.\n\n${inputGroupDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate form documentation\n const formDocs: string[] = [];\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n const handlerPropName = `on${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}Submit`;\n const formDataTypeName = `${formPropName[0].toUpperCase()}${formPropName.slice(\n 1\n )}FormData`;\n const inputsList = form.inputs\n .map((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n return `- \\`${inputPropName}\\` (${inputType}) - ${input.name}`;\n })\n .join(\"\\n\");\n\n formDocs.push(`### \\`${handlerPropName}\\` ((formData: ${formDataTypeName}) => void, optional)\n\nCallback fired when the \"${\n form.formName\n }\" form is submitted. Called with a typed object containing all form input values with human-readable property names.\n\n**Form data shape:**\n\\`\\`\\`typescript\ninterface ${formDataTypeName} {\n${form.inputs\n .map((input) => {\n const inputPropName = input.propName; // Use qualified prop name\n const inputType = getComponentPropType(input.type, input.name);\n return ` ${inputPropName}: ${inputType};`;\n })\n .join(\"\\n\")}\n}\n\\`\\`\\`\n\n**Form inputs:**\n${inputsList}`);\n });\n\n const formPropsSection =\n formDocs.length > 0\n ? `## Form Submission Props\n\nThese props allow you to handle form submissions and access form input values.\n\n${formDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate select input documentation\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Change`;\n const optionsPropName = `${propName}Options`;\n\n selectInputDocs.push(`### \\`${propName}\\` (string, optional)\n\nControls the selected value of the \"${input.name}\" dropdown (Component ID: ${input.id}).\n\nWhen provided, the select input operates in controlled mode - the parent component controls the current value.\n\n### \\`${optionsPropName}\\` (Array<string | { value: string; label: string }>, optional)\n\nSets the available options for the \"${input.name}\" dropdown. Can be an array of strings (used as both value and label) or an array of objects with \\`value\\` and \\`label\\` properties.\n\n**Example:**\n\\`\\`\\`tsx\n// Simple string array\n${optionsPropName}={[\"Option 1\", \"Option 2\", \"Option 3\"]}\n\n// Object array with separate values and labels\n${optionsPropName}={[\n { value: \"opt1\", label: \"Option 1\" },\n { value: \"opt2\", label: \"Option 2\" },\n]}\n\\`\\`\\`\n\n### \\`${handlerPropName}\\` ((value: string) => void, optional)\n\nCallback fired when the user selects a different option in the \"${input.name}\" dropdown. Called with the selected value.`);\n });\n\n const selectInputPropsSection =\n selectInputDocs.length > 0\n ? `## Select Input Props\n\nThese props allow you to control select/dropdown inputs and respond to value changes.\n\n${selectInputDocs.join(\"\\n\\n\")}`\n : \"\";\n\n // Generate action button documentation\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n const handlerPropName = `on${capitalizedPropName}Click`;\n\n actionButtonDocs.push(`### \\`${handlerPropName}\\` (() => void, optional)\n\nCallback fired when the \"${button.name}\" button is clicked (Component ID: ${button.id}).\n\nAction type: \\`${button.actionType}\\``);\n });\n\n const actionButtonPropsSection =\n actionButtonDocs.length > 0\n ? `## Action Button Props\n\nThese props allow you to respond to button clicks and other user interactions.\n\n${actionButtonDocs.join(\"\\n\\n\")}`\n : \"\";\n\n const propsSection = `## Props\n\n### Data Props\n\n${dataPropsSection}\n\n${controlPropsSection}\n\n${inputGroupPropsSection}\n\n${formPropsSection}\n\n${selectInputPropsSection}\n\n${actionButtonPropsSection}`;\n\n const usageExample =\n sliders.length > 0 && sliders[0].arrayContainer\n ? `<${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[\n {\n ${s.arrayContainer?.components\n .map(\n (c) =>\n `${c.propName}: \"${\n c.type === \"component:image\"\n ? \"https://example.com/image.jpg\"\n : \"Example value\"\n }\"`\n )\n .join(\",\\n \")}\n }\n ]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n/>`\n : `<${componentName} />`;\n\n // Generate control example\n let controlExample = \"\";\n if (sliders.length > 0 && sliders[0]) {\n const firstSlider = sliders[0];\n const sliderPropName = sanitizePropName(firstSlider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n\n controlExample = `## Controlling Slides\n\nYou can imperatively control which slide is displayed and listen for slide changes:\n\n\\`\\`\\`tsx\nimport { useState } from \"react\";\nimport { ${componentName} } from \"./${componentName}\";\n\nfunction MyComponent() {\n const [currentSlide, setCurrentSlide] = useState(0);\n\n return (\n <>\n <button onClick={() => setCurrentSlide((prev) => Math.max(0, prev - 1))}>\n Previous\n </button>\n <button onClick={() => setCurrentSlide((prev) => prev + 1)}>\n Next\n </button>\n <${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[/* array of items */]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n ${sliderPropName}CurrentIndex={currentSlide}\n on${controlPropName}={(index) => setCurrentSlide(index)}\n />\n </>\n );\n}\n\\`\\`\\``;\n }\n\n return `# ${componentName}\n\nEncore App Wrapper Component\n\nThis component wraps the Encore Studio app **\"${appName}\"** (App ID: \\`${appId}\\`) for the page **\"${pageName}\"** (Page ID: \\`${pageId}\\`).\n\nThe component automatically maps props to data-bound components within the app. Components marked with \\`encore:data\\` tags are exposed as props, allowing you to dynamically populate content.\n\n${propsSection}\n\n## Usage\n\n\\`\\`\\`tsx\nimport { ${componentName} } from \"./${componentName}\";\n\nfunction MyComponent() {\n return (\n <${componentName}\n ${sliders\n .map((s) =>\n s.arrayContainer\n ? `${s.arrayContainer.propName}={[/* array of items */]}`\n : \"\"\n )\n .filter(Boolean)\n .join(\"\\n \")}\n />\n );\n}\n\\`\\`\\`\n\n## Example\n\n\\`\\`\\`tsx\n${usageExample}\n\\`\\`\\`\n\n${controlExample}\n`;\n}\n\nexport function generateComponentMetadata(\n _appName: string,\n pageName: string,\n sliders: SliderInfo[],\n standaloneComponents: ComponentInfo[],\n inputGroups: InputGroupInfo[],\n forms: FormInfo[],\n selectInputs: SelectInputInfo[],\n actionButtons: ActionButtonInfo[]\n): ComponentMetadata {\n const props: string[] = [];\n const events: string[] = [];\n const componentName = sanitizePropName(pageName);\n\n // Add standalone component props\n standaloneComponents.forEach((comp) => {\n props.push(comp.propName);\n });\n\n // Add input group props\n inputGroups.forEach((group) => {\n const propName = sanitizePropName(group.groupName);\n props.push(propName);\n events.push(`on${propName[0].toUpperCase()}${propName.slice(1)}Change`);\n });\n\n // Add form props\n forms.forEach((form) => {\n const formPropName = sanitizePropName(form.formName);\n events.push(\n `on${formPropName[0].toUpperCase()}${formPropName.slice(1)}Submit`\n );\n });\n\n // Add select input props\n selectInputs.forEach((input) => {\n const propName = input.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n props.push(propName);\n props.push(`${propName}Options`);\n events.push(`on${capitalizedPropName}Change`);\n });\n\n // Add action button events\n actionButtons.forEach((button) => {\n const propName = button.propName;\n const capitalizedPropName = propName[0].toUpperCase() + propName.slice(1);\n events.push(`on${capitalizedPropName}Click`);\n });\n\n // Add slider props/events\n sliders.forEach((slider) => {\n if (slider.arrayContainer && slider.arrayContainer.components.length > 0) {\n props.push(slider.arrayContainer.propName);\n }\n const sliderPropName = sanitizePropName(slider.name || \"container\");\n const controlPropName = `${sliderPropName[0].toUpperCase()}${sliderPropName.slice(\n 1\n )}IndexChange`;\n props.push(`${sliderPropName}CurrentIndex`);\n events.push(`on${controlPropName}`);\n });\n\n // Generate generic JSX usage\n const jsxUsage = `<${componentName}\n ${props.map((p) => `${p}={${p}}`).join(\"\\n \")}\n ${events.map((e) => `${e}={${e}}`).join(\"\\n \")}\n/>`;\n\n return {\n props,\n events,\n jsx: jsxUsage,\n };\n}\n"],"names":["generateComponentCode","appId","pageId","componentName","sliders","standaloneComponents","inputGroups","forms","selectInputs","actionButtons","isProduction","propTypes","controlPropTypes","inputGroupPropTypes","formPropTypes","selectInputPropTypes","actionButtonPropTypes","comp","group","propName","sanitizePropName","formDataInterfaces","form","formPropName","formDataTypeName","formDataProps","input","inputPropName","inputType","getComponentPropType","capitalizedPropName","button","slider","container","itemTypeName","sliderPropName","allPropTypes","hasProps","propsInterface","itemTypes","s","itemProps","formDataTypes","dataMapping","controlMapping","propKey","getComponentPropName","itemMapping","controlPropName","controlEntry","repeatingContainerControlsCode","inputGroupMapping","inputGroupHandlers","handlerPropName","index","formDataEntries","inputGroupsCode","onActionCode","propsParameter","propsInterfaceSection","generateReadme","appName","pageName","componentDocs","controlDocs","selectInputDocs","actionButtonDocs","compDocs","dataPropsSection","controlPropsSection","inputGroupDocs","elementsList","el","inputGroupPropsSection","formDocs","inputsList","formPropsSection","optionsPropName","selectInputPropsSection","actionButtonPropsSection","propsSection","usageExample","c","controlExample","firstSlider","generateComponentMetadata","_appName","props","events","jsxUsage","p","e"],"mappings":"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"}