@hypen-space/web 0.4.36 → 0.4.38

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 (149) hide show
  1. package/README.md +7 -6
  2. package/dist/canvas/accessibility.js +174 -174
  3. package/dist/canvas/accessibility.js.map +1 -10
  4. package/dist/canvas/events.js +264 -360
  5. package/dist/canvas/events.js.map +1 -11
  6. package/dist/canvas/index.js +11 -47
  7. package/dist/canvas/index.js.map +1 -9
  8. package/dist/canvas/input.js +178 -289
  9. package/dist/canvas/input.js.map +1 -11
  10. package/dist/canvas/layout.js +349 -547
  11. package/dist/canvas/layout.js.map +1 -12
  12. package/dist/canvas/paint.js +1122 -1146
  13. package/dist/canvas/paint.js.map +1 -12
  14. package/dist/canvas/renderer.js +352 -2259
  15. package/dist/canvas/renderer.js.map +1 -17
  16. package/dist/canvas/text.js +129 -264
  17. package/dist/canvas/text.js.map +1 -11
  18. package/dist/canvas/types.js +7 -2
  19. package/dist/canvas/types.js.map +1 -9
  20. package/dist/canvas/utils.js +158 -161
  21. package/dist/canvas/utils.js.map +1 -10
  22. package/dist/dom/applicators/advanced-layout.js +105 -138
  23. package/dist/dom/applicators/advanced-layout.js.map +1 -10
  24. package/dist/dom/applicators/background.js +36 -76
  25. package/dist/dom/applicators/background.js.map +1 -10
  26. package/dist/dom/applicators/border.js +82 -106
  27. package/dist/dom/applicators/border.js.map +1 -10
  28. package/dist/dom/applicators/color.js +17 -58
  29. package/dist/dom/applicators/color.js.map +1 -10
  30. package/dist/dom/applicators/display.js +39 -79
  31. package/dist/dom/applicators/display.js.map +1 -10
  32. package/dist/dom/applicators/effects.js +121 -147
  33. package/dist/dom/applicators/effects.js.map +1 -10
  34. package/dist/dom/applicators/events.js +413 -450
  35. package/dist/dom/applicators/events.js.map +1 -11
  36. package/dist/dom/applicators/font.js +119 -140
  37. package/dist/dom/applicators/font.js.map +1 -10
  38. package/dist/dom/applicators/index.js +386 -1770
  39. package/dist/dom/applicators/index.js.map +1 -26
  40. package/dist/dom/applicators/layout.js +143 -149
  41. package/dist/dom/applicators/layout.js.map +1 -10
  42. package/dist/dom/applicators/margin.js +64 -105
  43. package/dist/dom/applicators/margin.js.map +1 -10
  44. package/dist/dom/applicators/padding.js +64 -105
  45. package/dist/dom/applicators/padding.js.map +1 -10
  46. package/dist/dom/applicators/size.js +169 -172
  47. package/dist/dom/applicators/size.js.map +1 -10
  48. package/dist/dom/applicators/transform.js +73 -114
  49. package/dist/dom/applicators/transform.js.map +1 -10
  50. package/dist/dom/applicators/transition.js +47 -88
  51. package/dist/dom/applicators/transition.js.map +1 -10
  52. package/dist/dom/applicators/types.js +7 -2
  53. package/dist/dom/applicators/types.js.map +1 -9
  54. package/dist/dom/applicators/typography.js +68 -109
  55. package/dist/dom/applicators/typography.js.map +1 -10
  56. package/dist/dom/canvas/index.js +49 -83
  57. package/dist/dom/canvas/index.js.map +1 -10
  58. package/dist/dom/components/app.js +16 -63
  59. package/dist/dom/components/app.js.map +1 -10
  60. package/dist/dom/components/audio.js +31 -76
  61. package/dist/dom/components/audio.js.map +1 -10
  62. package/dist/dom/components/avatar.js +41 -87
  63. package/dist/dom/components/avatar.js.map +1 -10
  64. package/dist/dom/components/badge.js +35 -83
  65. package/dist/dom/components/badge.js.map +1 -10
  66. package/dist/dom/components/button.js +26 -69
  67. package/dist/dom/components/button.js.map +1 -10
  68. package/dist/dom/components/card.js +13 -63
  69. package/dist/dom/components/card.js.map +1 -10
  70. package/dist/dom/components/center.js +21 -65
  71. package/dist/dom/components/center.js.map +1 -10
  72. package/dist/dom/components/checkbox.js +37 -82
  73. package/dist/dom/components/checkbox.js.map +1 -10
  74. package/dist/dom/components/column.js +16 -62
  75. package/dist/dom/components/column.js.map +1 -10
  76. package/dist/dom/components/container.js +11 -59
  77. package/dist/dom/components/container.js.map +1 -10
  78. package/dist/dom/components/divider.js +27 -73
  79. package/dist/dom/components/divider.js.map +1 -10
  80. package/dist/dom/components/grid.js +41 -80
  81. package/dist/dom/components/grid.js.map +1 -10
  82. package/dist/dom/components/heading.js +28 -74
  83. package/dist/dom/components/heading.js.map +1 -10
  84. package/dist/dom/components/hypenapp.js +291 -288
  85. package/dist/dom/components/hypenapp.js.map +1 -10
  86. package/dist/dom/components/image.js +18 -67
  87. package/dist/dom/components/image.js.map +1 -10
  88. package/dist/dom/components/index.js +109 -1427
  89. package/dist/dom/components/index.js.map +1 -42
  90. package/dist/dom/components/input.js +19 -69
  91. package/dist/dom/components/input.js.map +1 -10
  92. package/dist/dom/components/link.js +23 -70
  93. package/dist/dom/components/link.js.map +1 -10
  94. package/dist/dom/components/list.js +26 -72
  95. package/dist/dom/components/list.js.map +1 -10
  96. package/dist/dom/components/paragraph.js +14 -63
  97. package/dist/dom/components/paragraph.js.map +1 -10
  98. package/dist/dom/components/progressbar.js +38 -85
  99. package/dist/dom/components/progressbar.js.map +1 -10
  100. package/dist/dom/components/route.js +27 -73
  101. package/dist/dom/components/route.js.map +1 -10
  102. package/dist/dom/components/router.js +15 -62
  103. package/dist/dom/components/router.js.map +1 -10
  104. package/dist/dom/components/row.js +25 -70
  105. package/dist/dom/components/row.js.map +1 -10
  106. package/dist/dom/components/select.js +42 -85
  107. package/dist/dom/components/select.js.map +1 -10
  108. package/dist/dom/components/slider.js +31 -76
  109. package/dist/dom/components/slider.js.map +1 -10
  110. package/dist/dom/components/spacer.js +10 -60
  111. package/dist/dom/components/spacer.js.map +1 -10
  112. package/dist/dom/components/spinner.js +41 -88
  113. package/dist/dom/components/spinner.js.map +1 -10
  114. package/dist/dom/components/stack.js +19 -67
  115. package/dist/dom/components/stack.js.map +1 -10
  116. package/dist/dom/components/switch.js +50 -93
  117. package/dist/dom/components/switch.js.map +1 -10
  118. package/dist/dom/components/text.js +24 -69
  119. package/dist/dom/components/text.js.map +1 -10
  120. package/dist/dom/components/textarea.js +35 -79
  121. package/dist/dom/components/textarea.js.map +1 -10
  122. package/dist/dom/components/video.js +35 -79
  123. package/dist/dom/components/video.js.map +1 -10
  124. package/dist/dom/debug.js +159 -160
  125. package/dist/dom/debug.js.map +1 -10
  126. package/dist/dom/element-data.js +181 -143
  127. package/dist/dom/element-data.js.map +1 -10
  128. package/dist/dom/events.js +133 -142
  129. package/dist/dom/events.js.map +1 -10
  130. package/dist/dom/index.js +11 -48
  131. package/dist/dom/index.js.map +1 -9
  132. package/dist/dom/renderer.js +311 -3596
  133. package/dist/dom/renderer.js.map +1 -62
  134. package/dist/index.d.ts +2 -2
  135. package/dist/index.js +36 -53
  136. package/dist/index.js.map +1 -9
  137. package/package.json +2 -16
  138. package/src/canvas/QUICKSTART.md +4 -3
  139. package/src/canvas/README.md +3 -2
  140. package/src/dom/README.md +4 -3
  141. package/src/index.ts +2 -2
  142. package/dist/client.d.ts +0 -19
  143. package/dist/client.js +0 -45
  144. package/dist/client.js.map +0 -9
  145. package/dist/hypen.d.ts +0 -140
  146. package/dist/hypen.js +0 -3909
  147. package/dist/hypen.js.map +0 -63
  148. package/src/client.ts +0 -20
  149. package/src/hypen.ts +0 -556
