@lightningjs/renderer 0.7.5 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +3 -3
  3. package/README.md +233 -221
  4. package/dist/src/common/CommonTypes.d.ts +12 -0
  5. package/dist/src/core/CoreNode.d.ts +83 -9
  6. package/dist/src/core/CoreNode.js +232 -44
  7. package/dist/src/core/CoreNode.js.map +1 -1
  8. package/dist/src/core/CoreTextNode.d.ts +6 -1
  9. package/dist/src/core/CoreTextNode.js +33 -20
  10. package/dist/src/core/CoreTextNode.js.map +1 -1
  11. package/dist/src/core/CoreTextureManager.d.ts +3 -1
  12. package/dist/src/core/CoreTextureManager.js +11 -2
  13. package/dist/src/core/CoreTextureManager.js.map +1 -1
  14. package/dist/src/core/Stage.d.ts +6 -0
  15. package/dist/src/core/Stage.js +16 -1
  16. package/dist/src/core/Stage.js.map +1 -1
  17. package/dist/src/core/TextureMemoryManager.d.ts +12 -0
  18. package/dist/src/core/TextureMemoryManager.js +42 -0
  19. package/dist/src/core/TextureMemoryManager.js.map +1 -0
  20. package/dist/src/core/lib/ImageWorker.d.ts +0 -1
  21. package/dist/src/core/lib/ImageWorker.js +55 -40
  22. package/dist/src/core/lib/ImageWorker.js.map +1 -1
  23. package/dist/src/core/lib/RenderCoords.d.ts +13 -0
  24. package/dist/src/core/lib/RenderCoords.js +63 -0
  25. package/dist/src/core/lib/RenderCoords.js.map +1 -0
  26. package/dist/src/core/lib/WebGlContext.d.ts +414 -0
  27. package/dist/src/core/lib/WebGlContext.js +640 -0
  28. package/dist/src/core/lib/WebGlContext.js.map +1 -0
  29. package/dist/src/core/lib/utils.d.ts +1 -0
  30. package/dist/src/core/lib/utils.js +6 -0
  31. package/dist/src/core/lib/utils.js.map +1 -1
  32. package/dist/src/core/platform.js +8 -0
  33. package/dist/src/core/platform.js.map +1 -1
  34. package/dist/src/core/renderers/CoreContextTexture.d.ts +5 -1
  35. package/dist/src/core/renderers/CoreContextTexture.js +3 -1
  36. package/dist/src/core/renderers/CoreContextTexture.js.map +1 -1
  37. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.d.ts +2 -1
  38. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js +2 -2
  39. package/dist/src/core/renderers/webgl/WebGlCoreCtxSubTexture.js.map +1 -1
  40. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.d.ts +3 -1
  41. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js +26 -6
  42. package/dist/src/core/renderers/webgl/WebGlCoreCtxTexture.js.map +1 -1
  43. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +3 -0
  44. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +4 -2
  45. package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
  46. package/dist/src/core/renderers/webgl/internal/RendererUtils.d.ts +9 -0
  47. package/dist/src/core/renderers/webgl/internal/RendererUtils.js +14 -0
  48. package/dist/src/core/renderers/webgl/internal/RendererUtils.js.map +1 -1
  49. package/dist/src/core/renderers/webgl/shaders/DefaultShader.js +47 -47
  50. package/dist/src/core/renderers/webgl/shaders/DefaultShaderBatched.js +61 -61
  51. package/dist/src/core/renderers/webgl/shaders/DynamicShader.js +93 -93
  52. package/dist/src/core/renderers/webgl/shaders/RoundedRectangle.js +63 -63
  53. package/dist/src/core/renderers/webgl/shaders/SdfShader.js +49 -49
  54. package/dist/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.js +15 -15
  55. package/dist/src/core/renderers/webgl/shaders/effects/BorderEffect.js +5 -5
  56. package/dist/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.js +15 -15
  57. package/dist/src/core/renderers/webgl/shaders/effects/BorderRightEffect.js +15 -15
  58. package/dist/src/core/renderers/webgl/shaders/effects/BorderTopEffect.js +15 -15
  59. package/dist/src/core/renderers/webgl/shaders/effects/FadeOutEffect.js +42 -42
  60. package/dist/src/core/renderers/webgl/shaders/effects/GlitchEffect.js +44 -44
  61. package/dist/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.js +3 -3
  62. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js +44 -57
  63. package/dist/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.js.map +1 -1
  64. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.d.ts +1 -0
  65. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js +33 -39
  66. package/dist/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.js.map +1 -1
  67. package/dist/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.js +37 -37
  68. package/dist/src/core/renderers/webgl/shaders/effects/RadiusEffect.js +19 -19
  69. package/dist/src/core/scene/Scene.d.ts +59 -0
  70. package/dist/src/core/scene/Scene.js +106 -0
  71. package/dist/src/core/scene/Scene.js.map +1 -0
  72. package/dist/src/core/text-rendering/TrFontManager.js +30 -25
  73. package/dist/src/core/text-rendering/TrFontManager.js.map +1 -1
  74. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +2 -0
  75. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +26 -2
  76. package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
  77. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +8 -0
  78. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +34 -6
  79. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
  80. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.d.ts +8 -0
  81. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js +29 -0
  82. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/findNearestMultiple.js.map +1 -0
  83. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +1 -3
  84. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
  85. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.d.ts +19 -0
  86. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js +84 -0
  87. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/SdfBufferHelper.js.map +1 -0
  88. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.d.ts +8 -0
  89. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js +40 -0
  90. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutLine.js.map +1 -0
  91. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.d.ts +2 -0
  92. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js +41 -0
  93. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/layoutText2.js.map +1 -0
  94. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.d.ts +1 -0
  95. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js +4 -0
  96. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2/utils.js.map +1 -0
  97. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.d.ts +1 -0
  98. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js +2 -0
  99. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText2.js.map +1 -0
  100. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.d.ts +20 -0
  101. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js +55 -0
  102. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/makeRenderWindow.js.map +1 -0
  103. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.d.ts +9 -0
  104. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js +32 -0
  105. package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/roundUpToMultiple.js.map +1 -0
  106. package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +31 -0
  107. package/dist/src/core/text-rendering/renderers/TextRenderer.js +26 -0
  108. package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
  109. package/dist/src/core/textures/ImageTexture.js +16 -2
  110. package/dist/src/core/textures/ImageTexture.js.map +1 -1
  111. package/dist/src/core/textures/Texture.d.ts +27 -2
  112. package/dist/src/core/textures/Texture.js +30 -1
  113. package/dist/src/core/textures/Texture.js.map +1 -1
  114. package/dist/src/core/utils.d.ts +1 -1
  115. package/dist/src/main-api/ICoreDriver.d.ts +1 -0
  116. package/dist/src/main-api/Inspector.js +2 -1
  117. package/dist/src/main-api/Inspector.js.map +1 -1
  118. package/dist/src/main-api/RendererMain.d.ts +15 -0
  119. package/dist/src/main-api/RendererMain.js +7 -1
  120. package/dist/src/main-api/RendererMain.js.map +1 -1
  121. package/dist/src/render-drivers/main/MainCoreDriver.d.ts +1 -0
  122. package/dist/src/render-drivers/main/MainCoreDriver.js +8 -0
  123. package/dist/src/render-drivers/main/MainCoreDriver.js.map +1 -1
  124. package/dist/src/render-drivers/main/MainOnlyNode.d.ts +5 -0
  125. package/dist/src/render-drivers/main/MainOnlyNode.js +26 -0
  126. package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
  127. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js +2 -0
  128. package/dist/src/render-drivers/threadx/ThreadXCoreDriver.js.map +1 -1
  129. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.d.ts +2 -0
  130. package/dist/src/render-drivers/threadx/ThreadXRendererMessage.js.map +1 -1
  131. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +3 -0
  132. package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -1
  133. package/dist/src/render-drivers/threadx/worker/renderer.js +2 -0
  134. package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
  135. package/dist/src/utils.d.ts +6 -0
  136. package/dist/src/utils.js +9 -1
  137. package/dist/src/utils.js.map +1 -1
  138. package/dist/tsconfig.dist.tsbuildinfo +1 -1
  139. package/exports/core-api.ts +102 -102
  140. package/exports/main-api.ts +60 -60
  141. package/exports/utils.ts +41 -41
  142. package/package.json +1 -1
  143. package/scripts/please-use-pnpm.js +13 -13
  144. package/src/common/CommonTypes.ts +132 -113
  145. package/src/common/EventEmitter.ts +77 -77
  146. package/src/common/IAnimationController.ts +29 -29
  147. package/src/core/CoreExtension.ts +32 -32
  148. package/src/core/CoreNode.ts +1199 -955
  149. package/src/core/CoreShaderManager.ts +243 -243
  150. package/src/core/CoreTextNode.ts +400 -391
  151. package/src/core/CoreTextureManager.ts +339 -326
  152. package/src/core/Stage.ts +375 -354
  153. package/src/core/TextureMemoryManager.ts +66 -0
  154. package/src/core/animations/AnimationManager.ts +38 -38
  155. package/src/core/animations/CoreAnimation.ts +181 -181
  156. package/src/core/animations/CoreAnimationController.ts +148 -148
  157. package/src/core/lib/ContextSpy.ts +41 -41
  158. package/src/core/lib/ImageWorker.ts +149 -135
  159. package/src/core/lib/Matrix3d.ts +290 -290
  160. package/src/core/lib/RenderCoords.ts +86 -0
  161. package/src/core/lib/WebGlContextWrapper.ts +992 -992
  162. package/src/core/lib/textureCompression.ts +152 -152
  163. package/src/core/lib/utils.ts +250 -241
  164. package/src/core/platform.ts +54 -46
  165. package/src/core/renderers/CoreContextTexture.ts +35 -30
  166. package/src/core/renderers/CoreRenderOp.ts +22 -22
  167. package/src/core/renderers/CoreRenderer.ts +63 -63
  168. package/src/core/renderers/CoreShader.ts +41 -41
  169. package/src/core/renderers/webgl/WebGlCoreCtxSubTexture.ts +42 -37
  170. package/src/core/renderers/webgl/WebGlCoreCtxTexture.ts +261 -230
  171. package/src/core/renderers/webgl/WebGlCoreRenderOp.ts +107 -107
  172. package/src/core/renderers/webgl/WebGlCoreRenderer.ts +528 -520
  173. package/src/core/renderers/webgl/WebGlCoreShader.ts +337 -337
  174. package/src/core/renderers/webgl/internal/BufferCollection.ts +54 -54
  175. package/src/core/renderers/webgl/internal/RendererUtils.ts +148 -131
  176. package/src/core/renderers/webgl/internal/ShaderUtils.ts +136 -136
  177. package/src/core/renderers/webgl/internal/WebGlUtils.ts +35 -35
  178. package/src/core/renderers/webgl/shaders/DefaultShader.ts +95 -95
  179. package/src/core/renderers/webgl/shaders/DefaultShaderBatched.ts +132 -132
  180. package/src/core/renderers/webgl/shaders/DynamicShader.ts +474 -474
  181. package/src/core/renderers/webgl/shaders/RoundedRectangle.ts +161 -161
  182. package/src/core/renderers/webgl/shaders/SdfShader.ts +174 -174
  183. package/src/core/renderers/webgl/shaders/effects/BorderBottomEffect.ts +101 -101
  184. package/src/core/renderers/webgl/shaders/effects/BorderEffect.ts +86 -86
  185. package/src/core/renderers/webgl/shaders/effects/BorderLeftEffect.ts +101 -101
  186. package/src/core/renderers/webgl/shaders/effects/BorderRightEffect.ts +101 -101
  187. package/src/core/renderers/webgl/shaders/effects/BorderTopEffect.ts +101 -101
  188. package/src/core/renderers/webgl/shaders/effects/EffectUtils.ts +33 -33
  189. package/src/core/renderers/webgl/shaders/effects/FadeOutEffect.ts +135 -135
  190. package/src/core/renderers/webgl/shaders/effects/GlitchEffect.ts +145 -145
  191. package/src/core/renderers/webgl/shaders/effects/GrayscaleEffect.ts +67 -67
  192. package/src/core/renderers/webgl/shaders/effects/LinearGradientEffect.ts +160 -176
  193. package/src/core/renderers/webgl/shaders/effects/RadialGradientEffect.ts +153 -159
  194. package/src/core/renderers/webgl/shaders/effects/RadialProgressEffect.ts +186 -186
  195. package/src/core/renderers/webgl/shaders/effects/RadiusEffect.ts +121 -121
  196. package/src/core/renderers/webgl/shaders/effects/ShaderEffect.ts +114 -114
  197. package/src/core/text-rendering/TextTextureRendererUtils.ts +189 -189
  198. package/src/core/text-rendering/TrFontManager.ts +170 -166
  199. package/src/core/text-rendering/font-face-types/SdfTrFontFace/SdfTrFontFace.ts +141 -141
  200. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/FontShaper.ts +139 -139
  201. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.test.ts +173 -173
  202. package/src/core/text-rendering/font-face-types/SdfTrFontFace/internal/SdfFontShaper.ts +169 -169
  203. package/src/core/text-rendering/font-face-types/TrFontFace.ts +105 -105
  204. package/src/core/text-rendering/font-face-types/WebTrFontFace.ts +77 -77
  205. package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +780 -751
  206. package/src/core/text-rendering/renderers/LightningTextTextureRenderer.ts +741 -741
  207. package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +812 -778
  208. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.test.ts +48 -48
  209. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/PeekableGenerator.ts +66 -66
  210. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/SpecialCodepoints.ts +52 -52
  211. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/constants.ts +32 -32
  212. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getStartConditions.ts +84 -84
  213. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.test.ts +133 -133
  214. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/getUnicodeCodepoints.ts +38 -38
  215. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +391 -393
  216. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.test.ts +49 -49
  217. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/measureText.ts +51 -51
  218. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.test.ts +205 -205
  219. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/setRenderWindow.ts +93 -93
  220. package/src/core/text-rendering/renderers/SdfTextRenderer/internal/util.ts +40 -40
  221. package/src/core/text-rendering/renderers/TextRenderer.ts +548 -504
  222. package/src/core/textures/ColorTexture.ts +86 -86
  223. package/src/core/textures/ImageTexture.ts +154 -140
  224. package/src/core/textures/NoiseTexture.ts +96 -96
  225. package/src/core/textures/SubTexture.ts +143 -143
  226. package/src/core/textures/Texture.ts +261 -218
  227. package/src/core/utils.ts +224 -224
  228. package/src/env.d.ts +7 -7
  229. package/src/main-api/ICoreDriver.ts +68 -66
  230. package/src/main-api/INode.ts +499 -499
  231. package/src/main-api/Inspector.ts +440 -439
  232. package/src/main-api/RendererMain.ts +676 -652
  233. package/src/main-api/texture-usage-trackers/FinalizationRegistryTextureUsageTracker.ts +45 -45
  234. package/src/main-api/texture-usage-trackers/ManualCountTextureUsageTracker.ts +154 -154
  235. package/src/main-api/texture-usage-trackers/TextureUsageTracker.ts +54 -54
  236. package/src/render-drivers/main/MainCoreDriver.ts +158 -148
  237. package/src/render-drivers/main/MainOnlyNode.ts +500 -466
  238. package/src/render-drivers/main/MainOnlyTextNode.ts +261 -261
  239. package/src/render-drivers/threadx/NodeStruct.ts +300 -300
  240. package/src/render-drivers/threadx/SharedNode.ts +97 -97
  241. package/src/render-drivers/threadx/TextNodeStruct.ts +211 -211
  242. package/src/render-drivers/threadx/ThreadXCoreDriver.ts +287 -285
  243. package/src/render-drivers/threadx/ThreadXMainAnimationController.ts +99 -99
  244. package/src/render-drivers/threadx/ThreadXMainNode.ts +192 -192
  245. package/src/render-drivers/threadx/ThreadXMainTextNode.ts +85 -85
  246. package/src/render-drivers/threadx/ThreadXRendererMessage.ts +112 -110
  247. package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +245 -238
  248. package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +149 -149
  249. package/src/render-drivers/threadx/worker/renderer.ts +153 -151
  250. package/src/render-drivers/utils.ts +97 -97
  251. package/src/utils.ts +216 -207
  252. package/COPYING +0 -1
