@developer_tribe/react-builder 1.2.31 → 1.2.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/assets/prompt-scheme-onboard.generated.d.ts +1 -0
  2. package/dist/assets/prompt-scheme-paywall.generated.d.ts +1 -0
  3. package/dist/build-components/BIcon/BIconProps.generated.d.ts +1 -1
  4. package/dist/build-components/BackgroundImage/BackgroundImageProps.generated.d.ts +1 -1
  5. package/dist/build-components/Button/ButtonProps.generated.d.ts +1 -1
  6. package/dist/build-components/Carousel/CarouselProps.generated.d.ts +1 -1
  7. package/dist/build-components/CarouselButtons/CarouselButtonsProps.generated.d.ts +1 -1
  8. package/dist/build-components/CarouselDots/CarouselDotsProps.generated.d.ts +1 -1
  9. package/dist/build-components/CarouselItem/CarouselItemProps.generated.d.ts +1 -1
  10. package/dist/build-components/CarouselProvider/CarouselProviderProps.generated.d.ts +1 -1
  11. package/dist/build-components/CountDown/CountDownProps.generated.d.ts +1 -1
  12. package/dist/build-components/Image/ImageProps.generated.d.ts +1 -1
  13. package/dist/build-components/Main/MainProps.generated.d.ts +1 -1
  14. package/dist/build-components/NavigationBarColor/NavigationBarColorProps.generated.d.ts +1 -1
  15. package/dist/build-components/Onboard/OnboardProps.generated.d.ts +1 -1
  16. package/dist/build-components/OnboardButton/OnboardButtonProps.generated.d.ts +2 -2
  17. package/dist/build-components/OnboardButtons/OnboardButtonsProps.generated.d.ts +1 -1
  18. package/dist/build-components/OnboardDot/OnboardDotProps.generated.d.ts +1 -1
  19. package/dist/build-components/OnboardFooter/OnboardFooterProps.generated.d.ts +1 -1
  20. package/dist/build-components/OnboardImage/OnboardImageProps.generated.d.ts +1 -1
  21. package/dist/build-components/OnboardItem/OnboardItemProps.generated.d.ts +1 -1
  22. package/dist/build-components/OnboardProvider/OnboardProviderProps.generated.d.ts +1 -1
  23. package/dist/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.d.ts +1 -1
  24. package/dist/build-components/OnboardTitle/OnboardTitleProps.generated.d.ts +1 -1
  25. package/dist/build-components/PaywallBackground/PaywallBackgroundProps.generated.d.ts +1 -1
  26. package/dist/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.d.ts +1 -1
  27. package/dist/build-components/PaywallOptions/PaywallOptionsProps.generated.d.ts +1 -1
  28. package/dist/build-components/PaywallProvider/PaywallProviderProps.generated.d.ts +1 -1
  29. package/dist/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.d.ts +1 -1
  30. package/dist/build-components/PriceTag/PriceTagProps.generated.d.ts +1 -1
  31. package/dist/build-components/Pricing/PricingProps.generated.d.ts +1 -1
  32. package/dist/build-components/Promo/PromoProps.generated.d.ts +1 -1
  33. package/dist/build-components/RadioButton/RadioButtonProps.generated.d.ts +1 -1
  34. package/dist/build-components/Separator/SeparatorProps.generated.d.ts +1 -1
  35. package/dist/build-components/StatusBarColor/StatusBarColorProps.generated.d.ts +1 -1
  36. package/dist/build-components/Text/TextProps.generated.d.ts +1 -1
  37. package/dist/build-components/View/ViewProps.generated.d.ts +1 -1
  38. package/dist/build-components/patterns.generated.d.ts +62 -52
  39. package/dist/components/BuilderProvider.d.ts +2 -4
  40. package/dist/index.cjs.js +1 -1
  41. package/dist/index.cjs.js.map +1 -1
  42. package/dist/index.esm.js +1 -1
  43. package/dist/index.esm.js.map +1 -1
  44. package/dist/index.web.cjs.js +6 -6
  45. package/dist/index.web.cjs.js.map +1 -1
  46. package/dist/index.web.esm.js +6 -6
  47. package/dist/index.web.esm.js.map +1 -1
  48. package/dist/modals/PromptManagerModal.d.ts +9 -0
  49. package/dist/modals/index.d.ts +1 -0
  50. package/dist/styles.css +1 -1
  51. package/dist/utils/attributeStyle.d.ts +2 -2
  52. package/dist/utils/nodeXml.d.ts +11 -0
  53. package/dist/utils/patterns.d.ts +2 -2
  54. package/package.json +5 -1
  55. package/scripts/prebuild/assets/prompt_scheme.md +44 -0
  56. package/scripts/prebuild/generate-prompt-schemes.js +328 -0
  57. package/scripts/prebuild/prebuild.js +4 -0
  58. package/scripts/prebuild/utils/createGeneratedProps.js +9 -9
  59. package/scripts/prebuild/utils/validateAllComponentsOrThrow.js +9 -9
  60. package/src/RenderPage.tsx +48 -7
  61. package/src/assets/meta.json +1 -1
  62. package/src/assets/prompt-scheme-onboard.generated.ts +4 -0
  63. package/src/assets/prompt-scheme-paywall.generated.ts +4 -0
  64. package/src/assets/samples/vpn-onboard-1.json +0 -24
  65. package/src/attribute-analyser/style/native/useExtractImageStyle.ts +1 -1
  66. package/src/attribute-analyser/style/native/useExtractTextStyle.ts +1 -1
  67. package/src/attribute-analyser/style/native/useExtractViewStyle.ts +1 -1
  68. package/src/attribute-analyser/style/web/useExtractImageStyle.ts +1 -1
  69. package/src/attribute-analyser/style/web/useExtractTextStyle.ts +1 -1
  70. package/src/attribute-analyser/style/web/useExtractViewStyle.ts +1 -1
  71. package/src/build-components/BIcon/BIconProps.generated.ts +1 -1
  72. package/src/build-components/BIcon/pattern.json +1 -1
  73. package/src/build-components/BackgroundImage/BackgroundImage.tsx +1 -1
  74. package/src/build-components/BackgroundImage/BackgroundImageProps.generated.ts +1 -1
  75. package/src/build-components/BackgroundImage/pattern.json +1 -1
  76. package/src/build-components/Button/Button.tsx +2 -2
  77. package/src/build-components/Button/ButtonProps.generated.ts +1 -1
  78. package/src/build-components/Button/pattern.json +2 -2
  79. package/src/build-components/Carousel/CarouselProps.generated.ts +1 -1
  80. package/src/build-components/Carousel/pattern.json +1 -1
  81. package/src/build-components/CarouselButtons/CarouselButtonsProps.generated.ts +1 -1
  82. package/src/build-components/CarouselDots/CarouselDots.tsx +1 -1
  83. package/src/build-components/CarouselDots/CarouselDotsProps.generated.ts +1 -1
  84. package/src/build-components/CarouselItem/CarouselItemProps.generated.ts +1 -1
  85. package/src/build-components/CarouselProvider/CarouselProviderProps.generated.ts +1 -1
  86. package/src/build-components/CarouselProvider/pattern.json +1 -1
  87. package/src/build-components/CountDown/CountDownProps.generated.ts +1 -1
  88. package/src/build-components/CountDown/pattern.json +1 -1
  89. package/src/build-components/Image/ImageProps.generated.ts +1 -1
  90. package/src/build-components/Image/pattern.json +2 -2
  91. package/src/build-components/Main/MainProps.generated.ts +1 -1
  92. package/src/build-components/Main/pattern.json +1 -1
  93. package/src/build-components/NavigationBarColor/NavigationBarColor.tsx +1 -1
  94. package/src/build-components/NavigationBarColor/NavigationBarColorProps.generated.ts +1 -1
  95. package/src/build-components/NavigationBarColor/pattern.json +2 -2
  96. package/src/build-components/Onboard/OnboardProps.generated.ts +1 -1
  97. package/src/build-components/Onboard/pattern.json +1 -1
  98. package/src/build-components/OnboardButton/OnboardButton.tsx +3 -24
  99. package/src/build-components/OnboardButton/OnboardButtonProps.generated.ts +2 -2
  100. package/src/build-components/OnboardButton/pattern.json +30 -27
  101. package/src/build-components/OnboardButtons/OnboardButtonsProps.generated.ts +1 -1
  102. package/src/build-components/OnboardButtons/pattern.json +1 -1
  103. package/src/build-components/OnboardDot/OnboardDot.tsx +1 -1
  104. package/src/build-components/OnboardDot/OnboardDotProps.generated.ts +1 -1
  105. package/src/build-components/OnboardDot/pattern.json +1 -1
  106. package/src/build-components/OnboardFooter/OnboardFooter.tsx +3 -3
  107. package/src/build-components/OnboardFooter/OnboardFooterProps.generated.ts +1 -1
  108. package/src/build-components/OnboardFooter/pattern.json +1 -1
  109. package/src/build-components/OnboardImage/OnboardImageProps.generated.ts +1 -1
  110. package/src/build-components/OnboardItem/OnboardItemProps.generated.ts +1 -1
  111. package/src/build-components/OnboardItem/pattern.json +1 -1
  112. package/src/build-components/OnboardProvider/OnboardProviderProps.generated.ts +1 -1
  113. package/src/build-components/OnboardProvider/pattern.json +1 -1
  114. package/src/build-components/OnboardSubtitle/OnboardSubtitleProps.generated.ts +1 -1
  115. package/src/build-components/OnboardSubtitle/pattern.json +1 -1
  116. package/src/build-components/OnboardTitle/OnboardTitleProps.generated.ts +1 -1
  117. package/src/build-components/OnboardTitle/pattern.json +1 -1
  118. package/src/build-components/PaywallBackground/PaywallBackgroundProps.generated.ts +1 -1
  119. package/src/build-components/PaywallBackground/pattern.json +1 -1
  120. package/src/build-components/PaywallCloseButton/PaywallCloseButton.tsx +1 -1
  121. package/src/build-components/PaywallCloseButton/PaywallCloseButtonProps.generated.ts +1 -1
  122. package/src/build-components/PaywallCloseButton/pattern.json +1 -1
  123. package/src/build-components/PaywallOptions/PaywallOptionsProps.generated.ts +1 -1
  124. package/src/build-components/PaywallOptions/pattern.json +1 -1
  125. package/src/build-components/PaywallProvider/PaywallProviderProps.generated.ts +1 -1
  126. package/src/build-components/PaywallProvider/pattern.json +1 -1
  127. package/src/build-components/PaywallSubscribeButton/PaywallSubscribeButtonProps.generated.ts +1 -1
  128. package/src/build-components/PaywallSubscribeButton/pattern.json +1 -1
  129. package/src/build-components/PriceTag/PriceTagProps.generated.ts +1 -1
  130. package/src/build-components/PriceTag/pattern.json +2 -2
  131. package/src/build-components/Pricing/PricingProps.generated.ts +1 -1
  132. package/src/build-components/Pricing/pattern.json +1 -1
  133. package/src/build-components/Promo/PromoProps.generated.ts +1 -1
  134. package/src/build-components/Promo/pattern.json +1 -1
  135. package/src/build-components/RadioButton/RadioButtonProps.generated.ts +1 -1
  136. package/src/build-components/Separator/SeparatorProps.generated.ts +1 -1
  137. package/src/build-components/Separator/pattern.json +2 -2
  138. package/src/build-components/StatusBarColor/StatusBarColor.tsx +1 -1
  139. package/src/build-components/StatusBarColor/StatusBarColorProps.generated.ts +1 -1
  140. package/src/build-components/StatusBarColor/pattern.json +2 -2
  141. package/src/build-components/Text/Text.tsx +1 -1
  142. package/src/build-components/Text/TextProps.generated.ts +1 -1
  143. package/src/build-components/Text/pattern.json +2 -2
  144. package/src/build-components/View/ViewProps.generated.ts +1 -1
  145. package/src/build-components/View/pattern.json +2 -2
  146. package/src/build-components/patterns.generated.ts +62 -52
  147. package/src/build-components/useNode.ts +2 -16
  148. package/src/components/BottomBar.tsx +28 -1
  149. package/src/components/BuilderProvider.tsx +5 -14
  150. package/src/hooks/useLocalize.ts +1 -1
  151. package/src/migrations/migrations/1.1.2_extract_component_attributes_from_style.ts +31 -10
  152. package/src/modals/PromptManagerModal.tsx +270 -0
  153. package/src/modals/index.ts +1 -0
  154. package/src/styles/index.scss +1 -0
  155. package/src/styles/modals/_prompt-manager-modal.scss +95 -0
  156. package/src/utils/analyseNodeByPatterns.ts +2 -2
  157. package/src/utils/attributeStyle.ts +9 -3
  158. package/src/utils/extractImageStyle.ts +4 -4
  159. package/src/utils/nodeXml.ts +196 -0
  160. package/src/utils/patterns.ts +3 -3
