@tachui/core 0.8.0-alpha → 0.8.5-alpha

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 (176) hide show
  1. package/README.md +58 -2
  2. package/dist/assets/AssetCollection.d.ts.map +1 -1
  3. package/dist/assets/ColorAsset.d.ts.map +1 -1
  4. package/dist/assets/index.d.ts +1 -0
  5. package/dist/assets/index.d.ts.map +1 -1
  6. package/dist/assets/index.js +486 -0
  7. package/dist/assets/types.d.ts +8 -68
  8. package/dist/assets/types.d.ts.map +1 -1
  9. package/dist/binding-CYpEQquE.js +308 -0
  10. package/dist/build-plugins/index.d.ts +3 -0
  11. package/dist/build-plugins/index.d.ts.map +1 -0
  12. package/dist/build-plugins/modifier-types.d.ts +12 -0
  13. package/dist/build-plugins/modifier-types.d.ts.map +1 -0
  14. package/dist/build-tools/typegen-runner.d.ts +29 -0
  15. package/dist/build-tools/typegen-runner.d.ts.map +1 -0
  16. package/dist/bundles/assets.d.ts +19 -0
  17. package/dist/bundles/assets.d.ts.map +1 -0
  18. package/dist/bundles/context.d.ts +22 -0
  19. package/dist/bundles/context.d.ts.map +1 -0
  20. package/dist/bundles/minimal.d.ts +8 -2
  21. package/dist/bundles/minimal.d.ts.map +1 -1
  22. package/dist/common.js +427 -393
  23. package/dist/compiler/codegen.d.ts.map +1 -1
  24. package/dist/compiler/index.js +6 -1393
  25. package/dist/compiler/parser.d.ts +1 -1
  26. package/dist/compiler/parser.d.ts.map +1 -1
  27. package/dist/compiler/plugin.d.ts.map +1 -1
  28. package/dist/compiler/types.d.ts +28 -0
  29. package/dist/compiler/types.d.ts.map +1 -1
  30. package/dist/{component-XAzF1xqs.js → component-CECyfUOE.js} +80 -68
  31. package/dist/{component-base-x2XmHFjy.js → component-base-CJ__jTlr.js} +9 -7
  32. package/dist/component-context-B6qX_Qsg.js +176 -0
  33. package/dist/components/factory.d.ts +24 -0
  34. package/dist/components/factory.d.ts.map +1 -0
  35. package/dist/components/index.d.ts +3 -2
  36. package/dist/components/index.d.ts.map +1 -1
  37. package/dist/components/index.js +8 -6
  38. package/dist/components/wrapper.d.ts +70 -30
  39. package/dist/components/wrapper.d.ts.map +1 -1
  40. package/dist/concatenated-component-_tF1eMvy.js +2288 -0
  41. package/dist/concatenation/concatenated-component.d.ts +16 -2
  42. package/dist/concatenation/concatenated-component.d.ts.map +1 -1
  43. package/dist/concatenation/text-optimizer.d.ts.map +1 -1
  44. package/dist/config.d.ts +7 -0
  45. package/dist/config.d.ts.map +1 -0
  46. package/dist/constants/layout.d.ts +2 -9
  47. package/dist/constants/layout.d.ts.map +1 -1
  48. package/dist/css-classes/index.js +15 -173
  49. package/dist/{effect-B9Knft0b.js → effect-DGmdACI2.js} +3 -3
  50. package/dist/enhanced-renderer-Bwqsh8Ku.js +172 -0
  51. package/dist/essential.js +425 -391
  52. package/dist/{index-DIvMCJQO.js → factories-Co2Lv2kJ.js} +13 -13
  53. package/dist/factory-D7jAY5Kn.js +485 -0
  54. package/dist/gradients/css-generator.js +99 -0
  55. package/dist/gradients/index.js +56 -0
  56. package/dist/gradients/reactive.d.ts.map +1 -1
  57. package/dist/gradients/types.d.ts +3 -91
  58. package/dist/gradients/types.d.ts.map +1 -1
  59. package/dist/hooks-DeLasj54.js +446 -0
  60. package/dist/index-JQ1sW1SK.js +2049 -0
  61. package/dist/index-X8MVY78C.js +618 -0
  62. package/dist/index.d.ts +8 -1
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +426 -392
  65. package/dist/minimal-prod.js +94 -93
  66. package/dist/minimal.js +126 -106
  67. package/dist/modifiers/alignment.d.ts +5 -0
  68. package/dist/modifiers/alignment.d.ts.map +1 -0
  69. package/dist/modifiers/base.d.ts +6 -7
  70. package/dist/modifiers/base.d.ts.map +1 -1
  71. package/dist/modifiers/base.js +24 -16
  72. package/dist/modifiers/builder.d.ts +28 -165
  73. package/dist/modifiers/builder.d.ts.map +1 -1
  74. package/dist/modifiers/builder.js +7 -7
  75. package/dist/modifiers/core.d.ts +0 -1
  76. package/dist/modifiers/core.d.ts.map +1 -1
  77. package/dist/modifiers/corner-radius.d.ts +8 -0
  78. package/dist/modifiers/corner-radius.d.ts.map +1 -0
  79. package/dist/modifiers/index.d.ts +9 -6
  80. package/dist/modifiers/index.d.ts.map +1 -1
  81. package/dist/modifiers/index.js +36 -30
  82. package/dist/modifiers/layout-priority.d.ts +8 -0
  83. package/dist/modifiers/layout-priority.d.ts.map +1 -0
  84. package/dist/modifiers/opacity.d.ts +8 -0
  85. package/dist/modifiers/opacity.d.ts.map +1 -0
  86. package/dist/modifiers/presets.d.ts.map +1 -1
  87. package/dist/modifiers/proxy.d.ts +4 -0
  88. package/dist/modifiers/proxy.d.ts.map +1 -0
  89. package/dist/modifiers/registration-utils.d.ts +7 -0
  90. package/dist/modifiers/registration-utils.d.ts.map +1 -0
  91. package/dist/modifiers/registry.d.ts +18 -9
  92. package/dist/modifiers/registry.d.ts.map +1 -1
  93. package/dist/modifiers/registry.js +2 -2
  94. package/dist/modifiers/type-generator.d.ts +82 -0
  95. package/dist/modifiers/type-generator.d.ts.map +1 -0
  96. package/dist/modifiers/types.d.ts +2 -479
  97. package/dist/modifiers/types.d.ts.map +1 -1
  98. package/dist/modifiers/types.js +1 -4
  99. package/dist/observed-object-DepiqSgg.js +269 -0
  100. package/dist/optimization-CbKNA9w4.js +21 -0
  101. package/dist/plugin-BCAdZXKq.js +1680 -0
  102. package/dist/plugins/index.js +28 -8
  103. package/dist/plugins/simplified-lazy-loader.d.ts.map +1 -1
  104. package/dist/presets-B9x94uRn.js +381 -0
  105. package/dist/proxy-Cqmbiyx0.js +175 -0
  106. package/dist/reactive/cleanup.d.ts.map +1 -1
  107. package/dist/reactive/computed.d.ts +1 -1
  108. package/dist/reactive/computed.d.ts.map +1 -1
  109. package/dist/reactive/context.d.ts +4 -3
  110. package/dist/reactive/context.d.ts.map +1 -1
  111. package/dist/reactive/index.d.ts +1 -0
  112. package/dist/reactive/index.d.ts.map +1 -1
  113. package/dist/reactive/index.js +84 -490
  114. package/dist/reactive/signal-list.d.ts +100 -0
  115. package/dist/reactive/signal-list.d.ts.map +1 -0
  116. package/dist/reactive/signal.d.ts.map +1 -1
  117. package/dist/reactive/types.d.ts +2 -89
  118. package/dist/reactive/types.d.ts.map +1 -1
  119. package/dist/reactive/types.js +1 -4
  120. package/dist/registration-utils-CNsN4eoU.js +27 -0
  121. package/dist/runtime/component.d.ts.map +1 -1
  122. package/dist/runtime/concatenation-aria.d.ts +24 -0
  123. package/dist/runtime/concatenation-aria.d.ts.map +1 -0
  124. package/dist/runtime/concatenation-aria.js +58 -0
  125. package/dist/runtime/concatenation-full.d.ts +30 -0
  126. package/dist/runtime/concatenation-full.d.ts.map +1 -0
  127. package/dist/runtime/concatenation-full.js +85 -0
  128. package/dist/runtime/concatenation-minimal.d.ts +25 -0
  129. package/dist/runtime/concatenation-minimal.d.ts.map +1 -0
  130. package/dist/runtime/concatenation-minimal.js +45 -0
  131. package/dist/runtime/context.d.ts.map +1 -1
  132. package/dist/runtime/dom-bridge.d.ts +1 -1
  133. package/dist/runtime/dom-bridge.d.ts.map +1 -1
  134. package/dist/runtime/dom-bridge.js +239 -12
  135. package/dist/runtime/event-delegation.d.ts +59 -0
  136. package/dist/runtime/event-delegation.d.ts.map +1 -0
  137. package/dist/runtime/index.d.ts +3 -1
  138. package/dist/runtime/index.d.ts.map +1 -1
  139. package/dist/runtime/index.js +96 -0
  140. package/dist/runtime/layout-scheduler.d.ts +89 -0
  141. package/dist/runtime/layout-scheduler.d.ts.map +1 -0
  142. package/dist/runtime/props.d.ts.map +1 -1
  143. package/dist/runtime/renderer.d.ts +54 -2
  144. package/dist/runtime/renderer.d.ts.map +1 -1
  145. package/dist/runtime/renderer.js +11 -7
  146. package/dist/runtime/semantic-role-manager.d.ts.map +1 -1
  147. package/dist/runtime/types.d.ts +2 -226
  148. package/dist/runtime/types.d.ts.map +1 -1
  149. package/dist/runtime/types.js +1 -1
  150. package/dist/scheduler-DI_8ykMk.js +169 -0
  151. package/dist/signal-list-BdpxSodS.js +525 -0
  152. package/dist/state/index.js +319 -0
  153. package/dist/theme-BFaKUcjZ.js +677 -0
  154. package/dist/utils/clone-helpers.d.ts +11 -0
  155. package/dist/utils/clone-helpers.d.ts.map +1 -0
  156. package/dist/validation/index.js +28 -26
  157. package/dist/version.d.ts +19 -0
  158. package/dist/version.d.ts.map +1 -0
  159. package/dist/version.js +6 -0
  160. package/package.json +69 -9
  161. package/dist/concatenated-component-ByPl3_FF.js +0 -2933
  162. package/dist/dom-bridge-CAa1N2zX.js +0 -406
  163. package/dist/index-DCPJFUm9.js +0 -1407
  164. package/dist/index-vdsiw6gQ.js +0 -777
  165. package/dist/modifiers/as-html-validator.d.ts +0 -20
  166. package/dist/modifiers/as-html-validator.d.ts.map +0 -1
  167. package/dist/modifiers/as-html.d.ts +0 -65
  168. package/dist/modifiers/as-html.d.ts.map +0 -1
  169. package/dist/modifiers/background.d.ts +0 -51
  170. package/dist/modifiers/background.d.ts.map +0 -1
  171. package/dist/modifiers/basic-sanitizer.d.ts +0 -54
  172. package/dist/modifiers/basic-sanitizer.d.ts.map +0 -1
  173. package/dist/modifiers/css.d.ts +0 -86
  174. package/dist/modifiers/css.d.ts.map +0 -1
  175. package/dist/production-minimal-BY_gMc-l.js +0 -2532
  176. package/dist/scheduler-BKeqwrYE.js +0 -814