@@ -1,439 +1,440 @@
1
- import type {
2
- INode,
3
- INodeAnimatableProps,
4
- INodeWritableProps,
5
- ITextNode,
6
- ITextNodeWritableProps,
7
- } from './INode.js';
8
- import type { ICoreDriver } from './ICoreDriver.js';
9
- import { type RendererMainSettings } from './RendererMain.js';
10
- import type { AnimationSettings } from '../core/animations/CoreAnimation.js';
11
- import type { IAnimationController } from '../common/IAnimationController.js';
12
-
13
- /**
14
- * Inspector
15
- *
16
- * The inspector is a tool that allows you to inspect the state of the renderer
17
- * and the nodes that are being rendered. It is a tool that is used for debugging
18
- * and development purposes.
19
- *
20
- * The inspector will generate a DOM tree that mirrors the state of the renderer
21
- */
22
-
23
- /**
24
- * stylePropertyMap is a map of renderer properties that are mapped to CSS properties
25
- *
26
- * It can either return a string or an object with a prop and value property. Once a
27
- * property is found in the map, the value is set on the style of the div element.
28
- * Erik H made me do it.
29
- */
30
- interface StyleResponse {
31
- prop: string;
32
- value: string;
33
- }
34
- const stylePropertyMap: {
35
- [key: string]: (
36
- value: string | number | boolean,
37
- ) => string | StyleResponse | null;
38
- } = {
39
- alpha: (v) => {
40
- if (v === 1) {
41
- return null;
42
- }
43
-
44
- return { prop: 'opacity', value: `${v}` };
45
- },
46
- x: (x) => {
47
- return { prop: 'left', value: `${x}px` };
48
- },
49
- y: (y) => {
50
- return { prop: 'top', value: `${y}px` };
51
- },
52
- width: (w) => {
53
- if (w === 0) {
54
- return null;
55
- }
56
-
57
- return { prop: 'width', value: `${w}px` };
58
- },
59
- height: (h) => {
60
- if (h === 0) {
61
- return null;
62
- }
63
-
64
- return { prop: 'height', value: `${h}px` };
65
- },
66
- zIndex: () => 'zIndex',
67
- fontFamily: () => 'font-family',
68
- fontSize: () => 'font-size',
69
- fontStyle: () => 'font-style',
70
- fontWeight: () => 'font-weight',
71
- fontStretch: () => 'font-stretch',
72
- lineHeight: () => 'line-height',
73
- letterSpacing: () => 'letter-spacing',
74
- textAlign: () => 'text-align',
75
- overflowSuffix: () => 'overflow-suffix',
76
- maxLines: () => 'max-lines',
77
- contain: () => 'contain',
78
- verticalAlign: () => 'vertical-align',
79
- clipping: (v) => {
80
- if (v === false) {
81
- return null;
82
- }
83
-
84
- return { prop: 'overflow', value: v ? 'hidden' : 'visible' };
85
- },
86
- rotation: (v) => {
87
- if (v === 0) {
88
- return null;
89
- }
90
-
91
- return { prop: 'transform', value: `rotate(${v}rad)` };
92
- },
93
- scale: (v) => {
94
- if (v === 1) {
95
- return null;
96
- }
97
-
98
- return { prop: 'transform', value: `scale(${v})` };
99
- },
100
- scaleX: (v) => {
101
- if (v === 1) {
102
- return null;
103
- }
104
-
105
- return { prop: 'transform', value: `scaleX(${v})` };
106
- },
107
- scaleY: (v) => {
108
- if (v === 1) {
109
- return null;
110
- }
111
-
112
- return { prop: 'transform', value: `scaleY(${v})` };
113
- },
114
- color: (v) => {
115
- if (v === 0) {
116
- return null;
117
- }
118
-
119
- return { prop: 'color', value: convertColorToRgba(v as number) };
120
- },
121
- };
122
-
123
- const convertColorToRgba = (color: number) => {
124
- const a = (color & 0xff) / 255;
125
- const b = (color >> 8) & 0xff;
126
- const g = (color >> 16) & 0xff;
127
- const r = (color >> 24) & 0xff;
128
- return `rgba(${r},${g},${b},${a})`;
129
- };
130
-
131
- const domPropertyMap: { [key: string]: string } = {
132
- id: 'id',
133
- };
134
-
135
- const gradientColorPropertyMap = [
136
- 'colorTop',
137
- 'colorBottom',
138
- 'colorLeft',
139
- 'colorRight',
140
- 'colorTl',
141
- 'colorTr',
142
- 'colorBl',
143
- 'colorBr',
144
- ];
145
-
146
- export class Inspector {
147
- private root: HTMLElement | null = null;
148
- private canvas: HTMLCanvasElement | null = null;
149
- private height = 1080;
150
- private width = 1920;
151
- private scaleX = 1;
152
- private scaleY = 1;
153
-
154
- constructor(canvas: HTMLCanvasElement, settings: RendererMainSettings) {
155
- if (import.meta.env.PROD) return;
156
-
157
- if (!settings) {
158
- throw new Error('settings is required');
159
- }
160
-
161
- // calc dimensions based on the devicePixelRatio
162
- this.height = Math.ceil(
163
- settings.appHeight ?? 1080 / (settings.deviceLogicalPixelRatio ?? 1),
164
- );
165
-
166
- this.width = Math.ceil(
167
- settings.appWidth ?? 1900 / (settings.deviceLogicalPixelRatio ?? 1),
168
- );
169
-
170
- this.scaleX = settings.deviceLogicalPixelRatio ?? 1;
171
- this.scaleY = settings.deviceLogicalPixelRatio ?? 1;
172
-
173
- this.canvas = canvas;
174
- this.root = document.createElement('div');
175
- this.setRootPosition();
176
- document.body.appendChild(this.root);
177
-
178
- //listen for changes on canvas
179
- const mutationObserver = new MutationObserver(
180
- this.setRootPosition.bind(this),
181
- );
182
- mutationObserver.observe(canvas, {
183
- attributes: true,
184
- childList: false,
185
- subtree: false,
186
- });
187
-
188
- // Create a ResizeObserver to watch for changes in the element's size
189
- const resizeObserver = new ResizeObserver(this.setRootPosition.bind(this));
190
- resizeObserver.observe(canvas);
191
-
192
- //listen for changes on window
193
- window.addEventListener('resize', this.setRootPosition.bind(this));
194
-
195
- console.warn('Inspector is enabled, this will impact performance');
196
- }
197
-
198
- setRootPosition() {
199
- if (this.root === null || this.canvas === null) {
200
- return;
201
- }
202
-
203
- // get the world position of the canvas object, so we can match the inspector to it
204
- const rect = this.canvas.getBoundingClientRect();
205
- const top = document.documentElement.scrollTop + rect.top;
206
- const left = document.documentElement.scrollLeft + rect.left;
207
-
208
- this.root.id = 'root';
209
- this.root.style.left = `${left}px`;
210
- this.root.style.top = `${top}px`;
211
- this.root.style.width = `${this.width}px`;
212
- this.root.style.height = `${this.height}px`;
213
- this.root.style.position = 'absolute';
214
- this.root.style.transformOrigin = '0 0 0';
215
- this.root.style.transform = `scale(${this.scaleX}, ${this.scaleY})`;
216
- this.root.style.overflow = 'hidden';
217
- this.root.style.zIndex = '65534';
218
- }
219
-
220
- createDiv(
221
- node: INode | ITextNode,
222
- properties: INodeWritableProps | ITextNodeWritableProps,
223
- ): HTMLElement {
224
- const div = document.createElement('div');
225
- div.style.position = 'absolute';
226
- div.id = node.id.toString();
227
-
228
- // set initial properties
229
- for (const key in properties) {
230
- this.updateNodeProperty(
231
- div,
232
- // really typescript? really?
233
- key as keyof (INodeWritableProps & ITextNodeWritableProps),
234
- (properties as INodeWritableProps & ITextNodeWritableProps)[
235
- key as keyof (INodeWritableProps & ITextNodeWritableProps)
236
- ],
237
- );
238
- }
239
-
240
- return div;
241
- }
242
-
243
- createNode(driver: ICoreDriver, properties: INodeWritableProps): INode {
244
- const node = driver.createNode(properties);
245
- const div = this.createDiv(node, properties);
246
-
247
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
248
- (div as any).node = node;
249
-
250
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
251
- (node as any).div = div;
252
-
253
- return this.createProxy(node, div);
254
- }
255
-
256
- createTextNode(
257
- driver: ICoreDriver,
258
- properties: ITextNodeWritableProps,
259
- ): ITextNode {
260
- const node = driver.createTextNode(properties);
261
- const div = this.createDiv(node, properties);
262
- return this.createProxy(node, div) as ITextNode;
263
- }
264
-
265
- createProxy(node: INode | ITextNode, div: HTMLElement): INode | ITextNode {
266
- return new Proxy(node, {
267
- set: (target, property: keyof INodeWritableProps, value) => {
268
- this.updateNodeProperty(div, property, value);
269
- return Reflect.set(target, property, value);
270
- },
271
- get: (target, property: keyof INode, receiver: any): any => {
272
- if (property === 'destroy') {
273
- this.destroyNode(target);
274
- }
275
-
276
- if (property === 'animate') {
277
- return (props: INodeAnimatableProps, settings: AnimationSettings) => {
278
- const anim = target.animate(props, settings);
279
-
280
- // Trap the animate start function so we can update the inspector accordingly
281
- return new Proxy(anim, {
282
- get: (target, property: keyof IAnimationController, receiver) => {
283
- if (property === 'start') {
284
- this.animateNode(div, node, props, settings);
285
- }
286
-
287
- return Reflect.get(target, property, receiver);
288
- },
289
- });
290
- };
291
- }
292
-
293
- return Reflect.get(target, property, receiver);
294
- },
295
- });
296
- }
297
-
298
- destroyNode(node: INode | ITextNode) {
299
- const div = document.getElementById(node.id.toString());
300
- div?.remove();
301
- }
302
-
303
- updateNodeProperty(
304
- div: HTMLElement,
305
- property: keyof INodeWritableProps | keyof ITextNodeWritableProps,
306
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
307
- value: any,
308
- ) {
309
- if (this.root === null || value === undefined || value === null) {
310
- return;
311
- }
312
-
313
- /**
314
- * Special case for parent property
315
- */
316
- if (property === 'parent') {
317
- const parentId: number = (value as INode).id;
318
-
319
- // only way to detect if the parent is the root node
320
- // if you are reading this and have a better way, please let me know
321
- if (parentId === 1) {
322
- this.root.appendChild(div);
323
- return;
324
- }
325
-
326
- const parent = document.getElementById(parentId.toString());
327
- parent?.appendChild(div);
328
- return;
329
- }
330
-
331
- // special case for text
332
- if (property === 'text') {
333
- div.innerHTML = String(value);
334
-
335
- // hide text because we can't render SDF fonts
336
- // it would look weird and obstruct the WebGL rendering
337
- div.style.visibility = 'hidden';
338
- return;
339
- }
340
-
341
- // special case for images
342
- // we're not setting any CSS properties to avoid images getting loaded twice
343
- // as the renderer will handle the loading of the image. Setting it to `data-src`
344
- if (property === 'src' && value) {
345
- div.setAttribute(`data-src`, String(value));
346
- return;
347
- }
348
-
349
- // special case for color gradients (normal colors are handled by the stylePropertyMap)
350
- // FIXME the renderer seems to return the same number for all colors
351
- // if (gradientColorPropertyMap.includes(property as string)) {
352
- // const color = convertColorToRgba(value as number);
353
- // div.setAttribute(`data-${property}`, color);
354
- // return;
355
- // }
356
-
357
- // CSS mappable attribute
358
- if (stylePropertyMap[property]) {
359
- const mappedStyleResponse = stylePropertyMap[property]?.(value);
360
-
361
- if (mappedStyleResponse === null) {
362
- return;
363
- }
364
-
365
- if (typeof mappedStyleResponse === 'string') {
366
- div.style.setProperty(mappedStyleResponse, String(value));
367
- return;
368
- }
369
-
370
- if (typeof mappedStyleResponse === 'object') {
371
- div.style.setProperty(
372
- mappedStyleResponse.prop,
373
- mappedStyleResponse.value,
374
- );
375
- }
376
-
377
- return;
378
- }
379
-
380
- // DOM properties
381
- if (domPropertyMap[property]) {
382
- div.setAttribute(String(stylePropertyMap[property]), String(value));
383
- return;
384
- }
385
-
386
- // custom data properties
387
- if (property === 'data') {
388
- for (const key in value) {
389
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
390
- div.setAttribute(`data-${key}`, String(value[key]));
391
- }
392
- return;
393
- }
394
- }
395
-
396
- // simple animation handler
397
- animateNode(
398
- div: HTMLElement,
399
- node: INode,
400
- props: INodeAnimatableProps,
401
- settings: AnimationSettings,
402
- ) {
403
- const {
404
- duration = 1000,
405
- delay = 0,
406
- // easing = 'linear',
407
- // repeat = 0,
408
- // loop = false,
409
- // stopMethod = false,
410
- } = settings;
411
-
412
- const {
413
- x,
414
- y,
415
- width,
416
- height,
417
- alpha = 1,
418
- rotation = 0,
419
- scale = 1,
420
- color,
421
- } = props;
422
-
423
- // ignoring loops and repeats for now, as that might be a bit too much for the inspector
424
- function animate() {
425
- setTimeout(() => {
426
- div.style.top = `${y}px`;
427
- div.style.left = `${x}px`;
428
- div.style.width = `${width}px`;
429
- div.style.height = `${height}px`;
430
- div.style.opacity = `${alpha}`;
431
- div.style.rotate = `${rotation}rad`;
432
- div.style.scale = `${scale}`;
433
- div.style.color = convertColorToRgba(color);
434
- }, duration);
435
- }
436
-
437
- setTimeout(animate, delay);
438
- }
439
- }
1
+ import type {
2
+ INode,
3
+ INodeAnimatableProps,
4
+ INodeWritableProps,
5
+ ITextNode,
6
+ ITextNodeWritableProps,
7
+ } from './INode.js';
8
+ import type { ICoreDriver } from './ICoreDriver.js';
9
+ import { type RendererMainSettings } from './RendererMain.js';
10
+ import type { AnimationSettings } from '../core/animations/CoreAnimation.js';
11
+ import type { IAnimationController } from '../common/IAnimationController.js';
12
+ import { isProductionEnvironment } from '../utils.js';
13
+
14
+ /**
15
+ * Inspector
16
+ *
17
+ * The inspector is a tool that allows you to inspect the state of the renderer
18
+ * and the nodes that are being rendered. It is a tool that is used for debugging
19
+ * and development purposes.
20
+ *
21
+ * The inspector will generate a DOM tree that mirrors the state of the renderer
22
+ */
23
+
24
+ /**
25
+ * stylePropertyMap is a map of renderer properties that are mapped to CSS properties
26
+ *
27
+ * It can either return a string or an object with a prop and value property. Once a
28
+ * property is found in the map, the value is set on the style of the div element.
29
+ * Erik H made me do it.
30
+ */
31
+ interface StyleResponse {
32
+ prop: string;
33
+ value: string;
34
+ }
35
+ const stylePropertyMap: {
36
+ [key: string]: (
37
+ value: string | number | boolean,
38
+ ) => string | StyleResponse | null;
39
+ } = {
40
+ alpha: (v) => {
41
+ if (v === 1) {
42
+ return null;
43
+ }
44
+
45
+ return { prop: 'opacity', value: `${v}` };
46
+ },
47
+ x: (x) => {
48
+ return { prop: 'left', value: `${x}px` };
49
+ },
50
+ y: (y) => {
51
+ return { prop: 'top', value: `${y}px` };
52
+ },
53
+ width: (w) => {
54
+ if (w === 0) {
55
+ return null;
56
+ }
57
+
58
+ return { prop: 'width', value: `${w}px` };
59
+ },
60
+ height: (h) => {
61
+ if (h === 0) {
62
+ return null;
63
+ }
64
+
65
+ return { prop: 'height', value: `${h}px` };
66
+ },
67
+ zIndex: () => 'zIndex',
68
+ fontFamily: () => 'font-family',
69
+ fontSize: () => 'font-size',
70
+ fontStyle: () => 'font-style',
71
+ fontWeight: () => 'font-weight',
72
+ fontStretch: () => 'font-stretch',
73
+ lineHeight: () => 'line-height',
74
+ letterSpacing: () => 'letter-spacing',
75
+ textAlign: () => 'text-align',
76
+ overflowSuffix: () => 'overflow-suffix',
77
+ maxLines: () => 'max-lines',
78
+ contain: () => 'contain',
79
+ verticalAlign: () => 'vertical-align',
80
+ clipping: (v) => {
81
+ if (v === false) {
82
+ return null;
83
+ }
84
+
85
+ return { prop: 'overflow', value: v ? 'hidden' : 'visible' };
86
+ },
87
+ rotation: (v) => {
88
+ if (v === 0) {
89
+ return null;
90
+ }
91
+
92
+ return { prop: 'transform', value: `rotate(${v}rad)` };
93
+ },
94
+ scale: (v) => {
95
+ if (v === 1) {
96
+ return null;
97
+ }
98
+
99
+ return { prop: 'transform', value: `scale(${v})` };
100
+ },
101
+ scaleX: (v) => {
102
+ if (v === 1) {
103
+ return null;
104
+ }
105
+
106
+ return { prop: 'transform', value: `scaleX(${v})` };
107
+ },
108
+ scaleY: (v) => {
109
+ if (v === 1) {
110
+ return null;
111
+ }
112
+
113
+ return { prop: 'transform', value: `scaleY(${v})` };
114
+ },
115
+ color: (v) => {
116
+ if (v === 0) {
117
+ return null;
118
+ }
119
+
120
+ return { prop: 'color', value: convertColorToRgba(v as number) };
121
+ },
122
+ };
123
+
124
+ const convertColorToRgba = (color: number) => {
125
+ const a = (color & 0xff) / 255;
126
+ const b = (color >> 8) & 0xff;
127
+ const g = (color >> 16) & 0xff;
128
+ const r = (color >> 24) & 0xff;
129
+ return `rgba(${r},${g},${b},${a})`;
130
+ };
131
+
132
+ const domPropertyMap: { [key: string]: string } = {
133
+ id: 'id',
134
+ };
135
+
136
+ const gradientColorPropertyMap = [
137
+ 'colorTop',
138
+ 'colorBottom',
139
+ 'colorLeft',
140
+ 'colorRight',
141
+ 'colorTl',
142
+ 'colorTr',
143
+ 'colorBl',
144
+ 'colorBr',
145
+ ];
146
+
147
+ export class Inspector {
148
+ private root: HTMLElement | null = null;
149
+ private canvas: HTMLCanvasElement | null = null;
150
+ private height = 1080;
151
+ private width = 1920;
152
+ private scaleX = 1;
153
+ private scaleY = 1;
154
+
155
+ constructor(canvas: HTMLCanvasElement, settings: RendererMainSettings) {
156
+ if (isProductionEnvironment()) return;
157
+
158
+ if (!settings) {
159
+ throw new Error('settings is required');
160
+ }
161
+
162
+ // calc dimensions based on the devicePixelRatio
163
+ this.height = Math.ceil(
164
+ settings.appHeight ?? 1080 / (settings.deviceLogicalPixelRatio ?? 1),
165
+ );
166
+
167
+ this.width = Math.ceil(
168
+ settings.appWidth ?? 1900 / (settings.deviceLogicalPixelRatio ?? 1),
169
+ );
170
+
171
+ this.scaleX = settings.deviceLogicalPixelRatio ?? 1;
172
+ this.scaleY = settings.deviceLogicalPixelRatio ?? 1;
173
+
174
+ this.canvas = canvas;
175
+ this.root = document.createElement('div');
176
+ this.setRootPosition();
177
+ document.body.appendChild(this.root);
178
+
179
+ //listen for changes on canvas
180
+ const mutationObserver = new MutationObserver(
181
+ this.setRootPosition.bind(this),
182
+ );
183
+ mutationObserver.observe(canvas, {
184
+ attributes: true,
185
+ childList: false,
186
+ subtree: false,
187
+ });
188
+
189
+ // Create a ResizeObserver to watch for changes in the element's size
190
+ const resizeObserver = new ResizeObserver(this.setRootPosition.bind(this));
191
+ resizeObserver.observe(canvas);
192
+
193
+ //listen for changes on window
194
+ window.addEventListener('resize', this.setRootPosition.bind(this));
195
+
196
+ console.warn('Inspector is enabled, this will impact performance');
197
+ }
198
+
199
+ setRootPosition() {
200
+ if (this.root === null || this.canvas === null) {
201
+ return;
202
+ }
203
+
204
+ // get the world position of the canvas object, so we can match the inspector to it
205
+ const rect = this.canvas.getBoundingClientRect();
206
+ const top = document.documentElement.scrollTop + rect.top;
207
+ const left = document.documentElement.scrollLeft + rect.left;
208
+
209
+ this.root.id = 'root';
210
+ this.root.style.left = `${left}px`;
211
+ this.root.style.top = `${top}px`;
212
+ this.root.style.width = `${this.width}px`;
213
+ this.root.style.height = `${this.height}px`;
214
+ this.root.style.position = 'absolute';
215
+ this.root.style.transformOrigin = '0 0 0';
216
+ this.root.style.transform = `scale(${this.scaleX}, ${this.scaleY})`;
217
+ this.root.style.overflow = 'hidden';
218
+ this.root.style.zIndex = '65534';
219
+ }
220
+
221
+ createDiv(
222
+ node: INode | ITextNode,
223
+ properties: INodeWritableProps | ITextNodeWritableProps,
224
+ ): HTMLElement {
225
+ const div = document.createElement('div');
226
+ div.style.position = 'absolute';
227
+ div.id = node.id.toString();
228
+
229
+ // set initial properties
230
+ for (const key in properties) {
231
+ this.updateNodeProperty(
232
+ div,
233
+ // really typescript? really?
234
+ key as keyof (INodeWritableProps & ITextNodeWritableProps),
235
+ (properties as INodeWritableProps & ITextNodeWritableProps)[
236
+ key as keyof (INodeWritableProps & ITextNodeWritableProps)
237
+ ],
238
+ );
239
+ }
240
+
241
+ return div;
242
+ }
243
+
244
+ createNode(driver: ICoreDriver, properties: INodeWritableProps): INode {
245
+ const node = driver.createNode(properties);
246
+ const div = this.createDiv(node, properties);
247
+
248
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
249
+ (div as any).node = node;
250
+
251
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any
252
+ (node as any).div = div;
253
+
254
+ return this.createProxy(node, div);
255
+ }
256
+
257
+ createTextNode(
258
+ driver: ICoreDriver,
259
+ properties: ITextNodeWritableProps,
260
+ ): ITextNode {
261
+ const node = driver.createTextNode(properties);
262
+ const div = this.createDiv(node, properties);
263
+ return this.createProxy(node, div) as ITextNode;
264
+ }
265
+
266
+ createProxy(node: INode | ITextNode, div: HTMLElement): INode | ITextNode {
267
+ return new Proxy(node, {
268
+ set: (target, property: keyof INodeWritableProps, value) => {
269
+ this.updateNodeProperty(div, property, value);
270
+ return Reflect.set(target, property, value);
271
+ },
272
+ get: (target, property: keyof INode, receiver: any): any => {
273
+ if (property === 'destroy') {
274
+ this.destroyNode(target);
275
+ }
276
+
277
+ if (property === 'animate') {
278
+ return (props: INodeAnimatableProps, settings: AnimationSettings) => {
279
+ const anim = target.animate(props, settings);
280
+
281
+ // Trap the animate start function so we can update the inspector accordingly
282
+ return new Proxy(anim, {
283
+ get: (target, property: keyof IAnimationController, receiver) => {
284
+ if (property === 'start') {
285
+ this.animateNode(div, node, props, settings);
286
+ }
287
+
288
+ return Reflect.get(target, property, receiver);
289
+ },
290
+ });
291
+ };
292
+ }
293
+
294
+ return Reflect.get(target, property, receiver);
295
+ },
296
+ });
297
+ }
298
+
299
+ destroyNode(node: INode | ITextNode) {
300
+ const div = document.getElementById(node.id.toString());
301
+ div?.remove();
302
+ }
303
+
304
+ updateNodeProperty(
305
+ div: HTMLElement,
306
+ property: keyof INodeWritableProps | keyof ITextNodeWritableProps,
307
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
308
+ value: any,
309
+ ) {
310
+ if (this.root === null || value === undefined || value === null) {
311
+ return;
312
+ }
313
+
314
+ /**
315
+ * Special case for parent property
316
+ */
317
+ if (property === 'parent') {
318
+ const parentId: number = (value as INode).id;
319
+
320
+ // only way to detect if the parent is the root node
321
+ // if you are reading this and have a better way, please let me know
322
+ if (parentId === 1) {
323
+ this.root.appendChild(div);
324
+ return;
325
+ }
326
+
327
+ const parent = document.getElementById(parentId.toString());
328
+ parent?.appendChild(div);
329
+ return;
330
+ }
331
+
332
+ // special case for text
333
+ if (property === 'text') {
334
+ div.innerHTML = String(value);
335
+
336
+ // hide text because we can't render SDF fonts
337
+ // it would look weird and obstruct the WebGL rendering
338
+ div.style.visibility = 'hidden';
339
+ return;
340
+ }
341
+
342
+ // special case for images
343
+ // we're not setting any CSS properties to avoid images getting loaded twice
344
+ // as the renderer will handle the loading of the image. Setting it to `data-src`
345
+ if (property === 'src' && value) {
346
+ div.setAttribute(`data-src`, String(value));
347
+ return;
348
+ }
349
+
350
+ // special case for color gradients (normal colors are handled by the stylePropertyMap)
351
+ // FIXME the renderer seems to return the same number for all colors
352
+ // if (gradientColorPropertyMap.includes(property as string)) {
353
+ // const color = convertColorToRgba(value as number);
354
+ // div.setAttribute(`data-${property}`, color);
355
+ // return;
356
+ // }
357
+
358
+ // CSS mappable attribute
359
+ if (stylePropertyMap[property]) {
360
+ const mappedStyleResponse = stylePropertyMap[property]?.(value);
361
+
362
+ if (mappedStyleResponse === null) {
363
+ return;
364
+ }
365
+
366
+ if (typeof mappedStyleResponse === 'string') {
367
+ div.style.setProperty(mappedStyleResponse, String(value));
368
+ return;
369
+ }
370
+
371
+ if (typeof mappedStyleResponse === 'object') {
372
+ div.style.setProperty(
373
+ mappedStyleResponse.prop,
374
+ mappedStyleResponse.value,
375
+ );
376
+ }
377
+
378
+ return;
379
+ }
380
+
381
+ // DOM properties
382
+ if (domPropertyMap[property]) {
383
+ div.setAttribute(String(stylePropertyMap[property]), String(value));
384
+ return;
385
+ }
386
+
387
+ // custom data properties
388
+ if (property === 'data') {
389
+ for (const key in value) {
390
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
391
+ div.setAttribute(`data-${key}`, String(value[key]));
392
+ }
393
+ return;
394
+ }
395
+ }
396
+
397
+ // simple animation handler
398
+ animateNode(
399
+ div: HTMLElement,
400
+ node: INode,
401
+ props: INodeAnimatableProps,
402
+ settings: AnimationSettings,
403
+ ) {
404
+ const {
405
+ duration = 1000,
406
+ delay = 0,
407
+ // easing = 'linear',
408
+ // repeat = 0,
409
+ // loop = false,
410
+ // stopMethod = false,
411
+ } = settings;
412
+
413
+ const {
414
+ x,
415
+ y,
416
+ width,
417
+ height,
418
+ alpha = 1,
419
+ rotation = 0,
420
+ scale = 1,
421
+ color,
422
+ } = props;
423
+
424
+ // ignoring loops and repeats for now, as that might be a bit too much for the inspector
425
+ function animate() {
426
+ setTimeout(() => {
427
+ div.style.top = `${y}px`;
428
+ div.style.left = `${x}px`;
429
+ div.style.width = `${width}px`;
430
+ div.style.height = `${height}px`;
431
+ div.style.opacity = `${alpha}`;
432
+ div.style.rotate = `${rotation}rad`;
433
+ div.style.scale = `${scale}`;
434
+ div.style.color = convertColorToRgba(color);
435
+ }, duration);
436
+ }
437
+
438
+ setTimeout(animate, delay);
439
+ }
440
+ }