@@ -0,0 +1,328 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * generate-prompt-schemes.js
4
+ *
5
+ * Reads all *Props.generated.ts files from src/build-components,
6
+ * extracts a compact (uglified) representation of each component's
7
+ * props/attributes, and combines them into a single patterns string.
8
+ *
9
+ * Then reads the prompt_scheme.md template and the two sample JSON
10
+ * files, converts each JSON to XML (Node.js-safe, no DOMParser),
11
+ * and generates two TypeScript assets:
12
+ * src/assets/prompt-scheme-onboard.generated.ts
13
+ * src/assets/prompt-scheme-paywall.generated.ts
14
+ */
15
+
16
+ import fs from 'fs';
17
+ import path from 'path';
18
+ import url from 'url';
19
+
20
+ const __filename = url.fileURLToPath(import.meta.url);
21
+ const __dirname = path.dirname(__filename);
22
+
23
+ const PROJECT_ROOT = path.resolve(__dirname, '../..');
24
+ const SRC_ROOT = path.join(PROJECT_ROOT, 'src');
25
+ const COMPONENTS_ROOT = path.join(SRC_ROOT, 'build-components');
26
+ const ASSETS_ROOT = path.join(SRC_ROOT, 'assets');
27
+ const SAMPLES_ROOT = path.join(ASSETS_ROOT, 'samples');
28
+ const TEMPLATE_PATH = path.join(__dirname, 'assets', 'prompt_scheme.md');
29
+
30
+ /* ------------------------------------------------------------------ */
31
+ /* 1. JSON → XML converter (Node.js-safe, no DOMParser) */
32
+ /* ------------------------------------------------------------------ */
33
+
34
+ function escapeXmlAttr(str, quote) {
35
+ let result = str
36
+ .replace(/&/g, '&')
37
+ .replace(/</g, '&lt;')
38
+ .replace(/>/g, '&gt;');
39
+ if (quote === '"') {
40
+ result = result.replace(/"/g, '&quot;');
41
+ } else {
42
+ result = result.replace(/'/g, '&apos;');
43
+ }
44
+ return result;
45
+ }
46
+
47
+ function attrValueToString(value) {
48
+ if (value === null || value === undefined) return '';
49
+ if (typeof value === 'string') return value;
50
+ if (typeof value === 'number' || typeof value === 'boolean')
51
+ return String(value);
52
+ return JSON.stringify(value);
53
+ }
54
+
55
+ function nodeToXmlInner(node, indent) {
56
+ const pad = ' '.repeat(indent);
57
+
58
+ if (node === null || node === undefined) return '';
59
+ if (typeof node === 'string') return `${pad}${node}`;
60
+
61
+ if (Array.isArray(node)) {
62
+ return node.map((child) => nodeToXmlInner(child, indent)).join('\n');
63
+ }
64
+
65
+ if (typeof node !== 'object') return '';
66
+
67
+ const type = node.type;
68
+ if (!type) return '';
69
+
70
+ const attrs = [];
71
+
72
+ const addAttr = (key, val) => {
73
+ const strValue = attrValueToString(val);
74
+ const useSingle = strValue.includes('"') && !strValue.includes("'");
75
+ const quote = useSingle ? "'" : '"';
76
+ const escaped = escapeXmlAttr(strValue, quote);
77
+ attrs.push(`${key}=${quote}${escaped}${quote}`);
78
+ };
79
+
80
+ if (node.key) addAttr('key', node.key);
81
+ if (node.sourceType) addAttr('sourceType', node.sourceType);
82
+ if (node.isMain) addAttr('isMain', 'true');
83
+
84
+ if (node.attributes && typeof node.attributes === 'object') {
85
+ for (const [k, v] of Object.entries(node.attributes)) {
86
+ addAttr(k, v);
87
+ }
88
+ }
89
+
90
+ const attrStr = attrs.length > 0 ? ' ' + attrs.join(' ') : '';
91
+ const children = node.children;
92
+
93
+ if (
94
+ children === null ||
95
+ children === undefined ||
96
+ (Array.isArray(children) && children.length === 0)
97
+ ) {
98
+ return `${pad}<${type}${attrStr} />`;
99
+ }
100
+
101
+ const childXml = nodeToXmlInner(children, indent + 1);
102
+ return `${pad}<${type}${attrStr}>\n${childXml}\n${pad}</${type}>`;
103
+ }
104
+
105
+ function nodeToXml(node) {
106
+ if (node === null || node === undefined) return '';
107
+ return nodeToXmlInner(node, 0);
108
+ }
109
+
110
+ /* ------------------------------------------------------------------ */
111
+ /* 2. Props.generated.ts parser → compact pattern string */
112
+ /* ------------------------------------------------------------------ */
113
+
114
+ /**
115
+ * Parses a single *Props.generated.ts file and returns a compact
116
+ * one-liner representing the component's attributes.
117
+ *
118
+ * Format: ComponentName: {attr1:type, attr2:"a"|"b", styles:{prop:type}}
119
+ */
120
+ function parsePropsFile(filePath, componentName) {
121
+ const src = fs.readFileSync(filePath, 'utf8');
122
+
123
+ // ── Collect enum/union types ──────────────────────────────────────
124
+ // e.g. export type DotTypeOptionType = 'a' | 'b';
125
+ const enumMap = {};
126
+ const enumRe =
127
+ /export\s+type\s+(\w+)\s*=\s*((?:'[^']*'|\||\s)+);/g;
128
+ let m;
129
+ while ((m = enumRe.exec(src)) !== null) {
130
+ const typeName = m[1];
131
+ // Collect all quoted values
132
+ const values = [...m[2].matchAll(/'([^']*)'/g)].map((x) => `"${x[1]}"`);
133
+ if (values.length > 0) enumMap[typeName] = values.join('|');
134
+ }
135
+
136
+ // ── Find the *PropsGenerated interface ───────────────────────────
137
+ const propsInterfaceRe =
138
+ /export\s+interface\s+\w+PropsGenerated\s*\{([\s\S]*?)\n\}/;
139
+ const piMatch = propsInterfaceRe.exec(src);
140
+ if (!piMatch) return null;
141
+
142
+ // ── Extract the `attributes` block ─────────────────────────────
143
+ const attrBlockRe = /attributes\s*:\s*\{([\s\S]*?)\}\s*;/;
144
+ const abMatch = attrBlockRe.exec(piMatch[1]);
145
+ if (!abMatch) return null;
146
+
147
+ const attrBlock = abMatch[1];
148
+
149
+ // ── Find the style interface ────────────────────────────────────
150
+ const styleInterfaceRe =
151
+ /export\s+interface\s+\w+StyleGenerated\s*\{([\s\S]*?)\n\}/;
152
+ const siMatch = styleInterfaceRe.exec(src);
153
+ const styleProps = [];
154
+ if (siMatch) {
155
+ const stylePropRe = /^\s+(\w+)\??:\s*(.+?);/gm;
156
+ let sm;
157
+ while ((sm = stylePropRe.exec(siMatch[1])) !== null) {
158
+ const propName = sm[1];
159
+ const rawType = sm[2].trim();
160
+ // Map the TypeScript type to a compact form
161
+ const compact = resolveType(rawType, enumMap);
162
+ styleProps.push(`${propName}:${compact}`);
163
+ }
164
+ }
165
+
166
+ // ── Parse non-style attributes ──────────────────────────────────
167
+ const nonStyleAttrs = [];
168
+ const attrPropRe = /^\s+(\w+)\??:\s*(.+?);/gm;
169
+ let ap;
170
+ while ((ap = attrPropRe.exec(attrBlock)) !== null) {
171
+ const propName = ap[1];
172
+ if (propName === 'styles') continue; // handled via style interface
173
+ const rawType = ap[2].trim();
174
+ if (rawType === 'never') continue; // excluded props
175
+ const compact = resolveType(rawType, enumMap);
176
+ nonStyleAttrs.push(`${propName}:${compact}`);
177
+ }
178
+
179
+ // ── Also check for child type ───────────────────────────────────
180
+ const childRe = /^\s+child\s*:\s*(.+?);/m;
181
+ const childMatch = childRe.exec(piMatch[1]);
182
+ const childType = childMatch ? resolveType(childMatch[1].trim(), enumMap) : null;
183
+
184
+ // ── Build compact string ────────────────────────────────────────
185
+ const parts = [];
186
+ if (childType && childType !== 'string') parts.push(`child:${childType}`);
187
+ parts.push(...nonStyleAttrs);
188
+ if (styleProps.length > 0) {
189
+ parts.push(`styles:{${styleProps.join(',')}}`);
190
+ }
191
+
192
+ return `${componentName}:{${parts.join(',')}}`;
193
+ }
194
+
195
+ function resolveType(rawType, enumMap) {
196
+ // Direct enum reference
197
+ if (enumMap[rawType]) return enumMap[rawType];
198
+
199
+ // Array type like: EventObjectGenerated[]
200
+ if (rawType.endsWith('[]')) {
201
+ const inner = rawType.slice(0, -2).trim();
202
+ return `[${resolveType(inner, enumMap)}]`;
203
+ }
204
+
205
+ // Union with null: SomeType | null
206
+ const nullableMatch = rawType.match(/^(\w+)\s*\|\s*null$/);
207
+ if (nullableMatch) return resolveType(nullableMatch[1], enumMap) + '?';
208
+
209
+ // Simple primitives — keep as-is so LLMs understand them natively
210
+ if (rawType === 'string') return 'string';
211
+ if (rawType === 'number') return 'number';
212
+ if (rawType === 'boolean') return 'boolean';
213
+
214
+ // Interface reference (EventObjectGenerated etc.) — just label it "obj"
215
+ if (rawType.match(/^\w+$/)) return 'obj';
216
+
217
+ return rawType;
218
+ }
219
+
220
+ /* ------------------------------------------------------------------ */
221
+ /* 3. Collect all patterns */
222
+ /* ------------------------------------------------------------------ */
223
+
224
+ function collectPatterns() {
225
+ const entries = fs.readdirSync(COMPONENTS_ROOT, { withFileTypes: true });
226
+ const lines = [];
227
+
228
+ for (const entry of entries) {
229
+ if (!entry.isDirectory()) continue;
230
+ const componentName = entry.name;
231
+ const propsFile = path.join(
232
+ COMPONENTS_ROOT,
233
+ componentName,
234
+ `${componentName}Props.generated.ts`
235
+ );
236
+ if (!fs.existsSync(propsFile)) continue;
237
+
238
+ const line = parsePropsFile(propsFile, componentName);
239
+ if (line) lines.push(line);
240
+ }
241
+
242
+ return lines.join('\n');
243
+ }
244
+
245
+ /* ------------------------------------------------------------------ */
246
+ /* 4. Collect icon list from Icon.generated.tsx */
247
+ /* ------------------------------------------------------------------ */
248
+
249
+ function collectIcons() {
250
+ const iconFile = path.join(SRC_ROOT, 'components', 'Icon.generated.tsx');
251
+ if (!fs.existsSync(iconFile)) return '(icon list unavailable)';
252
+
253
+ const src = fs.readFileSync(iconFile, 'utf8');
254
+
255
+ // Match all keys of ICON_SVGS: both bare words and quoted strings
256
+ // activity:
257
+ // 'activity-heart':
258
+ const keyRe = /^\s+(?:'([^']+)'|(\w[\w-]*)?)\s*:/gm;
259
+ const keys = [];
260
+ let m;
261
+ while ((m = keyRe.exec(src)) !== null) {
262
+ const key = m[1] ?? m[2];
263
+ if (key) keys.push(key);
264
+ // Stop once we leave the ICON_SVGS object (first export function)
265
+ if (src.slice(m.index, m.index + 200).includes('export function')) break;
266
+ }
267
+
268
+ // Dedup and sort
269
+ return [...new Set(keys)].sort().join(', ');
270
+ }
271
+
272
+ /* ------------------------------------------------------------------ */
273
+ /* 5. Generate a .generated.ts asset file */
274
+ /* ------------------------------------------------------------------ */
275
+
276
+ function generateAsset(schemeType, sampleJsonPath, outputPath) {
277
+ // Load template
278
+ const template = fs.readFileSync(TEMPLATE_PATH, 'utf8');
279
+
280
+ // Load patterns
281
+ const patterns = collectPatterns();
282
+
283
+ // Load sample JSON and convert to XML
284
+ const sampleJson = JSON.parse(fs.readFileSync(sampleJsonPath, 'utf8'));
285
+ const exampleXml = nodeToXml(sampleJson.data);
286
+
287
+ // Load icon list
288
+ const icons = collectIcons();
289
+
290
+ // Fill template — replace ALL occurrences of {screen_type}
291
+ const filled = template
292
+ .replaceAll('{screen_type}', schemeType)
293
+ .replace('{patterns}', patterns)
294
+ .replace('{icons}', icons)
295
+ .replace('{example}', exampleXml);
296
+
297
+ // Write as a TypeScript string export
298
+ const tsContent = `/* AUTO-GENERATED FILE - DO NOT EDIT */
299
+ /* Prompt scheme for ${schemeType} screens. Generated by generate-prompt-schemes.js */
300
+
301
+ export const ${schemeType}PromptScheme: string = ${JSON.stringify(filled)};
302
+ `;
303
+
304
+ fs.writeFileSync(outputPath, tsContent, 'utf8');
305
+ console.info(
306
+ ` ✓ Generated ${path.relative(PROJECT_ROOT, outputPath)} (${filled.length.toLocaleString()} chars)`
307
+ );
308
+ }
309
+
310
+ /* ------------------------------------------------------------------ */
311
+ /* 6. Main */
312
+ /* ------------------------------------------------------------------ */
313
+
314
+ export async function generatePromptSchemes() {
315
+ generateAsset(
316
+ 'onboard',
317
+ path.join(SAMPLES_ROOT, 'vpn-onboard-1.json'),
318
+ path.join(ASSETS_ROOT, 'prompt-scheme-onboard.generated.ts')
319
+ );
320
+
321
+ generateAsset(
322
+ 'paywall',
323
+ path.join(SAMPLES_ROOT, 'paywall-1.json'),
324
+ path.join(ASSETS_ROOT, 'prompt-scheme-paywall.generated.ts')
325
+ );
326
+ }
327
+
328
+ export default generatePromptSchemes;
@@ -5,6 +5,7 @@ import url from 'url';
5
5
 
6
6
  import run from './build-components.js';
7
7
  import runIconGenerator from './icon-generator.js';
8
+ import generatePromptSchemes from './generate-prompt-schemes.js';
8
9
  import { updateMetaJson } from './utils/index.js';
9
10
 
10
11
  const __filename = url.fileURLToPath(import.meta.url);
@@ -28,6 +29,9 @@ try {
28
29
 
29
30
  console.info('Building components...');
30
31
  await run();
32
+
33
+ console.info('Generating prompt schemes...');
34
+ await generatePromptSchemes();
31
35
  } catch (err) {
32
36
  console.error(err?.stack || err?.message || err);
33
37
  process.exit(1);
@@ -142,11 +142,11 @@ export async function createGeneratedProps(
142
142
  return ` ${key}?: ${tsType};`;
143
143
  });
144
144
 
145
- // In schema v2, the source of truth for "style bag" fields is `pattern.attributes.style`.
145
+ // In schema v2, the source of truth for "style bag" fields is `pattern.attributes.styles`.
146
146
  // `meta.styles` is UI metadata (and can include non-style fields like "scrollable" or "condition"),
147
- // so we must NOT treat its keys as belonging to `attributes.style`.
148
- const nestedStyleSchema = isPlainObject(attributes?.style)
149
- ? attributes.style
147
+ // so we must NOT treat its keys as belonging to `attributes.styles`.
148
+ const nestedStyleSchema = isPlainObject(attributes?.styles)
149
+ ? attributes.styles
150
150
  : {};
151
151
  const styleKeys = Object.keys(nestedStyleSchema);
152
152
  const styleInterfaceName = `${componentName}StyleGenerated`;
@@ -173,17 +173,17 @@ export async function createGeneratedProps(
173
173
  `\n}\n`
174
174
  : '';
175
175
 
176
- // In schema v2 we always allow a nested `style` object.
176
+ // In schema v2 we always allow a nested `styles` object.
177
177
  // If pattern.json declares meta.styles keys, we expose them for autocomplete while keeping flexibility via an index signature.
178
178
  const styleLine =
179
179
  styleKeys.length > 0
180
- ? ` style?: ${styleInterfaceName};`
181
- : ` style?: Record<string, unknown>;`;
180
+ ? ` styles?: ${styleInterfaceName};`
181
+ : ` styles?: Record<string, unknown>;`;
182
182
 
183
- // Avoid emitting `attributes.style?: string;` when `pattern.attributes.style` is the nested style schema object.
183
+ // Avoid emitting `attributes.styles?: string;` when `pattern.attributes.styles` is the nested style schema object.
184
184
  const attributeLinesWithoutNestedStyle =
185
185
  styleKeys.length > 0
186
- ? attributeLines.filter(line => !line.trim().startsWith('style?:'))
186
+ ? attributeLines.filter(line => !line.trim().startsWith('styles?:'))
187
187
  : attributeLines;
188
188
 
189
189
  const childTsType =
@@ -203,17 +203,17 @@ async function validatePatternJson(componentDir, componentName) {
203
203
 
204
204
  // Validate attributes accept primitive, enum array, or custom type refs (including X[])
205
205
  for (const [attrName, attrType] of Object.entries(pattern.attributes)) {
206
- if (attrName === 'style') {
206
+ if (attrName === 'styles') {
207
207
  if (!isPlainObject(attrType)) {
208
208
  return fail(
209
- `[${componentName}] pattern.json -> 'pattern.attributes.style' must be an object`
209
+ `[${componentName}] pattern.json -> 'pattern.attributes.styles' must be an object`
210
210
  );
211
211
  }
212
212
  for (const [styleKey, styleType] of Object.entries(attrType)) {
213
213
  const res = validateAttrType(
214
214
  styleKey,
215
215
  styleType,
216
- 'pattern.attributes.style'
216
+ 'pattern.attributes.styles'
217
217
  );
218
218
  if (res) return res;
219
219
  }
@@ -335,15 +335,15 @@ async function validatePatternJson(componentDir, componentName) {
335
335
  const parentAttributes = parentData?.pattern?.attributes || {};
336
336
  const childAttributes = data?.pattern?.attributes || {};
337
337
  const mergedAttributes = { ...parentAttributes, ...childAttributes };
338
- // Deep-merge nested schema `attributes.style` when present (so parent style keys propagate).
339
- const parentStyle = isPlainObject(parentAttributes?.style)
340
- ? parentAttributes.style
338
+ // Deep-merge nested schema `attributes.styles` when present (so parent style keys propagate).
339
+ const parentStyle = isPlainObject(parentAttributes?.styles)
340
+ ? parentAttributes.styles
341
341
  : null;
342
- const childStyle = isPlainObject(childAttributes?.style)
343
- ? childAttributes.style
342
+ const childStyle = isPlainObject(childAttributes?.styles)
343
+ ? childAttributes.styles
344
344
  : null;
345
345
  if (parentStyle || childStyle) {
346
- mergedAttributes.style = {
346
+ mergedAttributes.styles = {
347
347
  ...(parentStyle || {}),
348
348
  ...(childStyle || {}),
349
349
  };
@@ -1,4 +1,4 @@
1
- import { useRef } from 'react';
1
+ import { useEffect, useRef } from 'react';
2
2
  import { DeviceMockFrame } from './DeviceMockFrame';
3
3
  import { Node } from './types/Node';
4
4
  import { RenderNode } from './build-components';
@@ -10,6 +10,8 @@ import {
10
10
  } from './components/BuilderProvider';
11
11
  import { RenderErrorBoundary } from './components/RenderErrorBoundary';
12
12
  import { usePreviewSelection } from './hooks/usePreviewSelection';
13
+ import { defaultLocalization } from './types/PreviewConfig';
14
+ import { defaultProjectColors } from './utils/projectColors';
13
15
  export type ScreenStyle = {
14
16
  light: { backgroundColor: string; color: string; seperatorColor?: string };
15
17
  dark: { backgroundColor: string; color: string; seperatorColor?: string };
@@ -40,8 +42,8 @@ export function RenderPage({
40
42
  const {
41
43
  products,
42
44
  benefits,
43
- mockTheme,
44
- mockDefaultLanguage,
45
+ selectedTheme,
46
+ selectedLanguage,
45
47
  overrideLocalization,
46
48
  overrideBaseSize,
47
49
  overrideProjectColors,
@@ -54,8 +56,8 @@ export function RenderPage({
54
56
  } = useRenderStore((s) => ({
55
57
  products: s.products,
56
58
  benefits: s.benefits,
57
- mockTheme: s.theme,
58
- mockDefaultLanguage: s.defaultLanguage,
59
+ selectedTheme: s.theme,
60
+ selectedLanguage: s.defaultLanguage,
59
61
  overrideLocalization: s.localization,
60
62
  overrideBaseSize: s.baseSize,
61
63
  overrideProjectColors: s.projectColors,
@@ -67,6 +69,7 @@ export function RenderPage({
67
69
  setCurrent: s.setCurrent,
68
70
  }));
69
71
  const previewRootRef = useRef<HTMLDivElement | null>(null);
72
+ const hasAlertedRef = useRef(false);
70
73
  const showEmptyState = isNullish(data);
71
74
 
72
75
  usePreviewSelection({
@@ -78,13 +81,51 @@ export function RenderPage({
78
81
  forceRender,
79
82
  });
80
83
 
84
+ // Alert once per page when default localization or project colors are used
85
+ useEffect(() => {
86
+ if (hasAlertedRef.current) return;
87
+
88
+ const locKeys = overrideLocalization
89
+ ? Object.keys(overrideLocalization)
90
+ : [];
91
+ const pcKeys = overrideProjectColors
92
+ ? [
93
+ ...Object.keys(overrideProjectColors.STATIC_COLORS ?? {}),
94
+ ...Object.keys(overrideProjectColors.THEME_COLORS ?? {}),
95
+ ]
96
+ : [];
97
+
98
+ const isDefaultLocalization =
99
+ !overrideLocalization ||
100
+ locKeys.length === 0 ||
101
+ JSON.stringify(overrideLocalization) ===
102
+ JSON.stringify(defaultLocalization);
103
+
104
+ const isDefaultProjectColors =
105
+ !overrideProjectColors ||
106
+ JSON.stringify(overrideProjectColors) ===
107
+ JSON.stringify(defaultProjectColors);
108
+
109
+ if (isDefaultLocalization || isDefaultProjectColors) {
110
+ const parts: string[] = [];
111
+ if (isDefaultLocalization) parts.push('localization');
112
+ if (isDefaultProjectColors) parts.push('projectColors');
113
+
114
+ hasAlertedRef.current = true;
115
+ alert(
116
+ `[RenderPage] ⚠️ Using default ${parts.join(' & ')}. ` +
117
+ 'Provide overrides via the store or params to avoid fallback values.',
118
+ );
119
+ }
120
+ }, [overrideLocalization, overrideProjectColors]);
121
+
81
122
  return (
82
123
  <RenderErrorBoundary subtitle="caught by RenderPage">
83
124
  <BuilderProvider
84
125
  params={{
85
126
  // Store defaults
86
- mockTheme: mockTheme,
87
- mockDefaultLanguage: mockDefaultLanguage,
127
+ selectedTheme,
128
+ selectedLanguage,
88
129
  localization: overrideLocalization,
89
130
  baseSize: overrideBaseSize,
90
131
  mockProducts: products,
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "supportedProjectVersion": "1.1.2",
3
- "reactBuilderVersion": "1.2.30"
3
+ "reactBuilderVersion": "1.2.32"
4
4
  }
@@ -0,0 +1,4 @@
1
+ /* AUTO-GENERATED FILE - DO NOT EDIT */
2
+ /* Prompt scheme for onboard screens. Generated by generate-prompt-schemes.js */
3
+
4
+ export const onboardPromptScheme: string = "You are a React Native UI builder assistant. Your goal is to generate a valid **onboard** screen node tree in XML format.\n\n## Available Components & Their Props\n\nEach component is listed as `ComponentName: {attr: TypeScriptType, styles: {prop: TypeScriptType}}`.\nUse ONLY these component names and attribute names. Do NOT invent new components or attributes.\n\nUnion enum values must match exactly (e.g. `\"expanding_dot\"` not `expandingDot`).\nColor values: prefer `THEME_COLORS.KEY` or `STATIC_COLORS.KEY` for theme-aware colors. Literal values like `\"red\"` or `\"#000fff\"` are also valid when a specific color is intended.\nLocalization string values should use a localization key like `\"screen.section.label\"`.\n\n```\nBIcon:{adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,iconType:string,size:number,strokeWidth:number,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nBackgroundImage:{scrollable:boolean,src:string,resizeMode:\"cover\"|\"contain\"|\"stretch\"|\"center\",styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nButton:{scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number,color:string,fontSize:string,fontWeight:\"normal\"|\"bold\"|\"100\"|\"200\"|\"300\"|\"400\"|\"500\"|\"600\"|\"700\"|\"800\"|\"900\"}}\nCarousel:{scrollable:boolean,loop:boolean,dragFree:boolean,align:\"start\"|\"center\"|\"end\",styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nCarouselButtons:{scrollable:boolean,buttonType:\"previous_button\"|\"next_button\"|\"skip_button\",skipNumber:number,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nCarouselDots:{scrollable:boolean,dotType:\"expanding_dot\"|\"normal_dot\"|\"scaling_dot\"|\"sliding_border\"|\"sliding_dot\"|\"liquid_like\",dot_thickness:string,inactive_dot_opacity:number,inactive_dot_color:string,active_dot_color:string,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nCarouselItem:{scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nCarouselProvider:{scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nCountDown:{adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,count:number,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:obj,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number,textAlign:obj}}\nImage:{scrollable:boolean,src:string,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number,resizeMode:\"cover\"|\"contain\"|\"stretch\"|\"center\"}}\nMain:{scrollable:boolean,useSafeAreaView:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nNavigationBarColor:{scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboard:{scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboardButton:{scrollable:boolean,labelKey:string,animation:\"simple-animation\"|\"line-animation\"|\"blur\"|\"blur-animation\"|\"blur-line-animation\",animation_color:string,events:[obj],styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number,color:string}}\nOnboardButtons:{scrollable:boolean,buttonType:\"previous_button\"|\"next_button\"|\"skip_button\",skipNumber:number,buttons_direction:\"row\"|\"column\",forIndex:number,seperatorColor:string,condition:\"carousel-index\",conditionVariable:number,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboardDot:{scrollable:boolean,dotType:\"expanding_dot\"|\"normal_dot\"|\"scaling_dot\"|\"sliding_border\"|\"sliding_dot\"|\"liquid_like\",dot_thickness:string,inactive_dot_opacity:number,inactive_dot_color:string,active_dot_color:string,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboardFooter:{adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,textLocalizationKey:string,linkedWordFirstLocalizationKey:string,linkedWordFirstColor:string,linkedWordFirstPage:string,linkedWordSecondLocalizationKey:string,linkedWordSecondColor:string,linkedWordSecondPage:string,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboardImage:{src:string,scrollable:boolean,video_url:string,lottie:string,styles:{resizeMode:\"cover\"|\"contain\"|\"stretch\"|\"center\",flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboardItem:{scrollable:boolean,display:\"flex\"|\"block\",gap:string,flexDirection:\"row\"|\"column\",paddingHorizontal:string,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboardProvider:{scrollable:boolean,theme:\"light\"|\"dark\"|\"all\",styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboardSubtitle:{adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nOnboardTitle:{adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nPaywallBackground:{src:string,resizeMode:\"cover\"|\"contain\"|\"stretch\"|\"center\",scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nPaywallCloseButton:{iconType:string,size:number,strokeWidth:number,adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nPaywallOptions:{scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nPaywallProvider:{scrollable:boolean,delay:number,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nPaywallSubscribeButton:{scrollable:boolean,styles:{color:string,fontSize:string,fontWeight:\"normal\"|\"bold\"|\"100\"|\"200\"|\"300\"|\"400\"|\"500\"|\"600\"|\"700\"|\"800\"|\"900\",flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nPriceTag:{adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,showOriginalPricePossible:boolean,hideIfItsNotDiscount:boolean,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number,textDecorationLine:\"none\"|\"underline\"|\"line-through\"}}\nPricing:{adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nPromo:{adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,scrollable:boolean,styles:{color:string,fontSize:string,fontFamily:string,fontWeight:string,flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nRadioButton:{scrollable:boolean,selected:boolean,color:string,size:number,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nSeparator:{styles:{backgroundColor:string,width:string,height:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string}}\nStatusBarColor:{scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\nText:{scrollable:boolean,adjustsFontSizeToFit:boolean,showEllipsis:boolean,translateCounter:number,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number,color:string,fontSize:string,fontFamily:string,fontWeight:string}}\nView:{scrollable:boolean,styles:{flexDirection:\"row\"|\"column\",flexWrap:\"nowrap\"|\"wrap\"|\"wrap-reverse\",alignItems:\"flex-start\"|\"center\"|\"flex-end\"|\"stretch\"|\"baseline\",justifyContent:\"flex-start\"|\"center\"|\"flex-end\"|\"space-between\"|\"space-around\"|\"space-evenly\",gap:string,padding:string,paddingHorizontal:string,paddingVertical:string,paddingTop:string,paddingBottom:string,paddingLeft:string,paddingRight:string,margin:string,marginHorizontal:string,marginVertical:string,marginTop:string,marginBottom:string,marginLeft:string,marginRight:string,backgroundColor:string,borderRadius:string,width:string,minWidth:string,maxWidth:string,height:string,minHeight:string,maxHeight:string,flex:number,position:\"relative\"|\"absolute\",top:string,bottom:string,left:string,right:string,zIndex:number}}\n```\n\n## Available Icons\n\nUse one of these values for `iconType` attributes:\n\n```\nactivity, activity-heart, alert-circle, alert-triangle, anchor, archive, arrow-down, arrow-left, arrow-narrow-down-left, arrow-narrow-up-right, arrow-right, arrow-right-smooth, asterisk-01, asterisk-02, at-sign, award, battery-charging, bell-01, bell-02, bell-ringing-02, bookmark, bookmark-add, bookmark-check, bookmark-minus, bookmark-x, bubble, building-01, building-02, building-03, building-04, building-05, building-06, building-07, building-08, building-09, camera, camera-01, camera-steel, check, check-circle, check-circle-bold, check-circle-broken, check-done-01, check-done-02, check-heart, check-square, check-square-broken, check-verified-01, check-verified-02, check-verified-03, checkbox, checkv, chevron-down, chevron-down2, chevron-left, chevron-left-2, chevron-right, chevron-right-empty, chevron-right-smooth, chevron-up, circle, clock, clock-fast-forward, close, close-circle, cloud-01, cloud-blank-01, cloud-blank-02, coin, coins-02, colors, copy-01, copy-02, copy-03, copy-04, copy-05, copy-06, copy-07, corner-down-right, crypto-bold, delete-icon, diamond, dice-3, display, divide-01, divide-02, divide-03, document-check-bold, dots-circle, dots-grid, dots-horizontal, dots-vertical, download-01, download-02, download-03, edit-03, edit-04, edit-05, element-3, ellipse-127, exclaimation-circle, eye-off-line, face-smile, file-04, file-05, file-check-02, file-plus-01, file-shield-02, filter-funnel-01, flag-03, flash, folder, folder-plus, gallery, globe-01, globe-04, globe-bold, guard, headphones-01, headphones-02, headset-bold, heart, heart-bold, help-circle, home-2, home-line, hourglass-02, iconType, image, image-01, image-03, inbox-01, inbox-arrow-down, info-circle, keyboard-line, lamp-charge, layer, light, like-dislike, lineHeight, lock-03, logout, magicpen, mail, mail-01, marker, medal-star, menu, menu-04, message-circle-01, message-plus-circle, message-question-circle, message-text-circle-01, message-text-square-02, message-x-square, microphone-02, microphone-slash, mirror, moon-01, moon-bold, mouse-circle, move, notification, notification-fill, notification-text, pdf-01, pencil-01, phone, phone-01, phone-arrow-down-left, phone-arrow-up-right, phone-hang-up, phone-hangup2, phone-incoming-01, phone-outgoing-01, phone-plus, phone-x, plus, plus-circle, printer, question-mark-circle, refresh-ccw-01, refresh-cw-01, refresh-cw-04, refresh-right-square-bold, remove-circle, repeat-04, repeat-bold, ruler-pen, search, search-lg, search-md, search-refraction, send-01, send-02, send-diagonal, setting-2, settings, settings-02, settings-04, settings-2, settings-cog, share-01, share-03, share-04, share-05, share-06, share-bold, shield-01, shield-bold, solar-check, speaker, speaker-wave, speedometer-03, star, star-rounded, sun, target-03, text-input, translate, trash, trash-02, trash-03, trash-04, trush-square-bold, unlimited, user-circle, user-jogging, user-plus-01, user-square, user-x-01, user-x-02, user2, users-02, users-speaker, verify, voice-cricle, x-circle, x-close, x-sm, zap\n```\n\n## XML Rules\n\n- Root element must always be `<Main isMain=\"true\">`.\n- Text content (children) goes as element body text, not as an attribute.\n- `styles` value must be a JSON object string (escape inner quotes): `styles=\"{&quot;flex&quot;:1,&quot;color&quot;:&quot;THEME_COLORS.TEXT&quot;}\"`.\n- `events` value must be a JSON array string.\n- Omit any attribute that has no value — no nulls, no empty strings.\n- Use a short unique slug for `key` when the component needs one.\n- Only use components appropriate for a onboard screen.\n\n## Reference Example\n\nA complete, valid onboard XML:\n\n```xml\n<Main key=\"c92tR8J5wbTb3fav\" isMain=\"true\" useSafeAreaView=\"true\" description=\"Ekranın ana kapsayıcısı. (#1)\" title=\"Main 1\" styles='{\"paddingBottom\":16}'>\n <StatusBarColor title=\"Status Bar Color\" description=\"Status bar background color.\" styles='{\"backgroundColor\":\"THEME_COLORS.BACKGROUND\"}' />\n <NavigationBarColor title=\"Navigation Bar Color\" description=\"Navigation bar background color.\" styles='{\"backgroundColor\":\"THEME_COLORS.BACKGROUND\"}' />\n <OnboardProvider theme=\"dark\" description=\"Onboarding sağlayıcısı. (#1)\" title=\"OnboardProvider 1\">\n <Onboard description=\"Onboarding ana yapısı. (#1)\" title=\"Onboard 1\" styles='{\"flex\":1}'>\n <OnboardItem key=\"app_onboard-page1\" description=\"Onboarding sayfası. (#1)\" title=\"OnboardItem 1\">\n <OnboardTitle description=\"Sayfa başlığı. (#1)\" title=\"OnboardTitle 1\" styles='{\"color\":\"THEME_COLORS.ONBOARD_TITLE\",\"textAlign\":\"center\",\"marginTop\":40}'>\n onboard.title.one-page\n </OnboardTitle>\n <OnboardImage src=\"https://textcall-dev.s3.amazonaws.com/onboard/high/6c89e0da17a2d6fe2997e97a2b8a00a1.png\" resizeMode=\"contain\" styles='{\"height\":350}' />\n <OnboardSubtitle description=\"Sayfa alt başlığı. (#1)\" title=\"OnboardSubtitle 1\" styles='{\"color\":\"THEME_COLORS.ONBOARD_SUBTITLE\",\"fontSize\":16,\"textAlign\":\"center\"}'>\n onboard.subtitle.one-page\n </OnboardSubtitle>\n </OnboardItem>\n <OnboardItem key=\"app_onboard-page2\" description=\"Onboarding sayfası. (#2)\" title=\"OnboardItem 2\">\n <OnboardTitle description=\"Sayfa başlığı. (#2)\" title=\"OnboardTitle 2\" styles='{\"color\":\"THEME_COLORS.ONBOARD_TITLE\",\"textAlign\":\"center\",\"marginTop\":40}'>\n onboard.title.two-page\n </OnboardTitle>\n <OnboardImage src=\"https://textcall-dev.s3.amazonaws.com/onboard/high/497a627b30ab4a0daaafa3d648a26b07.png\" resizeMode=\"contain\" styles='{\"height\":350}' />\n <OnboardSubtitle description=\"Sayfa alt başlığı. (#2)\" title=\"OnboardSubtitle 2\" styles='{\"color\":\"THEME_COLORS.ONBOARD_SUBTITLE\",\"fontSize\":16,\"textAlign\":\"center\"}'>\n onboard.subtitle.two-page\n </OnboardSubtitle>\n </OnboardItem>\n <OnboardItem key=\"app_onboard-page3\" description=\"Onboarding sayfası. (#3)\" title=\"OnboardItem 3\">\n <OnboardTitle description=\"Sayfa başlığı. (#3)\" title=\"OnboardTitle 3\" styles='{\"color\":\"THEME_COLORS.ONBOARD_TITLE\",\"textAlign\":\"center\",\"marginTop\":40}'>\n onboard.title.three-page\n </OnboardTitle>\n <OnboardImage src=\"https://textcall-dev.s3.amazonaws.com/onboard/high/6e2bc370d38695f6845007fd302034c2.png\" resizeMode=\"contain\" styles='{\"height\":350}' />\n <OnboardSubtitle description=\"Sayfa alt başlığı. (#3)\" title=\"OnboardSubtitle 3\" styles='{\"color\":\"THEME_COLORS.ONBOARD_SUBTITLE\",\"fontSize\":16,\"textAlign\":\"center\"}'>\n onboard.subtitle.three-page\n </OnboardSubtitle>\n </OnboardItem>\n <OnboardItem key=\"app_onboard-page4\" description=\"Onboarding sayfası. (#4)\" title=\"OnboardItem 4\">\n <OnboardTitle description=\"Sayfa başlığı. (#4)\" title=\"OnboardTitle 4\" styles='{\"color\":\"THEME_COLORS.ONBOARD_TITLE\",\"textAlign\":\"center\",\"marginTop\":40}'>\n onboard.title.four-page\n </OnboardTitle>\n <OnboardImage src=\"https://textcall-dev.s3.amazonaws.com/onboard/high/b6e978fe3362e857212163486c22cc7c.png\" resizeMode=\"contain\" styles='{\"height\":350}' />\n <OnboardSubtitle description=\"Sayfa alt başlığı. (#4)\" title=\"OnboardSubtitle 4\" styles='{\"color\":\"THEME_COLORS.ONBOARD_SUBTITLE\",\"fontSize\":16,\"textAlign\":\"center\"}'>\n onboard.subtitle.four-page\n </OnboardSubtitle>\n </OnboardItem>\n </Onboard>\n <OnboardDot dotType=\"expanding_dot\" dot_thickness=\"20\" inactive_dot_opacity=\"0.3\" inactive_dot_color=\"STATIC_COLORS.ONBOARD_DOT_INACTIVE\" active_dot_color=\"STATIC_COLORS.ONBOARD_DOT_ACTIVE\" styles='{\"paddingVertical\":12}' />\n <Separator title=\"Separator\" description=\"Horizontal separator line\" styles='{\"width\":\"100%\",\"height\":2,\"backgroundColor\":\"STATIC_COLORS.ONBOARD_SEPARATOR_COLOR\"}' />\n <OnboardButtons buttons_direction=\"row\" condition=\"carousel-index\" conditionVariable=\"0\" description=\"Sayfa buton grubu. (#1)\" title=\"OnboardButtons 1\" styles='{\"height\":40,\"marginVertical\":12,\"flexShrink\":0}'>\n <OnboardButton labelKey=\"onboard.skip.one-page\" events='[{\"type\":\"Navigate\",\"navigate_to\":null,\"targetIndex\":3}]' styles='{\"flex\":1,\"color\":\"THEME_COLORS.ONBOARD_BUTTON_SECONDARY_TEXT\",\"backgroundColor\":\"STATIC_COLORS.TRANSPARENT\"}' />\n <OnboardButton labelKey=\"onboard.next.one-page\" events='[{\"type\":\"Navigate\",\"navigate_to\":null,\"targetIndex\":1}]' styles='{\"flex\":1,\"color\":\"STATIC_COLORS.WHITE\",\"backgroundColor\":\"STATIC_COLORS.ONBOARD_BUTTON_PRIMARY_BACKGROUND\"}' />\n </OnboardButtons>\n <OnboardButtons buttons_direction=\"row\" condition=\"carousel-index\" conditionVariable=\"1\" description=\"Sayfa buton grubu. (#2)\" title=\"OnboardButtons 2\" styles='{\"height\":40,\"marginVertical\":12,\"flexShrink\":0}'>\n <OnboardButton labelKey=\"onboard.skip.two-page\" events='[{\"type\":\"Permission\",\"permission\":\"att\"},{\"type\":\"Navigate\",\"navigate_to\":null,\"targetIndex\":3}]' styles='{\"flex\":1,\"color\":\"THEME_COLORS.ONBOARD_BUTTON_SECONDARY_TEXT\",\"backgroundColor\":\"STATIC_COLORS.TRANSPARENT\"}' />\n <OnboardButton labelKey=\"onboard.next.two-page\" events='[{\"type\":\"Permission\",\"permission\":\"att\"},{\"type\":\"Navigate\",\"navigate_to\":null,\"targetIndex\":2}]' styles='{\"flex\":1,\"color\":\"STATIC_COLORS.WHITE\",\"backgroundColor\":\"STATIC_COLORS.ONBOARD_BUTTON_PRIMARY_BACKGROUND\"}' />\n </OnboardButtons>\n <OnboardButtons buttons_direction=\"row\" condition=\"carousel-index\" conditionVariable=\"2\" description=\"Sayfa buton grubu. (#3)\" title=\"OnboardButtons 3\" styles='{\"height\":40,\"marginVertical\":12,\"flexShrink\":0}'>\n <OnboardButton labelKey=\"onboard.skip.three-page\" events='[{\"type\":\"Navigate\",\"navigate_to\":null,\"targetIndex\":3}]' styles='{\"flex\":1,\"color\":\"THEME_COLORS.ONBOARD_BUTTON_SECONDARY_TEXT\",\"backgroundColor\":\"STATIC_COLORS.TRANSPARENT\"}' />\n <OnboardButton labelKey=\"onboard.next.three-page\" events='[{\"type\":\"Permission\",\"permission\":\"rating\"},{\"type\":\"Navigate\",\"navigate_to\":null,\"targetIndex\":3}]' styles='{\"flex\":1,\"color\":\"STATIC_COLORS.WHITE\",\"backgroundColor\":\"STATIC_COLORS.ONBOARD_BUTTON_PRIMARY_BACKGROUND\"}' />\n </OnboardButtons>\n <OnboardButtons buttons_direction=\"row\" condition=\"carousel-index\" conditionVariable=\"3\" description=\"Sayfa buton grubu. (#4)\" title=\"OnboardButtons 4\" styles='{\"height\":40,\"marginVertical\":12,\"flexShrink\":0}'>\n <OnboardButton labelKey=\"onboard.allow.four-page\" events='[{\"type\":\"Permission\",\"permission\":\"notification\"},{\"type\":\"Navigate\",\"navigate_to\":\"home\"}]' styles='{\"flex\":1,\"color\":\"STATIC_COLORS.WHITE\",\"backgroundColor\":\"STATIC_COLORS.ONBOARD_BUTTON_PRIMARY_BACKGROUND\"}' />\n </OnboardButtons>\n <View title=\"Onboard Footer Wrap\" description=\"Wrapper for OnboardFooter component\" styles='{\"marginHorizontal\":25,\"flexShrink\":0}'>\n <OnboardFooter textLocalizationKey=\"view.onboarding.footer.description\" linkedWordFirstLocalizationKey=\"view.onboarding.btnPrivacy\" linkedWordFirstColor=\"STATIC_COLORS.ONBOARD_LINK_COLOR\" linkedWordFirstPage=\"privacy\" linkedWordSecondLocalizationKey=\"view.onboarding.btnTerms\" linkedWordSecondColor=\"STATIC_COLORS.ONBOARD_LINK_COLOR\" linkedWordSecondPage=\"terms\" styles='{\"gap\":8,\"color\":\"THEME_COLORS.ONBOARD_FOOTER_TEXT\"}' />\n </View>\n </OnboardProvider>\n</Main>\n```\n\n## Task\n\nGenerate a node tree XML for the user's request below. Output ONLY raw XML — no markdown fences, no explanation.\n";