@lightningtv/renderer 3.0.0-beta1 → 3.2.4

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 (503) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +22 -28
  3. package/dist/exports/canvas-shaders.js +0 -16
  4. package/dist/exports/canvas-shaders.js.map +1 -1
  5. package/dist/exports/canvas.d.ts +1 -1
  6. package/dist/exports/canvas.js +1 -19
  7. package/dist/exports/canvas.js.map +1 -1
  8. package/dist/exports/index.d.ts +2 -5
  9. package/dist/exports/index.js +1 -23
  10. package/dist/exports/index.js.map +1 -1
  11. package/dist/exports/inspector.js +0 -18
  12. package/dist/exports/inspector.js.map +1 -1
  13. package/dist/exports/utils.d.ts +2 -1
  14. package/dist/exports/utils.js +2 -19
  15. package/dist/exports/utils.js.map +1 -1
  16. package/dist/exports/webgl-shaders.js +0 -16
  17. package/dist/exports/webgl-shaders.js.map +1 -1
  18. package/dist/exports/webgl.d.ts +2 -1
  19. package/dist/exports/webgl.js +2 -19
  20. package/dist/exports/webgl.js.map +1 -1
  21. package/dist/src/common/CommonTypes.d.ts +15 -3
  22. package/dist/src/common/CommonTypes.js +0 -18
  23. package/dist/src/common/CommonTypes.js.map +1 -1
  24. package/dist/src/common/EventEmitter.js +0 -18
  25. package/dist/src/common/EventEmitter.js.map +1 -1
  26. package/dist/src/common/IEventEmitter.js +0 -16
  27. package/dist/src/common/IEventEmitter.js.map +1 -1
  28. package/dist/src/core/Autosizer.d.ts +35 -0
  29. package/dist/src/core/Autosizer.js +178 -0
  30. package/dist/src/core/Autosizer.js.map +1 -0
  31. package/dist/src/core/CoreNode.d.ts +139 -101
  32. package/dist/src/core/CoreNode.js +813 -528
  33. package/dist/src/core/CoreNode.js.map +1 -1
  34. package/dist/src/core/CoreShaderManager.d.ts +3 -3
  35. package/dist/src/core/CoreShaderManager.js +0 -18
  36. package/dist/src/core/CoreShaderManager.js.map +1 -1
  37. package/dist/src/core/CoreTextNode.d.ts +75 -87
  38. package/dist/src/core/CoreTextNode.js +380 -258
  39. package/dist/src/core/CoreTextNode.js.map +1 -1
  40. package/dist/src/core/CoreTextureManager.d.ts +25 -14
  41. package/dist/src/core/CoreTextureManager.js +83 -140
  42. package/dist/src/core/CoreTextureManager.js.map +1 -1
  43. package/dist/src/core/Stage.d.ts +102 -36
  44. package/dist/src/core/Stage.js +424 -191
  45. package/dist/src/core/Stage.js.map +1 -1
  46. package/dist/src/core/TextureError.d.ts +11 -0
  47. package/dist/src/core/TextureError.js +37 -0
  48. package/dist/src/core/TextureError.js.map +1 -0
  49. package/dist/src/core/TextureMemoryManager.d.ts +11 -4
  50. package/dist/src/core/TextureMemoryManager.js +114 -134
  51. package/dist/src/core/TextureMemoryManager.js.map +1 -1
  52. package/dist/src/core/animations/AnimationManager.js +0 -18
  53. package/dist/src/core/animations/AnimationManager.js.map +1 -1
  54. package/dist/src/core/animations/CoreAnimation.d.ts +3 -3
  55. package/dist/src/core/animations/CoreAnimation.js +8 -24
  56. package/dist/src/core/animations/CoreAnimation.js.map +1 -1
  57. package/dist/src/core/animations/CoreAnimationController.d.ts +1 -0
  58. package/dist/src/core/animations/CoreAnimationController.js +11 -22
  59. package/dist/src/core/animations/CoreAnimationController.js.map +1 -1
  60. package/dist/src/core/lib/ContextSpy.js +0 -18
  61. package/dist/src/core/lib/ContextSpy.js.map +1 -1
  62. package/dist/src/core/lib/ImageWorker.d.ts +2 -2
  63. package/dist/src/core/lib/ImageWorker.js +33 -31
  64. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  65. package/dist/src/core/lib/Matrix3d.d.ts +1 -0
  66. package/dist/src/core/lib/Matrix3d.js +7 -19
  67. package/dist/src/core/lib/Matrix3d.js.map +1 -1
  68. package/dist/src/core/lib/RenderCoords.d.ts +9 -10
  69. package/dist/src/core/lib/RenderCoords.js +27 -55
  70. package/dist/src/core/lib/RenderCoords.js.map +1 -1
  71. package/dist/src/core/lib/WebGlContextWrapper.d.ts +78 -3
  72. package/dist/src/core/lib/WebGlContextWrapper.js +150 -25
  73. package/dist/src/core/lib/WebGlContextWrapper.js.map +1 -1
  74. package/dist/src/core/lib/collectionUtils.d.ts +5 -0
  75. package/dist/src/core/lib/collectionUtils.js +82 -0
  76. package/dist/src/core/lib/collectionUtils.js.map +1 -0
  77. package/dist/src/core/lib/colorCache.d.ts +1 -0
  78. package/dist/src/core/lib/colorCache.js +19 -0
  79. package/dist/src/core/lib/colorCache.js.map +1 -0
  80. package/dist/src/core/{renderers/canvas/internal/ColorUtils.js → lib/colorParser.js} +1 -19
  81. package/dist/src/core/lib/colorParser.js.map +1 -0
  82. package/dist/src/core/lib/textureCompression.d.ts +14 -2
  83. package/dist/src/core/lib/textureCompression.js +320 -85
  84. package/dist/src/core/lib/textureCompression.js.map +1 -1
  85. package/dist/src/core/lib/textureSvg.js +0 -18
  86. package/dist/src/core/lib/textureSvg.js.map +1 -1
  87. package/dist/src/core/lib/utils.d.ts +8 -1
  88. package/dist/src/core/lib/utils.js +44 -20
  89. package/dist/src/core/lib/utils.js.map +1 -1
  90. package/dist/src/core/lib/validateImageBitmap.d.ts +2 -1
  91. package/dist/src/core/lib/validateImageBitmap.js +4 -4
  92. package/dist/src/core/lib/validateImageBitmap.js.map +1 -1
  93. package/dist/src/core/platforms/Platform.d.ts +42 -0
  94. package/dist/src/core/platforms/Platform.js +4 -0
  95. package/dist/src/core/platforms/Platform.js.map +1 -0
  96. package/dist/src/core/platforms/web/WebPlatform.d.ts +10 -0
  97. package/dist/src/core/platforms/web/WebPlatform.js +90 -0
  98. package/dist/src/core/platforms/web/WebPlatform.js.map +1 -0
  99. package/dist/src/core/renderers/CoreContextTexture.d.ts +2 -1
  100. package/dist/src/core/renderers/CoreContextTexture.js +0 -18
  101. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  102. package/dist/src/core/renderers/CoreRenderOp.js +0 -18
  103. package/dist/src/core/renderers/CoreRenderOp.js.map +1 -1
  104. package/dist/src/core/renderers/CoreRenderer.d.ts +15 -3
  105. package/dist/src/core/renderers/CoreRenderer.js +1 -18
  106. package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
  107. package/dist/src/core/renderers/CoreShaderNode.d.ts +13 -3
  108. package/dist/src/core/renderers/CoreShaderNode.js +25 -2
  109. package/dist/src/core/renderers/CoreShaderNode.js.map +1 -1
  110. package/dist/src/core/renderers/CoreShaderProgram.js +0 -18
  111. package/dist/src/core/renderers/CoreShaderProgram.js.map +1 -1
  112. package/dist/src/core/renderers/canvas/CanvasRenderer.d.ts +4 -5
  113. package/dist/src/core/renderers/canvas/CanvasRenderer.js +89 -83
  114. package/dist/src/core/renderers/canvas/CanvasRenderer.js.map +1 -1
  115. package/dist/src/core/renderers/canvas/CanvasShaderNode.js +3 -21
  116. package/dist/src/core/renderers/canvas/CanvasShaderNode.js.map +1 -1
  117. package/dist/src/core/renderers/canvas/CanvasTexture.d.ts +3 -2
  118. package/dist/src/core/renderers/canvas/CanvasTexture.js +18 -31
  119. package/dist/src/core/renderers/canvas/CanvasTexture.js.map +1 -1
  120. package/dist/src/core/renderers/webgl/BatchRenderOp.d.ts +25 -0
  121. package/dist/src/core/renderers/webgl/BatchRenderOp.js +60 -0
  122. package/dist/src/core/renderers/webgl/BatchRenderOp.js.map +1 -0
  123. package/dist/src/core/renderers/webgl/SdfRenderOp.d.ts +33 -0
  124. package/dist/src/core/renderers/webgl/SdfRenderOp.js +80 -0
  125. package/dist/src/core/renderers/webgl/SdfRenderOp.js.map +1 -0
  126. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.d.ts +2 -0
  127. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js +14 -24
  128. package/dist/src/core/renderers/webgl/WebGlCtxRenderTexture.js.map +1 -1
  129. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.d.ts +13 -0
  130. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js +34 -23
  131. package/dist/src/core/renderers/webgl/WebGlCtxSubTexture.js.map +1 -1
  132. package/dist/src/core/renderers/webgl/WebGlCtxTexture.d.ts +16 -6
  133. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js +102 -70
  134. package/dist/src/core/renderers/webgl/WebGlCtxTexture.js.map +1 -1
  135. package/dist/src/core/renderers/webgl/WebGlRenderer.d.ts +34 -20
  136. package/dist/src/core/renderers/webgl/WebGlRenderer.js +319 -195
  137. package/dist/src/core/renderers/webgl/WebGlRenderer.js.map +1 -1
  138. package/dist/src/core/renderers/webgl/WebGlShaderNode.d.ts +2 -3
  139. package/dist/src/core/renderers/webgl/WebGlShaderNode.js +1 -4
  140. package/dist/src/core/renderers/webgl/WebGlShaderNode.js.map +1 -1
  141. package/dist/src/core/renderers/webgl/WebGlShaderProgram.d.ts +9 -7
  142. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js +99 -48
  143. package/dist/src/core/renderers/webgl/WebGlShaderProgram.js.map +1 -1
  144. package/dist/src/core/renderers/webgl/internal/BufferCollection.d.ts +1 -0
  145. package/dist/src/core/renderers/webgl/internal/BufferCollection.js +12 -21
  146. package/dist/src/core/renderers/webgl/internal/BufferCollection.js.map +1 -1
  147. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +0 -18
  148. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  149. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js +0 -18
  150. package/dist/src/core/renderers/webgl/internal/ShaderUtils.js.map +1 -1
  151. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js +0 -18
  152. package/dist/src/core/renderers/webgl/internal/WebGlUtils.js.map +1 -1
  153. package/dist/src/core/shaders/canvas/Border.d.ts +8 -2
  154. package/dist/src/core/shaders/canvas/Border.js +67 -41
  155. package/dist/src/core/shaders/canvas/Border.js.map +1 -1
  156. package/dist/src/core/shaders/canvas/HolePunch.js +3 -19
  157. package/dist/src/core/shaders/canvas/HolePunch.js.map +1 -1
  158. package/dist/src/core/shaders/canvas/LinearGradient.js +7 -21
  159. package/dist/src/core/shaders/canvas/LinearGradient.js.map +1 -1
  160. package/dist/src/core/shaders/canvas/RadialGradient.js +14 -28
  161. package/dist/src/core/shaders/canvas/RadialGradient.js.map +1 -1
  162. package/dist/src/core/shaders/canvas/Rounded.js +1 -17
  163. package/dist/src/core/shaders/canvas/Rounded.js.map +1 -1
  164. package/dist/src/core/shaders/canvas/RoundedWithBorder.d.ts +6 -3
  165. package/dist/src/core/shaders/canvas/RoundedWithBorder.js +44 -22
  166. package/dist/src/core/shaders/canvas/RoundedWithBorder.js.map +1 -1
  167. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.d.ts +2 -3
  168. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js +47 -25
  169. package/dist/src/core/shaders/canvas/RoundedWithBorderAndShadow.js.map +1 -1
  170. package/dist/src/core/shaders/canvas/RoundedWithShadow.js +9 -21
  171. package/dist/src/core/shaders/canvas/RoundedWithShadow.js.map +1 -1
  172. package/dist/src/core/shaders/canvas/Shadow.js +0 -16
  173. package/dist/src/core/shaders/canvas/Shadow.js.map +1 -1
  174. package/dist/src/core/shaders/canvas/utils/render.d.ts +1 -1
  175. package/dist/src/core/shaders/canvas/utils/render.js +31 -34
  176. package/dist/src/core/shaders/canvas/utils/render.js.map +1 -1
  177. package/dist/src/core/shaders/templates/BorderTemplate.d.ts +12 -2
  178. package/dist/src/core/shaders/templates/BorderTemplate.js +31 -27
  179. package/dist/src/core/shaders/templates/BorderTemplate.js.map +1 -1
  180. package/dist/src/core/shaders/templates/HolePunchTemplate.d.ts +2 -2
  181. package/dist/src/core/shaders/templates/HolePunchTemplate.js +3 -19
  182. package/dist/src/core/shaders/templates/HolePunchTemplate.js.map +1 -1
  183. package/dist/src/core/shaders/templates/LinearGradientTemplate.js +0 -16
  184. package/dist/src/core/shaders/templates/LinearGradientTemplate.js.map +1 -1
  185. package/dist/src/core/shaders/templates/RadialGradientTemplate.d.ts +8 -6
  186. package/dist/src/core/shaders/templates/RadialGradientTemplate.js +2 -18
  187. package/dist/src/core/shaders/templates/RadialGradientTemplate.js.map +1 -1
  188. package/dist/src/core/shaders/templates/RoundedTemplate.js +1 -17
  189. package/dist/src/core/shaders/templates/RoundedTemplate.js.map +1 -1
  190. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.d.ts +1 -1
  191. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js +0 -16
  192. package/dist/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.js.map +1 -1
  193. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.d.ts +4 -2
  194. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js +3 -17
  195. package/dist/src/core/shaders/templates/RoundedWithBorderTemplate.js.map +1 -1
  196. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.d.ts +1 -1
  197. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js +0 -16
  198. package/dist/src/core/shaders/templates/RoundedWithShadowTemplate.js.map +1 -1
  199. package/dist/src/core/shaders/templates/ShadowTemplate.d.ts +1 -1
  200. package/dist/src/core/shaders/templates/ShadowTemplate.js +0 -16
  201. package/dist/src/core/shaders/templates/ShadowTemplate.js.map +1 -1
  202. package/dist/src/core/shaders/{templates/shaderUtils.d.ts → utils.d.ts} +1 -1
  203. package/dist/src/core/shaders/utils.js +25 -0
  204. package/dist/src/core/shaders/utils.js.map +1 -0
  205. package/dist/src/core/shaders/webgl/Border.js +118 -51
  206. package/dist/src/core/shaders/webgl/Border.js.map +1 -1
  207. package/dist/src/core/shaders/webgl/Default.js +6 -41
  208. package/dist/src/core/shaders/webgl/Default.js.map +1 -1
  209. package/dist/src/core/shaders/webgl/HolePunch.js +4 -19
  210. package/dist/src/core/shaders/webgl/HolePunch.js.map +1 -1
  211. package/dist/src/core/shaders/webgl/LinearGradient.js +73 -34
  212. package/dist/src/core/shaders/webgl/LinearGradient.js.map +1 -1
  213. package/dist/src/core/shaders/webgl/RadialGradient.js +56 -48
  214. package/dist/src/core/shaders/webgl/RadialGradient.js.map +1 -1
  215. package/dist/src/core/shaders/webgl/Rounded.js +25 -23
  216. package/dist/src/core/shaders/webgl/Rounded.js.map +1 -1
  217. package/dist/src/core/shaders/webgl/RoundedWithBorder.js +160 -55
  218. package/dist/src/core/shaders/webgl/RoundedWithBorder.js.map +1 -1
  219. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js +168 -58
  220. package/dist/src/core/shaders/webgl/RoundedWithBorderAndShadow.js.map +1 -1
  221. package/dist/src/core/shaders/webgl/RoundedWithShadow.js +73 -34
  222. package/dist/src/core/shaders/webgl/RoundedWithShadow.js.map +1 -1
  223. package/dist/src/core/shaders/webgl/SdfShader.d.ts +0 -2
  224. package/dist/src/core/shaders/webgl/SdfShader.js +8 -36
  225. package/dist/src/core/shaders/webgl/SdfShader.js.map +1 -1
  226. package/dist/src/core/shaders/webgl/Shadow.js +39 -34
  227. package/dist/src/core/shaders/webgl/Shadow.js.map +1 -1
  228. package/dist/src/core/text-rendering/CanvasFontHandler.d.ts +59 -0
  229. package/dist/src/core/text-rendering/CanvasFontHandler.js +206 -0
  230. package/dist/src/core/text-rendering/CanvasFontHandler.js.map +1 -0
  231. package/dist/src/core/text-rendering/CanvasTextRenderer.d.ts +17 -0
  232. package/dist/src/core/text-rendering/CanvasTextRenderer.js +139 -0
  233. package/dist/src/core/text-rendering/CanvasTextRenderer.js.map +1 -0
  234. package/dist/src/core/text-rendering/SdfFontHandler.d.ts +167 -0
  235. package/dist/src/core/text-rendering/SdfFontHandler.js +371 -0
  236. package/dist/src/core/text-rendering/SdfFontHandler.js.map +1 -0
  237. package/dist/src/core/text-rendering/SdfTextRenderer.d.ts +18 -0
  238. package/dist/src/core/text-rendering/SdfTextRenderer.js +301 -0
  239. package/dist/src/core/text-rendering/SdfTextRenderer.js.map +1 -0
  240. package/dist/src/core/text-rendering/TextLayoutEngine.d.ts +18 -0
  241. package/dist/src/core/text-rendering/TextLayoutEngine.js +380 -0
  242. package/dist/src/core/text-rendering/TextLayoutEngine.js.map +1 -0
  243. package/dist/src/core/text-rendering/TextRenderer.d.ts +384 -0
  244. package/dist/src/core/text-rendering/TextRenderer.js +2 -0
  245. package/dist/src/core/text-rendering/TextRenderer.js.map +1 -0
  246. package/dist/src/core/text-rendering/Utils.d.ts +30 -0
  247. package/dist/src/core/text-rendering/Utils.js +66 -0
  248. package/dist/src/core/text-rendering/Utils.js.map +1 -0
  249. package/dist/src/core/textures/ColorTexture.d.ts +1 -1
  250. package/dist/src/core/textures/ColorTexture.js +3 -22
  251. package/dist/src/core/textures/ColorTexture.js.map +1 -1
  252. package/dist/src/core/textures/ImageTexture.d.ts +13 -6
  253. package/dist/src/core/textures/ImageTexture.js +57 -66
  254. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  255. package/dist/src/core/textures/NoiseTexture.d.ts +3 -3
  256. package/dist/src/core/textures/NoiseTexture.js +8 -26
  257. package/dist/src/core/textures/NoiseTexture.js.map +1 -1
  258. package/dist/src/core/textures/RenderTexture.d.ts +7 -7
  259. package/dist/src/core/textures/RenderTexture.js +12 -30
  260. package/dist/src/core/textures/RenderTexture.js.map +1 -1
  261. package/dist/src/core/textures/SubTexture.d.ts +6 -8
  262. package/dist/src/core/textures/SubTexture.js +19 -55
  263. package/dist/src/core/textures/SubTexture.js.map +1 -1
  264. package/dist/src/core/textures/Texture.d.ts +90 -12
  265. package/dist/src/core/textures/Texture.js +160 -35
  266. package/dist/src/core/textures/Texture.js.map +1 -1
  267. package/dist/src/core/utils.d.ts +2 -1
  268. package/dist/src/core/utils.js +1 -19
  269. package/dist/src/core/utils.js.map +1 -1
  270. package/dist/src/main-api/INode.js.map +1 -1
  271. package/dist/src/main-api/Inspector.d.ts +135 -2
  272. package/dist/src/main-api/Inspector.js +507 -30
  273. package/dist/src/main-api/Inspector.js.map +1 -1
  274. package/dist/src/main-api/Renderer.d.ts +294 -81
  275. package/dist/src/main-api/Renderer.js +225 -96
  276. package/dist/src/main-api/Renderer.js.map +1 -1
  277. package/dist/src/utils.d.ts +19 -6
  278. package/dist/src/utils.js +32 -27
  279. package/dist/src/utils.js.map +1 -1
  280. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  281. package/dist/tsconfig.tsbuildinfo +1 -0
  282. package/exports/canvas-shaders.ts +0 -17
  283. package/exports/canvas.ts +1 -19
  284. package/exports/index.ts +6 -27
  285. package/exports/inspector.ts +0 -19
  286. package/exports/utils.ts +7 -19
  287. package/exports/webgl-shaders.ts +0 -16
  288. package/exports/webgl.ts +3 -20
  289. package/package.json +23 -22
  290. package/src/common/CommonTypes.ts +20 -22
  291. package/src/common/EventEmitter.ts +0 -19
  292. package/src/common/IAnimationController.ts +0 -18
  293. package/src/common/IEventEmitter.ts +0 -17
  294. package/src/core/Autosizer.ts +205 -0
  295. package/src/core/CoreNode.test.ts +376 -45
  296. package/src/core/CoreNode.ts +1017 -656
  297. package/src/core/CoreShaderManager.ts +3 -21
  298. package/src/core/CoreTextNode.ts +457 -314
  299. package/src/core/CoreTextureManager.ts +123 -168
  300. package/src/core/Stage.ts +526 -236
  301. package/src/core/TextureError.ts +46 -0
  302. package/src/core/TextureMemoryManager.ts +150 -167
  303. package/src/core/animations/AnimationManager.ts +0 -19
  304. package/src/core/animations/CoreAnimation.ts +15 -32
  305. package/src/core/animations/CoreAnimationController.ts +13 -23
  306. package/src/core/lib/ContextSpy.ts +0 -19
  307. package/src/core/lib/ImageWorker.ts +45 -32
  308. package/src/core/lib/Matrix3d.ts +7 -20
  309. package/src/core/lib/RenderCoords.ts +36 -67
  310. package/src/core/lib/WebGlContextWrapper.ts +196 -72
  311. package/src/core/lib/collectionUtils.ts +99 -0
  312. package/src/core/lib/colorCache.ts +20 -0
  313. package/src/core/{renderers/canvas/internal/ColorUtils.ts → lib/colorParser.ts} +2 -21
  314. package/src/core/lib/textureCompression.ts +433 -93
  315. package/src/core/lib/textureSvg.ts +0 -19
  316. package/src/core/lib/utils.ts +58 -19
  317. package/src/core/lib/validateImageBitmap.ts +17 -6
  318. package/src/core/platforms/Platform.ts +64 -0
  319. package/src/core/platforms/web/WebPlatform.ts +132 -0
  320. package/src/core/renderers/CoreContextTexture.ts +2 -20
  321. package/src/core/renderers/CoreRenderOp.ts +0 -19
  322. package/src/core/renderers/CoreRenderer.ts +16 -23
  323. package/src/core/renderers/CoreShaderNode.ts +37 -6
  324. package/src/core/renderers/CoreShaderProgram.ts +0 -19
  325. package/src/core/renderers/canvas/CanvasRenderer.ts +108 -137
  326. package/src/core/renderers/canvas/CanvasShaderNode.ts +3 -23
  327. package/src/core/renderers/canvas/CanvasTexture.ts +25 -37
  328. package/src/core/renderers/webgl/SdfRenderOp.ts +88 -0
  329. package/src/core/renderers/webgl/WebGlCtxRenderTexture.ts +18 -34
  330. package/src/core/renderers/webgl/WebGlCtxSubTexture.ts +50 -24
  331. package/src/core/renderers/webgl/WebGlCtxTexture.ts +134 -103
  332. package/src/core/renderers/webgl/WebGlRenderer.ts +368 -233
  333. package/src/core/renderers/webgl/WebGlShaderNode.ts +4 -7
  334. package/src/core/renderers/webgl/WebGlShaderProgram.ts +122 -76
  335. package/src/core/renderers/webgl/internal/BufferCollection.ts +15 -23
  336. package/src/core/renderers/webgl/internal/RendererUtils.ts +0 -19
  337. package/src/core/renderers/webgl/internal/ShaderUtils.ts +0 -19
  338. package/src/core/renderers/webgl/internal/WebGlUtils.ts +0 -19
  339. package/src/core/shaders/canvas/Border.ts +91 -50
  340. package/src/core/shaders/canvas/HolePunch.ts +4 -28
  341. package/src/core/shaders/canvas/LinearGradient.ts +10 -25
  342. package/src/core/shaders/canvas/RadialGradient.ts +23 -54
  343. package/src/core/shaders/canvas/Rounded.ts +2 -19
  344. package/src/core/shaders/canvas/RoundedWithBorder.ts +72 -35
  345. package/src/core/shaders/canvas/RoundedWithBorderAndShadow.ts +77 -47
  346. package/src/core/shaders/canvas/RoundedWithShadow.ts +21 -34
  347. package/src/core/shaders/canvas/Shadow.ts +0 -17
  348. package/src/core/shaders/canvas/utils/render.ts +45 -53
  349. package/src/core/shaders/templates/BorderTemplate.ts +42 -29
  350. package/src/core/shaders/templates/HolePunchTemplate.ts +5 -22
  351. package/src/core/shaders/templates/LinearGradientTemplate.ts +0 -17
  352. package/src/core/shaders/templates/RadialGradientTemplate.ts +10 -25
  353. package/src/core/shaders/templates/RoundedTemplate.ts +1 -18
  354. package/src/core/shaders/templates/RoundedWithBorderAndShadowTemplate.ts +1 -18
  355. package/src/core/shaders/templates/RoundedWithBorderTemplate.ts +7 -19
  356. package/src/core/shaders/templates/RoundedWithShadowTemplate.ts +1 -18
  357. package/src/core/shaders/templates/ShadowTemplate.ts +1 -18
  358. package/src/core/shaders/utils.ts +30 -0
  359. package/src/core/shaders/webgl/Border.ts +118 -55
  360. package/src/core/shaders/webgl/Default.ts +6 -43
  361. package/src/core/shaders/webgl/HolePunch.ts +4 -24
  362. package/src/core/shaders/webgl/LinearGradient.ts +73 -35
  363. package/src/core/shaders/webgl/RadialGradient.ts +58 -51
  364. package/src/core/shaders/webgl/Rounded.ts +25 -45
  365. package/src/core/shaders/webgl/RoundedWithBorder.ts +161 -63
  366. package/src/core/shaders/webgl/RoundedWithBorderAndShadow.ts +169 -68
  367. package/src/core/shaders/webgl/RoundedWithShadow.ts +73 -39
  368. package/src/core/shaders/webgl/SdfShader.ts +8 -41
  369. package/src/core/shaders/webgl/Shadow.ts +39 -35
  370. package/src/core/text-rendering/CanvasFontHandler.ts +285 -0
  371. package/src/core/text-rendering/CanvasTextRenderer.ts +236 -0
  372. package/src/core/text-rendering/SdfFontHandler.ts +566 -0
  373. package/src/core/text-rendering/SdfTextRenderer.ts +406 -0
  374. package/src/core/text-rendering/TextLayoutEngine.ts +672 -0
  375. package/src/core/text-rendering/TextRenderer.ts +426 -0
  376. package/src/core/text-rendering/Utils.ts +80 -0
  377. package/src/core/text-rendering/tests/TextLayoutEngine.test.ts +434 -0
  378. package/src/core/textures/ColorTexture.ts +7 -24
  379. package/src/core/textures/ImageTexture.ts +110 -92
  380. package/src/core/textures/NoiseTexture.ts +14 -31
  381. package/src/core/textures/RenderTexture.ts +18 -35
  382. package/src/core/textures/SubTexture.ts +25 -65
  383. package/src/core/textures/Texture.ts +214 -46
  384. package/src/core/utils.ts +9 -26
  385. package/src/main-api/INode.ts +0 -18
  386. package/src/main-api/Inspector.ts +794 -38
  387. package/src/main-api/Renderer.ts +519 -159
  388. package/src/utils.ts +64 -29
  389. package/dist/src/core/platform.d.ts +0 -10
  390. package/dist/src/core/platform.js +0 -56
  391. package/dist/src/core/platform.js.map +0 -1
  392. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.d.ts +0 -1
  393. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js +0 -217
  394. package/dist/src/core/renderers/canvas/internal/C2DShaderUtils.js.map +0 -1
  395. package/dist/src/core/renderers/canvas/internal/ColorUtils.js.map +0 -1
  396. package/dist/src/core/renderers/webgl/WebGlRenderOp.d.ts +0 -36
  397. package/dist/src/core/renderers/webgl/WebGlRenderOp.js +0 -107
  398. package/dist/src/core/renderers/webgl/WebGlRenderOp.js.map +0 -1
  399. package/dist/src/core/shaders/templates/shaderUtils.js +0 -41
  400. package/dist/src/core/shaders/templates/shaderUtils.js.map +0 -1
  401. package/dist/src/core/shaders/webgl/DefaultBatched.d.ts +0 -2
  402. package/dist/src/core/shaders/webgl/DefaultBatched.js +0 -104
  403. package/dist/src/core/shaders/webgl/DefaultBatched.js.map +0 -1
  404. package/dist/src/core/text-rendering/TextRenderingUtils.d.ts +0 -12
  405. package/dist/src/core/text-rendering/TextRenderingUtils.js +0 -14
  406. package/dist/src/core/text-rendering/TextRenderingUtils.js.map +0 -1
  407. package/dist/src/core/text-rendering/TextTextureRendererUtils.d.ts +0 -72
  408. package/dist/src/core/text-rendering/TextTextureRendererUtils.js +0 -217
  409. package/dist/src/core/text-rendering/TextTextureRendererUtils.js.map +0 -1
  410. package/dist/src/core/text-rendering/TrFontManager.d.ts +0 -26
  411. package/dist/src/core/text-rendering/TrFontManager.js +0 -131
  412. package/dist/src/core/text-rendering/TrFontManager.js.map +0 -1
  413. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.d.ts +0 -39
  414. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js +0 -125
  415. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.js.map +0 -1
  416. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.d.ts +0 -103
  417. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js +0 -21
  418. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.js.map +0 -1
  419. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.d.ts +0 -62
  420. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js +0 -88
  421. package/dist/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.js.map +0 -1
  422. package/dist/src/core/text-rendering/font-face-types/TrFontFace.d.ts +0 -118
  423. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js +0 -63
  424. package/dist/src/core/text-rendering/font-face-types/TrFontFace.js.map +0 -1
  425. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.d.ts +0 -14
  426. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js +0 -66
  427. package/dist/src/core/text-rendering/font-face-types/WebTrFontFace.js.map +0 -1
  428. package/dist/src/core/text-rendering/font-face-types/utils.d.ts +0 -1
  429. package/dist/src/core/text-rendering/font-face-types/utils.js +0 -38
  430. package/dist/src/core/text-rendering/font-face-types/utils.js.map +0 -1
  431. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +0 -59
  432. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +0 -397
  433. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +0 -1
  434. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.d.ts +0 -126
  435. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js +0 -551
  436. package/dist/src/core/text-rendering/renderers/LightningTextTextureRenderer.js.map +0 -1
  437. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +0 -91
  438. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +0 -611
  439. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +0 -1
  440. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.d.ts +0 -12
  441. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js +0 -61
  442. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.js.map +0 -1
  443. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.d.ts +0 -33
  444. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js +0 -52
  445. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.js.map +0 -1
  446. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.d.ts +0 -13
  447. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js +0 -32
  448. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.js.map +0 -1
  449. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.d.ts +0 -23
  450. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js +0 -84
  451. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.js.map +0 -1
  452. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.d.ts +0 -4
  453. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js +0 -34
  454. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.js.map +0 -1
  455. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.d.ts +0 -20
  456. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -308
  457. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +0 -1
  458. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.d.ts +0 -10
  459. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js +0 -40
  460. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.js.map +0 -1
  461. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.d.ts +0 -26
  462. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js +0 -70
  463. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.js.map +0 -1
  464. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.d.ts +0 -16
  465. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js +0 -39
  466. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.js.map +0 -1
  467. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +0 -370
  468. package/dist/src/core/text-rendering/renderers/TextRenderer.js +0 -178
  469. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +0 -1
  470. package/scripts/please-use-pnpm.js +0 -13
  471. package/src/core/platform.ts +0 -64
  472. package/src/core/renderers/canvas/internal/C2DShaderUtils.ts +0 -220
  473. package/src/core/renderers/webgl/WebGlRenderOp.ts +0 -145
  474. package/src/core/shaders/templates/shaderUtils.ts +0 -47
  475. package/src/core/shaders/webgl/DefaultBatched.ts +0 -129
  476. package/src/core/text-rendering/TextRenderingUtils.ts +0 -36
  477. package/src/core/text-rendering/TextTextureRendererUtils.ts +0 -263
  478. package/src/core/text-rendering/TrFontManager.ts +0 -183
  479. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +0 -176
  480. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +0 -139
  481. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +0 -173
  482. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +0 -171
  483. package/src/core/text-rendering/font-face-types/TrFontFace.ts +0 -187
  484. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +0 -94
  485. package/src/core/text-rendering/font-face-types/utils.ts +0 -39
  486. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +0 -509
  487. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +0 -815
  488. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +0 -841
  489. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +0 -48
  490. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +0 -66
  491. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +0 -52
  492. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +0 -32
  493. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +0 -117
  494. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +0 -133
  495. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +0 -38
  496. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -408
  497. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +0 -49
  498. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +0 -52
  499. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +0 -205
  500. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +0 -93
  501. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +0 -40
  502. package/src/core/text-rendering/renderers/TextRenderer.ts +0 -550
  503. /package/dist/src/core/{renderers/canvas/internal/ColorUtils.d.ts → lib/colorParser.d.ts} +0 -0
