@hypen-space/web 0.4.2 → 0.4.5
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 +32 -14
- package/dist/canvas/index.js.map +7 -7
- package/dist/canvas/input.d.ts +63 -0
- package/dist/canvas/input.js +14 -2
- package/dist/canvas/input.js.map +3 -3
- 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 +32 -14
- package/dist/canvas/renderer.js.map +7 -7
- 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 +106 -43
- 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 +55 -3
- 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 +55 -9
- 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 +101 -25
- package/dist/dom/index.js.map +12 -11
- package/dist/dom/renderer.d.ts +115 -0
- package/dist/dom/renderer.js +100 -24
- package/dist/dom/renderer.js.map +11 -10
- package/dist/hypen.d.ts +140 -0
- package/dist/hypen.js +106 -43
- package/dist/hypen.js.map +12 -11
- package/dist/index.d.ts +28 -0
- package/dist/index.js +132 -38
- package/dist/index.js.map +17 -16
- package/package.json +3 -2
- package/src/canvas/input.ts +23 -1
- package/src/dom/applicators/events.ts +71 -0
- package/src/dom/renderer.ts +4 -4
- package/src/hypen.ts +7 -24
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas Component with Applicators
|
|
3
|
+
*
|
|
4
|
+
* Special handling for canvas rendering
|
|
5
|
+
*/
|
|
6
|
+
import type { ComponentHandler } from "../components/index.js";
|
|
7
|
+
import type { ApplicatorHandler } from "../applicators/index.js";
|
|
8
|
+
export declare const canvasHandler: ComponentHandler;
|
|
9
|
+
/**
|
|
10
|
+
* Canvas applicators - special drawing commands
|
|
11
|
+
*/
|
|
12
|
+
export declare const canvasApplicators: Record<string, ApplicatorHandler>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Component - Root application container
|
|
3
|
+
*
|
|
4
|
+
* Full-screen vertical flex container. This is the default root component
|
|
5
|
+
* created by `hypen init` and referenced in docs/examples.
|
|
6
|
+
*/
|
|
7
|
+
import type { ComponentHandler } from "./index.js";
|
|
8
|
+
export declare const appHandler: ComponentHandler;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __moduleCache = /* @__PURE__ */ new WeakMap;
|
|
6
|
+
var __toCommonJS = (from) => {
|
|
7
|
+
var entry = __moduleCache.get(from), desc;
|
|
8
|
+
if (entry)
|
|
9
|
+
return entry;
|
|
10
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function")
|
|
12
|
+
__getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
|
|
13
|
+
get: () => from[key],
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
}));
|
|
16
|
+
__moduleCache.set(from, entry);
|
|
17
|
+
return entry;
|
|
18
|
+
};
|
|
19
|
+
var __export = (target, all) => {
|
|
20
|
+
for (var name in all)
|
|
21
|
+
__defProp(target, name, {
|
|
22
|
+
get: all[name],
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
set: (newValue) => all[name] = () => newValue
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
29
|
+
|
|
30
|
+
// src/dom/components/app.ts
|
|
31
|
+
var exports_app = {};
|
|
32
|
+
__export(exports_app, {
|
|
33
|
+
appHandler: () => appHandler
|
|
34
|
+
});
|
|
35
|
+
var appHandler;
|
|
36
|
+
var init_app = __esm(() => {
|
|
37
|
+
appHandler = {
|
|
38
|
+
create() {
|
|
39
|
+
const el = document.createElement("div");
|
|
40
|
+
el.style.display = "flex";
|
|
41
|
+
el.style.flexDirection = "column";
|
|
42
|
+
el.style.minHeight = "100vh";
|
|
43
|
+
el.style.width = "100%";
|
|
44
|
+
el.dataset.hypenType = "app";
|
|
45
|
+
return el;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
init_app();
|
|
50
|
+
|
|
51
|
+
export {
|
|
52
|
+
appHandler
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
//# debugId=431193B137CDB06A64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/components/app.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * App Component - Root application container\n *\n * Full-screen vertical flex container. This is the default root component\n * created by `hypen init` and referenced in docs/examples.\n */\n\nimport type { ComponentHandler } from \"./index.js\";\n\nexport const appHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"div\");\n el.style.display = \"flex\";\n el.style.flexDirection = \"column\";\n el.style.minHeight = \"100vh\";\n el.style.width = \"100%\";\n el.dataset.hypenType = \"app\";\n return el;\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASa;AAAA;AAAA,eAA+B;AAAA,IAC1C,MAAM,GAAgB;AAAA,MACpB,MAAM,KAAK,SAAS,cAAc,KAAK;AAAA,MACvC,GAAG,MAAM,UAAU;AAAA,MACnB,GAAG,MAAM,gBAAgB;AAAA,MACzB,GAAG,MAAM,YAAY;AAAA,MACrB,GAAG,MAAM,QAAQ;AAAA,MACjB,GAAG,QAAQ,YAAY;AAAA,MACvB,OAAO;AAAA;AAAA,EAEX;AAAA;",
|
|
8
|
+
"debugId": "431193B137CDB06A64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button Component
|
|
3
|
+
*
|
|
4
|
+
* Renders as a flex container. Children align to start by default (matching iOS).
|
|
5
|
+
* Use .horizontalAlignment("center") to center content.
|
|
6
|
+
* Reset default HTML button styles for cross-platform consistency.
|
|
7
|
+
*/
|
|
8
|
+
import type { ComponentHandler } from "./index.js";
|
|
9
|
+
export declare const buttonHandler: ComponentHandler;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Center Component - Centers content
|
|
3
|
+
*
|
|
4
|
+
* Center expands to fill available space by default (matching iOS/Android behavior).
|
|
5
|
+
* This is because a Center that wraps to content can't meaningfully center anything.
|
|
6
|
+
* The expansion is constrained by parent's layout rules.
|
|
7
|
+
*/
|
|
8
|
+
import type { ComponentHandler } from "./index.js";
|
|
9
|
+
export declare const centerHandler: ComponentHandler;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column Component - Vertical Stack
|
|
3
|
+
*
|
|
4
|
+
* Children wrap to content by default (matching Android/iOS behavior).
|
|
5
|
+
* Use .fillMaxWidth() on children or .horizontalAlignment("stretch") to stretch.
|
|
6
|
+
*/
|
|
7
|
+
import type { ComponentHandler } from "./index.js";
|
|
8
|
+
export declare const columnHandler: ComponentHandler;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HypenApp Component
|
|
3
|
+
*
|
|
4
|
+
* Embeds a remote Hypen app via WebSocket
|
|
5
|
+
*
|
|
6
|
+
* Usage in Hypen DSL:
|
|
7
|
+
* ```hypen
|
|
8
|
+
* HypenApp("ws://localhost:3000")
|
|
9
|
+
*
|
|
10
|
+
* // Or with named prop:
|
|
11
|
+
* HypenApp(url: "ws://localhost:3000")
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
import type { ComponentHandler } from "./index.js";
|
|
15
|
+
export declare const hypenAppHandler: ComponentHandler;
|
|
16
|
+
/**
|
|
17
|
+
* Disconnect a HypenApp instance
|
|
18
|
+
*/
|
|
19
|
+
export declare function disconnectHypenApp(element: HTMLElement): void;
|
|
@@ -34,7 +34,7 @@ __export(exports_hypenapp, {
|
|
|
34
34
|
disconnectHypenApp: () => disconnectHypenApp
|
|
35
35
|
});
|
|
36
36
|
import { RemoteEngine } from "@hypen-space/core/remote/client";
|
|
37
|
-
import { frameworkLoggers } from "@hypen-space/core";
|
|
37
|
+
import { frameworkLoggers } from "@hypen-space/core/logger";
|
|
38
38
|
function applyPatches(container, nodes, patches, engine, onRoot) {
|
|
39
39
|
for (const patch of patches) {
|
|
40
40
|
switch (patch.type) {
|
|
@@ -190,8 +190,6 @@ function applyProp(el, name, value) {
|
|
|
190
190
|
border: "border",
|
|
191
191
|
gap: "gap",
|
|
192
192
|
flex: "flex",
|
|
193
|
-
alignItems: "alignItems",
|
|
194
|
-
justifyContent: "justifyContent",
|
|
195
193
|
opacity: "opacity",
|
|
196
194
|
overflow: "overflow"
|
|
197
195
|
};
|
|
@@ -295,4 +293,4 @@ export {
|
|
|
295
293
|
disconnectHypenApp
|
|
296
294
|
};
|
|
297
295
|
|
|
298
|
-
//# debugId=
|
|
296
|
+
//# debugId=6CC26A230E0A0AED64756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/dom/components/hypenapp.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * HypenApp Component\n *\n * Embeds a remote Hypen app via WebSocket\n *\n * Usage in Hypen DSL:\n * ```hypen\n * HypenApp(\"ws://localhost:3000\")\n *\n * // Or with named prop:\n * HypenApp(url: \"ws://localhost:3000\")\n * ```\n */\n\nimport type { ComponentHandler } from \"./index.js\";\nimport { RemoteEngine } from \"@hypen-space/core/remote/client\";\nimport type { Patch } from \"@hypen-space/core/types\";\nimport { frameworkLoggers } from \"@hypen-space/core\";\n\nconst log = frameworkLoggers.remote;\n\n// Store active HypenApp instances for cleanup\nconst activeInstances = new WeakMap<\n HTMLElement,\n {\n engine: RemoteEngine;\n nodes: Map<string, HTMLElement>;\n }\n>();\n\nexport const hypenAppHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"div\");\n el.dataset.hypenType = \"hypenapp\";\n el.style.display = \"contents\"; // Don't affect layout\n return el;\n },\n\n applyProps(element: HTMLElement, props: Record<string, any>): void {\n // Get URL from props (can be positional \"0\" or named \"url\")\n const url = props[\"0\"] || props.url;\n\n if (!url || typeof url !== \"string\") {\n log.error(\"HypenApp: URL is required\");\n element.innerHTML = '<div style=\"color: red;\">HypenApp: URL required</div>';\n return;\n }\n\n // Check if already connected\n const existing = activeInstances.get(element);\n if (existing) {\n // Already connected, don't reconnect\n return;\n }\n\n // Create the remote engine\n const engine = new RemoteEngine(url, {\n autoReconnect: props.autoReconnect ?? true,\n reconnectInterval: props.reconnectInterval ?? 3000,\n maxReconnectAttempts: props.maxReconnectAttempts ?? 10,\n });\n\n // Map to track created nodes\n const nodes = new Map<string, HTMLElement>();\n let rootId: string | null = null;\n\n // Store instance for cleanup\n activeInstances.set(element, { engine, nodes });\n\n // Set up patch handling\n engine.onPatches((patches) => {\n applyPatches(element, nodes, patches, engine, (id) => {\n if (!rootId) rootId = id;\n });\n });\n\n // Show loading state\n element.innerHTML = '<div class=\"hypen-app-loading\">Connecting...</div>';\n\n // Connect\n engine\n .connect()\n .then(() => {\n // Clear loading state - patches will populate content\n element.innerHTML = \"\";\n log.debug(`HypenApp connected to ${url}`);\n })\n .catch((error) => {\n element.innerHTML = `<div style=\"color: red;\">HypenApp: Connection failed - ${error.message}</div>`;\n log.error(\"HypenApp connection failed:\", error);\n });\n\n // Handle disconnection\n engine.onDisconnect(() => {\n log.debug(\"HypenApp disconnected\");\n });\n\n engine.onError((error) => {\n log.error(\"HypenApp error:\", error);\n });\n\n // Cleanup on element removal\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const removedNode of mutation.removedNodes) {\n if (removedNode === element || (removedNode as Element).contains?.(element)) {\n engine.disconnect();\n activeInstances.delete(element);\n observer.disconnect();\n log.debug(\"HypenApp cleaned up\");\n return;\n }\n }\n }\n });\n\n // Observe parent for removal\n if (element.parentNode) {\n observer.observe(element.parentNode, { childList: true, subtree: true });\n }\n },\n};\n\n/**\n * Minimal patch application for HypenApp container\n */\nfunction applyPatches(\n container: HTMLElement,\n nodes: Map<string, HTMLElement>,\n patches: Patch[],\n engine: RemoteEngine,\n onRoot: (id: string) => void\n): void {\n for (const patch of patches) {\n switch (patch.type) {\n case \"create\": {\n const el = createElement(patch.elementType!, patch.props || {});\n el.dataset.hypenId = patch.id!;\n (el as any).__hypenEngine = engine;\n nodes.set(patch.id!, el);\n break;\n }\n\n case \"setProp\": {\n const el = nodes.get(patch.id!);\n if (el) {\n applyProp(el, patch.name!, patch.value);\n }\n break;\n }\n\n case \"setText\": {\n const el = nodes.get(patch.id!);\n if (el) {\n el.textContent = patch.text!;\n }\n break;\n }\n\n case \"insert\": {\n const parentId = patch.parentId!;\n const parent = parentId === \"root\" ? container : nodes.get(parentId);\n const child = nodes.get(patch.id!);\n const beforeId = patch.beforeId;\n\n if (parent && child) {\n if (parentId === \"root\") {\n onRoot(patch.id!);\n }\n\n if (beforeId) {\n const before = 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 if (!parent.contains(child)) {\n parent.appendChild(child);\n }\n }\n break;\n }\n\n case \"move\": {\n const parentId = patch.parentId!;\n const parent = parentId === \"root\" ? container : nodes.get(parentId);\n const child = nodes.get(patch.id!);\n const beforeId = patch.beforeId;\n\n if (parent && child) {\n if (beforeId) {\n const before = nodes.get(beforeId);\n if (before && before.parentNode === parent) {\n parent.insertBefore(child, before);\n }\n } else {\n parent.appendChild(child);\n }\n }\n break;\n }\n\n case \"remove\": {\n const el = nodes.get(patch.id!);\n if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n nodes.delete(patch.id!);\n break;\n }\n }\n }\n}\n\n/**\n * Create element by type\n */\nfunction createElement(type: string, props: Record<string, any>): HTMLElement {\n const normalizedType = type.toLowerCase();\n\n // Map Hypen types to HTML elements\n const tagMap: Record<string, string> = {\n column: \"div\",\n row: \"div\",\n text: \"span\",\n button: \"button\",\n input: \"input\",\n image: \"img\",\n container: \"div\",\n box: \"div\",\n center: \"div\",\n list: \"div\",\n spacer: \"div\",\n stack: \"div\",\n divider: \"hr\",\n grid: \"div\",\n card: \"div\",\n heading: \"h2\",\n link: \"a\",\n textarea: \"textarea\",\n checkbox: \"input\",\n select: \"select\",\n slider: \"input\",\n switch: \"input\",\n spinner: \"div\",\n badge: \"span\",\n avatar: \"img\",\n progressbar: \"div\",\n video: \"video\",\n audio: \"audio\",\n };\n\n const tag = tagMap[normalizedType] || \"div\";\n const el = document.createElement(tag);\n el.dataset.hypenType = normalizedType;\n\n // Apply basic styles\n if (normalizedType === \"column\") {\n el.style.display = \"flex\";\n el.style.flexDirection = \"column\";\n } else if (normalizedType === \"row\") {\n el.style.display = \"flex\";\n el.style.flexDirection = \"row\";\n } else if (normalizedType === \"center\") {\n el.style.display = \"flex\";\n el.style.alignItems = \"center\";\n el.style.justifyContent = \"center\";\n } else if (normalizedType === \"text\") {\n // Text content from props\n if (props[\"0\"]) {\n el.textContent = String(props[\"0\"]);\n }\n } else if (normalizedType === \"button\") {\n el.style.cursor = \"pointer\";\n } else if (normalizedType === \"checkbox\" || normalizedType === \"switch\") {\n (el as HTMLInputElement).type = \"checkbox\";\n } else if (normalizedType === \"slider\") {\n (el as HTMLInputElement).type = \"range\";\n }\n\n return el;\n}\n\n/**\n * Apply a prop to an element\n */\nfunction applyProp(el: HTMLElement, name: string, value: any): void {\n // Text content\n if (name === \"0\" || name === \"text\") {\n el.textContent = String(value);\n return;\n }\n\n // Style props\n const styleProps: Record<string, string> = {\n padding: \"padding\",\n margin: \"margin\",\n backgroundColor: \"backgroundColor\",\n background: \"background\",\n color: \"color\",\n fontSize: \"fontSize\",\n fontWeight: \"fontWeight\",\n width: \"width\",\n height: \"height\",\n minWidth: \"minWidth\",\n minHeight: \"minHeight\",\n maxWidth: \"maxWidth\",\n maxHeight: \"maxHeight\",\n borderRadius: \"borderRadius\",\n border: \"border\",\n gap: \"gap\",\n flex: \"flex\",\n
|
|
5
|
+
"/**\n * HypenApp Component\n *\n * Embeds a remote Hypen app via WebSocket\n *\n * Usage in Hypen DSL:\n * ```hypen\n * HypenApp(\"ws://localhost:3000\")\n *\n * // Or with named prop:\n * HypenApp(url: \"ws://localhost:3000\")\n * ```\n */\n\nimport type { ComponentHandler } from \"./index.js\";\nimport { RemoteEngine } from \"@hypen-space/core/remote/client\";\nimport type { Patch } from \"@hypen-space/core/types\";\nimport { frameworkLoggers } from \"@hypen-space/core/logger\";\n\nconst log = frameworkLoggers.remote;\n\n// Store active HypenApp instances for cleanup\nconst activeInstances = new WeakMap<\n HTMLElement,\n {\n engine: RemoteEngine;\n nodes: Map<string, HTMLElement>;\n }\n>();\n\nexport const hypenAppHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"div\");\n el.dataset.hypenType = \"hypenapp\";\n el.style.display = \"contents\"; // Don't affect layout\n return el;\n },\n\n applyProps(element: HTMLElement, props: Record<string, any>): void {\n // Get URL from props (can be positional \"0\" or named \"url\")\n const url = props[\"0\"] || props.url;\n\n if (!url || typeof url !== \"string\") {\n log.error(\"HypenApp: URL is required\");\n element.innerHTML = '<div style=\"color: red;\">HypenApp: URL required</div>';\n return;\n }\n\n // Check if already connected\n const existing = activeInstances.get(element);\n if (existing) {\n // Already connected, don't reconnect\n return;\n }\n\n // Create the remote engine\n const engine = new RemoteEngine(url, {\n autoReconnect: props.autoReconnect ?? true,\n reconnectInterval: props.reconnectInterval ?? 3000,\n maxReconnectAttempts: props.maxReconnectAttempts ?? 10,\n });\n\n // Map to track created nodes\n const nodes = new Map<string, HTMLElement>();\n let rootId: string | null = null;\n\n // Store instance for cleanup\n activeInstances.set(element, { engine, nodes });\n\n // Set up patch handling\n engine.onPatches((patches) => {\n applyPatches(element, nodes, patches, engine, (id) => {\n if (!rootId) rootId = id;\n });\n });\n\n // Show loading state\n element.innerHTML = '<div class=\"hypen-app-loading\">Connecting...</div>';\n\n // Connect\n engine\n .connect()\n .then(() => {\n // Clear loading state - patches will populate content\n element.innerHTML = \"\";\n log.debug(`HypenApp connected to ${url}`);\n })\n .catch((error) => {\n element.innerHTML = `<div style=\"color: red;\">HypenApp: Connection failed - ${error.message}</div>`;\n log.error(\"HypenApp connection failed:\", error);\n });\n\n // Handle disconnection\n engine.onDisconnect(() => {\n log.debug(\"HypenApp disconnected\");\n });\n\n engine.onError((error) => {\n log.error(\"HypenApp error:\", error);\n });\n\n // Cleanup on element removal\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const removedNode of mutation.removedNodes) {\n if (removedNode === element || (removedNode as Element).contains?.(element)) {\n engine.disconnect();\n activeInstances.delete(element);\n observer.disconnect();\n log.debug(\"HypenApp cleaned up\");\n return;\n }\n }\n }\n });\n\n // Observe parent for removal\n if (element.parentNode) {\n observer.observe(element.parentNode, { childList: true, subtree: true });\n }\n },\n};\n\n/**\n * Minimal patch application for HypenApp container\n */\nfunction applyPatches(\n container: HTMLElement,\n nodes: Map<string, HTMLElement>,\n patches: Patch[],\n engine: RemoteEngine,\n onRoot: (id: string) => void\n): void {\n for (const patch of patches) {\n switch (patch.type) {\n case \"create\": {\n const el = createElement(patch.elementType!, patch.props || {});\n el.dataset.hypenId = patch.id!;\n (el as any).__hypenEngine = engine;\n nodes.set(patch.id!, el);\n break;\n }\n\n case \"setProp\": {\n const el = nodes.get(patch.id!);\n if (el) {\n applyProp(el, patch.name!, patch.value);\n }\n break;\n }\n\n case \"setText\": {\n const el = nodes.get(patch.id!);\n if (el) {\n el.textContent = patch.text!;\n }\n break;\n }\n\n case \"insert\": {\n const parentId = patch.parentId!;\n const parent = parentId === \"root\" ? container : nodes.get(parentId);\n const child = nodes.get(patch.id!);\n const beforeId = patch.beforeId;\n\n if (parent && child) {\n if (parentId === \"root\") {\n onRoot(patch.id!);\n }\n\n if (beforeId) {\n const before = 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 if (!parent.contains(child)) {\n parent.appendChild(child);\n }\n }\n break;\n }\n\n case \"move\": {\n const parentId = patch.parentId!;\n const parent = parentId === \"root\" ? container : nodes.get(parentId);\n const child = nodes.get(patch.id!);\n const beforeId = patch.beforeId;\n\n if (parent && child) {\n if (beforeId) {\n const before = nodes.get(beforeId);\n if (before && before.parentNode === parent) {\n parent.insertBefore(child, before);\n }\n } else {\n parent.appendChild(child);\n }\n }\n break;\n }\n\n case \"remove\": {\n const el = nodes.get(patch.id!);\n if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n nodes.delete(patch.id!);\n break;\n }\n }\n }\n}\n\n/**\n * Create element by type\n */\nfunction createElement(type: string, props: Record<string, any>): HTMLElement {\n const normalizedType = type.toLowerCase();\n\n // Map Hypen types to HTML elements\n const tagMap: Record<string, string> = {\n column: \"div\",\n row: \"div\",\n text: \"span\",\n button: \"button\",\n input: \"input\",\n image: \"img\",\n container: \"div\",\n box: \"div\",\n center: \"div\",\n list: \"div\",\n spacer: \"div\",\n stack: \"div\",\n divider: \"hr\",\n grid: \"div\",\n card: \"div\",\n heading: \"h2\",\n link: \"a\",\n textarea: \"textarea\",\n checkbox: \"input\",\n select: \"select\",\n slider: \"input\",\n switch: \"input\",\n spinner: \"div\",\n badge: \"span\",\n avatar: \"img\",\n progressbar: \"div\",\n video: \"video\",\n audio: \"audio\",\n };\n\n const tag = tagMap[normalizedType] || \"div\";\n const el = document.createElement(tag);\n el.dataset.hypenType = normalizedType;\n\n // Apply basic styles\n if (normalizedType === \"column\") {\n el.style.display = \"flex\";\n el.style.flexDirection = \"column\";\n } else if (normalizedType === \"row\") {\n el.style.display = \"flex\";\n el.style.flexDirection = \"row\";\n } else if (normalizedType === \"center\") {\n el.style.display = \"flex\";\n el.style.alignItems = \"center\";\n el.style.justifyContent = \"center\";\n } else if (normalizedType === \"text\") {\n // Text content from props\n if (props[\"0\"]) {\n el.textContent = String(props[\"0\"]);\n }\n } else if (normalizedType === \"button\") {\n el.style.cursor = \"pointer\";\n } else if (normalizedType === \"checkbox\" || normalizedType === \"switch\") {\n (el as HTMLInputElement).type = \"checkbox\";\n } else if (normalizedType === \"slider\") {\n (el as HTMLInputElement).type = \"range\";\n }\n\n return el;\n}\n\n/**\n * Apply a prop to an element\n */\nfunction applyProp(el: HTMLElement, name: string, value: any): void {\n // Text content\n if (name === \"0\" || name === \"text\") {\n el.textContent = String(value);\n return;\n }\n\n // Style props\n const styleProps: Record<string, string> = {\n padding: \"padding\",\n margin: \"margin\",\n backgroundColor: \"backgroundColor\",\n background: \"background\",\n color: \"color\",\n fontSize: \"fontSize\",\n fontWeight: \"fontWeight\",\n width: \"width\",\n height: \"height\",\n minWidth: \"minWidth\",\n minHeight: \"minHeight\",\n maxWidth: \"maxWidth\",\n maxHeight: \"maxHeight\",\n borderRadius: \"borderRadius\",\n border: \"border\",\n gap: \"gap\",\n flex: \"flex\",\n opacity: \"opacity\",\n overflow: \"overflow\",\n };\n\n if (styleProps[name]) {\n const cssValue = typeof value === \"number\" ? `${value}px` : String(value);\n (el.style as any)[styleProps[name]] = cssValue;\n return;\n }\n\n // Event handlers\n if (name === \"onClick\" || name === \"onclick\") {\n el.onclick = () => {\n const engine = (el as any).__hypenEngine as RemoteEngine;\n if (engine && typeof value === \"string\" && value.startsWith(\"@actions.\")) {\n const action = value.replace(\"@actions.\", \"\");\n engine.dispatchAction(action);\n }\n };\n return;\n }\n\n // Other attributes\n el.setAttribute(name, String(value));\n}\n\n/**\n * Disconnect a HypenApp instance\n */\nexport function disconnectHypenApp(element: HTMLElement): void {\n const instance = activeInstances.get(element);\n if (instance) {\n instance.engine.disconnect();\n activeInstances.delete(element);\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "6CC26A230E0A0AED64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages mappings from Hypen component types to DOM elements
|
|
5
|
+
*/
|
|
6
|
+
export interface ComponentHandler {
|
|
7
|
+
create(): HTMLElement;
|
|
8
|
+
applyProps?(element: HTMLElement, props: Record<string, any>): void;
|
|
9
|
+
}
|
|
10
|
+
export declare class ComponentRegistry {
|
|
11
|
+
private handlers;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Register a component handler
|
|
15
|
+
*/
|
|
16
|
+
register(type: string, handler: ComponentHandler): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get handler for a component type
|
|
19
|
+
*/
|
|
20
|
+
get(type: string): ComponentHandler | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Create element for a component type
|
|
23
|
+
*/
|
|
24
|
+
createElement(type: string, props?: Record<string, any>): HTMLElement | null;
|
|
25
|
+
/**
|
|
26
|
+
* Register all default Hypen components
|
|
27
|
+
*/
|
|
28
|
+
private registerDefaults;
|
|
29
|
+
}
|
|
@@ -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);
|
|
@@ -1393,4 +1417,4 @@ export {
|
|
|
1393
1417
|
ComponentRegistry
|
|
1394
1418
|
};
|
|
1395
1419
|
|
|
1396
|
-
//# debugId=
|
|
1420
|
+
//# debugId=9BBDD047A932849064756E2164756E21
|