@hypen-space/web 0.4.36 → 0.4.38
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/README.md +7 -6
- package/dist/canvas/accessibility.js +174 -174
- package/dist/canvas/accessibility.js.map +1 -10
- package/dist/canvas/events.js +264 -360
- package/dist/canvas/events.js.map +1 -11
- package/dist/canvas/index.js +11 -47
- package/dist/canvas/index.js.map +1 -9
- package/dist/canvas/input.js +178 -289
- package/dist/canvas/input.js.map +1 -11
- package/dist/canvas/layout.js +349 -547
- package/dist/canvas/layout.js.map +1 -12
- package/dist/canvas/paint.js +1122 -1146
- package/dist/canvas/paint.js.map +1 -12
- package/dist/canvas/renderer.js +352 -2259
- package/dist/canvas/renderer.js.map +1 -17
- package/dist/canvas/text.js +129 -264
- package/dist/canvas/text.js.map +1 -11
- package/dist/canvas/types.js +7 -2
- package/dist/canvas/types.js.map +1 -9
- package/dist/canvas/utils.js +158 -161
- package/dist/canvas/utils.js.map +1 -10
- package/dist/dom/applicators/advanced-layout.js +105 -138
- package/dist/dom/applicators/advanced-layout.js.map +1 -10
- package/dist/dom/applicators/background.js +36 -76
- package/dist/dom/applicators/background.js.map +1 -10
- package/dist/dom/applicators/border.js +82 -106
- package/dist/dom/applicators/border.js.map +1 -10
- package/dist/dom/applicators/color.js +17 -58
- package/dist/dom/applicators/color.js.map +1 -10
- package/dist/dom/applicators/display.js +39 -79
- package/dist/dom/applicators/display.js.map +1 -10
- package/dist/dom/applicators/effects.js +121 -147
- package/dist/dom/applicators/effects.js.map +1 -10
- package/dist/dom/applicators/events.js +413 -450
- package/dist/dom/applicators/events.js.map +1 -11
- package/dist/dom/applicators/font.js +119 -140
- package/dist/dom/applicators/font.js.map +1 -10
- package/dist/dom/applicators/index.js +386 -1770
- package/dist/dom/applicators/index.js.map +1 -26
- package/dist/dom/applicators/layout.js +143 -149
- package/dist/dom/applicators/layout.js.map +1 -10
- package/dist/dom/applicators/margin.js +64 -105
- package/dist/dom/applicators/margin.js.map +1 -10
- package/dist/dom/applicators/padding.js +64 -105
- package/dist/dom/applicators/padding.js.map +1 -10
- package/dist/dom/applicators/size.js +169 -172
- package/dist/dom/applicators/size.js.map +1 -10
- package/dist/dom/applicators/transform.js +73 -114
- package/dist/dom/applicators/transform.js.map +1 -10
- package/dist/dom/applicators/transition.js +47 -88
- package/dist/dom/applicators/transition.js.map +1 -10
- package/dist/dom/applicators/types.js +7 -2
- package/dist/dom/applicators/types.js.map +1 -9
- package/dist/dom/applicators/typography.js +68 -109
- package/dist/dom/applicators/typography.js.map +1 -10
- package/dist/dom/canvas/index.js +49 -83
- package/dist/dom/canvas/index.js.map +1 -10
- package/dist/dom/components/app.js +16 -63
- package/dist/dom/components/app.js.map +1 -10
- package/dist/dom/components/audio.js +31 -76
- package/dist/dom/components/audio.js.map +1 -10
- package/dist/dom/components/avatar.js +41 -87
- package/dist/dom/components/avatar.js.map +1 -10
- package/dist/dom/components/badge.js +35 -83
- package/dist/dom/components/badge.js.map +1 -10
- package/dist/dom/components/button.js +26 -69
- package/dist/dom/components/button.js.map +1 -10
- package/dist/dom/components/card.js +13 -63
- package/dist/dom/components/card.js.map +1 -10
- package/dist/dom/components/center.js +21 -65
- package/dist/dom/components/center.js.map +1 -10
- package/dist/dom/components/checkbox.js +37 -82
- package/dist/dom/components/checkbox.js.map +1 -10
- package/dist/dom/components/column.js +16 -62
- package/dist/dom/components/column.js.map +1 -10
- package/dist/dom/components/container.js +11 -59
- package/dist/dom/components/container.js.map +1 -10
- package/dist/dom/components/divider.js +27 -73
- package/dist/dom/components/divider.js.map +1 -10
- package/dist/dom/components/grid.js +41 -80
- package/dist/dom/components/grid.js.map +1 -10
- package/dist/dom/components/heading.js +28 -74
- package/dist/dom/components/heading.js.map +1 -10
- package/dist/dom/components/hypenapp.js +291 -288
- package/dist/dom/components/hypenapp.js.map +1 -10
- package/dist/dom/components/image.js +18 -67
- package/dist/dom/components/image.js.map +1 -10
- package/dist/dom/components/index.js +109 -1427
- package/dist/dom/components/index.js.map +1 -42
- package/dist/dom/components/input.js +19 -69
- package/dist/dom/components/input.js.map +1 -10
- package/dist/dom/components/link.js +23 -70
- package/dist/dom/components/link.js.map +1 -10
- package/dist/dom/components/list.js +26 -72
- package/dist/dom/components/list.js.map +1 -10
- package/dist/dom/components/paragraph.js +14 -63
- package/dist/dom/components/paragraph.js.map +1 -10
- package/dist/dom/components/progressbar.js +38 -85
- package/dist/dom/components/progressbar.js.map +1 -10
- package/dist/dom/components/route.js +27 -73
- package/dist/dom/components/route.js.map +1 -10
- package/dist/dom/components/router.js +15 -62
- package/dist/dom/components/router.js.map +1 -10
- package/dist/dom/components/row.js +25 -70
- package/dist/dom/components/row.js.map +1 -10
- package/dist/dom/components/select.js +42 -85
- package/dist/dom/components/select.js.map +1 -10
- package/dist/dom/components/slider.js +31 -76
- package/dist/dom/components/slider.js.map +1 -10
- package/dist/dom/components/spacer.js +10 -60
- package/dist/dom/components/spacer.js.map +1 -10
- package/dist/dom/components/spinner.js +41 -88
- package/dist/dom/components/spinner.js.map +1 -10
- package/dist/dom/components/stack.js +19 -67
- package/dist/dom/components/stack.js.map +1 -10
- package/dist/dom/components/switch.js +50 -93
- package/dist/dom/components/switch.js.map +1 -10
- package/dist/dom/components/text.js +24 -69
- package/dist/dom/components/text.js.map +1 -10
- package/dist/dom/components/textarea.js +35 -79
- package/dist/dom/components/textarea.js.map +1 -10
- package/dist/dom/components/video.js +35 -79
- package/dist/dom/components/video.js.map +1 -10
- package/dist/dom/debug.js +159 -160
- package/dist/dom/debug.js.map +1 -10
- package/dist/dom/element-data.js +181 -143
- package/dist/dom/element-data.js.map +1 -10
- package/dist/dom/events.js +133 -142
- package/dist/dom/events.js.map +1 -10
- package/dist/dom/index.js +11 -48
- package/dist/dom/index.js.map +1 -9
- package/dist/dom/renderer.js +311 -3596
- package/dist/dom/renderer.js.map +1 -62
- package/dist/index.d.ts +2 -2
- package/dist/index.js +36 -53
- package/dist/index.js.map +1 -9
- package/package.json +2 -16
- package/src/canvas/QUICKSTART.md +4 -3
- package/src/canvas/README.md +3 -2
- package/src/dom/README.md +4 -3
- package/src/index.ts +2 -2
- package/dist/client.d.ts +0 -19
- package/dist/client.js +0 -45
- package/dist/client.js.map +0 -9
- package/dist/hypen.d.ts +0 -140
- package/dist/hypen.js +0 -3909
- package/dist/hypen.js.map +0 -63
- package/src/client.ts +0 -20
- package/src/hypen.ts +0 -556
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ bun add @hypen-space/core @hypen-space/web
|
|
|
15
15
|
The simplest way to use Hypen in the browser:
|
|
16
16
|
|
|
17
17
|
```typescript
|
|
18
|
-
import { render } from "@hypen-space/web";
|
|
18
|
+
import { render } from "@hypen-space/web-engine";
|
|
19
19
|
|
|
20
20
|
// Auto-discovers and loads components from ./src/components
|
|
21
21
|
await render("HomePage", "#app");
|
|
@@ -24,7 +24,7 @@ await render("HomePage", "#app");
|
|
|
24
24
|
### With Explicit Configuration
|
|
25
25
|
|
|
26
26
|
```typescript
|
|
27
|
-
import { Hypen } from "@hypen-space/web";
|
|
27
|
+
import { Hypen } from "@hypen-space/web-engine";
|
|
28
28
|
|
|
29
29
|
const hypen = new Hypen({
|
|
30
30
|
componentsDir: "./src/components",
|
|
@@ -86,7 +86,7 @@ export default app
|
|
|
86
86
|
## Hypen Class API
|
|
87
87
|
|
|
88
88
|
```typescript
|
|
89
|
-
import { Hypen } from "@hypen-space/web";
|
|
89
|
+
import { Hypen } from "@hypen-space/web-engine";
|
|
90
90
|
|
|
91
91
|
const hypen = new Hypen({
|
|
92
92
|
componentsDir: "./src/components", // Default
|
|
@@ -130,7 +130,8 @@ await hypen.unmount();
|
|
|
130
130
|
For custom integrations:
|
|
131
131
|
|
|
132
132
|
```typescript
|
|
133
|
-
import {
|
|
133
|
+
import { app } from "@hypen-space/core";
|
|
134
|
+
import { Engine } from "@hypen-space/web-engine";
|
|
134
135
|
import { DOMRenderer } from "@hypen-space/web";
|
|
135
136
|
|
|
136
137
|
const engine = new Engine();
|
|
@@ -282,10 +283,10 @@ remote.dispatchAction("login", { user: "admin" });
|
|
|
282
283
|
|
|
283
284
|
| Export | Description |
|
|
284
285
|
|--------|-------------|
|
|
285
|
-
| `@hypen-space/web` | Main -
|
|
286
|
-
| `@hypen-space/web/hypen` | High-level Hypen class |
|
|
286
|
+
| `@hypen-space/web` | Main - DOMRenderer, CanvasRenderer, ComponentRegistry, ApplicatorRegistry |
|
|
287
287
|
| `@hypen-space/web/dom` | DOM renderer and utilities |
|
|
288
288
|
| `@hypen-space/web/canvas` | Canvas renderer |
|
|
289
|
+
| `@hypen-space/web-engine` | Hypen orchestrator, render, renderWithComponents, Engine (browser) |
|
|
289
290
|
|
|
290
291
|
## Requirements
|
|
291
292
|
|
|
@@ -1,187 +1,187 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
enumerable: true,
|
|
34
|
-
configurable: true,
|
|
35
|
-
set: __exportSetter.bind(all, name)
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
39
|
-
|
|
40
|
-
// src/canvas/accessibility.ts
|
|
41
|
-
class AccessibilityLayer {
|
|
42
|
-
shadowRoot;
|
|
43
|
-
nodeMap = new Map;
|
|
44
|
-
enabled;
|
|
45
|
-
constructor(container, enabled = true) {
|
|
46
|
-
this.enabled = enabled && typeof document !== "undefined";
|
|
47
|
-
if (this.enabled && typeof document !== "undefined") {
|
|
48
|
-
this.shadowRoot = document.createElement("div");
|
|
49
|
-
this.shadowRoot.setAttribute("role", "application");
|
|
50
|
-
this.shadowRoot.setAttribute("aria-label", "Hypen Canvas Application");
|
|
51
|
-
this.shadowRoot.style.position = "absolute";
|
|
52
|
-
this.shadowRoot.style.left = "-9999px";
|
|
53
|
-
this.shadowRoot.style.width = "1px";
|
|
54
|
-
this.shadowRoot.style.height = "1px";
|
|
55
|
-
this.shadowRoot.style.overflow = "hidden";
|
|
56
|
-
if (container) {
|
|
57
|
-
container.appendChild(this.shadowRoot);
|
|
58
|
-
}
|
|
59
|
-
} else {
|
|
60
|
-
this.shadowRoot = {};
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility Layer
|
|
3
|
+
*
|
|
4
|
+
* Maintain shadow DOM for screen readers
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Accessibility Manager
|
|
8
|
+
*/
|
|
9
|
+
export class AccessibilityLayer {
|
|
10
|
+
shadowRoot;
|
|
11
|
+
nodeMap = new Map();
|
|
12
|
+
enabled;
|
|
13
|
+
constructor(container, enabled = true) {
|
|
14
|
+
this.enabled = enabled && typeof document !== "undefined";
|
|
15
|
+
// Create shadow root container (only in browser)
|
|
16
|
+
if (this.enabled && typeof document !== "undefined") {
|
|
17
|
+
this.shadowRoot = document.createElement("div");
|
|
18
|
+
this.shadowRoot.setAttribute("role", "application");
|
|
19
|
+
this.shadowRoot.setAttribute("aria-label", "Hypen Canvas Application");
|
|
20
|
+
this.shadowRoot.style.position = "absolute";
|
|
21
|
+
this.shadowRoot.style.left = "-9999px";
|
|
22
|
+
this.shadowRoot.style.width = "1px";
|
|
23
|
+
this.shadowRoot.style.height = "1px";
|
|
24
|
+
this.shadowRoot.style.overflow = "hidden";
|
|
25
|
+
if (container) {
|
|
26
|
+
container.appendChild(this.shadowRoot);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Fallback for non-browser environments
|
|
31
|
+
this.shadowRoot = {};
|
|
32
|
+
}
|
|
61
33
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Sync shadow DOM with virtual tree
|
|
36
|
+
*/
|
|
37
|
+
syncTree(root) {
|
|
38
|
+
if (!this.enabled)
|
|
39
|
+
return;
|
|
40
|
+
// Clear existing
|
|
41
|
+
this.shadowRoot.innerHTML = "";
|
|
42
|
+
this.nodeMap.clear();
|
|
43
|
+
// Build shadow DOM
|
|
44
|
+
const shadowNode = this.createShadowNode(root);
|
|
45
|
+
if (shadowNode) {
|
|
46
|
+
this.shadowRoot.appendChild(shadowNode);
|
|
47
|
+
}
|
|
71
48
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Create shadow DOM element for virtual node
|
|
51
|
+
*/
|
|
52
|
+
createShadowNode(node) {
|
|
53
|
+
if (!node.visible)
|
|
54
|
+
return null;
|
|
55
|
+
let element;
|
|
56
|
+
// Create appropriate HTML element
|
|
57
|
+
switch (node.type.toLowerCase()) {
|
|
58
|
+
case "button":
|
|
59
|
+
element = document.createElement("button");
|
|
60
|
+
element.textContent = this.getNodeText(node);
|
|
61
|
+
if (node.props.onclick) {
|
|
62
|
+
element.setAttribute("aria-label", "Clickable button");
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
case "input":
|
|
66
|
+
element = document.createElement("input");
|
|
67
|
+
element.type = node.props.type || "text";
|
|
68
|
+
element.value = node.props.value || "";
|
|
69
|
+
if (node.props.placeholder) {
|
|
70
|
+
element.placeholder = node.props.placeholder;
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case "textarea":
|
|
74
|
+
element = document.createElement("textarea");
|
|
75
|
+
element.value = node.props.value || "";
|
|
76
|
+
if (node.props.placeholder) {
|
|
77
|
+
element.placeholder = node.props.placeholder;
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case "image":
|
|
81
|
+
element = document.createElement("img");
|
|
82
|
+
element.src = node.props.src || "";
|
|
83
|
+
element.alt = node.props.alt || "Image";
|
|
84
|
+
break;
|
|
85
|
+
case "text":
|
|
86
|
+
element = document.createElement("span");
|
|
87
|
+
element.textContent = String(node.props[0] || node.props.text || "");
|
|
88
|
+
break;
|
|
89
|
+
case "column":
|
|
90
|
+
case "row":
|
|
91
|
+
case "container":
|
|
92
|
+
case "box":
|
|
93
|
+
element = document.createElement("div");
|
|
94
|
+
element.setAttribute("role", node.type === "column" ? "group" : "group");
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
element = document.createElement("div");
|
|
83
98
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
element.value = node.props.value || "";
|
|
89
|
-
if (node.props.placeholder) {
|
|
90
|
-
element.placeholder = node.props.placeholder;
|
|
99
|
+
// Set common attributes
|
|
100
|
+
element.setAttribute("data-hypen-id", node.id);
|
|
101
|
+
if (node.props["aria-label"]) {
|
|
102
|
+
element.setAttribute("aria-label", node.props["aria-label"]);
|
|
91
103
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
element = document.createElement("textarea");
|
|
95
|
-
element.value = node.props.value || "";
|
|
96
|
-
if (node.props.placeholder) {
|
|
97
|
-
element.placeholder = node.props.placeholder;
|
|
104
|
+
if (node.focusable) {
|
|
105
|
+
element.tabIndex = 0;
|
|
98
106
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
case "column":
|
|
110
|
-
case "row":
|
|
111
|
-
case "container":
|
|
112
|
-
case "box":
|
|
113
|
-
element = document.createElement("div");
|
|
114
|
-
element.setAttribute("role", node.type === "column" ? "group" : "group");
|
|
115
|
-
break;
|
|
116
|
-
default:
|
|
117
|
-
element = document.createElement("div");
|
|
118
|
-
}
|
|
119
|
-
element.setAttribute("data-hypen-id", node.id);
|
|
120
|
-
if (node.props["aria-label"]) {
|
|
121
|
-
element.setAttribute("aria-label", node.props["aria-label"]);
|
|
122
|
-
}
|
|
123
|
-
if (node.focusable) {
|
|
124
|
-
element.tabIndex = 0;
|
|
125
|
-
}
|
|
126
|
-
this.nodeMap.set(node.id, element);
|
|
127
|
-
for (const child of node.children) {
|
|
128
|
-
const childElement = this.createShadowNode(child);
|
|
129
|
-
if (childElement) {
|
|
130
|
-
element.appendChild(childElement);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return element;
|
|
134
|
-
}
|
|
135
|
-
getNodeText(node) {
|
|
136
|
-
if (node.type === "text") {
|
|
137
|
-
return String(node.props[0] || node.props.text || "");
|
|
107
|
+
// Store mapping
|
|
108
|
+
this.nodeMap.set(node.id, element);
|
|
109
|
+
// Add children
|
|
110
|
+
for (const child of node.children) {
|
|
111
|
+
const childElement = this.createShadowNode(child);
|
|
112
|
+
if (childElement) {
|
|
113
|
+
element.appendChild(childElement);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return element;
|
|
138
117
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Get text content from node tree
|
|
120
|
+
*/
|
|
121
|
+
getNodeText(node) {
|
|
122
|
+
if (node.type === "text") {
|
|
123
|
+
return String(node.props[0] || node.props.text || "");
|
|
124
|
+
}
|
|
125
|
+
let text = "";
|
|
126
|
+
for (const child of node.children) {
|
|
127
|
+
text += this.getNodeText(child);
|
|
128
|
+
}
|
|
129
|
+
return text;
|
|
142
130
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
131
|
+
/**
|
|
132
|
+
* Focus node in shadow DOM
|
|
133
|
+
*/
|
|
134
|
+
focusNode(nodeId) {
|
|
135
|
+
if (!this.enabled)
|
|
136
|
+
return;
|
|
137
|
+
const element = this.nodeMap.get(nodeId);
|
|
138
|
+
if (element) {
|
|
139
|
+
element.focus();
|
|
140
|
+
}
|
|
151
141
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Update single node
|
|
144
|
+
*/
|
|
145
|
+
updateNode(node) {
|
|
146
|
+
if (!this.enabled)
|
|
147
|
+
return;
|
|
148
|
+
const element = this.nodeMap.get(node.id);
|
|
149
|
+
if (!element)
|
|
150
|
+
return;
|
|
151
|
+
// Update text content
|
|
152
|
+
if (node.type === "text") {
|
|
153
|
+
element.textContent = String(node.props[0] || node.props.text || "");
|
|
154
|
+
}
|
|
155
|
+
// Update input value
|
|
156
|
+
if (node.type === "input" || node.type === "textarea") {
|
|
157
|
+
element.value = node.props.value || "";
|
|
158
|
+
}
|
|
159
|
+
// Update visibility
|
|
160
|
+
element.style.display = node.visible ? "" : "none";
|
|
161
161
|
}
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
/**
|
|
163
|
+
* Get shadow element by node ID
|
|
164
|
+
*/
|
|
165
|
+
getElement(nodeId) {
|
|
166
|
+
return this.nodeMap.get(nodeId);
|
|
164
167
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
this.shadowRoot.remove();
|
|
168
|
+
/**
|
|
169
|
+
* Enable or disable accessibility layer
|
|
170
|
+
*/
|
|
171
|
+
setEnabled(enabled) {
|
|
172
|
+
this.enabled = enabled;
|
|
173
|
+
if (!enabled && this.shadowRoot.parentElement) {
|
|
174
|
+
this.shadowRoot.remove();
|
|
175
|
+
}
|
|
174
176
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Cleanup
|
|
179
|
+
*/
|
|
180
|
+
destroy() {
|
|
181
|
+
if (this.shadowRoot.parentElement) {
|
|
182
|
+
this.shadowRoot.remove();
|
|
183
|
+
}
|
|
184
|
+
this.nodeMap.clear();
|
|
179
185
|
}
|
|
180
|
-
this.nodeMap.clear();
|
|
181
|
-
}
|
|
182
186
|
}
|
|
183
|
-
|
|
184
|
-
AccessibilityLayer
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
//# debugId=9E1B78E02682DBBC64756E2164756E21
|
|
187
|
+
//# sourceMappingURL=accessibility.js.map
|
|
@@ -1,10 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/canvas/accessibility.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * Accessibility Layer\n *\n * Maintain shadow DOM for screen readers\n */\n\nimport type { VirtualNode } from \"./types.js\";\nimport { walkTree } from \"./utils.js\";\n\n/**\n * Accessibility Manager\n */\nexport class AccessibilityLayer {\n private shadowRoot: HTMLElement;\n private nodeMap = new Map<string, HTMLElement>();\n private enabled: boolean;\n\n constructor(container: HTMLElement | null, enabled: boolean = true) {\n this.enabled = enabled && typeof document !== \"undefined\";\n\n // Create shadow root container (only in browser)\n if (this.enabled && typeof document !== \"undefined\") {\n this.shadowRoot = document.createElement(\"div\");\n this.shadowRoot.setAttribute(\"role\", \"application\");\n this.shadowRoot.setAttribute(\"aria-label\", \"Hypen Canvas Application\");\n this.shadowRoot.style.position = \"absolute\";\n this.shadowRoot.style.left = \"-9999px\";\n this.shadowRoot.style.width = \"1px\";\n this.shadowRoot.style.height = \"1px\";\n this.shadowRoot.style.overflow = \"hidden\";\n\n if (container) {\n container.appendChild(this.shadowRoot);\n }\n } else {\n // Fallback for non-browser environments\n this.shadowRoot = {} as HTMLElement;\n }\n }\n\n /**\n * Sync shadow DOM with virtual tree\n */\n syncTree(root: VirtualNode): void {\n if (!this.enabled) return;\n\n // Clear existing\n this.shadowRoot.innerHTML = \"\";\n this.nodeMap.clear();\n\n // Build shadow DOM\n const shadowNode = this.createShadowNode(root);\n if (shadowNode) {\n this.shadowRoot.appendChild(shadowNode);\n }\n }\n\n /**\n * Create shadow DOM element for virtual node\n */\n private createShadowNode(node: VirtualNode): HTMLElement | null {\n if (!node.visible) return null;\n\n let element: HTMLElement;\n\n // Create appropriate HTML element\n switch (node.type.toLowerCase()) {\n case \"button\":\n element = document.createElement(\"button\");\n element.textContent = this.getNodeText(node);\n if (node.props.onclick) {\n element.setAttribute(\"aria-label\", \"Clickable button\");\n }\n break;\n\n case \"input\":\n element = document.createElement(\"input\");\n (element as HTMLInputElement).type = node.props.type || \"text\";\n (element as HTMLInputElement).value = node.props.value || \"\";\n if (node.props.placeholder) {\n (element as HTMLInputElement).placeholder = node.props.placeholder;\n }\n break;\n\n case \"textarea\":\n element = document.createElement(\"textarea\");\n (element as HTMLTextAreaElement).value = node.props.value || \"\";\n if (node.props.placeholder) {\n (element as HTMLTextAreaElement).placeholder = node.props.placeholder;\n }\n break;\n\n case \"image\":\n element = document.createElement(\"img\");\n (element as HTMLImageElement).src = node.props.src || \"\";\n (element as HTMLImageElement).alt = node.props.alt || \"Image\";\n break;\n\n case \"text\":\n element = document.createElement(\"span\");\n element.textContent = String(node.props[0] || node.props.text || \"\");\n break;\n\n case \"column\":\n case \"row\":\n case \"container\":\n case \"box\":\n element = document.createElement(\"div\");\n element.setAttribute(\"role\", node.type === \"column\" ? \"group\" : \"group\");\n break;\n\n default:\n element = document.createElement(\"div\");\n }\n\n // Set common attributes\n element.setAttribute(\"data-hypen-id\", node.id);\n\n if (node.props[\"aria-label\"]) {\n element.setAttribute(\"aria-label\", node.props[\"aria-label\"]);\n }\n\n if (node.focusable) {\n element.tabIndex = 0;\n }\n\n // Store mapping\n this.nodeMap.set(node.id, element);\n\n // Add children\n for (const child of node.children) {\n const childElement = this.createShadowNode(child);\n if (childElement) {\n element.appendChild(childElement);\n }\n }\n\n return element;\n }\n\n /**\n * Get text content from node tree\n */\n private getNodeText(node: VirtualNode): string {\n if (node.type === \"text\") {\n return String(node.props[0] || node.props.text || \"\");\n }\n\n let text = \"\";\n for (const child of node.children) {\n text += this.getNodeText(child);\n }\n return text;\n }\n\n /**\n * Focus node in shadow DOM\n */\n focusNode(nodeId: string): void {\n if (!this.enabled) return;\n\n const element = this.nodeMap.get(nodeId);\n if (element) {\n element.focus();\n }\n }\n\n /**\n * Update single node\n */\n updateNode(node: VirtualNode): void {\n if (!this.enabled) return;\n\n const element = this.nodeMap.get(node.id);\n if (!element) return;\n\n // Update text content\n if (node.type === \"text\") {\n element.textContent = String(node.props[0] || node.props.text || \"\");\n }\n\n // Update input value\n if (node.type === \"input\" || node.type === \"textarea\") {\n (element as HTMLInputElement | HTMLTextAreaElement).value = node.props.value || \"\";\n }\n\n // Update visibility\n element.style.display = node.visible ? \"\" : \"none\";\n }\n\n /**\n * Get shadow element by node ID\n */\n getElement(nodeId: string): HTMLElement | undefined {\n return this.nodeMap.get(nodeId);\n }\n\n /**\n * Enable or disable accessibility layer\n */\n setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n if (!enabled && this.shadowRoot.parentElement) {\n this.shadowRoot.remove();\n }\n }\n\n /**\n * Cleanup\n */\n destroy(): void {\n if (this.shadowRoot.parentElement) {\n this.shadowRoot.remove();\n }\n this.nodeMap.clear();\n }\n}\n\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "9E1B78E02682DBBC64756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
|
1
|
+
{"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../../src/canvas/accessibility.ts"],"names":[],"mappings":"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"}
|