@hypen-space/web 0.4.2 → 0.4.5

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 (114) hide show
  1. package/dist/canvas/accessibility.d.ts +47 -0
  2. package/dist/canvas/events.d.ts +87 -0
  3. package/dist/canvas/index.d.ts +11 -0
  4. package/dist/canvas/index.js +32 -14
  5. package/dist/canvas/index.js.map +7 -7
  6. package/dist/canvas/input.d.ts +63 -0
  7. package/dist/canvas/input.js +14 -2
  8. package/dist/canvas/input.js.map +3 -3
  9. package/dist/canvas/layout.d.ts +10 -0
  10. package/dist/canvas/layout.js +17 -12
  11. package/dist/canvas/layout.js.map +4 -4
  12. package/dist/canvas/paint.d.ts +14 -0
  13. package/dist/canvas/paint.js +3 -2
  14. package/dist/canvas/paint.js.map +4 -4
  15. package/dist/canvas/renderer.d.ts +99 -0
  16. package/dist/canvas/renderer.js +32 -14
  17. package/dist/canvas/renderer.js.map +7 -7
  18. package/dist/canvas/text.d.ts +22 -0
  19. package/dist/canvas/text.js +2 -2
  20. package/dist/canvas/text.js.map +2 -2
  21. package/dist/canvas/types.d.ts +96 -0
  22. package/dist/canvas/utils.d.ts +44 -0
  23. package/dist/client.d.ts +19 -0
  24. package/dist/client.js +106 -43
  25. package/dist/client.js.map +12 -11
  26. package/dist/dom/applicators/advanced-layout.d.ts +5 -0
  27. package/dist/dom/applicators/advanced-layout.js +1 -114
  28. package/dist/dom/applicators/advanced-layout.js.map +4 -5
  29. package/dist/dom/applicators/background.d.ts +5 -0
  30. package/dist/dom/applicators/border.d.ts +5 -0
  31. package/dist/dom/applicators/color.d.ts +5 -0
  32. package/dist/dom/applicators/display.d.ts +5 -0
  33. package/dist/dom/applicators/effects.d.ts +5 -0
  34. package/dist/dom/applicators/events.d.ts +8 -0
  35. package/dist/dom/applicators/events.js +55 -3
  36. package/dist/dom/applicators/events.js.map +3 -3
  37. package/dist/dom/applicators/font.d.ts +29 -0
  38. package/dist/dom/applicators/index.d.ts +76 -0
  39. package/dist/dom/applicators/index.js +55 -9
  40. package/dist/dom/applicators/index.js.map +4 -4
  41. package/dist/dom/applicators/layout.d.ts +10 -0
  42. package/dist/dom/applicators/margin.d.ts +11 -0
  43. package/dist/dom/applicators/padding.d.ts +11 -0
  44. package/dist/dom/applicators/size.d.ts +14 -0
  45. package/dist/dom/applicators/transform.d.ts +5 -0
  46. package/dist/dom/applicators/transition.d.ts +5 -0
  47. package/dist/dom/applicators/types.d.ts +6 -0
  48. package/dist/dom/applicators/typography.d.ts +5 -0
  49. package/dist/dom/canvas/index.d.ts +12 -0
  50. package/dist/dom/components/app.d.ts +8 -0
  51. package/dist/dom/components/app.js +55 -0
  52. package/dist/dom/components/app.js.map +10 -0
  53. package/dist/dom/components/audio.d.ts +5 -0
  54. package/dist/dom/components/avatar.d.ts +5 -0
  55. package/dist/dom/components/badge.d.ts +5 -0
  56. package/dist/dom/components/button.d.ts +9 -0
  57. package/dist/dom/components/card.d.ts +5 -0
  58. package/dist/dom/components/center.d.ts +9 -0
  59. package/dist/dom/components/checkbox.d.ts +5 -0
  60. package/dist/dom/components/column.d.ts +8 -0
  61. package/dist/dom/components/container.d.ts +5 -0
  62. package/dist/dom/components/divider.d.ts +5 -0
  63. package/dist/dom/components/grid.d.ts +7 -0
  64. package/dist/dom/components/heading.d.ts +5 -0
  65. package/dist/dom/components/hypenapp.d.ts +19 -0
  66. package/dist/dom/components/hypenapp.js +2 -4
  67. package/dist/dom/components/hypenapp.js.map +3 -3
  68. package/dist/dom/components/image.d.ts +5 -0
  69. package/dist/dom/components/index.d.ts +29 -0
  70. package/dist/dom/components/index.js +29 -5
  71. package/dist/dom/components/index.js.map +7 -6
  72. package/dist/dom/components/input.d.ts +5 -0
  73. package/dist/dom/components/link.d.ts +5 -0
  74. package/dist/dom/components/list.d.ts +5 -0
  75. package/dist/dom/components/paragraph.d.ts +5 -0
  76. package/dist/dom/components/progressbar.d.ts +5 -0
  77. package/dist/dom/components/route.d.ts +6 -0
  78. package/dist/dom/components/route.js +2 -2
  79. package/dist/dom/components/route.js.map +2 -2
  80. package/dist/dom/components/router.d.ts +5 -0
  81. package/dist/dom/components/row.d.ts +7 -0
  82. package/dist/dom/components/select.d.ts +5 -0
  83. package/dist/dom/components/slider.d.ts +5 -0
  84. package/dist/dom/components/spacer.d.ts +5 -0
  85. package/dist/dom/components/spinner.d.ts +5 -0
  86. package/dist/dom/components/stack.d.ts +5 -0
  87. package/dist/dom/components/switch.d.ts +5 -0
  88. package/dist/dom/components/text.d.ts +5 -0
  89. package/dist/dom/components/textarea.d.ts +5 -0
  90. package/dist/dom/components/video.d.ts +5 -0
  91. package/dist/dom/debug.d.ts +63 -0
  92. package/dist/dom/debug.js +2 -2
  93. package/dist/dom/debug.js.map +2 -2
  94. package/dist/dom/element-data.d.ts +94 -0
  95. package/dist/dom/events.d.ts +39 -0
  96. package/dist/dom/events.js +2 -2
  97. package/dist/dom/events.js.map +2 -2
  98. package/dist/dom/index.d.ts +10 -0
  99. package/dist/dom/index.js +101 -25
  100. package/dist/dom/index.js.map +12 -11
  101. package/dist/dom/renderer.d.ts +115 -0
  102. package/dist/dom/renderer.js +100 -24
  103. package/dist/dom/renderer.js.map +11 -10
  104. package/dist/hypen.d.ts +140 -0
  105. package/dist/hypen.js +106 -43
  106. package/dist/hypen.js.map +12 -11
  107. package/dist/index.d.ts +28 -0
  108. package/dist/index.js +132 -38
  109. package/dist/index.js.map +17 -16
  110. package/package.json +3 -2
  111. package/src/canvas/input.ts +23 -1
  112. package/src/dom/applicators/events.ts +71 -0
  113. package/src/dom/renderer.ts +4 -4
  114. package/src/hypen.ts +7 -24
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Accessibility Layer
3
+ *
4
+ * Maintain shadow DOM for screen readers
5
+ */
6
+ import type { VirtualNode } from "./types.js";
7
+ /**
8
+ * Accessibility Manager
9
+ */
10
+ export declare class AccessibilityLayer {
11
+ private shadowRoot;
12
+ private nodeMap;
13
+ private enabled;
14
+ constructor(container: HTMLElement | null, enabled?: boolean);
15
+ /**
16
+ * Sync shadow DOM with virtual tree
17
+ */
18
+ syncTree(root: VirtualNode): void;
19
+ /**
20
+ * Create shadow DOM element for virtual node
21
+ */
22
+ private createShadowNode;
23
+ /**
24
+ * Get text content from node tree
25
+ */
26
+ private getNodeText;
27
+ /**
28
+ * Focus node in shadow DOM
29
+ */
30
+ focusNode(nodeId: string): void;
31
+ /**
32
+ * Update single node
33
+ */
34
+ updateNode(node: VirtualNode): void;
35
+ /**
36
+ * Get shadow element by node ID
37
+ */
38
+ getElement(nodeId: string): HTMLElement | undefined;
39
+ /**
40
+ * Enable or disable accessibility layer
41
+ */
42
+ setEnabled(enabled: boolean): void;
43
+ /**
44
+ * Cleanup
45
+ */
46
+ destroy(): void;
47
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Event System
3
+ *
4
+ * Hit testing and event handling for canvas nodes
5
+ */
6
+ import type { VirtualNode } from "./types.js";
7
+ interface IEngine {
8
+ dispatchAction(name: string, payload?: any): void;
9
+ }
10
+ /**
11
+ * Canvas Event Manager
12
+ */
13
+ export declare class CanvasEventManager {
14
+ private canvas;
15
+ private engine;
16
+ private rootNode;
17
+ private hoveredNode;
18
+ private focusedNode;
19
+ private mouseDownNode;
20
+ constructor(canvas: HTMLCanvasElement, engine: IEngine);
21
+ /**
22
+ * Set the root node for hit testing
23
+ */
24
+ setRootNode(node: VirtualNode | null): void;
25
+ /**
26
+ * Setup canvas event listeners
27
+ */
28
+ private setupEventListeners;
29
+ /**
30
+ * Get canvas coordinates from mouse event
31
+ */
32
+ private getCanvasCoordinates;
33
+ /**
34
+ * Find node at canvas coordinates
35
+ */
36
+ private hitTest;
37
+ /**
38
+ * Recursively test node and children
39
+ */
40
+ private hitTestNode;
41
+ /**
42
+ * Handle mouse move
43
+ */
44
+ private onMouseMove;
45
+ /**
46
+ * Handle mouse down
47
+ */
48
+ private onMouseDown;
49
+ /**
50
+ * Handle mouse up
51
+ */
52
+ private onMouseUp;
53
+ /**
54
+ * Handle click
55
+ */
56
+ private onClick;
57
+ /**
58
+ * Handle double click
59
+ */
60
+ private onDoubleClick;
61
+ /**
62
+ * Handle keyboard events
63
+ */
64
+ private onKeyDown;
65
+ private onKeyUp;
66
+ /**
67
+ * Set focused node
68
+ */
69
+ private setFocus;
70
+ /**
71
+ * Update cursor based on node
72
+ */
73
+ private updateCursor;
74
+ /**
75
+ * Dispatch event to engine
76
+ */
77
+ private dispatchNodeEvent;
78
+ /**
79
+ * Request redraw from renderer
80
+ */
81
+ private requestRedraw;
82
+ /**
83
+ * Cleanup
84
+ */
85
+ destroy(): void;
86
+ }
87
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Canvas Renderer for Hypen
3
+ *
4
+ * Browser-only module for rendering Hypen UI to Canvas
5
+ */
6
+ export { CanvasRenderer } from "./renderer.js";
7
+ export { registerPainter } from "./paint.js";
8
+ export { CanvasEventManager } from "./events.js";
9
+ export { InputOverlay } from "./input.js";
10
+ export { AccessibilityLayer } from "./accessibility.js";
11
+ export type { VirtualNode, Layout, Rectangle, Point, FontStyle, TextStyle, TextMetrics, CanvasRendererOptions, PainterFunction, LayoutFunction, } from "./types.js";
@@ -151,7 +151,7 @@ function getAbsoluteBounds(node) {
151
151
  }
152
152
 
153
153
  // src/canvas/text.ts
154
- import { frameworkLoggers } from "@hypen-space/core";
154
+ import { frameworkLoggers } from "@hypen-space/core/logger";
155
155
  var log = frameworkLoggers.canvas;
156
156
  var textMetricsCache = new Map;
157
157
  function getCacheKey(text, fontStyle, maxWidth) {
@@ -287,7 +287,12 @@ function computeLayout(ctx, node, availableWidth, availableHeight, x = 0, y = 0)
287
287
  let width = parseSize(props.width);
288
288
  let height = parseSize(props.height);
289
289
  const type = node.type.toLowerCase();
290
- if (type === "spacer") {
290
+ if (type === "app") {
291
+ if (width === null)
292
+ width = availableAfterMargin.width;
293
+ if (height === null)
294
+ height = availableAfterMargin.height;
295
+ } else if (type === "spacer") {
291
296
  if (width === null)
292
297
  width = availableAfterMargin.width;
293
298
  if (height === null)
@@ -410,10 +415,10 @@ function layoutChildren(ctx, parent) {
410
415
  return;
411
416
  }
412
417
  const flexDirection = props.flexDirection || (parent.type === "column" ? "column" : "row");
413
- const justifyContent = props.justifyContent || "flex-start";
414
- const alignItems = props.alignItems || "flex-start";
415
- const gap = parseFloat(props.gap) || 0;
416
418
  const isColumn = flexDirection === "column";
419
+ const justifyContent = isColumn ? props.verticalAlignment || "flex-start" : props.horizontalAlignment || "flex-start";
420
+ const alignItems = isColumn ? props.horizontalAlignment || "flex-start" : props.verticalAlignment || "flex-start";
421
+ const gap = parseFloat(props.gap) || 0;
417
422
  const availableWidth = layout.contentWidth;
418
423
  const availableHeight = layout.contentHeight;
419
424
  const childInfo = [];
@@ -526,8 +531,8 @@ function layoutChildren(ctx, parent) {
526
531
  function layoutStackChildren(ctx, parent) {
527
532
  const layout = parent.layout;
528
533
  const props = parent.props;
529
- const alignItems = props.alignItems || "flex-start";
530
- const justifyContent = props.justifyContent || "flex-start";
534
+ const horizontalAlignment = props.horizontalAlignment || "flex-start";
535
+ const verticalAlignment = props.verticalAlignment || "flex-start";
531
536
  const availableWidth = layout.contentWidth;
532
537
  const availableHeight = layout.contentHeight;
533
538
  for (const child of parent.children) {
@@ -535,14 +540,14 @@ function layoutStackChildren(ctx, parent) {
535
540
  const childLayout = child.layout;
536
541
  let x = 0;
537
542
  let y = 0;
538
- if (alignItems === "center") {
543
+ if (horizontalAlignment === "center") {
539
544
  x = (availableWidth - childLayout.width) / 2;
540
- } else if (alignItems === "flex-end") {
545
+ } else if (horizontalAlignment === "flex-end") {
541
546
  x = availableWidth - childLayout.width;
542
547
  }
543
- if (justifyContent === "center") {
548
+ if (verticalAlignment === "center") {
544
549
  y = (availableHeight - childLayout.height) / 2;
545
- } else if (justifyContent === "flex-end") {
550
+ } else if (verticalAlignment === "flex-end") {
546
551
  y = availableHeight - childLayout.height;
547
552
  }
548
553
  childLayout.x = layout.x + layout.contentX + x;
@@ -629,6 +634,7 @@ function paintNode(ctx, node) {
629
634
  case "link":
630
635
  paintLink(ctx, node);
631
636
  break;
637
+ case "app":
632
638
  case "container":
633
639
  case "box":
634
640
  paintContainer(ctx, node);
@@ -1607,13 +1613,17 @@ class InputOverlay {
1607
1613
  overlay = null;
1608
1614
  focusedNode = null;
1609
1615
  onChangeCallback = null;
1616
+ bindPath = null;
1617
+ engine = null;
1610
1618
  constructor(container) {
1611
1619
  this.container = container || {};
1612
1620
  }
1613
- showInput(node, canvasBounds, onChange) {
1621
+ showInput(node, canvasBounds, onChange, engine) {
1614
1622
  if (typeof document === "undefined")
1615
1623
  return;
1616
1624
  this.hideInput();
1625
+ this.bindPath = node.props.bind || null;
1626
+ this.engine = engine || null;
1617
1627
  const bounds = getAbsoluteBounds(node);
1618
1628
  if (!bounds)
1619
1629
  return;
@@ -1637,6 +1647,8 @@ class InputOverlay {
1637
1647
  }
1638
1648
  this.focusedNode = null;
1639
1649
  this.onChangeCallback = null;
1650
+ this.bindPath = null;
1651
+ this.engine = null;
1640
1652
  }
1641
1653
  updatePosition(node, canvasBounds) {
1642
1654
  if (!this.overlay || node !== this.focusedNode)
@@ -1698,6 +1710,12 @@ class InputOverlay {
1698
1710
  return;
1699
1711
  const value = this.overlay.value;
1700
1712
  this.onChangeCallback(value);
1713
+ if (this.bindPath && this.engine) {
1714
+ this.engine.dispatchAction("__hypen_bind", {
1715
+ path: this.bindPath,
1716
+ value
1717
+ });
1718
+ }
1701
1719
  }
1702
1720
  onBlur() {
1703
1721
  this.hideInput();
@@ -1867,7 +1885,7 @@ class AccessibilityLayer {
1867
1885
  }
1868
1886
 
1869
1887
  // src/canvas/renderer.ts
1870
- import { frameworkLoggers as frameworkLoggers2 } from "@hypen-space/core";
1888
+ import { frameworkLoggers as frameworkLoggers2 } from "@hypen-space/core/logger";
1871
1889
  var log2 = frameworkLoggers2.canvas;
1872
1890
  var DEFAULT_OPTIONS = {
1873
1891
  devicePixelRatio: typeof window !== "undefined" ? window.devicePixelRatio || 1 : 1,
@@ -2125,4 +2143,4 @@ export {
2125
2143
  AccessibilityLayer
2126
2144
  };
2127
2145
 
2128
- //# debugId=5566A76F8B6DBF0364756E2164756E21
2146
+ //# debugId=06AE7056BD2C8A3364756E2164756E21