@@ -5,9 +5,63 @@ import {
5
5
  } from '../core/CoreNode.js';
6
6
  import { type RendererMainSettings } from './Renderer.js';
7
7
  import type { AnimationSettings } from '../core/animations/CoreAnimation.js';
8
- import type { IAnimationController } from '../common/IAnimationController.js';
8
+ import type {
9
+ IAnimationController,
10
+ AnimationControllerState,
11
+ } from '../common/IAnimationController.js';
9
12
  import { isProductionEnvironment } from '../utils.js';
10
- import type { CoreTextNode, CoreTextNodeProps } from '../core/CoreTextNode.js';
13
+ import { CoreTextNode, type CoreTextNodeProps } from '../core/CoreTextNode.js';
14
+ import type { Texture } from '../core/textures/Texture.js';
15
+ import { TextureType } from '../core/textures/Texture.js';
16
+
17
+ /**
18
+ * Inspector Options
19
+ *
20
+ * Configuration options for the Inspector's performance monitoring features.
21
+ */
22
+ export interface InspectorOptions {
23
+ /**
24
+ * Enable performance monitoring for setter calls
25
+ *
26
+ * @defaultValue true
27
+ */
28
+ enablePerformanceMonitoring: boolean;
29
+
30
+ /**
31
+ * Threshold for excessive setter calls before logging a warning
32
+ *
33
+ * @defaultValue 100
34
+ */
35
+ excessiveCallThreshold: number;
36
+
37
+ /**
38
+ * Time interval in milliseconds to reset the setter call counters
39
+ *
40
+ * @defaultValue 5000
41
+ */
42
+ resetInterval: number;
43
+
44
+ /**
45
+ * Enable animation monitoring and statistics tracking
46
+ *
47
+ * @defaultValue true
48
+ */
49
+ enableAnimationMonitoring: boolean;
50
+
51
+ /**
52
+ * Maximum number of animations to keep in history for statistics
53
+ *
54
+ * @defaultValue 1000
55
+ */
56
+ maxAnimationHistory: number;
57
+
58
+ /**
59
+ * Automatically print animation statistics every X seconds (0 to disable)
60
+ *
61
+ * @defaultValue 0
62
+ */
63
+ animationStatsInterval: number;
64
+ }
11
65
 
