ranger-compiler 3.5.0 → 3.5.2

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 (338) hide show
  1. package/CHANGELOG.md +1160 -19
  2. package/LICENSE +3 -1
  3. package/README.md +124 -29
  4. package/dist/Lang.rgr +1188 -290
  5. package/dist/api.d.ts +2343 -879
  6. package/dist/api.js +79924 -56922
  7. package/dist/lib/JSON.rgr +102 -91
  8. package/dist/lib/Shell.rgr +4 -4
  9. package/dist/lib/apple/AppleToolchain.rgr +4 -4
  10. package/dist/lib/apple/README.md +5 -4
  11. package/dist/lib/apple/apple_test.rgr +1 -1
  12. package/dist/lib/core/README.md +1 -1
  13. package/dist/lib/evg/EVG.rgr +12 -0
  14. package/dist/lib/evg/EVGA11yFromTree.rgr +302 -0
  15. package/dist/lib/evg/EVGA11yTree.rgr +894 -0
  16. package/dist/lib/evg/EVGBox.rgr +267 -0
  17. package/dist/lib/evg/EVGBoxShorthandTest.rgr +220 -0
  18. package/dist/lib/evg/EVGCodepoint.rgr +316 -0
  19. package/dist/lib/evg/EVGColor.rgr +700 -0
  20. package/dist/lib/evg/EVGCommands.rgr +177 -0
  21. package/dist/lib/evg/EVGComponent.rgr +331 -0
  22. package/dist/lib/evg/EVGComponentTest.rgr +387 -0
  23. package/dist/lib/evg/EVGConnector.rgr +541 -0
  24. package/dist/lib/evg/EVGConnectorTest.rgr +306 -0
  25. package/dist/lib/evg/EVGDisplayList.rgr +4186 -0
  26. package/dist/lib/evg/EVGEasing.rgr +370 -0
  27. package/dist/lib/evg/EVGEffectTest.rgr +253 -0
  28. package/dist/lib/evg/EVGElement.rgr +4914 -0
  29. package/dist/lib/evg/EVGFixedTest.rgr +289 -0
  30. package/dist/lib/evg/EVGFlexRulesTest.rgr +317 -0
  31. package/dist/lib/evg/EVGFlexWrapTest.rgr +246 -0
  32. package/dist/lib/evg/EVGFling.rgr +244 -0
  33. package/dist/lib/evg/EVGFocus.rgr +400 -0
  34. package/dist/lib/evg/EVGFocusTest.rgr +399 -0
  35. package/dist/lib/evg/EVGGradient.rgr +322 -0
  36. package/dist/lib/evg/EVGGrapheme.rgr +190 -0
  37. package/dist/lib/evg/EVGGrid.rgr +975 -0
  38. package/dist/lib/evg/EVGHitTest.rgr +208 -0
  39. package/dist/lib/evg/EVGHoles.rgr +294 -0
  40. package/dist/lib/evg/EVGHostMeasurerTest.rgr +281 -0
  41. package/dist/lib/evg/EVGHostTextMeasurer.rgr +331 -0
  42. package/dist/lib/evg/EVGHostTree.rgr +834 -0
  43. package/dist/lib/evg/EVGHostTreeTest.rgr +447 -0
  44. package/dist/lib/evg/EVGImageDecode.rgr +117 -0
  45. package/dist/lib/evg/EVGImageMeasurer.rgr +86 -0
  46. package/dist/lib/evg/EVGInspect.rgr +883 -0
  47. package/dist/lib/evg/EVGInvalidateTest.rgr +432 -0
  48. package/dist/lib/evg/EVGJsonTest.rgr +535 -0
  49. package/dist/lib/evg/EVGLayout.rgr +4220 -0
  50. package/dist/lib/evg/EVGMeasure.rgr +1267 -0
  51. package/dist/lib/evg/EVGOverlayTest.rgr +626 -0
  52. package/dist/lib/evg/EVGPatch.rgr +1721 -0
  53. package/dist/lib/evg/EVGPatchTest.rgr +692 -0
  54. package/dist/lib/evg/EVGPopoverTest.rgr +395 -0
  55. package/dist/lib/evg/EVGReconcile.rgr +226 -0
  56. package/dist/lib/evg/EVGReconcileTest.rgr +421 -0
  57. package/dist/lib/evg/EVGReject.rgr +126 -0
  58. package/dist/lib/evg/EVGRelayoutTest.rgr +375 -0
  59. package/dist/lib/evg/EVGRtlLayoutTest.rgr +319 -0
  60. package/dist/lib/evg/EVGRuler.rgr +232 -0
  61. package/dist/lib/evg/EVGRulerTest.rgr +172 -0
  62. package/dist/lib/evg/EVGSelectChrome.rgr +178 -0
  63. package/dist/lib/evg/EVGStyleCacheTest.rgr +419 -0
  64. package/dist/lib/evg/EVGStyleSheet.rgr +2148 -0
  65. package/dist/lib/evg/EVGStyleStateTest.rgr +407 -0
  66. package/dist/lib/evg/EVGStyleVarTest.rgr +471 -0
  67. package/dist/lib/evg/EVGText.rgr +105 -0
  68. package/dist/lib/evg/EVGTextEngine.rgr +536 -0
  69. package/dist/lib/evg/EVGTextMeasurer.rgr +720 -0
  70. package/dist/lib/evg/EVGTimingTest.rgr +1417 -0
  71. package/dist/lib/evg/EVGToolbar.rgr +1369 -0
  72. package/dist/lib/evg/EVGTransition.rgr +728 -0
  73. package/dist/lib/evg/EVGTreeJson.rgr +721 -0
  74. package/dist/lib/evg/EVGUnit.rgr +554 -0
  75. package/dist/lib/evg/EVGViewportUnitTest.rgr +236 -0
  76. package/dist/lib/evg/EvgApp.rgr +189 -0
  77. package/dist/lib/evg/EvgBitmapTracer.rgr +4277 -0
  78. package/dist/lib/evg/EvgBitmapTracerTest.rgr +2119 -0
  79. package/dist/lib/evg/EvgHost.rgr +451 -0
  80. package/dist/lib/evg/EvgTest.rgr +91 -0
  81. package/dist/lib/evg/EvgTraceColor.rgr +236 -0
  82. package/dist/lib/evg/EvgTraceCurve.rgr +648 -0
  83. package/dist/lib/evg/EvgTraceFit.rgr +767 -0
  84. package/dist/lib/evg/EvgTracePath.rgr +435 -0
  85. package/dist/lib/evg/EvgTraceTypes.rgr +559 -0
  86. package/dist/lib/evg/EvgViewport.rgr +313 -0
  87. package/dist/lib/evg/FxDemoDoc.rgr +185 -0
  88. package/dist/lib/evg/HOSTS.md +227 -0
  89. package/dist/lib/evg/ISSUES.md +835 -0
  90. package/dist/lib/evg/PLAN_ACCESSIBILITY.md +650 -0
  91. package/dist/lib/evg/PLAN_CSS_LAYOUT_AND_FONTS.md +1124 -0
  92. package/dist/lib/evg/PLAN_EFFECTS.md +431 -0
  93. package/dist/lib/evg/PLAN_EVG.md +518 -0
  94. package/dist/lib/evg/PLAN_EVG_RENDERER.md +1674 -0
  95. package/dist/lib/evg/PLAN_INSPECTOR.md +788 -0
  96. package/dist/lib/evg/PLAN_LINKS_AND_FORMS.md +157 -0
  97. package/dist/lib/evg/PLAN_NATIVE_HOSTS.md +671 -0
  98. package/dist/lib/evg/PLAN_VECTOR_IR.md +664 -0
  99. package/dist/lib/evg/PLAN_VIEW_TRANSFORM.md +322 -0
  100. package/dist/lib/evg/PathBuilder.rgr +333 -0
  101. package/dist/lib/evg/README.md +1236 -0
  102. package/dist/lib/evg/SPEC.md +1252 -0
  103. package/dist/lib/evg/SVGPathParser.rgr +1199 -0
  104. package/dist/lib/evg/SvgParser.rgr +1736 -0
  105. package/dist/lib/evg/TODO_EVG_RENDERER.md +595 -0
  106. package/dist/lib/evg/VectorShapes.rgr +331 -0
  107. package/dist/lib/evg/VectorStroke.rgr +107 -0
  108. package/dist/lib/evg/VectorViewBox.rgr +380 -0
  109. package/dist/lib/evg/agent/README.md +290 -0
  110. package/dist/lib/evg/agent/evg_agent.rgr +899 -0
  111. package/dist/lib/evg/agent/fixtures/broken.evg.json +7 -0
  112. package/dist/lib/evg/agent/fixtures/card.evg.json +9 -0
  113. package/dist/lib/evg/agent/fixtures/connector.css +63 -0
  114. package/dist/lib/evg/agent/fixtures/connector.evg.json +14 -0
  115. package/dist/lib/evg/agent/fixtures/drawn.evg.json +129 -0
  116. package/dist/lib/evg/agent/fixtures/gradient.evg.json +4 -0
  117. package/dist/lib/evg/agent/fixtures/popover.css +99 -0
  118. package/dist/lib/evg/agent/fixtures/popover.evg.json +30 -0
  119. package/dist/lib/evg/agent/roundtrip.sh +74 -0
  120. package/dist/lib/evg/agent/smoke.sh +230 -0
  121. package/dist/lib/evg/android/README.md +97 -0
  122. package/dist/lib/evg/android/androidstubs/AndroidStubs.kt +175 -0
  123. package/dist/lib/evg/android/androidstubs/Annotation.kt +10 -0
  124. package/dist/lib/evg/android/androidstubs/App.kt +30 -0
  125. package/dist/lib/evg/android/androidstubs/Content.kt +41 -0
  126. package/dist/lib/evg/android/androidstubs/ContentRes.kt +12 -0
  127. package/dist/lib/evg/android/androidstubs/InputMethod.kt +46 -0
  128. package/dist/lib/evg/android/androidstubs/Net.kt +6 -0
  129. package/dist/lib/evg/android/androidstubs/Os.kt +30 -0
  130. package/dist/lib/evg/android/androidstubs/Util.kt +15 -0
  131. package/dist/lib/evg/android/androidstubs/View.kt +113 -0
  132. package/dist/lib/evg/android/androidstubs/Widget.kt +16 -0
  133. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidEvgSurface.kt +323 -0
  134. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/AndroidTextMeasurer.kt +56 -0
  135. package/dist/lib/evg/android/src/android/kotlin/fi/ranger/evg/RippleEffect.kt +262 -0
  136. package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtEvgSurface.kt +238 -0
  137. package/dist/lib/evg/android/src/awt/kotlin/fi/ranger/evg/AwtTextMeasurer.kt +85 -0
  138. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgEngineThread.kt +115 -0
  139. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgPainter.kt +231 -0
  140. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/EvgSurface.kt +117 -0
  141. package/dist/lib/evg/android/src/main/kotlin/fi/ranger/evg/RecordingSurface.kt +94 -0
  142. package/dist/lib/evg/apple/README.md +128 -0
  143. package/dist/lib/evg/apple/Sources/CoreGraphicsEvgSurface.swift +329 -0
  144. package/dist/lib/evg/apple/Sources/CoreTextMeasurer.swift +70 -0
  145. package/dist/lib/evg/apple/Sources/EvgEngineQueue.swift +105 -0
  146. package/dist/lib/evg/apple/Sources/EvgPainter.swift +225 -0
  147. package/dist/lib/evg/apple/Sources/EvgSurface.swift +163 -0
  148. package/dist/lib/evg/apple/Sources/RecordingSurface.swift +110 -0
  149. package/dist/lib/evg/bench/EvgLayoutBench.rgr +34 -0
  150. package/dist/lib/evg/bench/README.md +64 -0
  151. package/dist/lib/evg/bench/layout-bench.mjs +316 -0
  152. package/dist/lib/evg/bench/layout-cases.mjs +510 -0
  153. package/dist/lib/evg/bench/layout-conformance.mjs +254 -0
  154. package/dist/lib/evg/bin/.gitignore +17 -0
  155. package/dist/lib/evg/evg_test.rgr +313 -0
  156. package/dist/lib/evg/gl/README.md +198 -0
  157. package/dist/lib/evg/gl/a11y-paint-check.mjs +73 -0
  158. package/dist/lib/evg/gl/blur-check.mjs +399 -0
  159. package/dist/lib/evg/gl/boxmodel.json +1 -0
  160. package/dist/lib/evg/gl/demo.html +46 -0
  161. package/dist/lib/evg/gl/effect-presets.css +285 -0
  162. package/dist/lib/evg/gl/effect-presets.js +63 -0
  163. package/dist/lib/evg/gl/effect-shots.mjs +135 -0
  164. package/dist/lib/evg/gl/evg-a11y.js +566 -0
  165. package/dist/lib/evg/gl/evg-binary.js +160 -0
  166. package/dist/lib/evg/gl/evg-engine.js +296 -0
  167. package/dist/lib/evg/gl/evg-fx.js +237 -0
  168. package/dist/lib/evg/gl/evg-gestures.js +209 -0
  169. package/dist/lib/evg/gl/evg-list.js +167 -0
  170. package/dist/lib/evg/gl/evg-measure.js +186 -0
  171. package/dist/lib/evg/gl/evg-textinput.js +303 -0
  172. package/dist/lib/evg/gl/evg-view.js +144 -0
  173. package/dist/lib/evg/gl/evg-webgl.js +3942 -0
  174. package/dist/lib/evg/gl/fx-check.mjs +998 -0
  175. package/dist/lib/evg/gl/fx-demo.html +166 -0
  176. package/dist/lib/evg/gl/fx-demo.js +2 -0
  177. package/dist/lib/evg/gl/fx-serve.mjs +47 -0
  178. package/dist/lib/evg/gl/gestures-check.mjs +189 -0
  179. package/dist/lib/evg/gl/list-binary-check.mjs +152 -0
  180. package/dist/lib/evg/gl/measure-check.mjs +135 -0
  181. package/dist/lib/evg/gl/rotation-check.mjs +207 -0
  182. package/dist/lib/evg/gl/shift-check.mjs +113 -0
  183. package/dist/lib/evg/gl/stroke-check.mjs +168 -0
  184. package/dist/lib/evg/gl/text-snap-check.mjs +139 -0
  185. package/dist/lib/evg/gl/view-check.mjs +343 -0
  186. package/dist/lib/evg/gl/view-policy-check.mjs +184 -0
  187. package/dist/lib/evg/html/evg-dom.js +318 -0
  188. package/dist/lib/evg/html/evg-html.js +600 -0
  189. package/dist/lib/evg/inspect/README.md +415 -0
  190. package/dist/lib/evg/inspect/browser-smoke.mjs +115 -0
  191. package/dist/lib/evg/inspect/evg-inspect.js +947 -0
  192. package/dist/lib/evg/inspect/shots/css.png +0 -0
  193. package/dist/lib/evg/inspect/shots/dashboard.png +0 -0
  194. package/dist/lib/evg/inspect/shots/pptx-slide.png +0 -0
  195. package/dist/lib/evg/inspect/shots/state.png +0 -0
  196. package/dist/lib/evg/inspect/shots.mjs +226 -0
  197. package/dist/lib/evg/oracle/css-blur.json +576 -0
  198. package/dist/lib/evg/oracle/css-box.json +157 -0
  199. package/dist/lib/evg/oracle/css-timing.json +709 -0
  200. package/dist/lib/evg/oracle/css_blur_oracle.mjs +529 -0
  201. package/dist/lib/evg/oracle/css_box_oracle.mjs +106 -0
  202. package/dist/lib/evg/oracle/css_timing_oracle.mjs +389 -0
  203. package/dist/lib/evg/original/EVGColor.clj +310 -0
  204. package/dist/lib/evg/original/EVGColorContext.rgr +178 -0
  205. package/dist/lib/evg/original/SVGPath.rgr +627 -0
  206. package/dist/lib/evg/original/Vec2.crgr +103 -0
  207. package/dist/lib/evg/ranger.json +9 -0
  208. package/dist/lib/evg/showcase/README.md +246 -0
  209. package/dist/lib/evg/showcase/assets/emblem.svg +30 -0
  210. package/dist/lib/evg/showcase/assets/rosette.svg +22 -0
  211. package/dist/lib/evg/showcase/build.mjs +651 -0
  212. package/dist/lib/evg/showcase/pages/album.tsx +30 -0
  213. package/dist/lib/evg/showcase/pages/boxmodel.tsx +37 -0
  214. package/dist/lib/evg/showcase/pages/cards.tsx +41 -0
  215. package/dist/lib/evg/showcase/pages/chart_api.tsx +170 -0
  216. package/dist/lib/evg/showcase/pages/charts.tsx +219 -0
  217. package/dist/lib/evg/showcase/pages/drawing.tsx +160 -0
  218. package/dist/lib/evg/showcase/pages/emoji.tsx +91 -0
  219. package/dist/lib/evg/showcase/pages/flex.tsx +46 -0
  220. package/dist/lib/evg/showcase/pages/more.tsx +332 -0
  221. package/dist/lib/evg/showcase/pages/plots.tsx +262 -0
  222. package/dist/lib/evg/showcase/pages/svg.tsx +63 -0
  223. package/dist/lib/evg/showcase/pages/tables.tsx +209 -0
  224. package/dist/lib/evg/showcase/pages/typography.tsx +43 -0
  225. package/dist/lib/evg/showcase/pages/units.tsx +35 -0
  226. package/dist/lib/evg/showcase/pages/variants.tsx +233 -0
  227. package/dist/lib/evg/showcase/pages/vector.tsx +75 -0
  228. package/dist/lib/evg/showcase/pages/views.tsx +223 -0
  229. package/dist/lib/evg/showcase/tests/chart_api_smoke.mjs +339 -0
  230. package/dist/lib/evg/showcase/tests/gl_smoke.mjs +125 -0
  231. package/dist/lib/evg/showcase/themes/chart_api-default.css +15 -0
  232. package/dist/lib/evg/showcase/themes/charts-default.css +29 -0
  233. package/dist/lib/evg/showcase/themes/drawing-default.css +35 -0
  234. package/dist/lib/evg/showcase/themes/more-default.css +128 -0
  235. package/dist/lib/evg/showcase/themes/plots-default.css +18 -0
  236. package/dist/lib/evg/showcase/themes/showcase.css +508 -0
  237. package/dist/lib/evg/showcase/themes/tables-default.css +123 -0
  238. package/dist/lib/evg/showcase/themes/variants-default.css +15 -0
  239. package/dist/lib/evg/showcase/themes/views-default.css +15 -0
  240. package/dist/lib/evg/tools/bench_vs_potrace.mjs +290 -0
  241. package/dist/lib/evg/tools/evg_image_tool.rgr +488 -0
  242. package/dist/lib/evg/tools/evg_trace_bench.rgr +114 -0
  243. package/dist/lib/evg/tools/evg_trace_cli.rgr +662 -0
  244. package/dist/lib/evg/tools/evg_trace_cpp_bench.rgr +83 -0
  245. package/dist/lib/evg/tools/run_trace_bench.sh +74 -0
  246. package/dist/lib/evg/tools/run_trace_cli_smoke.sh +128 -0
  247. package/dist/lib/evg/web/responsive/EvgResponsiveCheck.rgr +271 -0
  248. package/dist/lib/evg/web/responsive/EvgResponsiveDemo.rgr +531 -0
  249. package/dist/lib/evg/web/responsive/README.md +97 -0
  250. package/dist/lib/evg/web/responsive/build.mjs +90 -0
  251. package/dist/lib/evg/web/responsive/dom-check.mjs +169 -0
  252. package/dist/lib/evg/web/responsive/index.html +177 -0
  253. package/dist/lib/evg/web/responsive/smoke.mjs +221 -0
  254. package/dist/lib/evg/web/tools/assets-client.mjs +95 -0
  255. package/dist/lib/evg/web/tools/boot-bench.mjs +189 -0
  256. package/dist/lib/evg/web/tools/inline-assets.mjs +119 -0
  257. package/dist/lib/evg/web/tools/minify.mjs +60 -0
  258. package/dist/lib/evg/web/tracer/build.mjs +87 -0
  259. package/dist/lib/evg/web/tracer/index.html +2805 -0
  260. package/dist/lib/evg/web/tracer/sample.png +0 -0
  261. package/dist/lib/evg/web/tracer/smoke.mjs +1162 -0
  262. package/dist/lib/evgr/Cargo.lock +21 -0
  263. package/dist/lib/evgr/Cargo.toml +19 -0
  264. package/dist/lib/evgr/README.md +140 -0
  265. package/dist/lib/evgr/bench/NativeBench.rgr +246 -0
  266. package/dist/lib/evgr/bench/compare.mjs +252 -0
  267. package/dist/lib/evgr/bench/speed.mjs +277 -0
  268. package/dist/lib/evgr/bin/.gitignore +3 -0
  269. package/dist/lib/evgr/src/bin/bench.rs +106 -0
  270. package/dist/lib/evgr/src/bin/smoke.rs +13 -0
  271. package/dist/lib/evgr/src/grid.rs +730 -0
  272. package/dist/lib/evgr/src/lib.rs +1003 -0
  273. package/dist/lib/evgr/src/style.rs +468 -0
  274. package/dist/lib/evgr/src/text.rs +83 -0
  275. package/dist/lib/image/BitReader.rgr +171 -0
  276. package/dist/lib/image/Buffer.rgr +173 -0
  277. package/dist/lib/image/DCT.rgr +283 -0
  278. package/dist/lib/image/Deflate.rgr +339 -0
  279. package/dist/lib/image/HuffmanDecoder.rgr +181 -0
  280. package/dist/lib/image/ImageBuffer.rgr +706 -0
  281. package/dist/lib/image/JPEGDecoder.rgr +808 -0
  282. package/dist/lib/image/PNGDecoder.rgr +544 -0
  283. package/dist/lib/image/PNGEncoder.rgr +388 -0
  284. package/dist/lib/image/PPMImage.rgr +224 -0
  285. package/dist/lib/image/ProgressiveJPEGDecoder.rgr +1154 -0
  286. package/dist/lib/image/README.md +33 -0
  287. package/dist/lib/image/RasterBuffer.rgr +294 -0
  288. package/dist/lib/image/VP8BoolDecoder.rgr +163 -0
  289. package/dist/lib/image/WebPDecoder.rgr +433 -0
  290. package/dist/lib/image/WebPLossless.rgr +1035 -0
  291. package/dist/lib/image/WebPLossy.rgr +1929 -0
  292. package/dist/lib/image/ranger.json +9 -0
  293. package/dist/lib/image/testdata/webp/anim_2f_24x16.webp +0 -0
  294. package/dist/lib/image/testdata/webp/fixtures.txt +33 -0
  295. package/dist/lib/image/testdata/webp/gen_fixtures.py +261 -0
  296. package/dist/lib/image/testdata/webp/ll_1x1.webp +0 -0
  297. package/dist/lib/image/testdata/webp/ll_alpha_29x21.webp +0 -0
  298. package/dist/lib/image/testdata/webp/ll_gradient_64x64.webp +0 -0
  299. package/dist/lib/image/testdata/webp/ll_meta_32x32.webp +0 -0
  300. package/dist/lib/image/testdata/webp/ll_noise_17x9.webp +0 -0
  301. package/dist/lib/image/testdata/webp/ll_pal11_23x11.webp +0 -0
  302. package/dist/lib/image/testdata/webp/ll_pal2_19x7.webp +0 -0
  303. package/dist/lib/image/testdata/webp/ll_pal40_16x16.webp +0 -0
  304. package/dist/lib/image/testdata/webp/ll_pal4_13x5.webp +0 -0
  305. package/dist/lib/image/testdata/webp/ll_photo_40x30.webp +0 -0
  306. package/dist/lib/image/testdata/webp/ll_predictors_64x32.webp +0 -0
  307. package/dist/lib/image/testdata/webp/ly_1x1.webp +0 -0
  308. package/dist/lib/image/testdata/webp/ly_alph_raw_f0_21x13.webp +0 -0
  309. package/dist/lib/image/testdata/webp/ly_alph_raw_f1_21x13.webp +0 -0
  310. package/dist/lib/image/testdata/webp/ly_alph_raw_f2_21x13.webp +0 -0
  311. package/dist/lib/image/testdata/webp/ly_alph_raw_f3_21x13.webp +0 -0
  312. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f0_21x13.webp +0 -0
  313. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f1_21x13.webp +0 -0
  314. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f2_21x13.webp +0 -0
  315. package/dist/lib/image/testdata/webp/ly_alph_vp8l_f3_21x13.webp +0 -0
  316. package/dist/lib/image/testdata/webp/ly_alpha_33x17.webp +0 -0
  317. package/dist/lib/image/testdata/webp/ly_exif_15x11.webp +0 -0
  318. package/dist/lib/image/testdata/webp/ly_i16_96x80.webp +0 -0
  319. package/dist/lib/image/testdata/webp/ly_nofilter_24x20.webp +0 -0
  320. package/dist/lib/image/testdata/webp/ly_odd_17x9.webp +0 -0
  321. package/dist/lib/image/testdata/webp/ly_photo_48x40.webp +0 -0
  322. package/dist/lib/image/testdata/webp/ly_q100_20x18.webp +0 -0
  323. package/dist/lib/image/testdata/webp/ly_sharp_40x36.webp +0 -0
  324. package/dist/lib/image/testdata/webp/ly_simple_filter_33x31.webp +0 -0
  325. package/dist/lib/image/testdata/webp/ly_vpx_parts8_37x45.webp +0 -0
  326. package/dist/lib/image/testdata/webp/ly_vpx_skip_96x80.webp +0 -0
  327. package/dist/lib/image/tests/WebPDecodeTool.rgr +81 -0
  328. package/dist/lib/image/tests/WebPDecoderTest.rgr +1162 -0
  329. package/dist/lib/image/tests/run_webp_tests.sh +39 -0
  330. package/dist/lib/rust/RsJson.rgr +468 -0
  331. package/dist/lib/rust/RsPrelude.rgr +1663 -0
  332. package/dist/lib/shell_test.rgr +7 -7
  333. package/dist/lib/stdlib.rgr +21 -5
  334. package/dist/lib/zip/ranger.json +6 -0
  335. package/dist/rgrc.js +87318 -67610
  336. package/package.json +1010 -1040
  337. package/dist/README.md +0 -117
  338. package/dist/package.json +0 -47
