@hypen-space/web 0.3.9 → 0.3.11

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 (174) hide show
  1. package/dist/{src/canvas → canvas}/index.js +10 -6
  2. package/dist/{src/canvas → canvas}/index.js.map +4 -4
  3. package/dist/{src/canvas → canvas}/layout.js +4 -2
  4. package/dist/{src/canvas → canvas}/layout.js.map +3 -3
  5. package/dist/{src/canvas → canvas}/paint.js +4 -2
  6. package/dist/{src/canvas → canvas}/paint.js.map +3 -3
  7. package/dist/{src/canvas → canvas}/renderer.js +10 -6
  8. package/dist/{src/canvas → canvas}/renderer.js.map +4 -4
  9. package/dist/{src/canvas → canvas}/text.js +4 -2
  10. package/dist/{src/canvas → canvas}/text.js.map +3 -3
  11. package/dist/{src/dom → dom}/applicators/advanced-layout.js +16 -3
  12. package/dist/dom/applicators/advanced-layout.js.map +11 -0
  13. package/dist/{src/dom → dom}/applicators/events.js +6 -4
  14. package/dist/dom/applicators/events.js.map +11 -0
  15. package/dist/{src/dom → dom}/applicators/index.js +153 -24
  16. package/dist/dom/applicators/index.js.map +26 -0
  17. package/dist/{src/dom → dom}/applicators/layout.js +16 -3
  18. package/dist/dom/applicators/layout.js.map +10 -0
  19. package/dist/dom/applicators/margin.js +104 -0
  20. package/dist/dom/applicators/margin.js.map +10 -0
  21. package/dist/dom/applicators/padding.js +104 -0
  22. package/dist/dom/applicators/padding.js.map +10 -0
  23. package/dist/{src/dom → dom}/applicators/size.js +11 -3
  24. package/dist/{src/dom → dom}/applicators/size.js.map +3 -3
  25. package/dist/dom/components/button.js.map +10 -0
  26. package/dist/{src/dom → dom}/components/center.js +4 -1
  27. package/dist/dom/components/center.js.map +10 -0
  28. package/dist/dom/components/column.js.map +10 -0
  29. package/dist/{src/dom → dom}/components/container.js +1 -4
  30. package/dist/{src/dom → dom}/components/container.js.map +3 -3
  31. package/dist/{src/dom → dom}/components/grid.js +18 -2
  32. package/dist/dom/components/grid.js.map +10 -0
  33. package/dist/{src/dom → dom}/components/hypenapp.js +15 -13
  34. package/dist/dom/components/hypenapp.js.map +10 -0
  35. package/dist/{src/dom → dom}/components/index.js +64 -20
  36. package/dist/dom/components/index.js.map +41 -0
  37. package/dist/{src/dom → dom}/components/route.js +5 -3
  38. package/dist/dom/components/route.js.map +10 -0
  39. package/dist/{src/dom → dom}/components/row.js +18 -2
  40. package/dist/dom/components/row.js.map +10 -0
  41. package/dist/{src/dom → dom}/components/stack.js +5 -1
  42. package/dist/dom/components/stack.js.map +10 -0
  43. package/dist/{src/dom → dom}/components/text.js +5 -1
  44. package/dist/dom/components/text.js.map +10 -0
  45. package/dist/{src/dom → dom}/debug.js +5 -3
  46. package/dist/dom/debug.js.map +10 -0
  47. package/dist/{src/dom → dom}/events.js +15 -12
  48. package/dist/dom/events.js.map +10 -0
  49. package/dist/{src/dom/renderer.js → dom/index.js} +345 -55
  50. package/dist/dom/index.js.map +62 -0
  51. package/dist/{src/dom/index.js → dom/renderer.js} +233 -164
  52. package/dist/dom/renderer.js.map +61 -0
  53. package/dist/{src/hypen.js → hypen.js} +265 -118
  54. package/dist/hypen.js.map +62 -0
  55. package/dist/{src/index.js → index.js} +288 -134
  56. package/dist/index.js.map +72 -0
  57. package/package.json +22 -22
  58. package/src/canvas/renderer.ts +7 -4
  59. package/src/canvas/text.ts +4 -1
  60. package/src/dom/applicators/events.ts +6 -12
  61. package/src/dom/applicators/layout.ts +4 -0
  62. package/src/dom/applicators/size.ts +7 -2
  63. package/src/dom/components/center.ts +9 -0
  64. package/src/dom/components/column.ts +0 -4
  65. package/src/dom/components/grid.ts +22 -0
  66. package/src/dom/components/hypenapp.ts +14 -11
  67. package/src/dom/components/route.ts +4 -1
  68. package/src/dom/components/row.ts +20 -0
  69. package/src/dom/debug.ts +6 -2
  70. package/src/dom/events.ts +16 -12
  71. package/src/dom/renderer.ts +12 -9
  72. package/src/hypen.ts +32 -73
  73. package/dist/src/dom/applicators/advanced-layout.js.map +0 -11
  74. package/dist/src/dom/applicators/events.js.map +0 -11
  75. package/dist/src/dom/applicators/index.js.map +0 -26
  76. package/dist/src/dom/applicators/layout.js.map +0 -10
  77. package/dist/src/dom/applicators/margin.js +0 -51
  78. package/dist/src/dom/applicators/margin.js.map +0 -10
  79. package/dist/src/dom/applicators/padding.js +0 -51
  80. package/dist/src/dom/applicators/padding.js.map +0 -10
  81. package/dist/src/dom/components/button.js.map +0 -10
  82. package/dist/src/dom/components/center.js.map +0 -10
  83. package/dist/src/dom/components/column.js.map +0 -10
  84. package/dist/src/dom/components/grid.js.map +0 -10
  85. package/dist/src/dom/components/hypenapp.js.map +0 -10
  86. package/dist/src/dom/components/index.js.map +0 -41
  87. package/dist/src/dom/components/route.js.map +0 -10
  88. package/dist/src/dom/components/row.js.map +0 -10
  89. package/dist/src/dom/components/stack.js.map +0 -10
  90. package/dist/src/dom/components/text.js.map +0 -10
  91. package/dist/src/dom/debug.js.map +0 -10
  92. package/dist/src/dom/events.js.map +0 -10
  93. package/dist/src/dom/index.js.map +0 -62
  94. package/dist/src/dom/renderer.js.map +0 -61
  95. package/dist/src/hypen.js.map +0 -62
  96. package/dist/src/index.js.map +0 -72
  97. /package/dist/{src/canvas → canvas}/accessibility.js +0 -0
  98. /package/dist/{src/canvas → canvas}/accessibility.js.map +0 -0
  99. /package/dist/{src/canvas → canvas}/events.js +0 -0
  100. /package/dist/{src/canvas → canvas}/events.js.map +0 -0
  101. /package/dist/{src/canvas → canvas}/input.js +0 -0
  102. /package/dist/{src/canvas → canvas}/input.js.map +0 -0
  103. /package/dist/{src/canvas → canvas}/types.js +0 -0
  104. /package/dist/{src/canvas → canvas}/types.js.map +0 -0
  105. /package/dist/{src/canvas → canvas}/utils.js +0 -0
  106. /package/dist/{src/canvas → canvas}/utils.js.map +0 -0
  107. /package/dist/{src/dom → dom}/applicators/background.js +0 -0
  108. /package/dist/{src/dom → dom}/applicators/background.js.map +0 -0
  109. /package/dist/{src/dom → dom}/applicators/border.js +0 -0
  110. /package/dist/{src/dom → dom}/applicators/border.js.map +0 -0
  111. /package/dist/{src/dom → dom}/applicators/color.js +0 -0
  112. /package/dist/{src/dom → dom}/applicators/color.js.map +0 -0
  113. /package/dist/{src/dom → dom}/applicators/display.js +0 -0
  114. /package/dist/{src/dom → dom}/applicators/display.js.map +0 -0
  115. /package/dist/{src/dom → dom}/applicators/effects.js +0 -0
  116. /package/dist/{src/dom → dom}/applicators/effects.js.map +0 -0
  117. /package/dist/{src/dom → dom}/applicators/font.js +0 -0
  118. /package/dist/{src/dom → dom}/applicators/font.js.map +0 -0
  119. /package/dist/{src/dom → dom}/applicators/transform.js +0 -0
  120. /package/dist/{src/dom → dom}/applicators/transform.js.map +0 -0
  121. /package/dist/{src/dom → dom}/applicators/transition.js +0 -0
  122. /package/dist/{src/dom → dom}/applicators/transition.js.map +0 -0
  123. /package/dist/{src/dom → dom}/applicators/types.js +0 -0
  124. /package/dist/{src/dom → dom}/applicators/types.js.map +0 -0
  125. /package/dist/{src/dom → dom}/applicators/typography.js +0 -0
  126. /package/dist/{src/dom → dom}/applicators/typography.js.map +0 -0
  127. /package/dist/{src/dom → dom}/canvas/index.js +0 -0
  128. /package/dist/{src/dom → dom}/canvas/index.js.map +0 -0
  129. /package/dist/{src/dom → dom}/components/audio.js +0 -0
  130. /package/dist/{src/dom → dom}/components/audio.js.map +0 -0
  131. /package/dist/{src/dom → dom}/components/avatar.js +0 -0
  132. /package/dist/{src/dom → dom}/components/avatar.js.map +0 -0
  133. /package/dist/{src/dom → dom}/components/badge.js +0 -0
  134. /package/dist/{src/dom → dom}/components/badge.js.map +0 -0
  135. /package/dist/{src/dom → dom}/components/button.js +0 -0
  136. /package/dist/{src/dom → dom}/components/card.js +0 -0
  137. /package/dist/{src/dom → dom}/components/card.js.map +0 -0
  138. /package/dist/{src/dom → dom}/components/checkbox.js +0 -0
  139. /package/dist/{src/dom → dom}/components/checkbox.js.map +0 -0
  140. /package/dist/{src/dom → dom}/components/column.js +0 -0
  141. /package/dist/{src/dom → dom}/components/divider.js +0 -0
  142. /package/dist/{src/dom → dom}/components/divider.js.map +0 -0
  143. /package/dist/{src/dom → dom}/components/heading.js +0 -0
  144. /package/dist/{src/dom → dom}/components/heading.js.map +0 -0
  145. /package/dist/{src/dom → dom}/components/image.js +0 -0
  146. /package/dist/{src/dom → dom}/components/image.js.map +0 -0
  147. /package/dist/{src/dom → dom}/components/input.js +0 -0
  148. /package/dist/{src/dom → dom}/components/input.js.map +0 -0
  149. /package/dist/{src/dom → dom}/components/link.js +0 -0
  150. /package/dist/{src/dom → dom}/components/link.js.map +0 -0
  151. /package/dist/{src/dom → dom}/components/list.js +0 -0
  152. /package/dist/{src/dom → dom}/components/list.js.map +0 -0
  153. /package/dist/{src/dom → dom}/components/paragraph.js +0 -0
  154. /package/dist/{src/dom → dom}/components/paragraph.js.map +0 -0
  155. /package/dist/{src/dom → dom}/components/progressbar.js +0 -0
  156. /package/dist/{src/dom → dom}/components/progressbar.js.map +0 -0
  157. /package/dist/{src/dom → dom}/components/router.js +0 -0
  158. /package/dist/{src/dom → dom}/components/router.js.map +0 -0
  159. /package/dist/{src/dom → dom}/components/select.js +0 -0
  160. /package/dist/{src/dom → dom}/components/select.js.map +0 -0
  161. /package/dist/{src/dom → dom}/components/slider.js +0 -0
  162. /package/dist/{src/dom → dom}/components/slider.js.map +0 -0
  163. /package/dist/{src/dom → dom}/components/spacer.js +0 -0
  164. /package/dist/{src/dom → dom}/components/spacer.js.map +0 -0
  165. /package/dist/{src/dom → dom}/components/spinner.js +0 -0
  166. /package/dist/{src/dom → dom}/components/spinner.js.map +0 -0
  167. /package/dist/{src/dom → dom}/components/switch.js +0 -0
  168. /package/dist/{src/dom → dom}/components/switch.js.map +0 -0
  169. /package/dist/{src/dom → dom}/components/textarea.js +0 -0
  170. /package/dist/{src/dom → dom}/components/textarea.js.map +0 -0
  171. /package/dist/{src/dom → dom}/components/video.js +0 -0
  172. /package/dist/{src/dom → dom}/components/video.js.map +0 -0
  173. /package/dist/{src/dom → dom}/element-data.js +0 -0
  174. /package/dist/{src/dom → dom}/element-data.js.map +0 -0
