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,510 @@
1
+ // SPDX-License-Identifier: MIT
2
+ //
3
+ // The case list, written once and run twice: once through EVG's own layout and
4
+ // once through Chromium. `layout-conformance.mjs` does the running.
5
+ //
6
+ // Every case is a tree of `{ s, kids, text }` — `s` is a CSS declaration block
7
+ // that goes verbatim into the browser's `style=` attribute AND, split on `;`
8
+ // and `:`, into `EVGElement.setAttribute`. That is the whole trick: the two
9
+ // engines are handed the same characters, so a difference in the boxes is a
10
+ // difference in the engines and not in the harness.
11
+ //
12
+ // Nodes are numbered in pre-order (`n0`, `n1`, …) by both sides, so a diff can
13
+ // name the box that moved.
14
+ //
15
+ // WHERE THE HARNESS DOES INTERVENE, and why:
16
+ //
17
+ // box-sizing: border-box EVG's box model puts padding and border inside
18
+ // the declared width. That is CSS's border-box, so
19
+ // the browser is told to use it. Without this every
20
+ // padded case differs for a reason that is a
21
+ // documented choice rather than a defect.
22
+ // margin/padding reset `body` has 8px of margin in every browser.
23
+ // font: 16px monospace Text cases do not compare px (see the note in the
24
+ // conformance runner); this only stops the browser
25
+ // from picking a font whose metrics change between
26
+ // machines.
27
+ //
28
+ // The three defaults cases at the end intervene in nothing on purpose: they
29
+ // exist to measure the initial values EVG chose differently from CSS.
30
+
31
+ const box = (s, kids) => ({ s, kids: kids || [] });
32
+ const leaf = (s) => ({ s, kids: [] });
33
+
34
+ export const CASES = [
35
+ // --- the baseline: does a row even agree ---------------------------------
36
+ {
37
+ id: "flex-row-fixed",
38
+ group: "flex basics",
39
+ why: "three fixed items in a row, with a gap",
40
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px;gap:10px", [
41
+ leaf("width:100px;height:40px"),
42
+ leaf("width:150px;height:40px"),
43
+ leaf("width:80px;height:40px"),
44
+ ]),
45
+ },
46
+ {
47
+ id: "flex-grow-3way",
48
+ group: "flex basics",
49
+ why: "grow distributes free space in proportion",
50
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px;gap:20px", [
51
+ leaf("flex-grow:1;height:40px"),
52
+ leaf("flex-grow:2;height:40px"),
53
+ leaf("flex-grow:1;height:40px"),
54
+ ]),
55
+ },
56
+ {
57
+ id: "flex-basis-grow",
58
+ group: "flex basics",
59
+ why: "flex-basis is the starting size grow adds to",
60
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px", [
61
+ leaf("flex-basis:100px;flex-grow:1;height:40px"),
62
+ leaf("flex-basis:200px;flex-grow:1;height:40px"),
63
+ ]),
64
+ },
65
+ {
66
+ id: "flex-shrink-weighted",
67
+ group: "flex basics",
68
+ why: "overflow is removed in proportion to shrink x basis",
69
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:400px;height:100px", [
70
+ leaf("width:300px;flex-shrink:1;height:40px"),
71
+ leaf("width:300px;flex-shrink:2;height:40px"),
72
+ ]),
73
+ },
74
+ {
75
+ id: "flex-shrink-zero",
76
+ group: "flex basics",
77
+ why: "flex-shrink:0 keeps its size and lets the line overflow",
78
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:400px;height:100px", [
79
+ leaf("width:300px;flex-shrink:0;height:40px"),
80
+ leaf("width:300px;flex-shrink:1;height:40px"),
81
+ ]),
82
+ },
83
+ {
84
+ id: "flex-shorthand",
85
+ group: "flex basics",
86
+ why: "the `flex` shorthand, all three forms",
87
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px", [
88
+ leaf("flex:1;height:40px"),
89
+ leaf("flex:2 1 0px;height:40px"),
90
+ leaf("flex:0 0 120px;height:40px"),
91
+ ]),
92
+ },
93
+
94
+ // --- min / max, and their order against grow and shrink ------------------
95
+ {
96
+ id: "max-width-caps-grow",
97
+ group: "min/max",
98
+ why: "a grown item stops at max-width and the rest goes to its siblings",
99
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px", [
100
+ leaf("flex-grow:1;max-width:120px;height:40px"),
101
+ leaf("flex-grow:1;height:40px"),
102
+ ]),
103
+ },
104
+ {
105
+ id: "min-width-floors-shrink",
106
+ group: "min/max",
107
+ why: "a shrunk item stops at min-width and the overflow moves to its sibling",
108
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:300px;height:100px", [
109
+ leaf("width:300px;min-width:200px;height:40px"),
110
+ leaf("width:300px;height:40px"),
111
+ ]),
112
+ },
113
+ {
114
+ id: "min-over-max",
115
+ group: "min/max",
116
+ why: "when they conflict CSS says min wins",
117
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px", [
118
+ leaf("width:50px;min-width:200px;max-width:100px;height:40px"),
119
+ ]),
120
+ },
121
+ {
122
+ id: "max-height-cross",
123
+ group: "min/max",
124
+ why: "the same clamp on the cross axis under align-items:stretch",
125
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;width:600px;height:200px", [
126
+ leaf("width:100px;max-height:60px"),
127
+ leaf("width:100px;min-height:150px"),
128
+ ]),
129
+ },
130
+
131
+ // --- percentages ---------------------------------------------------------
132
+ {
133
+ id: "percent-width",
134
+ group: "percentages",
135
+ why: "a percentage resolves against the parent's content box",
136
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px;padding:20px", [
137
+ leaf("width:50%;height:40px"),
138
+ leaf("width:25%;height:40px"),
139
+ ]),
140
+ },
141
+ {
142
+ id: "percent-nested",
143
+ group: "percentages",
144
+ why: "two levels of percentage, so a resolved parent is not resolved twice",
145
+ root: box("width:600px;height:300px;padding:10px", [
146
+ box("width:50%;height:50%;padding:10px", [
147
+ leaf("width:50%;height:50%"),
148
+ ]),
149
+ ]),
150
+ },
151
+ {
152
+ id: "percent-padding",
153
+ group: "percentages",
154
+ why: "percentage padding resolves against the WIDTH on all four sides",
155
+ root: box("width:400px;height:400px", [
156
+ box("width:200px;height:200px;padding:10%", [leaf("width:100%;height:20px")]),
157
+ ]),
158
+ },
159
+
160
+ // --- wrap ----------------------------------------------------------------
161
+ {
162
+ id: "wrap-three-lines",
163
+ group: "wrap",
164
+ why: "a row that runs out goes onto the next line",
165
+ root: box("display:flex;flex-direction:row;flex-wrap:wrap;width:300px;height:300px;gap:10px;align-content:flex-start", [
166
+ leaf("width:120px;height:40px"), leaf("width:120px;height:40px"),
167
+ leaf("width:120px;height:40px"), leaf("width:120px;height:40px"),
168
+ leaf("width:120px;height:40px"),
169
+ ]),
170
+ },
171
+ {
172
+ id: "wrap-align-content-between",
173
+ group: "wrap",
174
+ why: "align-content spreads the lines, not the items",
175
+ root: box("display:flex;flex-direction:row;flex-wrap:wrap;width:300px;height:400px;align-content:space-between", [
176
+ leaf("width:200px;height:40px"), leaf("width:200px;height:40px"),
177
+ leaf("width:200px;height:40px"),
178
+ ]),
179
+ },
180
+ {
181
+ id: "wrap-align-content-stretch",
182
+ group: "wrap",
183
+ why: "stretch is the initial value and it grows the LINES",
184
+ root: box("display:flex;flex-direction:row;flex-wrap:wrap;width:300px;height:400px;align-content:stretch;align-items:stretch", [
185
+ leaf("width:200px"), leaf("width:200px"),
186
+ ]),
187
+ },
188
+ {
189
+ id: "wrap-row-column-gap",
190
+ group: "wrap",
191
+ why: "row-gap and column-gap set separately",
192
+ root: box("display:flex;flex-direction:row;flex-wrap:wrap;width:300px;height:300px;row-gap:30px;column-gap:5px;align-content:flex-start", [
193
+ leaf("width:140px;height:30px"), leaf("width:140px;height:30px"),
194
+ leaf("width:140px;height:30px"), leaf("width:140px;height:30px"),
195
+ ]),
196
+ },
197
+
198
+ // --- justify / align -----------------------------------------------------
199
+ {
200
+ id: "justify-space-between",
201
+ group: "alignment",
202
+ why: "space-between with three items",
203
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-between;width:600px;height:100px", [
204
+ leaf("width:80px;height:40px"), leaf("width:80px;height:40px"), leaf("width:80px;height:40px"),
205
+ ]),
206
+ },
207
+ {
208
+ id: "justify-space-around",
209
+ group: "alignment",
210
+ why: "space-around's half-gaps at the ends",
211
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-around;width:600px;height:100px", [
212
+ leaf("width:80px;height:40px"), leaf("width:80px;height:40px"),
213
+ ]),
214
+ },
215
+ {
216
+ id: "justify-space-evenly",
217
+ group: "alignment",
218
+ why: "space-evenly's equal gaps",
219
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:space-evenly;width:600px;height:100px", [
220
+ leaf("width:80px;height:40px"), leaf("width:80px;height:40px"),
221
+ ]),
222
+ },
223
+ {
224
+ id: "align-items-center",
225
+ group: "alignment",
226
+ why: "cross-axis centring of differently tall items",
227
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;width:600px;height:200px", [
228
+ leaf("width:80px;height:40px"), leaf("width:80px;height:120px"),
229
+ ]),
230
+ },
231
+ {
232
+ id: "align-items-stretch",
233
+ group: "alignment",
234
+ why: "an auto cross size fills the line",
235
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch;width:600px;height:200px", [
236
+ leaf("width:80px"), leaf("width:80px;height:50px"),
237
+ ]),
238
+ },
239
+ {
240
+ id: "align-self",
241
+ group: "alignment",
242
+ why: "one item opting out of the container's align-items",
243
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;align-items:flex-start;width:600px;height:200px", [
244
+ leaf("width:80px;height:40px"),
245
+ leaf("width:80px;height:40px;align-self:flex-end"),
246
+ leaf("width:80px;height:40px;align-self:center"),
247
+ ]),
248
+ },
249
+
250
+ // --- column direction ----------------------------------------------------
251
+ {
252
+ id: "column-grow",
253
+ group: "column",
254
+ why: "the same distribution with main and cross swapped",
255
+ root: box("display:flex;flex-direction:column;flex-wrap:nowrap;width:200px;height:600px;gap:10px", [
256
+ leaf("flex-grow:1;width:100px"), leaf("flex-grow:3;width:100px"),
257
+ ]),
258
+ },
259
+ {
260
+ id: "row-reverse",
261
+ group: "column",
262
+ why: "reversed main axis",
263
+ root: box("display:flex;flex-direction:row-reverse;flex-wrap:nowrap;width:600px;height:100px;gap:10px", [
264
+ leaf("width:100px;height:40px"), leaf("width:100px;height:40px"),
265
+ ]),
266
+ },
267
+
268
+ // --- nesting -------------------------------------------------------------
269
+ {
270
+ id: "nested-flex-in-flex",
271
+ group: "nesting",
272
+ why: "a flex item that is itself a flex container, three deep",
273
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:200px;gap:10px", [
274
+ box("display:flex;flex-direction:column;flex-wrap:nowrap;flex-grow:1;gap:5px;align-items:stretch", [
275
+ leaf("height:30px"),
276
+ box("display:flex;flex-direction:row;flex-wrap:nowrap;height:60px;gap:5px", [
277
+ leaf("flex-grow:1"), leaf("flex-grow:2"),
278
+ ]),
279
+ ]),
280
+ leaf("width:150px;height:100px"),
281
+ ]),
282
+ },
283
+ {
284
+ id: "nested-flex-in-grid",
285
+ group: "nesting",
286
+ why: "a grid cell holding a flex row",
287
+ root: box("display:grid;grid-template-columns:1fr 2fr;gap:16px;width:600px;height:200px", [
288
+ box("display:flex;flex-direction:row;flex-wrap:nowrap;gap:8px;align-items:stretch", [
289
+ leaf("flex-grow:1;height:50px"), leaf("flex-grow:1;height:50px"),
290
+ ]),
291
+ leaf("height:80px"),
292
+ ]),
293
+ },
294
+ {
295
+ id: "nested-grid-in-flex",
296
+ group: "nesting",
297
+ why: "a flex item that is a grid container",
298
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:200px;align-items:stretch", [
299
+ box("display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;flex-grow:1", [
300
+ leaf("height:40px"), leaf("height:40px"), leaf("height:40px"),
301
+ ]),
302
+ ]),
303
+ },
304
+
305
+ // --- grid ----------------------------------------------------------------
306
+ {
307
+ id: "grid-fr-gap",
308
+ group: "grid",
309
+ why: "the interface the question asked about, verbatim",
310
+ root: box("display:grid;grid-template-columns:1fr 2fr;gap:16px;padding:24px;width:800px;height:200px", [
311
+ leaf("height:80px"), leaf("height:80px"),
312
+ ]),
313
+ },
314
+ {
315
+ id: "grid-mixed-tracks",
316
+ group: "grid",
317
+ why: "px, %, fr and auto in one template",
318
+ root: box("display:grid;grid-template-columns:100px 25% 1fr;gap:10px;width:600px;height:150px", [
319
+ leaf("height:50px"), leaf("height:50px"), leaf("height:50px"),
320
+ ]),
321
+ },
322
+ {
323
+ id: "grid-repeat-minmax",
324
+ group: "grid",
325
+ why: "repeat() and minmax() together",
326
+ root: box("display:grid;grid-template-columns:repeat(3, minmax(80px, 1fr));gap:12px;width:500px;height:150px", [
327
+ leaf("height:50px"), leaf("height:50px"), leaf("height:50px"),
328
+ ]),
329
+ },
330
+ {
331
+ id: "grid-auto-placement",
332
+ group: "grid",
333
+ why: "seven items into three columns: implicit rows, in order",
334
+ root: box("display:grid;grid-template-columns:repeat(3, 1fr);grid-template-rows:60px 60px 60px;gap:8px;width:600px;height:300px", [
335
+ leaf(""), leaf(""), leaf(""), leaf(""), leaf(""), leaf(""), leaf(""),
336
+ ]),
337
+ },
338
+ {
339
+ id: "grid-span",
340
+ group: "grid",
341
+ why: "an item spanning two columns pushes the rest along",
342
+ root: box("display:grid;grid-template-columns:repeat(4, 1fr);grid-template-rows:50px 50px;gap:10px;width:600px;height:200px", [
343
+ leaf("grid-column:span 2"), leaf(""), leaf(""), leaf(""),
344
+ ]),
345
+ },
346
+ {
347
+ id: "grid-explicit-lines",
348
+ group: "grid",
349
+ why: "grid-column / grid-row by line number",
350
+ root: box("display:grid;grid-template-columns:repeat(3, 1fr);grid-template-rows:50px 50px;gap:10px;width:600px;height:200px", [
351
+ leaf("grid-column:2 / 4;grid-row:1 / 3"),
352
+ leaf("grid-column:1 / 2;grid-row:2 / 3"),
353
+ ]),
354
+ },
355
+ {
356
+ id: "grid-areas",
357
+ group: "grid",
358
+ why: "grid-template-areas and grid-area by name",
359
+ root: box(
360
+ "display:grid;grid-template-columns:120px 1fr;grid-template-rows:60px 1fr;gap:8px;width:600px;height:300px;" +
361
+ 'grid-template-areas:"head head" "side main"',
362
+ [leaf("grid-area:head"), leaf("grid-area:side"), leaf("grid-area:main")]
363
+ ),
364
+ },
365
+ {
366
+ id: "grid-auto-flow-dense",
367
+ group: "grid",
368
+ why: "dense backfills the hole a span leaves",
369
+ root: box("display:grid;grid-template-columns:repeat(3, 1fr);grid-template-rows:40px 40px;gap:6px;grid-auto-flow:row dense;width:600px;height:200px", [
370
+ leaf("grid-column:span 2"), leaf(""), leaf(""), leaf(""),
371
+ ]),
372
+ },
373
+ {
374
+ id: "grid-fit-content",
375
+ group: "grid",
376
+ why: "fit-content() as a track function",
377
+ root: box("display:grid;grid-template-columns:fit-content(200px) 1fr;gap:10px;width:600px;height:120px", [
378
+ leaf("width:300px;height:40px"), leaf("height:40px"),
379
+ ]),
380
+ },
381
+
382
+ // --- absolute, overflow --------------------------------------------------
383
+ {
384
+ id: "absolute-child",
385
+ group: "absolute",
386
+ why: "an absolute child is positioned against its container and taken out of flow",
387
+ root: box("position:relative;display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:200px;padding:20px", [
388
+ leaf("width:100px;height:40px"),
389
+ leaf("position:absolute;left:30px;top:50px;width:80px;height:80px"),
390
+ leaf("width:100px;height:40px"),
391
+ ]),
392
+ },
393
+ {
394
+ id: "absolute-right-bottom",
395
+ group: "absolute",
396
+ why: "right/bottom anchoring, and left+right together as a width",
397
+ root: box("position:relative;width:600px;height:200px", [
398
+ leaf("position:absolute;right:20px;bottom:30px;width:100px;height:50px"),
399
+ leaf("position:absolute;left:10px;right:10px;top:0px;height:20px"),
400
+ ]),
401
+ },
402
+ {
403
+ id: "overflow-hidden-box",
404
+ group: "overflow",
405
+ why: "a child larger than an overflow:hidden parent: the BOX, not the clip",
406
+ root: box("width:400px;height:200px;overflow:hidden", [
407
+ leaf("width:600px;height:300px"),
408
+ ]),
409
+ },
410
+
411
+ // --- the initial values EVG chose differently ----------------------------
412
+ {
413
+ id: "defaults-flex-direction",
414
+ group: "defaults",
415
+ why: "CSS's initial flex-direction is row; nothing is stated here",
416
+ root: box("display:flex;width:600px;height:200px", [
417
+ leaf("width:100px;height:40px"), leaf("width:100px;height:40px"),
418
+ ]),
419
+ },
420
+ {
421
+ id: "defaults-flex-wrap",
422
+ group: "defaults",
423
+ why: "CSS's initial flex-wrap is nowrap; nothing is stated here",
424
+ root: box("display:flex;flex-direction:row;width:300px;height:200px", [
425
+ leaf("width:200px;height:40px"), leaf("width:200px;height:40px"),
426
+ ]),
427
+ },
428
+ {
429
+ id: "defaults-align-items",
430
+ group: "defaults",
431
+ why: "CSS's initial align-items is stretch; nothing is stated here",
432
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:200px", [
433
+ leaf("width:100px"), leaf("width:100px"),
434
+ ]),
435
+ },
436
+
437
+ // --- the ones expected to be absent, asked anyway ------------------------
438
+ {
439
+ id: "intrinsic-keyword-width",
440
+ group: "intrinsic keywords",
441
+ why: "width:min-content / max-content as a stated value",
442
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px", [
443
+ leaf("width:max-content;height:40px"),
444
+ leaf("width:min-content;height:40px"),
445
+ leaf("width:fit-content;height:40px"),
446
+ ]),
447
+ },
448
+ {
449
+ id: "aspect-ratio",
450
+ group: "aspect-ratio",
451
+ why: "aspect-ratio deriving the height from the width",
452
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:300px;align-items:flex-start", [
453
+ leaf("width:200px;aspect-ratio:2 / 1"),
454
+ ]),
455
+ },
456
+ {
457
+ id: "calc-width",
458
+ group: "calc",
459
+ why: "calc() as a length",
460
+ root: box("width:600px;height:200px", [leaf("width:calc(100% - 40px);height:40px")]),
461
+ },
462
+ {
463
+ id: "auto-fit-repeat",
464
+ group: "auto-fit",
465
+ why: "repeat(auto-fit, …), the responsive card deck idiom",
466
+ root: box("display:grid;grid-template-columns:repeat(auto-fit, minmax(120px, 1fr));gap:10px;width:600px;height:200px", [
467
+ leaf("height:50px"), leaf("height:50px"), leaf("height:50px"), leaf("height:50px"),
468
+ ]),
469
+ },
470
+ ];
471
+
472
+ // Text cases are kept apart because they are NOT compared px-for-px: EVG's
473
+ // default measurer is a heuristic (`fontSize * 0.55`) and the browser's is a
474
+ // real face, so a pixel diff here would measure the fixture and not the
475
+ // engine. What is asserted instead is that text participates in layout at all
476
+ // — that a box shrink-wraps to its content, that a wrapped paragraph makes its
477
+ // parent taller, and that baseline alignment moves a box. The engine's own
478
+ // font parity is a separate, existing suite (`evg:measure:web`, the textbox
479
+ // oracle), which checks the same TTF through layout and through Chromium.
480
+ export const TEXT_CASES = [
481
+ {
482
+ id: "text-shrink-wrap",
483
+ why: "a text leaf takes its measured width, not the parent's",
484
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;width:600px;height:100px;align-items:flex-start", [
485
+ { s: "font-size:16px", kids: [], text: "Short" },
486
+ { s: "font-size:16px", kids: [], text: "A considerably longer run of text" },
487
+ ]),
488
+ assert: (n) => n[1].w > 0 && n[2].w > n[1].w && n[2].w < 600,
489
+ says: "both leaves are narrower than the parent and the longer string is wider",
490
+ },
491
+ {
492
+ id: "text-wrap-grows-parent",
493
+ why: "wrapping inside a narrow column makes the column taller",
494
+ root: box("display:flex;flex-direction:column;width:200px;align-items:stretch", [
495
+ { s: "font-size:16px;width:200px", kids: [], text: "One two three four five six seven eight nine ten eleven twelve" },
496
+ ]),
497
+ assert: (n) => n[1].h > 20,
498
+ says: "the wrapped run is taller than one line",
499
+ },
500
+ {
501
+ id: "text-baseline-align",
502
+ why: "align-items:baseline lines the text up on its baseline, not its box top",
503
+ root: box("display:flex;flex-direction:row;flex-wrap:nowrap;align-items:baseline;width:600px;height:100px", [
504
+ { s: "font-size:12px", kids: [], text: "small" },
505
+ { s: "font-size:32px", kids: [], text: "BIG" },
506
+ ]),
507
+ assert: (n) => n[1].y > n[2].y,
508
+ says: "the smaller run is pushed down so the two baselines meet",
509
+ },
510
+ ];