@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,644 @@
1
+ import { guidToString, convertOverrideToProps, resolveGeometryPaths } from './kiwi-convert.js';
2
+ import { copyFills, copyStrokes, copyEffects, copyStyleRuns, copyGeometryPaths } from '../copy.js';
3
+ /**
4
+ * Populate empty instances from their components and apply symbol overrides.
5
+ *
6
+ * Shared between .fig file import and clipboard paste. Both paths produce
7
+ * a SceneGraph with INSTANCE nodes whose componentId references have been
8
+ * remapped to graph node IDs but whose children may be missing and whose
9
+ * overrides have not yet been applied.
10
+ *
11
+ * @param graph – the SceneGraph (mutated in place)
12
+ * @param changeMap – figmaGuid → raw kiwi node change (for overrideKey + symbolData)
13
+ * @param guidToNodeId – figmaGuid → graph node ID
14
+ */
15
+ export function populateAndApplyOverrides(graph, changeMap, guidToNodeId, blobs = []) {
16
+ // Work-queue population: seed with empty instances, then discover newly
17
+ // cloned nested instances by walking the subtree (avoids full graph scan per round).
18
+ const populateQueue = [];
19
+ for (const node of graph.getAllNodes()) {
20
+ if (node.type === 'INSTANCE' && node.componentId && node.childIds.length === 0) {
21
+ populateQueue.push(node.id);
22
+ }
23
+ }
24
+ function collectEmptyInstances(parentId, out) {
25
+ const parent = graph.getNode(parentId);
26
+ if (!parent)
27
+ return;
28
+ for (const childId of parent.childIds) {
29
+ const child = graph.getNode(childId);
30
+ if (!child)
31
+ continue;
32
+ if (child.type === 'INSTANCE' && child.componentId && child.childIds.length === 0) {
33
+ out.push(child.id);
34
+ }
35
+ else if (child.childIds.length > 0) {
36
+ collectEmptyInstances(childId, out);
37
+ }
38
+ }
39
+ }
40
+ while (populateQueue.length > 0) {
41
+ const nodeId = populateQueue.pop();
42
+ if (!nodeId)
43
+ continue;
44
+ const node = graph.getNode(nodeId);
45
+ if (node?.type !== 'INSTANCE' || !node.componentId || node.childIds.length > 0)
46
+ continue;
47
+ const comp = graph.getNode(node.componentId);
48
+ if (comp && comp.childIds.length > 0) {
49
+ graph.populateInstanceChildren(nodeId, node.componentId);
50
+ collectEmptyInstances(nodeId, populateQueue);
51
+ }
52
+ }
53
+ // Build overrideKey → figmaGuid map
54
+ const overrideKeyToGuid = new Map();
55
+ for (const [id, nc] of changeMap) {
56
+ if (nc.overrideKey)
57
+ overrideKeyToGuid.set(guidToString(nc.overrideKey), id);
58
+ }
59
+ // Reverse map: graph node ID → figma GUID (used by getComponentRoot kiwi fallback)
60
+ const nodeIdToGuid = new Map();
61
+ for (const [figmaId, nodeId] of guidToNodeId) {
62
+ nodeIdToGuid.set(nodeId, figmaId);
63
+ }
64
+ // Pre-compute componentId root for every node while all internal page nodes
65
+ // are still alive. After overrides, instance swaps delete intermediate clones,
66
+ // breaking the chain. DSD resolution uses this to match across clone levels.
67
+ const preComputedRoot = new Map();
68
+ function getPreComputedRoot(nodeId, depth = 0) {
69
+ if (preComputedRoot.has(nodeId))
70
+ return preComputedRoot.get(nodeId) ?? nodeId;
71
+ if (depth > 20)
72
+ return nodeId;
73
+ const node = graph.getNode(nodeId);
74
+ if (node?.componentId && node.componentId !== nodeId) {
75
+ const root = getPreComputedRoot(node.componentId, depth + 1);
76
+ preComputedRoot.set(nodeId, root);
77
+ return root;
78
+ }
79
+ preComputedRoot.set(nodeId, nodeId);
80
+ return nodeId;
81
+ }
82
+ for (const node of graph.getAllNodes()) {
83
+ if (node.componentId)
84
+ getPreComputedRoot(node.id);
85
+ }
86
+ // Component root resolution (walks componentId chain to the ultimate source)
87
+ const componentIdRoot = new Map();
88
+ function getComponentRoot(nodeId, depth = 0) {
89
+ if (componentIdRoot.has(nodeId))
90
+ return componentIdRoot.get(nodeId) ?? nodeId;
91
+ if (depth > 20) {
92
+ componentIdRoot.set(nodeId, nodeId);
93
+ return nodeId;
94
+ }
95
+ // Try graph first
96
+ const node = graph.getNode(nodeId);
97
+ if (node?.componentId) {
98
+ const root = getComponentRoot(node.componentId, depth + 1);
99
+ componentIdRoot.set(nodeId, root);
100
+ return root;
101
+ }
102
+ // For deleted nodes (internal page), resolve via kiwi symbolData
103
+ const figmaId = nodeIdToGuid.get(nodeId);
104
+ if (figmaId) {
105
+ const nc = changeMap.get(figmaId);
106
+ const symId = nc?.symbolData?.symbolID;
107
+ if (symId) {
108
+ const compNodeId = guidToNodeId.get(guidToString(symId));
109
+ if (compNodeId && compNodeId !== nodeId) {
110
+ const root = getComponentRoot(compNodeId, depth + 1);
111
+ componentIdRoot.set(nodeId, root);
112
+ return root;
113
+ }
114
+ }
115
+ }
116
+ componentIdRoot.set(nodeId, nodeId);
117
+ return nodeId;
118
+ }
119
+ function findNodeByComponentId(parentId, componentId) {
120
+ const parent = graph.getNode(parentId);
121
+ if (!parent)
122
+ return null;
123
+ // Pass 1: exact componentId match on direct children
124
+ for (const childId of parent.childIds) {
125
+ const child = graph.getNode(childId);
126
+ if (child?.componentId === componentId)
127
+ return childId;
128
+ }
129
+ // Pass 2: root match — but only if exactly one child shares the root
130
+ // (multiple siblings with the same root are ambiguous)
131
+ const targetRoot = preComputedRoot.get(componentId) ?? getComponentRoot(componentId);
132
+ if (targetRoot) {
133
+ let rootMatch = null;
134
+ let ambiguous = false;
135
+ for (const childId of parent.childIds) {
136
+ const child = graph.getNode(childId);
137
+ if (!child?.componentId)
138
+ continue;
139
+ const childRoot = preComputedRoot.get(child.componentId) ?? getComponentRoot(child.componentId);
140
+ if (childRoot === targetRoot) {
141
+ if (rootMatch) {
142
+ ambiguous = true;
143
+ break;
144
+ }
145
+ rootMatch = childId;
146
+ }
147
+ }
148
+ if (rootMatch && !ambiguous)
149
+ return rootMatch;
150
+ }
151
+ // Pass 3: recurse into children
152
+ for (const childId of parent.childIds) {
153
+ const deep = findNodeByComponentId(childId, componentId);
154
+ if (deep)
155
+ return deep;
156
+ }
157
+ return null;
158
+ }
159
+ function resolveOverrideTarget(instanceId, guids) {
160
+ let currentId = instanceId;
161
+ for (const guid of guids) {
162
+ const key = guidToString(guid);
163
+ const figmaGuid = overrideKeyToGuid.get(key) ?? key;
164
+ const remapped = guidToNodeId.get(figmaGuid);
165
+ if (!remapped)
166
+ return null;
167
+ // The override may target the current node itself (when it's an instance
168
+ // cloned from the component the override points to)
169
+ const current = graph.getNode(currentId);
170
+ if (current?.componentId === remapped) {
171
+ continue;
172
+ }
173
+ const found = findNodeByComponentId(currentId, remapped);
174
+ if (!found)
175
+ return null;
176
+ currentId = found;
177
+ }
178
+ return currentId;
179
+ }
180
+ // Apply component property assignments (boolean visibility, instance swap).
181
+ // Component children reference property definitions via componentPropRefs.
182
+ // Instances set values via componentPropAssignments. After cloning, we walk
183
+ // each instance's descendants and apply the assignments.
184
+ function findPropRefs(nodeId, propRefsMap) {
185
+ let sourceId = nodeId;
186
+ for (let depth = 0; sourceId && depth < 10; depth++) {
187
+ const figmaId = nodeIdToGuid.get(sourceId);
188
+ if (figmaId) {
189
+ const refs = propRefsMap.get(figmaId);
190
+ if (refs)
191
+ return refs;
192
+ }
193
+ const node = graph.getNode(sourceId);
194
+ const nextId = node?.componentId ?? undefined;
195
+ if (nextId === sourceId)
196
+ break;
197
+ sourceId = nextId;
198
+ }
199
+ return undefined;
200
+ }
201
+ function repopulateInstance(nodeId, compId) {
202
+ const node = graph.getNode(nodeId);
203
+ if (node?.type !== 'INSTANCE')
204
+ return;
205
+ for (const childId of Array.from(node.childIds))
206
+ graph.deleteNode(childId);
207
+ graph.updateNode(nodeId, { componentId: compId });
208
+ const comp = graph.getNode(compId);
209
+ if (comp && comp.childIds.length > 0) {
210
+ graph.populateInstanceChildren(nodeId, compId);
211
+ }
212
+ componentIdRoot.clear();
213
+ }
214
+ function assignmentsToValueMap(assignments) {
215
+ const valueByDef = new Map();
216
+ for (const a of assignments) {
217
+ if (a.defID)
218
+ valueByDef.set(guidToString(a.defID), a.value);
219
+ }
220
+ return valueByDef;
221
+ }
222
+ function applyInstanceDirectAssignments(assignmentSources, propRefsMap) {
223
+ for (const node of graph.getAllNodes()) {
224
+ if (node.type !== 'INSTANCE')
225
+ continue;
226
+ // Apply assignments from the instance's own kiwi data first
227
+ const ownFigmaId = nodeIdToGuid.get(node.id);
228
+ if (ownFigmaId) {
229
+ const ownAssignments = assignmentSources.get(ownFigmaId);
230
+ if (ownAssignments) {
231
+ applyPropAssignments(node.id, assignmentsToValueMap(ownAssignments), propRefsMap);
232
+ }
233
+ }
234
+ // Also apply from cloned instance sources — after population, cloned
235
+ // instances have componentId pointing to the original kiwi node
236
+ if (!node.componentId)
237
+ continue;
238
+ const sourceFigmaId = nodeIdToGuid.get(node.componentId);
239
+ if (!sourceFigmaId)
240
+ continue;
241
+ const assignments = assignmentSources.get(sourceFigmaId);
242
+ if (!assignments)
243
+ continue;
244
+ applyPropAssignments(node.id, assignmentsToValueMap(assignments), propRefsMap);
245
+ }
246
+ }
247
+ function applySymbolOverrideAssignments(propRefsMap) {
248
+ for (const [figmaId, nc] of changeMap) {
249
+ const instanceNodeId = guidToNodeId.get(figmaId);
250
+ if (!instanceNodeId)
251
+ continue;
252
+ if (graph.getNode(instanceNodeId)?.type !== 'INSTANCE')
253
+ continue;
254
+ const overrides = nc.symbolData?.symbolOverrides;
255
+ if (!overrides)
256
+ continue;
257
+ for (const ov of overrides) {
258
+ if (!ov.componentPropAssignments?.length)
259
+ continue;
260
+ const guids = ov.guidPath?.guids;
261
+ if (!guids?.length)
262
+ continue;
263
+ const targetId = resolveOverrideTarget(instanceNodeId, guids);
264
+ if (!targetId)
265
+ continue;
266
+ applyPropAssignments(targetId, assignmentsToValueMap(ov.componentPropAssignments), propRefsMap);
267
+ }
268
+ }
269
+ }
270
+ function applyComponentProperties() {
271
+ const propRefsMap = new Map();
272
+ for (const [figmaId, nc] of changeMap) {
273
+ if (nc.componentPropRefs?.length) {
274
+ propRefsMap.set(figmaId, nc.componentPropRefs);
275
+ }
276
+ }
277
+ if (propRefsMap.size === 0)
278
+ return;
279
+ const assignmentSources = new Map();
280
+ for (const [figmaId, nc] of changeMap) {
281
+ if (nc.componentPropAssignments?.length) {
282
+ assignmentSources.set(figmaId, nc.componentPropAssignments);
283
+ }
284
+ }
285
+ applyInstanceDirectAssignments(assignmentSources, propRefsMap);
286
+ applySymbolOverrideAssignments(propRefsMap);
287
+ }
288
+ function applyPropAssignments(parentId, valueByDef, propRefsMap) {
289
+ const parent = graph.getNode(parentId);
290
+ if (!parent)
291
+ return;
292
+ for (const childId of parent.childIds) {
293
+ const child = graph.getNode(childId);
294
+ if (!child?.componentId) {
295
+ applyPropAssignments(childId, valueByDef, propRefsMap);
296
+ continue;
297
+ }
298
+ const refs = findPropRefs(child.componentId, propRefsMap);
299
+ if (refs) {
300
+ for (const ref of refs) {
301
+ if (!ref.defID)
302
+ continue;
303
+ const val = valueByDef.get(guidToString(ref.defID));
304
+ if (!val)
305
+ continue;
306
+ if (ref.componentPropNodeField === 'VISIBLE' && val.boolValue !== undefined) {
307
+ graph.updateNode(childId, { visible: val.boolValue });
308
+ }
309
+ else if (ref.componentPropNodeField === 'OVERRIDDEN_SYMBOL_ID') {
310
+ const swapId = val.textValue ?? (val.guidValue ? guidToString(val.guidValue) : undefined);
311
+ if (!swapId)
312
+ continue;
313
+ const newCompId = guidToNodeId.get(swapId);
314
+ if (newCompId)
315
+ repopulateInstance(childId, newCompId);
316
+ }
317
+ }
318
+ }
319
+ applyPropAssignments(childId, valueByDef, propRefsMap);
320
+ }
321
+ }
322
+ // Apply derivedSymbolData — pre-computed sizes for the current set of
323
+ // component property values. Uses the same guidPath resolution as
324
+ // symbolOverrides.
325
+ function scaleGeometryBlobs(geom, sx, sy) {
326
+ if (sx === 1 && sy === 1)
327
+ return geom;
328
+ return geom.map((g) => {
329
+ const src = g.commandsBlob;
330
+ const scaled = new Uint8Array(src.length);
331
+ scaled.set(src);
332
+ const dv = new DataView(scaled.buffer, scaled.byteOffset, scaled.byteLength);
333
+ let o = 0;
334
+ while (o < scaled.length) {
335
+ const cmd = scaled[o++];
336
+ if (cmd === 0)
337
+ continue;
338
+ const coords = cmd === 1 || cmd === 2 ? 1 : (cmd === 4 ? 3 : -1);
339
+ if (coords < 0) {
340
+ console.warn(`scaleGeometryBlobs: unknown path command ${cmd} at offset ${o - 1}`);
341
+ break;
342
+ }
343
+ for (let i = 0; i < coords; i++) {
344
+ dv.setFloat32(o, dv.getFloat32(o, true) * sx, true);
345
+ dv.setFloat32(o + 4, dv.getFloat32(o + 4, true) * sy, true);
346
+ o += 8;
347
+ }
348
+ }
349
+ return { windingRule: g.windingRule, commandsBlob: scaled };
350
+ });
351
+ }
352
+ function resolveDsdGeometry(d, target) {
353
+ const result = {};
354
+ const fg = resolveGeometryPaths(d.fillGeometry, blobs);
355
+ const sg = resolveGeometryPaths(d.strokeGeometry, blobs);
356
+ if (fg.length > 0) {
357
+ result.fillGeometry = fg;
358
+ }
359
+ else if (d.size && target.fillGeometry.length > 0 && target.width > 0 && target.height > 0) {
360
+ result.fillGeometry = scaleGeometryBlobs(target.fillGeometry, d.size.x / target.width, d.size.y / target.height);
361
+ }
362
+ if (sg.length > 0) {
363
+ result.strokeGeometry = sg;
364
+ }
365
+ else if (d.size && target.strokeGeometry.length > 0 && target.width > 0 && target.height > 0) {
366
+ result.strokeGeometry = scaleGeometryBlobs(target.strokeGeometry, d.size.x / target.width, d.size.y / target.height);
367
+ }
368
+ return result;
369
+ }
370
+ function resolveDsdUpdates() {
371
+ const dsdModified = new Set();
372
+ const dsdSizeSet = new Set();
373
+ for (const [ncId, nc] of changeMap) {
374
+ if (nc.type !== 'INSTANCE')
375
+ continue;
376
+ const derived = nc.derivedSymbolData;
377
+ if (!derived?.length)
378
+ continue;
379
+ const nodeId = guidToNodeId.get(ncId);
380
+ if (!nodeId)
381
+ continue;
382
+ for (const d of derived) {
383
+ const guids = d.guidPath?.guids;
384
+ if (!guids?.length)
385
+ continue;
386
+ const targetId = resolveOverrideTarget(nodeId, guids);
387
+ if (!targetId)
388
+ continue;
389
+ const target = graph.getNode(targetId);
390
+ if (!target)
391
+ continue;
392
+ const updates = {};
393
+ if (d.size) {
394
+ updates.width = d.size.x;
395
+ updates.height = d.size.y;
396
+ }
397
+ if (d.transform) {
398
+ updates.x = d.transform.m02;
399
+ updates.y = d.transform.m12;
400
+ }
401
+ Object.assign(updates, resolveDsdGeometry(d, target));
402
+ if (Object.keys(updates).length > 0) {
403
+ graph.updateNode(targetId, updates);
404
+ dsdModified.add(targetId);
405
+ if (d.size)
406
+ dsdSizeSet.add(targetId);
407
+ }
408
+ }
409
+ }
410
+ return { dsdModified, dsdSizeSet };
411
+ }
412
+ // Propagate DSD changes through clone chains — each clone should match
413
+ // its source for size/position/geometry. Nodes whose size was explicitly
414
+ // set by DSD keep their own values; others inherit from their source.
415
+ function propagateDsdChanges(dsdModified, dsdSizeSet) {
416
+ if (dsdModified.size === 0)
417
+ return;
418
+ const clonesOf = buildClonesMap();
419
+ const queue = [...dsdModified];
420
+ const visited = new Set();
421
+ for (let sourceId = queue.shift(); sourceId !== undefined; sourceId = queue.shift()) {
422
+ const source = graph.getNode(sourceId);
423
+ if (!source)
424
+ continue;
425
+ const clones = clonesOf.get(sourceId);
426
+ if (!clones)
427
+ continue;
428
+ for (const cloneId of clones) {
429
+ if (visited.has(cloneId))
430
+ continue;
431
+ visited.add(cloneId);
432
+ const clone = graph.getNode(cloneId);
433
+ if (!clone)
434
+ continue;
435
+ if (!dsdSizeSet.has(cloneId)) {
436
+ const cu = {};
437
+ if (source.width !== clone.width)
438
+ cu.width = source.width;
439
+ if (source.height !== clone.height)
440
+ cu.height = source.height;
441
+ if (source.x !== clone.x)
442
+ cu.x = source.x;
443
+ if (source.y !== clone.y)
444
+ cu.y = source.y;
445
+ if (source.fillGeometry !== clone.fillGeometry)
446
+ cu.fillGeometry = copyGeometryPaths(source.fillGeometry);
447
+ if (source.strokeGeometry !== clone.strokeGeometry)
448
+ cu.strokeGeometry = copyGeometryPaths(source.strokeGeometry);
449
+ if (Object.keys(cu).length > 0)
450
+ graph.updateNode(cloneId, cu);
451
+ }
452
+ queue.push(cloneId);
453
+ }
454
+ }
455
+ }
456
+ function applyDerivedSymbolData() {
457
+ const { dsdModified, dsdSizeSet } = resolveDsdUpdates();
458
+ propagateDsdChanges(dsdModified, dsdSizeSet);
459
+ }
460
+ function applySymbolOverrides() {
461
+ const overriddenNodes = new Set();
462
+ componentIdRoot.clear();
463
+ for (const [ncId, nc] of changeMap) {
464
+ if (nc.type !== 'INSTANCE')
465
+ continue;
466
+ const sd = nc.symbolData;
467
+ if (!sd?.symbolOverrides?.length)
468
+ continue;
469
+ const nodeId = guidToNodeId.get(ncId);
470
+ if (!nodeId)
471
+ continue;
472
+ for (const ov of sd.symbolOverrides) {
473
+ const guids = ov.guidPath?.guids;
474
+ if (!guids?.length)
475
+ continue;
476
+ const targetId = resolveOverrideTarget(nodeId, guids);
477
+ if (!targetId)
478
+ continue;
479
+ overriddenNodes.add(targetId);
480
+ if (ov.overriddenSymbolID) {
481
+ const newCompId = guidToNodeId.get(guidToString(ov.overriddenSymbolID));
482
+ if (newCompId)
483
+ repopulateInstance(targetId, newCompId);
484
+ }
485
+ const { guidPath: _, overriddenSymbolID: _s, componentPropAssignments: _c, ...fields } = ov;
486
+ if (Object.keys(fields).length === 0)
487
+ continue;
488
+ const updates = convertOverrideToProps(fields);
489
+ if (Object.keys(updates).length > 0) {
490
+ graph.updateNode(targetId, updates);
491
+ }
492
+ }
493
+ }
494
+ return overriddenNodes;
495
+ }
496
+ function syncNodeProps(source, target) {
497
+ const updates = {};
498
+ if (source.text !== target.text)
499
+ updates.text = source.text;
500
+ if (source.visible !== target.visible)
501
+ updates.visible = source.visible;
502
+ if (source.opacity !== target.opacity)
503
+ updates.opacity = source.opacity;
504
+ if (source.fills !== target.fills)
505
+ updates.fills = copyFills(source.fills);
506
+ if (source.strokes !== target.strokes)
507
+ updates.strokes = copyStrokes(source.strokes);
508
+ if (source.effects !== target.effects)
509
+ updates.effects = copyEffects(source.effects);
510
+ if (source.styleRuns !== target.styleRuns)
511
+ updates.styleRuns = copyStyleRuns(source.styleRuns);
512
+ if (source.layoutGrow !== target.layoutGrow)
513
+ updates.layoutGrow = source.layoutGrow;
514
+ if (source.textAutoResize !== target.textAutoResize)
515
+ updates.textAutoResize = source.textAutoResize;
516
+ if (source.locked !== target.locked)
517
+ updates.locked = source.locked;
518
+ if (Object.keys(updates).length > 0)
519
+ graph.updateNode(target.id, updates);
520
+ }
521
+ function syncChildrenDeep(sourceId, targetId, skip) {
522
+ const src = graph.getNode(sourceId);
523
+ const tgt = graph.getNode(targetId);
524
+ if (!src || !tgt)
525
+ return;
526
+ const len = Math.min(src.childIds.length, tgt.childIds.length);
527
+ for (let i = 0; i < len; i++) {
528
+ if (skip?.has(tgt.childIds[i]))
529
+ continue;
530
+ const srcNode = graph.getNode(src.childIds[i]);
531
+ const tgtNode = graph.getNode(tgt.childIds[i]);
532
+ if (!srcNode || !tgtNode || srcNode.type !== tgtNode.type)
533
+ continue;
534
+ syncNodeProps(srcNode, tgtNode);
535
+ syncChildrenDeep(src.childIds[i], tgt.childIds[i], skip);
536
+ }
537
+ }
538
+ function buildClonesMap() {
539
+ const clonesOf = new Map();
540
+ for (const node of graph.getAllNodes()) {
541
+ if (!node.componentId)
542
+ continue;
543
+ let arr = clonesOf.get(node.componentId);
544
+ if (!arr) {
545
+ arr = [];
546
+ clonesOf.set(node.componentId, arr);
547
+ }
548
+ arr.push(node.id);
549
+ }
550
+ return clonesOf;
551
+ }
552
+ function expandSeedsToParents(seeds) {
553
+ const expandedSeeds = new Set(seeds);
554
+ for (const seedId of seeds) {
555
+ let cur = graph.getNode(seedId);
556
+ while (cur?.parentId) {
557
+ const parent = graph.getNode(cur.parentId);
558
+ if (!parent)
559
+ break;
560
+ if (parent.type === 'INSTANCE' || parent.type === 'COMPONENT') {
561
+ expandedSeeds.add(parent.id);
562
+ }
563
+ cur = parent;
564
+ }
565
+ }
566
+ return expandedSeeds;
567
+ }
568
+ function buildNeedsSyncSet(expandedSeeds, clonesOf) {
569
+ const needsSync = new Set();
570
+ const queue = [...expandedSeeds];
571
+ for (let id = queue.pop(); id !== undefined; id = queue.pop()) {
572
+ const clones = clonesOf.get(id);
573
+ if (!clones)
574
+ continue;
575
+ for (const cloneId of clones) {
576
+ if (needsSync.has(cloneId))
577
+ continue;
578
+ needsSync.add(cloneId);
579
+ queue.push(cloneId);
580
+ }
581
+ }
582
+ return needsSync;
583
+ }
584
+ function syncCloneFromSource(sourceId, source, node, seeds) {
585
+ syncNodeProps(source, node);
586
+ if (source.childIds.length !== node.childIds.length) {
587
+ const childIds = [...node.childIds];
588
+ for (const childId of childIds)
589
+ graph.deleteNode(childId);
590
+ if (source.childIds.length > 0) {
591
+ graph.populateInstanceChildren(node.id, sourceId);
592
+ }
593
+ }
594
+ else if (source.childIds.length > 0 && node.childIds.length > 0) {
595
+ syncChildrenDeep(sourceId, node.id, seeds);
596
+ }
597
+ }
598
+ function propagateOverridesTransitively(seeds) {
599
+ if (seeds.size === 0)
600
+ return;
601
+ const clonesOf = buildClonesMap();
602
+ const expandedSeeds = expandSeedsToParents(seeds);
603
+ const needsSync = buildNeedsSyncSet(expandedSeeds, clonesOf);
604
+ const visited = new Set();
605
+ const syncQueue = [...expandedSeeds];
606
+ for (let sourceId = syncQueue.shift(); sourceId !== undefined; sourceId = syncQueue.shift()) {
607
+ const clones = clonesOf.get(sourceId);
608
+ if (!clones)
609
+ continue;
610
+ const source = graph.getNode(sourceId);
611
+ if (!source)
612
+ continue;
613
+ for (const cloneId of clones) {
614
+ if (!needsSync.has(cloneId) || visited.has(cloneId))
615
+ continue;
616
+ visited.add(cloneId);
617
+ const node = graph.getNode(cloneId);
618
+ if (!node)
619
+ continue;
620
+ // Don't overwrite nodes directly targeted by symbolOverrides
621
+ if (seeds.has(cloneId)) {
622
+ syncQueue.push(cloneId);
623
+ continue;
624
+ }
625
+ syncCloneFromSource(sourceId, source, node, seeds);
626
+ syncQueue.push(cloneId);
627
+ }
628
+ }
629
+ }
630
+ // Order matters:
631
+ // 1. symbolOverrides — set property values and swap instances
632
+ // 2. transitive sync — propagate overrides through clone chains (may
633
+ // repopulate INSTANCE children, wiping any earlier property changes)
634
+ // 3. componentProperties — toggle visibility / swap via prop assignments
635
+ // (must run AFTER sync so repopulated children aren't lost)
636
+ // 4. derivedSymbolData — apply Figma's pre-computed sizes last
637
+ const overriddenNodes = applySymbolOverrides();
638
+ propagateOverridesTransitively(overriddenNodes);
639
+ applyComponentProperties();
640
+ // DSD resolution runs AFTER overrides so guidPaths can reach children
641
+ // of instance-swapped nodes (repopulateInstance replaces children).
642
+ applyDerivedSymbolData();
643
+ }
644
+ //# sourceMappingURL=instance-overrides.js.map