@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.
Files changed (195) hide show
  1. package/dist/chunk-2s02mkzs.js +32 -0
  2. package/dist/chunk-2s02mkzs.js.map +9 -0
  3. package/dist/src/canvas/accessibility.js +152 -0
  4. package/dist/src/canvas/accessibility.js.map +10 -0
  5. package/dist/src/canvas/events.js +198 -0
  6. package/dist/src/canvas/events.js.map +10 -0
  7. package/dist/src/canvas/index.js +28 -0
  8. package/dist/src/canvas/index.js.map +9 -0
  9. package/dist/src/canvas/input.js +132 -0
  10. package/dist/src/canvas/input.js.map +10 -0
  11. package/dist/src/canvas/layout.js +309 -0
  12. package/dist/src/canvas/layout.js.map +10 -0
  13. package/dist/src/canvas/paint.js +878 -0
  14. package/dist/src/canvas/paint.js.map +10 -0
  15. package/dist/src/canvas/renderer.js +276 -0
  16. package/dist/src/canvas/renderer.js.map +10 -0
  17. package/dist/src/canvas/text.js +118 -0
  18. package/dist/src/canvas/text.js.map +10 -0
  19. package/dist/src/canvas/types.js +2 -0
  20. package/dist/src/canvas/types.js.map +9 -0
  21. package/dist/src/canvas/utils.js +139 -0
  22. package/dist/src/canvas/utils.js.map +10 -0
  23. package/dist/src/dom/applicators/advanced-layout.js +111 -0
  24. package/dist/src/dom/applicators/advanced-layout.js.map +10 -0
  25. package/dist/src/dom/applicators/background.js +54 -0
  26. package/dist/src/dom/applicators/background.js.map +10 -0
  27. package/dist/src/dom/applicators/border.js +33 -0
  28. package/dist/src/dom/applicators/border.js.map +10 -0
  29. package/dist/src/dom/applicators/color.js +36 -0
  30. package/dist/src/dom/applicators/color.js.map +10 -0
  31. package/dist/src/dom/applicators/display.js +57 -0
  32. package/dist/src/dom/applicators/display.js.map +10 -0
  33. package/dist/src/dom/applicators/effects.js +89 -0
  34. package/dist/src/dom/applicators/effects.js.map +10 -0
  35. package/dist/src/dom/applicators/events.js +518 -0
  36. package/dist/src/dom/applicators/events.js.map +10 -0
  37. package/dist/src/dom/applicators/font.js +39 -0
  38. package/dist/src/dom/applicators/font.js.map +10 -0
  39. package/dist/src/dom/applicators/index.js +296 -0
  40. package/dist/src/dom/applicators/index.js.map +10 -0
  41. package/dist/src/dom/applicators/layout.js +86 -0
  42. package/dist/src/dom/applicators/layout.js.map +10 -0
  43. package/dist/src/dom/applicators/margin.js +32 -0
  44. package/dist/src/dom/applicators/margin.js.map +10 -0
  45. package/dist/src/dom/applicators/padding.js +35 -0
  46. package/dist/src/dom/applicators/padding.js.map +10 -0
  47. package/dist/src/dom/applicators/size.js +42 -0
  48. package/dist/src/dom/applicators/size.js.map +10 -0
  49. package/dist/src/dom/applicators/transform.js +92 -0
  50. package/dist/src/dom/applicators/transform.js.map +10 -0
  51. package/dist/src/dom/applicators/transition.js +66 -0
  52. package/dist/src/dom/applicators/transition.js.map +10 -0
  53. package/dist/src/dom/applicators/typography.js +87 -0
  54. package/dist/src/dom/applicators/typography.js.map +10 -0
  55. package/dist/src/dom/canvas/index.js +50 -0
  56. package/dist/src/dom/canvas/index.js.map +10 -0
  57. package/dist/src/dom/components/audio.js +48 -0
  58. package/dist/src/dom/components/audio.js.map +10 -0
  59. package/dist/src/dom/components/avatar.js +58 -0
  60. package/dist/src/dom/components/avatar.js.map +10 -0
  61. package/dist/src/dom/components/badge.js +55 -0
  62. package/dist/src/dom/components/badge.js.map +10 -0
  63. package/dist/src/dom/components/button.js +29 -0
  64. package/dist/src/dom/components/button.js.map +10 -0
  65. package/dist/src/dom/components/card.js +33 -0
  66. package/dist/src/dom/components/card.js.map +10 -0
  67. package/dist/src/dom/components/center.js +32 -0
  68. package/dist/src/dom/components/center.js.map +10 -0
  69. package/dist/src/dom/components/checkbox.js +54 -0
  70. package/dist/src/dom/components/checkbox.js.map +10 -0
  71. package/dist/src/dom/components/column.js +31 -0
  72. package/dist/src/dom/components/column.js.map +10 -0
  73. package/dist/src/dom/components/container.js +29 -0
  74. package/dist/src/dom/components/container.js.map +10 -0
  75. package/dist/src/dom/components/divider.js +45 -0
  76. package/dist/src/dom/components/divider.js.map +10 -0
  77. package/dist/src/dom/components/grid.js +44 -0
  78. package/dist/src/dom/components/grid.js.map +10 -0
  79. package/dist/src/dom/components/heading.js +47 -0
  80. package/dist/src/dom/components/heading.js.map +10 -0
  81. package/dist/src/dom/components/image.js +39 -0
  82. package/dist/src/dom/components/image.js.map +10 -0
  83. package/dist/src/dom/components/index.js +217 -0
  84. package/dist/src/dom/components/index.js.map +10 -0
  85. package/dist/src/dom/components/input.js +41 -0
  86. package/dist/src/dom/components/input.js.map +10 -0
  87. package/dist/src/dom/components/link.js +42 -0
  88. package/dist/src/dom/components/link.js.map +10 -0
  89. package/dist/src/dom/components/list.js +42 -0
  90. package/dist/src/dom/components/list.js.map +10 -0
  91. package/dist/src/dom/components/paragraph.js +35 -0
  92. package/dist/src/dom/components/paragraph.js.map +10 -0
  93. package/dist/src/dom/components/progressbar.js +57 -0
  94. package/dist/src/dom/components/progressbar.js.map +10 -0
  95. package/dist/src/dom/components/route.js +44 -0
  96. package/dist/src/dom/components/route.js.map +10 -0
  97. package/dist/src/dom/components/router.js +33 -0
  98. package/dist/src/dom/components/router.js.map +10 -0
  99. package/dist/src/dom/components/row.js +31 -0
  100. package/dist/src/dom/components/row.js.map +10 -0
  101. package/dist/src/dom/components/select.js +57 -0
  102. package/dist/src/dom/components/select.js.map +10 -0
  103. package/dist/src/dom/components/slider.js +48 -0
  104. package/dist/src/dom/components/slider.js.map +10 -0
  105. package/dist/src/dom/components/spacer.js +30 -0
  106. package/dist/src/dom/components/spacer.js.map +10 -0
  107. package/dist/src/dom/components/spinner.js +65 -0
  108. package/dist/src/dom/components/spinner.js.map +10 -0
  109. package/dist/src/dom/components/stack.js +45 -0
  110. package/dist/src/dom/components/stack.js.map +10 -0
  111. package/dist/src/dom/components/switch.js +83 -0
  112. package/dist/src/dom/components/switch.js.map +10 -0
  113. package/dist/src/dom/components/text.js +37 -0
  114. package/dist/src/dom/components/text.js.map +10 -0
  115. package/dist/src/dom/components/textarea.js +51 -0
  116. package/dist/src/dom/components/textarea.js.map +10 -0
  117. package/dist/src/dom/components/video.js +51 -0
  118. package/dist/src/dom/components/video.js.map +10 -0
  119. package/dist/src/dom/debug.js +170 -0
  120. package/dist/src/dom/debug.js.map +10 -0
  121. package/dist/src/dom/events.js +112 -0
  122. package/dist/src/dom/events.js.map +10 -0
  123. package/dist/src/dom/index.js +73 -0
  124. package/dist/src/dom/index.js.map +9 -0
  125. package/dist/src/dom/renderer.js +277 -0
  126. package/dist/src/dom/renderer.js.map +10 -0
  127. package/dist/src/index.js +89 -0
  128. package/dist/src/index.js.map +9 -0
  129. package/package.json +84 -0
  130. package/src/canvas/QUICKSTART.md +421 -0
  131. package/src/canvas/README.md +376 -0
  132. package/src/canvas/accessibility.ts +218 -0
  133. package/src/canvas/events.ts +307 -0
  134. package/src/canvas/index.ts +35 -0
  135. package/src/canvas/input.ts +210 -0
  136. package/src/canvas/layout.ts +401 -0
  137. package/src/canvas/paint.ts +1321 -0
  138. package/src/canvas/renderer.ts +422 -0
  139. package/src/canvas/text.ts +182 -0
  140. package/src/canvas/types.ts +137 -0
  141. package/src/canvas/utils.ts +218 -0
  142. package/src/dom/README.md +265 -0
  143. package/src/dom/applicators/advanced-layout.ts +128 -0
  144. package/src/dom/applicators/background.ts +50 -0
  145. package/src/dom/applicators/border.ts +19 -0
  146. package/src/dom/applicators/color.ts +23 -0
  147. package/src/dom/applicators/display.ts +54 -0
  148. package/src/dom/applicators/effects.ts +97 -0
  149. package/src/dom/applicators/events.ts +689 -0
  150. package/src/dom/applicators/font.ts +27 -0
  151. package/src/dom/applicators/index.ts +354 -0
  152. package/src/dom/applicators/layout.ts +92 -0
  153. package/src/dom/applicators/margin.ts +18 -0
  154. package/src/dom/applicators/padding.ts +18 -0
  155. package/src/dom/applicators/size.ts +31 -0
  156. package/src/dom/applicators/transform.ts +93 -0
  157. package/src/dom/applicators/transition.ts +65 -0
  158. package/src/dom/applicators/typography.ts +91 -0
  159. package/src/dom/canvas/index.ts +60 -0
  160. package/src/dom/components/audio.ts +45 -0
  161. package/src/dom/components/avatar.ts +49 -0
  162. package/src/dom/components/badge.ts +45 -0
  163. package/src/dom/components/button.ts +13 -0
  164. package/src/dom/components/card.ts +19 -0
  165. package/src/dom/components/center.ts +16 -0
  166. package/src/dom/components/checkbox.ts +54 -0
  167. package/src/dom/components/column.ts +15 -0
  168. package/src/dom/components/container.ts +13 -0
  169. package/src/dom/components/divider.ts +37 -0
  170. package/src/dom/components/grid.ts +40 -0
  171. package/src/dom/components/heading.ts +41 -0
  172. package/src/dom/components/image.ts +27 -0
  173. package/src/dom/components/index.ts +115 -0
  174. package/src/dom/components/input.ts +29 -0
  175. package/src/dom/components/link.ts +35 -0
  176. package/src/dom/components/list.ts +30 -0
  177. package/src/dom/components/paragraph.ts +23 -0
  178. package/src/dom/components/progressbar.ts +51 -0
  179. package/src/dom/components/route.ts +37 -0
  180. package/src/dom/components/router.ts +22 -0
  181. package/src/dom/components/row.ts +15 -0
  182. package/src/dom/components/select.ts +56 -0
  183. package/src/dom/components/slider.ts +45 -0
  184. package/src/dom/components/spacer.ts +16 -0
  185. package/src/dom/components/spinner.ts +60 -0
  186. package/src/dom/components/stack.ts +34 -0
  187. package/src/dom/components/switch.ts +86 -0
  188. package/src/dom/components/text.ts +24 -0
  189. package/src/dom/components/textarea.ts +50 -0
  190. package/src/dom/components/video.ts +50 -0
  191. package/src/dom/debug.ts +247 -0
  192. package/src/dom/events.ts +168 -0
  193. package/src/dom/index.ts +11 -0
  194. package/src/dom/renderer.ts +327 -0
  195. 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
+ }