@hypen-space/web 0.4.1 → 0.4.3
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.
- package/dist/canvas/accessibility.d.ts +47 -0
- package/dist/canvas/events.d.ts +87 -0
- package/dist/canvas/index.d.ts +11 -0
- package/dist/canvas/index.js +19 -13
- package/dist/canvas/index.js.map +6 -6
- package/dist/canvas/input.d.ts +56 -0
- package/dist/canvas/layout.d.ts +10 -0
- package/dist/canvas/layout.js +17 -12
- package/dist/canvas/layout.js.map +4 -4
- package/dist/canvas/paint.d.ts +14 -0
- package/dist/canvas/paint.js +3 -2
- package/dist/canvas/paint.js.map +4 -4
- package/dist/canvas/renderer.d.ts +99 -0
- package/dist/canvas/renderer.js +19 -13
- package/dist/canvas/renderer.js.map +6 -6
- package/dist/canvas/text.d.ts +22 -0
- package/dist/canvas/text.js +2 -2
- package/dist/canvas/text.js.map +2 -2
- package/dist/canvas/types.d.ts +96 -0
- package/dist/canvas/utils.d.ts +44 -0
- package/dist/client.d.ts +19 -0
- package/dist/client.js +46 -21
- package/dist/client.js.map +12 -11
- package/dist/dom/applicators/advanced-layout.d.ts +5 -0
- package/dist/dom/applicators/advanced-layout.js +1 -114
- package/dist/dom/applicators/advanced-layout.js.map +4 -5
- package/dist/dom/applicators/background.d.ts +5 -0
- package/dist/dom/applicators/border.d.ts +5 -0
- package/dist/dom/applicators/color.d.ts +5 -0
- package/dist/dom/applicators/display.d.ts +5 -0
- package/dist/dom/applicators/effects.d.ts +5 -0
- package/dist/dom/applicators/events.d.ts +8 -0
- package/dist/dom/applicators/events.js +3 -2
- package/dist/dom/applicators/events.js.map +3 -3
- package/dist/dom/applicators/font.d.ts +29 -0
- package/dist/dom/applicators/index.d.ts +76 -0
- package/dist/dom/applicators/index.js +3 -8
- package/dist/dom/applicators/index.js.map +4 -4
- package/dist/dom/applicators/layout.d.ts +10 -0
- package/dist/dom/applicators/margin.d.ts +11 -0
- package/dist/dom/applicators/padding.d.ts +11 -0
- package/dist/dom/applicators/size.d.ts +14 -0
- package/dist/dom/applicators/transform.d.ts +5 -0
- package/dist/dom/applicators/transition.d.ts +5 -0
- package/dist/dom/applicators/types.d.ts +6 -0
- package/dist/dom/applicators/typography.d.ts +5 -0
- package/dist/dom/canvas/index.d.ts +12 -0
- package/dist/dom/components/app.d.ts +8 -0
- package/dist/dom/components/app.js +55 -0
- package/dist/dom/components/app.js.map +10 -0
- package/dist/dom/components/audio.d.ts +5 -0
- package/dist/dom/components/avatar.d.ts +5 -0
- package/dist/dom/components/badge.d.ts +5 -0
- package/dist/dom/components/button.d.ts +9 -0
- package/dist/dom/components/card.d.ts +5 -0
- package/dist/dom/components/center.d.ts +9 -0
- package/dist/dom/components/checkbox.d.ts +5 -0
- package/dist/dom/components/column.d.ts +8 -0
- package/dist/dom/components/container.d.ts +5 -0
- package/dist/dom/components/divider.d.ts +5 -0
- package/dist/dom/components/grid.d.ts +7 -0
- package/dist/dom/components/heading.d.ts +5 -0
- package/dist/dom/components/hypenapp.d.ts +19 -0
- package/dist/dom/components/hypenapp.js +2 -4
- package/dist/dom/components/hypenapp.js.map +3 -3
- package/dist/dom/components/image.d.ts +5 -0
- package/dist/dom/components/index.d.ts +29 -0
- package/dist/dom/components/index.js +29 -5
- package/dist/dom/components/index.js.map +7 -6
- package/dist/dom/components/input.d.ts +5 -0
- package/dist/dom/components/link.d.ts +5 -0
- package/dist/dom/components/list.d.ts +5 -0
- package/dist/dom/components/paragraph.d.ts +5 -0
- package/dist/dom/components/progressbar.d.ts +5 -0
- package/dist/dom/components/route.d.ts +6 -0
- package/dist/dom/components/route.js +2 -2
- package/dist/dom/components/route.js.map +2 -2
- package/dist/dom/components/router.d.ts +5 -0
- package/dist/dom/components/row.d.ts +7 -0
- package/dist/dom/components/select.d.ts +5 -0
- package/dist/dom/components/slider.d.ts +5 -0
- package/dist/dom/components/spacer.d.ts +5 -0
- package/dist/dom/components/spinner.d.ts +5 -0
- package/dist/dom/components/stack.d.ts +5 -0
- package/dist/dom/components/switch.d.ts +5 -0
- package/dist/dom/components/text.d.ts +5 -0
- package/dist/dom/components/textarea.d.ts +5 -0
- package/dist/dom/components/video.d.ts +5 -0
- package/dist/dom/debug.d.ts +63 -0
- package/dist/dom/debug.js +2 -2
- package/dist/dom/debug.js.map +2 -2
- package/dist/dom/element-data.d.ts +94 -0
- package/dist/dom/events.d.ts +39 -0
- package/dist/dom/events.js +2 -2
- package/dist/dom/events.js.map +2 -2
- package/dist/dom/index.d.ts +10 -0
- package/dist/dom/index.js +46 -21
- package/dist/dom/index.js.map +12 -11
- package/dist/dom/renderer.d.ts +115 -0
- package/dist/dom/renderer.js +45 -20
- package/dist/dom/renderer.js.map +11 -10
- package/dist/hypen.d.ts +140 -0
- package/dist/hypen.js +46 -21
- package/dist/hypen.js.map +12 -11
- package/dist/index.d.ts +28 -0
- package/dist/index.js +64 -33
- package/dist/index.js.map +16 -15
- package/package.json +3 -2
- package/src/dom/components/index.ts +2 -0
- package/src/dom/renderer.ts +18 -6
|
@@ -32,7 +32,7 @@ var exports_route = {};
|
|
|
32
32
|
__export(exports_route, {
|
|
33
33
|
routeHandler: () => routeHandler
|
|
34
34
|
});
|
|
35
|
-
import { frameworkLoggers } from "@hypen-space/core";
|
|
35
|
+
import { frameworkLoggers } from "@hypen-space/core/logger";
|
|
36
36
|
var log, routeHandler;
|
|
37
37
|
var init_route = __esm(() => {
|
|
38
38
|
log = frameworkLoggers.router;
|
|
@@ -65,4 +65,4 @@ export {
|
|
|
65
65
|
routeHandler
|
|
66
66
|
};
|
|
67
67
|
|
|
68
|
-
//# debugId=
|
|
68
|
+
//# debugId=F3E0E9255A1674A564756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/dom/components/route.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Route Component - Lazy rendering container for route content\n * Stores component name as metadata, Router handles actual rendering\n */\n\nimport type { ComponentHandler } from \"./index.js\";\nimport { frameworkLoggers } from \"@hypen-space/core\";\n\nconst log = frameworkLoggers.router;\n\nexport const routeHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"div\");\n el.style.display = \"flex\";\n el.style.flexDirection = \"column\";\n el.style.width = \"100%\";\n el.dataset.hypenType = \"route\";\n el.dataset.routeRendered = \"false\"; // Track if component has been rendered\n return el;\n },\n\n applyProps(el: HTMLElement, props: Record<string, any>): void {\n // Extract route path from props\n const path = props.path || props[\"0\"] || \"/\";\n el.dataset.routePath = String(path);\n \n // Check if this is a lazy route (has __lazy flag)\n const isLazy = props.__lazy === true;\n el.dataset.routeLazy = String(isLazy);\n \n // Store component name - either from explicit prop or from lazy child\n const componentName = props.component || props.__lazy_child;\n if (componentName) {\n el.dataset.routeComponent = String(componentName);\n }\n \n log.debug(`Route created: path=\"${path}\", lazy=${isLazy}, component=\"${el.dataset.routeComponent || 'none'}\"`);\n },\n};\n\n"
|
|
5
|
+
"/**\n * Route Component - Lazy rendering container for route content\n * Stores component name as metadata, Router handles actual rendering\n */\n\nimport type { ComponentHandler } from \"./index.js\";\nimport { frameworkLoggers } from \"@hypen-space/core/logger\";\n\nconst log = frameworkLoggers.router;\n\nexport const routeHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"div\");\n el.style.display = \"flex\";\n el.style.flexDirection = \"column\";\n el.style.width = \"100%\";\n el.dataset.hypenType = \"route\";\n el.dataset.routeRendered = \"false\"; // Track if component has been rendered\n return el;\n },\n\n applyProps(el: HTMLElement, props: Record<string, any>): void {\n // Extract route path from props\n const path = props.path || props[\"0\"] || \"/\";\n el.dataset.routePath = String(path);\n \n // Check if this is a lazy route (has __lazy flag)\n const isLazy = props.__lazy === true;\n el.dataset.routeLazy = String(isLazy);\n \n // Store component name - either from explicit prop or from lazy child\n const componentName = props.component || props.__lazy_child;\n if (componentName) {\n el.dataset.routeComponent = String(componentName);\n }\n \n log.debug(`Route created: path=\"${path}\", lazy=${isLazy}, component=\"${el.dataset.routeComponent || 'none'}\"`);\n },\n};\n\n"
|
|
6
6
|
],
|
|
7
7
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;AAAA,IAEM,KAEO;AAAA;AAAA,EAFP,MAAM,iBAAiB;AAAA,EAEhB,eAAiC;AAAA,IAC5C,MAAM,GAAgB;AAAA,MACpB,MAAM,KAAK,SAAS,cAAc,KAAK;AAAA,MACvC,GAAG,MAAM,UAAU;AAAA,MACnB,GAAG,MAAM,gBAAgB;AAAA,MACzB,GAAG,MAAM,QAAQ;AAAA,MACjB,GAAG,QAAQ,YAAY;AAAA,MACvB,GAAG,QAAQ,gBAAgB;AAAA,MAC3B,OAAO;AAAA;AAAA,IAGT,UAAU,CAAC,IAAiB,OAAkC;AAAA,MAE5D,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ;AAAA,MACzC,GAAG,QAAQ,YAAY,OAAO,IAAI;AAAA,MAGlC,MAAM,SAAS,MAAM,WAAW;AAAA,MAChC,GAAG,QAAQ,YAAY,OAAO,MAAM;AAAA,MAGpC,MAAM,gBAAgB,MAAM,aAAa,MAAM;AAAA,MAC/C,IAAI,eAAe;AAAA,QACjB,GAAG,QAAQ,iBAAiB,OAAO,aAAa;AAAA,MAClD;AAAA,MAEA,IAAI,MAAM,wBAAwB,eAAe,sBAAsB,GAAG,QAAQ,kBAAkB,SAAS;AAAA;AAAA,EAEjH;AAAA;",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "F3E0E9255A1674A564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Row Component - Horizontal Stack
|
|
3
|
+
* Children keep their intrinsic size by default (matching iOS/Android behavior).
|
|
4
|
+
* Use .weight(1) on children to make them expand equally.
|
|
5
|
+
*/
|
|
6
|
+
import type { ComponentHandler } from "./index.js";
|
|
7
|
+
export declare const rowHandler: ComponentHandler;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug utilities for DOM rendering visualization
|
|
3
|
+
*
|
|
4
|
+
* Provides heatmap overlays to visualize re-renders
|
|
5
|
+
*/
|
|
6
|
+
export interface DebugConfig {
|
|
7
|
+
/** Enable debug mode */
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
/** Show heatmap overlays on re-renders */
|
|
10
|
+
showHeatmap: boolean;
|
|
11
|
+
/** Increment per re-render (default: 5%) */
|
|
12
|
+
heatmapIncrement: number;
|
|
13
|
+
/** Maximum opacity for heatmap (default: 0.8) */
|
|
14
|
+
maxOpacity: number;
|
|
15
|
+
/** Fade out duration in ms (0 to disable) */
|
|
16
|
+
fadeOutDuration: number;
|
|
17
|
+
}
|
|
18
|
+
export declare const defaultDebugConfig: DebugConfig;
|
|
19
|
+
/**
|
|
20
|
+
* Tracks re-render counts for each element
|
|
21
|
+
*/
|
|
22
|
+
export declare class RerenderTracker {
|
|
23
|
+
private renderCounts;
|
|
24
|
+
private overlays;
|
|
25
|
+
private config;
|
|
26
|
+
constructor(config?: DebugConfig);
|
|
27
|
+
/**
|
|
28
|
+
* Update the configuration
|
|
29
|
+
*/
|
|
30
|
+
setConfig(config: Partial<DebugConfig>): void;
|
|
31
|
+
/**
|
|
32
|
+
* Track a re-render for an element
|
|
33
|
+
*/
|
|
34
|
+
trackRerender(id: string, element: HTMLElement, patchType: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Create or update the heatmap overlay for an element
|
|
37
|
+
*/
|
|
38
|
+
private updateHeatmap;
|
|
39
|
+
/**
|
|
40
|
+
* Reset tracking for a specific element
|
|
41
|
+
*/
|
|
42
|
+
reset(id: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Reset tracking for all elements
|
|
45
|
+
*/
|
|
46
|
+
resetAll(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Get render count for an element
|
|
49
|
+
*/
|
|
50
|
+
getRenderCount(id: string): number;
|
|
51
|
+
/**
|
|
52
|
+
* Clean up all overlays (called when debug mode is disabled)
|
|
53
|
+
*/
|
|
54
|
+
private cleanup;
|
|
55
|
+
/**
|
|
56
|
+
* Get statistics about re-renders
|
|
57
|
+
*/
|
|
58
|
+
getStats(): {
|
|
59
|
+
totalRerenders: number;
|
|
60
|
+
elementCount: number;
|
|
61
|
+
avgRerenders: number;
|
|
62
|
+
};
|
|
63
|
+
}
|
package/dist/dom/debug.js
CHANGED
|
@@ -28,7 +28,7 @@ var __export = (target, all) => {
|
|
|
28
28
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
29
29
|
|
|
30
30
|
// src/dom/debug.ts
|
|
31
|
-
import { frameworkLoggers } from "@hypen-space/core";
|
|
31
|
+
import { frameworkLoggers } from "@hypen-space/core/logger";
|
|
32
32
|
var log = frameworkLoggers.debug;
|
|
33
33
|
var defaultDebugConfig = {
|
|
34
34
|
enabled: false,
|
|
@@ -194,4 +194,4 @@ export {
|
|
|
194
194
|
RerenderTracker
|
|
195
195
|
};
|
|
196
196
|
|
|
197
|
-
//# debugId=
|
|
197
|
+
//# debugId=6D5CACC8379C540864756E2164756E21
|
package/dist/dom/debug.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/dom/debug.ts"],
|
|
4
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"
|
|
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/logger\";\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
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "6D5CACC8379C540864756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-Safe Element Data
|
|
3
|
+
*
|
|
4
|
+
* Provides strongly-typed access to Hypen-specific data attached to DOM elements.
|
|
5
|
+
* Eliminates `as any` casts throughout the codebase.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Engine interface for dispatching actions
|
|
9
|
+
*/
|
|
10
|
+
export interface IEngine {
|
|
11
|
+
dispatchAction(name: string, payload?: unknown): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* All Hypen-specific data attached to an element
|
|
15
|
+
*/
|
|
16
|
+
export interface HypenElementData {
|
|
17
|
+
/** Engine reference for action dispatch */
|
|
18
|
+
engine?: IEngine;
|
|
19
|
+
/** Target key for keyboard events (e.g., "Enter", "Escape") */
|
|
20
|
+
keyTarget?: string;
|
|
21
|
+
/** Set of registered event type:action pairs */
|
|
22
|
+
registeredEvents?: Set<string>;
|
|
23
|
+
/** Custom element metadata */
|
|
24
|
+
meta?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get Hypen data for an element, creating if needed
|
|
28
|
+
*/
|
|
29
|
+
export declare function getHypenData(element: HTMLElement): HypenElementData;
|
|
30
|
+
/**
|
|
31
|
+
* Check if element has Hypen data
|
|
32
|
+
*/
|
|
33
|
+
export declare function hasHypenData(element: HTMLElement): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Clear Hypen data from an element
|
|
36
|
+
*/
|
|
37
|
+
export declare function clearHypenData(element: HTMLElement): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get the engine attached to an element
|
|
40
|
+
*/
|
|
41
|
+
export declare function getEngine(element: HTMLElement): IEngine | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Set the engine on an element
|
|
44
|
+
*/
|
|
45
|
+
export declare function setEngine(element: HTMLElement, engine: IEngine): void;
|
|
46
|
+
/**
|
|
47
|
+
* Find engine by walking up the DOM tree
|
|
48
|
+
*/
|
|
49
|
+
export declare function findEngine(element: HTMLElement): IEngine | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Get registered events set for an element
|
|
52
|
+
*/
|
|
53
|
+
export declare function getRegisteredEvents(element: HTMLElement): Set<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Check if an event handler is registered
|
|
56
|
+
*/
|
|
57
|
+
export declare function isEventRegistered(element: HTMLElement, eventKey: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Mark an event handler as registered
|
|
60
|
+
*/
|
|
61
|
+
export declare function registerEvent(element: HTMLElement, eventKey: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Unregister an event handler
|
|
64
|
+
*/
|
|
65
|
+
export declare function unregisterEvent(element: HTMLElement, eventKey: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Get the target key for keyboard events
|
|
68
|
+
*/
|
|
69
|
+
export declare function getKeyTarget(element: HTMLElement): string | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Set the target key for keyboard events
|
|
72
|
+
*/
|
|
73
|
+
export declare function setKeyTarget(element: HTMLElement, key: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Get custom metadata value
|
|
76
|
+
*/
|
|
77
|
+
export declare function getMeta<T>(element: HTMLElement, key: string): T | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Set custom metadata value
|
|
80
|
+
*/
|
|
81
|
+
export declare function setMeta<T>(element: HTMLElement, key: string, value: T): void;
|
|
82
|
+
/**
|
|
83
|
+
* Dispose all resources attached to an element and clear data
|
|
84
|
+
* Call this when removing an element from the DOM
|
|
85
|
+
*/
|
|
86
|
+
export declare function disposeHypenElement(element: HTMLElement): void;
|
|
87
|
+
/**
|
|
88
|
+
* Legacy accessor for engine (backwards compatible with existing code)
|
|
89
|
+
*/
|
|
90
|
+
export declare function getLegacyEngine(element: HTMLElement): IEngine | undefined;
|
|
91
|
+
/**
|
|
92
|
+
* Legacy setter for engine (backwards compatible)
|
|
93
|
+
*/
|
|
94
|
+
export declare function setLegacyEngine(element: HTMLElement, engine: IEngine): void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Management System
|
|
3
|
+
*
|
|
4
|
+
* Handles DOM event binding and action dispatching
|
|
5
|
+
*/
|
|
6
|
+
interface IEngine {
|
|
7
|
+
dispatchAction(name: string, payload?: any): void;
|
|
8
|
+
}
|
|
9
|
+
export interface EventBinding {
|
|
10
|
+
elementId: string;
|
|
11
|
+
eventName: string;
|
|
12
|
+
actionName: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class EventManager {
|
|
15
|
+
private engine;
|
|
16
|
+
private bindings;
|
|
17
|
+
constructor(engine: IEngine);
|
|
18
|
+
/**
|
|
19
|
+
* Attach an event listener to an element
|
|
20
|
+
*/
|
|
21
|
+
attach(elementId: string, element: HTMLElement, eventName: string, actionName: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Detach an event listener from an element
|
|
24
|
+
*/
|
|
25
|
+
detach(elementId: string, element: HTMLElement, eventName: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Extract relevant data from an event
|
|
28
|
+
*/
|
|
29
|
+
private extractEventData;
|
|
30
|
+
/**
|
|
31
|
+
* Clear all event bindings for an element
|
|
32
|
+
*/
|
|
33
|
+
clearElement(elementId: string, element: HTMLElement): void;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all event bindings
|
|
36
|
+
*/
|
|
37
|
+
clearAll(): void;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
package/dist/dom/events.js
CHANGED
|
@@ -28,7 +28,7 @@ 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";
|
|
31
|
+
import { frameworkLoggers } from "@hypen-space/core/logger";
|
|
32
32
|
var log = frameworkLoggers.events;
|
|
33
33
|
|
|
34
34
|
class EventManager {
|
|
@@ -137,4 +137,4 @@ export {
|
|
|
137
137
|
EventManager
|
|
138
138
|
};
|
|
139
139
|
|
|
140
|
-
//# debugId=
|
|
140
|
+
//# debugId=AB9487AE99F7A49464756E2164756E21
|
package/dist/dom/events.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/dom/events.ts"],
|
|
4
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"
|
|
5
|
+
"/**\n * Event Management System\n *\n * Handles DOM event binding and action dispatching\n */\n\nimport { frameworkLoggers } from \"@hypen-space/core/logger\";\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
6
|
],
|
|
7
7
|
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"debugId": "AB9487AE99F7A49464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM Renderer for Hypen
|
|
3
|
+
*
|
|
4
|
+
* Browser-only module for rendering Hypen UI to the DOM
|
|
5
|
+
*/
|
|
6
|
+
export { DOMRenderer } from "./renderer.js";
|
|
7
|
+
export { ComponentRegistry } from "./components/index.js";
|
|
8
|
+
export { ApplicatorRegistry } from "./applicators/index.js";
|
|
9
|
+
export { EventManager } from "./events.js";
|
|
10
|
+
export { RerenderTracker, type DebugConfig, defaultDebugConfig } from "./debug.js";
|
package/dist/dom/index.js
CHANGED
|
@@ -1011,7 +1011,7 @@ var exports_route = {};
|
|
|
1011
1011
|
__export(exports_route, {
|
|
1012
1012
|
routeHandler: () => routeHandler
|
|
1013
1013
|
});
|
|
1014
|
-
import { frameworkLoggers } from "@hypen-space/core";
|
|
1014
|
+
import { frameworkLoggers } from "@hypen-space/core/logger";
|
|
1015
1015
|
var log, routeHandler;
|
|
1016
1016
|
var init_route = __esm(() => {
|
|
1017
1017
|
log = frameworkLoggers.router;
|
|
@@ -1046,7 +1046,7 @@ __export(exports_hypenapp, {
|
|
|
1046
1046
|
disconnectHypenApp: () => disconnectHypenApp
|
|
1047
1047
|
});
|
|
1048
1048
|
import { RemoteEngine } from "@hypen-space/core/remote/client";
|
|
1049
|
-
import { frameworkLoggers as frameworkLoggers2 } from "@hypen-space/core";
|
|
1049
|
+
import { frameworkLoggers as frameworkLoggers2 } from "@hypen-space/core/logger";
|
|
1050
1050
|
function applyPatches(container, nodes, patches, engine, onRoot) {
|
|
1051
1051
|
for (const patch of patches) {
|
|
1052
1052
|
switch (patch.type) {
|
|
@@ -1202,8 +1202,6 @@ function applyProp(el, name, value) {
|
|
|
1202
1202
|
border: "border",
|
|
1203
1203
|
gap: "gap",
|
|
1204
1204
|
flex: "flex",
|
|
1205
|
-
alignItems: "alignItems",
|
|
1206
|
-
justifyContent: "justifyContent",
|
|
1207
1205
|
opacity: "opacity",
|
|
1208
1206
|
overflow: "overflow"
|
|
1209
1207
|
};
|
|
@@ -1301,6 +1299,26 @@ var init_hypenapp = __esm(() => {
|
|
|
1301
1299
|
};
|
|
1302
1300
|
});
|
|
1303
1301
|
|
|
1302
|
+
// src/dom/components/app.ts
|
|
1303
|
+
var exports_app = {};
|
|
1304
|
+
__export(exports_app, {
|
|
1305
|
+
appHandler: () => appHandler
|
|
1306
|
+
});
|
|
1307
|
+
var appHandler;
|
|
1308
|
+
var init_app = __esm(() => {
|
|
1309
|
+
appHandler = {
|
|
1310
|
+
create() {
|
|
1311
|
+
const el = document.createElement("div");
|
|
1312
|
+
el.style.display = "flex";
|
|
1313
|
+
el.style.flexDirection = "column";
|
|
1314
|
+
el.style.minHeight = "100vh";
|
|
1315
|
+
el.style.width = "100%";
|
|
1316
|
+
el.dataset.hypenType = "app";
|
|
1317
|
+
return el;
|
|
1318
|
+
}
|
|
1319
|
+
};
|
|
1320
|
+
});
|
|
1321
|
+
|
|
1304
1322
|
// src/dom/components/index.ts
|
|
1305
1323
|
class ComponentRegistry {
|
|
1306
1324
|
handlers = new Map;
|
|
@@ -1311,9 +1329,13 @@ class ComponentRegistry {
|
|
|
1311
1329
|
this.handlers.set(type.toLowerCase(), handler);
|
|
1312
1330
|
}
|
|
1313
1331
|
get(type) {
|
|
1332
|
+
if (!type)
|
|
1333
|
+
return;
|
|
1314
1334
|
return this.handlers.get(type.toLowerCase());
|
|
1315
1335
|
}
|
|
1316
1336
|
createElement(type, props = {}) {
|
|
1337
|
+
if (!type)
|
|
1338
|
+
return null;
|
|
1317
1339
|
const handler = this.get(type);
|
|
1318
1340
|
if (!handler)
|
|
1319
1341
|
return null;
|
|
@@ -1355,6 +1377,8 @@ class ComponentRegistry {
|
|
|
1355
1377
|
const { routerHandler: routerHandler2 } = (init_router(), __toCommonJS(exports_router));
|
|
1356
1378
|
const { routeHandler: routeHandler2 } = (init_route(), __toCommonJS(exports_route));
|
|
1357
1379
|
const { hypenAppHandler: hypenAppHandler2 } = (init_hypenapp(), __toCommonJS(exports_hypenapp));
|
|
1380
|
+
const { appHandler: appHandler2 } = (init_app(), __toCommonJS(exports_app));
|
|
1381
|
+
this.register("app", appHandler2);
|
|
1358
1382
|
this.register("column", columnHandler2);
|
|
1359
1383
|
this.register("row", rowHandler2);
|
|
1360
1384
|
this.register("text", textHandler2);
|
|
@@ -2038,7 +2062,7 @@ import {
|
|
|
2038
2062
|
disposableListener,
|
|
2039
2063
|
disposableTimeout
|
|
2040
2064
|
} from "@hypen-space/core/disposable";
|
|
2041
|
-
import { frameworkLoggers as frameworkLoggers3 } from "@hypen-space/core";
|
|
2065
|
+
import { frameworkLoggers as frameworkLoggers3 } from "@hypen-space/core/logger";
|
|
2042
2066
|
var log3 = frameworkLoggers3.events;
|
|
2043
2067
|
function toPlainObject(value) {
|
|
2044
2068
|
if (value instanceof Map) {
|
|
@@ -2323,6 +2347,7 @@ var eventHandlers = {
|
|
|
2323
2347
|
extractPayload: scrollPayload
|
|
2324
2348
|
}),
|
|
2325
2349
|
onLongClick: createLongClickHandler(500),
|
|
2350
|
+
onLongPress: createLongClickHandler(500),
|
|
2326
2351
|
onFocus: createEventHandler("focus", { extractPayload: focusPayload }),
|
|
2327
2352
|
onBlur: createEventHandler("blur", { extractPayload: focusPayload }),
|
|
2328
2353
|
onMouseEnter: createEventHandler("mouseenter", { extractPayload: mousePayload }),
|
|
@@ -2584,12 +2609,6 @@ var advancedLayoutHandlers = {
|
|
|
2584
2609
|
flexBasis: (el, value) => {
|
|
2585
2610
|
el.style.flexBasis = typeof value === "number" ? `${value}px` : String(value);
|
|
2586
2611
|
},
|
|
2587
|
-
justifyContent: (el, value) => {
|
|
2588
|
-
el.style.justifyContent = mapAlignmentValue(String(value));
|
|
2589
|
-
},
|
|
2590
|
-
alignItems: (el, value) => {
|
|
2591
|
-
el.style.alignItems = mapAlignmentValue(String(value));
|
|
2592
|
-
},
|
|
2593
2612
|
alignContent: (el, value) => {
|
|
2594
2613
|
el.style.alignContent = String(value);
|
|
2595
2614
|
},
|
|
@@ -3127,7 +3146,7 @@ var canvasApplicators = {
|
|
|
3127
3146
|
};
|
|
3128
3147
|
|
|
3129
3148
|
// src/dom/debug.ts
|
|
3130
|
-
import { frameworkLoggers as frameworkLoggers4 } from "@hypen-space/core";
|
|
3149
|
+
import { frameworkLoggers as frameworkLoggers4 } from "@hypen-space/core/logger";
|
|
3131
3150
|
var log4 = frameworkLoggers4.debug;
|
|
3132
3151
|
var defaultDebugConfig = {
|
|
3133
3152
|
enabled: false,
|
|
@@ -3290,7 +3309,7 @@ class RerenderTracker {
|
|
|
3290
3309
|
}
|
|
3291
3310
|
|
|
3292
3311
|
// src/dom/renderer.ts
|
|
3293
|
-
import { frameworkLoggers as frameworkLoggers5 } from "@hypen-space/core";
|
|
3312
|
+
import { frameworkLoggers as frameworkLoggers5 } from "@hypen-space/core/logger";
|
|
3294
3313
|
var log5 = frameworkLoggers5.renderer;
|
|
3295
3314
|
|
|
3296
3315
|
class DOMRenderer {
|
|
@@ -3363,24 +3382,30 @@ class DOMRenderer {
|
|
|
3363
3382
|
});
|
|
3364
3383
|
}
|
|
3365
3384
|
applyPatch(patch) {
|
|
3385
|
+
const p = patch;
|
|
3386
|
+
const id = patch.id ?? p.id;
|
|
3387
|
+
const elementType = patch.elementType ?? p.element_type;
|
|
3388
|
+
const parentId = patch.parentId ?? p.parent_id;
|
|
3389
|
+
const beforeId = patch.beforeId ?? p.before_id;
|
|
3390
|
+
const eventName = patch.eventName ?? p.event_name;
|
|
3366
3391
|
switch (patch.type) {
|
|
3367
3392
|
case "create":
|
|
3368
|
-
this.onCreate(
|
|
3393
|
+
this.onCreate(id, elementType ?? "container", patch.props || {});
|
|
3369
3394
|
break;
|
|
3370
3395
|
case "setProp":
|
|
3371
|
-
this.onSetProp(
|
|
3396
|
+
this.onSetProp(id, patch.name, patch.value);
|
|
3372
3397
|
break;
|
|
3373
3398
|
case "setText":
|
|
3374
|
-
this.onSetText(
|
|
3399
|
+
this.onSetText(id, patch.text);
|
|
3375
3400
|
break;
|
|
3376
3401
|
case "insert":
|
|
3377
|
-
this.onInsert(
|
|
3402
|
+
this.onInsert(parentId, id, beforeId);
|
|
3378
3403
|
break;
|
|
3379
3404
|
case "move":
|
|
3380
|
-
this.onMove(
|
|
3405
|
+
this.onMove(parentId, id, beforeId);
|
|
3381
3406
|
break;
|
|
3382
3407
|
case "remove":
|
|
3383
|
-
this.onRemove(
|
|
3408
|
+
this.onRemove(id);
|
|
3384
3409
|
break;
|
|
3385
3410
|
}
|
|
3386
3411
|
}
|
|
@@ -3511,7 +3536,7 @@ class DOMRenderer {
|
|
|
3511
3536
|
}
|
|
3512
3537
|
|
|
3513
3538
|
// src/dom/events.ts
|
|
3514
|
-
import { frameworkLoggers as frameworkLoggers6 } from "@hypen-space/core";
|
|
3539
|
+
import { frameworkLoggers as frameworkLoggers6 } from "@hypen-space/core/logger";
|
|
3515
3540
|
var log6 = frameworkLoggers6.events;
|
|
3516
3541
|
|
|
3517
3542
|
class EventManager {
|
|
@@ -3625,4 +3650,4 @@ export {
|
|
|
3625
3650
|
ApplicatorRegistry
|
|
3626
3651
|
};
|
|
3627
3652
|
|
|
3628
|
-
//# debugId=
|
|
3653
|
+
//# debugId=5D2D653C8A26162564756E2164756E21
|