@hypen-space/web 0.3.8 → 0.3.10

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 (205) 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/dom/applicators/advanced-layout.js +245 -0
  12. package/dist/dom/applicators/advanced-layout.js.map +11 -0
  13. package/dist/{src/dom/applicators/margin.js → dom/applicators/background.js} +33 -21
  14. package/dist/{src/dom → dom}/applicators/background.js.map +3 -3
  15. package/dist/dom/applicators/border.js +97 -0
  16. package/dist/{src/dom → dom}/applicators/border.js.map +3 -3
  17. package/dist/dom/applicators/color.js +49 -0
  18. package/dist/{src/dom → dom}/applicators/color.js.map +3 -3
  19. package/dist/{src/dom/applicators/padding.js → dom/applicators/display.js} +36 -21
  20. package/dist/{src/dom → dom}/applicators/display.js.map +3 -3
  21. package/dist/dom/applicators/effects.js +138 -0
  22. package/dist/{src/dom → dom}/applicators/effects.js.map +3 -3
  23. package/dist/{src/dom → dom}/applicators/events.js +41 -48
  24. package/dist/dom/applicators/events.js.map +11 -0
  25. package/dist/{src/dom → dom}/applicators/font.js +76 -86
  26. package/dist/{src/dom → dom}/applicators/font.js.map +3 -3
  27. package/dist/dom/applicators/index.js +1728 -0
  28. package/dist/dom/applicators/index.js.map +26 -0
  29. package/dist/dom/applicators/layout.js +141 -0
  30. package/dist/dom/applicators/layout.js.map +10 -0
  31. package/dist/dom/applicators/margin.js +104 -0
  32. package/dist/dom/applicators/margin.js.map +10 -0
  33. package/dist/dom/applicators/padding.js +104 -0
  34. package/dist/dom/applicators/padding.js.map +10 -0
  35. package/dist/{src/dom → dom}/applicators/size.js +76 -76
  36. package/dist/dom/applicators/size.js.map +10 -0
  37. package/dist/dom/applicators/transform.js +105 -0
  38. package/dist/{src/dom → dom}/applicators/transform.js.map +3 -3
  39. package/dist/dom/applicators/transition.js +79 -0
  40. package/dist/{src/dom → dom}/applicators/transition.js.map +3 -3
  41. package/dist/dom/applicators/types.js +2 -0
  42. package/dist/dom/applicators/types.js.map +9 -0
  43. package/dist/dom/applicators/typography.js +100 -0
  44. package/dist/{src/dom → dom}/applicators/typography.js.map +3 -3
  45. package/dist/{src/dom → dom}/components/avatar.js +4 -3
  46. package/dist/dom/components/avatar.js.map +10 -0
  47. package/dist/{src/dom → dom}/components/button.js +11 -1
  48. package/dist/dom/components/button.js.map +10 -0
  49. package/dist/{src/dom → dom}/components/center.js +4 -1
  50. package/dist/dom/components/center.js.map +10 -0
  51. package/dist/dom/components/column.js.map +10 -0
  52. package/dist/{src/dom → dom}/components/container.js +1 -4
  53. package/dist/{src/dom → dom}/components/container.js.map +3 -3
  54. package/dist/{src/dom → dom}/components/grid.js +18 -2
  55. package/dist/dom/components/grid.js.map +10 -0
  56. package/dist/{src/dom → dom}/components/hypenapp.js +15 -13
  57. package/dist/dom/components/hypenapp.js.map +10 -0
  58. package/dist/{src/dom → dom}/components/index.js +64 -24
  59. package/dist/dom/components/index.js.map +41 -0
  60. package/dist/{src/dom → dom}/components/route.js +5 -3
  61. package/dist/dom/components/route.js.map +10 -0
  62. package/dist/{src/dom → dom}/components/row.js +5 -4
  63. package/dist/dom/components/row.js.map +10 -0
  64. package/dist/{src/dom → dom}/components/stack.js +5 -1
  65. package/dist/dom/components/stack.js.map +10 -0
  66. package/dist/{src/dom → dom}/components/text.js +5 -1
  67. package/dist/dom/components/text.js.map +10 -0
  68. package/dist/{src/dom → dom}/debug.js +5 -3
  69. package/dist/dom/debug.js.map +10 -0
  70. package/dist/{src/dom → dom}/element-data.js +6 -11
  71. package/dist/dom/element-data.js.map +10 -0
  72. package/dist/{src/dom → dom}/events.js +15 -12
  73. package/dist/dom/events.js.map +10 -0
  74. package/dist/{src/dom → dom}/index.js +1103 -1044
  75. package/dist/dom/index.js.map +62 -0
  76. package/dist/{src/dom → dom}/renderer.js +1089 -1033
  77. package/dist/dom/renderer.js.map +61 -0
  78. package/dist/{src/hypen.js → hypen.js} +1122 -1097
  79. package/dist/hypen.js.map +62 -0
  80. package/dist/{src/index.js → index.js} +1143 -1111
  81. package/dist/index.js.map +72 -0
  82. package/package.json +22 -22
  83. package/src/canvas/renderer.ts +7 -4
  84. package/src/canvas/text.ts +4 -1
  85. package/src/dom/applicators/background.ts +1 -1
  86. package/src/dom/applicators/border.ts +1 -1
  87. package/src/dom/applicators/color.ts +1 -1
  88. package/src/dom/applicators/display.ts +1 -1
  89. package/src/dom/applicators/effects.ts +1 -1
  90. package/src/dom/applicators/events.ts +8 -14
  91. package/src/dom/applicators/font.ts +1 -1
  92. package/src/dom/applicators/index.ts +49 -17
  93. package/src/dom/applicators/layout.ts +31 -8
  94. package/src/dom/applicators/margin.ts +56 -6
  95. package/src/dom/applicators/padding.ts +56 -6
  96. package/src/dom/applicators/size.ts +19 -4
  97. package/src/dom/applicators/transform.ts +1 -1
  98. package/src/dom/applicators/transition.ts +1 -1
  99. package/src/dom/applicators/types.ts +7 -0
  100. package/src/dom/applicators/typography.ts +1 -1
  101. package/src/dom/components/avatar.ts +4 -3
  102. package/src/dom/components/button.ts +17 -0
  103. package/src/dom/components/center.ts +9 -0
  104. package/src/dom/components/column.ts +4 -2
  105. package/src/dom/components/container.ts +2 -3
  106. package/src/dom/components/grid.ts +22 -0
  107. package/src/dom/components/hypenapp.ts +14 -11
  108. package/src/dom/components/route.ts +4 -1
  109. package/src/dom/components/row.ts +8 -7
  110. package/src/dom/components/stack.ts +4 -0
  111. package/src/dom/components/text.ts +7 -0
  112. package/src/dom/debug.ts +6 -2
  113. package/src/dom/element-data.ts +1 -1
  114. package/src/dom/events.ts +16 -12
  115. package/src/dom/renderer.ts +12 -9
  116. package/src/hypen.ts +32 -73
  117. package/dist/src/dom/applicators/advanced-layout.js +0 -250
  118. package/dist/src/dom/applicators/advanced-layout.js.map +0 -11
  119. package/dist/src/dom/applicators/background.js +0 -76
  120. package/dist/src/dom/applicators/border.js +0 -106
  121. package/dist/src/dom/applicators/color.js +0 -58
  122. package/dist/src/dom/applicators/display.js +0 -79
  123. package/dist/src/dom/applicators/effects.js +0 -147
  124. package/dist/src/dom/applicators/events.js.map +0 -11
  125. package/dist/src/dom/applicators/index.js +0 -1715
  126. package/dist/src/dom/applicators/index.js.map +0 -26
  127. package/dist/src/dom/applicators/layout.js +0 -138
  128. package/dist/src/dom/applicators/layout.js.map +0 -10
  129. package/dist/src/dom/applicators/margin.js.map +0 -10
  130. package/dist/src/dom/applicators/padding.js.map +0 -10
  131. package/dist/src/dom/applicators/size.js.map +0 -10
  132. package/dist/src/dom/applicators/transform.js +0 -114
  133. package/dist/src/dom/applicators/transition.js +0 -88
  134. package/dist/src/dom/applicators/typography.js +0 -109
  135. package/dist/src/dom/components/avatar.js.map +0 -10
  136. package/dist/src/dom/components/button.js.map +0 -10
  137. package/dist/src/dom/components/center.js.map +0 -10
  138. package/dist/src/dom/components/column.js.map +0 -10
  139. package/dist/src/dom/components/grid.js.map +0 -10
  140. package/dist/src/dom/components/hypenapp.js.map +0 -10
  141. package/dist/src/dom/components/index.js.map +0 -41
  142. package/dist/src/dom/components/route.js.map +0 -10
  143. package/dist/src/dom/components/row.js.map +0 -10
  144. package/dist/src/dom/components/stack.js.map +0 -10
  145. package/dist/src/dom/components/text.js.map +0 -10
  146. package/dist/src/dom/debug.js.map +0 -10
  147. package/dist/src/dom/element-data.js.map +0 -10
  148. package/dist/src/dom/events.js.map +0 -10
  149. package/dist/src/dom/index.js.map +0 -62
  150. package/dist/src/dom/renderer.js.map +0 -61
  151. package/dist/src/hypen.js.map +0 -62
  152. package/dist/src/index.js.map +0 -72
  153. /package/dist/{src/canvas → canvas}/accessibility.js +0 -0
  154. /package/dist/{src/canvas → canvas}/accessibility.js.map +0 -0
  155. /package/dist/{src/canvas → canvas}/events.js +0 -0
  156. /package/dist/{src/canvas → canvas}/events.js.map +0 -0
  157. /package/dist/{src/canvas → canvas}/input.js +0 -0
  158. /package/dist/{src/canvas → canvas}/input.js.map +0 -0
  159. /package/dist/{src/canvas → canvas}/types.js +0 -0
  160. /package/dist/{src/canvas → canvas}/types.js.map +0 -0
  161. /package/dist/{src/canvas → canvas}/utils.js +0 -0
  162. /package/dist/{src/canvas → canvas}/utils.js.map +0 -0
  163. /package/dist/{src/dom → dom}/canvas/index.js +0 -0
  164. /package/dist/{src/dom → dom}/canvas/index.js.map +0 -0
  165. /package/dist/{src/dom → dom}/components/audio.js +0 -0
  166. /package/dist/{src/dom → dom}/components/audio.js.map +0 -0
  167. /package/dist/{src/dom → dom}/components/badge.js +0 -0
  168. /package/dist/{src/dom → dom}/components/badge.js.map +0 -0
  169. /package/dist/{src/dom → dom}/components/card.js +0 -0
  170. /package/dist/{src/dom → dom}/components/card.js.map +0 -0
  171. /package/dist/{src/dom → dom}/components/checkbox.js +0 -0
  172. /package/dist/{src/dom → dom}/components/checkbox.js.map +0 -0
  173. /package/dist/{src/dom → dom}/components/column.js +0 -0
  174. /package/dist/{src/dom → dom}/components/divider.js +0 -0
  175. /package/dist/{src/dom → dom}/components/divider.js.map +0 -0
  176. /package/dist/{src/dom → dom}/components/heading.js +0 -0
  177. /package/dist/{src/dom → dom}/components/heading.js.map +0 -0
  178. /package/dist/{src/dom → dom}/components/image.js +0 -0
  179. /package/dist/{src/dom → dom}/components/image.js.map +0 -0
  180. /package/dist/{src/dom → dom}/components/input.js +0 -0
  181. /package/dist/{src/dom → dom}/components/input.js.map +0 -0
  182. /package/dist/{src/dom → dom}/components/link.js +0 -0
  183. /package/dist/{src/dom → dom}/components/link.js.map +0 -0
  184. /package/dist/{src/dom → dom}/components/list.js +0 -0
  185. /package/dist/{src/dom → dom}/components/list.js.map +0 -0
  186. /package/dist/{src/dom → dom}/components/paragraph.js +0 -0
  187. /package/dist/{src/dom → dom}/components/paragraph.js.map +0 -0
  188. /package/dist/{src/dom → dom}/components/progressbar.js +0 -0
  189. /package/dist/{src/dom → dom}/components/progressbar.js.map +0 -0
  190. /package/dist/{src/dom → dom}/components/router.js +0 -0
  191. /package/dist/{src/dom → dom}/components/router.js.map +0 -0
  192. /package/dist/{src/dom → dom}/components/select.js +0 -0
  193. /package/dist/{src/dom → dom}/components/select.js.map +0 -0
  194. /package/dist/{src/dom → dom}/components/slider.js +0 -0
  195. /package/dist/{src/dom → dom}/components/slider.js.map +0 -0
  196. /package/dist/{src/dom → dom}/components/spacer.js +0 -0
  197. /package/dist/{src/dom → dom}/components/spacer.js.map +0 -0
  198. /package/dist/{src/dom → dom}/components/spinner.js +0 -0
  199. /package/dist/{src/dom → dom}/components/spinner.js.map +0 -0
  200. /package/dist/{src/dom → dom}/components/switch.js +0 -0
  201. /package/dist/{src/dom → dom}/components/switch.js.map +0 -0
  202. /package/dist/{src/dom → dom}/components/textarea.js +0 -0
  203. /package/dist/{src/dom → dom}/components/textarea.js.map +0 -0
  204. /package/dist/{src/dom → dom}/components/video.js +0 -0
  205. /package/dist/{src/dom → dom}/components/video.js.map +0 -0
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dom/debug.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Debug utilities for DOM rendering visualization\n *\n * Provides heatmap overlays to visualize re-renders\n */\n\nimport { frameworkLoggers } from \"@hypen-space/core\";\n\nconst log = frameworkLoggers.debug;\n\nexport interface DebugConfig {\n /** Enable debug mode */\n enabled: boolean;\n /** Show heatmap overlays on re-renders */\n showHeatmap: boolean;\n /** Increment per re-render (default: 5%) */\n heatmapIncrement: number;\n /** Maximum opacity for heatmap (default: 0.8) */\n maxOpacity: number;\n /** Fade out duration in ms (0 to disable) */\n fadeOutDuration: number;\n}\n\nexport const defaultDebugConfig: DebugConfig = {\n enabled: false,\n showHeatmap: true,\n heatmapIncrement: 5,\n maxOpacity: 0.8,\n fadeOutDuration: 2000,\n};\n\n/**\n * Tracks re-render counts for each element\n */\nexport class RerenderTracker {\n private renderCounts = new Map<string, number>();\n private overlays = new Map<string, HTMLDivElement>();\n private config: DebugConfig;\n\n constructor(config: DebugConfig = defaultDebugConfig) {\n this.config = config;\n }\n\n /**\n * Update the configuration\n */\n setConfig(config: Partial<DebugConfig>): void {\n this.config = { ...this.config, ...config };\n\n // If debug mode is disabled, clean up all overlays\n if (!this.config.enabled) {\n this.cleanup();\n }\n }\n\n /**\n * Track a re-render for an element\n */\n trackRerender(id: string, element: HTMLElement, patchType: string): void {\n if (!this.config.enabled || !this.config.showHeatmap) {\n return;\n }\n\n log.debug(`Tracking re-render: ${id} - ${patchType}`);\n\n // Increment render count\n const currentCount = this.renderCounts.get(id) || 0;\n const newCount = currentCount + 1;\n this.renderCounts.set(id, newCount);\n\n // Create or update heatmap overlay\n this.updateHeatmap(id, element, newCount, patchType);\n }\n\n /**\n * Create or update the heatmap overlay for an element\n */\n private updateHeatmap(id: string, element: HTMLElement, renderCount: number, patchType: string): void {\n // Calculate opacity based on render count (increment by heatmapIncrement% each time)\n const opacity = Math.min(\n (renderCount * this.config.heatmapIncrement) / 100,\n this.config.maxOpacity\n );\n\n log.debug(`Updating heatmap for ${id}, count: ${renderCount}, opacity: ${opacity}`);\n\n // For inline elements or text, use a simpler approach: background color + outline\n const isInline = window.getComputedStyle(element).display.includes('inline');\n\n if (isInline || element.tagName === 'SPAN') {\n // Store original styles if not already stored\n if (!element.dataset.hypenDebugOriginalBg) {\n element.dataset.hypenDebugOriginalBg = element.style.backgroundColor || '';\n element.dataset.hypenDebugOriginalOutline = element.style.outline || '';\n element.dataset.hypenDebugOriginalPosition = element.style.position || '';\n }\n\n // Apply red background and outline directly to the element\n element.style.backgroundColor = `rgba(255, 0, 0, ${Math.max(opacity, 0.15)})`;\n element.style.outline = `2px solid rgba(255, 0, 0, ${Math.max(opacity + 0.2, 0.3)})`;\n element.style.outlineOffset = '2px';\n element.style.position = 'relative';\n\n // Add count badge as ::before pseudo-element or data attribute\n element.setAttribute('data-hypen-renders', `${renderCount}× ${patchType}`);\n\n // Add CSS for the badge if not already added\n if (!document.getElementById('hypen-debug-styles')) {\n const style = document.createElement('style');\n style.id = 'hypen-debug-styles';\n style.textContent = `\n [data-hypen-renders]::before {\n content: attr(data-hypen-renders);\n position: absolute;\n top: -18px;\n left: 0;\n background: rgba(255, 0, 0, 0.9);\n color: white;\n padding: 2px 6px;\n font-size: 10px;\n font-family: 'Courier New', monospace;\n font-weight: bold;\n border-radius: 3px;\n z-index: 999999;\n pointer-events: none;\n white-space: nowrap;\n text-shadow: none;\n }\n `;\n document.head.appendChild(style);\n }\n\n // Store in overlays map for cleanup\n this.overlays.set(id, element as any);\n\n // Fade out after duration if enabled\n if (this.config.fadeOutDuration > 0) {\n setTimeout(() => {\n const originalBg = element.dataset.hypenDebugOriginalBg || '';\n const originalOutline = element.dataset.hypenDebugOriginalOutline || '';\n element.style.backgroundColor = originalBg;\n element.style.outline = originalOutline;\n element.style.opacity = '1';\n }, this.config.fadeOutDuration);\n }\n } else {\n // For block elements, use overlay approach\n let overlay = this.overlays.get(id);\n\n if (!overlay) {\n overlay = document.createElement(\"div\");\n overlay.className = \"hypen-debug-overlay\";\n overlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n z-index: 999999 !important;\n transition: opacity ${this.config.fadeOutDuration}ms ease-out;\n border: 2px solid rgba(255, 0, 0, 0.7) !important;\n box-sizing: border-box;\n font-size: 11px;\n color: white;\n text-shadow: 0 0 3px black, 0 0 5px black;\n padding: 4px;\n font-family: 'Courier New', monospace;\n font-weight: bold;\n display: block !important;\n visibility: visible !important;\n `;\n\n const currentPosition = window.getComputedStyle(element).position;\n if (currentPosition === 'static') {\n element.style.position = 'relative';\n }\n\n element.appendChild(overlay);\n this.overlays.set(id, overlay);\n }\n\n overlay.style.backgroundColor = `rgba(255, 0, 0, ${Math.max(opacity, 0.15)})`;\n overlay.style.opacity = '1';\n overlay.textContent = `${renderCount}× ${patchType}`;\n\n if (this.config.fadeOutDuration > 0) {\n setTimeout(() => {\n if (overlay) {\n overlay.style.opacity = '0.2';\n }\n }, this.config.fadeOutDuration);\n }\n }\n }\n\n /**\n * Reset tracking for a specific element\n */\n reset(id: string): void {\n this.renderCounts.delete(id);\n const overlay = this.overlays.get(id);\n if (overlay) {\n overlay.remove();\n this.overlays.delete(id);\n }\n }\n\n /**\n * Reset tracking for all elements\n */\n resetAll(): void {\n this.renderCounts.clear();\n for (const overlay of this.overlays.values()) {\n overlay.remove();\n }\n this.overlays.clear();\n }\n\n /**\n * Get render count for an element\n */\n getRenderCount(id: string): number {\n return this.renderCounts.get(id) || 0;\n }\n\n /**\n * Clean up all overlays (called when debug mode is disabled)\n */\n private cleanup(): void {\n for (const overlay of this.overlays.values()) {\n overlay.remove();\n }\n this.overlays.clear();\n }\n\n /**\n * Get statistics about re-renders\n */\n getStats(): { totalRerenders: number; elementCount: number; avgRerenders: number } {\n const totalRerenders = Array.from(this.renderCounts.values()).reduce((sum, count) => sum + count, 0);\n const elementCount = this.renderCounts.size;\n const avgRerenders = elementCount > 0 ? totalRerenders / elementCount : 0;\n\n return {\n totalRerenders,\n elementCount,\n avgRerenders: Math.round(avgRerenders * 100) / 100,\n };\n }\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;AAEA,IAAM,MAAM,iBAAiB;AAetB,IAAM,qBAAkC;AAAA,EAC7C,SAAS;AAAA,EACT,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,iBAAiB;AACnB;AAAA;AAKO,MAAM,gBAAgB;AAAA,EACnB,eAAe,IAAI;AAAA,EACnB,WAAW,IAAI;AAAA,EACf;AAAA,EAER,WAAW,CAAC,SAAsB,oBAAoB;AAAA,IACpD,KAAK,SAAS;AAAA;AAAA,EAMhB,SAAS,CAAC,QAAoC;AAAA,IAC5C,KAAK,SAAS,KAAK,KAAK,WAAW,OAAO;AAAA,IAG1C,IAAI,CAAC,KAAK,OAAO,SAAS;AAAA,MACxB,KAAK,QAAQ;AAAA,IACf;AAAA;AAAA,EAMF,aAAa,CAAC,IAAY,SAAsB,WAAyB;AAAA,IACvE,IAAI,CAAC,KAAK,OAAO,WAAW,CAAC,KAAK,OAAO,aAAa;AAAA,MACpD;AAAA,IACF;AAAA,IAEA,IAAI,MAAM,uBAAuB,QAAQ,WAAW;AAAA,IAGpD,MAAM,eAAe,KAAK,aAAa,IAAI,EAAE,KAAK;AAAA,IAClD,MAAM,WAAW,eAAe;AAAA,IAChC,KAAK,aAAa,IAAI,IAAI,QAAQ;AAAA,IAGlC,KAAK,cAAc,IAAI,SAAS,UAAU,SAAS;AAAA;AAAA,EAM7C,aAAa,CAAC,IAAY,SAAsB,aAAqB,WAAyB;AAAA,IAEpG,MAAM,UAAU,KAAK,IAClB,cAAc,KAAK,OAAO,mBAAoB,KAC/C,KAAK,OAAO,UACd;AAAA,IAEA,IAAI,MAAM,wBAAwB,cAAc,yBAAyB,SAAS;AAAA,IAGlF,MAAM,WAAW,OAAO,iBAAiB,OAAO,EAAE,QAAQ,SAAS,QAAQ;AAAA,IAE3E,IAAI,YAAY,QAAQ,YAAY,QAAQ;AAAA,MAE1C,IAAI,CAAC,QAAQ,QAAQ,sBAAsB;AAAA,QACzC,QAAQ,QAAQ,uBAAuB,QAAQ,MAAM,mBAAmB;AAAA,QACxE,QAAQ,QAAQ,4BAA4B,QAAQ,MAAM,WAAW;AAAA,QACrE,QAAQ,QAAQ,6BAA6B,QAAQ,MAAM,YAAY;AAAA,MACzE;AAAA,MAGA,QAAQ,MAAM,kBAAkB,mBAAmB,KAAK,IAAI,SAAS,IAAI;AAAA,MACzE,QAAQ,MAAM,UAAU,6BAA6B,KAAK,IAAI,UAAU,KAAK,GAAG;AAAA,MAChF,QAAQ,MAAM,gBAAgB;AAAA,MAC9B,QAAQ,MAAM,WAAW;AAAA,MAGzB,QAAQ,aAAa,sBAAsB,GAAG,gBAAe,WAAW;AAAA,MAGxE,IAAI,CAAC,SAAS,eAAe,oBAAoB,GAAG;AAAA,QAClD,MAAM,QAAQ,SAAS,cAAc,OAAO;AAAA,QAC5C,MAAM,KAAK;AAAA,QACX,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAmBpB,SAAS,KAAK,YAAY,KAAK;AAAA,MACjC;AAAA,MAGA,KAAK,SAAS,IAAI,IAAI,OAAc;AAAA,MAGpC,IAAI,KAAK,OAAO,kBAAkB,GAAG;AAAA,QACnC,WAAW,MAAM;AAAA,UACf,MAAM,aAAa,QAAQ,QAAQ,wBAAwB;AAAA,UAC3D,MAAM,kBAAkB,QAAQ,QAAQ,6BAA6B;AAAA,UACrE,QAAQ,MAAM,kBAAkB;AAAA,UAChC,QAAQ,MAAM,UAAU;AAAA,UACxB,QAAQ,MAAM,UAAU;AAAA,WACvB,KAAK,OAAO,eAAe;AAAA,MAChC;AAAA,IACF,EAAO;AAAA,MAEL,IAAI,UAAU,KAAK,SAAS,IAAI,EAAE;AAAA,MAElC,IAAI,CAAC,SAAS;AAAA,QACZ,UAAU,SAAS,cAAc,KAAK;AAAA,QACtC,QAAQ,YAAY;AAAA,QACpB,QAAQ,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAQA,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAapC,MAAM,kBAAkB,OAAO,iBAAiB,OAAO,EAAE;AAAA,QACzD,IAAI,oBAAoB,UAAU;AAAA,UAChC,QAAQ,MAAM,WAAW;AAAA,QAC3B;AAAA,QAEA,QAAQ,YAAY,OAAO;AAAA,QAC3B,KAAK,SAAS,IAAI,IAAI,OAAO;AAAA,MAC/B;AAAA,MAEA,QAAQ,MAAM,kBAAkB,mBAAmB,KAAK,IAAI,SAAS,IAAI;AAAA,MACzE,QAAQ,MAAM,UAAU;AAAA,MACxB,QAAQ,cAAc,GAAG,gBAAe;AAAA,MAExC,IAAI,KAAK,OAAO,kBAAkB,GAAG;AAAA,QACnC,WAAW,MAAM;AAAA,UACf,IAAI,SAAS;AAAA,YACX,QAAQ,MAAM,UAAU;AAAA,UAC1B;AAAA,WACC,KAAK,OAAO,eAAe;AAAA,MAChC;AAAA;AAAA;AAAA,EAOJ,KAAK,CAAC,IAAkB;AAAA,IACtB,KAAK,aAAa,OAAO,EAAE;AAAA,IAC3B,MAAM,UAAU,KAAK,SAAS,IAAI,EAAE;AAAA,IACpC,IAAI,SAAS;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,KAAK,SAAS,OAAO,EAAE;AAAA,IACzB;AAAA;AAAA,EAMF,QAAQ,GAAS;AAAA,IACf,KAAK,aAAa,MAAM;AAAA,IACxB,WAAW,WAAW,KAAK,SAAS,OAAO,GAAG;AAAA,MAC5C,QAAQ,OAAO;AAAA,IACjB;AAAA,IACA,KAAK,SAAS,MAAM;AAAA;AAAA,EAMtB,cAAc,CAAC,IAAoB;AAAA,IACjC,OAAO,KAAK,aAAa,IAAI,EAAE,KAAK;AAAA;AAAA,EAM9B,OAAO,GAAS;AAAA,IACtB,WAAW,WAAW,KAAK,SAAS,OAAO,GAAG;AAAA,MAC5C,QAAQ,OAAO;AAAA,IACjB;AAAA,IACA,KAAK,SAAS,MAAM;AAAA;AAAA,EAMtB,QAAQ,GAA2E;AAAA,IACjF,MAAM,iBAAiB,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,IACnG,MAAM,eAAe,KAAK,aAAa;AAAA,IACvC,MAAM,eAAe,eAAe,IAAI,iBAAiB,eAAe;AAAA,IAExE,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,cAAc,KAAK,MAAM,eAAe,GAAG,IAAI;AAAA,IACjD;AAAA;AAEJ;",
8
+ "debugId": "3A6B7464F3DF802964756E2164756E21",
9
+ "names": []
10
+ }
@@ -28,7 +28,8 @@ var __export = (target, all) => {
28
28
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
29
29
 
30
30
  // src/dom/element-data.ts
31
- import { getElementDisposables } from "@hypen-space/core";
31
+ import { getElementDisposables } from "@hypen-space/core/disposable";
32
+ var elementDataMap = new WeakMap;
32
33
  function getHypenData(element) {
33
34
  let data = elementDataMap.get(element);
34
35
  if (!data) {
@@ -98,6 +99,9 @@ function disposeHypenElement(element) {
98
99
  } catch {}
99
100
  clearHypenData(element);
100
101
  }
102
+ var HYPEN_ENGINE_SYMBOL = Symbol.for("hypen.engine");
103
+ var REGISTERED_EVENTS_SYMBOL = Symbol.for("hypen.registeredEvents");
104
+ var KEY_TARGET_SYMBOL = Symbol.for("hypen.keyTarget");
101
105
  function getLegacyEngine(element) {
102
106
  const engine = getEngine(element);
103
107
  if (engine)
@@ -108,15 +112,6 @@ function setLegacyEngine(element, engine) {
108
112
  setEngine(element, engine);
109
113
  element.__hypenEngine = engine;
110
114
  }
111
- var elementDataMap, HYPEN_ENGINE_SYMBOL, REGISTERED_EVENTS_SYMBOL, KEY_TARGET_SYMBOL;
112
- var init_element_data = __esm(() => {
113
- elementDataMap = new WeakMap;
114
- HYPEN_ENGINE_SYMBOL = Symbol.for("hypen.engine");
115
- REGISTERED_EVENTS_SYMBOL = Symbol.for("hypen.registeredEvents");
116
- KEY_TARGET_SYMBOL = Symbol.for("hypen.keyTarget");
117
- });
118
- init_element_data();
119
-
120
115
  export {
121
116
  unregisterEvent,
122
117
  setMeta,
@@ -137,4 +132,4 @@ export {
137
132
  clearHypenData
138
133
  };
139
134
 
140
- //# debugId=78A684F7B8E0B29D64756E2164756E21
135
+ //# debugId=7A14311B5432B21164756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dom/element-data.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Type-Safe Element Data\n *\n * Provides strongly-typed access to Hypen-specific data attached to DOM elements.\n * Eliminates `as any` casts throughout the codebase.\n */\n\nimport { type DisposableStack, getElementDisposables } from \"@hypen-space/core/disposable\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Engine interface for dispatching actions\n */\nexport interface IEngine {\n dispatchAction(name: string, payload?: unknown): void;\n}\n\n/**\n * All Hypen-specific data attached to an element\n */\nexport interface HypenElementData {\n /** Engine reference for action dispatch */\n engine?: IEngine;\n /** Target key for keyboard events (e.g., \"Enter\", \"Escape\") */\n keyTarget?: string;\n /** Set of registered event type:action pairs */\n registeredEvents?: Set<string>;\n /** Custom element metadata */\n meta?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Private Storage\n// ============================================================================\n\n/**\n * WeakMap to store Hypen data without polluting the element\n */\nconst elementDataMap = new WeakMap<HTMLElement, HypenElementData>();\n\n// ============================================================================\n// Core API\n// ============================================================================\n\n/**\n * Get Hypen data for an element, creating if needed\n */\nexport function getHypenData(element: HTMLElement): HypenElementData {\n let data = elementDataMap.get(element);\n if (!data) {\n data = {};\n elementDataMap.set(element, data);\n }\n return data;\n}\n\n/**\n * Check if element has Hypen data\n */\nexport function hasHypenData(element: HTMLElement): boolean {\n return elementDataMap.has(element);\n}\n\n/**\n * Clear Hypen data from an element\n */\nexport function clearHypenData(element: HTMLElement): void {\n elementDataMap.delete(element);\n}\n\n// ============================================================================\n// Engine Access\n// ============================================================================\n\n/**\n * Get the engine attached to an element\n */\nexport function getEngine(element: HTMLElement): IEngine | undefined {\n return getHypenData(element).engine;\n}\n\n/**\n * Set the engine on an element\n */\nexport function setEngine(element: HTMLElement, engine: IEngine): void {\n getHypenData(element).engine = engine;\n}\n\n/**\n * Find engine by walking up the DOM tree\n */\nexport function findEngine(element: HTMLElement): IEngine | undefined {\n let current: HTMLElement | null = element;\n while (current) {\n const engine = getEngine(current);\n if (engine) return engine;\n current = current.parentElement;\n }\n return undefined;\n}\n\n// ============================================================================\n// Event Registration Tracking\n// ============================================================================\n\n/**\n * Get registered events set for an element\n */\nexport function getRegisteredEvents(element: HTMLElement): Set<string> {\n const data = getHypenData(element);\n if (!data.registeredEvents) {\n data.registeredEvents = new Set();\n }\n return data.registeredEvents;\n}\n\n/**\n * Check if an event handler is registered\n */\nexport function isEventRegistered(element: HTMLElement, eventKey: string): boolean {\n return getRegisteredEvents(element).has(eventKey);\n}\n\n/**\n * Mark an event handler as registered\n */\nexport function registerEvent(element: HTMLElement, eventKey: string): void {\n getRegisteredEvents(element).add(eventKey);\n}\n\n/**\n * Unregister an event handler\n */\nexport function unregisterEvent(element: HTMLElement, eventKey: string): void {\n getRegisteredEvents(element).delete(eventKey);\n}\n\n// ============================================================================\n// Keyboard Event Key Target\n// ============================================================================\n\n/**\n * Get the target key for keyboard events\n */\nexport function getKeyTarget(element: HTMLElement): string | undefined {\n return getHypenData(element).keyTarget;\n}\n\n/**\n * Set the target key for keyboard events\n */\nexport function setKeyTarget(element: HTMLElement, key: string): void {\n getHypenData(element).keyTarget = key;\n}\n\n// ============================================================================\n// Metadata\n// ============================================================================\n\n/**\n * Get custom metadata value\n */\nexport function getMeta<T>(element: HTMLElement, key: string): T | undefined {\n return getHypenData(element).meta?.[key] as T | undefined;\n}\n\n/**\n * Set custom metadata value\n */\nexport function setMeta<T>(element: HTMLElement, key: string, value: T): void {\n const data = getHypenData(element);\n if (!data.meta) {\n data.meta = {};\n }\n data.meta[key] = value;\n}\n\n// ============================================================================\n// Cleanup\n// ============================================================================\n\n/**\n * Dispose all resources attached to an element and clear data\n * Call this when removing an element from the DOM\n */\nexport function disposeHypenElement(element: HTMLElement): void {\n // Dispose any registered disposables\n try {\n const disposables = getElementDisposables(element);\n disposables.dispose();\n } catch {\n // Ignore if no disposables\n }\n\n // Clear Hypen data\n clearHypenData(element);\n}\n\n// ============================================================================\n// Legacy Compatibility Layer\n// ============================================================================\n\n/**\n * Symbol-based legacy accessor (for backwards compatibility)\n * Use the typed functions above instead when possible\n */\nconst HYPEN_ENGINE_SYMBOL = Symbol.for(\"hypen.engine\");\nconst REGISTERED_EVENTS_SYMBOL = Symbol.for(\"hypen.registeredEvents\");\nconst KEY_TARGET_SYMBOL = Symbol.for(\"hypen.keyTarget\");\n\n/**\n * Legacy accessor for engine (backwards compatible with existing code)\n */\nexport function getLegacyEngine(element: HTMLElement): IEngine | undefined {\n // Try new storage first\n const engine = getEngine(element);\n if (engine) return engine;\n\n // Fall back to legacy storage\n return (element as any)[HYPEN_ENGINE_SYMBOL] ??\n (element as any).__hypenEngine;\n}\n\n/**\n * Legacy setter for engine (backwards compatible)\n */\nexport function setLegacyEngine(element: HTMLElement, engine: IEngine): void {\n // Set in both locations for compatibility\n setEngine(element, engine);\n (element as any).__hypenEngine = engine;\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA;AAkCA,IAAM,iBAAiB,IAAI;AASpB,SAAS,YAAY,CAAC,SAAwC;AAAA,EACnE,IAAI,OAAO,eAAe,IAAI,OAAO;AAAA,EACrC,IAAI,CAAC,MAAM;AAAA,IACT,OAAO,CAAC;AAAA,IACR,eAAe,IAAI,SAAS,IAAI;AAAA,EAClC;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,YAAY,CAAC,SAA+B;AAAA,EAC1D,OAAO,eAAe,IAAI,OAAO;AAAA;AAM5B,SAAS,cAAc,CAAC,SAA4B;AAAA,EACzD,eAAe,OAAO,OAAO;AAAA;AAUxB,SAAS,SAAS,CAAC,SAA2C;AAAA,EACnE,OAAO,aAAa,OAAO,EAAE;AAAA;AAMxB,SAAS,SAAS,CAAC,SAAsB,QAAuB;AAAA,EACrE,aAAa,OAAO,EAAE,SAAS;AAAA;AAM1B,SAAS,UAAU,CAAC,SAA2C;AAAA,EACpE,IAAI,UAA8B;AAAA,EAClC,OAAO,SAAS;AAAA,IACd,MAAM,SAAS,UAAU,OAAO;AAAA,IAChC,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA;AAUK,SAAS,mBAAmB,CAAC,SAAmC;AAAA,EACrE,MAAM,OAAO,aAAa,OAAO;AAAA,EACjC,IAAI,CAAC,KAAK,kBAAkB;AAAA,IAC1B,KAAK,mBAAmB,IAAI;AAAA,EAC9B;AAAA,EACA,OAAO,KAAK;AAAA;AAMP,SAAS,iBAAiB,CAAC,SAAsB,UAA2B;AAAA,EACjF,OAAO,oBAAoB,OAAO,EAAE,IAAI,QAAQ;AAAA;AAM3C,SAAS,aAAa,CAAC,SAAsB,UAAwB;AAAA,EAC1E,oBAAoB,OAAO,EAAE,IAAI,QAAQ;AAAA;AAMpC,SAAS,eAAe,CAAC,SAAsB,UAAwB;AAAA,EAC5E,oBAAoB,OAAO,EAAE,OAAO,QAAQ;AAAA;AAUvC,SAAS,YAAY,CAAC,SAA0C;AAAA,EACrE,OAAO,aAAa,OAAO,EAAE;AAAA;AAMxB,SAAS,YAAY,CAAC,SAAsB,KAAmB;AAAA,EACpE,aAAa,OAAO,EAAE,YAAY;AAAA;AAU7B,SAAS,OAAU,CAAC,SAAsB,KAA4B;AAAA,EAC3E,OAAO,aAAa,OAAO,EAAE,OAAO;AAAA;AAM/B,SAAS,OAAU,CAAC,SAAsB,KAAa,OAAgB;AAAA,EAC5E,MAAM,OAAO,aAAa,OAAO;AAAA,EACjC,IAAI,CAAC,KAAK,MAAM;AAAA,IACd,KAAK,OAAO,CAAC;AAAA,EACf;AAAA,EACA,KAAK,KAAK,OAAO;AAAA;AAWZ,SAAS,mBAAmB,CAAC,SAA4B;AAAA,EAE9D,IAAI;AAAA,IACF,MAAM,cAAc,sBAAsB,OAAO;AAAA,IACjD,YAAY,QAAQ;AAAA,IACpB,MAAM;AAAA,EAKR,eAAe,OAAO;AAAA;AAWxB,IAAM,sBAAsB,OAAO,IAAI,cAAc;AACrD,IAAM,2BAA2B,OAAO,IAAI,wBAAwB;AACpE,IAAM,oBAAoB,OAAO,IAAI,iBAAiB;AAK/C,SAAS,eAAe,CAAC,SAA2C;AAAA,EAEzE,MAAM,SAAS,UAAU,OAAO;AAAA,EAChC,IAAI;AAAA,IAAQ,OAAO;AAAA,EAGnB,OAAQ,QAAgB,wBACrB,QAAgB;AAAA;AAMd,SAAS,eAAe,CAAC,SAAsB,QAAuB;AAAA,EAE3E,UAAU,SAAS,MAAM;AAAA,EACxB,QAAgB,gBAAgB;AAAA;",
8
+ "debugId": "7A14311B5432B21164756E2164756E21",
9
+ "names": []
10
+ }
@@ -28,6 +28,9 @@ var __export = (target, all) => {
28
28
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
29
29
 
30
30
  // src/dom/events.ts
31
+ import { frameworkLoggers } from "@hypen-space/core";
32
+ var log = frameworkLoggers.events;
33
+
31
34
  class EventManager {
32
35
  engine;
33
36
  bindings = new Map;
@@ -36,22 +39,22 @@ class EventManager {
36
39
  }
37
40
  attach(elementId, element, eventName, actionName) {
38
41
  const domEventName = eventName === "onClick" ? "click" : eventName;
39
- console.log(`[EventManager] Attaching ${eventName} (DOM: ${domEventName}) to element ${elementId}, action: ${actionName}`);
42
+ log.debug(`Attaching ${eventName} (DOM: ${domEventName}) to element ${elementId}, action: ${actionName}`);
40
43
  const listener = (event) => {
41
- console.log(`\uD83D\uDD25 [EventManager] Event fired: ${eventName} on ${elementId}, dispatching action: ${actionName}`);
42
- console.log(`\uD83D\uDD25 [EventManager] Event object:`, event);
43
- console.log(`\uD83D\uDD25 [EventManager] Element:`, element);
44
+ log.debug(`Event fired: ${eventName} on ${elementId}, dispatching action: ${actionName}`);
45
+ log.debug(`Event object:`, event);
46
+ log.debug(`Element:`, element);
44
47
  if (eventName === "submit" || eventName === "click" && element.tagName === "A") {
45
48
  event.preventDefault();
46
49
  }
47
50
  const payload = this.extractEventData(event, element);
48
- console.log(`\uD83D\uDD25 [EventManager] Event payload:`, payload);
49
- console.log(`\uD83D\uDD25 [EventManager] Calling engine.dispatchAction(${actionName})`);
51
+ log.debug(`Event payload:`, payload);
52
+ log.debug(`Calling engine.dispatchAction(${actionName})`);
50
53
  try {
51
54
  this.engine.dispatchAction(actionName, payload);
52
- console.log(`\uD83D\uDD25 [EventManager] ✅ dispatchAction succeeded`);
55
+ log.debug(`dispatchAction succeeded`);
53
56
  } catch (error) {
54
- console.error(`\uD83D\uDD25 [EventManager] ❌ dispatchAction failed:`, error);
57
+ log.error(`dispatchAction failed:`, error);
55
58
  }
56
59
  };
57
60
  let elementBindings = this.bindings.get(elementId);
@@ -61,8 +64,8 @@ class EventManager {
61
64
  }
62
65
  elementBindings.set(eventName, listener);
63
66
  element.addEventListener(domEventName, listener);
64
- console.log(`[EventManager] Listener attached to DOM for ${domEventName}`);
65
- console.log(`[EventManager] Element details:`, {
67
+ log.debug(`Listener attached to DOM for ${domEventName}`);
68
+ log.debug(`Element details:`, {
66
69
  tagName: element.tagName,
67
70
  id: element.id,
68
71
  dataset: element.dataset,
@@ -70,7 +73,7 @@ class EventManager {
70
73
  });
71
74
  if (domEventName === "click") {
72
75
  element.addEventListener("click", (e) => {
73
- console.log(`\uD83E\uDDEA [TEST] Raw DOM click detected on ${element.tagName}`, e);
76
+ log.debug(`Raw DOM click detected on ${element.tagName}`, e);
74
77
  });
75
78
  }
76
79
  }
@@ -134,4 +137,4 @@ export {
134
137
  EventManager
135
138
  };
136
139
 
137
- //# debugId=8D607FD71DE3A2DF64756E2164756E21
140
+ //# debugId=CFF27E1FA4869F5864756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dom/events.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Event Management System\n *\n * Handles DOM event binding and action dispatching\n */\n\nimport { frameworkLoggers } from \"@hypen-space/core\";\n\nconst log = frameworkLoggers.events;\n\n// Interface for the engine that EventManager needs\ninterface IEngine {\n dispatchAction(name: string, payload?: any): void;\n}\n\nexport interface EventBinding {\n elementId: string;\n eventName: string;\n actionName: string;\n}\n\nexport class EventManager {\n private engine: IEngine;\n private bindings: Map<string, Map<string, EventListener>> = new Map();\n\n constructor(engine: IEngine) {\n this.engine = engine;\n }\n\n /**\n * Attach an event listener to an element\n */\n attach(elementId: string, element: HTMLElement, eventName: string, actionName: string): void {\n // Convert onClick to click for DOM events\n const domEventName = eventName === \"onClick\" ? \"click\" : eventName;\n log.debug(`Attaching ${eventName} (DOM: ${domEventName}) to element ${elementId}, action: ${actionName}`);\n\n // Create event listener that dispatches action\n const listener = (event: Event) => {\n log.debug(`Event fired: ${eventName} on ${elementId}, dispatching action: ${actionName}`);\n log.debug(`Event object:`, event);\n log.debug(`Element:`, element);\n\n // Prevent default for certain events\n if (eventName === \"submit\" || (eventName === \"click\" && element.tagName === \"A\")) {\n event.preventDefault();\n }\n\n // Extract event data\n const payload = this.extractEventData(event, element);\n log.debug(`Event payload:`, payload);\n\n // Dispatch action to engine\n log.debug(`Calling engine.dispatchAction(${actionName})`);\n try {\n this.engine.dispatchAction(actionName, payload);\n log.debug(`dispatchAction succeeded`);\n } catch (error) {\n log.error(`dispatchAction failed:`, error);\n }\n };\n\n // Store listener reference\n let elementBindings = this.bindings.get(elementId);\n if (!elementBindings) {\n elementBindings = new Map();\n this.bindings.set(elementId, elementBindings);\n }\n elementBindings.set(eventName, listener);\n\n // Attach to DOM\n element.addEventListener(domEventName, listener);\n log.debug(`Listener attached to DOM for ${domEventName}`);\n log.debug(`Element details:`, {\n tagName: element.tagName,\n id: element.id,\n dataset: element.dataset,\n textContent: element.textContent?.substring(0, 50)\n });\n\n // Test: Add a simple click listener to verify DOM events work\n if (domEventName === \"click\") {\n element.addEventListener(\"click\", (e) => {\n log.debug(`Raw DOM click detected on ${element.tagName}`, e);\n });\n }\n }\n\n /**\n * Detach an event listener from an element\n */\n detach(elementId: string, element: HTMLElement, eventName: string): void {\n const elementBindings = this.bindings.get(elementId);\n if (!elementBindings) return;\n\n const listener = elementBindings.get(eventName);\n if (listener) {\n element.removeEventListener(eventName, listener);\n elementBindings.delete(eventName);\n }\n\n if (elementBindings.size === 0) {\n this.bindings.delete(elementId);\n }\n }\n\n /**\n * Extract relevant data from an event\n */\n private extractEventData(event: Event, element: HTMLElement): any {\n const data: any = {\n type: event.type,\n timestamp: Date.now(),\n };\n\n // Mouse events\n if (event instanceof MouseEvent) {\n data.clientX = event.clientX;\n data.clientY = event.clientY;\n data.button = event.button;\n }\n\n // Keyboard events\n if (event instanceof KeyboardEvent) {\n data.key = event.key;\n data.code = event.code;\n data.ctrlKey = event.ctrlKey;\n data.shiftKey = event.shiftKey;\n data.altKey = event.altKey;\n data.metaKey = event.metaKey;\n }\n\n // Input events (for form elements)\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n data.value = element.value;\n }\n\n // Select events\n if (element instanceof HTMLSelectElement) {\n data.value = element.value;\n data.selectedIndex = element.selectedIndex;\n }\n\n // Form events\n if (event.type === \"submit\" && element instanceof HTMLFormElement) {\n data.formData = new FormData(element);\n }\n\n return data;\n }\n\n /**\n * Clear all event bindings for an element\n */\n clearElement(elementId: string, element: HTMLElement): void {\n const elementBindings = this.bindings.get(elementId);\n if (!elementBindings) return;\n\n for (const [eventName, listener] of elementBindings) {\n element.removeEventListener(eventName, listener);\n }\n\n this.bindings.delete(elementId);\n }\n\n /**\n * Clear all event bindings\n */\n clearAll(): void {\n this.bindings.clear();\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "CFF27E1FA4869F5864756E2164756E21",
9
+ "names": []
10
+ }