@@ -1,1430 +1,112 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- function __accessProp(key) {
6
- return this[key];
7
- }
8
- var __toCommonJS = (from) => {
9
- var entry = (__moduleCache ??= new WeakMap).get(from), desc;
10
- if (entry)
11
- return entry;
12
- entry = __defProp({}, "__esModule", { value: true });
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (var key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(entry, key))
16
- __defProp(entry, key, {
17
- get: __accessProp.bind(from, key),
18
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
- });
20
- }
21
- __moduleCache.set(from, entry);
22
- return entry;
23
- };
24
- var __moduleCache;
25
- var __returnValue = (v) => v;
26
- function __exportSetter(name, newValue) {
27
- this[name] = __returnValue.bind(null, newValue);
28
- }
29
- var __export = (target, all) => {
30
- for (var name in all)
31
- __defProp(target, name, {
32
- get: all[name],
33
- enumerable: true,
34
- configurable: true,
35
- set: __exportSetter.bind(all, name)
36
- });
37
- };
38
- var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
39
-
40
- // src/dom/components/column.ts
41
- var exports_column = {};
42
- __export(exports_column, {
43
- columnHandler: () => columnHandler
44
- });
45
- var columnHandler;
46
- var init_column = __esm(() => {
47
- columnHandler = {
48
- create() {
49
- const el = document.createElement("div");
50
- el.style.display = "flex";
51
- el.style.flexDirection = "column";
52
- el.style.alignItems = "flex-start";
53
- el.dataset.hypenType = "column";
54
- return el;
55
- }
56
- };
57
- });
58
-
59
- // src/dom/components/row.ts
60
- var exports_row = {};
61
- __export(exports_row, {
62
- rowHandler: () => rowHandler
63
- });
64
- function ensureRowStyles() {
65
- if (rowStylesInjected)
66
- return;
67
- rowStylesInjected = true;
68
- const style = document.createElement("style");
69
- style.id = "hypen-row-styles";
70
- style.textContent = `
71
- /* Row expands to fill width when it has children with flex/weight */
72
- /* This matches iOS/Android behavior where weighted children cause parent to expand */
73
- [data-hypen-type="row"]:has(> [data-hypen-flex]) {
74
- width: 100%;
75
- }
76
- `;
77
- document.head.appendChild(style);
78
- }
79
- var rowStylesInjected = false, rowHandler;
80
- var init_row = __esm(() => {
81
- rowHandler = {
82
- create() {
83
- ensureRowStyles();
84
- const el = document.createElement("div");
85
- el.style.display = "flex";
86
- el.style.flexDirection = "row";
87
- el.style.alignItems = "flex-start";
88
- el.dataset.hypenType = "row";
89
- return el;
90
- }
91
- };
92
- });
93
-
94
- // src/dom/components/text.ts
95
- var exports_text = {};
96
- __export(exports_text, {
97
- textHandler: () => textHandler
98
- });
99
- var textHandler;
100
- var init_text = __esm(() => {
101
- textHandler = {
102
- create() {
103
- const el = document.createElement("span");
104
- el.style.display = "inline-block";
105
- el.style.lineHeight = "1";
106
- el.style.verticalAlign = "top";
107
- el.style.margin = "0";
108
- el.style.padding = "0";
109
- el.dataset.hypenType = "text";
110
- return el;
111
- },
112
- applyProps(el, props) {
113
- const text = props["0"] || props.text;
114
- if (text !== undefined) {
115
- el.dataset.textTemplate = String(text);
116
- el.textContent = String(text);
117
- }
118
- }
119
- };
120
- });
121
-
122
- // src/dom/components/image.ts
123
- var exports_image = {};
124
- __export(exports_image, {
125
- imageHandler: () => imageHandler
126
- });
127
- var imageHandler;
128
- var init_image = __esm(() => {
129
- imageHandler = {
130
- create() {
131
- const el = document.createElement("img");
132
- el.dataset.hypenType = "image";
133
- return el;
134
- },
135
- applyProps(el, props) {
136
- const img = el;
137
- const src = props["0"] || props.url || props.src;
138
- if (src !== undefined) {
139
- img.src = String(src);
140
- }
141
- if (props.alt !== undefined) {
142
- img.alt = String(props.alt);
143
- }
144
- }
145
- };
146
- });
147
-
148
- // src/dom/components/button.ts
149
- var exports_button = {};
150
- __export(exports_button, {
151
- buttonHandler: () => buttonHandler
152
- });
153
- var buttonHandler;
154
- var init_button = __esm(() => {
155
- buttonHandler = {
156
- create() {
157
- const el = document.createElement("button");
158
- el.style.border = "none";
159
- el.style.background = "none";
160
- el.style.padding = "0";
161
- el.style.margin = "0";
162
- el.style.font = "inherit";
163
- el.style.color = "inherit";
164
- el.style.cursor = "pointer";
165
- el.style.display = "flex";
166
- el.style.flexDirection = "column";
167
- el.style.alignItems = "flex-start";
168
- el.dataset.hypenType = "button";
169
- return el;
170
- }
171
- };
172
- });
173
-
174
- // src/dom/components/container.ts
175
- var exports_container = {};
176
- __export(exports_container, {
177
- containerHandler: () => containerHandler
178
- });
179
- var containerHandler;
180
- var init_container = __esm(() => {
181
- containerHandler = {
182
- create() {
183
- const el = document.createElement("div");
184
- el.dataset.hypenType = "container";
185
- return el;
186
- }
187
- };
188
- });
189
-
190
- // src/dom/components/center.ts
191
- var exports_center = {};
192
- __export(exports_center, {
193
- centerHandler: () => centerHandler
194
- });
195
- var centerHandler;
196
- var init_center = __esm(() => {
197
- centerHandler = {
198
- create() {
199
- const el = document.createElement("div");
200
- el.style.display = "flex";
201
- el.style.alignItems = "center";
202
- el.style.justifyContent = "center";
203
- el.style.width = "100%";
204
- el.style.height = "100%";
205
- el.style.alignSelf = "stretch";
206
- el.dataset.hypenType = "center";
207
- return el;
208
- }
209
- };
210
- });
211
-
212
- // src/dom/components/list.ts
213
- var exports_list = {};
214
- __export(exports_list, {
215
- listHandler: () => listHandler
216
- });
217
- var listHandler;
218
- var init_list = __esm(() => {
219
- listHandler = {
220
- create() {
221
- const el = document.createElement("div");
222
- el.style.display = "flex";
223
- el.style.flexDirection = "column";
224
- el.style.alignItems = "flex-start";
225
- el.style.overflow = "auto";
226
- el.dataset.hypenType = "list";
227
- return el;
228
- },
229
- applyProps(el, props) {
230
- const direction = props.direction || props["1"] || "vertical";
231
- if (direction === "vertical") {
232
- el.style.flexDirection = "column";
233
- } else {
234
- el.style.flexDirection = "row";
235
- }
236
- if (props.gap !== undefined) {
237
- el.style.gap = typeof props.gap === "number" ? `${props.gap}px` : String(props.gap);
238
- }
239
- }
240
- };
241
- });
242
-
243
- // src/dom/components/input.ts
244
- var exports_input = {};
245
- __export(exports_input, {
246
- inputHandler: () => inputHandler
247
- });
248
- var inputHandler;
249
- var init_input = __esm(() => {
250
- inputHandler = {
251
- create() {
252
- const el = document.createElement("input");
253
- el.dataset.hypenType = "input";
254
- return el;
255
- },
256
- applyProps(el, props) {
257
- const input = el;
258
- if (props.type !== undefined) {
259
- input.type = String(props.type);
260
- }
261
- if (props.placeholder !== undefined) {
262
- input.placeholder = String(props.placeholder);
263
- }
264
- if (props.value !== undefined) {
265
- input.value = String(props.value);
266
- }
267
- }
268
- };
269
- });
270
-
271
- // src/dom/components/link.ts
272
- var exports_link = {};
273
- __export(exports_link, {
274
- linkHandler: () => linkHandler
275
- });
276
- var linkHandler;
277
- var init_link = __esm(() => {
278
- linkHandler = {
279
- create() {
280
- const el = document.createElement("a");
281
- el.dataset.hypenType = "link";
282
- return el;
283
- },
284
- applyProps(el, props) {
285
- const anchor = el;
286
- const href = props["0"] || props.href;
287
- if (href !== undefined) {
288
- anchor.href = String(href);
289
- }
290
- if (props.target !== undefined) {
291
- anchor.target = String(props.target);
292
- }
293
- if (props.rel !== undefined) {
294
- anchor.rel = String(props.rel);
295
- }
296
- }
297
- };
298
- });
299
-
300
- // src/dom/components/textarea.ts
301
- var exports_textarea = {};
302
- __export(exports_textarea, {
303
- textareaHandler: () => textareaHandler
304
- });
305
- var textareaHandler;
306
- var init_textarea = __esm(() => {
307
- textareaHandler = {
308
- create() {
309
- const el = document.createElement("textarea");
310
- el.dataset.hypenType = "textarea";
311
- return el;
312
- },
313
- applyProps(el, props) {
314
- const textarea = el;
315
- const value = props.value ?? props["0"];
316
- if (value !== undefined) {
317
- textarea.value = String(value);
318
- }
319
- if (props.placeholder !== undefined) {
320
- textarea.placeholder = String(props.placeholder);
321
- }
322
- if (props.rows !== undefined) {
323
- textarea.rows = Number(props.rows);
324
- }
325
- if (props.cols !== undefined) {
326
- textarea.cols = Number(props.cols);
327
- }
328
- if (props.disabled !== undefined) {
329
- textarea.disabled = Boolean(props.disabled);
330
- }
331
- if (props.readonly !== undefined) {
332
- textarea.readOnly = Boolean(props.readonly);
333
- }
334
- }
335
- };
336
- });
337
-
338
- // src/dom/components/checkbox.ts
339
- var exports_checkbox = {};
340
- __export(exports_checkbox, {
341
- checkboxHandler: () => checkboxHandler
342
- });
343
- var checkboxHandler;
344
- var init_checkbox = __esm(() => {
345
- checkboxHandler = {
346
- create() {
347
- const wrapper = document.createElement("label");
348
- wrapper.dataset.hypenType = "checkbox";
349
- wrapper.style.display = "inline-flex";
350
- wrapper.style.alignItems = "center";
351
- wrapper.style.gap = "8px";
352
- wrapper.style.cursor = "pointer";
353
- const input = document.createElement("input");
354
- input.type = "checkbox";
355
- input.dataset.hypenCheckbox = "true";
356
- wrapper.appendChild(input);
357
- return wrapper;
358
- },
359
- applyProps(el, props) {
360
- const input = el.querySelector('input[type="checkbox"]');
361
- if (!input)
362
- return;
363
- if (props.checked !== undefined) {
364
- input.checked = Boolean(props.checked);
365
- }
366
- if (props.disabled !== undefined) {
367
- input.disabled = Boolean(props.disabled);
368
- }
369
- const label = props["0"] || props.label;
370
- if (label !== undefined) {
371
- const textNodes = Array.from(el.childNodes).filter((node) => node.nodeType === Node.TEXT_NODE);
372
- textNodes.forEach((node) => node.remove());
373
- el.appendChild(document.createTextNode(String(label)));
374
- }
375
- }
376
- };
377
- });
378
-
379
- // src/dom/components/select.ts
380
- var exports_select = {};
381
- __export(exports_select, {
382
- selectHandler: () => selectHandler
383
- });
384
- var selectHandler;
385
- var init_select = __esm(() => {
386
- selectHandler = {
387
- create() {
388
- const el = document.createElement("select");
389
- el.dataset.hypenType = "select";
390
- return el;
391
- },
392
- applyProps(el, props) {
393
- const select = el;
394
- if (props.value !== undefined) {
395
- select.value = String(props.value);
396
- }
397
- if (props.disabled !== undefined) {
398
- select.disabled = Boolean(props.disabled);
399
- }
400
- if (props.multiple !== undefined) {
401
- select.multiple = Boolean(props.multiple);
402
- }
403
- if (props.options && Array.isArray(props.options)) {
404
- select.innerHTML = "";
405
- props.options.forEach((opt) => {
406
- const option = document.createElement("option");
407
- if (typeof opt === "string") {
408
- option.value = opt;
409
- option.textContent = opt;
410
- } else if (typeof opt === "object") {
411
- option.value = String(opt.value ?? opt.label ?? "");
412
- option.textContent = String(opt.label ?? opt.value ?? "");
413
- if (opt.disabled)
414
- option.disabled = true;
415
- }
416
- select.appendChild(option);
417
- });
418
- }
419
- }
420
- };
421
- });
422
-
423
- // src/dom/components/spacer.ts
424
- var exports_spacer = {};
425
- __export(exports_spacer, {
426
- spacerHandler: () => spacerHandler
427
- });
428
- var spacerHandler;
429
- var init_spacer = __esm(() => {
430
- spacerHandler = {
431
- create() {
432
- const el = document.createElement("div");
433
- el.style.flex = "1";
434
- el.dataset.hypenType = "spacer";
435
- return el;
436
- }
437
- };
438
- });
439
-
440
- // src/dom/components/stack.ts
441
- var exports_stack = {};
442
- __export(exports_stack, {
443
- stackHandler: () => stackHandler
444
- });
445
- function ensureStackStyles() {
446
- if (stackStylesInjected)
447
- return;
448
- stackStylesInjected = true;
449
- const style = document.createElement("style");
450
- style.id = "hypen-stack-styles";
451
- style.textContent = `
452
- [data-hypen-type="stack"] {
453
- position: relative;
454
- display: grid;
455
- grid-template-areas: "stack";
456
- /* Default alignment: top-left (matching iOS/Android ZStack default) */
457
- justify-items: start;
458
- align-items: start;
459
- /* Ensure Stack participates properly in flex layouts (Row/Column) */
460
- min-width: 0;
461
- min-height: 0;
462
- }
463
- [data-hypen-type="stack"] > * {
464
- grid-area: stack;
465
- /* Don't set justify-self/align-self here - let parent's justify-items/align-items control */
466
- }
467
- `;
468
- document.head.appendChild(style);
469
- }
470
- var stackStylesInjected = false, stackHandler;
471
- var init_stack = __esm(() => {
472
- stackHandler = {
473
- create() {
474
- ensureStackStyles();
475
- const el = document.createElement("div");
476
- el.dataset.hypenType = "stack";
477
- return el;
478
- }
479
- };
480
- });
481
-
482
- // src/dom/components/divider.ts
483
- var exports_divider = {};
484
- __export(exports_divider, {
485
- dividerHandler: () => dividerHandler
486
- });
487
- var dividerHandler;
488
- var init_divider = __esm(() => {
489
- dividerHandler = {
490
- create() {
491
- const el = document.createElement("hr");
492
- el.dataset.hypenType = "divider";
493
- el.style.border = "none";
494
- el.style.borderTop = "1px solid #e0e0e0";
495
- el.style.margin = "0";
496
- return el;
497
- },
498
- applyProps(el, props) {
499
- if (props.thickness !== undefined) {
500
- const thickness = typeof props.thickness === "number" ? `${props.thickness}px` : String(props.thickness);
501
- el.style.borderTopWidth = thickness;
502
- }
503
- if (props.orientation === "vertical") {
504
- el.style.borderTop = "none";
505
- el.style.borderLeft = "1px solid #e0e0e0";
506
- el.style.height = "100%";
507
- el.style.width = "0";
508
- el.style.display = "inline-block";
509
- }
510
- }
511
- };
512
- });
513
-
514
- // src/dom/components/grid.ts
515
- var exports_grid = {};
516
- __export(exports_grid, {
517
- gridHandler: () => gridHandler
518
- });
519
- function ensureGridStyles() {
520
- if (gridStylesInjected)
521
- return;
522
- gridStylesInjected = true;
523
- const style = document.createElement("style");
524
- style.id = "hypen-grid-styles";
525
- style.textContent = `
526
- /* Grid children stretch to fill cells by default (matches Android behavior) */
527
- [data-hypen-type="grid"] > * {
528
- justify-self: stretch;
529
- align-self: stretch;
530
- }
531
- `;
532
- document.head.appendChild(style);
533
- }
534
- var gridStylesInjected = false, gridHandler;
535
- var init_grid = __esm(() => {
536
- gridHandler = {
537
- create() {
538
- ensureGridStyles();
539
- const el = document.createElement("div");
540
- el.style.display = "grid";
541
- el.dataset.hypenType = "grid";
542
- return el;
543
- },
544
- applyProps(el, props) {
545
- if (props.columns !== undefined) {
546
- const columns = typeof props.columns === "number" ? `repeat(${props.columns}, 1fr)` : String(props.columns);
547
- el.style.gridTemplateColumns = columns;
548
- }
549
- if (props.rows !== undefined) {
550
- const rows = typeof props.rows === "number" ? `repeat(${props.rows}, 1fr)` : String(props.rows);
551
- el.style.gridTemplateRows = rows;
552
- }
553
- if (props.gap !== undefined) {
554
- const gap = typeof props.gap === "number" ? `${props.gap}px` : String(props.gap);
555
- el.style.gap = gap;
556
- }
557
- }
558
- };
559
- });
560
-
561
- // src/dom/components/card.ts
562
- var exports_card = {};
563
- __export(exports_card, {
564
- cardHandler: () => cardHandler
565
- });
566
- var cardHandler;
567
- var init_card = __esm(() => {
568
- cardHandler = {
569
- create() {
570
- const el = document.createElement("div");
571
- el.dataset.hypenType = "card";
572
- el.style.backgroundColor = "#ffffff";
573
- el.style.borderRadius = "8px";
574
- el.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)";
575
- el.style.padding = "16px";
576
- return el;
577
- }
578
- };
579
- });
580
-
581
- // src/dom/components/heading.ts
582
- var exports_heading = {};
583
- __export(exports_heading, {
584
- headingHandler: () => headingHandler
585
- });
586
- var headingHandler;
587
- var init_heading = __esm(() => {
588
- headingHandler = {
589
- create() {
590
- const el = document.createElement("h2");
591
- el.dataset.hypenType = "heading";
592
- return el;
593
- },
594
- applyProps(el, props) {
595
- if (props.level !== undefined) {
596
- const level = Math.max(1, Math.min(6, Number(props.level)));
597
- const newEl = document.createElement(`h${level}`);
598
- newEl.dataset.hypenType = "heading";
599
- newEl.innerHTML = el.innerHTML;
600
- Array.from(el.attributes).forEach((attr) => {
601
- newEl.setAttribute(attr.name, attr.value);
602
- });
603
- if (el.parentNode) {
604
- el.parentNode.replaceChild(newEl, el);
605
- }
606
- }
607
- const text = props["0"] || props.text;
608
- if (text !== undefined) {
609
- el.textContent = String(text);
610
- }
611
- }
612
- };
613
- });
614
-
615
- // src/dom/components/switch.ts
616
- var exports_switch = {};
617
- __export(exports_switch, {
618
- switchHandler: () => switchHandler
619
- });
620
- var switchHandler;
621
- var init_switch = __esm(() => {
622
- switchHandler = {
623
- create() {
624
- const wrapper = document.createElement("label");
625
- wrapper.dataset.hypenType = "switch";
626
- wrapper.style.display = "inline-flex";
627
- wrapper.style.alignItems = "center";
628
- wrapper.style.gap = "8px";
629
- wrapper.style.cursor = "pointer";
630
- const input = document.createElement("input");
631
- input.type = "checkbox";
632
- input.dataset.hypenSwitch = "true";
633
- input.style.appearance = "none";
634
- input.style.width = "44px";
635
- input.style.height = "24px";
636
- input.style.backgroundColor = "#ccc";
637
- input.style.borderRadius = "12px";
638
- input.style.position = "relative";
639
- input.style.cursor = "pointer";
640
- input.style.transition = "background-color 0.2s";
641
- const style = document.createElement("style");
642
- style.textContent = `
643
- input[data-hypen-switch="true"]::before {
644
- content: "";
645
- position: absolute;
646
- width: 20px;
647
- height: 20px;
648
- background-color: white;
649
- border-radius: 50%;
650
- top: 2px;
651
- left: 2px;
652
- transition: transform 0.2s;
653
- }
654
- input[data-hypen-switch="true"]:checked {
655
- background-color: #4CAF50;
656
- }
657
- input[data-hypen-switch="true"]:checked::before {
658
- transform: translateX(20px);
659
- }
660
- `;
661
- wrapper.appendChild(style);
662
- wrapper.appendChild(input);
663
- return wrapper;
664
- },
665
- applyProps(el, props) {
666
- const input = el.querySelector('input[type="checkbox"]');
667
- if (!input)
668
- return;
669
- if (props.on !== undefined) {
670
- input.checked = Boolean(props.on);
671
- }
672
- if (props.disabled !== undefined) {
673
- input.disabled = Boolean(props.disabled);
674
- }
675
- const label = props["0"] || props.label;
676
- if (label !== undefined) {
677
- const textNodes = Array.from(el.childNodes).filter((node) => node.nodeType === Node.TEXT_NODE);
678
- textNodes.forEach((node) => node.remove());
679
- el.appendChild(document.createTextNode(String(label)));
680
- }
681
- }
682
- };
683
- });
684
-
685
- // src/dom/components/slider.ts
686
- var exports_slider = {};
687
- __export(exports_slider, {
688
- sliderHandler: () => sliderHandler
689
- });
690
- var sliderHandler;
691
- var init_slider = __esm(() => {
692
- sliderHandler = {
693
- create() {
694
- const el = document.createElement("input");
695
- el.type = "range";
696
- el.dataset.hypenType = "slider";
697
- return el;
698
- },
699
- applyProps(el, props) {
700
- const input = el;
701
- if (props.value !== undefined) {
702
- input.value = String(props.value);
703
- }
704
- if (props.min !== undefined) {
705
- input.min = String(props.min);
706
- }
707
- if (props.max !== undefined) {
708
- input.max = String(props.max);
709
- }
710
- if (props.step !== undefined) {
711
- input.step = String(props.step);
712
- }
713
- if (props.disabled !== undefined) {
714
- input.disabled = Boolean(props.disabled);
715
- }
716
- }
717
- };
718
- });
719
-
720
- // src/dom/components/spinner.ts
721
- var exports_spinner = {};
722
- __export(exports_spinner, {
723
- spinnerHandler: () => spinnerHandler
724
- });
725
- var spinnerHandler;
726
- var init_spinner = __esm(() => {
727
- spinnerHandler = {
728
- create() {
729
- const wrapper = document.createElement("div");
730
- wrapper.dataset.hypenType = "spinner";
731
- wrapper.style.display = "inline-block";
732
- const spinner = document.createElement("div");
733
- spinner.style.width = "40px";
734
- spinner.style.height = "40px";
735
- spinner.style.border = "4px solid #f3f3f3";
736
- spinner.style.borderTop = "4px solid #3498db";
737
- spinner.style.borderRadius = "50%";
738
- spinner.style.animation = "spin 1s linear infinite";
739
- const style = document.createElement("style");
740
- style.textContent = `
741
- @keyframes spin {
742
- 0% { transform: rotate(0deg); }
743
- 100% { transform: rotate(360deg); }
744
- }
745
- `;
746
- wrapper.appendChild(style);
747
- wrapper.appendChild(spinner);
748
- return wrapper;
749
- },
750
- applyProps(el, props) {
751
- const spinner = el.querySelector("div:not(style)");
752
- if (!spinner)
753
- return;
754
- if (props.size !== undefined) {
755
- const size = String(props.size);
756
- const sizeMap = {
757
- small: "24px",
758
- medium: "40px",
759
- large: "60px"
760
- };
761
- const actualSize = sizeMap[size] || size;
762
- spinner.style.width = actualSize;
763
- spinner.style.height = actualSize;
764
- }
765
- if (props.color !== undefined) {
766
- spinner.style.borderTopColor = String(props.color);
767
- }
768
- }
769
- };
770
- });
771
-
772
- // src/dom/components/badge.ts
773
- var exports_badge = {};
774
- __export(exports_badge, {
775
- badgeHandler: () => badgeHandler
776
- });
777
- var badgeHandler;
778
- var init_badge = __esm(() => {
779
- badgeHandler = {
780
- create() {
781
- const el = document.createElement("span");
782
- el.dataset.hypenType = "badge";
783
- el.style.display = "inline-block";
784
- el.style.padding = "4px 8px";
785
- el.style.borderRadius = "4px";
786
- el.style.fontSize = "12px";
787
- el.style.fontWeight = "600";
788
- el.style.backgroundColor = "#e0e0e0";
789
- el.style.color = "#333";
790
- return el;
791
- },
792
- applyProps(el, props) {
793
- if (props.theme !== undefined) {
794
- const theme = String(props.theme);
795
- const themeColors = {
796
- success: { bg: "#4CAF50", color: "#fff" },
797
- error: { bg: "#f44336", color: "#fff" },
798
- warning: { bg: "#ff9800", color: "#fff" },
799
- info: { bg: "#2196F3", color: "#fff" },
800
- default: { bg: "#e0e0e0", color: "#333" }
801
- };
802
- const colors = themeColors[theme] || themeColors.default;
803
- el.style.backgroundColor = colors.bg;
804
- el.style.color = colors.color;
805
- }
806
- const text = props["0"] || props.text;
807
- if (text !== undefined) {
808
- el.textContent = String(text);
809
- }
810
- }
811
- };
812
- });
813
-
814
- // src/dom/components/avatar.ts
815
- var exports_avatar = {};
816
- __export(exports_avatar, {
817
- avatarHandler: () => avatarHandler
818
- });
819
- var avatarHandler;
820
- var init_avatar = __esm(() => {
821
- avatarHandler = {
822
- create() {
823
- const el = document.createElement("div");
824
- el.dataset.hypenType = "avatar";
825
- el.style.display = "inline-flex";
826
- el.style.alignItems = "center";
827
- el.style.justifyContent = "center";
828
- el.style.width = "40px";
829
- el.style.height = "40px";
830
- el.style.borderRadius = "50%";
831
- el.style.backgroundColor = "#9e9e9e";
832
- el.style.color = "#fff";
833
- el.style.fontSize = "16px";
834
- el.style.fontWeight = "600";
835
- el.style.overflow = "hidden";
836
- return el;
837
- },
838
- applyProps(el, props) {
839
- const src = props["src.0"] || props["0"] || props.src || props.source;
840
- if (src !== undefined) {
841
- const img = document.createElement("img");
842
- img.src = String(src);
843
- img.style.width = "100%";
844
- img.style.height = "100%";
845
- img.style.objectFit = "cover";
846
- el.innerHTML = "";
847
- el.appendChild(img);
848
- } else if (props.initials !== undefined) {
849
- el.textContent = String(props.initials).toUpperCase();
850
- }
851
- if (props.size !== undefined) {
852
- const size = typeof props.size === "number" ? `${props.size}px` : String(props.size);
853
- el.style.width = size;
854
- el.style.height = size;
855
- }
856
- }
857
- };
858
- });
859
-
860
- // src/dom/components/progressbar.ts
861
- var exports_progressbar = {};
862
- __export(exports_progressbar, {
863
- progressBarHandler: () => progressBarHandler
864
- });
865
- var progressBarHandler;
866
- var init_progressbar = __esm(() => {
867
- progressBarHandler = {
868
- create() {
869
- const wrapper = document.createElement("div");
870
- wrapper.dataset.hypenType = "progressbar";
871
- wrapper.style.width = "100%";
872
- wrapper.style.height = "8px";
873
- wrapper.style.backgroundColor = "#e0e0e0";
874
- wrapper.style.borderRadius = "4px";
875
- wrapper.style.overflow = "hidden";
876
- const bar = document.createElement("div");
877
- bar.dataset.hypenBar = "true";
878
- bar.style.height = "100%";
879
- bar.style.backgroundColor = "#2196F3";
880
- bar.style.transition = "width 0.3s ease";
881
- bar.style.width = "0%";
882
- wrapper.appendChild(bar);
883
- return wrapper;
884
- },
885
- applyProps(el, props) {
886
- const bar = el.querySelector('[data-hypen-bar="true"]');
887
- if (!bar)
888
- return;
889
- const value = Number(props.value || 0);
890
- const max = Number(props.max || 100);
891
- const percentage = Math.min(100, Math.max(0, value / max * 100));
892
- bar.style.width = `${percentage}%`;
893
- if (props.color !== undefined) {
894
- bar.style.backgroundColor = String(props.color);
895
- }
896
- if (props.height !== undefined) {
897
- const height = typeof props.height === "number" ? `${props.height}px` : String(props.height);
898
- el.style.height = height;
899
- }
900
- }
901
- };
902
- });
903
-
904
- // src/dom/components/video.ts
905
- var exports_video = {};
906
- __export(exports_video, {
907
- videoHandler: () => videoHandler
908
- });
909
- var videoHandler;
910
- var init_video = __esm(() => {
911
- videoHandler = {
912
- create() {
913
- const el = document.createElement("video");
914
- el.dataset.hypenType = "video";
915
- return el;
916
- },
917
- applyProps(el, props) {
918
- const video = el;
919
- const src = props["0"] || props.src;
920
- if (src !== undefined) {
921
- video.src = String(src);
922
- }
923
- if (props.controls !== undefined) {
924
- video.controls = Boolean(props.controls);
925
- }
926
- if (props.autoplay !== undefined) {
927
- video.autoplay = Boolean(props.autoplay);
928
- }
929
- if (props.loop !== undefined) {
930
- video.loop = Boolean(props.loop);
931
- }
932
- if (props.muted !== undefined) {
933
- video.muted = Boolean(props.muted);
934
- }
935
- if (props.poster !== undefined) {
936
- video.poster = String(props.poster);
937
- }
938
- }
939
- };
940
- });
941
-
942
- // src/dom/components/audio.ts
943
- var exports_audio = {};
944
- __export(exports_audio, {
945
- audioHandler: () => audioHandler
946
- });
947
- var audioHandler;
948
- var init_audio = __esm(() => {
949
- audioHandler = {
950
- create() {
951
- const el = document.createElement("audio");
952
- el.dataset.hypenType = "audio";
953
- return el;
954
- },
955
- applyProps(el, props) {
956
- const audio = el;
957
- const src = props["0"] || props.src;
958
- if (src !== undefined) {
959
- audio.src = String(src);
960
- }
961
- if (props.controls !== undefined) {
962
- audio.controls = Boolean(props.controls);
963
- }
964
- if (props.autoplay !== undefined) {
965
- audio.autoplay = Boolean(props.autoplay);
966
- }
967
- if (props.loop !== undefined) {
968
- audio.loop = Boolean(props.loop);
969
- }
970
- if (props.muted !== undefined) {
971
- audio.muted = Boolean(props.muted);
972
- }
973
- }
974
- };
975
- });
976
-
977
- // src/dom/components/paragraph.ts
978
- var exports_paragraph = {};
979
- __export(exports_paragraph, {
980
- paragraphHandler: () => paragraphHandler
981
- });
982
- var paragraphHandler;
983
- var init_paragraph = __esm(() => {
984
- paragraphHandler = {
985
- create() {
986
- const el = document.createElement("p");
987
- el.dataset.hypenType = "paragraph";
988
- return el;
989
- },
990
- applyProps(el, props) {
991
- const text = props["0"] || props.text;
992
- if (text !== undefined) {
993
- el.textContent = String(text);
994
- }
995
- }
996
- };
997
- });
998
-
999
- // src/dom/components/router.ts
1000
- var exports_router = {};
1001
- __export(exports_router, {
1002
- routerHandler: () => routerHandler
1003
- });
1004
- var routerHandler;
1005
- var init_router = __esm(() => {
1006
- routerHandler = {
1007
- create() {
1008
- const el = document.createElement("div");
1009
- el.style.display = "flex";
1010
- el.style.flexDirection = "column";
1011
- el.style.width = "100%";
1012
- el.dataset.hypenType = "router";
1013
- return el;
1014
- },
1015
- applyProps(el, props) {}
1016
- };
1017
- });
1018
-
1019
- // src/dom/components/route.ts
1020
- var exports_route = {};
1021
- __export(exports_route, {
1022
- routeHandler: () => routeHandler
1023
- });
1024
- import { frameworkLoggers } from "@hypen-space/core/logger";
1025
- var log, routeHandler;
1026
- var init_route = __esm(() => {
1027
- log = frameworkLoggers.router;
1028
- routeHandler = {
1029
- create() {
1030
- const el = document.createElement("div");
1031
- el.style.display = "flex";
1032
- el.style.flexDirection = "column";
1033
- el.style.width = "100%";
1034
- el.dataset.hypenType = "route";
1035
- el.dataset.routeRendered = "false";
1036
- return el;
1037
- },
1038
- applyProps(el, props) {
1039
- const path = props.path || props["0"] || "/";
1040
- el.dataset.routePath = String(path);
1041
- const isLazy = props.__lazy === true;
1042
- el.dataset.routeLazy = String(isLazy);
1043
- const componentName = props.component || props.__lazy_child;
1044
- if (componentName) {
1045
- el.dataset.routeComponent = String(componentName);
1046
- }
1047
- log.debug(`Route created: path="${path}", lazy=${isLazy}, component="${el.dataset.routeComponent || "none"}"`);
1048
- }
1049
- };
1050
- });
1051
-
1052
- // src/dom/components/hypenapp.ts
1053
- var exports_hypenapp = {};
1054
- __export(exports_hypenapp, {
1055
- hypenAppHandler: () => hypenAppHandler,
1056
- disconnectHypenApp: () => disconnectHypenApp
1057
- });
1058
- import { RemoteEngine } from "@hypen-space/core/remote/client";
1059
- import { frameworkLoggers as frameworkLoggers2 } from "@hypen-space/core/logger";
1060
- function applyPatches(container, nodes, patches, engine, onRoot) {
1061
- for (const patch of patches) {
1062
- switch (patch.type) {
1063
- case "create": {
1064
- const el = createElement(patch.elementType, patch.props || {});
1065
- el.dataset.hypenId = patch.id;
1066
- el.__hypenEngine = engine;
1067
- nodes.set(patch.id, el);
1068
- break;
1069
- }
1070
- case "setProp": {
1071
- const el = nodes.get(patch.id);
1072
- if (el) {
1073
- applyProp(el, patch.name, patch.value);
1
+ /**
2
+ * Component Registry
3
+ *
4
+ * Manages mappings from Hypen component types to DOM elements
5
+ */
6
+ export class ComponentRegistry {
7
+ handlers = new Map();
8
+ constructor() {
9
+ this.registerDefaults();
10
+ }
11
+ /**
12
+ * Register a component handler
13
+ */
14
+ register(type, handler) {
15
+ this.handlers.set(type.toLowerCase(), handler);
16
+ }
17
+ /**
18
+ * Get handler for a component type
19
+ */
20
+ get(type) {
21
+ if (!type)
22
+ return undefined;
23
+ return this.handlers.get(type.toLowerCase());
24
+ }
25
+ /**
26
+ * Create element for a component type
27
+ */
28
+ createElement(type, props = {}) {
29
+ if (!type)
30
+ return null;
31
+ const handler = this.get(type);
32
+ if (!handler)
33
+ return null;
34
+ const element = handler.create();
35
+ if (handler.applyProps) {
36
+ handler.applyProps(element, props);
1074
37
  }
1075
- break;
1076
- }
1077
- case "setText": {
1078
- const el = nodes.get(patch.id);
1079
- if (el) {
1080
- el.textContent = patch.text;
1081
- }
1082
- break;
1083
- }
1084
- case "insert": {
1085
- const parentId = patch.parentId;
1086
- const parent = parentId === "root" ? container : nodes.get(parentId);
1087
- const child = nodes.get(patch.id);
1088
- const beforeId = patch.beforeId;
1089
- if (parent && child) {
1090
- if (parentId === "root") {
1091
- onRoot(patch.id);
1092
- }
1093
- if (beforeId) {
1094
- const before = nodes.get(beforeId);
1095
- if (before && before.parentNode === parent) {
1096
- parent.insertBefore(child, before);
1097
- } else if (!parent.contains(child)) {
1098
- parent.appendChild(child);
1099
- }
1100
- } else if (!parent.contains(child)) {
1101
- parent.appendChild(child);
1102
- }
1103
- }
1104
- break;
1105
- }
1106
- case "move": {
1107
- const parentId = patch.parentId;
1108
- const parent = parentId === "root" ? container : nodes.get(parentId);
1109
- const child = nodes.get(patch.id);
1110
- const beforeId = patch.beforeId;
1111
- if (parent && child) {
1112
- if (beforeId) {
1113
- const before = nodes.get(beforeId);
1114
- if (before && before.parentNode === parent) {
1115
- parent.insertBefore(child, before);
1116
- }
1117
- } else {
1118
- parent.appendChild(child);
1119
- }
1120
- }
1121
- break;
1122
- }
1123
- case "remove": {
1124
- const el = nodes.get(patch.id);
1125
- if (el && el.parentNode) {
1126
- el.parentNode.removeChild(el);
1127
- }
1128
- nodes.delete(patch.id);
1129
- break;
1130
- }
1131
- }
1132
- }
1133
- }
1134
- function createElement(type, props) {
1135
- const normalizedType = type.toLowerCase();
1136
- const tagMap = {
1137
- column: "div",
1138
- row: "div",
1139
- text: "span",
1140
- button: "button",
1141
- input: "input",
1142
- image: "img",
1143
- container: "div",
1144
- box: "div",
1145
- center: "div",
1146
- list: "div",
1147
- spacer: "div",
1148
- stack: "div",
1149
- divider: "hr",
1150
- grid: "div",
1151
- card: "div",
1152
- heading: "h2",
1153
- link: "a",
1154
- textarea: "textarea",
1155
- checkbox: "input",
1156
- select: "select",
1157
- slider: "input",
1158
- switch: "input",
1159
- spinner: "div",
1160
- badge: "span",
1161
- avatar: "img",
1162
- progressbar: "div",
1163
- video: "video",
1164
- audio: "audio"
1165
- };
1166
- const tag = tagMap[normalizedType] || "div";
1167
- const el = document.createElement(tag);
1168
- el.dataset.hypenType = normalizedType;
1169
- if (normalizedType === "column") {
1170
- el.style.display = "flex";
1171
- el.style.flexDirection = "column";
1172
- } else if (normalizedType === "row") {
1173
- el.style.display = "flex";
1174
- el.style.flexDirection = "row";
1175
- } else if (normalizedType === "center") {
1176
- el.style.display = "flex";
1177
- el.style.alignItems = "center";
1178
- el.style.justifyContent = "center";
1179
- } else if (normalizedType === "text") {
1180
- if (props["0"]) {
1181
- el.textContent = String(props["0"]);
1182
- }
1183
- } else if (normalizedType === "button") {
1184
- el.style.cursor = "pointer";
1185
- } else if (normalizedType === "checkbox" || normalizedType === "switch") {
1186
- el.type = "checkbox";
1187
- } else if (normalizedType === "slider") {
1188
- el.type = "range";
1189
- }
1190
- return el;
1191
- }
1192
- function applyProp(el, name, value) {
1193
- if (name === "0" || name === "text") {
1194
- el.textContent = String(value);
1195
- return;
1196
- }
1197
- const styleProps = {
1198
- padding: "padding",
1199
- margin: "margin",
1200
- backgroundColor: "backgroundColor",
1201
- background: "background",
1202
- color: "color",
1203
- fontSize: "fontSize",
1204
- fontWeight: "fontWeight",
1205
- width: "width",
1206
- height: "height",
1207
- minWidth: "minWidth",
1208
- minHeight: "minHeight",
1209
- maxWidth: "maxWidth",
1210
- maxHeight: "maxHeight",
1211
- borderRadius: "borderRadius",
1212
- border: "border",
1213
- gap: "gap",
1214
- flex: "flex",
1215
- opacity: "opacity",
1216
- overflow: "overflow"
1217
- };
1218
- if (styleProps[name]) {
1219
- const cssValue = typeof value === "number" ? `${value}px` : String(value);
1220
- el.style[styleProps[name]] = cssValue;
1221
- return;
1222
- }
1223
- if (name === "onClick" || name === "onclick") {
1224
- el.onclick = () => {
1225
- const engine = el.__hypenEngine;
1226
- if (engine && typeof value === "string" && value.startsWith("@actions.")) {
1227
- const action = value.replace("@actions.", "");
1228
- engine.dispatchAction(action);
1229
- }
1230
- };
1231
- return;
1232
- }
1233
- el.setAttribute(name, String(value));
1234
- }
1235
- function disconnectHypenApp(element) {
1236
- const instance = activeInstances.get(element);
1237
- if (instance) {
1238
- instance.engine.disconnect();
1239
- activeInstances.delete(element);
1240
- }
1241
- }
1242
- var log2, activeInstances, hypenAppHandler;
1243
- var init_hypenapp = __esm(() => {
1244
- log2 = frameworkLoggers2.remote;
1245
- activeInstances = new WeakMap;
1246
- hypenAppHandler = {
1247
- create() {
1248
- const el = document.createElement("div");
1249
- el.dataset.hypenType = "hypenapp";
1250
- el.style.display = "contents";
1251
- return el;
1252
- },
1253
- applyProps(element, props) {
1254
- const url = props["0"] || props.url;
1255
- if (!url || typeof url !== "string") {
1256
- log2.error("HypenApp: URL is required");
1257
- element.innerHTML = '<div style="color: red;">HypenApp: URL required</div>';
1258
- return;
1259
- }
1260
- const existing = activeInstances.get(element);
1261
- if (existing) {
1262
- return;
1263
- }
1264
- const engine = new RemoteEngine(url, {
1265
- autoReconnect: props.autoReconnect ?? true,
1266
- reconnectInterval: props.reconnectInterval ?? 3000,
1267
- maxReconnectAttempts: props.maxReconnectAttempts ?? 10
1268
- });
1269
- const nodes = new Map;
1270
- let rootId = null;
1271
- activeInstances.set(element, { engine, nodes });
1272
- engine.onPatches((patches) => {
1273
- applyPatches(element, nodes, patches, engine, (id) => {
1274
- if (!rootId)
1275
- rootId = id;
1276
- });
1277
- });
1278
- element.innerHTML = '<div class="hypen-app-loading">Connecting...</div>';
1279
- engine.connect().then(() => {
1280
- element.innerHTML = "";
1281
- log2.debug(`HypenApp connected to ${url}`);
1282
- }).catch((error) => {
1283
- element.innerHTML = `<div style="color: red;">HypenApp: Connection failed - ${error.message}</div>`;
1284
- log2.error("HypenApp connection failed:", error);
1285
- });
1286
- engine.onDisconnect(() => {
1287
- log2.debug("HypenApp disconnected");
1288
- });
1289
- engine.onError((error) => {
1290
- log2.error("HypenApp error:", error);
1291
- });
1292
- const observer = new MutationObserver((mutations) => {
1293
- for (const mutation of mutations) {
1294
- for (const removedNode of mutation.removedNodes) {
1295
- if (removedNode === element || removedNode.contains?.(element)) {
1296
- engine.disconnect();
1297
- activeInstances.delete(element);
1298
- observer.disconnect();
1299
- log2.debug("HypenApp cleaned up");
1300
- return;
1301
- }
1302
- }
1303
- }
1304
- });
1305
- if (element.parentNode) {
1306
- observer.observe(element.parentNode, { childList: true, subtree: true });
1307
- }
1308
- }
1309
- };
1310
- });
1311
-
1312
- // src/dom/components/app.ts
1313
- var exports_app = {};
1314
- __export(exports_app, {
1315
- appHandler: () => appHandler
1316
- });
1317
- var appHandler;
1318
- var init_app = __esm(() => {
1319
- appHandler = {
1320
- create() {
1321
- const el = document.createElement("div");
1322
- el.style.display = "flex";
1323
- el.style.flexDirection = "column";
1324
- el.style.minHeight = "100vh";
1325
- el.style.width = "100%";
1326
- el.dataset.hypenType = "app";
1327
- return el;
1328
- }
1329
- };
1330
- });
1331
-
1332
- // src/dom/components/index.ts
1333
- class ComponentRegistry {
1334
- handlers = new Map;
1335
- constructor() {
1336
- this.registerDefaults();
1337
- }
1338
- register(type, handler) {
1339
- this.handlers.set(type.toLowerCase(), handler);
1340
- }
1341
- get(type) {
1342
- if (!type)
1343
- return;
1344
- return this.handlers.get(type.toLowerCase());
1345
- }
1346
- createElement(type, props = {}) {
1347
- if (!type)
1348
- return null;
1349
- const handler = this.get(type);
1350
- if (!handler)
1351
- return null;
1352
- const element = handler.create();
1353
- if (handler.applyProps) {
1354
- handler.applyProps(element, props);
38
+ return element;
39
+ }
40
+ /**
41
+ * Register all default Hypen components
42
+ */
43
+ registerDefaults() {
44
+ // Import and register all component handlers
45
+ const { columnHandler } = require("./column.js");
46
+ const { rowHandler } = require("./row.js");
47
+ const { textHandler } = require("./text.js");
48
+ const { imageHandler } = require("./image.js");
49
+ const { buttonHandler } = require("./button.js");
50
+ const { containerHandler } = require("./container.js");
51
+ const { centerHandler } = require("./center.js");
52
+ const { listHandler } = require("./list.js");
53
+ const { inputHandler } = require("./input.js");
54
+ const { linkHandler } = require("./link.js");
55
+ const { textareaHandler } = require("./textarea.js");
56
+ const { checkboxHandler } = require("./checkbox.js");
57
+ const { selectHandler } = require("./select.js");
58
+ const { spacerHandler } = require("./spacer.js");
59
+ const { stackHandler } = require("./stack.js");
60
+ const { dividerHandler } = require("./divider.js");
61
+ const { gridHandler } = require("./grid.js");
62
+ const { cardHandler } = require("./card.js");
63
+ const { headingHandler } = require("./heading.js");
64
+ const { switchHandler } = require("./switch.js");
65
+ const { sliderHandler } = require("./slider.js");
66
+ const { spinnerHandler } = require("./spinner.js");
67
+ const { badgeHandler } = require("./badge.js");
68
+ const { avatarHandler } = require("./avatar.js");
69
+ const { progressBarHandler } = require("./progressbar.js");
70
+ const { videoHandler } = require("./video.js");
71
+ const { audioHandler } = require("./audio.js");
72
+ const { paragraphHandler } = require("./paragraph.js");
73
+ const { routerHandler } = require("./router.js");
74
+ const { routeHandler } = require("./route.js");
75
+ const { hypenAppHandler } = require("./hypenapp.js");
76
+ const { appHandler } = require("./app.js");
77
+ this.register("app", appHandler);
78
+ this.register("column", columnHandler);
79
+ this.register("row", rowHandler);
80
+ this.register("text", textHandler);
81
+ this.register("image", imageHandler);
82
+ this.register("button", buttonHandler);
83
+ this.register("container", containerHandler);
84
+ this.register("box", containerHandler);
85
+ this.register("center", centerHandler);
86
+ this.register("list", listHandler);
87
+ this.register("input", inputHandler);
88
+ this.register("link", linkHandler);
89
+ this.register("textarea", textareaHandler);
90
+ this.register("checkbox", checkboxHandler);
91
+ this.register("select", selectHandler);
92
+ this.register("spacer", spacerHandler);
93
+ this.register("stack", stackHandler);
94
+ this.register("divider", dividerHandler);
95
+ this.register("grid", gridHandler);
96
+ this.register("card", cardHandler);
97
+ this.register("heading", headingHandler);
98
+ this.register("switch", switchHandler);
99
+ this.register("slider", sliderHandler);
100
+ this.register("spinner", spinnerHandler);
101
+ this.register("badge", badgeHandler);
102
+ this.register("avatar", avatarHandler);
103
+ this.register("progressbar", progressBarHandler);
104
+ this.register("video", videoHandler);
105
+ this.register("audio", audioHandler);
106
+ this.register("paragraph", paragraphHandler);
107
+ this.register("router", routerHandler);
108
+ this.register("route", routeHandler);
109
+ this.register("hypenapp", hypenAppHandler);
1355
110
  }
1356
- return element;
1357
- }
1358
- registerDefaults() {
1359
- const { columnHandler: columnHandler2 } = (init_column(), __toCommonJS(exports_column));
1360
- const { rowHandler: rowHandler2 } = (init_row(), __toCommonJS(exports_row));
1361
- const { textHandler: textHandler2 } = (init_text(), __toCommonJS(exports_text));
1362
- const { imageHandler: imageHandler2 } = (init_image(), __toCommonJS(exports_image));
1363
- const { buttonHandler: buttonHandler2 } = (init_button(), __toCommonJS(exports_button));
1364
- const { containerHandler: containerHandler2 } = (init_container(), __toCommonJS(exports_container));
1365
- const { centerHandler: centerHandler2 } = (init_center(), __toCommonJS(exports_center));
1366
- const { listHandler: listHandler2 } = (init_list(), __toCommonJS(exports_list));
1367
- const { inputHandler: inputHandler2 } = (init_input(), __toCommonJS(exports_input));
1368
- const { linkHandler: linkHandler2 } = (init_link(), __toCommonJS(exports_link));
1369
- const { textareaHandler: textareaHandler2 } = (init_textarea(), __toCommonJS(exports_textarea));
1370
- const { checkboxHandler: checkboxHandler2 } = (init_checkbox(), __toCommonJS(exports_checkbox));
1371
- const { selectHandler: selectHandler2 } = (init_select(), __toCommonJS(exports_select));
1372
- const { spacerHandler: spacerHandler2 } = (init_spacer(), __toCommonJS(exports_spacer));
1373
- const { stackHandler: stackHandler2 } = (init_stack(), __toCommonJS(exports_stack));
1374
- const { dividerHandler: dividerHandler2 } = (init_divider(), __toCommonJS(exports_divider));
1375
- const { gridHandler: gridHandler2 } = (init_grid(), __toCommonJS(exports_grid));
1376
- const { cardHandler: cardHandler2 } = (init_card(), __toCommonJS(exports_card));
1377
- const { headingHandler: headingHandler2 } = (init_heading(), __toCommonJS(exports_heading));
1378
- const { switchHandler: switchHandler2 } = (init_switch(), __toCommonJS(exports_switch));
1379
- const { sliderHandler: sliderHandler2 } = (init_slider(), __toCommonJS(exports_slider));
1380
- const { spinnerHandler: spinnerHandler2 } = (init_spinner(), __toCommonJS(exports_spinner));
1381
- const { badgeHandler: badgeHandler2 } = (init_badge(), __toCommonJS(exports_badge));
1382
- const { avatarHandler: avatarHandler2 } = (init_avatar(), __toCommonJS(exports_avatar));
1383
- const { progressBarHandler: progressBarHandler2 } = (init_progressbar(), __toCommonJS(exports_progressbar));
1384
- const { videoHandler: videoHandler2 } = (init_video(), __toCommonJS(exports_video));
1385
- const { audioHandler: audioHandler2 } = (init_audio(), __toCommonJS(exports_audio));
1386
- const { paragraphHandler: paragraphHandler2 } = (init_paragraph(), __toCommonJS(exports_paragraph));
1387
- const { routerHandler: routerHandler2 } = (init_router(), __toCommonJS(exports_router));
1388
- const { routeHandler: routeHandler2 } = (init_route(), __toCommonJS(exports_route));
1389
- const { hypenAppHandler: hypenAppHandler2 } = (init_hypenapp(), __toCommonJS(exports_hypenapp));
1390
- const { appHandler: appHandler2 } = (init_app(), __toCommonJS(exports_app));
1391
- this.register("app", appHandler2);
1392
- this.register("column", columnHandler2);
1393
- this.register("row", rowHandler2);
1394
- this.register("text", textHandler2);
1395
- this.register("image", imageHandler2);
1396
- this.register("button", buttonHandler2);
1397
- this.register("container", containerHandler2);
1398
- this.register("box", containerHandler2);
1399
- this.register("center", centerHandler2);
1400
- this.register("list", listHandler2);
1401
- this.register("input", inputHandler2);
1402
- this.register("link", linkHandler2);
1403
- this.register("textarea", textareaHandler2);
1404
- this.register("checkbox", checkboxHandler2);
1405
- this.register("select", selectHandler2);
1406
- this.register("spacer", spacerHandler2);
1407
- this.register("stack", stackHandler2);
1408
- this.register("divider", dividerHandler2);
1409
- this.register("grid", gridHandler2);
1410
- this.register("card", cardHandler2);
1411
- this.register("heading", headingHandler2);
1412
- this.register("switch", switchHandler2);
1413
- this.register("slider", sliderHandler2);
1414
- this.register("spinner", spinnerHandler2);
1415
- this.register("badge", badgeHandler2);
1416
- this.register("avatar", avatarHandler2);
1417
- this.register("progressbar", progressBarHandler2);
1418
- this.register("video", videoHandler2);
1419
- this.register("audio", audioHandler2);
1420
- this.register("paragraph", paragraphHandler2);
1421
- this.register("router", routerHandler2);
1422
- this.register("route", routeHandler2);
1423
- this.register("hypenapp", hypenAppHandler2);
1424
- }
1425
111
  }
1426
- export {
1427
- ComponentRegistry
1428
- };
1429
-
1430
- //# debugId=FBCAEBC2A5AF806F64756E2164756E21
112
+ //# sourceMappingURL=index.js.map