@@ -0,0 +1,595 @@
1
+ # EVG Rendering System - TODO List
2
+
3
+ Based on priorities from `PLAN_EVG.md`. Updated: December 23, 2025.
4
+
5
+ ---
6
+
7
+ ## ✅ RECENTLY COMPLETED (December 2025)
8
+
9
+ ### EVG Preview Server with Live Reload
10
+ - [x] Create `evg_preview_server.rgr` with HTTP server
11
+ - [x] Shell HTML endpoint (GET `/`) with SSE client JavaScript
12
+ - [x] Content endpoint (GET `/content`) for document rendering
13
+ - [x] Font CSS endpoint (GET `/fonts.css`) with server URLs
14
+ - [x] Asset serving endpoint (GET `/assets/`) for images and fonts
15
+ - [x] SSE events endpoint (GET `/events`) for live reload
16
+ - [x] File watching via `file_mtime` operator
17
+ - [x] ComponentEngine integration for TSX parsing
18
+ - [x] EVGLayout integration for proper page dimensions
19
+ - [x] Multi-page document support (16+ pages tested)
20
+
21
+ ### Layer Element
22
+ - [x] Add `<Layer>` element type to parser
23
+ - [x] Implement as absolute-positioned container filling parent
24
+ - [x] Support `background` for gradient overlays
25
+ - [x] Render children in order (first = bottom, last = top)
26
+ - [x] Support `align` and `verticalAlign` for child positioning
27
+
28
+ ### Image ViewBox (HTML)
29
+ - [x] Parse `imageViewBox` attribute: `"25% 25% 50% 50%"` (x y w h)
30
+ - [x] Implement HTML cropping with wrapper div and overflow:hidden
31
+ - [x] Add `objectFit` attribute: "cover", "contain", "fill"
32
+
33
+ ### Alignment Attributes
34
+ - [x] Add `align` attribute for horizontal alignment: "left", "center", "right"
35
+ - [x] Add `verticalAlign` attribute for vertical alignment: "top", "center", "bottom"
36
+ - [x] Parse attributes in JSXToEVG with kebab-case conversion
37
+
38
+ ### Documentation
39
+ - [x] Updated README.md with EVG Attributes Reference
40
+ - [x] Added examples for Layer, imageViewBox, and alignment
41
+
42
+ ---
43
+
44
+ ## 🎯 RECOMMENDED NEXT STEPS
45
+
46
+ Based on current progress, here are the most impactful next items:
47
+
48
+ ### Quick Wins (< 1 day each)
49
+ 1. **PDF: imageViewBox** - Add cropping to PDF renderer (parsing already done)
50
+ 2. **PDF: overflow: hidden** - Clip children to View bounds
51
+ 3. **PDF: opacity** - Simple ExtGState implementation
52
+
53
+ ### Medium Impact (1-2 days)
54
+ 4. **backgroundImage on View** - Views with background images (useful with Layer)
55
+ 5. **PNG: Image rendering** - Complete the PNG raster renderer
56
+
57
+ ### Nice to Have
58
+ 6. **Unified evg_tool** - Merge all tools into one with better CLI (see PLAN_HTTP.md)
59
+ 7. **Diff-based page updates** - Only reload changed pages in live preview
60
+ 8. **Unit test framework** - Vitest integration for regression testing
61
+
62
+ ---
63
+
64
+ ## 🔴 HIGHEST PRIORITY
65
+
66
+ ### 1. HTML Renderer
67
+ **Goal:** Enable unit testing, fast preview, and rapid development iteration.
68
+
69
+ - [x] **0.1** Basic HTML structure (View, Label) - *DONE*
70
+ - [x] **0.2** CSS generation (colors, dimensions, spacing) - *DONE*
71
+ - [x] **0.3** Flexbox layout mapping - *DONE (absolute positioning)*
72
+ - [x] **0.4** Image rendering with base64 embedding - *DONE*
73
+ - [x] **0.5** SVG Path embedding - *DONE*
74
+ - [x] **0.10** SVG file import (`<Svg src="…">`) - *DONE (SvgParser; resolved to path data rather than passed through, so the preview shows what will print)*
75
+ - [x] **0.6** Font embedding (TTF to base64) - *DONE*
76
+ - [x] **0.7** Gradients and shadows - *DONE (CSS native)*
77
+ - [ ] **0.8** Unit test framework (Vitest) - *TODO*
78
+ - [x] **0.9** Preview server with hot reload - *DONE*
79
+
80
+ ### 2. PNG Raster Renderer
81
+ **Goal:** Pixel-accurate rendering for testing and preview images.
82
+
83
+ - [x] **PNG 0.1** Basic rasterization (rectangles, colors) - *DONE*
84
+ - [x] **PNG 0.2** Anti-aliased text with TrueType fonts - *DONE*
85
+ - [x] **PNG 0.3** Rounded rectangles - *DONE*
86
+ - [x] **PNG 0.4** Linear gradients (all angles) - *DONE*
87
+ - [x] **PNG 0.5** Radial gradients - *DONE*
88
+ - [x] **PNG 0.6** Box shadows with blur - *DONE*
89
+ - [x] **PNG 0.7** EVGGradient shared parsing - *DONE*
90
+ - [ ] **PNG 0.8** Image rendering - *TODO*
91
+ - [x] **PNG 0.9** SVG path rasterization - *DONE (shared VectorRasterizer; fill + approximated stroke)*
92
+ - [x] **PNG 0.10** SVG file import - *DONE (same VectorRasterizer, one item at a time)*
93
+
94
+ **New Files Created:**
95
+ ```
96
+ gallery/pdf_writer/src/
97
+ ├── raster/
98
+ │ ├── EVGRasterRenderer.rgr # Software rasterizer
99
+ │ ├── RasterText.rgr # TrueType glyph rasterizer (4x4 AA)
100
+ │ └── PNGEncoder.rgr # PNG file encoder
101
+ ├── tools/
102
+ │ └── evg_png_tool.rgr # CLI tool: TSX → PNG
103
+ lib/evg/
104
+ ├── EVGGradient.rgr # Shared gradient parsing (NEW)
105
+ ```
106
+
107
+ **Added to package.json:**
108
+ - `npm run evgpng:compile` - Compile PNG renderer
109
+ - `npm run evgpng:run` - Run TSX→PNG conversion
110
+ - `npm run evgpng` - Compile and run
111
+
112
+ **Completed Files:**
113
+ ```
114
+ gallery/pdf_writer/src/
115
+ ├── core/
116
+ │ ├── EVGPDFRenderer.rgr # Existing PDF renderer
117
+ │ └── EVGHTMLRenderer.rgr # ✅ HTML/CSS renderer (~970 lines)
118
+ ├── raster/
119
+ │ ├── EVGRasterRenderer.rgr # ✅ Software rasterizer
120
+ │ ├── RasterText.rgr # ✅ TrueType glyph rasterizer
121
+ │ └── PNGEncoder.rgr # ✅ PNG file encoder
122
+ ├── jsx/
123
+ │ └── JSXToEVG.rgr # ✅ Updated: Gradient parsing
124
+ ├── tools/
125
+ │ ├── evg_html_tool.rgr # ✅ CLI tool for TSX→HTML
126
+ │ └── evg_png_tool.rgr # ✅ CLI tool for TSX→PNG
127
+ └── tests/
128
+ └── (TODO: Unit tests)
129
+
130
+ lib/evg/
131
+ ├── EVGElement.rgr # ✅ Updated: gradient property
132
+ ├── EVGGradient.rgr # ✅ NEW: Shared gradient parsing
133
+ └── EVGColor.rgr # Color with method accessors
134
+ ```
135
+
136
+ **Added to package.json:**
137
+ - `npm run evghtml:compile` - Compile HTML renderer
138
+ - `npm run evghtml:run` - Run TSX→HTML conversion
139
+ - `npm run evghtml` - Compile and run
140
+ - `-embed` flag for base64 embedding of images and fonts
141
+
142
+ **Lang.rgr Updates:**
143
+ - Added `buffer_to_base64` operator for base64 encoding
144
+
145
+ **Note:** The HTML renderer lives alongside the PDF renderer in `gallery/pdf_writer/` because:
146
+ - Both renderers share the same EVG element tree
147
+ - Both use the same font metrics from `TrueTypeParser.rgr`
148
+ - The `evg` CLI tool will support both `--format=pdf` and `--format=html`
149
+ - Unit tests can verify HTML output before PDF generation
150
+
151
+ **Estimated remaining time:** ~4 days (gradients, shadows, unit tests, hot reload)
152
+
153
+ ---
154
+
155
+ ## 🟠 HIGH PRIORITY
156
+
157
+ ### 2. PDF: overflow: hidden
158
+ **Goal:** Clip children to View bounds.
159
+
160
+ - [ ] Parse `overflow` attribute in `JSXToEVG.rgr`
161
+ - [ ] Implement PDF clipping rectangle in `EVGPDFRenderer.rgr`
162
+ - [ ] Use `q ... re W n ... Q` graphics state
163
+
164
+ **Complexity:** Low
165
+ **Estimated time:** 1 day
166
+
167
+ ---
168
+
169
+ ### 3. PDF: opacity
170
+ **Goal:** Support transparency for elements.
171
+
172
+ - [ ] Implement PDF ExtGState with `ca` (fill) and `CA` (stroke) operators
173
+ - [ ] Register ExtGState resources in PDF output
174
+ - [ ] Apply to elements with `opacity` attribute
175
+
176
+ **Complexity:** Low
177
+ **Estimated time:** 1 day
178
+
179
+ ---
180
+
181
+ ### 4. PDF: rotate & scale transforms
182
+ **Goal:** Rotate and scale elements.
183
+
184
+ - [ ] Parse `rotate` and `scale` attributes in `JSXToEVG.rgr`
185
+ - [ ] Implement PDF `cm` transformation matrix
186
+ - [ ] Calculate rotation center (element center by default)
187
+ - [ ] Save/restore graphics state around transforms
188
+
189
+ **Complexity:** Medium
190
+ **Estimated time:** 2 days
191
+
192
+ ---
193
+
194
+ ### 5. PDF: linear-gradient
195
+ **Goal:** Gradient backgrounds on View elements.
196
+
197
+ - [x] Parse CSS-style gradient syntax: `linear-gradient(45deg, red, blue)` - *DONE (EVGGradient.rgr)*
198
+ - [ ] Implement PDF Shading Pattern Type 2 (Axial)
199
+ - [ ] Calculate gradient endpoints from angle and bounds
200
+ - [ ] Register shading pattern resources
201
+
202
+ **Note:** Gradient parsing is shared via `EVGGradient.rgr`. PDF rendering needs shading patterns.
203
+
204
+ **Complexity:** Medium
205
+ **Estimated time:** 2-3 days
206
+
207
+ ---
208
+
209
+ ### 6. Image viewBox (Crop/Zoom)
210
+ **Goal:** Crop/zoom into specific regions of images.
211
+
212
+ - [x] Parse `imageViewBox` attribute on Image elements: `imageViewBox="10% 10% 80% 80%"` - *DONE*
213
+ - [x] Calculate source rectangle from percentages - *DONE*
214
+ - [x] Implement HTML with CSS wrapper div and overflow:hidden - *DONE*
215
+ - [x] Add `objectFit` attribute for sizing mode: "cover", "contain", "fill", "none" - *DONE*
216
+ - [ ] Implement PDF image transformation matrix for cropping
217
+
218
+ **Complexity:** Low (PDF remaining)
219
+ **Estimated time:** 0.5 day (PDF remaining)
220
+
221
+ ---
222
+
223
+ ### 7. Layer Element ✅ COMPLETED
224
+ **Goal:** Enable stacking content with overlays.
225
+
226
+ - [x] Add `<Layer>` element type to parser - *DONE*
227
+ - [x] Implement as absolute-positioned container filling parent - *DONE*
228
+ - [x] Support `background` for gradient overlays - *DONE*
229
+ - [x] Render children in order (first = bottom, last = top) - *DONE*
230
+ - [x] Support `align` and `verticalAlign` for child positioning - *DONE*
231
+
232
+ **Status:** COMPLETED (December 2025)
233
+
234
+ **Test File:** `gallery/pdf_writer/examples/test_layer_viewbox.tsx`
235
+
236
+ ---
237
+
238
+ ### 8. backgroundImage on View
239
+ **Goal:** Views with background images.
240
+
241
+ - [ ] Parse `backgroundImage` attribute
242
+ - [ ] Parse `backgroundSize` (cover, contain, stretch)
243
+ - [ ] Parse `backgroundViewBox` for cropping
244
+ - [ ] Draw image before rendering children
245
+ - [ ] Apply clipping if `overflow: hidden`
246
+
247
+ **Complexity:** Medium
248
+ **Estimated time:** 2 days
249
+
250
+ ---
251
+
252
+ ## 🟡 MEDIUM PRIORITY
253
+
254
+ ### 9. PDF: radial-gradient
255
+ **Goal:** Radial gradient backgrounds.
256
+
257
+ - [x] Parse CSS-style syntax: `radial-gradient(red, blue)` - *DONE (EVGGradient.rgr)*
258
+ - [ ] Implement PDF Shading Pattern Type 3 (Radial)
259
+ - [ ] Calculate center and radius from bounds
260
+
261
+ **Complexity:** Medium-High
262
+ **Estimated time:** 2 days
263
+
264
+ ---
265
+
266
+ ### 10. PDF: shadow effects (DEFERRED)
267
+ **Goal:** Box shadows on elements.
268
+
269
+ ⚠️ **DEFERRED** - PDF does not natively support shadows. Complex simulation required.
270
+
271
+ - [ ] Parse `shadowRadius`, `shadowColor`, `shadowOffsetX`, `shadowOffsetY` - *Already parsed*
272
+ - [ ] Option A: Draw blurred offset shapes (complex, poor quality)
273
+ - [ ] Option B: Rasterize shadow as image (memory/quality tradeoff)
274
+ - [ ] Option C: Pre-render shadow to PNG, embed in PDF
275
+
276
+ **Note:** Shadows work in HTML (native CSS) and PNG (rasterized blur).
277
+ For PDF, consider using the PNG renderer to generate shadow images, then embed.
278
+
279
+ **Complexity:** High
280
+ **Estimated time:** 3-4 days (if implemented)
281
+
282
+ ---
283
+
284
+ ### 10b. Text/Path/Image Shadows (DEFERRED)
285
+ **Goal:** Drop shadows on text, paths, and images.
286
+
287
+ ⚠️ **DEFERRED** - Requires rasterization for PDF. Native in HTML/CSS.
288
+
289
+ - Text shadow: CSS `text-shadow` (HTML), rasterize for PDF
290
+ - Path shadow: Duplicate path with offset and blur
291
+ - Image shadow: Add shadow behind image
292
+
293
+ **Note:** These work natively in HTML renderer. For PDF/PNG, use raster approach.
294
+
295
+ **Complexity:** High
296
+ **Estimated time:** 3-4 days (if implemented)
297
+
298
+ ---
299
+
300
+ ### 11. Incremental PDF Rendering
301
+ **Goal:** Fast preview with only changed pages re-rendered.
302
+
303
+ - [ ] Implement page content hashing
304
+ - [ ] Detect changed pages on file save
305
+ - [ ] Render single page to PNG: `evg example.tsx --page=2 --format=png`
306
+ - [ ] WebSocket push updates to preview
307
+
308
+ **Complexity:** Medium
309
+ **Estimated time:** 3 days
310
+
311
+ ---
312
+
313
+ ### 12. Live Preview Server
314
+ **Goal:** Hot-reload preview in browser.
315
+
316
+ - [ ] File watcher for TSX changes
317
+ - [ ] HTTP server for preview HTML
318
+ - [ ] WebSocket for live updates
319
+ - [ ] Font serving from assets
320
+
321
+ **Complexity:** Medium
322
+ **Estimated time:** 2 days
323
+
324
+ ---
325
+
326
+ ## 🟢 LOW PRIORITY
327
+
328
+ ### 13. Interactive elements (Web only)
329
+ - [ ] `<input>` text input element
330
+ - [ ] `<textarea>` multi-line input
331
+
332
+ ---
333
+
334
+ ### 14. VS Code Extension
335
+ - [ ] Preview panel in VS Code
336
+ - [ ] Side-by-side editing
337
+
338
+ ---
339
+
340
+ ### 15. Native macOS Preview App
341
+ - [ ] Swift wrapper around `evg` binary
342
+ - [ ] FSEvents file watching
343
+ - [ ] Per-page PNG cache
344
+
345
+ ---
346
+
347
+ ## 📊 Progress Summary
348
+
349
+ | Priority | Tasks | Completed | Remaining |
350
+ |----------|-------|-----------|-----------|
351
+ | 🔴 HIGHEST (HTML) | 9 | 7 | 2 |
352
+ | � HIGHEST (PNG) | 9 | 7 | 2 |
353
+ | �🟠 HIGH | 7 | 0 | 7 |
354
+ | 🟡 MEDIUM | 4 | 0 | 4 (2 deferred) |
355
+ | 🟢 LOW | 3 | 0 | 3 |
356
+ | **TOTAL** | **32** | **14** | **18** |
357
+
358
+ ---
359
+
360
+ ## Quick Reference: Feature Status
361
+
362
+ ### Currently Working ✅
363
+ - View, Label, Image, Path, Rect elements
364
+ - Flexbox layout (flex, justifyContent, alignItems, gap)
365
+ - Absolute positioning
366
+ - Margin, padding, border
367
+ - borderRadius, clipPath (circle, ellipse)
368
+ - TrueType fonts with Unicode
369
+ - JPEG with EXIF orientation
370
+ - Multi-page documents
371
+ - **HTML Renderer** (View, Label, Image, Path, gradients, shadows)
372
+ - **PNG Renderer** (View, Label, gradients, shadows, rounded corners)
373
+ - **Base64 embedding** (images, fonts)
374
+ - **Font mapping** (Google Fonts: Amatic SC, Gloria Hallelujah, Josefin Slab, etc.)
375
+ - **Gradient parsing** (shared EVGGradient.rgr for all renderers)
376
+
377
+ ### Defined but Not Working ⚠️
378
+ - `opacity` - parsed, not rendered in PDF
379
+ - `rotate` - defined, not parsed
380
+ - `scale` - defined, not parsed
381
+ - `overflow` - defined, not parsed
382
+ - PDF linear-gradient - parsing done, PDF shading not implemented
383
+ - PDF radial-gradient - parsing done, PDF shading not implemented
384
+
385
+ ### Deferred ⏸️
386
+ - PDF shadows (no native support, requires rasterization)
387
+ - Text shadows for PDF (use HTML/PNG instead)
388
+ - Path shadows for PDF (use HTML/PNG instead)
389
+ - Image shadows for PDF (use HTML/PNG instead)
390
+
391
+ ### Not Implemented ❌
392
+ - Image viewBox (crop/zoom)
393
+ - backgroundImage on View
394
+ - Layer element
395
+ - Incremental rendering
396
+ - Unit test framework
397
+ - Hot reload preview server
398
+
399
+ ---
400
+
401
+ ## Next Actions
402
+
403
+ ### ✅ COMPLETED: HTML Renderer Phase 0.1-0.7
404
+ - Created `EVGHTMLRenderer.rgr` (~970 lines)
405
+ - Created `evg_html_tool.rgr` CLI tool
406
+ - Added `buffer_to_base64` to Lang.rgr
407
+ - Font embedding (TTF to base64)
408
+ - Image embedding (JPEG to base64)
409
+ - Gradients and shadows (native CSS)
410
+
411
+ ### ✅ COMPLETED: PNG Raster Renderer Phase 0.1-0.7
412
+ - Created `EVGRasterRenderer.rgr` - software rasterizer
413
+ - Created `RasterText.rgr` - TrueType glyph rasterizer with 4x4 AA
414
+ - Created `PNGEncoder.rgr` - PNG file output
415
+ - Created `evg_png_tool.rgr` - CLI tool for TSX→PNG
416
+ - Created `EVGGradient.rgr` - shared gradient parsing
417
+ - Linear gradients (all angles)
418
+ - Radial gradients
419
+ - Box shadows with blur
420
+ - Rounded rectangles
421
+
422
+ ### 🔄 IN PROGRESS: HTML/PNG Renderer Phase 0.8-0.9
423
+ 1. **Unit test framework** (0.8)
424
+ - Vitest for JavaScript testing
425
+ - Compare HTML output snapshots
426
+ - Compare PNG output (pixel diff)
427
+
428
+ 2. **Preview server with hot reload** (0.9)
429
+ - File watcher for TSX changes
430
+ - WebSocket for live updates
431
+
432
+ ### 📋 NEXT: PDF Improvements (in order)
433
+ 1. **`overflow: hidden`** - Simple clipping rectangle (1 day)
434
+ 2. **`opacity`** - PDF ExtGState transparency (1 day)
435
+ 3. **`rotate` & `scale`** - PDF transformation matrix (2 days)
436
+ 4. **`linear-gradient`** - PDF Type 2 shading (2-3 days)
437
+ 5. **`radial-gradient`** - PDF Type 3 shading (2 days)
438
+
439
+ ### 📋 NEXT: PNG Renderer Completion
440
+ 1. **Image rendering** - Embed images in raster output
441
+ 2. ~~**SVG path rasterization** - Bezier curve rendering~~ - *DONE, see lib/evg/PLAN_VECTOR_IR.md*
442
+
443
+ ---
444
+
445
+ *This TODO list is derived from PLAN_EVG.md. See that document for detailed implementation notes and architecture diagrams.*
446
+
447
+ ---
448
+
449
+ ## ⚠️ Implementation Guidelines
450
+
451
+ ### Avoiding Circular References
452
+
453
+ When implementing EVG components, **avoid circular references** to ensure compatibility with languages like Rust that have strict ownership rules.
454
+
455
+ #### Problem: Parent-Child Circular References
456
+
457
+ ```ranger
458
+ ; BAD: Circular reference - child.parent = this
459
+ class EVGElement {
460
+ def parent@(optional):EVGElement ; Points to parent
461
+ def children:[EVGElement] ; Parent points to children
462
+
463
+ fn addChild:void (child:EVGElement) {
464
+ child.parent = this ; ❌ Creates circular reference!
465
+ push children child
466
+ }
467
+ }
468
+ ```
469
+
470
+ **Issues in Rust:**
471
+ - Cannot have `Rc<RefCell<T>>` with parent pointing to child and child pointing to parent
472
+ - Causes memory leaks (reference count never reaches 0)
473
+ - Requires `Weak<RefCell<T>>` for parent references
474
+
475
+ #### Solution 1: Weak References for Parent
476
+
477
+ ```ranger
478
+ ; GOOD: Use weak reference annotation for parent
479
+ class EVGElement {
480
+ def parent@(optional weak):EVGElement ; Weak reference - won't prevent deallocation
481
+ def children:[EVGElement] ; Strong references to children
482
+
483
+ fn addChild:void (child:EVGElement) {
484
+ child.parent = this ; OK - parent is weak reference
485
+ push children child
486
+ }
487
+ }
488
+ ```
489
+
490
+ **Rust translation:**
491
+ ```rust
492
+ struct EVGElement {
493
+ parent: Option<Weak<RefCell<EVGElement>>>, // Weak reference
494
+ children: Vec<Rc<RefCell<EVGElement>>>, // Strong references
495
+ }
496
+ ```
497
+
498
+ #### Solution 2: Index-Based Parent References
499
+
500
+ ```ranger
501
+ ; GOOD: Use index instead of direct reference
502
+ class EVGElement {
503
+ def parentIndex:int -1 ; Index in element array, -1 = no parent
504
+ def childIndices:[int] ; Indices of children
505
+ }
506
+
507
+ class EVGDocument {
508
+ def elements:[EVGElement] ; Flat array of all elements
509
+
510
+ fn getParent:EVGElement (el:EVGElement) {
511
+ if (el.parentIndex < 0) {
512
+ return null
513
+ }
514
+ return (itemAt elements el.parentIndex)
515
+ }
516
+ }
517
+ ```
518
+
519
+ #### Solution 3: Visitor Pattern (No Parent Reference Needed)
520
+
521
+ ```ranger
522
+ ; GOOD: Pass parent as parameter during traversal
523
+ class EVGRenderer {
524
+ fn renderElement:void (el:EVGElement parent@(optional):EVGElement depth:int) {
525
+ ; Parent available as parameter, not stored in element
526
+
527
+ ; Render this element
528
+ this.drawElement(el)
529
+
530
+ ; Recurse to children
531
+ def i:int 0
532
+ while (i < (array_length el.children)) {
533
+ def child:EVGElement (itemAt el.children i)
534
+ this.renderElement(child el (depth + 1)) ; Pass current as parent
535
+ i = i + 1
536
+ }
537
+ }
538
+ }
539
+ ```
540
+
541
+ #### Solution 4: Separate Parent Map
542
+
543
+ ```ranger
544
+ ; GOOD: Store parent relationships in separate map
545
+ class EVGDocument {
546
+ def root:EVGElement
547
+ def parentMap:[string:EVGElement] ; childId -> parent mapping
548
+
549
+ fn setParent:void (child:EVGElement parent:EVGElement) {
550
+ set parentMap child.id parent
551
+ }
552
+
553
+ fn getParent:EVGElement (child:EVGElement) {
554
+ return (get parentMap child.id)
555
+ }
556
+ }
557
+ ```
558
+
559
+ ### Guidelines for EVG Implementation
560
+
561
+ 1. **Prefer Solution 1 (Weak References)** when parent access is frequently needed
562
+ 2. **Prefer Solution 3 (Visitor Pattern)** for rendering/traversal operations
563
+ 3. **Never store `this` in child** without weak reference annotation
564
+ 4. **Document circular dependencies** in class comments
565
+
566
+ ### Affected Files
567
+
568
+ When implementing new features, check these files for circular reference issues:
569
+
570
+ | File | Location | Current Issue | Recommended Fix |
571
+ |------|----------|---------------|-----------------|
572
+ | `EVGElement.rgr` | `lib/evg/` | `parent` is direct reference | Add `@(weak)` annotation |
573
+ | `EVGLayout.rgr` | `lib/evg/` | May store parent during layout | Use visitor pattern |
574
+ | `EVGPDFRenderer.rgr` | `gallery/pdf_writer/src/core/` | May store element refs | Use visitor pattern |
575
+ | `EVGHTMLRenderer.rgr` | `gallery/pdf_writer/src/core/` | NEW - avoid circular refs | Use visitor pattern |
576
+ | `JSXToEVG.rgr` | `gallery/pdf_writer/src/jsx/` | Builds element tree | Set parent with weak ref |
577
+
578
+ ### Ranger Compiler Enhancement Needed
579
+
580
+ To fully support Rust output, the Ranger compiler should:
581
+
582
+ 1. **Recognize `@(weak)` annotation** on reference types
583
+ 2. **Generate `Weak<RefCell<T>>`** for weak references in Rust
584
+ 3. **Generate `Rc<RefCell<T>>`** for strong references in Rust
585
+ 4. **Warn about potential circular references** during compilation
586
+
587
+ ```ranger
588
+ ; Example of enhanced annotations
589
+ class Node {
590
+ def parent@(optional weak):Node ; -> Option<Weak<RefCell<Node>>>
591
+ def children:[Node] ; -> Vec<Rc<RefCell<Node>>>
592
+ def data:string ; -> String
593
+ }
594
+ ```
595
+