@hypen-space/web 0.2.0
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/chunk-2s02mkzs.js +32 -0
- package/dist/chunk-2s02mkzs.js.map +9 -0
- package/dist/src/canvas/accessibility.js +152 -0
- package/dist/src/canvas/accessibility.js.map +10 -0
- package/dist/src/canvas/events.js +198 -0
- package/dist/src/canvas/events.js.map +10 -0
- package/dist/src/canvas/index.js +28 -0
- package/dist/src/canvas/index.js.map +9 -0
- package/dist/src/canvas/input.js +132 -0
- package/dist/src/canvas/input.js.map +10 -0
- package/dist/src/canvas/layout.js +309 -0
- package/dist/src/canvas/layout.js.map +10 -0
- package/dist/src/canvas/paint.js +878 -0
- package/dist/src/canvas/paint.js.map +10 -0
- package/dist/src/canvas/renderer.js +276 -0
- package/dist/src/canvas/renderer.js.map +10 -0
- package/dist/src/canvas/text.js +118 -0
- package/dist/src/canvas/text.js.map +10 -0
- package/dist/src/canvas/types.js +2 -0
- package/dist/src/canvas/types.js.map +9 -0
- package/dist/src/canvas/utils.js +139 -0
- package/dist/src/canvas/utils.js.map +10 -0
- package/dist/src/dom/applicators/advanced-layout.js +111 -0
- package/dist/src/dom/applicators/advanced-layout.js.map +10 -0
- package/dist/src/dom/applicators/background.js +54 -0
- package/dist/src/dom/applicators/background.js.map +10 -0
- package/dist/src/dom/applicators/border.js +33 -0
- package/dist/src/dom/applicators/border.js.map +10 -0
- package/dist/src/dom/applicators/color.js +36 -0
- package/dist/src/dom/applicators/color.js.map +10 -0
- package/dist/src/dom/applicators/display.js +57 -0
- package/dist/src/dom/applicators/display.js.map +10 -0
- package/dist/src/dom/applicators/effects.js +89 -0
- package/dist/src/dom/applicators/effects.js.map +10 -0
- package/dist/src/dom/applicators/events.js +518 -0
- package/dist/src/dom/applicators/events.js.map +10 -0
- package/dist/src/dom/applicators/font.js +39 -0
- package/dist/src/dom/applicators/font.js.map +10 -0
- package/dist/src/dom/applicators/index.js +296 -0
- package/dist/src/dom/applicators/index.js.map +10 -0
- package/dist/src/dom/applicators/layout.js +86 -0
- package/dist/src/dom/applicators/layout.js.map +10 -0
- package/dist/src/dom/applicators/margin.js +32 -0
- package/dist/src/dom/applicators/margin.js.map +10 -0
- package/dist/src/dom/applicators/padding.js +35 -0
- package/dist/src/dom/applicators/padding.js.map +10 -0
- package/dist/src/dom/applicators/size.js +42 -0
- package/dist/src/dom/applicators/size.js.map +10 -0
- package/dist/src/dom/applicators/transform.js +92 -0
- package/dist/src/dom/applicators/transform.js.map +10 -0
- package/dist/src/dom/applicators/transition.js +66 -0
- package/dist/src/dom/applicators/transition.js.map +10 -0
- package/dist/src/dom/applicators/typography.js +87 -0
- package/dist/src/dom/applicators/typography.js.map +10 -0
- package/dist/src/dom/canvas/index.js +50 -0
- package/dist/src/dom/canvas/index.js.map +10 -0
- package/dist/src/dom/components/audio.js +48 -0
- package/dist/src/dom/components/audio.js.map +10 -0
- package/dist/src/dom/components/avatar.js +58 -0
- package/dist/src/dom/components/avatar.js.map +10 -0
- package/dist/src/dom/components/badge.js +55 -0
- package/dist/src/dom/components/badge.js.map +10 -0
- package/dist/src/dom/components/button.js +29 -0
- package/dist/src/dom/components/button.js.map +10 -0
- package/dist/src/dom/components/card.js +33 -0
- package/dist/src/dom/components/card.js.map +10 -0
- package/dist/src/dom/components/center.js +32 -0
- package/dist/src/dom/components/center.js.map +10 -0
- package/dist/src/dom/components/checkbox.js +54 -0
- package/dist/src/dom/components/checkbox.js.map +10 -0
- package/dist/src/dom/components/column.js +31 -0
- package/dist/src/dom/components/column.js.map +10 -0
- package/dist/src/dom/components/container.js +29 -0
- package/dist/src/dom/components/container.js.map +10 -0
- package/dist/src/dom/components/divider.js +45 -0
- package/dist/src/dom/components/divider.js.map +10 -0
- package/dist/src/dom/components/grid.js +44 -0
- package/dist/src/dom/components/grid.js.map +10 -0
- package/dist/src/dom/components/heading.js +47 -0
- package/dist/src/dom/components/heading.js.map +10 -0
- package/dist/src/dom/components/image.js +39 -0
- package/dist/src/dom/components/image.js.map +10 -0
- package/dist/src/dom/components/index.js +217 -0
- package/dist/src/dom/components/index.js.map +10 -0
- package/dist/src/dom/components/input.js +41 -0
- package/dist/src/dom/components/input.js.map +10 -0
- package/dist/src/dom/components/link.js +42 -0
- package/dist/src/dom/components/link.js.map +10 -0
- package/dist/src/dom/components/list.js +42 -0
- package/dist/src/dom/components/list.js.map +10 -0
- package/dist/src/dom/components/paragraph.js +35 -0
- package/dist/src/dom/components/paragraph.js.map +10 -0
- package/dist/src/dom/components/progressbar.js +57 -0
- package/dist/src/dom/components/progressbar.js.map +10 -0
- package/dist/src/dom/components/route.js +44 -0
- package/dist/src/dom/components/route.js.map +10 -0
- package/dist/src/dom/components/router.js +33 -0
- package/dist/src/dom/components/router.js.map +10 -0
- package/dist/src/dom/components/row.js +31 -0
- package/dist/src/dom/components/row.js.map +10 -0
- package/dist/src/dom/components/select.js +57 -0
- package/dist/src/dom/components/select.js.map +10 -0
- package/dist/src/dom/components/slider.js +48 -0
- package/dist/src/dom/components/slider.js.map +10 -0
- package/dist/src/dom/components/spacer.js +30 -0
- package/dist/src/dom/components/spacer.js.map +10 -0
- package/dist/src/dom/components/spinner.js +65 -0
- package/dist/src/dom/components/spinner.js.map +10 -0
- package/dist/src/dom/components/stack.js +45 -0
- package/dist/src/dom/components/stack.js.map +10 -0
- package/dist/src/dom/components/switch.js +83 -0
- package/dist/src/dom/components/switch.js.map +10 -0
- package/dist/src/dom/components/text.js +37 -0
- package/dist/src/dom/components/text.js.map +10 -0
- package/dist/src/dom/components/textarea.js +51 -0
- package/dist/src/dom/components/textarea.js.map +10 -0
- package/dist/src/dom/components/video.js +51 -0
- package/dist/src/dom/components/video.js.map +10 -0
- package/dist/src/dom/debug.js +170 -0
- package/dist/src/dom/debug.js.map +10 -0
- package/dist/src/dom/events.js +112 -0
- package/dist/src/dom/events.js.map +10 -0
- package/dist/src/dom/index.js +73 -0
- package/dist/src/dom/index.js.map +9 -0
- package/dist/src/dom/renderer.js +277 -0
- package/dist/src/dom/renderer.js.map +10 -0
- package/dist/src/index.js +89 -0
- package/dist/src/index.js.map +9 -0
- package/package.json +84 -0
- package/src/canvas/QUICKSTART.md +421 -0
- package/src/canvas/README.md +376 -0
- package/src/canvas/accessibility.ts +218 -0
- package/src/canvas/events.ts +307 -0
- package/src/canvas/index.ts +35 -0
- package/src/canvas/input.ts +210 -0
- package/src/canvas/layout.ts +401 -0
- package/src/canvas/paint.ts +1321 -0
- package/src/canvas/renderer.ts +422 -0
- package/src/canvas/text.ts +182 -0
- package/src/canvas/types.ts +137 -0
- package/src/canvas/utils.ts +218 -0
- package/src/dom/README.md +265 -0
- package/src/dom/applicators/advanced-layout.ts +128 -0
- package/src/dom/applicators/background.ts +50 -0
- package/src/dom/applicators/border.ts +19 -0
- package/src/dom/applicators/color.ts +23 -0
- package/src/dom/applicators/display.ts +54 -0
- package/src/dom/applicators/effects.ts +97 -0
- package/src/dom/applicators/events.ts +689 -0
- package/src/dom/applicators/font.ts +27 -0
- package/src/dom/applicators/index.ts +354 -0
- package/src/dom/applicators/layout.ts +92 -0
- package/src/dom/applicators/margin.ts +18 -0
- package/src/dom/applicators/padding.ts +18 -0
- package/src/dom/applicators/size.ts +31 -0
- package/src/dom/applicators/transform.ts +93 -0
- package/src/dom/applicators/transition.ts +65 -0
- package/src/dom/applicators/typography.ts +91 -0
- package/src/dom/canvas/index.ts +60 -0
- package/src/dom/components/audio.ts +45 -0
- package/src/dom/components/avatar.ts +49 -0
- package/src/dom/components/badge.ts +45 -0
- package/src/dom/components/button.ts +13 -0
- package/src/dom/components/card.ts +19 -0
- package/src/dom/components/center.ts +16 -0
- package/src/dom/components/checkbox.ts +54 -0
- package/src/dom/components/column.ts +15 -0
- package/src/dom/components/container.ts +13 -0
- package/src/dom/components/divider.ts +37 -0
- package/src/dom/components/grid.ts +40 -0
- package/src/dom/components/heading.ts +41 -0
- package/src/dom/components/image.ts +27 -0
- package/src/dom/components/index.ts +115 -0
- package/src/dom/components/input.ts +29 -0
- package/src/dom/components/link.ts +35 -0
- package/src/dom/components/list.ts +30 -0
- package/src/dom/components/paragraph.ts +23 -0
- package/src/dom/components/progressbar.ts +51 -0
- package/src/dom/components/route.ts +37 -0
- package/src/dom/components/router.ts +22 -0
- package/src/dom/components/row.ts +15 -0
- package/src/dom/components/select.ts +56 -0
- package/src/dom/components/slider.ts +45 -0
- package/src/dom/components/spacer.ts +16 -0
- package/src/dom/components/spinner.ts +60 -0
- package/src/dom/components/stack.ts +34 -0
- package/src/dom/components/switch.ts +86 -0
- package/src/dom/components/text.ts +24 -0
- package/src/dom/components/textarea.ts +50 -0
- package/src/dom/components/video.ts +50 -0
- package/src/dom/debug.ts +247 -0
- package/src/dom/events.ts +168 -0
- package/src/dom/index.ts +11 -0
- package/src/dom/renderer.ts +327 -0
- package/src/index.ts +56 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import"../../chunk-2s02mkzs.js";
|
|
2
|
+
|
|
3
|
+
// src/dom/events.ts
|
|
4
|
+
class EventManager {
|
|
5
|
+
engine;
|
|
6
|
+
bindings = new Map;
|
|
7
|
+
constructor(engine) {
|
|
8
|
+
this.engine = engine;
|
|
9
|
+
}
|
|
10
|
+
attach(elementId, element, eventName, actionName) {
|
|
11
|
+
const domEventName = eventName === "onClick" ? "click" : eventName;
|
|
12
|
+
console.log(`[EventManager] Attaching ${eventName} (DOM: ${domEventName}) to element ${elementId}, action: ${actionName}`);
|
|
13
|
+
const listener = (event) => {
|
|
14
|
+
console.log(`\uD83D\uDD25 [EventManager] Event fired: ${eventName} on ${elementId}, dispatching action: ${actionName}`);
|
|
15
|
+
console.log(`\uD83D\uDD25 [EventManager] Event object:`, event);
|
|
16
|
+
console.log(`\uD83D\uDD25 [EventManager] Element:`, element);
|
|
17
|
+
if (eventName === "submit" || eventName === "click" && element.tagName === "A") {
|
|
18
|
+
event.preventDefault();
|
|
19
|
+
}
|
|
20
|
+
const payload = this.extractEventData(event, element);
|
|
21
|
+
console.log(`\uD83D\uDD25 [EventManager] Event payload:`, payload);
|
|
22
|
+
console.log(`\uD83D\uDD25 [EventManager] Calling engine.dispatchAction(${actionName})`);
|
|
23
|
+
try {
|
|
24
|
+
this.engine.dispatchAction(actionName, payload);
|
|
25
|
+
console.log(`\uD83D\uDD25 [EventManager] ✅ dispatchAction succeeded`);
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.error(`\uD83D\uDD25 [EventManager] ❌ dispatchAction failed:`, error);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
let elementBindings = this.bindings.get(elementId);
|
|
31
|
+
if (!elementBindings) {
|
|
32
|
+
elementBindings = new Map;
|
|
33
|
+
this.bindings.set(elementId, elementBindings);
|
|
34
|
+
}
|
|
35
|
+
elementBindings.set(eventName, listener);
|
|
36
|
+
element.addEventListener(domEventName, listener);
|
|
37
|
+
console.log(`[EventManager] Listener attached to DOM for ${domEventName}`);
|
|
38
|
+
console.log(`[EventManager] Element details:`, {
|
|
39
|
+
tagName: element.tagName,
|
|
40
|
+
id: element.id,
|
|
41
|
+
dataset: element.dataset,
|
|
42
|
+
textContent: element.textContent?.substring(0, 50)
|
|
43
|
+
});
|
|
44
|
+
if (domEventName === "click") {
|
|
45
|
+
element.addEventListener("click", (e) => {
|
|
46
|
+
console.log(`\uD83E\uDDEA [TEST] Raw DOM click detected on ${element.tagName}`, e);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
detach(elementId, element, eventName) {
|
|
51
|
+
const elementBindings = this.bindings.get(elementId);
|
|
52
|
+
if (!elementBindings)
|
|
53
|
+
return;
|
|
54
|
+
const listener = elementBindings.get(eventName);
|
|
55
|
+
if (listener) {
|
|
56
|
+
element.removeEventListener(eventName, listener);
|
|
57
|
+
elementBindings.delete(eventName);
|
|
58
|
+
}
|
|
59
|
+
if (elementBindings.size === 0) {
|
|
60
|
+
this.bindings.delete(elementId);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
extractEventData(event, element) {
|
|
64
|
+
const data = {
|
|
65
|
+
type: event.type,
|
|
66
|
+
timestamp: Date.now()
|
|
67
|
+
};
|
|
68
|
+
if (event instanceof MouseEvent) {
|
|
69
|
+
data.clientX = event.clientX;
|
|
70
|
+
data.clientY = event.clientY;
|
|
71
|
+
data.button = event.button;
|
|
72
|
+
}
|
|
73
|
+
if (event instanceof KeyboardEvent) {
|
|
74
|
+
data.key = event.key;
|
|
75
|
+
data.code = event.code;
|
|
76
|
+
data.ctrlKey = event.ctrlKey;
|
|
77
|
+
data.shiftKey = event.shiftKey;
|
|
78
|
+
data.altKey = event.altKey;
|
|
79
|
+
data.metaKey = event.metaKey;
|
|
80
|
+
}
|
|
81
|
+
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
|
82
|
+
data.value = element.value;
|
|
83
|
+
}
|
|
84
|
+
if (element instanceof HTMLSelectElement) {
|
|
85
|
+
data.value = element.value;
|
|
86
|
+
data.selectedIndex = element.selectedIndex;
|
|
87
|
+
}
|
|
88
|
+
if (event.type === "submit" && element instanceof HTMLFormElement) {
|
|
89
|
+
data.formData = new FormData(element);
|
|
90
|
+
}
|
|
91
|
+
return data;
|
|
92
|
+
}
|
|
93
|
+
clearElement(elementId, element) {
|
|
94
|
+
const elementBindings = this.bindings.get(elementId);
|
|
95
|
+
if (!elementBindings)
|
|
96
|
+
return;
|
|
97
|
+
for (const [eventName, listener] of elementBindings) {
|
|
98
|
+
element.removeEventListener(eventName, listener);
|
|
99
|
+
}
|
|
100
|
+
this.bindings.delete(elementId);
|
|
101
|
+
}
|
|
102
|
+
clearAll() {
|
|
103
|
+
this.bindings.clear();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export {
|
|
107
|
+
EventManager
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export { EventManager };
|
|
111
|
+
|
|
112
|
+
//# debugId=3F8DDE05C5522D9264756E2164756E21
|
|
@@ -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\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 console.log(`[EventManager] Attaching ${eventName} (DOM: ${domEventName}) to element ${elementId}, action: ${actionName}`);\n\n // Create event listener that dispatches action\n const listener = (event: Event) => {\n console.log(`🔥 [EventManager] Event fired: ${eventName} on ${elementId}, dispatching action: ${actionName}`);\n console.log(`🔥 [EventManager] Event object:`, event);\n console.log(`🔥 [EventManager] 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 console.log(`🔥 [EventManager] Event payload:`, payload);\n\n // Dispatch action to engine\n console.log(`🔥 [EventManager] Calling engine.dispatchAction(${actionName})`);\n try {\n this.engine.dispatchAction(actionName, payload);\n console.log(`🔥 [EventManager] ✅ dispatchAction succeeded`);\n } catch (error) {\n console.error(`🔥 [EventManager] ❌ 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 console.log(`[EventManager] Listener attached to DOM for ${domEventName}`);\n console.log(`[EventManager] 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 console.log(`🧪 [TEST] 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": "3F8DDE05C5522D9264756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EventManager
|
|
3
|
+
} from "./events.js";
|
|
4
|
+
import {
|
|
5
|
+
DOMRenderer
|
|
6
|
+
} from "./renderer.js";
|
|
7
|
+
import"./canvas/index.js";
|
|
8
|
+
import {
|
|
9
|
+
ComponentRegistry
|
|
10
|
+
} from "./components/index.js";
|
|
11
|
+
import"./components/list.js";
|
|
12
|
+
import"./components/textarea.js";
|
|
13
|
+
import"./components/grid.js";
|
|
14
|
+
import"./components/link.js";
|
|
15
|
+
import"./components/avatar.js";
|
|
16
|
+
import"./components/switch.js";
|
|
17
|
+
import"./components/badge.js";
|
|
18
|
+
import"./components/route.js";
|
|
19
|
+
import"./components/center.js";
|
|
20
|
+
import"./components/divider.js";
|
|
21
|
+
import"./components/spacer.js";
|
|
22
|
+
import"./components/input.js";
|
|
23
|
+
import"./components/stack.js";
|
|
24
|
+
import"./components/progressbar.js";
|
|
25
|
+
import"./components/button.js";
|
|
26
|
+
import"./components/heading.js";
|
|
27
|
+
import"./components/slider.js";
|
|
28
|
+
import"./components/card.js";
|
|
29
|
+
import"./components/container.js";
|
|
30
|
+
import"./components/video.js";
|
|
31
|
+
import"./components/spinner.js";
|
|
32
|
+
import"./components/row.js";
|
|
33
|
+
import"./components/select.js";
|
|
34
|
+
import"./components/router.js";
|
|
35
|
+
import"./components/audio.js";
|
|
36
|
+
import"./components/paragraph.js";
|
|
37
|
+
import"./components/text.js";
|
|
38
|
+
import {
|
|
39
|
+
ApplicatorRegistry
|
|
40
|
+
} from "./applicators/index.js";
|
|
41
|
+
import"./applicators/events.js";
|
|
42
|
+
import"./applicators/color.js";
|
|
43
|
+
import"./applicators/typography.js";
|
|
44
|
+
import"./applicators/effects.js";
|
|
45
|
+
import"./components/checkbox.js";
|
|
46
|
+
import"./components/column.js";
|
|
47
|
+
import"./components/image.js";
|
|
48
|
+
import"./applicators/margin.js";
|
|
49
|
+
import"./applicators/advanced-layout.js";
|
|
50
|
+
import"./applicators/display.js";
|
|
51
|
+
import"./applicators/size.js";
|
|
52
|
+
import"./applicators/font.js";
|
|
53
|
+
import"./applicators/background.js";
|
|
54
|
+
import"./applicators/transition.js";
|
|
55
|
+
import"./applicators/layout.js";
|
|
56
|
+
import {
|
|
57
|
+
RerenderTracker,
|
|
58
|
+
defaultDebugConfig
|
|
59
|
+
} from "./debug.js";
|
|
60
|
+
import"./applicators/padding.js";
|
|
61
|
+
import"./applicators/border.js";
|
|
62
|
+
import"./applicators/transform.js";
|
|
63
|
+
import"../../chunk-2s02mkzs.js";
|
|
64
|
+
export {
|
|
65
|
+
defaultDebugConfig,
|
|
66
|
+
RerenderTracker,
|
|
67
|
+
EventManager,
|
|
68
|
+
DOMRenderer,
|
|
69
|
+
ComponentRegistry,
|
|
70
|
+
ApplicatorRegistry
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
//# debugId=B37DC3169EBA00A264756E2164756E21
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import {
|
|
2
|
+
canvasApplicators,
|
|
3
|
+
canvasHandler
|
|
4
|
+
} from "./canvas/index.js";
|
|
5
|
+
import {
|
|
6
|
+
ComponentRegistry
|
|
7
|
+
} from "./components/index.js";
|
|
8
|
+
import"./components/list.js";
|
|
9
|
+
import"./components/textarea.js";
|
|
10
|
+
import"./components/grid.js";
|
|
11
|
+
import"./components/link.js";
|
|
12
|
+
import"./components/avatar.js";
|
|
13
|
+
import"./components/switch.js";
|
|
14
|
+
import"./components/badge.js";
|
|
15
|
+
import"./components/route.js";
|
|
16
|
+
import"./components/center.js";
|
|
17
|
+
import"./components/divider.js";
|
|
18
|
+
import"./components/spacer.js";
|
|
19
|
+
import"./components/input.js";
|
|
20
|
+
import"./components/stack.js";
|
|
21
|
+
import"./components/progressbar.js";
|
|
22
|
+
import"./components/button.js";
|
|
23
|
+
import"./components/heading.js";
|
|
24
|
+
import"./components/slider.js";
|
|
25
|
+
import"./components/card.js";
|
|
26
|
+
import"./components/container.js";
|
|
27
|
+
import"./components/video.js";
|
|
28
|
+
import"./components/spinner.js";
|
|
29
|
+
import"./components/row.js";
|
|
30
|
+
import"./components/select.js";
|
|
31
|
+
import"./components/router.js";
|
|
32
|
+
import"./components/audio.js";
|
|
33
|
+
import"./components/paragraph.js";
|
|
34
|
+
import"./components/text.js";
|
|
35
|
+
import {
|
|
36
|
+
ApplicatorRegistry
|
|
37
|
+
} from "./applicators/index.js";
|
|
38
|
+
import"./applicators/events.js";
|
|
39
|
+
import"./applicators/color.js";
|
|
40
|
+
import"./applicators/typography.js";
|
|
41
|
+
import"./applicators/effects.js";
|
|
42
|
+
import"./components/checkbox.js";
|
|
43
|
+
import"./components/column.js";
|
|
44
|
+
import"./components/image.js";
|
|
45
|
+
import"./applicators/margin.js";
|
|
46
|
+
import"./applicators/advanced-layout.js";
|
|
47
|
+
import"./applicators/display.js";
|
|
48
|
+
import"./applicators/size.js";
|
|
49
|
+
import"./applicators/font.js";
|
|
50
|
+
import"./applicators/background.js";
|
|
51
|
+
import"./applicators/transition.js";
|
|
52
|
+
import"./applicators/layout.js";
|
|
53
|
+
import {
|
|
54
|
+
RerenderTracker,
|
|
55
|
+
defaultDebugConfig
|
|
56
|
+
} from "./debug.js";
|
|
57
|
+
import"./applicators/padding.js";
|
|
58
|
+
import"./applicators/border.js";
|
|
59
|
+
import"./applicators/transform.js";
|
|
60
|
+
import"../../chunk-2s02mkzs.js";
|
|
61
|
+
|
|
62
|
+
// src/dom/renderer.ts
|
|
63
|
+
class DOMRenderer {
|
|
64
|
+
container;
|
|
65
|
+
nodes = new Map;
|
|
66
|
+
rootId = null;
|
|
67
|
+
components;
|
|
68
|
+
applicators;
|
|
69
|
+
engine;
|
|
70
|
+
currentState = {};
|
|
71
|
+
routerContext = null;
|
|
72
|
+
globalContext = null;
|
|
73
|
+
componentInstances = new Map;
|
|
74
|
+
debugTracker;
|
|
75
|
+
constructor(container, engine, debugConfig) {
|
|
76
|
+
this.container = container;
|
|
77
|
+
this.engine = engine;
|
|
78
|
+
this.components = new ComponentRegistry;
|
|
79
|
+
this.applicators = new ApplicatorRegistry;
|
|
80
|
+
this.debugTracker = new RerenderTracker({ ...defaultDebugConfig, ...debugConfig });
|
|
81
|
+
this.components.register("canvas", canvasHandler);
|
|
82
|
+
for (const [name, handler] of Object.entries(canvasApplicators)) {
|
|
83
|
+
this.applicators.register(name, handler);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
setContext(routerContext, globalContext) {
|
|
87
|
+
this.routerContext = routerContext;
|
|
88
|
+
this.globalContext = globalContext;
|
|
89
|
+
}
|
|
90
|
+
applyPatches(patches) {
|
|
91
|
+
for (const patch of patches) {
|
|
92
|
+
this.applyPatch(patch);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
updateState(state) {
|
|
96
|
+
console.log(`[Renderer] Updating state:`, state);
|
|
97
|
+
this.currentState = state;
|
|
98
|
+
this.interpolateAllText();
|
|
99
|
+
}
|
|
100
|
+
mergeComponentState(componentState) {
|
|
101
|
+
this.currentState = { ...this.currentState, ...componentState };
|
|
102
|
+
console.log(`[Renderer] Merged state:`, this.currentState);
|
|
103
|
+
this.interpolateAllText();
|
|
104
|
+
}
|
|
105
|
+
interpolateAllText() {
|
|
106
|
+
for (const [id, element] of this.nodes.entries()) {
|
|
107
|
+
if (element.dataset.hypenType === "text" && element.dataset.textTemplate) {
|
|
108
|
+
const template = element.dataset.textTemplate;
|
|
109
|
+
const interpolated = this.interpolateText(template, this.currentState);
|
|
110
|
+
const currentText = element.textContent;
|
|
111
|
+
if (currentText !== interpolated) {
|
|
112
|
+
this.debugTracker.trackRerender(id, element, "interpolate");
|
|
113
|
+
}
|
|
114
|
+
element.textContent = interpolated;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
interpolateText(template, state) {
|
|
119
|
+
return template.replace(/\$\{([^}]+)\}/g, (match, path) => {
|
|
120
|
+
try {
|
|
121
|
+
const value = path.split(".").reduce((obj, key) => {
|
|
122
|
+
if (key === "state")
|
|
123
|
+
return state;
|
|
124
|
+
return obj?.[key];
|
|
125
|
+
}, state);
|
|
126
|
+
return value !== undefined ? String(value) : match;
|
|
127
|
+
} catch {
|
|
128
|
+
return match;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
applyPatch(patch) {
|
|
133
|
+
switch (patch.type) {
|
|
134
|
+
case "create":
|
|
135
|
+
this.onCreate(patch.id, patch.element_type, patch.props || {});
|
|
136
|
+
break;
|
|
137
|
+
case "setProp":
|
|
138
|
+
this.onSetProp(patch.id, patch.name, patch.value);
|
|
139
|
+
break;
|
|
140
|
+
case "setText":
|
|
141
|
+
this.onSetText(patch.id, patch.text);
|
|
142
|
+
break;
|
|
143
|
+
case "insert":
|
|
144
|
+
this.onInsert(patch.parent_id, patch.id, patch.before_id);
|
|
145
|
+
break;
|
|
146
|
+
case "move":
|
|
147
|
+
this.onMove(patch.parent_id, patch.id, patch.before_id);
|
|
148
|
+
break;
|
|
149
|
+
case "remove":
|
|
150
|
+
this.onRemove(patch.id);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
onCreate(id, elementType, props) {
|
|
155
|
+
const propsObj = props instanceof Map ? Object.fromEntries(props) : props;
|
|
156
|
+
const element = this.components.createElement(elementType, propsObj);
|
|
157
|
+
if (!element) {
|
|
158
|
+
const fallback = document.createElement("div");
|
|
159
|
+
fallback.dataset.hypenType = elementType;
|
|
160
|
+
fallback.textContent = `Unknown component: ${elementType}`;
|
|
161
|
+
this.nodes.set(id, fallback);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
element.dataset.hypenType = elementType.toLowerCase();
|
|
165
|
+
element.dataset.hypenId = id;
|
|
166
|
+
element.__hypenEngine = this.engine;
|
|
167
|
+
this.applicators.applyAll(element, propsObj);
|
|
168
|
+
this.nodes.set(id, element);
|
|
169
|
+
this.debugTracker.trackRerender(id, element, `create:${elementType}`);
|
|
170
|
+
if (!this.rootId) {
|
|
171
|
+
this.rootId = id;
|
|
172
|
+
if (!this.container.contains(element)) {
|
|
173
|
+
this.container.appendChild(element);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
onSetProp(id, name, value) {
|
|
178
|
+
const element = this.nodes.get(id);
|
|
179
|
+
if (!element)
|
|
180
|
+
return;
|
|
181
|
+
this.debugTracker.trackRerender(id, element, `setProp:${name}`);
|
|
182
|
+
if (name === "0" || name === "text") {
|
|
183
|
+
const elementType = element.dataset.hypenType;
|
|
184
|
+
if (elementType === "input") {
|
|
185
|
+
const inputEl = element;
|
|
186
|
+
inputEl.value = String(value);
|
|
187
|
+
console.log(`[Renderer] Updated input value: "${value}"`);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
element.textContent = String(value);
|
|
191
|
+
if (element.dataset.textTemplate !== undefined) {
|
|
192
|
+
element.dataset.textTemplate = String(value);
|
|
193
|
+
}
|
|
194
|
+
console.log(`[Renderer] Updated text content: "${value}"`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
this.applicators.apply(element, name, value);
|
|
198
|
+
}
|
|
199
|
+
onSetText(id, text) {
|
|
200
|
+
const element = this.nodes.get(id);
|
|
201
|
+
if (!element)
|
|
202
|
+
return;
|
|
203
|
+
this.debugTracker.trackRerender(id, element, "setText");
|
|
204
|
+
element.textContent = text;
|
|
205
|
+
}
|
|
206
|
+
onInsert(parentId, id, beforeId) {
|
|
207
|
+
const parent = parentId === "root" ? this.container : this.nodes.get(parentId);
|
|
208
|
+
const child = this.nodes.get(id);
|
|
209
|
+
console.log(`[Renderer] Inserting ${id} into ${parentId}`, {
|
|
210
|
+
parent: parent ? `${parent.tagName}#${parent.id || "no-id"}` : "null",
|
|
211
|
+
child: child ? `${child.tagName}#${child.id || "no-id"}` : "null",
|
|
212
|
+
childText: child?.textContent?.substring(0, 20)
|
|
213
|
+
});
|
|
214
|
+
if (!parent || !child)
|
|
215
|
+
return;
|
|
216
|
+
if (parentId === "root") {
|
|
217
|
+
this.rootId = id;
|
|
218
|
+
}
|
|
219
|
+
if (beforeId) {
|
|
220
|
+
const before = this.nodes.get(beforeId);
|
|
221
|
+
if (before && before.parentNode === parent) {
|
|
222
|
+
parent.insertBefore(child, before);
|
|
223
|
+
} else if (!parent.contains(child)) {
|
|
224
|
+
parent.appendChild(child);
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
if (!parent.contains(child)) {
|
|
228
|
+
parent.appendChild(child);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
onMove(parentId, id, beforeId) {
|
|
233
|
+
this.onInsert(parentId, id, beforeId);
|
|
234
|
+
}
|
|
235
|
+
onRemove(id) {
|
|
236
|
+
const element = this.nodes.get(id);
|
|
237
|
+
if (!element)
|
|
238
|
+
return;
|
|
239
|
+
if (element.parentNode) {
|
|
240
|
+
element.parentNode.removeChild(element);
|
|
241
|
+
}
|
|
242
|
+
this.nodes.delete(id);
|
|
243
|
+
if (this.rootId === id) {
|
|
244
|
+
this.rootId = null;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
getNode(id) {
|
|
248
|
+
return this.nodes.get(id);
|
|
249
|
+
}
|
|
250
|
+
clear() {
|
|
251
|
+
this.container.innerHTML = "";
|
|
252
|
+
this.nodes.clear();
|
|
253
|
+
this.rootId = null;
|
|
254
|
+
}
|
|
255
|
+
getComponentRegistry() {
|
|
256
|
+
return this.components;
|
|
257
|
+
}
|
|
258
|
+
getApplicatorRegistry() {
|
|
259
|
+
return this.applicators;
|
|
260
|
+
}
|
|
261
|
+
setDebugConfig(config) {
|
|
262
|
+
this.debugTracker.setConfig(config);
|
|
263
|
+
}
|
|
264
|
+
resetDebugTracking() {
|
|
265
|
+
this.debugTracker.resetAll();
|
|
266
|
+
}
|
|
267
|
+
getDebugStats() {
|
|
268
|
+
return this.debugTracker.getStats();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
export {
|
|
272
|
+
DOMRenderer
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
export { DOMRenderer };
|
|
276
|
+
|
|
277
|
+
//# debugId=0B5D2325D2CA974964756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/renderer.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * DOM Renderer\n *\n * Renders Hypen patches to the DOM\n */\n\nimport type { Patch } from \"@hypen/core\";\nimport type { HypenModuleInstance, RouterContext } from \"@hypen/core\";\nimport type { HypenRouter } from \"@hypen/core\";\nimport type { HypenGlobalContext } from \"@hypen/core\";\nimport { ComponentRegistry } from \"./components/index.js\";\nimport { ApplicatorRegistry } from \"./applicators/index.js\";\nimport { canvasHandler, canvasApplicators } from \"./canvas/index.js\";\nimport { RerenderTracker, type DebugConfig, defaultDebugConfig } from \"./debug.js\";\n\n// Interface for the engine that renderer needs\ninterface IEngine {\n dispatchAction(name: string, payload?: any): void;\n}\n\nexport class DOMRenderer {\n private container: HTMLElement;\n private nodes: Map<string, HTMLElement> = new Map();\n private rootId: string | null = null;\n private components: ComponentRegistry;\n private applicators: ApplicatorRegistry;\n private engine: IEngine;\n private currentState: Record<string, any> = {};\n private routerContext: RouterContext | null = null;\n private globalContext: HypenGlobalContext | null = null;\n private componentInstances = new Map<string, HypenModuleInstance>();\n private debugTracker: RerenderTracker;\n\n constructor(container: HTMLElement, engine: IEngine, debugConfig?: Partial<DebugConfig>) {\n this.container = container;\n this.engine = engine;\n this.components = new ComponentRegistry();\n this.applicators = new ApplicatorRegistry();\n this.debugTracker = new RerenderTracker({ ...defaultDebugConfig, ...debugConfig });\n\n // Register canvas component and applicators\n this.components.register(\"canvas\", canvasHandler);\n for (const [name, handler] of Object.entries(canvasApplicators)) {\n this.applicators.register(name, handler);\n }\n }\n\n /**\n * Set router and global context for component composition\n */\n setContext(routerContext: RouterContext, globalContext: HypenGlobalContext): void {\n this.routerContext = routerContext;\n this.globalContext = globalContext;\n }\n\n /**\n * Apply a batch of patches to the DOM\n */\n applyPatches(patches: Patch[]): void {\n for (const patch of patches) {\n this.applyPatch(patch);\n }\n }\n\n /**\n * Update state and interpolate text content\n */\n updateState(state: Record<string, any>): void {\n console.log(`[Renderer] Updating state:`, state);\n this.currentState = state;\n this.interpolateAllText();\n }\n\n /**\n * Merge component state into current state and re-interpolate\n */\n private mergeComponentState(componentState: Record<string, any>): void {\n this.currentState = { ...this.currentState, ...componentState };\n console.log(`[Renderer] Merged state:`, this.currentState);\n this.interpolateAllText();\n }\n\n /**\n * Interpolate state values in all text elements\n */\n private interpolateAllText(): void {\n for (const [id, element] of this.nodes.entries()) {\n if (element.dataset.hypenType === \"text\" && element.dataset.textTemplate) {\n const template = element.dataset.textTemplate;\n const interpolated = this.interpolateText(template, this.currentState);\n\n // Track re-render if text actually changed\n const currentText = element.textContent;\n if (currentText !== interpolated) {\n this.debugTracker.trackRerender(id, element, \"interpolate\");\n }\n\n element.textContent = interpolated;\n }\n }\n }\n\n /**\n * Interpolate state values in text template\n */\n private interpolateText(template: string, state: Record<string, any>): string {\n return template.replace(/\\$\\{([^}]+)\\}/g, (match, path) => {\n try {\n const value = path.split('.').reduce((obj: any, key: string) => {\n if (key === 'state') return state;\n return obj?.[key];\n }, state);\n return value !== undefined ? String(value) : match;\n } catch {\n return match;\n }\n });\n }\n\n /**\n * Apply a single patch\n */\n private applyPatch(patch: Patch): void {\n switch (patch.type) {\n case \"create\":\n this.onCreate(patch.id!, (patch as any).element_type!, patch.props || {});\n break;\n case \"setProp\":\n this.onSetProp(patch.id!, patch.name!, patch.value);\n break;\n case \"setText\":\n this.onSetText(patch.id!, patch.text!);\n break;\n case \"insert\":\n this.onInsert((patch as any).parent_id!, patch.id!, (patch as any).before_id);\n break;\n case \"move\":\n this.onMove((patch as any).parent_id!, patch.id!, (patch as any).before_id);\n break;\n case \"remove\":\n this.onRemove(patch.id!);\n break;\n }\n }\n\n /**\n * Create a new element\n */\n private onCreate(id: string, elementType: string, props: Record<string, any> | Map<string, any>): void {\n const propsObj = props instanceof Map ? Object.fromEntries(props) : props;\n\n const element = this.components.createElement(elementType, propsObj);\n\n if (!element) {\n const fallback = document.createElement(\"div\");\n fallback.dataset.hypenType = elementType;\n fallback.textContent = `Unknown component: ${elementType}`;\n this.nodes.set(id, fallback);\n return;\n }\n\n element.dataset.hypenType = elementType.toLowerCase();\n element.dataset.hypenId = id;\n (element as any).__hypenEngine = this.engine;\n\n this.applicators.applyAll(element, propsObj);\n this.nodes.set(id, element);\n this.debugTracker.trackRerender(id, element, `create:${elementType}`);\n\n if (!this.rootId) {\n this.rootId = id;\n if (!this.container.contains(element)) {\n this.container.appendChild(element);\n }\n }\n }\n\n /**\n * Set a property on an element\n */\n private onSetProp(id: string, name: string, value: any): void {\n const element = this.nodes.get(id);\n if (!element) return;\n\n this.debugTracker.trackRerender(id, element, `setProp:${name}`);\n\n if (name === \"0\" || name === \"text\") {\n const elementType = element.dataset.hypenType;\n\n if (elementType === \"input\") {\n const inputEl = element as HTMLInputElement;\n inputEl.value = String(value);\n console.log(`[Renderer] Updated input value: \"${value}\"`);\n return;\n }\n\n element.textContent = String(value);\n if (element.dataset.textTemplate !== undefined) {\n element.dataset.textTemplate = String(value);\n }\n console.log(`[Renderer] Updated text content: \"${value}\"`);\n return;\n }\n\n this.applicators.apply(element, name, value);\n }\n\n /**\n * Set text content\n */\n private onSetText(id: string, text: string): void {\n const element = this.nodes.get(id);\n if (!element) return;\n\n this.debugTracker.trackRerender(id, element, \"setText\");\n element.textContent = text;\n }\n\n /**\n * Insert an element into the tree\n */\n private onInsert(parentId: string, id: string, beforeId?: string): void {\n const parent = parentId === \"root\" ? this.container : this.nodes.get(parentId);\n const child = this.nodes.get(id);\n\n console.log(`[Renderer] Inserting ${id} into ${parentId}`, {\n parent: parent ? `${parent.tagName}#${parent.id || 'no-id'}` : 'null',\n child: child ? `${child.tagName}#${child.id || 'no-id'}` : 'null',\n childText: child?.textContent?.substring(0, 20)\n });\n\n if (!parent || !child) return;\n\n if (parentId === \"root\") {\n this.rootId = id;\n }\n\n if (beforeId) {\n const before = this.nodes.get(beforeId);\n if (before && before.parentNode === parent) {\n parent.insertBefore(child, before);\n } else if (!parent.contains(child)) {\n parent.appendChild(child);\n }\n } else {\n if (!parent.contains(child)) {\n parent.appendChild(child);\n }\n }\n }\n\n /**\n * Move an element within the tree\n */\n private onMove(parentId: string, id: string, beforeId?: string): void {\n this.onInsert(parentId, id, beforeId);\n }\n\n /**\n * Remove an element from the tree\n */\n private onRemove(id: string): void {\n const element = this.nodes.get(id);\n if (!element) return;\n\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n\n this.nodes.delete(id);\n\n if (this.rootId === id) {\n this.rootId = null;\n }\n }\n\n /**\n * Get an element by ID\n */\n getNode(id: string): HTMLElement | undefined {\n return this.nodes.get(id);\n }\n\n /**\n * Clear all nodes\n */\n clear(): void {\n this.container.innerHTML = \"\";\n this.nodes.clear();\n this.rootId = null;\n }\n\n /**\n * Get the component registry (for registering custom components)\n */\n getComponentRegistry(): ComponentRegistry {\n return this.components;\n }\n\n /**\n * Get the applicator registry (for registering custom applicators)\n */\n getApplicatorRegistry(): ApplicatorRegistry {\n return this.applicators;\n }\n\n /**\n * Enable or configure debug mode\n */\n setDebugConfig(config: Partial<DebugConfig>): void {\n this.debugTracker.setConfig(config);\n }\n\n /**\n * Reset debug tracking for all elements\n */\n resetDebugTracking(): void {\n this.debugTracker.resetAll();\n }\n\n /**\n * Get debug statistics\n */\n getDebugStats(): { totalRerenders: number; elementCount: number; avgRerenders: number } {\n return this.debugTracker.getStats();\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "0B5D2325D2CA974964756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CanvasRenderer
|
|
3
|
+
} from "./canvas/renderer.js";
|
|
4
|
+
import"./canvas/paint.js";
|
|
5
|
+
import"./canvas/layout.js";
|
|
6
|
+
import"./canvas/events.js";
|
|
7
|
+
import"./canvas/accessibility.js";
|
|
8
|
+
import"./canvas/text.js";
|
|
9
|
+
import"./canvas/input.js";
|
|
10
|
+
import"./canvas/utils.js";
|
|
11
|
+
import {
|
|
12
|
+
EventManager
|
|
13
|
+
} from "./dom/events.js";
|
|
14
|
+
import {
|
|
15
|
+
DOMRenderer
|
|
16
|
+
} from "./dom/renderer.js";
|
|
17
|
+
import {
|
|
18
|
+
canvasApplicators,
|
|
19
|
+
canvasHandler
|
|
20
|
+
} from "./dom/canvas/index.js";
|
|
21
|
+
import {
|
|
22
|
+
ComponentRegistry
|
|
23
|
+
} from "./dom/components/index.js";
|
|
24
|
+
import"./dom/components/list.js";
|
|
25
|
+
import"./dom/components/textarea.js";
|
|
26
|
+
import"./dom/components/grid.js";
|
|
27
|
+
import"./dom/components/link.js";
|
|
28
|
+
import"./dom/components/avatar.js";
|
|
29
|
+
import"./dom/components/switch.js";
|
|
30
|
+
import"./dom/components/badge.js";
|
|
31
|
+
import"./dom/components/route.js";
|
|
32
|
+
import"./dom/components/center.js";
|
|
33
|
+
import"./dom/components/divider.js";
|
|
34
|
+
import"./dom/components/spacer.js";
|
|
35
|
+
import"./dom/components/input.js";
|
|
36
|
+
import"./dom/components/stack.js";
|
|
37
|
+
import"./dom/components/progressbar.js";
|
|
38
|
+
import"./dom/components/button.js";
|
|
39
|
+
import"./dom/components/heading.js";
|
|
40
|
+
import"./dom/components/slider.js";
|
|
41
|
+
import"./dom/components/card.js";
|
|
42
|
+
import"./dom/components/container.js";
|
|
43
|
+
import"./dom/components/video.js";
|
|
44
|
+
import"./dom/components/spinner.js";
|
|
45
|
+
import"./dom/components/row.js";
|
|
46
|
+
import"./dom/components/select.js";
|
|
47
|
+
import"./dom/components/router.js";
|
|
48
|
+
import"./dom/components/audio.js";
|
|
49
|
+
import"./dom/components/paragraph.js";
|
|
50
|
+
import"./dom/components/text.js";
|
|
51
|
+
import {
|
|
52
|
+
ApplicatorRegistry
|
|
53
|
+
} from "./dom/applicators/index.js";
|
|
54
|
+
import"./dom/applicators/events.js";
|
|
55
|
+
import"./dom/applicators/color.js";
|
|
56
|
+
import"./dom/applicators/typography.js";
|
|
57
|
+
import"./dom/applicators/effects.js";
|
|
58
|
+
import"./dom/components/checkbox.js";
|
|
59
|
+
import"./dom/components/column.js";
|
|
60
|
+
import"./dom/components/image.js";
|
|
61
|
+
import"./dom/applicators/margin.js";
|
|
62
|
+
import"./dom/applicators/advanced-layout.js";
|
|
63
|
+
import"./dom/applicators/display.js";
|
|
64
|
+
import"./dom/applicators/size.js";
|
|
65
|
+
import"./dom/applicators/font.js";
|
|
66
|
+
import"./dom/applicators/background.js";
|
|
67
|
+
import"./dom/applicators/transition.js";
|
|
68
|
+
import"./dom/applicators/layout.js";
|
|
69
|
+
import {
|
|
70
|
+
RerenderTracker,
|
|
71
|
+
defaultDebugConfig
|
|
72
|
+
} from "./dom/debug.js";
|
|
73
|
+
import"./dom/applicators/padding.js";
|
|
74
|
+
import"./dom/applicators/border.js";
|
|
75
|
+
import"./dom/applicators/transform.js";
|
|
76
|
+
import"../chunk-2s02mkzs.js";
|
|
77
|
+
export {
|
|
78
|
+
defaultDebugConfig,
|
|
79
|
+
canvasHandler,
|
|
80
|
+
canvasApplicators,
|
|
81
|
+
RerenderTracker,
|
|
82
|
+
EventManager,
|
|
83
|
+
DOMRenderer,
|
|
84
|
+
ComponentRegistry,
|
|
85
|
+
CanvasRenderer,
|
|
86
|
+
ApplicatorRegistry
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
//# debugId=5264B236E9198B9564756E2164756E21
|