@hypen-space/web 0.4.31 → 0.4.35
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.js +19 -9
- package/dist/canvas/accessibility.js.map +2 -2
- package/dist/canvas/events.d.ts +7 -0
- package/dist/canvas/events.js +53 -17
- package/dist/canvas/events.js.map +3 -3
- package/dist/canvas/index.js +19 -2134
- package/dist/canvas/index.js.map +3 -11
- package/dist/canvas/input.js +19 -9
- package/dist/canvas/input.js.map +2 -2
- package/dist/canvas/layout.js +19 -9
- package/dist/canvas/layout.js.map +2 -2
- package/dist/canvas/paint.d.ts +4 -0
- package/dist/canvas/paint.js +100 -11
- package/dist/canvas/paint.js.map +3 -3
- package/dist/canvas/renderer.js +821 -707
- package/dist/canvas/renderer.js.map +7 -7
- package/dist/canvas/text.js +19 -9
- package/dist/canvas/text.js.map +2 -2
- package/dist/canvas/utils.js +19 -9
- package/dist/canvas/utils.js.map +2 -2
- package/dist/client.js +19 -3863
- package/dist/client.js.map +3 -57
- package/dist/dom/applicators/advanced-layout.js +19 -9
- package/dist/dom/applicators/advanced-layout.js.map +2 -2
- package/dist/dom/applicators/background.js +19 -9
- package/dist/dom/applicators/background.js.map +2 -2
- package/dist/dom/applicators/border.js +19 -9
- package/dist/dom/applicators/border.js.map +2 -2
- package/dist/dom/applicators/color.js +19 -9
- package/dist/dom/applicators/color.js.map +2 -2
- package/dist/dom/applicators/display.js +19 -9
- package/dist/dom/applicators/display.js.map +2 -2
- package/dist/dom/applicators/effects.js +19 -9
- package/dist/dom/applicators/effects.js.map +2 -2
- package/dist/dom/applicators/events.js +26 -10
- package/dist/dom/applicators/events.js.map +3 -3
- package/dist/dom/applicators/font.js +19 -9
- package/dist/dom/applicators/font.js.map +2 -2
- package/dist/dom/applicators/index.js +26 -10
- package/dist/dom/applicators/index.js.map +3 -3
- package/dist/dom/applicators/layout.js +19 -9
- package/dist/dom/applicators/layout.js.map +2 -2
- package/dist/dom/applicators/margin.js +19 -9
- package/dist/dom/applicators/margin.js.map +2 -2
- package/dist/dom/applicators/padding.js +19 -9
- package/dist/dom/applicators/padding.js.map +2 -2
- package/dist/dom/applicators/size.js +19 -9
- package/dist/dom/applicators/size.js.map +2 -2
- package/dist/dom/applicators/transform.js +19 -9
- package/dist/dom/applicators/transform.js.map +2 -2
- package/dist/dom/applicators/transition.js +19 -9
- package/dist/dom/applicators/transition.js.map +2 -2
- package/dist/dom/applicators/typography.js +19 -9
- package/dist/dom/applicators/typography.js.map +2 -2
- package/dist/dom/canvas/index.js +19 -9
- package/dist/dom/canvas/index.js.map +2 -2
- package/dist/dom/components/app.js +19 -9
- package/dist/dom/components/app.js.map +2 -2
- package/dist/dom/components/audio.js +19 -9
- package/dist/dom/components/audio.js.map +2 -2
- package/dist/dom/components/avatar.js +19 -9
- package/dist/dom/components/avatar.js.map +2 -2
- package/dist/dom/components/badge.js +19 -9
- package/dist/dom/components/badge.js.map +2 -2
- package/dist/dom/components/button.js +19 -9
- package/dist/dom/components/button.js.map +2 -2
- package/dist/dom/components/card.js +19 -9
- package/dist/dom/components/card.js.map +2 -2
- package/dist/dom/components/center.js +19 -9
- package/dist/dom/components/center.js.map +2 -2
- package/dist/dom/components/checkbox.js +19 -9
- package/dist/dom/components/checkbox.js.map +2 -2
- package/dist/dom/components/column.js +19 -9
- package/dist/dom/components/column.js.map +2 -2
- package/dist/dom/components/container.js +19 -9
- package/dist/dom/components/container.js.map +2 -2
- package/dist/dom/components/divider.js +19 -9
- package/dist/dom/components/divider.js.map +2 -2
- package/dist/dom/components/grid.js +19 -9
- package/dist/dom/components/grid.js.map +2 -2
- package/dist/dom/components/heading.js +19 -9
- package/dist/dom/components/heading.js.map +2 -2
- package/dist/dom/components/hypenapp.js +19 -9
- package/dist/dom/components/hypenapp.js.map +2 -2
- package/dist/dom/components/image.js +19 -9
- package/dist/dom/components/image.js.map +2 -2
- package/dist/dom/components/index.js +20 -10
- package/dist/dom/components/index.js.map +3 -3
- package/dist/dom/components/input.js +19 -9
- package/dist/dom/components/input.js.map +2 -2
- package/dist/dom/components/link.js +19 -9
- package/dist/dom/components/link.js.map +2 -2
- package/dist/dom/components/list.js +19 -9
- package/dist/dom/components/list.js.map +2 -2
- package/dist/dom/components/paragraph.js +19 -9
- package/dist/dom/components/paragraph.js.map +2 -2
- package/dist/dom/components/progressbar.js +19 -9
- package/dist/dom/components/progressbar.js.map +2 -2
- package/dist/dom/components/route.js +19 -9
- package/dist/dom/components/route.js.map +2 -2
- package/dist/dom/components/router.js +19 -9
- package/dist/dom/components/router.js.map +2 -2
- package/dist/dom/components/row.js +19 -9
- package/dist/dom/components/row.js.map +2 -2
- package/dist/dom/components/select.js +19 -9
- package/dist/dom/components/select.js.map +2 -2
- package/dist/dom/components/slider.js +19 -9
- package/dist/dom/components/slider.js.map +2 -2
- package/dist/dom/components/spacer.js +19 -9
- package/dist/dom/components/spacer.js.map +2 -2
- package/dist/dom/components/spinner.js +19 -9
- package/dist/dom/components/spinner.js.map +2 -2
- package/dist/dom/components/stack.js +19 -9
- package/dist/dom/components/stack.js.map +2 -2
- package/dist/dom/components/switch.js +19 -9
- package/dist/dom/components/switch.js.map +2 -2
- package/dist/dom/components/text.js +19 -9
- package/dist/dom/components/text.js.map +2 -2
- package/dist/dom/components/textarea.js +20 -10
- package/dist/dom/components/textarea.js.map +3 -3
- package/dist/dom/components/video.js +19 -9
- package/dist/dom/components/video.js.map +2 -2
- package/dist/dom/debug.js +19 -9
- package/dist/dom/debug.js.map +2 -2
- package/dist/dom/element-data.js +19 -9
- package/dist/dom/element-data.js.map +2 -2
- package/dist/dom/events.js +28 -18
- package/dist/dom/events.js.map +3 -3
- package/dist/dom/index.js +19 -3682
- package/dist/dom/index.js.map +3 -57
- package/dist/dom/renderer.js +31 -11
- package/dist/dom/renderer.js.map +5 -5
- package/dist/hypen.js +31 -11
- package/dist/hypen.js.map +5 -5
- package/dist/index.js +19 -5810
- package/dist/index.js.map +3 -66
- package/package.json +2 -2
- package/src/canvas/events.ts +35 -8
- package/src/canvas/paint.ts +104 -4
- package/src/dom/applicators/events.ts +11 -2
- package/src/dom/components/textarea.ts +3 -3
- package/src/dom/events.ts +14 -12
- package/src/dom/renderer.ts +8 -1
package/dist/dom/element-data.js
CHANGED
|
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
6
8
|
var __toCommonJS = (from) => {
|
|
7
|
-
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
8
10
|
if (entry)
|
|
9
11
|
return entry;
|
|
10
12
|
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
16
21
|
__moduleCache.set(from, entry);
|
|
17
22
|
return entry;
|
|
18
23
|
};
|
|
24
|
+
var __moduleCache;
|
|
25
|
+
var __returnValue = (v) => v;
|
|
26
|
+
function __exportSetter(name, newValue) {
|
|
27
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
+
}
|
|
19
29
|
var __export = (target, all) => {
|
|
20
30
|
for (var name in all)
|
|
21
31
|
__defProp(target, name, {
|
|
22
32
|
get: all[name],
|
|
23
33
|
enumerable: true,
|
|
24
34
|
configurable: true,
|
|
25
|
-
set: (
|
|
35
|
+
set: __exportSetter.bind(all, name)
|
|
26
36
|
});
|
|
27
37
|
};
|
|
28
38
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
@@ -132,4 +142,4 @@ export {
|
|
|
132
142
|
clearHypenData
|
|
133
143
|
};
|
|
134
144
|
|
|
135
|
-
//# debugId=
|
|
145
|
+
//# debugId=C4AD9BA640CB84F264756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/**\n * Type-Safe Element Data\n *\n * Provides strongly-typed access to Hypen-specific data attached to DOM elements.\n * Eliminates `as any` casts throughout the codebase.\n */\n\nimport { type DisposableStack, getElementDisposables } from \"@hypen-space/core/disposable\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Engine interface for dispatching actions\n */\nexport interface IEngine {\n dispatchAction(name: string, payload?: unknown): void;\n}\n\n/**\n * All Hypen-specific data attached to an element\n */\nexport interface HypenElementData {\n /** Engine reference for action dispatch */\n engine?: IEngine;\n /** Target key for keyboard events (e.g., \"Enter\", \"Escape\") */\n keyTarget?: string;\n /** Set of registered event type:action pairs */\n registeredEvents?: Set<string>;\n /** Custom element metadata */\n meta?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Private Storage\n// ============================================================================\n\n/**\n * WeakMap to store Hypen data without polluting the element\n */\nconst elementDataMap = new WeakMap<HTMLElement, HypenElementData>();\n\n// ============================================================================\n// Core API\n// ============================================================================\n\n/**\n * Get Hypen data for an element, creating if needed\n */\nexport function getHypenData(element: HTMLElement): HypenElementData {\n let data = elementDataMap.get(element);\n if (!data) {\n data = {};\n elementDataMap.set(element, data);\n }\n return data;\n}\n\n/**\n * Check if element has Hypen data\n */\nexport function hasHypenData(element: HTMLElement): boolean {\n return elementDataMap.has(element);\n}\n\n/**\n * Clear Hypen data from an element\n */\nexport function clearHypenData(element: HTMLElement): void {\n elementDataMap.delete(element);\n}\n\n// ============================================================================\n// Engine Access\n// ============================================================================\n\n/**\n * Get the engine attached to an element\n */\nexport function getEngine(element: HTMLElement): IEngine | undefined {\n return getHypenData(element).engine;\n}\n\n/**\n * Set the engine on an element\n */\nexport function setEngine(element: HTMLElement, engine: IEngine): void {\n getHypenData(element).engine = engine;\n}\n\n/**\n * Find engine by walking up the DOM tree\n */\nexport function findEngine(element: HTMLElement): IEngine | undefined {\n let current: HTMLElement | null = element;\n while (current) {\n const engine = getEngine(current);\n if (engine) return engine;\n current = current.parentElement;\n }\n return undefined;\n}\n\n// ============================================================================\n// Event Registration Tracking\n// ============================================================================\n\n/**\n * Get registered events set for an element\n */\nexport function getRegisteredEvents(element: HTMLElement): Set<string> {\n const data = getHypenData(element);\n if (!data.registeredEvents) {\n data.registeredEvents = new Set();\n }\n return data.registeredEvents;\n}\n\n/**\n * Check if an event handler is registered\n */\nexport function isEventRegistered(element: HTMLElement, eventKey: string): boolean {\n return getRegisteredEvents(element).has(eventKey);\n}\n\n/**\n * Mark an event handler as registered\n */\nexport function registerEvent(element: HTMLElement, eventKey: string): void {\n getRegisteredEvents(element).add(eventKey);\n}\n\n/**\n * Unregister an event handler\n */\nexport function unregisterEvent(element: HTMLElement, eventKey: string): void {\n getRegisteredEvents(element).delete(eventKey);\n}\n\n// ============================================================================\n// Keyboard Event Key Target\n// ============================================================================\n\n/**\n * Get the target key for keyboard events\n */\nexport function getKeyTarget(element: HTMLElement): string | undefined {\n return getHypenData(element).keyTarget;\n}\n\n/**\n * Set the target key for keyboard events\n */\nexport function setKeyTarget(element: HTMLElement, key: string): void {\n getHypenData(element).keyTarget = key;\n}\n\n// ============================================================================\n// Metadata\n// ============================================================================\n\n/**\n * Get custom metadata value\n */\nexport function getMeta<T>(element: HTMLElement, key: string): T | undefined {\n return getHypenData(element).meta?.[key] as T | undefined;\n}\n\n/**\n * Set custom metadata value\n */\nexport function setMeta<T>(element: HTMLElement, key: string, value: T): void {\n const data = getHypenData(element);\n if (!data.meta) {\n data.meta = {};\n }\n data.meta[key] = value;\n}\n\n// ============================================================================\n// Cleanup\n// ============================================================================\n\n/**\n * Dispose all resources attached to an element and clear data\n * Call this when removing an element from the DOM\n */\nexport function disposeHypenElement(element: HTMLElement): void {\n // Dispose any registered disposables\n try {\n const disposables = getElementDisposables(element);\n disposables.dispose();\n } catch {\n // Ignore if no disposables\n }\n\n // Clear Hypen data\n clearHypenData(element);\n}\n\n// ============================================================================\n// Legacy Compatibility Layer\n// ============================================================================\n\n/**\n * Symbol-based legacy accessor (for backwards compatibility)\n * Use the typed functions above instead when possible\n */\nconst HYPEN_ENGINE_SYMBOL = Symbol.for(\"hypen.engine\");\nconst REGISTERED_EVENTS_SYMBOL = Symbol.for(\"hypen.registeredEvents\");\nconst KEY_TARGET_SYMBOL = Symbol.for(\"hypen.keyTarget\");\n\n/**\n * Legacy accessor for engine (backwards compatible with existing code)\n */\nexport function getLegacyEngine(element: HTMLElement): IEngine | undefined {\n // Try new storage first\n const engine = getEngine(element);\n if (engine) return engine;\n\n // Fall back to legacy storage\n return (element as any)[HYPEN_ENGINE_SYMBOL] ??\n (element as any).__hypenEngine;\n}\n\n/**\n * Legacy setter for engine (backwards compatible)\n */\nexport function setLegacyEngine(element: HTMLElement, engine: IEngine): void {\n // Set in both locations for compatibility\n setEngine(element, engine);\n (element as any).__hypenEngine = engine;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA;AAkCA,IAAM,iBAAiB,IAAI;AASpB,SAAS,YAAY,CAAC,SAAwC;AAAA,EACnE,IAAI,OAAO,eAAe,IAAI,OAAO;AAAA,EACrC,IAAI,CAAC,MAAM;AAAA,IACT,OAAO,CAAC;AAAA,IACR,eAAe,IAAI,SAAS,IAAI;AAAA,EAClC;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,YAAY,CAAC,SAA+B;AAAA,EAC1D,OAAO,eAAe,IAAI,OAAO;AAAA;AAM5B,SAAS,cAAc,CAAC,SAA4B;AAAA,EACzD,eAAe,OAAO,OAAO;AAAA;AAUxB,SAAS,SAAS,CAAC,SAA2C;AAAA,EACnE,OAAO,aAAa,OAAO,EAAE;AAAA;AAMxB,SAAS,SAAS,CAAC,SAAsB,QAAuB;AAAA,EACrE,aAAa,OAAO,EAAE,SAAS;AAAA;AAM1B,SAAS,UAAU,CAAC,SAA2C;AAAA,EACpE,IAAI,UAA8B;AAAA,EAClC,OAAO,SAAS;AAAA,IACd,MAAM,SAAS,UAAU,OAAO;AAAA,IAChC,IAAI;AAAA,MAAQ,OAAO;AAAA,IACnB,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA;AAUK,SAAS,mBAAmB,CAAC,SAAmC;AAAA,EACrE,MAAM,OAAO,aAAa,OAAO;AAAA,EACjC,IAAI,CAAC,KAAK,kBAAkB;AAAA,IAC1B,KAAK,mBAAmB,IAAI;AAAA,EAC9B;AAAA,EACA,OAAO,KAAK;AAAA;AAMP,SAAS,iBAAiB,CAAC,SAAsB,UAA2B;AAAA,EACjF,OAAO,oBAAoB,OAAO,EAAE,IAAI,QAAQ;AAAA;AAM3C,SAAS,aAAa,CAAC,SAAsB,UAAwB;AAAA,EAC1E,oBAAoB,OAAO,EAAE,IAAI,QAAQ;AAAA;AAMpC,SAAS,eAAe,CAAC,SAAsB,UAAwB;AAAA,EAC5E,oBAAoB,OAAO,EAAE,OAAO,QAAQ;AAAA;AAUvC,SAAS,YAAY,CAAC,SAA0C;AAAA,EACrE,OAAO,aAAa,OAAO,EAAE;AAAA;AAMxB,SAAS,YAAY,CAAC,SAAsB,KAAmB;AAAA,EACpE,aAAa,OAAO,EAAE,YAAY;AAAA;AAU7B,SAAS,OAAU,CAAC,SAAsB,KAA4B;AAAA,EAC3E,OAAO,aAAa,OAAO,EAAE,OAAO;AAAA;AAM/B,SAAS,OAAU,CAAC,SAAsB,KAAa,OAAgB;AAAA,EAC5E,MAAM,OAAO,aAAa,OAAO;AAAA,EACjC,IAAI,CAAC,KAAK,MAAM;AAAA,IACd,KAAK,OAAO,CAAC;AAAA,EACf;AAAA,EACA,KAAK,KAAK,OAAO;AAAA;AAWZ,SAAS,mBAAmB,CAAC,SAA4B;AAAA,EAE9D,IAAI;AAAA,IACF,MAAM,cAAc,sBAAsB,OAAO;AAAA,IACjD,YAAY,QAAQ;AAAA,IACpB,MAAM;AAAA,EAKR,eAAe,OAAO;AAAA;AAWxB,IAAM,sBAAsB,OAAO,IAAI,cAAc;AACrD,IAAM,2BAA2B,OAAO,IAAI,wBAAwB;AACpE,IAAM,oBAAoB,OAAO,IAAI,iBAAiB;AAK/C,SAAS,eAAe,CAAC,SAA2C;AAAA,EAEzE,MAAM,SAAS,UAAU,OAAO;AAAA,EAChC,IAAI;AAAA,IAAQ,OAAO;AAAA,EAGnB,OAAQ,QAAgB,wBACrB,QAAgB;AAAA;AAMd,SAAS,eAAe,CAAC,SAAsB,QAAuB;AAAA,EAE3E,UAAU,SAAS,MAAM;AAAA,EACxB,QAAgB,gBAAgB;AAAA;",
|
|
8
|
+
"debugId": "C4AD9BA640CB84F264756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/dom/events.js
CHANGED
|
@@ -2,27 +2,37 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
6
8
|
var __toCommonJS = (from) => {
|
|
7
|
-
var entry = __moduleCache.get(from), desc;
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
8
10
|
if (entry)
|
|
9
11
|
return entry;
|
|
10
12
|
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
16
21
|
__moduleCache.set(from, entry);
|
|
17
22
|
return entry;
|
|
18
23
|
};
|
|
24
|
+
var __moduleCache;
|
|
25
|
+
var __returnValue = (v) => v;
|
|
26
|
+
function __exportSetter(name, newValue) {
|
|
27
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
+
}
|
|
19
29
|
var __export = (target, all) => {
|
|
20
30
|
for (var name in all)
|
|
21
31
|
__defProp(target, name, {
|
|
22
32
|
get: all[name],
|
|
23
33
|
enumerable: true,
|
|
24
34
|
configurable: true,
|
|
25
|
-
set: (
|
|
35
|
+
set: __exportSetter.bind(all, name)
|
|
26
36
|
});
|
|
27
37
|
};
|
|
28
38
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
@@ -62,7 +72,11 @@ class EventManager {
|
|
|
62
72
|
elementBindings = new Map;
|
|
63
73
|
this.bindings.set(elementId, elementBindings);
|
|
64
74
|
}
|
|
65
|
-
elementBindings.
|
|
75
|
+
const existingListener = elementBindings.get(domEventName);
|
|
76
|
+
if (existingListener) {
|
|
77
|
+
element.removeEventListener(domEventName, existingListener);
|
|
78
|
+
}
|
|
79
|
+
elementBindings.set(domEventName, listener);
|
|
66
80
|
element.addEventListener(domEventName, listener);
|
|
67
81
|
log.debug(`Listener attached to DOM for ${domEventName}`);
|
|
68
82
|
log.debug(`Element details:`, {
|
|
@@ -71,20 +85,16 @@ class EventManager {
|
|
|
71
85
|
dataset: element.dataset,
|
|
72
86
|
textContent: element.textContent?.substring(0, 50)
|
|
73
87
|
});
|
|
74
|
-
if (domEventName === "click") {
|
|
75
|
-
element.addEventListener("click", (e) => {
|
|
76
|
-
log.debug(`Raw DOM click detected on ${element.tagName}`, e);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
88
|
}
|
|
80
89
|
detach(elementId, element, eventName) {
|
|
90
|
+
const domEventName = eventName === "onClick" ? "click" : eventName;
|
|
81
91
|
const elementBindings = this.bindings.get(elementId);
|
|
82
92
|
if (!elementBindings)
|
|
83
93
|
return;
|
|
84
|
-
const listener = elementBindings.get(
|
|
94
|
+
const listener = elementBindings.get(domEventName);
|
|
85
95
|
if (listener) {
|
|
86
|
-
element.removeEventListener(
|
|
87
|
-
elementBindings.delete(
|
|
96
|
+
element.removeEventListener(domEventName, listener);
|
|
97
|
+
elementBindings.delete(domEventName);
|
|
88
98
|
}
|
|
89
99
|
if (elementBindings.size === 0) {
|
|
90
100
|
this.bindings.delete(elementId);
|
|
@@ -137,4 +147,4 @@ export {
|
|
|
137
147
|
EventManager
|
|
138
148
|
};
|
|
139
149
|
|
|
140
|
-
//# debugId=
|
|
150
|
+
//# debugId=0AF5B59AAE95400964756E2164756E21
|
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/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(
|
|
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 using `domEventName` so `detach()` uses the correct name\n let elementBindings = this.bindings.get(elementId);\n if (!elementBindings) {\n elementBindings = new Map();\n this.bindings.set(elementId, elementBindings);\n }\n\n // Remove any previously attached listener for this event before overwriting,\n // otherwise the old DOM listener leaks and fires alongside the new one.\n const existingListener = elementBindings.get(domEventName);\n if (existingListener) {\n element.removeEventListener(domEventName, existingListener);\n }\n elementBindings.set(domEventName, 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\n /**\n * Detach an event listener from an element\n */\n detach(elementId: string, element: HTMLElement, eventName: string): void {\n // Convert framework event name to DOM event name, matching `attach()`\n const domEventName = eventName === \"onClick\" ? \"click\" : eventName;\n const elementBindings = this.bindings.get(elementId);\n if (!elementBindings) return;\n\n const listener = elementBindings.get(domEventName);\n if (listener) {\n element.removeEventListener(domEventName, listener);\n elementBindings.delete(domEventName);\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
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "0AF5B59AAE95400964756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|