@llc3233149/core 0.9.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 (457) hide show
  1. package/dist/canvaskit.d.ts +9 -0
  2. package/dist/canvaskit.d.ts.map +1 -0
  3. package/dist/canvaskit.js +55 -0
  4. package/dist/canvaskit.js.map +1 -0
  5. package/dist/clipboard.d.ts +32 -0
  6. package/dist/clipboard.d.ts.map +1 -0
  7. package/dist/clipboard.js +345 -0
  8. package/dist/clipboard.js.map +1 -0
  9. package/dist/color.d.ts +28 -0
  10. package/dist/color.d.ts.map +1 -0
  11. package/dist/color.js +67 -0
  12. package/dist/color.js.map +1 -0
  13. package/dist/constants.d.ts +159 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +224 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/copy.d.ts +20 -0
  18. package/dist/copy.d.ts.map +1 -0
  19. package/dist/copy.js +64 -0
  20. package/dist/copy.js.map +1 -0
  21. package/dist/fig-export-worker.d.ts +2 -0
  22. package/dist/fig-export-worker.d.ts.map +1 -0
  23. package/dist/fig-export-worker.js +17 -0
  24. package/dist/fig-export-worker.js.map +1 -0
  25. package/dist/fig-export.d.ts +13 -0
  26. package/dist/fig-export.d.ts.map +1 -0
  27. package/dist/fig-export.js +243 -0
  28. package/dist/fig-export.js.map +1 -0
  29. package/dist/figma-api.d.ts +268 -0
  30. package/dist/figma-api.d.ts.map +1 -0
  31. package/dist/figma-api.js +1074 -0
  32. package/dist/figma-api.js.map +1 -0
  33. package/dist/figma-rest-import.d.ts +122 -0
  34. package/dist/figma-rest-import.d.ts.map +1 -0
  35. package/dist/figma-rest-import.js +319 -0
  36. package/dist/figma-rest-import.js.map +1 -0
  37. package/dist/fonts.d.ts +24 -0
  38. package/dist/fonts.d.ts.map +1 -0
  39. package/dist/fonts.js +356 -0
  40. package/dist/fonts.js.map +1 -0
  41. package/dist/geometry.d.ts +14 -0
  42. package/dist/geometry.d.ts.map +1 -0
  43. package/dist/geometry.js +47 -0
  44. package/dist/geometry.js.map +1 -0
  45. package/dist/index.d.ts +38 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +32 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/kiwi/codec.d.ts +292 -0
  50. package/dist/kiwi/codec.d.ts.map +1 -0
  51. package/dist/kiwi/codec.js +340 -0
  52. package/dist/kiwi/codec.js.map +1 -0
  53. package/dist/kiwi/fig-file.d.ts +4 -0
  54. package/dist/kiwi/fig-file.d.ts.map +1 -0
  55. package/dist/kiwi/fig-file.js +236 -0
  56. package/dist/kiwi/fig-file.js.map +1 -0
  57. package/dist/kiwi/fig-import.d.ts +4 -0
  58. package/dist/kiwi/fig-import.d.ts.map +1 -0
  59. package/dist/kiwi/fig-import.js +248 -0
  60. package/dist/kiwi/fig-import.js.map +1 -0
  61. package/dist/kiwi/fig-parse-worker.d.ts +7 -0
  62. package/dist/kiwi/fig-parse-worker.d.ts.map +1 -0
  63. package/dist/kiwi/fig-parse-worker.js +184 -0
  64. package/dist/kiwi/fig-parse-worker.js.map +1 -0
  65. package/dist/kiwi/instance-overrides.d.ts +66 -0
  66. package/dist/kiwi/instance-overrides.d.ts.map +1 -0
  67. package/dist/kiwi/instance-overrides.js +644 -0
  68. package/dist/kiwi/instance-overrides.js.map +1 -0
  69. package/dist/kiwi/kiwi-convert.d.ts +19 -0
  70. package/dist/kiwi/kiwi-convert.d.ts.map +1 -0
  71. package/dist/kiwi/kiwi-convert.js +678 -0
  72. package/dist/kiwi/kiwi-convert.js.map +1 -0
  73. package/dist/kiwi/kiwi-schema/bb.d.ts +25 -0
  74. package/dist/kiwi/kiwi-schema/bb.d.ts.map +1 -0
  75. package/dist/kiwi/kiwi-schema/bb.js +225 -0
  76. package/dist/kiwi/kiwi-schema/bb.js.map +1 -0
  77. package/dist/kiwi/kiwi-schema/binary.d.ts +5 -0
  78. package/dist/kiwi/kiwi-schema/binary.d.ts.map +1 -0
  79. package/dist/kiwi/kiwi-schema/binary.js +86 -0
  80. package/dist/kiwi/kiwi-schema/binary.js.map +1 -0
  81. package/dist/kiwi/kiwi-schema/index.d.ts +6 -0
  82. package/dist/kiwi/kiwi-schema/index.d.ts.map +1 -0
  83. package/dist/kiwi/kiwi-schema/index.js +5 -0
  84. package/dist/kiwi/kiwi-schema/index.js.map +1 -0
  85. package/dist/kiwi/kiwi-schema/js.d.ts +4 -0
  86. package/dist/kiwi/kiwi-schema/js.d.ts.map +1 -0
  87. package/dist/kiwi/kiwi-schema/js.js +282 -0
  88. package/dist/kiwi/kiwi-schema/js.js.map +1 -0
  89. package/dist/kiwi/kiwi-schema/parser.d.ts +5 -0
  90. package/dist/kiwi/kiwi-schema/parser.d.ts.map +1 -0
  91. package/dist/kiwi/kiwi-schema/parser.js +228 -0
  92. package/dist/kiwi/kiwi-schema/parser.js.map +1 -0
  93. package/dist/kiwi/kiwi-schema/schema.d.ts +22 -0
  94. package/dist/kiwi/kiwi-schema/schema.d.ts.map +1 -0
  95. package/dist/kiwi/kiwi-schema/schema.js +2 -0
  96. package/dist/kiwi/kiwi-schema/schema.js.map +1 -0
  97. package/dist/kiwi/kiwi-schema/util.d.ts +3 -0
  98. package/dist/kiwi/kiwi-schema/util.d.ts.map +1 -0
  99. package/dist/kiwi/kiwi-schema/util.js +10 -0
  100. package/dist/kiwi/kiwi-schema/util.js.map +1 -0
  101. package/dist/kiwi/protocol.d.ts +172 -0
  102. package/dist/kiwi/protocol.d.ts.map +1 -0
  103. package/dist/kiwi/protocol.js +214 -0
  104. package/dist/kiwi/protocol.js.map +1 -0
  105. package/dist/kiwi/schema.d.ts +3 -0
  106. package/dist/kiwi/schema.d.ts.map +1 -0
  107. package/dist/kiwi/schema.js +2285 -0
  108. package/dist/kiwi/schema.js.map +1 -0
  109. package/dist/kiwi-serialize.d.ts +17 -0
  110. package/dist/kiwi-serialize.d.ts.map +1 -0
  111. package/dist/kiwi-serialize.js +419 -0
  112. package/dist/kiwi-serialize.js.map +1 -0
  113. package/dist/layout.d.ts +9 -0
  114. package/dist/layout.d.ts.map +1 -0
  115. package/dist/layout.js +533 -0
  116. package/dist/layout.js.map +1 -0
  117. package/dist/profiler/draw-call-counter.d.ts +9 -0
  118. package/dist/profiler/draw-call-counter.d.ts.map +1 -0
  119. package/dist/profiler/draw-call-counter.js +37 -0
  120. package/dist/profiler/draw-call-counter.js.map +1 -0
  121. package/dist/profiler/frame-capture.d.ts +34 -0
  122. package/dist/profiler/frame-capture.d.ts.map +1 -0
  123. package/dist/profiler/frame-capture.js +90 -0
  124. package/dist/profiler/frame-capture.js.map +1 -0
  125. package/dist/profiler/frame-stats.d.ts +33 -0
  126. package/dist/profiler/frame-stats.d.ts.map +1 -0
  127. package/dist/profiler/frame-stats.js +103 -0
  128. package/dist/profiler/frame-stats.js.map +1 -0
  129. package/dist/profiler/gpu-timer.d.ts +15 -0
  130. package/dist/profiler/gpu-timer.d.ts.map +1 -0
  131. package/dist/profiler/gpu-timer.js +77 -0
  132. package/dist/profiler/gpu-timer.js.map +1 -0
  133. package/dist/profiler/hud-renderer.d.ts +22 -0
  134. package/dist/profiler/hud-renderer.d.ts.map +1 -0
  135. package/dist/profiler/hud-renderer.js +200 -0
  136. package/dist/profiler/hud-renderer.js.map +1 -0
  137. package/dist/profiler/index.d.ts +9 -0
  138. package/dist/profiler/index.d.ts.map +1 -0
  139. package/dist/profiler/index.js +8 -0
  140. package/dist/profiler/index.js.map +1 -0
  141. package/dist/profiler/phase-timer.d.ts +9 -0
  142. package/dist/profiler/phase-timer.d.ts.map +1 -0
  143. package/dist/profiler/phase-timer.js +51 -0
  144. package/dist/profiler/phase-timer.js.map +1 -0
  145. package/dist/profiler/render-profiler.d.ts +41 -0
  146. package/dist/profiler/render-profiler.d.ts.map +1 -0
  147. package/dist/profiler/render-profiler.js +142 -0
  148. package/dist/profiler/render-profiler.js.map +1 -0
  149. package/dist/render/components.d.ts +25 -0
  150. package/dist/render/components.d.ts.map +1 -0
  151. package/dist/render/components.js +55 -0
  152. package/dist/render/components.js.map +1 -0
  153. package/dist/render/emoji-icons.d.ts +5 -0
  154. package/dist/render/emoji-icons.d.ts.map +1 -0
  155. package/dist/render/emoji-icons.js +55 -0
  156. package/dist/render/emoji-icons.js.map +1 -0
  157. package/dist/render/export-code.d.ts +9 -0
  158. package/dist/render/export-code.d.ts.map +1 -0
  159. package/dist/render/export-code.js +335 -0
  160. package/dist/render/export-code.js.map +1 -0
  161. package/dist/render/export-jsx.d.ts +5 -0
  162. package/dist/render/export-jsx.d.ts.map +1 -0
  163. package/dist/render/export-jsx.js +621 -0
  164. package/dist/render/export-jsx.js.map +1 -0
  165. package/dist/render/index.d.ts +8 -0
  166. package/dist/render/index.d.ts.map +1 -0
  167. package/dist/render/index.js +8 -0
  168. package/dist/render/index.js.map +1 -0
  169. package/dist/render/jsx-runtime.d.ts +31 -0
  170. package/dist/render/jsx-runtime.d.ts.map +1 -0
  171. package/dist/render/jsx-runtime.js +13 -0
  172. package/dist/render/jsx-runtime.js.map +1 -0
  173. package/dist/render/mini-react.d.ts +14 -0
  174. package/dist/render/mini-react.d.ts.map +1 -0
  175. package/dist/render/mini-react.js +16 -0
  176. package/dist/render/mini-react.js.map +1 -0
  177. package/dist/render/render-jsx.d.ts +24 -0
  178. package/dist/render/render-jsx.d.ts.map +1 -0
  179. package/dist/render/render-jsx.js +51 -0
  180. package/dist/render/render-jsx.js.map +1 -0
  181. package/dist/render/renderer.d.ts +16 -0
  182. package/dist/render/renderer.d.ts.map +1 -0
  183. package/dist/render/renderer.js +437 -0
  184. package/dist/render/renderer.js.map +1 -0
  185. package/dist/render/tailwind.d.ts +20 -0
  186. package/dist/render/tailwind.d.ts.map +1 -0
  187. package/dist/render/tailwind.js +115 -0
  188. package/dist/render/tailwind.js.map +1 -0
  189. package/dist/render/tree.d.ts +72 -0
  190. package/dist/render/tree.d.ts.map +1 -0
  191. package/dist/render/tree.js +63 -0
  192. package/dist/render/tree.js.map +1 -0
  193. package/dist/render-image.d.ts +19 -0
  194. package/dist/render-image.d.ts.map +1 -0
  195. package/dist/render-image.js +84 -0
  196. package/dist/render-image.js.map +1 -0
  197. package/dist/renderer/effects.d.ts +9 -0
  198. package/dist/renderer/effects.d.ts.map +1 -0
  199. package/dist/renderer/effects.js +44 -0
  200. package/dist/renderer/effects.js.map +1 -0
  201. package/dist/renderer/fills.d.ts +9 -0
  202. package/dist/renderer/fills.d.ts.map +1 -0
  203. package/dist/renderer/fills.js +189 -0
  204. package/dist/renderer/fills.js.map +1 -0
  205. package/dist/renderer/index.d.ts +2 -0
  206. package/dist/renderer/index.d.ts.map +1 -0
  207. package/dist/renderer/index.js +2 -0
  208. package/dist/renderer/index.js.map +1 -0
  209. package/dist/renderer/label-cache.d.ts +43 -0
  210. package/dist/renderer/label-cache.d.ts.map +1 -0
  211. package/dist/renderer/label-cache.js +85 -0
  212. package/dist/renderer/label-cache.js.map +1 -0
  213. package/dist/renderer/labels.d.ts +6 -0
  214. package/dist/renderer/labels.d.ts.map +1 -0
  215. package/dist/renderer/labels.js +126 -0
  216. package/dist/renderer/labels.js.map +1 -0
  217. package/dist/renderer/lru-cache.d.ts +20 -0
  218. package/dist/renderer/lru-cache.d.ts.map +1 -0
  219. package/dist/renderer/lru-cache.js +65 -0
  220. package/dist/renderer/lru-cache.js.map +1 -0
  221. package/dist/renderer/overlays.d.ts +25 -0
  222. package/dist/renderer/overlays.d.ts.map +1 -0
  223. package/dist/renderer/overlays.js +783 -0
  224. package/dist/renderer/overlays.js.map +1 -0
  225. package/dist/renderer/renderer.d.ts +229 -0
  226. package/dist/renderer/renderer.d.ts.map +1 -0
  227. package/dist/renderer/renderer.js +909 -0
  228. package/dist/renderer/renderer.js.map +1 -0
  229. package/dist/renderer/rulers.d.ts +8 -0
  230. package/dist/renderer/rulers.d.ts.map +1 -0
  231. package/dist/renderer/rulers.js +147 -0
  232. package/dist/renderer/rulers.js.map +1 -0
  233. package/dist/renderer/scene.d.ts +11 -0
  234. package/dist/renderer/scene.d.ts.map +1 -0
  235. package/dist/renderer/scene.js +392 -0
  236. package/dist/renderer/scene.js.map +1 -0
  237. package/dist/renderer/shapes.d.ts +13 -0
  238. package/dist/renderer/shapes.d.ts.map +1 -0
  239. package/dist/renderer/shapes.js +160 -0
  240. package/dist/renderer/shapes.js.map +1 -0
  241. package/dist/renderer/strokes.d.ts +9 -0
  242. package/dist/renderer/strokes.d.ts.map +1 -0
  243. package/dist/renderer/strokes.js +180 -0
  244. package/dist/renderer/strokes.js.map +1 -0
  245. package/dist/rpc/commands.d.ts +202 -0
  246. package/dist/rpc/commands.d.ts.map +1 -0
  247. package/dist/rpc/commands.js +429 -0
  248. package/dist/rpc/commands.js.map +1 -0
  249. package/dist/rpc/index.d.ts +3 -0
  250. package/dist/rpc/index.d.ts.map +1 -0
  251. package/dist/rpc/index.js +2 -0
  252. package/dist/rpc/index.js.map +1 -0
  253. package/dist/scene-graph.d.ts +318 -0
  254. package/dist/scene-graph.d.ts.map +1 -0
  255. package/dist/scene-graph.js +803 -0
  256. package/dist/scene-graph.js.map +1 -0
  257. package/dist/snap.d.ts +16 -0
  258. package/dist/snap.d.ts.map +1 -0
  259. package/dist/snap.js +97 -0
  260. package/dist/snap.js.map +1 -0
  261. package/dist/style-runs.d.ts +20 -0
  262. package/dist/style-runs.d.ts.map +1 -0
  263. package/dist/style-runs.js +168 -0
  264. package/dist/style-runs.js.map +1 -0
  265. package/dist/svg-export/defs.d.ts +19 -0
  266. package/dist/svg-export/defs.d.ts.map +1 -0
  267. package/dist/svg-export/defs.js +191 -0
  268. package/dist/svg-export/defs.js.map +1 -0
  269. package/dist/svg-export/index.d.ts +8 -0
  270. package/dist/svg-export/index.d.ts.map +1 -0
  271. package/dist/svg-export/index.js +318 -0
  272. package/dist/svg-export/index.js.map +1 -0
  273. package/dist/svg-export/paths.d.ts +9 -0
  274. package/dist/svg-export/paths.d.ts.map +1 -0
  275. package/dist/svg-export/paths.js +189 -0
  276. package/dist/svg-export/paths.js.map +1 -0
  277. package/dist/svg-node.d.ts +8 -0
  278. package/dist/svg-node.d.ts.map +1 -0
  279. package/dist/svg-node.js +48 -0
  280. package/dist/svg-node.js.map +1 -0
  281. package/dist/text-editor.d.ts +57 -0
  282. package/dist/text-editor.d.ts.map +1 -0
  283. package/dist/text-editor.js +337 -0
  284. package/dist/text-editor.js.map +1 -0
  285. package/dist/tools/ai-adapter.d.ts +22 -0
  286. package/dist/tools/ai-adapter.d.ts.map +1 -0
  287. package/dist/tools/ai-adapter.js +121 -0
  288. package/dist/tools/ai-adapter.js.map +1 -0
  289. package/dist/tools/analyze.d.ts +22 -0
  290. package/dist/tools/analyze.d.ts.map +1 -0
  291. package/dist/tools/analyze.js +677 -0
  292. package/dist/tools/analyze.js.map +1 -0
  293. package/dist/tools/create.d.ts +8 -0
  294. package/dist/tools/create.d.ts.map +1 -0
  295. package/dist/tools/create.js +204 -0
  296. package/dist/tools/create.js.map +1 -0
  297. package/dist/tools/describe.d.ts +9 -0
  298. package/dist/tools/describe.d.ts.map +1 -0
  299. package/dist/tools/describe.js +295 -0
  300. package/dist/tools/describe.js.map +1 -0
  301. package/dist/tools/export-code.d.ts +2 -0
  302. package/dist/tools/export-code.d.ts.map +1 -0
  303. package/dist/tools/export-code.js +34 -0
  304. package/dist/tools/export-code.js.map +1 -0
  305. package/dist/tools/export-tailwind-config.d.ts +27 -0
  306. package/dist/tools/export-tailwind-config.d.ts.map +1 -0
  307. package/dist/tools/export-tailwind-config.js +215 -0
  308. package/dist/tools/export-tailwind-config.js.map +1 -0
  309. package/dist/tools/icons.d.ts +5 -0
  310. package/dist/tools/icons.d.ts.map +1 -0
  311. package/dist/tools/icons.js +192 -0
  312. package/dist/tools/icons.js.map +1 -0
  313. package/dist/tools/index.d.ts +7 -0
  314. package/dist/tools/index.d.ts.map +1 -0
  315. package/dist/tools/index.js +6 -0
  316. package/dist/tools/index.js.map +1 -0
  317. package/dist/tools/modify.d.ts +22 -0
  318. package/dist/tools/modify.d.ts.map +1 -0
  319. package/dist/tools/modify.js +653 -0
  320. package/dist/tools/modify.js.map +1 -0
  321. package/dist/tools/patterns.d.ts +2 -0
  322. package/dist/tools/patterns.d.ts.map +1 -0
  323. package/dist/tools/patterns.js +173 -0
  324. package/dist/tools/patterns.js.map +1 -0
  325. package/dist/tools/read.d.ts +17 -0
  326. package/dist/tools/read.d.ts.map +1 -0
  327. package/dist/tools/read.js +379 -0
  328. package/dist/tools/read.js.map +1 -0
  329. package/dist/tools/registry.d.ts +3 -0
  330. package/dist/tools/registry.d.ts.map +1 -0
  331. package/dist/tools/registry.js +124 -0
  332. package/dist/tools/registry.js.map +1 -0
  333. package/dist/tools/schema.d.ts +46 -0
  334. package/dist/tools/schema.d.ts.map +1 -0
  335. package/dist/tools/schema.js +17 -0
  336. package/dist/tools/schema.js.map +1 -0
  337. package/dist/tools/structure.d.ts +18 -0
  338. package/dist/tools/structure.d.ts.map +1 -0
  339. package/dist/tools/structure.js +345 -0
  340. package/dist/tools/structure.js.map +1 -0
  341. package/dist/tools/variables.d.ts +12 -0
  342. package/dist/tools/variables.d.ts.map +1 -0
  343. package/dist/tools/variables.js +190 -0
  344. package/dist/tools/variables.js.map +1 -0
  345. package/dist/tools/vector.d.ts +15 -0
  346. package/dist/tools/vector.d.ts.map +1 -0
  347. package/dist/tools/vector.js +312 -0
  348. package/dist/tools/vector.js.map +1 -0
  349. package/dist/types.d.ts +29 -0
  350. package/dist/types.d.ts.map +1 -0
  351. package/dist/types.js +2 -0
  352. package/dist/types.js.map +1 -0
  353. package/dist/undo.d.ts +33 -0
  354. package/dist/undo.d.ts.map +1 -0
  355. package/dist/undo.js +98 -0
  356. package/dist/undo.js.map +1 -0
  357. package/dist/vector.d.ts +14 -0
  358. package/dist/vector.d.ts.map +1 -0
  359. package/dist/vector.js +334 -0
  360. package/dist/vector.js.map +1 -0
  361. package/dist/xpath.d.ts +8 -0
  362. package/dist/xpath.d.ts.map +1 -0
  363. package/dist/xpath.js +199 -0
  364. package/dist/xpath.js.map +1 -0
  365. package/package.json +54 -0
  366. package/src/canvaskit.ts +66 -0
  367. package/src/clipboard.ts +444 -0
  368. package/src/color.ts +83 -0
  369. package/src/constants.ts +277 -0
  370. package/src/copy.ts +75 -0
  371. package/src/fig-export-worker.ts +28 -0
  372. package/src/fig-export.ts +321 -0
  373. package/src/figma-api.ts +1297 -0
  374. package/src/figma-rest-import.ts +443 -0
  375. package/src/fonts.ts +369 -0
  376. package/src/geometry.ts +73 -0
  377. package/src/global.d.ts +20 -0
  378. package/src/index.ts +247 -0
  379. package/src/kiwi/codec.ts +614 -0
  380. package/src/kiwi/fig-file.ts +248 -0
  381. package/src/kiwi/fig-import.ts +300 -0
  382. package/src/kiwi/fig-parse-worker.ts +213 -0
  383. package/src/kiwi/instance-overrides.ts +682 -0
  384. package/src/kiwi/kiwi-convert.ts +771 -0
  385. package/src/kiwi/kiwi-schema/bb.ts +244 -0
  386. package/src/kiwi/kiwi-schema/binary.ts +102 -0
  387. package/src/kiwi/kiwi-schema/index.ts +5 -0
  388. package/src/kiwi/kiwi-schema/js.ts +339 -0
  389. package/src/kiwi/kiwi-schema/parser.ts +287 -0
  390. package/src/kiwi/kiwi-schema/schema.ts +24 -0
  391. package/src/kiwi/kiwi-schema/util.ts +10 -0
  392. package/src/kiwi/protocol.ts +237 -0
  393. package/src/kiwi/schema.ts +2286 -0
  394. package/src/kiwi-serialize.ts +467 -0
  395. package/src/layout.ts +608 -0
  396. package/src/profiler/draw-call-counter.ts +43 -0
  397. package/src/profiler/frame-capture.ts +139 -0
  398. package/src/profiler/frame-stats.ts +122 -0
  399. package/src/profiler/gpu-timer.ts +93 -0
  400. package/src/profiler/hud-renderer.ts +242 -0
  401. package/src/profiler/index.ts +8 -0
  402. package/src/profiler/phase-timer.ts +62 -0
  403. package/src/profiler/render-profiler.ts +163 -0
  404. package/src/render/components.ts +69 -0
  405. package/src/render/emoji-icons.ts +60 -0
  406. package/src/render/export-code.ts +366 -0
  407. package/src/render/export-jsx.ts +633 -0
  408. package/src/render/index.ts +38 -0
  409. package/src/render/jsx-runtime.ts +36 -0
  410. package/src/render/mini-react.ts +30 -0
  411. package/src/render/render-jsx.ts +74 -0
  412. package/src/render/renderer.ts +508 -0
  413. package/src/render/tailwind.ts +114 -0
  414. package/src/render/tree.ts +137 -0
  415. package/src/render-image.ts +139 -0
  416. package/src/renderer/effects.ts +64 -0
  417. package/src/renderer/fills.ts +248 -0
  418. package/src/renderer/index.ts +1 -0
  419. package/src/renderer/label-cache.ts +114 -0
  420. package/src/renderer/labels.ts +168 -0
  421. package/src/renderer/lru-cache.ts +71 -0
  422. package/src/renderer/overlays.ts +1089 -0
  423. package/src/renderer/renderer.ts +1226 -0
  424. package/src/renderer/rulers.ts +230 -0
  425. package/src/renderer/scene.ts +554 -0
  426. package/src/renderer/shapes.ts +193 -0
  427. package/src/renderer/strokes.ts +221 -0
  428. package/src/rpc/commands.ts +667 -0
  429. package/src/rpc/index.ts +25 -0
  430. package/src/scene-graph.ts +1254 -0
  431. package/src/snap.ts +122 -0
  432. package/src/style-runs.ts +234 -0
  433. package/src/svg-export/defs.ts +255 -0
  434. package/src/svg-export/index.ts +427 -0
  435. package/src/svg-export/paths.ts +212 -0
  436. package/src/svg-node.ts +62 -0
  437. package/src/text-editor.ts +349 -0
  438. package/src/tools/ai-adapter.ts +144 -0
  439. package/src/tools/analyze.ts +786 -0
  440. package/src/tools/create.ts +206 -0
  441. package/src/tools/describe.ts +280 -0
  442. package/src/tools/export-code.ts +41 -0
  443. package/src/tools/export-tailwind-config.ts +266 -0
  444. package/src/tools/icons.ts +213 -0
  445. package/src/tools/index.ts +6 -0
  446. package/src/tools/modify.ts +651 -0
  447. package/src/tools/patterns.ts +189 -0
  448. package/src/tools/read.ts +401 -0
  449. package/src/tools/registry.ts +155 -0
  450. package/src/tools/schema.ts +65 -0
  451. package/src/tools/structure.ts +348 -0
  452. package/src/tools/variables.ts +193 -0
  453. package/src/tools/vector.ts +311 -0
  454. package/src/types.ts +32 -0
  455. package/src/undo.ts +126 -0
  456. package/src/vector.ts +413 -0
  457. package/src/xpath.ts +259 -0
