@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
@@ -1,6 +1,8 @@
1
1
  import { CoreNode, } from '../core/CoreNode.js';
2
2
  import {} from './Renderer.js';
3
3
  import { isProductionEnvironment } from '../utils.js';
4
+ import { CoreTextNode } from '../core/CoreTextNode.js';
5
+ import { TextureType } from '../core/textures/Texture.js';
4
6
  const stylePropertyMap = {
5
7
  alpha: (v) => {
6
8
  if (v === 1) {
@@ -14,15 +16,15 @@ const stylePropertyMap = {
14
16
  y: (y) => {
15
17
  return { prop: 'top', value: `${y}px` };
16
18
  },
17
- width: (w) => {
19
+ w: (w) => {
18
20
  if (w === 0) {
19
- return null;
21
+ return { prop: 'width', value: 'auto' };
20
22
  }
21
23
  return { prop: 'width', value: `${w}px` };
22
24
  },
23
- height: (h) => {
25
+ h: (h) => {
24
26
  if (h === 0) {
25
- return null;
27
+ return { prop: 'height', value: 'auto' };
26
28
  }
27
29
  return { prop: 'height', value: `${h}px` };
28
30
  },
@@ -41,8 +43,6 @@ const stylePropertyMap = {
41
43
  zIndex: () => 'z-index',
42
44
  fontFamily: () => 'font-family',
43
45
  fontStyle: () => 'font-style',
44
- fontWeight: () => 'font-weight',
45
- fontStretch: () => 'font-stretch',
46
46
  letterSpacing: () => 'letter-spacing',
47
47
  textAlign: () => 'text-align',
48
48
  overflowSuffix: () => 'overflow-suffix',
@@ -106,6 +106,14 @@ const gradientColorPropertyMap = [
106
106
  'colorBl',
107
107
  'colorBr',
108
108
  ];
109
+ const textureTypeNames = {
110
+ [TextureType.generic]: 'generic',
111
+ [TextureType.color]: 'color',
112
+ [TextureType.image]: 'image',
113
+ [TextureType.noise]: 'noise',
114
+ [TextureType.renderToTexture]: 'renderToTexture',
115
+ [TextureType.subTexture]: 'subTexture',
116
+ };
109
117
  const knownProperties = new Set([
110
118
  ...Object.keys(stylePropertyMap),
111
119
  ...Object.keys(domPropertyMap),
@@ -113,20 +121,49 @@ const knownProperties = new Set([
113
121
  'src',
114
122
  'parent',
115
123
  'data',
124
+ 'text',
116
125
  ]);
117
126
  export class Inspector {
118
127
  root = null;
119
128
  canvas = null;
129
+ mutationObserver = new MutationObserver(() => { });
130
+ resizeObserver = new ResizeObserver(() => { });
120
131
  height = 1080;
121
132
  width = 1920;
122
133
  scaleX = 1;
123
134
  scaleY = 1;
135
+ textureMetrics = new Map();
136
+ // Performance monitoring for frequent setter calls
137
+ static setterCallCount = new Map();
138
+ // Animation monitoring structures
139
+ static activeAnimations = new Map();
140
+ static animationHistory = [];
141
+ // Performance monitoring settings (configured via constructor)
142
+ performanceSettings = {
143
+ enablePerformanceMonitoring: false,
144
+ excessiveCallThreshold: 100,
145
+ resetInterval: 5000,
146
+ enableAnimationMonitoring: false,
147
+ maxAnimationHistory: 1000,
148
+ animationStatsInterval: 0,
149
+ };
150
+ // Animation stats printing timer
151
+ animationStatsTimer = null;
124
152
  constructor(canvas, settings) {
125
- if (isProductionEnvironment())
153
+ if (isProductionEnvironment === true)
126
154
  return;
127
155
  if (!settings) {
128
156
  throw new Error('settings is required');
129
157
  }
158
+ // Initialize performance monitoring settings with defaults
159
+ this.performanceSettings = {
160
+ enablePerformanceMonitoring: settings.inspectorOptions?.enablePerformanceMonitoring ?? false,
161
+ excessiveCallThreshold: settings.inspectorOptions?.excessiveCallThreshold ?? 100,
162
+ resetInterval: settings.inspectorOptions?.resetInterval ?? 5000,
163
+ enableAnimationMonitoring: settings.inspectorOptions?.enableAnimationMonitoring ?? false,
164
+ maxAnimationHistory: settings.inspectorOptions?.maxAnimationHistory ?? 1000,
165
+ animationStatsInterval: settings.inspectorOptions?.animationStatsInterval ?? 0,
166
+ };
130
167
  // calc dimensions based on the devicePixelRatio
131
168
  this.height = Math.ceil(settings.appHeight ?? 1080 / (settings.deviceLogicalPixelRatio ?? 1));
132
169
  this.width = Math.ceil(settings.appWidth ?? 1920 / (settings.deviceLogicalPixelRatio ?? 1));
@@ -137,19 +174,267 @@ export class Inspector {
137
174
  this.setRootPosition();
138
175
  document.body.appendChild(this.root);
139
176
  //listen for changes on canvas
140
- const mutationObserver = new MutationObserver(this.setRootPosition.bind(this));
141
- mutationObserver.observe(canvas, {
177
+ this.mutationObserver = new MutationObserver(this.setRootPosition.bind(this));
178
+ this.mutationObserver.observe(canvas, {
142
179
  attributes: true,
143
180
  childList: false,
144
181
  subtree: false,
145
182
  });
146
183
  // Create a ResizeObserver to watch for changes in the element's size
147
- const resizeObserver = new ResizeObserver(this.setRootPosition.bind(this));
148
- resizeObserver.observe(canvas);
184
+ this.resizeObserver = new ResizeObserver(this.setRootPosition.bind(this));
185
+ this.resizeObserver.observe(canvas);
149
186
  //listen for changes on window
150
187
  window.addEventListener('resize', this.setRootPosition.bind(this));
188
+ // Start animation stats timer if enabled
189
+ this.startAnimationStatsTimer();
151
190
  console.warn('Inspector is enabled, this will impact performance');
152
191
  }
192
+ /**
193
+ * Track setter calls for performance monitoring
194
+ * Only active when Inspector is loaded
195
+ */
196
+ trackSetterCall(nodeId, setterName) {
197
+ if (!this.performanceSettings.enablePerformanceMonitoring) {
198
+ return;
199
+ }
200
+ const key = `${nodeId}_${setterName}`;
201
+ const now = Date.now();
202
+ const existing = Inspector.setterCallCount.get(key);
203
+ if (!existing) {
204
+ Inspector.setterCallCount.set(key, { count: 1, lastReset: now, nodeId });
205
+ return;
206
+ }
207
+ // Reset counter if enough time has passed
208
+ if (now - existing.lastReset > this.performanceSettings.resetInterval) {
209
+ existing.count = 1;
210
+ existing.lastReset = now;
211
+ return;
212
+ }
213
+ existing.count++;
214
+ // Log if threshold exceeded
215
+ if (existing.count === this.performanceSettings.excessiveCallThreshold) {
216
+ console.warn(`🚨 Inspector Performance Warning: Setter '${setterName}' called ${existing.count} times in ${this.performanceSettings.resetInterval}ms on node ${nodeId}`);
217
+ }
218
+ else if (existing.count > this.performanceSettings.excessiveCallThreshold &&
219
+ existing.count % 50 === 0) {
220
+ console.warn(`🚨 Inspector Performance Warning: Setter '${setterName}' called ${existing.count} times in ${this.performanceSettings.resetInterval}ms on node ${nodeId} (continuing...)`);
221
+ }
222
+ }
223
+ /**
224
+ * Get current performance monitoring statistics
225
+ */
226
+ static getPerformanceStats() {
227
+ const stats = [];
228
+ const now = Date.now();
229
+ Inspector.setterCallCount.forEach((data, key) => {
230
+ const parts = key.split('_');
231
+ const nodeIdStr = parts[0];
232
+ const setterName = parts[1];
233
+ if (nodeIdStr && setterName) {
234
+ const timeWindow = now - data.lastReset;
235
+ stats.push({
236
+ nodeId: parseInt(nodeIdStr, 10),
237
+ setterName,
238
+ count: data.count,
239
+ timeWindow,
240
+ });
241
+ }
242
+ });
243
+ return stats.sort((a, b) => b.count - a.count);
244
+ }
245
+ /**
246
+ * Clear performance monitoring statistics
247
+ */
248
+ static clearPerformanceStats() {
249
+ Inspector.setterCallCount.clear();
250
+ }
251
+ /**
252
+ * Generate a unique animation ID
253
+ */
254
+ static generateAnimationId() {
255
+ return `anim_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
256
+ }
257
+ /**
258
+ * Wrap animation controller with monitoring capabilities
259
+ */
260
+ wrapAnimationController(controller, nodeId, props, settings, div) {
261
+ if (!this.performanceSettings.enableAnimationMonitoring) {
262
+ // Just add the basic DOM animation without tracking
263
+ const originalStart = controller.start.bind(controller);
264
+ controller.start = () => {
265
+ this.animateNode(div, props, settings);
266
+ return originalStart();
267
+ };
268
+ return controller;
269
+ }
270
+ const animationId = Inspector.generateAnimationId();
271
+ // Create wrapper controller
272
+ const wrappedController = {
273
+ start: () => {
274
+ this.trackAnimationStart(animationId, nodeId, props, settings, controller);
275
+ this.animateNode(div, props, settings);
276
+ return controller.start();
277
+ },
278
+ stop: () => {
279
+ this.trackAnimationEnd(animationId, 'stopped');
280
+ return controller.stop();
281
+ },
282
+ pause: () => {
283
+ this.updateAnimationState(animationId, 'paused');
284
+ return controller.pause();
285
+ },
286
+ restore: () => {
287
+ this.trackAnimationEnd(animationId, 'cancelled');
288
+ return controller.restore();
289
+ },
290
+ waitUntilStopped: () => {
291
+ return controller.waitUntilStopped().then(() => {
292
+ this.trackAnimationEnd(animationId, 'finished');
293
+ });
294
+ },
295
+ get state() {
296
+ return controller.state;
297
+ },
298
+ // Event emitter methods
299
+ on: controller.on.bind(controller),
300
+ off: controller.off.bind(controller),
301
+ once: controller.once.bind(controller),
302
+ emit: controller.emit.bind(controller),
303
+ };
304
+ // Track animation events
305
+ controller.on('animating', () => {
306
+ this.updateAnimationState(animationId, 'running');
307
+ });
308
+ controller.on('stopped', () => {
309
+ this.trackAnimationEnd(animationId, 'finished');
310
+ });
311
+ return wrappedController;
312
+ }
313
+ /**
314
+ * Track animation start
315
+ */
316
+ trackAnimationStart(animationId, nodeId, props, settings, controller) {
317
+ const startTime = Date.now();
318
+ Inspector.activeAnimations.set(animationId, {
319
+ nodeId,
320
+ animationId,
321
+ startTime,
322
+ props,
323
+ settings,
324
+ controller,
325
+ state: 'scheduled',
326
+ });
327
+ }
328
+ /**
329
+ * Update animation state
330
+ */
331
+ updateAnimationState(animationId, state) {
332
+ const animation = Inspector.activeAnimations.get(animationId);
333
+ if (animation) {
334
+ animation.state = state;
335
+ }
336
+ }
337
+ /**
338
+ * Track animation end
339
+ */
340
+ trackAnimationEnd(animationId, completionType) {
341
+ const animation = Inspector.activeAnimations.get(animationId);
342
+ if (!animation)
343
+ return;
344
+ const endTime = Date.now();
345
+ const actualDuration = endTime - animation.startTime;
346
+ const expectedDuration = animation.settings.duration || 1000;
347
+ // Move to history
348
+ Inspector.animationHistory.unshift({
349
+ nodeId: animation.nodeId,
350
+ animationId: animation.animationId,
351
+ startTime: animation.startTime,
352
+ endTime,
353
+ duration: expectedDuration,
354
+ actualDuration,
355
+ props: animation.props,
356
+ settings: animation.settings,
357
+ completionType,
358
+ });
359
+ // Limit history size for performance
360
+ if (Inspector.animationHistory.length >
361
+ this.performanceSettings.maxAnimationHistory) {
362
+ Inspector.animationHistory.splice(this.performanceSettings.maxAnimationHistory);
363
+ }
364
+ // Remove from active animations
365
+ Inspector.activeAnimations.delete(animationId);
366
+ }
367
+ /**
368
+ * Get currently active animations
369
+ */
370
+ static getActiveAnimations() {
371
+ const now = Date.now();
372
+ const activeAnimations = [];
373
+ Inspector.activeAnimations.forEach((animation) => {
374
+ activeAnimations.push({
375
+ nodeId: animation.nodeId,
376
+ animationId: animation.animationId,
377
+ startTime: animation.startTime,
378
+ duration: animation.settings.duration || 1000,
379
+ elapsedTime: now - animation.startTime,
380
+ props: animation.props,
381
+ settings: animation.settings,
382
+ state: animation.state,
383
+ });
384
+ });
385
+ return activeAnimations.sort((a, b) => b.startTime - a.startTime);
386
+ }
387
+ /**
388
+ * Get animation statistics
389
+ */
390
+ static getAnimationStats() {
391
+ const totalAnimations = Inspector.animationHistory.length;
392
+ const activeCount = Inspector.activeAnimations.size;
393
+ // Calculate average duration from finished animations only
394
+ const finishedAnimations = Inspector.animationHistory.filter((anim) => anim.completionType === 'finished');
395
+ const averageDuration = finishedAnimations.length > 0
396
+ ? finishedAnimations.reduce((sum, anim) => sum + anim.actualDuration, 0) / finishedAnimations.length
397
+ : 0;
398
+ return {
399
+ totalAnimations,
400
+ activeCount,
401
+ averageDuration,
402
+ };
403
+ }
404
+ /**
405
+ * Clear animation monitoring data
406
+ */
407
+ static clearAnimationStats() {
408
+ Inspector.activeAnimations.clear();
409
+ Inspector.animationHistory.length = 0;
410
+ }
411
+ /**
412
+ * Start the animation stats timer if enabled
413
+ */
414
+ startAnimationStatsTimer() {
415
+ console.log(`Starting animation stats timer with interval: ${this.performanceSettings.animationStatsInterval} seconds`);
416
+ if (this.performanceSettings.animationStatsInterval > 0) {
417
+ this.animationStatsTimer = setInterval(() => {
418
+ this.printAnimationStats();
419
+ }, this.performanceSettings.animationStatsInterval * 1000);
420
+ }
421
+ }
422
+ /**
423
+ * Stop the animation stats timer
424
+ */
425
+ stopAnimationStatsTimer() {
426
+ if (this.animationStatsTimer) {
427
+ clearInterval(this.animationStatsTimer);
428
+ this.animationStatsTimer = null;
429
+ }
430
+ }
431
+ /**
432
+ * Print current animation statistics to console
433
+ */
434
+ printAnimationStats() {
435
+ const stats = Inspector.getAnimationStats();
436
+ console.log(`🎬 Animation Stats: ${stats.activeCount} active, ${stats.totalAnimations} completed, ${Math.round(stats.averageDuration)}ms avg duration`);
437
+ }
153
438
  setRootPosition() {
154
439
  if (this.root === null || this.canvas === null) {
155
440
  return;
@@ -181,6 +466,22 @@ export class Inspector {
181
466
  }
182
467
  return div;
183
468
  }
469
+ createNodes(node) {
470
+ if (this.root === null) {
471
+ return false;
472
+ }
473
+ const div = this.root.querySelector(`[id="${node.id}"]`);
474
+ if (div === null && node instanceof CoreTextNode) {
475
+ this.createTextNode(node);
476
+ }
477
+ else if (div === null && node instanceof CoreNode) {
478
+ this.createNode(node);
479
+ }
480
+ for (const child of node.children) {
481
+ this.createNodes(child);
482
+ }
483
+ return true;
484
+ }
184
485
  createNode(node) {
185
486
  const div = this.createDiv(node.id, node.props);
186
487
  div.node = node;
@@ -192,12 +493,84 @@ export class Inspector {
192
493
  return this.createProxy(node, div);
193
494
  }
194
495
  createTextNode(node) {
195
- const div = this.createDiv(node.id, node.props);
496
+ // eslint-disable-next-line
497
+ // @ts-ignore - textProps is a private property and keeping it that way
498
+ // but we need it from the inspector to set the initial properties on the div element
499
+ const div = this.createDiv(node.id, node.textProps);
196
500
  div.node = node;
197
501
  node.div = div;
198
502
  return this.createProxy(node, div);
199
503
  }
200
504
  createProxy(node, div) {
505
+ // Store texture event listeners for cleanup
506
+ const textureListeners = new Map();
507
+ const coreNodeListeners = new Map();
508
+ const setupCoreNodeListeners = (coreNode) => {
509
+ const onLoaded = () => {
510
+ this.updateTextNodeDimensions(div, coreNode);
511
+ };
512
+ coreNode.on('loaded', onLoaded);
513
+ coreNodeListeners.set(coreNode, { onLoaded });
514
+ };
515
+ // Helper function to setup texture event listeners
516
+ const setupTextureListeners = (texture) => {
517
+ // Clean up existing listeners first
518
+ textureListeners.forEach((listeners, oldTexture) => {
519
+ oldTexture.off('loaded', listeners.onLoaded);
520
+ oldTexture.off('failed', listeners.onFailed);
521
+ oldTexture.off('freed', listeners.onFreed);
522
+ });
523
+ textureListeners.clear();
524
+ // Setup new listeners if texture exists
525
+ if (texture) {
526
+ // Initialize metrics if not exists
527
+ if (!this.textureMetrics.has(texture)) {
528
+ this.textureMetrics.set(texture, {
529
+ previousState: texture.state,
530
+ loadedCount: 0,
531
+ failedCount: 0,
532
+ freedCount: 0,
533
+ });
534
+ }
535
+ const onLoaded = () => {
536
+ const metrics = this.textureMetrics.get(texture);
537
+ if (metrics) {
538
+ metrics.previousState =
539
+ metrics.previousState !== texture.state
540
+ ? metrics.previousState
541
+ : 'loading';
542
+ metrics.loadedCount++;
543
+ }
544
+ this.updateTextureAttributes(div, texture);
545
+ };
546
+ const onFailed = () => {
547
+ const metrics = this.textureMetrics.get(texture);
548
+ if (metrics) {
549
+ metrics.previousState =
550
+ metrics.previousState !== texture.state
551
+ ? metrics.previousState
552
+ : 'loading';
553
+ metrics.failedCount++;
554
+ }
555
+ this.updateTextureAttributes(div, texture);
556
+ };
557
+ const onFreed = () => {
558
+ const metrics = this.textureMetrics.get(texture);
559
+ if (metrics) {
560
+ metrics.previousState =
561
+ metrics.previousState !== texture.state
562
+ ? metrics.previousState
563
+ : texture.state;
564
+ metrics.freedCount++;
565
+ }
566
+ this.updateTextureAttributes(div, texture);
567
+ };
568
+ texture.on('loaded', onLoaded);
569
+ texture.on('failed', onFailed);
570
+ texture.on('freed', onFreed);
571
+ textureListeners.set(texture, { onLoaded, onFailed, onFreed });
572
+ }
573
+ };
201
574
  // Define traps for each property in knownProperties
202
575
  knownProperties.forEach((property) => {
203
576
  let originalProp = Object.getOwnPropertyDescriptor(node, property);
@@ -209,14 +582,26 @@ export class Inspector {
209
582
  if (originalProp === undefined) {
210
583
  return;
211
584
  }
585
+ if (property === 'text') {
586
+ setupCoreNodeListeners(node);
587
+ }
212
588
  Object.defineProperty(node, property, {
213
589
  get() {
214
590
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
215
591
  return originalProp?.get?.call(node);
216
592
  },
217
593
  set: (value) => {
594
+ // Track setter call for performance monitoring
595
+ this.trackSetterCall(node.id, property);
218
596
  originalProp?.set?.call(node, value);
219
597
  this.updateNodeProperty(div, property, value, node.props);
598
+ // Setup texture event listeners if this is a texture property
599
+ if (property === 'texture') {
600
+ const textureValue = value && typeof value === 'object' && 'state' in value
601
+ ? value
602
+ : null;
603
+ setupTextureListeners(textureValue);
604
+ }
220
605
  },
221
606
  configurable: true,
222
607
  enumerable: true,
@@ -224,25 +609,108 @@ export class Inspector {
224
609
  });
225
610
  const originalDestroy = node.destroy;
226
611
  Object.defineProperty(node, 'destroy', {
227
- value: () => {
612
+ value: (isChild = false) => {
613
+ // Clean up texture event listeners and metrics
614
+ textureListeners.forEach((listeners, texture) => {
615
+ texture.off('loaded', listeners.onLoaded);
616
+ texture.off('failed', listeners.onFailed);
617
+ texture.off('freed', listeners.onFreed);
618
+ // Clean up metrics for this texture
619
+ this.textureMetrics.delete(texture);
620
+ });
621
+ textureListeners.clear();
622
+ coreNodeListeners.forEach((listeners, coreNode) => {
623
+ coreNode.off('loaded', listeners.onLoaded);
624
+ });
625
+ coreNodeListeners.clear();
228
626
  this.destroyNode(node.id);
229
- originalDestroy.call(node);
627
+ originalDestroy.call(node, isChild);
230
628
  },
629
+ configurable: true,
231
630
  });
232
631
  const originalAnimate = node.animate;
233
632
  Object.defineProperty(node, 'animate', {
234
633
  value: (props, settings) => {
235
634
  const animationController = originalAnimate.call(node, props, settings);
236
- const originalStart = animationController.start.bind(animationController);
237
- animationController.start = () => {
238
- this.animateNode(div, props, settings);
239
- return originalStart();
240
- };
241
- return animationController;
635
+ // Wrap animation controller with monitoring
636
+ return this.wrapAnimationController(animationController, node.id, props, settings, div);
242
637
  },
638
+ configurable: true,
243
639
  });
244
640
  return node;
245
641
  }
642
+ updateTextNodeDimensions(div, node) {
643
+ const textMetrics = node.renderInfo;
644
+ if (textMetrics) {
645
+ div.style.width = `${textMetrics.width}px`;
646
+ div.style.height = `${textMetrics.height}px`;
647
+ }
648
+ else {
649
+ div.style.removeProperty('width');
650
+ div.style.removeProperty('height');
651
+ }
652
+ }
653
+ updateTextureAttributes(div, texture) {
654
+ // Update texture state
655
+ div.setAttribute('data-texture-state', texture.state);
656
+ // Update texture type
657
+ div.setAttribute('data-texture-type', textureTypeNames[texture.type] || 'unknown');
658
+ // Update texture dimensions if available
659
+ if (texture.dimensions) {
660
+ div.setAttribute('data-texture-width', String(texture.dimensions.w));
661
+ div.setAttribute('data-texture-height', String(texture.dimensions.h));
662
+ }
663
+ else {
664
+ div.removeAttribute('data-texture-width');
665
+ div.removeAttribute('data-texture-height');
666
+ }
667
+ // Update renderable owners count
668
+ div.setAttribute('data-texture-owners', String(texture.renderableOwners.length));
669
+ // Update retry count
670
+ div.setAttribute('data-texture-retry-count', String(texture.retryCount));
671
+ // Update max retry count if available
672
+ if (texture.maxRetryCount !== null) {
673
+ div.setAttribute('data-texture-max-retry-count', String(texture.maxRetryCount));
674
+ }
675
+ else {
676
+ div.removeAttribute('data-texture-max-retry-count');
677
+ }
678
+ // Update metrics if available
679
+ const metrics = this.textureMetrics.get(texture);
680
+ if (metrics) {
681
+ div.setAttribute('data-texture-previous-state', metrics.previousState);
682
+ div.setAttribute('data-texture-loaded-count', String(metrics.loadedCount));
683
+ div.setAttribute('data-texture-failed-count', String(metrics.failedCount));
684
+ div.setAttribute('data-texture-freed-count', String(metrics.freedCount));
685
+ }
686
+ else {
687
+ div.removeAttribute('data-texture-previous-state');
688
+ div.removeAttribute('data-texture-loaded-count');
689
+ div.removeAttribute('data-texture-failed-count');
690
+ div.removeAttribute('data-texture-freed-count');
691
+ }
692
+ // Update error information if present
693
+ if (texture.error) {
694
+ div.setAttribute('data-texture-error', texture.error.code || texture.error.message);
695
+ }
696
+ else {
697
+ div.removeAttribute('data-texture-error');
698
+ }
699
+ }
700
+ destroy() {
701
+ // Stop animation stats timer
702
+ this.stopAnimationStatsTimer();
703
+ // Remove DOM observers
704
+ this.mutationObserver.disconnect();
705
+ this.resizeObserver.disconnect();
706
+ // Remove resize listener
707
+ window.removeEventListener('resize', this.setRootPosition.bind(this));
708
+ if (this.root && this.root.parentNode) {
709
+ this.root.remove();
710
+ }
711
+ // Clean up animation monitoring data
712
+ Inspector.clearAnimationStats();
713
+ }
246
714
  destroyNode(id) {
247
715
  const div = document.getElementById(id.toString());
248
716
  div?.remove();
@@ -271,9 +739,11 @@ export class Inspector {
271
739
  // special case for text
272
740
  if (property === 'text') {
273
741
  div.innerHTML = String(value);
274
- // hide text because we can't render SDF fonts
275
- // it would look weird and obstruct the WebGL rendering
276
- div.style.visibility = 'hidden';
742
+ // Keep DOM text invisible without breaking visibility checks
743
+ // Use very low opacity (0.001) instead of 0 so Playwright still detects it
744
+ div.style.opacity = '0.001';
745
+ div.style.pointerEvents = 'none';
746
+ div.style.userSelect = 'none';
277
747
  return;
278
748
  }
279
749
  // special case for images
@@ -308,14 +778,14 @@ export class Inspector {
308
778
  let value = mappedStyleResponse.value;
309
779
  if (property === 'x') {
310
780
  const mount = props.mountX;
311
- const width = props.width;
781
+ const width = props.w;
312
782
  if (mount) {
313
783
  value = `${parseInt(value) - width * mount}px`;
314
784
  }
315
785
  }
316
786
  else if (property === 'y') {
317
787
  const mount = props.mountY;
318
- const height = props.height;
788
+ const height = props.h;
319
789
  if (mount) {
320
790
  value = `${parseInt(value) - height * mount}px`;
321
791
  }
@@ -348,6 +818,13 @@ export class Inspector {
348
818
  return;
349
819
  }
350
820
  }
821
+ updateViewport(width, height, deviceLogicalPixelRatio) {
822
+ this.scaleX = deviceLogicalPixelRatio ?? 1;
823
+ this.scaleY = deviceLogicalPixelRatio ?? 1;
824
+ this.width = width;
825
+ this.height = height;
826
+ this.setRootPosition();
827
+ }
351
828
  // simple animation handler
352
829
  animateNode(div, props, settings) {
353
830
  const { duration = 1000, delay = 0,
@@ -356,14 +833,14 @@ export class Inspector {
356
833
  // loop = false,
357
834
  // stopMethod = false,
358
835
  } = settings;
359
- const { x, y, width, height, alpha = 1, rotation = 0, scale = 1, color, mountX, mountY, } = props;
836
+ const { x, y, w, h, alpha = 1, rotation = 0, scale = 1, color, mountX, mountY, } = props;
360
837
  // ignoring loops and repeats for now, as that might be a bit too much for the inspector
361
838
  function animate() {
362
839
  setTimeout(() => {
363
- div.style.top = `${y - height * mountY}px`;
364
- div.style.left = `${x - width * mountX}px`;
365
- div.style.width = `${width}px`;
366
- div.style.height = `${height}px`;
840
+ div.style.top = `${y - h * mountY}px`;
841
+ div.style.left = `${x - w * mountX}px`;
842
+ div.style.width = `${w}px`;
843
+ div.style.height = `${h}px`;
367
844
  div.style.opacity = `${alpha}`;
368
845
  div.style.rotate = `${rotation}rad`;
369
846
  div.style.scale = `${scale}`;