@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,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__esm,
|
|
3
|
+
__export
|
|
4
|
+
} from "../../../chunk-2s02mkzs.js";
|
|
5
|
+
|
|
6
|
+
// src/dom/components/spinner.ts
|
|
7
|
+
var exports_spinner = {};
|
|
8
|
+
__export(exports_spinner, {
|
|
9
|
+
spinnerHandler: () => spinnerHandler
|
|
10
|
+
});
|
|
11
|
+
var spinnerHandler;
|
|
12
|
+
var init_spinner = __esm(() => {
|
|
13
|
+
spinnerHandler = {
|
|
14
|
+
create() {
|
|
15
|
+
const wrapper = document.createElement("div");
|
|
16
|
+
wrapper.dataset.hypenType = "spinner";
|
|
17
|
+
wrapper.style.display = "inline-block";
|
|
18
|
+
const spinner = document.createElement("div");
|
|
19
|
+
spinner.style.width = "40px";
|
|
20
|
+
spinner.style.height = "40px";
|
|
21
|
+
spinner.style.border = "4px solid #f3f3f3";
|
|
22
|
+
spinner.style.borderTop = "4px solid #3498db";
|
|
23
|
+
spinner.style.borderRadius = "50%";
|
|
24
|
+
spinner.style.animation = "spin 1s linear infinite";
|
|
25
|
+
const style = document.createElement("style");
|
|
26
|
+
style.textContent = `
|
|
27
|
+
@keyframes spin {
|
|
28
|
+
0% { transform: rotate(0deg); }
|
|
29
|
+
100% { transform: rotate(360deg); }
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
wrapper.appendChild(style);
|
|
33
|
+
wrapper.appendChild(spinner);
|
|
34
|
+
return wrapper;
|
|
35
|
+
},
|
|
36
|
+
applyProps(el, props) {
|
|
37
|
+
const spinner = el.querySelector("div:not(style)");
|
|
38
|
+
if (!spinner)
|
|
39
|
+
return;
|
|
40
|
+
if (props.size !== undefined) {
|
|
41
|
+
const size = String(props.size);
|
|
42
|
+
const sizeMap = {
|
|
43
|
+
small: "24px",
|
|
44
|
+
medium: "40px",
|
|
45
|
+
large: "60px"
|
|
46
|
+
};
|
|
47
|
+
const actualSize = sizeMap[size] || size;
|
|
48
|
+
spinner.style.width = actualSize;
|
|
49
|
+
spinner.style.height = actualSize;
|
|
50
|
+
}
|
|
51
|
+
if (props.color !== undefined) {
|
|
52
|
+
spinner.style.borderTopColor = String(props.color);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
init_spinner();
|
|
58
|
+
|
|
59
|
+
export {
|
|
60
|
+
spinnerHandler
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export { exports_spinner, init_spinner };
|
|
64
|
+
|
|
65
|
+
//# debugId=987AF8881D430E7C64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/components/spinner.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Spinner Component (Loading Indicator)\n */\n\nimport type { ComponentHandler } from \"./index.js\";\n\nexport const spinnerHandler: ComponentHandler = {\n create(): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.dataset.hypenType = \"spinner\";\n wrapper.style.display = \"inline-block\";\n\n const spinner = document.createElement(\"div\");\n spinner.style.width = \"40px\";\n spinner.style.height = \"40px\";\n spinner.style.border = \"4px solid #f3f3f3\";\n spinner.style.borderTop = \"4px solid #3498db\";\n spinner.style.borderRadius = \"50%\";\n spinner.style.animation = \"spin 1s linear infinite\";\n\n // Add keyframe animation\n const style = document.createElement(\"style\");\n style.textContent = `\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `;\n \n wrapper.appendChild(style);\n wrapper.appendChild(spinner);\n \n return wrapper;\n },\n\n applyProps(el: HTMLElement, props: Record<string, any>): void {\n const spinner = el.querySelector(\"div:not(style)\") as HTMLElement;\n if (!spinner) return;\n\n // Size\n if (props.size !== undefined) {\n const size = String(props.size);\n const sizeMap: Record<string, string> = {\n small: \"24px\",\n medium: \"40px\",\n large: \"60px\",\n };\n const actualSize = sizeMap[size] || size;\n spinner.style.width = actualSize;\n spinner.style.height = actualSize;\n }\n\n // Color\n if (props.color !== undefined) {\n spinner.style.borderTopColor = String(props.color);\n }\n },\n};\n\n\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;IAMa;AAAA;AAAA,mBAAmC;AAAA,IAC9C,MAAM,GAAgB;AAAA,MACpB,MAAM,UAAU,SAAS,cAAc,KAAK;AAAA,MAC5C,QAAQ,QAAQ,YAAY;AAAA,MAC5B,QAAQ,MAAM,UAAU;AAAA,MAExB,MAAM,UAAU,SAAS,cAAc,KAAK;AAAA,MAC5C,QAAQ,MAAM,QAAQ;AAAA,MACtB,QAAQ,MAAM,SAAS;AAAA,MACvB,QAAQ,MAAM,SAAS;AAAA,MACvB,QAAQ,MAAM,YAAY;AAAA,MAC1B,QAAQ,MAAM,eAAe;AAAA,MAC7B,QAAQ,MAAM,YAAY;AAAA,MAG1B,MAAM,QAAQ,SAAS,cAAc,OAAO;AAAA,MAC5C,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOpB,QAAQ,YAAY,KAAK;AAAA,MACzB,QAAQ,YAAY,OAAO;AAAA,MAE3B,OAAO;AAAA;AAAA,IAGT,UAAU,CAAC,IAAiB,OAAkC;AAAA,MAC5D,MAAM,UAAU,GAAG,cAAc,gBAAgB;AAAA,MACjD,IAAI,CAAC;AAAA,QAAS;AAAA,MAGd,IAAI,MAAM,SAAS,WAAW;AAAA,QAC5B,MAAM,OAAO,OAAO,MAAM,IAAI;AAAA,QAC9B,MAAM,UAAkC;AAAA,UACtC,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO;AAAA,QACT;AAAA,QACA,MAAM,aAAa,QAAQ,SAAS;AAAA,QACpC,QAAQ,MAAM,QAAQ;AAAA,QACtB,QAAQ,MAAM,SAAS;AAAA,MACzB;AAAA,MAGA,IAAI,MAAM,UAAU,WAAW;AAAA,QAC7B,QAAQ,MAAM,iBAAiB,OAAO,MAAM,KAAK;AAAA,MACnD;AAAA;AAAA,EAEJ;AAAA;",
|
|
8
|
+
"debugId": "987AF8881D430E7C64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__esm,
|
|
3
|
+
__export
|
|
4
|
+
} from "../../../chunk-2s02mkzs.js";
|
|
5
|
+
|
|
6
|
+
// src/dom/components/stack.ts
|
|
7
|
+
var exports_stack = {};
|
|
8
|
+
__export(exports_stack, {
|
|
9
|
+
stackHandler: () => stackHandler
|
|
10
|
+
});
|
|
11
|
+
var stackHandler;
|
|
12
|
+
var init_stack = __esm(() => {
|
|
13
|
+
stackHandler = {
|
|
14
|
+
create() {
|
|
15
|
+
const el = document.createElement("div");
|
|
16
|
+
el.style.position = "relative";
|
|
17
|
+
el.style.display = "flex";
|
|
18
|
+
el.dataset.hypenType = "stack";
|
|
19
|
+
const style = document.createElement("style");
|
|
20
|
+
style.textContent = `
|
|
21
|
+
[data-hypen-type="stack"] > * {
|
|
22
|
+
position: absolute;
|
|
23
|
+
top: 0;
|
|
24
|
+
left: 0;
|
|
25
|
+
width: 100%;
|
|
26
|
+
height: 100%;
|
|
27
|
+
}
|
|
28
|
+
[data-hypen-type="stack"] > *:first-child {
|
|
29
|
+
position: relative;
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
el.appendChild(style);
|
|
33
|
+
return el;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
init_stack();
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
stackHandler
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export { exports_stack, init_stack };
|
|
44
|
+
|
|
45
|
+
//# debugId=510A0720567209A064756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/components/stack.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Stack Component - Overlaying elements with absolute positioning\n */\n\nimport type { ComponentHandler } from \"./index.js\";\n\nexport const stackHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"div\");\n el.style.position = \"relative\";\n el.style.display = \"flex\";\n el.dataset.hypenType = \"stack\";\n \n // Children will be absolutely positioned\n const style = document.createElement(\"style\");\n style.textContent = `\n [data-hypen-type=\"stack\"] > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n [data-hypen-type=\"stack\"] > *:first-child {\n position: relative;\n }\n `;\n el.appendChild(style);\n \n return el;\n },\n};\n\n\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;IAMa;AAAA;AAAA,iBAAiC;AAAA,IAC5C,MAAM,GAAgB;AAAA,MACpB,MAAM,KAAK,SAAS,cAAc,KAAK;AAAA,MACvC,GAAG,MAAM,WAAW;AAAA,MACpB,GAAG,MAAM,UAAU;AAAA,MACnB,GAAG,QAAQ,YAAY;AAAA,MAGvB,MAAM,QAAQ,SAAS,cAAc,OAAO;AAAA,MAC5C,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYpB,GAAG,YAAY,KAAK;AAAA,MAEpB,OAAO;AAAA;AAAA,EAEX;AAAA;",
|
|
8
|
+
"debugId": "510A0720567209A064756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__esm,
|
|
3
|
+
__export
|
|
4
|
+
} from "../../../chunk-2s02mkzs.js";
|
|
5
|
+
|
|
6
|
+
// src/dom/components/switch.ts
|
|
7
|
+
var exports_switch = {};
|
|
8
|
+
__export(exports_switch, {
|
|
9
|
+
switchHandler: () => switchHandler
|
|
10
|
+
});
|
|
11
|
+
var switchHandler;
|
|
12
|
+
var init_switch = __esm(() => {
|
|
13
|
+
switchHandler = {
|
|
14
|
+
create() {
|
|
15
|
+
const wrapper = document.createElement("label");
|
|
16
|
+
wrapper.dataset.hypenType = "switch";
|
|
17
|
+
wrapper.style.display = "inline-flex";
|
|
18
|
+
wrapper.style.alignItems = "center";
|
|
19
|
+
wrapper.style.gap = "8px";
|
|
20
|
+
wrapper.style.cursor = "pointer";
|
|
21
|
+
const input = document.createElement("input");
|
|
22
|
+
input.type = "checkbox";
|
|
23
|
+
input.dataset.hypenSwitch = "true";
|
|
24
|
+
input.style.appearance = "none";
|
|
25
|
+
input.style.width = "44px";
|
|
26
|
+
input.style.height = "24px";
|
|
27
|
+
input.style.backgroundColor = "#ccc";
|
|
28
|
+
input.style.borderRadius = "12px";
|
|
29
|
+
input.style.position = "relative";
|
|
30
|
+
input.style.cursor = "pointer";
|
|
31
|
+
input.style.transition = "background-color 0.2s";
|
|
32
|
+
const style = document.createElement("style");
|
|
33
|
+
style.textContent = `
|
|
34
|
+
input[data-hypen-switch="true"]::before {
|
|
35
|
+
content: "";
|
|
36
|
+
position: absolute;
|
|
37
|
+
width: 20px;
|
|
38
|
+
height: 20px;
|
|
39
|
+
background-color: white;
|
|
40
|
+
border-radius: 50%;
|
|
41
|
+
top: 2px;
|
|
42
|
+
left: 2px;
|
|
43
|
+
transition: transform 0.2s;
|
|
44
|
+
}
|
|
45
|
+
input[data-hypen-switch="true"]:checked {
|
|
46
|
+
background-color: #4CAF50;
|
|
47
|
+
}
|
|
48
|
+
input[data-hypen-switch="true"]:checked::before {
|
|
49
|
+
transform: translateX(20px);
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
wrapper.appendChild(style);
|
|
53
|
+
wrapper.appendChild(input);
|
|
54
|
+
return wrapper;
|
|
55
|
+
},
|
|
56
|
+
applyProps(el, props) {
|
|
57
|
+
const input = el.querySelector('input[type="checkbox"]');
|
|
58
|
+
if (!input)
|
|
59
|
+
return;
|
|
60
|
+
if (props.on !== undefined) {
|
|
61
|
+
input.checked = Boolean(props.on);
|
|
62
|
+
}
|
|
63
|
+
if (props.disabled !== undefined) {
|
|
64
|
+
input.disabled = Boolean(props.disabled);
|
|
65
|
+
}
|
|
66
|
+
const label = props["0"] || props.label;
|
|
67
|
+
if (label !== undefined) {
|
|
68
|
+
const textNodes = Array.from(el.childNodes).filter((node) => node.nodeType === Node.TEXT_NODE);
|
|
69
|
+
textNodes.forEach((node) => node.remove());
|
|
70
|
+
el.appendChild(document.createTextNode(String(label)));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
init_switch();
|
|
76
|
+
|
|
77
|
+
export {
|
|
78
|
+
switchHandler
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export { exports_switch, init_switch };
|
|
82
|
+
|
|
83
|
+
//# debugId=B4AB93576BC53A9764756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/components/switch.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Switch Component (Toggle)\n */\n\nimport type { ComponentHandler } from \"./index.js\";\n\nexport const switchHandler: ComponentHandler = {\n create(): HTMLElement {\n const wrapper = document.createElement(\"label\");\n wrapper.dataset.hypenType = \"switch\";\n wrapper.style.display = \"inline-flex\";\n wrapper.style.alignItems = \"center\";\n wrapper.style.gap = \"8px\";\n wrapper.style.cursor = \"pointer\";\n\n const input = document.createElement(\"input\");\n input.type = \"checkbox\";\n input.dataset.hypenSwitch = \"true\";\n \n // Style the switch\n input.style.appearance = \"none\";\n input.style.width = \"44px\";\n input.style.height = \"24px\";\n input.style.backgroundColor = \"#ccc\";\n input.style.borderRadius = \"12px\";\n input.style.position = \"relative\";\n input.style.cursor = \"pointer\";\n input.style.transition = \"background-color 0.2s\";\n \n // Add pseudo-element styling via CSS\n const style = document.createElement(\"style\");\n style.textContent = `\n input[data-hypen-switch=\"true\"]::before {\n content: \"\";\n position: absolute;\n width: 20px;\n height: 20px;\n background-color: white;\n border-radius: 50%;\n top: 2px;\n left: 2px;\n transition: transform 0.2s;\n }\n input[data-hypen-switch=\"true\"]:checked {\n background-color: #4CAF50;\n }\n input[data-hypen-switch=\"true\"]:checked::before {\n transform: translateX(20px);\n }\n `;\n wrapper.appendChild(style);\n wrapper.appendChild(input);\n \n return wrapper;\n },\n\n applyProps(el: HTMLElement, props: Record<string, any>): void {\n const input = el.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\n if (!input) return;\n\n // On state (checked)\n if (props.on !== undefined) {\n input.checked = Boolean(props.on);\n }\n\n // Disabled\n if (props.disabled !== undefined) {\n input.disabled = Boolean(props.disabled);\n }\n\n // Label text\n const label = props[\"0\"] || props.label;\n if (label !== undefined) {\n // Remove existing text node if any\n const textNodes = Array.from(el.childNodes).filter(\n node => node.nodeType === Node.TEXT_NODE\n );\n textNodes.forEach(node => node.remove());\n \n // Add new label text\n el.appendChild(document.createTextNode(String(label)));\n }\n },\n};\n\n\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;IAMa;AAAA;AAAA,kBAAkC;AAAA,IAC7C,MAAM,GAAgB;AAAA,MACpB,MAAM,UAAU,SAAS,cAAc,OAAO;AAAA,MAC9C,QAAQ,QAAQ,YAAY;AAAA,MAC5B,QAAQ,MAAM,UAAU;AAAA,MACxB,QAAQ,MAAM,aAAa;AAAA,MAC3B,QAAQ,MAAM,MAAM;AAAA,MACpB,QAAQ,MAAM,SAAS;AAAA,MAEvB,MAAM,QAAQ,SAAS,cAAc,OAAO;AAAA,MAC5C,MAAM,OAAO;AAAA,MACb,MAAM,QAAQ,cAAc;AAAA,MAG5B,MAAM,MAAM,aAAa;AAAA,MACzB,MAAM,MAAM,QAAQ;AAAA,MACpB,MAAM,MAAM,SAAS;AAAA,MACrB,MAAM,MAAM,kBAAkB;AAAA,MAC9B,MAAM,MAAM,eAAe;AAAA,MAC3B,MAAM,MAAM,WAAW;AAAA,MACvB,MAAM,MAAM,SAAS;AAAA,MACrB,MAAM,MAAM,aAAa;AAAA,MAGzB,MAAM,QAAQ,SAAS,cAAc,OAAO;AAAA,MAC5C,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAmBpB,QAAQ,YAAY,KAAK;AAAA,MACzB,QAAQ,YAAY,KAAK;AAAA,MAEzB,OAAO;AAAA;AAAA,IAGT,UAAU,CAAC,IAAiB,OAAkC;AAAA,MAC5D,MAAM,QAAQ,GAAG,cAAc,wBAAwB;AAAA,MACvD,IAAI,CAAC;AAAA,QAAO;AAAA,MAGZ,IAAI,MAAM,OAAO,WAAW;AAAA,QAC1B,MAAM,UAAU,QAAQ,MAAM,EAAE;AAAA,MAClC;AAAA,MAGA,IAAI,MAAM,aAAa,WAAW;AAAA,QAChC,MAAM,WAAW,QAAQ,MAAM,QAAQ;AAAA,MACzC;AAAA,MAGA,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,MAClC,IAAI,UAAU,WAAW;AAAA,QAEvB,MAAM,YAAY,MAAM,KAAK,GAAG,UAAU,EAAE,OAC1C,UAAQ,KAAK,aAAa,KAAK,SACjC;AAAA,QACA,UAAU,QAAQ,UAAQ,KAAK,OAAO,CAAC;AAAA,QAGvC,GAAG,YAAY,SAAS,eAAe,OAAO,KAAK,CAAC,CAAC;AAAA,MACvD;AAAA;AAAA,EAEJ;AAAA;",
|
|
8
|
+
"debugId": "B4AB93576BC53A9764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__esm,
|
|
3
|
+
__export
|
|
4
|
+
} from "../../../chunk-2s02mkzs.js";
|
|
5
|
+
|
|
6
|
+
// src/dom/components/text.ts
|
|
7
|
+
var exports_text = {};
|
|
8
|
+
__export(exports_text, {
|
|
9
|
+
textHandler: () => textHandler
|
|
10
|
+
});
|
|
11
|
+
var textHandler;
|
|
12
|
+
var init_text = __esm(() => {
|
|
13
|
+
textHandler = {
|
|
14
|
+
create() {
|
|
15
|
+
const el = document.createElement("span");
|
|
16
|
+
el.style.display = "inline-block";
|
|
17
|
+
el.dataset.hypenType = "text";
|
|
18
|
+
return el;
|
|
19
|
+
},
|
|
20
|
+
applyProps(el, props) {
|
|
21
|
+
const text = props["0"] || props.text;
|
|
22
|
+
if (text !== undefined) {
|
|
23
|
+
el.dataset.textTemplate = String(text);
|
|
24
|
+
el.textContent = String(text);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
init_text();
|
|
30
|
+
|
|
31
|
+
export {
|
|
32
|
+
textHandler
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export { exports_text, init_text };
|
|
36
|
+
|
|
37
|
+
//# debugId=466D402610A8412464756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/components/text.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Text Component\n */\n\nimport type { ComponentHandler } from \"./index.js\";\n\nexport const textHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"span\");\n el.style.display = \"inline-block\";\n el.dataset.hypenType = \"text\";\n return el;\n },\n\n applyProps(el: HTMLElement, props: Record<string, any>): void {\n // Text content from first positional arg or \"text\" prop\n const text = props[\"0\"] || props.text;\n if (text !== undefined) {\n // Store the original text template for state interpolation\n el.dataset.textTemplate = String(text);\n el.textContent = String(text);\n }\n },\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;IAMa;AAAA;AAAA,gBAAgC;AAAA,IAC3C,MAAM,GAAgB;AAAA,MACpB,MAAM,KAAK,SAAS,cAAc,MAAM;AAAA,MACxC,GAAG,MAAM,UAAU;AAAA,MACnB,GAAG,QAAQ,YAAY;AAAA,MACvB,OAAO;AAAA;AAAA,IAGT,UAAU,CAAC,IAAiB,OAAkC;AAAA,MAE5D,MAAM,OAAO,MAAM,QAAQ,MAAM;AAAA,MACjC,IAAI,SAAS,WAAW;AAAA,QAEtB,GAAG,QAAQ,eAAe,OAAO,IAAI;AAAA,QACrC,GAAG,cAAc,OAAO,IAAI;AAAA,MAC9B;AAAA;AAAA,EAEJ;AAAA;",
|
|
8
|
+
"debugId": "466D402610A8412464756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__esm,
|
|
3
|
+
__export
|
|
4
|
+
} from "../../../chunk-2s02mkzs.js";
|
|
5
|
+
|
|
6
|
+
// src/dom/components/textarea.ts
|
|
7
|
+
var exports_textarea = {};
|
|
8
|
+
__export(exports_textarea, {
|
|
9
|
+
textareaHandler: () => textareaHandler
|
|
10
|
+
});
|
|
11
|
+
var textareaHandler;
|
|
12
|
+
var init_textarea = __esm(() => {
|
|
13
|
+
textareaHandler = {
|
|
14
|
+
create() {
|
|
15
|
+
const el = document.createElement("textarea");
|
|
16
|
+
el.dataset.hypenType = "textarea";
|
|
17
|
+
return el;
|
|
18
|
+
},
|
|
19
|
+
applyProps(el, props) {
|
|
20
|
+
const textarea = el;
|
|
21
|
+
const value = props["0"] || props.value;
|
|
22
|
+
if (value !== undefined) {
|
|
23
|
+
textarea.value = String(value);
|
|
24
|
+
}
|
|
25
|
+
if (props.placeholder !== undefined) {
|
|
26
|
+
textarea.placeholder = String(props.placeholder);
|
|
27
|
+
}
|
|
28
|
+
if (props.rows !== undefined) {
|
|
29
|
+
textarea.rows = Number(props.rows);
|
|
30
|
+
}
|
|
31
|
+
if (props.cols !== undefined) {
|
|
32
|
+
textarea.cols = Number(props.cols);
|
|
33
|
+
}
|
|
34
|
+
if (props.disabled !== undefined) {
|
|
35
|
+
textarea.disabled = Boolean(props.disabled);
|
|
36
|
+
}
|
|
37
|
+
if (props.readonly !== undefined) {
|
|
38
|
+
textarea.readOnly = Boolean(props.readonly);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
init_textarea();
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
textareaHandler
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { exports_textarea, init_textarea };
|
|
50
|
+
|
|
51
|
+
//# debugId=B996CFFF10E4788064756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/components/textarea.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Textarea Component\n */\n\nimport type { ComponentHandler } from \"./index.js\";\n\nexport const textareaHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"textarea\");\n el.dataset.hypenType = \"textarea\";\n return el as any as HTMLElement;\n },\n\n applyProps(el: HTMLElement, props: Record<string, any>): void {\n const textarea = el as HTMLTextAreaElement;\n\n // Value property\n const value = props[\"0\"] || props.value;\n if (value !== undefined) {\n textarea.value = String(value);\n }\n\n // Placeholder\n if (props.placeholder !== undefined) {\n textarea.placeholder = String(props.placeholder);\n }\n\n // Rows\n if (props.rows !== undefined) {\n textarea.rows = Number(props.rows);\n }\n\n // Cols\n if (props.cols !== undefined) {\n textarea.cols = Number(props.cols);\n }\n\n // Disabled\n if (props.disabled !== undefined) {\n textarea.disabled = Boolean(props.disabled);\n }\n\n // Readonly\n if (props.readonly !== undefined) {\n textarea.readOnly = Boolean(props.readonly);\n }\n },\n};\n\n\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;IAMa;AAAA;AAAA,oBAAoC;AAAA,IAC/C,MAAM,GAAgB;AAAA,MACpB,MAAM,KAAK,SAAS,cAAc,UAAU;AAAA,MAC5C,GAAG,QAAQ,YAAY;AAAA,MACvB,OAAO;AAAA;AAAA,IAGT,UAAU,CAAC,IAAiB,OAAkC;AAAA,MAC5D,MAAM,WAAW;AAAA,MAGjB,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,MAClC,IAAI,UAAU,WAAW;AAAA,QACvB,SAAS,QAAQ,OAAO,KAAK;AAAA,MAC/B;AAAA,MAGA,IAAI,MAAM,gBAAgB,WAAW;AAAA,QACnC,SAAS,cAAc,OAAO,MAAM,WAAW;AAAA,MACjD;AAAA,MAGA,IAAI,MAAM,SAAS,WAAW;AAAA,QAC5B,SAAS,OAAO,OAAO,MAAM,IAAI;AAAA,MACnC;AAAA,MAGA,IAAI,MAAM,SAAS,WAAW;AAAA,QAC5B,SAAS,OAAO,OAAO,MAAM,IAAI;AAAA,MACnC;AAAA,MAGA,IAAI,MAAM,aAAa,WAAW;AAAA,QAChC,SAAS,WAAW,QAAQ,MAAM,QAAQ;AAAA,MAC5C;AAAA,MAGA,IAAI,MAAM,aAAa,WAAW;AAAA,QAChC,SAAS,WAAW,QAAQ,MAAM,QAAQ;AAAA,MAC5C;AAAA;AAAA,EAEJ;AAAA;",
|
|
8
|
+
"debugId": "B996CFFF10E4788064756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__esm,
|
|
3
|
+
__export
|
|
4
|
+
} from "../../../chunk-2s02mkzs.js";
|
|
5
|
+
|
|
6
|
+
// src/dom/components/video.ts
|
|
7
|
+
var exports_video = {};
|
|
8
|
+
__export(exports_video, {
|
|
9
|
+
videoHandler: () => videoHandler
|
|
10
|
+
});
|
|
11
|
+
var videoHandler;
|
|
12
|
+
var init_video = __esm(() => {
|
|
13
|
+
videoHandler = {
|
|
14
|
+
create() {
|
|
15
|
+
const el = document.createElement("video");
|
|
16
|
+
el.dataset.hypenType = "video";
|
|
17
|
+
return el;
|
|
18
|
+
},
|
|
19
|
+
applyProps(el, props) {
|
|
20
|
+
const video = el;
|
|
21
|
+
const src = props["0"] || props.src;
|
|
22
|
+
if (src !== undefined) {
|
|
23
|
+
video.src = String(src);
|
|
24
|
+
}
|
|
25
|
+
if (props.controls !== undefined) {
|
|
26
|
+
video.controls = Boolean(props.controls);
|
|
27
|
+
}
|
|
28
|
+
if (props.autoplay !== undefined) {
|
|
29
|
+
video.autoplay = Boolean(props.autoplay);
|
|
30
|
+
}
|
|
31
|
+
if (props.loop !== undefined) {
|
|
32
|
+
video.loop = Boolean(props.loop);
|
|
33
|
+
}
|
|
34
|
+
if (props.muted !== undefined) {
|
|
35
|
+
video.muted = Boolean(props.muted);
|
|
36
|
+
}
|
|
37
|
+
if (props.poster !== undefined) {
|
|
38
|
+
video.poster = String(props.poster);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
init_video();
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
videoHandler
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { exports_video, init_video };
|
|
50
|
+
|
|
51
|
+
//# debugId=7C2DC23C7422692064756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/components/video.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Video Component\n */\n\nimport type { ComponentHandler } from \"./index.js\";\n\nexport const videoHandler: ComponentHandler = {\n create(): HTMLElement {\n const el = document.createElement(\"video\");\n el.dataset.hypenType = \"video\";\n return el as any as HTMLElement;\n },\n\n applyProps(el: HTMLElement, props: Record<string, any>): void {\n const video = el as HTMLVideoElement;\n\n // Source\n const src = props[\"0\"] || props.src;\n if (src !== undefined) {\n video.src = String(src);\n }\n\n // Controls\n if (props.controls !== undefined) {\n video.controls = Boolean(props.controls);\n }\n\n // Autoplay\n if (props.autoplay !== undefined) {\n video.autoplay = Boolean(props.autoplay);\n }\n\n // Loop\n if (props.loop !== undefined) {\n video.loop = Boolean(props.loop);\n }\n\n // Muted\n if (props.muted !== undefined) {\n video.muted = Boolean(props.muted);\n }\n\n // Poster\n if (props.poster !== undefined) {\n video.poster = String(props.poster);\n }\n },\n};\n\n\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;IAMa;AAAA;AAAA,iBAAiC;AAAA,IAC5C,MAAM,GAAgB;AAAA,MACpB,MAAM,KAAK,SAAS,cAAc,OAAO;AAAA,MACzC,GAAG,QAAQ,YAAY;AAAA,MACvB,OAAO;AAAA;AAAA,IAGT,UAAU,CAAC,IAAiB,OAAkC;AAAA,MAC5D,MAAM,QAAQ;AAAA,MAGd,MAAM,MAAM,MAAM,QAAQ,MAAM;AAAA,MAChC,IAAI,QAAQ,WAAW;AAAA,QACrB,MAAM,MAAM,OAAO,GAAG;AAAA,MACxB;AAAA,MAGA,IAAI,MAAM,aAAa,WAAW;AAAA,QAChC,MAAM,WAAW,QAAQ,MAAM,QAAQ;AAAA,MACzC;AAAA,MAGA,IAAI,MAAM,aAAa,WAAW;AAAA,QAChC,MAAM,WAAW,QAAQ,MAAM,QAAQ;AAAA,MACzC;AAAA,MAGA,IAAI,MAAM,SAAS,WAAW;AAAA,QAC5B,MAAM,OAAO,QAAQ,MAAM,IAAI;AAAA,MACjC;AAAA,MAGA,IAAI,MAAM,UAAU,WAAW;AAAA,QAC7B,MAAM,QAAQ,QAAQ,MAAM,KAAK;AAAA,MACnC;AAAA,MAGA,IAAI,MAAM,WAAW,WAAW;AAAA,QAC9B,MAAM,SAAS,OAAO,MAAM,MAAM;AAAA,MACpC;AAAA;AAAA,EAEJ;AAAA;",
|
|
8
|
+
"debugId": "7C2DC23C7422692064756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import"../../chunk-2s02mkzs.js";
|
|
2
|
+
|
|
3
|
+
// src/dom/debug.ts
|
|
4
|
+
var defaultDebugConfig = {
|
|
5
|
+
enabled: false,
|
|
6
|
+
showHeatmap: true,
|
|
7
|
+
heatmapIncrement: 5,
|
|
8
|
+
maxOpacity: 0.8,
|
|
9
|
+
fadeOutDuration: 2000
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
class RerenderTracker {
|
|
13
|
+
renderCounts = new Map;
|
|
14
|
+
overlays = new Map;
|
|
15
|
+
config;
|
|
16
|
+
constructor(config = defaultDebugConfig) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
}
|
|
19
|
+
setConfig(config) {
|
|
20
|
+
this.config = { ...this.config, ...config };
|
|
21
|
+
if (!this.config.enabled) {
|
|
22
|
+
this.cleanup();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
trackRerender(id, element, patchType) {
|
|
26
|
+
if (!this.config.enabled || !this.config.showHeatmap) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
console.log(`\uD83D\uDD25 [Debug] Tracking re-render: ${id} - ${patchType}`);
|
|
30
|
+
const currentCount = this.renderCounts.get(id) || 0;
|
|
31
|
+
const newCount = currentCount + 1;
|
|
32
|
+
this.renderCounts.set(id, newCount);
|
|
33
|
+
this.updateHeatmap(id, element, newCount, patchType);
|
|
34
|
+
}
|
|
35
|
+
updateHeatmap(id, element, renderCount, patchType) {
|
|
36
|
+
const opacity = Math.min(renderCount * this.config.heatmapIncrement / 100, this.config.maxOpacity);
|
|
37
|
+
console.log(`\uD83D\uDD25 [Debug] Updating heatmap for ${id}, count: ${renderCount}, opacity: ${opacity}`);
|
|
38
|
+
const isInline = window.getComputedStyle(element).display.includes("inline");
|
|
39
|
+
if (isInline || element.tagName === "SPAN") {
|
|
40
|
+
if (!element.dataset.hypenDebugOriginalBg) {
|
|
41
|
+
element.dataset.hypenDebugOriginalBg = element.style.backgroundColor || "";
|
|
42
|
+
element.dataset.hypenDebugOriginalOutline = element.style.outline || "";
|
|
43
|
+
element.dataset.hypenDebugOriginalPosition = element.style.position || "";
|
|
44
|
+
}
|
|
45
|
+
element.style.backgroundColor = `rgba(255, 0, 0, ${Math.max(opacity, 0.15)})`;
|
|
46
|
+
element.style.outline = `2px solid rgba(255, 0, 0, ${Math.max(opacity + 0.2, 0.3)})`;
|
|
47
|
+
element.style.outlineOffset = "2px";
|
|
48
|
+
element.style.position = "relative";
|
|
49
|
+
element.setAttribute("data-hypen-renders", `${renderCount}× ${patchType}`);
|
|
50
|
+
if (!document.getElementById("hypen-debug-styles")) {
|
|
51
|
+
const style = document.createElement("style");
|
|
52
|
+
style.id = "hypen-debug-styles";
|
|
53
|
+
style.textContent = `
|
|
54
|
+
[data-hypen-renders]::before {
|
|
55
|
+
content: attr(data-hypen-renders);
|
|
56
|
+
position: absolute;
|
|
57
|
+
top: -18px;
|
|
58
|
+
left: 0;
|
|
59
|
+
background: rgba(255, 0, 0, 0.9);
|
|
60
|
+
color: white;
|
|
61
|
+
padding: 2px 6px;
|
|
62
|
+
font-size: 10px;
|
|
63
|
+
font-family: 'Courier New', monospace;
|
|
64
|
+
font-weight: bold;
|
|
65
|
+
border-radius: 3px;
|
|
66
|
+
z-index: 999999;
|
|
67
|
+
pointer-events: none;
|
|
68
|
+
white-space: nowrap;
|
|
69
|
+
text-shadow: none;
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
document.head.appendChild(style);
|
|
73
|
+
}
|
|
74
|
+
this.overlays.set(id, element);
|
|
75
|
+
if (this.config.fadeOutDuration > 0) {
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
const originalBg = element.dataset.hypenDebugOriginalBg || "";
|
|
78
|
+
const originalOutline = element.dataset.hypenDebugOriginalOutline || "";
|
|
79
|
+
element.style.backgroundColor = originalBg;
|
|
80
|
+
element.style.outline = originalOutline;
|
|
81
|
+
element.style.opacity = "1";
|
|
82
|
+
}, this.config.fadeOutDuration);
|
|
83
|
+
}
|
|
84
|
+
} else {
|
|
85
|
+
let overlay = this.overlays.get(id);
|
|
86
|
+
if (!overlay) {
|
|
87
|
+
overlay = document.createElement("div");
|
|
88
|
+
overlay.className = "hypen-debug-overlay";
|
|
89
|
+
overlay.style.cssText = `
|
|
90
|
+
position: absolute;
|
|
91
|
+
top: 0;
|
|
92
|
+
left: 0;
|
|
93
|
+
right: 0;
|
|
94
|
+
bottom: 0;
|
|
95
|
+
pointer-events: none;
|
|
96
|
+
z-index: 999999 !important;
|
|
97
|
+
transition: opacity ${this.config.fadeOutDuration}ms ease-out;
|
|
98
|
+
border: 2px solid rgba(255, 0, 0, 0.7) !important;
|
|
99
|
+
box-sizing: border-box;
|
|
100
|
+
font-size: 11px;
|
|
101
|
+
color: white;
|
|
102
|
+
text-shadow: 0 0 3px black, 0 0 5px black;
|
|
103
|
+
padding: 4px;
|
|
104
|
+
font-family: 'Courier New', monospace;
|
|
105
|
+
font-weight: bold;
|
|
106
|
+
display: block !important;
|
|
107
|
+
visibility: visible !important;
|
|
108
|
+
`;
|
|
109
|
+
const currentPosition = window.getComputedStyle(element).position;
|
|
110
|
+
if (currentPosition === "static") {
|
|
111
|
+
element.style.position = "relative";
|
|
112
|
+
}
|
|
113
|
+
element.appendChild(overlay);
|
|
114
|
+
this.overlays.set(id, overlay);
|
|
115
|
+
}
|
|
116
|
+
overlay.style.backgroundColor = `rgba(255, 0, 0, ${Math.max(opacity, 0.15)})`;
|
|
117
|
+
overlay.style.opacity = "1";
|
|
118
|
+
overlay.textContent = `${renderCount}× ${patchType}`;
|
|
119
|
+
if (this.config.fadeOutDuration > 0) {
|
|
120
|
+
setTimeout(() => {
|
|
121
|
+
if (overlay) {
|
|
122
|
+
overlay.style.opacity = "0.2";
|
|
123
|
+
}
|
|
124
|
+
}, this.config.fadeOutDuration);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
reset(id) {
|
|
129
|
+
this.renderCounts.delete(id);
|
|
130
|
+
const overlay = this.overlays.get(id);
|
|
131
|
+
if (overlay) {
|
|
132
|
+
overlay.remove();
|
|
133
|
+
this.overlays.delete(id);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
resetAll() {
|
|
137
|
+
this.renderCounts.clear();
|
|
138
|
+
for (const overlay of this.overlays.values()) {
|
|
139
|
+
overlay.remove();
|
|
140
|
+
}
|
|
141
|
+
this.overlays.clear();
|
|
142
|
+
}
|
|
143
|
+
getRenderCount(id) {
|
|
144
|
+
return this.renderCounts.get(id) || 0;
|
|
145
|
+
}
|
|
146
|
+
cleanup() {
|
|
147
|
+
for (const overlay of this.overlays.values()) {
|
|
148
|
+
overlay.remove();
|
|
149
|
+
}
|
|
150
|
+
this.overlays.clear();
|
|
151
|
+
}
|
|
152
|
+
getStats() {
|
|
153
|
+
const totalRerenders = Array.from(this.renderCounts.values()).reduce((sum, count) => sum + count, 0);
|
|
154
|
+
const elementCount = this.renderCounts.size;
|
|
155
|
+
const avgRerenders = elementCount > 0 ? totalRerenders / elementCount : 0;
|
|
156
|
+
return {
|
|
157
|
+
totalRerenders,
|
|
158
|
+
elementCount,
|
|
159
|
+
avgRerenders: Math.round(avgRerenders * 100) / 100
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export {
|
|
164
|
+
defaultDebugConfig,
|
|
165
|
+
RerenderTracker
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export { defaultDebugConfig, RerenderTracker };
|
|
169
|
+
|
|
170
|
+
//# debugId=DB6959EE0768413864756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/dom/debug.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Debug utilities for DOM rendering visualization\n *\n * Provides heatmap overlays to visualize re-renders\n */\n\nexport interface DebugConfig {\n /** Enable debug mode */\n enabled: boolean;\n /** Show heatmap overlays on re-renders */\n showHeatmap: boolean;\n /** Increment per re-render (default: 5%) */\n heatmapIncrement: number;\n /** Maximum opacity for heatmap (default: 0.8) */\n maxOpacity: number;\n /** Fade out duration in ms (0 to disable) */\n fadeOutDuration: number;\n}\n\nexport const defaultDebugConfig: DebugConfig = {\n enabled: false,\n showHeatmap: true,\n heatmapIncrement: 5,\n maxOpacity: 0.8,\n fadeOutDuration: 2000,\n};\n\n/**\n * Tracks re-render counts for each element\n */\nexport class RerenderTracker {\n private renderCounts = new Map<string, number>();\n private overlays = new Map<string, HTMLDivElement>();\n private config: DebugConfig;\n\n constructor(config: DebugConfig = defaultDebugConfig) {\n this.config = config;\n }\n\n /**\n * Update the configuration\n */\n setConfig(config: Partial<DebugConfig>): void {\n this.config = { ...this.config, ...config };\n\n // If debug mode is disabled, clean up all overlays\n if (!this.config.enabled) {\n this.cleanup();\n }\n }\n\n /**\n * Track a re-render for an element\n */\n trackRerender(id: string, element: HTMLElement, patchType: string): void {\n if (!this.config.enabled || !this.config.showHeatmap) {\n return;\n }\n\n console.log(`🔥 [Debug] Tracking re-render: ${id} - ${patchType}`);\n\n // Increment render count\n const currentCount = this.renderCounts.get(id) || 0;\n const newCount = currentCount + 1;\n this.renderCounts.set(id, newCount);\n\n // Create or update heatmap overlay\n this.updateHeatmap(id, element, newCount, patchType);\n }\n\n /**\n * Create or update the heatmap overlay for an element\n */\n private updateHeatmap(id: string, element: HTMLElement, renderCount: number, patchType: string): void {\n // Calculate opacity based on render count (increment by heatmapIncrement% each time)\n const opacity = Math.min(\n (renderCount * this.config.heatmapIncrement) / 100,\n this.config.maxOpacity\n );\n\n console.log(`🔥 [Debug] Updating heatmap for ${id}, count: ${renderCount}, opacity: ${opacity}`);\n\n // For inline elements or text, use a simpler approach: background color + outline\n const isInline = window.getComputedStyle(element).display.includes('inline');\n\n if (isInline || element.tagName === 'SPAN') {\n // Store original styles if not already stored\n if (!element.dataset.hypenDebugOriginalBg) {\n element.dataset.hypenDebugOriginalBg = element.style.backgroundColor || '';\n element.dataset.hypenDebugOriginalOutline = element.style.outline || '';\n element.dataset.hypenDebugOriginalPosition = element.style.position || '';\n }\n\n // Apply red background and outline directly to the element\n element.style.backgroundColor = `rgba(255, 0, 0, ${Math.max(opacity, 0.15)})`;\n element.style.outline = `2px solid rgba(255, 0, 0, ${Math.max(opacity + 0.2, 0.3)})`;\n element.style.outlineOffset = '2px';\n element.style.position = 'relative';\n\n // Add count badge as ::before pseudo-element or data attribute\n element.setAttribute('data-hypen-renders', `${renderCount}× ${patchType}`);\n\n // Add CSS for the badge if not already added\n if (!document.getElementById('hypen-debug-styles')) {\n const style = document.createElement('style');\n style.id = 'hypen-debug-styles';\n style.textContent = `\n [data-hypen-renders]::before {\n content: attr(data-hypen-renders);\n position: absolute;\n top: -18px;\n left: 0;\n background: rgba(255, 0, 0, 0.9);\n color: white;\n padding: 2px 6px;\n font-size: 10px;\n font-family: 'Courier New', monospace;\n font-weight: bold;\n border-radius: 3px;\n z-index: 999999;\n pointer-events: none;\n white-space: nowrap;\n text-shadow: none;\n }\n `;\n document.head.appendChild(style);\n }\n\n // Store in overlays map for cleanup\n this.overlays.set(id, element as any);\n\n // Fade out after duration if enabled\n if (this.config.fadeOutDuration > 0) {\n setTimeout(() => {\n const originalBg = element.dataset.hypenDebugOriginalBg || '';\n const originalOutline = element.dataset.hypenDebugOriginalOutline || '';\n element.style.backgroundColor = originalBg;\n element.style.outline = originalOutline;\n element.style.opacity = '1';\n }, this.config.fadeOutDuration);\n }\n } else {\n // For block elements, use overlay approach\n let overlay = this.overlays.get(id);\n\n if (!overlay) {\n overlay = document.createElement(\"div\");\n overlay.className = \"hypen-debug-overlay\";\n overlay.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n z-index: 999999 !important;\n transition: opacity ${this.config.fadeOutDuration}ms ease-out;\n border: 2px solid rgba(255, 0, 0, 0.7) !important;\n box-sizing: border-box;\n font-size: 11px;\n color: white;\n text-shadow: 0 0 3px black, 0 0 5px black;\n padding: 4px;\n font-family: 'Courier New', monospace;\n font-weight: bold;\n display: block !important;\n visibility: visible !important;\n `;\n\n const currentPosition = window.getComputedStyle(element).position;\n if (currentPosition === 'static') {\n element.style.position = 'relative';\n }\n\n element.appendChild(overlay);\n this.overlays.set(id, overlay);\n }\n\n overlay.style.backgroundColor = `rgba(255, 0, 0, ${Math.max(opacity, 0.15)})`;\n overlay.style.opacity = '1';\n overlay.textContent = `${renderCount}× ${patchType}`;\n\n if (this.config.fadeOutDuration > 0) {\n setTimeout(() => {\n if (overlay) {\n overlay.style.opacity = '0.2';\n }\n }, this.config.fadeOutDuration);\n }\n }\n }\n\n /**\n * Reset tracking for a specific element\n */\n reset(id: string): void {\n this.renderCounts.delete(id);\n const overlay = this.overlays.get(id);\n if (overlay) {\n overlay.remove();\n this.overlays.delete(id);\n }\n }\n\n /**\n * Reset tracking for all elements\n */\n resetAll(): void {\n this.renderCounts.clear();\n for (const overlay of this.overlays.values()) {\n overlay.remove();\n }\n this.overlays.clear();\n }\n\n /**\n * Get render count for an element\n */\n getRenderCount(id: string): number {\n return this.renderCounts.get(id) || 0;\n }\n\n /**\n * Clean up all overlays (called when debug mode is disabled)\n */\n private cleanup(): void {\n for (const overlay of this.overlays.values()) {\n overlay.remove();\n }\n this.overlays.clear();\n }\n\n /**\n * Get statistics about re-renders\n */\n getStats(): { totalRerenders: number; elementCount: number; avgRerenders: number } {\n const totalRerenders = Array.from(this.renderCounts.values()).reduce((sum, count) => sum + count, 0);\n const elementCount = this.renderCounts.size;\n const avgRerenders = elementCount > 0 ? totalRerenders / elementCount : 0;\n\n return {\n totalRerenders,\n elementCount,\n avgRerenders: Math.round(avgRerenders * 100) / 100,\n };\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "DB6959EE0768413864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|