@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,114 @@
1
+ /**
2
+ * Tailwind CSS v4 value resolvers.
3
+ *
4
+ * Converts design token values (px, hex colors, font sizes, etc.) into
5
+ * Tailwind v4 utility class fragments.
6
+ *
7
+ * Tailwind v4 spacing is dynamic: `calc(var(--spacing) * N)` where
8
+ * `--spacing` defaults to `0.25rem` (4px). Any integer works as a class
9
+ * suffix, so we just divide by 4 instead of maintaining a lookup table.
10
+ *
11
+ * Architecture inspired by seanchas116/figma-to-tailwind (MIT)
12
+ * https://github.com/seanchas116/figma-to-tailwind
13
+ */
14
+
15
+ const FONT_SIZE_TO_TW = new Map<number, string>([
16
+ [12, 'xs'],
17
+ [14, 'sm'],
18
+ [16, 'base'],
19
+ [18, 'lg'],
20
+ [20, 'xl'],
21
+ [24, '2xl'],
22
+ [30, '3xl'],
23
+ [36, '4xl'],
24
+ [48, '5xl'],
25
+ [60, '6xl'],
26
+ [72, '7xl'],
27
+ [96, '8xl'],
28
+ [128, '9xl']
29
+ ])
30
+
31
+ const OPACITY_TO_TW = new Map<number, string>([
32
+ [0, '0'],
33
+ [5, '5'],
34
+ [10, '10'],
35
+ [15, '15'],
36
+ [20, '20'],
37
+ [25, '25'],
38
+ [30, '30'],
39
+ [35, '35'],
40
+ [40, '40'],
41
+ [45, '45'],
42
+ [50, '50'],
43
+ [55, '55'],
44
+ [60, '60'],
45
+ [65, '65'],
46
+ [70, '70'],
47
+ [75, '75'],
48
+ [80, '80'],
49
+ [85, '85'],
50
+ [90, '90'],
51
+ [95, '95'],
52
+ [100, '100']
53
+ ])
54
+
55
+ const FONT_WEIGHT_TO_TW = new Map<number, string>([
56
+ [100, 'thin'],
57
+ [200, 'extralight'],
58
+ [300, 'light'],
59
+ [400, 'normal'],
60
+ [500, 'medium'],
61
+ [600, 'semibold'],
62
+ [700, 'bold'],
63
+ [800, 'extrabold'],
64
+ [900, 'black']
65
+ ])
66
+
67
+ const RADIUS_PX_TO_TW = new Map<number, string>([
68
+ [2, 'sm'],
69
+ [4, 'DEFAULT'],
70
+ [6, 'md'],
71
+ [8, 'lg'],
72
+ [12, 'xl'],
73
+ [16, '2xl'],
74
+ [24, '3xl'],
75
+ [9999, 'full']
76
+ ])
77
+
78
+ export function pxToSpacing(px: number): string {
79
+ if (px === 0) return '0'
80
+ if (px === 1) return 'px'
81
+ const n = px / 4
82
+ if (Number.isInteger(n)) return String(n)
83
+ if (n * 2 === Math.round(n * 2)) return String(n)
84
+ return `[${px}px]`
85
+ }
86
+
87
+ export function colorToTwClass(hex: string): string {
88
+ const lower = hex.toLowerCase()
89
+ if (lower === '#ffffff' || lower === '#fff') return 'white'
90
+ if (lower === '#000000' || lower === '#000') return 'black'
91
+ if (lower === '#00000000') return 'transparent'
92
+ return `[${hex}]`
93
+ }
94
+
95
+ export function fontSizeToTw(px: number): string {
96
+ return FONT_SIZE_TO_TW.get(px) ?? `[${px}px]`
97
+ }
98
+
99
+ export function fontWeightToTw(n: number): string {
100
+ return FONT_WEIGHT_TO_TW.get(n) ?? `[${n}]`
101
+ }
102
+
103
+ export function borderRadiusToTw(px: number): string {
104
+ if (px >= 9999) return 'full'
105
+ const name = RADIUS_PX_TO_TW.get(px)
106
+ if (name === 'DEFAULT') return ''
107
+ if (name) return name
108
+ return `[${px}px]`
109
+ }
110
+
111
+ export function opacityToTw(n: number): string {
112
+ const pct = Math.round(n * 100)
113
+ return OPACITY_TO_TW.get(pct) ?? `[${n}]`
114
+ }
@@ -0,0 +1,137 @@
1
+ export interface TreeNode {
2
+ type: string
3
+ props: Record<string, unknown>
4
+ children: (TreeNode | string)[]
5
+ }
6
+
7
+ export function isTreeNode(x: unknown): x is TreeNode {
8
+ if (x === null || typeof x !== 'object') return false
9
+ return 'type' in x && typeof x.type === 'string' && 'props' in x && 'children' in x && Array.isArray(x.children)
10
+ }
11
+
12
+ interface ReactElement {
13
+ type: unknown
14
+ props: Record<string, unknown>
15
+ }
16
+
17
+ function isReactElement(x: unknown): x is ReactElement {
18
+ return x !== null && typeof x === 'object' && 'type' in x && 'props' in x
19
+ }
20
+
21
+ /**
22
+ * Resolve any element-like value (ReactElement, TreeNode, function component)
23
+ * into a TreeNode. Handles recursive function components up to depth 100.
24
+ */
25
+ export function resolveToTree(element: unknown, depth = 0): TreeNode | null {
26
+ if (depth > 100) throw new Error('Component resolution depth exceeded')
27
+ if (element == null) return null
28
+ if (isTreeNode(element)) return element
29
+ if (!isReactElement(element)) return null
30
+
31
+ if (typeof element.type === 'function') {
32
+ return resolveToTree(
33
+ (element.type as (p: Record<string, unknown>) => unknown)(element.props),
34
+ depth + 1
35
+ )
36
+ }
37
+
38
+ if (typeof element.type === 'string') {
39
+ const children: (TreeNode | string)[] = []
40
+ const elChildren = element.props.children
41
+ if (elChildren != null) {
42
+ const childArray = Array.isArray(elChildren) ? elChildren : [elChildren]
43
+ for (const child of childArray.flat()) {
44
+ if (child == null) continue
45
+ if (typeof child === 'string' || typeof child === 'number') {
46
+ children.push(String(child))
47
+ } else {
48
+ const resolved = resolveToTree(child, depth + 1)
49
+ if (resolved) children.push(resolved)
50
+ }
51
+ }
52
+ }
53
+ const { children: _, ...props } = element.props
54
+ return { type: element.type, props, children }
55
+ }
56
+
57
+ return null
58
+ }
59
+
60
+ function resolveChild(child: unknown): TreeNode | string | null {
61
+ if (child == null) return null
62
+ if (typeof child === 'string' || typeof child === 'number') return String(child)
63
+ return resolveToTree(child)
64
+ }
65
+
66
+ export function node(type: string, props: { children?: unknown; [key: string]: unknown }): TreeNode {
67
+ const { children, ...rest } = props
68
+ const processed = [children]
69
+ .flat(Infinity)
70
+ .map(resolveChild)
71
+ .filter((c): c is TreeNode | string => c !== null)
72
+ return { type, props: rest, children: processed }
73
+ }
74
+
75
+ export type StyleProps = {
76
+ flex?: 'row' | 'col' | 'column'
77
+ gap?: number
78
+ wrap?: boolean
79
+ rowGap?: number
80
+ justify?: 'start' | 'end' | 'center' | 'between'
81
+ items?: 'start' | 'end' | 'center' | 'stretch'
82
+ grow?: number
83
+
84
+ w?: number | 'fill' | 'hug'
85
+ h?: number | 'fill' | 'hug'
86
+ minW?: number
87
+ maxW?: number
88
+ minH?: number
89
+ maxH?: number
90
+
91
+ x?: number
92
+ y?: number
93
+
94
+ p?: number
95
+ px?: number
96
+ py?: number
97
+ pt?: number
98
+ pr?: number
99
+ pb?: number
100
+ pl?: number
101
+
102
+ bg?: string
103
+ fill?: string
104
+ stroke?: string
105
+ strokeWidth?: number
106
+ strokeAlign?: 'inside' | 'outside' | 'center'
107
+ rounded?: number
108
+ roundedTL?: number
109
+ roundedTR?: number
110
+ roundedBL?: number
111
+ roundedBR?: number
112
+ cornerSmoothing?: number
113
+ opacity?: number
114
+ blendMode?: string
115
+ rotate?: number
116
+ overflow?: 'hidden' | 'visible'
117
+ shadow?: string
118
+ blur?: number
119
+
120
+ size?: number
121
+ fontSize?: number
122
+ font?: string
123
+ fontFamily?: string
124
+ weight?: number | 'bold' | 'medium' | 'normal'
125
+ fontWeight?: number | 'bold' | 'medium' | 'normal'
126
+ color?: string
127
+ textAlign?: 'left' | 'center' | 'right' | 'justified'
128
+ textAutoResize?: 'none' | 'width' | 'height'
129
+ }
130
+
131
+ export type BaseProps = StyleProps & {
132
+ name?: string
133
+ key?: string | number
134
+ children?: unknown
135
+ }
136
+
137
+ export type TextProps = BaseProps
@@ -0,0 +1,139 @@
1
+ import type { SkiaRenderer } from './renderer'
2
+ import type { SceneGraph } from './scene-graph'
3
+ import type { CanvasKit, Canvas } from 'canvaskit-wasm'
4
+
5
+ export type ExportFormat = 'PNG' | 'JPG' | 'WEBP' | 'SVG'
6
+
7
+ interface RenderOptions {
8
+ scale: number
9
+ format: ExportFormat
10
+ quality?: number
11
+ }
12
+
13
+ export function computeContentBounds(
14
+ graph: SceneGraph,
15
+ nodeIds: string[]
16
+ ): { minX: number; minY: number; maxX: number; maxY: number } | null {
17
+ let minX = Infinity,
18
+ minY = Infinity,
19
+ maxX = -Infinity,
20
+ maxY = -Infinity
21
+
22
+ for (const id of nodeIds) {
23
+ const node = graph.getNode(id)
24
+ if (!node || !node.visible) continue
25
+ const abs = graph.getAbsolutePosition(id)
26
+ minX = Math.min(minX, abs.x)
27
+ minY = Math.min(minY, abs.y)
28
+ maxX = Math.max(maxX, abs.x + node.width)
29
+ maxY = Math.max(maxY, abs.y + node.height)
30
+ }
31
+
32
+ if (!isFinite(minX)) return null
33
+ return { minX, minY, maxX, maxY }
34
+ }
35
+
36
+ function ckImageFormat(ck: CanvasKit, format: ExportFormat) {
37
+ switch (format) {
38
+ case 'JPG':
39
+ return ck.ImageFormat.JPEG
40
+ case 'WEBP':
41
+ return ck.ImageFormat.WEBP
42
+ default:
43
+ return ck.ImageFormat.PNG
44
+ }
45
+ }
46
+
47
+ function renderToSurface(
48
+ ck: CanvasKit,
49
+ renderer: SkiaRenderer,
50
+ graph: SceneGraph,
51
+ pageId: string,
52
+ width: number,
53
+ height: number,
54
+ format: ExportFormat,
55
+ quality: number,
56
+ setup: (canvas: Canvas) => void
57
+ ): Uint8Array | null {
58
+ const surface = ck.MakeSurface(width, height)
59
+ if (!surface) return null
60
+
61
+ try {
62
+ const canvas = surface.getCanvas()
63
+ setup(canvas)
64
+ renderer.renderSceneToCanvas(canvas, graph, pageId)
65
+ surface.flush()
66
+ const image = surface.makeImageSnapshot()
67
+ const encoded = image.encodeToBytes(ckImageFormat(ck, format), quality)
68
+ image.delete()
69
+ return encoded ? new Uint8Array(encoded) : null
70
+ } finally {
71
+ surface.delete()
72
+ }
73
+ }
74
+
75
+ export function renderNodesToImage(
76
+ ck: CanvasKit,
77
+ renderer: SkiaRenderer,
78
+ graph: SceneGraph,
79
+ pageId: string,
80
+ nodeIds: string[],
81
+ options: RenderOptions
82
+ ): Uint8Array | null {
83
+ const bounds = computeContentBounds(graph, nodeIds)
84
+ if (!bounds) return null
85
+
86
+ const contentW = bounds.maxX - bounds.minX
87
+ const contentH = bounds.maxY - bounds.minY
88
+ if (contentW <= 0 || contentH <= 0) return null
89
+
90
+ const pixelW = Math.ceil(contentW * options.scale)
91
+ const pixelH = Math.ceil(contentH * options.scale)
92
+ if (pixelW <= 0 || pixelH <= 0) return null
93
+
94
+ const quality = options.quality ?? (options.format === 'PNG' ? 100 : 90)
95
+ return renderToSurface(
96
+ ck,
97
+ renderer,
98
+ graph,
99
+ pageId,
100
+ pixelW,
101
+ pixelH,
102
+ options.format,
103
+ quality,
104
+ (canvas) => {
105
+ canvas.clear(ck.TRANSPARENT)
106
+ canvas.scale(options.scale, options.scale)
107
+ canvas.translate(-bounds.minX, -bounds.minY)
108
+ }
109
+ )
110
+ }
111
+
112
+ export function renderThumbnail(
113
+ ck: CanvasKit,
114
+ renderer: SkiaRenderer,
115
+ graph: SceneGraph,
116
+ pageId: string,
117
+ width: number,
118
+ height: number
119
+ ): Uint8Array | null {
120
+ const page = graph.getNode(pageId)
121
+ if (!page || page.childIds.length === 0) return null
122
+
123
+ const bounds = computeContentBounds(graph, page.childIds)
124
+ if (!bounds) return null
125
+
126
+ const contentW = bounds.maxX - bounds.minX
127
+ const contentH = bounds.maxY - bounds.minY
128
+ if (contentW <= 0 || contentH <= 0) return null
129
+
130
+ const scale = Math.min(width / contentW, height / contentH, 2)
131
+
132
+ return renderToSurface(ck, renderer, graph, pageId, width, height, 'PNG', 100, (canvas) => {
133
+ canvas.clear(ck.Color4f(renderer.pageColor.r, renderer.pageColor.g, renderer.pageColor.b, 1))
134
+ const offsetX = (width - contentW * scale) / 2 - bounds.minX * scale
135
+ const offsetY = (height - contentH * scale) / 2 - bounds.minY * scale
136
+ canvas.translate(offsetX, offsetY)
137
+ canvas.scale(scale, scale)
138
+ })
139
+ }
@@ -0,0 +1,64 @@
1
+ import type { SceneNode } from '../scene-graph'
2
+ import type { Canvas, ImageFilter, MaskFilter } from 'canvaskit-wasm'
3
+ import type { SkiaRenderer } from './renderer'
4
+
5
+ export function getCachedDropShadow(
6
+ r: SkiaRenderer,
7
+ dx: number,
8
+ dy: number,
9
+ sigma: number,
10
+ color: Float32Array
11
+ ): ImageFilter {
12
+ const key = `ds:${dx},${dy},${sigma},${color[0]},${color[1]},${color[2]},${color[3]}`
13
+ let filter = r.imageFilterCache.get(key)
14
+ if (!filter) {
15
+ filter = r.ck.ImageFilter.MakeDropShadowOnly(dx, dy, sigma, sigma, color, null)
16
+ r.imageFilterCache.set(key, filter)
17
+ }
18
+ return filter
19
+ }
20
+
21
+ export function getCachedBlur(r: SkiaRenderer, sigma: number): ImageFilter {
22
+ const key = `blur:${sigma}`
23
+ let filter = r.imageFilterCache.get(key)
24
+ if (!filter) {
25
+ filter = r.ck.ImageFilter.MakeBlur(sigma, sigma, r.ck.TileMode.Clamp, null)
26
+ r.imageFilterCache.set(key, filter)
27
+ }
28
+ return filter
29
+ }
30
+
31
+ export function getCachedDecalBlur(r: SkiaRenderer, sigma: number): ImageFilter {
32
+ const key = `dblur:${sigma}`
33
+ let filter = r.imageFilterCache.get(key)
34
+ if (!filter) {
35
+ filter = r.ck.ImageFilter.MakeBlur(sigma, sigma, r.ck.TileMode.Decal, null)
36
+ r.imageFilterCache.set(key, filter)
37
+ }
38
+ return filter
39
+ }
40
+
41
+ export function getCachedMaskBlur(r: SkiaRenderer, sigma: number): MaskFilter {
42
+ let filter = r.maskFilterCache.get(sigma)
43
+ if (!filter) {
44
+ filter = r.ck.MaskFilter.MakeBlur(r.ck.BlurStyle.Normal, sigma, true)
45
+ r.maskFilterCache.set(sigma, filter)
46
+ }
47
+ return filter
48
+ }
49
+
50
+ export function applyClippedBlur(
51
+ r: SkiaRenderer,
52
+ canvas: Canvas,
53
+ node: SceneNode,
54
+ rect: Float32Array,
55
+ hasRadius: boolean,
56
+ sigma: number
57
+ ): void {
58
+ canvas.save()
59
+ r.clipNodeShape(canvas, node, rect, hasRadius)
60
+ r.effectLayerPaint.setImageFilter(r.getCachedBlur(sigma))
61
+ canvas.saveLayer(r.effectLayerPaint)
62
+ canvas.restore()
63
+ canvas.restore()
64
+ }
@@ -0,0 +1,248 @@
1
+ import type { SceneNode, SceneGraph, Fill } from '../scene-graph'
2
+ import type { Canvas, Paint } from 'canvaskit-wasm'
3
+ import type { SkiaRenderer } from './renderer'
4
+
5
+ export function drawNodeFill(
6
+ r: SkiaRenderer,
7
+ canvas: Canvas,
8
+ node: SceneNode,
9
+ rect: Float32Array,
10
+ hasRadius: boolean
11
+ ): void {
12
+ switch (node.type) {
13
+ case 'VECTOR': {
14
+ const fg = r.getFillGeometry(node)
15
+ if (fg) {
16
+ for (const p of fg) canvas.drawPath(p, r.fillPaint)
17
+ } else {
18
+ const vps = r.getVectorPaths(node)
19
+ if (vps) {
20
+ for (const vp of vps) canvas.drawPath(vp, r.fillPaint)
21
+ }
22
+ }
23
+ break
24
+ }
25
+ case 'ELLIPSE':
26
+ if (node.arcData) {
27
+ r.drawArc(canvas, node, r.fillPaint)
28
+ } else {
29
+ canvas.drawOval(rect, r.fillPaint)
30
+ }
31
+ break
32
+ case 'TEXT':
33
+ r.renderText(canvas, node)
34
+ break
35
+ case 'LINE':
36
+ canvas.drawLine(0, 0, node.width, node.height, r.fillPaint)
37
+ break
38
+ case 'POLYGON':
39
+ case 'STAR': {
40
+ const path = r.makePolygonPath(node)
41
+ canvas.drawPath(path, r.fillPaint)
42
+ path.delete()
43
+ break
44
+ }
45
+ default:
46
+ if (hasRadius) {
47
+ canvas.drawRRect(r.makeRRect(node), r.fillPaint)
48
+ } else {
49
+ canvas.drawRect(rect, r.fillPaint)
50
+ }
51
+ }
52
+ }
53
+
54
+ export function applyFill(
55
+ r: SkiaRenderer,
56
+ fill: Fill,
57
+ node: SceneNode,
58
+ graph: SceneGraph,
59
+ fillIndex = 0
60
+ ): boolean {
61
+ r.fillPaint.setShader(null)
62
+
63
+ if (fill.type === 'SOLID') {
64
+ const c = r.resolveFillColor(fill, fillIndex, node, graph)
65
+ r.fillPaint.setColor(r.ck.Color4f(c.r, c.g, c.b, c.a))
66
+ return true
67
+ }
68
+
69
+ if (fill.type.startsWith('GRADIENT') && fill.gradientStops && fill.gradientTransform) {
70
+ r.applyGradientFill(fill, node)
71
+ return true
72
+ }
73
+
74
+ if (fill.type === 'IMAGE' && fill.imageHash) {
75
+ return r.applyImageFill(fill, node, graph)
76
+ }
77
+
78
+ return false
79
+ }
80
+
81
+ export function applyGradientFill(r: SkiaRenderer, fill: Fill, node: SceneNode): void {
82
+ const stops = fill.gradientStops
83
+ const t = fill.gradientTransform
84
+ if (!stops || !t) return
85
+ const colors = stops.map((s) => r.ck.Color4f(s.color.r, s.color.g, s.color.b, s.color.a))
86
+ const positions = stops.map((s) => s.position)
87
+
88
+ const w = node.width
89
+ const h = node.height
90
+
91
+ if (fill.type === 'GRADIENT_LINEAR') {
92
+ const startX = t.m02 * w
93
+ const startY = t.m12 * h
94
+ const endX = (t.m00 + t.m02) * w
95
+ const endY = (t.m10 + t.m12) * h
96
+ const shader = r.ck.Shader.MakeLinearGradient(
97
+ [startX, startY],
98
+ [endX, endY],
99
+ colors,
100
+ positions,
101
+ r.ck.TileMode.Clamp
102
+ )
103
+ r.fillPaint.setShader(shader)
104
+ } else if (fill.type === 'GRADIENT_RADIAL') {
105
+ const cx = t.m02 * w
106
+ const cy = t.m12 * h
107
+ const radius = Math.sqrt(t.m00 * t.m00 + t.m10 * t.m10) * Math.max(w, h)
108
+ const shader = r.ck.Shader.MakeRadialGradient(
109
+ [cx, cy],
110
+ radius,
111
+ colors,
112
+ positions,
113
+ r.ck.TileMode.Clamp
114
+ )
115
+ r.fillPaint.setShader(shader)
116
+ } else if (fill.type === 'GRADIENT_ANGULAR') {
117
+ const cx = t.m02 * w
118
+ const cy = t.m12 * h
119
+ const shader = r.ck.Shader.MakeSweepGradient(
120
+ cx,
121
+ cy,
122
+ colors,
123
+ positions,
124
+ r.ck.TileMode.Clamp,
125
+ undefined
126
+ )
127
+ r.fillPaint.setShader(shader)
128
+ } else if (fill.type === 'GRADIENT_DIAMOND') {
129
+ const cx = t.m02 * w
130
+ const cy = t.m12 * h
131
+ const radius = Math.sqrt(t.m00 * t.m00 + t.m10 * t.m10) * Math.max(w, h)
132
+ const shader = r.ck.Shader.MakeRadialGradient(
133
+ [cx, cy],
134
+ radius,
135
+ colors,
136
+ positions,
137
+ r.ck.TileMode.Clamp
138
+ )
139
+ r.fillPaint.setShader(shader)
140
+ }
141
+ }
142
+
143
+ export function applyImageFill(
144
+ r: SkiaRenderer,
145
+ fill: Fill,
146
+ node: SceneNode,
147
+ graph: SceneGraph
148
+ ): boolean {
149
+ const hash = fill.imageHash
150
+ if (!hash) return false
151
+ let img = r.imageCache.get(hash)
152
+ if (!img) {
153
+ const data = graph.images.get(hash)
154
+ if (!data) return false
155
+ img = r.ck.MakeImageFromEncoded(data) ?? undefined
156
+ if (img) r.imageCache.set(hash, img)
157
+ else return false
158
+ }
159
+
160
+ const imgW = img.width()
161
+ const imgH = img.height()
162
+ const scaleMode = fill.imageScaleMode ?? 'FILL'
163
+
164
+ if (scaleMode === 'TILE') {
165
+ const shader = img.makeShaderCubic(
166
+ r.ck.TileMode.Repeat,
167
+ r.ck.TileMode.Repeat,
168
+ 1 / 3,
169
+ 1 / 3
170
+ )
171
+ r.fillPaint.setShader(shader)
172
+ return true
173
+ }
174
+
175
+ let sx: number, sy: number, sw: number, sh: number
176
+ if (scaleMode === 'CROP' && fill.imageTransform) {
177
+ const t = fill.imageTransform
178
+ sx = t.m02 * imgW
179
+ sy = t.m12 * imgH
180
+ sw = t.m00 * imgW
181
+ sh = t.m11 * imgH
182
+ } else if (scaleMode === 'FIT') {
183
+ const scale = Math.min(node.width / imgW, node.height / imgH)
184
+ sw = imgW
185
+ sh = imgH
186
+ sx = -(node.width / scale - imgW) / 2
187
+ sy = -(node.height / scale - imgH) / 2
188
+ } else {
189
+ const scale = Math.max(node.width / imgW, node.height / imgH)
190
+ sw = node.width / scale
191
+ sh = node.height / scale
192
+ sx = (imgW - sw) / 2
193
+ sy = (imgH - sh) / 2
194
+ }
195
+
196
+ const shader = img.makeShaderCubic(
197
+ r.ck.TileMode.Clamp,
198
+ r.ck.TileMode.Clamp,
199
+ 1 / 3,
200
+ 1 / 3,
201
+ r.ck.Matrix.multiply(
202
+ r.ck.Matrix.scaled(node.width / sw, node.height / sh),
203
+ r.ck.Matrix.translated(-sx, -sy)
204
+ )
205
+ )
206
+ r.fillPaint.setShader(shader)
207
+ return true
208
+ }
209
+
210
+ export function drawArc(r: SkiaRenderer, canvas: Canvas, node: SceneNode, paint: Paint): void {
211
+ const arc = node.arcData
212
+ if (!arc) return
213
+ const cx = node.width / 2
214
+ const cy = node.height / 2
215
+ const rx = node.width / 2
216
+ const ry = node.height / 2
217
+ const innerRx = rx * arc.innerRadius
218
+ const innerRy = ry * arc.innerRadius
219
+
220
+ const startDeg = arc.startingAngle * (180 / Math.PI)
221
+ const endDeg = arc.endingAngle * (180 / Math.PI)
222
+ const sweepDeg = endDeg - startDeg
223
+
224
+ const path = new r.ck.Path()
225
+ const oval = r.ck.LTRBRect(0, 0, node.width, node.height)
226
+
227
+ if (arc.innerRadius > 0) {
228
+ path.addArc(oval, startDeg, sweepDeg)
229
+ const innerOval = r.ck.LTRBRect(cx - innerRx, cy - innerRy, cx + innerRx, cy + innerRy)
230
+ const innerPath = new r.ck.Path()
231
+ innerPath.addArc(innerOval, startDeg + sweepDeg, -sweepDeg)
232
+ path.addPath(innerPath)
233
+ path.close()
234
+ innerPath.delete()
235
+ } else {
236
+ const isFullCircle = Math.abs(sweepDeg) >= 359.99
237
+ if (isFullCircle) {
238
+ path.addOval(oval)
239
+ } else {
240
+ path.moveTo(cx, cy)
241
+ path.addArc(oval, startDeg, sweepDeg)
242
+ path.close()
243
+ }
244
+ }
245
+
246
+ canvas.drawPath(path, paint)
247
+ path.delete()
248
+ }
@@ -0,0 +1 @@
1
+ export { SkiaRenderer, type RenderOverlays } from './renderer'