@@ -0,0 +1,139 @@
1
+ const hasPerformance = typeof performance !== "undefined"
2
+
3
+ export interface NodeProfile {
4
+ nodeId: string
5
+ name: string
6
+ type: string
7
+ depth: number
8
+ startTime: number
9
+ endTime: number
10
+ selfTime: number
11
+ drawCalls: number
12
+ culled: boolean
13
+ children: NodeProfile[]
14
+ }
15
+
16
+ export interface FrameCapture {
17
+ timestamp: number
18
+ totalTimeMs: number
19
+ cpuTimeMs: number
20
+ gpuTimeMs: number
21
+ totalNodes: number
22
+ culledNodes: number
23
+ drawCalls: number
24
+ scenePictureCacheHit: boolean
25
+ rootProfiles: NodeProfile[]
26
+ }
27
+
28
+ export class CaptureStack {
29
+ private stack: NodeProfile[] = []
30
+ private roots: NodeProfile[] = []
31
+ private frameStart = 0
32
+
33
+ begin(nodeId: string, name: string, type: string, culled: boolean): void {
34
+ const profile: NodeProfile = {
35
+ nodeId,
36
+ name,
37
+ type,
38
+ depth: this.stack.length,
39
+ startTime: hasPerformance ? performance.now() - this.frameStart : 0,
40
+ endTime: 0,
41
+ selfTime: 0,
42
+ drawCalls: 0,
43
+ culled,
44
+ children: [],
45
+ }
46
+ this.stack.push(profile)
47
+ }
48
+
49
+ end(drawCallsDelta: number): void {
50
+ const profile = this.stack.pop()
51
+ if (!profile) return
52
+
53
+ profile.endTime = hasPerformance ? performance.now() - this.frameStart : 0
54
+ profile.drawCalls = drawCallsDelta
55
+
56
+ let childrenTime = 0
57
+ for (const child of profile.children) {
58
+ childrenTime += child.endTime - child.startTime
59
+ }
60
+ profile.selfTime = profile.endTime - profile.startTime - childrenTime
61
+
62
+ const parent = this.stack[this.stack.length - 1]
63
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
64
+ if (parent) {
65
+ parent.children.push(profile)
66
+ } else {
67
+ this.roots.push(profile)
68
+ }
69
+ }
70
+
71
+ reset(frameStart: number): void {
72
+ this.stack.length = 0
73
+ this.roots.length = 0
74
+ this.frameStart = frameStart
75
+ }
76
+
77
+ getRootProfiles(): NodeProfile[] {
78
+ return this.roots
79
+ }
80
+ }
81
+
82
+ interface SpeedscopeFrame {
83
+ name: string
84
+ }
85
+
86
+ interface SpeedscopeEvent {
87
+ type: "O" | "C"
88
+ at: number
89
+ frame: number
90
+ }
91
+
92
+ export function toSpeedscopeJSON(capture: FrameCapture): string {
93
+ const frames: SpeedscopeFrame[] = []
94
+ const frameIndex = new Map<string, number>()
95
+ const events: SpeedscopeEvent[] = []
96
+
97
+ function getFrameIdx(nodeId: string, name: string): number {
98
+ const key = `${nodeId}\0${name}`
99
+ let idx = frameIndex.get(key)
100
+ if (idx === undefined) {
101
+ idx = frames.length
102
+ frames.push({ name: `${name} (${nodeId})` })
103
+ frameIndex.set(key, idx)
104
+ }
105
+ return idx
106
+ }
107
+
108
+ function walk(profile: NodeProfile): void {
109
+ const idx = getFrameIdx(profile.nodeId, profile.name)
110
+ events.push({ type: "O", at: profile.startTime, frame: idx })
111
+ for (const child of profile.children) {
112
+ walk(child)
113
+ }
114
+ events.push({ type: "C", at: profile.endTime, frame: idx })
115
+ }
116
+
117
+ for (const root of capture.rootProfiles) {
118
+ walk(root)
119
+ }
120
+
121
+ return JSON.stringify(
122
+ {
123
+ $schema: "https://www.speedscope.app/file-format-schema.json",
124
+ shared: { frames },
125
+ profiles: [
126
+ {
127
+ type: "evented",
128
+ name: "Frame Render",
129
+ unit: "milliseconds",
130
+ startValue: 0,
131
+ endValue: capture.totalTimeMs,
132
+ events,
133
+ },
134
+ ],
135
+ },
136
+ null,
137
+ 2,
138
+ )
139
+ }
@@ -0,0 +1,122 @@
1
+ const BUFFER_SIZE = 120
2
+
3
+ const hasPerformance = typeof performance !== 'undefined'
4
+
5
+ export class FrameStats {
6
+ frameTime = 0
7
+ cpuTime = 0
8
+ gpuTime = 0
9
+
10
+ minFrameTime = Infinity
11
+ maxFrameTime = 0
12
+ avgFrameTime = 0
13
+
14
+ minCpuTime = Infinity
15
+ maxCpuTime = 0
16
+ avgCpuTime = 0
17
+
18
+ minGpuTime = Infinity
19
+ maxGpuTime = 0
20
+ avgGpuTime = 0
21
+
22
+ smoothedFps = 0
23
+
24
+ totalNodes = 0
25
+ culledNodes = 0
26
+ drawCalls = 0
27
+ scenePictureCacheHit = false
28
+
29
+ private frameTimeBuffer = new Float64Array(BUFFER_SIZE)
30
+ private cpuTimeBuffer = new Float64Array(BUFFER_SIZE)
31
+ private gpuTimeBuffer = new Float64Array(BUFFER_SIZE)
32
+ private bufferIndex = 0
33
+ private bufferCount = 0
34
+ private lastTimestamp = 0
35
+
36
+ recordFrame(cpuTimeMs: number): void {
37
+ const now = hasPerformance ? performance.now() : 0
38
+
39
+ if (this.lastTimestamp > 0) {
40
+ this.frameTime = now - this.lastTimestamp
41
+ }
42
+ this.lastTimestamp = now
43
+
44
+ this.cpuTime = cpuTimeMs
45
+
46
+ const i = this.bufferIndex
47
+ this.frameTimeBuffer[i] = this.frameTime
48
+ this.cpuTimeBuffer[i] = this.cpuTime
49
+ this.gpuTimeBuffer[i] = this.gpuTime
50
+
51
+ this.bufferIndex = (i + 1) % BUFFER_SIZE
52
+ if (this.bufferCount < BUFFER_SIZE) this.bufferCount++
53
+
54
+ this.computeStats()
55
+ }
56
+
57
+ getFrameTimeHistory(): Float64Array {
58
+ return this.frameTimeBuffer
59
+ }
60
+
61
+ getCpuTimeHistory(): Float64Array {
62
+ return this.cpuTimeBuffer
63
+ }
64
+
65
+ getGpuTimeHistory(): Float64Array {
66
+ return this.gpuTimeBuffer
67
+ }
68
+
69
+ getBufferIndex(): number {
70
+ return this.bufferIndex
71
+ }
72
+
73
+ getBufferCount(): number {
74
+ return this.bufferCount
75
+ }
76
+
77
+ private computeStats(): void {
78
+ const n = this.bufferCount
79
+ if (n === 0) return
80
+
81
+ let ftSum = 0
82
+ let ftMin = Infinity
83
+ let ftMax = 0
84
+ let cpuSum = 0
85
+ let cpuMin = Infinity
86
+ let cpuMax = 0
87
+ let gpuSum = 0
88
+ let gpuMin = Infinity
89
+ let gpuMax = 0
90
+
91
+ for (let j = 0; j < n; j++) {
92
+ const ft = this.frameTimeBuffer[j]
93
+ ftSum += ft
94
+ if (ft < ftMin) ftMin = ft
95
+ if (ft > ftMax) ftMax = ft
96
+
97
+ const cpu = this.cpuTimeBuffer[j]
98
+ cpuSum += cpu
99
+ if (cpu < cpuMin) cpuMin = cpu
100
+ if (cpu > cpuMax) cpuMax = cpu
101
+
102
+ const gpu = this.gpuTimeBuffer[j]
103
+ gpuSum += gpu
104
+ if (gpu < gpuMin) gpuMin = gpu
105
+ if (gpu > gpuMax) gpuMax = gpu
106
+ }
107
+
108
+ this.minFrameTime = ftMin
109
+ this.maxFrameTime = ftMax
110
+ this.avgFrameTime = ftSum / n
111
+
112
+ this.minCpuTime = cpuMin
113
+ this.maxCpuTime = cpuMax
114
+ this.avgCpuTime = cpuSum / n
115
+
116
+ this.minGpuTime = gpuMin
117
+ this.maxGpuTime = gpuMax
118
+ this.avgGpuTime = gpuSum / n
119
+
120
+ this.smoothedFps = this.avgFrameTime > 0 ? 1000 / this.avgFrameTime : 0
121
+ }
122
+ }
@@ -0,0 +1,93 @@
1
+ interface EXTDisjointTimerQuery {
2
+ TIME_ELAPSED_EXT: 0x88bf
3
+ GPU_DISJOINT_EXT: 0x8fbb
4
+ }
5
+
6
+ const MAX_PENDING_QUERIES = 4
7
+
8
+ export class GPUTimer {
9
+ private gl: WebGL2RenderingContext | null
10
+ private ext: EXTDisjointTimerQuery | null = null
11
+ private pending: WebGLQuery[] = []
12
+ private activeQuery: WebGLQuery | null = null
13
+ private _lastGpuTimeMs = NaN
14
+
15
+ get available(): boolean {
16
+ return this.ext !== null
17
+ }
18
+
19
+ get lastGpuTimeMs(): number {
20
+ return this._lastGpuTimeMs
21
+ }
22
+
23
+ constructor(gl: WebGL2RenderingContext | null) {
24
+ this.gl = gl
25
+ if (gl) {
26
+ this.ext =
27
+ (gl.getExtension('EXT_disjoint_timer_query_webgl2') as EXTDisjointTimerQuery | null) ??
28
+ null
29
+ }
30
+ }
31
+
32
+ beginFrame(): void {
33
+ if (!this.gl || !this.ext) return
34
+ if (this.pending.length >= MAX_PENDING_QUERIES) return
35
+
36
+ const query = this.gl.createQuery()
37
+
38
+ this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT, query)
39
+ this.activeQuery = query
40
+ }
41
+
42
+ endFrame(): void {
43
+ if (!this.gl || !this.ext || !this.activeQuery) return
44
+
45
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT)
46
+ this.pending.push(this.activeQuery)
47
+ this.activeQuery = null
48
+ }
49
+
50
+ pollResults(): number | null {
51
+ if (!this.gl || !this.ext) return null
52
+
53
+ const disjoint = this.gl.getParameter(this.ext.GPU_DISJOINT_EXT) as boolean
54
+
55
+ let result: number | null = null
56
+ const remaining: WebGLQuery[] = []
57
+
58
+ for (const query of this.pending) {
59
+ const ready = this.gl.getQueryParameter(query, this.gl.QUERY_RESULT_AVAILABLE) as boolean
60
+
61
+ if (ready) {
62
+ if (!disjoint) {
63
+ const ns = this.gl.getQueryParameter(query, this.gl.QUERY_RESULT) as number
64
+ this._lastGpuTimeMs = ns / 1_000_000
65
+ result = this._lastGpuTimeMs
66
+ }
67
+ this.gl.deleteQuery(query)
68
+ } else {
69
+ remaining.push(query)
70
+ }
71
+ }
72
+
73
+ this.pending = remaining
74
+ return result
75
+ }
76
+
77
+ destroy(): void {
78
+ if (!this.gl) return
79
+
80
+ if (this.activeQuery) {
81
+ if (this.ext) {
82
+ this.gl.endQuery(this.ext.TIME_ELAPSED_EXT)
83
+ }
84
+ this.gl.deleteQuery(this.activeQuery)
85
+ this.activeQuery = null
86
+ }
87
+
88
+ for (const query of this.pending) {
89
+ this.gl.deleteQuery(query)
90
+ }
91
+ this.pending = []
92
+ }
93
+ }
@@ -0,0 +1,242 @@
1
+ import type { FrameStats } from './frame-stats'
2
+ import type { CanvasKit, Canvas, Paint, Font, Typeface } from 'canvaskit-wasm'
3
+
4
+ const BUFFER_SIZE = 120
5
+ const LINE_HEIGHT = 13
6
+ const PADDING = 6
7
+ const BAR_WIDTH = 2
8
+ const BAR_GAP = 0.5
9
+ const GRAPH_HEIGHT = 40
10
+ const MAX_SCALE_MS = 50
11
+ const BUDGET_MS = 16.67
12
+ const FAST_MS = 16.7
13
+ const SLOW_MS = 33.3
14
+ const CORNER_RADIUS = 4
15
+ const RULER_SIZE = 20
16
+ const SWATCH_SIZE = 6
17
+ const SWATCH_GAP = 3
18
+ const LEGEND_ITEM_GAP = 10
19
+ const GRAPH_WIDTH = BUFFER_SIZE * (BAR_WIDTH + BAR_GAP)
20
+ const COL_WIDTH = 130
21
+ const PANEL_WIDTH = Math.max(COL_WIDTH * 2, GRAPH_WIDTH) + PADDING * 2
22
+
23
+ export class HudRenderer {
24
+ private bgPaint: Paint
25
+ private textPaint: Paint
26
+ private dimTextPaint: Paint
27
+ private greenPaint: Paint
28
+ private yellowPaint: Paint
29
+ private redPaint: Paint
30
+ private gpuPaint: Paint
31
+ private budgetLinePaint: Paint
32
+ private graphBgPaint: Paint
33
+ private hudFont: Font
34
+
35
+ constructor(private ck: CanvasKit) {
36
+ this.bgPaint = new ck.Paint()
37
+ this.bgPaint.setStyle(ck.PaintStyle.Fill)
38
+ this.bgPaint.setColor(ck.Color4f(0.1, 0.1, 0.1, 0.85))
39
+ this.bgPaint.setAntiAlias(true)
40
+
41
+ this.textPaint = new ck.Paint()
42
+ this.textPaint.setStyle(ck.PaintStyle.Fill)
43
+ this.textPaint.setColor(ck.Color4f(0.9, 0.9, 0.9, 1))
44
+ this.textPaint.setAntiAlias(true)
45
+
46
+ this.dimTextPaint = new ck.Paint()
47
+ this.dimTextPaint.setStyle(ck.PaintStyle.Fill)
48
+ this.dimTextPaint.setColor(ck.Color4f(0.55, 0.55, 0.55, 1))
49
+ this.dimTextPaint.setAntiAlias(true)
50
+
51
+ this.greenPaint = new ck.Paint()
52
+ this.greenPaint.setStyle(ck.PaintStyle.Fill)
53
+ this.greenPaint.setColor(ck.Color4f(0.3, 0.85, 0.4, 1))
54
+ this.greenPaint.setAntiAlias(true)
55
+
56
+ this.yellowPaint = new ck.Paint()
57
+ this.yellowPaint.setStyle(ck.PaintStyle.Fill)
58
+ this.yellowPaint.setColor(ck.Color4f(1.0, 0.85, 0.2, 1))
59
+ this.yellowPaint.setAntiAlias(true)
60
+
61
+ this.redPaint = new ck.Paint()
62
+ this.redPaint.setStyle(ck.PaintStyle.Fill)
63
+ this.redPaint.setColor(ck.Color4f(1.0, 0.3, 0.3, 1))
64
+ this.redPaint.setAntiAlias(true)
65
+
66
+ this.gpuPaint = new ck.Paint()
67
+ this.gpuPaint.setStyle(ck.PaintStyle.Fill)
68
+ this.gpuPaint.setColor(ck.Color4f(0.4, 0.6, 1.0, 1))
69
+ this.gpuPaint.setAntiAlias(true)
70
+
71
+ this.budgetLinePaint = new ck.Paint()
72
+ this.budgetLinePaint.setStyle(ck.PaintStyle.Stroke)
73
+ this.budgetLinePaint.setStrokeWidth(1)
74
+ this.budgetLinePaint.setColor(ck.Color4f(1, 1, 1, 0.3))
75
+ this.budgetLinePaint.setAntiAlias(true)
76
+ this.budgetLinePaint.setPathEffect(ck.PathEffect.MakeDash([3, 3], 0))
77
+
78
+ this.graphBgPaint = new ck.Paint()
79
+ this.graphBgPaint.setStyle(ck.PaintStyle.Fill)
80
+ this.graphBgPaint.setColor(ck.Color4f(0.05, 0.05, 0.05, 0.5))
81
+ this.graphBgPaint.setAntiAlias(true)
82
+
83
+ this.hudFont = new ck.Font(null, 10)
84
+ }
85
+
86
+ setTypeface(typeface: Typeface): void {
87
+ this.hudFont.delete()
88
+ this.hudFont = new this.ck.Font(typeface, 10)
89
+ }
90
+
91
+ draw(canvas: Canvas, stats: FrameStats, phases: Map<string, number>, showRulers: boolean): void {
92
+ const rulerOffset = showRulers ? RULER_SIZE : 0
93
+ const hasGraph = stats.getBufferCount() > 0
94
+
95
+ const phaseNames = [
96
+ 'render:scene',
97
+ 'render:drawPicture',
98
+ 'render:recordPicture',
99
+ 'render:volatile',
100
+ 'render:sectionTitles',
101
+ 'render:componentLabels',
102
+ 'render:selection',
103
+ 'render:rulers',
104
+ 'render:flush'
105
+ ]
106
+ const visiblePhases = phaseNames.filter((n) => (phases.get(n) ?? 0) > 0.01)
107
+
108
+ const statsRows = 3
109
+ const phaseRows = visiblePhases.length > 0 ? 1 + visiblePhases.length : 0
110
+ const statsHeight = (statsRows + phaseRows) * LINE_HEIGHT
111
+ const graphSection = hasGraph ? GRAPH_HEIGHT + PADDING + LINE_HEIGHT : 0
112
+ const contentHeight = statsHeight + PADDING * 2 + graphSection
113
+
114
+ const bgX = rulerOffset + PADDING
115
+ const bgY = rulerOffset + PADDING
116
+
117
+ const bgRect = this.ck.LTRBRect(bgX, bgY, bgX + PANEL_WIDTH, bgY + contentHeight)
118
+ canvas.drawRRect(this.ck.RRectXY(bgRect, CORNER_RADIUS, CORNER_RADIUS), this.bgPaint)
119
+
120
+ const col1 = bgX + PADDING
121
+ const col2 = col1 + COL_WIDTH
122
+ let y = bgY + PADDING + LINE_HEIGHT
123
+
124
+ const fps = Math.round(stats.smoothedFps)
125
+ const avgFrame = stats.avgFrameTime.toFixed(1)
126
+ const avgCpu = stats.avgCpuTime.toFixed(1)
127
+ const gpuAvailable = !Number.isNaN(stats.avgGpuTime) && stats.avgGpuTime > 0
128
+ const avgGpu = gpuAvailable ? stats.avgGpuTime.toFixed(1) : 'n/a'
129
+ const cacheStatus = stats.scenePictureCacheHit ? 'HIT' : 'MISS'
130
+
131
+ canvas.drawText(`FPS: ${fps} (${avgFrame}ms)`, col1, y, this.textPaint, this.hudFont)
132
+ canvas.drawText(`Nodes: ${stats.totalNodes} (${stats.culledNodes} culled)`, col2, y, this.textPaint, this.hudFont)
133
+ y += LINE_HEIGHT
134
+
135
+ canvas.drawText(`CPU: ${avgCpu}ms`, col1, y, this.textPaint, this.hudFont)
136
+ canvas.drawText(`Draws: ${stats.drawCalls}`, col2, y, this.textPaint, this.hudFont)
137
+ y += LINE_HEIGHT
138
+
139
+ canvas.drawText(`GPU: ${avgGpu}${gpuAvailable ? 'ms' : ''}`, col1, y, this.textPaint, this.hudFont)
140
+ canvas.drawText(`Cache: ${cacheStatus}`, col2, y, this.textPaint, this.hudFont)
141
+
142
+ if (visiblePhases.length > 0) {
143
+ y += LINE_HEIGHT
144
+ canvas.drawText('Phases:', col1, y, this.dimTextPaint, this.hudFont)
145
+ for (const name of visiblePhases) {
146
+ y += LINE_HEIGHT
147
+ const ms = (phases.get(name) ?? 0).toFixed(2)
148
+ const label = name.replace('render:', '')
149
+ canvas.drawText(` ${label}: ${ms}ms`, col1, y, this.dimTextPaint, this.hudFont)
150
+ }
151
+ }
152
+
153
+ if (hasGraph) {
154
+ const graphX = bgX + PADDING
155
+ const graphY = y + PADDING
156
+ this.drawBarGraph(canvas, stats, graphX, graphY)
157
+ this.drawLegendRow(canvas, graphX, graphY + GRAPH_HEIGHT + LINE_HEIGHT - 2)
158
+ }
159
+ }
160
+
161
+ private drawLegendRow(canvas: Canvas, x: number, y: number): void {
162
+ const items: [Paint, string][] = [
163
+ [this.greenPaint, '60fps'],
164
+ [this.yellowPaint, '30fps'],
165
+ [this.redPaint, 'slow'],
166
+ [this.gpuPaint, 'GPU']
167
+ ]
168
+ let cx = x
169
+ for (const [paint, label] of items) {
170
+ const swatchY = y - SWATCH_SIZE + 1
171
+ canvas.drawRect(
172
+ this.ck.LTRBRect(cx, swatchY, cx + SWATCH_SIZE, swatchY + SWATCH_SIZE),
173
+ paint
174
+ )
175
+ cx += SWATCH_SIZE + SWATCH_GAP
176
+ canvas.drawText(label, cx, y, this.dimTextPaint, this.hudFont)
177
+ cx += label.length * 5.5 + LEGEND_ITEM_GAP
178
+ }
179
+ }
180
+
181
+ private drawBarGraph(canvas: Canvas, stats: FrameStats, graphX: number, graphY: number): void {
182
+ const graphRect = this.ck.LTRBRect(graphX, graphY, graphX + GRAPH_WIDTH, graphY + GRAPH_HEIGHT)
183
+ canvas.drawRRect(this.ck.RRectXY(graphRect, 2, 2), this.graphBgPaint)
184
+
185
+ const cpuHistory = stats.getCpuTimeHistory()
186
+ const gpuHistory = stats.getGpuTimeHistory()
187
+ const bufferCount = stats.getBufferCount()
188
+ const bufferIndex = stats.getBufferIndex()
189
+
190
+ const barOffset = BUFFER_SIZE - bufferCount
191
+
192
+ for (let i = 0; i < bufferCount; i++) {
193
+ const histIndex = (bufferIndex + i) % BUFFER_SIZE
194
+
195
+ const cpuTime = cpuHistory[histIndex]
196
+ if (cpuTime <= 0) continue
197
+
198
+ const barHeight = Math.min((cpuTime / MAX_SCALE_MS) * GRAPH_HEIGHT, GRAPH_HEIGHT)
199
+ const barX = graphX + (i + barOffset) * (BAR_WIDTH + BAR_GAP)
200
+ const barY = graphY + GRAPH_HEIGHT - barHeight
201
+
202
+ let paint: Paint
203
+ if (cpuTime < FAST_MS) {
204
+ paint = this.greenPaint
205
+ } else if (cpuTime < SLOW_MS) {
206
+ paint = this.yellowPaint
207
+ } else {
208
+ paint = this.redPaint
209
+ }
210
+
211
+ canvas.drawRect(
212
+ this.ck.LTRBRect(barX, barY, barX + BAR_WIDTH, graphY + GRAPH_HEIGHT),
213
+ paint
214
+ )
215
+
216
+ const gpuTime = gpuHistory[histIndex]
217
+ if (!Number.isNaN(gpuTime) && gpuTime > 0) {
218
+ const gpuBarHeight = Math.min((gpuTime / MAX_SCALE_MS) * GRAPH_HEIGHT, GRAPH_HEIGHT)
219
+ canvas.drawRect(
220
+ this.ck.LTRBRect(barX, graphY + GRAPH_HEIGHT - gpuBarHeight, barX + BAR_WIDTH, graphY + GRAPH_HEIGHT),
221
+ this.gpuPaint
222
+ )
223
+ }
224
+ }
225
+
226
+ const budgetY = graphY + GRAPH_HEIGHT - (BUDGET_MS / MAX_SCALE_MS) * GRAPH_HEIGHT
227
+ canvas.drawLine(graphX, budgetY, graphX + GRAPH_WIDTH, budgetY, this.budgetLinePaint)
228
+ }
229
+
230
+ destroy(): void {
231
+ this.bgPaint.delete()
232
+ this.textPaint.delete()
233
+ this.dimTextPaint.delete()
234
+ this.greenPaint.delete()
235
+ this.yellowPaint.delete()
236
+ this.redPaint.delete()
237
+ this.gpuPaint.delete()
238
+ this.budgetLinePaint.delete()
239
+ this.graphBgPaint.delete()
240
+ this.hudFont.delete()
241
+ }
242
+ }
@@ -0,0 +1,8 @@
1
+ export { RenderProfiler } from './render-profiler'
2
+ export { FrameStats } from './frame-stats'
3
+ export { GPUTimer } from './gpu-timer'
4
+ export { DrawCallCounter } from './draw-call-counter'
5
+ export { PhaseTimer } from './phase-timer'
6
+ export { HudRenderer } from './hud-renderer'
7
+ export { CaptureStack, toSpeedscopeJSON } from './frame-capture'
8
+ export type { NodeProfile, FrameCapture } from './frame-capture'
@@ -0,0 +1,62 @@
1
+ type DevToolsColor =
2
+ | 'primary'
3
+ | 'secondary'
4
+ | 'tertiary'
5
+ | 'tertiary-dark'
6
+ | 'secondary-dark'
7
+ | 'secondary-light'
8
+
9
+ function colorForPhase(name: string): DevToolsColor {
10
+ if (name === 'frame') return 'primary'
11
+ if (name === 'render:flush') return 'tertiary-dark'
12
+ if (name === 'render:recordPicture') return 'tertiary'
13
+ if (name.startsWith('render:')) return 'secondary'
14
+ if (name.startsWith('layout:')) return 'secondary-dark'
15
+ return 'secondary-light'
16
+ }
17
+
18
+ const SMOOTH = 0.05
19
+
20
+ export class PhaseTimer {
21
+ enabled = false
22
+ readonly averages = new Map<string, number>()
23
+
24
+ private starts = new Map<string, number>()
25
+
26
+ beginPhase(name: string): void {
27
+ if (!this.enabled || typeof performance === 'undefined') return
28
+ this.starts.set(name, performance.now())
29
+ }
30
+
31
+ endPhase(name: string): void {
32
+ if (!this.enabled || typeof performance === 'undefined') return
33
+
34
+ const startTime = this.starts.get(name)
35
+ if (startTime === undefined) return
36
+ this.starts.delete(name)
37
+
38
+ const duration = performance.now() - startTime
39
+ const prev = this.averages.get(name)
40
+ this.averages.set(
41
+ name,
42
+ prev === undefined ? duration : prev + (duration - prev) * SMOOTH
43
+ )
44
+
45
+ performance.measure(name, {
46
+ start: startTime,
47
+ detail: {
48
+ devtools: {
49
+ dataType: 'track-entry',
50
+ track: 'Renderer',
51
+ trackGroup: 'Lutris',
52
+ color: colorForPhase(name)
53
+ }
54
+ }
55
+ })
56
+ }
57
+
58
+ clearPhases(): void {
59
+ this.starts.clear()
60
+ this.averages.clear()
61
+ }
62
+ }