@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,783 @@
1
+ import { ROTATION_HANDLE_OFFSET, ROTATION_HANDLE_RADIUS, HANDLE_HALF_SIZE, LABEL_OFFSET_Y, MEASUREMENT_COLOR, MEASUREMENT_LINE_WIDTH, MEASUREMENT_PILL_HEIGHT, MEASUREMENT_PILL_PADDING_X, MEASUREMENT_PILL_RADIUS, MEASUREMENT_FONT_SIZE, MEASUREMENT_DASH, MEASUREMENT_ARROW_SIZE, SIZE_PILL_PADDING_X, SIZE_PILL_PADDING_Y, SIZE_PILL_HEIGHT, SIZE_PILL_RADIUS, SIZE_PILL_TEXT_OFFSET_Y, MARQUEE_FILL_ALPHA, SELECTION_DASH_ALPHA, LAYOUT_INDICATOR_STROKE, PEN_HANDLE_RADIUS, PEN_VERTEX_RADIUS, PEN_CLOSE_RADIUS_BOOST, TEXT_SELECTION_COLOR, TEXT_CARET_COLOR, TEXT_CARET_WIDTH, FLASH_COLOR, FLASH_ATTACK_MS, FLASH_HOLD_MS, FLASH_RELEASE_MS, FLASH_STROKE_WIDTH, FLASH_PADDING, FLASH_OVERSHOOT, FLASH_RADIUS } from '../constants.js';
2
+ export function drawHoverHighlight(r, canvas, graph, hoveredNodeId) {
3
+ if (!hoveredNodeId)
4
+ return;
5
+ const node = graph.getNode(hoveredNodeId);
6
+ if (!node)
7
+ return;
8
+ const abs = graph.getAbsolutePosition(node.id);
9
+ const sx = abs.x * r.zoom + r.panX;
10
+ const sy = abs.y * r.zoom + r.panY;
11
+ r.auxStroke.setStrokeWidth(1 / r.zoom);
12
+ r.auxStroke.setColor(r.isComponentType(node.type) ? r.compColor() : r.selColor());
13
+ r.auxStroke.setPathEffect(null);
14
+ canvas.save();
15
+ canvas.translate(sx, sy);
16
+ if (node.rotation !== 0) {
17
+ const cx = (node.width / 2) * r.zoom;
18
+ const cy = (node.height / 2) * r.zoom;
19
+ canvas.rotate(node.rotation, cx, cy);
20
+ }
21
+ canvas.scale(r.zoom, r.zoom);
22
+ r.strokeNodeShape(canvas, node, r.auxStroke);
23
+ canvas.restore();
24
+ }
25
+ export function drawSelection(r, canvas, graph, selectedIds, overlays) {
26
+ if (selectedIds.size === 0)
27
+ return;
28
+ r.drawParentFrameOutlines(canvas, graph, selectedIds);
29
+ if (selectedIds.size === 1) {
30
+ const id = [...selectedIds][0];
31
+ if (overlays.editingTextId === id)
32
+ return;
33
+ const node = graph.getNode(id);
34
+ if (!node)
35
+ return;
36
+ const useComponentColor = r.isComponentType(node.type);
37
+ r.selectionPaint.setColor(useComponentColor ? r.compColor() : r.selColor());
38
+ r.selectionPaint.setStrokeWidth(1);
39
+ const rotation = overlays.rotationPreview?.nodeId === id ? overlays.rotationPreview.angle : node.rotation;
40
+ r.drawNodeSelection(canvas, node, rotation, graph);
41
+ r.drawSelectionLabels(canvas, graph, selectedIds);
42
+ r.selectionPaint.setColor(r.selColor());
43
+ return;
44
+ }
45
+ for (const id of selectedIds) {
46
+ const node = graph.getNode(id);
47
+ if (!node)
48
+ continue;
49
+ const useComponentColor = r.isComponentType(node.type);
50
+ r.selectionPaint.setColor(useComponentColor ? r.compColor() : r.selColor());
51
+ r.selectionPaint.setStrokeWidth(1);
52
+ const rotation = overlays.rotationPreview?.nodeId === id ? overlays.rotationPreview.angle : node.rotation;
53
+ r.drawNodeOutline(canvas, node, rotation, graph);
54
+ }
55
+ r.selectionPaint.setColor(r.selColor());
56
+ const nodes = [...selectedIds]
57
+ .map((id) => graph.getNode(id))
58
+ .filter((n) => n !== undefined);
59
+ r.drawGroupBounds(canvas, nodes, graph);
60
+ r.drawSelectionLabels(canvas, graph, selectedIds);
61
+ }
62
+ export function drawNodeSelection(r, canvas, node, rotation, graph) {
63
+ const abs = graph.getAbsolutePosition(node.id);
64
+ const cx = (abs.x + node.width / 2) * r.zoom + r.panX;
65
+ const cy = (abs.y + node.height / 2) * r.zoom + r.panY;
66
+ const hw = (node.width / 2) * r.zoom;
67
+ const hh = (node.height / 2) * r.zoom;
68
+ canvas.save();
69
+ if (rotation !== 0) {
70
+ canvas.rotate(rotation, cx, cy);
71
+ }
72
+ const x1 = cx - hw;
73
+ const y1 = cy - hh;
74
+ const x2 = cx + hw;
75
+ const y2 = cy + hh;
76
+ canvas.drawRect(r.ck.LTRBRect(x1, y1, x2, y2), r.selectionPaint);
77
+ r.drawHandle(canvas, x1, y1);
78
+ r.drawHandle(canvas, x2, y1);
79
+ r.drawHandle(canvas, x1, y2);
80
+ r.drawHandle(canvas, x2, y2);
81
+ const mx = (x1 + x2) / 2;
82
+ const my = (y1 + y2) / 2;
83
+ r.drawHandle(canvas, mx, y1);
84
+ r.drawHandle(canvas, mx, y2);
85
+ r.drawHandle(canvas, x1, my);
86
+ r.drawHandle(canvas, x2, my);
87
+ const rotHandleY = y1 - ROTATION_HANDLE_OFFSET - ROTATION_HANDLE_RADIUS;
88
+ r.auxStroke.setStrokeWidth(1);
89
+ r.auxStroke.setColor(r.selColor());
90
+ r.auxStroke.setPathEffect(null);
91
+ canvas.drawLine(mx, y1, mx, rotHandleY, r.auxStroke);
92
+ r.auxFill.setColor(r.ck.WHITE);
93
+ canvas.drawCircle(mx, rotHandleY, ROTATION_HANDLE_RADIUS, r.auxFill);
94
+ canvas.drawCircle(mx, rotHandleY, ROTATION_HANDLE_RADIUS, r.auxStroke);
95
+ canvas.restore();
96
+ }
97
+ export function drawSelectionLabels(r, canvas, graph, selectedIds) {
98
+ if (!r.labelFont || !r.sizeFont)
99
+ return;
100
+ let minX = Infinity;
101
+ let minY = Infinity;
102
+ let maxX = -Infinity;
103
+ let maxY = -Infinity;
104
+ const nodes = [];
105
+ for (const id of selectedIds) {
106
+ const node = graph.getNode(id);
107
+ if (!node)
108
+ continue;
109
+ nodes.push(node);
110
+ const abs = graph.getAbsolutePosition(id);
111
+ minX = Math.min(minX, abs.x);
112
+ minY = Math.min(minY, abs.y);
113
+ maxX = Math.max(maxX, abs.x + node.width);
114
+ maxY = Math.max(maxY, abs.y + node.height);
115
+ }
116
+ if (nodes.length === 0)
117
+ return;
118
+ const sx1 = minX * r.zoom + r.panX;
119
+ const sy1 = minY * r.zoom + r.panY;
120
+ const sx2 = maxX * r.zoom + r.panX;
121
+ const sy2 = maxY * r.zoom + r.panY;
122
+ const smx = (sx1 + sx2) / 2;
123
+ if (nodes.length === 1) {
124
+ const node = nodes[0];
125
+ const parentNode = node.parentId ? graph.getNode(node.parentId) : null;
126
+ const isTopLevel = !parentNode || parentNode.type === 'CANVAS' || parentNode.type === 'SECTION';
127
+ if (node.type === 'FRAME' && isTopLevel) {
128
+ r.auxFill.setColor(r.selColor());
129
+ canvas.drawText(node.name, sx1, sy1 - LABEL_OFFSET_Y, r.auxFill, r.labelFont);
130
+ }
131
+ }
132
+ const w = Math.round(maxX - minX);
133
+ const h = Math.round(maxY - minY);
134
+ const sizeText = `${w} × ${h}`;
135
+ const glyphIds = r.sizeFont.getGlyphIDs(sizeText);
136
+ const widths = r.sizeFont.getGlyphWidths(glyphIds);
137
+ let textWidth = 0;
138
+ for (const w of widths)
139
+ textWidth += w;
140
+ const pillW = textWidth + SIZE_PILL_PADDING_X * 2;
141
+ const pillH = SIZE_PILL_HEIGHT;
142
+ const pillX = smx - pillW / 2;
143
+ const pillY = sy2 + SIZE_PILL_PADDING_Y;
144
+ const allComponents = nodes.length > 0 && nodes.every((n) => r.isComponentType(n.type));
145
+ const pillColor = allComponents ? r.compColor() : r.selColor();
146
+ r.auxFill.setColor(pillColor);
147
+ const rrect = r.ck.RRectXY(r.ck.LTRBRect(pillX, pillY, pillX + pillW, pillY + pillH), SIZE_PILL_RADIUS, SIZE_PILL_RADIUS);
148
+ canvas.drawRRect(rrect, r.auxFill);
149
+ r.auxFill.setColor(r.ck.WHITE);
150
+ canvas.drawText(sizeText, pillX + SIZE_PILL_PADDING_X, pillY + SIZE_PILL_TEXT_OFFSET_Y, r.auxFill, r.sizeFont);
151
+ }
152
+ export function drawParentFrameOutlines(r, canvas, graph, selectedIds) {
153
+ const drawn = new Set();
154
+ for (const id of selectedIds) {
155
+ const node = graph.getNode(id);
156
+ if (!node?.parentId)
157
+ continue;
158
+ const nodeParent = graph.getNode(node.parentId);
159
+ if (!nodeParent || nodeParent.type === 'CANVAS')
160
+ continue;
161
+ if (drawn.has(node.parentId) || selectedIds.has(node.parentId))
162
+ continue;
163
+ const parent = nodeParent;
164
+ const grandparent = parent.parentId ? graph.getNode(parent.parentId) : null;
165
+ if (!grandparent || grandparent.type === 'CANVAS')
166
+ continue;
167
+ drawn.add(node.parentId);
168
+ const abs = graph.getAbsolutePosition(parent.id);
169
+ const x = abs.x * r.zoom + r.panX;
170
+ const y = abs.y * r.zoom + r.panY;
171
+ const w = parent.width * r.zoom;
172
+ const h = parent.height * r.zoom;
173
+ canvas.save();
174
+ if (parent.rotation !== 0) {
175
+ canvas.rotate(parent.rotation, x + w / 2, y + h / 2);
176
+ }
177
+ canvas.drawRect(r.ck.LTRBRect(x, y, x + w, y + h), r.parentOutlinePaint);
178
+ canvas.restore();
179
+ }
180
+ }
181
+ export function drawNodeOutline(r, canvas, node, rotation, graph) {
182
+ const abs = graph.getAbsolutePosition(node.id);
183
+ const cx = (abs.x + node.width / 2) * r.zoom + r.panX;
184
+ const cy = (abs.y + node.height / 2) * r.zoom + r.panY;
185
+ const hw = (node.width / 2) * r.zoom;
186
+ const hh = (node.height / 2) * r.zoom;
187
+ canvas.save();
188
+ if (rotation !== 0) {
189
+ canvas.rotate(rotation, cx, cy);
190
+ }
191
+ canvas.drawRect(r.ck.LTRBRect(cx - hw, cy - hh, cx + hw, cy + hh), r.selectionPaint);
192
+ canvas.restore();
193
+ }
194
+ export function drawGroupBounds(r, canvas, nodes, graph) {
195
+ let minX = Infinity;
196
+ let minY = Infinity;
197
+ let maxX = -Infinity;
198
+ let maxY = -Infinity;
199
+ for (const n of nodes) {
200
+ const abs = graph.getAbsolutePosition(n.id);
201
+ if (n.rotation !== 0) {
202
+ const corners = r.getRotatedCorners(n, abs);
203
+ for (const c of corners) {
204
+ minX = Math.min(minX, c.x);
205
+ minY = Math.min(minY, c.y);
206
+ maxX = Math.max(maxX, c.x);
207
+ maxY = Math.max(maxY, c.y);
208
+ }
209
+ }
210
+ else {
211
+ const x1 = abs.x * r.zoom + r.panX;
212
+ const y1 = abs.y * r.zoom + r.panY;
213
+ const x2 = (abs.x + n.width) * r.zoom + r.panX;
214
+ const y2 = (abs.y + n.height) * r.zoom + r.panY;
215
+ minX = Math.min(minX, x1);
216
+ minY = Math.min(minY, y1);
217
+ maxX = Math.max(maxX, x2);
218
+ maxY = Math.max(maxY, y2);
219
+ }
220
+ }
221
+ r.auxStroke.setStrokeWidth(1);
222
+ r.auxStroke.setColor(r.selColor(SELECTION_DASH_ALPHA));
223
+ r.auxStroke.setPathEffect(null);
224
+ canvas.drawRect(r.ck.LTRBRect(minX, minY, maxX, maxY), r.auxStroke);
225
+ r.drawHandle(canvas, minX, minY);
226
+ r.drawHandle(canvas, maxX, minY);
227
+ r.drawHandle(canvas, minX, maxY);
228
+ r.drawHandle(canvas, maxX, maxY);
229
+ const gmx = (minX + maxX) / 2;
230
+ const gmy = (minY + maxY) / 2;
231
+ r.drawHandle(canvas, gmx, minY);
232
+ r.drawHandle(canvas, gmx, maxY);
233
+ r.drawHandle(canvas, minX, gmy);
234
+ r.drawHandle(canvas, maxX, gmy);
235
+ }
236
+ export function getRotatedCorners(r, n, abs) {
237
+ const cx = (abs.x + n.width / 2) * r.zoom + r.panX;
238
+ const cy = (abs.y + n.height / 2) * r.zoom + r.panY;
239
+ const hw = (n.width / 2) * r.zoom;
240
+ const hh = (n.height / 2) * r.zoom;
241
+ const rad = (n.rotation * Math.PI) / 180;
242
+ const cos = Math.cos(rad);
243
+ const sin = Math.sin(rad);
244
+ return [
245
+ { x: cx + -hw * cos - -hh * sin, y: cy + -hw * sin + -hh * cos },
246
+ { x: cx + hw * cos - -hh * sin, y: cy + hw * sin + -hh * cos },
247
+ { x: cx + hw * cos - hh * sin, y: cy + hw * sin + hh * cos },
248
+ { x: cx + -hw * cos - hh * sin, y: cy + -hw * sin + hh * cos }
249
+ ];
250
+ }
251
+ export function drawHandle(r, canvas, x, y) {
252
+ r.auxFill.setColor(r.ck.WHITE);
253
+ const rect = r.ck.LTRBRect(x - HANDLE_HALF_SIZE, y - HANDLE_HALF_SIZE, x + HANDLE_HALF_SIZE, y + HANDLE_HALF_SIZE);
254
+ canvas.drawRect(rect, r.auxFill);
255
+ canvas.drawRect(rect, r.selectionPaint);
256
+ }
257
+ export function drawSnapGuides(r, canvas, guides) {
258
+ if (!guides || guides.length === 0)
259
+ return;
260
+ for (const guide of guides) {
261
+ if (guide.axis === 'x') {
262
+ const x = guide.position * r.zoom + r.panX;
263
+ const y1 = guide.from * r.zoom + r.panY;
264
+ const y2 = guide.to * r.zoom + r.panY;
265
+ canvas.drawLine(x, y1, x, y2, r.snapPaint);
266
+ }
267
+ else {
268
+ const y = guide.position * r.zoom + r.panY;
269
+ const x1 = guide.from * r.zoom + r.panX;
270
+ const x2 = guide.to * r.zoom + r.panX;
271
+ canvas.drawLine(x1, y, x2, y, r.snapPaint);
272
+ }
273
+ }
274
+ }
275
+ export function drawMarquee(r, canvas, marquee) {
276
+ if (!marquee || marquee.width <= 0 || marquee.height <= 0)
277
+ return;
278
+ const x1 = marquee.x * r.zoom + r.panX;
279
+ const y1 = marquee.y * r.zoom + r.panY;
280
+ const x2 = (marquee.x + marquee.width) * r.zoom + r.panX;
281
+ const y2 = (marquee.y + marquee.height) * r.zoom + r.panY;
282
+ const rect = r.ck.LTRBRect(x1, y1, x2, y2);
283
+ r.auxFill.setColor(r.selColor(MARQUEE_FILL_ALPHA));
284
+ canvas.drawRect(rect, r.auxFill);
285
+ canvas.drawRect(rect, r.selectionPaint);
286
+ }
287
+ export function drawFlashes(r, canvas, graph) {
288
+ if (r._flashes.length === 0)
289
+ return;
290
+ const now = performance.now();
291
+ const ck = r.ck;
292
+ const totalMs = FLASH_ATTACK_MS + FLASH_HOLD_MS + FLASH_RELEASE_MS;
293
+ if (!r._flashPaint) {
294
+ r._flashPaint = new ck.Paint();
295
+ r._flashPaint.setStyle(ck.PaintStyle.Stroke);
296
+ r._flashPaint.setAntiAlias(true);
297
+ }
298
+ const paint = r._flashPaint;
299
+ const zoom = r.zoom;
300
+ for (let i = r._flashes.length - 1; i >= 0; i--) {
301
+ const flash = r._flashes[i];
302
+ const elapsed = now - flash.startTime;
303
+ if (elapsed > totalMs) {
304
+ r._flashes.splice(i, 1);
305
+ continue;
306
+ }
307
+ const node = graph.getNode(flash.nodeId);
308
+ if (!node) {
309
+ r._flashes.splice(i, 1);
310
+ continue;
311
+ }
312
+ const abs = graph.getAbsolutePosition(flash.nodeId);
313
+ const cx = (abs.x + node.width / 2) * zoom + r.panX;
314
+ const cy = (abs.y + node.height / 2) * zoom + r.panY;
315
+ const hw = (node.width / 2) * zoom;
316
+ const hh = (node.height / 2) * zoom;
317
+ let opacity;
318
+ let extraPad;
319
+ if (elapsed < FLASH_ATTACK_MS) {
320
+ const t = elapsed / FLASH_ATTACK_MS;
321
+ const ease = t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;
322
+ opacity = ease;
323
+ extraPad = (1 - ease) * FLASH_OVERSHOOT;
324
+ }
325
+ else if (elapsed < FLASH_ATTACK_MS + FLASH_HOLD_MS) {
326
+ opacity = 1;
327
+ extraPad = 0;
328
+ }
329
+ else {
330
+ const t = (elapsed - FLASH_ATTACK_MS - FLASH_HOLD_MS) / FLASH_RELEASE_MS;
331
+ opacity = 1 - t * t;
332
+ extraPad = 0;
333
+ }
334
+ const pad = FLASH_PADDING + extraPad;
335
+ const rad = FLASH_RADIUS;
336
+ paint.setColor(ck.Color4f(FLASH_COLOR.r, FLASH_COLOR.g, FLASH_COLOR.b, opacity));
337
+ paint.setStrokeWidth(FLASH_STROKE_WIDTH);
338
+ canvas.save();
339
+ if (node.rotation !== 0)
340
+ canvas.rotate(node.rotation, cx, cy);
341
+ const rect = ck.RRectXY(ck.LTRBRect(cx - hw - pad, cy - hh - pad, cx + hw + pad, cy + hh + pad), rad, rad);
342
+ canvas.drawRRect(rect, paint);
343
+ canvas.restore();
344
+ }
345
+ }
346
+ export function drawLayoutInsertIndicator(r, canvas, indicator) {
347
+ if (!indicator)
348
+ return;
349
+ r.auxStroke.setStrokeWidth(LAYOUT_INDICATOR_STROKE);
350
+ r.auxStroke.setColor(r.selColor());
351
+ r.auxStroke.setPathEffect(null);
352
+ if (indicator.direction === 'HORIZONTAL') {
353
+ const y = indicator.y * r.zoom + r.panY;
354
+ const x1 = indicator.x * r.zoom + r.panX;
355
+ const x2 = (indicator.x + indicator.length) * r.zoom + r.panX;
356
+ canvas.drawLine(x1, y, x2, y, r.auxStroke);
357
+ }
358
+ else {
359
+ const x = indicator.x * r.zoom + r.panX;
360
+ const y1 = indicator.y * r.zoom + r.panY;
361
+ const y2 = (indicator.y + indicator.length) * r.zoom + r.panY;
362
+ canvas.drawLine(x, y1, x, y2, r.auxStroke);
363
+ }
364
+ }
365
+ export function drawTextEditOverlay(r, canvas, node, editor) {
366
+ r.auxStroke.setStrokeWidth(1 / r.zoom);
367
+ r.auxStroke.setColor(r.selColor());
368
+ r.auxStroke.setPathEffect(null);
369
+ canvas.drawRect(r.ck.LTRBRect(0, 0, node.width, node.height), r.auxStroke);
370
+ const selRects = editor.getSelectionRects();
371
+ if (selRects.length > 0) {
372
+ r.auxFill.setColor(r.ck.Color4f(TEXT_SELECTION_COLOR.r, TEXT_SELECTION_COLOR.g, TEXT_SELECTION_COLOR.b, TEXT_SELECTION_COLOR.a));
373
+ for (const sel of selRects) {
374
+ canvas.drawRect(r.ck.LTRBRect(sel.x, sel.y, sel.x + sel.width, sel.y + sel.height), r.auxFill);
375
+ }
376
+ }
377
+ if (editor.caretVisible && !editor.hasSelection()) {
378
+ const caret = editor.getCaretRect();
379
+ if (caret) {
380
+ r.auxFill.setColor(r.ck.Color4f(TEXT_CARET_COLOR.r, TEXT_CARET_COLOR.g, TEXT_CARET_COLOR.b, TEXT_CARET_COLOR.a));
381
+ const w = TEXT_CARET_WIDTH / r.zoom;
382
+ canvas.drawRect(r.ck.LTRBRect(caret.x - w / 2, caret.y0, caret.x + w / 2, caret.y1), r.auxFill);
383
+ }
384
+ }
385
+ }
386
+ function buildPenPath(r, canvas, penState, toScreen) {
387
+ const { vertices, segments, dragTangent, cursorX, cursorY } = penState;
388
+ const path = new r.ck.Path();
389
+ for (const seg of segments) {
390
+ const s = toScreen(vertices[seg.start].x, vertices[seg.start].y);
391
+ const e = toScreen(vertices[seg.end].x, vertices[seg.end].y);
392
+ path.moveTo(s.x, s.y);
393
+ const isLine = seg.tangentStart.x === 0 &&
394
+ seg.tangentStart.y === 0 &&
395
+ seg.tangentEnd.x === 0 &&
396
+ seg.tangentEnd.y === 0;
397
+ if (isLine) {
398
+ path.lineTo(e.x, e.y);
399
+ }
400
+ else {
401
+ const cp1 = toScreen(vertices[seg.start].x + seg.tangentStart.x, vertices[seg.start].y + seg.tangentStart.y);
402
+ const cp2 = toScreen(vertices[seg.end].x + seg.tangentEnd.x, vertices[seg.end].y + seg.tangentEnd.y);
403
+ path.cubicTo(cp1.x, cp1.y, cp2.x, cp2.y, e.x, e.y);
404
+ }
405
+ }
406
+ if (vertices.length > 0 && cursorX != null && cursorY != null) {
407
+ const last = toScreen(vertices[vertices.length - 1].x, vertices[vertices.length - 1].y);
408
+ const cursor = toScreen(cursorX, cursorY);
409
+ path.moveTo(last.x, last.y);
410
+ if (dragTangent) {
411
+ const cp1 = toScreen(vertices[vertices.length - 1].x + dragTangent.x, vertices[vertices.length - 1].y + dragTangent.y);
412
+ path.cubicTo(cp1.x, cp1.y, cursor.x, cursor.y, cursor.x, cursor.y);
413
+ }
414
+ else {
415
+ path.lineTo(cursor.x, cursor.y);
416
+ }
417
+ }
418
+ canvas.drawPath(path, r.penPathPaint);
419
+ path.delete();
420
+ }
421
+ function drawPenHandlePoint(canvas, x, y, vertexFill, handlePaint) {
422
+ canvas.drawCircle(x, y, PEN_HANDLE_RADIUS, vertexFill);
423
+ canvas.drawCircle(x, y, PEN_HANDLE_RADIUS, handlePaint);
424
+ }
425
+ function drawPenTangentHandles(canvas, penState, toScreen, handlePaint, vertexFill) {
426
+ const { vertices, segments, dragTangent } = penState;
427
+ for (const seg of segments) {
428
+ const ts = seg.tangentStart;
429
+ const te = seg.tangentEnd;
430
+ if (ts.x !== 0 || ts.y !== 0) {
431
+ const s = toScreen(vertices[seg.start].x, vertices[seg.start].y);
432
+ const cp = toScreen(vertices[seg.start].x + ts.x, vertices[seg.start].y + ts.y);
433
+ canvas.drawLine(s.x, s.y, cp.x, cp.y, handlePaint);
434
+ drawPenHandlePoint(canvas, cp.x, cp.y, vertexFill, handlePaint);
435
+ }
436
+ if (te.x !== 0 || te.y !== 0) {
437
+ const e = toScreen(vertices[seg.end].x, vertices[seg.end].y);
438
+ const cp = toScreen(vertices[seg.end].x + te.x, vertices[seg.end].y + te.y);
439
+ canvas.drawLine(e.x, e.y, cp.x, cp.y, handlePaint);
440
+ drawPenHandlePoint(canvas, cp.x, cp.y, vertexFill, handlePaint);
441
+ }
442
+ }
443
+ if (dragTangent && vertices.length > 0) {
444
+ const last = vertices[vertices.length - 1];
445
+ const cp1 = toScreen(last.x + dragTangent.x, last.y + dragTangent.y);
446
+ const cp2 = toScreen(last.x - dragTangent.x, last.y - dragTangent.y);
447
+ canvas.drawLine(cp2.x, cp2.y, cp1.x, cp1.y, handlePaint);
448
+ drawPenHandlePoint(canvas, cp1.x, cp1.y, vertexFill, handlePaint);
449
+ drawPenHandlePoint(canvas, cp2.x, cp2.y, vertexFill, handlePaint);
450
+ }
451
+ }
452
+ export function drawPenOverlay(r, canvas, penState) {
453
+ if (!penState || penState.vertices.length === 0)
454
+ return;
455
+ const { vertices } = penState;
456
+ const vertexFill = r.penVertexFill;
457
+ const vertexStroke = r.penVertexStroke;
458
+ const toScreen = (x, y) => ({
459
+ x: x * r.zoom + r.panX,
460
+ y: y * r.zoom + r.panY
461
+ });
462
+ buildPenPath(r, canvas, penState, toScreen);
463
+ drawPenTangentHandles(canvas, penState, toScreen, r.penHandlePaint, vertexFill);
464
+ for (let i = 0; i < vertices.length; i++) {
465
+ const v = toScreen(vertices[i].x, vertices[i].y);
466
+ const radius = i === 0 && penState.closingToFirst
467
+ ? PEN_VERTEX_RADIUS + PEN_CLOSE_RADIUS_BOOST
468
+ : PEN_VERTEX_RADIUS;
469
+ canvas.drawCircle(v.x, v.y, radius, vertexFill);
470
+ canvas.drawCircle(v.x, v.y, radius, vertexStroke);
471
+ }
472
+ }
473
+ export function drawRemoteCursors(r, canvas, graph, cursors) {
474
+ if (!cursors || cursors.length === 0)
475
+ return;
476
+ const CURSOR_SIZE = 9;
477
+ const LABEL_PADDING_X = 4;
478
+ const LABEL_PADDING_Y = 2;
479
+ const LABEL_FONT_SIZE = 10;
480
+ const LABEL_OFFSET_X = 12;
481
+ const LABEL_OFFSET_Y = 20;
482
+ for (const cursor of cursors) {
483
+ const screenX = cursor.x * r.zoom + r.panX;
484
+ const screenY = cursor.y * r.zoom + r.panY;
485
+ const { r: cr, g, b } = cursor.color;
486
+ if (cursor.selection?.length) {
487
+ r.auxStroke.setColor(r.ck.Color4f(cr, g, b, 0.6));
488
+ r.auxStroke.setStrokeWidth(1.5);
489
+ r.auxStroke.setPathEffect(null);
490
+ for (const nodeId of cursor.selection) {
491
+ const node = graph.getNode(nodeId);
492
+ if (!node)
493
+ continue;
494
+ const abs = graph.getAbsolutePosition(nodeId);
495
+ const sx = abs.x * r.zoom + r.panX;
496
+ const sy = abs.y * r.zoom + r.panY;
497
+ const sw = node.width * r.zoom;
498
+ const sh = node.height * r.zoom;
499
+ canvas.drawRect(r.ck.XYWHRect(sx, sy, sw, sh), r.auxStroke);
500
+ }
501
+ }
502
+ const S = CURSOR_SIZE;
503
+ const path = new r.ck.Path();
504
+ path.moveTo(screenX, screenY);
505
+ path.lineTo(screenX, screenY + S * 1.35);
506
+ path.lineTo(screenX + S * 0.38, screenY + S * 1.0);
507
+ path.lineTo(screenX + S * 0.72, screenY + S * 1.5);
508
+ path.lineTo(screenX + S * 0.92, screenY + S * 1.38);
509
+ path.lineTo(screenX + S * 0.58, screenY + S * 0.88);
510
+ path.lineTo(screenX + S * 1.0, screenY + S * 0.82);
511
+ path.close();
512
+ r.auxStroke.setColor(r.ck.Color4f(1, 1, 1, 1));
513
+ r.auxStroke.setStrokeWidth(2);
514
+ r.auxStroke.setPathEffect(null);
515
+ canvas.drawPath(path, r.auxStroke);
516
+ r.auxFill.setColor(r.ck.Color4f(cr, g, b, 1));
517
+ canvas.drawPath(path, r.auxFill);
518
+ path.delete();
519
+ if (cursor.name) {
520
+ const font = r.labelFont;
521
+ if (font) {
522
+ font.setSize(LABEL_FONT_SIZE);
523
+ const labelX = screenX + LABEL_OFFSET_X;
524
+ const labelY = screenY + LABEL_OFFSET_Y;
525
+ const glyphIds = font.getGlyphIDs(cursor.name);
526
+ const widths = font.getGlyphWidths(glyphIds);
527
+ let textWidth = 0;
528
+ for (const w of widths)
529
+ textWidth += w;
530
+ r.auxFill.setColor(r.ck.Color4f(cr, g, b, 1));
531
+ const bgRect = r.ck.RRectXY(r.ck.XYWHRect(labelX - LABEL_PADDING_X, labelY - LABEL_FONT_SIZE - LABEL_PADDING_Y + 2, textWidth + LABEL_PADDING_X * 2, LABEL_FONT_SIZE + LABEL_PADDING_Y * 2), 4, 4);
532
+ canvas.drawRRect(bgRect, r.auxFill);
533
+ r.auxFill.setColor(r.ck.Color4f(1, 1, 1, 1));
534
+ canvas.drawText(cursor.name, labelX, labelY, r.auxFill, font);
535
+ }
536
+ }
537
+ }
538
+ }
539
+ function nodeBounds(graph, id, node) {
540
+ const abs = graph.getAbsolutePosition(id);
541
+ return {
542
+ x1: abs.x,
543
+ y1: abs.y,
544
+ x2: abs.x + node.width,
545
+ y2: abs.y + node.height,
546
+ };
547
+ }
548
+ function drawMeasurementLine(_r, canvas, x1, y1, x2, y2, paint) {
549
+ canvas.drawLine(x1, y1, x2, y2, paint);
550
+ // Draw small perpendicular end caps
551
+ const isHorizontal = Math.abs(y2 - y1) < 0.5;
552
+ const cap = MEASUREMENT_ARROW_SIZE;
553
+ if (isHorizontal) {
554
+ canvas.drawLine(x1, y1 - cap, x1, y1 + cap, paint);
555
+ canvas.drawLine(x2, y2 - cap, x2, y2 + cap, paint);
556
+ }
557
+ else {
558
+ canvas.drawLine(x1 - cap, y1, x1 + cap, y1, paint);
559
+ canvas.drawLine(x2 - cap, y2, x2 + cap, y2, paint);
560
+ }
561
+ }
562
+ function drawMeasurementPill(r, canvas, cx, cy, text) {
563
+ const font = r.sizeFont;
564
+ if (!font)
565
+ return;
566
+ font.setSize(MEASUREMENT_FONT_SIZE);
567
+ const glyphIds = font.getGlyphIDs(text);
568
+ const widths = font.getGlyphWidths(glyphIds);
569
+ let textWidth = 0;
570
+ for (const w of widths)
571
+ textWidth += w;
572
+ const pw = textWidth + MEASUREMENT_PILL_PADDING_X * 2;
573
+ const ph = MEASUREMENT_PILL_HEIGHT;
574
+ const px = cx - pw / 2;
575
+ const py = cy - ph / 2;
576
+ // Background pill
577
+ r.auxFill.setColor(r.ck.Color4f(MEASUREMENT_COLOR.r, MEASUREMENT_COLOR.g, MEASUREMENT_COLOR.b, 1));
578
+ const bgRect = r.ck.RRectXY(r.ck.XYWHRect(px, py, pw, ph), MEASUREMENT_PILL_RADIUS, MEASUREMENT_PILL_RADIUS);
579
+ canvas.drawRRect(bgRect, r.auxFill);
580
+ // White text
581
+ r.auxFill.setColor(r.ck.Color4f(1, 1, 1, 1));
582
+ canvas.drawText(text, cx - textWidth / 2, cy + MEASUREMENT_FONT_SIZE * 0.35, r.auxFill, font);
583
+ }
584
+ export function drawMeasurements(r, canvas, graph, selectedIds, hoveredNodeId) {
585
+ if (!hoveredNodeId || selectedIds.size !== 1)
586
+ return;
587
+ const selId = [...selectedIds][0];
588
+ if (selId === hoveredNodeId)
589
+ return;
590
+ // Don't measure if hovered is selected
591
+ if (selectedIds.has(hoveredNodeId))
592
+ return;
593
+ const selNode = graph.getNode(selId);
594
+ const hovNode = graph.getNode(hoveredNodeId);
595
+ if (!selNode || !hovNode)
596
+ return;
597
+ const a = nodeBounds(graph, selId, selNode);
598
+ const b = nodeBounds(graph, hoveredNodeId, hovNode);
599
+ // Set up measurement paint
600
+ const mPaint = r.auxStroke;
601
+ mPaint.setColor(r.ck.Color4f(MEASUREMENT_COLOR.r, MEASUREMENT_COLOR.g, MEASUREMENT_COLOR.b, 1));
602
+ mPaint.setStrokeWidth(MEASUREMENT_LINE_WIDTH);
603
+ mPaint.setPathEffect(r.ck.PathEffect.MakeDash(MEASUREMENT_DASH, 0));
604
+ // Convert to screen coords
605
+ const sa = {
606
+ x1: a.x1 * r.zoom + r.panX,
607
+ y1: a.y1 * r.zoom + r.panY,
608
+ x2: a.x2 * r.zoom + r.panX,
609
+ y2: a.y2 * r.zoom + r.panY,
610
+ };
611
+ const sb = {
612
+ x1: b.x1 * r.zoom + r.panX,
613
+ y1: b.y1 * r.zoom + r.panY,
614
+ x2: b.x2 * r.zoom + r.panX,
615
+ y2: b.y2 * r.zoom + r.panY,
616
+ };
617
+ // Compute horizontal gap (left/right)
618
+ const hGaps = [];
619
+ // A is left of B
620
+ if (a.x2 <= b.x1) {
621
+ hGaps.push({ dist: b.x1 - a.x2, fromX: sa.x2, toX: sb.x1, label: `${Math.round(b.x1 - a.x2)}` });
622
+ }
623
+ // A is right of B
624
+ if (a.x1 >= b.x2) {
625
+ hGaps.push({ dist: a.x1 - b.x2, fromX: sb.x2, toX: sa.x1, label: `${Math.round(a.x1 - b.x2)}` });
626
+ }
627
+ // A contains B or overlaps — show edge distances
628
+ if (a.x1 < b.x1 && a.x2 > b.x2) {
629
+ const leftDist = b.x1 - a.x1;
630
+ const rightDist = a.x2 - b.x2;
631
+ if (leftDist > 0)
632
+ hGaps.push({ dist: leftDist, fromX: sa.x1, toX: sb.x1, label: `${Math.round(leftDist)}` });
633
+ if (rightDist > 0)
634
+ hGaps.push({ dist: rightDist, fromX: sb.x2, toX: sa.x2, label: `${Math.round(rightDist)}` });
635
+ }
636
+ // B contains A
637
+ if (b.x1 < a.x1 && b.x2 > a.x2) {
638
+ const leftDist = a.x1 - b.x1;
639
+ const rightDist = b.x2 - a.x2;
640
+ if (leftDist > 0)
641
+ hGaps.push({ dist: leftDist, fromX: sb.x1, toX: sa.x1, label: `${Math.round(leftDist)}` });
642
+ if (rightDist > 0)
643
+ hGaps.push({ dist: rightDist, fromX: sa.x2, toX: sb.x2, label: `${Math.round(rightDist)}` });
644
+ }
645
+ // Compute vertical gap (top/bottom)
646
+ const vGaps = [];
647
+ // A is above B
648
+ if (a.y2 <= b.y1) {
649
+ vGaps.push({ dist: b.y1 - a.y2, fromY: sa.y2, toY: sb.y1, label: `${Math.round(b.y1 - a.y2)}` });
650
+ }
651
+ // A is below B
652
+ if (a.y1 >= b.y2) {
653
+ vGaps.push({ dist: a.y1 - b.y2, fromY: sb.y2, toY: sa.y1, label: `${Math.round(a.y1 - b.y2)}` });
654
+ }
655
+ // A contains B vertically
656
+ if (a.y1 < b.y1 && a.y2 > b.y2) {
657
+ const topDist = b.y1 - a.y1;
658
+ const bottomDist = a.y2 - b.y2;
659
+ if (topDist > 0)
660
+ vGaps.push({ dist: topDist, fromY: sa.y1, toY: sb.y1, label: `${Math.round(topDist)}` });
661
+ if (bottomDist > 0)
662
+ vGaps.push({ dist: bottomDist, fromY: sb.y2, toY: sa.y2, label: `${Math.round(bottomDist)}` });
663
+ }
664
+ // B contains A vertically
665
+ if (b.y1 < a.y1 && b.y2 > a.y2) {
666
+ const topDist = a.y1 - b.y1;
667
+ const bottomDist = b.y2 - a.y2;
668
+ if (topDist > 0)
669
+ vGaps.push({ dist: topDist, fromY: sb.y1, toY: sa.y1, label: `${Math.round(topDist)}` });
670
+ if (bottomDist > 0)
671
+ vGaps.push({ dist: bottomDist, fromY: sa.y2, toY: sb.y2, label: `${Math.round(bottomDist)}` });
672
+ }
673
+ // Draw horizontal measurements
674
+ for (const gap of hGaps) {
675
+ if (gap.dist < 1)
676
+ continue;
677
+ // Y midpoint: use overlap region or average of centers
678
+ const overlapTop = Math.max(sa.y1, sb.y1);
679
+ const overlapBot = Math.min(sa.y2, sb.y2);
680
+ const lineY = overlapTop < overlapBot
681
+ ? (overlapTop + overlapBot) / 2
682
+ : ((sa.y1 + sa.y2) / 2 + (sb.y1 + sb.y2) / 2) / 2;
683
+ drawMeasurementLine(r, canvas, gap.fromX, lineY, gap.toX, lineY, mPaint);
684
+ drawMeasurementPill(r, canvas, (gap.fromX + gap.toX) / 2, lineY - MEASUREMENT_PILL_HEIGHT, gap.label);
685
+ }
686
+ // Draw vertical measurements
687
+ for (const gap of vGaps) {
688
+ if (gap.dist < 1)
689
+ continue;
690
+ // X midpoint: use overlap region or average of centers
691
+ const overlapLeft = Math.max(sa.x1, sb.x1);
692
+ const overlapRight = Math.min(sa.x2, sb.x2);
693
+ const lineX = overlapLeft < overlapRight
694
+ ? (overlapLeft + overlapRight) / 2
695
+ : ((sa.x1 + sa.x2) / 2 + (sb.x1 + sb.x2) / 2) / 2;
696
+ drawMeasurementLine(r, canvas, lineX, gap.fromY, lineX, gap.toY, mPaint);
697
+ drawMeasurementPill(r, canvas, lineX + MEASUREMENT_PILL_HEIGHT + 4, (gap.fromY + gap.toY) / 2, gap.label);
698
+ }
699
+ // Also draw a dashed outline around the hovered node
700
+ mPaint.setStrokeWidth(1);
701
+ canvas.drawRect(r.ck.LTRBRect(sb.x1, sb.y1, sb.x2, sb.y2), mPaint);
702
+ // Reset path effect
703
+ mPaint.setPathEffect(null);
704
+ }
705
+ // ── Padding visualization ────────────────────────────────────
706
+ const PADDING_COLOR = { r: 0.3, g: 0.8, b: 0.4, a: 0.15 };
707
+ const GAP_COLOR = { r: 0.9, g: 0.5, b: 0.2, a: 0.15 };
708
+ export function drawPaddingOverlay(r, canvas, graph, selectedIds) {
709
+ if (selectedIds.size !== 1)
710
+ return;
711
+ const nodeId = [...selectedIds][0];
712
+ const node = graph.getNode(nodeId);
713
+ if (!node)
714
+ return;
715
+ const { paddingTop: pt, paddingRight: pr, paddingBottom: pb, paddingLeft: pl } = node;
716
+ if (pt === 0 && pr === 0 && pb === 0 && pl === 0)
717
+ return;
718
+ const bounds = nodeBounds(graph, nodeId, node);
719
+ const sx1 = bounds.x1 * r.zoom + r.panX;
720
+ const sy1 = bounds.y1 * r.zoom + r.panY;
721
+ const sx2 = bounds.x2 * r.zoom + r.panX;
722
+ const sy2 = bounds.y2 * r.zoom + r.panY;
723
+ const fill = r.auxFill;
724
+ fill.setColor(r.ck.Color4f(PADDING_COLOR.r, PADDING_COLOR.g, PADDING_COLOR.b, PADDING_COLOR.a));
725
+ const ptS = pt * r.zoom;
726
+ const prS = pr * r.zoom;
727
+ const pbS = pb * r.zoom;
728
+ const plS = pl * r.zoom;
729
+ // Top padding
730
+ if (pt > 0)
731
+ canvas.drawRect(r.ck.LTRBRect(sx1, sy1, sx2, sy1 + ptS), fill);
732
+ // Bottom padding
733
+ if (pb > 0)
734
+ canvas.drawRect(r.ck.LTRBRect(sx1, sy2 - pbS, sx2, sy2), fill);
735
+ // Left padding (between top and bottom)
736
+ if (pl > 0)
737
+ canvas.drawRect(r.ck.LTRBRect(sx1, sy1 + ptS, sx1 + plS, sy2 - pbS), fill);
738
+ // Right padding (between top and bottom)
739
+ if (pr > 0)
740
+ canvas.drawRect(r.ck.LTRBRect(sx2 - prS, sy1 + ptS, sx2, sy2 - pbS), fill);
741
+ // Draw padding labels
742
+ if (pt > 0)
743
+ drawMeasurementPill(r, canvas, (sx1 + sx2) / 2, sy1 + ptS / 2 - MEASUREMENT_PILL_HEIGHT / 2, `${Math.round(pt)}`);
744
+ if (pb > 0)
745
+ drawMeasurementPill(r, canvas, (sx1 + sx2) / 2, sy2 - pbS / 2 - MEASUREMENT_PILL_HEIGHT / 2, `${Math.round(pb)}`);
746
+ if (pl > 0)
747
+ drawMeasurementPill(r, canvas, sx1 + plS / 2, (sy1 + ptS + sy2 - pbS) / 2 - MEASUREMENT_PILL_HEIGHT / 2, `${Math.round(pl)}`);
748
+ if (pr > 0)
749
+ drawMeasurementPill(r, canvas, sx2 - prS / 2, (sy1 + ptS + sy2 - pbS) / 2 - MEASUREMENT_PILL_HEIGHT / 2, `${Math.round(pr)}`);
750
+ // Gap visualization for auto-layout
751
+ if (node.layoutMode !== 'NONE' && node.itemSpacing > 0) {
752
+ const children = graph.getChildren(nodeId).filter((c) => c.visible);
753
+ if (children.length < 2)
754
+ return;
755
+ fill.setColor(r.ck.Color4f(GAP_COLOR.r, GAP_COLOR.g, GAP_COLOR.b, GAP_COLOR.a));
756
+ const isHorizontal = node.layoutMode === 'HORIZONTAL';
757
+ for (let i = 0; i < children.length - 1; i++) {
758
+ const cb = nodeBounds(graph, children[i].id, children[i]);
759
+ const nb = nodeBounds(graph, children[i + 1].id, children[i + 1]);
760
+ if (isHorizontal) {
761
+ const gx1 = cb.x2 * r.zoom + r.panX;
762
+ const gx2 = nb.x1 * r.zoom + r.panX;
763
+ const gy1 = Math.max(cb.y1, nb.y1) * r.zoom + r.panY;
764
+ const gy2 = Math.min(cb.y2, nb.y2) * r.zoom + r.panY;
765
+ if (gx2 > gx1 && gy2 > gy1) {
766
+ canvas.drawRect(r.ck.LTRBRect(gx1, gy1, gx2, gy2), fill);
767
+ drawMeasurementPill(r, canvas, (gx1 + gx2) / 2, (gy1 + gy2) / 2 - MEASUREMENT_PILL_HEIGHT / 2, `${Math.round(node.itemSpacing)}`);
768
+ }
769
+ }
770
+ else {
771
+ const gy1 = cb.y2 * r.zoom + r.panY;
772
+ const gy2 = nb.y1 * r.zoom + r.panY;
773
+ const gx1 = Math.max(cb.x1, nb.x1) * r.zoom + r.panX;
774
+ const gx2 = Math.min(cb.x2, nb.x2) * r.zoom + r.panX;
775
+ if (gy2 > gy1 && gx2 > gx1) {
776
+ canvas.drawRect(r.ck.LTRBRect(gx1, gy1, gx2, gy2), fill);
777
+ drawMeasurementPill(r, canvas, (gx1 + gx2) / 2, (gy1 + gy2) / 2 - MEASUREMENT_PILL_HEIGHT / 2, `${Math.round(node.itemSpacing)}`);
778
+ }
779
+ }
780
+ }
781
+ }
782
+ }
783
+ //# sourceMappingURL=overlays.js.map