@hypen-space/web 0.4.36 → 0.4.37

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 (139) hide show
  1. package/dist/canvas/accessibility.js +174 -174
  2. package/dist/canvas/accessibility.js.map +1 -10
  3. package/dist/canvas/events.js +264 -360
  4. package/dist/canvas/events.js.map +1 -11
  5. package/dist/canvas/index.js +11 -47
  6. package/dist/canvas/index.js.map +1 -9
  7. package/dist/canvas/input.js +178 -289
  8. package/dist/canvas/input.js.map +1 -11
  9. package/dist/canvas/layout.js +349 -547
  10. package/dist/canvas/layout.js.map +1 -12
  11. package/dist/canvas/paint.js +1122 -1146
  12. package/dist/canvas/paint.js.map +1 -12
  13. package/dist/canvas/renderer.js +352 -2259
  14. package/dist/canvas/renderer.js.map +1 -17
  15. package/dist/canvas/text.js +129 -264
  16. package/dist/canvas/text.js.map +1 -11
  17. package/dist/canvas/types.js +7 -2
  18. package/dist/canvas/types.js.map +1 -9
  19. package/dist/canvas/utils.js +158 -161
  20. package/dist/canvas/utils.js.map +1 -10
  21. package/dist/client.js +19 -45
  22. package/dist/client.js.map +1 -9
  23. package/dist/dom/applicators/advanced-layout.js +105 -138
  24. package/dist/dom/applicators/advanced-layout.js.map +1 -10
  25. package/dist/dom/applicators/background.js +36 -76
  26. package/dist/dom/applicators/background.js.map +1 -10
  27. package/dist/dom/applicators/border.js +82 -106
  28. package/dist/dom/applicators/border.js.map +1 -10
  29. package/dist/dom/applicators/color.js +17 -58
  30. package/dist/dom/applicators/color.js.map +1 -10
  31. package/dist/dom/applicators/display.js +39 -79
  32. package/dist/dom/applicators/display.js.map +1 -10
  33. package/dist/dom/applicators/effects.js +121 -147
  34. package/dist/dom/applicators/effects.js.map +1 -10
  35. package/dist/dom/applicators/events.js +413 -450
  36. package/dist/dom/applicators/events.js.map +1 -11
  37. package/dist/dom/applicators/font.js +119 -140
  38. package/dist/dom/applicators/font.js.map +1 -10
  39. package/dist/dom/applicators/index.js +386 -1770
  40. package/dist/dom/applicators/index.js.map +1 -26
  41. package/dist/dom/applicators/layout.js +143 -149
  42. package/dist/dom/applicators/layout.js.map +1 -10
  43. package/dist/dom/applicators/margin.js +64 -105
  44. package/dist/dom/applicators/margin.js.map +1 -10
  45. package/dist/dom/applicators/padding.js +64 -105
  46. package/dist/dom/applicators/padding.js.map +1 -10
  47. package/dist/dom/applicators/size.js +169 -172
  48. package/dist/dom/applicators/size.js.map +1 -10
  49. package/dist/dom/applicators/transform.js +73 -114
  50. package/dist/dom/applicators/transform.js.map +1 -10
  51. package/dist/dom/applicators/transition.js +47 -88
  52. package/dist/dom/applicators/transition.js.map +1 -10
  53. package/dist/dom/applicators/types.js +7 -2
  54. package/dist/dom/applicators/types.js.map +1 -9
  55. package/dist/dom/applicators/typography.js +68 -109
  56. package/dist/dom/applicators/typography.js.map +1 -10
  57. package/dist/dom/canvas/index.js +49 -83
  58. package/dist/dom/canvas/index.js.map +1 -10
  59. package/dist/dom/components/app.js +16 -63
  60. package/dist/dom/components/app.js.map +1 -10
  61. package/dist/dom/components/audio.js +31 -76
  62. package/dist/dom/components/audio.js.map +1 -10
  63. package/dist/dom/components/avatar.js +41 -87
  64. package/dist/dom/components/avatar.js.map +1 -10
  65. package/dist/dom/components/badge.js +35 -83
  66. package/dist/dom/components/badge.js.map +1 -10
  67. package/dist/dom/components/button.js +26 -69
  68. package/dist/dom/components/button.js.map +1 -10
  69. package/dist/dom/components/card.js +13 -63
  70. package/dist/dom/components/card.js.map +1 -10
  71. package/dist/dom/components/center.js +21 -65
  72. package/dist/dom/components/center.js.map +1 -10
  73. package/dist/dom/components/checkbox.js +37 -82
  74. package/dist/dom/components/checkbox.js.map +1 -10
  75. package/dist/dom/components/column.js +16 -62
  76. package/dist/dom/components/column.js.map +1 -10
  77. package/dist/dom/components/container.js +11 -59
  78. package/dist/dom/components/container.js.map +1 -10
  79. package/dist/dom/components/divider.js +27 -73
  80. package/dist/dom/components/divider.js.map +1 -10
  81. package/dist/dom/components/grid.js +41 -80
  82. package/dist/dom/components/grid.js.map +1 -10
  83. package/dist/dom/components/heading.js +28 -74
  84. package/dist/dom/components/heading.js.map +1 -10
  85. package/dist/dom/components/hypenapp.js +291 -288
  86. package/dist/dom/components/hypenapp.js.map +1 -10
  87. package/dist/dom/components/image.js +18 -67
  88. package/dist/dom/components/image.js.map +1 -10
  89. package/dist/dom/components/index.js +109 -1427
  90. package/dist/dom/components/index.js.map +1 -42
  91. package/dist/dom/components/input.js +19 -69
  92. package/dist/dom/components/input.js.map +1 -10
  93. package/dist/dom/components/link.js +23 -70
  94. package/dist/dom/components/link.js.map +1 -10
  95. package/dist/dom/components/list.js +26 -72
  96. package/dist/dom/components/list.js.map +1 -10
  97. package/dist/dom/components/paragraph.js +14 -63
  98. package/dist/dom/components/paragraph.js.map +1 -10
  99. package/dist/dom/components/progressbar.js +38 -85
  100. package/dist/dom/components/progressbar.js.map +1 -10
  101. package/dist/dom/components/route.js +27 -73
  102. package/dist/dom/components/route.js.map +1 -10
  103. package/dist/dom/components/router.js +15 -62
  104. package/dist/dom/components/router.js.map +1 -10
  105. package/dist/dom/components/row.js +25 -70
  106. package/dist/dom/components/row.js.map +1 -10
  107. package/dist/dom/components/select.js +42 -85
  108. package/dist/dom/components/select.js.map +1 -10
  109. package/dist/dom/components/slider.js +31 -76
  110. package/dist/dom/components/slider.js.map +1 -10
  111. package/dist/dom/components/spacer.js +10 -60
  112. package/dist/dom/components/spacer.js.map +1 -10
  113. package/dist/dom/components/spinner.js +41 -88
  114. package/dist/dom/components/spinner.js.map +1 -10
  115. package/dist/dom/components/stack.js +19 -67
  116. package/dist/dom/components/stack.js.map +1 -10
  117. package/dist/dom/components/switch.js +50 -93
  118. package/dist/dom/components/switch.js.map +1 -10
  119. package/dist/dom/components/text.js +24 -69
  120. package/dist/dom/components/text.js.map +1 -10
  121. package/dist/dom/components/textarea.js +35 -79
  122. package/dist/dom/components/textarea.js.map +1 -10
  123. package/dist/dom/components/video.js +35 -79
  124. package/dist/dom/components/video.js.map +1 -10
  125. package/dist/dom/debug.js +159 -160
  126. package/dist/dom/debug.js.map +1 -10
  127. package/dist/dom/element-data.js +181 -143
  128. package/dist/dom/element-data.js.map +1 -10
  129. package/dist/dom/events.js +133 -142
  130. package/dist/dom/events.js.map +1 -10
  131. package/dist/dom/index.js +11 -48
  132. package/dist/dom/index.js.map +1 -9
  133. package/dist/dom/renderer.js +311 -3596
  134. package/dist/dom/renderer.js.map +1 -62
  135. package/dist/hypen.js +385 -3880
  136. package/dist/hypen.js.map +1 -63
  137. package/dist/index.js +36 -53
  138. package/dist/index.js.map +1 -9
  139. package/package.json +2 -2