@@ -51,10 +51,26 @@ var exports_row = {};
51
51
  __export(exports_row, {
52
52
  rowHandler: () => rowHandler
53
53
  });
54
- var rowHandler;
54
+ function ensureRowStyles() {
55
+ if (rowStylesInjected)
56
+ return;
57
+ rowStylesInjected = true;
58
+ const style = document.createElement("style");
59
+ style.id = "hypen-row-styles";
60
+ style.textContent = `
61
+ /* Row expands to fill width when it has children with flex/weight */
62
+ /* This matches iOS/Android behavior where weighted children cause parent to expand */
63
+ [data-hypen-type="row"]:has(> [data-hypen-flex]) {
64
+ width: 100%;
65
+ }
66
+ `;
67
+ document.head.appendChild(style);
68
+ }
69
+ var rowStylesInjected = false, rowHandler;
55
70
  var init_row = __esm(() => {
56
71
  rowHandler = {
57
72
  create() {
73
+ ensureRowStyles();
58
74
  const el = document.createElement("div");
59
75
  el.style.display = "flex";
60
76
  el.style.flexDirection = "row";
@@ -76,6 +92,10 @@ var init_text = __esm(() => {
76
92
  create() {
77
93
  const el = document.createElement("span");
78
94
  el.style.display = "inline-block";
95
+ el.style.lineHeight = "1";
96
+ el.style.verticalAlign = "top";
97
+ el.style.margin = "0";
98
+ el.style.padding = "0";
79
99
  el.dataset.hypenType = "text";
80
100
  return el;
81
101
  },
@@ -151,9 +171,6 @@ var init_container = __esm(() => {
151
171
  containerHandler = {
152
172
  create() {
153
173
  const el = document.createElement("div");
154
- el.style.display = "flex";
155
- el.style.flexDirection = "column";
156
- el.style.alignItems = "stretch";
157
174
  el.dataset.hypenType = "container";
158
175
  return el;
159
176
  }
@@ -173,6 +190,9 @@ var init_center = __esm(() => {
173
190
  el.style.display = "flex";
174
191
  el.style.alignItems = "center";
175
192
  el.style.justifyContent = "center";
193
+ el.style.width = "100%";
194
+ el.style.height = "100%";
195
+ el.style.alignSelf = "stretch";
176
196
  el.dataset.hypenType = "center";
177
197
  return el;
178
198
  }
@@ -423,12 +443,16 @@ function ensureStackStyles() {
423
443
  position: relative;
424
444
  display: grid;
425
445
  grid-template-areas: "stack";
446
+ /* Default alignment: top-left (matching iOS/Android ZStack default) */
447
+ justify-items: start;
448
+ align-items: start;
426
449
  /* Ensure Stack participates properly in flex layouts (Row/Column) */
427
450
  min-width: 0;
428
451
  min-height: 0;
429
452
  }
430
453
  [data-hypen-type="stack"] > * {
431
454
  grid-area: stack;
455
+ /* Don't set justify-self/align-self here - let parent's justify-items/align-items control */
432
456
  }
433
457
  `;
434
458
  document.head.appendChild(style);
@@ -482,10 +506,26 @@ var exports_grid = {};
482
506
  __export(exports_grid, {
483
507
  gridHandler: () => gridHandler
484
508
  });
485
- var gridHandler;
509
+ function ensureGridStyles() {
510
+ if (gridStylesInjected)
511
+ return;
512
+ gridStylesInjected = true;
513
+ const style = document.createElement("style");
514
+ style.id = "hypen-grid-styles";
515
+ style.textContent = `
516
+ /* Grid children stretch to fill cells by default (matches Android behavior) */
517
+ [data-hypen-type="grid"] > * {
518
+ justify-self: stretch;
519
+ align-self: stretch;
520
+ }
521
+ `;
522
+ document.head.appendChild(style);
523
+ }
524
+ var gridStylesInjected = false, gridHandler;
486
525
  var init_grid = __esm(() => {
487
526
  gridHandler = {
488
527
  create() {
528
+ ensureGridStyles();
489
529
  const el = document.createElement("div");
490
530
  el.style.display = "grid";
491
531
  el.dataset.hypenType = "grid";
@@ -971,8 +1011,10 @@ var exports_route = {};
971
1011
  __export(exports_route, {
972
1012
  routeHandler: () => routeHandler
973
1013
  });
974
- var routeHandler;
1014
+ import { frameworkLoggers } from "@hypen-space/core";
1015
+ var log, routeHandler;
975
1016
  var init_route = __esm(() => {
1017
+ log = frameworkLoggers.router;
976
1018
  routeHandler = {
977
1019
  create() {
978
1020
  const el = document.createElement("div");
@@ -992,7 +1034,7 @@ var init_route = __esm(() => {
992
1034
  if (componentName) {
993
1035
  el.dataset.routeComponent = String(componentName);
994
1036
  }
995
- console.log(`\uD83D\uDEE3️ Route created: path="${path}", lazy=${isLazy}, component="${el.dataset.routeComponent || "none"}"`);
1037
+ log.debug(`Route created: path="${path}", lazy=${isLazy}, component="${el.dataset.routeComponent || "none"}"`);
996
1038
  }
997
1039
  };
998
1040
  });
@@ -1004,11 +1046,12 @@ __export(exports_hypenapp, {
1004
1046
  disconnectHypenApp: () => disconnectHypenApp
1005
1047
  });
1006
1048
  import { RemoteEngine } from "@hypen-space/core/remote/client";
1049
+ import { frameworkLoggers as frameworkLoggers2 } from "@hypen-space/core";
1007
1050
  function applyPatches(container, nodes, patches, engine, onRoot) {
1008
1051
  for (const patch of patches) {
1009
1052
  switch (patch.type) {
1010
1053
  case "create": {
1011
- const el = createElement(patch.element_type, patch.props || {});
1054
+ const el = createElement(patch.elementType, patch.props || {});
1012
1055
  el.dataset.hypenId = patch.id;
1013
1056
  el.__hypenEngine = engine;
1014
1057
  nodes.set(patch.id, el);
@@ -1029,10 +1072,10 @@ function applyPatches(container, nodes, patches, engine, onRoot) {
1029
1072
  break;
1030
1073
  }
1031
1074
  case "insert": {
1032
- const parentId = patch.parent_id;
1075
+ const parentId = patch.parentId;
1033
1076
  const parent = parentId === "root" ? container : nodes.get(parentId);
1034
1077
  const child = nodes.get(patch.id);
1035
- const beforeId = patch.before_id;
1078
+ const beforeId = patch.beforeId;
1036
1079
  if (parent && child) {
1037
1080
  if (parentId === "root") {
1038
1081
  onRoot(patch.id);
@@ -1051,10 +1094,10 @@ function applyPatches(container, nodes, patches, engine, onRoot) {
1051
1094
  break;
1052
1095
  }
1053
1096
  case "move": {
1054
- const parentId = patch.parent_id;
1097
+ const parentId = patch.parentId;
1055
1098
  const parent = parentId === "root" ? container : nodes.get(parentId);
1056
1099
  const child = nodes.get(patch.id);
1057
- const beforeId = patch.before_id;
1100
+ const beforeId = patch.beforeId;
1058
1101
  if (parent && child) {
1059
1102
  if (beforeId) {
1060
1103
  const before = nodes.get(beforeId);
@@ -1188,8 +1231,9 @@ function disconnectHypenApp(element) {
1188
1231
  activeInstances.delete(element);
1189
1232
  }
1190
1233
  }
1191
- var activeInstances, hypenAppHandler;
1234
+ var log2, activeInstances, hypenAppHandler;
1192
1235
  var init_hypenapp = __esm(() => {
1236
+ log2 = frameworkLoggers2.remote;
1193
1237
  activeInstances = new WeakMap;
1194
1238
  hypenAppHandler = {
1195
1239
  create() {
@@ -1201,7 +1245,7 @@ var init_hypenapp = __esm(() => {
1201
1245
  applyProps(element, props) {
1202
1246
  const url = props["0"] || props.url;
1203
1247
  if (!url || typeof url !== "string") {
1204
- console.error("[HypenApp] URL is required");
1248
+ log2.error("HypenApp: URL is required");
1205
1249
  element.innerHTML = '<div style="color: red;">HypenApp: URL required</div>';
1206
1250
  return;
1207
1251
  }
@@ -1226,16 +1270,16 @@ var init_hypenapp = __esm(() => {
1226
1270
  element.innerHTML = '<div class="hypen-app-loading">Connecting...</div>';
1227
1271
  engine.connect().then(() => {
1228
1272
  element.innerHTML = "";
1229
- console.log(`[HypenApp] Connected to ${url}`);
1273
+ log2.debug(`HypenApp connected to ${url}`);
1230
1274
  }).catch((error) => {
1231
1275
  element.innerHTML = `<div style="color: red;">HypenApp: Connection failed - ${error.message}</div>`;
1232
- console.error("[HypenApp] Connection failed:", error);
1276
+ log2.error("HypenApp connection failed:", error);
1233
1277
  });
1234
1278
  engine.onDisconnect(() => {
1235
- console.log("[HypenApp] Disconnected");
1279
+ log2.debug("HypenApp disconnected");
1236
1280
  });
1237
1281
  engine.onError((error) => {
1238
- console.error("[HypenApp] Error:", error);
1282
+ log2.error("HypenApp error:", error);
1239
1283
  });
1240
1284
  const observer = new MutationObserver((mutations) => {
1241
1285
  for (const mutation of mutations) {
@@ -1244,7 +1288,7 @@ var init_hypenapp = __esm(() => {
1244
1288
  engine.disconnect();
1245
1289
  activeInstances.delete(element);
1246
1290
  observer.disconnect();
1247
- console.log("[HypenApp] Cleaned up");
1291
+ log2.debug("HypenApp cleaned up");
1248
1292
  return;
1249
1293
  }
1250
1294
  }
@@ -1347,40 +1391,134 @@ class ComponentRegistry {
1347
1391
  }
1348
1392
 
1349
1393
  // src/dom/applicators/padding.ts
1394
+ var getNumericValue = (value) => {
1395
+ if (typeof value === "number")
1396
+ return value;
1397
+ if (typeof value === "object" && value["0"] !== undefined)
1398
+ return Number(value["0"]);
1399
+ if (typeof value === "string")
1400
+ return parseFloat(value);
1401
+ return null;
1402
+ };
1350
1403
  var paddingHandler = (el, value) => {
1351
1404
  if (typeof value === "number") {
1352
1405
  el.style.padding = `${value}px`;
1353
1406
  } else if (typeof value === "object") {
1354
- if (value.left !== undefined)
1355
- el.style.paddingLeft = `${value.left}px`;
1356
- if (value.right !== undefined)
1357
- el.style.paddingRight = `${value.right}px`;
1358
- if (value.top !== undefined)
1359
- el.style.paddingTop = `${value.top}px`;
1360
- if (value.bottom !== undefined)
1361
- el.style.paddingBottom = `${value.bottom}px`;
1407
+ if (value["0"] !== undefined && Object.keys(value).length === 1) {
1408
+ el.style.padding = `${value["0"]}px`;
1409
+ } else {
1410
+ if (value.left !== undefined)
1411
+ el.style.paddingLeft = `${value.left}px`;
1412
+ if (value.right !== undefined)
1413
+ el.style.paddingRight = `${value.right}px`;
1414
+ if (value.top !== undefined)
1415
+ el.style.paddingTop = `${value.top}px`;
1416
+ if (value.bottom !== undefined)
1417
+ el.style.paddingBottom = `${value.bottom}px`;
1418
+ }
1362
1419
  } else {
1363
1420
  el.style.padding = String(value);
1364
1421
  }
1365
1422
  };
1423
+ var paddingTopHandler = (el, value) => {
1424
+ const v = getNumericValue(value);
1425
+ if (v !== null)
1426
+ el.style.paddingTop = `${v}px`;
1427
+ };
1428
+ var paddingBottomHandler = (el, value) => {
1429
+ const v = getNumericValue(value);
1430
+ if (v !== null)
1431
+ el.style.paddingBottom = `${v}px`;
1432
+ };
1433
+ var paddingLeftHandler = (el, value) => {
1434
+ const v = getNumericValue(value);
1435
+ if (v !== null)
1436
+ el.style.paddingLeft = `${v}px`;
1437
+ };
1438
+ var paddingRightHandler = (el, value) => {
1439
+ const v = getNumericValue(value);
1440
+ if (v !== null)
1441
+ el.style.paddingRight = `${v}px`;
1442
+ };
1443
+ var paddingHorizontalHandler = (el, value) => {
1444
+ const v = getNumericValue(value);
1445
+ if (v !== null) {
1446
+ el.style.paddingLeft = `${v}px`;
1447
+ el.style.paddingRight = `${v}px`;
1448
+ }
1449
+ };
1450
+ var paddingVerticalHandler = (el, value) => {
1451
+ const v = getNumericValue(value);
1452
+ if (v !== null) {
1453
+ el.style.paddingTop = `${v}px`;
1454
+ el.style.paddingBottom = `${v}px`;
1455
+ }
1456
+ };
1366
1457
 
1367
1458
  // src/dom/applicators/margin.ts
1459
+ var getNumericValue2 = (value) => {
1460
+ if (typeof value === "number")
1461
+ return value;
1462
+ if (typeof value === "object" && value["0"] !== undefined)
1463
+ return Number(value["0"]);
1464
+ if (typeof value === "string")
1465
+ return parseFloat(value);
1466
+ return null;
1467
+ };
1368
1468
  var marginHandler = (el, value) => {
1369
1469
  if (typeof value === "number") {
1370
1470
  el.style.margin = `${value}px`;
1371
1471
  } else if (typeof value === "object") {
1372
- if (value.left !== undefined)
1373
- el.style.marginLeft = `${value.left}px`;
1374
- if (value.right !== undefined)
1375
- el.style.marginRight = `${value.right}px`;
1376
- if (value.top !== undefined)
1377
- el.style.marginTop = `${value.top}px`;
1378
- if (value.bottom !== undefined)
1379
- el.style.marginBottom = `${value.bottom}px`;
1472
+ if (value["0"] !== undefined && Object.keys(value).length === 1) {
1473
+ el.style.margin = `${value["0"]}px`;
1474
+ } else {
1475
+ if (value.left !== undefined)
1476
+ el.style.marginLeft = `${value.left}px`;
1477
+ if (value.right !== undefined)
1478
+ el.style.marginRight = `${value.right}px`;
1479
+ if (value.top !== undefined)
1480
+ el.style.marginTop = `${value.top}px`;
1481
+ if (value.bottom !== undefined)
1482
+ el.style.marginBottom = `${value.bottom}px`;
1483
+ }
1380
1484
  } else {
1381
1485
  el.style.margin = String(value);
1382
1486
  }
1383
1487
  };
1488
+ var marginTopHandler = (el, value) => {
1489
+ const v = getNumericValue2(value);
1490
+ if (v !== null)
1491
+ el.style.marginTop = `${v}px`;
1492
+ };
1493
+ var marginBottomHandler = (el, value) => {
1494
+ const v = getNumericValue2(value);
1495
+ if (v !== null)
1496
+ el.style.marginBottom = `${v}px`;
1497
+ };
1498
+ var marginLeftHandler = (el, value) => {
1499
+ const v = getNumericValue2(value);
1500
+ if (v !== null)
1501
+ el.style.marginLeft = `${v}px`;
1502
+ };
1503
+ var marginRightHandler = (el, value) => {
1504
+ const v = getNumericValue2(value);
1505
+ if (v !== null)
1506
+ el.style.marginRight = `${v}px`;
1507
+ };
1508
+ var marginHorizontalHandler = (el, value) => {
1509
+ const v = getNumericValue2(value);
1510
+ if (v !== null) {
1511
+ el.style.marginLeft = `${v}px`;
1512
+ el.style.marginRight = `${v}px`;
1513
+ }
1514
+ };
1515
+ var marginVerticalHandler = (el, value) => {
1516
+ const v = getNumericValue2(value);
1517
+ if (v !== null) {
1518
+ el.style.marginTop = `${v}px`;
1519
+ el.style.marginBottom = `${v}px`;
1520
+ }
1521
+ };
1384
1522
 
1385
1523
  // src/dom/applicators/color.ts
1386
1524
  var colorHandlers = {
@@ -1569,8 +1707,14 @@ var sizeHandlers = {
1569
1707
  if (value === false)
1570
1708
  return;
1571
1709
  const fraction = typeof value === "number" ? value : 1;
1572
- el.style.width = `${fraction * 100}%`;
1573
- el.style.alignSelf = "stretch";
1710
+ if (fraction === 1) {
1711
+ el.style.alignSelf = "stretch";
1712
+ el.style.width = "100%";
1713
+ el.style.minWidth = "0";
1714
+ } else {
1715
+ el.style.width = `${fraction * 100}%`;
1716
+ }
1717
+ el.style.justifySelf = "stretch";
1574
1718
  },
1575
1719
  fillMaxHeight: (el, value) => {
1576
1720
  if (value === false)
@@ -1584,6 +1728,8 @@ var sizeHandlers = {
1584
1728
  const fraction = typeof value === "number" ? value : 1;
1585
1729
  el.style.width = `${fraction * 100}%`;
1586
1730
  el.style.height = `${fraction * 100}%`;
1731
+ el.style.alignSelf = "stretch";
1732
+ el.style.minWidth = "0";
1587
1733
  }
1588
1734
  };
1589
1735
 
@@ -1725,8 +1871,11 @@ function mapAlignmentValue(value) {
1725
1871
  var layoutHandlers = {
1726
1872
  verticalAlignment: (el, value) => {
1727
1873
  const val = mapAlignmentValue(String(value));
1874
+ const display = el.style.display || getComputedStyle(el).display;
1728
1875
  const flexDirection = el.style.flexDirection || getComputedStyle(el).flexDirection;
1729
- if (flexDirection === "column" || flexDirection === "column-reverse") {
1876
+ if (display === "grid") {
1877
+ el.style.alignItems = val;
1878
+ } else if (flexDirection === "column" || flexDirection === "column-reverse") {
1730
1879
  el.style.justifyContent = val;
1731
1880
  } else {
1732
1881
  el.style.alignItems = val;
@@ -1734,9 +1883,17 @@ var layoutHandlers = {
1734
1883
  },
1735
1884
  horizontalAlignment: (el, value) => {
1736
1885
  const val = mapAlignmentValue(String(value));
1886
+ const display = el.style.display || getComputedStyle(el).display;
1737
1887
  const flexDirection = el.style.flexDirection || getComputedStyle(el).flexDirection;
1738
- if (flexDirection === "column" || flexDirection === "column-reverse") {
1888
+ if (display === "grid") {
1889
+ el.style.justifyItems = val;
1890
+ } else if (flexDirection === "column" || flexDirection === "column-reverse") {
1739
1891
  el.style.alignItems = val;
1892
+ } else if (flexDirection === "row" || flexDirection === "row-reverse") {
1893
+ el.style.justifyContent = val;
1894
+ if (val !== "flex-start" && el.style.overflow !== "auto" && el.style.overflowX !== "auto") {
1895
+ el.style.width = "100%";
1896
+ }
1740
1897
  } else {
1741
1898
  el.style.justifyContent = val;
1742
1899
  }
@@ -1752,9 +1909,11 @@ var layoutHandlers = {
1752
1909
  },
1753
1910
  weight: (el, value) => {
1754
1911
  el.style.flex = String(value);
1912
+ el.dataset.hypenFlex = "true";
1755
1913
  },
1756
1914
  flex: (el, value) => {
1757
1915
  el.style.flex = String(value);
1916
+ el.dataset.hypenFlex = "true";
1758
1917
  },
1759
1918
  flexGrow: (el, value) => {
1760
1919
  el.style.flexGrow = String(value);
@@ -1879,6 +2038,8 @@ import {
1879
2038
  disposableListener,
1880
2039
  disposableTimeout
1881
2040
  } from "@hypen-space/core/disposable";
2041
+ import { frameworkLoggers as frameworkLoggers3 } from "@hypen-space/core";
2042
+ var log3 = frameworkLoggers3.events;
1882
2043
  function toPlainObject(value) {
1883
2044
  if (value instanceof Map) {
1884
2045
  const obj = {};
@@ -1972,7 +2133,7 @@ function createEventHandler(eventType, options = {}) {
1972
2133
  return (element, value) => {
1973
2134
  const { actionName, payload: customPayload } = extractActionDetails(value);
1974
2135
  if (!actionName) {
1975
- console.warn(`[EventApplicator] ${eventType} requires an action reference starting with @, got:`, value);
2136
+ log3.warn(`${eventType} requires an action reference starting with @, got:`, value);
1976
2137
  return;
1977
2138
  }
1978
2139
  const disposables = getElementDisposables2(element);
@@ -2015,7 +2176,7 @@ function createKeyHandler(defaultKey = "Enter") {
2015
2176
  return (element, value) => {
2016
2177
  const { actionName, payload: customPayload } = extractActionDetails(value);
2017
2178
  if (!actionName) {
2018
- console.warn(`[EventApplicator] onKey requires an action reference starting with @, got:`, value);
2179
+ log3.warn(`onKey requires an action reference starting with @, got:`, value);
2019
2180
  return;
2020
2181
  }
2021
2182
  const disposables = getElementDisposables2(element);
@@ -2060,7 +2221,7 @@ function createLongClickHandler(thresholdMs = 500) {
2060
2221
  return (element, value) => {
2061
2222
  const { actionName, payload: customPayload } = extractActionDetails(value);
2062
2223
  if (!actionName) {
2063
- console.warn(`[EventApplicator] onLongClick requires an action reference starting with @, got:`, value);
2224
+ log3.warn(`onLongClick requires an action reference starting with @, got:`, value);
2064
2225
  return;
2065
2226
  }
2066
2227
  const disposables = getElementDisposables2(element);
@@ -2869,7 +3030,19 @@ class ApplicatorRegistry {
2869
3030
  }
2870
3031
  registerDefaults() {
2871
3032
  this.register("padding", paddingHandler);
3033
+ this.register("paddingTop", paddingTopHandler);
3034
+ this.register("paddingBottom", paddingBottomHandler);
3035
+ this.register("paddingLeft", paddingLeftHandler);
3036
+ this.register("paddingRight", paddingRightHandler);
3037
+ this.register("paddingHorizontal", paddingHorizontalHandler);
3038
+ this.register("paddingVertical", paddingVerticalHandler);
2872
3039
  this.register("margin", marginHandler);
3040
+ this.register("marginTop", marginTopHandler);
3041
+ this.register("marginBottom", marginBottomHandler);
3042
+ this.register("marginLeft", marginLeftHandler);
3043
+ this.register("marginRight", marginRightHandler);
3044
+ this.register("marginHorizontal", marginHorizontalHandler);
3045
+ this.register("marginVertical", marginVerticalHandler);
2873
3046
  for (const [name, handler] of Object.entries(colorHandlers)) {
2874
3047
  this.register(name, handler);
2875
3048
  }
@@ -2954,6 +3127,8 @@ var canvasApplicators = {
2954
3127
  };
2955
3128
 
2956
3129
  // src/dom/debug.ts
3130
+ import { frameworkLoggers as frameworkLoggers4 } from "@hypen-space/core";
3131
+ var log4 = frameworkLoggers4.debug;
2957
3132
  var defaultDebugConfig = {
2958
3133
  enabled: false,
2959
3134
  showHeatmap: true,
@@ -2979,7 +3154,7 @@ class RerenderTracker {
2979
3154
  if (!this.config.enabled || !this.config.showHeatmap) {
2980
3155
  return;
2981
3156
  }
2982
- console.log(`\uD83D\uDD25 [Debug] Tracking re-render: ${id} - ${patchType}`);
3157
+ log4.debug(`Tracking re-render: ${id} - ${patchType}`);
2983
3158
  const currentCount = this.renderCounts.get(id) || 0;
2984
3159
  const newCount = currentCount + 1;
2985
3160
  this.renderCounts.set(id, newCount);
@@ -2987,7 +3162,7 @@ class RerenderTracker {
2987
3162
  }
2988
3163
  updateHeatmap(id, element, renderCount, patchType) {
2989
3164
  const opacity = Math.min(renderCount * this.config.heatmapIncrement / 100, this.config.maxOpacity);
2990
- console.log(`\uD83D\uDD25 [Debug] Updating heatmap for ${id}, count: ${renderCount}, opacity: ${opacity}`);
3165
+ log4.debug(`Updating heatmap for ${id}, count: ${renderCount}, opacity: ${opacity}`);
2991
3166
  const isInline = window.getComputedStyle(element).display.includes("inline");
2992
3167
  if (isInline || element.tagName === "SPAN") {
2993
3168
  if (!element.dataset.hypenDebugOriginalBg) {
@@ -3115,6 +3290,9 @@ class RerenderTracker {
3115
3290
  }
3116
3291
 
3117
3292
  // src/dom/renderer.ts
3293
+ import { frameworkLoggers as frameworkLoggers5 } from "@hypen-space/core";
3294
+ var log5 = frameworkLoggers5.renderer;
3295
+
3118
3296
  class DOMRenderer {
3119
3297
  container;
3120
3298
  nodes = new Map;
@@ -3148,13 +3326,13 @@ class DOMRenderer {
3148
3326
  }
3149
3327
  }
3150
3328
  updateState(state) {
3151
- console.log(`[Renderer] Updating state:`, state);
3329
+ log5.debug("Updating state:", state);
3152
3330
  this.currentState = state;
3153
3331
  this.interpolateAllText();
3154
3332
  }
3155
3333
  mergeComponentState(componentState) {
3156
3334
  this.currentState = { ...this.currentState, ...componentState };
3157
- console.log(`[Renderer] Merged state:`, this.currentState);
3335
+ log5.debug("Merged state:", this.currentState);
3158
3336
  this.interpolateAllText();
3159
3337
  }
3160
3338
  interpolateAllText() {
@@ -3187,7 +3365,7 @@ class DOMRenderer {
3187
3365
  applyPatch(patch) {
3188
3366
  switch (patch.type) {
3189
3367
  case "create":
3190
- this.onCreate(patch.id, patch.element_type, patch.props || {});
3368
+ this.onCreate(patch.id, patch.elementType, patch.props || {});
3191
3369
  break;
3192
3370
  case "setProp":
3193
3371
  this.onSetProp(patch.id, patch.name, patch.value);
@@ -3196,10 +3374,10 @@ class DOMRenderer {
3196
3374
  this.onSetText(patch.id, patch.text);
3197
3375
  break;
3198
3376
  case "insert":
3199
- this.onInsert(patch.parent_id, patch.id, patch.before_id);
3377
+ this.onInsert(patch.parentId, patch.id, patch.beforeId);
3200
3378
  break;
3201
3379
  case "move":
3202
- this.onMove(patch.parent_id, patch.id, patch.before_id);
3380
+ this.onMove(patch.parentId, patch.id, patch.beforeId);
3203
3381
  break;
3204
3382
  case "remove":
3205
3383
  this.onRemove(patch.id);
@@ -3214,7 +3392,7 @@ class DOMRenderer {
3214
3392
  fallback.dataset.hypenType = elementType.toLowerCase();
3215
3393
  fallback.style.display = "contents";
3216
3394
  element = fallback;
3217
- console.log(`[Renderer] Unknown component "${elementType}" - using transparent container`);
3395
+ log5.debug(`Unknown component "${elementType}" - using transparent container`);
3218
3396
  }
3219
3397
  element.dataset.hypenType = elementType.toLowerCase();
3220
3398
  element.dataset.hypenId = id;
@@ -3239,7 +3417,7 @@ class DOMRenderer {
3239
3417
  if (elementType === "input") {
3240
3418
  const inputEl = element;
3241
3419
  inputEl.value = String(value);
3242
- console.log(`[Renderer] Updated input value: "${value}"`);
3420
+ log5.debug(`Updated input value: "${value}"`);
3243
3421
  return;
3244
3422
  }
3245
3423
  const nextText = String(value);
@@ -3254,7 +3432,7 @@ class DOMRenderer {
3254
3432
  } else if (!currentLooksLikeTemplate) {
3255
3433
  element.dataset.textTemplate = nextText;
3256
3434
  }
3257
- console.log(`[Renderer] Updated text content: "${value}"`);
3435
+ log5.debug(`Updated text content: "${value}"`);
3258
3436
  return;
3259
3437
  }
3260
3438
  this.applicators.apply(element, name, value);
@@ -3269,7 +3447,7 @@ class DOMRenderer {
3269
3447
  onInsert(parentId, id, beforeId) {
3270
3448
  const parent = parentId === "root" ? this.container : this.nodes.get(parentId);
3271
3449
  const child = this.nodes.get(id);
3272
- console.log(`[Renderer] Inserting ${id} into ${parentId}`, {
3450
+ log5.debug(`Inserting ${id} into ${parentId}`, {
3273
3451
  parent: parent ? `${parent.tagName}#${parent.id || "no-id"}` : "null",
3274
3452
  child: child ? `${child.tagName}#${child.id || "no-id"}` : "null",
3275
3453
  childText: child?.textContent?.substring(0, 20)
@@ -3331,8 +3509,120 @@ class DOMRenderer {
3331
3509
  return this.debugTracker.getStats();
3332
3510
  }
3333
3511
  }
3512
+
3513
+ // src/dom/events.ts
3514
+ import { frameworkLoggers as frameworkLoggers6 } from "@hypen-space/core";
3515
+ var log6 = frameworkLoggers6.events;
3516
+
3517
+ class EventManager {
3518
+ engine;
3519
+ bindings = new Map;
3520
+ constructor(engine) {
3521
+ this.engine = engine;
3522
+ }
3523
+ attach(elementId, element, eventName, actionName) {
3524
+ const domEventName = eventName === "onClick" ? "click" : eventName;
3525
+ log6.debug(`Attaching ${eventName} (DOM: ${domEventName}) to element ${elementId}, action: ${actionName}`);
3526
+ const listener = (event) => {
3527
+ log6.debug(`Event fired: ${eventName} on ${elementId}, dispatching action: ${actionName}`);
3528
+ log6.debug(`Event object:`, event);
3529
+ log6.debug(`Element:`, element);
3530
+ if (eventName === "submit" || eventName === "click" && element.tagName === "A") {
3531
+ event.preventDefault();
3532
+ }
3533
+ const payload = this.extractEventData(event, element);
3534
+ log6.debug(`Event payload:`, payload);
3535
+ log6.debug(`Calling engine.dispatchAction(${actionName})`);
3536
+ try {
3537
+ this.engine.dispatchAction(actionName, payload);
3538
+ log6.debug(`dispatchAction succeeded`);
3539
+ } catch (error) {
3540
+ log6.error(`dispatchAction failed:`, error);
3541
+ }
3542
+ };
3543
+ let elementBindings = this.bindings.get(elementId);
3544
+ if (!elementBindings) {
3545
+ elementBindings = new Map;
3546
+ this.bindings.set(elementId, elementBindings);
3547
+ }
3548
+ elementBindings.set(eventName, listener);
3549
+ element.addEventListener(domEventName, listener);
3550
+ log6.debug(`Listener attached to DOM for ${domEventName}`);
3551
+ log6.debug(`Element details:`, {
3552
+ tagName: element.tagName,
3553
+ id: element.id,
3554
+ dataset: element.dataset,
3555
+ textContent: element.textContent?.substring(0, 50)
3556
+ });
3557
+ if (domEventName === "click") {
3558
+ element.addEventListener("click", (e) => {
3559
+ log6.debug(`Raw DOM click detected on ${element.tagName}`, e);
3560
+ });
3561
+ }
3562
+ }
3563
+ detach(elementId, element, eventName) {
3564
+ const elementBindings = this.bindings.get(elementId);
3565
+ if (!elementBindings)
3566
+ return;
3567
+ const listener = elementBindings.get(eventName);
3568
+ if (listener) {
3569
+ element.removeEventListener(eventName, listener);
3570
+ elementBindings.delete(eventName);
3571
+ }
3572
+ if (elementBindings.size === 0) {
3573
+ this.bindings.delete(elementId);
3574
+ }
3575
+ }
3576
+ extractEventData(event, element) {
3577
+ const data = {
3578
+ type: event.type,
3579
+ timestamp: Date.now()
3580
+ };
3581
+ if (event instanceof MouseEvent) {
3582
+ data.clientX = event.clientX;
3583
+ data.clientY = event.clientY;
3584
+ data.button = event.button;
3585
+ }
3586
+ if (event instanceof KeyboardEvent) {
3587
+ data.key = event.key;
3588
+ data.code = event.code;
3589
+ data.ctrlKey = event.ctrlKey;
3590
+ data.shiftKey = event.shiftKey;
3591
+ data.altKey = event.altKey;
3592
+ data.metaKey = event.metaKey;
3593
+ }
3594
+ if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
3595
+ data.value = element.value;
3596
+ }
3597
+ if (element instanceof HTMLSelectElement) {
3598
+ data.value = element.value;
3599
+ data.selectedIndex = element.selectedIndex;
3600
+ }
3601
+ if (event.type === "submit" && element instanceof HTMLFormElement) {
3602
+ data.formData = new FormData(element);
3603
+ }
3604
+ return data;
3605
+ }
3606
+ clearElement(elementId, element) {
3607
+ const elementBindings = this.bindings.get(elementId);
3608
+ if (!elementBindings)
3609
+ return;
3610
+ for (const [eventName, listener] of elementBindings) {
3611
+ element.removeEventListener(eventName, listener);
3612
+ }
3613
+ this.bindings.delete(elementId);
3614
+ }
3615
+ clearAll() {
3616
+ this.bindings.clear();
3617
+ }
3618
+ }
3334
3619
  export {
3335
- DOMRenderer
3620
+ defaultDebugConfig,
3621
+ RerenderTracker,
3622
+ EventManager,
3623
+ DOMRenderer,
3624
+ ComponentRegistry,
3625
+ ApplicatorRegistry
3336
3626
  };
3337
3627
 
3338
- //# debugId=59360259C9BC50B664756E2164756E21
3628
+ //# debugId=B4E923D0EBE0B01664756E2164756E21