@@ -1,1395 +1,8 @@
1
- var u = Object.defineProperty, m = (r, e, t) => e in r ? u(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t, c = (r, e, t) => m(r, typeof e != "symbol" ? e + "" : e, t);
2
- class f {
3
- constructor(e, t) {
4
- c(this, "code"), c(this, "filename"), c(this, "position", 0), c(this, "line", 1), c(this, "column", 1), this.code = e, this.filename = t;
5
- }
6
- /**
7
- * Parse advanced SwiftUI syntax into enhanced AST
8
- */
9
- parse() {
10
- const e = [];
11
- for (; !this.isAtEnd() && (this.skipWhitespace(), !this.isAtEnd()); ) {
12
- const t = this.parseAdvancedNode();
13
- t && e.push(t);
14
- }
15
- return e;
16
- }
17
- /**
18
- * Parse advanced AST nodes including conditionals and loops
19
- */
20
- parseAdvancedNode() {
21
- const e = this.currentPosition(), t = this.position;
22
- return this.match("if") ? this.parseConditional(e) : this.match("ForEach") ? this.parseForEach(e) : this.peek() === "@" ? this.parsePropertyWrapper(e) : this.peek() === "$" ? this.parseStateBinding(e) : this.isComponentStart() ? this.parseEnhancedComponent(e) : (this.position === t && this.advance(), null);
23
- }
24
- /**
25
- * Parse conditional rendering (if/else)
26
- */
27
- parseConditional(e) {
28
- this.skipWhitespace();
29
- const t = this.parseComplexExpression();
30
- if (!t)
31
- throw new Error(`Expected condition after 'if' at line ${this.line}`);
32
- this.skipWhitespace();
33
- const i = [];
34
- if (this.peek() === "{") {
35
- for (this.advance(), this.skipWhitespace(); !this.isAtEnd() && this.peek() !== "}"; ) {
36
- const a = this.parseAdvancedNode();
37
- a && i.push(a), this.skipWhitespace();
38
- }
39
- this.peek() === "}" && this.advance();
40
- }
41
- let s;
42
- if (this.skipWhitespace(), this.match("else") && (s = [], this.skipWhitespace(), this.peek() === "{")) {
43
- for (this.advance(), this.skipWhitespace(); !this.isAtEnd() && this.peek() !== "}"; ) {
44
- const a = this.parseAdvancedNode();
45
- a && s.push(a), this.skipWhitespace();
46
- }
47
- this.peek() === "}" && this.advance();
48
- }
49
- const n = {
50
- type: "Conditional",
51
- condition: t,
52
- thenBody: i,
53
- loc: {
54
- start: e,
55
- end: this.currentPosition(),
56
- source: this.filename
57
- }
58
- };
59
- return s !== void 0 && (n.elseBody = s), n;
60
- }
61
- /**
62
- * Parse ForEach loops for list rendering
63
- */
64
- parseForEach(e) {
65
- if (this.skipWhitespace(), this.peek() !== "(")
66
- throw new Error(`Expected '(' after ForEach at line ${this.line}`);
67
- this.advance(), this.skipWhitespace();
68
- const t = this.parseComplexExpression();
69
- if (!t)
70
- throw new Error(
71
- `Expected iterable expression in ForEach at line ${this.line}`
72
- );
73
- this.skipWhitespace(), this.peek() === "," && (this.advance(), this.skipWhitespace()), this.match("id:") && (this.skipWhitespace(), this.parseComplexExpression()), this.skipWhitespace(), this.peek() === ")" && this.advance(), this.skipWhitespace();
74
- let i = "item";
75
- if (this.peek() === "{") {
76
- this.advance(), this.skipWhitespace();
77
- const n = this.position, a = this.parseIdentifier();
78
- a && this.match("in") ? i = a : this.position = n;
79
- }
80
- const s = [];
81
- for (; !this.isAtEnd() && this.peek() !== "}"; ) {
82
- const n = this.parseAdvancedNode();
83
- n && s.push(n), this.skipWhitespace();
84
- }
85
- return this.peek() === "}" && this.advance(), {
86
- type: "ForEach",
87
- iterable: t,
88
- itemIdentifier: i,
89
- body: s,
90
- loc: {
91
- start: e,
92
- end: this.currentPosition(),
93
- source: this.filename
94
- }
95
- };
96
- }
97
- /**
98
- * Parse property wrappers (@State, @Computed, etc.)
99
- */
100
- parsePropertyWrapper(e) {
101
- this.advance();
102
- const t = this.parseIdentifier();
103
- if (!t || !["State", "Computed", "Effect"].includes(t))
104
- throw new Error(
105
- `Unknown property wrapper @${t} at line ${this.line}`
106
- );
107
- this.skipWhitespace();
108
- const i = this.parseIdentifier();
109
- if (!i)
110
- throw new Error(
111
- `Expected identifier after @${t} at line ${this.line}`
112
- );
113
- let s;
114
- if (this.skipWhitespace(), this.peek() === "=") {
115
- this.advance(), this.skipWhitespace();
116
- const a = this.parseComplexExpression();
117
- a && (s = a);
118
- }
119
- const n = {
120
- type: "PropertyWrapper",
121
- wrapper: t,
122
- identifier: i,
123
- loc: {
124
- start: e,
125
- end: this.currentPosition(),
126
- source: this.filename
127
- }
128
- };
129
- return s !== void 0 && (n.initialValue = s), n;
130
- }
131
- /**
132
- * Parse state bindings ($variable)
133
- */
134
- parseStateBinding(e) {
135
- this.advance();
136
- const t = this.parseIdentifier();
137
- if (!t)
138
- throw new Error(`Expected identifier after '$' at line ${this.line}`);
139
- return {
140
- type: "StateBinding",
141
- identifier: t,
142
- loc: {
143
- start: e,
144
- end: this.currentPosition(),
145
- source: this.filename
146
- }
147
- };
148
- }
149
- /**
150
- * Parse enhanced components with complex modifier chains
151
- */
152
- parseEnhancedComponent(e) {
153
- const t = this.parseIdentifier();
154
- this.skipWhitespace();
155
- const i = [], s = [];
156
- if (this.peek() === "(") {
157
- for (this.advance(), this.skipWhitespace(); !this.isAtEnd() && this.peek() !== ")"; ) {
158
- const n = this.parseComplexExpression();
159
- n && i.push(n), this.skipWhitespace(), this.peek() === "," && (this.advance(), this.skipWhitespace());
160
- }
161
- this.peek() === ")" && this.advance();
162
- } else if (this.peek() === "{") {
163
- for (this.advance(), this.skipWhitespace(); !this.isAtEnd() && this.peek() !== "}"; ) {
164
- const n = this.parseAdvancedNode();
165
- n && i.push(n), this.skipWhitespace();
166
- }
167
- this.peek() === "}" && this.advance();
168
- }
169
- for (this.skipWhitespace(); this.peek() === "."; ) {
170
- const n = this.parseAdvancedModifier();
171
- n && s.push(n), this.skipWhitespace();
172
- }
173
- return {
174
- type: "Component",
175
- name: t,
176
- children: i,
177
- modifiers: s,
178
- loc: {
179
- start: e,
180
- end: this.currentPosition(),
181
- source: this.filename
182
- }
183
- };
184
- }
185
- /**
186
- * Parse advanced modifiers with complex expressions
187
- */
188
- parseAdvancedModifier() {
189
- if (this.peek() !== ".") return null;
190
- const e = this.currentPosition();
191
- this.advance();
192
- const t = this.parseIdentifier();
193
- if (!t) return null;
194
- const i = [];
195
- if (this.peek() === "(") {
196
- for (this.advance(), this.skipWhitespace(); !this.isAtEnd() && this.peek() !== ")"; ) {
197
- const s = this.parseComplexExpression();
198
- s && i.push(s), this.skipWhitespace(), this.peek() === "," && (this.advance(), this.skipWhitespace());
199
- }
200
- this.peek() === ")" && this.advance();
201
- }
202
- return {
203
- type: "Modifier",
204
- name: t,
205
- arguments: i,
206
- loc: {
207
- start: e,
208
- end: this.currentPosition(),
209
- source: this.filename
210
- }
211
- };
212
- }
213
- /**
214
- * Parse complex expressions including function calls, property access, etc.
215
- */
216
- parseComplexExpression() {
217
- this.skipWhitespace();
218
- const e = this.currentPosition();
219
- if (this.peek() === '"' || this.peek() === "'")
220
- return this.parseStringLiteral(e);
221
- if (this.isDigit(this.peek()))
222
- return this.parseNumberLiteral(e);
223
- if (this.match("true") || this.match("false") || this.match("null")) {
224
- const i = this.code.slice(e.offset, this.position);
225
- return {
226
- type: "Literal",
227
- value: i === "true" ? !0 : i === "false" ? !1 : null,
228
- raw: i,
229
- loc: {
230
- start: e,
231
- end: this.currentPosition(),
232
- source: this.filename
233
- }
234
- };
235
- }
236
- const t = this.parseIdentifier();
237
- return t ? (this.skipWhitespace(), this.peek() === "(" ? this.parseFunctionCall(t, e) : this.peek() === "." ? this.parsePropertyAccess(t, e) : {
238
- type: "Identifier",
239
- name: t,
240
- loc: {
241
- start: e,
242
- end: this.currentPosition(),
243
- source: this.filename
244
- }
245
- }) : this.peek() === "[" ? this.parseArrayLiteral(e) : null;
246
- }
247
- /**
248
- * Parse function calls with arguments
249
- */
250
- parseFunctionCall(e, t) {
251
- this.advance(), this.skipWhitespace();
252
- const i = [];
253
- for (; !this.isAtEnd() && this.peek() !== ")"; ) {
254
- const s = this.parseComplexExpression();
255
- s && i.push(s), this.skipWhitespace(), this.peek() === "," && (this.advance(), this.skipWhitespace());
256
- }
257
- return this.peek() === ")" && this.advance(), {
258
- type: "CallExpression",
259
- callee: { type: "Identifier", name: e },
260
- arguments: i,
261
- loc: {
262
- start: t,
263
- end: this.currentPosition(),
264
- source: this.filename
265
- }
266
- };
267
- }
268
- /**
269
- * Parse property access (obj.prop)
270
- */
271
- parsePropertyAccess(e, t) {
272
- let i = e;
273
- for (; this.peek() === "."; ) {
274
- this.advance();
275
- const s = this.parseIdentifier();
276
- s && (i = `${i}.${s}`);
277
- }
278
- return {
279
- type: "MemberExpression",
280
- object: e,
281
- property: i.split(".").slice(1).join("."),
282
- loc: {
283
- start: t,
284
- end: this.currentPosition(),
285
- source: this.filename
286
- }
287
- };
288
- }
289
- /**
290
- * Parse array literals [1, 2, 3]
291
- */
292
- parseArrayLiteral(e) {
293
- this.advance(), this.skipWhitespace();
294
- const t = [];
295
- for (; !this.isAtEnd() && this.peek() !== "]"; ) {
296
- const i = this.parseComplexExpression();
297
- i && t.push(i), this.skipWhitespace(), this.peek() === "," && (this.advance(), this.skipWhitespace());
298
- }
299
- return this.peek() === "]" && this.advance(), {
300
- type: "ArrayExpression",
301
- elements: t,
302
- loc: {
303
- start: e,
304
- end: this.currentPosition(),
305
- source: this.filename
306
- }
307
- };
308
- }
309
- // Helper methods (reuse from basic parser with enhancements)
310
- parseStringLiteral(e) {
311
- const t = this.peek();
312
- this.advance();
313
- let i = "";
314
- for (; !this.isAtEnd() && this.peek() !== t; )
315
- if (this.peek() === "\\") {
316
- this.advance();
317
- const s = this.peek();
318
- switch (s) {
319
- case "n":
320
- i += `
321
- `;
322
- break;
323
- case "t":
324
- i += " ";
325
- break;
326
- case "r":
327
- i += "\r";
328
- break;
329
- case "\\":
330
- i += "\\";
331
- break;
332
- case '"':
333
- i += '"';
334
- break;
335
- case "'":
336
- i += "'";
337
- break;
338
- default:
339
- i += s;
340
- break;
341
- }
342
- this.advance();
343
- } else
344
- i += this.peek(), this.advance();
345
- return this.peek() === t && this.advance(), {
346
- type: "Literal",
347
- value: i,
348
- raw: this.code.slice(e.offset, this.position),
349
- loc: {
350
- start: e,
351
- end: this.currentPosition(),
352
- source: this.filename
353
- }
354
- };
355
- }
356
- parseNumberLiteral(e) {
357
- let t = "";
358
- for (; !this.isAtEnd() && (this.isDigit(this.peek()) || this.peek() === "."); )
359
- t += this.peek(), this.advance();
360
- return {
361
- type: "Literal",
362
- value: t.includes(".") ? parseFloat(t) : parseInt(t, 10),
363
- raw: t,
364
- loc: {
365
- start: e,
366
- end: this.currentPosition(),
367
- source: this.filename
368
- }
369
- };
370
- }
371
- parseIdentifier() {
372
- if (!this.isAlpha(this.peek()) && this.peek() !== "_")
373
- return null;
374
- let e = "";
375
- for (; !this.isAtEnd() && (this.isAlphaNumeric(this.peek()) || this.peek() === "_"); )
376
- e += this.peek(), this.advance();
377
- return e;
378
- }
379
- // Utility methods
380
- isComponentStart() {
381
- const e = this.position, t = this.line, i = this.column, s = this.parseIdentifier();
382
- return this.position = e, this.line = t, this.column = i, s ? [
383
- "VStack",
384
- "HStack",
385
- "ZStack",
386
- "List",
387
- "Form",
388
- "NavigationStack",
389
- "Text",
390
- "Button",
391
- "Image",
392
- "TextField",
393
- "Toggle",
394
- "Slider",
395
- // ScrollView moved to @tachui/mobile
396
- "LazyVStack",
397
- "LazyHStack"
398
- ].includes(s) : !1;
399
- }
400
- match(e) {
401
- return this.code.slice(this.position, this.position + e.length) === e ? (this.position += e.length, this.column += e.length, !0) : !1;
402
- }
403
- skipWhitespace() {
404
- for (; !this.isAtEnd() && this.isWhitespace(this.peek()); )
405
- this.peek() === `
406
- ` ? (this.line++, this.column = 1) : this.column++, this.position++;
407
- }
408
- peek() {
409
- return this.isAtEnd() ? "\0" : this.code[this.position];
410
- }
411
- advance() {
412
- const e = this.peek();
413
- return this.isAtEnd() || (this.position++, e === `
414
- ` ? (this.line++, this.column = 1) : this.column++), e;
415
- }
416
- isAtEnd() {
417
- return this.position >= this.code.length;
418
- }
419
- isWhitespace(e) {
420
- return /\s/.test(e);
421
- }
422
- isAlpha(e) {
423
- return /[a-zA-Z]/.test(e);
424
- }
425
- isDigit(e) {
426
- return /[0-9]/.test(e);
427
- }
428
- isAlphaNumeric(e) {
429
- return this.isAlpha(e) || this.isDigit(e);
430
- }
431
- currentPosition() {
432
- return {
433
- line: this.line,
434
- column: this.column,
435
- offset: this.position
436
- };
437
- }
438
- }
439
- function A(r, e) {
440
- return new f(r, e).parse();
441
- }
442
- var g = Object.defineProperty, L = (r, e, t) => e in r ? g(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t, p = (r, e, t) => L(r, typeof e != "symbol" ? e + "" : e, t);
443
- function k(r, e = {}) {
444
- return new E(e).generate(r);
445
- }
446
- class E {
447
- constructor(e) {
448
- p(this, "options"), p(this, "imports", /* @__PURE__ */ new Set()), p(this, "variables", []), p(this, "code", []), p(this, "indentLevel", 0), this.options = e;
449
- }
450
- /**
451
- * Generate complete code from AST nodes
452
- */
453
- generate(e) {
454
- return this.reset(), this.addImport("createSignal", "@tachui/core/reactive"), this.addImport("createEffect", "@tachui/core/reactive"), this.addImport("createComputed", "@tachui/core/reactive"), e.forEach((i) => this.generateNode(i)), {
455
- code: this.buildFinalCode(),
456
- map: this.options.sourceMaps ? this.generateSourceMap() : void 0
457
- };
458
- }
459
- /**
460
- * Generate code for a single AST node
461
- */
462
- generateNode(e) {
463
- switch (e.type) {
464
- case "Component":
465
- this.generateComponent(e);
466
- break;
467
- }
468
- }
469
- /**
470
- * Generate code for a component node
471
- */
472
- generateComponent(e) {
473
- switch (e.name) {
474
- case "VStack":
475
- case "HStack":
476
- case "ZStack":
477
- this.generateStackComponent(e);
478
- break;
479
- case "Text":
480
- this.generateTextComponent(e);
481
- break;
482
- case "Button":
483
- this.generateButtonComponent(e);
484
- break;
485
- case "List":
486
- this.generateListComponent(e);
487
- break;
488
- default:
489
- this.generateGenericComponent(e);
490
- break;
491
- }
492
- }
493
- /**
494
- * Generate code for stack components (VStack, HStack, ZStack)
495
- */
496
- generateStackComponent(e) {
497
- const t = e.name.toLowerCase().replace("stack", ""), i = this.createVariable("container");
498
- this.addLine(`// ${e.name} component`), this.addLine(`const ${i} = document.createElement('div')`), this.addLine(
499
- `${i}.className = 'tachui-${t} ${this.generateStackClasses(e.name)}'`
500
- );
501
- const s = this.generateModifierStyles(e.modifiers);
502
- s.length > 0 && (this.addLine(`Object.assign(${i}.style, {`), this.indent(), s.forEach((n) => this.addLine(`${n},`)), this.dedent(), this.addLine("})")), e.children.forEach((n) => {
503
- this.generateNode(n);
504
- const a = this.getLastVariable();
505
- a && this.addLine(`${i}.appendChild(${a})`);
506
- }), this.addEmptyLine();
507
- }
508
- /**
509
- * Generate code for Text component
510
- */
511
- generateTextComponent(e) {
512
- const t = this.createVariable("textElement"), i = this.getTextContent(e.children);
513
- this.addLine("// Text component"), this.addLine(`const ${t} = document.createElement('span')`), this.addLine(`${t}.className = 'tachui-text'`), this.isReactiveExpression(i) ? (this.addLine("createEffect(() => {"), this.indent(), this.addLine(`${t}.textContent = ${i}`), this.dedent(), this.addLine("})")) : this.addLine(`${t}.textContent = ${i}`);
514
- const s = this.generateModifierStyles(e.modifiers);
515
- s.length > 0 && (this.addLine(`Object.assign(${t}.style, {`), this.indent(), s.forEach((n) => this.addLine(`${n},`)), this.dedent(), this.addLine("})")), this.addEmptyLine();
516
- }
517
- /**
518
- * Generate code for Button component
519
- */
520
- generateButtonComponent(e) {
521
- const t = this.createVariable("buttonElement"), i = this.getTextContent(e.children);
522
- this.addLine("// Button component"), this.addLine(`const ${t} = document.createElement('button')`), this.addLine(`${t}.className = 'tachui-button'`), this.addLine(`${t}.textContent = ${i}`);
523
- const s = this.generateModifierStyles(e.modifiers), n = this.generateEventHandlers(e.modifiers);
524
- s.length > 0 && (this.addLine(`Object.assign(${t}.style, {`), this.indent(), s.forEach((a) => this.addLine(`${a},`)), this.dedent(), this.addLine("})")), n.forEach((a) => this.addLine(a)), this.addEmptyLine();
525
- }
526
- /**
527
- * Generate code for List component
528
- */
529
- generateListComponent(e) {
530
- const t = this.createVariable("listElement");
531
- this.addLine("// List component"), this.addLine(`const ${t} = document.createElement('div')`), this.addLine(`${t}.className = 'tachui-list'`), e.children.forEach((i) => {
532
- this.generateNode(i);
533
- const s = this.getLastVariable();
534
- s && this.addLine(`${t}.appendChild(${s})`);
535
- }), this.addEmptyLine();
536
- }
537
- /**
538
- * Generate code for generic/custom components
539
- */
540
- generateGenericComponent(e) {
541
- const t = this.createVariable("element");
542
- this.addLine(`// ${e.name} component`), this.addLine(`const ${t} = document.createElement('div')`), this.addLine(`${t}.className = 'tachui-${e.name.toLowerCase()}'`);
543
- const i = this.generateModifierStyles(e.modifiers);
544
- i.length > 0 && (this.addLine(`Object.assign(${t}.style, {`), this.indent(), i.forEach((s) => this.addLine(`${s},`)), this.dedent(), this.addLine("})")), this.addEmptyLine();
545
- }
546
- /**
547
- * Generate CSS classes for stack layouts
548
- */
549
- generateStackClasses(e) {
550
- switch (e) {
551
- case "VStack":
552
- return "flex flex-col";
553
- case "HStack":
554
- return "flex flex-row";
555
- case "ZStack":
556
- return "relative";
557
- default:
558
- return "flex";
559
- }
560
- }
561
- /**
562
- * Generate styles from modifiers
563
- */
564
- generateModifierStyles(e) {
565
- const t = [];
566
- return e.forEach((i) => {
567
- const s = this.convertModifierToStyle(i);
568
- s && t.push(s);
569
- }), t;
570
- }
571
- /**
572
- * Generate event handlers from modifiers
573
- */
574
- generateEventHandlers(e) {
575
- const t = [];
576
- return e.forEach((i) => {
577
- if (i.name === "onTapGesture" && i.arguments.length > 0) {
578
- const s = this.expressionToString(i.arguments[0]);
579
- t.push(`${this.getLastVariable()}.addEventListener('click', ${s})`);
580
- }
581
- }), t;
582
- }
583
- /**
584
- * Convert modifier to CSS style property
585
- */
586
- convertModifierToStyle(e) {
587
- const t = e.arguments;
588
- switch (e.name) {
589
- case "padding":
590
- return `padding: ${t.length > 0 ? this.expressionToString(t[0]) : '"8px"'}`;
591
- case "background":
592
- if (t.length > 0)
593
- return `backgroundColor: ${this.expressionToString(t[0])}`;
594
- break;
595
- case "foregroundColor":
596
- if (t.length > 0)
597
- return `color: ${this.expressionToString(t[0])}`;
598
- break;
599
- case "font":
600
- if (t.length > 0)
601
- return `fontSize: ${this.expressionToString(t[0])}`;
602
- break;
603
- case "cornerRadius":
604
- if (t.length > 0)
605
- return `borderRadius: ${this.expressionToString(t[0])}px`;
606
- break;
607
- case "opacity":
608
- if (t.length > 0)
609
- return `opacity: ${this.expressionToString(t[0])}`;
610
- break;
611
- case "frame":
612
- if (t.length >= 2)
613
- return null;
614
- break;
615
- }
616
- return null;
617
- }
618
- /**
619
- * Helper methods
620
- */
621
- getTextContent(e) {
622
- if (e.length === 0) return '""';
623
- const t = e[0];
624
- return t.type === "Literal" ? `"${t.value}"` : this.expressionToString(t);
625
- }
626
- expressionToString(e) {
627
- switch (e.type) {
628
- case "Literal": {
629
- const t = e;
630
- return typeof t.value == "string" ? `"${t.value}"` : String(t.value);
631
- }
632
- case "Identifier":
633
- return e.name;
634
- default:
635
- return '""';
636
- }
637
- }
638
- isReactiveExpression(e) {
639
- return e.includes("()") || !e.startsWith('"') && !e.match(/^\d+$/);
640
- }
641
- createVariable(e) {
642
- const t = `${e}${this.variables.length + 1}`;
643
- return this.variables.push(t), t;
644
- }
645
- getLastVariable() {
646
- return this.variables.length > 0 ? this.variables[this.variables.length - 1] : null;
647
- }
648
- addImport(e, t) {
649
- this.imports.add(`import { ${e} } from '${t}'`);
650
- }
651
- addLine(e) {
652
- const t = " ".repeat(this.indentLevel);
653
- this.code.push(t + e);
654
- }
655
- addEmptyLine() {
656
- this.code.push("");
657
- }
658
- indent() {
659
- this.indentLevel++;
660
- }
661
- dedent() {
662
- this.indentLevel = Math.max(0, this.indentLevel - 1);
663
- }
664
- buildFinalCode() {
665
- const e = Array.from(this.imports).join(`
666
- `), t = this.code.join(`
667
- `);
668
- return `${e}
669
-
670
- ${t}`;
671
- }
672
- generateSourceMap() {
673
- return null;
674
- }
675
- reset() {
676
- this.imports.clear(), this.variables = [], this.code = [], this.indentLevel = 0;
677
- }
678
- }
679
- var v = Object.defineProperty, $ = (r, e, t) => e in r ? v(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t, d = (r, e, t) => $(r, typeof e != "symbol" ? e + "" : e, t);
680
- class C {
681
- constructor(e) {
682
- d(this, "options"), d(this, "imports", /* @__PURE__ */ new Set()), d(this, "variables", []), d(this, "code", []), d(this, "indentLevel", 0), d(this, "dependencies", /* @__PURE__ */ new Set()), d(this, "exports", /* @__PURE__ */ new Set()), this.options = e;
683
- }
684
- /**
685
- * Generate enhanced reactive DOM code from AST
686
- */
687
- generate(e) {
688
- return this.reset(), this.addImport(
689
- "createSignal, createEffect, createComputed, createRoot, batch",
690
- "@tachui/core/reactive"
691
- ), e.forEach((i) => this.generateEnhancedNode(i)), this.generateMountFunction(), {
692
- code: this.buildFinalCode(),
693
- map: this.options.sourceMaps ? this.generateSourceMap() : void 0,
694
- dependencies: Array.from(this.dependencies),
695
- exports: Array.from(this.exports)
696
- };
697
- }
698
- /**
699
- * Generate code for enhanced AST nodes
700
- */
701
- generateEnhancedNode(e) {
702
- switch (e.type) {
703
- case "Component":
704
- this.generateEnhancedComponent(e);
705
- break;
706
- case "Conditional":
707
- this.generateConditionalRendering(e);
708
- break;
709
- case "ForEach":
710
- this.generateListRendering(e);
711
- break;
712
- case "PropertyWrapper":
713
- this.generatePropertyWrapper(e);
714
- break;
715
- case "StateBinding":
716
- this.generateStateBinding(e);
717
- break;
718
- }
719
- }
720
- /**
721
- * Generate conditional rendering with reactive effects
722
- */
723
- generateConditionalRendering(e) {
724
- const t = this.createVariable("condition"), i = this.createVariable("conditionalContainer");
725
- this.addLine("// Conditional rendering"), this.addLine(`const ${i} = document.createElement('div')`), this.addLine(`${i}.className = 'tachui-conditional'`);
726
- const s = this.expressionToCode(e.condition);
727
- this.addLine(`const ${t} = createComputed(() => ${s})`), this.addLine("createEffect(() => {"), this.indent(), this.addLine("// Clear previous content"), this.addLine(`${i}.innerHTML = ''`), this.addEmptyLine(), this.addLine(`if (${t}()) {`), this.indent(), this.addLine("// Render then body"), e.thenBody.forEach((n) => {
728
- this.generateEnhancedNode(n);
729
- const a = this.getLastVariable();
730
- a && this.addLine(`${i}.appendChild(${a})`);
731
- }), this.dedent(), e.elseBody && e.elseBody.length > 0 && (this.addLine("} else {"), this.indent(), this.addLine("// Render else body"), e.elseBody.forEach((n) => {
732
- this.generateEnhancedNode(n);
733
- const a = this.getLastVariable();
734
- a && this.addLine(`${i}.appendChild(${a})`);
735
- }), this.dedent()), this.addLine("}"), this.dedent(), this.addLine("})"), this.addEmptyLine();
736
- }
737
- /**
738
- * Generate list rendering with keyed updates
739
- */
740
- generateListRendering(e) {
741
- const t = this.createVariable("listContainer"), i = this.createVariable("items"), s = this.createVariable("renderedItems");
742
- this.addLine("// List rendering with keyed updates"), this.addLine(`const ${t} = document.createElement('div')`), this.addLine(`${t}.className = 'tachui-list'`), this.addLine(`let ${s} = new Map()`);
743
- const n = this.expressionToCode(e.iterable);
744
- if (this.addLine(`const ${i} = createComputed(() => ${n})`), this.addLine("createEffect(() => {"), this.indent(), this.addLine(`const currentItems = ${i}()`), this.addLine("const newRenderedItems = new Map()"), this.addEmptyLine(), this.addLine("// Update existing items and create new ones"), this.addLine(`currentItems.forEach((${e.itemIdentifier}, index) => {`), this.indent(), this.options.generateKeyedLists) {
745
- this.addLine(`const key = ${e.itemIdentifier}.id || index`), this.addLine(`let itemElement = ${s}.get(key)`), this.addEmptyLine(), this.addLine("if (!itemElement) {"), this.indent(), this.addLine("// Create new item element"), this.generateListItemContent(e);
746
- const a = this.getLastVariable();
747
- this.addLine(`itemElement = ${a}`), this.dedent(), this.addLine("}"), this.addEmptyLine(), this.addLine("newRenderedItems.set(key, itemElement)"), this.addLine(`${t}.appendChild(itemElement)`);
748
- } else {
749
- this.addLine("// Simple list item generation"), this.generateListItemContent(e);
750
- const a = this.getLastVariable();
751
- this.addLine(`${t}.appendChild(${a})`);
752
- }
753
- this.dedent(), this.addLine("})"), this.addEmptyLine(), this.options.generateKeyedLists && (this.addLine("// Remove items that are no longer in the list"), this.addLine(`${s}.forEach((element, key) => {`), this.indent(), this.addLine("if (!newRenderedItems.has(key)) {"), this.indent(), this.addLine("element.remove()"), this.dedent(), this.addLine("}"), this.dedent(), this.addLine("})"), this.addEmptyLine(), this.addLine(`${s} = newRenderedItems`)), this.dedent(), this.addLine("})"), this.addEmptyLine();
754
- }
755
- /**
756
- * Generate content for list items
757
- */
758
- generateListItemContent(e) {
759
- this.addLine("// List item content"), e.body.forEach((t) => {
760
- this.generateEnhancedNode(t);
761
- });
762
- }
763
- /**
764
- * Generate property wrapper code
765
- */
766
- generatePropertyWrapper(e) {
767
- const { wrapper: t, identifier: i, initialValue: s } = e;
768
- switch (this.addLine(`// @${t} property wrapper`), t) {
769
- case "State": {
770
- const n = s ? this.expressionToCode(s) : "undefined";
771
- this.addLine(
772
- `const [${i}, set${this.capitalize(i)}] = createSignal(${n})`
773
- ), this.dependencies.add(i);
774
- break;
775
- }
776
- case "Computed":
777
- if (s) {
778
- const n = this.expressionToCode(s);
779
- this.addLine(`const ${i} = createComputed(() => ${n})`), this.dependencies.add(i);
780
- }
781
- break;
782
- case "Effect":
783
- if (s) {
784
- const n = this.expressionToCode(s);
785
- this.addLine(`const ${i} = createEffect(() => ${n})`);
786
- }
787
- break;
788
- }
789
- this.addEmptyLine();
790
- }
791
- /**
792
- * Generate state binding code
793
- */
794
- generateStateBinding(e) {
795
- this.addLine(`// State binding: $${e.identifier}`), this.addLine(`const ${e.identifier}Binding = {`), this.indent(), this.addLine(`get: () => ${e.identifier}(),`), this.addLine(`set: set${this.capitalize(e.identifier)}`), this.dedent(), this.addLine("}"), this.addEmptyLine();
796
- }
797
- /**
798
- * Generate enhanced component with reactive features
799
- */
800
- generateEnhancedComponent(e) {
801
- switch (e.name) {
802
- case "VStack":
803
- case "HStack":
804
- case "ZStack":
805
- this.generateEnhancedStackComponent(e);
806
- break;
807
- case "Text":
808
- this.generateEnhancedTextComponent(e);
809
- break;
810
- case "Button":
811
- this.generateEnhancedButtonComponent(e);
812
- break;
813
- case "TextField":
814
- this.generateEnhancedTextFieldComponent(e);
815
- break;
816
- default:
817
- this.generateEnhancedGenericComponent(e);
818
- break;
819
- }
820
- }
821
- /**
822
- * Generate enhanced stack component with reactive children
823
- */
824
- generateEnhancedStackComponent(e) {
825
- const t = e.name.toLowerCase().replace("stack", ""), i = this.createVariable("container");
826
- this.addLine(`// Enhanced ${e.name} component`), this.addLine(`const ${i} = document.createElement('div')`), this.addLine(
827
- `${i}.className = 'tachui-${t} ${this.generateStackClasses(e.name)}'`
828
- ), this.addLine("// Reactive children management"), e.children.forEach((s) => {
829
- this.generateEnhancedNode(s);
830
- const n = this.getLastVariable();
831
- n && this.addLine(`${i}.appendChild(${n})`);
832
- }), this.generateEnhancedModifiers(e.modifiers, i), this.addEmptyLine();
833
- }
834
- /**
835
- * Generate enhanced text component with reactive content
836
- */
837
- generateEnhancedTextComponent(e) {
838
- const t = this.createVariable("textElement"), i = this.getTextContent(e.children);
839
- this.addLine("// Enhanced Text component"), this.addLine(`const ${t} = document.createElement('span')`), this.addLine(`${t}.className = 'tachui-text'`), this.isReactiveExpression(i) ? (this.addLine("createEffect(() => {"), this.indent(), this.addLine(`${t}.textContent = String(${i})`), this.dedent(), this.addLine("})")) : this.addLine(`${t}.textContent = ${i}`), this.generateEnhancedModifiers(e.modifiers, t), this.addEmptyLine();
840
- }
841
- /**
842
- * Generate enhanced button component
843
- */
844
- generateEnhancedButtonComponent(e) {
845
- const t = this.createVariable("buttonElement"), i = this.getTextContent(e.children);
846
- this.addLine("// Enhanced Button component"), this.addLine(`const ${t} = document.createElement('button')`), this.addLine(`${t}.className = 'tachui-button'`), this.isReactiveExpression(i) ? (this.addLine("createEffect(() => {"), this.indent(), this.addLine(`${t}.textContent = String(${i})`), this.dedent(), this.addLine("})")) : this.addLine(`${t}.textContent = ${i}`), this.generateEnhancedModifiers(e.modifiers, t), this.addEmptyLine();
847
- }
848
- /**
849
- * Generate enhanced TextField component with two-way binding
850
- */
851
- generateEnhancedTextFieldComponent(e) {
852
- const t = this.createVariable("textFieldElement"), i = e.children.length > 0 ? this.getTextContent([e.children[0]]) : '""';
853
- this.addLine("// Enhanced TextField component"), this.addLine(`const ${t} = document.createElement('input')`), this.addLine(`${t}.type = 'text'`), this.addLine(`${t}.className = 'tachui-textfield'`), this.addLine(`${t}.placeholder = ${i}`);
854
- const s = e.children.find((n) => n.type === "StateBinding");
855
- s && (this.addLine("// Two-way data binding"), this.addLine("createEffect(() => {"), this.indent(), this.addLine(`${t}.value = String(${s.identifier}() || '')`), this.dedent(), this.addLine("})"), this.addLine(`${t}.addEventListener('input', (e) => {`), this.indent(), this.addLine(`set${this.capitalize(s.identifier)}(e.target.value)`), this.dedent(), this.addLine("})")), this.generateEnhancedModifiers(e.modifiers, t), this.addEmptyLine();
856
- }
857
- /**
858
- * Generate enhanced generic component
859
- */
860
- generateEnhancedGenericComponent(e) {
861
- const t = this.createVariable("element");
862
- this.addLine(`// Enhanced ${e.name} component`), this.addLine(`const ${t} = document.createElement('div')`), this.addLine(`${t}.className = 'tachui-${e.name.toLowerCase()}'`), e.children.forEach((i) => {
863
- this.generateEnhancedNode(i);
864
- const s = this.getLastVariable();
865
- s && this.addLine(`${t}.appendChild(${s})`);
866
- }), this.generateEnhancedModifiers(e.modifiers, t), this.addEmptyLine();
867
- }
868
- /**
869
- * Generate enhanced modifiers with reactive updates
870
- */
871
- generateEnhancedModifiers(e, t) {
872
- if (e.length === 0) return;
873
- const i = [], s = [], n = [];
874
- e.forEach((a) => {
875
- const h = this.convertModifierToStyle(a);
876
- h && (this.modifierHasReactiveContent(a) ? s.push(h) : i.push(h));
877
- const o = this.convertModifierToHandler(a, t);
878
- o && n.push(o);
879
- }), i.length > 0 && (this.addLine(`Object.assign(${t}.style, {`), this.indent(), i.forEach((a) => this.addLine(`${a},`)), this.dedent(), this.addLine("})")), s.length > 0 && (this.addLine("createEffect(() => {"), this.indent(), this.addLine(`Object.assign(${t}.style, {`), this.indent(), s.forEach((a) => this.addLine(`${a},`)), this.dedent(), this.addLine("})"), this.dedent(), this.addLine("})")), n.forEach((a) => this.addLine(a));
880
- }
881
- /**
882
- * Generate component mount function
883
- */
884
- generateMountFunction() {
885
- if (this.addLine("// Component mount function"), this.addLine("export function mountComponent(container) {"), this.indent(), this.addLine("return createRoot(() => {"), this.indent(), this.variables.length > 0) {
886
- const e = this.variables[this.variables.length - 1];
887
- this.addLine(`container.appendChild(${e})`), this.addLine(`return () => container.removeChild(${e})`);
888
- }
889
- this.dedent(), this.addLine("})"), this.dedent(), this.addLine("}"), this.exports.add("mountComponent");
890
- }
891
- /**
892
- * Helper methods
893
- */
894
- expressionToCode(e) {
895
- switch (e.type) {
896
- case "Literal": {
897
- const t = e;
898
- return typeof t.value == "string" ? `"${t.value}"` : String(t.value);
899
- }
900
- case "Identifier":
901
- return e.name;
902
- case "CallExpression": {
903
- const t = e, i = t.arguments.map((s) => this.expressionToCode(s)).join(", ");
904
- return `${this.expressionToCode(t.callee)}(${i})`;
905
- }
906
- case "MemberExpression": {
907
- const t = e;
908
- return `${t.object}.${t.property}`;
909
- }
910
- case "ArrayExpression":
911
- return `[${e.elements.map((s) => this.expressionToCode(s)).join(", ")}]`;
912
- default:
913
- return '""';
914
- }
915
- }
916
- getTextContent(e) {
917
- if (e.length === 0) return '""';
918
- const t = e[0];
919
- return t.type === "Literal" || t.type === "Identifier" || t.type === "CallExpression" || t.type === "MemberExpression" || t.type === "ArrayExpression" ? this.expressionToCode(t) : '""';
920
- }
921
- isReactiveExpression(e) {
922
- return e.includes("()") || e.includes("get") || !e.startsWith('"') && !e.match(/^\d+$/);
923
- }
924
- modifierHasReactiveContent(e) {
925
- return e.arguments.some((t) => {
926
- const i = this.expressionToCode(t);
927
- return this.isReactiveExpression(i);
928
- });
929
- }
930
- convertModifierToStyle(e) {
931
- const t = e.arguments;
932
- switch (e.name) {
933
- case "padding":
934
- return `padding: ${t.length > 0 ? this.expressionToCode(t[0]) : '"8px"'}`;
935
- case "background":
936
- if (t.length > 0)
937
- return `backgroundColor: ${this.expressionToCode(t[0])}`;
938
- break;
939
- case "foregroundColor":
940
- if (t.length > 0)
941
- return `color: ${this.expressionToCode(t[0])}`;
942
- break;
943
- case "font":
944
- if (t.length > 0)
945
- return `fontSize: ${this.expressionToCode(t[0])}`;
946
- break;
947
- case "cornerRadius":
948
- if (t.length > 0)
949
- return `borderRadius: ${this.expressionToCode(t[0])}px`;
950
- break;
951
- case "opacity":
952
- if (t.length > 0)
953
- return `opacity: ${this.expressionToCode(t[0])}`;
954
- break;
955
- }
956
- return null;
957
- }
958
- convertModifierToHandler(e, t) {
959
- if (e.name === "onTapGesture" && e.arguments.length > 0) {
960
- const i = this.expressionToCode(e.arguments[0]);
961
- return `${t}.addEventListener('click', ${i})`;
962
- }
963
- return null;
964
- }
965
- generateStackClasses(e) {
966
- switch (e) {
967
- case "VStack":
968
- return "flex flex-col";
969
- case "HStack":
970
- return "flex flex-row";
971
- case "ZStack":
972
- return "relative";
973
- default:
974
- return "flex";
975
- }
976
- }
977
- capitalize(e) {
978
- return e.charAt(0).toUpperCase() + e.slice(1);
979
- }
980
- createVariable(e) {
981
- const t = `${e}${this.variables.length + 1}`;
982
- return this.variables.push(t), t;
983
- }
984
- getLastVariable() {
985
- return this.variables.length > 0 ? this.variables[this.variables.length - 1] : null;
986
- }
987
- addImport(e, t) {
988
- this.imports.add(`import { ${e} } from '${t}'`);
989
- }
990
- addLine(e) {
991
- const t = " ".repeat(this.indentLevel);
992
- this.code.push(t + e);
993
- }
994
- addEmptyLine() {
995
- this.code.push("");
996
- }
997
- indent() {
998
- this.indentLevel++;
999
- }
1000
- dedent() {
1001
- this.indentLevel = Math.max(0, this.indentLevel - 1);
1002
- }
1003
- buildFinalCode() {
1004
- const e = Array.from(this.imports).join(`
1005
- `), t = this.code.join(`
1006
- `);
1007
- return `${e}
1008
-
1009
- ${t}`;
1010
- }
1011
- generateSourceMap() {
1012
- return null;
1013
- }
1014
- reset() {
1015
- this.imports.clear(), this.variables = [], this.code = [], this.indentLevel = 0, this.dependencies.clear(), this.exports.clear();
1016
- }
1017
- }
1018
- function V(r, e = {}) {
1019
- return new C(e).generate(r);
1020
- }
1021
- var b = Object.defineProperty, y = (r, e, t) => e in r ? b(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t, l = (r, e, t) => y(r, typeof e != "symbol" ? e + "" : e, t);
1022
- function x(r, e) {
1023
- return new S(r, e).parse();
1024
- }
1025
- class S {
1026
- constructor(e, t) {
1027
- l(this, "code"), l(this, "filename"), l(this, "position", 0), l(this, "line", 1), l(this, "column", 1), this.code = e, this.filename = t;
1028
- }
1029
- /**
1030
- * Main parsing entry point
1031
- */
1032
- parse() {
1033
- const e = [];
1034
- for (; !this.isAtEnd() && (this.skipWhitespace(), !this.isAtEnd()); ) {
1035
- const t = this.parseNode();
1036
- t && e.push(t);
1037
- }
1038
- return e;
1039
- }
1040
- /**
1041
- * Parse a single AST node
1042
- */
1043
- parseNode() {
1044
- const e = this.currentPosition();
1045
- return this.isComponentStart() ? this.parseComponent(e) : (this.advance(), null);
1046
- }
1047
- /**
1048
- * Parse a SwiftUI component (VStack, Text, Button, etc.)
1049
- */
1050
- parseComponent(e) {
1051
- const t = this.parseIdentifier();
1052
- if (!t)
1053
- throw new Error(`Expected component name at line ${this.line}`);
1054
- this.skipWhitespace();
1055
- const i = [], s = [];
1056
- if (this.peek() === "{") {
1057
- for (this.advance(), this.skipWhitespace(); !this.isAtEnd() && this.peek() !== "}"; ) {
1058
- this.skipWhitespace();
1059
- const a = this.parseNode();
1060
- a && i.push(a);
1061
- }
1062
- this.peek() === "}" && this.advance();
1063
- } else if (this.peek() === "(") {
1064
- this.advance(), this.skipWhitespace();
1065
- const a = this.parseExpression();
1066
- a && i.push(a), this.skipWhitespace(), this.peek() === ")" && this.advance();
1067
- }
1068
- for (this.skipWhitespace(); this.peek() === "."; ) {
1069
- const a = this.parseModifier();
1070
- a && s.push(a), this.skipWhitespace();
1071
- }
1072
- const n = this.currentPosition();
1073
- return {
1074
- type: "Component",
1075
- name: t,
1076
- children: i,
1077
- modifiers: s,
1078
- loc: {
1079
- start: e,
1080
- end: n,
1081
- source: this.filename
1082
- }
1083
- };
1084
- }
1085
- /**
1086
- * Parse a modifier (.padding(), .background(), etc.)
1087
- */
1088
- parseModifier() {
1089
- if (this.peek() !== ".") return null;
1090
- const e = this.currentPosition();
1091
- this.advance();
1092
- const t = this.parseIdentifier();
1093
- if (!t) return null;
1094
- const i = [];
1095
- if (this.peek() === "(") {
1096
- for (this.advance(), this.skipWhitespace(); !this.isAtEnd() && this.peek() !== ")"; ) {
1097
- const n = this.parseExpression();
1098
- n && i.push(n), this.skipWhitespace(), this.peek() === "," && (this.advance(), this.skipWhitespace());
1099
- }
1100
- this.peek() === ")" && this.advance();
1101
- }
1102
- const s = this.currentPosition();
1103
- return {
1104
- type: "Modifier",
1105
- name: t,
1106
- arguments: i,
1107
- loc: {
1108
- start: e,
1109
- end: s,
1110
- source: this.filename
1111
- }
1112
- };
1113
- }
1114
- /**
1115
- * Parse an expression (literal, identifier, function call)
1116
- */
1117
- parseExpression() {
1118
- this.skipWhitespace();
1119
- const e = this.currentPosition();
1120
- if (this.peek() === '"' || this.peek() === "'")
1121
- return this.parseStringLiteral(e);
1122
- if (this.isDigit(this.peek()))
1123
- return this.parseNumberLiteral(e);
1124
- if (this.match("true") || this.match("false")) {
1125
- const i = this.code.slice(e.offset, this.position);
1126
- return {
1127
- type: "Literal",
1128
- value: i === "true",
1129
- raw: i,
1130
- loc: {
1131
- start: e,
1132
- end: this.currentPosition(),
1133
- source: this.filename
1134
- }
1135
- };
1136
- }
1137
- const t = this.parseIdentifier();
1138
- if (t) {
1139
- const i = this.currentPosition();
1140
- return {
1141
- type: "Identifier",
1142
- name: t,
1143
- loc: {
1144
- start: e,
1145
- end: i,
1146
- source: this.filename
1147
- }
1148
- };
1149
- }
1150
- return null;
1151
- }
1152
- /**
1153
- * Parse a string literal
1154
- */
1155
- parseStringLiteral(e) {
1156
- const t = this.peek();
1157
- this.advance();
1158
- let i = "";
1159
- for (; !this.isAtEnd() && this.peek() !== t; )
1160
- if (this.peek() === "\\") {
1161
- this.advance();
1162
- const n = this.peek();
1163
- switch (n) {
1164
- case "n":
1165
- i += `
1166
- `;
1167
- break;
1168
- case "t":
1169
- i += " ";
1170
- break;
1171
- case "r":
1172
- i += "\r";
1173
- break;
1174
- case "\\":
1175
- i += "\\";
1176
- break;
1177
- case '"':
1178
- i += '"';
1179
- break;
1180
- case "'":
1181
- i += "'";
1182
- break;
1183
- default:
1184
- i += n;
1185
- break;
1186
- }
1187
- this.advance();
1188
- } else
1189
- i += this.peek(), this.advance();
1190
- this.peek() === t && this.advance();
1191
- const s = this.code.slice(e.offset, this.position);
1192
- return {
1193
- type: "Literal",
1194
- value: i,
1195
- raw: s,
1196
- loc: {
1197
- start: e,
1198
- end: this.currentPosition(),
1199
- source: this.filename
1200
- }
1201
- };
1202
- }
1203
- /**
1204
- * Parse a number literal
1205
- */
1206
- parseNumberLiteral(e) {
1207
- let t = "";
1208
- for (; !this.isAtEnd() && (this.isDigit(this.peek()) || this.peek() === "."); )
1209
- t += this.peek(), this.advance();
1210
- return {
1211
- type: "Literal",
1212
- value: t.includes(".") ? parseFloat(t) : parseInt(t, 10),
1213
- raw: t,
1214
- loc: {
1215
- start: e,
1216
- end: this.currentPosition(),
1217
- source: this.filename
1218
- }
1219
- };
1220
- }
1221
- /**
1222
- * Parse an identifier (component name, variable name, etc.)
1223
- */
1224
- parseIdentifier() {
1225
- if (!this.isAlpha(this.peek()) && this.peek() !== "_")
1226
- return null;
1227
- let e = "";
1228
- for (; !this.isAtEnd() && (this.isAlphaNumeric(this.peek()) || this.peek() === "_"); )
1229
- e += this.peek(), this.advance();
1230
- return e;
1231
- }
1232
- /**
1233
- * Helper methods
1234
- */
1235
- isComponentStart() {
1236
- const e = this.position, t = this.line, i = this.column, s = this.parseIdentifier(), n = s && this.isValidComponentName(s);
1237
- return this.position = e, this.line = t, this.column = i, !!n;
1238
- }
1239
- isValidComponentName(e) {
1240
- return [
1241
- "VStack",
1242
- "HStack",
1243
- "ZStack",
1244
- "List",
1245
- "Form",
1246
- "Text",
1247
- "Button",
1248
- "Image",
1249
- "TextField",
1250
- "Toggle"
1251
- ].includes(e);
1252
- }
1253
- skipWhitespace() {
1254
- for (; !this.isAtEnd() && this.isWhitespace(this.peek()); )
1255
- this.peek() === `
1256
- ` ? (this.line++, this.column = 1) : this.column++, this.position++;
1257
- }
1258
- match(e) {
1259
- return this.code.slice(this.position, this.position + e.length) === e ? (this.position += e.length, this.column += e.length, !0) : !1;
1260
- }
1261
- peek() {
1262
- return this.isAtEnd() ? "\0" : this.code[this.position];
1263
- }
1264
- advance() {
1265
- const e = this.peek();
1266
- return this.isAtEnd() || (this.position++, e === `
1267
- ` ? (this.line++, this.column = 1) : this.column++), e;
1268
- }
1269
- isAtEnd() {
1270
- return this.position >= this.code.length;
1271
- }
1272
- isWhitespace(e) {
1273
- return /\s/.test(e);
1274
- }
1275
- isAlpha(e) {
1276
- return /[a-zA-Z]/.test(e);
1277
- }
1278
- isDigit(e) {
1279
- return /[0-9]/.test(e);
1280
- }
1281
- isAlphaNumeric(e) {
1282
- return this.isAlpha(e) || this.isDigit(e);
1283
- }
1284
- currentPosition() {
1285
- return {
1286
- line: this.line,
1287
- column: this.column,
1288
- offset: this.position
1289
- };
1290
- }
1291
- }
1292
- function I(r = {}) {
1293
- const {
1294
- include: e = [".tsx", ".ts"],
1295
- exclude: t = ["node_modules/**", "**/*.test.*", "**/*.bench.*"],
1296
- dev: i = process.env.NODE_ENV === "development",
1297
- transform: s = {}
1298
- } = r;
1299
- return {
1300
- name: "tachui-transform",
1301
- enforce: "pre",
1302
- // Run before other plugins
1303
- configResolved(n) {
1304
- i && n.command === "serve" && console.log("🚀 TachUI plugin loaded in development mode");
1305
- },
1306
- buildStart() {
1307
- this.addWatchFile("tachui.config.ts");
1308
- },
1309
- resolveId(n) {
1310
- return n === "virtual:tachui-runtime" ? n : null;
1311
- },
1312
- load(n) {
1313
- return n === "virtual:tachui-runtime" ? W() : null;
1314
- },
1315
- transform(n, a) {
1316
- if (!w(a, e, t))
1317
- return null;
1318
- try {
1319
- if (!T(n))
1320
- return null;
1321
- i && console.log(`🔄 Transforming: ${a}`);
1322
- const h = x(n, a), o = k(h, {
1323
- ...s,
1324
- sourceFile: a,
1325
- sourceMaps: s.sourceMaps ?? i
1326
- });
1327
- return {
1328
- code: o.code,
1329
- map: o.map
1330
- };
1331
- } catch (h) {
1332
- const o = h instanceof Error ? h.message : String(h);
1333
- return this.error(`TachUI transformation failed in ${a}: ${o}`), null;
1334
- }
1335
- },
1336
- handleHotUpdate(n) {
1337
- if (n.file.endsWith(".tui.tsx") || n.file.endsWith(".tui.ts"))
1338
- return n.server.ws.send({
1339
- type: "full-reload"
1340
- }), [];
1341
- }
1342
- };
1343
- }
1344
- function w(r, e, t) {
1345
- return e.some((n) => r.endsWith(n)) ? !t.some((n) => n.includes("**") ? new RegExp(n.replace(/\*\*/g, ".*").replace(/\*/g, "[^/]*")).test(r) : r.includes(n)) : !1;
1346
- }
1347
- function T(r) {
1348
- return [
1349
- /\b(VStack|HStack|ZStack|List|Form)\s*\{/,
1350
- /\b(Text|Button|Image|TextField|Toggle)\s*\(/,
1351
- /\.(padding|background|foregroundColor|font|frame)\s*\(/,
1352
- /\.onTapGesture\s*\(/
1353
- ].some((t) => t.test(r));
1354
- }
1355
- function W() {
1356
- return `
1357
- // TachUI Runtime Module
1358
- // This provides runtime utilities for transformed components
1359
-
1360
- import { createSignal, createEffect, createComputed } from '@tachui/core/reactive'
1361
-
1362
- export { createSignal, createEffect, createComputed }
1363
-
1364
- // Runtime helpers for component lifecycle
1365
- export function mountComponent(element, render) {
1366
- const dispose = render()
1367
- element._tachui_dispose = dispose
1368
- return dispose
1369
- }
1370
-
1371
- export function unmountComponent(element) {
1372
- if (element._tachui_dispose) {
1373
- element._tachui_dispose()
1374
- delete element._tachui_dispose
1375
- }
1376
- }
1377
-
1378
- // Hot reload support
1379
- if (import.meta.hot) {
1380
- import.meta.hot.accept()
1381
-
1382
- // Re-mount components on hot reload
1383
- import.meta.hot.dispose(() => {
1384
- document.querySelectorAll('[data-tachui-component]').forEach(unmountComponent)
1385
- })
1386
- }
1387
- `;
1388
- }
1
+ import { c as n, g as t, a as r, p as s, b as c } from "../plugin-BCAdZXKq.js";
1389
2
  export {
1390
- I as createTachUIPlugin,
1391
- k as generateDOMCode,
1392
- V as generateEnhancedDOMCode,
1393
- A as parseAdvancedSwiftUISyntax,
1394
- x as parseSwiftUISyntax
3
+ n as createTachUIPlugin,
4
+ t as generateDOMCode,
5
+ r as generateEnhancedDOMCode,
6
+ s as parseAdvancedSwiftUISyntax,
7
+ c as parseSwiftUISyntax
1395
8
  };