@@ -1,11 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/canvas/utils.ts", "../src/canvas/events.ts"],
4
- "sourcesContent": [
5
- "/**\n * Canvas Renderer Utilities\n *\n * Common utility functions\n */\n\nimport type { BoxSpacing, Rectangle, Point, VirtualNode } from \"./types.js\";\n\n/**\n * Parse spacing value (margin, padding)\n * Supports: number, \"10\", \"10 20\", \"10 20 30 40\"\n */\nexport function parseSpacing(value: any): BoxSpacing {\n if (typeof value === \"number\") {\n return { top: value, right: value, bottom: value, left: value };\n }\n\n if (typeof value === \"string\") {\n const parts = value.split(/\\s+/).map((v) => parseFloat(v) || 0);\n if (parts.length === 1) {\n return { top: parts[0], right: parts[0], bottom: parts[0], left: parts[0] };\n }\n if (parts.length === 2) {\n return { top: parts[0], right: parts[1], bottom: parts[0], left: parts[1] };\n }\n if (parts.length === 4) {\n return { top: parts[0], right: parts[1], bottom: parts[2], left: parts[3] };\n }\n }\n\n if (typeof value === \"object\" && value !== null) {\n return {\n top: parseFloat(value.top) || 0,\n right: parseFloat(value.right) || 0,\n bottom: parseFloat(value.bottom) || 0,\n left: parseFloat(value.left) || 0,\n };\n }\n\n return { top: 0, right: 0, bottom: 0, left: 0 };\n}\n\n/**\n * Parse size value (width, height)\n * Returns pixel value or null for \"auto\"\n */\nexport function parseSize(value: any): number | null {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n if (value === \"auto\") return null;\n const num = parseFloat(value);\n return isNaN(num) ? null : num;\n }\n return null;\n}\n\n/**\n * Check if point is inside rectangle\n */\nexport function isPointInRect(point: Point, rect: Rectangle): boolean {\n return (\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height\n );\n}\n\n/**\n * Check if point is inside rounded rectangle\n */\nexport function isPointInRoundedRect(\n point: Point,\n rect: Rectangle,\n radius: number\n): boolean {\n const { x, y, width, height } = rect;\n\n // Quick reject if outside bounding box\n if (!isPointInRect(point, rect)) return false;\n\n // No radius means simple rectangle\n if (radius <= 0) return true;\n\n const px = point.x;\n const py = point.y;\n\n // Check corners\n // Top-left\n if (px < x + radius && py < y + radius) {\n return Math.pow(px - (x + radius), 2) + Math.pow(py - (y + radius), 2) <= Math.pow(radius, 2);\n }\n\n // Top-right\n if (px > x + width - radius && py < y + radius) {\n return (\n Math.pow(px - (x + width - radius), 2) + Math.pow(py - (y + radius), 2) <=\n Math.pow(radius, 2)\n );\n }\n\n // Bottom-left\n if (px < x + radius && py > y + height - radius) {\n return (\n Math.pow(px - (x + radius), 2) + Math.pow(py - (y + height - radius), 2) <=\n Math.pow(radius, 2)\n );\n }\n\n // Bottom-right\n if (px > x + width - radius && py > y + height - radius) {\n return (\n Math.pow(px - (x + width - radius), 2) + Math.pow(py - (y + height - radius), 2) <=\n Math.pow(radius, 2)\n );\n }\n\n // Inside rectangle\n return true;\n}\n\n/**\n * Merge rectangles into bounding box\n */\nexport function mergeRects(rects: Rectangle[]): Rectangle | null {\n if (rects.length === 0) return null;\n if (rects.length === 1) return rects[0];\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const rect of rects) {\n minX = Math.min(minX, rect.x);\n minY = Math.min(minY, rect.y);\n maxX = Math.max(maxX, rect.x + rect.width);\n maxY = Math.max(maxY, rect.y + rect.height);\n }\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n\n/**\n * Create a canvas font string from font style\n */\nexport function createFontString(\n fontSize: number,\n fontWeight: string | number,\n fontFamily: string\n): string {\n return `${fontWeight} ${fontSize}px ${fontFamily}`;\n}\n\n/**\n * Walk tree depth-first\n */\nexport function walkTree(node: VirtualNode, callback: (node: VirtualNode) => void): void {\n callback(node);\n for (const child of node.children) {\n walkTree(child, callback);\n }\n}\n\n/**\n * Find node by ID in tree\n */\nexport function findNodeById(root: VirtualNode, id: string): VirtualNode | null {\n if (root.id === id) return root;\n\n for (const child of root.children) {\n const found = findNodeById(child, id);\n if (found) return found;\n }\n\n return null;\n}\n\n/**\n * Get absolute bounds of node (including transformations)\n */\nexport function getAbsoluteBounds(node: VirtualNode): Rectangle | null {\n if (!node.layout) return null;\n\n let x = node.layout.x;\n let y = node.layout.y;\n\n // Walk up tree to accumulate offsets\n let current = node.parent;\n while (current && current.layout) {\n x += current.layout.contentX;\n y += current.layout.contentY;\n current = current.parent;\n }\n\n return {\n x,\n y,\n width: node.layout.width,\n height: node.layout.height,\n };\n}\n\n\n\n\n\n\n\n\n\n\n\n",
6
- "/**\n * Event System\n *\n * Hit testing and event handling for canvas nodes\n */\n\nimport type { VirtualNode, Point } from \"./types.js\";\nimport { isPointInRoundedRect, getAbsoluteBounds } from \"./utils.js\";\n\n// Interface for the engine that CanvasEventManager needs\ninterface IEngine {\n dispatchAction(name: string, payload?: any): void;\n}\n\n/**\n * Canvas Event Manager\n */\nexport class CanvasEventManager {\n private canvas: HTMLCanvasElement;\n private engine: IEngine;\n private rootNode: VirtualNode | null = null;\n private hoveredNode: VirtualNode | null = null;\n private focusedNode: VirtualNode | null = null;\n private mouseDownNode: VirtualNode | null = null;\n\n // Bound handler references for cleanup\n private boundOnMouseMove!: (e: MouseEvent) => void;\n private boundOnMouseDown!: (e: MouseEvent) => void;\n private boundOnMouseUp!: (e: MouseEvent) => void;\n private boundOnClick!: (e: MouseEvent) => void;\n private boundOnDoubleClick!: (e: MouseEvent) => void;\n private boundOnKeyDown!: (e: KeyboardEvent) => void;\n private boundOnKeyUp!: (e: KeyboardEvent) => void;\n\n constructor(canvas: HTMLCanvasElement, engine: IEngine) {\n this.canvas = canvas;\n this.engine = engine;\n this.setupEventListeners();\n }\n\n /**\n * Set the root node for hit testing\n */\n setRootNode(node: VirtualNode | null): void {\n this.rootNode = node;\n }\n\n /**\n * Setup canvas event listeners\n */\n private setupEventListeners(): void {\n this.boundOnMouseMove = this.onMouseMove.bind(this);\n this.boundOnMouseDown = this.onMouseDown.bind(this);\n this.boundOnMouseUp = this.onMouseUp.bind(this);\n this.boundOnClick = this.onClick.bind(this);\n this.boundOnDoubleClick = this.onDoubleClick.bind(this);\n this.boundOnKeyDown = this.onKeyDown.bind(this);\n this.boundOnKeyUp = this.onKeyUp.bind(this);\n\n this.canvas.addEventListener(\"mousemove\", this.boundOnMouseMove);\n this.canvas.addEventListener(\"mousedown\", this.boundOnMouseDown);\n this.canvas.addEventListener(\"mouseup\", this.boundOnMouseUp);\n this.canvas.addEventListener(\"click\", this.boundOnClick);\n this.canvas.addEventListener(\"dblclick\", this.boundOnDoubleClick);\n this.canvas.addEventListener(\"keydown\", this.boundOnKeyDown);\n this.canvas.addEventListener(\"keyup\", this.boundOnKeyUp);\n }\n\n /**\n * Get canvas coordinates from mouse event\n */\n private getCanvasCoordinates(e: MouseEvent): Point {\n const rect = this.canvas.getBoundingClientRect();\n const scaleX = this.canvas.width / rect.width;\n const scaleY = this.canvas.height / rect.height;\n\n return {\n x: (e.clientX - rect.left) * scaleX,\n y: (e.clientY - rect.top) * scaleY,\n };\n }\n\n /**\n * Find node at canvas coordinates\n */\n private hitTest(point: Point): VirtualNode | null {\n if (!this.rootNode) return null;\n return this.hitTestNode(this.rootNode, point);\n }\n\n /**\n * Recursively test node and children\n */\n private hitTestNode(node: VirtualNode, point: Point): VirtualNode | null {\n if (!node.visible || !node.layout) return null;\n\n const bounds = getAbsoluteBounds(node);\n if (!bounds) return null;\n\n // Test children first (front to back)\n for (let i = node.children.length - 1; i >= 0; i--) {\n const child = node.children[i];\n const hit = this.hitTestNode(child, point);\n if (hit) return hit;\n }\n\n // Test this node\n const radius = node.layout.border.radius;\n if (isPointInRoundedRect(point, bounds, radius)) {\n return node;\n }\n\n return null;\n }\n\n /**\n * Handle mouse move\n */\n private onMouseMove(e: MouseEvent): void {\n const point = this.getCanvasCoordinates(e);\n const node = this.hitTest(point);\n\n // Update hover state\n if (node !== this.hoveredNode) {\n // Leave old node\n if (this.hoveredNode) {\n this.hoveredNode.hovered = false;\n this.dispatchNodeEvent(this.hoveredNode, \"mouseleave\", {});\n }\n\n // Enter new node\n this.hoveredNode = node;\n if (node) {\n node.hovered = true;\n this.dispatchNodeEvent(node, \"mouseenter\", {});\n }\n\n // Update cursor\n this.updateCursor(node);\n\n // Request redraw for hover effects\n this.requestRedraw();\n }\n }\n\n /**\n * Handle mouse down\n */\n private onMouseDown(e: MouseEvent): void {\n const point = this.getCanvasCoordinates(e);\n const node = this.hitTest(point);\n\n this.mouseDownNode = node;\n\n if (node && node.clickable) {\n this.dispatchNodeEvent(node, \"mousedown\", {\n button: e.button,\n clientX: e.clientX,\n clientY: e.clientY,\n });\n }\n\n // Update focus\n if (node && node.focusable) {\n this.setFocus(node);\n } else {\n this.setFocus(null);\n }\n }\n\n /**\n * Handle mouse up\n */\n private onMouseUp(e: MouseEvent): void {\n const point = this.getCanvasCoordinates(e);\n const node = this.hitTest(point);\n\n if (node && node.clickable) {\n this.dispatchNodeEvent(node, \"mouseup\", {\n button: e.button,\n clientX: e.clientX,\n clientY: e.clientY,\n });\n }\n\n this.mouseDownNode = null;\n }\n\n /**\n * Handle click\n */\n private onClick(e: MouseEvent): void {\n const point = this.getCanvasCoordinates(e);\n const node = this.hitTest(point);\n\n if (node && node.clickable && node === this.mouseDownNode) {\n this.dispatchNodeEvent(node, \"click\", {\n button: e.button,\n clientX: e.clientX,\n clientY: e.clientY,\n });\n }\n }\n\n /**\n * Handle double click\n */\n private onDoubleClick(e: MouseEvent): void {\n const point = this.getCanvasCoordinates(e);\n const node = this.hitTest(point);\n\n if (node && node.clickable) {\n this.dispatchNodeEvent(node, \"dblclick\", {\n button: e.button,\n clientX: e.clientX,\n clientY: e.clientY,\n });\n }\n }\n\n /**\n * Handle keyboard events\n */\n private onKeyDown(e: KeyboardEvent): void {\n if (this.focusedNode) {\n this.dispatchNodeEvent(this.focusedNode, \"keydown\", {\n key: e.key,\n code: e.code,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n });\n }\n }\n\n private onKeyUp(e: KeyboardEvent): void {\n if (this.focusedNode) {\n this.dispatchNodeEvent(this.focusedNode, \"keyup\", {\n key: e.key,\n code: e.code,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n });\n }\n }\n\n /**\n * Set focused node\n */\n private setFocus(node: VirtualNode | null): void {\n if (node === this.focusedNode) return;\n\n if (this.focusedNode) {\n this.focusedNode.focused = false;\n this.dispatchNodeEvent(this.focusedNode, \"blur\", {});\n }\n\n this.focusedNode = node;\n\n if (node) {\n node.focused = true;\n this.dispatchNodeEvent(node, \"focus\", {});\n }\n\n this.requestRedraw();\n }\n\n /**\n * Update cursor based on node\n */\n private updateCursor(node: VirtualNode | null): void {\n if (!node) {\n this.canvas.style.cursor = \"default\";\n return;\n }\n\n const cursor = node.props.cursor || (node.clickable ? \"pointer\" : \"default\");\n this.canvas.style.cursor = cursor;\n }\n\n /**\n * Dispatch event to engine\n */\n private dispatchNodeEvent(node: VirtualNode, eventType: string, data: any): void {\n // Check if node has action handler for this event\n const actionName = node.props[`on${eventType}`] || node.props[eventType];\n\n if (actionName && typeof actionName === \"string\") {\n // Dispatch to engine\n this.engine.dispatchAction(actionName, {\n type: eventType,\n nodeId: node.id,\n timestamp: Date.now(),\n ...data,\n });\n }\n }\n\n /**\n * Request redraw from renderer\n */\n private requestRedraw(): void {\n // This will be called via a callback set by the renderer\n // For now, dispatch a custom event\n this.canvas.dispatchEvent(new CustomEvent(\"hypen:redraw\"));\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n this.canvas.removeEventListener(\"mousemove\", this.boundOnMouseMove);\n this.canvas.removeEventListener(\"mousedown\", this.boundOnMouseDown);\n this.canvas.removeEventListener(\"mouseup\", this.boundOnMouseUp);\n this.canvas.removeEventListener(\"click\", this.boundOnClick);\n this.canvas.removeEventListener(\"dblclick\", this.boundOnDoubleClick);\n this.canvas.removeEventListener(\"keydown\", this.boundOnKeyDown);\n this.canvas.removeEventListener(\"keyup\", this.boundOnKeyUp);\n this.rootNode = null;\n this.hoveredNode = null;\n this.focusedNode = null;\n this.mouseDownNode = null;\n }\n}\n\n\n\n\n\n\n\n\n\n"
7
- ],
8
- "mappings": "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",
9
- "debugId": "69654AED1A0C380A64756E2164756E21",
10
- "names": []
11
- }
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/canvas/events.ts"],"names":[],"mappings":"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"}
@@ -1,47 +1,11 @@
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
- export {
40
- registerPainter,
41
- InputOverlay,
42
- CanvasRenderer,
43
- CanvasEventManager,
44
- AccessibilityLayer
45
- };
46
-
47
- //# debugId=BA9D7DE7BA1C35A364756E2164756E21
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
+ //# sourceMappingURL=index.js.map
@@ -1,9 +1 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [
5
- ],
6
- "mappings": "",
7
- "debugId": "BA9D7DE7BA1C35A364756E2164756E21",
8
- "names": []
9
- }
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/canvas/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,299 +1,188 @@
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/canvas/utils.ts
41
- function parseSpacing(value) {
42
- if (typeof value === "number") {
43
- return { top: value, right: value, bottom: value, left: value };
44
- }
45
- if (typeof value === "string") {
46
- const parts = value.split(/\s+/).map((v) => parseFloat(v) || 0);
47
- if (parts.length === 1) {
48
- return { top: parts[0], right: parts[0], bottom: parts[0], left: parts[0] };
1
+ /**
2
+ * Input Overlay System
3
+ *
4
+ * Handle text input using DOM overlay elements
5
+ */
6
+ import { getAbsoluteBounds } from "./utils.js";
7
+ /**
8
+ * Input Overlay Manager
9
+ */
10
+ export class InputOverlay {
11
+ container;
12
+ overlay = null;
13
+ focusedNode = null;
14
+ onChangeCallback = null;
15
+ bindPath = null;
16
+ engine = null;
17
+ constructor(container) {
18
+ this.container = container || {};
49
19
  }
50
- if (parts.length === 2) {
51
- return { top: parts[0], right: parts[1], bottom: parts[0], left: parts[1] };
20
+ /**
21
+ * Show input overlay for a node
22
+ */
23
+ showInput(node, canvasBounds, onChange, engine) {
24
+ // Skip if document is not available (non-browser environment)
25
+ if (typeof document === "undefined")
26
+ return;
27
+ this.hideInput();
28
+ // Store bind path and engine for two-way binding
29
+ this.bindPath = node.props.bind || null;
30
+ this.engine = engine || null;
31
+ const bounds = getAbsoluteBounds(node);
32
+ if (!bounds)
33
+ return;
34
+ const isMultiline = node.type === "textarea";
35
+ this.overlay = isMultiline
36
+ ? document.createElement("textarea")
37
+ : document.createElement("input");
38
+ // Style overlay
39
+ this.styleOverlay(node, bounds, canvasBounds);
40
+ // Set initial value
41
+ const value = node.props.value || "";
42
+ this.overlay.value = value;
43
+ // Setup event handlers
44
+ this.onChangeCallback = onChange;
45
+ this.overlay.addEventListener("input", this.onInput.bind(this));
46
+ this.overlay.addEventListener("blur", this.onBlur.bind(this));
47
+ this.overlay.addEventListener("keydown", this.onKeyDown.bind(this));
48
+ // Add to DOM and focus
49
+ this.container.appendChild(this.overlay);
50
+ this.overlay.focus();
51
+ this.focusedNode = node;
52
52
  }
53
- if (parts.length === 4) {
54
- return { top: parts[0], right: parts[1], bottom: parts[2], left: parts[3] };
53
+ /**
54
+ * Hide input overlay
55
+ */
56
+ hideInput() {
57
+ if (this.overlay) {
58
+ this.overlay.remove();
59
+ this.overlay = null;
60
+ }
61
+ this.focusedNode = null;
62
+ this.onChangeCallback = null;
63
+ this.bindPath = null;
64
+ this.engine = null;
55
65
  }
56
- }
57
- if (typeof value === "object" && value !== null) {
58
- return {
59
- top: parseFloat(value.top) || 0,
60
- right: parseFloat(value.right) || 0,
61
- bottom: parseFloat(value.bottom) || 0,
62
- left: parseFloat(value.left) || 0
63
- };
64
- }
65
- return { top: 0, right: 0, bottom: 0, left: 0 };
66
- }
67
- function parseSize(value) {
68
- if (typeof value === "number")
69
- return value;
70
- if (typeof value === "string") {
71
- if (value === "auto")
72
- return null;
73
- const num = parseFloat(value);
74
- return isNaN(num) ? null : num;
75
- }
76
- return null;
77
- }
78
- function isPointInRect(point, rect) {
79
- return point.x >= rect.x && point.x <= rect.x + rect.width && point.y >= rect.y && point.y <= rect.y + rect.height;
80
- }
81
- function isPointInRoundedRect(point, rect, radius) {
82
- const { x, y, width, height } = rect;
83
- if (!isPointInRect(point, rect))
84
- return false;
85
- if (radius <= 0)
86
- return true;
87
- const px = point.x;
88
- const py = point.y;
89
- if (px < x + radius && py < y + radius) {
90
- return Math.pow(px - (x + radius), 2) + Math.pow(py - (y + radius), 2) <= Math.pow(radius, 2);
91
- }
92
- if (px > x + width - radius && py < y + radius) {
93
- return Math.pow(px - (x + width - radius), 2) + Math.pow(py - (y + radius), 2) <= Math.pow(radius, 2);
94
- }
95
- if (px < x + radius && py > y + height - radius) {
96
- return Math.pow(px - (x + radius), 2) + Math.pow(py - (y + height - radius), 2) <= Math.pow(radius, 2);
97
- }
98
- if (px > x + width - radius && py > y + height - radius) {
99
- return Math.pow(px - (x + width - radius), 2) + Math.pow(py - (y + height - radius), 2) <= Math.pow(radius, 2);
100
- }
101
- return true;
102
- }
103
- function mergeRects(rects) {
104
- if (rects.length === 0)
105
- return null;
106
- if (rects.length === 1)
107
- return rects[0];
108
- let minX = Infinity;
109
- let minY = Infinity;
110
- let maxX = -Infinity;
111
- let maxY = -Infinity;
112
- for (const rect of rects) {
113
- minX = Math.min(minX, rect.x);
114
- minY = Math.min(minY, rect.y);
115
- maxX = Math.max(maxX, rect.x + rect.width);
116
- maxY = Math.max(maxY, rect.y + rect.height);
117
- }
118
- return {
119
- x: minX,
120
- y: minY,
121
- width: maxX - minX,
122
- height: maxY - minY
123
- };
124
- }
125
- function createFontString(fontSize, fontWeight, fontFamily) {
126
- return `${fontWeight} ${fontSize}px ${fontFamily}`;
127
- }
128
- function walkTree(node, callback) {
129
- callback(node);
130
- for (const child of node.children) {
131
- walkTree(child, callback);
132
- }
133
- }
134
- function findNodeById(root, id) {
135
- if (root.id === id)
136
- return root;
137
- for (const child of root.children) {
138
- const found = findNodeById(child, id);
139
- if (found)
140
- return found;
141
- }
142
- return null;
143
- }
144
- function getAbsoluteBounds(node) {
145
- if (!node.layout)
146
- return null;
147
- let x = node.layout.x;
148
- let y = node.layout.y;
149
- let current = node.parent;
150
- while (current && current.layout) {
151
- x += current.layout.contentX;
152
- y += current.layout.contentY;
153
- current = current.parent;
154
- }
155
- return {
156
- x,
157
- y,
158
- width: node.layout.width,
159
- height: node.layout.height
160
- };
161
- }
162
-
163
- // src/canvas/input.ts
164
- class InputOverlay {
165
- container;
166
- overlay = null;
167
- focusedNode = null;
168
- onChangeCallback = null;
169
- bindPath = null;
170
- engine = null;
171
- constructor(container) {
172
- this.container = container || {};
173
- }
174
- showInput(node, canvasBounds, onChange, engine) {
175
- if (typeof document === "undefined")
176
- return;
177
- this.hideInput();
178
- this.bindPath = node.props.bind || null;
179
- this.engine = engine || null;
180
- const bounds = getAbsoluteBounds(node);
181
- if (!bounds)
182
- return;
183
- const isMultiline = node.type === "textarea";
184
- this.overlay = isMultiline ? document.createElement("textarea") : document.createElement("input");
185
- this.styleOverlay(node, bounds, canvasBounds);
186
- const value = node.props.value || "";
187
- this.overlay.value = value;
188
- this.onChangeCallback = onChange;
189
- this.overlay.addEventListener("input", this.onInput.bind(this));
190
- this.overlay.addEventListener("blur", this.onBlur.bind(this));
191
- this.overlay.addEventListener("keydown", this.onKeyDown.bind(this));
192
- this.container.appendChild(this.overlay);
193
- this.overlay.focus();
194
- this.focusedNode = node;
195
- }
196
- hideInput() {
197
- if (this.overlay) {
198
- this.overlay.remove();
199
- this.overlay = null;
66
+ /**
67
+ * Update overlay position
68
+ */
69
+ updatePosition(node, canvasBounds) {
70
+ if (!this.overlay || node !== this.focusedNode)
71
+ return;
72
+ const bounds = getAbsoluteBounds(node);
73
+ if (!bounds)
74
+ return;
75
+ this.positionOverlay(bounds, canvasBounds);
76
+ }
77
+ /**
78
+ * Style overlay to match canvas node
79
+ */
80
+ styleOverlay(node, bounds, canvasBounds) {
81
+ if (!this.overlay)
82
+ return;
83
+ const props = node.props;
84
+ // Position
85
+ this.positionOverlay(bounds, canvasBounds);
86
+ // Font and text styling
87
+ const fontSize = parseFloat(props.fontSize) || 16;
88
+ const fontWeight = props.fontWeight || "normal";
89
+ const fontFamily = props.fontFamily || "system-ui, sans-serif";
90
+ const color = props.color || "#000000";
91
+ Object.assign(this.overlay.style, {
92
+ fontSize: `${fontSize}px`,
93
+ fontWeight: fontWeight,
94
+ fontFamily: fontFamily,
95
+ color: color,
96
+ border: "none",
97
+ outline: "2px solid #007bff",
98
+ backgroundColor: props.backgroundColor || "#ffffff",
99
+ padding: `${props.padding || 8}px`,
100
+ borderRadius: `${props.borderRadius || 4}px`,
101
+ boxSizing: "border-box",
102
+ resize: "none",
103
+ });
104
+ // Placeholder
105
+ if (props.placeholder) {
106
+ this.overlay.placeholder = props.placeholder;
107
+ }
108
+ // Input type
109
+ if (this.overlay instanceof HTMLInputElement && props.type) {
110
+ this.overlay.type = props.type;
111
+ }
112
+ }
113
+ /**
114
+ * Position overlay over canvas node
115
+ */
116
+ positionOverlay(bounds, canvasBounds) {
117
+ if (!this.overlay)
118
+ return;
119
+ // Calculate scale factor between canvas and display
120
+ const canvas = this.container.querySelector("canvas");
121
+ const scaleX = canvasBounds.width / canvas.width;
122
+ const scaleY = canvasBounds.height / canvas.height;
123
+ const left = bounds.x * scaleX;
124
+ const top = bounds.y * scaleY;
125
+ const width = bounds.width * scaleX;
126
+ const height = bounds.height * scaleY;
127
+ Object.assign(this.overlay.style, {
128
+ position: "absolute",
129
+ left: `${left}px`,
130
+ top: `${top}px`,
131
+ width: `${width}px`,
132
+ height: `${height}px`,
133
+ });
200
134
  }
201
- this.focusedNode = null;
202
- this.onChangeCallback = null;
203
- this.bindPath = null;
204
- this.engine = null;
205
- }
206
- updatePosition(node, canvasBounds) {
207
- if (!this.overlay || node !== this.focusedNode)
208
- return;
209
- const bounds = getAbsoluteBounds(node);
210
- if (!bounds)
211
- return;
212
- this.positionOverlay(bounds, canvasBounds);
213
- }
214
- styleOverlay(node, bounds, canvasBounds) {
215
- if (!this.overlay)
216
- return;
217
- const props = node.props;
218
- this.positionOverlay(bounds, canvasBounds);
219
- const fontSize = parseFloat(props.fontSize) || 16;
220
- const fontWeight = props.fontWeight || "normal";
221
- const fontFamily = props.fontFamily || "system-ui, sans-serif";
222
- const color = props.color || "#000000";
223
- Object.assign(this.overlay.style, {
224
- fontSize: `${fontSize}px`,
225
- fontWeight,
226
- fontFamily,
227
- color,
228
- border: "none",
229
- outline: "2px solid #007bff",
230
- backgroundColor: props.backgroundColor || "#ffffff",
231
- padding: `${props.padding || 8}px`,
232
- borderRadius: `${props.borderRadius || 4}px`,
233
- boxSizing: "border-box",
234
- resize: "none"
235
- });
236
- if (props.placeholder) {
237
- this.overlay.placeholder = props.placeholder;
135
+ /**
136
+ * Handle input event
137
+ */
138
+ onInput(e) {
139
+ if (!this.overlay || !this.onChangeCallback)
140
+ return;
141
+ const value = this.overlay.value;
142
+ this.onChangeCallback(value);
143
+ // Dispatch __hypen_bind for two-way binding
144
+ if (this.bindPath && this.engine) {
145
+ this.engine.dispatchAction("__hypen_bind", {
146
+ path: this.bindPath,
147
+ value,
148
+ });
149
+ }
238
150
  }
239
- if (this.overlay instanceof HTMLInputElement && props.type) {
240
- this.overlay.type = props.type;
151
+ /**
152
+ * Handle blur event
153
+ */
154
+ onBlur() {
155
+ // Hide overlay when focus is lost
156
+ this.hideInput();
241
157
  }
242
- }
243
- positionOverlay(bounds, canvasBounds) {
244
- if (!this.overlay)
245
- return;
246
- const canvas = this.container.querySelector("canvas");
247
- const scaleX = canvasBounds.width / canvas.width;
248
- const scaleY = canvasBounds.height / canvas.height;
249
- const left = bounds.x * scaleX;
250
- const top = bounds.y * scaleY;
251
- const width = bounds.width * scaleX;
252
- const height = bounds.height * scaleY;
253
- Object.assign(this.overlay.style, {
254
- position: "absolute",
255
- left: `${left}px`,
256
- top: `${top}px`,
257
- width: `${width}px`,
258
- height: `${height}px`
259
- });
260
- }
261
- onInput(e) {
262
- if (!this.overlay || !this.onChangeCallback)
263
- return;
264
- const value = this.overlay.value;
265
- this.onChangeCallback(value);
266
- if (this.bindPath && this.engine) {
267
- this.engine.dispatchAction("__hypen_bind", {
268
- path: this.bindPath,
269
- value
270
- });
158
+ /**
159
+ * Handle keyboard events
160
+ */
161
+ onKeyDown(e) {
162
+ if (!this.overlay)
163
+ return;
164
+ // Enter key submits (unless multiline)
165
+ if (e.key === "Enter" && this.overlay instanceof HTMLInputElement) {
166
+ e.preventDefault();
167
+ this.overlay.blur();
168
+ }
169
+ // Escape cancels
170
+ if (e.key === "Escape") {
171
+ e.preventDefault();
172
+ this.overlay.blur();
173
+ }
271
174
  }
272
- }
273
- onBlur() {
274
- this.hideInput();
275
- }
276
- onKeyDown(e) {
277
- if (!this.overlay)
278
- return;
279
- if (e.key === "Enter" && this.overlay instanceof HTMLInputElement) {
280
- e.preventDefault();
281
- this.overlay.blur();
175
+ /**
176
+ * Check if input is currently shown
177
+ */
178
+ isShown() {
179
+ return this.overlay !== null;
282
180
  }
283
- if (e.key === "Escape") {
284
- e.preventDefault();
285
- this.overlay.blur();
181
+ /**
182
+ * Get current focused node
183
+ */
184
+ getFocusedNode() {
185
+ return this.focusedNode;
286
186
  }
287
- }
288
- isShown() {
289
- return this.overlay !== null;
290
- }
291
- getFocusedNode() {
292
- return this.focusedNode;
293
- }
294
187
  }
295
- export {
296
- InputOverlay
297
- };
298
-
299
- //# debugId=0958E3B1C17E71A064756E2164756E21
188
+ //# sourceMappingURL=input.js.map