12
66
  /**
13
67
  * Inspector
@@ -48,16 +102,16 @@ const stylePropertyMap: {
48
102
  y: (y) => {
49
103
  return { prop: 'top', value: `${y}px` };
50
104
  },
51
- width: (w) => {
105
+ w: (w) => {
52
106
  if (w === 0) {
53
- return null;
107
+ return { prop: 'width', value: 'auto' };
54
108
  }
55
109
 
56
110
  return { prop: 'width', value: `${w}px` };
57
111
  },
58
- height: (h) => {
112
+ h: (h) => {
59
113
  if (h === 0) {
60
- return null;
114
+ return { prop: 'height', value: 'auto' };
61
115
  }
62
116
 
63
117
  return { prop: 'height', value: `${h}px` };
@@ -79,8 +133,6 @@ const stylePropertyMap: {
79
133
  zIndex: () => 'z-index',
80
134
  fontFamily: () => 'font-family',
81
135
  fontStyle: () => 'font-style',
82
- fontWeight: () => 'font-weight',
83
- fontStretch: () => 'font-stretch',
84
136
  letterSpacing: () => 'letter-spacing',
85
137
  textAlign: () => 'text-align',
86
138
  overflowSuffix: () => 'overflow-suffix',
@@ -154,6 +206,22 @@ const gradientColorPropertyMap = [
154
206
  'colorBr',
155
207
  ];
156
208
 
209
+ const textureTypeNames: Record<number, string> = {
210
+ [TextureType.generic]: 'generic',
211
+ [TextureType.color]: 'color',
212
+ [TextureType.image]: 'image',
213
+ [TextureType.noise]: 'noise',
214
+ [TextureType.renderToTexture]: 'renderToTexture',
215
+ [TextureType.subTexture]: 'subTexture',
216
+ };
217
+
218
+ interface TextureMetrics {
219
+ previousState: string;
220
+ loadedCount: number;
221
+ failedCount: number;
222
+ freedCount: number;
223
+ }
224
+
157
225
  const knownProperties = new Set<string>([
158
226
  ...Object.keys(stylePropertyMap),
159
227
  ...Object.keys(domPropertyMap),
@@ -161,23 +229,87 @@ const knownProperties = new Set<string>([
161
229
  'src',
162
230
  'parent',
163
231
  'data',
232
+ 'text',
164
233
  ]);
165
234
 
166
235
  export class Inspector {
167
236
  private root: HTMLElement | null = null;
168
237
  private canvas: HTMLCanvasElement | null = null;
238
+ private mutationObserver: MutationObserver = new MutationObserver(() => {});
239
+ private resizeObserver: ResizeObserver = new ResizeObserver(() => {});
169
240
  private height = 1080;
170
241
  private width = 1920;
171
242
  private scaleX = 1;
172
243
  private scaleY = 1;
244
+ private textureMetrics = new Map<Texture, TextureMetrics>();
245
+
246
+ // Performance monitoring for frequent setter calls
247
+ private static setterCallCount = new Map<
248
+ string,
249
+ { count: number; lastReset: number; nodeId: number }
250
+ >();
251
+
252
+ // Animation monitoring structures
253
+ private static activeAnimations = new Map<
254
+ string,
255
+ {
256
+ nodeId: number;
257
+ animationId: string;
258
+ startTime: number;
259
+ props: CoreNodeAnimateProps;
260
+ settings: AnimationSettings;
261
+ controller: IAnimationController;
262
+ state: AnimationControllerState;
263
+ }
264
+ >();
265
+
266
+ private static animationHistory: Array<{
267
+ nodeId: number;
268
+ animationId: string;
269
+ startTime: number;
270
+ endTime: number;
271
+ duration: number;
272
+ actualDuration: number;
273
+ props: CoreNodeAnimateProps;
274
+ settings: AnimationSettings;
275
+ completionType: 'finished' | 'stopped' | 'cancelled';
276
+ }> = [];
277
+
278
+ // Performance monitoring settings (configured via constructor)
279
+ private performanceSettings: InspectorOptions = {
280
+ enablePerformanceMonitoring: false,
281
+ excessiveCallThreshold: 100,
282
+ resetInterval: 5000,
283
+ enableAnimationMonitoring: false,
284
+ maxAnimationHistory: 1000,
285
+ animationStatsInterval: 0,
286
+ };
287
+
288
+ // Animation stats printing timer
289
+ private animationStatsTimer: number | null = null;
173
290
 
174
291
  constructor(canvas: HTMLCanvasElement, settings: RendererMainSettings) {
175
- if (isProductionEnvironment()) return;
292
+ if (isProductionEnvironment === true) return;
176
293
 
177
294
  if (!settings) {
178
295
  throw new Error('settings is required');
179
296
  }
180
297
 
298
+ // Initialize performance monitoring settings with defaults
299
+ this.performanceSettings = {
300
+ enablePerformanceMonitoring:
301
+ settings.inspectorOptions?.enablePerformanceMonitoring ?? false,
302
+ excessiveCallThreshold:
303
+ settings.inspectorOptions?.excessiveCallThreshold ?? 100,
304
+ resetInterval: settings.inspectorOptions?.resetInterval ?? 5000,
305
+ enableAnimationMonitoring:
306
+ settings.inspectorOptions?.enableAnimationMonitoring ?? false,
307
+ maxAnimationHistory:
308
+ settings.inspectorOptions?.maxAnimationHistory ?? 1000,
309
+ animationStatsInterval:
310
+ settings.inspectorOptions?.animationStatsInterval ?? 0,
311
+ };
312
+
181
313
  // calc dimensions based on the devicePixelRatio
182
314
  this.height = Math.ceil(
183
315
  settings.appHeight ?? 1080 / (settings.deviceLogicalPixelRatio ?? 1),
@@ -196,25 +328,395 @@ export class Inspector {
196
328
  document.body.appendChild(this.root);
197
329
 
198
330
  //listen for changes on canvas
199
- const mutationObserver = new MutationObserver(
331
+ this.mutationObserver = new MutationObserver(
200
332
  this.setRootPosition.bind(this),
201
333
  );
202
- mutationObserver.observe(canvas, {
334
+ this.mutationObserver.observe(canvas, {
203
335
  attributes: true,
204
336
  childList: false,
205
337
  subtree: false,
206
338
  });
207
339
 
208
340
  // Create a ResizeObserver to watch for changes in the element's size
209
- const resizeObserver = new ResizeObserver(this.setRootPosition.bind(this));
210
- resizeObserver.observe(canvas);
341
+ this.resizeObserver = new ResizeObserver(this.setRootPosition.bind(this));
342
+ this.resizeObserver.observe(canvas);
211
343
 
212
344
  //listen for changes on window
213
345
  window.addEventListener('resize', this.setRootPosition.bind(this));
214
346
 
347
+ // Start animation stats timer if enabled
348
+ this.startAnimationStatsTimer();
349
+
215
350
  console.warn('Inspector is enabled, this will impact performance');
216
351
  }
217
352
 
353
+ /**
354
+ * Track setter calls for performance monitoring
355
+ * Only active when Inspector is loaded
356
+ */
357
+ private trackSetterCall(nodeId: number, setterName: string): void {
358
+ if (!this.performanceSettings.enablePerformanceMonitoring) {
359
+ return;
360
+ }
361
+
362
+ const key = `${nodeId}_${setterName}`;
363
+ const now = Date.now();
364
+ const existing = Inspector.setterCallCount.get(key);
365
+
366
+ if (!existing) {
367
+ Inspector.setterCallCount.set(key, { count: 1, lastReset: now, nodeId });
368
+ return;
369
+ }
370
+
371
+ // Reset counter if enough time has passed
372
+ if (now - existing.lastReset > this.performanceSettings.resetInterval) {
373
+ existing.count = 1;
374
+ existing.lastReset = now;
375
+ return;
376
+ }
377
+
378
+ existing.count++;
379
+
380
+ // Log if threshold exceeded
381
+ if (existing.count === this.performanceSettings.excessiveCallThreshold) {
382
+ console.warn(
383
+ `🚨 Inspector Performance Warning: Setter '${setterName}' called ${existing.count} times in ${this.performanceSettings.resetInterval}ms on node ${nodeId}`,
384
+ );
385
+ } else if (
386
+ existing.count > this.performanceSettings.excessiveCallThreshold &&
387
+ existing.count % 50 === 0
388
+ ) {
389
+ console.warn(
390
+ `🚨 Inspector Performance Warning: Setter '${setterName}' called ${existing.count} times in ${this.performanceSettings.resetInterval}ms on node ${nodeId} (continuing...)`,
391
+ );
392
+ }
393
+ }
394
+
395
+ /**
396
+ * Get current performance monitoring statistics
397
+ */
398
+ public static getPerformanceStats(): Array<{
399
+ nodeId: number;
400
+ setterName: string;
401
+ count: number;
402
+ timeWindow: number;
403
+ }> {
404
+ const stats: Array<{
405
+ nodeId: number;
406
+ setterName: string;
407
+ count: number;
408
+ timeWindow: number;
409
+ }> = [];
410
+ const now = Date.now();
411
+
412
+ Inspector.setterCallCount.forEach((data, key) => {
413
+ const parts = key.split('_');
414
+ const nodeIdStr = parts[0];
415
+ const setterName = parts[1];
416
+
417
+ if (nodeIdStr && setterName) {
418
+ const timeWindow = now - data.lastReset;
419
+
420
+ stats.push({
421
+ nodeId: parseInt(nodeIdStr, 10),
422
+ setterName,
423
+ count: data.count,
424
+ timeWindow,
425
+ });
426
+ }
427
+ });
428
+
429
+ return stats.sort((a, b) => b.count - a.count);
430
+ }
431
+
432
+ /**
433
+ * Clear performance monitoring statistics
434
+ */
435
+ public static clearPerformanceStats(): void {
436
+ Inspector.setterCallCount.clear();
437
+ }
438
+
439
+ /**
440
+ * Generate a unique animation ID
441
+ */
442
+ private static generateAnimationId(): string {
443
+ return `anim_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
444
+ }
445
+
446
+ /**
447
+ * Wrap animation controller with monitoring capabilities
448
+ */
449
+ private wrapAnimationController(
450
+ controller: IAnimationController,
451
+ nodeId: number,
452
+ props: CoreNodeAnimateProps,
453
+ settings: AnimationSettings,
454
+ div: HTMLElement,
455
+ ): IAnimationController {
456
+ if (!this.performanceSettings.enableAnimationMonitoring) {
457
+ // Just add the basic DOM animation without tracking
458
+ const originalStart = controller.start.bind(controller);
459
+ controller.start = () => {
460
+ this.animateNode(div, props, settings);
461
+ return originalStart();
462
+ };
463
+ return controller;
464
+ }
465
+
466
+ const animationId = Inspector.generateAnimationId();
467
+
468
+ // Create wrapper controller
469
+ const wrappedController: IAnimationController = {
470
+ start: () => {
471
+ this.trackAnimationStart(
472
+ animationId,
473
+ nodeId,
474
+ props,
475
+ settings,
476
+ controller,
477
+ );
478
+ this.animateNode(div, props, settings);
479
+ return controller.start();
480
+ },
481
+
482
+ stop: () => {
483
+ this.trackAnimationEnd(animationId, 'stopped');
484
+ return controller.stop();
485
+ },
486
+
487
+ pause: () => {
488
+ this.updateAnimationState(animationId, 'paused');
489
+ return controller.pause();
490
+ },
491
+
492
+ restore: () => {
493
+ this.trackAnimationEnd(animationId, 'cancelled');
494
+ return controller.restore();
495
+ },
496
+
497
+ waitUntilStopped: () => {
498
+ return controller.waitUntilStopped().then(() => {
499
+ this.trackAnimationEnd(animationId, 'finished');
500
+ });
501
+ },
502
+
503
+ get state() {
504
+ return controller.state;
505
+ },
506
+
507
+ // Event emitter methods
508
+ on: controller.on.bind(controller),
509
+ off: controller.off.bind(controller),
510
+ once: controller.once.bind(controller),
511
+ emit: controller.emit.bind(controller),
512
+ };
513
+
514
+ // Track animation events
515
+ controller.on('animating', () => {
516
+ this.updateAnimationState(animationId, 'running');
517
+ });
518
+
519
+ controller.on('stopped', () => {
520
+ this.trackAnimationEnd(animationId, 'finished');
521
+ });
522
+
523
+ return wrappedController;
524
+ }
525
+
526
+ /**
527
+ * Track animation start
528
+ */
529
+ private trackAnimationStart(
530
+ animationId: string,
531
+ nodeId: number,
532
+ props: CoreNodeAnimateProps,
533
+ settings: AnimationSettings,
534
+ controller: IAnimationController,
535
+ ): void {
536
+ const startTime = Date.now();
537
+
538
+ Inspector.activeAnimations.set(animationId, {
539
+ nodeId,
540
+ animationId,
541
+ startTime,
542
+ props,
543
+ settings,
544
+ controller,
545
+ state: 'scheduled',
546
+ });
547
+ }
548
+
549
+ /**
550
+ * Update animation state
551
+ */
552
+ private updateAnimationState(
553
+ animationId: string,
554
+ state: AnimationControllerState,
555
+ ): void {
556
+ const animation = Inspector.activeAnimations.get(animationId);
557
+ if (animation) {
558
+ animation.state = state;
559
+ }
560
+ }
561
+
562
+ /**
563
+ * Track animation end
564
+ */
565
+ private trackAnimationEnd(
566
+ animationId: string,
567
+ completionType: 'finished' | 'stopped' | 'cancelled',
568
+ ): void {
569
+ const animation = Inspector.activeAnimations.get(animationId);
570
+ if (!animation) return;
571
+
572
+ const endTime = Date.now();
573
+ const actualDuration = endTime - animation.startTime;
574
+ const expectedDuration = animation.settings.duration || 1000;
575
+
576
+ // Move to history
577
+ Inspector.animationHistory.unshift({
578
+ nodeId: animation.nodeId,
579
+ animationId: animation.animationId,
580
+ startTime: animation.startTime,
581
+ endTime,
582
+ duration: expectedDuration,
583
+ actualDuration,
584
+ props: animation.props,
585
+ settings: animation.settings,
586
+ completionType,
587
+ });
588
+
589
+ // Limit history size for performance
590
+ if (
591
+ Inspector.animationHistory.length >
592
+ this.performanceSettings.maxAnimationHistory
593
+ ) {
594
+ Inspector.animationHistory.splice(
595
+ this.performanceSettings.maxAnimationHistory,
596
+ );
597
+ }
598
+
599
+ // Remove from active animations
600
+ Inspector.activeAnimations.delete(animationId);
601
+ }
602
+
603
+ /**
604
+ * Get currently active animations
605
+ */
606
+ public static getActiveAnimations(): Array<{
607
+ nodeId: number;
608
+ animationId: string;
609
+ startTime: number;
610
+ duration: number;
611
+ elapsedTime: number;
612
+ props: CoreNodeAnimateProps;
613
+ settings: AnimationSettings;
614
+ state: AnimationControllerState;
615
+ }> {
616
+ const now = Date.now();
617
+ const activeAnimations: Array<{
618
+ nodeId: number;
619
+ animationId: string;
620
+ startTime: number;
621
+ duration: number;
622
+ elapsedTime: number;
623
+ props: CoreNodeAnimateProps;
624
+ settings: AnimationSettings;
625
+ state: AnimationControllerState;
626
+ }> = [];
627
+
628
+ Inspector.activeAnimations.forEach((animation) => {
629
+ activeAnimations.push({
630
+ nodeId: animation.nodeId,
631
+ animationId: animation.animationId,
632
+ startTime: animation.startTime,
633
+ duration: animation.settings.duration || 1000,
634
+ elapsedTime: now - animation.startTime,
635
+ props: animation.props,
636
+ settings: animation.settings,
637
+ state: animation.state,
638
+ });
639
+ });
640
+
641
+ return activeAnimations.sort((a, b) => b.startTime - a.startTime);
642
+ }
643
+
644
+ /**
645
+ * Get animation statistics
646
+ */
647
+ public static getAnimationStats(): {
648
+ totalAnimations: number;
649
+ activeCount: number;
650
+ averageDuration: number;
651
+ } {
652
+ const totalAnimations = Inspector.animationHistory.length;
653
+ const activeCount = Inspector.activeAnimations.size;
654
+
655
+ // Calculate average duration from finished animations only
656
+ const finishedAnimations = Inspector.animationHistory.filter(
657
+ (anim) => anim.completionType === 'finished',
658
+ );
659
+
660
+ const averageDuration =
661
+ finishedAnimations.length > 0
662
+ ? finishedAnimations.reduce(
663
+ (sum, anim) => sum + anim.actualDuration,
664
+ 0,
665
+ ) / finishedAnimations.length
666
+ : 0;
667
+
668
+ return {
669
+ totalAnimations,
670
+ activeCount,
671
+ averageDuration,
672
+ };
673
+ }
674
+
675
+ /**
676
+ * Clear animation monitoring data
677
+ */
678
+ public static clearAnimationStats(): void {
679
+ Inspector.activeAnimations.clear();
680
+ Inspector.animationHistory.length = 0;
681
+ }
682
+
683
+ /**
684
+ * Start the animation stats timer if enabled
685
+ */
686
+ private startAnimationStatsTimer(): void {
687
+ console.log(
688
+ `Starting animation stats timer with interval: ${this.performanceSettings.animationStatsInterval} seconds`,
689
+ );
690
+
691
+ if (this.performanceSettings.animationStatsInterval > 0) {
692
+ this.animationStatsTimer = setInterval(() => {
693
+ this.printAnimationStats();
694
+ }, this.performanceSettings.animationStatsInterval * 1000) as unknown as number;
695
+ }
696
+ }
697
+
698
+ /**
699
+ * Stop the animation stats timer
700
+ */
701
+ private stopAnimationStatsTimer(): void {
702
+ if (this.animationStatsTimer) {
703
+ clearInterval(this.animationStatsTimer);
704
+ this.animationStatsTimer = null;
705
+ }
706
+ }
707
+
708
+ /**
709
+ * Print current animation statistics to console
710
+ */
711
+ private printAnimationStats(): void {
712
+ const stats = Inspector.getAnimationStats();
713
+
714
+ console.log(
715
+ `🎬 Animation Stats: ${stats.activeCount} active, ${
716
+ stats.totalAnimations
717
+ } completed, ${Math.round(stats.averageDuration)}ms avg duration`,
718
+ );
719
+ }
218
720
  setRootPosition() {
219
721
  if (this.root === null || this.canvas === null) {
220
722
  return;
@@ -259,6 +761,24 @@ export class Inspector {
259
761
  return div;
260
762
  }
261
763
 
764
+ createNodes(node: CoreNode): boolean {
765
+ if (this.root === null) {
766
+ return false;
767
+ }
768
+
769
+ const div = this.root.querySelector(`[id="${node.id}"]`);
770
+ if (div === null && node instanceof CoreTextNode) {
771
+ this.createTextNode(node);
772
+ } else if (div === null && node instanceof CoreNode) {
773
+ this.createNode(node);
774
+ }
775
+
776
+ for (const child of node.children) {
777
+ this.createNodes(child);
778
+ }
779
+ return true;
780
+ }
781
+
262
782
  createNode(node: CoreNode): CoreNode {
263
783
  const div = this.createDiv(node.id, node.props);
264
784
  (div as HTMLElement & { node: CoreNode }).node = node;
@@ -272,10 +792,13 @@ export class Inspector {
272
792
  return this.createProxy(node, div);
273
793
  }
274
794
 
275
- createTextNode(node: CoreNode): CoreTextNode {
276
- const div = this.createDiv(node.id, node.props);
795
+ createTextNode(node: CoreTextNode): CoreTextNode {
796
+ // eslint-disable-next-line
797
+ // @ts-ignore - textProps is a private property and keeping it that way
798
+ // but we need it from the inspector to set the initial properties on the div element
799
+ const div = this.createDiv(node.id, node.textProps);
277
800
  (div as HTMLElement & { node: CoreNode }).node = node;
278
- (node as CoreNode & { div: HTMLElement }).div = div;
801
+ (node as CoreTextNode & { div: HTMLElement }).div = div;
279
802
 
280
803
  return this.createProxy(node, div) as CoreTextNode;
281
804
  }
@@ -284,6 +807,94 @@ export class Inspector {
284
807
  node: CoreNode | CoreTextNode,
285
808
  div: HTMLElement,
286
809
  ): CoreNode | CoreTextNode {
810
+ // Store texture event listeners for cleanup
811
+ const textureListeners = new Map<
812
+ Texture,
813
+ {
814
+ onLoaded: () => void;
815
+ onFailed: () => void;
816
+ onFreed: () => void;
817
+ }
818
+ >();
819
+
820
+ const coreNodeListeners = new Map<
821
+ CoreNode,
822
+ {
823
+ onLoaded: () => void;
824
+ }
825
+ >();
826
+
827
+ const setupCoreNodeListeners = (coreNode: CoreNode) => {
828
+ const onLoaded = () => {
829
+ this.updateTextNodeDimensions(div, coreNode as CoreTextNode);
830
+ };
831
+ coreNode.on('loaded', onLoaded);
832
+ coreNodeListeners.set(coreNode, { onLoaded });
833
+ };
834
+
835
+ // Helper function to setup texture event listeners
836
+ const setupTextureListeners = (texture: Texture | null) => {
837
+ // Clean up existing listeners first
838
+ textureListeners.forEach((listeners, oldTexture) => {
839
+ oldTexture.off('loaded', listeners.onLoaded);
840
+ oldTexture.off('failed', listeners.onFailed);
841
+ oldTexture.off('freed', listeners.onFreed);
842
+ });
843
+ textureListeners.clear();
844
+
845
+ // Setup new listeners if texture exists
846
+ if (texture) {
847
+ // Initialize metrics if not exists
848
+ if (!this.textureMetrics.has(texture)) {
849
+ this.textureMetrics.set(texture, {
850
+ previousState: texture.state,
851
+ loadedCount: 0,
852
+ failedCount: 0,
853
+ freedCount: 0,
854
+ });
855
+ }
856
+
857
+ const onLoaded = () => {
858
+ const metrics = this.textureMetrics.get(texture);
859
+ if (metrics) {
860
+ metrics.previousState =
861
+ metrics.previousState !== texture.state
862
+ ? metrics.previousState
863
+ : 'loading';
864
+ metrics.loadedCount++;
865
+ }
866
+ this.updateTextureAttributes(div, texture);
867
+ };
868
+ const onFailed = () => {
869
+ const metrics = this.textureMetrics.get(texture);
870
+ if (metrics) {
871
+ metrics.previousState =
872
+ metrics.previousState !== texture.state
873
+ ? metrics.previousState
874
+ : 'loading';
875
+ metrics.failedCount++;
876
+ }
877
+ this.updateTextureAttributes(div, texture);
878
+ };
879
+ const onFreed = () => {
880
+ const metrics = this.textureMetrics.get(texture);
881
+ if (metrics) {
882
+ metrics.previousState =
883
+ metrics.previousState !== texture.state
884
+ ? metrics.previousState
885
+ : texture.state;
886
+ metrics.freedCount++;
887
+ }
888
+ this.updateTextureAttributes(div, texture);
889
+ };
890
+
891
+ texture.on('loaded', onLoaded);
892
+ texture.on('failed', onFailed);
893
+ texture.on('freed', onFreed);
894
+
895
+ textureListeners.set(texture, { onLoaded, onFailed, onFreed });
896
+ }
897
+ };
287
898
  // Define traps for each property in knownProperties
288
899
  knownProperties.forEach((property) => {
289
900
  let originalProp = Object.getOwnPropertyDescriptor(node, property);
@@ -298,12 +909,19 @@ export class Inspector {
298
909
  return;
299
910
  }
300
911
 
912
+ if (property === 'text') {
913
+ setupCoreNodeListeners(node);
914
+ }
915
+
301
916
  Object.defineProperty(node, property, {
302
917
  get() {
303
918
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
304
919
  return originalProp?.get?.call(node);
305
920
  },
306
921
  set: (value) => {
922
+ // Track setter call for performance monitoring
923
+ this.trackSetterCall(node.id, property);
924
+
307
925
  originalProp?.set?.call(node, value);
308
926
  this.updateNodeProperty(
309
927
  div,
@@ -311,6 +929,15 @@ export class Inspector {
311
929
  value,
312
930
  node.props,
313
931
  );
932
+
933
+ // Setup texture event listeners if this is a texture property
934
+ if (property === 'texture') {
935
+ const textureValue =
936
+ value && typeof value === 'object' && 'state' in value
937
+ ? (value as Texture)
938
+ : null;
939
+ setupTextureListeners(textureValue);
940
+ }
314
941
  },
315
942
  configurable: true,
316
943
  enumerable: true,
@@ -319,10 +946,26 @@ export class Inspector {
319
946
 
320
947
  const originalDestroy = node.destroy;
321
948
  Object.defineProperty(node, 'destroy', {
322
- value: () => {
949
+ value: (isChild: boolean = false) => {
950
+ // Clean up texture event listeners and metrics
951
+ textureListeners.forEach((listeners, texture) => {
952
+ texture.off('loaded', listeners.onLoaded);
953
+ texture.off('failed', listeners.onFailed);
954
+ texture.off('freed', listeners.onFreed);
955
+ // Clean up metrics for this texture
956
+ this.textureMetrics.delete(texture);
957
+ });
958
+ textureListeners.clear();
959
+
960
+ coreNodeListeners.forEach((listeners, coreNode) => {
961
+ coreNode.off('loaded', listeners.onLoaded);
962
+ });
963
+ coreNodeListeners.clear();
964
+
323
965
  this.destroyNode(node.id);
324
- originalDestroy.call(node);
966
+ originalDestroy.call(node, isChild);
325
967
  },
968
+ configurable: true,
326
969
  });
327
970
 
328
971
  const originalAnimate = node.animate;
@@ -333,21 +976,119 @@ export class Inspector {
333
976
  ): IAnimationController => {
334
977
  const animationController = originalAnimate.call(node, props, settings);
335
978
 
336
- const originalStart =
337
- animationController.start.bind(animationController);
338
- animationController.start = () => {
339
- this.animateNode(div, props, settings);
340
-
341
- return originalStart();
342
- };
343
-
344
- return animationController;
979
+ // Wrap animation controller with monitoring
980
+ return this.wrapAnimationController(
981
+ animationController,
982
+ node.id,
983
+ props,
984
+ settings,
985
+ div,
986
+ );
345
987
  },
988
+ configurable: true,
346
989
  });
347
990
 
348
991
  return node;
349
992
  }
350
993
 
994
+ updateTextNodeDimensions(div: HTMLElement, node: CoreTextNode) {
995
+ const textMetrics = node.renderInfo;
996
+ if (textMetrics) {
997
+ div.style.width = `${textMetrics.width}px`;
998
+ div.style.height = `${textMetrics.height}px`;
999
+ } else {
1000
+ div.style.removeProperty('width');
1001
+ div.style.removeProperty('height');
1002
+ }
1003
+ }
1004
+
1005
+ updateTextureAttributes(div: HTMLElement, texture: Texture) {
1006
+ // Update texture state
1007
+ div.setAttribute('data-texture-state', texture.state);
1008
+
1009
+ // Update texture type
1010
+ div.setAttribute(
1011
+ 'data-texture-type',
1012
+ textureTypeNames[texture.type] || 'unknown',
1013
+ );
1014
+
1015
+ // Update texture dimensions if available
1016
+ if (texture.dimensions) {
1017
+ div.setAttribute('data-texture-width', String(texture.dimensions.w));
1018
+ div.setAttribute('data-texture-height', String(texture.dimensions.h));
1019
+ } else {
1020
+ div.removeAttribute('data-texture-width');
1021
+ div.removeAttribute('data-texture-height');
1022
+ }
1023
+
1024
+ // Update renderable owners count
1025
+ div.setAttribute(
1026
+ 'data-texture-owners',
1027
+ String(texture.renderableOwners.length),
1028
+ );
1029
+
1030
+ // Update retry count
1031
+ div.setAttribute('data-texture-retry-count', String(texture.retryCount));
1032
+
1033
+ // Update max retry count if available
1034
+ if (texture.maxRetryCount !== null) {
1035
+ div.setAttribute(
1036
+ 'data-texture-max-retry-count',
1037
+ String(texture.maxRetryCount),
1038
+ );
1039
+ } else {
1040
+ div.removeAttribute('data-texture-max-retry-count');
1041
+ }
1042
+
1043
+ // Update metrics if available
1044
+ const metrics = this.textureMetrics.get(texture);
1045
+ if (metrics) {
1046
+ div.setAttribute('data-texture-previous-state', metrics.previousState);
1047
+ div.setAttribute(
1048
+ 'data-texture-loaded-count',
1049
+ String(metrics.loadedCount),
1050
+ );
1051
+ div.setAttribute(
1052
+ 'data-texture-failed-count',
1053
+ String(metrics.failedCount),
1054
+ );
1055
+ div.setAttribute('data-texture-freed-count', String(metrics.freedCount));
1056
+ } else {
1057
+ div.removeAttribute('data-texture-previous-state');
1058
+ div.removeAttribute('data-texture-loaded-count');
1059
+ div.removeAttribute('data-texture-failed-count');
1060
+ div.removeAttribute('data-texture-freed-count');
1061
+ }
1062
+
1063
+ // Update error information if present
1064
+ if (texture.error) {
1065
+ div.setAttribute(
1066
+ 'data-texture-error',
1067
+ texture.error.code || texture.error.message,
1068
+ );
1069
+ } else {
1070
+ div.removeAttribute('data-texture-error');
1071
+ }
1072
+ }
1073
+
1074
+ public destroy() {
1075
+ // Stop animation stats timer
1076
+ this.stopAnimationStatsTimer();
1077
+
1078
+ // Remove DOM observers
1079
+ this.mutationObserver.disconnect();
1080
+ this.resizeObserver.disconnect();
1081
+
1082
+ // Remove resize listener
1083
+ window.removeEventListener('resize', this.setRootPosition.bind(this));
1084
+ if (this.root && this.root.parentNode) {
1085
+ this.root.remove();
1086
+ }
1087
+
1088
+ // Clean up animation monitoring data
1089
+ Inspector.clearAnimationStats();
1090
+ }
1091
+
351
1092
  destroyNode(id: number) {
352
1093
  const div = document.getElementById(id.toString());
353
1094
  div?.remove();
@@ -386,9 +1127,11 @@ export class Inspector {
386
1127
  if (property === 'text') {
387
1128
  div.innerHTML = String(value);
388
1129
 
389
- // hide text because we can't render SDF fonts
390
- // it would look weird and obstruct the WebGL rendering
391
- div.style.visibility = 'hidden';
1130
+ // Keep DOM text invisible without breaking visibility checks
1131
+ // Use very low opacity (0.001) instead of 0 so Playwright still detects it
1132
+ div.style.opacity = '0.001';
1133
+ div.style.pointerEvents = 'none';
1134
+ div.style.userSelect = 'none';
392
1135
  return;
393
1136
  }
394
1137
 
@@ -430,14 +1173,14 @@ export class Inspector {
430
1173
  let value = mappedStyleResponse.value;
431
1174
  if (property === 'x') {
432
1175
  const mount = props.mountX;
433
- const width = props.width;
1176
+ const width = props.w;
434
1177
 
435
1178
  if (mount) {
436
1179
  value = `${parseInt(value) - width * mount}px`;
437
1180
  }
438
1181
  } else if (property === 'y') {
439
1182
  const mount = props.mountY;
440
- const height = props.height;
1183
+ const height = props.h;
441
1184
 
442
1185
  if (mount) {
443
1186
  value = `${parseInt(value) - height * mount}px`;
@@ -475,6 +1218,19 @@ export class Inspector {
475
1218
  }
476
1219
  }
477
1220
 
1221
+ updateViewport(
1222
+ width: number,
1223
+ height: number,
1224
+ deviceLogicalPixelRatio: number,
1225
+ ) {
1226
+ this.scaleX = deviceLogicalPixelRatio ?? 1;
1227
+ this.scaleY = deviceLogicalPixelRatio ?? 1;
1228
+
1229
+ this.width = width;
1230
+ this.height = height;
1231
+ this.setRootPosition();
1232
+ }
1233
+
478
1234
  // simple animation handler
479
1235
  animateNode(
480
1236
  div: HTMLElement,
@@ -493,8 +1249,8 @@ export class Inspector {
493
1249
  const {
494
1250
  x,
495
1251
  y,
496
- width,
497
- height,
1252
+ w,
1253
+ h,
498
1254
  alpha = 1,
499
1255
  rotation = 0,
500
1256
  scale = 1,
@@ -506,10 +1262,10 @@ export class Inspector {
506
1262
  // ignoring loops and repeats for now, as that might be a bit too much for the inspector
507
1263
  function animate() {
508
1264
  setTimeout(() => {
509
- div.style.top = `${y - height * mountY}px`;
510
- div.style.left = `${x - width * mountX}px`;
511
- div.style.width = `${width}px`;
512
- div.style.height = `${height}px`;
1265
+ div.style.top = `${y - h * mountY}px`;
1266
+ div.style.left = `${x - w * mountX}px`;
1267
+ div.style.width = `${w}px`;
1268
+ div.style.height = `${h}px`;
513
1269
  div.style.opacity = `${alpha}`;
514
1270
  div.style.rotate = `${rotation}rad`;
515
1271
  div.style.scale = `${scale}`;